promptfoo 0.69.2 → 0.70.1

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 (174) hide show
  1. package/dist/package.json +1 -1
  2. package/dist/src/assertions.d.ts +5 -9
  3. package/dist/src/assertions.d.ts.map +1 -1
  4. package/dist/src/assertions.js +12 -9
  5. package/dist/src/assertions.js.map +1 -1
  6. package/dist/src/commands/eval.d.ts +5 -0
  7. package/dist/src/commands/eval.d.ts.map +1 -0
  8. package/dist/src/commands/eval.js +288 -0
  9. package/dist/src/commands/eval.js.map +1 -0
  10. package/dist/src/commands/generate.d.ts +20 -0
  11. package/dist/src/commands/generate.d.ts.map +1 -0
  12. package/dist/src/commands/generate.js +215 -0
  13. package/dist/src/commands/generate.js.map +1 -0
  14. package/dist/src/commands/redteam.d.ts +10 -0
  15. package/dist/src/commands/redteam.d.ts.map +1 -0
  16. package/dist/src/commands/redteam.js +191 -0
  17. package/dist/src/commands/redteam.js.map +1 -0
  18. package/dist/src/config.d.ts +17 -0
  19. package/dist/src/config.d.ts.map +1 -0
  20. package/dist/src/config.js +424 -0
  21. package/dist/src/config.js.map +1 -0
  22. package/dist/src/evaluator.d.ts.map +1 -1
  23. package/dist/src/evaluator.js +12 -10
  24. package/dist/src/evaluator.js.map +1 -1
  25. package/dist/src/main.js +13 -569
  26. package/dist/src/main.js.map +1 -1
  27. package/dist/src/providers/pythonCompletion.d.ts +1 -0
  28. package/dist/src/providers/pythonCompletion.d.ts.map +1 -1
  29. package/dist/src/providers/pythonCompletion.js +10 -3
  30. package/dist/src/providers/pythonCompletion.js.map +1 -1
  31. package/dist/src/redteam/constants.d.ts +5 -0
  32. package/dist/src/redteam/constants.d.ts.map +1 -1
  33. package/dist/src/redteam/constants.js +53 -1
  34. package/dist/src/redteam/constants.js.map +1 -1
  35. package/dist/src/redteam/index.d.ts +0 -2
  36. package/dist/src/redteam/index.d.ts.map +1 -1
  37. package/dist/src/redteam/index.js +24 -40
  38. package/dist/src/redteam/index.js.map +1 -1
  39. package/dist/src/redteam/iterative.d.ts +1 -1
  40. package/dist/src/redteam/iterative.js +1 -1
  41. package/dist/src/redteam/iterative.js.map +1 -1
  42. package/dist/src/redteam/iterativeImage.d.ts +1 -1
  43. package/dist/src/redteam/iterativeImage.js +1 -1
  44. package/dist/src/redteam/iterativeImage.js.map +1 -1
  45. package/dist/src/redteam/plugins/base.d.ts +35 -0
  46. package/dist/src/redteam/plugins/base.d.ts.map +1 -0
  47. package/dist/src/redteam/plugins/base.js +48 -0
  48. package/dist/src/redteam/plugins/base.js.map +1 -0
  49. package/dist/src/redteam/plugins/competitors.d.ts +10 -0
  50. package/dist/src/redteam/plugins/competitors.d.ts.map +1 -0
  51. package/dist/src/redteam/plugins/competitors.js +47 -0
  52. package/dist/src/redteam/plugins/competitors.js.map +1 -0
  53. package/dist/src/redteam/plugins/contracts.d.ts +10 -0
  54. package/dist/src/redteam/plugins/contracts.d.ts.map +1 -0
  55. package/dist/src/redteam/plugins/contracts.js +47 -0
  56. package/dist/src/redteam/plugins/contracts.js.map +1 -0
  57. package/dist/src/redteam/plugins/excessiveAgency.d.ts +10 -0
  58. package/dist/src/redteam/plugins/excessiveAgency.d.ts.map +1 -0
  59. package/dist/src/redteam/plugins/excessiveAgency.js +42 -0
  60. package/dist/src/redteam/plugins/excessiveAgency.js.map +1 -0
  61. package/dist/src/redteam/plugins/hallucination.d.ts +10 -0
  62. package/dist/src/redteam/plugins/hallucination.d.ts.map +1 -0
  63. package/dist/src/redteam/plugins/hallucination.js +43 -0
  64. package/dist/src/redteam/plugins/hallucination.js.map +1 -0
  65. package/dist/src/redteam/{getHarmfulTests.d.ts → plugins/harmful.d.ts} +9 -9
  66. package/dist/src/redteam/plugins/harmful.d.ts.map +1 -0
  67. package/dist/src/redteam/{getHarmfulTests.js → plugins/harmful.js} +2 -2
  68. package/dist/src/redteam/plugins/harmful.js.map +1 -0
  69. package/dist/src/redteam/plugins/hijacking.d.ts +10 -0
  70. package/dist/src/redteam/plugins/hijacking.d.ts.map +1 -0
  71. package/dist/src/redteam/plugins/hijacking.js +47 -0
  72. package/dist/src/redteam/plugins/hijacking.js.map +1 -0
  73. package/dist/src/redteam/plugins/overreliance.d.ts +10 -0
  74. package/dist/src/redteam/plugins/overreliance.d.ts.map +1 -0
  75. package/dist/src/redteam/plugins/overreliance.js +42 -0
  76. package/dist/src/redteam/plugins/overreliance.js.map +1 -0
  77. package/dist/src/redteam/{getPiiTests.d.ts → plugins/pii.d.ts} +2 -2
  78. package/dist/src/redteam/plugins/pii.d.ts.map +1 -0
  79. package/dist/src/redteam/{getPiiTests.js → plugins/pii.js} +2 -2
  80. package/dist/src/redteam/plugins/pii.js.map +1 -0
  81. package/dist/src/redteam/plugins/politics.d.ts +10 -0
  82. package/dist/src/redteam/plugins/politics.d.ts.map +1 -0
  83. package/dist/src/redteam/plugins/politics.js +57 -0
  84. package/dist/src/redteam/plugins/politics.js.map +1 -0
  85. package/dist/src/testCases.d.ts.map +1 -1
  86. package/dist/src/testCases.js +3 -0
  87. package/dist/src/testCases.js.map +1 -1
  88. package/dist/src/types.d.ts +15 -3
  89. package/dist/src/types.d.ts.map +1 -1
  90. package/dist/src/types.js +9 -2
  91. package/dist/src/types.js.map +1 -1
  92. package/dist/src/util.d.ts +0 -10
  93. package/dist/src/util.d.ts.map +1 -1
  94. package/dist/src/util.js +2 -246
  95. package/dist/src/util.js.map +1 -1
  96. package/dist/src/web/nextui/404/index.html +1 -1
  97. package/dist/src/web/nextui/404.html +1 -1
  98. package/dist/src/web/nextui/_next/static/chunks/858-5d3a3678769b7e36.js +1 -1
  99. package/dist/src/web/nextui/_next/static/chunks/954-c35d4864ecbacd62.js +6 -0
  100. package/dist/src/web/nextui/_next/static/chunks/app/auth/login/{page-ee73165dd261f3ca.js → page-6fcc9431205718c7.js} +1 -1
  101. package/dist/src/web/nextui/_next/static/chunks/app/auth/signup/{page-7375a6707eb8675e.js → page-8caf49a834d34420.js} +1 -1
  102. package/dist/src/web/nextui/_next/static/chunks/app/datasets/page-4f93aacd25866d60.js +1 -0
  103. package/dist/src/web/nextui/_next/static/chunks/app/eval/[id]/not-found-ce320e6d1e6d1d23.js +1 -0
  104. package/dist/src/web/nextui/_next/static/chunks/app/eval/[id]/{page-310e2e58179970fa.js → page-3c5a944373865122.js} +1 -1
  105. package/dist/src/web/nextui/_next/static/chunks/app/eval/page-73e894c39cc191f1.js +1 -0
  106. package/dist/src/web/nextui/_next/static/chunks/app/{layout-6b3048b719443145.js → layout-2038906de6c19565.js} +1 -1
  107. package/dist/src/web/nextui/_next/static/chunks/app/{page-251d4ea0ac894cd9.js → page-e07a0ddbf3d6e21c.js} +1 -1
  108. package/dist/src/web/nextui/_next/static/chunks/app/progress/page-73442c531d579c51.js +1 -0
  109. package/dist/src/web/nextui/_next/static/chunks/app/prompts/{page-6d29c01079a556f4.js → page-50e27c24c9e255bd.js} +1 -1
  110. package/dist/src/web/nextui/_next/static/chunks/app/report/{page-477181752ee9b493.js → page-be00cf77531ce9cb.js} +1 -1
  111. package/dist/src/web/nextui/_next/static/chunks/app/setup/{page-5a4d6156d3c83470.js → page-26cb5d2478fdbd34.js} +1 -1
  112. package/dist/src/web/nextui/_next/static/chunks/{main-app-345c3eca7e5cf432.js → main-app-929a26b3c8cd3f7a.js} +1 -1
  113. package/dist/src/web/nextui/_next/static/chunks/{webpack-c9f728822666f852.js → webpack-8a9bc9ee0defb756.js} +1 -1
  114. package/dist/src/web/nextui/_next/static/css/106779eb64615639.css +1 -0
  115. package/dist/src/web/nextui/auth/login/index.html +1 -1
  116. package/dist/src/web/nextui/auth/login/index.txt +6 -6
  117. package/dist/src/web/nextui/auth/signup/index.html +1 -1
  118. package/dist/src/web/nextui/auth/signup/index.txt +6 -6
  119. package/dist/src/web/nextui/datasets/index.html +1 -1
  120. package/dist/src/web/nextui/datasets/index.txt +6 -6
  121. package/dist/src/web/nextui/eval/index.html +1 -1
  122. package/dist/src/web/nextui/eval/index.txt +6 -6
  123. package/dist/src/web/nextui/index.html +1 -1
  124. package/dist/src/web/nextui/index.txt +5 -5
  125. package/dist/src/web/nextui/progress/index.html +1 -1
  126. package/dist/src/web/nextui/progress/index.txt +6 -6
  127. package/dist/src/web/nextui/prompts/index.html +1 -1
  128. package/dist/src/web/nextui/prompts/index.txt +6 -6
  129. package/dist/src/web/nextui/report/index.html +1 -1
  130. package/dist/src/web/nextui/report/index.txt +6 -6
  131. package/dist/src/web/nextui/setup/index.html +2 -2
  132. package/dist/src/web/nextui/setup/index.txt +7 -7
  133. package/package.json +1 -1
  134. package/dist/src/redteam/getCompetitorTests.d.ts +0 -3
  135. package/dist/src/redteam/getCompetitorTests.d.ts.map +0 -1
  136. package/dist/src/redteam/getCompetitorTests.js +0 -60
  137. package/dist/src/redteam/getCompetitorTests.js.map +0 -1
  138. package/dist/src/redteam/getHallucinationTests.d.ts +0 -3
  139. package/dist/src/redteam/getHallucinationTests.d.ts.map +0 -1
  140. package/dist/src/redteam/getHallucinationTests.js +0 -56
  141. package/dist/src/redteam/getHallucinationTests.js.map +0 -1
  142. package/dist/src/redteam/getHarmfulTests.d.ts.map +0 -1
  143. package/dist/src/redteam/getHarmfulTests.js.map +0 -1
  144. package/dist/src/redteam/getHijackingTests.d.ts +0 -3
  145. package/dist/src/redteam/getHijackingTests.d.ts.map +0 -1
  146. package/dist/src/redteam/getHijackingTests.js +0 -60
  147. package/dist/src/redteam/getHijackingTests.js.map +0 -1
  148. package/dist/src/redteam/getOverconfidenceTests.d.ts +0 -3
  149. package/dist/src/redteam/getOverconfidenceTests.d.ts.map +0 -1
  150. package/dist/src/redteam/getOverconfidenceTests.js +0 -55
  151. package/dist/src/redteam/getOverconfidenceTests.js.map +0 -1
  152. package/dist/src/redteam/getPiiTests.d.ts.map +0 -1
  153. package/dist/src/redteam/getPiiTests.js.map +0 -1
  154. package/dist/src/redteam/getPoliticalStatementsTests.d.ts +0 -3
  155. package/dist/src/redteam/getPoliticalStatementsTests.d.ts.map +0 -1
  156. package/dist/src/redteam/getPoliticalStatementsTests.js +0 -70
  157. package/dist/src/redteam/getPoliticalStatementsTests.js.map +0 -1
  158. package/dist/src/redteam/getUnderconfidenceTests.d.ts +0 -3
  159. package/dist/src/redteam/getUnderconfidenceTests.d.ts.map +0 -1
  160. package/dist/src/redteam/getUnderconfidenceTests.js +0 -55
  161. package/dist/src/redteam/getUnderconfidenceTests.js.map +0 -1
  162. package/dist/src/redteam/getUnintendedContractTests.d.ts +0 -3
  163. package/dist/src/redteam/getUnintendedContractTests.d.ts.map +0 -1
  164. package/dist/src/redteam/getUnintendedContractTests.js +0 -60
  165. package/dist/src/redteam/getUnintendedContractTests.js.map +0 -1
  166. package/dist/src/web/nextui/_next/static/chunks/954-58788165fb1e9563.js +0 -6
  167. package/dist/src/web/nextui/_next/static/chunks/app/datasets/page-c11cfb1b2c58325f.js +0 -1
  168. package/dist/src/web/nextui/_next/static/chunks/app/eval/[id]/not-found-50073ee4b153b82b.js +0 -1
  169. package/dist/src/web/nextui/_next/static/chunks/app/eval/page-87d1e9bc26842e95.js +0 -1
  170. package/dist/src/web/nextui/_next/static/chunks/app/progress/page-15df1d043dee2f17.js +0 -1
  171. package/dist/src/web/nextui/_next/static/css/5bd2f45de1f3ba83.css +0 -1
  172. /package/dist/src/web/nextui/_next/static/{_4HZa8ihrRiRqQU13EScL → ENNANMoEha-uMGFo0DvzO}/_buildManifest.js +0 -0
  173. /package/dist/src/web/nextui/_next/static/{_4HZa8ihrRiRqQU13EScL → ENNANMoEha-uMGFo0DvzO}/_ssgManifest.js +0 -0
  174. /package/dist/src/web/nextui/_next/static/chunks/{2-57ab5e84907f795a.js → 2-671ad31c05d2c976.js} +0 -0
@@ -0,0 +1,424 @@
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 (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.dereferenceConfig = dereferenceConfig;
30
+ exports.readConfig = readConfig;
31
+ exports.maybeReadConfig = maybeReadConfig;
32
+ exports.readConfigs = readConfigs;
33
+ exports.resolveConfigs = resolveConfigs;
34
+ const json_schema_ref_parser_1 = __importDefault(require("@apidevtools/json-schema-ref-parser"));
35
+ const chalk_1 = __importDefault(require("chalk"));
36
+ const dedent_1 = __importDefault(require("dedent"));
37
+ const fs = __importStar(require("fs"));
38
+ const glob_1 = require("glob");
39
+ const js_yaml_1 = __importDefault(require("js-yaml"));
40
+ const path = __importStar(require("path"));
41
+ const tiny_invariant_1 = __importDefault(require("tiny-invariant"));
42
+ const assertions_1 = require("./assertions");
43
+ const validateAssertions_1 = require("./assertions/validateAssertions");
44
+ const filterTests_1 = require("./commands/eval/filterTests");
45
+ const esm_1 = require("./esm");
46
+ const logger_1 = __importDefault(require("./logger"));
47
+ const prompts_1 = require("./prompts");
48
+ const providers_1 = require("./providers");
49
+ const testCases_1 = require("./testCases");
50
+ const types_1 = require("./types");
51
+ const util_1 = require("./util");
52
+ async function dereferenceConfig(rawConfig) {
53
+ if (process.env.PROMPTFOO_DISABLE_REF_PARSER) {
54
+ return rawConfig;
55
+ }
56
+ // Track and delete tools[i].function for each tool, preserving the rest of the properties
57
+ // https://github.com/promptfoo/promptfoo/issues/364
58
+ // Remove parameters from functions and tools to prevent dereferencing
59
+ const extractFunctionParameters = (functions) => {
60
+ return functions.map((func) => {
61
+ const { parameters } = func;
62
+ delete func.parameters;
63
+ return { parameters };
64
+ });
65
+ };
66
+ const extractToolParameters = (tools) => {
67
+ return tools.map((tool) => {
68
+ const { parameters } = tool.function || {};
69
+ if (tool.function?.parameters) {
70
+ delete tool.function.parameters;
71
+ }
72
+ return { parameters };
73
+ });
74
+ };
75
+ // Restore parameters to functions and tools after dereferencing
76
+ const restoreFunctionParameters = (functions, parametersList) => {
77
+ functions.forEach((func, index) => {
78
+ if (parametersList[index]?.parameters) {
79
+ func.parameters = parametersList[index].parameters;
80
+ }
81
+ });
82
+ };
83
+ const restoreToolParameters = (tools, parametersList) => {
84
+ tools.forEach((tool, index) => {
85
+ if (parametersList[index]?.parameters) {
86
+ tool.function = tool.function || {};
87
+ tool.function.parameters = parametersList[index].parameters;
88
+ }
89
+ });
90
+ };
91
+ const functionsParametersList = [];
92
+ const toolsParametersList = [];
93
+ if (Array.isArray(rawConfig.providers)) {
94
+ rawConfig.providers.forEach((provider, providerIndex) => {
95
+ if (typeof provider === 'string')
96
+ return;
97
+ if (typeof provider === 'function')
98
+ return;
99
+ if (!provider.config) {
100
+ // Handle when provider is a map
101
+ provider = Object.values(provider)[0];
102
+ }
103
+ if (provider.config?.functions) {
104
+ functionsParametersList[providerIndex] = extractFunctionParameters(provider.config.functions);
105
+ }
106
+ if (provider.config?.tools) {
107
+ toolsParametersList[providerIndex] = extractToolParameters(provider.config.tools);
108
+ }
109
+ });
110
+ }
111
+ // Dereference JSON
112
+ const config = (await json_schema_ref_parser_1.default.dereference(rawConfig));
113
+ // Restore functions and tools parameters
114
+ if (Array.isArray(config.providers)) {
115
+ config.providers.forEach((provider, index) => {
116
+ if (typeof provider === 'string')
117
+ return;
118
+ if (typeof provider === 'function')
119
+ return;
120
+ if (!provider.config) {
121
+ // Handle when provider is a map
122
+ provider = Object.values(provider)[0];
123
+ }
124
+ if (functionsParametersList[index]) {
125
+ provider.config.functions = provider.config.functions || [];
126
+ restoreFunctionParameters(provider.config.functions, functionsParametersList[index]);
127
+ }
128
+ if (toolsParametersList[index]) {
129
+ provider.config.tools = provider.config.tools || [];
130
+ restoreToolParameters(provider.config.tools, toolsParametersList[index]);
131
+ }
132
+ });
133
+ }
134
+ return config;
135
+ }
136
+ async function readConfig(configPath) {
137
+ const ext = path.parse(configPath).ext;
138
+ switch (ext) {
139
+ case '.json':
140
+ case '.yaml':
141
+ case '.yml':
142
+ const rawConfig = js_yaml_1.default.load(fs.readFileSync(configPath, 'utf-8'));
143
+ return dereferenceConfig(rawConfig);
144
+ case '.js':
145
+ case '.cjs':
146
+ case '.mjs':
147
+ return (await (0, esm_1.importModule)(configPath));
148
+ default:
149
+ throw new Error(`Unsupported configuration file format: ${ext}`);
150
+ }
151
+ }
152
+ async function maybeReadConfig(configPath) {
153
+ if (!fs.existsSync(configPath)) {
154
+ return undefined;
155
+ }
156
+ return readConfig(configPath);
157
+ }
158
+ /**
159
+ * Reads multiple configuration files and combines them into a single UnifiedConfig.
160
+ *
161
+ * @param {string[]} configPaths - An array of paths to configuration files. Supports glob patterns.
162
+ * @returns {Promise<UnifiedConfig>} A promise that resolves to a unified configuration object.
163
+ */
164
+ async function readConfigs(configPaths) {
165
+ const configs = [];
166
+ for (const configPath of configPaths) {
167
+ const globPaths = (0, glob_1.globSync)(configPath, {
168
+ windowsPathsNoEscape: true,
169
+ });
170
+ if (globPaths.length === 0) {
171
+ throw new Error(`No configuration file found at ${configPath}`);
172
+ }
173
+ for (const globPath of globPaths) {
174
+ const config = await readConfig(globPath);
175
+ configs.push(config);
176
+ }
177
+ }
178
+ const providers = [];
179
+ const seenProviders = new Set();
180
+ configs.forEach((config) => {
181
+ (0, tiny_invariant_1.default)(typeof config.providers !== 'function', 'Providers cannot be a function for multiple configs');
182
+ if (typeof config.providers === 'string') {
183
+ if (!seenProviders.has(config.providers)) {
184
+ providers.push(config.providers);
185
+ seenProviders.add(config.providers);
186
+ }
187
+ }
188
+ else if (Array.isArray(config.providers)) {
189
+ config.providers.forEach((provider) => {
190
+ if (!seenProviders.has(JSON.stringify(provider))) {
191
+ providers.push(provider);
192
+ seenProviders.add(JSON.stringify(provider));
193
+ }
194
+ });
195
+ }
196
+ });
197
+ const tests = [];
198
+ for (const config of configs) {
199
+ if (typeof config.tests === 'string') {
200
+ const newTests = await (0, testCases_1.readTests)(config.tests, path.dirname(configPaths[0]));
201
+ tests.push(...newTests);
202
+ }
203
+ else if (Array.isArray(config.tests)) {
204
+ tests.push(...config.tests);
205
+ }
206
+ }
207
+ const configsAreStringOrArray = configs.every((config) => typeof config.prompts === 'string' || Array.isArray(config.prompts));
208
+ const configsAreObjects = configs.every((config) => typeof config.prompts === 'object');
209
+ let prompts = configsAreStringOrArray ? [] : {};
210
+ const makeAbsolute = (configPath, relativePath) => {
211
+ if (typeof relativePath === 'string') {
212
+ if (relativePath.startsWith('file://')) {
213
+ relativePath =
214
+ 'file://' + path.resolve(path.dirname(configPath), relativePath.slice('file://'.length));
215
+ }
216
+ return relativePath;
217
+ }
218
+ else if (typeof relativePath === 'object' && relativePath.id) {
219
+ if (relativePath.id.startsWith('file://')) {
220
+ relativePath.id =
221
+ 'file://' +
222
+ path.resolve(path.dirname(configPath), relativePath.id.slice('file://'.length));
223
+ }
224
+ return relativePath;
225
+ }
226
+ else {
227
+ throw new Error('Invalid prompt object');
228
+ }
229
+ };
230
+ const seenPrompts = new Set();
231
+ const addSeenPrompt = (prompt) => {
232
+ if (typeof prompt === 'string') {
233
+ seenPrompts.add(prompt);
234
+ }
235
+ else if (typeof prompt === 'object' && prompt.id) {
236
+ seenPrompts.add(prompt);
237
+ }
238
+ else {
239
+ throw new Error('Invalid prompt object');
240
+ }
241
+ };
242
+ configs.forEach((config, idx) => {
243
+ if (typeof config.prompts === 'string') {
244
+ (0, tiny_invariant_1.default)(Array.isArray(prompts), 'Cannot mix string and map-type prompts');
245
+ const absolutePrompt = makeAbsolute(configPaths[idx], config.prompts);
246
+ addSeenPrompt(absolutePrompt);
247
+ }
248
+ else if (Array.isArray(config.prompts)) {
249
+ (0, tiny_invariant_1.default)(Array.isArray(prompts), 'Cannot mix configs with map and array-type prompts');
250
+ config.prompts
251
+ .map((prompt) => makeAbsolute(configPaths[idx], prompt))
252
+ .forEach((prompt) => addSeenPrompt(prompt));
253
+ }
254
+ else {
255
+ // Object format such as { 'prompts/prompt1.txt': 'foo', 'prompts/prompt2.txt': 'bar' }
256
+ (0, tiny_invariant_1.default)(typeof prompts === 'object', 'Cannot mix configs with map and array-type prompts');
257
+ prompts = { ...prompts, ...config.prompts };
258
+ }
259
+ });
260
+ if (Array.isArray(prompts)) {
261
+ prompts.push(...Array.from(seenPrompts));
262
+ }
263
+ // Combine all configs into a single UnifiedConfig
264
+ const combinedConfig = {
265
+ description: configs.map((config) => config.description).join(', '),
266
+ providers,
267
+ prompts,
268
+ tests,
269
+ scenarios: configs.flatMap((config) => config.scenarios || []),
270
+ defaultTest: configs.reduce((prev, curr) => {
271
+ return {
272
+ ...prev,
273
+ ...curr.defaultTest,
274
+ vars: { ...prev?.vars, ...curr.defaultTest?.vars },
275
+ assert: [...(prev?.assert || []), ...(curr.defaultTest?.assert || [])],
276
+ options: { ...prev?.options, ...curr.defaultTest?.options },
277
+ };
278
+ }, {}),
279
+ nunjucksFilters: configs.reduce((prev, curr) => ({ ...prev, ...curr.nunjucksFilters }), {}),
280
+ env: configs.reduce((prev, curr) => ({ ...prev, ...curr.env }), {}),
281
+ evaluateOptions: configs.reduce((prev, curr) => ({ ...prev, ...curr.evaluateOptions }), {}),
282
+ commandLineOptions: configs.reduce((prev, curr) => ({ ...prev, ...curr.commandLineOptions }), {}),
283
+ metadata: configs.reduce((prev, curr) => ({ ...prev, ...curr.metadata }), {}),
284
+ sharing: !configs.some((config) => config.sharing === false),
285
+ };
286
+ return combinedConfig;
287
+ }
288
+ async function resolveConfigs(cmdObj, defaultConfig) {
289
+ // Config parsing
290
+ let fileConfig = {};
291
+ const configPaths = cmdObj.config;
292
+ if (configPaths) {
293
+ fileConfig = await readConfigs(configPaths);
294
+ }
295
+ // Standalone assertion mode
296
+ if (cmdObj.assertions) {
297
+ if (!cmdObj.modelOutputs) {
298
+ logger_1.default.error(chalk_1.default.red('You must provide --model-outputs when using --assertions'));
299
+ process.exit(1);
300
+ }
301
+ const modelOutputs = JSON.parse(fs.readFileSync(path.join(process.cwd(), cmdObj.modelOutputs), 'utf8'));
302
+ const assertions = await (0, assertions_1.readAssertions)(cmdObj.assertions);
303
+ fileConfig.prompts = ['{{output}}'];
304
+ fileConfig.providers = ['echo'];
305
+ fileConfig.tests = modelOutputs.map((output) => {
306
+ if (typeof output === 'string') {
307
+ return {
308
+ vars: {
309
+ output,
310
+ },
311
+ assert: assertions,
312
+ };
313
+ }
314
+ return {
315
+ vars: {
316
+ output: output.output,
317
+ ...(output.tags === undefined ? {} : { tags: output.tags.join(', ') }),
318
+ },
319
+ assert: assertions,
320
+ };
321
+ });
322
+ }
323
+ // Use basepath in cases where path was supplied in the config file
324
+ const basePath = configPaths ? path.dirname(configPaths[0]) : '';
325
+ const defaultTestRaw = fileConfig.defaultTest || defaultConfig.defaultTest;
326
+ const config = {
327
+ description: fileConfig.description || defaultConfig.description,
328
+ prompts: cmdObj.prompts || fileConfig.prompts || defaultConfig.prompts || [],
329
+ providers: cmdObj.providers || fileConfig.providers || defaultConfig.providers || [],
330
+ tests: cmdObj.tests || cmdObj.vars || fileConfig.tests || defaultConfig.tests || [],
331
+ scenarios: fileConfig.scenarios || defaultConfig.scenarios,
332
+ env: fileConfig.env || defaultConfig.env,
333
+ sharing: process.env.PROMPTFOO_DISABLE_SHARING === '1'
334
+ ? false
335
+ : fileConfig.sharing ?? defaultConfig.sharing ?? true,
336
+ defaultTest: defaultTestRaw ? await (0, testCases_1.readTest)(defaultTestRaw, basePath) : undefined,
337
+ derivedMetrics: fileConfig.derivedMetrics || defaultConfig.derivedMetrics,
338
+ outputPath: cmdObj.output || fileConfig.outputPath || defaultConfig.outputPath,
339
+ metadata: fileConfig.metadata || defaultConfig.metadata,
340
+ };
341
+ // Validation
342
+ if (!config.prompts || config.prompts.length === 0) {
343
+ logger_1.default.error(chalk_1.default.red('You must provide at least 1 prompt'));
344
+ process.exit(1);
345
+ }
346
+ if (!config.providers || config.providers.length === 0) {
347
+ logger_1.default.error(chalk_1.default.red('You must specify at least 1 provider (for example, openai:gpt-4o)'));
348
+ process.exit(1);
349
+ }
350
+ (0, tiny_invariant_1.default)(Array.isArray(config.providers), 'providers must be an array');
351
+ config.providers.forEach((provider) => {
352
+ const result = types_1.ProviderSchema.safeParse(provider);
353
+ if (!result.success) {
354
+ const errors = result.error.errors
355
+ .map((err) => {
356
+ return `- ${err.message}`;
357
+ })
358
+ .join('\n');
359
+ const providerString = typeof provider === 'string' ? provider : JSON.stringify(provider);
360
+ logger_1.default.warn(chalk_1.default.yellow((0, dedent_1.default) `
361
+ Provider: ${providerString} encountered errors during schema validation:
362
+
363
+ ${errors}
364
+
365
+ Please double check your configuration.` + '\n'));
366
+ }
367
+ });
368
+ // Parse prompts, providers, and tests
369
+ const parsedPrompts = await (0, prompts_1.readPrompts)(config.prompts, cmdObj.prompts ? undefined : basePath);
370
+ const parsedProviders = await (0, providers_1.loadApiProviders)(config.providers, {
371
+ env: config.env,
372
+ basePath,
373
+ });
374
+ const parsedTests = await (0, testCases_1.readTests)(config.tests || [], cmdObj.tests ? undefined : basePath);
375
+ // Parse testCases for each scenario
376
+ if (fileConfig.scenarios) {
377
+ for (const scenario of fileConfig.scenarios) {
378
+ const parsedScenarioTests = await (0, testCases_1.readTests)(scenario.tests, cmdObj.tests ? undefined : basePath);
379
+ scenario.tests = parsedScenarioTests;
380
+ const filteredTests = await (0, filterTests_1.filterTests)({
381
+ ...scenario,
382
+ providers: parsedProviders,
383
+ prompts: parsedPrompts,
384
+ }, {
385
+ firstN: cmdObj.filterFirstN,
386
+ pattern: cmdObj.filterPattern,
387
+ failing: cmdObj.filterFailing,
388
+ });
389
+ (0, tiny_invariant_1.default)(filteredTests, 'filteredTests are undefined');
390
+ scenario.tests = filteredTests;
391
+ }
392
+ }
393
+ const parsedProviderPromptMap = (0, prompts_1.readProviderPromptMap)(config, parsedPrompts);
394
+ if (parsedPrompts.length === 0) {
395
+ logger_1.default.error(chalk_1.default.red('No prompts found'));
396
+ process.exit(1);
397
+ }
398
+ const defaultTest = {
399
+ options: {
400
+ prefix: cmdObj.promptPrefix,
401
+ suffix: cmdObj.promptSuffix,
402
+ provider: cmdObj.grader,
403
+ // rubricPrompt
404
+ ...(config.defaultTest?.options || {}),
405
+ },
406
+ ...config.defaultTest,
407
+ };
408
+ const testSuite = {
409
+ description: config.description,
410
+ prompts: parsedPrompts,
411
+ providers: parsedProviders,
412
+ providerPromptMap: parsedProviderPromptMap,
413
+ tests: parsedTests,
414
+ scenarios: config.scenarios,
415
+ defaultTest,
416
+ derivedMetrics: config.derivedMetrics,
417
+ nunjucksFilters: await (0, util_1.readFilters)(fileConfig.nunjucksFilters || defaultConfig.nunjucksFilters || {}),
418
+ };
419
+ if (testSuite.tests) {
420
+ (0, validateAssertions_1.validateAssertions)(testSuite.tests);
421
+ }
422
+ return { config, testSuite, basePath };
423
+ }
424
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"evaluator.d.ts","sourceRoot":"","sources":["../../src/evaluator.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EACV,WAAW,EAEX,eAAe,EAGf,eAAe,EAEf,iBAAiB,EACjB,MAAM,EAEN,SAAS,EAGV,MAAM,SAAS,CAAC;AAGjB,eAAO,MAAM,uBAAuB,IAAI,CAAC;AAEzC;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,OAAO,CAM7F;AAED,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,GAAG,CAAC,GAC5C,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,CAqClC;AAED,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GACzC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CA4BjC;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,EACrC,eAAe,CAAC,EAAE,iBAAiB,EACnC,QAAQ,CAAC,EAAE,WAAW,GACrB,OAAO,CAAC,MAAM,CAAC,CAuHjB;AA+wBD,wBAAgB,QAAQ,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,eAAe,4BAGtE"}
1
+ {"version":3,"file":"evaluator.d.ts","sourceRoot":"","sources":["../../src/evaluator.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EACV,WAAW,EAEX,eAAe,EAGf,eAAe,EAEf,iBAAiB,EACjB,MAAM,EAEN,SAAS,EAGV,MAAM,SAAS,CAAC;AAGjB,eAAO,MAAM,uBAAuB,IAAI,CAAC;AAEzC;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,OAAO,CAM7F;AAED,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,GAAG,CAAC,GAC5C,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,CAqClC;AAED,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GACzC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CA4BjC;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,EACrC,eAAe,CAAC,EAAE,iBAAiB,EACnC,QAAQ,CAAC,EAAE,WAAW,GACrB,OAAO,CAAC,MAAM,CAAC,CAuHjB;AAixBD,wBAAgB,QAAQ,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,eAAe,4BAGtE"}
@@ -356,11 +356,9 @@ class Evaluator {
356
356
  const checkResult = await (0, assertions_1.runAssertions)({
357
357
  prompt: renderedPrompt,
358
358
  provider,
359
+ providerResponse: processedResponse,
359
360
  test,
360
- output: processedResponse.output,
361
361
  latencyMs: response.cached ? undefined : latencyMs,
362
- logProbs: response.logProbs,
363
- cost: processedResponse.cost,
364
362
  });
365
363
  if (!checkResult.pass) {
366
364
  ret.error = checkResult.reason;
@@ -453,16 +451,18 @@ class Evaluator {
453
451
  }
454
452
  }
455
453
  // Split prompts by provider
456
- for (const prompt of testSuite.prompts) {
457
- for (const provider of testSuite.providers) {
454
+ // Order matters - keep provider in outer loop to reduce need to swap models during local inference.
455
+ for (const provider of testSuite.providers) {
456
+ for (const prompt of testSuite.prompts) {
458
457
  // Check if providerPromptMap exists and if it contains the current prompt's label
459
- if (!isAllowedPrompt(prompt, testSuite.providerPromptMap?.[provider.id()])) {
458
+ const providerKey = provider.label || provider.id();
459
+ if (!isAllowedPrompt(prompt, testSuite.providerPromptMap?.[providerKey])) {
460
460
  continue;
461
461
  }
462
462
  const completedPrompt = {
463
463
  ...prompt,
464
464
  id: (0, util_1.sha256)(typeof prompt.raw === 'object' ? JSON.stringify(prompt.raw) : prompt.raw),
465
- provider: provider.label || provider.id(),
465
+ provider: providerKey,
466
466
  label: prompt.label,
467
467
  metrics: {
468
468
  score: 0,
@@ -560,9 +560,11 @@ class Evaluator {
560
560
  for (let repeatIndex = 0; repeatIndex < numRepeat; repeatIndex++) {
561
561
  for (const vars of varCombinations) {
562
562
  let colIndex = 0;
563
- for (const prompt of testSuite.prompts) {
564
- for (const provider of testSuite.providers) {
565
- if (!isAllowedPrompt(prompt, testSuite.providerPromptMap?.[provider.id()])) {
563
+ // Order matters - keep provider in outer loop to reduce need to swap models during local inference.
564
+ for (const provider of testSuite.providers) {
565
+ for (const prompt of testSuite.prompts) {
566
+ const providerKey = provider.label || provider.id();
567
+ if (!isAllowedPrompt(prompt, testSuite.providerPromptMap?.[providerKey])) {
566
568
  continue;
567
569
  }
568
570
  runEvalOptions.push({