"""Write normalized ground-truth records to JSONL for the eval harness. Output format (one line per record): {"id": "...", "source": "sroie|cord", "ground_truth": {...Receipt JSON...}} The eval harness reads this back, runs each record through the extractor, and compares against `ground_truth`. """ from __future__ import annotations import json from collections.abc import Iterable from pathlib import Path from src.schemas import Receipt from src.utils.logging import logger def write_jsonl( records: Iterable[tuple[str, Receipt]], output_path: str | Path, source: str, ) -> int: """Write (id, Receipt) pairs to JSONL. Returns the count written.""" output_path = Path(output_path) output_path.parent.mkdir(parents=True, exist_ok=True) count = 0 with output_path.open("w", encoding="utf-8") as f: for record_id, receipt in records: line = { "id": record_id, "source": source, "ground_truth": receipt.model_dump(mode="json"), } f.write(json.dumps(line, ensure_ascii=False) + "\n") count += 1 logger.info(f"Wrote {count} records to {output_path}") return count def read_jsonl(path: str | Path) -> list[dict]: """Read a JSONL ground-truth file. Returns list of record dicts.""" path = Path(path) records = [] with path.open("r", encoding="utf-8") as f: for line in f: line = line.strip() if line: records.append(json.loads(line)) return records