"""API routes for statistics and dashboard data.""" from collections import defaultdict from fastapi import APIRouter, Depends from sqlmodel import Session from agenteval.storage.repository import RunRepository, ScenarioRepository, TargetRepository from agenteval.web.deps import get_db router = APIRouter() @router.get("/dashboard") def dashboard(session: Session = Depends(get_db)) -> dict: targets = TargetRepository(session).list_all() scenarios = ScenarioRepository(session).list_all() runs = RunRepository(session).list_all() completed_runs = [r for r in runs if r.status == "completed" and r.summary] pass_rates = [r.summary.get("pass_rate", 0) for r in completed_runs if isinstance(r.summary, dict)] overall_pass_rate = sum(pass_rates) / len(pass_rates) if pass_rates else None recent_runs = sorted(runs, key=lambda r: r.started_at or "", reverse=True)[:10] return { "targets_count": len(targets), "scenarios_count": len(scenarios), "runs_count": len(runs), "overall_pass_rate": overall_pass_rate, "recent_runs": [r.model_dump() for r in recent_runs], } @router.get("/trend") def trend(days: int = 30, session: Session = Depends(get_db)) -> list[dict]: runs = RunRepository(session).list_all() completed = [r for r in runs if r.status == "completed" and r.summary and r.started_at] daily: dict[str, list[float]] = defaultdict(list) for run in completed: date_str = run.started_at.strftime("%Y-%m-%d") if run.started_at else "" if date_str and isinstance(run.summary, dict): daily[date_str].append(run.summary.get("pass_rate", 0)) sorted_dates = sorted(daily.keys())[-days:] return [ { "date": d, "pass_rate": round(sum(daily[d]) / len(daily[d]) * 100, 1), "run_count": len(daily[d]), } for d in sorted_dates ]