diff --git a/tests/test_score_endpoint_language.py b/tests/test_score_endpoint_language.py new file mode 100644 index 0000000..2d85981 --- /dev/null +++ b/tests/test_score_endpoint_language.py @@ -0,0 +1,46 @@ +"""Tests that score endpoints forward the resolved judge_language to the scorer.""" + +from unittest.mock import MagicMock, patch + +from fastapi.testclient import TestClient + +import webapp.api.score as score_mod +from webapp.server import create_app + + +def _client(): + return TestClient(create_app()) + + +def test_score_route_forwards_judge_language(monkeypatch): + """A request with judge_language='zh' reaches inline_scorer.score.""" + captured: dict = {} + + def fake_score(**kwargs): + captured.update(kwargs) + return {"faithfulness": 0.9} + + monkeypatch.setattr(score_mod.inline_scorer, "score", fake_score) + resp = _client().post("/api/score", json={ + "question": "q", "answer": "a", "contexts": "c", + "ground_truth": "g", "metrics": ["faithfulness"], "judge_language": "zh", + }) + assert resp.status_code == 200 + assert captured.get("judge_language") == "zh" + + +def test_score_route_defaults_language_to_en(monkeypatch): + """Omitting judge_language falls back to settings default ('en').""" + captured: dict = {} + + def fake_score(**kwargs): + captured.update(kwargs) + return {"faithfulness": 0.9} + + monkeypatch.setattr(score_mod.inline_scorer, "score", fake_score) + resp = _client().post("/api/score", json={ + "question": "q", "answer": "a", "contexts": "c", + "ground_truth": "g", "metrics": ["faithfulness"], + }) + assert resp.status_code == 200 + assert captured.get("judge_language") == "en" diff --git a/webapp/api/score.py b/webapp/api/score.py index dbddd98..b38602c 100644 --- a/webapp/api/score.py +++ b/webapp/api/score.py @@ -116,6 +116,7 @@ def score_sample( judge_model = request.judge_model or settings.ragas_judge_model embedding_model = request.embedding_model or settings.ragas_embedding_model + judge_language = request.judge_language or settings.ragas_judge_language effective = request.effective_metrics() requested = set(request.metrics) skipped = sorted(requested - set(effective)) @@ -139,6 +140,7 @@ def score_sample( judge_model=judge_model, embedding_model=embedding_model, settings=settings, + judge_language=judge_language, ) except Exception as exc: # noqa: BLE001 latency_ms = int((time.monotonic() - t0) * 1000) diff --git a/webapp/services/score_job_manager.py b/webapp/services/score_job_manager.py index f538b5f..982f1ed 100644 --- a/webapp/services/score_job_manager.py +++ b/webapp/services/score_job_manager.py @@ -120,6 +120,7 @@ class ScoreJobManager: settings = EvaluationSettings() judge_model = request.judge_model or settings.ragas_judge_model embedding_model = request.embedding_model or settings.ragas_embedding_model + judge_language = request.judge_language or settings.ragas_judge_language effective = request.effective_metrics() requested = set(request.metrics) skipped = sorted(requested - set(effective)) @@ -138,6 +139,7 @@ class ScoreJobManager: judge_model=judge_model, embedding_model=embedding_model, settings=settings, + judge_language=judge_language, ) else: raw_scores = {} diff --git a/webapp/services/session_score_manager.py b/webapp/services/session_score_manager.py index 82c5785..1e5188c 100644 --- a/webapp/services/session_score_manager.py +++ b/webapp/services/session_score_manager.py @@ -205,6 +205,7 @@ class SessionScoreJobManager: settings = EvaluationSettings() judge_model = request.judge_model or settings.ragas_judge_model embedding_model = request.embedding_model or settings.ragas_embedding_model + judge_language = request.judge_language or settings.ragas_judge_language effective = request.effective_metrics() requested = set(request.metrics) skipped = sorted(requested - set(effective)) @@ -223,6 +224,7 @@ class SessionScoreJobManager: judge_model=judge_model, embedding_model=embedding_model, settings=settings, + judge_language=judge_language, ) else: raw_scores = {}