@aid-framework/runtime 0.0.0 → 0.1.48
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/LICENSE +201 -0
- package/README.md +183 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/agents/deep_agents.d.ts +78 -0
- package/dist/agents/deep_agents.d.ts.map +1 -0
- package/dist/agents/deep_agents.js +477 -0
- package/dist/agents/deep_agents.js.map +1 -0
- package/dist/agents/engine.d.ts +85 -0
- package/dist/agents/engine.d.ts.map +1 -0
- package/dist/agents/engine.js +129 -0
- package/dist/agents/engine.js.map +1 -0
- package/dist/agents/gateway_chat_model.d.ts +151 -0
- package/dist/agents/gateway_chat_model.d.ts.map +1 -0
- package/dist/agents/gateway_chat_model.js +350 -0
- package/dist/agents/gateway_chat_model.js.map +1 -0
- package/dist/agents/guardrail_middleware.d.ts +57 -0
- package/dist/agents/guardrail_middleware.d.ts.map +1 -0
- package/dist/agents/guardrail_middleware.js +85 -0
- package/dist/agents/guardrail_middleware.js.map +1 -0
- package/dist/agents/guardrails.d.ts +124 -0
- package/dist/agents/guardrails.d.ts.map +1 -0
- package/dist/agents/guardrails.js +336 -0
- package/dist/agents/guardrails.js.map +1 -0
- package/dist/agents/index.d.ts +15 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +15 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/ir.d.ts +144 -0
- package/dist/agents/ir.d.ts.map +1 -0
- package/dist/agents/ir.js +513 -0
- package/dist/agents/ir.js.map +1 -0
- package/dist/agents/loop.d.ts +145 -0
- package/dist/agents/loop.d.ts.map +1 -0
- package/dist/agents/loop.js +1025 -0
- package/dist/agents/loop.js.map +1 -0
- package/dist/agents/memory.d.ts +115 -0
- package/dist/agents/memory.d.ts.map +1 -0
- package/dist/agents/memory.js +258 -0
- package/dist/agents/memory.js.map +1 -0
- package/dist/agents/state.d.ts +137 -0
- package/dist/agents/state.d.ts.map +1 -0
- package/dist/agents/state.js +255 -0
- package/dist/agents/state.js.map +1 -0
- package/dist/concurrency.d.ts +36 -0
- package/dist/concurrency.d.ts.map +1 -0
- package/dist/concurrency.js +86 -0
- package/dist/concurrency.js.map +1 -0
- package/dist/control.d.ts +116 -0
- package/dist/control.d.ts.map +1 -0
- package/dist/control.js +281 -0
- package/dist/control.js.map +1 -0
- package/dist/cost.d.ts +95 -0
- package/dist/cost.d.ts.map +1 -0
- package/dist/cost.js +161 -0
- package/dist/cost.js.map +1 -0
- package/dist/errors.d.ts +213 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +316 -0
- package/dist/errors.js.map +1 -0
- package/dist/evals/dataset.d.ts +45 -0
- package/dist/evals/dataset.d.ts.map +1 -0
- package/dist/evals/dataset.js +147 -0
- package/dist/evals/dataset.js.map +1 -0
- package/dist/evals/gate.d.ts +236 -0
- package/dist/evals/gate.d.ts.map +1 -0
- package/dist/evals/gate.js +572 -0
- package/dist/evals/gate.js.map +1 -0
- package/dist/evals/metrics.d.ts +141 -0
- package/dist/evals/metrics.d.ts.map +1 -0
- package/dist/evals/metrics.js +364 -0
- package/dist/evals/metrics.js.map +1 -0
- package/dist/evals/predicate.d.ts +79 -0
- package/dist/evals/predicate.d.ts.map +1 -0
- package/dist/evals/predicate.js +178 -0
- package/dist/evals/predicate.js.map +1 -0
- package/dist/evals/runner.d.ts +94 -0
- package/dist/evals/runner.d.ts.map +1 -0
- package/dist/evals/runner.js +202 -0
- package/dist/evals/runner.js.map +1 -0
- package/dist/gateway.d.ts +118 -0
- package/dist/gateway.d.ts.map +1 -0
- package/dist/gateway.js +250 -0
- package/dist/gateway.js.map +1 -0
- package/dist/index.d.ts +83 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +59 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/json.d.ts +44 -0
- package/dist/internal/json.d.ts.map +1 -0
- package/dist/internal/json.js +90 -0
- package/dist/internal/json.js.map +1 -0
- package/dist/internal/text.d.ts +17 -0
- package/dist/internal/text.d.ts.map +1 -0
- package/dist/internal/text.js +22 -0
- package/dist/internal/text.js.map +1 -0
- package/dist/pipeline.d.ts +80 -0
- package/dist/pipeline.d.ts.map +1 -0
- package/dist/pipeline.js +159 -0
- package/dist/pipeline.js.map +1 -0
- package/dist/policy.d.ts +52 -0
- package/dist/policy.d.ts.map +1 -0
- package/dist/policy.js +199 -0
- package/dist/policy.js.map +1 -0
- package/dist/prompts.d.ts +86 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +337 -0
- package/dist/prompts.js.map +1 -0
- package/dist/providers/base.d.ts +19 -0
- package/dist/providers/base.d.ts.map +1 -0
- package/dist/providers/base.js +13 -0
- package/dist/providers/base.js.map +1 -0
- package/dist/providers/fake.d.ts +98 -0
- package/dist/providers/fake.d.ts.map +1 -0
- package/dist/providers/fake.js +181 -0
- package/dist/providers/fake.js.map +1 -0
- package/dist/providers/http.d.ts +62 -0
- package/dist/providers/http.d.ts.map +1 -0
- package/dist/providers/http.js +245 -0
- package/dist/providers/http.js.map +1 -0
- package/dist/retrieval/chunking.d.ts +88 -0
- package/dist/retrieval/chunking.d.ts.map +1 -0
- package/dist/retrieval/chunking.js +188 -0
- package/dist/retrieval/chunking.js.map +1 -0
- package/dist/retrieval/citations.d.ts +98 -0
- package/dist/retrieval/citations.d.ts.map +1 -0
- package/dist/retrieval/citations.js +134 -0
- package/dist/retrieval/citations.js.map +1 -0
- package/dist/retrieval/connectors.d.ts +74 -0
- package/dist/retrieval/connectors.d.ts.map +1 -0
- package/dist/retrieval/connectors.js +218 -0
- package/dist/retrieval/connectors.js.map +1 -0
- package/dist/retrieval/embedding.d.ts +116 -0
- package/dist/retrieval/embedding.d.ts.map +1 -0
- package/dist/retrieval/embedding.js +282 -0
- package/dist/retrieval/embedding.js.map +1 -0
- package/dist/retrieval/gate.d.ts +52 -0
- package/dist/retrieval/gate.d.ts.map +1 -0
- package/dist/retrieval/gate.js +91 -0
- package/dist/retrieval/gate.js.map +1 -0
- package/dist/retrieval/hybrid.d.ts +76 -0
- package/dist/retrieval/hybrid.d.ts.map +1 -0
- package/dist/retrieval/hybrid.js +150 -0
- package/dist/retrieval/hybrid.js.map +1 -0
- package/dist/retrieval/metrics.d.ts +126 -0
- package/dist/retrieval/metrics.d.ts.map +1 -0
- package/dist/retrieval/metrics.js +200 -0
- package/dist/retrieval/metrics.js.map +1 -0
- package/dist/retrieval/pgvector.d.ts +62 -0
- package/dist/retrieval/pgvector.d.ts.map +1 -0
- package/dist/retrieval/pgvector.js +262 -0
- package/dist/retrieval/pgvector.js.map +1 -0
- package/dist/retrieval/rerank.d.ts +61 -0
- package/dist/retrieval/rerank.d.ts.map +1 -0
- package/dist/retrieval/rerank.js +105 -0
- package/dist/retrieval/rerank.js.map +1 -0
- package/dist/retrieval/retriever.d.ts +125 -0
- package/dist/retrieval/retriever.d.ts.map +1 -0
- package/dist/retrieval/retriever.js +281 -0
- package/dist/retrieval/retriever.js.map +1 -0
- package/dist/retrieval/stores.d.ts +106 -0
- package/dist/retrieval/stores.d.ts.map +1 -0
- package/dist/retrieval/stores.js +142 -0
- package/dist/retrieval/stores.js.map +1 -0
- package/dist/retrieval/types.d.ts +314 -0
- package/dist/retrieval/types.d.ts.map +1 -0
- package/dist/retrieval/types.js +388 -0
- package/dist/retrieval/types.js.map +1 -0
- package/dist/steps.d.ts +156 -0
- package/dist/steps.d.ts.map +1 -0
- package/dist/steps.js +199 -0
- package/dist/steps.js.map +1 -0
- package/dist/structured.d.ts +91 -0
- package/dist/structured.d.ts.map +1 -0
- package/dist/structured.js +155 -0
- package/dist/structured.js.map +1 -0
- package/dist/tools.d.ts +100 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +201 -0
- package/dist/tools.js.map +1 -0
- package/dist/tracing.d.ts +104 -0
- package/dist/tracing.d.ts.map +1 -0
- package/dist/tracing.js +155 -0
- package/dist/tracing.js.map +1 -0
- package/dist/types.d.ts +240 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +357 -0
- package/dist/types.js.map +1 -0
- package/package.json +80 -14
|
@@ -0,0 +1,572 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* N-run sampling and the statistical baseline gate.
|
|
3
|
+
*
|
|
4
|
+
* The ratified Phase 0 decision is that gating uses **N-run sampling with statistical
|
|
5
|
+
* thresholds compared against a stored baseline**, in the `maxRegression` style --
|
|
6
|
+
* *not* strict equality. Non-determinism is expected and must not be treated as a bug.
|
|
7
|
+
*
|
|
8
|
+
* Concretely, for each metric we:
|
|
9
|
+
*
|
|
10
|
+
* 1. Run the dataset `runs` times, giving one mean score per run. Those means are the
|
|
11
|
+
* *sample*, and their spread is the honest measure of how much this system varies
|
|
12
|
+
* when nothing changed.
|
|
13
|
+
* 2. Compare the sample against a stored baseline (its own mean, spread and size).
|
|
14
|
+
* 3. Fail only when the drop exceeds `maxRegression` **and** that drop is larger than
|
|
15
|
+
* the standard error of the difference could explain, at the configured
|
|
16
|
+
* significance level.
|
|
17
|
+
*
|
|
18
|
+
* Step 3 is what makes the gate trustworthy in both directions. A gate that fires on
|
|
19
|
+
* any decrease is a flaky gate; a gate that only compares means can be fooled by a
|
|
20
|
+
* noisy run. Requiring both a material *and* a statistically distinguishable drop
|
|
21
|
+
* means the gate reports a regression when the evidence says there is one, and stays
|
|
22
|
+
* quiet otherwise.
|
|
23
|
+
*
|
|
24
|
+
* The z critical values are a table rather than a library call because adding a
|
|
25
|
+
* statistics dependency to enforce one one-sided test is not a trade worth making in a
|
|
26
|
+
* runtime that must stay small.
|
|
27
|
+
*
|
|
28
|
+
* ## Parity note
|
|
29
|
+
*
|
|
30
|
+
* The arithmetic here is a direct transcription of `aid_runtime.evals.gate`, including
|
|
31
|
+
* the z-critical table, the verdict ordering, and the six-decimal/four-decimal/three-
|
|
32
|
+
* decimal formatting of the rationales. Only the *inputs* differ between the two
|
|
33
|
+
* runtimes, because their fake providers draw their accuracy samples differently.
|
|
34
|
+
*/
|
|
35
|
+
import { readFileSync } from 'node:fs';
|
|
36
|
+
// biome-ignore lint/suspicious/noShadowRestrictedNames: the framework's own error name, matching the Python runtime's public surface
|
|
37
|
+
import { EvalError, GateConfigurationError } from '../errors.js';
|
|
38
|
+
import { repr } from '../internal/json.js';
|
|
39
|
+
/** One-sided z critical values, keyed by significance level. Ascending by level. */
|
|
40
|
+
const Z_CRITICAL_LEVELS = [
|
|
41
|
+
[0.005, 2.5758],
|
|
42
|
+
[0.01, 2.3263],
|
|
43
|
+
[0.025, 1.96],
|
|
44
|
+
[0.05, 1.6449],
|
|
45
|
+
[0.1, 1.2816],
|
|
46
|
+
[0.2, 0.8416],
|
|
47
|
+
];
|
|
48
|
+
/**
|
|
49
|
+
* The one-sided z critical value at `alpha`, rounded to a stricter level.
|
|
50
|
+
*
|
|
51
|
+
* `alpha` is rounded to the next *stricter* tabulated level -- a smaller alpha, hence a
|
|
52
|
+
* larger z, hence a gate that demands slightly more evidence than asked for. That is
|
|
53
|
+
* the safe direction for a regression gate: a gate that fires on borderline evidence
|
|
54
|
+
* is a gate that gets switched off. An `alpha` below the strictest tabulated level
|
|
55
|
+
* gets the strictest value, for the same reason.
|
|
56
|
+
*/
|
|
57
|
+
export function zCritical(alpha) {
|
|
58
|
+
if (!(alpha > 0.0 && alpha < 1.0))
|
|
59
|
+
throw new RangeError('alpha must be between 0 and 1');
|
|
60
|
+
let chosen;
|
|
61
|
+
for (const [level, z] of Z_CRITICAL_LEVELS) {
|
|
62
|
+
if (level <= alpha)
|
|
63
|
+
chosen = z;
|
|
64
|
+
}
|
|
65
|
+
return chosen ?? Z_CRITICAL_LEVELS[0]?.[1] ?? 2.5758;
|
|
66
|
+
}
|
|
67
|
+
function mean(values) {
|
|
68
|
+
let total = 0;
|
|
69
|
+
for (const value of values)
|
|
70
|
+
total += value;
|
|
71
|
+
return total / values.length;
|
|
72
|
+
}
|
|
73
|
+
/** Sample standard deviation over `n - 1`; zero for a single observation. */
|
|
74
|
+
function stdev(values) {
|
|
75
|
+
if (values.length <= 1)
|
|
76
|
+
return 0.0;
|
|
77
|
+
const average = mean(values);
|
|
78
|
+
let squared = 0;
|
|
79
|
+
for (const value of values)
|
|
80
|
+
squared += (value - average) ** 2;
|
|
81
|
+
return Math.sqrt(squared / (values.length - 1));
|
|
82
|
+
}
|
|
83
|
+
function fixed(value, digits) {
|
|
84
|
+
if (Number.isNaN(value))
|
|
85
|
+
return 'nan';
|
|
86
|
+
if (value === Number.POSITIVE_INFINITY)
|
|
87
|
+
return 'inf';
|
|
88
|
+
if (value === Number.NEGATIVE_INFINITY)
|
|
89
|
+
return '-inf';
|
|
90
|
+
return value.toFixed(digits);
|
|
91
|
+
}
|
|
92
|
+
function signed(value, digits) {
|
|
93
|
+
const negative = value < 0 || Object.is(value, -0);
|
|
94
|
+
return `${negative ? '-' : '+'}${Math.abs(value).toFixed(digits)}`;
|
|
95
|
+
}
|
|
96
|
+
/** A quantised number, so a JSON round-trip is byte-stable. */
|
|
97
|
+
function quantise(value) {
|
|
98
|
+
return Number(value.toFixed(12));
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* One-sided z for "the current mean is lower than the baseline mean".
|
|
102
|
+
*
|
|
103
|
+
* Uses the standard error of the difference of two means, so *both* spreads
|
|
104
|
+
* contribute: a noisy baseline is a weak claim to regress against, and the gate should
|
|
105
|
+
* demand more evidence before rejecting it.
|
|
106
|
+
*/
|
|
107
|
+
export function regressionZ(init) {
|
|
108
|
+
const standardError = Math.sqrt(init.currentStdev ** 2 / Math.max(init.currentN, 1) +
|
|
109
|
+
init.baselineStdev ** 2 / Math.max(init.baselineN, 1));
|
|
110
|
+
if (standardError <= 0.0) {
|
|
111
|
+
// Both distributions are degenerate: any drop is real, so report an arbitrarily
|
|
112
|
+
// large statistic rather than dividing by zero.
|
|
113
|
+
return init.currentMean < init.baselineMean ? Number.POSITIVE_INFINITY : 0.0;
|
|
114
|
+
}
|
|
115
|
+
return (init.baselineMean - init.currentMean) / standardError;
|
|
116
|
+
}
|
|
117
|
+
/** Per-run, per-metric means: one value per run of the dataset. */
|
|
118
|
+
export class MetricRun {
|
|
119
|
+
metric;
|
|
120
|
+
values;
|
|
121
|
+
constructor(init) {
|
|
122
|
+
if (init.values.length === 0)
|
|
123
|
+
throw new RangeError('a metric run needs at least one value');
|
|
124
|
+
this.metric = init.metric;
|
|
125
|
+
this.values = [...init.values];
|
|
126
|
+
}
|
|
127
|
+
toJSON() {
|
|
128
|
+
return { metric: this.metric, values: [...this.values] };
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/** The sampled result of running a dataset N times. */
|
|
132
|
+
export class EvalRun {
|
|
133
|
+
dataset;
|
|
134
|
+
datasetVersion;
|
|
135
|
+
runs;
|
|
136
|
+
metrics;
|
|
137
|
+
constructor(init) {
|
|
138
|
+
if (!Number.isInteger(init.runs) || init.runs <= 0) {
|
|
139
|
+
throw new RangeError('runs must be a positive integer');
|
|
140
|
+
}
|
|
141
|
+
if (init.metrics.length === 0)
|
|
142
|
+
throw new RangeError('an eval run needs at least one metric');
|
|
143
|
+
this.dataset = init.dataset;
|
|
144
|
+
this.datasetVersion = init.datasetVersion;
|
|
145
|
+
this.runs = init.runs;
|
|
146
|
+
this.metrics = init.metrics;
|
|
147
|
+
}
|
|
148
|
+
means() {
|
|
149
|
+
const out = {};
|
|
150
|
+
for (const entry of this.metrics)
|
|
151
|
+
out[entry.metric] = mean(entry.values);
|
|
152
|
+
return out;
|
|
153
|
+
}
|
|
154
|
+
spread() {
|
|
155
|
+
const out = {};
|
|
156
|
+
for (const entry of this.metrics)
|
|
157
|
+
out[entry.metric] = stdev(entry.values);
|
|
158
|
+
return out;
|
|
159
|
+
}
|
|
160
|
+
valuesFor(metric) {
|
|
161
|
+
for (const entry of this.metrics) {
|
|
162
|
+
if (entry.metric === metric)
|
|
163
|
+
return entry.values;
|
|
164
|
+
}
|
|
165
|
+
throw new EvalError(`metric ${repr(metric)} is not in this run`);
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Whether any metric produced different scores across runs.
|
|
169
|
+
*
|
|
170
|
+
* Exposed because "the run varied" is a *fact about the system*, not a failure: a
|
|
171
|
+
* test asserts on it to prove the gate tolerates noise rather than assuming a
|
|
172
|
+
* deterministic system.
|
|
173
|
+
*/
|
|
174
|
+
isVarying() {
|
|
175
|
+
return this.metrics.some((entry) => new Set(entry.values).size > 1);
|
|
176
|
+
}
|
|
177
|
+
toJson() {
|
|
178
|
+
const payload = {
|
|
179
|
+
dataset: this.dataset,
|
|
180
|
+
dataset_version: this.datasetVersion,
|
|
181
|
+
runs: this.runs,
|
|
182
|
+
metrics: this.metrics.map((entry) => entry.toJSON()),
|
|
183
|
+
};
|
|
184
|
+
return JSON.stringify(payload, null, 2);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
/** A stored metric distribution, recorded from a run that was accepted. */
|
|
188
|
+
export class MetricBaseline {
|
|
189
|
+
metric;
|
|
190
|
+
runs;
|
|
191
|
+
mean;
|
|
192
|
+
stdev;
|
|
193
|
+
constructor(init) {
|
|
194
|
+
if (!Number.isInteger(init.runs) || init.runs <= 0) {
|
|
195
|
+
throw new RangeError('runs must be a positive integer');
|
|
196
|
+
}
|
|
197
|
+
if (!(init.mean >= 0.0 && init.mean <= 1.0)) {
|
|
198
|
+
throw new RangeError('mean must be between 0 and 1');
|
|
199
|
+
}
|
|
200
|
+
if (!(init.stdev >= 0.0))
|
|
201
|
+
throw new RangeError('stdev must be non-negative');
|
|
202
|
+
this.metric = init.metric;
|
|
203
|
+
this.runs = init.runs;
|
|
204
|
+
this.mean = init.mean;
|
|
205
|
+
this.stdev = init.stdev;
|
|
206
|
+
}
|
|
207
|
+
static fromValues(metric, values) {
|
|
208
|
+
return new MetricBaseline({
|
|
209
|
+
metric,
|
|
210
|
+
runs: values.length,
|
|
211
|
+
mean: mean(values),
|
|
212
|
+
stdev: stdev(values),
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
toJSON() {
|
|
216
|
+
return {
|
|
217
|
+
metric: this.metric,
|
|
218
|
+
runs: this.runs,
|
|
219
|
+
mean: quantise(this.mean),
|
|
220
|
+
stdev: quantise(this.stdev),
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
function readNumber(record, ...keys) {
|
|
225
|
+
for (const key of keys) {
|
|
226
|
+
const value = record[key];
|
|
227
|
+
if (typeof value === 'number')
|
|
228
|
+
return value;
|
|
229
|
+
}
|
|
230
|
+
throw new EvalError(`a baseline entry is missing ${repr(keys[0] ?? '')}`);
|
|
231
|
+
}
|
|
232
|
+
function readString(record, ...keys) {
|
|
233
|
+
for (const key of keys) {
|
|
234
|
+
const value = record[key];
|
|
235
|
+
if (typeof value === 'string')
|
|
236
|
+
return value;
|
|
237
|
+
}
|
|
238
|
+
throw new EvalError(`a baseline is missing ${repr(keys[0] ?? '')}`);
|
|
239
|
+
}
|
|
240
|
+
function isObject(value) {
|
|
241
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
242
|
+
}
|
|
243
|
+
/** A committed baseline: the accepted distribution for a dataset and model. */
|
|
244
|
+
export class EvalBaseline {
|
|
245
|
+
dataset;
|
|
246
|
+
datasetVersion;
|
|
247
|
+
model;
|
|
248
|
+
metrics;
|
|
249
|
+
note;
|
|
250
|
+
constructor(init) {
|
|
251
|
+
if (init.metrics.length === 0)
|
|
252
|
+
throw new RangeError('a baseline needs at least one metric');
|
|
253
|
+
this.dataset = init.dataset;
|
|
254
|
+
this.datasetVersion = init.datasetVersion;
|
|
255
|
+
this.model = init.model;
|
|
256
|
+
this.metrics = init.metrics;
|
|
257
|
+
this.note = init.note ?? '';
|
|
258
|
+
}
|
|
259
|
+
static fromRun(run, options) {
|
|
260
|
+
return new EvalBaseline({
|
|
261
|
+
dataset: run.dataset,
|
|
262
|
+
datasetVersion: run.datasetVersion,
|
|
263
|
+
model: options.model,
|
|
264
|
+
metrics: run.metrics.map((entry) => MetricBaseline.fromValues(entry.metric, entry.values)),
|
|
265
|
+
note: options.note ?? '',
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
metric(name) {
|
|
269
|
+
for (const entry of this.metrics) {
|
|
270
|
+
if (entry.metric === name)
|
|
271
|
+
return entry;
|
|
272
|
+
}
|
|
273
|
+
throw new EvalError(`baseline has no metric ${repr(name)}`);
|
|
274
|
+
}
|
|
275
|
+
/** Parse a committed baseline. Accepts `snake_case` and `camelCase` keys. */
|
|
276
|
+
static fromJson(payload) {
|
|
277
|
+
let parsed;
|
|
278
|
+
try {
|
|
279
|
+
parsed = JSON.parse(payload);
|
|
280
|
+
}
|
|
281
|
+
catch (error) {
|
|
282
|
+
throw new EvalError(`a baseline must be JSON: ${error instanceof Error ? error.message : String(error)}`);
|
|
283
|
+
}
|
|
284
|
+
if (!isObject(parsed))
|
|
285
|
+
throw new EvalError('a baseline must be a JSON object');
|
|
286
|
+
const rawMetrics = parsed.metrics;
|
|
287
|
+
if (!Array.isArray(rawMetrics) || rawMetrics.length === 0) {
|
|
288
|
+
throw new EvalError('a baseline needs at least one metric');
|
|
289
|
+
}
|
|
290
|
+
return new EvalBaseline({
|
|
291
|
+
dataset: readString(parsed, 'dataset'),
|
|
292
|
+
datasetVersion: readString(parsed, 'dataset_version', 'datasetVersion'),
|
|
293
|
+
model: readString(parsed, 'model'),
|
|
294
|
+
metrics: rawMetrics.map((entry) => {
|
|
295
|
+
if (!isObject(entry))
|
|
296
|
+
throw new EvalError('a baseline metric must be an object');
|
|
297
|
+
return new MetricBaseline({
|
|
298
|
+
metric: readString(entry, 'metric'),
|
|
299
|
+
runs: readNumber(entry, 'runs'),
|
|
300
|
+
mean: readNumber(entry, 'mean'),
|
|
301
|
+
stdev: readNumber(entry, 'stdev'),
|
|
302
|
+
});
|
|
303
|
+
}),
|
|
304
|
+
note: typeof parsed.note === 'string' ? parsed.note : '',
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
static fromPath(path) {
|
|
308
|
+
return EvalBaseline.fromJson(readFileSync(path, 'utf8'));
|
|
309
|
+
}
|
|
310
|
+
toJson() {
|
|
311
|
+
const payload = {
|
|
312
|
+
dataset: this.dataset,
|
|
313
|
+
dataset_version: this.datasetVersion,
|
|
314
|
+
model: this.model,
|
|
315
|
+
metrics: this.metrics.map((entry) => entry.toJSON()),
|
|
316
|
+
note: this.note,
|
|
317
|
+
};
|
|
318
|
+
return `${JSON.stringify(payload, null, 2)}\n`;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
/** The acceptance rule for one metric. */
|
|
322
|
+
export class Threshold {
|
|
323
|
+
metric;
|
|
324
|
+
/**
|
|
325
|
+
* Absolute floor on the mean. Independent of the baseline: it says what "good
|
|
326
|
+
* enough" means, which no comparison to a past run can express.
|
|
327
|
+
*/
|
|
328
|
+
minMean;
|
|
329
|
+
/** Largest mean drop, versus the baseline, still considered acceptable. */
|
|
330
|
+
maxRegression;
|
|
331
|
+
/** Significance level for the one-sided regression test. */
|
|
332
|
+
alpha;
|
|
333
|
+
constructor(init) {
|
|
334
|
+
if (init.metric.length === 0)
|
|
335
|
+
throw new RangeError('threshold metric must not be empty');
|
|
336
|
+
const minMean = init.minMean ?? null;
|
|
337
|
+
if (minMean !== null && !(minMean >= 0.0 && minMean <= 1.0)) {
|
|
338
|
+
throw new RangeError('minMean must be between 0 and 1');
|
|
339
|
+
}
|
|
340
|
+
const maxRegression = init.maxRegression ?? 0.02;
|
|
341
|
+
if (!(maxRegression >= 0.0 && maxRegression <= 1.0)) {
|
|
342
|
+
throw new RangeError('maxRegression must be between 0 and 1');
|
|
343
|
+
}
|
|
344
|
+
const alpha = init.alpha ?? 0.05;
|
|
345
|
+
if (!(alpha > 0.0 && alpha < 1.0))
|
|
346
|
+
throw new RangeError('alpha must be between 0 and 1');
|
|
347
|
+
this.metric = init.metric;
|
|
348
|
+
this.minMean = minMean;
|
|
349
|
+
this.maxRegression = maxRegression;
|
|
350
|
+
this.alpha = alpha;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
/** Why one metric passed or failed. The rationale is the product. */
|
|
354
|
+
export class MetricGateResult {
|
|
355
|
+
metric;
|
|
356
|
+
passed;
|
|
357
|
+
currentMean;
|
|
358
|
+
currentStdev;
|
|
359
|
+
baselineMean;
|
|
360
|
+
baselineStdev;
|
|
361
|
+
delta;
|
|
362
|
+
z;
|
|
363
|
+
alpha;
|
|
364
|
+
maxRegression;
|
|
365
|
+
rationale;
|
|
366
|
+
constructor(init) {
|
|
367
|
+
this.metric = init.metric;
|
|
368
|
+
this.passed = init.passed;
|
|
369
|
+
this.currentMean = init.currentMean;
|
|
370
|
+
this.currentStdev = init.currentStdev;
|
|
371
|
+
this.baselineMean = init.baselineMean;
|
|
372
|
+
this.baselineStdev = init.baselineStdev;
|
|
373
|
+
this.delta = init.delta;
|
|
374
|
+
this.z = init.z;
|
|
375
|
+
this.alpha = init.alpha;
|
|
376
|
+
this.maxRegression = init.maxRegression;
|
|
377
|
+
this.rationale = init.rationale;
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
/** The gate's verdict over every metric. */
|
|
381
|
+
export class GateResult {
|
|
382
|
+
passed;
|
|
383
|
+
dataset;
|
|
384
|
+
datasetVersion;
|
|
385
|
+
runs;
|
|
386
|
+
results;
|
|
387
|
+
varying;
|
|
388
|
+
constructor(init) {
|
|
389
|
+
if (init.results.length === 0)
|
|
390
|
+
throw new RangeError('a gate result needs at least one metric');
|
|
391
|
+
this.passed = init.passed;
|
|
392
|
+
this.dataset = init.dataset;
|
|
393
|
+
this.datasetVersion = init.datasetVersion;
|
|
394
|
+
this.runs = init.runs;
|
|
395
|
+
this.results = init.results;
|
|
396
|
+
this.varying = init.varying ?? false;
|
|
397
|
+
}
|
|
398
|
+
failures() {
|
|
399
|
+
return this.results.filter((result) => !result.passed);
|
|
400
|
+
}
|
|
401
|
+
summary() {
|
|
402
|
+
const verdict = this.passed ? 'PASSED' : 'FAILED';
|
|
403
|
+
const varied = this.varying ? 'yes' : 'no';
|
|
404
|
+
const lines = [
|
|
405
|
+
`eval gate ${verdict} (${this.dataset}@${this.datasetVersion}, ${this.runs} runs, run-to-run variation: ${varied})`,
|
|
406
|
+
];
|
|
407
|
+
for (const result of this.results) {
|
|
408
|
+
lines.push(` [${result.passed ? 'ok ' : 'FAIL'}] ${result.rationale}`);
|
|
409
|
+
}
|
|
410
|
+
return lines.join('\n');
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
/** Compares a sampled run against a stored baseline. */
|
|
414
|
+
export class BaselineGate {
|
|
415
|
+
_thresholds;
|
|
416
|
+
_metrics;
|
|
417
|
+
_allowNondeterministic;
|
|
418
|
+
constructor(thresholds, options = {}) {
|
|
419
|
+
if (thresholds.length === 0) {
|
|
420
|
+
throw new GateConfigurationError('the gate needs at least one threshold');
|
|
421
|
+
}
|
|
422
|
+
const names = thresholds.map((threshold) => threshold.metric);
|
|
423
|
+
const duplicates = [
|
|
424
|
+
...new Set(names.filter((name) => names.filter((n) => n === name).length > 1)),
|
|
425
|
+
].sort();
|
|
426
|
+
if (duplicates.length > 0) {
|
|
427
|
+
throw new GateConfigurationError(`duplicate thresholds for: ${duplicates.join(', ')}`);
|
|
428
|
+
}
|
|
429
|
+
this._thresholds = thresholds;
|
|
430
|
+
this._metrics = new Map((options.metrics ?? []).map((metric) => [metric.name, metric]));
|
|
431
|
+
this._allowNondeterministic = options.allowNondeterministic ?? false;
|
|
432
|
+
this.checkMetricEligibility();
|
|
433
|
+
}
|
|
434
|
+
get thresholds() {
|
|
435
|
+
return this._thresholds;
|
|
436
|
+
}
|
|
437
|
+
/** Decide whether `run` regressed against `baseline`. */
|
|
438
|
+
evaluate(run, baseline) {
|
|
439
|
+
if (run.dataset !== baseline.dataset || run.datasetVersion !== baseline.datasetVersion) {
|
|
440
|
+
throw new EvalError(`baseline was recorded on ${baseline.dataset}@${baseline.datasetVersion} but the ` +
|
|
441
|
+
`run is ${run.dataset}@${run.datasetVersion}; compare like with like`);
|
|
442
|
+
}
|
|
443
|
+
const results = this._thresholds.map((threshold) => this.evaluateMetric(threshold, run, baseline));
|
|
444
|
+
return new GateResult({
|
|
445
|
+
passed: results.every((result) => result.passed),
|
|
446
|
+
dataset: run.dataset,
|
|
447
|
+
datasetVersion: run.datasetVersion,
|
|
448
|
+
runs: run.runs,
|
|
449
|
+
results,
|
|
450
|
+
varying: run.isVarying(),
|
|
451
|
+
});
|
|
452
|
+
}
|
|
453
|
+
evaluateMetric(threshold, run, baseline) {
|
|
454
|
+
const values = run.valuesFor(threshold.metric);
|
|
455
|
+
const stored = baseline.metric(threshold.metric);
|
|
456
|
+
const currentMean = mean(values);
|
|
457
|
+
const currentStdev = stdev(values);
|
|
458
|
+
const delta = stored.mean - currentMean;
|
|
459
|
+
const z = regressionZ({
|
|
460
|
+
currentMean,
|
|
461
|
+
currentStdev,
|
|
462
|
+
currentN: values.length,
|
|
463
|
+
baselineMean: stored.mean,
|
|
464
|
+
baselineStdev: stored.stdev,
|
|
465
|
+
baselineN: stored.runs,
|
|
466
|
+
});
|
|
467
|
+
const verdict = this.verdict(threshold, currentMean, stored, delta, z);
|
|
468
|
+
return new MetricGateResult({
|
|
469
|
+
metric: threshold.metric,
|
|
470
|
+
passed: verdict.passed,
|
|
471
|
+
currentMean,
|
|
472
|
+
currentStdev,
|
|
473
|
+
baselineMean: stored.mean,
|
|
474
|
+
baselineStdev: stored.stdev,
|
|
475
|
+
delta,
|
|
476
|
+
z,
|
|
477
|
+
alpha: threshold.alpha,
|
|
478
|
+
maxRegression: threshold.maxRegression,
|
|
479
|
+
rationale: verdict.rationale,
|
|
480
|
+
});
|
|
481
|
+
}
|
|
482
|
+
/**
|
|
483
|
+
* The pass/fail call and the sentence explaining it.
|
|
484
|
+
*
|
|
485
|
+
* Three ways to pass, and the distinction between them is the whole point: no floor
|
|
486
|
+
* breached, no material drop, or a drop that is material but within what the two
|
|
487
|
+
* runs' own variation can explain. Only a drop that is both material *and* beyond the
|
|
488
|
+
* noise threshold counts as a regression.
|
|
489
|
+
*/
|
|
490
|
+
verdict(threshold, currentMean, stored, delta, z) {
|
|
491
|
+
const where = `${threshold.metric}: mean ${fixed(currentMean, 4)} vs baseline ${fixed(stored.mean, 4)}`;
|
|
492
|
+
if (threshold.minMean !== null && currentMean < threshold.minMean) {
|
|
493
|
+
return {
|
|
494
|
+
passed: false,
|
|
495
|
+
rationale: `${threshold.metric}: mean ${fixed(currentMean, 4)} is below the absolute floor ` +
|
|
496
|
+
`${fixed(threshold.minMean, 4)} (baseline ${fixed(stored.mean, 4)})`,
|
|
497
|
+
};
|
|
498
|
+
}
|
|
499
|
+
if (delta <= threshold.maxRegression) {
|
|
500
|
+
return {
|
|
501
|
+
passed: true,
|
|
502
|
+
rationale: `${where} -- delta ${signed(delta, 4)} is within max_regression ${fixed(threshold.maxRegression, 4)}`,
|
|
503
|
+
};
|
|
504
|
+
}
|
|
505
|
+
const critical = zCritical(threshold.alpha);
|
|
506
|
+
if (z <= critical) {
|
|
507
|
+
return {
|
|
508
|
+
passed: true,
|
|
509
|
+
rationale: `${where} -- delta ${signed(delta, 4)} exceeds max_regression but z=${fixed(z, 3)} is not ` +
|
|
510
|
+
`beyond ${fixed(critical, 3)} at alpha=${threshold.alpha}; consistent with run-to-run noise`,
|
|
511
|
+
};
|
|
512
|
+
}
|
|
513
|
+
return {
|
|
514
|
+
passed: false,
|
|
515
|
+
rationale: `${where} -- delta ${signed(delta, 4)} exceeds max_regression ` +
|
|
516
|
+
`${fixed(threshold.maxRegression, 4)} and z=${fixed(z, 3)} > ${fixed(critical, 3)} ` +
|
|
517
|
+
`at alpha=${threshold.alpha}`,
|
|
518
|
+
};
|
|
519
|
+
}
|
|
520
|
+
/**
|
|
521
|
+
* Refuse thresholds that a non-deterministic metric would undermine.
|
|
522
|
+
*
|
|
523
|
+
* The rule is enforced here, at construction, rather than documented and hoped for: a
|
|
524
|
+
* gate configured on a model-backed metric is not a gate, and refusing at
|
|
525
|
+
* configuration time is the only moment that is cheap to fix.
|
|
526
|
+
*/
|
|
527
|
+
checkMetricEligibility() {
|
|
528
|
+
if (this._allowNondeterministic)
|
|
529
|
+
return;
|
|
530
|
+
const offending = this._thresholds
|
|
531
|
+
.map((threshold) => threshold.metric)
|
|
532
|
+
.filter((name) => {
|
|
533
|
+
const metric = this._metrics.get(name);
|
|
534
|
+
return metric !== undefined && !metric.deterministic;
|
|
535
|
+
})
|
|
536
|
+
.sort();
|
|
537
|
+
if (offending.length > 0) {
|
|
538
|
+
throw new GateConfigurationError(`thresholds reference non-deterministic metric(s): ${offending.join(', ')}. ` +
|
|
539
|
+
'A model-backed metric varies run to run, so it cannot distinguish a regression ' +
|
|
540
|
+
'from its own noise; keep it as a reported metric and gate on a deterministic one. ' +
|
|
541
|
+
'Pass allowNondeterministic: true only for local exploration, never in CI.');
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
/** Build a gate from parsed JSON/YAML, so CI config stays declarative. */
|
|
546
|
+
export function gateFromConfig(config, options = {}) {
|
|
547
|
+
const raw = config.thresholds;
|
|
548
|
+
if (!Array.isArray(raw))
|
|
549
|
+
throw new GateConfigurationError("config needs a 'thresholds' list");
|
|
550
|
+
return new BaselineGate(raw.map((entry) => {
|
|
551
|
+
if (!isObject(entry))
|
|
552
|
+
throw new GateConfigurationError('a threshold must be an object');
|
|
553
|
+
return new Threshold({
|
|
554
|
+
metric: String(entry.metric ?? ''),
|
|
555
|
+
minMean: typeof entry.min_mean === 'number'
|
|
556
|
+
? entry.min_mean
|
|
557
|
+
: typeof entry.minMean === 'number'
|
|
558
|
+
? entry.minMean
|
|
559
|
+
: null,
|
|
560
|
+
maxRegression: typeof entry.max_regression === 'number'
|
|
561
|
+
? entry.max_regression
|
|
562
|
+
: typeof entry.maxRegression === 'number'
|
|
563
|
+
? entry.maxRegression
|
|
564
|
+
: undefined,
|
|
565
|
+
alpha: typeof entry.alpha === 'number' ? entry.alpha : undefined,
|
|
566
|
+
});
|
|
567
|
+
}), {
|
|
568
|
+
metrics: options.metrics ?? [],
|
|
569
|
+
allowNondeterministic: Boolean(config.allow_nondeterministic ?? config.allowNondeterministic),
|
|
570
|
+
});
|
|
571
|
+
}
|
|
572
|
+
//# sourceMappingURL=gate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gate.js","sourceRoot":"","sources":["../../src/evals/gate.ts"],"names":[],"mappings":"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"}
|