@tangle-network/agent-bench 0.3.5 → 0.3.7
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 +13 -0
- package/README.md +13 -1
- package/dist/adapters.d.ts +15 -0
- package/dist/adapters.js +43 -0
- package/dist/adapters.js.map +1 -0
- package/dist/benchmarks/_harness.d.ts +125 -0
- package/dist/benchmarks/_harness.js +33 -0
- package/dist/benchmarks/_harness.js.map +1 -0
- package/dist/benchmarks/aec-bench.d.ts +27 -0
- package/dist/benchmarks/aec-bench.js +8 -0
- package/dist/benchmarks/aec-bench.js.map +1 -0
- package/dist/benchmarks/agentbench.d.ts +16 -0
- package/dist/benchmarks/agentbench.js +10 -0
- package/dist/benchmarks/agentbench.js.map +1 -0
- package/dist/benchmarks/appworld.d.ts +37 -0
- package/dist/benchmarks/appworld.js +14 -0
- package/dist/benchmarks/appworld.js.map +1 -0
- package/dist/benchmarks/bfcl.d.ts +18 -0
- package/dist/benchmarks/bfcl.js +10 -0
- package/dist/benchmarks/bfcl.js.map +1 -0
- package/dist/benchmarks/cad-design.d.ts +45 -0
- package/dist/benchmarks/cad-design.js +7 -0
- package/dist/benchmarks/cad-design.js.map +1 -0
- package/dist/benchmarks/cadbench.d.ts +19 -0
- package/dist/benchmarks/cadbench.js +8 -0
- package/dist/benchmarks/cadbench.js.map +1 -0
- package/dist/benchmarks/cadgenbench.d.ts +22 -0
- package/dist/benchmarks/cadgenbench.js +8 -0
- package/dist/benchmarks/cadgenbench.js.map +1 -0
- package/dist/benchmarks/commit0.d.ts +31 -0
- package/dist/benchmarks/commit0.js +10 -0
- package/dist/benchmarks/commit0.js.map +1 -0
- package/dist/benchmarks/crag.d.ts +14 -0
- package/dist/benchmarks/crag.js +9 -0
- package/dist/benchmarks/crag.js.map +1 -0
- package/dist/benchmarks/dabstep.d.ts +18 -0
- package/dist/benchmarks/dabstep.js +10 -0
- package/dist/benchmarks/dabstep.js.map +1 -0
- package/dist/benchmarks/enterpriseops-gym.d.ts +38 -0
- package/dist/benchmarks/enterpriseops-gym.js +10 -0
- package/dist/benchmarks/enterpriseops-gym.js.map +1 -0
- package/dist/benchmarks/finresearchbench.d.ts +15 -0
- package/dist/benchmarks/finresearchbench.js +8 -0
- package/dist/benchmarks/finresearchbench.js.map +1 -0
- package/dist/benchmarks/finsearchcomp.d.ts +49 -0
- package/dist/benchmarks/finsearchcomp.js +7 -0
- package/dist/benchmarks/finsearchcomp.js.map +1 -0
- package/dist/benchmarks/frames.d.ts +59 -0
- package/dist/benchmarks/frames.js +13 -0
- package/dist/benchmarks/frames.js.map +1 -0
- package/dist/benchmarks/hotpotqa.d.ts +48 -0
- package/dist/benchmarks/hotpotqa.js +15 -0
- package/dist/benchmarks/hotpotqa.js.map +1 -0
- package/dist/benchmarks/humaneval.d.ts +62 -0
- package/dist/benchmarks/humaneval.js +17 -0
- package/dist/benchmarks/humaneval.js.map +1 -0
- package/dist/benchmarks/mind2web.d.ts +41 -0
- package/dist/benchmarks/mind2web.js +9 -0
- package/dist/benchmarks/mind2web.js.map +1 -0
- package/dist/benchmarks/nomiracl.d.ts +15 -0
- package/dist/benchmarks/nomiracl.js +9 -0
- package/dist/benchmarks/nomiracl.js.map +1 -0
- package/dist/benchmarks/open-rag-bench.d.ts +14 -0
- package/dist/benchmarks/open-rag-bench.js +9 -0
- package/dist/benchmarks/open-rag-bench.js.map +1 -0
- package/dist/benchmarks/programbench.d.ts +38 -0
- package/dist/benchmarks/programbench.js +10 -0
- package/dist/benchmarks/programbench.js.map +1 -0
- package/dist/benchmarks/rag-shared.d.ts +42 -0
- package/dist/benchmarks/rag-shared.js +39 -0
- package/dist/benchmarks/rag-shared.js.map +1 -0
- package/dist/benchmarks/ragbench.d.ts +16 -0
- package/dist/benchmarks/ragbench.js +9 -0
- package/dist/benchmarks/ragbench.js.map +1 -0
- package/dist/benchmarks/simpleqa.d.ts +64 -0
- package/dist/benchmarks/simpleqa.js +11 -0
- package/dist/benchmarks/simpleqa.js.map +1 -0
- package/dist/benchmarks/swe-bench.d.ts +56 -0
- package/dist/benchmarks/swe-bench.js +14 -0
- package/dist/benchmarks/swe-bench.js.map +1 -0
- package/dist/benchmarks/t2-ragbench.d.ts +14 -0
- package/dist/benchmarks/t2-ragbench.js +9 -0
- package/dist/benchmarks/t2-ragbench.js.map +1 -0
- package/dist/benchmarks/tau-bench-shared.d.ts +26 -0
- package/dist/benchmarks/tau-bench-shared.js +10 -0
- package/dist/benchmarks/tau-bench-shared.js.map +1 -0
- package/dist/benchmarks/tau2-bench.d.ts +7 -0
- package/dist/benchmarks/tau2-bench.js +11 -0
- package/dist/benchmarks/tau2-bench.js.map +1 -0
- package/dist/benchmarks/tau3-banking.d.ts +15 -0
- package/dist/benchmarks/tau3-banking.js +9 -0
- package/dist/benchmarks/tau3-banking.js.map +1 -0
- package/dist/benchmarks/terminal-bench.d.ts +24 -0
- package/dist/benchmarks/terminal-bench.js +8 -0
- package/dist/benchmarks/terminal-bench.js.map +1 -0
- package/dist/benchmarks/toollm.d.ts +16 -0
- package/dist/benchmarks/toollm.js +10 -0
- package/dist/benchmarks/toollm.js.map +1 -0
- package/dist/benchmarks/trata-hedge.d.ts +32 -0
- package/dist/benchmarks/trata-hedge.js +7 -0
- package/dist/benchmarks/trata-hedge.js.map +1 -0
- package/dist/benchmarks/types.d.ts +107 -0
- package/dist/benchmarks/types.js +1 -0
- package/dist/benchmarks/types.js.map +1 -0
- package/dist/benchmarks/webarena-verified.d.ts +16 -0
- package/dist/benchmarks/webarena-verified.js +10 -0
- package/dist/benchmarks/webarena-verified.js.map +1 -0
- package/dist/chunk-2PVVP7GN.js +197 -0
- package/dist/chunk-2PVVP7GN.js.map +1 -0
- package/dist/chunk-2XU6OGEN.js +170 -0
- package/dist/chunk-2XU6OGEN.js.map +1 -0
- package/dist/chunk-53UPUNBZ.js +325 -0
- package/dist/chunk-53UPUNBZ.js.map +1 -0
- package/dist/chunk-5H5XV76F.js +240 -0
- package/dist/chunk-5H5XV76F.js.map +1 -0
- package/dist/chunk-7WSD27QQ.js +118 -0
- package/dist/chunk-7WSD27QQ.js.map +1 -0
- package/dist/chunk-C7T7WEK2.js +103 -0
- package/dist/chunk-C7T7WEK2.js.map +1 -0
- package/dist/chunk-CKUVRZ2T.js +251 -0
- package/dist/chunk-CKUVRZ2T.js.map +1 -0
- package/dist/chunk-HBSWHQNJ.js +30 -0
- package/dist/chunk-HBSWHQNJ.js.map +1 -0
- package/dist/chunk-HHXFIHXC.js +116 -0
- package/dist/chunk-HHXFIHXC.js.map +1 -0
- package/dist/chunk-IFAV6KEM.js +276 -0
- package/dist/chunk-IFAV6KEM.js.map +1 -0
- package/dist/chunk-INNOYXCP.js +387 -0
- package/dist/chunk-INNOYXCP.js.map +1 -0
- package/dist/chunk-J3KDJNX2.js +182 -0
- package/dist/chunk-J3KDJNX2.js.map +1 -0
- package/dist/chunk-JRWWGMK7.js +148 -0
- package/dist/chunk-JRWWGMK7.js.map +1 -0
- package/dist/chunk-JTHWEDEW.js +32 -0
- package/dist/chunk-JTHWEDEW.js.map +1 -0
- package/dist/chunk-KDIKRJGB.js +120 -0
- package/dist/chunk-KDIKRJGB.js.map +1 -0
- package/dist/chunk-LRRD7NAG.js +301 -0
- package/dist/chunk-LRRD7NAG.js.map +1 -0
- package/dist/chunk-ODT47UAY.js +221 -0
- package/dist/chunk-ODT47UAY.js.map +1 -0
- package/dist/chunk-PA2ZKHJC.js +230 -0
- package/dist/chunk-PA2ZKHJC.js.map +1 -0
- package/dist/chunk-PUIRNYI7.js +189 -0
- package/dist/chunk-PUIRNYI7.js.map +1 -0
- package/dist/chunk-PWQVGAJB.js +144 -0
- package/dist/chunk-PWQVGAJB.js.map +1 -0
- package/dist/chunk-R36V2VP7.js +169 -0
- package/dist/chunk-R36V2VP7.js.map +1 -0
- package/dist/chunk-R67DFVLO.js +142 -0
- package/dist/chunk-R67DFVLO.js.map +1 -0
- package/dist/chunk-SEVJPLZC.js +260 -0
- package/dist/chunk-SEVJPLZC.js.map +1 -0
- package/dist/chunk-SYDW647C.js +318 -0
- package/dist/chunk-SYDW647C.js.map +1 -0
- package/dist/chunk-TBKU5XQI.js +228 -0
- package/dist/chunk-TBKU5XQI.js.map +1 -0
- package/dist/chunk-TSWPNOYM.js +147 -0
- package/dist/chunk-TSWPNOYM.js.map +1 -0
- package/dist/chunk-UAIOHCUK.js +27 -0
- package/dist/chunk-UAIOHCUK.js.map +1 -0
- package/dist/chunk-UPAMRDX4.js +233 -0
- package/dist/chunk-UPAMRDX4.js.map +1 -0
- package/dist/chunk-VQRS7VUC.js +342 -0
- package/dist/chunk-VQRS7VUC.js.map +1 -0
- package/dist/chunk-X3BTXCJ4.js +262 -0
- package/dist/chunk-X3BTXCJ4.js.map +1 -0
- package/dist/chunk-X5YKXC6V.js +211 -0
- package/dist/chunk-X5YKXC6V.js.map +1 -0
- package/dist/chunk-Y6O2OCUO.js +130 -0
- package/dist/chunk-Y6O2OCUO.js.map +1 -0
- package/dist/chunk-YCGY7UIZ.js +208 -0
- package/dist/chunk-YCGY7UIZ.js.map +1 -0
- package/dist/chunk-Z7ML6L77.js +162 -0
- package/dist/chunk-Z7ML6L77.js.map +1 -0
- package/dist/chunk-ZEWMTR5M.js +136 -0
- package/dist/chunk-ZEWMTR5M.js.map +1 -0
- package/dist/index.d.ts +355 -0
- package/dist/index.js +1908 -0
- package/dist/index.js.map +1 -0
- package/package.json +26 -9
- package/scripts/run-package-tests.mjs +30 -8
- package/scripts/verify-packed-consumer.mjs +12 -1
- package/scripts/verify-pier-agent.mts +1 -0
- package/src/benchmarks/humaneval.test.mts +122 -0
- package/src/benchmarks/humaneval.ts +100 -27
- package/src/david-attribution.mts +78 -0
- package/src/david-goliath.mts +149 -0
- package/src/hev-improve.mts +25 -6
- package/src/humaneval-object-ablation.mts +201 -0
- package/src/live-improve-campaign-mbpp.mts +641 -0
- package/src/live-improve-campaign.mts +500 -0
- package/src/mbpp-structural.mts +12 -7
- package/src/stream-observe.py +45 -0
- package/src/stream-observe.tpl.html +247 -0
- package/src/supervisor-arena.mts +816 -0
- package/src/swe-arena/analyze.ts +211 -0
- package/src/swe-arena/arms.ts +788 -0
- package/src/swe-arena/bootstrap-meta.mts +188 -0
- package/src/swe-arena/bootstrap-meta.test.mts +51 -0
- package/src/swe-arena/calibrate.ts +116 -0
- package/src/swe-arena/capabilities.mts +76 -0
- package/src/swe-arena/capabilities.test.mts +57 -0
- package/src/swe-arena/capacity.ts +194 -0
- package/src/swe-arena/cell-evidence.mts +405 -0
- package/src/swe-arena/cell-evidence.test.mts +248 -0
- package/src/swe-arena/diagnosis-ensemble.test.mts +210 -0
- package/src/swe-arena/diagnosis-ensemble.ts +520 -0
- package/src/swe-arena/execution.test.mts +1170 -0
- package/src/swe-arena/fixtures/analyze.py +80 -0
- package/src/swe-arena/fixtures/excludes.txt +8 -0
- package/src/swe-arena/fixtures/gen1-salvage/README.md +45 -0
- package/src/swe-arena/fixtures/gen1-salvage/cand0-e6d7361.diff +116 -0
- package/src/swe-arena/fixtures/gen1-salvage/cand1-76a8590.diff +293 -0
- package/src/swe-arena/fixtures/holdout-preregister.log +12 -0
- package/src/swe-arena/fixtures/holdout.json +44 -0
- package/src/swe-arena/fixtures/instances.json +146 -0
- package/src/swe-arena/fixtures/ledger.jsonl +12 -0
- package/src/swe-arena/fixtures/patches/pallets__flask-5014.solo.patch +36 -0
- package/src/swe-arena/fixtures/patches/pydata__xarray-4687.sup.patch +33 -0
- package/src/swe-arena/fixtures/rejudge.jsonl +15 -0
- package/src/swe-arena/fixtures/rematch.jsonl +3 -0
- package/src/swe-arena/fixtures/rematch2.jsonl +3 -0
- package/src/swe-arena/fixtures/rematch3.jsonl +3 -0
- package/src/swe-arena/fixtures/sup-journal-true.json +19 -0
- package/src/swe-arena/fixtures/verify/astropy__astropy-13033.sh +48 -0
- package/src/swe-arena/fixtures/verify/django__django-11532.sh +50 -0
- package/src/swe-arena/fixtures/verify/matplotlib__matplotlib-20826.sh +76 -0
- package/src/swe-arena/fixtures/verify/pydata__xarray-4687.sh +44 -0
- package/src/swe-arena/fixtures/verify/pytest-dev__pytest-6197.sh +32 -0
- package/src/swe-arena/fixtures/verify/sphinx-doc__sphinx-9658.sh +51 -0
- package/src/swe-arena/fixtures/worker-tokens.json +42 -0
- package/src/swe-arena/fixtures.ts +104 -0
- package/src/swe-arena/holdout-certify.mts +408 -0
- package/src/swe-arena/holdout-certify.test.mts +160 -0
- package/src/swe-arena/judge-child.mts +37 -0
- package/src/swe-arena/manifest.mts +293 -0
- package/src/swe-arena/manifest.test.mts +169 -0
- package/src/swe-arena/materialize.ts +142 -0
- package/src/swe-arena/outer-loop.mts +2145 -0
- package/src/swe-arena/outer-loop.test.mts +696 -0
- package/src/swe-arena/parity.test.mts +87 -0
- package/src/swe-arena/proc.test.mts +174 -0
- package/src/swe-arena/proc.ts +260 -0
- package/src/swe-arena/profiles/default-author.profile.json +4 -0
- package/src/swe-arena/proposer-fanout.mts +489 -0
- package/src/swe-arena/proposer-fanout.test.mts +372 -0
- package/src/swe-arena/reconcile.ts +0 -0
- package/src/swe-arena/replay.mts +183 -0
- package/src/swe-arena/replay.test.mts +300 -0
- package/src/swe-arena/run-experiment.mts +361 -0
- package/src/swe-arena/run-supervisor.mjs +297 -0
- package/src/swe-arena/run-supervisor.test.mts +498 -0
- package/src/swe-arena/serialized-judge.ts +414 -0
- package/src/swe-arena/types.ts +166 -0
- package/src/swe-code-improve.mts +328 -0
- package/src/swe-emit-patch.mts +104 -0
- package/src/swe-improve.mts +232 -0
- package/src/swe-jail.ts +2 -2
- package/src/swe-local-proof.mts +169 -0
- package/src/swe-repro-calibrate.mts +446 -0
- package/src/swe-stream.mts +1497 -0
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
import {
|
|
2
|
+
benchRoot
|
|
3
|
+
} from "./chunk-LRRD7NAG.js";
|
|
4
|
+
|
|
5
|
+
// src/benchmarks/toollm.ts
|
|
6
|
+
import { readFile } from "fs/promises";
|
|
7
|
+
import { join } from "path";
|
|
8
|
+
var FIXTURES = join(benchRoot, "fixtures", "toollm.json");
|
|
9
|
+
var DEFAULT_QUERY_REL = join("data_example", "instruction", "G1_query.json");
|
|
10
|
+
var toolbenchDir = () => process.env.TOOLBENCH_DIR;
|
|
11
|
+
var queryFile = (dir) => process.env.TOOLLM_QUERY_FILE ?? join(dir, DEFAULT_QUERY_REL);
|
|
12
|
+
var toollmOutput = {
|
|
13
|
+
parse(events) {
|
|
14
|
+
let text = "";
|
|
15
|
+
for (const ev of events) {
|
|
16
|
+
const d = ev?.data;
|
|
17
|
+
const t = d?.finalText ?? d?.text ?? d?.result;
|
|
18
|
+
if (typeof t === "string" && t.length > 0) text = t;
|
|
19
|
+
}
|
|
20
|
+
return text.trim();
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
function rowToTask(row) {
|
|
24
|
+
const relevantApis = normalizeApiPairs(row["relevant APIs"] ?? []);
|
|
25
|
+
const meta = {
|
|
26
|
+
queryId: String(row.query_id),
|
|
27
|
+
apiList: row.api_list ?? [],
|
|
28
|
+
relevantApis,
|
|
29
|
+
deterministicJudge: "api-selection"
|
|
30
|
+
};
|
|
31
|
+
return {
|
|
32
|
+
id: String(row.query_id),
|
|
33
|
+
prompt: [
|
|
34
|
+
"Solve this ToolLLM/ToolBench API-use task.",
|
|
35
|
+
"Use only the listed APIs/tools and return the completed tool-use trace plus final answer.",
|
|
36
|
+
"",
|
|
37
|
+
`Query: ${row.query}`,
|
|
38
|
+
"",
|
|
39
|
+
`Available APIs: ${JSON.stringify(row.api_list ?? [], null, 2)}`,
|
|
40
|
+
"",
|
|
41
|
+
'Return the APIs you used as JSON: {"api_calls":[{"tool_name":"...","api_name":"..."}]}.'
|
|
42
|
+
].join("\n"),
|
|
43
|
+
metadata: meta
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
function normalizeApiPart(value) {
|
|
47
|
+
return value.toLowerCase().replace(/[^a-z0-9]+/g, "");
|
|
48
|
+
}
|
|
49
|
+
function apiKey(pair) {
|
|
50
|
+
return `${normalizeApiPart(pair[0])}.${normalizeApiPart(pair[1])}`;
|
|
51
|
+
}
|
|
52
|
+
function normalizeApiPairs(value) {
|
|
53
|
+
if (!Array.isArray(value)) return [];
|
|
54
|
+
const out = [];
|
|
55
|
+
for (const item of value) {
|
|
56
|
+
if (Array.isArray(item) && typeof item[0] === "string" && typeof item[1] === "string") {
|
|
57
|
+
out.push([item[0], item[1]]);
|
|
58
|
+
} else if (item && typeof item === "object" && typeof item.tool_name === "string" && typeof item.api_name === "string") {
|
|
59
|
+
out.push([item.tool_name, item.api_name]);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return out;
|
|
63
|
+
}
|
|
64
|
+
function readMeta(task) {
|
|
65
|
+
const md = task.metadata;
|
|
66
|
+
if (!md || !Array.isArray(md.relevantApis)) {
|
|
67
|
+
throw new Error(`ToolLLM task ${task.id} missing metadata \u2014 loadTasks did not populate deterministic API-selection labels`);
|
|
68
|
+
}
|
|
69
|
+
return md;
|
|
70
|
+
}
|
|
71
|
+
function selectRows(rows, opts) {
|
|
72
|
+
let tasks = rows.map(rowToTask);
|
|
73
|
+
if (opts.ids) {
|
|
74
|
+
const want = new Set(opts.ids);
|
|
75
|
+
tasks = tasks.filter((task) => want.has(task.id));
|
|
76
|
+
} else if (opts.limit !== void 0) {
|
|
77
|
+
tasks = tasks.slice(0, opts.limit);
|
|
78
|
+
}
|
|
79
|
+
if (tasks.length === 0) throw new Error(`ToolLLM: no tasks matched ${JSON.stringify(opts)}`);
|
|
80
|
+
return tasks;
|
|
81
|
+
}
|
|
82
|
+
function assertDeterministicSubset(tasks, source) {
|
|
83
|
+
const missing = tasks.filter((task) => readMeta(task).relevantApis.length === 0).map((task) => task.id);
|
|
84
|
+
if (missing.length > 0) {
|
|
85
|
+
throw new Error(
|
|
86
|
+
`ToolLLM deterministic API-selection labels missing for ${missing.length}/${tasks.length} task(s) from ${source}: ${missing.slice(0, 5).join(", ")}. Use a ToolBench query file that includes "relevant APIs" labels, or do not score ToolLLM in agent-bench.`
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
async function loadFixtures(opts) {
|
|
91
|
+
const rows = JSON.parse(await readFile(FIXTURES, "utf8"));
|
|
92
|
+
console.warn(`[toollm] TOOLLM_FIXTURES=1 \u2014 loading ${rows.length} adapter fixtures`);
|
|
93
|
+
const tasks = selectRows(rows, opts);
|
|
94
|
+
assertDeterministicSubset(tasks, FIXTURES);
|
|
95
|
+
return tasks;
|
|
96
|
+
}
|
|
97
|
+
async function loadOfficialTasks(dir, opts) {
|
|
98
|
+
const source = queryFile(dir);
|
|
99
|
+
const tasks = selectRows(JSON.parse(await readFile(source, "utf8")), opts);
|
|
100
|
+
assertDeterministicSubset(tasks, source);
|
|
101
|
+
return tasks;
|
|
102
|
+
}
|
|
103
|
+
function extractJsonBlock(text) {
|
|
104
|
+
const fences = [...text.matchAll(/```(?:json)?\s*\n([\s\S]*?)```/g)];
|
|
105
|
+
const raw = (fences.at(-1)?.[1] ?? text).trim();
|
|
106
|
+
try {
|
|
107
|
+
return JSON.parse(raw);
|
|
108
|
+
} catch {
|
|
109
|
+
return void 0;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
function extractCalledApis(text, expected) {
|
|
113
|
+
const parsed = extractJsonBlock(text);
|
|
114
|
+
if (parsed && typeof parsed === "object") {
|
|
115
|
+
const raw = parsed;
|
|
116
|
+
const fromApiCalls = normalizeApiPairs(raw.api_calls);
|
|
117
|
+
if (fromApiCalls.length > 0) return { pairs: fromApiCalls, source: "structured-json" };
|
|
118
|
+
const fromCalls = normalizeApiPairs(raw.calls);
|
|
119
|
+
if (fromCalls.length > 0) return { pairs: fromCalls, source: "structured-json" };
|
|
120
|
+
}
|
|
121
|
+
const lower = text.toLowerCase();
|
|
122
|
+
return {
|
|
123
|
+
pairs: expected.filter(([tool, api]) => {
|
|
124
|
+
const toolNeedle = normalizeApiPart(tool);
|
|
125
|
+
const apiNeedle = normalizeApiPart(api);
|
|
126
|
+
const compactText = lower.replace(/[^a-z0-9]+/g, "");
|
|
127
|
+
return compactText.includes(`${toolNeedle}${apiNeedle}`) || lower.includes(tool.toLowerCase()) && lower.includes(api.toLowerCase());
|
|
128
|
+
}),
|
|
129
|
+
source: "text-mention"
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
function scoreApiSelection(task, artifact) {
|
|
133
|
+
const meta = readMeta(task);
|
|
134
|
+
if (meta.relevantApis.length === 0) {
|
|
135
|
+
throw new Error(`ToolLLM task ${task.id} has no deterministic API-selection labels; refusing to score`);
|
|
136
|
+
}
|
|
137
|
+
const expected = new Set(meta.relevantApis.map(apiKey));
|
|
138
|
+
const extracted = extractCalledApis(artifact, meta.relevantApis);
|
|
139
|
+
const calledPairs = extracted.pairs;
|
|
140
|
+
const called = new Set(calledPairs.map(apiKey));
|
|
141
|
+
const truePositives = [...called].filter((key) => expected.has(key)).length;
|
|
142
|
+
const precision = called.size === 0 ? 0 : truePositives / called.size;
|
|
143
|
+
const recall = truePositives / expected.size;
|
|
144
|
+
const score = expected.size === 0 ? 0 : recall;
|
|
145
|
+
const resolved = extracted.source === "structured-json" && recall === 1 && precision === 1;
|
|
146
|
+
return {
|
|
147
|
+
resolved,
|
|
148
|
+
score,
|
|
149
|
+
detail: JSON.stringify({
|
|
150
|
+
scoring: "api-selection-only",
|
|
151
|
+
extractionSource: extracted.source,
|
|
152
|
+
queryId: meta.queryId,
|
|
153
|
+
expected: meta.relevantApis,
|
|
154
|
+
called: calledPairs,
|
|
155
|
+
precision,
|
|
156
|
+
recall,
|
|
157
|
+
fullToolEvalScore: null
|
|
158
|
+
})
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
function createToolLlmAdapter() {
|
|
162
|
+
const fixturesMode = process.env.TOOLLM_FIXTURES === "1";
|
|
163
|
+
return {
|
|
164
|
+
name: "toollm",
|
|
165
|
+
output: toollmOutput,
|
|
166
|
+
async preflight() {
|
|
167
|
+
if (fixturesMode) return;
|
|
168
|
+
const dir = toolbenchDir();
|
|
169
|
+
if (!dir) {
|
|
170
|
+
throw new Error("TOOLBENCH_DIR is required. Fix: clone https://github.com/OpenBMB/ToolBench and set TOOLBENCH_DIR=/path/to/ToolBench.");
|
|
171
|
+
}
|
|
172
|
+
await loadOfficialTasks(dir, { limit: 1 });
|
|
173
|
+
},
|
|
174
|
+
async loadTasks(opts = {}) {
|
|
175
|
+
if (fixturesMode) return loadFixtures(opts);
|
|
176
|
+
const dir = toolbenchDir();
|
|
177
|
+
if (!dir) throw new Error("TOOLBENCH_DIR is required to load ToolLLM tasks");
|
|
178
|
+
return loadOfficialTasks(dir, opts);
|
|
179
|
+
},
|
|
180
|
+
async goldArtifact(task) {
|
|
181
|
+
const meta = readMeta(task);
|
|
182
|
+
if (meta.relevantApis.length === 0) return void 0;
|
|
183
|
+
return JSON.stringify({
|
|
184
|
+
api_calls: meta.relevantApis.map(([tool_name, api_name]) => ({ tool_name, api_name }))
|
|
185
|
+
}, null, 2);
|
|
186
|
+
},
|
|
187
|
+
async judge(task, artifact) {
|
|
188
|
+
return scoreApiSelection(task, artifact);
|
|
189
|
+
}
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
export {
|
|
194
|
+
toollmOutput,
|
|
195
|
+
createToolLlmAdapter
|
|
196
|
+
};
|
|
197
|
+
//# sourceMappingURL=chunk-2PVVP7GN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/benchmarks/toollm.ts"],"sourcesContent":["/**\n * ToolLLM/ToolBench adapter.\n *\n * ToolBench task loading is useful for breadth, but the official ToolEval pass\n * rate evaluator is LLM-based and stochastic. This adapter therefore scores\n * only ToolBench's deterministic API-selection labels (`relevant APIs`). It\n * never records a full ToolEval pass-rate score.\n */\n\nimport { readFile } from 'node:fs/promises'\nimport { join } from 'node:path'\nimport type { OutputAdapter } from '@tangle-network/agent-runtime/loops'\nimport { benchRoot } from './_harness'\nimport type { BenchmarkAdapter, BenchScore, BenchTask, LoadOptions } from './types'\n\nconst FIXTURES = join(benchRoot, 'fixtures', 'toollm.json')\nconst DEFAULT_QUERY_REL = join('data_example', 'instruction', 'G1_query.json')\n\ninterface ToolApi {\n category_name?: string\n tool_name: string\n api_name: string\n api_description?: string\n required_parameters?: unknown[]\n optional_parameters?: unknown[]\n method?: string\n}\n\ninterface ToolBenchRow {\n query_id: number | string\n query: string\n api_list?: ToolApi[]\n 'relevant APIs'?: Array<[string, string]>\n}\n\ninterface ToolBenchMeta {\n queryId: string\n apiList: ToolApi[]\n relevantApis: Array<[string, string]>\n deterministicJudge: 'api-selection'\n}\n\nconst toolbenchDir = (): string | undefined => process.env.TOOLBENCH_DIR\nconst queryFile = (dir: string): string => process.env.TOOLLM_QUERY_FILE ?? join(dir, DEFAULT_QUERY_REL)\n\nexport const toollmOutput: OutputAdapter<string> = {\n parse(events) {\n let text = ''\n for (const ev of events) {\n const d = (ev as { data?: Record<string, unknown> })?.data\n const t = d?.finalText ?? d?.text ?? d?.result\n if (typeof t === 'string' && t.length > 0) text = t\n }\n return text.trim()\n },\n}\n\nfunction rowToTask(row: ToolBenchRow): BenchTask {\n const relevantApis = normalizeApiPairs(row['relevant APIs'] ?? [])\n const meta: ToolBenchMeta = {\n queryId: String(row.query_id),\n apiList: row.api_list ?? [],\n relevantApis,\n deterministicJudge: 'api-selection',\n }\n return {\n id: String(row.query_id),\n prompt: [\n 'Solve this ToolLLM/ToolBench API-use task.',\n 'Use only the listed APIs/tools and return the completed tool-use trace plus final answer.',\n '',\n `Query: ${row.query}`,\n '',\n `Available APIs: ${JSON.stringify(row.api_list ?? [], null, 2)}`,\n '',\n 'Return the APIs you used as JSON: {\"api_calls\":[{\"tool_name\":\"...\",\"api_name\":\"...\"}]}.',\n ].join('\\n'),\n metadata: meta as unknown as Record<string, unknown>,\n }\n}\n\nfunction normalizeApiPart(value: string): string {\n return value.toLowerCase().replace(/[^a-z0-9]+/g, '')\n}\n\nfunction apiKey(pair: readonly [string, string]): string {\n return `${normalizeApiPart(pair[0])}.${normalizeApiPart(pair[1])}`\n}\n\nfunction normalizeApiPairs(value: unknown): Array<[string, string]> {\n if (!Array.isArray(value)) return []\n const out: Array<[string, string]> = []\n for (const item of value) {\n if (Array.isArray(item) && typeof item[0] === 'string' && typeof item[1] === 'string') {\n out.push([item[0], item[1]])\n } else if (\n item && typeof item === 'object'\n && typeof (item as { tool_name?: unknown }).tool_name === 'string'\n && typeof (item as { api_name?: unknown }).api_name === 'string'\n ) {\n out.push([(item as { tool_name: string }).tool_name, (item as { api_name: string }).api_name])\n }\n }\n return out\n}\n\nfunction readMeta(task: BenchTask): ToolBenchMeta {\n const md = task.metadata\n if (!md || !Array.isArray(md.relevantApis)) {\n throw new Error(`ToolLLM task ${task.id} missing metadata — loadTasks did not populate deterministic API-selection labels`)\n }\n return md as unknown as ToolBenchMeta\n}\n\nfunction selectRows(rows: ToolBenchRow[], opts: LoadOptions): BenchTask[] {\n let tasks = rows.map(rowToTask)\n if (opts.ids) {\n const want = new Set(opts.ids)\n tasks = tasks.filter((task) => want.has(task.id))\n } else if (opts.limit !== undefined) {\n tasks = tasks.slice(0, opts.limit)\n }\n if (tasks.length === 0) throw new Error(`ToolLLM: no tasks matched ${JSON.stringify(opts)}`)\n return tasks\n}\n\nfunction assertDeterministicSubset(tasks: readonly BenchTask[], source: string): void {\n const missing = tasks.filter((task) => readMeta(task).relevantApis.length === 0).map((task) => task.id)\n if (missing.length > 0) {\n throw new Error(\n `ToolLLM deterministic API-selection labels missing for ${missing.length}/${tasks.length} task(s) from ${source}: ${missing.slice(0, 5).join(', ')}. ` +\n 'Use a ToolBench query file that includes \"relevant APIs\" labels, or do not score ToolLLM in agent-bench.',\n )\n }\n}\n\nasync function loadFixtures(opts: LoadOptions): Promise<BenchTask[]> {\n const rows = JSON.parse(await readFile(FIXTURES, 'utf8')) as ToolBenchRow[]\n console.warn(`[toollm] TOOLLM_FIXTURES=1 — loading ${rows.length} adapter fixtures`)\n const tasks = selectRows(rows, opts)\n assertDeterministicSubset(tasks, FIXTURES)\n return tasks\n}\n\nasync function loadOfficialTasks(dir: string, opts: LoadOptions): Promise<BenchTask[]> {\n const source = queryFile(dir)\n const tasks = selectRows(JSON.parse(await readFile(source, 'utf8')) as ToolBenchRow[], opts)\n assertDeterministicSubset(tasks, source)\n return tasks\n}\n\nfunction extractJsonBlock(text: string): unknown {\n const fences = [...text.matchAll(/```(?:json)?\\s*\\n([\\s\\S]*?)```/g)]\n const raw = (fences.at(-1)?.[1] ?? text).trim()\n try {\n return JSON.parse(raw)\n } catch {\n return undefined\n }\n}\n\ninterface ExtractedApis {\n pairs: Array<[string, string]>\n source: 'structured-json' | 'text-mention'\n}\n\nfunction extractCalledApis(text: string, expected: readonly [string, string][]): ExtractedApis {\n const parsed = extractJsonBlock(text)\n if (parsed && typeof parsed === 'object') {\n const raw = parsed as Record<string, unknown>\n const fromApiCalls = normalizeApiPairs(raw.api_calls)\n if (fromApiCalls.length > 0) return { pairs: fromApiCalls, source: 'structured-json' }\n const fromCalls = normalizeApiPairs(raw.calls)\n if (fromCalls.length > 0) return { pairs: fromCalls, source: 'structured-json' }\n }\n\n const lower = text.toLowerCase()\n return {\n pairs: expected.filter(([tool, api]) => {\n const toolNeedle = normalizeApiPart(tool)\n const apiNeedle = normalizeApiPart(api)\n const compactText = lower.replace(/[^a-z0-9]+/g, '')\n return compactText.includes(`${toolNeedle}${apiNeedle}`) || (lower.includes(tool.toLowerCase()) && lower.includes(api.toLowerCase()))\n }),\n source: 'text-mention',\n }\n}\n\nfunction scoreApiSelection(task: BenchTask, artifact: string): BenchScore {\n const meta = readMeta(task)\n if (meta.relevantApis.length === 0) {\n throw new Error(`ToolLLM task ${task.id} has no deterministic API-selection labels; refusing to score`)\n }\n const expected = new Set(meta.relevantApis.map(apiKey))\n const extracted = extractCalledApis(artifact, meta.relevantApis)\n const calledPairs = extracted.pairs\n const called = new Set(calledPairs.map(apiKey))\n const truePositives = [...called].filter((key) => expected.has(key)).length\n const precision = called.size === 0 ? 0 : truePositives / called.size\n const recall = truePositives / expected.size\n const score = expected.size === 0 ? 0 : recall\n const resolved = extracted.source === 'structured-json' && recall === 1 && precision === 1\n return {\n resolved,\n score,\n detail: JSON.stringify({\n scoring: 'api-selection-only',\n extractionSource: extracted.source,\n queryId: meta.queryId,\n expected: meta.relevantApis,\n called: calledPairs,\n precision,\n recall,\n fullToolEvalScore: null,\n }),\n }\n}\n\nexport function createToolLlmAdapter(): BenchmarkAdapter {\n const fixturesMode = process.env.TOOLLM_FIXTURES === '1'\n\n return {\n name: 'toollm',\n output: toollmOutput,\n\n async preflight() {\n if (fixturesMode) return\n const dir = toolbenchDir()\n if (!dir) {\n throw new Error('TOOLBENCH_DIR is required. Fix: clone https://github.com/OpenBMB/ToolBench and set TOOLBENCH_DIR=/path/to/ToolBench.')\n }\n await loadOfficialTasks(dir, { limit: 1 })\n },\n\n async loadTasks(opts: LoadOptions = {}) {\n if (fixturesMode) return loadFixtures(opts)\n const dir = toolbenchDir()\n if (!dir) throw new Error('TOOLBENCH_DIR is required to load ToolLLM tasks')\n return loadOfficialTasks(dir, opts)\n },\n\n async goldArtifact(task: BenchTask) {\n const meta = readMeta(task)\n if (meta.relevantApis.length === 0) return undefined\n return JSON.stringify({\n api_calls: meta.relevantApis.map(([tool_name, api_name]) => ({ tool_name, api_name })),\n }, null, 2)\n },\n\n async judge(task: BenchTask, artifact: string): Promise<BenchScore> {\n return scoreApiSelection(task, artifact)\n },\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import {
|
|
2
|
+
benchRoot,
|
|
3
|
+
preflightVenvImports,
|
|
4
|
+
runVenvScriptStdin,
|
|
5
|
+
venvPythonAt
|
|
6
|
+
} from "./chunk-LRRD7NAG.js";
|
|
7
|
+
|
|
8
|
+
// src/benchmarks/commit0.ts
|
|
9
|
+
import { join } from "path";
|
|
10
|
+
import { readFile } from "fs/promises";
|
|
11
|
+
var FIXTURES = join(benchRoot, "fixtures", "commit0.json");
|
|
12
|
+
var commit0VenvDir = () => process.env.COMMIT0_VENV ?? ".venv-commit0";
|
|
13
|
+
var commit0Python = () => venvPythonAt(commit0VenvDir());
|
|
14
|
+
var DATASET = "wentingzhao/commit0_combined";
|
|
15
|
+
var DATASET_SPLIT = "test";
|
|
16
|
+
var ROWS_API = `https://datasets-server.huggingface.co/rows?dataset=${encodeURIComponent(DATASET)}&config=default&split=${DATASET_SPLIT}`;
|
|
17
|
+
var commit0DiffOutput = {
|
|
18
|
+
parse(events) {
|
|
19
|
+
let text = "";
|
|
20
|
+
for (const ev of events) {
|
|
21
|
+
const d = ev?.data;
|
|
22
|
+
const t = d?.finalText ?? d?.text ?? d?.result;
|
|
23
|
+
if (typeof t === "string" && t.length > 0) text = t;
|
|
24
|
+
}
|
|
25
|
+
const fences = [...text.matchAll(/```(?:diff|patch)?\s*\n([\s\S]*?)```/g)];
|
|
26
|
+
const body = (fences.at(-1)?.[1] ?? text).trim();
|
|
27
|
+
return body.length > 0 ? `${body}
|
|
28
|
+
` : body;
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
function rowToTask(row) {
|
|
32
|
+
const meta = {
|
|
33
|
+
instanceId: row.instance_id,
|
|
34
|
+
repo: row.repo,
|
|
35
|
+
originalRepo: row.original_repo,
|
|
36
|
+
baseCommit: row.base_commit,
|
|
37
|
+
referenceCommit: row.reference_commit,
|
|
38
|
+
srcDir: row.src_dir,
|
|
39
|
+
testDir: row.test.test_dir,
|
|
40
|
+
testCmd: row.test.test_cmd,
|
|
41
|
+
specification: row.setup.specification
|
|
42
|
+
};
|
|
43
|
+
return {
|
|
44
|
+
id: row.instance_id,
|
|
45
|
+
split: DATASET_SPLIT,
|
|
46
|
+
prompt: [
|
|
47
|
+
`Clone https://github.com/${row.repo} into /work, then \`cd /work && git checkout ${row.base_commit}\`.`,
|
|
48
|
+
`This is the STUBBED library: the public functions/classes under \`${row.src_dir}\` have empty bodies (\`pass\`/\`...\`).`,
|
|
49
|
+
`Fill in COMPLETE implementations under \`${row.src_dir}\` so the existing test suite under \`${row.test.test_dir}\` passes. Read those tests and the spec to learn the required behavior.`,
|
|
50
|
+
`Specification / docs: ${row.setup.specification}`,
|
|
51
|
+
"Do NOT edit the test files \u2014 the evaluation re-runs the existing tests on a fresh clone. Implement only the source.",
|
|
52
|
+
`When done, from /work run EXACTLY: \`git add -A && git diff --cached -- ${row.src_dir}\` and END your reply with its COMPLETE output as the LAST thing, fenced exactly as \`\`\`diff \u2026 \`\`\` (nothing after the closing fence). That fenced diff (against ${row.base_commit}) is the only deliverable.`
|
|
53
|
+
].join("\n"),
|
|
54
|
+
metadata: meta
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function readMeta(task) {
|
|
58
|
+
const md = task.metadata;
|
|
59
|
+
if (!md || typeof md.instanceId !== "string" || typeof md.referenceCommit !== "string" || typeof md.srcDir !== "string") {
|
|
60
|
+
throw new Error(`commit0 task ${task.id} missing metadata \u2014 loadTasks did not populate it`);
|
|
61
|
+
}
|
|
62
|
+
return md;
|
|
63
|
+
}
|
|
64
|
+
function selectRows(rows, opts) {
|
|
65
|
+
let tasks = rows.map(rowToTask);
|
|
66
|
+
if (opts.ids) {
|
|
67
|
+
const want = new Set(opts.ids);
|
|
68
|
+
tasks = tasks.filter((t) => want.has(t.id));
|
|
69
|
+
} else if (opts.limit !== void 0) {
|
|
70
|
+
tasks = tasks.slice(0, opts.limit);
|
|
71
|
+
}
|
|
72
|
+
return tasks;
|
|
73
|
+
}
|
|
74
|
+
async function loadFixtures(opts) {
|
|
75
|
+
const rows = JSON.parse(await readFile(FIXTURES, "utf8"));
|
|
76
|
+
console.warn(
|
|
77
|
+
`[commit0] COMMIT0_FIXTURES=1 \u2014 loading ${rows.length} committed lite rows from ${FIXTURES} (no HF fetch)`
|
|
78
|
+
);
|
|
79
|
+
return selectRows(rows, opts);
|
|
80
|
+
}
|
|
81
|
+
async function fetchRows(opts) {
|
|
82
|
+
const target = opts.ids ? opts.ids.length * 4 : opts.limit ?? 16;
|
|
83
|
+
const rows = [];
|
|
84
|
+
const want = opts.ids ? new Set(opts.ids) : null;
|
|
85
|
+
const page = 100;
|
|
86
|
+
for (let offset = 0; offset < 64 && rows.length < target; offset += page) {
|
|
87
|
+
const res = await fetch(`${ROWS_API}&offset=${offset}&length=${page}`);
|
|
88
|
+
if (!res.ok) throw new Error(`commit0 rows HTTP ${res.status} (offset ${offset}): ${(await res.text()).slice(0, 200)}`);
|
|
89
|
+
const body = await res.json();
|
|
90
|
+
const got = body.rows ?? [];
|
|
91
|
+
if (got.length === 0) break;
|
|
92
|
+
for (const r of got) {
|
|
93
|
+
if (want && !want.has(r.row.instance_id)) continue;
|
|
94
|
+
rows.push(r.row);
|
|
95
|
+
}
|
|
96
|
+
if (got.length < page) break;
|
|
97
|
+
}
|
|
98
|
+
if (rows.length === 0) throw new Error(`commit0: no rows matched ${JSON.stringify(opts)} from ${DATASET}`);
|
|
99
|
+
return rows;
|
|
100
|
+
}
|
|
101
|
+
async function runHarness(meta, artifact) {
|
|
102
|
+
const judge = join(benchRoot, "scripts", "commit0_judge.py");
|
|
103
|
+
let stdout;
|
|
104
|
+
try {
|
|
105
|
+
stdout = await runVenvScriptStdin(
|
|
106
|
+
judge,
|
|
107
|
+
["--dataset", DATASET, "--split", DATASET_SPLIT, "--instance", meta.instanceId, "--src-dir", meta.srcDir],
|
|
108
|
+
artifact,
|
|
109
|
+
{ cwd: benchRoot, python: commit0Python() }
|
|
110
|
+
);
|
|
111
|
+
} catch (err) {
|
|
112
|
+
const e = err;
|
|
113
|
+
throw new Error(`commit0 harness failed for ${meta.instanceId}: ${(e.message || String(err)).slice(0, 1500)}`);
|
|
114
|
+
}
|
|
115
|
+
const report = JSON.parse(stdout.trim().split("\n").at(-1) ?? "{}");
|
|
116
|
+
if (report.error) throw new Error(`commit0 harness error for ${meta.instanceId}: ${report.error}`);
|
|
117
|
+
if (typeof report.passed !== "number" || typeof report.total !== "number") {
|
|
118
|
+
throw new Error(`commit0 judge returned no {passed,total}: ${stdout.slice(0, 400)}`);
|
|
119
|
+
}
|
|
120
|
+
if (report.total <= 0) {
|
|
121
|
+
throw new Error(`commit0 judge measured no tests for ${meta.instanceId} (total=0): ${stdout.slice(0, 400)}`);
|
|
122
|
+
}
|
|
123
|
+
const score = report.passed / report.total;
|
|
124
|
+
return {
|
|
125
|
+
resolved: report.passed === report.total,
|
|
126
|
+
score,
|
|
127
|
+
detail: JSON.stringify({ instanceId: meta.instanceId, passed: report.passed, total: report.total })
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
function createCommit0Adapter() {
|
|
131
|
+
const fixturesMode = process.env.COMMIT0_FIXTURES === "1";
|
|
132
|
+
return {
|
|
133
|
+
name: "commit0",
|
|
134
|
+
output: commit0DiffOutput,
|
|
135
|
+
async preflight() {
|
|
136
|
+
await preflightVenvImports({
|
|
137
|
+
modules: ["commit0"],
|
|
138
|
+
requireDocker: true,
|
|
139
|
+
python: commit0Python(),
|
|
140
|
+
fix: `Fix: (1) python3 -m venv bench/${commit0VenvDir()} && bench/${commit0VenvDir()}/bin/pip install commit0 datasets (an ISOLATED venv \u2014 commit0's deps conflict with the shared bench/.venv; override the dir with COMMIT0_VENV) ; (2) ensure the Docker daemon is running (commit0 --backend local builds per-repo images). Dataset rows come from the HF rows server; set COMMIT0_FIXTURES=1 to list the committed lite rows offline.`
|
|
141
|
+
});
|
|
142
|
+
},
|
|
143
|
+
async loadTasks(opts = {}) {
|
|
144
|
+
if (fixturesMode) return loadFixtures(opts);
|
|
145
|
+
let rows;
|
|
146
|
+
try {
|
|
147
|
+
rows = await fetchRows(opts);
|
|
148
|
+
} catch (err) {
|
|
149
|
+
console.warn(
|
|
150
|
+
`[commit0] live rows fetch failed (${err instanceof Error ? err.message : err}); falling back to committed fixtures at ${FIXTURES}`
|
|
151
|
+
);
|
|
152
|
+
return loadFixtures(opts);
|
|
153
|
+
}
|
|
154
|
+
return selectRows(rows, opts);
|
|
155
|
+
},
|
|
156
|
+
async goldArtifact() {
|
|
157
|
+
return void 0;
|
|
158
|
+
},
|
|
159
|
+
async judge(task, artifact) {
|
|
160
|
+
const meta = readMeta(task);
|
|
161
|
+
return runHarness(meta, artifact);
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
export {
|
|
167
|
+
commit0DiffOutput,
|
|
168
|
+
createCommit0Adapter
|
|
169
|
+
};
|
|
170
|
+
//# sourceMappingURL=chunk-2XU6OGEN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/benchmarks/commit0.ts"],"sourcesContent":["/**\n * Commit0 adapter (wentingzhao/commit0_combined) — implement-a-library-from-scratch.\n * Each record is a Python repo stubbed at `base_commit` (public function bodies\n * emptied to `pass`) + the full test suite + a natural-language spec URL. Worker\n * artifact = a unified diff that fills in `src_dir`. Judge = the official\n * `commit0` test harness: it stages the starter repo, applies the worker's diff,\n * builds the library's deps and runs `pytest`, writing a per-repo pytest-json\n * `report.json`. Score = (passed + xfail) / total — GRADED / partial-credit (the\n * macro-averaged unit-test pass-rate the leaderboard reports). Fully\n * deterministic — no LLM judge.\n *\n * The OutputAdapter is stream-only (the SWE wrinkle), so the worker emits its\n * implementation as a fenced ```diff against the stubbed repo — same deliverable\n * shape as swe-bench. The expensive per-repo clone+build+test is delegated to the\n * real `commit0` harness on a local Docker backend (NOT reimplemented here).\n *\n * Requires for a live run: an ISOLATED `.venv-commit0` with `commit0` installed\n * (its deps conflict with the shared bench `.venv`; override with COMMIT0_VENV) +\n * a Docker daemon (`--backend local`). For offline/CI dataset listing set\n * COMMIT0_FIXTURES=1 to load the committed lite rows (bench/fixtures/commit0.json)\n * — judging still needs the harness + Docker and fails loud, never a fabricated score.\n */\n\nimport { join } from 'node:path'\nimport { readFile } from 'node:fs/promises'\nimport type { OutputAdapter } from '@tangle-network/agent-runtime/loops'\nimport { benchRoot, preflightVenvImports, runVenvScriptStdin, venvPythonAt } from './_harness'\nimport type { BenchmarkAdapter, BenchScore, BenchTask, LoadOptions } from './types'\n\nconst FIXTURES = join(benchRoot, 'fixtures', 'commit0.json')\n\n// commit0's pip deps (pydantic/sqlalchemy v1, modal, …) conflict with the shared\n// bench .venv, so its harness runs in an ISOLATED venv. Override with COMMIT0_VENV.\n// Resolved at call-time so the env is honored at run-time (not frozen at import).\nconst commit0VenvDir = (): string => process.env.COMMIT0_VENV ?? '.venv-commit0'\nconst commit0Python = (): string => venvPythonAt(commit0VenvDir())\n\nconst DATASET = 'wentingzhao/commit0_combined'\nconst DATASET_SPLIT = 'test'\n// HF rows server — columnar pull with no `datasets` install required for listing.\nconst ROWS_API = `https://datasets-server.huggingface.co/rows?dataset=${encodeURIComponent(DATASET)}&config=default&split=${DATASET_SPLIT}`\n\n/** Reuse the SWE patch extractor shape: last fenced diff/patch, else raw text. */\nexport const commit0DiffOutput: OutputAdapter<string> = {\n parse(events) {\n let text = ''\n for (const ev of events) {\n const d = (ev as { data?: Record<string, unknown> })?.data\n const t = d?.finalText ?? d?.text ?? d?.result\n if (typeof t === 'string' && t.length > 0) text = t\n }\n const fences = [...text.matchAll(/```(?:diff|patch)?\\s*\\n([\\s\\S]*?)```/g)]\n const body = (fences.at(-1)?.[1] ?? text).trim()\n // `git apply` rejects a patch that is not newline-terminated (\"corrupt patch at\n // line N+1\"); the .trim() above strips the final newline, so restore exactly one.\n return body.length > 0 ? `${body}\\n` : body\n },\n}\n\ninterface Commit0Setup {\n install: string\n packages: string[] | null\n pip_packages: string[] | null\n pre_install: string[] | null\n python: string\n specification: string\n}\n\ninterface Commit0Row {\n instance_id: string\n repo: string\n original_repo: string\n base_commit: string\n reference_commit: string\n setup: Commit0Setup\n test: { test_cmd: string; test_dir: string }\n src_dir: string\n}\n\ninterface Commit0Meta {\n instanceId: string\n repo: string\n originalRepo: string\n baseCommit: string\n referenceCommit: string\n srcDir: string\n testDir: string\n testCmd: string\n specification: string\n}\n\nfunction rowToTask(row: Commit0Row): BenchTask {\n const meta: Commit0Meta = {\n instanceId: row.instance_id,\n repo: row.repo,\n originalRepo: row.original_repo,\n baseCommit: row.base_commit,\n referenceCommit: row.reference_commit,\n srcDir: row.src_dir,\n testDir: row.test.test_dir,\n testCmd: row.test.test_cmd,\n specification: row.setup.specification,\n }\n return {\n id: row.instance_id,\n split: DATASET_SPLIT,\n prompt: [\n `Clone https://github.com/${row.repo} into /work, then \\`cd /work && git checkout ${row.base_commit}\\`.`,\n `This is the STUBBED library: the public functions/classes under \\`${row.src_dir}\\` have empty bodies (\\`pass\\`/\\`...\\`).`,\n `Fill in COMPLETE implementations under \\`${row.src_dir}\\` so the existing test suite under \\`${row.test.test_dir}\\` passes. Read those tests and the spec to learn the required behavior.`,\n `Specification / docs: ${row.setup.specification}`,\n 'Do NOT edit the test files — the evaluation re-runs the existing tests on a fresh clone. Implement only the source.',\n `When done, from /work run EXACTLY: \\`git add -A && git diff --cached -- ${row.src_dir}\\` and END your reply with its COMPLETE output as the LAST thing, fenced exactly as \\`\\`\\`diff … \\`\\`\\` (nothing after the closing fence). That fenced diff (against ${row.base_commit}) is the only deliverable.`,\n ].join('\\n'),\n metadata: meta as unknown as Record<string, unknown>,\n }\n}\n\nfunction readMeta(task: BenchTask): Commit0Meta {\n const md = task.metadata\n if (!md || typeof md.instanceId !== 'string' || typeof md.referenceCommit !== 'string' || typeof md.srcDir !== 'string') {\n throw new Error(`commit0 task ${task.id} missing metadata — loadTasks did not populate it`)\n }\n return md as unknown as Commit0Meta\n}\n\nfunction selectRows(rows: Commit0Row[], opts: LoadOptions): BenchTask[] {\n let tasks = rows.map(rowToTask)\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 = tasks.slice(0, opts.limit)\n }\n return tasks\n}\n\nasync function loadFixtures(opts: LoadOptions): Promise<BenchTask[]> {\n const rows = JSON.parse(await readFile(FIXTURES, 'utf8')) as Commit0Row[]\n console.warn(\n `[commit0] COMMIT0_FIXTURES=1 — loading ${rows.length} committed lite rows from ${FIXTURES} (no HF fetch)`,\n )\n return selectRows(rows, opts)\n}\n\n/** Pull real rows from the HF rows server (paged). limit caps the pull; ids\n * filtered client-side. Throws on a non-OK response (fail loud). */\nasync function fetchRows(opts: LoadOptions): Promise<Commit0Row[]> {\n const target = opts.ids ? opts.ids.length * 4 : (opts.limit ?? 16)\n const rows: Commit0Row[] = []\n const want = opts.ids ? new Set(opts.ids) : null\n const page = 100\n for (let offset = 0; offset < 64 && rows.length < target; offset += page) {\n const res = await fetch(`${ROWS_API}&offset=${offset}&length=${page}`)\n if (!res.ok) throw new Error(`commit0 rows HTTP ${res.status} (offset ${offset}): ${(await res.text()).slice(0, 200)}`)\n const body = (await res.json()) as { rows?: Array<{ row: Commit0Row }>; num_rows_total?: number }\n const got = body.rows ?? []\n if (got.length === 0) break\n for (const r of got) {\n if (want && !want.has(r.row.instance_id)) continue\n rows.push(r.row)\n }\n if (got.length < page) break\n }\n if (rows.length === 0) throw new Error(`commit0: no rows matched ${JSON.stringify(opts)} from ${DATASET}`)\n return rows\n}\n\n/**\n * Run the official commit0 harness for one repo over the worker's diff. The\n * harness clones base_commit, applies the diff into src_dir, installs deps and\n * runs pytest, then writes a per-repo pytest-json report. We read that report and\n * compute (passed + xfail) / total — the leaderboard's per-repo pass-rate.\n *\n * This is the expensive, Docker-backed boundary; it is DELEGATED to `commit0`,\n * not reimplemented. The driver script lives in scripts/commit0_judge.py so the\n * harness call + report parse are one auditable python entrypoint.\n */\nasync function runHarness(meta: Commit0Meta, artifact: string): Promise<BenchScore> {\n const judge = join(benchRoot, 'scripts', 'commit0_judge.py')\n let stdout: string\n try {\n // The worker's diff is piped to the driver's stdin (shared stdin-aware runner —\n // execFile's `input` option is not honored async and hangs the reader).\n stdout = await runVenvScriptStdin(\n judge,\n ['--dataset', DATASET, '--split', DATASET_SPLIT, '--instance', meta.instanceId, '--src-dir', meta.srcDir],\n artifact,\n { cwd: benchRoot, python: commit0Python() },\n )\n } catch (err) {\n const e = err as { message?: string }\n throw new Error(`commit0 harness failed for ${meta.instanceId}: ${(e.message || String(err)).slice(0, 1500)}`)\n }\n const report = JSON.parse(stdout.trim().split('\\n').at(-1) ?? '{}') as {\n passed?: number\n total?: number\n error?: string\n }\n if (report.error) throw new Error(`commit0 harness error for ${meta.instanceId}: ${report.error}`)\n if (typeof report.passed !== 'number' || typeof report.total !== 'number') {\n throw new Error(`commit0 judge returned no {passed,total}: ${stdout.slice(0, 400)}`)\n }\n // total=0 means the harness MEASURED NOTHING (collection error with no declared\n // test ids) — an unmeasured attempt, not a 0% one. Throw so the caller excludes\n // it as infra instead of recording a fabricated zero.\n if (report.total <= 0) {\n throw new Error(`commit0 judge measured no tests for ${meta.instanceId} (total=0): ${stdout.slice(0, 400)}`)\n }\n const score = report.passed / report.total\n return {\n resolved: report.passed === report.total,\n score,\n detail: JSON.stringify({ instanceId: meta.instanceId, passed: report.passed, total: report.total }),\n }\n}\n\nexport function createCommit0Adapter(): BenchmarkAdapter {\n const fixturesMode = process.env.COMMIT0_FIXTURES === '1'\n\n return {\n name: 'commit0',\n output: commit0DiffOutput,\n\n async preflight() {\n await preflightVenvImports({\n modules: ['commit0'],\n requireDocker: true,\n python: commit0Python(),\n fix:\n `Fix: (1) python3 -m venv bench/${commit0VenvDir()} && bench/${commit0VenvDir()}/bin/pip install commit0 datasets ` +\n `(an ISOLATED venv — commit0's deps conflict with the shared bench/.venv; override the dir with COMMIT0_VENV) ; ` +\n `(2) ensure the Docker daemon is running (commit0 --backend local builds per-repo images). ` +\n `Dataset rows come from the HF rows server; set COMMIT0_FIXTURES=1 to list the committed lite rows offline.`,\n })\n },\n\n async loadTasks(opts: LoadOptions = {}) {\n if (fixturesMode) return loadFixtures(opts)\n let rows: Commit0Row[]\n try {\n rows = await fetchRows(opts)\n } catch (err) {\n console.warn(\n `[commit0] live rows fetch failed (${err instanceof Error ? err.message : err}); falling back to committed fixtures at ${FIXTURES}`,\n )\n return loadFixtures(opts)\n }\n return selectRows(rows, opts)\n },\n\n async goldArtifact() {\n // The oracle is the reference_commit's src_dir, which the commit0 harness\n // checks out by ref — not expressible as a portable diff string without\n // cloning. verify-judge against this adapter requires the live harness, so\n // we return undefined (no offline gold-diff). Judge correctness is proven by\n // running the harness on a real solve, not by a synthetic gold patch.\n return undefined\n },\n\n async judge(task: BenchTask, artifact: string): Promise<BenchScore> {\n const meta = readMeta(task)\n return runHarness(meta, artifact)\n },\n }\n}\n"],"mappings":"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","names":[]}
|