import argparse import json from datetime import date from pathlib import Path from typing import Any import yaml DEFAULT_RESULTS = Path(__file__).resolve().parents[1]/"data"/"results.jsonl" def read_jsonl(path: Path) -> list[dict[str, Any]]: records = [] with path.open("r", encoding="utf-8") as file: for line in file: line = line.strip() if line and not line.startswith("#"): records.append(json.loads(line)) return records def find_record(records: list[dict[str, Any]], model_id: str) -> dict[str, Any]: matches = [record for record in records if record.get("model_id") == model_id] if not matches: raise SystemExit(f"No results found for model_id={model_id!r}") return matches[-1] def eval_result_entry(benchmark_dataset: str, task_id: str, value: float, metric: str, run_date: str, source_url: str, notes: str) -> dict[str, Any]: entry = { "dataset": { "id": benchmark_dataset, "task_id": task_id, }, "value": value, "date": run_date, "notes": f"{metric}; {notes}".strip("; "), } if source_url: entry["source"] = {"url": source_url, "name": "RusBEIR evaluation"} return entry def parse_args(): parser = argparse.ArgumentParser() parser.add_argument("--model-id", required=True) parser.add_argument("--results", type=Path, default=DEFAULT_RESULTS) parser.add_argument("--output", type=Path, required=True) parser.add_argument("--metric", default="NDCG@10") parser.add_argument("--benchmark-dataset", default="") parser.add_argument("--include-average", action="store_true") return parser.parse_args() def main(): args = parse_args() record = find_record(read_jsonl(args.results), args.model_id) scores = record.get("scores", {}) run_date = record.get("date") or date.today().isoformat() source_url = record.get("source_url", "") notes = record.get("notes", "") entries = [] if args.include_average: average_value = scores.get("average", {}).get(args.metric) if average_value is not None: entries.append(eval_result_entry(args.benchmark_dataset, "average", float(average_value), args.metric, run_date, source_url, notes)) for dataset_name, metrics in sorted(scores.get("datasets", {}).items()): if args.metric not in metrics: continue entries.append(eval_result_entry(args.benchmark_dataset, dataset_name, float(metrics[args.metric]), args.metric, run_date, source_url, notes)) if not entries: raise SystemExit(f"No metric {args.metric!r} found for model_id={args.model_id!r}") args.output.parent.mkdir(parents=True, exist_ok=True) with args.output.open("w", encoding="utf-8") as file: yaml.safe_dump(entries, file, sort_keys=False, allow_unicode=True) print(f"Wrote {len(entries)} eval result entries to {args.output}") if __name__ == "__main__": main()