@cef-ai/eval 0.0.0-stage → 0.2.0
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 +195 -2
- package/dist/capture.d.ts +37 -0
- package/dist/capture.d.ts.map +1 -0
- package/dist/capture.js +70 -0
- package/dist/capture.js.map +1 -0
- package/dist/conformance.d.ts +6 -0
- package/dist/conformance.d.ts.map +1 -0
- package/dist/conformance.js +256 -0
- package/dist/conformance.js.map +1 -0
- package/dist/contract.d.ts +18 -0
- package/dist/contract.d.ts.map +1 -0
- package/dist/contract.js +176 -0
- package/dist/contract.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/layout.d.ts +105 -0
- package/dist/layout.d.ts.map +1 -0
- package/dist/layout.js +215 -0
- package/dist/layout.js.map +1 -0
- package/dist/pool.d.ts +13 -0
- package/dist/pool.d.ts.map +1 -0
- package/dist/pool.js +34 -0
- package/dist/pool.js.map +1 -0
- package/dist/result.d.ts +11 -0
- package/dist/result.d.ts.map +1 -0
- package/dist/result.js +72 -0
- package/dist/result.js.map +1 -0
- package/dist/run.d.ts +86 -0
- package/dist/run.d.ts.map +1 -0
- package/dist/run.js +240 -0
- package/dist/run.js.map +1 -0
- package/dist/score.d.ts +102 -0
- package/dist/score.d.ts.map +1 -0
- package/dist/score.js +433 -0
- package/dist/score.js.map +1 -0
- package/dist/storage.d.ts +218 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +577 -0
- package/dist/storage.js.map +1 -0
- package/dist/summary.d.ts +105 -0
- package/dist/summary.d.ts.map +1 -0
- package/dist/summary.js +219 -0
- package/dist/summary.js.map +1 -0
- package/dist/types.d.ts +265 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +14 -0
- package/dist/types.js.map +1 -0
- package/dist/vault-store.d.ts +46 -0
- package/dist/vault-store.d.ts.map +1 -0
- package/dist/vault-store.js +127 -0
- package/dist/vault-store.js.map +1 -0
- package/package.json +27 -3
package/dist/score.js
ADDED
|
@@ -0,0 +1,433 @@
|
|
|
1
|
+
export const FIELD_SCORER = "eval/field@1";
|
|
2
|
+
export const LIMIT_SCORER = "eval/limit@1";
|
|
3
|
+
const MISSING = Symbol("missing");
|
|
4
|
+
const isPlainObject = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
|
|
5
|
+
/** Read a dot path out of a value. `MISSING` when any segment is absent. */
|
|
6
|
+
export function readField(value, path) {
|
|
7
|
+
const got = readPathRaw(value, path);
|
|
8
|
+
return got === MISSING ? undefined : got;
|
|
9
|
+
}
|
|
10
|
+
function readPathRaw(value, path) {
|
|
11
|
+
if (value === undefined)
|
|
12
|
+
return MISSING;
|
|
13
|
+
if (path === "")
|
|
14
|
+
return value;
|
|
15
|
+
let cur = value;
|
|
16
|
+
for (const seg of path.split(".")) {
|
|
17
|
+
if (Array.isArray(cur)) {
|
|
18
|
+
const i = /^\d+$/.test(seg) ? Number(seg) : NaN;
|
|
19
|
+
if (!(i >= 0 && i < cur.length))
|
|
20
|
+
return MISSING;
|
|
21
|
+
cur = cur[i];
|
|
22
|
+
}
|
|
23
|
+
else if (isPlainObject(cur)) {
|
|
24
|
+
if (!Object.prototype.hasOwnProperty.call(cur, seg))
|
|
25
|
+
return MISSING;
|
|
26
|
+
cur = cur[seg];
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
return MISSING;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return cur;
|
|
33
|
+
}
|
|
34
|
+
export function deepEqual(a, b) {
|
|
35
|
+
if (a === b)
|
|
36
|
+
return true;
|
|
37
|
+
if (Array.isArray(a) || Array.isArray(b)) {
|
|
38
|
+
if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length)
|
|
39
|
+
return false;
|
|
40
|
+
return a.every((x, i) => deepEqual(x, b[i]));
|
|
41
|
+
}
|
|
42
|
+
if (isPlainObject(a) && isPlainObject(b)) {
|
|
43
|
+
const ka = Object.keys(a);
|
|
44
|
+
if (ka.length !== Object.keys(b).length)
|
|
45
|
+
return false;
|
|
46
|
+
return ka.every((k) => Object.prototype.hasOwnProperty.call(b, k) && deepEqual(a[k], b[k]));
|
|
47
|
+
}
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
/** Band grammar kept from the first eval harness: `>= 0.8`, `< 100`. */
|
|
51
|
+
const BAND_RE = /^\s*(>=|<=|>|<)\s*(-?\d*\.?\d+)\s*$/;
|
|
52
|
+
export function parseBand(expr) {
|
|
53
|
+
const m = BAND_RE.exec(expr);
|
|
54
|
+
return m ? { op: m[1], threshold: Number.parseFloat(m[2]) } : null;
|
|
55
|
+
}
|
|
56
|
+
function bandHolds(op, t, x) {
|
|
57
|
+
return op === ">" ? x > t : op === "<" ? x < t : op === ">=" ? x >= t : x <= t;
|
|
58
|
+
}
|
|
59
|
+
const MATCHER_KEYS = new Set(["$eq", "$oneOf", "$contains", "$regex", "$between", "$gte", "$lte", "$exists", "$approx", "$tol"]);
|
|
60
|
+
/** Whether an expectation is a matcher object (every key starts with `$`). */
|
|
61
|
+
export function isMatcher(v) {
|
|
62
|
+
if (!isPlainObject(v))
|
|
63
|
+
return false;
|
|
64
|
+
const keys = Object.keys(v);
|
|
65
|
+
return keys.length > 0 && keys.every((k) => k.startsWith("$"));
|
|
66
|
+
}
|
|
67
|
+
/** JSON for a detail line; a non-finite number reads as itself ("NaN"), not as JSON's `null`. */
|
|
68
|
+
const json = (v) => typeof v === "number" && !Number.isFinite(v)
|
|
69
|
+
? String(v)
|
|
70
|
+
: JSON.stringify(v, (_k, x) => (typeof x === "number" && !Number.isFinite(x) ? String(x) : x));
|
|
71
|
+
const show = (v) => (v === MISSING ? "nothing" : truncate(json(v)));
|
|
72
|
+
const truncate = (s, n = 120) => (s.length > n ? `${s.slice(0, n - 1)}…` : s);
|
|
73
|
+
const isNum = (v) => typeof v === "number" && Number.isFinite(v);
|
|
74
|
+
/** Longest `$regex` pattern scoring will compile. */
|
|
75
|
+
export const MAX_REGEX_LENGTH = 256;
|
|
76
|
+
/**
|
|
77
|
+
* Why a `$regex` pattern is refused before it is compiled, or null.
|
|
78
|
+
*
|
|
79
|
+
* TRUST MODEL. Cases come from a shared bucket, and JavaScript's regex engine
|
|
80
|
+
* backtracks: a pattern like `(a+)+$` runs for exponential time on a short
|
|
81
|
+
* non-matching string, synchronously, inside scoring — no timeout can
|
|
82
|
+
* interrupt it, and the CLI or the ROC tab freezes. So a pattern is refused
|
|
83
|
+
* when it is longer than {@link MAX_REGEX_LENGTH} or quantifies a group that
|
|
84
|
+
* itself contains a quantifier (`(a+)+`, `(a*)*`, `((ab)+){2,}`; a fixed
|
|
85
|
+
* `{n}` does not count). This is a heuristic, not a proof: overlapping
|
|
86
|
+
* alternations (`(a|a)*`) still pass it.
|
|
87
|
+
* Anyone who can write cases can make scoring slow; datasets are trusted the
|
|
88
|
+
* way the workflow code they test is.
|
|
89
|
+
*/
|
|
90
|
+
export function unsafeRegex(pattern) {
|
|
91
|
+
if (pattern.length > MAX_REGEX_LENGTH)
|
|
92
|
+
return `longer than ${MAX_REGEX_LENGTH} characters`;
|
|
93
|
+
// One frame per open group: whether anything inside it (nested groups included) is quantified.
|
|
94
|
+
const groups = [];
|
|
95
|
+
let inClass = false;
|
|
96
|
+
const quantifierAt = (i) => {
|
|
97
|
+
const c = pattern[i];
|
|
98
|
+
return c === "*" || c === "+" || (c === "{" && /^\{\d+,\d*\}/.test(pattern.slice(i)));
|
|
99
|
+
};
|
|
100
|
+
for (let i = 0; i < pattern.length; i++) {
|
|
101
|
+
const c = pattern[i];
|
|
102
|
+
if (c === "\\") {
|
|
103
|
+
i++;
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
if (inClass) {
|
|
107
|
+
if (c === "]")
|
|
108
|
+
inClass = false;
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
if (c === "[")
|
|
112
|
+
inClass = true;
|
|
113
|
+
else if (c === "(")
|
|
114
|
+
groups.push(false);
|
|
115
|
+
else if (c === ")") {
|
|
116
|
+
const quantifiedInside = groups.pop() ?? false;
|
|
117
|
+
if (quantifiedInside && quantifierAt(i + 1))
|
|
118
|
+
return "a quantified group contains a quantifier (nested quantifiers backtrack exponentially)";
|
|
119
|
+
if (groups.length && (quantifiedInside || quantifierAt(i + 1)))
|
|
120
|
+
groups[groups.length - 1] = true;
|
|
121
|
+
}
|
|
122
|
+
else if (quantifierAt(i) && groups.length) {
|
|
123
|
+
groups[groups.length - 1] = true;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
/** The operators a matcher applies, in the order they are checked. `$tol` belongs to `$approx`. */
|
|
129
|
+
const OPERATORS = ["$eq", "$oneOf", "$contains", "$regex", "$between", "$approx", "$gte", "$lte"];
|
|
130
|
+
/**
|
|
131
|
+
* null when it matches, otherwise why not. Every operator the matcher names
|
|
132
|
+
* must hold (AND): `{ $exists: true, $gte: 1 }` needs a value and that it be
|
|
133
|
+
* ≥ 1. The first that fails is the reason given.
|
|
134
|
+
*/
|
|
135
|
+
function applyMatcher(m, actual) {
|
|
136
|
+
const unknown = Object.keys(m).filter((k) => !MATCHER_KEYS.has(k));
|
|
137
|
+
if (unknown.length)
|
|
138
|
+
return `unknown matcher ${unknown.join(", ")}`;
|
|
139
|
+
const ops = OPERATORS.filter((k) => k in m);
|
|
140
|
+
if ("$tol" in m && !("$approx" in m))
|
|
141
|
+
return "$tol needs $approx";
|
|
142
|
+
if ("$exists" in m) {
|
|
143
|
+
const exists = actual !== MISSING && actual !== null;
|
|
144
|
+
if (exists !== Boolean(m.$exists)) {
|
|
145
|
+
return m.$exists ? "expected a value, got nothing" : `expected nothing, got ${show(actual)}`;
|
|
146
|
+
}
|
|
147
|
+
if (!ops.length)
|
|
148
|
+
return null;
|
|
149
|
+
}
|
|
150
|
+
if (!ops.length)
|
|
151
|
+
return "empty matcher";
|
|
152
|
+
if (actual === MISSING)
|
|
153
|
+
return "missing";
|
|
154
|
+
for (const op of ops) {
|
|
155
|
+
const why = applyOperator(op, m, actual);
|
|
156
|
+
if (why !== null)
|
|
157
|
+
return why;
|
|
158
|
+
}
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
function applyOperator(op, m, actual) {
|
|
162
|
+
switch (op) {
|
|
163
|
+
case "$eq":
|
|
164
|
+
return deepEqual(m.$eq, actual) ? null : `expected ${show(m.$eq)}, got ${show(actual)}`;
|
|
165
|
+
case "$oneOf": {
|
|
166
|
+
const options = Array.isArray(m.$oneOf) ? m.$oneOf : [];
|
|
167
|
+
return options.some((o) => deepEqual(o, actual)) ? null : `expected one of ${show(options)}, got ${show(actual)}`;
|
|
168
|
+
}
|
|
169
|
+
case "$contains": {
|
|
170
|
+
const want = m.$contains;
|
|
171
|
+
let ok = false;
|
|
172
|
+
if (typeof actual === "string" && typeof want === "string")
|
|
173
|
+
ok = actual.includes(want);
|
|
174
|
+
else if (Array.isArray(actual))
|
|
175
|
+
ok = actual.some((x) => matchValue(want, x) === null);
|
|
176
|
+
else if (isPlainObject(actual) && isPlainObject(want))
|
|
177
|
+
ok = matchValue(want, actual) === null;
|
|
178
|
+
return ok ? null : `expected to contain ${show(want)}, got ${show(actual)}`;
|
|
179
|
+
}
|
|
180
|
+
case "$regex": {
|
|
181
|
+
if (typeof m.$regex !== "string")
|
|
182
|
+
return "$regex must be a string";
|
|
183
|
+
const unsafe = unsafeRegex(m.$regex);
|
|
184
|
+
if (unsafe)
|
|
185
|
+
return `unsafe $regex refused: ${unsafe}`;
|
|
186
|
+
if (typeof actual !== "string")
|
|
187
|
+
return `expected a string matching /${m.$regex}/, got ${show(actual)}`;
|
|
188
|
+
let re;
|
|
189
|
+
try {
|
|
190
|
+
re = new RegExp(m.$regex);
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
return `invalid $regex ${m.$regex}`;
|
|
194
|
+
}
|
|
195
|
+
return re.test(actual) ? null : `expected /${m.$regex}/, got ${show(actual)}`;
|
|
196
|
+
}
|
|
197
|
+
case "$between": {
|
|
198
|
+
const b = m.$between;
|
|
199
|
+
if (!Array.isArray(b) || b.length !== 2 || !isNum(b[0]) || !isNum(b[1]))
|
|
200
|
+
return "$between must be [min, max]";
|
|
201
|
+
const [min, max] = b;
|
|
202
|
+
if (min > max)
|
|
203
|
+
return `$between must be [min, max] with min ≤ max, got [${min}, ${max}]`;
|
|
204
|
+
return isNum(actual) && actual >= min && actual <= max ? null : `expected between ${min} and ${max}, got ${show(actual)}`;
|
|
205
|
+
}
|
|
206
|
+
case "$approx": {
|
|
207
|
+
const want = m.$approx;
|
|
208
|
+
const tol = m.$tol ?? 0;
|
|
209
|
+
if (!isNum(want) || !isNum(tol))
|
|
210
|
+
return "$approx and $tol must be numbers";
|
|
211
|
+
return isNum(actual) && Math.abs(actual - want) <= tol
|
|
212
|
+
? null
|
|
213
|
+
: `expected ${want} ± ${tol}, got ${show(actual)}`;
|
|
214
|
+
}
|
|
215
|
+
case "$gte":
|
|
216
|
+
if (!isNum(actual))
|
|
217
|
+
return `expected a number, got ${show(actual)}`;
|
|
218
|
+
return isNum(m.$gte) && actual >= m.$gte ? null : `expected ≥ ${show(m.$gte)}, got ${show(actual)}`;
|
|
219
|
+
case "$lte":
|
|
220
|
+
if (!isNum(actual))
|
|
221
|
+
return `expected a number, got ${show(actual)}`;
|
|
222
|
+
return isNum(m.$lte) && actual <= m.$lte ? null : `expected ≤ ${show(m.$lte)}, got ${show(actual)}`;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
/** null when `actual` satisfies `expected`, otherwise why not. */
|
|
226
|
+
export function matchValue(expected, actual) {
|
|
227
|
+
const a = actual;
|
|
228
|
+
if (isMatcher(expected))
|
|
229
|
+
return applyMatcher(expected, a);
|
|
230
|
+
if (a === MISSING)
|
|
231
|
+
return "missing";
|
|
232
|
+
if (typeof expected === "string" && isNum(a)) {
|
|
233
|
+
const band = parseBand(expected);
|
|
234
|
+
if (band)
|
|
235
|
+
return bandHolds(band.op, band.threshold, a) ? null : `expected ${expected}, got ${a}`;
|
|
236
|
+
}
|
|
237
|
+
if (isPlainObject(expected)) {
|
|
238
|
+
if (!isPlainObject(a))
|
|
239
|
+
return `expected an object, got ${show(a)}`;
|
|
240
|
+
for (const [k, v] of Object.entries(expected)) {
|
|
241
|
+
const child = Object.prototype.hasOwnProperty.call(a, k) ? a[k] : MISSING;
|
|
242
|
+
const why = matchValue(v, child);
|
|
243
|
+
if (why !== null)
|
|
244
|
+
return `${k}: ${why}`;
|
|
245
|
+
}
|
|
246
|
+
return null;
|
|
247
|
+
}
|
|
248
|
+
return deepEqual(expected, a) ? null : `expected ${show(expected)}, got ${show(a)}`;
|
|
249
|
+
}
|
|
250
|
+
/** The value a score carries: the actual primitive, or its JSON (truncated) for an object/array. */
|
|
251
|
+
function scoreValue(v) {
|
|
252
|
+
if (v === MISSING || v === null)
|
|
253
|
+
return null;
|
|
254
|
+
if (typeof v === "number" && !Number.isFinite(v))
|
|
255
|
+
return String(v);
|
|
256
|
+
if (typeof v === "string" || typeof v === "number" || typeof v === "boolean")
|
|
257
|
+
return v;
|
|
258
|
+
return truncate(json(v), 500);
|
|
259
|
+
}
|
|
260
|
+
const RESULT_FIELD_TYPES = new Set(["string", "number", "boolean", "object", "array"]);
|
|
261
|
+
/**
|
|
262
|
+
* The value types an expectation can match: `["number"]` for `{ $gte: 1 }`,
|
|
263
|
+
* `["number", "string"]` for a band string such as `">= 0.8"` (a band against
|
|
264
|
+
* a number, plain equality against a string), null when it can match any
|
|
265
|
+
* (`null`, `{ $exists }`, an empty or unknown matcher).
|
|
266
|
+
*/
|
|
267
|
+
export function expectedTypesOf(want) {
|
|
268
|
+
const typeOf = (v) => v === null ? null : Array.isArray(v) ? "array" : typeof v === "object" ? "object" : typeof v;
|
|
269
|
+
if (isMatcher(want)) {
|
|
270
|
+
const m = want;
|
|
271
|
+
const typesOf = (op) => {
|
|
272
|
+
if (op === "$eq")
|
|
273
|
+
return m.$eq === null ? null : [typeOf(m.$eq)];
|
|
274
|
+
if (op === "$oneOf") {
|
|
275
|
+
const opts = Array.isArray(m.$oneOf) ? m.$oneOf : [];
|
|
276
|
+
const types = opts.map(typeOf);
|
|
277
|
+
return types.length === 0 || types.includes(null) ? null : [...new Set(types)].sort();
|
|
278
|
+
}
|
|
279
|
+
if (op === "$contains")
|
|
280
|
+
return ["array", "object", "string"];
|
|
281
|
+
if (op === "$regex")
|
|
282
|
+
return ["string"];
|
|
283
|
+
return ["number"];
|
|
284
|
+
};
|
|
285
|
+
// Every operator must hold, so the types it can match are those all of them allow.
|
|
286
|
+
let out = null;
|
|
287
|
+
for (const op of OPERATORS.filter((k) => k in m)) {
|
|
288
|
+
const t = typesOf(op);
|
|
289
|
+
if (t !== null)
|
|
290
|
+
out = out === null ? t : out.filter((x) => t.includes(x));
|
|
291
|
+
}
|
|
292
|
+
return out !== null && out.length > 0 ? out : null;
|
|
293
|
+
}
|
|
294
|
+
if (typeof want === "string")
|
|
295
|
+
return parseBand(want) ? ["number", "string"] : ["string"];
|
|
296
|
+
const t = typeOf(want);
|
|
297
|
+
return t === null ? null : [t];
|
|
298
|
+
}
|
|
299
|
+
/** The declared field an expectation's dot path falls under, and the path below it. */
|
|
300
|
+
function declaredFieldOf(path, fields) {
|
|
301
|
+
const exact = fields.find((f) => f.name === path);
|
|
302
|
+
if (exact)
|
|
303
|
+
return { field: exact, nested: false };
|
|
304
|
+
const top = path.split(".")[0];
|
|
305
|
+
const field = fields.find((f) => f.name === top);
|
|
306
|
+
return field ? { field, nested: true } : undefined;
|
|
307
|
+
}
|
|
308
|
+
function applicability(path, want, fields) {
|
|
309
|
+
const found = declaredFieldOf(path, fields);
|
|
310
|
+
if (!found)
|
|
311
|
+
return { ok: false, kind: "missing", field: path.split(".")[0] };
|
|
312
|
+
const declared = found.field.type;
|
|
313
|
+
// An untyped (or unknown-typed) field can hold anything.
|
|
314
|
+
if (!declared || !RESULT_FIELD_TYPES.has(declared))
|
|
315
|
+
return { ok: true };
|
|
316
|
+
const expected = found.nested ? ["array", "object"] : expectedTypesOf(want);
|
|
317
|
+
if (expected === null || expected.includes(declared))
|
|
318
|
+
return { ok: true };
|
|
319
|
+
return {
|
|
320
|
+
ok: false, kind: "typeChanged", field: found.field.name,
|
|
321
|
+
expectedType: found.nested ? "object" : expected.join(" or "), declaredType: declared,
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* One `eval/field@1` score per expected field. With `resultFields` (the
|
|
326
|
+
* version's declared Result), an expectation the declaration rules out is
|
|
327
|
+
* n/a (`pass: null`) rather than a failure — see the file comment.
|
|
328
|
+
*/
|
|
329
|
+
export function scoreFields(expected, output, resultFields) {
|
|
330
|
+
if (!expected)
|
|
331
|
+
return [];
|
|
332
|
+
return Object.entries(expected).map(([field, want]) => {
|
|
333
|
+
const actual = readPathRaw(output ?? undefined, field);
|
|
334
|
+
const fit = resultFields ? applicability(field, want, resultFields) : { ok: true };
|
|
335
|
+
if (!fit.ok) {
|
|
336
|
+
return {
|
|
337
|
+
name: field,
|
|
338
|
+
value: scoreValue(actual),
|
|
339
|
+
pass: null,
|
|
340
|
+
scorer: FIELD_SCORER,
|
|
341
|
+
source: "eval",
|
|
342
|
+
detail: fit.kind === "missing"
|
|
343
|
+
? "not in this version's Result"
|
|
344
|
+
: `type changed: expected ${fit.expectedType}, Result declares ${fit.declaredType}`,
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
const why = matchValue(want, actual);
|
|
348
|
+
return {
|
|
349
|
+
name: field,
|
|
350
|
+
value: scoreValue(actual),
|
|
351
|
+
pass: why === null,
|
|
352
|
+
scorer: FIELD_SCORER,
|
|
353
|
+
source: "eval",
|
|
354
|
+
...(why !== null ? { detail: why } : {}),
|
|
355
|
+
};
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
const LIMIT_METRIC = {
|
|
359
|
+
maxDurationMs: (m) => m.durationMs,
|
|
360
|
+
maxTokens: (m) => m.totalTokens,
|
|
361
|
+
maxSteps: (m) => m.steps,
|
|
362
|
+
maxCost: (m) => m.cost,
|
|
363
|
+
};
|
|
364
|
+
/** The limits in force for a case: the header's, each overridden by the case's own. */
|
|
365
|
+
export function effectiveLimits(header, c) {
|
|
366
|
+
return { ...(header?.limits ?? {}), ...(c.limits ?? {}) };
|
|
367
|
+
}
|
|
368
|
+
/** One `eval/limit@1` score per limit in force. A metric that was not measured is not judged. */
|
|
369
|
+
export function scoreLimits(limits, metrics) {
|
|
370
|
+
const out = [];
|
|
371
|
+
for (const [name, max] of Object.entries(limits)) {
|
|
372
|
+
if (max === undefined)
|
|
373
|
+
continue;
|
|
374
|
+
const value = LIMIT_METRIC[name](metrics);
|
|
375
|
+
out.push({
|
|
376
|
+
name: `limit.${name}`,
|
|
377
|
+
value,
|
|
378
|
+
pass: value === null ? null : value <= max,
|
|
379
|
+
scorer: LIMIT_SCORER,
|
|
380
|
+
source: "eval",
|
|
381
|
+
...(value !== null && value > max ? { detail: `${value} > ${max}` } : {}),
|
|
382
|
+
});
|
|
383
|
+
}
|
|
384
|
+
return out;
|
|
385
|
+
}
|
|
386
|
+
/** A case passes when every field score passes; null when there were none. Limits never count. */
|
|
387
|
+
export function casePass(scores) {
|
|
388
|
+
const fields = scores.filter((s) => s.scorer !== LIMIT_SCORER && s.pass !== null);
|
|
389
|
+
if (fields.length === 0)
|
|
390
|
+
return null;
|
|
391
|
+
return fields.every((s) => s.pass === true);
|
|
392
|
+
}
|
|
393
|
+
/**
|
|
394
|
+
* Whether a dataset's expectations fit a workflow version's declared Result —
|
|
395
|
+
* the check behind "2 dataset cases expect `priority`, which this version no
|
|
396
|
+
* longer returns". Fields are reported by their top-level name; each list is
|
|
397
|
+
* sorted.
|
|
398
|
+
*/
|
|
399
|
+
export function checkResultCompatibility(resultFields, cases) {
|
|
400
|
+
const missing = new Map();
|
|
401
|
+
const typeChanged = new Map();
|
|
402
|
+
const expectedTops = new Set();
|
|
403
|
+
for (const c of cases) {
|
|
404
|
+
for (const [path, want] of Object.entries(c.expected ?? {})) {
|
|
405
|
+
const found = declaredFieldOf(path, resultFields);
|
|
406
|
+
expectedTops.add(found?.field.name ?? path.split(".")[0]);
|
|
407
|
+
const fit = applicability(path, want, resultFields);
|
|
408
|
+
if (fit.ok)
|
|
409
|
+
continue;
|
|
410
|
+
if (fit.kind === "missing") {
|
|
411
|
+
if (!missing.has(fit.field))
|
|
412
|
+
missing.set(fit.field, new Set());
|
|
413
|
+
missing.get(fit.field).add(c.id);
|
|
414
|
+
}
|
|
415
|
+
else {
|
|
416
|
+
const k = `${fit.field}\u0000${fit.expectedType}`;
|
|
417
|
+
if (!typeChanged.has(k)) {
|
|
418
|
+
typeChanged.set(k, { expectedType: fit.expectedType, declaredType: fit.declaredType, caseIds: new Set() });
|
|
419
|
+
}
|
|
420
|
+
typeChanged.get(k).caseIds.add(c.id);
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
return {
|
|
425
|
+
missing: [...missing].map(([field, ids]) => ({ field, caseIds: [...ids].sort() }))
|
|
426
|
+
.sort((a, b) => a.field.localeCompare(b.field)),
|
|
427
|
+
typeChanged: [...typeChanged].map(([k, v]) => ({
|
|
428
|
+
field: k.split("\u0000")[0], expectedType: v.expectedType, declaredType: v.declaredType, caseIds: [...v.caseIds].sort(),
|
|
429
|
+
})).sort((a, b) => a.field.localeCompare(b.field) || a.expectedType.localeCompare(b.expectedType)),
|
|
430
|
+
unexpectedNew: resultFields.map((f) => f.name).filter((n) => !expectedTops.has(n)).sort(),
|
|
431
|
+
};
|
|
432
|
+
}
|
|
433
|
+
//# sourceMappingURL=score.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"score.js","sourceRoot":"","sources":["../src/score.ts"],"names":[],"mappings":"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"}
|