promptfoo 0.10.0 → 0.12.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 (148) hide show
  1. package/README.md +45 -35
  2. package/dist/package.json +87 -0
  3. package/dist/src/__mocks__/esm.d.ts.map +1 -0
  4. package/dist/src/__mocks__/esm.js.map +1 -0
  5. package/dist/{assertions.d.ts → src/assertions.d.ts} +1 -1
  6. package/dist/src/assertions.d.ts.map +1 -0
  7. package/dist/src/assertions.js +374 -0
  8. package/dist/src/assertions.js.map +1 -0
  9. package/dist/src/cache.d.ts.map +1 -0
  10. package/dist/src/cache.js.map +1 -0
  11. package/dist/src/esm.d.ts.map +1 -0
  12. package/dist/src/esm.js.map +1 -0
  13. package/dist/src/evaluator.d.ts.map +1 -0
  14. package/dist/{evaluator.js → src/evaluator.js} +3 -1
  15. package/dist/src/evaluator.js.map +1 -0
  16. package/dist/src/index.d.ts.map +1 -0
  17. package/dist/{index.js → src/index.js} +10 -7
  18. package/dist/src/index.js.map +1 -0
  19. package/dist/src/logger.d.ts.map +1 -0
  20. package/dist/src/logger.js.map +1 -0
  21. package/dist/src/main.d.ts.map +1 -0
  22. package/dist/{main.js → src/main.js} +35 -13
  23. package/dist/src/main.js.map +1 -0
  24. package/dist/src/onboarding.d.ts.map +1 -0
  25. package/dist/src/onboarding.js.map +1 -0
  26. package/dist/src/prompts.d.ts.map +1 -0
  27. package/dist/src/prompts.js.map +1 -0
  28. package/dist/src/providers/localai.d.ts.map +1 -0
  29. package/dist/src/providers/localai.js.map +1 -0
  30. package/dist/src/providers/openai.d.ts.map +1 -0
  31. package/dist/src/providers/openai.js.map +1 -0
  32. package/dist/src/providers/shared.d.ts.map +1 -0
  33. package/dist/src/providers/shared.js.map +1 -0
  34. package/dist/src/providers.d.ts.map +1 -0
  35. package/dist/src/providers.js.map +1 -0
  36. package/dist/src/suggestions.d.ts.map +1 -0
  37. package/dist/src/suggestions.js.map +1 -0
  38. package/dist/src/telemetry.d.ts +10 -0
  39. package/dist/src/telemetry.d.ts.map +1 -0
  40. package/dist/src/telemetry.js +48 -0
  41. package/dist/src/telemetry.js.map +1 -0
  42. package/dist/{types.d.ts → src/types.d.ts} +6 -2
  43. package/dist/src/types.d.ts.map +1 -0
  44. package/dist/src/types.js.map +1 -0
  45. package/dist/src/updates.d.ts +3 -0
  46. package/dist/src/updates.d.ts.map +1 -0
  47. package/dist/src/updates.js +36 -0
  48. package/dist/src/updates.js.map +1 -0
  49. package/dist/{util.d.ts → src/util.d.ts} +3 -3
  50. package/dist/src/util.d.ts.map +1 -0
  51. package/dist/{util.js → src/util.js} +12 -5
  52. package/dist/src/util.js.map +1 -0
  53. package/dist/src/web/client/assets/index-87905193.css +1 -0
  54. package/dist/src/web/client/assets/index-eb6d3769.js +199 -0
  55. package/dist/src/web/client/assets/js-yaml-8bbf9398.js +32 -0
  56. package/dist/{web → src/web}/client/index.html +2 -2
  57. package/dist/src/web/server.d.ts.map +1 -0
  58. package/dist/{web → src/web}/server.js +3 -4
  59. package/dist/src/web/server.js.map +1 -0
  60. package/package.json +13 -9
  61. package/src/assertions.ts +247 -41
  62. package/src/evaluator.ts +5 -2
  63. package/src/index.ts +7 -4
  64. package/src/main.ts +50 -13
  65. package/src/telemetry.ts +57 -0
  66. package/src/types.ts +23 -2
  67. package/src/updates.ts +37 -0
  68. package/src/util.ts +28 -6
  69. package/src/web/client/package-lock.json +3 -6
  70. package/src/web/client/package.json +1 -0
  71. package/src/web/client/src/App.tsx +32 -12
  72. package/src/web/client/src/ConfigModal.tsx +81 -0
  73. package/src/web/client/src/ResultsTable.css +18 -6
  74. package/src/web/client/src/ResultsTable.tsx +101 -35
  75. package/src/web/client/src/ResultsView.tsx +148 -12
  76. package/src/web/client/src/ShareModal.tsx +70 -0
  77. package/src/web/client/src/index.css +6 -0
  78. package/src/web/client/src/store.ts +6 -1
  79. package/src/web/client/src/types.ts +4 -0
  80. package/src/web/server.ts +3 -7
  81. package/dist/__mocks__/esm.d.ts.map +0 -1
  82. package/dist/__mocks__/esm.js.map +0 -1
  83. package/dist/assertions.d.ts.map +0 -1
  84. package/dist/assertions.js +0 -233
  85. package/dist/assertions.js.map +0 -1
  86. package/dist/cache.d.ts.map +0 -1
  87. package/dist/cache.js.map +0 -1
  88. package/dist/esm.d.ts.map +0 -1
  89. package/dist/esm.js.map +0 -1
  90. package/dist/evaluator.d.ts.map +0 -1
  91. package/dist/evaluator.js.map +0 -1
  92. package/dist/index.d.ts.map +0 -1
  93. package/dist/index.js.map +0 -1
  94. package/dist/logger.d.ts.map +0 -1
  95. package/dist/logger.js.map +0 -1
  96. package/dist/main.d.ts.map +0 -1
  97. package/dist/main.js.map +0 -1
  98. package/dist/onboarding.d.ts.map +0 -1
  99. package/dist/onboarding.js.map +0 -1
  100. package/dist/prompts.d.ts.map +0 -1
  101. package/dist/prompts.js.map +0 -1
  102. package/dist/providers/localai.d.ts.map +0 -1
  103. package/dist/providers/localai.js.map +0 -1
  104. package/dist/providers/openai.d.ts.map +0 -1
  105. package/dist/providers/openai.js.map +0 -1
  106. package/dist/providers/shared.d.ts.map +0 -1
  107. package/dist/providers/shared.js.map +0 -1
  108. package/dist/providers.d.ts.map +0 -1
  109. package/dist/providers.js.map +0 -1
  110. package/dist/suggestions.d.ts.map +0 -1
  111. package/dist/suggestions.js.map +0 -1
  112. package/dist/types.d.ts.map +0 -1
  113. package/dist/types.js.map +0 -1
  114. package/dist/util.d.ts.map +0 -1
  115. package/dist/util.js.map +0 -1
  116. package/dist/web/client/assets/index-9a9ba400.css +0 -1
  117. package/dist/web/client/assets/index-b72d3ca9.js +0 -172
  118. package/dist/web/server.d.ts.map +0 -1
  119. package/dist/web/server.js.map +0 -1
  120. /package/dist/{__mocks__ → src/__mocks__}/esm.d.ts +0 -0
  121. /package/dist/{__mocks__ → src/__mocks__}/esm.js +0 -0
  122. /package/dist/{cache.d.ts → src/cache.d.ts} +0 -0
  123. /package/dist/{cache.js → src/cache.js} +0 -0
  124. /package/dist/{esm.d.ts → src/esm.d.ts} +0 -0
  125. /package/dist/{esm.js → src/esm.js} +0 -0
  126. /package/dist/{evaluator.d.ts → src/evaluator.d.ts} +0 -0
  127. /package/dist/{index.d.ts → src/index.d.ts} +0 -0
  128. /package/dist/{logger.d.ts → src/logger.d.ts} +0 -0
  129. /package/dist/{logger.js → src/logger.js} +0 -0
  130. /package/dist/{main.d.ts → src/main.d.ts} +0 -0
  131. /package/dist/{onboarding.d.ts → src/onboarding.d.ts} +0 -0
  132. /package/dist/{onboarding.js → src/onboarding.js} +0 -0
  133. /package/dist/{prompts.d.ts → src/prompts.d.ts} +0 -0
  134. /package/dist/{prompts.js → src/prompts.js} +0 -0
  135. /package/dist/{providers → src/providers}/localai.d.ts +0 -0
  136. /package/dist/{providers → src/providers}/localai.js +0 -0
  137. /package/dist/{providers → src/providers}/openai.d.ts +0 -0
  138. /package/dist/{providers → src/providers}/openai.js +0 -0
  139. /package/dist/{providers → src/providers}/shared.d.ts +0 -0
  140. /package/dist/{providers → src/providers}/shared.js +0 -0
  141. /package/dist/{providers.d.ts → src/providers.d.ts} +0 -0
  142. /package/dist/{providers.js → src/providers.js} +0 -0
  143. /package/dist/{suggestions.d.ts → src/suggestions.d.ts} +0 -0
  144. /package/dist/{suggestions.js → src/suggestions.js} +0 -0
  145. /package/dist/{types.js → src/types.js} +0 -0
  146. /package/dist/{web → src/web}/client/favicon.ico +0 -0
  147. /package/dist/{web → src/web}/client/logo.svg +0 -0
  148. /package/dist/{web → src/web}/server.d.ts +0 -0
package/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # promptfoo: test your prompts
2
2
 
3
3
  [![npm](https://img.shields.io/npm/v/promptfoo)](https://npmjs.com/package/promptfoo)
4
- ![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/typpo/promptfoo/main.yml)
4
+ [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/typpo/promptfoo/main.yml)](https://github.com/typpo/promptfoo/actions/workflows/main.yml)
5
5
 
6
6
  `promptfoo` is a tool for testing and evaluating LLM prompt quality.
7
7
 
@@ -22,11 +22,11 @@ promptfoo produces matrix views that let you quickly evaluate outputs across man
22
22
 
23
23
  Here's an example of a side-by-side comparison of multiple prompts and inputs:
24
24
 
25
- ![Prompt evaluation matrix - web viewer](https://github.com/typpo/promptfoo/assets/310310/ddcd77df-2783-425e-ade9-1a20dd0b6cd2)
25
+ ![prompt evaluation matrix - web viewer](https://github.com/typpo/promptfoo/assets/310310/2b79e8f8-9b79-49e7-bffb-24cba18352f2)
26
26
 
27
27
  It works on the command line too:
28
28
 
29
- ![Prompt evaluation](https://user-images.githubusercontent.com/310310/235529431-f4d5c395-d569-448e-9697-cd637e0372a5.gif)
29
+ ![Prompt evaluation](https://github.com/typpo/promptfoo/assets/310310/480e1114-d049-40b9-bd5f-f81c15060284)
30
30
 
31
31
  ## Workflow
32
32
 
@@ -61,41 +61,51 @@ The YAML configuration format runs each prompt through a series of example input
61
61
  See the [Configuration docs](https://www.promptfoo.dev/docs/configuration/guide) for a detailed guide.
62
62
 
63
63
  ```yaml
64
- prompts: [prompts.txt]
65
- providers: [openai:gpt-3.5-turbo]
64
+ prompts: [prompt1.txt, prompt2.txt]
65
+ providers: [openai:gpt-3.5-turbo, localai:chat:vicuna]
66
+ defaultTest:
67
+ assert:
66
68
  tests:
67
- - description: First test case - automatic review
68
- vars:
69
- var1: first variable's value
70
- var2: another value
71
- var3: some other value
72
- assert:
73
- - type: equality
74
- value: expected LLM output goes here
75
- - type: function
76
- value: output.includes('some text')
77
-
78
- - description: Second test case - manual review
79
- # Test cases don't need assertions if you prefer to review the output yourself
80
- vars:
81
- var1: new value
82
- var2: another value
83
- var3: third value
84
-
85
- - description: Third test case - other types of automatic review
86
- vars:
87
- var1: yet another value
88
- var2: and another
89
- var3: dear llm, please output your response in json format
90
- assert:
91
- - type: contains-json
92
- - type: similarity
93
- value: ensures that output is semantically similar to this text
69
+ - vars:
70
+ language: French
71
+ input: Hello world
72
+ assert:
73
+ - type: contains-json
74
+ - type: javascript
75
+ value: output.statsWith('Bonjour')
76
+ - vars:
77
+ language: German
78
+ input: How's it going?
79
+ - type: similar
80
+ value: was geht
81
+ threshold: 0.6 # cosine similarity
94
82
  - type: llm-rubric
95
- value: ensure that output contains a reference to X
83
+ value: does not describe self as an AI, model, or chatbot
96
84
  ```
97
85
 
98
- ### Tests on spreadsheet
86
+ ### Supported assertion types
87
+
88
+ See [Test assertions](https://promptfoo.dev/docs/configuration/expected-outputs) for full details.
89
+
90
+ | Assertion Type | Returns true if... |
91
+ | --------------- | ------------------------------------------------------------------------- |
92
+ | `equals` | output matches exactly |
93
+ | `contains` | output contains substring |
94
+ | `icontains` | output contains substring, case insensitive |
95
+ | `regex` | output matches regex |
96
+ | `contains-some` | output contains some in list of substrings |
97
+ | `contains-all` | output contains all list of substrings |
98
+ | `is-json` | output is valid json |
99
+ | `contains-json` | output contains valid json |
100
+ | `javascript` | provided Javascript function validates the output |
101
+ | `webhook` | provided webhook returns `{pass: true}` |
102
+ | `similar` | embeddings and cosine similarity are above a threshold |
103
+ | `llm-rubric` | LLM output matches a given rubric, using a Language Model to grade output |
104
+ | `rouge-n` | Rouge-N score is above a given threshold |
105
+
106
+ Every test type can be negated by prepending `not-`. For example, `not-equals` or `not-regex`.
107
+
108
+ ### Tests from spreadsheet
99
109
 
100
110
  Some people prefer to configure their LLM tests in a CSV. In that case, the config is pretty simple:
101
111
 
@@ -190,7 +200,7 @@ You can also use `promptfoo` as a library in your project by importing the `eval
190
200
  }
191
201
 
192
202
  interface Assertion {
193
- type: 'equality' | 'is-json' | 'contains-json' | 'function' | 'similarity' | 'llm-rubric';
203
+ type: string;
194
204
  value?: string;
195
205
  threshold?: number; // For similarity assertions
196
206
  provider?: ApiProvider; // For assertions that require an LLM provider
@@ -0,0 +1,87 @@
1
+ {
2
+ "name": "promptfoo",
3
+ "description": "Prompt engineering toolkit",
4
+ "author": "Ian Webster",
5
+ "version": "0.12.0",
6
+ "license": "MIT",
7
+ "type": "commonjs",
8
+ "main": "dist/src/index.js",
9
+ "exports": {
10
+ ".": {
11
+ "import": "./dist/src/index.js",
12
+ "require": "./dist/src/index.js"
13
+ }
14
+ },
15
+ "types": "dist/src/index.d.ts",
16
+ "typings": "dist/src/index.d.ts",
17
+ "files": [
18
+ "dist",
19
+ "src"
20
+ ],
21
+ "engines": {
22
+ "node": ">=12"
23
+ },
24
+ "bin": {
25
+ "promptfoo": "dist/src/main.js"
26
+ },
27
+ "scripts": {
28
+ "local": "ts-node --esm src/main.ts",
29
+ "install:client": "cd src/web/client && npm install",
30
+ "build:clean": "rm -rf dist",
31
+ "build:client": "cd src/web/client && npm run build && cp -r dist/ ../../../dist/src/web/client",
32
+ "build:watch": "tsc --watch",
33
+ "build": "tsc && cp src/*.html dist/ && npm run build:client && chmod +x dist/src/main.js",
34
+ "prepare": "npm run install:client && npm run build:clean && npm run build",
35
+ "test": "jest",
36
+ "test:watch": "jest --watch",
37
+ "format": "prettier -w ."
38
+ },
39
+ "devDependencies": {
40
+ "@types/async": "^3.2.20",
41
+ "@types/cache-manager": "^4.0.2",
42
+ "@types/cache-manager-fs-hash": "^0.0.1",
43
+ "@types/cli-progress": "^3.11.0",
44
+ "@types/cors": "^2.8.13",
45
+ "@types/debounce": "^1.2.1",
46
+ "@types/express": "^4.17.17",
47
+ "@types/glob": "^8.1.0",
48
+ "@types/jest": "^29.5.1",
49
+ "@types/js-yaml": "^4.0.5",
50
+ "@types/node-fetch": "^2.6.4",
51
+ "@types/nunjucks": "^3.2.2",
52
+ "@types/opener": "^1.4.0",
53
+ "@types/semver": "^7.5.0",
54
+ "babel-jest": "^29.5.0",
55
+ "jest": "^29.5.0",
56
+ "jest-watch-typeahead": "^2.2.2",
57
+ "prettier": "^2.8.8",
58
+ "ts-jest": "^29.1.0",
59
+ "ts-node": "^10.9.1",
60
+ "typescript": "^5.0.4"
61
+ },
62
+ "dependencies": {
63
+ "@apidevtools/json-schema-ref-parser": "^10.1.0",
64
+ "async": "^3.2.4",
65
+ "cache-manager": "^4.1.0",
66
+ "cache-manager-fs-hash": "^1.0.0",
67
+ "chalk": "^4.1.2",
68
+ "cli-progress": "^3.12.0",
69
+ "cli-table3": "^0.6.3",
70
+ "commander": "^10.0.1",
71
+ "cors": "^2.8.5",
72
+ "csv-parse": "^5.3.8",
73
+ "csv-stringify": "^6.3.2",
74
+ "debounce": "^1.2.1",
75
+ "express": "^4.18.2",
76
+ "glob": "^10.2.6",
77
+ "js-yaml": "^4.1.0",
78
+ "node-fetch": "^2.6.7",
79
+ "nunjucks": "^3.2.4",
80
+ "opener": "^1.5.2",
81
+ "rouge": "^1.0.3",
82
+ "semver": "^7.5.1",
83
+ "socket.io": "^4.6.1",
84
+ "tiny-invariant": "^1.3.1",
85
+ "winston": "^3.8.2"
86
+ }
87
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"esm.d.ts","sourceRoot":"","sources":["../../../src/__mocks__/esm.ts"],"names":[],"mappings":"AAAA,wBAAgB,YAAY,WAE3B"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"esm.js","sourceRoot":"","sources":["../../../src/__mocks__/esm.ts"],"names":[],"mappings":";;;AAAA,SAAgB,YAAY;IAC1B,OAAO,WAAW,CAAC;AACrB,CAAC;AAFD,oCAEC"}
@@ -1,7 +1,7 @@
1
1
  import type { Assertion, GradingConfig, GradingResult, AtomicTestCase } from './types';
2
2
  export declare function runAssertions(test: AtomicTestCase, output: string): Promise<GradingResult>;
3
3
  export declare function runAssertion(assertion: Assertion, test: AtomicTestCase, output: string): Promise<GradingResult>;
4
- export declare function matchesSimilarity(expected: string, output: string, threshold: number): Promise<GradingResult>;
4
+ export declare function matchesSimilarity(expected: string, output: string, threshold: number, inverse?: boolean): Promise<GradingResult>;
5
5
  export declare function matchesLlmRubric(expected: string, output: string, options?: GradingConfig): Promise<GradingResult>;
6
6
  export declare function assertionFromString(expected: string): Assertion;
7
7
  declare const _default: {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assertions.d.ts","sourceRoot":"","sources":["../../src/assertions.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,SAAS,EAET,aAAa,EACb,aAAa,EACb,cAAc,EACf,MAAM,SAAS,CAAC;AA4BjB,wBAAsB,aAAa,CAAC,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAyBhG;AAED,wBAAsB,YAAY,CAChC,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,cAAc,EACpB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,aAAa,CAAC,CAiNxB;AAoBD,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,OAAe,GACvB,OAAO,CAAC,aAAa,CAAC,CA6CxB;AAED,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,aAAa,CAAC,CAgDxB;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAwD/D;;;;;AAED,wBAGE"}
@@ -0,0 +1,374 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.assertionFromString = exports.matchesLlmRubric = exports.matchesSimilarity = exports.runAssertion = exports.runAssertions = void 0;
7
+ const rouge_1 = __importDefault(require("rouge"));
8
+ const tiny_invariant_1 = __importDefault(require("tiny-invariant"));
9
+ const nunjucks_1 = __importDefault(require("nunjucks"));
10
+ const telemetry_1 = __importDefault(require("./telemetry"));
11
+ const openai_1 = require("./providers/openai");
12
+ const util_1 = require("./util");
13
+ const providers_1 = require("./providers");
14
+ const prompts_1 = require("./prompts");
15
+ const DEFAULT_SEMANTIC_SIMILARITY_THRESHOLD = 0.8;
16
+ function handleRougeScore(baseType, assertion, expected, output, inverted) {
17
+ const fnName = baseType[baseType.length - 1];
18
+ const rougeMethod = rouge_1.default[fnName];
19
+ const score = rougeMethod(output, expected);
20
+ const pass = score >= (assertion.threshold || 0.75) != inverted;
21
+ return {
22
+ pass,
23
+ reason: pass
24
+ ? `${baseType.toUpperCase()} score ${score} is greater than or equal to threshold ${assertion.threshold || 0.75}`
25
+ : `${baseType.toUpperCase()} score ${score} is less than threshold ${assertion.threshold || 0.75}`,
26
+ };
27
+ }
28
+ async function runAssertions(test, output) {
29
+ const tokensUsed = {
30
+ total: 0,
31
+ prompt: 0,
32
+ completion: 0,
33
+ };
34
+ if (!test.assert) {
35
+ return { pass: true, reason: 'No assertions', tokensUsed };
36
+ }
37
+ for (const assertion of test.assert) {
38
+ const result = await runAssertion(assertion, test, output);
39
+ if (!result.pass) {
40
+ return result;
41
+ }
42
+ if (result.tokensUsed) {
43
+ tokensUsed.total += result.tokensUsed.total;
44
+ tokensUsed.prompt += result.tokensUsed.prompt;
45
+ tokensUsed.completion += result.tokensUsed.completion;
46
+ }
47
+ }
48
+ return { pass: true, reason: 'All assertions passed', tokensUsed };
49
+ }
50
+ exports.runAssertions = runAssertions;
51
+ async function runAssertion(assertion, test, output) {
52
+ let pass = false;
53
+ (0, tiny_invariant_1.default)(assertion.type, `Assertion must have a type: ${JSON.stringify(assertion)}`);
54
+ const inverse = assertion.type.startsWith('not-');
55
+ const baseType = inverse ? assertion.type.slice(4) : assertion.type;
56
+ telemetry_1.default.record('assertion_used', {
57
+ type: baseType,
58
+ });
59
+ if (baseType === 'equals') {
60
+ pass = assertion.value === output;
61
+ return {
62
+ pass,
63
+ reason: pass ? 'Assertion passed' : `Expected output "${assertion.value}"`,
64
+ };
65
+ }
66
+ if (baseType === 'is-json') {
67
+ try {
68
+ JSON.parse(output);
69
+ pass = !inverse;
70
+ }
71
+ catch (err) {
72
+ pass = inverse;
73
+ }
74
+ return { pass, reason: pass ? 'Assertion passed' : 'Expected output to be valid JSON' };
75
+ }
76
+ if (baseType === 'contains') {
77
+ (0, tiny_invariant_1.default)(assertion.value, '"contains" assertion type must have a string value');
78
+ (0, tiny_invariant_1.default)(typeof assertion.value === 'string', '"contains" assertion type must have a string value');
79
+ pass = output.includes(assertion.value) !== inverse;
80
+ return {
81
+ pass,
82
+ reason: pass
83
+ ? 'Assertion passed'
84
+ : `Expected output to ${inverse ? 'not ' : ''}contain "${assertion.value}"`,
85
+ };
86
+ }
87
+ if (baseType === 'contains-any') {
88
+ (0, tiny_invariant_1.default)(assertion.value, '"contains-any" assertion type must have a value');
89
+ (0, tiny_invariant_1.default)(Array.isArray(assertion.value), '"contains-any" assertion type must have an array value');
90
+ pass = assertion.value.some((value) => output.includes(value)) !== inverse;
91
+ return {
92
+ pass,
93
+ reason: pass
94
+ ? 'Assertion passed'
95
+ : `Expected output to ${inverse ? 'not ' : ''}contain one of "${assertion.value.join(', ')}"`,
96
+ };
97
+ }
98
+ if (baseType === 'contains-all') {
99
+ (0, tiny_invariant_1.default)(assertion.value, '"contains-all" assertion type must have a value');
100
+ (0, tiny_invariant_1.default)(Array.isArray(assertion.value), '"contains-all" assertion type must have an array value');
101
+ pass = assertion.value.every((value) => output.includes(value)) !== inverse;
102
+ return {
103
+ pass,
104
+ reason: pass
105
+ ? 'Assertion passed'
106
+ : `Expected output to ${inverse ? 'not ' : ''}contain all of "${assertion.value.join(', ')}"`,
107
+ };
108
+ }
109
+ if (baseType === 'regex') {
110
+ (0, tiny_invariant_1.default)(assertion.value, '"regex" assertion type must have a string value');
111
+ (0, tiny_invariant_1.default)(typeof assertion.value === 'string', '"contains" assertion type must have a string value');
112
+ const regex = new RegExp(assertion.value);
113
+ pass = regex.test(output) !== inverse;
114
+ return {
115
+ pass,
116
+ reason: pass
117
+ ? 'Assertion passed'
118
+ : `Expected output to ${inverse ? 'not ' : ''}match regex "${assertion.value}"`,
119
+ };
120
+ }
121
+ if (baseType === 'icontains') {
122
+ (0, tiny_invariant_1.default)(assertion.value, '"icontains" assertion type must have a string value');
123
+ (0, tiny_invariant_1.default)(typeof assertion.value === 'string', '"icontains" assertion type must have a string value');
124
+ pass = output.toLowerCase().includes(assertion.value.toLowerCase()) !== inverse;
125
+ return {
126
+ pass,
127
+ reason: pass
128
+ ? 'Assertion passed'
129
+ : `Expected output to ${inverse ? 'not ' : ''}contain "${assertion.value}"`,
130
+ };
131
+ }
132
+ if (baseType === 'contains-json') {
133
+ pass = containsJSON(output) !== inverse;
134
+ return {
135
+ pass,
136
+ reason: pass
137
+ ? 'Assertion passed'
138
+ : `Expected output to ${inverse ? 'not ' : ''}contain valid JSON`,
139
+ };
140
+ }
141
+ if (baseType === 'javascript') {
142
+ try {
143
+ const customFunction = new Function('output', 'context', `return ${assertion.value}`);
144
+ const context = {
145
+ vars: test.vars || {},
146
+ };
147
+ pass = customFunction(output, context) !== inverse;
148
+ }
149
+ catch (err) {
150
+ return {
151
+ pass: false,
152
+ reason: `Custom function threw error: ${err.message}
153
+ ${assertion.value}`,
154
+ };
155
+ }
156
+ return {
157
+ pass,
158
+ reason: pass
159
+ ? 'Assertion passed'
160
+ : `Custom function returned ${inverse ? 'true' : 'false'}
161
+ ${assertion.value}`,
162
+ };
163
+ }
164
+ if (baseType === 'similar') {
165
+ (0, tiny_invariant_1.default)(assertion.value, 'Similarity assertion must have a string value');
166
+ (0, tiny_invariant_1.default)(typeof assertion.value === 'string', '"contains" assertion type must have a string value');
167
+ return matchesSimilarity(assertion.value, output, assertion.threshold || 0.75, inverse);
168
+ }
169
+ if (baseType === 'llm-rubric') {
170
+ (0, tiny_invariant_1.default)(assertion.value, 'Similarity assertion must have a string value');
171
+ (0, tiny_invariant_1.default)(typeof assertion.value === 'string', '"contains" assertion type must have a string value');
172
+ return matchesLlmRubric(assertion.value, output, test.options);
173
+ }
174
+ if (baseType === 'webhook') {
175
+ (0, tiny_invariant_1.default)(assertion.value, '"webhook" assertion type must have a URL value');
176
+ (0, tiny_invariant_1.default)(typeof assertion.value === 'string', '"webhook" assertion type must have a URL value');
177
+ try {
178
+ const context = {
179
+ vars: test.vars || {},
180
+ };
181
+ const response = await (0, util_1.fetchWithTimeout)(assertion.value, {
182
+ method: 'POST',
183
+ headers: {
184
+ 'Content-Type': 'application/json',
185
+ },
186
+ body: JSON.stringify({ output, context }),
187
+ }, process.env.WEBHOOK_TIMEOUT ? parseInt(process.env.WEBHOOK_TIMEOUT, 10) : 5000);
188
+ if (!response.ok) {
189
+ throw new Error(`Webhook response status: ${response.status}`);
190
+ }
191
+ const jsonResponse = await response.json();
192
+ pass = jsonResponse.pass !== inverse;
193
+ }
194
+ catch (err) {
195
+ return {
196
+ pass: false,
197
+ reason: `Webhook error: ${err.message}`,
198
+ };
199
+ }
200
+ return {
201
+ pass,
202
+ reason: pass ? 'Assertion passed' : `Webhook returned ${inverse ? 'true' : 'false'}`,
203
+ };
204
+ }
205
+ if (baseType === 'rouge-n') {
206
+ (0, tiny_invariant_1.default)(assertion.value, '"rouge" assertion type must a value (string or string array)');
207
+ return handleRougeScore(baseType, assertion, assertion.value, output, inverse);
208
+ }
209
+ throw new Error('Unknown assertion type: ' + assertion.type);
210
+ }
211
+ exports.runAssertion = runAssertion;
212
+ function containsJSON(str) {
213
+ // Regular expression to check for JSON-like pattern
214
+ const jsonPattern = /({[\s\S]*}|\[[\s\S]*])/;
215
+ const match = str.match(jsonPattern);
216
+ if (!match) {
217
+ return false;
218
+ }
219
+ try {
220
+ JSON.parse(match[0]);
221
+ return true;
222
+ }
223
+ catch (error) {
224
+ return false;
225
+ }
226
+ }
227
+ async function matchesSimilarity(expected, output, threshold, inverse = false) {
228
+ const expectedEmbedding = await openai_1.DefaultEmbeddingProvider.callEmbeddingApi(expected);
229
+ const outputEmbedding = await openai_1.DefaultEmbeddingProvider.callEmbeddingApi(output);
230
+ const tokensUsed = {
231
+ total: (expectedEmbedding.tokenUsage?.total || 0) + (outputEmbedding.tokenUsage?.total || 0),
232
+ prompt: (expectedEmbedding.tokenUsage?.prompt || 0) + (outputEmbedding.tokenUsage?.prompt || 0),
233
+ completion: (expectedEmbedding.tokenUsage?.completion || 0) +
234
+ (outputEmbedding.tokenUsage?.completion || 0),
235
+ };
236
+ if (expectedEmbedding.error || outputEmbedding.error) {
237
+ return {
238
+ pass: false,
239
+ reason: expectedEmbedding.error || outputEmbedding.error || 'Unknown error fetching embeddings',
240
+ tokensUsed,
241
+ };
242
+ }
243
+ if (!expectedEmbedding.embedding || !outputEmbedding.embedding) {
244
+ return {
245
+ pass: false,
246
+ reason: 'Embedding not found',
247
+ tokensUsed,
248
+ };
249
+ }
250
+ const similarity = (0, util_1.cosineSimilarity)(expectedEmbedding.embedding, outputEmbedding.embedding);
251
+ const pass = inverse ? similarity <= threshold : similarity >= threshold;
252
+ const greaterThanReason = `Similarity ${similarity} is greater than threshold ${threshold}`;
253
+ const lessThanReason = `Similarity ${similarity} is less than threshold ${threshold}`;
254
+ if (pass) {
255
+ return {
256
+ pass: true,
257
+ reason: inverse ? lessThanReason : greaterThanReason,
258
+ tokensUsed,
259
+ };
260
+ }
261
+ return {
262
+ pass: false,
263
+ reason: inverse ? greaterThanReason : lessThanReason,
264
+ tokensUsed,
265
+ };
266
+ }
267
+ exports.matchesSimilarity = matchesSimilarity;
268
+ async function matchesLlmRubric(expected, output, options) {
269
+ if (!options) {
270
+ throw new Error('Cannot grade output without grading config. Specify --grader option or grading config.');
271
+ }
272
+ const prompt = nunjucks_1.default.renderString(options.rubricPrompt || prompts_1.DEFAULT_GRADING_PROMPT, {
273
+ content: output,
274
+ rubric: expected,
275
+ });
276
+ let provider = options.provider || openai_1.DefaultGradingProvider;
277
+ if (typeof provider === 'string') {
278
+ provider = await (0, providers_1.loadApiProvider)(provider);
279
+ }
280
+ const resp = await provider.callApi(prompt);
281
+ if (resp.error || !resp.output) {
282
+ return {
283
+ pass: false,
284
+ reason: resp.error || 'No output',
285
+ tokensUsed: {
286
+ total: resp.tokenUsage?.total || 0,
287
+ prompt: resp.tokenUsage?.prompt || 0,
288
+ completion: resp.tokenUsage?.completion || 0,
289
+ },
290
+ };
291
+ }
292
+ try {
293
+ const parsed = JSON.parse(resp.output);
294
+ parsed.tokensUsed = {
295
+ total: resp.tokenUsage?.total || 0,
296
+ prompt: resp.tokenUsage?.prompt || 0,
297
+ completion: resp.tokenUsage?.completion || 0,
298
+ };
299
+ return parsed;
300
+ }
301
+ catch (err) {
302
+ return {
303
+ pass: false,
304
+ reason: `Output is not valid JSON: ${resp.output}`,
305
+ tokensUsed: {
306
+ total: resp.tokenUsage?.total || 0,
307
+ prompt: resp.tokenUsage?.prompt || 0,
308
+ completion: resp.tokenUsage?.completion || 0,
309
+ },
310
+ };
311
+ }
312
+ }
313
+ exports.matchesLlmRubric = matchesLlmRubric;
314
+ function assertionFromString(expected) {
315
+ // Legacy options
316
+ if (expected.startsWith('fn:') || expected.startsWith('eval:')) {
317
+ // TODO(1.0): delete eval: legacy option
318
+ const sliceLength = expected.startsWith('fn:') ? 'fn:'.length : 'eval:'.length;
319
+ const functionBody = expected.slice(sliceLength);
320
+ return {
321
+ type: 'javascript',
322
+ value: functionBody,
323
+ };
324
+ }
325
+ if (expected.startsWith('grade:')) {
326
+ return {
327
+ type: 'llm-rubric',
328
+ value: expected.slice(6),
329
+ };
330
+ }
331
+ // New options
332
+ const assertionRegex = /^(not-)?(equals|contains-any|contains-all|contains-json|is-json|regex|icontains|contains|webhook|rouge-n|similar)(?::|\((\d+(\.\d+)?)\):)?(.*)$/;
333
+ const regexMatch = expected.match(assertionRegex);
334
+ if (regexMatch) {
335
+ const [_, notPrefix, type, __, thresholdStr, value] = regexMatch;
336
+ const fullType = notPrefix ? `not-${type}` : type;
337
+ const threshold = parseFloat(thresholdStr);
338
+ if (type === 'contains-any' || type === 'contains-all') {
339
+ return {
340
+ type: fullType,
341
+ value: value.split(',').map((s) => s.trim()),
342
+ };
343
+ }
344
+ else if (type === 'contains-json' || type === 'is-json') {
345
+ return {
346
+ type: fullType,
347
+ };
348
+ }
349
+ else if (type === 'rouge-n' || type === 'similar') {
350
+ return {
351
+ type: fullType,
352
+ value,
353
+ threshold: threshold || (type === 'similar' ? DEFAULT_SEMANTIC_SIMILARITY_THRESHOLD : 0.75),
354
+ };
355
+ }
356
+ else {
357
+ return {
358
+ type: fullType,
359
+ value,
360
+ };
361
+ }
362
+ }
363
+ // Default to equality
364
+ return {
365
+ type: 'equals',
366
+ value: expected,
367
+ };
368
+ }
369
+ exports.assertionFromString = assertionFromString;
370
+ exports.default = {
371
+ matchesSimilarity,
372
+ matchesLlmRubric,
373
+ };
374
+ //# sourceMappingURL=assertions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assertions.js","sourceRoot":"","sources":["../../src/assertions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/cache.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAkC3D,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,WAAW,EAChB,OAAO,yBAAkB,EACzB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;IAAE,IAAI,EAAE,GAAG,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,CAyCzC;AAED,wBAAgB,WAAW,SAE1B;AAED,wBAAgB,YAAY,SAG3B"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"esm.d.ts","sourceRoot":"","sources":["../../src/esm.ts"],"names":[],"mappings":"AAKA,wBAAgB,YAAY,IAAI,MAAM,CAOrC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"esm.js","sourceRoot":"","sources":["../../src/esm.ts"],"names":[],"mappings":";AAAA,0DAA0D;;;AAE1D,0BAA0B;AAC1B,sCAAsC;AAEtC,SAAgB,YAAY;IAC1B;;;;KAIC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAPD,oCAOC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluator.d.ts","sourceRoot":"","sources":["../../src/evaluator.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAEV,eAAe,EAGf,eAAe,EAEf,SAAS,EAIV,MAAM,SAAS,CAAC;AA8VjB,wBAAgB,QAAQ,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,eAAe,4BAGtE"}