@crowandraven/evalkeeper 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/LICENSE +21 -0
- package/README.md +6 -2
- package/bin/evalkeeper.mjs +9 -0
- package/dist/attention.d.ts +49 -0
- package/dist/attention.js +49 -0
- package/dist/attention.js.map +1 -0
- package/dist/board.d.ts +57 -0
- package/dist/board.js +2 -0
- package/dist/board.js.map +1 -0
- package/dist/cli/addPages.d.ts +79 -0
- package/dist/cli/addPages.js +181 -0
- package/dist/cli/addPages.js.map +1 -0
- package/dist/cli/main.d.ts +18 -0
- package/dist/cli/main.js +115 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/common.d.ts +72 -0
- package/dist/common.js +276 -0
- package/dist/common.js.map +1 -0
- package/dist/compare.d.ts +85 -0
- package/dist/compare.js +185 -0
- package/dist/compare.js.map +1 -0
- package/dist/decisions.d.ts +84 -0
- package/dist/decisions.js +146 -0
- package/dist/decisions.js.map +1 -0
- package/dist/feedback.d.ts +114 -0
- package/dist/feedback.js +116 -0
- package/dist/feedback.js.map +1 -0
- package/dist/format.d.ts +6 -0
- package/dist/format.js +22 -0
- package/dist/format.js.map +1 -0
- package/dist/glossary.d.ts +46 -0
- package/dist/glossary.js +45 -0
- package/dist/glossary.js.map +1 -0
- package/dist/health.d.ts +40 -0
- package/dist/health.js +101 -0
- package/dist/health.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/labels.d.ts +8 -0
- package/dist/labels.js +15 -0
- package/dist/labels.js.map +1 -0
- package/dist/legs.d.ts +23 -0
- package/dist/legs.js +22 -0
- package/dist/legs.js.map +1 -0
- package/dist/memoryStore.d.ts +21 -0
- package/dist/memoryStore.js +228 -0
- package/dist/memoryStore.js.map +1 -0
- package/dist/models.d.ts +76 -0
- package/dist/models.js +56 -0
- package/dist/models.js.map +1 -0
- package/dist/prune.d.ts +48 -0
- package/dist/prune.js +77 -0
- package/dist/prune.js.map +1 -0
- package/dist/quickSet.d.ts +26 -0
- package/dist/quickSet.js +44 -0
- package/dist/quickSet.js.map +1 -0
- package/dist/runner.d.ts +202 -0
- package/dist/runner.js +734 -0
- package/dist/runner.js.map +1 -0
- package/dist/settings.d.ts +196 -0
- package/dist/settings.js +272 -0
- package/dist/settings.js.map +1 -0
- package/dist/stableJson.d.ts +11 -0
- package/dist/stableJson.js +15 -0
- package/dist/stableJson.js.map +1 -0
- package/dist/stats.d.ts +98 -0
- package/dist/stats.js +119 -0
- package/dist/stats.js.map +1 -0
- package/dist/store.d.ts +151 -0
- package/dist/store.js +3 -0
- package/dist/store.js.map +1 -0
- package/dist/suggest.d.ts +75 -0
- package/dist/suggest.js +152 -0
- package/dist/suggest.js.map +1 -0
- package/dist/summary.d.ts +51 -0
- package/dist/summary.js +61 -0
- package/dist/summary.js.map +1 -0
- package/dist/testing.d.ts +26 -0
- package/dist/testing.js +362 -0
- package/dist/testing.js.map +1 -0
- package/dist/timeout.d.ts +2 -0
- package/dist/timeout.js +15 -0
- package/dist/timeout.js.map +1 -0
- package/dist/types.d.ts +225 -0
- package/dist/types.js +46 -0
- package/dist/types.js.map +1 -0
- package/dist/upkeepRules.d.ts +28 -0
- package/dist/upkeepRules.js +40 -0
- package/dist/upkeepRules.js.map +1 -0
- package/dist/util.d.ts +8 -0
- package/dist/util.js +18 -0
- package/dist/util.js.map +1 -0
- package/dist/weekly.d.ts +80 -0
- package/dist/weekly.js +113 -0
- package/dist/weekly.js.map +1 -0
- package/package.json +81 -4
- package/src/attention.ts +89 -0
- package/src/board.ts +58 -0
- package/src/cli/addPages.ts +256 -0
- package/src/cli/main.ts +125 -0
- package/src/common.ts +338 -0
- package/src/compare.ts +261 -0
- package/src/decisions.ts +230 -0
- package/src/feedback.ts +225 -0
- package/src/format.ts +19 -0
- package/src/glossary.ts +75 -0
- package/src/health.ts +149 -0
- package/src/index.ts +33 -0
- package/src/labels.ts +18 -0
- package/src/legs.ts +38 -0
- package/src/memoryStore.ts +268 -0
- package/src/models.ts +127 -0
- package/src/prune.ts +95 -0
- package/src/quickSet.ts +55 -0
- package/src/runner.ts +1010 -0
- package/src/settings.ts +441 -0
- package/src/stableJson.ts +24 -0
- package/src/stats.ts +215 -0
- package/src/store.ts +172 -0
- package/src/suggest.ts +247 -0
- package/src/summary.ts +109 -0
- package/src/testing.ts +415 -0
- package/src/timeout.ts +14 -0
- package/src/types.ts +258 -0
- package/src/upkeepRules.ts +46 -0
- package/src/util.ts +17 -0
- package/src/weekly.ts +169 -0
- package/starter/index.ts +86 -0
- package/templates/app/api/cron/evals-weekly/route.ts +24 -0
- package/templates/app/evals/[suite]/page.tsx +449 -0
- package/templates/app/evals/[suite]/runs/[runId]/page.tsx +95 -0
- package/templates/app/evals/feedback/page.tsx +219 -0
- package/templates/app/evals/page.tsx +313 -0
- package/templates/components/evalkeeper/AddCase.tsx +62 -0
- package/templates/components/evalkeeper/AnswerKey.tsx +360 -0
- package/templates/components/evalkeeper/CaseMenu.tsx +122 -0
- package/templates/components/evalkeeper/Fields.tsx +110 -0
- package/templates/components/evalkeeper/RefreshWhile.tsx +25 -0
- package/templates/components/evalkeeper/SettingsHistory.tsx +191 -0
- package/templates/components/evalkeeper/Submit.tsx +58 -0
- package/templates/components/evalkeeper/Thumbs.tsx +117 -0
- package/templates/components/evalkeeper/Tip.tsx +98 -0
- package/templates/components/evalkeeper/WeeklyCheck.tsx +124 -0
- package/templates/components/evalkeeper/evalkeeper.css +71 -0
- package/templates/components/evalkeeper/ui.tsx +103 -0
- package/templates/lib/evalkeeper/actions.ts +263 -0
- package/templates/lib/evalkeeper/cronAuth.ts +18 -0
- package/templates/lib/evalkeeper/paths.ts +11 -0
- package/templates/lib/evalkeeper/time.ts +4 -0
- package/templates/lib/evalkeeper/weekly.ts +51 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { SuiteMetrics } from "./stats.js";
|
|
2
|
+
import type { CheckDef } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* A test result in plain words, for people who don't want the statistics:
|
|
5
|
+
* how many answers were fully right, how far to trust that, and the most
|
|
6
|
+
* common problems. Pure.
|
|
7
|
+
*/
|
|
8
|
+
/** A check that failed, and how often. */
|
|
9
|
+
export type Problem = {
|
|
10
|
+
key: string;
|
|
11
|
+
label: string;
|
|
12
|
+
failed: number;
|
|
13
|
+
of: number;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* A test in plain words: answers right, how far to trust that, and the common problems.
|
|
17
|
+
*/
|
|
18
|
+
export type Summary = {
|
|
19
|
+
right: number;
|
|
20
|
+
total: number;
|
|
21
|
+
/** One sentence on how much the number can be trusted. */
|
|
22
|
+
trust: string;
|
|
23
|
+
/** Checks that failed at least once, most failures first. */
|
|
24
|
+
problems: Problem[];
|
|
25
|
+
};
|
|
26
|
+
/** Below this many answers the number is mostly noise. */
|
|
27
|
+
export declare const TRUST_MIN = 10;
|
|
28
|
+
/**
|
|
29
|
+
* A test's result in plain words, for people who don't want the statistics.
|
|
30
|
+
*/
|
|
31
|
+
export declare function summarize(m: SuiteMetrics, checks: CheckDef[]): Summary;
|
|
32
|
+
/**
|
|
33
|
+
* How far a score on this many cases can be trusted, and how far off it could be.
|
|
34
|
+
*/
|
|
35
|
+
export type Confidence = {
|
|
36
|
+
level: "too-few" | "rough" | "good" | "strong";
|
|
37
|
+
label: string;
|
|
38
|
+
/** About how many points a score could be off, either way (95%). */
|
|
39
|
+
margin: number;
|
|
40
|
+
/** What the count means for choosing a model, in one sentence. */
|
|
41
|
+
sentence: string;
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* How far to trust scores on this many cases. The margin is the 95% range
|
|
45
|
+
* of a pass rate (at the given rate, or 50%, the widest), in points.
|
|
46
|
+
*/
|
|
47
|
+
export declare function confidenceFor(cases: number, rate?: number): Confidence;
|
|
48
|
+
/** The answer key size to aim for (see confidenceFor). */
|
|
49
|
+
export declare const TARGET_CASES = 50;
|
|
50
|
+
/** How many drafts get the key to the target: at least 10, at most 30 a batch. */
|
|
51
|
+
export declare function draftsToTarget(casesNotRetired: number): number;
|
package/dist/summary.js
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/** Below this many answers the number is mostly noise. */
|
|
2
|
+
export const TRUST_MIN = 10;
|
|
3
|
+
/**
|
|
4
|
+
* A test's result in plain words, for people who don't want the statistics.
|
|
5
|
+
*/
|
|
6
|
+
export function summarize(m, checks) {
|
|
7
|
+
const right = m.allPass.passed;
|
|
8
|
+
const total = m.allPass.n;
|
|
9
|
+
const spread = m.allPass.low !== null && m.allPass.high !== null
|
|
10
|
+
? Math.round(((m.allPass.high - m.allPass.low) / 2) * 100)
|
|
11
|
+
: null;
|
|
12
|
+
const trust = total < TRUST_MIN
|
|
13
|
+
? `Only ${total} ${total === 1 ? "answer" : "answers"}: too few to trust yet. Confirm more cases, then test again.`
|
|
14
|
+
: spread !== null && spread > 10
|
|
15
|
+
? `A rough number: with ${total} answers it could be about ${spread} points either way.`
|
|
16
|
+
: `A solid number: ${total} answers.`;
|
|
17
|
+
const problems = checks
|
|
18
|
+
.map((c) => {
|
|
19
|
+
const r = m.byCheck[c.key];
|
|
20
|
+
return r && r.n
|
|
21
|
+
? { key: c.key, label: c.label, failed: r.n - r.passed, of: r.n }
|
|
22
|
+
: null;
|
|
23
|
+
})
|
|
24
|
+
.filter((p) => p !== null && p.failed > 0)
|
|
25
|
+
.sort((a, b) => b.failed - a.failed);
|
|
26
|
+
return { right, total, trust, problems };
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* How far to trust scores on this many cases. The margin is the 95% range
|
|
30
|
+
* of a pass rate (at the given rate, or 50%, the widest), in points.
|
|
31
|
+
*/
|
|
32
|
+
export function confidenceFor(cases, rate = 0.5) {
|
|
33
|
+
const p = Math.min(Math.max(rate, 0.05), 0.95);
|
|
34
|
+
const margin = cases
|
|
35
|
+
? Math.round(1.96 * Math.sqrt((p * (1 - p)) / cases) * 100)
|
|
36
|
+
: 100;
|
|
37
|
+
const level = cases < 20
|
|
38
|
+
? "too-few"
|
|
39
|
+
: cases < 50
|
|
40
|
+
? "rough"
|
|
41
|
+
: cases < 100
|
|
42
|
+
? "good"
|
|
43
|
+
: "strong";
|
|
44
|
+
const label = {
|
|
45
|
+
"too-few": "too few",
|
|
46
|
+
rough: "rough",
|
|
47
|
+
good: "good",
|
|
48
|
+
strong: "strong",
|
|
49
|
+
}[level];
|
|
50
|
+
const sentence = level === "too-few"
|
|
51
|
+
? `With ${cases} cases a score could be off by about ${margin} points: only big problems show. Aim for 50.`
|
|
52
|
+
: `With ${cases} cases a score could be off by about ${margin} points either way, so models closer than that can't be told apart.${level === "rough" ? " Aim for 50." : ""}`;
|
|
53
|
+
return { level, label, margin, sentence };
|
|
54
|
+
}
|
|
55
|
+
/** The answer key size to aim for (see confidenceFor). */
|
|
56
|
+
export const TARGET_CASES = 50;
|
|
57
|
+
/** How many drafts get the key to the target: at least 10, at most 30 a batch. */
|
|
58
|
+
export function draftsToTarget(casesNotRetired) {
|
|
59
|
+
return Math.min(30, Math.max(10, TARGET_CASES - casesNotRetired));
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=summary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summary.js","sourceRoot":"","sources":["../src/summary.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { FeedbackStore } from "./feedback.js";
|
|
2
|
+
import { type SettingsStore } from "./settings.js";
|
|
3
|
+
import type { EvalStore } from "./store.js";
|
|
4
|
+
/**
|
|
5
|
+
* The contract every EvalStore must meet, as Vitest tests. Run it against
|
|
6
|
+
* your store to know the runner will work on it. `make` must return an
|
|
7
|
+
* empty store each time it's called.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* import { describeStoreContract } from "@crowandraven/evalkeeper/testing";
|
|
12
|
+
*
|
|
13
|
+
* describeStoreContract("my store", () => myStore(freshDatabase()));
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export declare function describeStoreContract(name: string, make: () => EvalStore | Promise<EvalStore>): void;
|
|
17
|
+
/**
|
|
18
|
+
* The contract every FeedbackStore must meet. `make` must return an empty
|
|
19
|
+
* store each time it's called.
|
|
20
|
+
*/
|
|
21
|
+
export declare function describeFeedbackStoreContract(name: string, make: () => FeedbackStore | Promise<FeedbackStore>): void;
|
|
22
|
+
/**
|
|
23
|
+
* The contract every SettingsStore must meet. `make` must return an empty
|
|
24
|
+
* store each time it's called.
|
|
25
|
+
*/
|
|
26
|
+
export declare function describeSettingsStoreContract(name: string, make: () => SettingsStore | Promise<SettingsStore>): void;
|
package/dist/testing.js
ADDED
|
@@ -0,0 +1,362 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The contracts every store must meet, as Vitest tests.
|
|
3
|
+
*
|
|
4
|
+
* @module evalkeeper/testing
|
|
5
|
+
*/
|
|
6
|
+
import { describe, expect, it } from "vitest";
|
|
7
|
+
import { z } from "zod";
|
|
8
|
+
import { createRunner } from "./runner.js";
|
|
9
|
+
import { SettingsConflict, } from "./settings.js";
|
|
10
|
+
/**
|
|
11
|
+
* The contract every EvalStore must meet, as Vitest tests. Run it against
|
|
12
|
+
* your store to know the runner will work on it. `make` must return an
|
|
13
|
+
* empty store each time it's called.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```ts
|
|
17
|
+
* import { describeStoreContract } from "@crowandraven/evalkeeper/testing";
|
|
18
|
+
*
|
|
19
|
+
* describeStoreContract("my store", () => myStore(freshDatabase()));
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export function describeStoreContract(name, make) {
|
|
23
|
+
const newCase = (suite, over = {}) => ({
|
|
24
|
+
suite,
|
|
25
|
+
input: { text: "hello", nested: { n: 1 } },
|
|
26
|
+
tags: ["a", "b"],
|
|
27
|
+
split: "DEV",
|
|
28
|
+
status: "ACTIVE",
|
|
29
|
+
source: "OWNER",
|
|
30
|
+
sourceRef: null,
|
|
31
|
+
note: null,
|
|
32
|
+
labels: [
|
|
33
|
+
{
|
|
34
|
+
kind: "EXPECTED",
|
|
35
|
+
status: "CONFIRMED",
|
|
36
|
+
value: { want: "HELLO" },
|
|
37
|
+
raterRole: "OWNER",
|
|
38
|
+
raterId: null,
|
|
39
|
+
note: null,
|
|
40
|
+
},
|
|
41
|
+
],
|
|
42
|
+
...over,
|
|
43
|
+
});
|
|
44
|
+
const newRun = (suite) => ({
|
|
45
|
+
suite,
|
|
46
|
+
model: "model-a",
|
|
47
|
+
promptVersion: "v1",
|
|
48
|
+
reasoningEffort: null,
|
|
49
|
+
set: "ALL",
|
|
50
|
+
repeats: 1,
|
|
51
|
+
datasetVersion: null,
|
|
52
|
+
graderVersion: "1",
|
|
53
|
+
estimatedCostUsd: null,
|
|
54
|
+
startedBy: null,
|
|
55
|
+
});
|
|
56
|
+
describe(`EvalStore contract: ${name}`, () => {
|
|
57
|
+
it("keeps a case's input, tags, and answers as given", async () => {
|
|
58
|
+
const store = await make();
|
|
59
|
+
const c = await store.createCase(newCase("s"));
|
|
60
|
+
const [listed] = await store.listCases("s");
|
|
61
|
+
expect(listed?.id).toBe(c.id);
|
|
62
|
+
expect(listed?.input).toEqual({ text: "hello", nested: { n: 1 } });
|
|
63
|
+
expect(listed?.tags).toEqual(["a", "b"]);
|
|
64
|
+
expect(listed?.labels).toHaveLength(1);
|
|
65
|
+
expect(listed?.labels[0]).toMatchObject({
|
|
66
|
+
kind: "EXPECTED",
|
|
67
|
+
status: "CONFIRMED",
|
|
68
|
+
value: { want: "HELLO" },
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
it("lists a suite's cases oldest first, leaving out retired ones", async () => {
|
|
72
|
+
const store = await make();
|
|
73
|
+
const first = await store.createCase(newCase("s"));
|
|
74
|
+
const second = await store.createCase(newCase("s"));
|
|
75
|
+
await store.createCase(newCase("other"));
|
|
76
|
+
await store.setCaseStatus(first.id, "RETIRED");
|
|
77
|
+
expect((await store.listCases("s")).map((c) => c.id)).toEqual([
|
|
78
|
+
second.id,
|
|
79
|
+
]);
|
|
80
|
+
});
|
|
81
|
+
it("adds answers without overwriting, and changes their status", async () => {
|
|
82
|
+
const store = await make();
|
|
83
|
+
const c = await store.createCase(newCase("s", { labels: [] }));
|
|
84
|
+
const l = await store.addLabel(c.id, {
|
|
85
|
+
kind: "EXPECTED",
|
|
86
|
+
status: "PENDING",
|
|
87
|
+
value: { want: "X" },
|
|
88
|
+
raterRole: "MODEL",
|
|
89
|
+
raterId: null,
|
|
90
|
+
note: null,
|
|
91
|
+
});
|
|
92
|
+
await store.setLabelStatus(l.id, "CONFIRMED");
|
|
93
|
+
const [listed] = await store.listCases("s");
|
|
94
|
+
expect(listed?.labels).toHaveLength(1);
|
|
95
|
+
expect(listed?.labels[0]?.status).toBe("CONFIRMED");
|
|
96
|
+
});
|
|
97
|
+
it("starts runs as running, lists them newest first, and filters", async () => {
|
|
98
|
+
const store = await make();
|
|
99
|
+
const a = await store.createRun(newRun("s"));
|
|
100
|
+
await new Promise((r) => setTimeout(r, 5));
|
|
101
|
+
const b = await store.createRun(newRun("s"));
|
|
102
|
+
expect(a.status).toBe("RUNNING");
|
|
103
|
+
expect((await store.listRuns("s")).map((r) => r.id)).toEqual([
|
|
104
|
+
b.id,
|
|
105
|
+
a.id,
|
|
106
|
+
]);
|
|
107
|
+
expect(await store.listRuns("s", { limit: 1 })).toHaveLength(1);
|
|
108
|
+
await store.updateRun(a.id, { status: "SUCCEEDED" });
|
|
109
|
+
expect((await store.listRuns("s", { status: "SUCCEEDED" })).map((r) => r.id)).toEqual([a.id]);
|
|
110
|
+
expect(await store.getRun("missing")).toBeNull();
|
|
111
|
+
});
|
|
112
|
+
it("keeps the temperature a run was tested at", async () => {
|
|
113
|
+
const store = await make();
|
|
114
|
+
const warm = await store.createRun({ ...newRun("s"), temperature: 0.7 });
|
|
115
|
+
const none = await store.createRun({ ...newRun("s"), temperature: null });
|
|
116
|
+
expect((await store.getRun(warm.id))?.temperature).toBe(0.7);
|
|
117
|
+
expect((await store.getRun(none.id))?.temperature ?? null).toBeNull();
|
|
118
|
+
});
|
|
119
|
+
it("updates a run only while it has the status it's guarded by", async () => {
|
|
120
|
+
const store = await make();
|
|
121
|
+
const r = await store.createRun(newRun("s"));
|
|
122
|
+
await store.updateRun(r.id, { status: "FAILED" }, { status: "RUNNING" });
|
|
123
|
+
await store.updateRun(r.id, { status: "SUCCEEDED" }, { status: "RUNNING" });
|
|
124
|
+
expect((await store.getRun(r.id))?.status).toBe("FAILED");
|
|
125
|
+
});
|
|
126
|
+
it("stores outputs and scores, and finds only originals to reuse", async () => {
|
|
127
|
+
const store = await make();
|
|
128
|
+
const c = await store.createCase(newCase("s"));
|
|
129
|
+
const r = await store.createRun(newRun("s"));
|
|
130
|
+
const base = {
|
|
131
|
+
runId: r.id,
|
|
132
|
+
caseId: c.id,
|
|
133
|
+
repeat: 1,
|
|
134
|
+
requestHash: "h",
|
|
135
|
+
output: { text: "HELLO" },
|
|
136
|
+
error: null,
|
|
137
|
+
scores: null,
|
|
138
|
+
costUsd: 0.01,
|
|
139
|
+
ms: 12,
|
|
140
|
+
reused: false,
|
|
141
|
+
};
|
|
142
|
+
const o = await store.createOutput(base);
|
|
143
|
+
await store.createOutput({ ...base, reused: true });
|
|
144
|
+
await store.createOutput({ ...base, error: "boom", output: null });
|
|
145
|
+
await store.setOutputScores(o.id, [{ key: "match", pass: true }]);
|
|
146
|
+
const outs = await store.listOutputs(r.id);
|
|
147
|
+
expect(outs).toHaveLength(3);
|
|
148
|
+
expect(outs.find((x) => x.id === o.id)?.scores).toEqual([
|
|
149
|
+
{ key: "match", pass: true },
|
|
150
|
+
]);
|
|
151
|
+
const found = await store.findReusableOutput("h", new Date(0));
|
|
152
|
+
expect(found?.id).toBe(o.id);
|
|
153
|
+
expect(found?.output).toEqual({ text: "HELLO" });
|
|
154
|
+
expect(await store.findReusableOutput("h", new Date(Date.now() + 60_000))).toBeNull();
|
|
155
|
+
});
|
|
156
|
+
it("runs a whole test through the runner", async () => {
|
|
157
|
+
const store = await make();
|
|
158
|
+
const echo = {
|
|
159
|
+
key: "contract",
|
|
160
|
+
operation: "contract",
|
|
161
|
+
priority: { favor: "quality" },
|
|
162
|
+
label: "Contract",
|
|
163
|
+
description: "Uppercases text.",
|
|
164
|
+
graderVersion: "1",
|
|
165
|
+
input: z.object({ text: z.string() }),
|
|
166
|
+
labelValue: z.object({ want: z.string() }),
|
|
167
|
+
checks: [
|
|
168
|
+
{
|
|
169
|
+
key: "match",
|
|
170
|
+
label: "Matches",
|
|
171
|
+
description: "",
|
|
172
|
+
kind: "label",
|
|
173
|
+
severity: "serious",
|
|
174
|
+
},
|
|
175
|
+
],
|
|
176
|
+
run: async (i) => ({ text: i.text.toUpperCase() }),
|
|
177
|
+
grade: async (_i, out, want) => [
|
|
178
|
+
{ key: "match", pass: want ? out.text === want.want : null },
|
|
179
|
+
],
|
|
180
|
+
inputFromForm: () => ({ text: "" }),
|
|
181
|
+
title: (i) => i.text,
|
|
182
|
+
};
|
|
183
|
+
await store.createCase(newCase("contract"));
|
|
184
|
+
const runner = createRunner({
|
|
185
|
+
store,
|
|
186
|
+
suites: [echo],
|
|
187
|
+
models: { "model-a": { label: "Model A", provider: "acme" } },
|
|
188
|
+
promptVersion: () => "v1",
|
|
189
|
+
});
|
|
190
|
+
const { run } = await runner.createRun({
|
|
191
|
+
suite: "contract",
|
|
192
|
+
model: "model-a",
|
|
193
|
+
});
|
|
194
|
+
await runner.runEval(run.id);
|
|
195
|
+
const done = await store.getRun(run.id);
|
|
196
|
+
expect(done?.status).toBe("SUCCEEDED");
|
|
197
|
+
expect(done?.metrics?.allPass.passed).toBe(1);
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* The contract every FeedbackStore must meet. `make` must return an empty
|
|
203
|
+
* store each time it's called.
|
|
204
|
+
*/
|
|
205
|
+
export function describeFeedbackStoreContract(name, make) {
|
|
206
|
+
const rating = (over = {}) => ({
|
|
207
|
+
operation: "triage",
|
|
208
|
+
targetId: "answer-1",
|
|
209
|
+
raterId: "person-1",
|
|
210
|
+
rating: "DOWN",
|
|
211
|
+
reason: "Wrong queue",
|
|
212
|
+
excerpt: "billing",
|
|
213
|
+
input: { subject: "Refund", body: "Please refund me." },
|
|
214
|
+
output: { category: "bug" },
|
|
215
|
+
...over,
|
|
216
|
+
});
|
|
217
|
+
describe(`FeedbackStore contract: ${name}`, () => {
|
|
218
|
+
it("keeps a rating with its reason, input, and output, open", async () => {
|
|
219
|
+
const store = await make();
|
|
220
|
+
const f = await store.rate(rating());
|
|
221
|
+
expect(f).toMatchObject({
|
|
222
|
+
operation: "triage",
|
|
223
|
+
rating: "DOWN",
|
|
224
|
+
reason: "Wrong queue",
|
|
225
|
+
excerpt: "billing",
|
|
226
|
+
input: { subject: "Refund", body: "Please refund me." },
|
|
227
|
+
output: { category: "bug" },
|
|
228
|
+
status: "OPEN",
|
|
229
|
+
caseId: null,
|
|
230
|
+
});
|
|
231
|
+
});
|
|
232
|
+
it("keeps one rating per person per answer, and reopens a changed one", async () => {
|
|
233
|
+
const store = await make();
|
|
234
|
+
const first = await store.rate(rating());
|
|
235
|
+
await store.setFeedbackStatus(first.id, "DISMISSED");
|
|
236
|
+
const changed = await store.rate(rating({ rating: "UP" }));
|
|
237
|
+
expect(changed.id).toBe(first.id);
|
|
238
|
+
expect(changed.status).toBe("OPEN");
|
|
239
|
+
expect(changed.reason).toBeNull();
|
|
240
|
+
await store.rate(rating({ raterId: "person-2" }));
|
|
241
|
+
expect(await store.listFeedback()).toHaveLength(2);
|
|
242
|
+
});
|
|
243
|
+
it("takes a rating back", async () => {
|
|
244
|
+
const store = await make();
|
|
245
|
+
await store.rate(rating());
|
|
246
|
+
await store.clearRating("person-1", "triage", "answer-1");
|
|
247
|
+
expect(await store.listFeedback()).toHaveLength(0);
|
|
248
|
+
});
|
|
249
|
+
it("filters by feature, rating, status, and date, newest first", async () => {
|
|
250
|
+
const store = await make();
|
|
251
|
+
const a = await store.rate(rating({ targetId: "a" }));
|
|
252
|
+
await new Promise((r) => setTimeout(r, 5));
|
|
253
|
+
const b = await store.rate(rating({ targetId: "b", rating: "UP" }));
|
|
254
|
+
await store.rate(rating({ targetId: "c", operation: "summary" }));
|
|
255
|
+
expect((await store.listFeedback({ operation: "triage" })).map((f) => f.id)).toEqual([b.id, a.id]);
|
|
256
|
+
expect(await store.listFeedback({ rating: "UP" })).toHaveLength(1);
|
|
257
|
+
await store.setFeedbackStatus(a.id, "CASED", "case-1");
|
|
258
|
+
const cased = await store.listFeedback({ status: "CASED" });
|
|
259
|
+
expect(cased.map((f) => [f.id, f.caseId])).toEqual([[a.id, "case-1"]]);
|
|
260
|
+
expect(await store.listFeedback({ since: new Date(Date.now() + 60_000) })).toHaveLength(0);
|
|
261
|
+
expect(await store.listFeedback({ limit: 1 })).toHaveLength(1);
|
|
262
|
+
});
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* The contract every SettingsStore must meet. `make` must return an empty
|
|
267
|
+
* store each time it's called.
|
|
268
|
+
*/
|
|
269
|
+
export function describeSettingsStoreContract(name, make) {
|
|
270
|
+
const settings = (model) => ({
|
|
271
|
+
model,
|
|
272
|
+
fallbackModel: null,
|
|
273
|
+
reasoningEffort: null,
|
|
274
|
+
maxOutputTokens: null,
|
|
275
|
+
});
|
|
276
|
+
const create = (model, expectLive) => ({
|
|
277
|
+
create: { settings: settings(model), promptVersion: "p1" },
|
|
278
|
+
kind: "CHANGE",
|
|
279
|
+
reason: `to ${model}`,
|
|
280
|
+
by: "person-1",
|
|
281
|
+
expectLive,
|
|
282
|
+
});
|
|
283
|
+
describe(`SettingsStore contract: ${name}`, () => {
|
|
284
|
+
it("has nothing live until the first switch, then numbers versions", async () => {
|
|
285
|
+
const store = await make();
|
|
286
|
+
expect(await store.liveVersion("triage")).toBeNull();
|
|
287
|
+
const v1 = await store.switchTo("triage", create("a", null));
|
|
288
|
+
const v2 = await store.switchTo("triage", create("b", v1.id));
|
|
289
|
+
expect([v1.number, v2.number]).toEqual([1, 2]);
|
|
290
|
+
expect(v2).toMatchObject({
|
|
291
|
+
operation: "triage",
|
|
292
|
+
model: "b",
|
|
293
|
+
promptVersion: "p1",
|
|
294
|
+
});
|
|
295
|
+
expect((await store.liveVersion("triage"))?.id).toBe(v2.id);
|
|
296
|
+
expect((await store.listVersions("triage")).map((v) => v.number)).toEqual([2, 1]);
|
|
297
|
+
});
|
|
298
|
+
it("logs every switch, newest first, with who, why, and evidence", async () => {
|
|
299
|
+
const store = await make();
|
|
300
|
+
const v1 = await store.switchTo("triage", create("a", null));
|
|
301
|
+
await store.switchTo("triage", {
|
|
302
|
+
...create("b", v1.id),
|
|
303
|
+
kind: "PROMOTE",
|
|
304
|
+
evidence: { runId: "r1", verdict: "BETTER" },
|
|
305
|
+
});
|
|
306
|
+
const [latest, first] = await store.listChanges("triage");
|
|
307
|
+
expect(latest).toMatchObject({
|
|
308
|
+
kind: "PROMOTE",
|
|
309
|
+
fromVersionId: v1.id,
|
|
310
|
+
reason: "to b",
|
|
311
|
+
by: "person-1",
|
|
312
|
+
evidence: { runId: "r1", verdict: "BETTER" },
|
|
313
|
+
});
|
|
314
|
+
expect(first).toMatchObject({ kind: "CHANGE", fromVersionId: null });
|
|
315
|
+
expect(await store.listChanges("triage", { limit: 1 })).toHaveLength(1);
|
|
316
|
+
});
|
|
317
|
+
it("makes an earlier version live again without a new one", async () => {
|
|
318
|
+
const store = await make();
|
|
319
|
+
const v1 = await store.switchTo("triage", create("a", null));
|
|
320
|
+
const v2 = await store.switchTo("triage", create("b", v1.id));
|
|
321
|
+
await store.switchTo("triage", {
|
|
322
|
+
versionId: v1.id,
|
|
323
|
+
kind: "ROLLBACK",
|
|
324
|
+
reason: "b was worse",
|
|
325
|
+
by: "person-1",
|
|
326
|
+
expectLive: v2.id,
|
|
327
|
+
});
|
|
328
|
+
expect((await store.liveVersion("triage"))?.id).toBe(v1.id);
|
|
329
|
+
expect(await store.listVersions("triage")).toHaveLength(2);
|
|
330
|
+
});
|
|
331
|
+
it("refuses a switch decided against a live version that changed", async () => {
|
|
332
|
+
const store = await make();
|
|
333
|
+
const v1 = await store.switchTo("triage", create("a", null));
|
|
334
|
+
await store.switchTo("triage", create("b", v1.id));
|
|
335
|
+
await expect(store.switchTo("triage", create("c", v1.id))).rejects.toBeInstanceOf(SettingsConflict);
|
|
336
|
+
expect((await store.liveVersion("triage"))?.model).toBe("b");
|
|
337
|
+
expect(await store.listVersions("triage")).toHaveLength(2);
|
|
338
|
+
});
|
|
339
|
+
it("keeps a version's temperature", async () => {
|
|
340
|
+
const store = await make();
|
|
341
|
+
const v1 = await store.switchTo("triage", {
|
|
342
|
+
...create("a", null),
|
|
343
|
+
create: {
|
|
344
|
+
settings: { ...settings("a"), temperature: 0.4 },
|
|
345
|
+
promptVersion: "p1",
|
|
346
|
+
},
|
|
347
|
+
});
|
|
348
|
+
expect(v1.temperature).toBe(0.4);
|
|
349
|
+
expect((await store.liveVersion("triage"))?.temperature).toBe(0.4);
|
|
350
|
+
const v2 = await store.switchTo("triage", create("b", v1.id));
|
|
351
|
+
expect(v2.temperature ?? null).toBeNull();
|
|
352
|
+
});
|
|
353
|
+
it("keeps each feature's versions and live one apart", async () => {
|
|
354
|
+
const store = await make();
|
|
355
|
+
await store.switchTo("triage", create("a", null));
|
|
356
|
+
const other = await store.switchTo("summary", create("x", null));
|
|
357
|
+
expect(other.number).toBe(1);
|
|
358
|
+
expect((await store.liveVersion("triage"))?.model).toBe("a");
|
|
359
|
+
});
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
//# sourceMappingURL=testing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"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"}
|
package/dist/timeout.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** Rejects if the call takes longer than `ms`. Pure. */
|
|
2
|
+
export function withTimeout(p, ms) {
|
|
3
|
+
let timer;
|
|
4
|
+
return Promise.race([
|
|
5
|
+
p,
|
|
6
|
+
new Promise((_, reject) => {
|
|
7
|
+
timer = setTimeout(() => {
|
|
8
|
+
reject(new Error(`No answer within ${ms / 1000}s`));
|
|
9
|
+
}, ms);
|
|
10
|
+
}),
|
|
11
|
+
]).finally(() => {
|
|
12
|
+
clearTimeout(timer);
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=timeout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeout.js","sourceRoot":"","sources":["../src/timeout.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,MAAM,UAAU,WAAW,CAAI,CAAa,EAAE,EAAU;IACtD,IAAI,KAAoC,CAAC;IACzC,OAAO,OAAO,CAAC,IAAI,CAAC;QAClB,CAAC;QACD,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;YAC/B,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBACtB,MAAM,CAAC,IAAI,KAAK,CAAC,oBAAoB,EAAE,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC;YACtD,CAAC,EAAE,EAAE,CAAC,CAAC;QACT,CAAC,CAAC;KACH,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;QACd,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;AACL,CAAC"}
|