@velum-labs/routekit-eval-service 1.0.24 → 1.0.26
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.
|
@@ -23,36 +23,40 @@ export function compileDimensionEvidenceMatrix(input) {
|
|
|
23
23
|
}
|
|
24
24
|
comparisons.set(dimension.dimensionId, dimension);
|
|
25
25
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
fail(`comparison is missing dimension ${JSON.stringify(dimension.id)}`);
|
|
29
|
-
}
|
|
26
|
+
if (comparisons.size === 0) {
|
|
27
|
+
fail("comparison is missing every selected dimension");
|
|
30
28
|
}
|
|
31
29
|
const evidence = [];
|
|
32
30
|
for (const dimension of input.basis.dimensions) {
|
|
33
31
|
const dimensionInput = comparisons.get(dimension.id);
|
|
32
|
+
if (dimensionInput === undefined) {
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
34
35
|
evidence.push(...compileDimension(dimensionInput, candidateModels));
|
|
35
36
|
}
|
|
36
37
|
evidence.sort((left, right) => left.model.localeCompare(right.model) || left.dimensionId.localeCompare(right.dimensionId));
|
|
37
38
|
const evidenceDigest = stableDigest(evidence);
|
|
38
39
|
// Reuse the public contract's exhaustive matrix validation before returning
|
|
39
40
|
// an artifact that can be handed to the v2 snapshot store.
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
41
|
+
const compiledDimensions = input.basis.dimensions.filter((dimension) => comparisons.has(dimension.id));
|
|
42
|
+
if (compiledDimensions.length === input.basis.dimensions.length) {
|
|
43
|
+
try {
|
|
44
|
+
assertPublishedRoutingActivation({
|
|
45
|
+
version: COMPOSITIONAL_ROUTING_VERSION,
|
|
46
|
+
generatedAt: "1970-01-01T00:00:00.000Z",
|
|
47
|
+
basisDigest: input.basis.basisDigest,
|
|
48
|
+
evidenceDigest,
|
|
49
|
+
classifierModel: "routekit/evidence-validator",
|
|
50
|
+
objective: { kind: "highest-quality" },
|
|
51
|
+
maximumUnknownWeight: 1,
|
|
52
|
+
dimensions: [...input.basis.dimensions],
|
|
53
|
+
candidateModels: [...candidateModels],
|
|
54
|
+
evidence
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
catch (cause) {
|
|
58
|
+
fail(`compiled model-dimension evidence is invalid: ${detailOf(cause)}`);
|
|
59
|
+
}
|
|
56
60
|
}
|
|
57
61
|
return { evidenceDigest, evidence };
|
|
58
62
|
}
|
|
@@ -109,7 +109,8 @@ test("partial duration measurements do not produce a misleading percentile", ()
|
|
|
109
109
|
test("matrix compilation rejects missing and duplicate dimensions or candidates", () => {
|
|
110
110
|
const missingDimension = input();
|
|
111
111
|
missingDimension.comparisons.pop();
|
|
112
|
-
|
|
112
|
+
const partial = compileDimensionEvidenceMatrix(missingDimension);
|
|
113
|
+
assert.equal(partial.evidence.length, (dimensionIds.length - 1) * models.length);
|
|
113
114
|
const duplicateDimension = input();
|
|
114
115
|
duplicateDimension.comparisons[1] = duplicateDimension.comparisons[0];
|
|
115
116
|
assert.throws(() => compileDimensionEvidenceMatrix(duplicateDimension), /duplicate dimension/);
|
|
@@ -345,7 +345,7 @@ test("production runner uses its selected Node runtime for validation before obs
|
|
|
345
345
|
assert.match(String(exit.cause), /missing-node/iu);
|
|
346
346
|
}
|
|
347
347
|
});
|
|
348
|
-
test("production runner
|
|
348
|
+
test("production runner uses its bundled SDK with or without copy isolation", async () => {
|
|
349
349
|
const root = await mkdtemp(path.join(os.tmpdir(), "routekit-eval-runner-isolated-sdk-"));
|
|
350
350
|
roots.push(root);
|
|
351
351
|
await writeShadowEvalSdk(root, 20);
|
|
@@ -383,16 +383,18 @@ test("production runner isolates qualification from a project SDK with a shorter
|
|
|
383
383
|
const address = gateway.address();
|
|
384
384
|
assert.ok(address !== null && typeof address !== "string");
|
|
385
385
|
try {
|
|
386
|
-
const
|
|
386
|
+
const unisolatedStarted = Date.now();
|
|
387
|
+
const unisolated = await Effect.runPromise(withEvalService({
|
|
387
388
|
bearerCredential: "parent-only-token",
|
|
388
389
|
timeoutMs: 15_000
|
|
389
390
|
}, (service) => service.runComparison({
|
|
390
391
|
...requestFor(suite, `http://127.0.0.1:${String(address.port)}`),
|
|
391
392
|
candidateModels: ["openai/cheap"],
|
|
392
393
|
timeoutMs: 20
|
|
393
|
-
}, "full")).pipe(Effect.provide(NodeHttpClient.layerUndici)
|
|
394
|
-
assert.
|
|
395
|
-
assert.
|
|
394
|
+
}, "full")).pipe(Effect.provide(NodeHttpClient.layerUndici)));
|
|
395
|
+
assert.deepEqual(calls, ["openai/cheap", "openai/judge"]);
|
|
396
|
+
assert.equal(unisolated.models[0]?.cases[0]?.outcome, "passed");
|
|
397
|
+
assert.ok(Date.now() - unisolatedStarted >= 75, "runner-owned SDK materialization must replace the project SDK's 20ms abort");
|
|
396
398
|
const started = Date.now();
|
|
397
399
|
const result = await Effect.runPromise(withEvalService({
|
|
398
400
|
bearerCredential: "parent-only-token",
|
|
@@ -403,9 +405,14 @@ test("production runner isolates qualification from a project SDK with a shorter
|
|
|
403
405
|
candidateModels: ["openai/cheap"],
|
|
404
406
|
timeoutMs: 20
|
|
405
407
|
}, "full")).pipe(Effect.provide(NodeHttpClient.layerUndici)));
|
|
406
|
-
assert.deepEqual(calls, [
|
|
408
|
+
assert.deepEqual(calls, [
|
|
409
|
+
"openai/cheap",
|
|
410
|
+
"openai/judge",
|
|
411
|
+
"openai/cheap",
|
|
412
|
+
"openai/judge"
|
|
413
|
+
]);
|
|
407
414
|
assert.equal(result.models[0]?.cases[0]?.outcome, "passed");
|
|
408
|
-
assert.ok(Date.now() - started >= 75, "the project SDK's 20ms abort
|
|
415
|
+
assert.ok(Date.now() - started >= 75, "copy isolation must also keep the project SDK's 20ms abort out of execution");
|
|
409
416
|
}
|
|
410
417
|
finally {
|
|
411
418
|
await new Promise((resolve, reject) => gateway.close((error) => (error === undefined ? resolve() : reject(error))));
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@velum-labs/routekit-eval-service",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "1.0.
|
|
4
|
+
"version": "1.0.26",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
7
7
|
"url": "git+https://github.com/velum-labs/routekit.git",
|
|
@@ -32,10 +32,10 @@
|
|
|
32
32
|
"dependencies": {
|
|
33
33
|
"@effect/platform-node": "4.0.0-rc.108",
|
|
34
34
|
"effect": "4.0.0-rc.108",
|
|
35
|
-
"@velum-labs/routekit-eval-contracts": "1.0.
|
|
36
|
-
"@velum-labs/routekit-eval-engine": "1.0.
|
|
37
|
-
"@velum-labs/routekit-eval-store": "1.0.
|
|
38
|
-
"@velum-labs/routekit-registry": "1.0.
|
|
35
|
+
"@velum-labs/routekit-eval-contracts": "1.0.26",
|
|
36
|
+
"@velum-labs/routekit-eval-engine": "1.0.26",
|
|
37
|
+
"@velum-labs/routekit-eval-store": "1.0.26",
|
|
38
|
+
"@velum-labs/routekit-registry": "1.0.26"
|
|
39
39
|
},
|
|
40
40
|
"devDependencies": {
|
|
41
41
|
"typescript": "7.0.2"
|