import json
from pathlib import Path
import tempfile
import unittest
from local_translator.benchmark import BenchmarkConfig, ModelManager, ModelSpec, aggregate, profile, resolve_metadata, save_report, summarize_run
def item(identity, source, translation, attempts=1, cached=0, status="completed"):
return {"id": identity, "source": source, "translation": translation, "attempts": attempts, "cached": cached, "status": status}
class MetricsTests(unittest.TestCase):
def test_count_only_successful_inference_and_keep_missing_usage_unknown(self):
job = {"id": "job", "status": "completed_with_errors", "items": [
item("model", "Hello", "Привет", attempts=2), item("local", "Q.LOAD", "Загрузка", attempts=0),
item("cache", "Yes", "Да", cached=1), item("failed", "Text", None, status="failed"),
], "metrics": {"provider_calls": 2, "provider_seconds": 1.5, "completion_tokens": 8, "calls_with_completion_usage": 1}}
result = summarize_run(job, 2)
self.assertEqual(result["model_lines"], 1)
self.assertEqual(result["lines_per_second"], 0.5)
self.assertEqual(result["chars_per_second"], 2.5)
self.assertEqual(result["failed"], 1)
self.assertEqual(result["retry_attempts"], 1)
self.assertIsNone(result["completion_tokens_per_request_second"])
def test_reported_token_speed_uses_full_provider_request_time(self):
job = {"id": "job", "status": "completed", "items": [item("1", "AUTO", "AUTO")],
"metrics": {"provider_calls": 1, "provider_seconds": 2, "completion_tokens": 40, "calls_with_completion_usage": 1}}
result = summarize_run(job, 3)
self.assertEqual(result["completion_tokens_per_request_second"], 20)
self.assertEqual(result["unchanged_ids"], ["1"])
def test_failure_is_not_ranked_as_fast_success(self):
rows = [
{"model": "A", "batch_size": 10, "status": status, "failed": failed, "seconds": seconds,
"lines_per_second": rate, "chars_per_second": rate * 5, "retry_attempts": 0, "unchanged_ids": []}
for status, failed, seconds, rate in [("completed", 0, 10, 1), ("completed", 0, 20, 0.5), ("failed", 10, 0.01, 0)]
]
summary = aggregate(rows)[0]
self.assertEqual(summary["median_seconds"], 15)
self.assertEqual(summary["successful_runs"], 2)
self.assertEqual(summary["runs"], 3)
self.assertEqual(summary["failed_items"], 10)
def test_report_escapes_labels_and_preserves_raw_json(self):
with tempfile.TemporaryDirectory() as directory:
report = {"dataset": {"source": "", "items": 1, "source_chars": 1},
"started_at": "test", "runs": [], "errors": ["error"], "restore_errors": []}
save_report(Path(directory), report)
document = (Path(directory) / "report.html").read_text(encoding="utf-8")
self.assertNotIn("