"""评测合成记分(与批量实验 Celery 解耦后的纯函数,供单测保留)。""" from __future__ import annotations from typing import Any def composite_score( conv: float | None, mem: float | None, weights: dict[str, Any] | None, ) -> float | None: """合成总分;缺失的一侧不计为 0,避免把评审失败误标为极差。 仅一侧有分:返回该侧原始分(不乘权重),表示当前 run 仅完成了部分评审维度。 """ w = weights or {} wc = float(w.get("conversation", 0.5)) wm = float(w.get("memoir", 0.5)) has_c = conv is not None has_m = mem is not None if not has_c and not has_m: return None if has_c and has_m: return float(wc) * float(conv) + float(wm) * float(mem) if has_c: return float(conv) return float(mem) # 兼容旧测试中的私有名 _composite = composite_score __all__ = ["composite_score", "_composite"]