@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.
Files changed (200) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/dist/adapters.d.ts +4 -11
  3. package/dist/adapters.js +78 -41
  4. package/dist/adapters.js.map +1 -1
  5. package/dist/benchmarks/_harness.d.ts +51 -66
  6. package/dist/benchmarks/_harness.js +329 -31
  7. package/dist/benchmarks/_harness.js.map +1 -1
  8. package/dist/benchmarks/aec-bench.d.ts +4 -25
  9. package/dist/benchmarks/aec-bench.js +242 -7
  10. package/dist/benchmarks/aec-bench.js.map +1 -1
  11. package/dist/benchmarks/agentbench.d.ts +5 -13
  12. package/dist/benchmarks/agentbench.js +114 -9
  13. package/dist/benchmarks/agentbench.js.map +1 -1
  14. package/dist/benchmarks/appworld.d.ts +9 -29
  15. package/dist/benchmarks/appworld.js +317 -12
  16. package/dist/benchmarks/appworld.js.map +1 -1
  17. package/dist/benchmarks/bfcl.d.ts +5 -15
  18. package/dist/benchmarks/bfcl.js +264 -9
  19. package/dist/benchmarks/bfcl.js.map +1 -1
  20. package/dist/benchmarks/cad-design.d.ts +16 -41
  21. package/dist/benchmarks/cad-design.js +512 -6
  22. package/dist/benchmarks/cad-design.js.map +1 -1
  23. package/dist/benchmarks/cadbench.d.ts +4 -17
  24. package/dist/benchmarks/cadbench.js +2 -8
  25. package/dist/benchmarks/cadgenbench.d.ts +4 -20
  26. package/dist/benchmarks/cadgenbench.js +2 -8
  27. package/dist/benchmarks/commit0.d.ts +5 -27
  28. package/dist/benchmarks/commit0.js +187 -9
  29. package/dist/benchmarks/commit0.js.map +1 -1
  30. package/dist/benchmarks/crag.d.ts +4 -12
  31. package/dist/benchmarks/crag.js +110 -8
  32. package/dist/benchmarks/crag.js.map +1 -1
  33. package/dist/benchmarks/dabstep.d.ts +5 -15
  34. package/dist/benchmarks/dabstep.js +177 -9
  35. package/dist/benchmarks/dabstep.js.map +1 -1
  36. package/dist/benchmarks/enterpriseops-gym.d.ts +5 -34
  37. package/dist/benchmarks/enterpriseops-gym.js +236 -9
  38. package/dist/benchmarks/enterpriseops-gym.js.map +1 -1
  39. package/dist/benchmarks/finresearchbench.d.ts +4 -13
  40. package/dist/benchmarks/finresearchbench.js +218 -7
  41. package/dist/benchmarks/finresearchbench.js.map +1 -1
  42. package/dist/benchmarks/finsearchcomp.d.ts +8 -39
  43. package/dist/benchmarks/finsearchcomp.js +267 -6
  44. package/dist/benchmarks/finsearchcomp.js.map +1 -1
  45. package/dist/benchmarks/frames.d.ts +15 -37
  46. package/dist/benchmarks/frames.js +408 -11
  47. package/dist/benchmarks/frames.js.map +1 -1
  48. package/dist/benchmarks/hotpotqa.d.ts +4 -24
  49. package/dist/benchmarks/hotpotqa.js +250 -14
  50. package/dist/benchmarks/hotpotqa.js.map +1 -1
  51. package/dist/benchmarks/humaneval.d.ts +19 -37
  52. package/dist/benchmarks/humaneval.js +279 -16
  53. package/dist/benchmarks/humaneval.js.map +1 -1
  54. package/dist/benchmarks/mind2web.d.ts +7 -34
  55. package/dist/benchmarks/mind2web.js +257 -8
  56. package/dist/benchmarks/mind2web.js.map +1 -1
  57. package/dist/benchmarks/nomiracl.d.ts +4 -13
  58. package/dist/benchmarks/nomiracl.js +146 -8
  59. package/dist/benchmarks/nomiracl.js.map +1 -1
  60. package/dist/benchmarks/open-rag-bench.d.ts +4 -12
  61. package/dist/benchmarks/open-rag-bench.js +110 -8
  62. package/dist/benchmarks/open-rag-bench.js.map +1 -1
  63. package/dist/benchmarks/programbench.d.ts +5 -29
  64. package/dist/benchmarks/programbench.js +161 -9
  65. package/dist/benchmarks/programbench.js.map +1 -1
  66. package/dist/benchmarks/rag-shared.d.ts +21 -20
  67. package/dist/benchmarks/rag-shared.js +245 -38
  68. package/dist/benchmarks/rag-shared.js.map +1 -1
  69. package/dist/benchmarks/ragbench.d.ts +4 -14
  70. package/dist/benchmarks/ragbench.js +127 -8
  71. package/dist/benchmarks/ragbench.js.map +1 -1
  72. package/dist/benchmarks/simpleqa.d.ts +17 -44
  73. package/dist/benchmarks/simpleqa.js +293 -10
  74. package/dist/benchmarks/simpleqa.js.map +1 -1
  75. package/dist/benchmarks/swe-bench.d.ts +23 -36
  76. package/dist/benchmarks/swe-bench.js +234 -13
  77. package/dist/benchmarks/swe-bench.js.map +1 -1
  78. package/dist/benchmarks/t2-ragbench.d.ts +4 -12
  79. package/dist/benchmarks/t2-ragbench.js +118 -8
  80. package/dist/benchmarks/t2-ragbench.js.map +1 -1
  81. package/dist/benchmarks/tau-bench-shared.d.ts +14 -22
  82. package/dist/benchmarks/tau-bench-shared.js +169 -9
  83. package/dist/benchmarks/tau-bench-shared.js.map +1 -1
  84. package/dist/benchmarks/tau2-bench.d.ts +5 -5
  85. package/dist/benchmarks/tau2-bench.js +28 -10
  86. package/dist/benchmarks/tau2-bench.js.map +1 -1
  87. package/dist/benchmarks/tau3-banking.d.ts +4 -13
  88. package/dist/benchmarks/tau3-banking.js +28 -8
  89. package/dist/benchmarks/tau3-banking.js.map +1 -1
  90. package/dist/benchmarks/terminal-bench.d.ts +4 -22
  91. package/dist/benchmarks/terminal-bench.js +140 -7
  92. package/dist/benchmarks/terminal-bench.js.map +1 -1
  93. package/dist/benchmarks/toollm.d.ts +5 -13
  94. package/dist/benchmarks/toollm.js +184 -9
  95. package/dist/benchmarks/toollm.js.map +1 -1
  96. package/dist/benchmarks/trata-hedge.d.ts +4 -30
  97. package/dist/benchmarks/trata-hedge.js +336 -6
  98. package/dist/benchmarks/trata-hedge.js.map +1 -1
  99. package/dist/benchmarks/types.d.ts +85 -94
  100. package/dist/benchmarks/types.js +1 -1
  101. package/dist/benchmarks/webarena-verified.d.ts +5 -13
  102. package/dist/benchmarks/webarena-verified.js +152 -9
  103. package/dist/benchmarks/webarena-verified.js.map +1 -1
  104. package/dist/cadbench-DpQWZHp4.js +285 -0
  105. package/dist/cadbench-DpQWZHp4.js.map +1 -0
  106. package/dist/cadgenbench-DRhczfsG.js +151 -0
  107. package/dist/cadgenbench-DRhczfsG.js.map +1 -0
  108. package/dist/index.d.ts +245 -293
  109. package/dist/index.js +1669 -1791
  110. package/dist/index.js.map +1 -1
  111. package/package.json +17 -14
  112. package/pier_agents/candidate_contract.py +238 -24
  113. package/pier_agents/tangle_candidate.py +75 -5
  114. package/scripts/verify-packed-consumer.mjs +84 -17
  115. package/scripts/verify-pier-agent.mts +6 -4
  116. package/src/benchmarks/_harness.test.mts +16 -1
  117. package/src/benchmarks/_harness.ts +9 -2
  118. package/src/benchmarks/terminal-bench.ts +2 -1
  119. package/src/corpus.test.mts +13 -0
  120. package/src/corpus.ts +4 -0
  121. package/src/profile-coordinates.ts +2 -2
  122. package/src/rollout-ledger/backfill-swe-arena.mts +5 -1
  123. package/src/rollout-ledger/settle-capture.mts +7 -1
  124. package/src/search-bench/profiles.ts +1 -1
  125. package/src/skill-sandbox-smoke.mts +2 -1
  126. package/src/swe-arena/gepa-seat.mts +1 -1
  127. package/src/swe-arena/ledger-orphans.test.mts +36 -34
  128. package/dist/benchmarks/cadbench.js.map +0 -1
  129. package/dist/benchmarks/cadgenbench.js.map +0 -1
  130. package/dist/benchmarks/types.js.map +0 -1
  131. package/dist/chunk-3U5TXJZS.js +0 -251
  132. package/dist/chunk-3U5TXJZS.js.map +0 -1
  133. package/dist/chunk-53UPUNBZ.js +0 -325
  134. package/dist/chunk-53UPUNBZ.js.map +0 -1
  135. package/dist/chunk-5H5XV76F.js +0 -240
  136. package/dist/chunk-5H5XV76F.js.map +0 -1
  137. package/dist/chunk-7GRVHU22.js +0 -208
  138. package/dist/chunk-7GRVHU22.js.map +0 -1
  139. package/dist/chunk-C7T7WEK2.js +0 -103
  140. package/dist/chunk-C7T7WEK2.js.map +0 -1
  141. package/dist/chunk-HWST3SED.js +0 -162
  142. package/dist/chunk-HWST3SED.js.map +0 -1
  143. package/dist/chunk-IA2FBTWC.js +0 -318
  144. package/dist/chunk-IA2FBTWC.js.map +0 -1
  145. package/dist/chunk-IFVINJ4B.js +0 -142
  146. package/dist/chunk-IFVINJ4B.js.map +0 -1
  147. package/dist/chunk-INNOYXCP.js +0 -387
  148. package/dist/chunk-INNOYXCP.js.map +0 -1
  149. package/dist/chunk-IZ5M6OAC.js +0 -169
  150. package/dist/chunk-IZ5M6OAC.js.map +0 -1
  151. package/dist/chunk-JTHWEDEW.js +0 -32
  152. package/dist/chunk-JTHWEDEW.js.map +0 -1
  153. package/dist/chunk-K3BQGZCT.js +0 -221
  154. package/dist/chunk-K3BQGZCT.js.map +0 -1
  155. package/dist/chunk-KP5KD6EN.js +0 -276
  156. package/dist/chunk-KP5KD6EN.js.map +0 -1
  157. package/dist/chunk-MQMRLGOG.js +0 -136
  158. package/dist/chunk-MQMRLGOG.js.map +0 -1
  159. package/dist/chunk-NQG5XDSB.js +0 -147
  160. package/dist/chunk-NQG5XDSB.js.map +0 -1
  161. package/dist/chunk-PA2ZKHJC.js +0 -230
  162. package/dist/chunk-PA2ZKHJC.js.map +0 -1
  163. package/dist/chunk-PB64GYIG.js +0 -118
  164. package/dist/chunk-PB64GYIG.js.map +0 -1
  165. package/dist/chunk-PUIRNYI7.js +0 -189
  166. package/dist/chunk-PUIRNYI7.js.map +0 -1
  167. package/dist/chunk-RCYQEFNX.js +0 -30
  168. package/dist/chunk-RCYQEFNX.js.map +0 -1
  169. package/dist/chunk-RH5F53JT.js +0 -182
  170. package/dist/chunk-RH5F53JT.js.map +0 -1
  171. package/dist/chunk-SEVJPLZC.js +0 -260
  172. package/dist/chunk-SEVJPLZC.js.map +0 -1
  173. package/dist/chunk-SFLA7OH3.js +0 -27
  174. package/dist/chunk-SFLA7OH3.js.map +0 -1
  175. package/dist/chunk-SHM6MRRF.js +0 -130
  176. package/dist/chunk-SHM6MRRF.js.map +0 -1
  177. package/dist/chunk-SHYIRB7I.js +0 -120
  178. package/dist/chunk-SHYIRB7I.js.map +0 -1
  179. package/dist/chunk-SVR2LKYI.js +0 -116
  180. package/dist/chunk-SVR2LKYI.js.map +0 -1
  181. package/dist/chunk-TBKU5XQI.js +0 -228
  182. package/dist/chunk-TBKU5XQI.js.map +0 -1
  183. package/dist/chunk-UPAMRDX4.js +0 -233
  184. package/dist/chunk-UPAMRDX4.js.map +0 -1
  185. package/dist/chunk-V7AEBY6U.js +0 -144
  186. package/dist/chunk-V7AEBY6U.js.map +0 -1
  187. package/dist/chunk-VQRS7VUC.js +0 -342
  188. package/dist/chunk-VQRS7VUC.js.map +0 -1
  189. package/dist/chunk-WSKWVEQB.js +0 -317
  190. package/dist/chunk-WSKWVEQB.js.map +0 -1
  191. package/dist/chunk-X3BTXCJ4.js +0 -262
  192. package/dist/chunk-X3BTXCJ4.js.map +0 -1
  193. package/dist/chunk-XKEFIFIC.js +0 -197
  194. package/dist/chunk-XKEFIFIC.js.map +0 -1
  195. package/dist/chunk-XYA4XSNU.js +0 -148
  196. package/dist/chunk-XYA4XSNU.js.map +0 -1
  197. package/dist/chunk-YSMEKBTD.js +0 -211
  198. package/dist/chunk-YSMEKBTD.js.map +0 -1
  199. package/dist/chunk-Z4TZ76N7.js +0 -170
  200. package/dist/chunk-Z4TZ76N7.js.map +0 -1
@@ -1,130 +0,0 @@
1
- import {
2
- FINAL_ANSWER_SENTINEL,
3
- allStrings,
4
- answerScoreToBenchScore,
5
- contextBlock,
6
- contextsFrom,
7
- firstString,
8
- isObject,
9
- ragAnswerOutput,
10
- readJsonRows,
11
- scoreAnswerArtifact,
12
- selectTasks,
13
- stringFrom
14
- } from "./chunk-X3BTXCJ4.js";
15
- import {
16
- benchRoot
17
- } from "./chunk-WSKWVEQB.js";
18
-
19
- // src/benchmarks/t2-ragbench.ts
20
- import { readFile } from "fs/promises";
21
- import { join } from "path";
22
- var FIXTURES = join(benchRoot, "fixtures", "t2-ragbench.json");
23
- var dataFile = () => process.env.T2_RAGBENCH_DATA_FILE;
24
- function rowToTask(raw, index) {
25
- if (!isObject(raw)) throw new Error(`T2-RAGBench row ${index} must be an object`);
26
- const query = firstString(raw, ["question", "query", "prompt"]);
27
- const goldAnswers = allStrings(raw, [
28
- "program_answer",
29
- "original_answer",
30
- "answer",
31
- "answers",
32
- "reference",
33
- "reference_answer",
34
- "gold"
35
- ]);
36
- if (!query) throw new Error(`T2-RAGBench row ${index} missing question/query`);
37
- if (goldAnswers.length === 0) throw new Error(`T2-RAGBench row ${index} missing answer`);
38
- const baseContexts = contextsFrom(raw.context).length > 0 ? contextsFrom(raw.context) : contextsFrom(raw.contexts).length > 0 ? contextsFrom(raw.contexts) : contextsFrom(raw.chunks).length > 0 ? contextsFrom(raw.chunks) : contextsFrom(raw.passages);
39
- const table = stringFrom(raw.table) ?? stringFrom(raw.table_text);
40
- const contexts = table ? [...baseContexts, { id: "table", title: "Table", text: table }] : baseContexts;
41
- const subset = stringFrom(raw.subset) ?? stringFrom(raw.dataset) ?? "unknown";
42
- const documentId = stringFrom(raw.context_id) ?? stringFrom(raw.document_id) ?? stringFrom(raw.doc_id) ?? stringFrom(raw.file_name) ?? "unknown";
43
- const id = stringFrom(raw.id) ?? stringFrom(raw.qid) ?? stringFrom(raw.query_id) ?? `t2-ragbench-${index}`;
44
- const meta = {
45
- benchmark: "t2-ragbench",
46
- query,
47
- goldAnswers,
48
- contexts,
49
- subset,
50
- documentId
51
- };
52
- return {
53
- id,
54
- split: stringFrom(raw.split) ?? subset,
55
- prompt: [
56
- "Answer this T2-RAGBench text-and-table financial question.",
57
- "Do the required numerical reasoning from the supplied context before giving the final value.",
58
- "End with a single final line: `FINAL ANSWER: <answer>`.",
59
- "",
60
- `Question: ${query}`,
61
- `Document: ${documentId}`,
62
- `Subset: ${subset}`,
63
- contexts.length > 0 ? `
64
- Context:
65
- ${contextBlock(contexts)}` : void 0
66
- ].filter(Boolean).join("\n"),
67
- metadata: meta
68
- };
69
- }
70
- function readMeta(task) {
71
- const md = task.metadata;
72
- if (!md || !Array.isArray(md.goldAnswers)) {
73
- throw new Error(`T2-RAGBench task ${task.id} missing metadata \u2014 loadTasks did not populate it`);
74
- }
75
- return md;
76
- }
77
- async function loadRows(path) {
78
- const rows = await readJsonRows(path);
79
- if (rows.length === 0) throw new Error(`T2-RAGBench: no rows in ${path}`);
80
- return rows;
81
- }
82
- async function loadFixtures(opts) {
83
- const rows = JSON.parse(await readFile(FIXTURES, "utf8"));
84
- console.warn(`[t2-ragbench] T2_RAGBENCH_FIXTURES=1 \u2014 loading ${rows.length} adapter fixtures`);
85
- return selectTasks(rows.map(rowToTask), opts, "T2-RAGBench");
86
- }
87
- function createT2RagBenchAdapter() {
88
- const fixturesMode = process.env.T2_RAGBENCH_FIXTURES === "1";
89
- return {
90
- name: "t2-ragbench",
91
- output: ragAnswerOutput,
92
- async preflight() {
93
- if (fixturesMode) {
94
- await readFile(FIXTURES, "utf8");
95
- return;
96
- }
97
- const path = dataFile();
98
- if (!path) {
99
- throw new Error(
100
- "T2_RAGBENCH_DATA_FILE is required. Fix: export T2-RAGBench rows to JSONL and set T2_RAGBENCH_DATA_FILE=/path/to/t2-ragbench.jsonl, or set T2_RAGBENCH_FIXTURES=1 for adapter plumbing."
101
- );
102
- }
103
- await loadRows(path);
104
- },
105
- async loadTasks(opts = {}) {
106
- if (fixturesMode) return loadFixtures(opts);
107
- const path = dataFile();
108
- if (!path) throw new Error("T2_RAGBENCH_DATA_FILE is required to load T2-RAGBench tasks");
109
- return selectTasks((await loadRows(path)).map(rowToTask), opts, "T2-RAGBench");
110
- },
111
- async goldArtifact(task) {
112
- return `${FINAL_ANSWER_SENTINEL} ${readMeta(task).goldAnswers[0] ?? ""}`;
113
- },
114
- async judge(task, artifact) {
115
- const meta = readMeta(task);
116
- const score = scoreAnswerArtifact(artifact, meta.goldAnswers, { numericTolerance: 0.01 });
117
- return answerScoreToBenchScore(score, {
118
- benchmark: meta.benchmark,
119
- subset: meta.subset,
120
- documentId: meta.documentId,
121
- contextCount: meta.contexts.length
122
- });
123
- }
124
- };
125
- }
126
-
127
- export {
128
- createT2RagBenchAdapter
129
- };
130
- //# sourceMappingURL=chunk-SHM6MRRF.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/benchmarks/t2-ragbench.ts"],"sourcesContent":["/**\n * T2-RAGBench adapter.\n *\n * T2-RAGBench stresses text+table retrieval and numerical reasoning over\n * financial documents. The judge uses the shared deterministic answer scorer\n * with numeric tolerance enabled by default.\n */\n\nimport { readFile } from 'node:fs/promises'\nimport { join } from 'node:path'\nimport { benchRoot } from './_harness'\nimport type { BenchmarkAdapter, BenchScore, BenchTask, LoadOptions } from './types'\nimport {\n FINAL_ANSWER_SENTINEL,\n allStrings,\n answerScoreToBenchScore,\n contextBlock,\n contextsFrom,\n firstString,\n isObject,\n ragAnswerOutput,\n readJsonRows,\n scoreAnswerArtifact,\n selectTasks,\n stringFrom,\n type RagContext,\n} from './rag-shared'\n\nconst FIXTURES = join(benchRoot, 'fixtures', 't2-ragbench.json')\n\ninterface T2RagBenchMeta {\n benchmark: 't2-ragbench'\n query: string\n goldAnswers: string[]\n contexts: RagContext[]\n subset: string\n documentId: string\n}\n\nconst dataFile = (): string | undefined => process.env.T2_RAGBENCH_DATA_FILE\n\nfunction rowToTask(raw: unknown, index: number): BenchTask {\n if (!isObject(raw)) throw new Error(`T2-RAGBench row ${index} must be an object`)\n const query = firstString(raw, ['question', 'query', 'prompt'])\n const goldAnswers = allStrings(raw, [\n 'program_answer',\n 'original_answer',\n 'answer',\n 'answers',\n 'reference',\n 'reference_answer',\n 'gold',\n ])\n if (!query) throw new Error(`T2-RAGBench row ${index} missing question/query`)\n if (goldAnswers.length === 0) throw new Error(`T2-RAGBench row ${index} missing answer`)\n const baseContexts =\n contextsFrom(raw.context).length > 0\n ? contextsFrom(raw.context)\n : contextsFrom(raw.contexts).length > 0\n ? contextsFrom(raw.contexts)\n : contextsFrom(raw.chunks).length > 0\n ? contextsFrom(raw.chunks)\n : contextsFrom(raw.passages)\n const table = stringFrom(raw.table) ?? stringFrom(raw.table_text)\n const contexts = table\n ? [...baseContexts, { id: 'table', title: 'Table', text: table }]\n : baseContexts\n const subset = stringFrom(raw.subset) ?? stringFrom(raw.dataset) ?? 'unknown'\n const documentId =\n stringFrom(raw.context_id) ??\n stringFrom(raw.document_id) ??\n stringFrom(raw.doc_id) ??\n stringFrom(raw.file_name) ??\n 'unknown'\n const id = stringFrom(raw.id) ?? stringFrom(raw.qid) ?? stringFrom(raw.query_id) ?? `t2-ragbench-${index}`\n const meta: T2RagBenchMeta = {\n benchmark: 't2-ragbench',\n query,\n goldAnswers,\n contexts,\n subset,\n documentId,\n }\n return {\n id,\n split: stringFrom(raw.split) ?? subset,\n prompt: [\n 'Answer this T2-RAGBench text-and-table financial question.',\n 'Do the required numerical reasoning from the supplied context before giving the final value.',\n 'End with a single final line: `FINAL ANSWER: <answer>`.',\n '',\n `Question: ${query}`,\n `Document: ${documentId}`,\n `Subset: ${subset}`,\n contexts.length > 0 ? `\\nContext:\\n${contextBlock(contexts)}` : undefined,\n ]\n .filter(Boolean)\n .join('\\n'),\n metadata: meta as unknown as Record<string, unknown>,\n }\n}\n\nfunction readMeta(task: BenchTask): T2RagBenchMeta {\n const md = task.metadata\n if (!md || !Array.isArray(md.goldAnswers)) {\n throw new Error(`T2-RAGBench task ${task.id} missing metadata — loadTasks did not populate it`)\n }\n return md as unknown as T2RagBenchMeta\n}\n\nasync function loadRows(path: string): Promise<unknown[]> {\n const rows = await readJsonRows(path)\n if (rows.length === 0) throw new Error(`T2-RAGBench: no rows in ${path}`)\n return rows\n}\n\nasync function loadFixtures(opts: LoadOptions): Promise<BenchTask[]> {\n const rows = JSON.parse(await readFile(FIXTURES, 'utf8')) as unknown[]\n console.warn(`[t2-ragbench] T2_RAGBENCH_FIXTURES=1 — loading ${rows.length} adapter fixtures`)\n return selectTasks(rows.map(rowToTask), opts, 'T2-RAGBench')\n}\n\nexport function createT2RagBenchAdapter(): BenchmarkAdapter {\n const fixturesMode = process.env.T2_RAGBENCH_FIXTURES === '1'\n\n return {\n name: 't2-ragbench',\n output: ragAnswerOutput,\n\n async preflight() {\n if (fixturesMode) {\n await readFile(FIXTURES, 'utf8')\n return\n }\n const path = dataFile()\n if (!path) {\n throw new Error(\n 'T2_RAGBENCH_DATA_FILE is required. Fix: export T2-RAGBench rows to JSONL and set T2_RAGBENCH_DATA_FILE=/path/to/t2-ragbench.jsonl, or set T2_RAGBENCH_FIXTURES=1 for adapter plumbing.',\n )\n }\n await loadRows(path)\n },\n\n async loadTasks(opts: LoadOptions = {}) {\n if (fixturesMode) return loadFixtures(opts)\n const path = dataFile()\n if (!path) throw new Error('T2_RAGBENCH_DATA_FILE is required to load T2-RAGBench tasks')\n return selectTasks((await loadRows(path)).map(rowToTask), opts, 'T2-RAGBench')\n },\n\n async goldArtifact(task: BenchTask) {\n return `${FINAL_ANSWER_SENTINEL} ${readMeta(task).goldAnswers[0] ?? ''}`\n },\n\n async judge(task: BenchTask, artifact: string): Promise<BenchScore> {\n const meta = readMeta(task)\n const score = scoreAnswerArtifact(artifact, meta.goldAnswers, { numericTolerance: 0.01 })\n return answerScoreToBenchScore(score, {\n benchmark: meta.benchmark,\n subset: meta.subset,\n documentId: meta.documentId,\n contextCount: meta.contexts.length,\n })\n },\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,120 +0,0 @@
1
- import {
2
- FINAL_ANSWER_SENTINEL,
3
- allStrings,
4
- answerScoreToBenchScore,
5
- contextBlock,
6
- contextsFrom,
7
- firstString,
8
- isObject,
9
- ragAnswerOutput,
10
- readJsonRows,
11
- scoreAnswerArtifact,
12
- selectTasks,
13
- stringFrom
14
- } from "./chunk-X3BTXCJ4.js";
15
- import {
16
- benchRoot
17
- } from "./chunk-WSKWVEQB.js";
18
-
19
- // src/benchmarks/open-rag-bench.ts
20
- import { readFile } from "fs/promises";
21
- import { join } from "path";
22
- var FIXTURES = join(benchRoot, "fixtures", "open-rag-bench.json");
23
- var dataFile = () => process.env.OPEN_RAG_BENCH_DATA_FILE;
24
- function rowToTask(raw, index) {
25
- if (!isObject(raw)) throw new Error(`Open RAG Bench row ${index} must be an object`);
26
- const query = firstString(raw, ["question", "query", "prompt"]);
27
- const goldAnswers = allStrings(raw, ["answer", "answers", "reference", "reference_answer", "gold"]);
28
- if (!query) throw new Error(`Open RAG Bench row ${index} missing question/query`);
29
- if (goldAnswers.length === 0) throw new Error(`Open RAG Bench row ${index} missing answer`);
30
- const contexts = contextsFrom(raw.contexts).length > 0 ? contextsFrom(raw.contexts) : contextsFrom(raw.chunks).length > 0 ? contextsFrom(raw.chunks) : contextsFrom(raw.pages);
31
- const documentId = stringFrom(raw.document_id) ?? stringFrom(raw.doc_id) ?? stringFrom(raw.pdf_id) ?? stringFrom(raw.file_name) ?? stringFrom(raw.filename) ?? "unknown";
32
- const modality = stringFrom(raw.modality) ?? stringFrom(raw.answer_modality) ?? "unknown";
33
- const id = stringFrom(raw.id) ?? stringFrom(raw.query_id) ?? `open-rag-bench-${index}`;
34
- const meta = {
35
- benchmark: "open-rag-bench",
36
- query,
37
- goldAnswers,
38
- contexts,
39
- documentId,
40
- modality
41
- };
42
- return {
43
- id,
44
- split: stringFrom(raw.split) ?? modality,
45
- prompt: [
46
- "Answer this Open RAG Bench PDF question using the supplied document context.",
47
- "Use tables, text, and image-derived notes when present.",
48
- "End with a single final line: `FINAL ANSWER: <answer>`.",
49
- "",
50
- `Question: ${query}`,
51
- `Document: ${documentId}`,
52
- `Modality: ${modality}`,
53
- contexts.length > 0 ? `
54
- Document context:
55
- ${contextBlock(contexts)}` : void 0
56
- ].filter(Boolean).join("\n"),
57
- metadata: meta
58
- };
59
- }
60
- function readMeta(task) {
61
- const md = task.metadata;
62
- if (!md || !Array.isArray(md.goldAnswers)) {
63
- throw new Error(`Open RAG Bench task ${task.id} missing metadata \u2014 loadTasks did not populate it`);
64
- }
65
- return md;
66
- }
67
- async function loadRows(path) {
68
- const rows = await readJsonRows(path);
69
- if (rows.length === 0) throw new Error(`Open RAG Bench: no rows in ${path}`);
70
- return rows;
71
- }
72
- async function loadFixtures(opts) {
73
- const rows = JSON.parse(await readFile(FIXTURES, "utf8"));
74
- console.warn(`[open-rag-bench] OPEN_RAG_BENCH_FIXTURES=1 \u2014 loading ${rows.length} adapter fixtures`);
75
- return selectTasks(rows.map(rowToTask), opts, "Open RAG Bench");
76
- }
77
- function createOpenRagBenchAdapter() {
78
- const fixturesMode = process.env.OPEN_RAG_BENCH_FIXTURES === "1";
79
- return {
80
- name: "open-rag-bench",
81
- output: ragAnswerOutput,
82
- async preflight() {
83
- if (fixturesMode) {
84
- await readFile(FIXTURES, "utf8");
85
- return;
86
- }
87
- const path = dataFile();
88
- if (!path) {
89
- throw new Error(
90
- "OPEN_RAG_BENCH_DATA_FILE is required. Fix: export vectara/open-rag-bench rows to JSONL and set OPEN_RAG_BENCH_DATA_FILE=/path/to/open-rag-bench.jsonl, or set OPEN_RAG_BENCH_FIXTURES=1 for adapter plumbing."
91
- );
92
- }
93
- await loadRows(path);
94
- },
95
- async loadTasks(opts = {}) {
96
- if (fixturesMode) return loadFixtures(opts);
97
- const path = dataFile();
98
- if (!path) throw new Error("OPEN_RAG_BENCH_DATA_FILE is required to load Open RAG Bench tasks");
99
- return selectTasks((await loadRows(path)).map(rowToTask), opts, "Open RAG Bench");
100
- },
101
- async goldArtifact(task) {
102
- return `${FINAL_ANSWER_SENTINEL} ${readMeta(task).goldAnswers[0] ?? ""}`;
103
- },
104
- async judge(task, artifact) {
105
- const meta = readMeta(task);
106
- const score = scoreAnswerArtifact(artifact, meta.goldAnswers);
107
- return answerScoreToBenchScore(score, {
108
- benchmark: meta.benchmark,
109
- documentId: meta.documentId,
110
- modality: meta.modality,
111
- contextCount: meta.contexts.length
112
- });
113
- }
114
- };
115
- }
116
-
117
- export {
118
- createOpenRagBenchAdapter
119
- };
120
- //# sourceMappingURL=chunk-SHYIRB7I.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/benchmarks/open-rag-bench.ts"],"sourcesContent":["/**\n * Open RAG Bench adapter.\n *\n * This targets Vectara-style Open RAG Bench exports over PDF-derived text,\n * table, and image contexts. The deterministic judge scores final-answer\n * agreement and surfaces modality/document metadata for diagnostics.\n */\n\nimport { readFile } from 'node:fs/promises'\nimport { join } from 'node:path'\nimport { benchRoot } from './_harness'\nimport type { BenchmarkAdapter, BenchScore, BenchTask, LoadOptions } from './types'\nimport {\n FINAL_ANSWER_SENTINEL,\n allStrings,\n answerScoreToBenchScore,\n contextBlock,\n contextsFrom,\n firstString,\n isObject,\n ragAnswerOutput,\n readJsonRows,\n scoreAnswerArtifact,\n selectTasks,\n stringFrom,\n type RagContext,\n} from './rag-shared'\n\nconst FIXTURES = join(benchRoot, 'fixtures', 'open-rag-bench.json')\n\ninterface OpenRagBenchMeta {\n benchmark: 'open-rag-bench'\n query: string\n goldAnswers: string[]\n contexts: RagContext[]\n documentId: string\n modality: string\n}\n\nconst dataFile = (): string | undefined => process.env.OPEN_RAG_BENCH_DATA_FILE\n\nfunction rowToTask(raw: unknown, index: number): BenchTask {\n if (!isObject(raw)) throw new Error(`Open RAG Bench row ${index} must be an object`)\n const query = firstString(raw, ['question', 'query', 'prompt'])\n const goldAnswers = allStrings(raw, ['answer', 'answers', 'reference', 'reference_answer', 'gold'])\n if (!query) throw new Error(`Open RAG Bench row ${index} missing question/query`)\n if (goldAnswers.length === 0) throw new Error(`Open RAG Bench row ${index} missing answer`)\n const contexts =\n contextsFrom(raw.contexts).length > 0\n ? contextsFrom(raw.contexts)\n : contextsFrom(raw.chunks).length > 0\n ? contextsFrom(raw.chunks)\n : contextsFrom(raw.pages)\n const documentId =\n stringFrom(raw.document_id) ??\n stringFrom(raw.doc_id) ??\n stringFrom(raw.pdf_id) ??\n stringFrom(raw.file_name) ??\n stringFrom(raw.filename) ??\n 'unknown'\n const modality = stringFrom(raw.modality) ?? stringFrom(raw.answer_modality) ?? 'unknown'\n const id = stringFrom(raw.id) ?? stringFrom(raw.query_id) ?? `open-rag-bench-${index}`\n const meta: OpenRagBenchMeta = {\n benchmark: 'open-rag-bench',\n query,\n goldAnswers,\n contexts,\n documentId,\n modality,\n }\n return {\n id,\n split: stringFrom(raw.split) ?? modality,\n prompt: [\n 'Answer this Open RAG Bench PDF question using the supplied document context.',\n 'Use tables, text, and image-derived notes when present.',\n 'End with a single final line: `FINAL ANSWER: <answer>`.',\n '',\n `Question: ${query}`,\n `Document: ${documentId}`,\n `Modality: ${modality}`,\n contexts.length > 0 ? `\\nDocument context:\\n${contextBlock(contexts)}` : undefined,\n ]\n .filter(Boolean)\n .join('\\n'),\n metadata: meta as unknown as Record<string, unknown>,\n }\n}\n\nfunction readMeta(task: BenchTask): OpenRagBenchMeta {\n const md = task.metadata\n if (!md || !Array.isArray(md.goldAnswers)) {\n throw new Error(`Open RAG Bench task ${task.id} missing metadata — loadTasks did not populate it`)\n }\n return md as unknown as OpenRagBenchMeta\n}\n\nasync function loadRows(path: string): Promise<unknown[]> {\n const rows = await readJsonRows(path)\n if (rows.length === 0) throw new Error(`Open RAG Bench: no rows in ${path}`)\n return rows\n}\n\nasync function loadFixtures(opts: LoadOptions): Promise<BenchTask[]> {\n const rows = JSON.parse(await readFile(FIXTURES, 'utf8')) as unknown[]\n console.warn(`[open-rag-bench] OPEN_RAG_BENCH_FIXTURES=1 — loading ${rows.length} adapter fixtures`)\n return selectTasks(rows.map(rowToTask), opts, 'Open RAG Bench')\n}\n\nexport function createOpenRagBenchAdapter(): BenchmarkAdapter {\n const fixturesMode = process.env.OPEN_RAG_BENCH_FIXTURES === '1'\n\n return {\n name: 'open-rag-bench',\n output: ragAnswerOutput,\n\n async preflight() {\n if (fixturesMode) {\n await readFile(FIXTURES, 'utf8')\n return\n }\n const path = dataFile()\n if (!path) {\n throw new Error(\n 'OPEN_RAG_BENCH_DATA_FILE is required. Fix: export vectara/open-rag-bench rows to JSONL and set OPEN_RAG_BENCH_DATA_FILE=/path/to/open-rag-bench.jsonl, or set OPEN_RAG_BENCH_FIXTURES=1 for adapter plumbing.',\n )\n }\n await loadRows(path)\n },\n\n async loadTasks(opts: LoadOptions = {}) {\n if (fixturesMode) return loadFixtures(opts)\n const path = dataFile()\n if (!path) throw new Error('OPEN_RAG_BENCH_DATA_FILE is required to load Open RAG Bench tasks')\n return selectTasks((await loadRows(path)).map(rowToTask), opts, 'Open RAG Bench')\n },\n\n async goldArtifact(task: BenchTask) {\n return `${FINAL_ANSWER_SENTINEL} ${readMeta(task).goldAnswers[0] ?? ''}`\n },\n\n async judge(task: BenchTask, artifact: string): Promise<BenchScore> {\n const meta = readMeta(task)\n const score = scoreAnswerArtifact(artifact, meta.goldAnswers)\n return answerScoreToBenchScore(score, {\n benchmark: meta.benchmark,\n documentId: meta.documentId,\n modality: meta.modality,\n contextCount: meta.contexts.length,\n })\n },\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,116 +0,0 @@
1
- import {
2
- FINAL_ANSWER_SENTINEL,
3
- allStrings,
4
- answerScoreToBenchScore,
5
- firstString,
6
- isObject,
7
- ragAnswerOutput,
8
- readJsonRows,
9
- scoreAnswerArtifact,
10
- selectTasks,
11
- stringFrom
12
- } from "./chunk-X3BTXCJ4.js";
13
- import {
14
- benchRoot
15
- } from "./chunk-WSKWVEQB.js";
16
-
17
- // src/benchmarks/crag.ts
18
- import { readFile } from "fs/promises";
19
- import { join } from "path";
20
- var FIXTURES = join(benchRoot, "fixtures", "crag.json");
21
- var dataFile = () => process.env.CRAG_DATA_FILE;
22
- function rowToTask(raw, index) {
23
- if (!isObject(raw)) throw new Error(`CRAG row ${index} must be an object`);
24
- const query = firstString(raw, ["query", "question", "prompt"]);
25
- const goldAnswers = allStrings(raw, ["answer", "answers", "gold", "gold_answer", "expected_answer"]);
26
- if (!query) throw new Error(`CRAG row ${index} missing query`);
27
- if (goldAnswers.length === 0) throw new Error(`CRAG row ${index} missing gold answer`);
28
- const domain = stringFrom(raw.domain) ?? "unknown";
29
- const questionType = stringFrom(raw.question_type) ?? stringFrom(raw.questionType) ?? "unknown";
30
- const dynamism = stringFrom(raw.static_or_dynamic) ?? stringFrom(raw.dynamism) ?? "unknown";
31
- const id = stringFrom(raw.id) ?? stringFrom(raw.query_id) ?? `crag-${index}`;
32
- const meta = {
33
- benchmark: "crag",
34
- query,
35
- goldAnswers,
36
- domain,
37
- questionType,
38
- dynamism
39
- };
40
- return {
41
- id,
42
- split: stringFrom(raw.split) ?? domain,
43
- prompt: [
44
- "Answer this CRAG factual question.",
45
- "Return a concise answer and do not guess when the evidence is insufficient.",
46
- "End with a single final line: `FINAL ANSWER: <answer>`.",
47
- "",
48
- `Question: ${query}`,
49
- `Domain: ${domain}`,
50
- `Question type: ${questionType}`,
51
- `Dynamism: ${dynamism}`
52
- ].join("\n"),
53
- metadata: meta
54
- };
55
- }
56
- function readMeta(task) {
57
- const md = task.metadata;
58
- if (!md || !Array.isArray(md.goldAnswers)) {
59
- throw new Error(`CRAG task ${task.id} missing metadata \u2014 loadTasks did not populate it`);
60
- }
61
- return md;
62
- }
63
- async function loadRows(path) {
64
- const rows = await readJsonRows(path);
65
- if (rows.length === 0) throw new Error(`CRAG: no rows in ${path}`);
66
- return rows;
67
- }
68
- async function loadFixtures(opts) {
69
- const rows = JSON.parse(await readFile(FIXTURES, "utf8"));
70
- console.warn(`[crag] CRAG_FIXTURES=1 \u2014 loading ${rows.length} adapter fixtures`);
71
- return selectTasks(rows.map(rowToTask), opts, "CRAG");
72
- }
73
- function createCragAdapter() {
74
- const fixturesMode = process.env.CRAG_FIXTURES === "1";
75
- return {
76
- name: "crag",
77
- output: ragAnswerOutput,
78
- async preflight() {
79
- if (fixturesMode) {
80
- await readFile(FIXTURES, "utf8");
81
- return;
82
- }
83
- const path = dataFile();
84
- if (!path) {
85
- throw new Error(
86
- "CRAG_DATA_FILE is required. Fix: export facebookresearch/CRAG rows to JSONL and set CRAG_DATA_FILE=/path/to/crag.jsonl, or set CRAG_FIXTURES=1 for adapter plumbing."
87
- );
88
- }
89
- await loadRows(path);
90
- },
91
- async loadTasks(opts = {}) {
92
- if (fixturesMode) return loadFixtures(opts);
93
- const path = dataFile();
94
- if (!path) throw new Error("CRAG_DATA_FILE is required to load CRAG tasks");
95
- return selectTasks((await loadRows(path)).map(rowToTask), opts, "CRAG");
96
- },
97
- async goldArtifact(task) {
98
- return `${FINAL_ANSWER_SENTINEL} ${readMeta(task).goldAnswers[0] ?? ""}`;
99
- },
100
- async judge(task, artifact) {
101
- const meta = readMeta(task);
102
- const score = scoreAnswerArtifact(artifact, meta.goldAnswers);
103
- return answerScoreToBenchScore(score, {
104
- benchmark: meta.benchmark,
105
- domain: meta.domain,
106
- questionType: meta.questionType,
107
- dynamism: meta.dynamism
108
- });
109
- }
110
- };
111
- }
112
-
113
- export {
114
- createCragAdapter
115
- };
116
- //# sourceMappingURL=chunk-SVR2LKYI.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/benchmarks/crag.ts"],"sourcesContent":["/**\n * CRAG adapter (Comprehensive RAG Benchmark).\n *\n * Live mode expects an official or compatible CRAG JSON/JSONL export. The\n * adapter preserves CRAG domain/type/dynamism tags in metadata and scores final\n * answers deterministically against the provided gold answer list.\n */\n\nimport { readFile } from 'node:fs/promises'\nimport { join } from 'node:path'\nimport { benchRoot } from './_harness'\nimport type { BenchmarkAdapter, BenchScore, BenchTask, LoadOptions } from './types'\nimport {\n FINAL_ANSWER_SENTINEL,\n allStrings,\n answerScoreToBenchScore,\n firstString,\n isObject,\n ragAnswerOutput,\n readJsonRows,\n scoreAnswerArtifact,\n selectTasks,\n stringFrom,\n} from './rag-shared'\n\nconst FIXTURES = join(benchRoot, 'fixtures', 'crag.json')\n\ninterface CragMeta {\n benchmark: 'crag'\n query: string\n goldAnswers: string[]\n domain: string\n questionType: string\n dynamism: string\n}\n\nconst dataFile = (): string | undefined => process.env.CRAG_DATA_FILE\n\nfunction rowToTask(raw: unknown, index: number): BenchTask {\n if (!isObject(raw)) throw new Error(`CRAG row ${index} must be an object`)\n const query = firstString(raw, ['query', 'question', 'prompt'])\n const goldAnswers = allStrings(raw, ['answer', 'answers', 'gold', 'gold_answer', 'expected_answer'])\n if (!query) throw new Error(`CRAG row ${index} missing query`)\n if (goldAnswers.length === 0) throw new Error(`CRAG row ${index} missing gold answer`)\n const domain = stringFrom(raw.domain) ?? 'unknown'\n const questionType = stringFrom(raw.question_type) ?? stringFrom(raw.questionType) ?? 'unknown'\n const dynamism = stringFrom(raw.static_or_dynamic) ?? stringFrom(raw.dynamism) ?? 'unknown'\n const id = stringFrom(raw.id) ?? stringFrom(raw.query_id) ?? `crag-${index}`\n const meta: CragMeta = {\n benchmark: 'crag',\n query,\n goldAnswers,\n domain,\n questionType,\n dynamism,\n }\n return {\n id,\n split: stringFrom(raw.split) ?? domain,\n prompt: [\n 'Answer this CRAG factual question.',\n 'Return a concise answer and do not guess when the evidence is insufficient.',\n 'End with a single final line: `FINAL ANSWER: <answer>`.',\n '',\n `Question: ${query}`,\n `Domain: ${domain}`,\n `Question type: ${questionType}`,\n `Dynamism: ${dynamism}`,\n ].join('\\n'),\n metadata: meta as unknown as Record<string, unknown>,\n }\n}\n\nfunction readMeta(task: BenchTask): CragMeta {\n const md = task.metadata\n if (!md || !Array.isArray(md.goldAnswers)) {\n throw new Error(`CRAG task ${task.id} missing metadata — loadTasks did not populate it`)\n }\n return md as unknown as CragMeta\n}\n\nasync function loadRows(path: string): Promise<unknown[]> {\n const rows = await readJsonRows(path)\n if (rows.length === 0) throw new Error(`CRAG: no rows in ${path}`)\n return rows\n}\n\nasync function loadFixtures(opts: LoadOptions): Promise<BenchTask[]> {\n const rows = JSON.parse(await readFile(FIXTURES, 'utf8')) as unknown[]\n console.warn(`[crag] CRAG_FIXTURES=1 — loading ${rows.length} adapter fixtures`)\n return selectTasks(rows.map(rowToTask), opts, 'CRAG')\n}\n\nexport function createCragAdapter(): BenchmarkAdapter {\n const fixturesMode = process.env.CRAG_FIXTURES === '1'\n\n return {\n name: 'crag',\n output: ragAnswerOutput,\n\n async preflight() {\n if (fixturesMode) {\n await readFile(FIXTURES, 'utf8')\n return\n }\n const path = dataFile()\n if (!path) {\n throw new Error(\n 'CRAG_DATA_FILE is required. Fix: export facebookresearch/CRAG rows to JSONL and set CRAG_DATA_FILE=/path/to/crag.jsonl, or set CRAG_FIXTURES=1 for adapter plumbing.',\n )\n }\n await loadRows(path)\n },\n\n async loadTasks(opts: LoadOptions = {}) {\n if (fixturesMode) return loadFixtures(opts)\n const path = dataFile()\n if (!path) throw new Error('CRAG_DATA_FILE is required to load CRAG tasks')\n return selectTasks((await loadRows(path)).map(rowToTask), opts, 'CRAG')\n },\n\n async goldArtifact(task: BenchTask) {\n return `${FINAL_ANSWER_SENTINEL} ${readMeta(task).goldAnswers[0] ?? ''}`\n },\n\n async judge(task: BenchTask, artifact: string): Promise<BenchScore> {\n const meta = readMeta(task)\n const score = scoreAnswerArtifact(artifact, meta.goldAnswers)\n return answerScoreToBenchScore(score, {\n benchmark: meta.benchmark,\n domain: meta.domain,\n questionType: meta.questionType,\n dynamism: meta.dynamism,\n })\n },\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAQA,SAAS,gBAAgB;AACzB,SAAS,YAAY;AAgBrB,IAAM,WAAW,KAAK,WAAW,YAAY,WAAW;AAWxD,IAAM,WAAW,MAA0B,QAAQ,IAAI;AAEvD,SAAS,UAAU,KAAc,OAA0B;AACzD,MAAI,CAAC,SAAS,GAAG,EAAG,OAAM,IAAI,MAAM,YAAY,KAAK,oBAAoB;AACzE,QAAM,QAAQ,YAAY,KAAK,CAAC,SAAS,YAAY,QAAQ,CAAC;AAC9D,QAAM,cAAc,WAAW,KAAK,CAAC,UAAU,WAAW,QAAQ,eAAe,iBAAiB,CAAC;AACnG,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,YAAY,KAAK,gBAAgB;AAC7D,MAAI,YAAY,WAAW,EAAG,OAAM,IAAI,MAAM,YAAY,KAAK,sBAAsB;AACrF,QAAM,SAAS,WAAW,IAAI,MAAM,KAAK;AACzC,QAAM,eAAe,WAAW,IAAI,aAAa,KAAK,WAAW,IAAI,YAAY,KAAK;AACtF,QAAM,WAAW,WAAW,IAAI,iBAAiB,KAAK,WAAW,IAAI,QAAQ,KAAK;AAClF,QAAM,KAAK,WAAW,IAAI,EAAE,KAAK,WAAW,IAAI,QAAQ,KAAK,QAAQ,KAAK;AAC1E,QAAM,OAAiB;AAAA,IACrB,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,SAAO;AAAA,IACL;AAAA,IACA,OAAO,WAAW,IAAI,KAAK,KAAK;AAAA,IAChC,QAAQ;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa,KAAK;AAAA,MAClB,WAAW,MAAM;AAAA,MACjB,kBAAkB,YAAY;AAAA,MAC9B,aAAa,QAAQ;AAAA,IACvB,EAAE,KAAK,IAAI;AAAA,IACX,UAAU;AAAA,EACZ;AACF;AAEA,SAAS,SAAS,MAA2B;AAC3C,QAAM,KAAK,KAAK;AAChB,MAAI,CAAC,MAAM,CAAC,MAAM,QAAQ,GAAG,WAAW,GAAG;AACzC,UAAM,IAAI,MAAM,aAAa,KAAK,EAAE,wDAAmD;AAAA,EACzF;AACA,SAAO;AACT;AAEA,eAAe,SAAS,MAAkC;AACxD,QAAM,OAAO,MAAM,aAAa,IAAI;AACpC,MAAI,KAAK,WAAW,EAAG,OAAM,IAAI,MAAM,oBAAoB,IAAI,EAAE;AACjE,SAAO;AACT;AAEA,eAAe,aAAa,MAAyC;AACnE,QAAM,OAAO,KAAK,MAAM,MAAM,SAAS,UAAU,MAAM,CAAC;AACxD,UAAQ,KAAK,yCAAoC,KAAK,MAAM,mBAAmB;AAC/E,SAAO,YAAY,KAAK,IAAI,SAAS,GAAG,MAAM,MAAM;AACtD;AAEO,SAAS,oBAAsC;AACpD,QAAM,eAAe,QAAQ,IAAI,kBAAkB;AAEnD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IAER,MAAM,YAAY;AAChB,UAAI,cAAc;AAChB,cAAM,SAAS,UAAU,MAAM;AAC/B;AAAA,MACF;AACA,YAAM,OAAO,SAAS;AACtB,UAAI,CAAC,MAAM;AACT,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AACA,YAAM,SAAS,IAAI;AAAA,IACrB;AAAA,IAEA,MAAM,UAAU,OAAoB,CAAC,GAAG;AACtC,UAAI,aAAc,QAAO,aAAa,IAAI;AAC1C,YAAM,OAAO,SAAS;AACtB,UAAI,CAAC,KAAM,OAAM,IAAI,MAAM,+CAA+C;AAC1E,aAAO,aAAa,MAAM,SAAS,IAAI,GAAG,IAAI,SAAS,GAAG,MAAM,MAAM;AAAA,IACxE;AAAA,IAEA,MAAM,aAAa,MAAiB;AAClC,aAAO,GAAG,qBAAqB,IAAI,SAAS,IAAI,EAAE,YAAY,CAAC,KAAK,EAAE;AAAA,IACxE;AAAA,IAEA,MAAM,MAAM,MAAiB,UAAuC;AAClE,YAAM,OAAO,SAAS,IAAI;AAC1B,YAAM,QAAQ,oBAAoB,UAAU,KAAK,WAAW;AAC5D,aAAO,wBAAwB,OAAO;AAAA,QACpC,WAAW,KAAK;AAAA,QAChB,QAAQ,KAAK;AAAA,QACb,cAAc,KAAK;AAAA,QACnB,UAAU,KAAK;AAAA,MACjB,CAAC;AAAA,IACH;AAAA,EACF;AACF;","names":[]}
@@ -1,228 +0,0 @@
1
- // src/benchmarks/mind2web.ts
2
- import { execFile } from "child_process";
3
- import { mkdir } from "fs/promises";
4
- import { tmpdir } from "os";
5
- import { join } from "path";
6
- import { fileURLToPath } from "url";
7
- import { promisify } from "util";
8
- var execFileAsync = promisify(execFile);
9
- var BENCH_ROOT = fileURLToPath(new URL("../..", import.meta.url));
10
- var PY = process.env.M2W_PYTHON ?? join(BENCH_ROOT, ".venv", "bin", "python");
11
- var DATASET = "osunlp/Multimodal-Mind2Web";
12
- var DEFAULT_SPLIT = process.env.M2W_SPLIT ?? "test_domain";
13
- var SHOTS_DIR = process.env.M2W_SHOTS ?? join(tmpdir(), "m2w-shots");
14
- var CANDIDATE_CAP = Number(process.env.M2W_CANDIDATE_CAP ?? 30);
15
- var WORKER_CONTRACT = [
16
- "",
17
- "Pick the SINGLE next element to act on, then end your response with EXACTLY these three lines:",
18
- "ELEMENT: <the [id] number of the chosen element>",
19
- "ACTION: <CLICK | TYPE | SELECT>",
20
- "VALUE: <text to type or option to select; leave empty for CLICK>"
21
- ].join("\n");
22
- async function py(script, args = []) {
23
- const { stdout } = await execFileAsync(PY, ["-c", script, ...args], { maxBuffer: 1024 * 1024 * 256 });
24
- return stdout;
25
- }
26
- var LOADER = `
27
- import json, sys, os
28
- from datasets import load_dataset
29
- cfg = json.loads(sys.argv[1])
30
- split = cfg["split"]; limit = cfg.get("limit"); cap = cfg.get("cap", 30)
31
- shots = cfg["shotsDir"]; ids = set(cfg["ids"]) if cfg.get("ids") else None
32
- os.makedirs(shots, exist_ok=True)
33
- KEEP = ("aria_label","aria-label","role","type","name","placeholder","title","alt","value","text","id","class","href")
34
- def label(tag, attr):
35
- try:
36
- a = json.loads(attr) if isinstance(attr, str) else (attr or {})
37
- except Exception:
38
- a = {}
39
- parts = []
40
- for k in KEEP:
41
- v = a.get(k)
42
- if v:
43
- sv = str(v).replace("\\n", " ").strip()
44
- if k == "class": sv = sv[:40]
45
- if k == "href": sv = sv[:50]
46
- if sv: parts.append(k + "=" + sv[:60])
47
- return "<" + str(tag) + "> " + " ".join(parts[:6])
48
- def cands(raw):
49
- out = []
50
- for c in raw or []:
51
- try:
52
- d = json.loads(c) if isinstance(c, str) else c
53
- except Exception:
54
- continue
55
- bid = str(d.get("backend_node_id", ""))
56
- if not bid: continue
57
- out.append({"id": bid, "label": label(d.get("tag", "?"), d.get("attributes"))})
58
- return out
59
- ds = load_dataset(${JSON.stringify(DATASET)}, split=split, streaming=True)
60
- emitted = []; skipped = 0; scanned = 0
61
- for r in ds:
62
- scanned += 1
63
- if ids is not None and r["action_uid"] not in ids:
64
- if scanned > 8000: break
65
- continue
66
- pos = cands(r.get("pos_candidates"))
67
- if not pos:
68
- skipped += 1
69
- continue
70
- neg = cands(r.get("neg_candidates"))
71
- seen = set(p["id"] for p in pos); merged = list(pos)
72
- for n in neg:
73
- if len(merged) >= cap: break
74
- if n["id"] in seen: continue
75
- seen.add(n["id"]); merged.append(n)
76
- merged.sort(key=lambda x: int(x["id"]) if x["id"].isdigit() else 0)
77
- try:
78
- op = json.loads(r["operation"]) if isinstance(r["operation"], str) else r["operation"]
79
- except Exception:
80
- op = {}
81
- sp = os.path.join(shots, str(r["action_uid"]) + ".jpg")
82
- try:
83
- r["screenshot"].convert("RGB").save(sp, "JPEG", quality=70)
84
- except Exception:
85
- sp = ""
86
- emitted.append({
87
- "id": r["action_uid"], "task": r.get("confirmed_task", ""),
88
- "website": r.get("website", ""), "domain": r.get("domain", ""), "subdomain": r.get("subdomain", ""),
89
- "op": str(op.get("op", "")).upper(), "value": str(op.get("value", "")),
90
- "goldIds": [p["id"] for p in pos], "candidates": merged,
91
- "screenshotPath": sp, "targetRepr": r.get("target_action_reprs", ""),
92
- })
93
- if ids is None and limit is not None and len(emitted) >= limit: break
94
- if ids is not None and len(emitted) >= len(ids): break
95
- sys.stderr.write("[mind2web] emitted=%d skipped_empty_pos=%d scanned=%d\\n" % (len(emitted), skipped, scanned)); sys.stderr.flush()
96
- print(json.dumps(emitted)); sys.stdout.flush()
97
- os._exit(0)
98
- `;
99
- function buildPrompt(row) {
100
- const choices = row.candidates.map((c) => ` [${c.id}] ${c.label}`).join("\n");
101
- return [
102
- `Web task: ${row.task}`,
103
- "",
104
- "You are taking the NEXT single action on the current web page. Choose the one element",
105
- 'to act on from the candidates below (each line is "[id] <tag> attributes"):',
106
- choices,
107
- WORKER_CONTRACT
108
- ].join("\n");
109
- }
110
- function rowToTask(row) {
111
- const meta = {
112
- task: row.task,
113
- website: row.website,
114
- domain: row.domain,
115
- op: row.op,
116
- value: row.value,
117
- goldIds: row.goldIds,
118
- candidateIds: row.candidates.map((c) => c.id),
119
- screenshotPath: row.screenshotPath,
120
- targetRepr: row.targetRepr
121
- };
122
- return {
123
- id: `mind2web-${row.id}`,
124
- split: DEFAULT_SPLIT,
125
- prompt: buildPrompt(row),
126
- metadata: meta
127
- };
128
- }
129
- function readMeta(task) {
130
- const md = task.metadata;
131
- if (!md || !Array.isArray(md.goldIds)) {
132
- throw new Error(`mind2web task ${task.id} missing metadata.goldIds \u2014 loadTasks did not populate it`);
133
- }
134
- return md;
135
- }
136
- function normValue(s) {
137
- return s.toLowerCase().replace(/\s+/g, " ").trim();
138
- }
139
- function parseAction(artifact) {
140
- const elem = /ELEMENT:\s*\[?(\d+)\]?/i.exec(artifact);
141
- const op = /ACTION:\s*(CLICK|TYPE|SELECT)/i.exec(artifact);
142
- if (!elem?.[1] || !op?.[1]) return null;
143
- const val = /VALUE:\s*(.*)/i.exec(artifact);
144
- return { elementId: elem[1], op: op[1].toUpperCase(), value: (val?.[1] ?? "").trim() };
145
- }
146
- function createMind2WebAdapter() {
147
- const split = DEFAULT_SPLIT;
148
- return {
149
- name: "mind2web",
150
- async preflight() {
151
- try {
152
- await py(
153
- `import os, sys
154
- from datasets import load_dataset
155
- import PIL
156
- ds = load_dataset(${JSON.stringify(DATASET)}, split=${JSON.stringify(split)}, streaming=True)
157
- next(iter(ds))
158
- print('ok'); sys.stdout.flush(); os._exit(0)`
159
- );
160
- } catch (err) {
161
- const msg = err instanceof Error ? err.message : String(err);
162
- throw new Error(
163
- `mind2web preflight failed: ${msg}
164
- Fix: (1) a python with datasets + pillow (python3 -m venv bench/.venv && bench/.venv/bin/pip install datasets pillow) ; (2) network access to Hugging Face for ${DATASET} (split ${split}) ; point M2W_PYTHON at the python if not bench/.venv.`
165
- );
166
- }
167
- },
168
- async loadTasks(opts = {}) {
169
- const cfg = {
170
- split: opts.split ?? split,
171
- limit: opts.ids ? void 0 : opts.limit ?? 10,
172
- cap: CANDIDATE_CAP,
173
- shotsDir: SHOTS_DIR,
174
- ids: opts.ids ? opts.ids.map((id) => id.replace(/^mind2web-/, "")) : void 0
175
- };
176
- await mkdir(SHOTS_DIR, { recursive: true });
177
- const stdout = await py(LOADER, [JSON.stringify(cfg)]);
178
- const rows = JSON.parse(stdout);
179
- return rows.map(rowToTask);
180
- },
181
- async goldArtifact(task) {
182
- const meta = readMeta(task);
183
- const id = meta.goldIds[0];
184
- if (!id) return void 0;
185
- return `ELEMENT: ${id}
186
- ACTION: ${meta.op}
187
- VALUE: ${meta.value}`;
188
- },
189
- async judge(task, artifact) {
190
- const meta = readMeta(task);
191
- const parsed = parseAction(artifact);
192
- if (!parsed) {
193
- return {
194
- resolved: false,
195
- score: 0,
196
- detail: JSON.stringify({ reason: "no parseable ELEMENT/ACTION", goldOp: meta.op, goldIds: meta.goldIds })
197
- };
198
- }
199
- const elementCorrect = meta.goldIds.includes(parsed.elementId);
200
- const opMatch = parsed.op === meta.op;
201
- const valueMatch = meta.op === "CLICK" ? true : normValue(parsed.value) === normValue(meta.value);
202
- const operationCorrect = opMatch && valueMatch;
203
- const resolved = elementCorrect && operationCorrect;
204
- const score = 0.6 * (elementCorrect ? 1 : 0) + 0.4 * (operationCorrect ? 1 : 0);
205
- return {
206
- resolved,
207
- score,
208
- detail: JSON.stringify({
209
- elementCorrect,
210
- opMatch,
211
- valueMatch,
212
- predicted: parsed,
213
- goldOp: meta.op,
214
- goldValue: meta.value,
215
- goldIds: meta.goldIds,
216
- website: meta.website,
217
- domain: meta.domain
218
- })
219
- };
220
- }
221
- };
222
- }
223
-
224
- export {
225
- parseAction,
226
- createMind2WebAdapter
227
- };
228
- //# sourceMappingURL=chunk-TBKU5XQI.js.map