@cogitator-ai/evals 0.8.0 → 0.9.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 +66 -13
- package/dist/assertions/error-rate.d.ts +8 -0
- package/dist/assertions/error-rate.d.ts.map +1 -0
- package/dist/assertions/error-rate.js +27 -0
- package/dist/assertions/error-rate.js.map +1 -0
- package/dist/assertions/index.d.ts +3 -0
- package/dist/assertions/index.d.ts.map +1 -1
- package/dist/assertions/index.js +1 -0
- package/dist/assertions/index.js.map +1 -1
- package/dist/assertions/regression.d.ts.map +1 -1
- package/dist/assertions/regression.js +3 -1
- package/dist/assertions/regression.js.map +1 -1
- package/dist/assertions/threshold.d.ts.map +1 -1
- package/dist/assertions/threshold.js +4 -1
- package/dist/assertions/threshold.js.map +1 -1
- package/dist/datasets/csv-loader.d.ts.map +1 -1
- package/dist/datasets/csv-loader.js +71 -7
- package/dist/datasets/csv-loader.js.map +1 -1
- package/dist/datasets/dataset.d.ts +11 -2
- package/dist/datasets/dataset.d.ts.map +1 -1
- package/dist/datasets/dataset.js +42 -13
- package/dist/datasets/dataset.js.map +1 -1
- package/dist/datasets/issues.d.ts +4 -0
- package/dist/datasets/issues.d.ts.map +1 -0
- package/dist/datasets/issues.js +7 -0
- package/dist/datasets/issues.js.map +1 -0
- package/dist/datasets/jsonl-loader.d.ts.map +1 -1
- package/dist/datasets/jsonl-loader.js +6 -1
- package/dist/datasets/jsonl-loader.js.map +1 -1
- package/dist/eval-comparison.d.ts +2 -0
- package/dist/eval-comparison.d.ts.map +1 -1
- package/dist/eval-comparison.js +25 -11
- package/dist/eval-comparison.js.map +1 -1
- package/dist/eval-suite.d.ts +7 -3
- package/dist/eval-suite.d.ts.map +1 -1
- package/dist/eval-suite.js +45 -6
- package/dist/eval-suite.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/metrics/llm-judge.d.ts.map +1 -1
- package/dist/metrics/llm-judge.js +98 -10
- package/dist/metrics/llm-judge.js.map +1 -1
- package/dist/metrics/types.d.ts +6 -0
- package/dist/metrics/types.d.ts.map +1 -1
- package/dist/metrics/types.js.map +1 -1
- package/dist/reporters/ci.d.ts +4 -0
- package/dist/reporters/ci.d.ts.map +1 -1
- package/dist/reporters/ci.js +5 -1
- package/dist/reporters/ci.js.map +1 -1
- package/dist/reporters/console.d.ts.map +1 -1
- package/dist/reporters/console.js +6 -3
- package/dist/reporters/console.js.map +1 -1
- package/dist/reporters/csv.d.ts.map +1 -1
- package/dist/reporters/csv.js +5 -2
- package/dist/reporters/csv.js.map +1 -1
- package/dist/reporters/format.d.ts +13 -0
- package/dist/reporters/format.d.ts.map +1 -0
- package/dist/reporters/format.js +27 -0
- package/dist/reporters/format.js.map +1 -0
- package/dist/reporters/github.d.ts +11 -0
- package/dist/reporters/github.d.ts.map +1 -0
- package/dist/reporters/github.js +94 -0
- package/dist/reporters/github.js.map +1 -0
- package/dist/reporters/index.d.ts +16 -5
- package/dist/reporters/index.d.ts.map +1 -1
- package/dist/reporters/index.js +14 -3
- package/dist/reporters/index.js.map +1 -1
- package/dist/reporters/junit.d.ts +8 -0
- package/dist/reporters/junit.d.ts.map +1 -0
- package/dist/reporters/junit.js +107 -0
- package/dist/reporters/junit.js.map +1 -0
- package/dist/schema.d.ts +11 -0
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +16 -0
- package/dist/schema.js.map +1 -1
- package/dist/vitest.d.ts +35 -0
- package/dist/vitest.d.ts.map +1 -0
- package/dist/vitest.js +85 -0
- package/dist/vitest.js.map +1 -0
- package/package.json +12 -3
package/dist/vitest.d.ts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { EvalRunOptions, EvalSuite, EvalSuiteResult } from './eval-suite.js';
|
|
2
|
+
export interface DescribeEvalOptions {
|
|
3
|
+
/** The suite to run */
|
|
4
|
+
suite: EvalSuite;
|
|
5
|
+
/** Passed to `suite.run()`: `maxCases` also decides which cases get a test */
|
|
6
|
+
run?: EvalRunOptions;
|
|
7
|
+
/**
|
|
8
|
+
* Milliseconds the suite run may take, 10 minutes by default. When it runs out the run is
|
|
9
|
+
* cancelled and every test fails with the timeout.
|
|
10
|
+
*/
|
|
11
|
+
timeout?: number;
|
|
12
|
+
}
|
|
13
|
+
export interface DescribeEvalHandle {
|
|
14
|
+
/**
|
|
15
|
+
* The result of the suite run. Call it inside a test or an `afterAll` hook of the same
|
|
16
|
+
* describe block: it throws while the run has not finished, or with the cause when it failed.
|
|
17
|
+
*/
|
|
18
|
+
result: () => EvalSuiteResult;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Registers a Vitest describe block for an eval suite. The suite runs once in `beforeAll`, each
|
|
22
|
+
* case becomes a test that fails when the case errored, and an `assertions` test fails with
|
|
23
|
+
* every assertion that did not pass.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```ts
|
|
27
|
+
* import { describeEval } from '@cogitator-ai/evals/vitest';
|
|
28
|
+
*
|
|
29
|
+
* const qa = describeEval('qa agent', { suite, run: { maxCases: 50 } });
|
|
30
|
+
*
|
|
31
|
+
* afterAll(() => qa.result().report('junit', { path: './reports/qa' }));
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export declare function describeEval(name: string, options: DescribeEvalOptions): DescribeEvalHandle;
|
|
35
|
+
//# sourceMappingURL=vitest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vitest.d.ts","sourceRoot":"","sources":["../src/vitest.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAS/E,MAAM,WAAW,mBAAmB;IAClC,uBAAuB;IACvB,KAAK,EAAE,SAAS,CAAC;IACjB,8EAA8E;IAC9E,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC;;;OAGG;IACH,MAAM,EAAE,MAAM,eAAe,CAAC;CAC/B;AAWD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,GAAG,kBAAkB,CAsE3F"}
|
package/dist/vitest.js
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { beforeAll, describe, it } from 'vitest';
|
|
2
|
+
import { caseLabel } from './reporters/format.js';
|
|
3
|
+
const DEFAULT_TIMEOUT = 10 * 60 * 1000;
|
|
4
|
+
/** Time the hook keeps after the deadline settled the outcome, for Vitest itself */
|
|
5
|
+
const HOOK_GRACE = 5 * 1000;
|
|
6
|
+
/** The longest delay `setTimeout` keeps, less the grace the hook adds to it */
|
|
7
|
+
const MAX_TIMEOUT = 2_147_483_647 - HOOK_GRACE;
|
|
8
|
+
function messageOf(error) {
|
|
9
|
+
return error instanceof Error ? error.message : String(error);
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Registers a Vitest describe block for an eval suite. The suite runs once in `beforeAll`, each
|
|
13
|
+
* case becomes a test that fails when the case errored, and an `assertions` test fails with
|
|
14
|
+
* every assertion that did not pass.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```ts
|
|
18
|
+
* import { describeEval } from '@cogitator-ai/evals/vitest';
|
|
19
|
+
*
|
|
20
|
+
* const qa = describeEval('qa agent', { suite, run: { maxCases: 50 } });
|
|
21
|
+
*
|
|
22
|
+
* afterAll(() => qa.result().report('junit', { path: './reports/qa' }));
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export function describeEval(name, options) {
|
|
26
|
+
const { suite, run = {}, timeout = DEFAULT_TIMEOUT } = options;
|
|
27
|
+
if (!Number.isFinite(timeout) || timeout <= 0 || timeout > MAX_TIMEOUT) {
|
|
28
|
+
throw new Error(`describeEval timeout must be a positive number of milliseconds up to ${MAX_TIMEOUT}, got ${timeout}`);
|
|
29
|
+
}
|
|
30
|
+
let outcome = { state: 'pending' };
|
|
31
|
+
const result = () => {
|
|
32
|
+
switch (outcome.state) {
|
|
33
|
+
case 'done':
|
|
34
|
+
return outcome.result;
|
|
35
|
+
case 'failed':
|
|
36
|
+
throw new Error(`Eval suite '${name}' failed to run: ${messageOf(outcome.error)}`, {
|
|
37
|
+
cause: outcome.error,
|
|
38
|
+
});
|
|
39
|
+
case 'pending':
|
|
40
|
+
throw new Error(`Eval suite '${name}' has not finished running: read the result inside its tests or afterAll`);
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
describe(name, () => {
|
|
44
|
+
beforeAll(async () => {
|
|
45
|
+
const deadline = new AbortController();
|
|
46
|
+
const late = new Error(`the run did not finish within ${timeout} ms`);
|
|
47
|
+
let timer;
|
|
48
|
+
const expired = new Promise((_resolve, reject) => {
|
|
49
|
+
timer = setTimeout(() => {
|
|
50
|
+
deadline.abort(late);
|
|
51
|
+
reject(late);
|
|
52
|
+
}, timeout);
|
|
53
|
+
});
|
|
54
|
+
const signal = run.signal ? AbortSignal.any([run.signal, deadline.signal]) : deadline.signal;
|
|
55
|
+
const running = suite.run({ ...run, signal });
|
|
56
|
+
running.catch(() => undefined);
|
|
57
|
+
try {
|
|
58
|
+
outcome = { state: 'done', result: await Promise.race([running, expired]) };
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
outcome = { state: 'failed', error };
|
|
62
|
+
}
|
|
63
|
+
finally {
|
|
64
|
+
clearTimeout(timer);
|
|
65
|
+
}
|
|
66
|
+
}, timeout + HOOK_GRACE);
|
|
67
|
+
suite.cases(run.maxCases).forEach((evalCase, index) => {
|
|
68
|
+
it(caseLabel(index, evalCase.input), () => {
|
|
69
|
+
const caseResult = result().results[index];
|
|
70
|
+
if (caseResult?.error !== undefined) {
|
|
71
|
+
const attempts = caseResult.attempts === undefined ? '' : ` after ${caseResult.attempts} attempt(s)`;
|
|
72
|
+
throw new Error(`Case failed${attempts}: ${caseResult.error}`);
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
it('assertions', () => {
|
|
77
|
+
const failed = result().assertions.filter((a) => !a.passed);
|
|
78
|
+
if (failed.length > 0) {
|
|
79
|
+
throw new Error(`${failed.length} assertion(s) failed:\n${failed.map((a) => ` ${a.name}: ${a.message}`).join('\n')}`);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
return { result };
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=vitest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vitest.js","sourceRoot":"","sources":["../src/vitest.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cogitator-ai/evals",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"description": "Evaluation framework for Cogitator AI agents",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"cogitator",
|
|
@@ -21,6 +21,11 @@
|
|
|
21
21
|
"types": "./dist/index.d.ts",
|
|
22
22
|
"import": "./dist/index.js",
|
|
23
23
|
"default": "./dist/index.js"
|
|
24
|
+
},
|
|
25
|
+
"./vitest": {
|
|
26
|
+
"types": "./dist/vitest.d.ts",
|
|
27
|
+
"import": "./dist/vitest.js",
|
|
28
|
+
"default": "./dist/vitest.js"
|
|
24
29
|
}
|
|
25
30
|
},
|
|
26
31
|
"sideEffects": false,
|
|
@@ -34,18 +39,22 @@
|
|
|
34
39
|
"zod": "^4.6.5"
|
|
35
40
|
},
|
|
36
41
|
"peerDependencies": {
|
|
37
|
-
"@cogitator-ai/core": ">=0.
|
|
42
|
+
"@cogitator-ai/core": ">=0.56.4",
|
|
43
|
+
"vitest": ">=3.0.0"
|
|
38
44
|
},
|
|
39
45
|
"peerDependenciesMeta": {
|
|
40
46
|
"@cogitator-ai/core": {
|
|
41
47
|
"optional": true
|
|
48
|
+
},
|
|
49
|
+
"vitest": {
|
|
50
|
+
"optional": true
|
|
42
51
|
}
|
|
43
52
|
},
|
|
44
53
|
"optionalDependencies": {
|
|
45
54
|
"papaparse": "^5.7.0"
|
|
46
55
|
},
|
|
47
56
|
"devDependencies": {
|
|
48
|
-
"@cogitator-ai/core": "0.
|
|
57
|
+
"@cogitator-ai/core": "0.56.4",
|
|
49
58
|
"@types/papaparse": "^5.3.15",
|
|
50
59
|
"typescript": "^6.0.3",
|
|
51
60
|
"vitest": "^5.0.3"
|