@tangle-network/agent-bench 0.4.0 → 0.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +15 -0
- package/dist/adapters.d.ts +4 -11
- package/dist/adapters.js +78 -41
- package/dist/adapters.js.map +1 -1
- package/dist/benchmarks/_harness.d.ts +51 -66
- package/dist/benchmarks/_harness.js +329 -31
- package/dist/benchmarks/_harness.js.map +1 -1
- package/dist/benchmarks/aec-bench.d.ts +4 -25
- package/dist/benchmarks/aec-bench.js +242 -7
- package/dist/benchmarks/aec-bench.js.map +1 -1
- package/dist/benchmarks/agentbench.d.ts +5 -13
- package/dist/benchmarks/agentbench.js +114 -9
- package/dist/benchmarks/agentbench.js.map +1 -1
- package/dist/benchmarks/appworld.d.ts +9 -29
- package/dist/benchmarks/appworld.js +317 -12
- package/dist/benchmarks/appworld.js.map +1 -1
- package/dist/benchmarks/bfcl.d.ts +5 -15
- package/dist/benchmarks/bfcl.js +264 -9
- package/dist/benchmarks/bfcl.js.map +1 -1
- package/dist/benchmarks/cad-design.d.ts +16 -41
- package/dist/benchmarks/cad-design.js +512 -6
- package/dist/benchmarks/cad-design.js.map +1 -1
- package/dist/benchmarks/cadbench.d.ts +4 -17
- package/dist/benchmarks/cadbench.js +2 -8
- package/dist/benchmarks/cadgenbench.d.ts +4 -20
- package/dist/benchmarks/cadgenbench.js +2 -8
- package/dist/benchmarks/commit0.d.ts +5 -27
- package/dist/benchmarks/commit0.js +187 -9
- package/dist/benchmarks/commit0.js.map +1 -1
- package/dist/benchmarks/crag.d.ts +4 -12
- package/dist/benchmarks/crag.js +110 -8
- package/dist/benchmarks/crag.js.map +1 -1
- package/dist/benchmarks/dabstep.d.ts +5 -15
- package/dist/benchmarks/dabstep.js +177 -9
- package/dist/benchmarks/dabstep.js.map +1 -1
- package/dist/benchmarks/enterpriseops-gym.d.ts +5 -34
- package/dist/benchmarks/enterpriseops-gym.js +236 -9
- package/dist/benchmarks/enterpriseops-gym.js.map +1 -1
- package/dist/benchmarks/finresearchbench.d.ts +4 -13
- package/dist/benchmarks/finresearchbench.js +218 -7
- package/dist/benchmarks/finresearchbench.js.map +1 -1
- package/dist/benchmarks/finsearchcomp.d.ts +8 -39
- package/dist/benchmarks/finsearchcomp.js +267 -6
- package/dist/benchmarks/finsearchcomp.js.map +1 -1
- package/dist/benchmarks/frames.d.ts +15 -37
- package/dist/benchmarks/frames.js +408 -11
- package/dist/benchmarks/frames.js.map +1 -1
- package/dist/benchmarks/hotpotqa.d.ts +4 -24
- package/dist/benchmarks/hotpotqa.js +250 -14
- package/dist/benchmarks/hotpotqa.js.map +1 -1
- package/dist/benchmarks/humaneval.d.ts +19 -37
- package/dist/benchmarks/humaneval.js +279 -16
- package/dist/benchmarks/humaneval.js.map +1 -1
- package/dist/benchmarks/mind2web.d.ts +7 -34
- package/dist/benchmarks/mind2web.js +257 -8
- package/dist/benchmarks/mind2web.js.map +1 -1
- package/dist/benchmarks/nomiracl.d.ts +4 -13
- package/dist/benchmarks/nomiracl.js +146 -8
- package/dist/benchmarks/nomiracl.js.map +1 -1
- package/dist/benchmarks/open-rag-bench.d.ts +4 -12
- package/dist/benchmarks/open-rag-bench.js +110 -8
- package/dist/benchmarks/open-rag-bench.js.map +1 -1
- package/dist/benchmarks/programbench.d.ts +5 -29
- package/dist/benchmarks/programbench.js +161 -9
- package/dist/benchmarks/programbench.js.map +1 -1
- package/dist/benchmarks/rag-shared.d.ts +21 -20
- package/dist/benchmarks/rag-shared.js +245 -38
- package/dist/benchmarks/rag-shared.js.map +1 -1
- package/dist/benchmarks/ragbench.d.ts +4 -14
- package/dist/benchmarks/ragbench.js +127 -8
- package/dist/benchmarks/ragbench.js.map +1 -1
- package/dist/benchmarks/simpleqa.d.ts +17 -44
- package/dist/benchmarks/simpleqa.js +293 -10
- package/dist/benchmarks/simpleqa.js.map +1 -1
- package/dist/benchmarks/swe-bench.d.ts +23 -36
- package/dist/benchmarks/swe-bench.js +234 -13
- package/dist/benchmarks/swe-bench.js.map +1 -1
- package/dist/benchmarks/t2-ragbench.d.ts +4 -12
- package/dist/benchmarks/t2-ragbench.js +118 -8
- package/dist/benchmarks/t2-ragbench.js.map +1 -1
- package/dist/benchmarks/tau-bench-shared.d.ts +14 -22
- package/dist/benchmarks/tau-bench-shared.js +169 -9
- package/dist/benchmarks/tau-bench-shared.js.map +1 -1
- package/dist/benchmarks/tau2-bench.d.ts +5 -5
- package/dist/benchmarks/tau2-bench.js +28 -10
- package/dist/benchmarks/tau2-bench.js.map +1 -1
- package/dist/benchmarks/tau3-banking.d.ts +4 -13
- package/dist/benchmarks/tau3-banking.js +28 -8
- package/dist/benchmarks/tau3-banking.js.map +1 -1
- package/dist/benchmarks/terminal-bench.d.ts +4 -22
- package/dist/benchmarks/terminal-bench.js +140 -7
- package/dist/benchmarks/terminal-bench.js.map +1 -1
- package/dist/benchmarks/toollm.d.ts +5 -13
- package/dist/benchmarks/toollm.js +184 -9
- package/dist/benchmarks/toollm.js.map +1 -1
- package/dist/benchmarks/trata-hedge.d.ts +4 -30
- package/dist/benchmarks/trata-hedge.js +336 -6
- package/dist/benchmarks/trata-hedge.js.map +1 -1
- package/dist/benchmarks/types.d.ts +85 -94
- package/dist/benchmarks/types.js +1 -1
- package/dist/benchmarks/webarena-verified.d.ts +5 -13
- package/dist/benchmarks/webarena-verified.js +152 -9
- package/dist/benchmarks/webarena-verified.js.map +1 -1
- package/dist/cadbench-DpQWZHp4.js +285 -0
- package/dist/cadbench-DpQWZHp4.js.map +1 -0
- package/dist/cadgenbench-DRhczfsG.js +151 -0
- package/dist/cadgenbench-DRhczfsG.js.map +1 -0
- package/dist/index.d.ts +245 -293
- package/dist/index.js +1669 -1791
- package/dist/index.js.map +1 -1
- package/package.json +17 -14
- package/pier_agents/candidate_contract.py +238 -24
- package/pier_agents/tangle_candidate.py +75 -5
- package/scripts/verify-packed-consumer.mjs +84 -17
- package/scripts/verify-pier-agent.mts +6 -4
- package/src/benchmarks/_harness.test.mts +16 -1
- package/src/benchmarks/_harness.ts +9 -2
- package/src/benchmarks/terminal-bench.ts +2 -1
- package/src/corpus.test.mts +13 -0
- package/src/corpus.ts +4 -0
- package/src/profile-coordinates.ts +2 -2
- package/src/rollout-ledger/backfill-swe-arena.mts +5 -1
- package/src/rollout-ledger/settle-capture.mts +7 -1
- package/src/search-bench/profiles.ts +1 -1
- package/src/skill-sandbox-smoke.mts +2 -1
- package/src/swe-arena/gepa-seat.mts +1 -1
- package/src/swe-arena/ledger-orphans.test.mts +36 -34
- package/dist/benchmarks/cadbench.js.map +0 -1
- package/dist/benchmarks/cadgenbench.js.map +0 -1
- package/dist/benchmarks/types.js.map +0 -1
- package/dist/chunk-3U5TXJZS.js +0 -251
- package/dist/chunk-3U5TXJZS.js.map +0 -1
- package/dist/chunk-53UPUNBZ.js +0 -325
- package/dist/chunk-53UPUNBZ.js.map +0 -1
- package/dist/chunk-5H5XV76F.js +0 -240
- package/dist/chunk-5H5XV76F.js.map +0 -1
- package/dist/chunk-7GRVHU22.js +0 -208
- package/dist/chunk-7GRVHU22.js.map +0 -1
- package/dist/chunk-C7T7WEK2.js +0 -103
- package/dist/chunk-C7T7WEK2.js.map +0 -1
- package/dist/chunk-HWST3SED.js +0 -162
- package/dist/chunk-HWST3SED.js.map +0 -1
- package/dist/chunk-IA2FBTWC.js +0 -318
- package/dist/chunk-IA2FBTWC.js.map +0 -1
- package/dist/chunk-IFVINJ4B.js +0 -142
- package/dist/chunk-IFVINJ4B.js.map +0 -1
- package/dist/chunk-INNOYXCP.js +0 -387
- package/dist/chunk-INNOYXCP.js.map +0 -1
- package/dist/chunk-IZ5M6OAC.js +0 -169
- package/dist/chunk-IZ5M6OAC.js.map +0 -1
- package/dist/chunk-JTHWEDEW.js +0 -32
- package/dist/chunk-JTHWEDEW.js.map +0 -1
- package/dist/chunk-K3BQGZCT.js +0 -221
- package/dist/chunk-K3BQGZCT.js.map +0 -1
- package/dist/chunk-KP5KD6EN.js +0 -276
- package/dist/chunk-KP5KD6EN.js.map +0 -1
- package/dist/chunk-MQMRLGOG.js +0 -136
- package/dist/chunk-MQMRLGOG.js.map +0 -1
- package/dist/chunk-NQG5XDSB.js +0 -147
- package/dist/chunk-NQG5XDSB.js.map +0 -1
- package/dist/chunk-PA2ZKHJC.js +0 -230
- package/dist/chunk-PA2ZKHJC.js.map +0 -1
- package/dist/chunk-PB64GYIG.js +0 -118
- package/dist/chunk-PB64GYIG.js.map +0 -1
- package/dist/chunk-PUIRNYI7.js +0 -189
- package/dist/chunk-PUIRNYI7.js.map +0 -1
- package/dist/chunk-RCYQEFNX.js +0 -30
- package/dist/chunk-RCYQEFNX.js.map +0 -1
- package/dist/chunk-RH5F53JT.js +0 -182
- package/dist/chunk-RH5F53JT.js.map +0 -1
- package/dist/chunk-SEVJPLZC.js +0 -260
- package/dist/chunk-SEVJPLZC.js.map +0 -1
- package/dist/chunk-SFLA7OH3.js +0 -27
- package/dist/chunk-SFLA7OH3.js.map +0 -1
- package/dist/chunk-SHM6MRRF.js +0 -130
- package/dist/chunk-SHM6MRRF.js.map +0 -1
- package/dist/chunk-SHYIRB7I.js +0 -120
- package/dist/chunk-SHYIRB7I.js.map +0 -1
- package/dist/chunk-SVR2LKYI.js +0 -116
- package/dist/chunk-SVR2LKYI.js.map +0 -1
- package/dist/chunk-TBKU5XQI.js +0 -228
- package/dist/chunk-TBKU5XQI.js.map +0 -1
- package/dist/chunk-UPAMRDX4.js +0 -233
- package/dist/chunk-UPAMRDX4.js.map +0 -1
- package/dist/chunk-V7AEBY6U.js +0 -144
- package/dist/chunk-V7AEBY6U.js.map +0 -1
- package/dist/chunk-VQRS7VUC.js +0 -342
- package/dist/chunk-VQRS7VUC.js.map +0 -1
- package/dist/chunk-WSKWVEQB.js +0 -317
- package/dist/chunk-WSKWVEQB.js.map +0 -1
- package/dist/chunk-X3BTXCJ4.js +0 -262
- package/dist/chunk-X3BTXCJ4.js.map +0 -1
- package/dist/chunk-XKEFIFIC.js +0 -197
- package/dist/chunk-XKEFIFIC.js.map +0 -1
- package/dist/chunk-XYA4XSNU.js +0 -148
- package/dist/chunk-XYA4XSNU.js.map +0 -1
- package/dist/chunk-YSMEKBTD.js +0 -211
- package/dist/chunk-YSMEKBTD.js.map +0 -1
- package/dist/chunk-Z4TZ76N7.js +0 -170
- package/dist/chunk-Z4TZ76N7.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/benchmarks/mind2web.ts"],"sourcesContent":["/**\n * Mind2Web adapter (osunlp/Multimodal-Mind2Web, split 'test_domain' by default).\n * Web-agent ACTION PREDICTION: each task is one step of a real web task — given\n * the natural-language goal and the page's candidate elements, the worker picks\n * the SINGLE element to act on and the action (CLICK / TYPE / SELECT [+ value]).\n *\n * Judge is the published Mind2Web step metric, FULLY DETERMINISTIC — no LLM:\n * element correct ⇔ predicted backend_node_id ∈ pos_candidates ids\n * operation correct ⇔ op-type matches AND (TYPE/SELECT) the value matches\n * resolved (Step-SR) ⇔ element correct AND operation correct\n * score = 0.6·element + 0.4·operation (a gradient for the optimizer; the right\n * element is most of the credit, mirroring Element-Acc ≫ Op as the lever)\n * This is the low-noise reward a certifiable directive-lift needs: the number is a\n * programmatic match against human-verified ground truth, not a judge's opinion.\n *\n * The worker artifact is three sentinel lines (ELEMENT / ACTION / VALUE) so the\n * judge extracts deterministically; the prompt presents the candidate set as a\n * choice over backend_node_id ordered by id (position uncorrelated with the answer).\n *\n * Each step carries the dataset's OWN page screenshot (written to a temp file by\n * the loader); the worker drops it into a browser.<op> span so run-capsule's screen\n * capsule turns the run into a film — the real page, not a re-rendered DOM.\n *\n * Requires for a live run: a python with `datasets` + `pillow` and network to\n * Hugging Face. Point M2W_PYTHON at it (defaults to bench/.venv/bin/python).\n */\n\nimport { execFile } from 'node:child_process'\nimport { mkdir } from 'node:fs/promises'\nimport { tmpdir } from 'node:os'\nimport { join } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { promisify } from 'node:util'\nimport type { BenchmarkAdapter, BenchScore, BenchTask, LoadOptions } from './types'\n\nconst execFileAsync = promisify(execFile)\nconst BENCH_ROOT = fileURLToPath(new URL('../..', import.meta.url))\nconst PY = process.env.M2W_PYTHON ?? join(BENCH_ROOT, '.venv', 'bin', 'python')\n\nconst DATASET = 'osunlp/Multimodal-Mind2Web'\nconst DEFAULT_SPLIT = process.env.M2W_SPLIT ?? 'test_domain'\nconst SHOTS_DIR = process.env.M2W_SHOTS ?? join(tmpdir(), 'm2w-shots')\n/** Candidate-set cap presented to the worker (always keeps all pos candidates). */\nconst CANDIDATE_CAP = Number(process.env.M2W_CANDIDATE_CAP ?? 30)\n\n/** The worker contract appended to every task prompt; the judge keys off these. */\nconst WORKER_CONTRACT = [\n '',\n 'Pick the SINGLE next element to act on, then end your response with EXACTLY these three lines:',\n 'ELEMENT: <the [id] number of the chosen element>',\n 'ACTION: <CLICK | TYPE | SELECT>',\n 'VALUE: <text to type or option to select; leave empty for CLICK>',\n].join('\\n')\n\ninterface RawCandidate {\n id: string\n label: string\n}\ninterface Mind2WebRow {\n id: string\n task: string\n website: string\n domain: string\n subdomain: string\n op: string\n value: string\n goldIds: string[]\n candidates: RawCandidate[]\n screenshotPath: string\n targetRepr: string\n}\ninterface Mind2WebMeta {\n task: string\n website: string\n domain: string\n op: string\n value: string\n goldIds: string[]\n candidateIds: string[]\n screenshotPath: string\n targetRepr: string\n}\n\n/** Run the bench python with a script on stdin; return stdout (throws on nonzero). */\nasync function py(script: string, args: string[] = []): Promise<string> {\n const { stdout } = await execFileAsync(PY, ['-c', script, ...args], { maxBuffer: 1024 * 1024 * 256 })\n return stdout\n}\n\n/** The loader: stream the split, skip steps with no positive candidate (fail-loud,\n * never a silent score-0), cap the candidate set, save each screenshot to a file. */\nconst LOADER = `\nimport json, sys, os\nfrom datasets import load_dataset\ncfg = json.loads(sys.argv[1])\nsplit = cfg[\"split\"]; limit = cfg.get(\"limit\"); cap = cfg.get(\"cap\", 30)\nshots = cfg[\"shotsDir\"]; ids = set(cfg[\"ids\"]) if cfg.get(\"ids\") else None\nos.makedirs(shots, exist_ok=True)\nKEEP = (\"aria_label\",\"aria-label\",\"role\",\"type\",\"name\",\"placeholder\",\"title\",\"alt\",\"value\",\"text\",\"id\",\"class\",\"href\")\ndef label(tag, attr):\n try:\n a = json.loads(attr) if isinstance(attr, str) else (attr or {})\n except Exception:\n a = {}\n parts = []\n for k in KEEP:\n v = a.get(k)\n if v:\n sv = str(v).replace(\"\\\\n\", \" \").strip()\n if k == \"class\": sv = sv[:40]\n if k == \"href\": sv = sv[:50]\n if sv: parts.append(k + \"=\" + sv[:60])\n return \"<\" + str(tag) + \"> \" + \" \".join(parts[:6])\ndef cands(raw):\n out = []\n for c in raw or []:\n try:\n d = json.loads(c) if isinstance(c, str) else c\n except Exception:\n continue\n bid = str(d.get(\"backend_node_id\", \"\"))\n if not bid: continue\n out.append({\"id\": bid, \"label\": label(d.get(\"tag\", \"?\"), d.get(\"attributes\"))})\n return out\nds = load_dataset(${JSON.stringify(DATASET)}, split=split, streaming=True)\nemitted = []; skipped = 0; scanned = 0\nfor r in ds:\n scanned += 1\n if ids is not None and r[\"action_uid\"] not in ids:\n if scanned > 8000: break\n continue\n pos = cands(r.get(\"pos_candidates\"))\n if not pos:\n skipped += 1\n continue\n neg = cands(r.get(\"neg_candidates\"))\n seen = set(p[\"id\"] for p in pos); merged = list(pos)\n for n in neg:\n if len(merged) >= cap: break\n if n[\"id\"] in seen: continue\n seen.add(n[\"id\"]); merged.append(n)\n merged.sort(key=lambda x: int(x[\"id\"]) if x[\"id\"].isdigit() else 0)\n try:\n op = json.loads(r[\"operation\"]) if isinstance(r[\"operation\"], str) else r[\"operation\"]\n except Exception:\n op = {}\n sp = os.path.join(shots, str(r[\"action_uid\"]) + \".jpg\")\n try:\n r[\"screenshot\"].convert(\"RGB\").save(sp, \"JPEG\", quality=70)\n except Exception:\n sp = \"\"\n emitted.append({\n \"id\": r[\"action_uid\"], \"task\": r.get(\"confirmed_task\", \"\"),\n \"website\": r.get(\"website\", \"\"), \"domain\": r.get(\"domain\", \"\"), \"subdomain\": r.get(\"subdomain\", \"\"),\n \"op\": str(op.get(\"op\", \"\")).upper(), \"value\": str(op.get(\"value\", \"\")),\n \"goldIds\": [p[\"id\"] for p in pos], \"candidates\": merged,\n \"screenshotPath\": sp, \"targetRepr\": r.get(\"target_action_reprs\", \"\"),\n })\n if ids is None and limit is not None and len(emitted) >= limit: break\n if ids is not None and len(emitted) >= len(ids): break\nsys.stderr.write(\"[mind2web] emitted=%d skipped_empty_pos=%d scanned=%d\\\\n\" % (len(emitted), skipped, scanned)); sys.stderr.flush()\nprint(json.dumps(emitted)); sys.stdout.flush()\nos._exit(0)\n`\n\nfunction buildPrompt(row: Mind2WebRow): string {\n const choices = row.candidates.map((c) => ` [${c.id}] ${c.label}`).join('\\n')\n return [\n `Web task: ${row.task}`,\n '',\n 'You are taking the NEXT single action on the current web page. Choose the one element',\n 'to act on from the candidates below (each line is \"[id] <tag> attributes\"):',\n choices,\n WORKER_CONTRACT,\n ].join('\\n')\n}\n\nfunction rowToTask(row: Mind2WebRow): BenchTask {\n const meta: Mind2WebMeta = {\n task: row.task,\n website: row.website,\n domain: row.domain,\n op: row.op,\n value: row.value,\n goldIds: row.goldIds,\n candidateIds: row.candidates.map((c) => c.id),\n screenshotPath: row.screenshotPath,\n targetRepr: row.targetRepr,\n }\n return {\n id: `mind2web-${row.id}`,\n split: DEFAULT_SPLIT,\n prompt: buildPrompt(row),\n metadata: meta as unknown as Record<string, unknown>,\n }\n}\n\nfunction readMeta(task: BenchTask): Mind2WebMeta {\n const md = task.metadata\n if (!md || !Array.isArray((md as { goldIds?: unknown }).goldIds)) {\n throw new Error(`mind2web task ${task.id} missing metadata.goldIds — loadTasks did not populate it`)\n }\n return md as unknown as Mind2WebMeta\n}\n\n/** Normalize a TYPE/SELECT value for comparison: lowercase, collapse whitespace. */\nfunction normValue(s: string): string {\n return s.toLowerCase().replace(/\\s+/g, ' ').trim()\n}\n\ninterface ParsedAction {\n elementId: string\n op: string\n value: string\n}\n\n/** Parse the worker artifact's ELEMENT / ACTION / VALUE sentinel lines.\n * Fail-closed: a missing ELEMENT or ACTION returns null (judge → resolved=false). */\nexport function parseAction(artifact: string): ParsedAction | null {\n const elem = /ELEMENT:\\s*\\[?(\\d+)\\]?/i.exec(artifact)\n const op = /ACTION:\\s*(CLICK|TYPE|SELECT)/i.exec(artifact)\n if (!elem?.[1] || !op?.[1]) return null\n const val = /VALUE:\\s*(.*)/i.exec(artifact)\n return { elementId: elem[1], op: op[1].toUpperCase(), value: (val?.[1] ?? '').trim() }\n}\n\nexport function createMind2WebAdapter(): BenchmarkAdapter {\n const split = DEFAULT_SPLIT\n\n return {\n name: 'mind2web',\n\n async preflight() {\n try {\n await py(\n `import os, sys\nfrom datasets import load_dataset\nimport PIL\nds = load_dataset(${JSON.stringify(DATASET)}, split=${JSON.stringify(split)}, streaming=True)\nnext(iter(ds))\nprint('ok'); sys.stdout.flush(); os._exit(0)`,\n )\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n throw new Error(\n `mind2web preflight failed: ${msg}\\n` +\n `Fix: (1) a python with datasets + pillow (python3 -m venv bench/.venv && bench/.venv/bin/pip install datasets pillow) ; ` +\n `(2) network access to Hugging Face for ${DATASET} (split ${split}) ; ` +\n `point M2W_PYTHON at the python if not bench/.venv.`,\n )\n }\n },\n\n async loadTasks(opts: LoadOptions = {}) {\n const cfg = {\n split: opts.split ?? split,\n limit: opts.ids ? undefined : (opts.limit ?? 10),\n cap: CANDIDATE_CAP,\n shotsDir: SHOTS_DIR,\n ids: opts.ids ? opts.ids.map((id) => id.replace(/^mind2web-/, '')) : undefined,\n }\n await mkdir(SHOTS_DIR, { recursive: true })\n const stdout = await py(LOADER, [JSON.stringify(cfg)])\n const rows = JSON.parse(stdout) as Mind2WebRow[]\n return rows.map(rowToTask)\n },\n\n async goldArtifact(task: BenchTask) {\n // Gold = the worker-contract serialization of the ground-truth action, so\n // verify-judge proves gold→resolved through the SAME parse path the real\n // artifact takes. The first accepted positive id is the canonical target.\n const meta = readMeta(task)\n const id = meta.goldIds[0]\n if (!id) return undefined\n return `ELEMENT: ${id}\\nACTION: ${meta.op}\\nVALUE: ${meta.value}`\n },\n\n async judge(task: BenchTask, artifact: string): Promise<BenchScore> {\n const meta = readMeta(task)\n const parsed = parseAction(artifact)\n if (!parsed) {\n return {\n resolved: false,\n score: 0,\n detail: JSON.stringify({ reason: 'no parseable ELEMENT/ACTION', goldOp: meta.op, goldIds: meta.goldIds }),\n }\n }\n const elementCorrect = meta.goldIds.includes(parsed.elementId)\n const opMatch = parsed.op === meta.op\n const valueMatch = meta.op === 'CLICK' ? true : normValue(parsed.value) === normValue(meta.value)\n const operationCorrect = opMatch && valueMatch\n const resolved = elementCorrect && operationCorrect\n const score = 0.6 * (elementCorrect ? 1 : 0) + 0.4 * (operationCorrect ? 1 : 0)\n return {\n resolved,\n score,\n detail: JSON.stringify({\n elementCorrect,\n opMatch,\n valueMatch,\n predicted: parsed,\n goldOp: meta.op,\n goldValue: meta.value,\n goldIds: meta.goldIds,\n website: meta.website,\n domain: meta.domain,\n }),\n }\n },\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/chunk-UPAMRDX4.js
DELETED
|
@@ -1,233 +0,0 @@
|
|
|
1
|
-
// src/benchmarks/finsearchcomp.ts
|
|
2
|
-
import { readFile } from "fs/promises";
|
|
3
|
-
import { join } from "path";
|
|
4
|
-
import { fileURLToPath } from "url";
|
|
5
|
-
var BENCH_ROOT = fileURLToPath(new URL("../..", import.meta.url));
|
|
6
|
-
var FIXTURES = join(BENCH_ROOT, "fixtures", "finsearchcomp.json");
|
|
7
|
-
var DATASET_URL = "https://raw.githubusercontent.com/randomtutu/FinSearchComp/main/data/finsearchcomp_data.json";
|
|
8
|
-
var SUPPORTED_TYPES = /* @__PURE__ */ new Set(["T2", "T3"]);
|
|
9
|
-
var WORKER_CONTRACT = [
|
|
10
|
-
"",
|
|
11
|
-
"Research this financial question using live web/market sources and answer it.",
|
|
12
|
-
"State your final answer explicitly, with the exact units and precision the question requests.",
|
|
13
|
-
"Respect any tolerance the question implies; show the value you settled on, not just intermediate work."
|
|
14
|
-
].join("\n");
|
|
15
|
-
function parseTaskType(promptId) {
|
|
16
|
-
const m = promptId.match(/^\((T[123])\)/);
|
|
17
|
-
if (!m) throw new Error(`FinSearchComp prompt_id has no (T1|T2|T3) prefix: ${JSON.stringify(promptId)}`);
|
|
18
|
-
return m[1];
|
|
19
|
-
}
|
|
20
|
-
function parseRegion(label) {
|
|
21
|
-
const m = label.match(/\(([^()]+)\)\s*$/);
|
|
22
|
-
return m ? m[1].trim() : "";
|
|
23
|
-
}
|
|
24
|
-
function recordToTask(rec) {
|
|
25
|
-
const taskType = parseTaskType(rec.prompt_id);
|
|
26
|
-
const meta = {
|
|
27
|
-
promptId: rec.prompt_id,
|
|
28
|
-
label: rec.label,
|
|
29
|
-
taskType,
|
|
30
|
-
region: parseRegion(rec.label),
|
|
31
|
-
responseReference: rec.response_reference,
|
|
32
|
-
judgePromptTemplate: rec.judge_prompt_template,
|
|
33
|
-
judgeSystemPrompt: rec.judge_system_prompt,
|
|
34
|
-
rawPrompt: rec.prompt
|
|
35
|
-
};
|
|
36
|
-
return {
|
|
37
|
-
id: rec.prompt_id,
|
|
38
|
-
split: taskType,
|
|
39
|
-
prompt: rec.prompt + WORKER_CONTRACT,
|
|
40
|
-
metadata: meta
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
function readMeta(task) {
|
|
44
|
-
const md = task.metadata;
|
|
45
|
-
if (!md || typeof md.responseReference !== "string" || typeof md.judgePromptTemplate !== "string" || typeof md.judgeSystemPrompt !== "string" || typeof md.rawPrompt !== "string") {
|
|
46
|
-
throw new Error(`FinSearchComp task ${task.id} missing judge metadata \u2014 loadTasks did not populate it`);
|
|
47
|
-
}
|
|
48
|
-
return md;
|
|
49
|
-
}
|
|
50
|
-
function fillJudgePrompt(meta, response) {
|
|
51
|
-
return meta.judgePromptTemplate.replaceAll("{prompt}", meta.rawPrompt).replaceAll("{response_reference}", meta.responseReference).replaceAll("{response}", response);
|
|
52
|
-
}
|
|
53
|
-
function judgeRouter() {
|
|
54
|
-
const key = process.env.TANGLE_API_KEY;
|
|
55
|
-
if (!key) throw new Error("TANGLE_API_KEY is required for the FinSearchComp per-record LLM judge");
|
|
56
|
-
const model = process.env.JUDGE_MODEL ?? "deepseek-v4-flash";
|
|
57
|
-
const baseUrl = process.env.ROUTER_BASE ?? "https://router.tangle.tools/v1";
|
|
58
|
-
return { baseUrl, key, model };
|
|
59
|
-
}
|
|
60
|
-
function readAnswerScore(value) {
|
|
61
|
-
let v = value;
|
|
62
|
-
while (Array.isArray(v)) v = v[0];
|
|
63
|
-
if (v === null || v === void 0 || v === "null") {
|
|
64
|
-
return { resolved: false, score: 0, raw: value };
|
|
65
|
-
}
|
|
66
|
-
const n = typeof v === "number" ? v : typeof v === "string" ? Number(v) : NaN;
|
|
67
|
-
if (!Number.isFinite(n)) {
|
|
68
|
-
throw new Error(`FinSearchComp judge answer_score not numeric: ${JSON.stringify(value)}`);
|
|
69
|
-
}
|
|
70
|
-
const resolved = n >= 1;
|
|
71
|
-
const score = n <= 0 ? 0 : n >= 1 ? 1 : n;
|
|
72
|
-
return { resolved, score, raw: value };
|
|
73
|
-
}
|
|
74
|
-
function parseJudgeOutput(content) {
|
|
75
|
-
const candidates = [];
|
|
76
|
-
for (const m of content.matchAll(/```(?:json)?\s*([\s\S]*?)```/g)) candidates.push(m[1].trim());
|
|
77
|
-
for (const m of content.matchAll(/\{[^{}]*"answer_score"[\s\S]*?\}/g)) candidates.push(m[0]);
|
|
78
|
-
candidates.push(content.trim());
|
|
79
|
-
for (const c of candidates) {
|
|
80
|
-
let parsed;
|
|
81
|
-
try {
|
|
82
|
-
parsed = JSON.parse(c);
|
|
83
|
-
} catch {
|
|
84
|
-
continue;
|
|
85
|
-
}
|
|
86
|
-
if ("answer_score" in parsed) return readAnswerScore(parsed.answer_score);
|
|
87
|
-
}
|
|
88
|
-
throw new Error(
|
|
89
|
-
`FinSearchComp judge produced no parseable {"answer_score": \u2026}: ${content.slice(0, 400)}`
|
|
90
|
-
);
|
|
91
|
-
}
|
|
92
|
-
async function runRecordJudge(meta, response, router) {
|
|
93
|
-
const res = await fetch(`${router.baseUrl}/chat/completions`, {
|
|
94
|
-
method: "POST",
|
|
95
|
-
headers: { "content-type": "application/json", authorization: `Bearer ${router.key}` },
|
|
96
|
-
body: JSON.stringify({
|
|
97
|
-
model: router.model,
|
|
98
|
-
temperature: 0,
|
|
99
|
-
messages: [
|
|
100
|
-
{ role: "system", content: meta.judgeSystemPrompt },
|
|
101
|
-
{ role: "user", content: fillJudgePrompt(meta, response) }
|
|
102
|
-
]
|
|
103
|
-
})
|
|
104
|
-
});
|
|
105
|
-
if (!res.ok) {
|
|
106
|
-
throw new Error(`FinSearchComp judge HTTP ${res.status}: ${(await res.text()).slice(0, 300)}`);
|
|
107
|
-
}
|
|
108
|
-
const body = await res.json();
|
|
109
|
-
const content = body.choices?.[0]?.message?.content;
|
|
110
|
-
if (typeof content !== "string") {
|
|
111
|
-
throw new Error(`FinSearchComp judge returned no message content: ${JSON.stringify(body).slice(0, 300)}`);
|
|
112
|
-
}
|
|
113
|
-
const { resolved, score, raw } = parseJudgeOutput(content);
|
|
114
|
-
return {
|
|
115
|
-
resolved,
|
|
116
|
-
score,
|
|
117
|
-
detail: JSON.stringify({
|
|
118
|
-
taskType: meta.taskType,
|
|
119
|
-
region: meta.region,
|
|
120
|
-
answerScore: raw,
|
|
121
|
-
judgeModel: router.model
|
|
122
|
-
})
|
|
123
|
-
};
|
|
124
|
-
}
|
|
125
|
-
function selectRecords(records, opts) {
|
|
126
|
-
let tasks = records.filter((r) => SUPPORTED_TYPES.has(parseTaskType(r.prompt_id))).map(recordToTask);
|
|
127
|
-
if (opts.split) tasks = tasks.filter((t) => t.split === opts.split);
|
|
128
|
-
if (opts.ids) {
|
|
129
|
-
const want = new Set(opts.ids);
|
|
130
|
-
tasks = tasks.filter((t) => want.has(t.id));
|
|
131
|
-
} else if (opts.limit !== void 0) {
|
|
132
|
-
tasks = balanceByType(tasks, opts.limit);
|
|
133
|
-
}
|
|
134
|
-
return tasks;
|
|
135
|
-
}
|
|
136
|
-
function balanceByType(tasks, limit) {
|
|
137
|
-
const queues = /* @__PURE__ */ new Map();
|
|
138
|
-
for (const t of tasks) {
|
|
139
|
-
const k = parseTaskType(t.id);
|
|
140
|
-
const q = queues.get(k);
|
|
141
|
-
if (q) q.push(t);
|
|
142
|
-
else queues.set(k, [t]);
|
|
143
|
-
}
|
|
144
|
-
const lanes = [...queues.values()];
|
|
145
|
-
const out = [];
|
|
146
|
-
for (let i = 0; out.length < limit; i++) {
|
|
147
|
-
const before = out.length;
|
|
148
|
-
for (const lane of lanes) {
|
|
149
|
-
if (i < lane.length) out.push(lane[i]);
|
|
150
|
-
if (out.length >= limit) break;
|
|
151
|
-
}
|
|
152
|
-
if (out.length === before) break;
|
|
153
|
-
}
|
|
154
|
-
return out;
|
|
155
|
-
}
|
|
156
|
-
async function loadFixtures(opts) {
|
|
157
|
-
const records = JSON.parse(await readFile(FIXTURES, "utf8"));
|
|
158
|
-
return selectRecords(records, opts);
|
|
159
|
-
}
|
|
160
|
-
async function fetchDataset() {
|
|
161
|
-
const res = await fetch(DATASET_URL);
|
|
162
|
-
if (!res.ok) throw new Error(`FinSearchComp dataset HTTP ${res.status} fetching ${DATASET_URL}`);
|
|
163
|
-
const data = await res.json();
|
|
164
|
-
if (!Array.isArray(data) || data.length === 0) {
|
|
165
|
-
throw new Error(`FinSearchComp dataset empty or not an array: ${DATASET_URL}`);
|
|
166
|
-
}
|
|
167
|
-
return data;
|
|
168
|
-
}
|
|
169
|
-
function createFinsearchcompAdapter() {
|
|
170
|
-
const fixturesMode = process.env.FINSEARCHCOMP_FIXTURES === "1";
|
|
171
|
-
return {
|
|
172
|
-
name: "finsearchcomp",
|
|
173
|
-
async preflight() {
|
|
174
|
-
judgeRouter();
|
|
175
|
-
console.warn(
|
|
176
|
-
"[finsearchcomp] T1 (Time_Sensitive_Data_Fetching) is NOT scored: it needs a live market snapshot / akshare ground truth for the judge {ground_truth} slot. loadTasks supports T2 + T3 only; wire T1Seam to add T1."
|
|
177
|
-
);
|
|
178
|
-
if (fixturesMode) {
|
|
179
|
-
await readFile(FIXTURES, "utf8").catch((err) => {
|
|
180
|
-
throw new Error(
|
|
181
|
-
`FINSEARCHCOMP_FIXTURES=1 but ${FIXTURES} unreadable: ${err instanceof Error ? err.message : err}`
|
|
182
|
-
);
|
|
183
|
-
});
|
|
184
|
-
return;
|
|
185
|
-
}
|
|
186
|
-
const res = await fetch(DATASET_URL, { method: "HEAD" }).catch((err) => {
|
|
187
|
-
throw new Error(
|
|
188
|
-
`finsearchcomp preflight failed reaching ${DATASET_URL}: ${err instanceof Error ? err.message : err}
|
|
189
|
-
Fix: ensure network access to raw.githubusercontent.com, or set FINSEARCHCOMP_FIXTURES=1 to run against the committed fixtures offline.`
|
|
190
|
-
);
|
|
191
|
-
});
|
|
192
|
-
if (!res.ok) {
|
|
193
|
-
throw new Error(
|
|
194
|
-
`finsearchcomp preflight: dataset HEAD ${res.status} for ${DATASET_URL}. Set FINSEARCHCOMP_FIXTURES=1 to run against the committed fixtures offline.`
|
|
195
|
-
);
|
|
196
|
-
}
|
|
197
|
-
},
|
|
198
|
-
async loadTasks(opts = {}) {
|
|
199
|
-
if (fixturesMode) return loadFixtures(opts);
|
|
200
|
-
let records;
|
|
201
|
-
try {
|
|
202
|
-
records = await fetchDataset();
|
|
203
|
-
} catch (err) {
|
|
204
|
-
console.warn(
|
|
205
|
-
`[finsearchcomp] live dataset fetch failed (${err instanceof Error ? err.message : err}); falling back to committed fixtures at ${FIXTURES}`
|
|
206
|
-
);
|
|
207
|
-
return loadFixtures(opts);
|
|
208
|
-
}
|
|
209
|
-
return selectRecords(records, opts);
|
|
210
|
-
},
|
|
211
|
-
async goldArtifact(task) {
|
|
212
|
-
const meta = readMeta(task);
|
|
213
|
-
return meta.responseReference;
|
|
214
|
-
},
|
|
215
|
-
async judge(task, artifact) {
|
|
216
|
-
const meta = readMeta(task);
|
|
217
|
-
const response = artifact.trim();
|
|
218
|
-
if (response.length === 0) {
|
|
219
|
-
return {
|
|
220
|
-
resolved: false,
|
|
221
|
-
score: 0,
|
|
222
|
-
detail: JSON.stringify({ taskType: meta.taskType, region: meta.region, reason: "empty answer" })
|
|
223
|
-
};
|
|
224
|
-
}
|
|
225
|
-
return runRecordJudge(meta, response, judgeRouter());
|
|
226
|
-
}
|
|
227
|
-
};
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
export {
|
|
231
|
-
createFinsearchcompAdapter
|
|
232
|
-
};
|
|
233
|
-
//# sourceMappingURL=chunk-UPAMRDX4.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/benchmarks/finsearchcomp.ts"],"sourcesContent":["/**\n * FinSearchComp adapter (randomtutu/FinSearchComp). Agentic financial search +\n * reasoning. Worker artifact = the agent's free-form final answer text (zh/en).\n *\n * Each record is SELF-CONTAINED and carries its OWN judge: a per-record\n * `judge_system_prompt` + a `judge_prompt_template` with {prompt},\n * {response_reference} (gold answer WITH embedded tolerance/scoring-criteria),\n * and {response} (the student answer) placeholders. We faithfully REPLICATE the\n * benchmark's judge — fill the template, run it under the record's system prompt\n * via the pinned router (temperature 0), and parse the JSON the judge emits. The\n * judge returns an `answer_score` field; 1/positive = resolved, else not.\n * This matches the FinSearchComp leaderboard (Grok-4-web 68.9%).\n *\n * There is NO deterministic Tier-1 path here: the gold answer is prose with\n * region-specific units, embedded tolerances (\"允许1%的误差\"), and multi-point\n * scoring criteria. The benchmark intends its own LLM judge to be the arbiter,\n * so the judge IS the score — fail loud on unparseable judge output (never\n * default to resolved).\n *\n * SCOPE: T2 (Simple_Historical_Lookup) + T3 (Complex_Historical_Investigation)\n * are fully self-contained and supported. T1 (Time_Sensitive_Data_Fetching)\n * needs a live market snapshot / akshare ground truth to fill the judge's\n * {ground_truth} slot — it is SKIPPED in loadTasks and flagged in preflight.\n * See {@link T1Seam}.\n *\n * Requires for a live run: network access to the GitHub-hosted dataset JSON and\n * a TANGLE_API_KEY for the judge. For offline/CI verification, loadTasks falls back\n * to the committed fixtures (bench/fixtures/finsearchcomp.json) with an explicit\n * console.warn — never a silent fallback.\n */\n\nimport { readFile } from 'node:fs/promises'\nimport { join } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport type { BenchmarkAdapter, BenchScore, BenchTask, LoadOptions } from './types'\n\nconst BENCH_ROOT = fileURLToPath(new URL('../..', import.meta.url))\nconst FIXTURES = join(BENCH_ROOT, 'fixtures', 'finsearchcomp.json')\n\nconst DATASET_URL =\n 'https://raw.githubusercontent.com/randomtutu/FinSearchComp/main/data/finsearchcomp_data.json'\n\n/** Task-type prefix on prompt_id, e.g. \"(T2)Simple_Historical_Lookup_001\". */\ntype TaskType = 'T1' | 'T2' | 'T3'\n/** Only these are self-contained (gold + own judge, no external ground truth). */\nconst SUPPORTED_TYPES: ReadonlySet<TaskType> = new Set<TaskType>(['T2', 'T3'])\n\n/**\n * Worker contract appended to every task prompt. The judge is paraphrase- and\n * keyword-aware (\"答案为\", \"the answer is\"), so we do not impose a sentinel; we\n * pass the whole artifact through as {response}. We DO ask the worker to lead\n * with its final value so a truncated artifact still carries the answer.\n */\nconst WORKER_CONTRACT = [\n '',\n 'Research this financial question using live web/market sources and answer it.',\n 'State your final answer explicitly, with the exact units and precision the question requests.',\n 'Respect any tolerance the question implies; show the value you settled on, not just intermediate work.',\n].join('\\n')\n\n/**\n * Typed seam for T1 (Time_Sensitive_Data_Fetching). T1 records score against a\n * live market snapshot the judge consumes via a {ground_truth} template slot;\n * the adapter does NOT fabricate that snapshot. Wiring T1 means supplying a\n * resolver that fetches the akshare/market value for the record at judge time\n * and filling {ground_truth}. Until then T1 is excluded from loadTasks.\n */\nexport interface T1Seam {\n promptId: string\n /** Resolver that returns the real-time ground-truth block for the {ground_truth} slot. */\n resolveGroundTruth(promptId: string): Promise<string>\n}\n\ninterface FinSearchRecord {\n prompt_id: string\n prompt: string\n response_reference: string\n judge_prompt_template: string\n judge_system_prompt: string\n label: string\n}\n\ninterface FinSearchMeta {\n promptId: string\n label: string\n taskType: TaskType\n region: string\n responseReference: string\n judgePromptTemplate: string\n judgeSystemPrompt: string\n rawPrompt: string\n}\n\n/** \"(T2)Simple_Historical_Lookup_001\" → \"T2\"; throws on an unknown/missing prefix. */\nfunction parseTaskType(promptId: string): TaskType {\n const m = promptId.match(/^\\((T[123])\\)/)\n if (!m) throw new Error(`FinSearchComp prompt_id has no (T1|T2|T3) prefix: ${JSON.stringify(promptId)}`)\n return m[1] as TaskType\n}\n\n/** \"Simple_Historical_Lookup(Greater China)\" → \"Greater China\"; '' when absent. */\nfunction parseRegion(label: string): string {\n const m = label.match(/\\(([^()]+)\\)\\s*$/)\n return m ? m[1].trim() : ''\n}\n\nfunction recordToTask(rec: FinSearchRecord): BenchTask {\n const taskType = parseTaskType(rec.prompt_id)\n const meta: FinSearchMeta = {\n promptId: rec.prompt_id,\n label: rec.label,\n taskType,\n region: parseRegion(rec.label),\n responseReference: rec.response_reference,\n judgePromptTemplate: rec.judge_prompt_template,\n judgeSystemPrompt: rec.judge_system_prompt,\n rawPrompt: rec.prompt,\n }\n return {\n id: rec.prompt_id,\n split: taskType,\n prompt: rec.prompt + WORKER_CONTRACT,\n metadata: meta as unknown as Record<string, unknown>,\n }\n}\n\nfunction readMeta(task: BenchTask): FinSearchMeta {\n const md = task.metadata\n if (\n !md ||\n typeof md.responseReference !== 'string' ||\n typeof md.judgePromptTemplate !== 'string' ||\n typeof md.judgeSystemPrompt !== 'string' ||\n typeof md.rawPrompt !== 'string'\n ) {\n throw new Error(`FinSearchComp task ${task.id} missing judge metadata — loadTasks did not populate it`)\n }\n return md as unknown as FinSearchMeta\n}\n\n/** Fill the per-record judge_prompt_template. {ground_truth} is T1-only and unused for T2/T3. */\nfunction fillJudgePrompt(meta: FinSearchMeta, response: string): string {\n return meta.judgePromptTemplate\n .replaceAll('{prompt}', meta.rawPrompt)\n .replaceAll('{response_reference}', meta.responseReference)\n .replaceAll('{response}', response)\n}\n\ninterface JudgeRouter {\n baseUrl: string\n key: string\n model: string\n}\n\nfunction judgeRouter(): JudgeRouter {\n const key = process.env.TANGLE_API_KEY\n if (!key) throw new Error('TANGLE_API_KEY is required for the FinSearchComp per-record LLM judge')\n const model = process.env.JUDGE_MODEL ?? 'deepseek-v4-flash'\n const baseUrl = process.env.ROUTER_BASE ?? 'https://router.tangle.tools/v1'\n return { baseUrl, key, model }\n}\n\n/**\n * The judge emits a JSON object with an `answer_score`. In this dataset it is a\n * flat integer ({\"answer_score\": 1}); we also accept the nested-array form\n * ([[1]] → read [0][0]) the upstream scorer can produce. 1/positive = resolved.\n * A \"null\" sentinel (judge could not obtain ground truth) is NOT a pass.\n */\nfunction readAnswerScore(value: unknown): { resolved: boolean; score: number; raw: unknown } {\n let v: unknown = value\n // unwrap nested-array form: [[s]] / [s]\n while (Array.isArray(v)) v = v[0]\n if (v === null || v === undefined || v === 'null') {\n return { resolved: false, score: 0, raw: value }\n }\n const n = typeof v === 'number' ? v : typeof v === 'string' ? Number(v) : NaN\n if (!Number.isFinite(n)) {\n throw new Error(`FinSearchComp judge answer_score not numeric: ${JSON.stringify(value)}`)\n }\n // Their scale: 1 = correct, 0 = wrong. Treat any positive as resolved; clamp to 0..1.\n const resolved = n >= 1\n const score = n <= 0 ? 0 : n >= 1 ? 1 : n\n return { resolved, score, raw: value }\n}\n\n/** Extract the first JSON object carrying `answer_score` from judge output; throw if none. */\nfunction parseJudgeOutput(content: string): { resolved: boolean; score: number; raw: unknown } {\n // Prefer a fenced block, then fall back to scanning for a {...} with answer_score.\n const candidates: string[] = []\n for (const m of content.matchAll(/```(?:json)?\\s*([\\s\\S]*?)```/g)) candidates.push(m[1].trim())\n for (const m of content.matchAll(/\\{[^{}]*\"answer_score\"[\\s\\S]*?\\}/g)) candidates.push(m[0])\n candidates.push(content.trim())\n for (const c of candidates) {\n let parsed: { answer_score?: unknown }\n try {\n parsed = JSON.parse(c) as { answer_score?: unknown }\n } catch {\n continue\n }\n if ('answer_score' in parsed) return readAnswerScore(parsed.answer_score)\n }\n throw new Error(\n `FinSearchComp judge produced no parseable {\"answer_score\": …}: ${content.slice(0, 400)}`,\n )\n}\n\n/** Run the record's own judge via the router. Fail loud on transport/parse errors. */\nasync function runRecordJudge(meta: FinSearchMeta, response: string, router: JudgeRouter): Promise<BenchScore> {\n const res = await fetch(`${router.baseUrl}/chat/completions`, {\n method: 'POST',\n headers: { 'content-type': 'application/json', authorization: `Bearer ${router.key}` },\n body: JSON.stringify({\n model: router.model,\n temperature: 0,\n messages: [\n { role: 'system', content: meta.judgeSystemPrompt },\n { role: 'user', content: fillJudgePrompt(meta, response) },\n ],\n }),\n })\n if (!res.ok) {\n throw new Error(`FinSearchComp judge HTTP ${res.status}: ${(await res.text()).slice(0, 300)}`)\n }\n const body = (await res.json()) as { choices?: Array<{ message?: { content?: string } }> }\n const content = body.choices?.[0]?.message?.content\n if (typeof content !== 'string') {\n throw new Error(`FinSearchComp judge returned no message content: ${JSON.stringify(body).slice(0, 300)}`)\n }\n const { resolved, score, raw } = parseJudgeOutput(content)\n return {\n resolved,\n score,\n detail: JSON.stringify({\n taskType: meta.taskType,\n region: meta.region,\n answerScore: raw,\n judgeModel: router.model,\n }),\n }\n}\n\nfunction selectRecords(records: FinSearchRecord[], opts: LoadOptions): BenchTask[] {\n let tasks = records\n .filter((r) => SUPPORTED_TYPES.has(parseTaskType(r.prompt_id)))\n .map(recordToTask)\n if (opts.split) tasks = tasks.filter((t) => t.split === opts.split)\n if (opts.ids) {\n const want = new Set(opts.ids)\n tasks = tasks.filter((t) => want.has(t.id))\n } else if (opts.limit !== undefined) {\n tasks = balanceByType(tasks, opts.limit)\n }\n return tasks\n}\n\n/** Round-robin across task types (T2/T3) so a `limit` pulls a balanced mix\n * rather than slicing the type-ordered dataset's first N (which yields all\n * T2). Deterministic — preserves dataset order within each type. */\nfunction balanceByType(tasks: BenchTask[], limit: number): BenchTask[] {\n const queues = new Map<TaskType, BenchTask[]>()\n for (const t of tasks) {\n const k = parseTaskType(t.id)\n const q = queues.get(k)\n if (q) q.push(t)\n else queues.set(k, [t])\n }\n const lanes = [...queues.values()]\n const out: BenchTask[] = []\n for (let i = 0; out.length < limit; i++) {\n const before = out.length\n for (const lane of lanes) {\n if (i < lane.length) out.push(lane[i])\n if (out.length >= limit) break\n }\n if (out.length === before) break // all lanes exhausted\n }\n return out\n}\n\nasync function loadFixtures(opts: LoadOptions): Promise<BenchTask[]> {\n const records = JSON.parse(await readFile(FIXTURES, 'utf8')) as FinSearchRecord[]\n return selectRecords(records, opts)\n}\n\nasync function fetchDataset(): Promise<FinSearchRecord[]> {\n const res = await fetch(DATASET_URL)\n if (!res.ok) throw new Error(`FinSearchComp dataset HTTP ${res.status} fetching ${DATASET_URL}`)\n const data = (await res.json()) as FinSearchRecord[]\n if (!Array.isArray(data) || data.length === 0) {\n throw new Error(`FinSearchComp dataset empty or not an array: ${DATASET_URL}`)\n }\n return data\n}\n\nexport function createFinsearchcompAdapter(): BenchmarkAdapter {\n const fixturesMode = process.env.FINSEARCHCOMP_FIXTURES === '1'\n\n return {\n name: 'finsearchcomp',\n\n async preflight() {\n // The per-record LLM judge is the arbiter in both modes — its router\n // config must exist or no score can be produced.\n judgeRouter()\n console.warn(\n '[finsearchcomp] T1 (Time_Sensitive_Data_Fetching) is NOT scored: it needs a live ' +\n 'market snapshot / akshare ground truth for the judge {ground_truth} slot. ' +\n 'loadTasks supports T2 + T3 only; wire T1Seam to add T1.',\n )\n if (fixturesMode) {\n await readFile(FIXTURES, 'utf8').catch((err) => {\n throw new Error(\n `FINSEARCHCOMP_FIXTURES=1 but ${FIXTURES} unreadable: ${err instanceof Error ? err.message : err}`,\n )\n })\n return\n }\n const res = await fetch(DATASET_URL, { method: 'HEAD' }).catch((err) => {\n throw new Error(\n `finsearchcomp preflight failed reaching ${DATASET_URL}: ${err instanceof Error ? err.message : err}\\n` +\n `Fix: ensure network access to raw.githubusercontent.com, or set FINSEARCHCOMP_FIXTURES=1 ` +\n `to run against the committed fixtures offline.`,\n )\n })\n if (!res.ok) {\n throw new Error(\n `finsearchcomp preflight: dataset HEAD ${res.status} for ${DATASET_URL}. ` +\n `Set FINSEARCHCOMP_FIXTURES=1 to run against the committed fixtures offline.`,\n )\n }\n },\n\n async loadTasks(opts: LoadOptions = {}) {\n if (fixturesMode) return loadFixtures(opts)\n let records: FinSearchRecord[]\n try {\n records = await fetchDataset()\n } catch (err) {\n console.warn(\n `[finsearchcomp] live dataset fetch failed (${err instanceof Error ? err.message : err}); ` +\n `falling back to committed fixtures at ${FIXTURES}`,\n )\n return loadFixtures(opts)\n }\n return selectRecords(records, opts)\n },\n\n async goldArtifact(task: BenchTask) {\n // Gold artifact = the record's response_reference fed back as the student\n // answer, so verify-judge proves gold→resolved through the SAME per-record\n // judge the real artifact takes. The reference may carry tolerance/criteria\n // prose; the judge is built to read the value out of it.\n const meta = readMeta(task)\n return meta.responseReference\n },\n\n async judge(task: BenchTask, artifact: string): Promise<BenchScore> {\n const meta = readMeta(task)\n const response = artifact.trim()\n if (response.length === 0) {\n // Fail-closed — the benchmark's own judges score an empty answer 0.\n return {\n resolved: false,\n score: 0,\n detail: JSON.stringify({ taskType: meta.taskType, region: meta.region, reason: 'empty answer' }),\n }\n }\n return runRecordJudge(meta, response, judgeRouter())\n },\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/chunk-V7AEBY6U.js
DELETED
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
createToolLlmAdapter
|
|
3
|
-
} from "./chunk-XKEFIFIC.js";
|
|
4
|
-
import {
|
|
5
|
-
createTrataHedgeAdapter
|
|
6
|
-
} from "./chunk-VQRS7VUC.js";
|
|
7
|
-
import {
|
|
8
|
-
createWebArenaVerifiedAdapter
|
|
9
|
-
} from "./chunk-HWST3SED.js";
|
|
10
|
-
import {
|
|
11
|
-
createRagBenchAdapter
|
|
12
|
-
} from "./chunk-IFVINJ4B.js";
|
|
13
|
-
import {
|
|
14
|
-
createSimpleQaAdapter
|
|
15
|
-
} from "./chunk-SEVJPLZC.js";
|
|
16
|
-
import {
|
|
17
|
-
createSweBenchAdapter
|
|
18
|
-
} from "./chunk-3U5TXJZS.js";
|
|
19
|
-
import {
|
|
20
|
-
createT2RagBenchAdapter
|
|
21
|
-
} from "./chunk-SHM6MRRF.js";
|
|
22
|
-
import {
|
|
23
|
-
createTau2BenchAdapter
|
|
24
|
-
} from "./chunk-RCYQEFNX.js";
|
|
25
|
-
import {
|
|
26
|
-
createTau3BankingAdapter
|
|
27
|
-
} from "./chunk-SFLA7OH3.js";
|
|
28
|
-
import {
|
|
29
|
-
createTerminalBenchAdapter
|
|
30
|
-
} from "./chunk-XYA4XSNU.js";
|
|
31
|
-
import {
|
|
32
|
-
createFramesAdapter
|
|
33
|
-
} from "./chunk-INNOYXCP.js";
|
|
34
|
-
import {
|
|
35
|
-
createHotpotqaAdapter
|
|
36
|
-
} from "./chunk-PA2ZKHJC.js";
|
|
37
|
-
import {
|
|
38
|
-
createHumanEvalAdapter
|
|
39
|
-
} from "./chunk-5H5XV76F.js";
|
|
40
|
-
import {
|
|
41
|
-
createMind2WebAdapter
|
|
42
|
-
} from "./chunk-TBKU5XQI.js";
|
|
43
|
-
import {
|
|
44
|
-
createNoMiraclAdapter
|
|
45
|
-
} from "./chunk-NQG5XDSB.js";
|
|
46
|
-
import {
|
|
47
|
-
createOpenRagBenchAdapter
|
|
48
|
-
} from "./chunk-SHYIRB7I.js";
|
|
49
|
-
import {
|
|
50
|
-
createProgrambenchAdapter
|
|
51
|
-
} from "./chunk-MQMRLGOG.js";
|
|
52
|
-
import {
|
|
53
|
-
createCadBenchAdapter
|
|
54
|
-
} from "./chunk-PUIRNYI7.js";
|
|
55
|
-
import {
|
|
56
|
-
createCadGenBenchAdapter
|
|
57
|
-
} from "./chunk-C7T7WEK2.js";
|
|
58
|
-
import {
|
|
59
|
-
createCommit0Adapter
|
|
60
|
-
} from "./chunk-Z4TZ76N7.js";
|
|
61
|
-
import {
|
|
62
|
-
createCragAdapter
|
|
63
|
-
} from "./chunk-SVR2LKYI.js";
|
|
64
|
-
import {
|
|
65
|
-
createDabstepAdapter
|
|
66
|
-
} from "./chunk-RH5F53JT.js";
|
|
67
|
-
import {
|
|
68
|
-
createEnterpriseOpsGymAdapter
|
|
69
|
-
} from "./chunk-YSMEKBTD.js";
|
|
70
|
-
import {
|
|
71
|
-
createFinResearchBenchAdapter
|
|
72
|
-
} from "./chunk-7GRVHU22.js";
|
|
73
|
-
import {
|
|
74
|
-
createFinsearchcompAdapter
|
|
75
|
-
} from "./chunk-UPAMRDX4.js";
|
|
76
|
-
import {
|
|
77
|
-
createAecBenchAdapter
|
|
78
|
-
} from "./chunk-K3BQGZCT.js";
|
|
79
|
-
import {
|
|
80
|
-
createAgentBenchAdapter
|
|
81
|
-
} from "./chunk-PB64GYIG.js";
|
|
82
|
-
import {
|
|
83
|
-
createAppWorldAdapter,
|
|
84
|
-
createAppWorldReactAdapter
|
|
85
|
-
} from "./chunk-IA2FBTWC.js";
|
|
86
|
-
import {
|
|
87
|
-
createBfclAdapter
|
|
88
|
-
} from "./chunk-KP5KD6EN.js";
|
|
89
|
-
import {
|
|
90
|
-
createCadDesignAdapter
|
|
91
|
-
} from "./chunk-53UPUNBZ.js";
|
|
92
|
-
|
|
93
|
-
// src/adapters.ts
|
|
94
|
-
var ADAPTERS = {
|
|
95
|
-
"swe-bench": createSweBenchAdapter,
|
|
96
|
-
"terminal-bench": createTerminalBenchAdapter,
|
|
97
|
-
// Code-benches sharing ./benchmarks/_harness (stage → external evaluator → report).
|
|
98
|
-
// loadTasks fetches the REAL dataset (committed fixtures fallback offline); judge
|
|
99
|
-
// delegates to the benchmark's own harness and fails loud when it/Docker is absent.
|
|
100
|
-
"aec-bench": createAecBenchAdapter,
|
|
101
|
-
commit0: createCommit0Adapter,
|
|
102
|
-
dabstep: createDabstepAdapter,
|
|
103
|
-
programbench: createProgrambenchAdapter,
|
|
104
|
-
"webarena-verified": createWebArenaVerifiedAdapter,
|
|
105
|
-
"tau2-bench": createTau2BenchAdapter,
|
|
106
|
-
"tau3-banking": createTau3BankingAdapter,
|
|
107
|
-
agentbench: createAgentBenchAdapter,
|
|
108
|
-
bfcl: createBfclAdapter,
|
|
109
|
-
toollm: createToolLlmAdapter,
|
|
110
|
-
appworld: createAppWorldAdapter,
|
|
111
|
-
// AppWorld's native interactive protocol — the worker is the in-engine ReAct
|
|
112
|
-
// episode (execution feedback every turn), the mode published baselines use.
|
|
113
|
-
"appworld-react": createAppWorldReactAdapter,
|
|
114
|
-
"enterpriseops-gym": createEnterpriseOpsGymAdapter,
|
|
115
|
-
"cad-design": createCadDesignAdapter,
|
|
116
|
-
cadbench: createCadBenchAdapter,
|
|
117
|
-
cadgenbench: createCadGenBenchAdapter,
|
|
118
|
-
frames: createFramesAdapter,
|
|
119
|
-
ragbench: createRagBenchAdapter,
|
|
120
|
-
crag: createCragAdapter,
|
|
121
|
-
nomiracl: createNoMiraclAdapter,
|
|
122
|
-
"open-rag-bench": createOpenRagBenchAdapter,
|
|
123
|
-
"t2-ragbench": createT2RagBenchAdapter,
|
|
124
|
-
finresearchbench: createFinResearchBenchAdapter,
|
|
125
|
-
finsearchcomp: createFinsearchcompAdapter,
|
|
126
|
-
simpleqa: createSimpleQaAdapter,
|
|
127
|
-
hotpotqa: createHotpotqaAdapter,
|
|
128
|
-
// Deployable-checker code domain: worker = router completion, judge = Docker test
|
|
129
|
-
// run (--network=none). The steering A/B counterpart to humaneval-gate.mts (selection).
|
|
130
|
-
humaneval: createHumanEvalAdapter,
|
|
131
|
-
mind2web: createMind2WebAdapter,
|
|
132
|
-
"trata-hedge": createTrataHedgeAdapter
|
|
133
|
-
};
|
|
134
|
-
function resolveAdapter(key) {
|
|
135
|
-
const make = ADAPTERS[key];
|
|
136
|
-
if (!make) throw new Error(`unknown benchmark ${JSON.stringify(key)} (have: ${Object.keys(ADAPTERS).join(", ")})`);
|
|
137
|
-
return make();
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
export {
|
|
141
|
-
ADAPTERS,
|
|
142
|
-
resolveAdapter
|
|
143
|
-
};
|
|
144
|
-
//# sourceMappingURL=chunk-V7AEBY6U.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/adapters.ts"],"sourcesContent":["/**\n * The benchmark registry — the single source of truth for every wired benchmark.\n * One key per benchmark; the value is its `BenchmarkAdapter` factory. `runBenchmarks`\n * (the unifier) maps over this; `run.ts`, `rsi.ts`, and `corpus-replay.mts` all read it\n * here rather than each keeping their own copy.\n */\n\nimport { createAecBenchAdapter } from './benchmarks/aec-bench'\nimport { createAgentBenchAdapter } from './benchmarks/agentbench'\nimport { createAppWorldAdapter, createAppWorldReactAdapter } from './benchmarks/appworld'\nimport { createBfclAdapter } from './benchmarks/bfcl'\nimport { createCadBenchAdapter } from './benchmarks/cadbench'\nimport { createCadDesignAdapter } from './benchmarks/cad-design'\nimport { createCadGenBenchAdapter } from './benchmarks/cadgenbench'\nimport { createCommit0Adapter } from './benchmarks/commit0'\nimport { createCragAdapter } from './benchmarks/crag'\nimport { createDabstepAdapter } from './benchmarks/dabstep'\nimport { createEnterpriseOpsGymAdapter } from './benchmarks/enterpriseops-gym'\nimport { createFinResearchBenchAdapter } from './benchmarks/finresearchbench'\nimport { createFinsearchcompAdapter } from './benchmarks/finsearchcomp'\nimport { createFramesAdapter } from './benchmarks/frames'\nimport { createHotpotqaAdapter } from './benchmarks/hotpotqa'\nimport { createHumanEvalAdapter } from './benchmarks/humaneval'\nimport { createMind2WebAdapter } from './benchmarks/mind2web'\nimport { createNoMiraclAdapter } from './benchmarks/nomiracl'\nimport { createOpenRagBenchAdapter } from './benchmarks/open-rag-bench'\nimport { createProgrambenchAdapter } from './benchmarks/programbench'\nimport { createRagBenchAdapter } from './benchmarks/ragbench'\nimport { createSimpleQaAdapter } from './benchmarks/simpleqa'\nimport { createSweBenchAdapter } from './benchmarks/swe-bench'\nimport { createT2RagBenchAdapter } from './benchmarks/t2-ragbench'\nimport { createTau2BenchAdapter } from './benchmarks/tau2-bench'\nimport { createTau3BankingAdapter } from './benchmarks/tau3-banking'\nimport { createTerminalBenchAdapter } from './benchmarks/terminal-bench'\nimport { createToolLlmAdapter } from './benchmarks/toollm'\nimport { createTrataHedgeAdapter } from './benchmarks/trata-hedge'\nimport { createWebArenaVerifiedAdapter } from './benchmarks/webarena-verified'\nimport type { BenchmarkAdapter } from './benchmarks/types'\n\nexport const ADAPTERS: Record<string, () => BenchmarkAdapter> = {\n 'swe-bench': createSweBenchAdapter,\n 'terminal-bench': createTerminalBenchAdapter,\n // Code-benches sharing ./benchmarks/_harness (stage → external evaluator → report).\n // loadTasks fetches the REAL dataset (committed fixtures fallback offline); judge\n // delegates to the benchmark's own harness and fails loud when it/Docker is absent.\n 'aec-bench': createAecBenchAdapter,\n commit0: createCommit0Adapter,\n dabstep: createDabstepAdapter,\n programbench: createProgrambenchAdapter,\n 'webarena-verified': createWebArenaVerifiedAdapter,\n 'tau2-bench': createTau2BenchAdapter,\n 'tau3-banking': createTau3BankingAdapter,\n agentbench: createAgentBenchAdapter,\n bfcl: createBfclAdapter,\n toollm: createToolLlmAdapter,\n appworld: createAppWorldAdapter,\n // AppWorld's native interactive protocol — the worker is the in-engine ReAct\n // episode (execution feedback every turn), the mode published baselines use.\n 'appworld-react': createAppWorldReactAdapter,\n 'enterpriseops-gym': createEnterpriseOpsGymAdapter,\n 'cad-design': createCadDesignAdapter,\n cadbench: createCadBenchAdapter,\n cadgenbench: createCadGenBenchAdapter,\n frames: createFramesAdapter,\n ragbench: createRagBenchAdapter,\n crag: createCragAdapter,\n nomiracl: createNoMiraclAdapter,\n 'open-rag-bench': createOpenRagBenchAdapter,\n 't2-ragbench': createT2RagBenchAdapter,\n finresearchbench: createFinResearchBenchAdapter,\n finsearchcomp: createFinsearchcompAdapter,\n simpleqa: createSimpleQaAdapter,\n hotpotqa: createHotpotqaAdapter,\n // Deployable-checker code domain: worker = router completion, judge = Docker test\n // run (--network=none). The steering A/B counterpart to humaneval-gate.mts (selection).\n humaneval: createHumanEvalAdapter,\n mind2web: createMind2WebAdapter,\n 'trata-hedge': createTrataHedgeAdapter,\n}\n\n/** Resolve a benchmark key to its adapter, failing loud with the known keys. */\nexport function resolveAdapter(key: string): BenchmarkAdapter {\n const make = ADAPTERS[key]\n if (!make) throw new Error(`unknown benchmark ${JSON.stringify(key)} (have: ${Object.keys(ADAPTERS).join(', ')})`)\n return make()\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCO,IAAM,WAAmD;AAAA,EAC9D,aAAa;AAAA,EACb,kBAAkB;AAAA;AAAA;AAAA;AAAA,EAIlB,aAAa;AAAA,EACb,SAAS;AAAA,EACT,SAAS;AAAA,EACT,cAAc;AAAA,EACd,qBAAqB;AAAA,EACrB,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,UAAU;AAAA;AAAA;AAAA,EAGV,kBAAkB;AAAA,EAClB,qBAAqB;AAAA,EACrB,cAAc;AAAA,EACd,UAAU;AAAA,EACV,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,MAAM;AAAA,EACN,UAAU;AAAA,EACV,kBAAkB;AAAA,EAClB,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB,eAAe;AAAA,EACf,UAAU;AAAA,EACV,UAAU;AAAA;AAAA;AAAA,EAGV,WAAW;AAAA,EACX,UAAU;AAAA,EACV,eAAe;AACjB;AAGO,SAAS,eAAe,KAA+B;AAC5D,QAAM,OAAO,SAAS,GAAG;AACzB,MAAI,CAAC,KAAM,OAAM,IAAI,MAAM,qBAAqB,KAAK,UAAU,GAAG,CAAC,WAAW,OAAO,KAAK,QAAQ,EAAE,KAAK,IAAI,CAAC,GAAG;AACjH,SAAO,KAAK;AACd;","names":[]}
|