Files
siemens_ragas/webapp/api/runs.py
wangwei e89695e490 Add RAGAS evaluation web console (FastAPI + vanilla JS)
- webapp/: FastAPI backend with runs/scenarios/evaluations API routers;
  services for run_reader, report_builder, scenario_scanner, task_manager
  (lazy ragas import — server boots even without ragas); Pydantic models
- webapp/static/: single-page console (layout A: left-nav + main area);
  report detail with metric cards, Chart.js distribution histogram,
  grouping table, lowest-score sample review; trigger evaluation + log polling
- webmain.py: uvicorn entry point (alongside existing main.py CLI)
- start.bat: Windows one-click launcher with env checks and auto-browser open
- rag_eval/datasets/: implement missing loader + normalizer modules
  (load_dataset_records, normalize_records) required by evaluator
- scripts/seed_sample_run.py: generate realistic demo run artifacts
- .gitignore: exclude datasets/ data files but keep rag_eval/datasets/ source

Co-Authored-By: Claude Sonnet 4 <noreply@anthropic.com>
2026-06-15 15:53:57 +08:00

33 lines
1.1 KiB
Python

"""Routes for listing evaluation runs and fetching a single run's report."""
from __future__ import annotations
from fastapi import APIRouter, HTTPException
from webapp.models import RunDetail
from webapp.services import report_builder, run_reader
router = APIRouter(prefix="/api/runs", tags=["runs"])
@router.get("")
def get_runs() -> dict[str, list]:
"""Return summaries for every discoverable evaluation run."""
summaries = run_reader.list_run_summaries()
return {"runs": [summary.model_dump() for summary in summaries]}
@router.get("/{run_id}")
def get_run_detail(run_id: str) -> RunDetail:
"""Return the full summary and aggregated report for one run."""
run_dir = run_reader.find_run_dir(run_id)
if run_dir is None:
raise HTTPException(status_code=404, detail=f"未找到运行: {run_id}")
summary = run_reader.build_run_summary(run_dir)
if summary is None:
raise HTTPException(status_code=404, detail=f"运行元数据缺失: {run_id}")
report = report_builder.build_report(run_dir, summary.metrics)
return RunDetail(summary=summary, report=report)