@cogitator-ai/evals 0.7.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 (90) hide show
  1. package/README.md +84 -21
  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 +3 -2
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +2 -1
  41. package/dist/index.js.map +1 -1
  42. package/dist/metrics/deterministic.d.ts +4 -0
  43. package/dist/metrics/deterministic.d.ts.map +1 -1
  44. package/dist/metrics/deterministic.js +52 -0
  45. package/dist/metrics/deterministic.js.map +1 -1
  46. package/dist/metrics/index.d.ts +1 -1
  47. package/dist/metrics/index.d.ts.map +1 -1
  48. package/dist/metrics/index.js +1 -1
  49. package/dist/metrics/index.js.map +1 -1
  50. package/dist/metrics/llm-judge.d.ts.map +1 -1
  51. package/dist/metrics/llm-judge.js +98 -10
  52. package/dist/metrics/llm-judge.js.map +1 -1
  53. package/dist/metrics/types.d.ts +6 -0
  54. package/dist/metrics/types.d.ts.map +1 -1
  55. package/dist/metrics/types.js.map +1 -1
  56. package/dist/reporters/ci.d.ts +4 -0
  57. package/dist/reporters/ci.d.ts.map +1 -1
  58. package/dist/reporters/ci.js +5 -1
  59. package/dist/reporters/ci.js.map +1 -1
  60. package/dist/reporters/console.d.ts.map +1 -1
  61. package/dist/reporters/console.js +6 -3
  62. package/dist/reporters/console.js.map +1 -1
  63. package/dist/reporters/csv.d.ts.map +1 -1
  64. package/dist/reporters/csv.js +5 -2
  65. package/dist/reporters/csv.js.map +1 -1
  66. package/dist/reporters/format.d.ts +13 -0
  67. package/dist/reporters/format.d.ts.map +1 -0
  68. package/dist/reporters/format.js +27 -0
  69. package/dist/reporters/format.js.map +1 -0
  70. package/dist/reporters/github.d.ts +11 -0
  71. package/dist/reporters/github.d.ts.map +1 -0
  72. package/dist/reporters/github.js +94 -0
  73. package/dist/reporters/github.js.map +1 -0
  74. package/dist/reporters/index.d.ts +16 -5
  75. package/dist/reporters/index.d.ts.map +1 -1
  76. package/dist/reporters/index.js +14 -3
  77. package/dist/reporters/index.js.map +1 -1
  78. package/dist/reporters/junit.d.ts +8 -0
  79. package/dist/reporters/junit.d.ts.map +1 -0
  80. package/dist/reporters/junit.js +107 -0
  81. package/dist/reporters/junit.js.map +1 -0
  82. package/dist/schema.d.ts +11 -0
  83. package/dist/schema.d.ts.map +1 -1
  84. package/dist/schema.js +16 -0
  85. package/dist/schema.js.map +1 -1
  86. package/dist/vitest.d.ts +35 -0
  87. package/dist/vitest.d.ts.map +1 -0
  88. package/dist/vitest.js +85 -0
  89. package/dist/vitest.js.map +1 -0
  90. package/package.json +12 -3
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/reporters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAgDhC,MAAM,YAAY,GAAG,aAAa,CAAC;AAEnC,+EAA+E;AAC/E,MAAM,UAAU,UAAU,CAAC,IAAwB,EAAE,SAAyB;IAC5E,MAAM,IAAI,GAAG,CAAC,IAAI,IAAI,YAAY,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;IAClE,OAAO,GAAG,IAAI,IAAI,SAAS,EAAE,CAAC;AAChC,CAAC;AAED,SAAS,OAAO,CAAC,IAAY;IAC3B,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,MAAM,CACpB,MAAuB,EACvB,IAAmC,EACnC,OAAyB;IAEzB,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;IAEzF,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,QAAQ,CAAC,EAAE,CAAC;YACV,KAAK,SAAS;gBACZ,aAAa,CAAC,MAAM,CAAC,CAAC;gBACtB,MAAM;YACR,KAAK,MAAM;gBACT,UAAU,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;gBACzE,MAAM;YACR,KAAK,KAAK;gBACR,SAAS,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;gBACvE,MAAM;YACR,KAAK,IAAI;gBACP,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACjB,MAAM;QACV,CAAC;IACH,CAAC;AACH,CAAC;AAED,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/reporters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAChC,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAwDxC,MAAM,YAAY,GAAG,aAAa,CAAC;AAEnC,+EAA+E;AAC/E,MAAM,UAAU,UAAU,CAAC,IAAwB,EAAE,SAAiC;IACpF,MAAM,IAAI,GAAG,CAAC,IAAI,IAAI,YAAY,CAAC,CAAC,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;IACtE,OAAO,GAAG,IAAI,IAAI,SAAS,EAAE,CAAC;AAChC,CAAC;AAED,SAAS,OAAO,CAAC,IAAY;IAC3B,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,MAAM,CACpB,MAAuB,EACvB,IAAmC,EACnC,OAAyB;IAEzB,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;IAEzF,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,QAAQ,CAAC,EAAE,CAAC;YACV,KAAK,SAAS;gBACZ,aAAa,CAAC,MAAM,CAAC,CAAC;gBACtB,MAAM;YACR,KAAK,MAAM;gBACT,UAAU,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;gBACzE,MAAM;YACR,KAAK,KAAK;gBACR,SAAS,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;gBACvE,MAAM;YACR,KAAK,OAAO;gBACV,WAAW,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;gBACzE,MAAM;YACR,KAAK,QAAQ;gBACX,YAAY,CAAC,MAAM,CAAC,CAAC;gBACrB,MAAM;YACR,KAAK,IAAI;gBACP,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACjB,MAAM;QACV,CAAC;IACH,CAAC;AACH,CAAC;AAED,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAChC,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { EvalSuiteResult } from './index.js';
2
+ /** The JUnit XML document of a suite run: one testcase per case and one per assertion */
3
+ export declare function junitXml(result: EvalSuiteResult): string;
4
+ /** Writes the suite run as JUnit XML, which CI systems show as a test report */
5
+ export declare function junitReport(result: EvalSuiteResult, options: {
6
+ path: string;
7
+ }): void;
8
+ //# sourceMappingURL=junit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"junit.d.ts","sourceRoot":"","sources":["../../src/reporters/junit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAiG/C,yFAAyF;AACzF,wBAAgB,QAAQ,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAqBxD;AAED,gFAAgF;AAChF,wBAAgB,WAAW,CAAC,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAEpF"}
@@ -0,0 +1,107 @@
1
+ import { writeFileSync } from 'node:fs';
2
+ import { caseFlags, caseLabel } from './format.js';
3
+ const SUITE_NAME = 'eval';
4
+ function isXmlChar(code) {
5
+ return (code === 0x9 ||
6
+ code === 0xa ||
7
+ code === 0xd ||
8
+ (code >= 0x20 && code <= 0xd7ff) ||
9
+ (code >= 0xe000 && code <= 0xfffd) ||
10
+ (code >= 0x10000 && code <= 0x10ffff));
11
+ }
12
+ /** Replaces the characters XML 1.0 does not allow, lone surrogates included, with U+FFFD */
13
+ function xmlSafe(value) {
14
+ let out = '';
15
+ for (const ch of value) {
16
+ const code = ch.codePointAt(0) ?? 0;
17
+ out += isXmlChar(code) ? ch : '�';
18
+ }
19
+ return out;
20
+ }
21
+ /** Escapes text content, `\r` kept as a reference since parsers fold a raw one into `\n` */
22
+ function escapeText(value) {
23
+ return xmlSafe(value)
24
+ .replace(/&/g, '&amp;')
25
+ .replace(/</g, '&lt;')
26
+ .replace(/>/g, '&gt;')
27
+ .replace(/\r/g, '&#13;');
28
+ }
29
+ /** Escapes an attribute value, keeping tabs and line breaks that a parser would fold to spaces */
30
+ function escapeAttr(value) {
31
+ return escapeText(value)
32
+ .replace(/"/g, '&quot;')
33
+ .replace(/'/g, '&apos;')
34
+ .replace(/\t/g, '&#9;')
35
+ .replace(/\n/g, '&#10;');
36
+ }
37
+ function attrs(values) {
38
+ return Object.entries(values)
39
+ .map(([key, value]) => ` ${key}="${escapeAttr(String(value))}"`)
40
+ .join('');
41
+ }
42
+ function seconds(ms) {
43
+ return (Math.max(0, ms) / 1000).toFixed(3);
44
+ }
45
+ function firstLine(text) {
46
+ return text.split(/\r?\n/, 1)[0] ?? '';
47
+ }
48
+ function caseOutput(result) {
49
+ const lines = result.scores.map((s) => {
50
+ const details = s.details ? ` (${s.details})` : '';
51
+ const error = s.error !== undefined ? ` [error: ${s.error}]` : '';
52
+ return `${s.name}: ${s.score}${details}${error}`;
53
+ });
54
+ for (const flag of caseFlags(result))
55
+ lines.push(`${flag}: true`);
56
+ return lines.join('\n');
57
+ }
58
+ function caseTestcase(result, index) {
59
+ const head = ` <testcase${attrs({
60
+ name: caseLabel(index, result.case.input),
61
+ classname: `${SUITE_NAME}.cases`,
62
+ time: seconds(result.duration),
63
+ })}`;
64
+ const body = [];
65
+ if (result.error !== undefined) {
66
+ body.push(` <failure${attrs({ message: firstLine(result.error), type: 'CaseError' })}>${escapeText(result.error)}</failure>`);
67
+ }
68
+ const output = caseOutput(result);
69
+ if (output !== '')
70
+ body.push(` <system-out>${escapeText(output)}</system-out>`);
71
+ return body.length === 0 ? `${head}/>` : `${head}>\n${body.join('\n')}\n </testcase>`;
72
+ }
73
+ function assertionTestcase(assertion) {
74
+ const head = ` <testcase${attrs({
75
+ name: assertion.name,
76
+ classname: `${SUITE_NAME}.assertions`,
77
+ time: seconds(0),
78
+ })}`;
79
+ if (assertion.passed)
80
+ return `${head}/>`;
81
+ return `${head}>\n <failure${attrs({ message: firstLine(assertion.message), type: 'AssertionFailure' })}>${escapeText(assertion.message)}</failure>\n </testcase>`;
82
+ }
83
+ /** The JUnit XML document of a suite run: one testcase per case and one per assertion */
84
+ export function junitXml(result) {
85
+ const tests = result.results.length + result.assertions.length;
86
+ const failures = result.results.filter((r) => r.error !== undefined).length +
87
+ result.assertions.filter((a) => !a.passed).length;
88
+ const time = seconds(result.stats.duration);
89
+ const counts = { tests, failures, errors: 0, skipped: 0, time };
90
+ const testcases = [
91
+ ...result.results.map((r, i) => caseTestcase(r, i)),
92
+ ...result.assertions.map((a) => assertionTestcase(a)),
93
+ ];
94
+ return [
95
+ '<?xml version="1.0" encoding="UTF-8"?>',
96
+ `<testsuites${attrs({ name: SUITE_NAME, tests, failures, errors: 0, time })}>`,
97
+ ` <testsuite${attrs({ name: SUITE_NAME, ...counts })}${testcases.length === 0 ? '/>' : '>'}`,
98
+ ...(testcases.length === 0 ? [] : [...testcases, ' </testsuite>']),
99
+ '</testsuites>',
100
+ '',
101
+ ].join('\n');
102
+ }
103
+ /** Writes the suite run as JUnit XML, which CI systems show as a test report */
104
+ export function junitReport(result, options) {
105
+ writeFileSync(options.path, junitXml(result), 'utf-8');
106
+ }
107
+ //# sourceMappingURL=junit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"junit.js","sourceRoot":"","sources":["../../src/reporters/junit.ts"],"names":[],"mappings":"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"}
package/dist/schema.d.ts CHANGED
@@ -26,11 +26,22 @@ export interface JudgeCogitator {
26
26
  };
27
27
  }>;
28
28
  }
29
+ /**
30
+ * Where the judge keeps the verdicts it already gave, by a key of its model, settings and the
31
+ * whole prompt: a case judged again with the same answer reuses the verdict and costs nothing.
32
+ * A store of your own (a file, Redis) keeps verdicts across runs
33
+ */
34
+ export interface JudgeCache {
35
+ get(key: string): string | undefined | Promise<string | undefined>;
36
+ set(key: string, verdict: string): void | Promise<void>;
37
+ }
29
38
  export declare const JudgeConfigSchema: z.ZodObject<{
30
39
  model: z.ZodString;
31
40
  temperature: z.ZodDefault<z.ZodNumber>;
32
41
  maxTokens: z.ZodOptional<z.ZodNumber>;
33
42
  cogitator: z.ZodOptional<z.ZodCustom<JudgeCogitator, JudgeCogitator>>;
43
+ cache: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodCustom<JudgeCache, JudgeCache>]>>;
44
+ concurrency: z.ZodOptional<z.ZodNumber>;
34
45
  }, z.core.$strip>;
35
46
  export declare const EvalComparisonConfigSchema: z.ZodObject<{
36
47
  concurrency: z.ZodDefault<z.ZodNumber>;
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,cAAc;;;;;iBAKzB,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;iBAIhC,CAAC;AAEH;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,GAAG,CACD,KAAK,EAAE,OAAO,EACd,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAC9C,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE;YAAE,IAAI,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC,CAAC;CAChF;AAUD,eAAO,MAAM,iBAAiB;;;;;iBAM5B,CAAC;AAEH,eAAO,MAAM,0BAA0B;;;;iBAIrC,CAAC;AAEH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,cAAc,CAAC,CAAC;AACvD,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAC3D,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACrE,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACzE,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC7D,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AACjE,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,0BAA0B,CAAC,CAAC"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,cAAc;;;;;iBAKzB,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;iBAIhC,CAAC;AAEH;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,GAAG,CACD,KAAK,EAAE,OAAO,EACd,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAC9C,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE;YAAE,IAAI,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC,CAAC;CAChF;AAED;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACnE,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzD;AAmBD,eAAO,MAAM,iBAAiB;;;;;;;iBAgB5B,CAAC;AAEH,eAAO,MAAM,0BAA0B;;;;iBAIrC,CAAC;AAEH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,cAAc,CAAC,CAAC;AACvD,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAC3D,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACrE,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACzE,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC7D,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AACjE,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,0BAA0B,CAAC,CAAC"}
package/dist/schema.js CHANGED
@@ -10,6 +10,12 @@ export const EvalSuiteConfigSchema = z.object({
10
10
  timeout: z.number().int().min(1000).default(30000),
11
11
  retries: z.number().int().min(0).max(10).default(0),
12
12
  });
13
+ function isJudgeCache(value) {
14
+ return (typeof value === 'object' &&
15
+ value !== null &&
16
+ typeof value.get === 'function' &&
17
+ typeof value.set === 'function');
18
+ }
13
19
  function isJudgeCogitator(value) {
14
20
  return (typeof value === 'object' &&
15
21
  value !== null &&
@@ -21,6 +27,16 @@ export const JudgeConfigSchema = z.object({
21
27
  maxTokens: z.number().int().positive().optional(),
22
28
  /** Runtime that runs the judge; defaults to the `cogitator` of an agent target */
23
29
  cogitator: z.custom(isJudgeCogitator).optional(),
30
+ /**
31
+ * Reuse verdicts: `true` keeps them in memory for the suite, a `JudgeCache` of your own keeps
32
+ * them where it likes. Default: every case is judged afresh
33
+ */
34
+ cache: z.union([z.boolean(), z.custom(isJudgeCache)]).optional(),
35
+ /**
36
+ * Most judge calls at once across the run, below the suite's own concurrency times its judge
37
+ * metrics. Default: no limit of its own
38
+ */
39
+ concurrency: z.number().int().positive().optional(),
24
40
  });
25
41
  export const EvalComparisonConfigSchema = z.object({
26
42
  concurrency: z.number().int().min(1).default(5),
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;IACrD,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;CACvD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IAClD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;CACpD,CAAC,CAAC;AAaH,SAAS,gBAAgB,CAAC,KAAc;IACtC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,OAAQ,KAA2B,CAAC,GAAG,KAAK,UAAU,CACvD,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAClC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IACjD,kFAAkF;IAClF,SAAS,EAAE,CAAC,CAAC,MAAM,CAAiB,gBAAgB,CAAC,CAAC,QAAQ,EAAE;CACjE,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC;IACjD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IAClD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;CACpD,CAAC,CAAC"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
@@ -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.7.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.41.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.41.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"