#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 从磁盘上的真实评测 JSON 生成站点用的台账数据 assets/js/ledger.js。 ⚠️ 生成物不要手改;改数据请改上游 JSON 后重跑本脚本。 来源(两份都是工程里保存的正式运行结果,逐字复制,不做任何改写或换算): A. H:\\Memory\\V2_dpskw\\runtime_score_bands.json 60 episodes B. H:\\Memory\\V2_dpskw\\nm2_1_final_runtime_e2e.json 48 episodes 用法: python tools/make_ledger.py """ from __future__ import annotations import io import json import os SOURCES = [ { "key": "bands", "label": "运行时评分带扫描", "path": r"H:\Memory\V2_dpskw\runtime_score_bands.json", "config": "0.00", "note": "60 用例 · 24 同形候选 · prior=1.00 blend=0.00", }, { "key": "e2e", "label": "NM2.1 最终运行时", "path": r"H:\Memory\V2_dpskw\nm2_1_final_runtime_e2e.json", "config": "prior=1.00 blend=0.50", "note": "48 用例 · 24 同形候选 · prior=1.00 blend=0.50", }, ] OUT = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "assets", "js", "ledger.js") def rows_of(path: str, key: str): with open(path, encoding="utf-8") as fh: j = json.load(fh) rows = j.get("rows") or {} if key not in rows: raise SystemExit("在 %s 里找不到 rows[%r]" % (path, key)) return rows[key] def main() -> int: out, total = [], 0 for src in SOURCES: rows = rows_of(src["path"], src["config"]) total += len(rows) out.append({ "key": src["key"], "label": src["label"], "note": src["note"], "n": len(rows), "items": [{ "id": r.get("id"), "attr": r.get("attribute"), "ans": bool(r.get("answerable")), "exp": r.get("expected"), "reply": r.get("reply"), "ok": bool(r.get("correct")), "wrong": bool(r.get("wrong_attribute")), "leak": bool(r.get("leaked")), "stop": r.get("stop_reason"), "sel": r.get("records_selected"), "score": r.get("top_score"), "active": r.get("records_active"), "need": r.get("need_memory"), } for r in rows], }) body = io.StringIO() body.write("/* ==================================================================\n") body.write(" Natural Memory v2 — ledger.js\n") body.write(" 「真实评测台账」的数据层。\n\n") body.write(" ⚠️ 本文件由 tools/make_ledger.py 从磁盘上的原始评测 JSON 生成,\n") body.write(" 请勿手改。下面是全部 %d 条 episode,字段逐字复制、未做改写或换算。\n\n" % total) for s in SOURCES: body.write(" %s\n" % os.path.basename(s["path"])) body.write(" ================================================================== */\n") body.write("window.NM_LEDGER = ") body.write(json.dumps(out, ensure_ascii=False, separators=(",", ":"), indent=0) .replace("\n", "")) body.write(";\n") os.makedirs(os.path.dirname(OUT), exist_ok=True) with open(OUT, "w", encoding="utf-8", newline="\n") as fh: fh.write(body.getvalue()) print("写出 %s(%d 条 episode / %d 字节)" % (OUT, total, os.path.getsize(OUT))) return 0 if __name__ == "__main__": raise SystemExit(main())