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

1""" 

2api/routes/benchmark.py — Templated benchmark endpoint. 

3""" 

4 

5from fastapi import APIRouter, Depends, HTTPException 

6 

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 

10 

11router = APIRouter() 

12 

13 

14def get_runner(settings: Settings = Depends(get_settings)) -> BenchmarkRunner: 

15 return build_benchmark_runner(settings) 

16 

17 

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))