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
@@ -0,0 +1,355 @@
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.loadTestsFromGlob = loadTestsFromGlob;
43
+ exports.readTests = readTests;
44
+ const json_schema_ref_parser_1 = __importDefault(require("@apidevtools/json-schema-ref-parser"));
45
+ const sync_1 = require("csv-parse/sync");
46
+ const dedent_1 = __importDefault(require("dedent"));
47
+ const fs = __importStar(require("fs"));
48
+ const glob_1 = require("glob");
49
+ const js_yaml_1 = __importDefault(require("js-yaml"));
50
+ const path = __importStar(require("path"));
51
+ const path_1 = require("path");
52
+ const csv_1 = require("../csv");
53
+ const envars_1 = require("../envars");
54
+ const esm_1 = require("../esm");
55
+ const googleSheets_1 = require("../googleSheets");
56
+ const huggingfaceDatasets_1 = require("../integrations/huggingfaceDatasets");
57
+ const logger_1 = __importDefault(require("../logger"));
58
+ const providers_1 = require("../providers");
59
+ const pythonUtils_1 = require("../python/pythonUtils");
60
+ const telemetry_1 = __importDefault(require("../telemetry"));
61
+ const file_1 = require("./file");
62
+ async function readVarsFiles(pathOrGlobs, basePath = '') {
63
+ if (typeof pathOrGlobs === 'string') {
64
+ pathOrGlobs = [pathOrGlobs];
65
+ }
66
+ const ret = {};
67
+ for (const pathOrGlob of pathOrGlobs) {
68
+ const resolvedPath = path.resolve(basePath, pathOrGlob);
69
+ const paths = (0, glob_1.globSync)(resolvedPath, {
70
+ windowsPathsNoEscape: true,
71
+ });
72
+ for (const p of paths) {
73
+ const yamlData = js_yaml_1.default.load(fs.readFileSync(p, 'utf-8'));
74
+ Object.assign(ret, yamlData);
75
+ }
76
+ }
77
+ return ret;
78
+ }
79
+ /**
80
+ * Reads test cases from a file in various formats (CSV, JSON, YAML, Python, JavaScript) and returns them as TestCase objects.
81
+ *
82
+ * Supports multiple input sources:
83
+ * - Hugging Face datasets (huggingface://datasets/...)
84
+ * - JavaScript/TypeScript files (.js, .ts, .mjs)
85
+ * - Python files (.py) with optional function name
86
+ * - Google Sheets (https://docs.google.com/spreadsheets/...)
87
+ * - Local CSV files with configurable delimiter
88
+ * - Local JSON files
89
+ * - Local YAML files (.yaml, .yml)
90
+ *
91
+ * For file-based inputs, each row/entry is converted into a TestCase object with an auto-generated description
92
+ * if none is provided.
93
+ *
94
+ * @param varsPath - Path or URL to the file containing test cases. Can include protocol prefixes for special handlers.
95
+ * @param basePath - Optional base path for resolving relative file paths. Defaults to empty string.
96
+ * @returns Promise resolving to an array of TestCase objects parsed from the input source.
97
+ * @throws Error if Python test function returns non-array result
98
+ */
99
+ async function readStandaloneTestsFile(varsPath, basePath = '') {
100
+ const resolvedVarsPath = path.resolve(basePath, varsPath.replace(/^file:\/\//, ''));
101
+ // Split on the last colon to handle Windows drive letters correctly
102
+ const colonCount = resolvedVarsPath.split(':').length - 1;
103
+ const lastColonIndex = resolvedVarsPath.lastIndexOf(':');
104
+ // For Windows paths, we need to account for the drive letter colon
105
+ const isWindowsPath = /^[A-Za-z]:/.test(resolvedVarsPath);
106
+ const effectiveColonCount = isWindowsPath ? colonCount - 1 : colonCount;
107
+ if (effectiveColonCount > 1) {
108
+ throw new Error(`Invalid Python test file path: ${varsPath}`);
109
+ }
110
+ const pathWithoutFunction = lastColonIndex > 1 ? resolvedVarsPath.slice(0, lastColonIndex) : resolvedVarsPath;
111
+ const maybeFunctionName = lastColonIndex > 1 ? resolvedVarsPath.slice(lastColonIndex + 1) : undefined;
112
+ const fileExtension = (0, path_1.parse)(pathWithoutFunction).ext.slice(1);
113
+ if (varsPath.startsWith('huggingface://datasets/')) {
114
+ telemetry_1.default.recordAndSendOnce('feature_used', {
115
+ feature: 'huggingface dataset',
116
+ });
117
+ return await (0, huggingfaceDatasets_1.fetchHuggingFaceDataset)(varsPath);
118
+ }
119
+ if ((0, file_1.isJavascriptFile)(pathWithoutFunction)) {
120
+ telemetry_1.default.recordAndSendOnce('feature_used', {
121
+ feature: 'js tests file',
122
+ });
123
+ const mod = await (0, esm_1.importModule)(pathWithoutFunction, maybeFunctionName);
124
+ return typeof mod === 'function' ? await mod() : mod;
125
+ }
126
+ if (fileExtension === 'py') {
127
+ telemetry_1.default.recordAndSendOnce('feature_used', {
128
+ feature: 'python tests file',
129
+ });
130
+ const result = await (0, pythonUtils_1.runPython)(pathWithoutFunction, maybeFunctionName ?? 'generate_tests', []);
131
+ if (!Array.isArray(result)) {
132
+ throw new Error(`Python test function must return a list of test cases, got ${typeof result}`);
133
+ }
134
+ return result;
135
+ }
136
+ let rows = [];
137
+ if (varsPath.startsWith('https://docs.google.com/spreadsheets/')) {
138
+ telemetry_1.default.recordAndSendOnce('feature_used', {
139
+ feature: 'csv tests file - google sheet',
140
+ });
141
+ rows = await (0, googleSheets_1.fetchCsvFromGoogleSheet)(varsPath);
142
+ }
143
+ else if (fileExtension === 'csv') {
144
+ telemetry_1.default.recordAndSendOnce('feature_used', {
145
+ feature: 'csv tests file - local',
146
+ });
147
+ const delimiter = (0, envars_1.getEnvString)('PROMPTFOO_CSV_DELIMITER', ',');
148
+ rows = (0, sync_1.parse)(fs.readFileSync(resolvedVarsPath, 'utf-8'), {
149
+ columns: true,
150
+ bom: true,
151
+ delimiter,
152
+ });
153
+ }
154
+ else if (fileExtension === 'json') {
155
+ telemetry_1.default.recordAndSendOnce('feature_used', {
156
+ feature: 'json tests file',
157
+ });
158
+ rows = js_yaml_1.default.load(fs.readFileSync(resolvedVarsPath, 'utf-8'));
159
+ }
160
+ else if (fileExtension === 'yaml' || fileExtension === 'yml') {
161
+ telemetry_1.default.recordAndSendOnce('feature_used', {
162
+ feature: 'yaml tests file',
163
+ });
164
+ rows = js_yaml_1.default.load(fs.readFileSync(resolvedVarsPath, 'utf-8'));
165
+ }
166
+ return rows.map((row, idx) => {
167
+ const test = (0, csv_1.testCaseFromCsvRow)(row);
168
+ test.description || (test.description = `Row #${idx + 1}`);
169
+ return test;
170
+ });
171
+ }
172
+ async function loadTestWithVars(testCase, testBasePath) {
173
+ const ret = { ...testCase, vars: undefined };
174
+ if (typeof testCase.vars === 'string' || Array.isArray(testCase.vars)) {
175
+ ret.vars = await readVarsFiles(testCase.vars, testBasePath);
176
+ }
177
+ else {
178
+ ret.vars = testCase.vars;
179
+ }
180
+ return ret;
181
+ }
182
+ async function readTest(test, basePath = '') {
183
+ let testCase;
184
+ if (typeof test === 'string') {
185
+ const testFilePath = path.resolve(basePath, test);
186
+ const testBasePath = path.dirname(testFilePath);
187
+ const rawTestCase = js_yaml_1.default.load(fs.readFileSync(testFilePath, 'utf-8'));
188
+ testCase = await loadTestWithVars(rawTestCase, testBasePath);
189
+ }
190
+ else {
191
+ testCase = await loadTestWithVars(test, basePath);
192
+ }
193
+ if (testCase.provider && typeof testCase.provider !== 'function') {
194
+ // Load provider
195
+ if (typeof testCase.provider === 'string') {
196
+ testCase.provider = await (0, providers_1.loadApiProvider)(testCase.provider);
197
+ }
198
+ else if (typeof testCase.provider.id === 'string') {
199
+ testCase.provider = await (0, providers_1.loadApiProvider)(testCase.provider.id, {
200
+ options: testCase.provider,
201
+ basePath,
202
+ });
203
+ }
204
+ }
205
+ if (!testCase.assert &&
206
+ !testCase.vars &&
207
+ !testCase.options &&
208
+ !testCase.metadata &&
209
+ !testCase.provider &&
210
+ !testCase.providerOutput &&
211
+ typeof testCase.threshold !== 'number') {
212
+ // Validate the shape of the test case
213
+ // We skip validation when loading the default test case, since it may not have all the properties
214
+ 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)}`);
215
+ }
216
+ return testCase;
217
+ }
218
+ /**
219
+ * Loads test cases from a glob pattern, supporting various file formats and sources.
220
+ * @param loadTestsGlob - The glob pattern or URL to load tests from
221
+ * @param basePath - Base path for resolving relative paths
222
+ * @returns Promise resolving to an array of TestCase objects
223
+ */
224
+ async function loadTestsFromGlob(loadTestsGlob, basePath = '') {
225
+ if (loadTestsGlob.startsWith('huggingface://datasets/')) {
226
+ telemetry_1.default.recordAndSendOnce('feature_used', {
227
+ feature: 'huggingface dataset',
228
+ });
229
+ return await (0, huggingfaceDatasets_1.fetchHuggingFaceDataset)(loadTestsGlob);
230
+ }
231
+ if (loadTestsGlob.startsWith('file://')) {
232
+ loadTestsGlob = loadTestsGlob.slice('file://'.length);
233
+ }
234
+ const resolvedPath = path.resolve(basePath, loadTestsGlob);
235
+ const testFiles = (0, glob_1.globSync)(resolvedPath, {
236
+ windowsPathsNoEscape: true,
237
+ });
238
+ // Check for possible function names in the path
239
+ const pathWithoutFunction = resolvedPath.split(':')[0];
240
+ // Only add the file if it's not already included by glob and it's a special file type
241
+ if (((0, file_1.isJavascriptFile)(pathWithoutFunction) || pathWithoutFunction.endsWith('.py')) &&
242
+ !testFiles.some((file) => file === resolvedPath || file === pathWithoutFunction)) {
243
+ testFiles.push(resolvedPath);
244
+ }
245
+ if (loadTestsGlob.startsWith('https://docs.google.com/spreadsheets/')) {
246
+ testFiles.push(loadTestsGlob);
247
+ }
248
+ const _deref = async (testCases, file) => {
249
+ logger_1.default.debug(`Dereferencing test file: ${file}`);
250
+ return (await json_schema_ref_parser_1.default.dereference(testCases));
251
+ };
252
+ const ret = [];
253
+ if (testFiles.length < 1) {
254
+ logger_1.default.error(`No test files found for path: ${loadTestsGlob}`);
255
+ return ret;
256
+ }
257
+ for (const testFile of testFiles) {
258
+ let testCases;
259
+ const pathWithoutFunction = testFile.split(':')[0];
260
+ if (testFile.endsWith('.csv') ||
261
+ testFile.startsWith('https://docs.google.com/spreadsheets/') ||
262
+ (0, file_1.isJavascriptFile)(pathWithoutFunction) ||
263
+ pathWithoutFunction.endsWith('.py')) {
264
+ testCases = await readStandaloneTestsFile(testFile, basePath);
265
+ }
266
+ else if (testFile.endsWith('.yaml') || testFile.endsWith('.yml')) {
267
+ testCases = js_yaml_1.default.load(fs.readFileSync(testFile, 'utf-8'));
268
+ testCases = await _deref(testCases, testFile);
269
+ }
270
+ else if (testFile.endsWith('.jsonl')) {
271
+ const fileContent = fs.readFileSync(testFile, 'utf-8');
272
+ testCases = fileContent
273
+ .split('\n')
274
+ .filter((line) => line.trim())
275
+ .map((line) => JSON.parse(line));
276
+ testCases = await _deref(testCases, testFile);
277
+ }
278
+ else if (testFile.endsWith('.json')) {
279
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
280
+ testCases = await _deref(require(testFile), testFile);
281
+ }
282
+ else {
283
+ throw new Error(`Unsupported file type for test file: ${testFile}`);
284
+ }
285
+ if (testCases) {
286
+ if (!Array.isArray(testCases) && typeof testCases === 'object') {
287
+ testCases = [testCases];
288
+ }
289
+ for (const testCase of testCases) {
290
+ ret.push(await readTest(testCase, path.dirname(testFile)));
291
+ }
292
+ }
293
+ }
294
+ return ret;
295
+ }
296
+ async function readTests(tests, basePath = '') {
297
+ const ret = [];
298
+ if (typeof tests === 'string') {
299
+ // Points to a tests file with multiple test cases
300
+ if (tests.endsWith('yaml') || tests.endsWith('yml')) {
301
+ return loadTestsFromGlob(tests, basePath);
302
+ }
303
+ // Points to a tests.{csv,json,yaml,yml,py,js,ts,mjs} or Google Sheet
304
+ return readStandaloneTestsFile(tests, basePath);
305
+ }
306
+ if (Array.isArray(tests)) {
307
+ for (const globOrTest of tests) {
308
+ if (typeof globOrTest === 'string') {
309
+ const pathWithoutFunction = globOrTest.split(':')[0];
310
+ // For Python and JS files, or files with potential function names, use readStandaloneTestsFile
311
+ if ((0, file_1.isJavascriptFile)(pathWithoutFunction) ||
312
+ pathWithoutFunction.endsWith('.py') ||
313
+ globOrTest.includes(':')) {
314
+ ret.push(...(await readStandaloneTestsFile(globOrTest, basePath)));
315
+ }
316
+ else {
317
+ // Resolve globs for other file types
318
+ ret.push(...(await loadTestsFromGlob(globOrTest, basePath)));
319
+ }
320
+ }
321
+ else {
322
+ // Load individual TestCase
323
+ ret.push(await readTest(globOrTest, basePath));
324
+ }
325
+ }
326
+ }
327
+ else if (tests !== undefined && tests !== null) {
328
+ logger_1.default.warn((0, dedent_1.default) `
329
+ Warning: Unsupported 'tests' format in promptfooconfig.yaml.
330
+ Expected: string, string[], or TestCase[], but received: ${typeof tests}
331
+
332
+ Please check your configuration file and ensure the 'tests' field is correctly formatted.
333
+ For more information, visit: https://promptfoo.dev/docs/configuration/reference/#test-case
334
+ `);
335
+ }
336
+ if (ret.some((testCase) => testCase.vars?.assert) &&
337
+ !(0, envars_1.getEnvBool)('PROMPTFOO_NO_TESTCASE_ASSERT_WARNING')) {
338
+ logger_1.default.warn((0, dedent_1.default) `
339
+ Warning: Found 'assert' key in vars. This is likely a mistake in your configuration.
340
+
341
+ 'assert' should be *unindented* so it is under the test itself, not vars. For example:
342
+
343
+ tests:
344
+ - vars:
345
+ foo: bar
346
+ assert:
347
+ - type: contains
348
+ value: "bar"
349
+
350
+ To disable this message, set the environment variable PROMPTFOO_NO_TESTCASE_ASSERT_WARNING=1.
351
+ `);
352
+ }
353
+ return ret;
354
+ }
355
+ //# sourceMappingURL=testCaseReader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testCaseReader.js","sourceRoot":"","sources":["../../../src/util/testCaseReader.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../../src/util/transform.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAG7C,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,oBAAY,kBAAkB;IAC5B,MAAM,WAAW;IACjB,IAAI,SAAS;CACd;AA+FD;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,SAAS,CAC7B,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,EAC3C,OAAO,EAAE,gBAAgB,EACzB,cAAc,GAAE,OAAc,EAC9B,SAAS,GAAE,kBAA8C,GACxD,OAAO,CAAC,IAAI,CAAC,CAUf"}
1
+ {"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../../src/util/transform.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAI7C,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,oBAAY,kBAAkB;IAC5B,MAAM,WAAW;IACjB,IAAI,SAAS;CACd;AAkHD;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,SAAS,CAC7B,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,EAC3C,OAAO,EAAE,gBAAgB,EACzB,cAAc,GAAE,OAAc,EAC9B,SAAS,GAAE,kBAA8C,GACxD,OAAO,CAAC,IAAI,CAAC,CAaf"}
@@ -5,11 +5,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.TransformInputType = void 0;
7
7
  exports.transform = transform;
8
- const path_1 = __importDefault(require("path"));
9
8
  const cliState_1 = __importDefault(require("../cliState"));
10
9
  const esm_1 = require("../esm");
10
+ const logger_1 = __importDefault(require("../logger"));
11
11
  const pythonUtils_1 = require("../python/pythonUtils");
12
12
  const file_1 = require("./file");
13
+ const file_node_1 = require("./file.node");
13
14
  var TransformInputType;
14
15
  (function (TransformInputType) {
15
16
  TransformInputType["OUTPUT"] = "output";
@@ -63,7 +64,7 @@ function getPythonTransformFunction(filePath, functionName = 'get_transform') {
63
64
  */
64
65
  async function getFileTransformFunction(filePath) {
65
66
  const [actualFilePath, functionName] = parseFilePathAndFunctionName(filePath.slice('file://'.length));
66
- const fullPath = path_1.default.join(cliState_1.default.basePath || '', actualFilePath);
67
+ const fullPath = (0, file_node_1.safeJoin)(cliState_1.default.basePath || '', actualFilePath);
67
68
  if ((0, file_1.isJavascriptFile)(fullPath)) {
68
69
  return getJavascriptTransformFunction(fullPath, functionName);
69
70
  }
@@ -86,10 +87,26 @@ function getInlineTransformFunction(code, inputType) {
86
87
  * @returns A Promise resolving to the appropriate transform function.
87
88
  */
88
89
  async function getTransformFunction(codeOrFilepath, inputType) {
90
+ let transformFn = null;
89
91
  if (codeOrFilepath.startsWith('file://')) {
90
- return getFileTransformFunction(codeOrFilepath);
92
+ try {
93
+ transformFn = await getFileTransformFunction(codeOrFilepath);
94
+ }
95
+ catch (error) {
96
+ logger_1.default.error(`Error loading transform function from file: ${error instanceof Error ? error.message : String(error)}`);
97
+ throw error;
98
+ }
91
99
  }
92
- return getInlineTransformFunction(codeOrFilepath, inputType);
100
+ else {
101
+ try {
102
+ transformFn = getInlineTransformFunction(codeOrFilepath, inputType);
103
+ }
104
+ catch (error) {
105
+ logger_1.default.error(`Error creating inline transform function: ${error instanceof Error ? error.message : String(error)}`);
106
+ throw error;
107
+ }
108
+ }
109
+ return transformFn;
93
110
  }
94
111
  /**
95
112
  * Transforms the output using a specified function or file.
@@ -108,6 +125,9 @@ async function getTransformFunction(codeOrFilepath, inputType) {
108
125
  */
109
126
  async function transform(codeOrFilepath, transformInput, context, validateReturn = true, inputType = TransformInputType.OUTPUT) {
110
127
  const postprocessFn = await getTransformFunction(codeOrFilepath, inputType);
128
+ if (!postprocessFn) {
129
+ throw new Error(`Invalid transform function for ${codeOrFilepath}`);
130
+ }
111
131
  const ret = await Promise.resolve(postprocessFn(transformInput, context));
112
132
  if (validateReturn && ret == null) {
113
133
  throw new Error(`Transform function did not return a value\n\n${codeOrFilepath}`);
@@ -1 +1 @@
1
- {"version":3,"file":"transform.js","sourceRoot":"","sources":["../../../src/util/transform.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"transform.js","sourceRoot":"","sources":["../../../src/util/transform.ts"],"names":[],"mappings":"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"}