@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.
Files changed (82) hide show
  1. package/README.md +66 -13
  2. package/dist/assertions/error-rate.d.ts +8 -0
  3. package/dist/assertions/error-rate.d.ts.map +1 -0
  4. package/dist/assertions/error-rate.js +27 -0
  5. package/dist/assertions/error-rate.js.map +1 -0
  6. package/dist/assertions/index.d.ts +3 -0
  7. package/dist/assertions/index.d.ts.map +1 -1
  8. package/dist/assertions/index.js +1 -0
  9. package/dist/assertions/index.js.map +1 -1
  10. package/dist/assertions/regression.d.ts.map +1 -1
  11. package/dist/assertions/regression.js +3 -1
  12. package/dist/assertions/regression.js.map +1 -1
  13. package/dist/assertions/threshold.d.ts.map +1 -1
  14. package/dist/assertions/threshold.js +4 -1
  15. package/dist/assertions/threshold.js.map +1 -1
  16. package/dist/datasets/csv-loader.d.ts.map +1 -1
  17. package/dist/datasets/csv-loader.js +71 -7
  18. package/dist/datasets/csv-loader.js.map +1 -1
  19. package/dist/datasets/dataset.d.ts +11 -2
  20. package/dist/datasets/dataset.d.ts.map +1 -1
  21. package/dist/datasets/dataset.js +42 -13
  22. package/dist/datasets/dataset.js.map +1 -1
  23. package/dist/datasets/issues.d.ts +4 -0
  24. package/dist/datasets/issues.d.ts.map +1 -0
  25. package/dist/datasets/issues.js +7 -0
  26. package/dist/datasets/issues.js.map +1 -0
  27. package/dist/datasets/jsonl-loader.d.ts.map +1 -1
  28. package/dist/datasets/jsonl-loader.js +6 -1
  29. package/dist/datasets/jsonl-loader.js.map +1 -1
  30. package/dist/eval-comparison.d.ts +2 -0
  31. package/dist/eval-comparison.d.ts.map +1 -1
  32. package/dist/eval-comparison.js +25 -11
  33. package/dist/eval-comparison.js.map +1 -1
  34. package/dist/eval-suite.d.ts +7 -3
  35. package/dist/eval-suite.d.ts.map +1 -1
  36. package/dist/eval-suite.js +45 -6
  37. package/dist/eval-suite.js.map +1 -1
  38. package/dist/index.d.ts +2 -1
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +1 -0
  41. package/dist/index.js.map +1 -1
  42. package/dist/metrics/llm-judge.d.ts.map +1 -1
  43. package/dist/metrics/llm-judge.js +98 -10
  44. package/dist/metrics/llm-judge.js.map +1 -1
  45. package/dist/metrics/types.d.ts +6 -0
  46. package/dist/metrics/types.d.ts.map +1 -1
  47. package/dist/metrics/types.js.map +1 -1
  48. package/dist/reporters/ci.d.ts +4 -0
  49. package/dist/reporters/ci.d.ts.map +1 -1
  50. package/dist/reporters/ci.js +5 -1
  51. package/dist/reporters/ci.js.map +1 -1
  52. package/dist/reporters/console.d.ts.map +1 -1
  53. package/dist/reporters/console.js +6 -3
  54. package/dist/reporters/console.js.map +1 -1
  55. package/dist/reporters/csv.d.ts.map +1 -1
  56. package/dist/reporters/csv.js +5 -2
  57. package/dist/reporters/csv.js.map +1 -1
  58. package/dist/reporters/format.d.ts +13 -0
  59. package/dist/reporters/format.d.ts.map +1 -0
  60. package/dist/reporters/format.js +27 -0
  61. package/dist/reporters/format.js.map +1 -0
  62. package/dist/reporters/github.d.ts +11 -0
  63. package/dist/reporters/github.d.ts.map +1 -0
  64. package/dist/reporters/github.js +94 -0
  65. package/dist/reporters/github.js.map +1 -0
  66. package/dist/reporters/index.d.ts +16 -5
  67. package/dist/reporters/index.d.ts.map +1 -1
  68. package/dist/reporters/index.js +14 -3
  69. package/dist/reporters/index.js.map +1 -1
  70. package/dist/reporters/junit.d.ts +8 -0
  71. package/dist/reporters/junit.d.ts.map +1 -0
  72. package/dist/reporters/junit.js +107 -0
  73. package/dist/reporters/junit.js.map +1 -0
  74. package/dist/schema.d.ts +11 -0
  75. package/dist/schema.d.ts.map +1 -1
  76. package/dist/schema.js +16 -0
  77. package/dist/schema.js.map +1 -1
  78. package/dist/vitest.d.ts +35 -0
  79. package/dist/vitest.d.ts.map +1 -0
  80. package/dist/vitest.js +85 -0
  81. package/dist/vitest.js.map +1 -0
  82. package/package.json +12 -3
@@ -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.8.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.53.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.53.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"