diff --git a/webapp/models.py b/webapp/models.py index 36d1c96..6eaba75 100644 --- a/webapp/models.py +++ b/webapp/models.py @@ -74,6 +74,18 @@ class ReportData(BaseModel): lowest_samples: list[SampleScore] = Field(default_factory=list) summary_markdown: str = "" advice_markdown: str = "" # optimization_advice.md content (empty if not generated) + weighted_score_mean: float | None = Field( + default=None, + description="加权综合得分均值(metric_weights × doc_weights 共同作用)。", + ) + metric_weights: dict[str, float] = Field( + default_factory=dict, + description="该次运行使用的指标权重配置(来自 scenario.snapshot.yaml)。", + ) + doc_weights: dict[str, float] = Field( + default_factory=dict, + description="该次运行使用的文档权重配置(来自 scenario.snapshot.yaml)。", + ) class RunDetail(BaseModel): @@ -93,6 +105,14 @@ class ScenarioInfo(BaseModel): judge_model: str = "" metrics: list[str] = Field(default_factory=list) error: str = "" + metric_weights: dict[str, float] = Field( + default_factory=dict, + description="从场景 YAML 读取的指标权重配置,供前端权重面板预填。", + ) + doc_weights: dict[str, float] = Field( + default_factory=dict, + description="从场景 YAML 读取的文档权重配置,供前端权重面板预填。", + ) class TaskStatus(BaseModel): diff --git a/webapp/services/scenario_scanner.py b/webapp/services/scenario_scanner.py index 910f316..0fe7958 100644 --- a/webapp/services/scenario_scanner.py +++ b/webapp/services/scenario_scanner.py @@ -37,6 +37,16 @@ def _summarize_scenario(path: Path) -> ScenarioInfo: metrics = payload.get("metrics") metric_list = [str(item) for item in metrics] if isinstance(metrics, list) else [] + raw_metric_weights = payload.get("metric_weights") or {} + raw_doc_weights = payload.get("doc_weights") or {} + metric_weights = { + str(k): float(v) for k, v in raw_metric_weights.items() + if isinstance(v, (int, float)) + } + doc_weights = { + str(k): float(v) for k, v in raw_doc_weights.items() + if isinstance(v, (int, float)) + } return ScenarioInfo( path=relative, @@ -45,6 +55,8 @@ def _summarize_scenario(path: Path) -> ScenarioInfo: dataset=str(payload.get("dataset", "")), judge_model=str(payload.get("judge_model", "")), metrics=metric_list, + metric_weights=metric_weights, + doc_weights=doc_weights, )