From ef4c0940824d9fd30050af2a026dc4663b4f8de5 Mon Sep 17 00:00:00 2001 From: sinohqb Date: Tue, 4 Aug 2026 02:48:59 +0800 Subject: [PATCH] refactor(exploration): share one fetch+aggregate helper across outlets report, markdown and analysis each repeated the summarize_exploration(repo.list_by_campaign(...)) shape; collapse it into summarize_campaign_exploration so the aggregation has one home. --- backend/agenteval/evaluation/analysis.py | 6 ++---- backend/agenteval/exploration/summary.py | 9 +++++++++ backend/agenteval/web/routers/campaigns.py | 7 +++---- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/backend/agenteval/evaluation/analysis.py b/backend/agenteval/evaluation/analysis.py index c88e23a..56833da 100644 --- a/backend/agenteval/evaluation/analysis.py +++ b/backend/agenteval/evaluation/analysis.py @@ -14,7 +14,7 @@ from typing import Any, Awaitable, Callable, Optional from sqlmodel import Session from agenteval.evaluation.report import generate_campaign_report -from agenteval.exploration.summary import summarize_exploration +from agenteval.exploration.summary import summarize_campaign_exploration from agenteval.model_gateway import ModelGateway from agenteval.models import Campaign, ModelCapability, RunStatus from agenteval.services.model_configs import ( @@ -27,7 +27,6 @@ from agenteval.storage.model_config_repository import ModelConfigRepository from agenteval.storage.repository import ( CampaignAnalysisRepository, CampaignRepository, - ExplorationSessionRepository, RunRepository, ScenarioRepository, ) @@ -309,14 +308,13 @@ async def execute_campaign_analysis( runs = RunRepository(session).list_by_campaign(campaign_id) scenario_names = {s.id: s.name for s in ScenarioRepository(session).list_all()} report = generate_campaign_report(campaign, runs, scenario_names=scenario_names) - exploration_sessions = ExplorationSessionRepository(session).list_by_campaign(campaign_id) result = await analyze_campaign( campaign=campaign, report=report, failure_samples=collect_failure_samples(campaign_id, session), valid_run_ids={r.id for r in runs if r.id}, chat_client=client, - exploration_summary=summarize_exploration(exploration_sessions), + exploration_summary=summarize_campaign_exploration(session, campaign_id), ) except Exception as exc: _logger.warning("活动 %s 智能分析失败: %s", campaign_id, exc) diff --git a/backend/agenteval/exploration/summary.py b/backend/agenteval/exploration/summary.py index 3261701..b0994f2 100644 --- a/backend/agenteval/exploration/summary.py +++ b/backend/agenteval/exploration/summary.py @@ -10,6 +10,8 @@ findings 全量收各档发现,poor 档排前)。这是体验记录这条第 from collections import Counter from typing import Any, Optional +from sqlmodel import Session + from agenteval.exploration.models import ExplorationSession _RATING_SEVERITY = {"poor": 0, "acceptable": 1, "good": 2} @@ -48,6 +50,13 @@ def summarize_exploration(sessions: list[ExplorationSession]) -> Optional[dict[s } +def summarize_campaign_exploration(db_session: Session, campaign_id: str) -> Optional[dict[str, Any]]: + """取数 + 聚合一步完成:报告 / 分析 / 导出三个出口共用的探索摘要取法。""" + from agenteval.storage.repository import ExplorationSessionRepository + + return summarize_exploration(ExplorationSessionRepository(db_session).list_by_campaign(campaign_id)) + + def _summarize_judge_reviews(sessions: list[ExplorationSession]) -> Optional[dict[str, Any]]: """只纳入复核完成的会话;findings 全量收各档发现(poor 档排前),summaries 收复核总体结论。""" findings: list[dict[str, Any]] = [] diff --git a/backend/agenteval/web/routers/campaigns.py b/backend/agenteval/web/routers/campaigns.py index 2f966a9..02da459 100644 --- a/backend/agenteval/web/routers/campaigns.py +++ b/backend/agenteval/web/routers/campaigns.py @@ -27,7 +27,7 @@ from agenteval.evaluation.report import ( ) from agenteval.evaluation.report_render import render_campaign_markdown from agenteval.exploration.settlement import settle_campaign_sessions -from agenteval.exploration.summary import summarize_exploration +from agenteval.exploration.summary import summarize_campaign_exploration from agenteval.models import Campaign, CampaignPlanEntry, CampaignStatus, ExplorationBudgetConfig, ExplorationSeeds from agenteval.storage.db import iso_utc, utc_now from agenteval.storage.model_config_repository import ModelConfigRepository @@ -35,7 +35,6 @@ from agenteval.storage.repository import ( CampaignAnalysisRepository, CampaignPeriodComparisonRepository, CampaignRepository, - ExplorationSessionRepository, RunRepository, ScenarioRepository, TargetRepository, @@ -135,7 +134,7 @@ async def get_campaign_report(campaign_id: str, session: Session = Depends(get_d runs = RunRepository(session).list_by_campaign(campaign_id) scenario_names = {s.id: s.name for s in ScenarioRepository(session).list_all()} report = generate_campaign_report(campaign, runs, scenario_names=scenario_names) - exploration = summarize_exploration(ExplorationSessionRepository(session).list_by_campaign(campaign_id)) + exploration = summarize_campaign_exploration(session, campaign_id) if exploration is not None: report["exploration"] = exploration return report @@ -182,7 +181,7 @@ async def get_campaign_report_markdown(campaign_id: str, session: Session = Depe generate_campaign_report(campaign, runs, scenario_names=scenario_names), analysis=analysis, comparison=comparison, - exploration=summarize_exploration(ExplorationSessionRepository(session).list_by_campaign(campaign_id)), + exploration=summarize_campaign_exploration(session, campaign_id), target_name=target_name, scenario_names=scenario_names, )