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("