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,20 @@
1
+ import { Command } from 'commander';
2
+ import { UnifiedConfig } from '../types';
3
+ interface RedteamGenerateOptions {
4
+ addPlugins?: string[];
5
+ cache: boolean;
6
+ config?: string;
7
+ envFile?: string;
8
+ injectVar?: string;
9
+ output?: string;
10
+ plugins?: string[];
11
+ provider?: string;
12
+ purpose?: string;
13
+ write: boolean;
14
+ defaultConfig: Partial<UnifiedConfig>;
15
+ defaultConfigPath: string | undefined;
16
+ }
17
+ export declare function doGenerateRedteam({ addPlugins, cache, config, envFile, injectVar, output, plugins, provider, purpose, write, defaultConfig, defaultConfigPath, }: RedteamGenerateOptions): Promise<void>;
18
+ export declare function generateCommand(program: Command, defaultConfig: Partial<UnifiedConfig>, defaultConfigPath: string | undefined): void;
19
+ export {};
20
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../../src/commands/generate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,OAAO,EAAa,aAAa,EAAE,MAAM,UAAU,CAAC;AAGpD,UAAU,sBAAsB;IAE9B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IAGf,aAAa,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IACtC,iBAAiB,EAAE,MAAM,GAAG,SAAS,CAAC;CACvC;AAED,wBAAsB,iBAAiB,CAAC,EACtC,UAAU,EACV,KAAK,EACL,MAAM,EACN,OAAO,EACP,SAAS,EACT,MAAM,EACN,OAAO,EACP,QAAQ,EACR,OAAO,EACP,KAAK,EACL,aAAa,EACb,iBAAiB,GAClB,EAAE,sBAAsB,iBAuFxB;AAED,wBAAgB,eAAe,CAC7B,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,OAAO,CAAC,aAAa,CAAC,EACrC,iBAAiB,EAAE,MAAM,GAAG,SAAS,QA6ItC"}
@@ -0,0 +1,215 @@
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.doGenerateRedteam = doGenerateRedteam;
30
+ exports.generateCommand = generateCommand;
31
+ const chalk_1 = __importDefault(require("chalk"));
32
+ const dedent_1 = __importDefault(require("dedent"));
33
+ const fs = __importStar(require("fs"));
34
+ const js_yaml_1 = __importDefault(require("js-yaml"));
35
+ const cache_1 = require("../cache");
36
+ const config_1 = require("../config");
37
+ const logger_1 = __importDefault(require("../logger"));
38
+ const redteam_1 = require("../redteam");
39
+ const constants_1 = require("../redteam/constants");
40
+ const telemetry_1 = __importDefault(require("../telemetry"));
41
+ const testCases_1 = require("../testCases");
42
+ const util_1 = require("../util");
43
+ async function doGenerateRedteam({ addPlugins, cache, config, envFile, injectVar, output, plugins, provider, purpose, write, defaultConfig, defaultConfigPath, }) {
44
+ (0, util_1.setupEnv)(envFile);
45
+ if (!cache) {
46
+ logger_1.default.info('Cache is disabled.');
47
+ (0, cache_1.disableCache)();
48
+ }
49
+ let testSuite;
50
+ const configPath = config || defaultConfigPath;
51
+ if (configPath) {
52
+ const resolved = await (0, config_1.resolveConfigs)({
53
+ config: [configPath],
54
+ }, defaultConfig);
55
+ testSuite = resolved.testSuite;
56
+ }
57
+ else if (purpose) {
58
+ // There is a purpose, so we can just have a dummy testsuite for standalone invocation
59
+ testSuite = {
60
+ prompts: [],
61
+ providers: [],
62
+ tests: [],
63
+ };
64
+ }
65
+ else {
66
+ logger_1.default.info(chalk_1.default.red(`\nCan't generate without configuration - run ${chalk_1.default.yellow.bold('promptfoo redteam init')} first`));
67
+ return;
68
+ }
69
+ const startTime = Date.now();
70
+ telemetry_1.default.record('command_used', {
71
+ name: 'generate redteam - started',
72
+ numPrompts: testSuite.prompts.length,
73
+ numTestsExisting: (testSuite.tests || []).length,
74
+ });
75
+ await telemetry_1.default.send();
76
+ const redteamTests = await (0, redteam_1.synthesizeFromTestSuite)(testSuite, {
77
+ purpose,
78
+ injectVar,
79
+ plugins: addPlugins && addPlugins.length > 0
80
+ ? Array.from(plugins || constants_1.DEFAULT_PLUGINS).concat(addPlugins)
81
+ : plugins,
82
+ provider,
83
+ });
84
+ if (output) {
85
+ const existingYaml = configPath
86
+ ? js_yaml_1.default.load(fs.readFileSync(configPath, 'utf8'))
87
+ : {};
88
+ const updatedYaml = {
89
+ ...existingYaml,
90
+ tests: redteamTests,
91
+ metadata: {
92
+ ...existingYaml.metadata,
93
+ redteam: true,
94
+ },
95
+ };
96
+ fs.writeFileSync(output, js_yaml_1.default.dump(updatedYaml, { skipInvalid: true }));
97
+ (0, util_1.printBorder)();
98
+ logger_1.default.info(`Wrote ${redteamTests.length} new test cases to ${output}`);
99
+ (0, util_1.printBorder)();
100
+ }
101
+ else if (write && configPath) {
102
+ const existingConfig = js_yaml_1.default.load(fs.readFileSync(configPath, 'utf8'));
103
+ existingConfig.tests = [...(existingConfig.tests || []), ...redteamTests];
104
+ fs.writeFileSync(configPath, js_yaml_1.default.dump(existingConfig));
105
+ logger_1.default.info(`\nWrote ${redteamTests.length} new test cases to ${configPath}`);
106
+ logger_1.default.info('\n' + chalk_1.default.green(`Run ${chalk_1.default.bold('promptfoo eval')} to run the generated tests`));
107
+ }
108
+ else {
109
+ logger_1.default.info(js_yaml_1.default.dump(redteamTests, { skipInvalid: true }));
110
+ }
111
+ telemetry_1.default.record('command_used', {
112
+ name: 'generate redteam',
113
+ numPrompts: testSuite.prompts.length,
114
+ numTestsExisting: (testSuite.tests || []).length,
115
+ numTestsGenerated: redteamTests.length,
116
+ duration: Math.round((Date.now() - startTime) / 1000),
117
+ });
118
+ await telemetry_1.default.send();
119
+ }
120
+ function generateCommand(program, defaultConfig, defaultConfigPath) {
121
+ const generateCommand = program.command('generate').description('Generate synthetic data');
122
+ generateCommand
123
+ .command('dataset')
124
+ .description('Generate test cases')
125
+ .option('-i, --instructions [instructions]', 'Additional instructions to follow while generating test cases')
126
+ .option('-c, --config [path]', 'Path to configuration file. Defaults to promptfooconfig.yaml')
127
+ .option('-o, --output [path]', 'Path to output file')
128
+ .option('-w, --write', 'Write results to promptfoo configuration file')
129
+ .option('--numPersonas <number>', 'Number of personas to generate', '5')
130
+ .option('--numTestCasesPerPersona <number>', 'Number of test cases per persona', '3')
131
+ .option('--no-cache', 'Do not read or write results to disk cache', false)
132
+ .option('--env-file <path>', 'Path to .env file')
133
+ .action(async (options) => {
134
+ (0, util_1.setupEnv)(options.envFile);
135
+ if (!options.cache) {
136
+ logger_1.default.info('Cache is disabled.');
137
+ (0, cache_1.disableCache)();
138
+ }
139
+ let testSuite;
140
+ const configPath = options.config || defaultConfigPath;
141
+ if (configPath) {
142
+ const resolved = await (0, config_1.resolveConfigs)({
143
+ config: [configPath],
144
+ }, defaultConfig);
145
+ testSuite = resolved.testSuite;
146
+ }
147
+ else {
148
+ throw new Error('Could not find config file. Please use `--config`');
149
+ }
150
+ const startTime = Date.now();
151
+ telemetry_1.default.record('command_used', {
152
+ name: 'generate_dataset - started',
153
+ numPrompts: testSuite.prompts.length,
154
+ numTestsExisting: (testSuite.tests || []).length,
155
+ });
156
+ await telemetry_1.default.send();
157
+ const results = await (0, testCases_1.synthesizeFromTestSuite)(testSuite, {
158
+ instructions: options.instructions,
159
+ numPersonas: parseInt(options.numPersonas, 10),
160
+ numTestCasesPerPersona: parseInt(options.numTestCasesPerPersona, 10),
161
+ });
162
+ const configAddition = { tests: results.map((result) => ({ vars: result })) };
163
+ const yamlString = js_yaml_1.default.dump(configAddition);
164
+ if (options.output) {
165
+ fs.writeFileSync(options.output, yamlString);
166
+ (0, util_1.printBorder)();
167
+ logger_1.default.info(`Wrote ${results.length} new test cases to ${options.output}`);
168
+ (0, util_1.printBorder)();
169
+ }
170
+ else {
171
+ (0, util_1.printBorder)();
172
+ logger_1.default.info('New test Cases');
173
+ (0, util_1.printBorder)();
174
+ logger_1.default.info(yamlString);
175
+ }
176
+ (0, util_1.printBorder)();
177
+ if (options.write && configPath) {
178
+ const existingConfig = js_yaml_1.default.load(fs.readFileSync(configPath, 'utf8'));
179
+ existingConfig.tests = [...(existingConfig.tests || []), ...configAddition.tests];
180
+ fs.writeFileSync(configPath, js_yaml_1.default.dump(existingConfig));
181
+ logger_1.default.info(`Wrote ${results.length} new test cases to ${configPath}`);
182
+ logger_1.default.info(chalk_1.default.green(`Run ${chalk_1.default.bold('promptfoo eval')} to run the generated tests`));
183
+ }
184
+ else {
185
+ logger_1.default.info(`Copy the above test cases or run ${chalk_1.default.greenBright('promptfoo generate dataset --write')} to write directly to the config`);
186
+ }
187
+ telemetry_1.default.record('command_used', {
188
+ name: 'generate_dataset',
189
+ numPrompts: testSuite.prompts.length,
190
+ numTestsExisting: (testSuite.tests || []).length,
191
+ numTestsGenerated: results.length,
192
+ duration: Math.round((Date.now() - startTime) / 1000),
193
+ });
194
+ await telemetry_1.default.send();
195
+ });
196
+ generateCommand
197
+ .command('redteam')
198
+ .description('Generate adversarial test cases')
199
+ .option('-c, --config [path]', 'Path to configuration file. Defaults to promptfooconfig.yaml')
200
+ .option('-o, --output [path]', 'Path to output file')
201
+ .option('-w, --write', 'Write results to promptfoo configuration file')
202
+ .option('--purpose <purpose>', 'Set the system purpose. If not set, the system purpose will be inferred from the config file')
203
+ .option('--provider <provider>', `Provider to use for generating adversarial tests. Defaults to: ${constants_1.REDTEAM_MODEL}`)
204
+ .option('--injectVar <varname>', 'Override the variable to inject user input into the prompt. If not set, the variable will default to {{query}}')
205
+ .option('--plugins <plugins>', (0, dedent_1.default) `Comma-separated list of plugins to use. Defaults to:
206
+ \n- ${Array.from(constants_1.DEFAULT_PLUGINS).sort().join('\n- ')}\n\n
207
+ `, (val) => val.split(',').map((x) => x.trim()))
208
+ .option('--add-plugins <plugins>', (0, dedent_1.default) `Comma-separated list of plugins to run in addition to the default plugins:
209
+ \n- ${constants_1.ADDITIONAL_PLUGINS.sort().join('\n- ')}\n\n
210
+ `, (val) => val.split(',').map((x) => x.trim()))
211
+ .option('--no-cache', 'Do not read or write results to disk cache', false)
212
+ .option('--env-file <path>', 'Path to .env file')
213
+ .action((opts) => doGenerateRedteam({ ...opts, defaultConfig, defaultConfigPath }));
214
+ }
215
+ //# sourceMappingURL=generate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../src/commands/generate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { Command } from 'commander';
2
+ interface RunRedteamOptions {
3
+ config: string;
4
+ cache: boolean;
5
+ envFile: string;
6
+ }
7
+ export declare function doRunRedteam(cmdObj: RunRedteamOptions): Promise<void>;
8
+ export declare function redteamCommand(program: Command): void;
9
+ export {};
10
+ //# sourceMappingURL=redteam.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redteam.d.ts","sourceRoot":"","sources":["../../../src/commands/redteam.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,UAAU,iBAAiB;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,iBAAiB,iBAAI;AAEhE,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,QA0K9C"}
@@ -0,0 +1,191 @@
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.doRunRedteam = doRunRedteam;
30
+ exports.redteamCommand = redteamCommand;
31
+ const chalk_1 = __importDefault(require("chalk"));
32
+ const fs = __importStar(require("fs"));
33
+ const inquirer_1 = __importDefault(require("inquirer"));
34
+ const js_yaml_1 = __importDefault(require("js-yaml"));
35
+ const path = __importStar(require("path"));
36
+ const logger_1 = __importDefault(require("../logger"));
37
+ const constants_1 = require("../redteam/constants");
38
+ const telemetry_1 = __importDefault(require("../telemetry"));
39
+ const generate_1 = require("./generate");
40
+ async function doRunRedteam(cmdObj) { }
41
+ function redteamCommand(program) {
42
+ const redteamCommand = program.command('redteam').description('Red team LLM applications');
43
+ redteamCommand
44
+ .command('init [directory]')
45
+ .description('Initialize red teaming project')
46
+ .action(async (directory) => {
47
+ telemetry_1.default.maybeShowNotice();
48
+ telemetry_1.default.record('command_used', {
49
+ name: 'redteam init - started',
50
+ });
51
+ await telemetry_1.default.send();
52
+ let projectDir = directory;
53
+ if (!projectDir) {
54
+ const { chosenDir } = await inquirer_1.default.prompt([
55
+ {
56
+ type: 'input',
57
+ name: 'chosenDir',
58
+ message: 'Where do you want to create the project?',
59
+ default: '.',
60
+ },
61
+ ]);
62
+ projectDir = chosenDir || '.';
63
+ }
64
+ if (projectDir !== '.' && !fs.existsSync(projectDir)) {
65
+ fs.mkdirSync(projectDir, { recursive: true });
66
+ }
67
+ // Question 2: Prompt
68
+ const { promptChoice } = await inquirer_1.default.prompt([
69
+ {
70
+ type: 'list',
71
+ name: 'promptChoice',
72
+ message: 'How would you like to specify the prompt?',
73
+ choices: [
74
+ { name: 'Enter a prompt', value: 'enter' },
75
+ { name: 'Reference a prompt file', value: 'file' },
76
+ ],
77
+ },
78
+ ]);
79
+ let prompt;
80
+ if (promptChoice === 'enter') {
81
+ const { enteredPrompt } = await inquirer_1.default.prompt([
82
+ {
83
+ type: 'editor',
84
+ name: 'enteredPrompt',
85
+ message: 'Enter your prompt:',
86
+ default: 'You are a helpful concise assistant.\n\nUser query: {{query}}\n\n(NOTE: your prompt must include "{{query}}" as a placeholder for user input)',
87
+ },
88
+ ]);
89
+ prompt = enteredPrompt;
90
+ }
91
+ else {
92
+ const { promptFile } = await inquirer_1.default.prompt([
93
+ {
94
+ type: 'input',
95
+ name: 'promptFile',
96
+ message: 'Enter the path to your prompt file (text or JSON):',
97
+ },
98
+ ]);
99
+ prompt = `file://${promptFile}`;
100
+ }
101
+ // Question 3: Provider
102
+ let provider;
103
+ const { providerChoice } = await inquirer_1.default.prompt([
104
+ {
105
+ type: 'list',
106
+ name: 'providerChoice',
107
+ message: 'Choose a provider:',
108
+ choices: [
109
+ 'openai:gpt-3.5-turbo',
110
+ 'openai:gpt-4',
111
+ 'anthropic:messages:claude-3-5-sonnet-20240620',
112
+ 'anthropic:messages:claude-3-opus-20240307',
113
+ 'vertex:gemini-pro',
114
+ 'Other',
115
+ ],
116
+ },
117
+ ]);
118
+ if (providerChoice === 'Other') {
119
+ const { customProvider } = await inquirer_1.default.prompt([
120
+ {
121
+ type: 'input',
122
+ name: 'customProvider',
123
+ message: 'Enter the provider ID (see https://www.promptfoo.dev/docs/providers/ for options):',
124
+ },
125
+ ]);
126
+ provider = customProvider;
127
+ }
128
+ else {
129
+ provider = providerChoice;
130
+ }
131
+ // Question 4: Plugins
132
+ const pluginChoices = Array.from(constants_1.ALL_PLUGINS).map((plugin) => ({
133
+ name: `${plugin} - ${constants_1.subCategoryDescriptions[plugin] || 'No description available'}`,
134
+ value: plugin,
135
+ checked: constants_1.DEFAULT_PLUGINS.has(plugin),
136
+ }));
137
+ const { selectedPlugins } = await inquirer_1.default.prompt([
138
+ {
139
+ type: 'checkbox',
140
+ name: 'selectedPlugins',
141
+ message: 'Select the plugins you want to enable:',
142
+ choices: pluginChoices,
143
+ pageSize: 20,
144
+ },
145
+ ]);
146
+ const plugins = selectedPlugins;
147
+ // Create config file
148
+ const config = {
149
+ prompts: [prompt],
150
+ providers: [provider],
151
+ tests: [],
152
+ };
153
+ const configPath = path.join(projectDir, 'promptfooconfig.yaml');
154
+ fs.writeFileSync(configPath, js_yaml_1.default.dump(config), 'utf8');
155
+ logger_1.default.info('\n' + chalk_1.default.green(`Created red teaming configuration file at ${configPath}`) + '\n');
156
+ const { readyToGenerate } = await inquirer_1.default.prompt([
157
+ {
158
+ type: 'confirm',
159
+ name: 'readyToGenerate',
160
+ message: 'Are you ready to generate adversarial test cases?',
161
+ default: true,
162
+ },
163
+ ]);
164
+ telemetry_1.default.record('command_used', {
165
+ name: 'redteam init',
166
+ });
167
+ await telemetry_1.default.send();
168
+ if (readyToGenerate) {
169
+ await (0, generate_1.doGenerateRedteam)({
170
+ plugins,
171
+ cache: false,
172
+ write: true,
173
+ defaultConfig: config,
174
+ defaultConfigPath: configPath,
175
+ });
176
+ }
177
+ else {
178
+ logger_1.default.info('\n' +
179
+ chalk_1.default.blue('To generate test cases later, use the command: ' +
180
+ chalk_1.default.bold('promptfoo generate redteam')));
181
+ }
182
+ });
183
+ redteamCommand
184
+ .command('run')
185
+ .description('Run red teaming evaluation')
186
+ .option('-c, --config <path>', 'Path to configuration file')
187
+ .option('--no-cache', 'Disable cache', false)
188
+ .option('--env-file <path>', 'Path to .env file')
189
+ .action(doRunRedteam);
190
+ }
191
+ //# sourceMappingURL=redteam.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redteam.js","sourceRoot":"","sources":["../../../src/commands/redteam.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { CommandLineOptions, TestSuite, UnifiedConfig } from './types';
2
+ export declare function dereferenceConfig(rawConfig: UnifiedConfig): Promise<UnifiedConfig>;
3
+ export declare function readConfig(configPath: string): Promise<UnifiedConfig>;
4
+ export declare function maybeReadConfig(configPath: string): Promise<UnifiedConfig | undefined>;
5
+ /**
6
+ * Reads multiple configuration files and combines them into a single UnifiedConfig.
7
+ *
8
+ * @param {string[]} configPaths - An array of paths to configuration files. Supports glob patterns.
9
+ * @returns {Promise<UnifiedConfig>} A promise that resolves to a unified configuration object.
10
+ */
11
+ export declare function readConfigs(configPaths: string[]): Promise<UnifiedConfig>;
12
+ export declare function resolveConfigs(cmdObj: Partial<CommandLineOptions>, defaultConfig: Partial<UnifiedConfig>): Promise<{
13
+ testSuite: TestSuite;
14
+ config: Partial<UnifiedConfig>;
15
+ basePath: string;
16
+ }>;
17
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAgBA,OAAO,EACL,kBAAkB,EAKlB,SAAS,EACT,aAAa,EACd,MAAM,SAAS,CAAC;AAGjB,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAoGxF;AAED,wBAAsB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAe3E;AAED,wBAAsB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAK5F;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CAkI/E;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,OAAO,CAAC,kBAAkB,CAAC,EACnC,aAAa,EAAE,OAAO,CAAC,aAAa,CAAC,GACpC,OAAO,CAAC;IAAE,SAAS,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAsKrF"}