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.
This commit is contained in:
sinohqb 2026-08-04 02:48:59 +08:00
parent 936640fb36
commit ef4c094082
3 changed files with 14 additions and 8 deletions

View File

@ -14,7 +14,7 @@ from typing import Any, Awaitable, Callable, Optional
from sqlmodel import Session from sqlmodel import Session
from agenteval.evaluation.report import generate_campaign_report 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.model_gateway import ModelGateway
from agenteval.models import Campaign, ModelCapability, RunStatus from agenteval.models import Campaign, ModelCapability, RunStatus
from agenteval.services.model_configs import ( from agenteval.services.model_configs import (
@ -27,7 +27,6 @@ from agenteval.storage.model_config_repository import ModelConfigRepository
from agenteval.storage.repository import ( from agenteval.storage.repository import (
CampaignAnalysisRepository, CampaignAnalysisRepository,
CampaignRepository, CampaignRepository,
ExplorationSessionRepository,
RunRepository, RunRepository,
ScenarioRepository, ScenarioRepository,
) )
@ -309,14 +308,13 @@ async def execute_campaign_analysis(
runs = RunRepository(session).list_by_campaign(campaign_id) runs = RunRepository(session).list_by_campaign(campaign_id)
scenario_names = {s.id: s.name for s in ScenarioRepository(session).list_all()} scenario_names = {s.id: s.name for s in ScenarioRepository(session).list_all()}
report = generate_campaign_report(campaign, runs, scenario_names=scenario_names) report = generate_campaign_report(campaign, runs, scenario_names=scenario_names)
exploration_sessions = ExplorationSessionRepository(session).list_by_campaign(campaign_id)
result = await analyze_campaign( result = await analyze_campaign(
campaign=campaign, campaign=campaign,
report=report, report=report,
failure_samples=collect_failure_samples(campaign_id, session), failure_samples=collect_failure_samples(campaign_id, session),
valid_run_ids={r.id for r in runs if r.id}, valid_run_ids={r.id for r in runs if r.id},
chat_client=client, chat_client=client,
exploration_summary=summarize_exploration(exploration_sessions), exploration_summary=summarize_campaign_exploration(session, campaign_id),
) )
except Exception as exc: except Exception as exc:
_logger.warning("活动 %s 智能分析失败: %s", campaign_id, exc) _logger.warning("活动 %s 智能分析失败: %s", campaign_id, exc)

View File

@ -10,6 +10,8 @@ findings 全量收各档发现poor 档排前)。这是体验记录这条第
from collections import Counter from collections import Counter
from typing import Any, Optional from typing import Any, Optional
from sqlmodel import Session
from agenteval.exploration.models import ExplorationSession from agenteval.exploration.models import ExplorationSession
_RATING_SEVERITY = {"poor": 0, "acceptable": 1, "good": 2} _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]]: def _summarize_judge_reviews(sessions: list[ExplorationSession]) -> Optional[dict[str, Any]]:
"""只纳入复核完成的会话findings 全量收各档发现poor 档排前summaries 收复核总体结论。""" """只纳入复核完成的会话findings 全量收各档发现poor 档排前summaries 收复核总体结论。"""
findings: list[dict[str, Any]] = [] findings: list[dict[str, Any]] = []

View File

@ -27,7 +27,7 @@ from agenteval.evaluation.report import (
) )
from agenteval.evaluation.report_render import render_campaign_markdown from agenteval.evaluation.report_render import render_campaign_markdown
from agenteval.exploration.settlement import settle_campaign_sessions 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.models import Campaign, CampaignPlanEntry, CampaignStatus, ExplorationBudgetConfig, ExplorationSeeds
from agenteval.storage.db import iso_utc, utc_now from agenteval.storage.db import iso_utc, utc_now
from agenteval.storage.model_config_repository import ModelConfigRepository from agenteval.storage.model_config_repository import ModelConfigRepository
@ -35,7 +35,6 @@ from agenteval.storage.repository import (
CampaignAnalysisRepository, CampaignAnalysisRepository,
CampaignPeriodComparisonRepository, CampaignPeriodComparisonRepository,
CampaignRepository, CampaignRepository,
ExplorationSessionRepository,
RunRepository, RunRepository,
ScenarioRepository, ScenarioRepository,
TargetRepository, 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) runs = RunRepository(session).list_by_campaign(campaign_id)
scenario_names = {s.id: s.name for s in ScenarioRepository(session).list_all()} scenario_names = {s.id: s.name for s in ScenarioRepository(session).list_all()}
report = generate_campaign_report(campaign, runs, scenario_names=scenario_names) 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: if exploration is not None:
report["exploration"] = exploration report["exploration"] = exploration
return report 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), generate_campaign_report(campaign, runs, scenario_names=scenario_names),
analysis=analysis, analysis=analysis,
comparison=comparison, comparison=comparison,
exploration=summarize_exploration(ExplorationSessionRepository(session).list_by_campaign(campaign_id)), exploration=summarize_campaign_exploration(session, campaign_id),
target_name=target_name, target_name=target_name,
scenario_names=scenario_names, scenario_names=scenario_names,
) )