promptfoo 0.104.0 → 0.104.2

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 (158) hide show
  1. package/dist/package.json +13 -13
  2. package/dist/src/app/assets/index-BOYExNVs.js +882 -0
  3. package/dist/src/app/assets/index-D_f6kGCb.css +1 -0
  4. package/dist/src/app/assets/{index.es-q4VBMGZc.js → index.es-BSfrneXx.js} +1 -1
  5. package/dist/src/app/assets/{sync-YtFnZSQQ.js → sync-Cq1ANNrp.js} +1 -1
  6. package/dist/src/app/index.html +2 -2
  7. package/dist/src/assertions/llmRubric.d.ts.map +1 -1
  8. package/dist/src/assertions/llmRubric.js +2 -5
  9. package/dist/src/assertions/llmRubric.js.map +1 -1
  10. package/dist/src/cache.d.ts +1 -0
  11. package/dist/src/cache.d.ts.map +1 -1
  12. package/dist/src/cache.js +15 -2
  13. package/dist/src/cache.js.map +1 -1
  14. package/dist/src/commands/auth.d.ts.map +1 -1
  15. package/dist/src/commands/auth.js +12 -4
  16. package/dist/src/commands/auth.js.map +1 -1
  17. package/dist/src/commands/config.d.ts.map +1 -1
  18. package/dist/src/commands/config.js +11 -0
  19. package/dist/src/commands/config.js.map +1 -1
  20. package/dist/src/commands/eval.js +1 -1
  21. package/dist/src/commands/eval.js.map +1 -1
  22. package/dist/src/commands/generate/dataset.js +2 -2
  23. package/dist/src/commands/generate/dataset.js.map +1 -1
  24. package/dist/src/database/tables.d.ts +106 -48
  25. package/dist/src/database/tables.d.ts.map +1 -1
  26. package/dist/src/envars.d.ts +4 -2
  27. package/dist/src/envars.d.ts.map +1 -1
  28. package/dist/src/envars.js.map +1 -1
  29. package/dist/src/esm.d.ts.map +1 -1
  30. package/dist/src/esm.js +5 -5
  31. package/dist/src/esm.js.map +1 -1
  32. package/dist/src/evaluator.d.ts.map +1 -1
  33. package/dist/src/evaluator.js +5 -5
  34. package/dist/src/evaluator.js.map +1 -1
  35. package/dist/src/globalConfig/accounts.d.ts.map +1 -1
  36. package/dist/src/globalConfig/accounts.js +4 -4
  37. package/dist/src/globalConfig/accounts.js.map +1 -1
  38. package/dist/src/golang/wrapper.go +21 -4
  39. package/dist/src/guardrails.d.ts +23 -0
  40. package/dist/src/guardrails.d.ts.map +1 -0
  41. package/dist/src/guardrails.js +41 -0
  42. package/dist/src/guardrails.js.map +1 -0
  43. package/dist/src/index.d.ts +7 -1
  44. package/dist/src/index.d.ts.map +1 -1
  45. package/dist/src/index.js +6 -3
  46. package/dist/src/index.js.map +1 -1
  47. package/dist/src/integrations/huggingfaceDatasets.d.ts +5 -0
  48. package/dist/src/integrations/huggingfaceDatasets.d.ts.map +1 -1
  49. package/dist/src/integrations/huggingfaceDatasets.js +9 -1
  50. package/dist/src/integrations/huggingfaceDatasets.js.map +1 -1
  51. package/dist/src/matchers.d.ts +2 -2
  52. package/dist/src/matchers.d.ts.map +1 -1
  53. package/dist/src/matchers.js +18 -4
  54. package/dist/src/matchers.js.map +1 -1
  55. package/dist/src/models/eval.d.ts +4 -2
  56. package/dist/src/models/eval.d.ts.map +1 -1
  57. package/dist/src/models/eval.js +23 -15
  58. package/dist/src/models/eval.js.map +1 -1
  59. package/dist/src/providers/alibaba.js +2 -2
  60. package/dist/src/providers/alibaba.js.map +1 -1
  61. package/dist/src/providers/anthropic.d.ts +8 -7
  62. package/dist/src/providers/anthropic.d.ts.map +1 -1
  63. package/dist/src/providers/anthropic.js +5 -2
  64. package/dist/src/providers/anthropic.js.map +1 -1
  65. package/dist/src/providers/bedrock.d.ts +11 -1
  66. package/dist/src/providers/bedrock.d.ts.map +1 -1
  67. package/dist/src/providers/bedrock.js +15 -7
  68. package/dist/src/providers/bedrock.js.map +1 -1
  69. package/dist/src/providers/golangCompletion.d.ts.map +1 -1
  70. package/dist/src/providers/golangCompletion.js +5 -2
  71. package/dist/src/providers/golangCompletion.js.map +1 -1
  72. package/dist/src/providers/groq.d.ts +1 -0
  73. package/dist/src/providers/groq.d.ts.map +1 -1
  74. package/dist/src/providers/huggingface.d.ts +1 -0
  75. package/dist/src/providers/huggingface.d.ts.map +1 -1
  76. package/dist/src/providers/huggingface.js +8 -7
  77. package/dist/src/providers/huggingface.js.map +1 -1
  78. package/dist/src/providers/openai/chat.d.ts.map +1 -1
  79. package/dist/src/providers/openai/chat.js +7 -2
  80. package/dist/src/providers/openai/chat.js.map +1 -1
  81. package/dist/src/providers/openai/types.d.ts +2 -0
  82. package/dist/src/providers/openai/types.d.ts.map +1 -1
  83. package/dist/src/providers.d.ts.map +1 -1
  84. package/dist/src/providers.js +12 -0
  85. package/dist/src/providers.js.map +1 -1
  86. package/dist/src/redteam/commands/generate.d.ts.map +1 -1
  87. package/dist/src/redteam/commands/generate.js +3 -1
  88. package/dist/src/redteam/commands/generate.js.map +1 -1
  89. package/dist/src/redteam/commands/run.d.ts.map +1 -1
  90. package/dist/src/redteam/commands/run.js +1 -0
  91. package/dist/src/redteam/commands/run.js.map +1 -1
  92. package/dist/src/redteam/graders.d.ts.map +1 -1
  93. package/dist/src/redteam/graders.js +3 -0
  94. package/dist/src/redteam/graders.js.map +1 -1
  95. package/dist/src/redteam/index.d.ts +1 -1
  96. package/dist/src/redteam/index.d.ts.map +1 -1
  97. package/dist/src/redteam/index.js +6 -2
  98. package/dist/src/redteam/index.js.map +1 -1
  99. package/dist/src/redteam/plugins/harmful/common.d.ts.map +1 -1
  100. package/dist/src/redteam/plugins/harmful/common.js +1 -3
  101. package/dist/src/redteam/plugins/harmful/common.js.map +1 -1
  102. package/dist/src/redteam/shared.d.ts.map +1 -1
  103. package/dist/src/redteam/shared.js +3 -1
  104. package/dist/src/redteam/shared.js.map +1 -1
  105. package/dist/src/redteam/sharedFrontend.d.ts.map +1 -1
  106. package/dist/src/redteam/sharedFrontend.js +1 -0
  107. package/dist/src/redteam/sharedFrontend.js.map +1 -1
  108. package/dist/src/redteam/types.d.ts +6 -0
  109. package/dist/src/redteam/types.d.ts.map +1 -1
  110. package/dist/src/redteam/util.d.ts +6 -0
  111. package/dist/src/redteam/util.d.ts.map +1 -1
  112. package/dist/src/redteam/util.js +108 -76
  113. package/dist/src/redteam/util.js.map +1 -1
  114. package/dist/src/server/routes/eval.js +1 -1
  115. package/dist/src/server/server.js +2 -2
  116. package/dist/src/server/server.js.map +1 -1
  117. package/dist/src/{testCases.d.ts → testCase/synthesis.d.ts} +2 -6
  118. package/dist/src/testCase/synthesis.d.ts.map +1 -0
  119. package/dist/src/testCase/synthesis.js +185 -0
  120. package/dist/src/testCase/synthesis.js.map +1 -0
  121. package/dist/src/types/index.d.ts +1347 -941
  122. package/dist/src/types/index.d.ts.map +1 -1
  123. package/dist/src/types/index.js +7 -1
  124. package/dist/src/types/index.js.map +1 -1
  125. package/dist/src/util/config/load.d.ts.map +1 -1
  126. package/dist/src/util/config/load.js +6 -6
  127. package/dist/src/util/config/load.js.map +1 -1
  128. package/dist/src/util/file.node.d.ts +17 -0
  129. package/dist/src/util/file.node.d.ts.map +1 -0
  130. package/dist/src/util/file.node.js +59 -0
  131. package/dist/src/util/file.node.js.map +1 -0
  132. package/dist/src/util/index.d.ts +4 -4
  133. package/dist/src/util/index.d.ts.map +1 -1
  134. package/dist/src/util/index.js +0 -1
  135. package/dist/src/util/index.js.map +1 -1
  136. package/dist/src/util/json.d.ts +1 -0
  137. package/dist/src/util/json.d.ts.map +1 -1
  138. package/dist/src/util/json.js +67 -5
  139. package/dist/src/util/json.js.map +1 -1
  140. package/dist/src/util/testCaseReader.d.ts +33 -0
  141. package/dist/src/util/testCaseReader.d.ts.map +1 -0
  142. package/dist/src/util/testCaseReader.js +355 -0
  143. package/dist/src/util/testCaseReader.js.map +1 -0
  144. package/dist/src/util/transform.d.ts.map +1 -1
  145. package/dist/src/util/transform.js +24 -4
  146. package/dist/src/util/transform.js.map +1 -1
  147. package/dist/src/validators/providers.d.ts +36 -36
  148. package/dist/src/validators/redteam.d.ts +35 -14
  149. package/dist/src/validators/redteam.d.ts.map +1 -1
  150. package/dist/src/validators/redteam.js +25 -17
  151. package/dist/src/validators/redteam.js.map +1 -1
  152. package/dist/tsconfig.tsbuildinfo +1 -1
  153. package/package.json +13 -13
  154. package/dist/src/app/assets/index-4rSGjSvP.css +0 -1
  155. package/dist/src/app/assets/index-BZ5J3ZKi.js +0 -882
  156. package/dist/src/testCases.d.ts.map +0 -1
  157. package/dist/src/testCases.js +0 -434
  158. package/dist/src/testCases.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"testCases.d.ts","sourceRoot":"","sources":["../../src/testCases.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAEV,QAAQ,EACR,oBAAoB,EACpB,SAAS,EACT,eAAe,EACf,UAAU,EAGX,MAAM,SAAS,CAAC;AAcjB,wBAAsB,aAAa,CACjC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,EAC9B,QAAQ,GAAE,MAAW,GACpB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAkBrD;AAED,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,MAAW,GACpB,OAAO,CAAC,QAAQ,EAAE,CAAC,CA4CrB;AAeD,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,MAAM,GAAG,oBAAoB,EACnC,QAAQ,GAAE,MAAW,GACpB,OAAO,CAAC,QAAQ,CAAC,CA6CnB;AAED,wBAAsB,SAAS,CAC7B,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC,EAC/B,QAAQ,GAAE,MAAW,GACpB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAsHrB;AAED,UAAU,iBAAiB;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAWrF;AAED,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EAAE,EACjB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,QAAQ,EAAE,EACjB,sBAAsB,EAAE,MAAM,EAC9B,SAAS,EAAE,MAAM,EAAE,EACnB,YAAY,CAAC,EAAE,MAAM,GACpB,MAAM,CAiDR;AAED,wBAAsB,UAAU,CAAC,EAC/B,OAAO,EACP,YAAY,EACZ,KAAK,EACL,WAAW,EACX,sBAAsB,EACtB,QAAQ,GACT,EAAE,iBAAiB,yBAsHnB;AAED,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,OAAO,CAAC,iBAAiB,CAAC,yBAOpC"}
@@ -1,434 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- var __importDefault = (this && this.__importDefault) || function (mod) {
36
- return (mod && mod.__esModule) ? mod : { "default": mod };
37
- };
38
- Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.readVarsFiles = readVarsFiles;
40
- exports.readStandaloneTestsFile = readStandaloneTestsFile;
41
- exports.readTest = readTest;
42
- exports.readTests = readTests;
43
- exports.generatePersonasPrompt = generatePersonasPrompt;
44
- exports.testCasesPrompt = testCasesPrompt;
45
- exports.synthesize = synthesize;
46
- exports.synthesizeFromTestSuite = synthesizeFromTestSuite;
47
- const json_schema_ref_parser_1 = __importDefault(require("@apidevtools/json-schema-ref-parser"));
48
- const sync_1 = require("csv-parse/sync");
49
- const dedent_1 = __importDefault(require("dedent"));
50
- const fs = __importStar(require("fs"));
51
- const glob_1 = require("glob");
52
- const js_yaml_1 = __importDefault(require("js-yaml"));
53
- const path = __importStar(require("path"));
54
- const path_1 = require("path");
55
- const csv_1 = require("./csv");
56
- const envars_1 = require("./envars");
57
- const esm_1 = require("./esm");
58
- const googleSheets_1 = require("./googleSheets");
59
- const huggingfaceDatasets_1 = require("./integrations/huggingfaceDatasets");
60
- const logger_1 = __importDefault(require("./logger"));
61
- const providers_1 = require("./providers");
62
- const defaults_1 = require("./providers/defaults");
63
- const telemetry_1 = __importDefault(require("./telemetry"));
64
- const generation_1 = require("./util/generation");
65
- const invariant_1 = __importDefault(require("./util/invariant"));
66
- const json_1 = require("./util/json");
67
- const templates_1 = require("./util/templates");
68
- function parseJson(json) {
69
- try {
70
- return JSON.parse(json);
71
- }
72
- catch {
73
- return undefined;
74
- }
75
- }
76
- async function readVarsFiles(pathOrGlobs, basePath = '') {
77
- if (typeof pathOrGlobs === 'string') {
78
- pathOrGlobs = [pathOrGlobs];
79
- }
80
- const ret = {};
81
- for (const pathOrGlob of pathOrGlobs) {
82
- const resolvedPath = path.resolve(basePath, pathOrGlob);
83
- const paths = (0, glob_1.globSync)(resolvedPath, {
84
- windowsPathsNoEscape: true,
85
- });
86
- for (const p of paths) {
87
- const yamlData = js_yaml_1.default.load(fs.readFileSync(p, 'utf-8'));
88
- Object.assign(ret, yamlData);
89
- }
90
- }
91
- return ret;
92
- }
93
- async function readStandaloneTestsFile(varsPath, basePath = '') {
94
- // This function is confusingly named - it reads a CSV, JSON, or YAML file of
95
- // TESTS or test equivalents.
96
- const resolvedVarsPath = path.resolve(basePath, varsPath.replace(/^file:\/\//, ''));
97
- const fileExtension = (0, path_1.parse)(resolvedVarsPath).ext.slice(1);
98
- let rows = [];
99
- if (varsPath.startsWith('https://docs.google.com/spreadsheets/')) {
100
- telemetry_1.default.recordAndSendOnce('feature_used', {
101
- feature: 'csv tests file - google sheet',
102
- });
103
- rows = await (0, googleSheets_1.fetchCsvFromGoogleSheet)(varsPath);
104
- }
105
- else if (fileExtension === 'csv') {
106
- telemetry_1.default.recordAndSendOnce('feature_used', {
107
- feature: 'csv tests file - local',
108
- });
109
- const delimiter = (0, envars_1.getEnvString)('PROMPTFOO_CSV_DELIMITER', ',');
110
- rows = (0, sync_1.parse)(fs.readFileSync(resolvedVarsPath, 'utf-8'), {
111
- columns: true,
112
- bom: true,
113
- delimiter,
114
- });
115
- }
116
- else if (fileExtension === 'json') {
117
- telemetry_1.default.recordAndSendOnce('feature_used', {
118
- feature: 'json tests file',
119
- });
120
- rows = parseJson(fs.readFileSync(resolvedVarsPath, 'utf-8'));
121
- }
122
- else if (fileExtension === 'yaml' || fileExtension === 'yml') {
123
- telemetry_1.default.recordAndSendOnce('feature_used', {
124
- feature: 'yaml tests file',
125
- });
126
- rows = js_yaml_1.default.load(fs.readFileSync(resolvedVarsPath, 'utf-8'));
127
- }
128
- else if (fileExtension === 'js' || fileExtension === 'ts' || fileExtension === 'mjs') {
129
- telemetry_1.default.recordAndSendOnce('feature_used', {
130
- feature: 'js tests file',
131
- });
132
- return await (0, esm_1.importModule)(resolvedVarsPath);
133
- }
134
- return rows.map((row, idx) => {
135
- const test = (0, csv_1.testCaseFromCsvRow)(row);
136
- test.description || (test.description = `Row #${idx + 1}`);
137
- return test;
138
- });
139
- }
140
- async function loadTestWithVars(testCase, testBasePath) {
141
- const ret = { ...testCase, vars: undefined };
142
- if (typeof testCase.vars === 'string' || Array.isArray(testCase.vars)) {
143
- ret.vars = await readVarsFiles(testCase.vars, testBasePath);
144
- }
145
- else {
146
- ret.vars = testCase.vars;
147
- }
148
- return ret;
149
- }
150
- async function readTest(test, basePath = '') {
151
- let testCase;
152
- if (typeof test === 'string') {
153
- const testFilePath = path.resolve(basePath, test);
154
- const testBasePath = path.dirname(testFilePath);
155
- const rawTestCase = js_yaml_1.default.load(fs.readFileSync(testFilePath, 'utf-8'));
156
- testCase = await loadTestWithVars(rawTestCase, testBasePath);
157
- }
158
- else {
159
- testCase = await loadTestWithVars(test, basePath);
160
- }
161
- if (testCase.provider && typeof testCase.provider !== 'function') {
162
- // Load provider
163
- if (typeof testCase.provider === 'string') {
164
- testCase.provider = await (0, providers_1.loadApiProvider)(testCase.provider);
165
- }
166
- else if (typeof testCase.provider.id === 'string') {
167
- testCase.provider = await (0, providers_1.loadApiProvider)(testCase.provider.id, {
168
- options: testCase.provider,
169
- basePath,
170
- });
171
- }
172
- }
173
- if (!testCase.assert &&
174
- !testCase.vars &&
175
- !testCase.options &&
176
- !testCase.metadata &&
177
- !testCase.provider &&
178
- !testCase.providerOutput &&
179
- typeof testCase.threshold !== 'number') {
180
- // Validate the shape of the test case
181
- // We skip validation when loading the default test case, since it may not have all the properties
182
- throw new Error(`Test case must contain one of the following properties: assert, vars, options, metadata, provider, providerOutput, threshold.\n\nInstead got:\n${JSON.stringify(testCase, null, 2)}`);
183
- }
184
- return testCase;
185
- }
186
- async function readTests(tests, basePath = '') {
187
- const ret = [];
188
- const loadTestsFromGlob = async (loadTestsGlob) => {
189
- if (loadTestsGlob.startsWith('huggingface://datasets/')) {
190
- telemetry_1.default.recordAndSendOnce('feature_used', {
191
- feature: 'huggingface dataset',
192
- });
193
- return await (0, huggingfaceDatasets_1.fetchHuggingFaceDataset)(loadTestsGlob);
194
- }
195
- if (loadTestsGlob.startsWith('file://')) {
196
- loadTestsGlob = loadTestsGlob.slice('file://'.length);
197
- }
198
- const resolvedPath = path.resolve(basePath, loadTestsGlob);
199
- const testFiles = (0, glob_1.globSync)(resolvedPath, {
200
- windowsPathsNoEscape: true,
201
- });
202
- if (loadTestsGlob.startsWith('https://docs.google.com/spreadsheets/')) {
203
- testFiles.push(loadTestsGlob);
204
- }
205
- const _deref = async (testCases, file) => {
206
- logger_1.default.debug(`Dereferencing test file: ${file}`);
207
- return (await json_schema_ref_parser_1.default.dereference(testCases));
208
- };
209
- const ret = [];
210
- if (testFiles.length < 1) {
211
- logger_1.default.error(`No test files found for path: ${loadTestsGlob}`);
212
- return ret;
213
- }
214
- for (const testFile of testFiles) {
215
- let testCases;
216
- if (testFile.endsWith('.csv') ||
217
- testFile.startsWith('https://docs.google.com/spreadsheets/')) {
218
- testCases = await readStandaloneTestsFile(testFile, basePath);
219
- }
220
- else if (testFile.endsWith('.yaml') || testFile.endsWith('.yml')) {
221
- testCases = js_yaml_1.default.load(fs.readFileSync(testFile, 'utf-8'));
222
- testCases = await _deref(testCases, testFile);
223
- }
224
- else if (testFile.endsWith('.jsonl')) {
225
- const fileContent = fs.readFileSync(testFile, 'utf-8');
226
- testCases = fileContent
227
- .split('\n')
228
- .filter((line) => line.trim())
229
- .map((line) => JSON.parse(line));
230
- testCases = await _deref(testCases, testFile);
231
- }
232
- else if (testFile.endsWith('.json')) {
233
- // eslint-disable-next-line @typescript-eslint/no-require-imports
234
- testCases = await _deref(require(testFile), testFile);
235
- }
236
- else {
237
- throw new Error(`Unsupported file type for test file: ${testFile}`);
238
- }
239
- if (testCases) {
240
- if (!Array.isArray(testCases) && typeof testCases === 'object') {
241
- testCases = [testCases];
242
- }
243
- for (const testCase of testCases) {
244
- ret.push(await readTest(testCase, path.dirname(testFile)));
245
- }
246
- }
247
- }
248
- return ret;
249
- };
250
- if (typeof tests === 'string') {
251
- if (tests.endsWith('yaml') || tests.endsWith('yml')) {
252
- // Points to a tests file with multiple test cases
253
- return loadTestsFromGlob(tests);
254
- }
255
- else {
256
- // Points to a tests.{csv,json,yaml,yml,js} or Google Sheet
257
- return readStandaloneTestsFile(tests, basePath);
258
- }
259
- }
260
- else if (Array.isArray(tests)) {
261
- for (const globOrTest of tests) {
262
- if (typeof globOrTest === 'string') {
263
- // Resolve globs
264
- ret.push(...(await loadTestsFromGlob(globOrTest)));
265
- }
266
- else {
267
- // Load individual TestCase
268
- ret.push(await readTest(globOrTest, basePath));
269
- }
270
- }
271
- }
272
- else if (tests !== undefined && tests !== null) {
273
- logger_1.default.warn((0, dedent_1.default) `
274
- Warning: Unsupported 'tests' format in promptfooconfig.yaml.
275
- Expected: string, string[], or TestCase[], but received: ${typeof tests}
276
-
277
- Please check your configuration file and ensure the 'tests' field is correctly formatted.
278
- For more information, visit: https://promptfoo.dev/docs/configuration/reference/#test-case
279
- `);
280
- }
281
- if (ret.some((testCase) => testCase.vars?.assert) &&
282
- !(0, envars_1.getEnvBool)('PROMPTFOO_NO_TESTCASE_ASSERT_WARNING')) {
283
- logger_1.default.warn((0, dedent_1.default) `
284
- Warning: Found 'assert' key in vars. This is likely a mistake in your configuration.
285
-
286
- 'assert' should be *unindented* so it is under the test itself, not vars. For example:
287
-
288
- tests:
289
- - vars:
290
- foo: bar
291
- assert:
292
- - type: contains
293
- value: "bar"
294
-
295
- To disable this message, set the environment variable PROMPTFOO_NO_TESTCASE_ASSERT_WARNING=1.
296
- `);
297
- }
298
- return ret;
299
- }
300
- function generatePersonasPrompt(prompts, numPersonas) {
301
- const promptsString = (0, dedent_1.default) `<Prompts>
302
- ${prompts.map((prompt) => `<Prompt>\n${prompt}\n</Prompt>`).join('\n')}
303
- </Prompts>`;
304
- return (0, dedent_1.default) `
305
- Consider the following prompt${prompts.length > 1 ? 's' : ''} for an LLM application:
306
-
307
- ${promptsString}
308
-
309
- List up to ${numPersonas} user personas that would send ${prompts.length > 1 ? 'these prompts' : 'this prompt'}. Your response should be JSON of the form {personas: string[]}`;
310
- }
311
- function testCasesPrompt(prompts, persona, tests, numTestCasesPerPersona, variables, instructions) {
312
- const promptsString = (0, dedent_1.default) `
313
- <Prompts>
314
- ${prompts
315
- .map((prompt) => (0, dedent_1.default) `
316
- <Prompt>
317
- ${prompt}
318
- </Prompt>`)
319
- .join('\n')}
320
- </Prompts>`;
321
- const existingTests = (0, dedent_1.default) `
322
- Here are some existing tests:
323
- ${(0, generation_1.sampleArray)(tests, 100)
324
- .map((test) => {
325
- if (!test.vars) {
326
- return;
327
- }
328
- return (0, dedent_1.default) `
329
- <Test>
330
- ${JSON.stringify(test.vars, null, 2)}
331
- </Test>`;
332
- })
333
- .filter(Boolean)
334
- .sort()
335
- .join('\n')}
336
- `;
337
- return (0, dedent_1.default) `
338
- Consider ${prompts.length > 1 ? 'these prompts' : 'this prompt'}, which contains some {{variables}}:
339
- ${promptsString}
340
-
341
- This is your persona:
342
- <Persona>
343
- ${persona}
344
- </Persona>
345
-
346
- ${existingTests}
347
-
348
- Fully embody this persona and determine a value for each variable, such that the prompt would be sent by this persona.
349
-
350
- You are a tester, so try to think of ${numTestCasesPerPersona} sets of values that would be interesting or unusual to test.${instructions ? ` ${instructions}` : ''}
351
-
352
- Your response should contain a JSON map of variable names to values, of the form {vars: {${Array.from(variables)
353
- .map((varName) => `${varName}: string`)
354
- .join(', ')}}[]}`;
355
- }
356
- async function synthesize({ prompts, instructions, tests, numPersonas, numTestCasesPerPersona, provider, }) {
357
- if (prompts.length < 1) {
358
- throw new Error('Dataset synthesis requires at least one prompt.');
359
- }
360
- numPersonas = numPersonas || 5;
361
- numTestCasesPerPersona = numTestCasesPerPersona || 3;
362
- let progressBar;
363
- if (logger_1.default.level !== 'debug') {
364
- const cliProgress = await Promise.resolve().then(() => __importStar(require('cli-progress')));
365
- progressBar = new cliProgress.SingleBar({}, cliProgress.Presets.shades_classic);
366
- const totalProgressSteps = 1 + numPersonas * numTestCasesPerPersona;
367
- progressBar.start(totalProgressSteps, 0);
368
- }
369
- logger_1.default.debug(`Starting dataset synthesis. We'll begin by generating up to ${numPersonas} personas. Each persona will be used to generate ${numTestCasesPerPersona} test cases.`);
370
- logger_1.default.debug(`Generating user personas from ${prompts.length} prompt${prompts.length > 1 ? 's' : ''}...`);
371
- let providerModel;
372
- if (typeof provider === 'undefined') {
373
- providerModel = (await (0, defaults_1.getDefaultProviders)()).synthesizeProvider;
374
- }
375
- else {
376
- providerModel = await (0, providers_1.loadApiProvider)(provider);
377
- }
378
- const personasPrompt = generatePersonasPrompt(prompts, numPersonas);
379
- logger_1.default.debug(`Generated personas prompt:\n${personasPrompt}`);
380
- const resp = await providerModel.callApi(personasPrompt);
381
- logger_1.default.debug(`Received personas response:\n${resp.output}`);
382
- (0, invariant_1.default)(typeof resp.output !== 'undefined', 'resp.output must be defined');
383
- const output = typeof resp.output === 'string' ? resp.output : JSON.stringify(resp.output);
384
- const respObjects = (0, json_1.extractJsonObjects)(output);
385
- (0, invariant_1.default)(respObjects.length >= 1, `Expected at least one JSON object in the response for personas, got ${respObjects.length}`);
386
- const personas = respObjects[0].personas;
387
- logger_1.default.debug(`Generated ${personas.length} persona${personas.length === 1 ? '' : 's'}:\n${personas.map((p) => ` - ${p}`).join('\n')}`);
388
- if (progressBar) {
389
- progressBar.increment();
390
- }
391
- // Extract variable names from the nunjucks template in the prompts
392
- const variables = (0, templates_1.extractVariablesFromTemplates)(prompts);
393
- logger_1.default.debug(`Extracted ${variables.length} variable${variables.length === 1 ? '' : 's'} from prompt${prompts.length === 1 ? '' : 's'}:\n${variables
394
- .map((v) => ` - ${v}`)
395
- .join('\n')}`);
396
- const batchSize = 20;
397
- const totalTestCases = numPersonas * numTestCasesPerPersona;
398
- const generateTestCasesForPersona = async (currentTestCases) => {
399
- const remainingCount = totalTestCases - currentTestCases.length;
400
- const currentBatchSize = Math.min(remainingCount, batchSize);
401
- const persona = personas[currentTestCases.length % personas.length];
402
- logger_1.default.debug(`Generating ${currentBatchSize} test cases for persona ${(currentTestCases.length % personas.length) + 1} of ${personas.length}...`);
403
- const personaPrompt = testCasesPrompt(prompts, persona, tests, currentBatchSize, variables, instructions);
404
- logger_1.default.debug(`Generated persona prompt:\n${personaPrompt}`);
405
- const personaResponse = await providerModel.callApi(personaPrompt);
406
- logger_1.default.debug(`Received persona response:\n${personaResponse.output}`);
407
- const personaResponseObjects = (0, json_1.extractJsonObjects)(personaResponse.output);
408
- (0, invariant_1.default)(personaResponseObjects.length >= 1, `Expected at least one JSON object in the response for persona ${persona}, got ${personaResponseObjects.length}`);
409
- const parsed = personaResponseObjects[0];
410
- logger_1.default.debug(`Received ${parsed.vars?.length} test cases`);
411
- if (progressBar) {
412
- progressBar.increment(parsed.vars?.length);
413
- }
414
- return parsed.vars || [];
415
- };
416
- let testCaseVars = await (0, generation_1.retryWithDeduplication)(generateTestCasesForPersona, totalTestCases);
417
- logger_1.default.debug(`Generated ${testCaseVars.length} test cases`);
418
- if (testCaseVars.length > totalTestCases) {
419
- logger_1.default.debug(`Generated ${testCaseVars.length} test cases, but only ${totalTestCases} were requested. Sampling down to ${totalTestCases}...`);
420
- testCaseVars = (0, generation_1.sampleArray)(testCaseVars, totalTestCases);
421
- }
422
- if (progressBar) {
423
- progressBar.stop();
424
- }
425
- return testCaseVars;
426
- }
427
- async function synthesizeFromTestSuite(testSuite, options) {
428
- return synthesize({
429
- ...options,
430
- prompts: testSuite.prompts.map((prompt) => prompt.raw),
431
- tests: testSuite.tests || [],
432
- });
433
- }
434
- //# sourceMappingURL=testCases.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"testCases.js","sourceRoot":"","sources":["../../src/testCases.ts"],"names":[],"mappings":"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"}