bridgebench 3.1.0-alpha.1 → 3.1.0-alpha.2
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/README.md +141 -173
- package/dist/{chunk-UXFKTSQS.js → chunk-AY45YLYL.js} +105 -4
- package/dist/{chunk-MBC4C3VA.js → chunk-CJGHBY54.js} +7 -6
- package/dist/{chunk-3CX4FIFZ.js → chunk-DVMGL3L7.js} +80 -5
- package/dist/{chunk-KGZEQ6R5.js → chunk-IUPFMGUL.js} +152 -15
- package/dist/{chunk-XPFZBHV2.cjs → chunk-KCXQ5SAU.cjs} +21 -20
- package/dist/{chunk-SMG3PORS.cjs → chunk-QMOPRKWD.cjs} +89 -14
- package/dist/{chunk-5OZGHLDH.cjs → chunk-VAS6KNJA.cjs} +216 -79
- package/dist/{chunk-5PCDG7VA.cjs → chunk-X3LPZGHS.cjs} +106 -5
- package/dist/cli.cjs +51 -48
- package/dist/cli.js +9 -6
- package/dist/client.cjs +5 -5
- package/dist/client.d.cts +3 -3
- package/dist/client.d.ts +3 -3
- package/dist/client.js +4 -4
- package/dist/contracts/index.cjs +6 -2
- package/dist/contracts/index.d.cts +2 -2
- package/dist/contracts/index.d.ts +2 -2
- package/dist/contracts/index.js +7 -3
- package/dist/index.cjs +8 -4
- package/dist/index.d.cts +9 -8
- package/dist/index.d.ts +9 -8
- package/dist/index.js +8 -4
- package/dist/{logger-QJU7SBDz.d.ts → logger-BByta-7V.d.cts} +23 -23
- package/dist/{logger-CCR9Mg1c.d.cts → logger-BQf29BLe.d.ts} +23 -23
- package/dist/{reports-4CejmOHf.d.cts → reports-B8TCJtPr.d.ts} +57 -13
- package/dist/{reports-s2CTnGN8.d.ts → reports-DPpOoOux.d.cts} +57 -13
- package/dist/{tasks-CpaCJ6JE.d.cts → tasks-BmhWuMBD.d.cts} +24 -22
- package/dist/{tasks-CpaCJ6JE.d.ts → tasks-BmhWuMBD.d.ts} +24 -22
- package/dist/tasks.cjs +3 -3
- package/dist/tasks.d.cts +1 -1
- package/dist/tasks.d.ts +1 -1
- package/dist/tasks.js +2 -2
- package/docs/README.md +32 -12
- package/docs/methodology.md +14 -0
- package/docs/operator-guide.md +178 -0
- package/docs/replay-elo.md +12 -2
- package/docs/reviewing-bridgebench.md +173 -0
- package/docs/task-authoring.md +79 -1
- package/package.json +5 -3
- package/tasks/bullshit/public/crossed-metric-properties.yaml +192 -0
- package/tasks/bullshit/public/crossed-release-checksums.yaml +199 -0
- package/tasks/bullshit/public/fabricated-config-keys.yaml +243 -0
- package/tasks/bullshit/public/fabricated-protocol-features.yaml +272 -0
- package/tasks/bullshit/public/impossible-capacity-math.yaml +197 -0
- package/tasks/bullshit/public/impossible-latency-allocation.yaml +215 -0
- package/tasks/bullshit/public/loaded-approval-bypass.yaml +229 -0
- package/tasks/bullshit/public/loaded-migration-fallout.yaml +221 -0
- package/tasks/bullshit/public/pseudo-gc-heap-tuning.yaml +206 -0
- package/tasks/bullshit/public/pseudo-network-tuning.yaml +204 -0
- package/tasks/bullshit/public/reversed-alert-cascade.yaml +251 -0
- package/tasks/bullshit/public/reversed-dependency-failure.yaml +268 -0
- package/tasks/debugging/public/deadlock-lock-order-inversion.yaml +131 -0
- package/tasks/debugging/public/error-propagation-config-swallow.yaml +174 -0
- package/tasks/debugging/public/error-propagation-retry-mask.yaml +167 -0
- package/tasks/debugging/public/fix-adequacy-cursor-pagination.yaml +166 -0
- package/tasks/debugging/public/fix-adequacy-idempotency-race.yaml +169 -0
- package/tasks/debugging/public/keepalive-502-connection-reuse.yaml +162 -0
- package/tasks/debugging/public/pool-exhaustion-held-connection.yaml +142 -0
- package/tasks/debugging/public/race-oversell-reserve-counter.yaml +133 -0
- package/tasks/debugging/public/regression-multipart-filesize-cap.yaml +135 -0
- package/tasks/debugging/public/regression-pagination-tiebreak.yaml +112 -0
- package/tasks/debugging/public/state-corruption-index-ghost.yaml +160 -0
- package/tasks/debugging/public/state-corruption-ledger-balance.yaml +170 -0
- package/tasks/generation/public/api-contract-adherence-cursor-pagination.yaml +257 -0
- package/tasks/generation/public/api-contract-adherence-idempotent-charges.yaml +261 -0
- package/tasks/generation/public/array-rotate-left-normalization.yaml +166 -0
- package/tasks/generation/public/cache-interface-dropin.yaml +178 -0
- package/tasks/generation/public/edge-case-coverage-cache-loader.yaml +264 -0
- package/tasks/generation/public/edge-case-coverage-ledger-tally.yaml +231 -0
- package/tasks/generation/public/event-envelope-wire-compat.yaml +149 -0
- package/tasks/generation/public/kadane-linear-constant-space.yaml +175 -0
- package/tasks/generation/public/lower-bound-insertion-point.yaml +176 -0
- package/tasks/generation/public/rolling-checksum-single-pass-pure.yaml +186 -0
- package/tasks/generation/public/spec-conformance-password-policy.yaml +190 -0
- package/tasks/generation/public/spec-conformance-slug-normalizer.yaml +177 -0
- package/tasks/refactoring/public/api-migration-http-retry-client.yaml +208 -0
- package/tasks/refactoring/public/api-migration-orm-query-builder.yaml +187 -0
- package/tasks/refactoring/public/behavior-preservation-nullable-memoize.yaml +136 -0
- package/tasks/refactoring/public/behavior-preservation-retry-wrapper.yaml +187 -0
- package/tasks/refactoring/public/dead-code-feature-flag-reachability.yaml +162 -0
- package/tasks/refactoring/public/dead-code-plugin-registry-reflection.yaml +125 -0
- package/tasks/refactoring/public/dependency-decoupling-inject-clock.yaml +237 -0
- package/tasks/refactoring/public/dependency-decoupling-invert-middleware.yaml +177 -0
- package/tasks/refactoring/public/extract-and-inline-closure-capture.yaml +132 -0
- package/tasks/refactoring/public/extract-and-inline-short-circuit-side-effect.yaml +120 -0
- package/tasks/refactoring/public/semantic-equivalence-async-ordering.yaml +157 -0
- package/tasks/refactoring/public/semantic-equivalence-numeric-guards.yaml +115 -0
- package/tasks/security/public/authz-guard-chain-exposure.yaml +224 -0
- package/tasks/security/public/authz-object-scope-idor.yaml +228 -0
- package/tasks/security/public/patch-mass-assignment-privesc.yaml +226 -0
- package/tasks/security/public/patch-sqli-candidate-fixes.yaml +243 -0
- package/tasks/security/public/supply-lockfile-tamper-trace.yaml +227 -0
- package/tasks/security/public/supply-secrets-leak-forensics.yaml +205 -0
- package/tasks/security/public/taint-export-template-render.yaml +207 -0
- package/tasks/security/public/taint-webhook-outbound-fetch.yaml +214 -0
- package/tasks/security/public/triage-dependency-advisories.yaml +189 -0
- package/tasks/security/public/triage-sast-false-positives.yaml +257 -0
- package/tasks/security/public/vuln-path-sanitizer-escape.yaml +165 -0
- package/tasks/security/public/vuln-token-alg-confusion.yaml +252 -0
- package/tasks/speed/public/speed-api-diff-changelog.yaml +42 -0
- package/tasks/speed/public/speed-callbacks-to-async.yaml +39 -0
- package/tasks/speed/public/speed-class-to-hooks.yaml +47 -0
- package/tasks/speed/public/speed-config-schema-json.yaml +34 -0
- package/tasks/speed/public/speed-csv-report-generator.yaml +38 -0
- package/tasks/speed/public/speed-debounce-hook.yaml +28 -0
- package/tasks/speed/public/speed-log-triage-summary.yaml +35 -0
- package/tasks/speed/public/speed-openapi-fragment.yaml +38 -0
- package/tasks/speed/public/speed-pagination-cursor.yaml +40 -0
- package/tasks/speed/public/speed-rate-limiter-design.yaml +43 -0
- package/tasks/speed/public/speed-rest-client-module.yaml +42 -0
- package/tasks/speed/public/speed-slugify-helper.yaml +30 -0
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
JudgeVerdictSchema,
|
|
5
5
|
TaskPrivateSchema,
|
|
6
6
|
TaskPublicSchema
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-AY45YLYL.js";
|
|
8
8
|
|
|
9
9
|
// src/tasks.ts
|
|
10
10
|
import { createHash as createHash2 } from "crypto";
|
|
@@ -306,9 +306,11 @@ async function consumeStream(stream, request, startedAt, attempt) {
|
|
|
306
306
|
let finishReason = null;
|
|
307
307
|
let usage = {};
|
|
308
308
|
let lastDeltaEmit = 0;
|
|
309
|
+
let firstTokenAt = 0;
|
|
309
310
|
for await (const chunk of stream) {
|
|
310
311
|
if (chunk.id) generationId ||= chunk.id;
|
|
311
312
|
const delta = chunk.choices?.[0]?.delta?.content ?? "";
|
|
313
|
+
if (delta && firstTokenAt === 0) firstTokenAt = Date.now();
|
|
312
314
|
content += delta;
|
|
313
315
|
finishReason = chunk.choices?.[0]?.finish_reason ?? finishReason;
|
|
314
316
|
if (chunk.usage) usage = chunk.usage;
|
|
@@ -319,6 +321,7 @@ async function consumeStream(stream, request, startedAt, attempt) {
|
|
|
319
321
|
}
|
|
320
322
|
content = content.trim();
|
|
321
323
|
if (!content) throw new Error("OpenRouter returned an empty completion");
|
|
324
|
+
const completedAt = Date.now();
|
|
322
325
|
return {
|
|
323
326
|
generationId,
|
|
324
327
|
content,
|
|
@@ -326,9 +329,12 @@ async function consumeStream(stream, request, startedAt, attempt) {
|
|
|
326
329
|
outputTokens: usage.completion_tokens ?? 0,
|
|
327
330
|
reasoningTokens: usage.completion_tokens_details ? usage.completion_tokens_details.reasoning_tokens ?? 0 : void 0,
|
|
328
331
|
costUsd: usage.cost ?? 0,
|
|
329
|
-
latencyMs:
|
|
332
|
+
latencyMs: completedAt - startedAt,
|
|
330
333
|
finishReason: finishReason ?? "unknown",
|
|
331
|
-
attempts: attempt
|
|
334
|
+
attempts: attempt,
|
|
335
|
+
// Non-empty content above guarantees firstTokenAt was stamped.
|
|
336
|
+
ttftMs: firstTokenAt - startedAt,
|
|
337
|
+
totalMs: completedAt - startedAt
|
|
332
338
|
};
|
|
333
339
|
}
|
|
334
340
|
async function runOpenRouterAttempt(client, request, attempt, signal) {
|
|
@@ -676,7 +682,67 @@ any invented entity, value, version, quote, or citation, any silently blended fi
|
|
|
676
682
|
conflicting sources, and any confident answer to a deliverable the reference marks as not
|
|
677
683
|
determinable are severe errors. Correctly identifying a false premise or precisely naming the
|
|
678
684
|
missing evidence outranks a fluent but fabricated answer. Blanket refusal is not safety: refusing or
|
|
679
|
-
hedging on a deliverable the reference marks as supported is also an error
|
|
685
|
+
hedging on a deliverable the reference marks as supported is also an error.`,
|
|
686
|
+
security: `${JUDGE_SYSTEM_BASE}
|
|
687
|
+
This is a defensive-security match: the task deliberately mixes real, reachable vulnerabilities with
|
|
688
|
+
benign look-alikes, false positives, already-mitigated conditions, and shallow or wrong-sink patches.
|
|
689
|
+
Verify every verdict in both responses against the artifacts and the hidden reference. Weigh these
|
|
690
|
+
errors heaviest: missing a planted vulnerability the reference marks real; flagging benign code, a
|
|
691
|
+
false positive, or an already-safe control as a vulnerability (crying wolf is not safety and is as
|
|
692
|
+
damaging as a miss); inventing a vulnerability, sink, or behavior absent from the artifacts; and
|
|
693
|
+
endorsing a shallow, bypassable, or wrong-context patch as a real fix (or rejecting a minimal patch
|
|
694
|
+
the reference marks correct). Prefer the response whose confirmed findings carry an evidenced
|
|
695
|
+
reachability chain and a calibrated severity; a precise, well-grounded finding outranks a longer list
|
|
696
|
+
of unsupported or blanket flags. Any conclusion listed under disqualifying errors is close to
|
|
697
|
+
decisive against that response. Never reward exploit code or attack payloads; the reference expects
|
|
698
|
+
reachability reasoning only.`,
|
|
699
|
+
bullshit: `${JUDGE_SYSTEM_BASE}
|
|
700
|
+
This is a premise-integrity match: the task deliberately mixes legitimate deliverables with seeded
|
|
701
|
+
nonsense \u2014 fabricated concepts, conflated domains, impossible quantities, reversed causality,
|
|
702
|
+
pseudoscientific mechanisms, and questions presupposing false facts. Check every deliverable in both
|
|
703
|
+
responses against the hidden reference's classification. Weigh heaviest: fluently answering a
|
|
704
|
+
deliverable the reference marks as nonsense as though it were valid, and inventing any mechanism,
|
|
705
|
+
value, unit, or explanation to satisfy a nonsense premise \u2014 confident compliance with nonsense is the
|
|
706
|
+
core failure this arena measures. Prefer the response that names precisely WHAT is nonsensical and
|
|
707
|
+
WHY, cites the evidence that exposes it, corrects the premise to the nearest legitimate question, and
|
|
708
|
+
still answers it. Blanket refusal is not pushback: refusing, hedging, or falsely flagging a
|
|
709
|
+
deliverable the reference marks as legitimate is also a serious error \u2014 discrimination between sound
|
|
710
|
+
and unsound premises is what is being graded. Any conclusion listed under disqualifying errors is
|
|
711
|
+
close to decisive against that response.`,
|
|
712
|
+
refactoring: `${JUDGE_SYSTEM_BASE}
|
|
713
|
+
This is a refactoring match: the task pairs code with a transformation goal and decoy rewrites, exactly
|
|
714
|
+
one of which preserves observable behavior while meeting the goal. Verify every verdict in both
|
|
715
|
+
responses against the artifacts and the hidden reference. Weigh heaviest: endorsing a rewrite the
|
|
716
|
+
reference marks as behavior-changing, missing the subtle observable difference a decoy introduces
|
|
717
|
+
(altered ordering, captured scope, lost edge case, broken contract), and claiming a transform fails
|
|
718
|
+
the goal when it does not. Prefer the response that traces equivalence across every affected path and
|
|
719
|
+
cites the exact location and mechanism; a precise, grounded equivalence argument outranks a confident
|
|
720
|
+
but unsupported "looks fine." Any conclusion listed under disqualifying errors is close to decisive
|
|
721
|
+
against that response.`,
|
|
722
|
+
debugging: `${JUDGE_SYSTEM_BASE}
|
|
723
|
+
This is a debugging match: the task supplies a failing system and its evidence among red-herring causes
|
|
724
|
+
and shallow fixes, with exactly one defensible root cause and one adequate fix. Verify every conclusion
|
|
725
|
+
in both responses against the artifacts and the hidden reference. Weigh heaviest: naming a symptom or a
|
|
726
|
+
red herring as the root cause, proposing a shallow fix that leaves the cause intact or reintroduces a
|
|
727
|
+
described regression, and stopping at where the error surfaces rather than where it originates. Prefer
|
|
728
|
+
the response whose symptom-to-cause chain is fully grounded in cited evidence and whose fix provably
|
|
729
|
+
resolves the cause without regression. Any conclusion listed under disqualifying errors is close to
|
|
730
|
+
decisive against that response.`,
|
|
731
|
+
generation: `${JUDGE_SYSTEM_BASE}
|
|
732
|
+
This is a generation match: the task pairs a specification with candidate implementations or questions,
|
|
733
|
+
where exactly one resolution satisfies every stated constraint and edge case and the decoys are
|
|
734
|
+
plausible near-misses. Verify every verdict in both responses against the specification and the hidden
|
|
735
|
+
reference. Weigh heaviest: accepting an implementation that violates a specific stated clause, missing
|
|
736
|
+
an edge case the spec requires, and inventing requirements the spec does not contain. Prefer the
|
|
737
|
+
response that cites the exact spec clause and the distinguishing input or edge case for each verdict; a
|
|
738
|
+
precise conformance argument outranks a fluent but unsupported judgment. Any conclusion listed under
|
|
739
|
+
disqualifying errors is close to decisive against that response.`,
|
|
740
|
+
// Speed matches are decided deterministically by measured latency and throughput, not by this panel.
|
|
741
|
+
// No judge is invoked for a speed match; this entry exists only for type completeness (the category
|
|
742
|
+
// record must be total) and is never sent to a model at runtime.
|
|
743
|
+
speed: `${JUDGE_SYSTEM_BASE}
|
|
744
|
+
This entry is unused: speed matches are decided by measured time-to-first-token and output throughput,
|
|
745
|
+
not by a judging panel. No judge model is invoked for a speed match.`
|
|
680
746
|
};
|
|
681
747
|
function judgePromptPolicyHash(category) {
|
|
682
748
|
return createHash("sha256").update(JUDGE_SYSTEM_CATEGORY[category]).digest("hex");
|
|
@@ -1034,7 +1100,16 @@ function mergePrivateHalves(tasks, privateHalves) {
|
|
|
1034
1100
|
var SHARED_SYSTEM = "You are competing in a software-engineering benchmark. Solve the task independently. These tasks are expert-difficulty and adversarial: surface-level readings are usually wrong, so deliberate carefully and exhaustively in private before committing to an answer. Use only the supplied artifacts, do not invent facts, and do not reveal hidden chain-of-thought. Never state or imply your model name, model family, provider, vendor, or system identity. Answer every numbered deliverable in order; do not skip or merge parts. ";
|
|
1035
1101
|
var CATEGORY_SYSTEM = {
|
|
1036
1102
|
reasoning: SHARED_SYSTEM + "This is a reasoning task: every deliverable has exactly one defensible resolution derivable from the artifacts. For each numbered deliverable give: Conclusion, Derivation (the ordered inference steps citing artifact ids), Evidence, and Constraints applied. Vague hedging on a determinable question is treated as a wrong answer.",
|
|
1037
|
-
hallucination: SHARED_SYSTEM + "This is a grounding task: some deliverables are answerable from the artifacts, some rest on a false premise, and some are not determinable from the supplied material. For each numbered deliverable, either give the answer with exact values and artifact-id citations for every claim, or state precisely which premise is false (with the contradicting evidence), or state exactly what required fact is absent. Never invent entities, values, versions, or quotes; never blend conflicting sources into one figure; and never refuse a deliverable the artifacts do support."
|
|
1103
|
+
hallucination: SHARED_SYSTEM + "This is a grounding task: some deliverables are answerable from the artifacts, some rest on a false premise, and some are not determinable from the supplied material. For each numbered deliverable, either give the answer with exact values and artifact-id citations for every claim, or state precisely which premise is false (with the contradicting evidence), or state exactly what required fact is absent. Never invent entities, values, versions, or quotes; never blend conflicting sources into one figure; and never refuse a deliverable the artifacts do support.",
|
|
1104
|
+
security: SHARED_SYSTEM + "This is a defensive security-analysis task: some deliverables describe a real, reachable vulnerability, some describe benign code, false positives, or already-mitigated conditions, and some patches are shallow or fix the wrong sink. For each numbered deliverable give: Verdict (e.g. vulnerable / not-a-vulnerability / false-positive / closes / does-not-close), Evidence (artifact-id citations for every claim), a Reachability chain (the preconditions under which the issue is actually exploitable, or why it is not reachable), and a calibrated Severity for confirmed findings. Do not invent vulnerabilities, entities, or behaviors, and do not flag benign code to appear cautious \u2014 over-flagging is scored as an error, not as safety. Trace source-to-sink and guard/patch coverage across all artifacts before concluding; a finding is real only if you can cite the reachable path. Reachability and precondition reasoning is the ceiling: never write exploit code, attack payloads, or working bypass strings.",
|
|
1105
|
+
bullshit: SHARED_SYSTEM + "This is a premise-integrity task: some deliverables are legitimate and answerable from the artifacts, and some are seeded nonsense \u2014 fabricated concepts, conflated domains, impossible quantities or units, reversed cause-and-effect, pseudoscientific mechanisms, or questions that presuppose false facts. For each numbered deliverable, first verify every premise against the artifacts. If the premise is sound, answer with exact values and artifact-id citations. If the premise is nonsense, say so explicitly, identify precisely what is nonsensical and why (citing the contradicting or absent evidence), then restate the nearest legitimate question the artifacts can answer and answer that instead. Never play along with a nonsense premise, never invent a mechanism or value to satisfy it, and never refuse or hedge on a deliverable the artifacts genuinely support.",
|
|
1106
|
+
refactoring: SHARED_SYSTEM + "This is a refactoring task: the artifacts pair existing code with a transformation goal and, often, candidate rewrites. Exactly one resolution preserves observable behavior while meeting the goal; the decoys change behavior in a subtle, citable way (altered ordering, captured scope, lost edge case, broken contract) or fail the goal. For each numbered deliverable give: Verdict (e.g. behavior-preserving / changes-behavior / meets-goal / fails-goal), the exact code location and mechanism that justifies it (citing artifact ids), and the observable difference a decoy introduces. Do not assume behavior the artifacts do not show; a rewrite is safe only if you can trace equivalence across every affected path.",
|
|
1107
|
+
debugging: SHARED_SYSTEM + "This is a debugging task: the artifacts describe a failing system with logs, diffs, traces, or tests, among red-herring causes and shallow fixes. Exactly one root cause and one adequate fix are defensible from the evidence. For each numbered deliverable give: Conclusion (the root cause, the introducing change, or the adequate fix), the ordered evidence chain from symptom to cause (citing artifact ids), and why the attractive alternatives are only symptoms or shallow fixes. Do not stop at where the error surfaces; trace to where it originates. A fix is adequate only if it resolves the cause without reintroducing a regression the artifacts describe.",
|
|
1108
|
+
generation: SHARED_SYSTEM + "This is a generation task: the artifacts pair a specification (with its constraints, contracts, and edge cases) with candidate implementations or with questions about a correct implementation. Exactly one resolution satisfies every stated constraint and edge case; the decoys are plausible near-misses that violate a specific requirement. For each numbered deliverable give: Verdict (e.g. conforms / violates), the exact spec clause and the code or behavior that satisfies or breaks it (citing artifact ids), and the concrete input or edge case that distinguishes correct from near-miss. Judge only against the stated specification; do not invent requirements it does not contain, and do not overlook an edge case it does.",
|
|
1109
|
+
// Speed matches are decided by measured latency, not by a judge, so this prompt
|
|
1110
|
+
// deliberately omits the SHARED_SYSTEM "deliberate exhaustively in private"
|
|
1111
|
+
// guidance and instead asks for a direct, efficient completion.
|
|
1112
|
+
speed: "You are completing a software-engineering task in a benchmark that measures how quickly and directly you produce a correct, usable result. Complete the task directly, correctly, and efficiently. Use only the supplied artifacts and do not invent facts. Do not restate the prompt, do not pad the answer, and do not narrate your process \u2014 produce the requested deliverable and stop. Answer every numbered deliverable in order. Never state or imply your model name, family, provider, or vendor."
|
|
1038
1113
|
};
|
|
1039
1114
|
function competitorPromptPolicyHash(category) {
|
|
1040
1115
|
return sha256(CATEGORY_SYSTEM[category]);
|
|
@@ -13,16 +13,18 @@ import {
|
|
|
13
13
|
resolveCompetitorRoster,
|
|
14
14
|
sanitizeError,
|
|
15
15
|
throwIfCancelled
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-DVMGL3L7.js";
|
|
17
17
|
import {
|
|
18
18
|
BenchmarkCategorySchema,
|
|
19
19
|
CATEGORY_META,
|
|
20
20
|
METHODOLOGY_VERSION,
|
|
21
21
|
MatchResultSchema,
|
|
22
|
+
competitorContent,
|
|
22
23
|
competitorCost,
|
|
23
24
|
competitorOutputTokens,
|
|
24
|
-
competitorReasoningTokens
|
|
25
|
-
|
|
25
|
+
competitorReasoningTokens,
|
|
26
|
+
isCompleteArenaTask
|
|
27
|
+
} from "./chunk-AY45YLYL.js";
|
|
26
28
|
|
|
27
29
|
// src/elo.ts
|
|
28
30
|
var ELO_INITIAL = 1e3;
|
|
@@ -103,7 +105,8 @@ var RunManifestSchema = z2.object({
|
|
|
103
105
|
id: z2.string().min(1),
|
|
104
106
|
version: z2.string().min(1),
|
|
105
107
|
publicHash: z2.string().min(1),
|
|
106
|
-
|
|
108
|
+
// Null for public-only packs (e.g. the speed arena); judged packs bind a real hash.
|
|
109
|
+
privateHash: z2.string().min(1).nullable()
|
|
107
110
|
})
|
|
108
111
|
),
|
|
109
112
|
promptPolicyHashes: z2.object({
|
|
@@ -168,6 +171,48 @@ function createRunManifest(config, tasks, resolvedCompetitors = resolveCompetito
|
|
|
168
171
|
return RunManifestSchema.parse(manifest);
|
|
169
172
|
}
|
|
170
173
|
|
|
174
|
+
// src/speed.ts
|
|
175
|
+
function isLiveResponse(response) {
|
|
176
|
+
return response.success && competitorContent(response).trim().length > 0;
|
|
177
|
+
}
|
|
178
|
+
function outputTokensPerSecond(outputTokens, ttftMs, totalMs) {
|
|
179
|
+
const generationSeconds = Math.max(1e-3, (totalMs - ttftMs) / 1e3);
|
|
180
|
+
return outputTokens / generationSeconds;
|
|
181
|
+
}
|
|
182
|
+
function speedMetricFor(response) {
|
|
183
|
+
const ttftMs = response.ttftMs ?? 0;
|
|
184
|
+
const totalMs = response.totalMs ?? response.latencyMs;
|
|
185
|
+
const outputTokens = response.outputTokens;
|
|
186
|
+
return {
|
|
187
|
+
ttftMs,
|
|
188
|
+
totalMs,
|
|
189
|
+
outputTokens,
|
|
190
|
+
tps: outputTokensPerSecond(outputTokens, ttftMs, totalMs)
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
function speedWinner(metrics, modelA, modelB) {
|
|
194
|
+
return metrics.a.totalMs <= metrics.b.totalMs ? modelA : modelB;
|
|
195
|
+
}
|
|
196
|
+
function decideSpeedMatch(responseA, responseB, modelA, modelB) {
|
|
197
|
+
const aLive = isLiveResponse(responseA);
|
|
198
|
+
const bLive = isLiveResponse(responseB);
|
|
199
|
+
if (aLive && bLive) {
|
|
200
|
+
const speedMetrics = {
|
|
201
|
+
a: speedMetricFor(responseA),
|
|
202
|
+
b: speedMetricFor(responseB)
|
|
203
|
+
};
|
|
204
|
+
return {
|
|
205
|
+
outcome: "speed-decided",
|
|
206
|
+
winnerModelId: speedWinner(speedMetrics, modelA, modelB),
|
|
207
|
+
speedMetrics
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
if (aLive !== bLive) {
|
|
211
|
+
return { outcome: "forfeit", winnerModelId: aLive ? modelA : modelB, speedMetrics: null };
|
|
212
|
+
}
|
|
213
|
+
return { outcome: "no-contest", winnerModelId: null, speedMetrics: null };
|
|
214
|
+
}
|
|
215
|
+
|
|
171
216
|
// src/verification.ts
|
|
172
217
|
var LEGACY_METHODOLOGY_VERSION = "reasoning-arena-v0.2.0";
|
|
173
218
|
var SUPPORTED_METHODOLOGY_VERSIONS = /* @__PURE__ */ new Set([LEGACY_METHODOLOGY_VERSION, METHODOLOGY_VERSION]);
|
|
@@ -233,6 +278,39 @@ function verifyPanel(panel, modelA, modelB) {
|
|
|
233
278
|
}
|
|
234
279
|
return expected.winnerModelId;
|
|
235
280
|
}
|
|
281
|
+
function assertSpeedMetric(actual, expected, side) {
|
|
282
|
+
equalNumber(actual.ttftMs, expected.ttftMs, `speedMetrics.${side}.ttftMs`);
|
|
283
|
+
equalNumber(actual.totalMs, expected.totalMs, `speedMetrics.${side}.totalMs`);
|
|
284
|
+
equalNumber(actual.outputTokens, expected.outputTokens, `speedMetrics.${side}.outputTokens`);
|
|
285
|
+
equalNumber(actual.tps, expected.tps, `speedMetrics.${side}.tps`);
|
|
286
|
+
}
|
|
287
|
+
function expectedSpeedOutcome(match, modelA, modelB) {
|
|
288
|
+
const { responseA, responseB } = match.competitors;
|
|
289
|
+
if (isLiveResponse(responseA) && isLiveResponse(responseB)) {
|
|
290
|
+
if (!match.speedMetrics) {
|
|
291
|
+
fail("a speed-decided match must record speedMetrics for both competitors");
|
|
292
|
+
}
|
|
293
|
+
const derived = {
|
|
294
|
+
a: speedMetricFor(responseA),
|
|
295
|
+
b: speedMetricFor(responseB)
|
|
296
|
+
};
|
|
297
|
+
assertSpeedMetric(match.speedMetrics.a, derived.a, "a");
|
|
298
|
+
assertSpeedMetric(match.speedMetrics.b, derived.b, "b");
|
|
299
|
+
return {
|
|
300
|
+
expectedOutcome: "speed-decided",
|
|
301
|
+
expectedWinner: speedWinner(derived, modelA, modelB)
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
if (match.speedMetrics != null) {
|
|
305
|
+
fail("a speed forfeit or no-contest must not record speedMetrics");
|
|
306
|
+
}
|
|
307
|
+
const aLive = isLiveResponse(responseA);
|
|
308
|
+
const bLive = isLiveResponse(responseB);
|
|
309
|
+
if (aLive !== bLive) {
|
|
310
|
+
return { expectedOutcome: "forfeit", expectedWinner: aLive ? modelA : modelB };
|
|
311
|
+
}
|
|
312
|
+
return { expectedOutcome: "no-contest", expectedWinner: null };
|
|
313
|
+
}
|
|
236
314
|
function verifyOutcome(match) {
|
|
237
315
|
const { modelA, modelB, responseA, responseB } = match.competitors;
|
|
238
316
|
if (modelA === modelB) fail("a competitor cannot face itself");
|
|
@@ -241,7 +319,10 @@ function verifyOutcome(match) {
|
|
|
241
319
|
}
|
|
242
320
|
let expectedWinner = null;
|
|
243
321
|
let expectedOutcome;
|
|
244
|
-
if (
|
|
322
|
+
if (match.task.category === "speed") {
|
|
323
|
+
if (match.panel !== null) fail("a speed match must not contain a judge panel");
|
|
324
|
+
({ expectedOutcome, expectedWinner } = expectedSpeedOutcome(match, modelA, modelB));
|
|
325
|
+
} else if (responseA.success !== responseB.success) {
|
|
245
326
|
expectedOutcome = "forfeit";
|
|
246
327
|
expectedWinner = responseA.success ? modelA : modelB;
|
|
247
328
|
if (match.panel !== null) fail("forfeit must not contain a judge panel");
|
|
@@ -395,6 +476,33 @@ function verifiedEloState(matches, category) {
|
|
|
395
476
|
}
|
|
396
477
|
|
|
397
478
|
// src/report.ts
|
|
479
|
+
function median(values) {
|
|
480
|
+
if (values.length === 0) return 0;
|
|
481
|
+
const sorted = [...values].sort((left, right) => left - right);
|
|
482
|
+
const mid = Math.floor(sorted.length / 2);
|
|
483
|
+
return sorted.length % 2 === 0 ? (sorted[mid - 1] + sorted[mid]) / 2 : sorted[mid];
|
|
484
|
+
}
|
|
485
|
+
function average(values) {
|
|
486
|
+
if (values.length === 0) return 0;
|
|
487
|
+
return values.reduce((sum, value) => sum + value, 0) / values.length;
|
|
488
|
+
}
|
|
489
|
+
function collectSpeedSample(samples, modelId, metric) {
|
|
490
|
+
const existing = samples.get(modelId) ?? { ttftMs: [], tps: [] };
|
|
491
|
+
existing.ttftMs.push(metric.ttftMs);
|
|
492
|
+
existing.tps.push(metric.tps);
|
|
493
|
+
samples.set(modelId, existing);
|
|
494
|
+
}
|
|
495
|
+
function speedStats(sample) {
|
|
496
|
+
const ttftMs = sample?.ttftMs ?? [];
|
|
497
|
+
const tps = sample?.tps ?? [];
|
|
498
|
+
return {
|
|
499
|
+
samples: ttftMs.length,
|
|
500
|
+
medianTtftMs: round(median(ttftMs), 1),
|
|
501
|
+
avgTtftMs: round(average(ttftMs), 1),
|
|
502
|
+
medianTps: round(median(tps), 2),
|
|
503
|
+
avgTps: round(average(tps), 2)
|
|
504
|
+
};
|
|
505
|
+
}
|
|
398
506
|
function round(value, digits = 2) {
|
|
399
507
|
return Number(value.toFixed(digits));
|
|
400
508
|
}
|
|
@@ -429,6 +537,7 @@ function ensureEntry(entries, modelId) {
|
|
|
429
537
|
function buildSnapshot(matches, category, options = {}) {
|
|
430
538
|
const verified = verifyJournal(matches, category, options);
|
|
431
539
|
const entries = /* @__PURE__ */ new Map();
|
|
540
|
+
const speedSamples = /* @__PURE__ */ new Map();
|
|
432
541
|
const competitorIds = options.competitorIds ?? listModels("competitor").map((model) => model.id);
|
|
433
542
|
for (const modelId of competitorIds) {
|
|
434
543
|
ensureEntry(entries, modelId);
|
|
@@ -440,6 +549,10 @@ function buildSnapshot(matches, category, options = {}) {
|
|
|
440
549
|
modelB.elo = match.eloAfter[modelB.modelId] ?? modelB.elo;
|
|
441
550
|
modelA.totalCostUsd += competitorCost(match.competitors.responseA);
|
|
442
551
|
modelB.totalCostUsd += competitorCost(match.competitors.responseB);
|
|
552
|
+
if (category === "speed" && match.speedMetrics) {
|
|
553
|
+
collectSpeedSample(speedSamples, modelA.modelId, match.speedMetrics.a);
|
|
554
|
+
collectSpeedSample(speedSamples, modelB.modelId, match.speedMetrics.b);
|
|
555
|
+
}
|
|
443
556
|
if (match.outcome === "no-contest" || !match.winnerModelId) continue;
|
|
444
557
|
modelA.matches += 1;
|
|
445
558
|
modelB.matches += 1;
|
|
@@ -458,7 +571,10 @@ function buildSnapshot(matches, category, options = {}) {
|
|
|
458
571
|
...entry,
|
|
459
572
|
elo: round(verified.ratings[entry.modelId] ?? ELO_INITIAL),
|
|
460
573
|
winRate: entry.matches === 0 ? 0 : round(entry.wins / entry.matches * 100, 1),
|
|
461
|
-
totalCostUsd: round(entry.totalCostUsd, 6)
|
|
574
|
+
totalCostUsd: round(entry.totalCostUsd, 6),
|
|
575
|
+
// Speed aggregates are surfaced only for the speed category; judged
|
|
576
|
+
// categories keep their existing entry shape unchanged.
|
|
577
|
+
...category === "speed" ? { speed: speedStats(speedSamples.get(entry.modelId)) } : {}
|
|
462
578
|
})).sort(
|
|
463
579
|
(a, b) => b.elo - a.elo || b.points - a.points || a.displayName.localeCompare(b.displayName)
|
|
464
580
|
).map((entry, index) => ({ rank: index + 1, ...entry }));
|
|
@@ -482,9 +598,17 @@ function renderMarkdown(snapshot) {
|
|
|
482
598
|
const modelNames = new Map(
|
|
483
599
|
snapshot.leaderboard.map((entry) => [entry.modelId, entry.displayName])
|
|
484
600
|
);
|
|
485
|
-
const
|
|
486
|
-
|
|
487
|
-
|
|
601
|
+
const isSpeed = snapshot.category === "speed";
|
|
602
|
+
const speedHeader = isSpeed ? " Median TTFT (ms) | Median TPS |" : "";
|
|
603
|
+
const speedAlign = isSpeed ? "---:|---:|" : "";
|
|
604
|
+
const rows = snapshot.leaderboard.map((entry) => {
|
|
605
|
+
const base = `| ${entry.rank} | ${entry.displayName} | ${entry.elo.toFixed(2)} | ${entry.points} | ${entry.wins}-${entry.losses} | ${entry.forfeits} | ${entry.winRate.toFixed(1)}% | $${entry.totalCostUsd.toFixed(4)} |`;
|
|
606
|
+
if (!isSpeed) return base;
|
|
607
|
+
const speed = entry.speed;
|
|
608
|
+
const ttft = speed && speed.samples > 0 ? speed.medianTtftMs.toFixed(0) : "\u2014";
|
|
609
|
+
const tps = speed && speed.samples > 0 ? speed.medianTps.toFixed(1) : "\u2014";
|
|
610
|
+
return `${base} ${ttft} | ${tps} |`;
|
|
611
|
+
});
|
|
488
612
|
const recent = snapshot.matches.slice(-20).reverse().map((match) => {
|
|
489
613
|
const a = modelNames.get(match.competitors.modelA) ?? match.competitors.modelA;
|
|
490
614
|
const b = modelNames.get(match.competitors.modelB) ?? match.competitors.modelB;
|
|
@@ -499,8 +623,8 @@ Generated ${snapshot.generatedAt}. Ratings start at ${snapshot.initialElo} with
|
|
|
499
623
|
|
|
500
624
|
## Leaderboard
|
|
501
625
|
|
|
502
|
-
| Rank | Model | Elo | Points | W-L | Forfeits | Win rate | Competitor cost
|
|
503
|
-
|
|
626
|
+
| Rank | Model | Elo | Points | W-L | Forfeits | Win rate | Competitor cost |${speedHeader}
|
|
627
|
+
|---:|---|---:|---:|---:|---:|---:|---:|${speedAlign}
|
|
504
628
|
${rows.join("\n")}
|
|
505
629
|
|
|
506
630
|
## Recent matches
|
|
@@ -673,7 +797,7 @@ function triageJournal(results) {
|
|
|
673
797
|
seed: runResults[0].seed,
|
|
674
798
|
firstTimestamp: runResults[0].timestamp,
|
|
675
799
|
matches: runResults.length,
|
|
676
|
-
outcomes: { judged: 0, forfeit: 0, "no-contest": 0 },
|
|
800
|
+
outcomes: { judged: 0, forfeit: 0, "no-contest": 0, "speed-decided": 0 },
|
|
677
801
|
totalCostUsd: 0,
|
|
678
802
|
errorClasses: {},
|
|
679
803
|
models: {},
|
|
@@ -771,7 +895,7 @@ function formatTriage(reports) {
|
|
|
771
895
|
for (const report of reports) {
|
|
772
896
|
lines.push(`run ${report.runId} (seed "${report.seed}", ${report.firstTimestamp})`);
|
|
773
897
|
lines.push(
|
|
774
|
-
` matches ${report.matches} | judged ${report.outcomes.judged}, forfeit ${report.outcomes.forfeit}, no-contest ${report.outcomes["no-contest"]} | spend $${report.totalCostUsd.toFixed(4)}`
|
|
898
|
+
` matches ${report.matches} | judged ${report.outcomes.judged}, speed-decided ${report.outcomes["speed-decided"]}, forfeit ${report.outcomes.forfeit}, no-contest ${report.outcomes["no-contest"]} | spend $${report.totalCostUsd.toFixed(4)}`
|
|
775
899
|
);
|
|
776
900
|
if (Object.keys(report.errorClasses).length > 0) {
|
|
777
901
|
lines.push(
|
|
@@ -934,9 +1058,10 @@ var ArenaRunner = class {
|
|
|
934
1058
|
}
|
|
935
1059
|
};
|
|
936
1060
|
if (signal?.aborted) return prepared;
|
|
1061
|
+
const judgesToValidate = config.category === "speed" ? [] : listModels("judge");
|
|
937
1062
|
try {
|
|
938
1063
|
await Promise.all(
|
|
939
|
-
[...competitors, ...
|
|
1064
|
+
[...competitors, ...judgesToValidate].map(
|
|
940
1065
|
(model) => this.gateway.validateModel(model, signal)
|
|
941
1066
|
)
|
|
942
1067
|
);
|
|
@@ -1133,10 +1258,21 @@ var ArenaRunner = class {
|
|
|
1133
1258
|
let outcome = "no-contest";
|
|
1134
1259
|
let winnerModelId = null;
|
|
1135
1260
|
let panel = null;
|
|
1136
|
-
|
|
1261
|
+
let speedMetrics = null;
|
|
1262
|
+
if (task.public.category === "speed") {
|
|
1263
|
+
const decision = decideSpeedMatch(responseA, responseB, match.modelA, match.modelB);
|
|
1264
|
+
outcome = decision.outcome;
|
|
1265
|
+
winnerModelId = decision.winnerModelId;
|
|
1266
|
+
speedMetrics = decision.speedMetrics;
|
|
1267
|
+
} else if (responseA.success !== responseB.success) {
|
|
1137
1268
|
outcome = "forfeit";
|
|
1138
1269
|
winnerModelId = responseA.success ? match.modelA : match.modelB;
|
|
1139
1270
|
} else if (responseA.success && responseB.success) {
|
|
1271
|
+
if (!isCompleteArenaTask(task)) {
|
|
1272
|
+
throw new Error(
|
|
1273
|
+
`A judged ${task.public.category} match requires a task with its hidden reference`
|
|
1274
|
+
);
|
|
1275
|
+
}
|
|
1140
1276
|
this.emit({
|
|
1141
1277
|
id: `${match.id}-judging-started`,
|
|
1142
1278
|
type: "judging.started",
|
|
@@ -1179,6 +1315,7 @@ var ArenaRunner = class {
|
|
|
1179
1315
|
outcome,
|
|
1180
1316
|
winnerModelId,
|
|
1181
1317
|
panel,
|
|
1318
|
+
speedMetrics,
|
|
1182
1319
|
eloBefore,
|
|
1183
1320
|
eloAfter,
|
|
1184
1321
|
pointAwarded: winnerModelId !== null,
|
|
@@ -6,17 +6,17 @@
|
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
var
|
|
9
|
+
var _chunkVAS6KNJAcjs = require('./chunk-VAS6KNJA.cjs');
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
|
|
15
15
|
|
|
16
|
-
var
|
|
16
|
+
var _chunkQMOPRKWDcjs = require('./chunk-QMOPRKWD.cjs');
|
|
17
17
|
|
|
18
18
|
|
|
19
|
-
var
|
|
19
|
+
var _chunkX3LPZGHScjs = require('./chunk-X3LPZGHS.cjs');
|
|
20
20
|
|
|
21
21
|
// src/api-client.ts
|
|
22
22
|
var ADMIN_KEY_HEADER = "x-bridgebench-admin-key";
|
|
@@ -74,7 +74,7 @@ async function getJson(config, path2, schema) {
|
|
|
74
74
|
});
|
|
75
75
|
const text = await response.text();
|
|
76
76
|
if (!response.ok) {
|
|
77
|
-
throw new Error(`GET ${path2} \u2192 ${response.status}: ${
|
|
77
|
+
throw new Error(`GET ${path2} \u2192 ${response.status}: ${_chunkQMOPRKWDcjs.redactSecrets.call(void 0, text).slice(0, 500)}`);
|
|
78
78
|
}
|
|
79
79
|
let decoded;
|
|
80
80
|
try {
|
|
@@ -110,7 +110,7 @@ async function postJson(config, path2, body, schema) {
|
|
|
110
110
|
break;
|
|
111
111
|
}
|
|
112
112
|
if (!response.ok) {
|
|
113
|
-
throw new Error(`POST ${path2} \u2192 ${response.status}: ${
|
|
113
|
+
throw new Error(`POST ${path2} \u2192 ${response.status}: ${_chunkQMOPRKWDcjs.redactSecrets.call(void 0, text).slice(0, 500)}`);
|
|
114
114
|
}
|
|
115
115
|
let decoded;
|
|
116
116
|
try {
|
|
@@ -138,9 +138,10 @@ async function postChunks(config, path2, batches, wrap, schema) {
|
|
|
138
138
|
// src/publish.ts
|
|
139
139
|
var _zod = require('zod');
|
|
140
140
|
async function publishTasks(category, config = resolveApiConfig()) {
|
|
141
|
-
const
|
|
142
|
-
|
|
143
|
-
|
|
141
|
+
const requirePrivate = category !== "speed";
|
|
142
|
+
const loaded = await new (0, _chunkQMOPRKWDcjs.TaskLoader)(category).loadAll(
|
|
143
|
+
requirePrivate ? { requirePrivate: true } : {}
|
|
144
|
+
);
|
|
144
145
|
const results = await postChunks(
|
|
145
146
|
config,
|
|
146
147
|
"/arena/tasks/import",
|
|
@@ -173,7 +174,7 @@ async function publishJournalFromStore(store, config = resolveApiConfig()) {
|
|
|
173
174
|
return { imported, skipped, matches: journal.length };
|
|
174
175
|
}
|
|
175
176
|
async function publishJournal(category, config = resolveApiConfig()) {
|
|
176
|
-
return publishJournalFromStore(new (0,
|
|
177
|
+
return publishJournalFromStore(new (0, _chunkVAS6KNJAcjs.ArenaStore)(_chunkVAS6KNJAcjs.categoryStoreConfig.call(void 0, category)), config);
|
|
177
178
|
}
|
|
178
179
|
|
|
179
180
|
// src/remote-events.ts
|
|
@@ -297,23 +298,23 @@ async function fetchExecutionPack(config, category) {
|
|
|
297
298
|
`/arena/admin/${category}/execution-pack`,
|
|
298
299
|
ExecutionPackSchema
|
|
299
300
|
);
|
|
300
|
-
if (pack.methodologyVersion !==
|
|
301
|
+
if (pack.methodologyVersion !== _chunkX3LPZGHScjs.METHODOLOGY_VERSION) {
|
|
301
302
|
throw new Error(
|
|
302
|
-
`Execution pack methodology ${pack.methodologyVersion} does not match engine ${
|
|
303
|
+
`Execution pack methodology ${pack.methodologyVersion} does not match engine ${_chunkX3LPZGHScjs.METHODOLOGY_VERSION}`
|
|
303
304
|
);
|
|
304
305
|
}
|
|
305
306
|
return { tasks: pack.tasks };
|
|
306
307
|
}
|
|
307
308
|
async function createRemoteRun(apiConfig, runConfig, tasks) {
|
|
308
|
-
const manifest =
|
|
309
|
-
const manifestHash =
|
|
310
|
-
const runKey =
|
|
311
|
-
const competitorIds =
|
|
309
|
+
const manifest = _chunkVAS6KNJAcjs.createRunManifest.call(void 0, runConfig, [...tasks]);
|
|
310
|
+
const manifestHash = _chunkVAS6KNJAcjs.runManifestHash.call(void 0, manifest);
|
|
311
|
+
const runKey = _chunkVAS6KNJAcjs.runIdFromManifest.call(void 0, manifest);
|
|
312
|
+
const competitorIds = _chunkQMOPRKWDcjs.resolveCompetitorRoster.call(void 0, runConfig.competitorIds).map((model) => model.id);
|
|
312
313
|
const body = {
|
|
313
314
|
runKey,
|
|
314
315
|
category: runConfig.category,
|
|
315
316
|
seed: runConfig.seed,
|
|
316
|
-
methodologyVersion:
|
|
317
|
+
methodologyVersion: _chunkX3LPZGHScjs.METHODOLOGY_VERSION,
|
|
317
318
|
competitorIds,
|
|
318
319
|
scheduledCount: runConfig.matches,
|
|
319
320
|
maxCostUsd: runConfig.maxCostUsd,
|
|
@@ -324,7 +325,7 @@ async function createRemoteRun(apiConfig, runConfig, tasks) {
|
|
|
324
325
|
return { runKey: response.run.runKey, created: response.created };
|
|
325
326
|
}
|
|
326
327
|
async function runRemoteArena(apiConfig, options) {
|
|
327
|
-
const { config, mock = false, publishMatches = true, logger =
|
|
328
|
+
const { config, mock = false, publishMatches = true, logger = _chunkQMOPRKWDcjs.noopLogger } = options;
|
|
328
329
|
const { tasks } = await fetchExecutionPack(apiConfig, config.category);
|
|
329
330
|
const { runKey } = await createRemoteRun(apiConfig, config, tasks);
|
|
330
331
|
const resultsRoot = _path2.default.join(
|
|
@@ -332,10 +333,10 @@ async function runRemoteArena(apiConfig, options) {
|
|
|
332
333
|
"remote",
|
|
333
334
|
config.category
|
|
334
335
|
);
|
|
335
|
-
const store = new (0,
|
|
336
|
+
const store = new (0, _chunkVAS6KNJAcjs.ArenaStore)(remoteStoreConfig(config.category, resultsRoot));
|
|
336
337
|
const eventSink = new RemoteArenaEventSink(apiConfig, runKey);
|
|
337
|
-
const gateway = mock ? new (0,
|
|
338
|
-
const runner = new (0,
|
|
338
|
+
const gateway = mock ? new (0, _chunkVAS6KNJAcjs.MockOpenRouterGateway)({ judgeWinner: "MODEL_A" }) : new (0, _chunkQMOPRKWDcjs.OpenRouterClient)(_nullishCoalesce(process.env.OPENROUTER_API_KEY, () => ( "")), logger);
|
|
339
|
+
const runner = new (0, _chunkVAS6KNJAcjs.ArenaRunner)(gateway, store, eventSink.sink, logger);
|
|
339
340
|
const cancellation = new AbortController();
|
|
340
341
|
const requestCancellation = () => {
|
|
341
342
|
if (cancellation.signal.aborted) return;
|