Coverage for narrative_harm_classifier/api/routes/benchmark.py: 85%
13 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-07-20 13:25 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-07-20 13:25 +0000
1"""
2api/routes/benchmark.py — Templated benchmark endpoint.
3"""
5from fastapi import APIRouter, Depends, HTTPException
7from narrative_harm_classifier.core.config import get_settings, Settings
8from narrative_harm_classifier.classifier.factory import build_benchmark_runner
9from narrative_harm_classifier.classifier.validators.benchmark import BenchmarkRunner, BenchmarkReport
11router = APIRouter()
14def get_runner(settings: Settings = Depends(get_settings)) -> BenchmarkRunner:
15 return build_benchmark_runner(settings)
18@router.post(
19 "/run",
20 response_model=BenchmarkReport,
21 summary="Run the templated functional-test benchmark suite",
22 description=(
23 "Generates and runs a HateCheck-style templated test suite (explicit/implicit "
24 "positives, negation, counter-speech, obfuscated spelling, cross-group consistency, "
25 "and benign hard negatives). Returns aggregate and per-test-type precision/recall/FPR."
26 ),
27)
28def run_benchmark(runner: BenchmarkRunner = Depends(get_runner)) -> BenchmarkReport:
29 try:
30 return runner.run()
31 except Exception as e:
32 raise HTTPException(status_code=500, detail=str(e))