promptfoo 0.81.5 → 0.83.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (168) hide show
  1. package/README.md +10 -4
  2. package/dist/package.json +8 -8
  3. package/dist/src/commands/{generate/redteam.d.ts → redteam/generate.d.ts} +3 -3
  4. package/dist/src/commands/redteam/generate.d.ts.map +1 -0
  5. package/dist/src/commands/{generate/redteam.js → redteam/generate.js} +5 -3
  6. package/dist/src/commands/redteam/generate.js.map +1 -0
  7. package/dist/src/commands/{redteam.d.ts → redteam/init.d.ts} +1 -2
  8. package/dist/src/commands/redteam/init.d.ts.map +1 -0
  9. package/dist/src/commands/{redteam.js → redteam/init.js} +148 -147
  10. package/dist/src/commands/redteam/init.js.map +1 -0
  11. package/dist/src/commands/redteam/plugins.d.ts +3 -0
  12. package/dist/src/commands/redteam/plugins.d.ts.map +1 -0
  13. package/dist/src/commands/redteam/plugins.js +31 -0
  14. package/dist/src/commands/redteam/plugins.js.map +1 -0
  15. package/dist/src/database/tables.d.ts +6 -6
  16. package/dist/src/envars.d.ts +3 -0
  17. package/dist/src/envars.d.ts.map +1 -1
  18. package/dist/src/envars.js.map +1 -1
  19. package/dist/src/index.d.ts +15 -3
  20. package/dist/src/index.d.ts.map +1 -1
  21. package/dist/src/index.js +14 -3
  22. package/dist/src/index.js.map +1 -1
  23. package/dist/src/main.d.ts.map +1 -1
  24. package/dist/src/main.js +7 -6
  25. package/dist/src/main.js.map +1 -1
  26. package/dist/src/onboarding.js +2 -2
  27. package/dist/src/onboarding.js.map +1 -1
  28. package/dist/src/redteam/constants.d.ts +1 -0
  29. package/dist/src/redteam/constants.d.ts.map +1 -1
  30. package/dist/src/redteam/constants.js +3 -1
  31. package/dist/src/redteam/constants.js.map +1 -1
  32. package/dist/src/redteam/extraction/entities.d.ts.map +1 -1
  33. package/dist/src/redteam/extraction/entities.js +14 -3
  34. package/dist/src/redteam/extraction/entities.js.map +1 -1
  35. package/dist/src/redteam/extraction/purpose.d.ts.map +1 -1
  36. package/dist/src/redteam/extraction/purpose.js +15 -3
  37. package/dist/src/redteam/extraction/purpose.js.map +1 -1
  38. package/dist/src/redteam/extraction/util.d.ts +27 -0
  39. package/dist/src/redteam/extraction/util.d.ts.map +1 -1
  40. package/dist/src/redteam/extraction/util.js +46 -0
  41. package/dist/src/redteam/extraction/util.js.map +1 -1
  42. package/dist/src/redteam/index.d.ts +1 -1
  43. package/dist/src/redteam/index.d.ts.map +1 -1
  44. package/dist/src/redteam/index.js +38 -23
  45. package/dist/src/redteam/index.js.map +1 -1
  46. package/dist/src/redteam/plugins/base.d.ts +6 -5
  47. package/dist/src/redteam/plugins/base.d.ts.map +1 -1
  48. package/dist/src/redteam/plugins/base.js +21 -7
  49. package/dist/src/redteam/plugins/base.js.map +1 -1
  50. package/dist/src/redteam/plugins/bfla.d.ts +1 -1
  51. package/dist/src/redteam/plugins/bfla.d.ts.map +1 -1
  52. package/dist/src/redteam/plugins/bfla.js +11 -5
  53. package/dist/src/redteam/plugins/bfla.js.map +1 -1
  54. package/dist/src/redteam/plugins/bola.d.ts +1 -1
  55. package/dist/src/redteam/plugins/bola.d.ts.map +1 -1
  56. package/dist/src/redteam/plugins/bola.js +11 -7
  57. package/dist/src/redteam/plugins/bola.js.map +1 -1
  58. package/dist/src/redteam/plugins/custom.d.ts +1 -1
  59. package/dist/src/redteam/plugins/custom.d.ts.map +1 -1
  60. package/dist/src/redteam/plugins/custom.js +2 -2
  61. package/dist/src/redteam/plugins/custom.js.map +1 -1
  62. package/dist/src/redteam/plugins/harmful.d.ts +1 -1
  63. package/dist/src/redteam/plugins/harmful.d.ts.map +1 -1
  64. package/dist/src/redteam/plugins/harmful.js +45 -34
  65. package/dist/src/redteam/plugins/harmful.js.map +1 -1
  66. package/dist/src/redteam/plugins/index.d.ts +5 -4
  67. package/dist/src/redteam/plugins/index.d.ts.map +1 -1
  68. package/dist/src/redteam/plugins/index.js +78 -83
  69. package/dist/src/redteam/plugins/index.js.map +1 -1
  70. package/dist/src/redteam/plugins/indirectPromptInjection.d.ts +0 -2
  71. package/dist/src/redteam/plugins/indirectPromptInjection.d.ts.map +1 -1
  72. package/dist/src/redteam/plugins/indirectPromptInjection.js +0 -3
  73. package/dist/src/redteam/plugins/indirectPromptInjection.js.map +1 -1
  74. package/dist/src/redteam/plugins/policy.d.ts +1 -1
  75. package/dist/src/redteam/plugins/policy.d.ts.map +1 -1
  76. package/dist/src/redteam/plugins/policy.js +4 -2
  77. package/dist/src/redteam/plugins/policy.js.map +1 -1
  78. package/dist/src/redteam/plugins/promptExtraction.d.ts +1 -1
  79. package/dist/src/redteam/plugins/promptExtraction.d.ts.map +1 -1
  80. package/dist/src/redteam/plugins/promptExtraction.js +1 -1
  81. package/dist/src/redteam/plugins/promptExtraction.js.map +1 -1
  82. package/dist/src/redteam/plugins/ssrf.d.ts +1 -1
  83. package/dist/src/redteam/plugins/ssrf.d.ts.map +1 -1
  84. package/dist/src/redteam/plugins/ssrf.js +2 -2
  85. package/dist/src/redteam/plugins/ssrf.js.map +1 -1
  86. package/dist/src/redteam/providers/crescendo/index.d.ts +2 -2
  87. package/dist/src/redteam/providers/crescendo/index.d.ts.map +1 -1
  88. package/dist/src/redteam/providers/iterative.d.ts.map +1 -1
  89. package/dist/src/redteam/providers/iterativeImage.d.ts.map +1 -1
  90. package/dist/src/redteam/providers/shared.d.ts +2 -2
  91. package/dist/src/redteam/providers/shared.d.ts.map +1 -1
  92. package/dist/src/redteam/providers/shared.js +1 -1
  93. package/dist/src/redteam/providers/shared.js.map +1 -1
  94. package/dist/src/redteam/strategies/index.d.ts +2 -4
  95. package/dist/src/redteam/strategies/index.d.ts.map +1 -1
  96. package/dist/src/redteam/strategies/index.js.map +1 -1
  97. package/dist/src/redteam/strategies/multilingual.d.ts.map +1 -1
  98. package/dist/src/redteam/strategies/multilingual.js +20 -0
  99. package/dist/src/redteam/strategies/multilingual.js.map +1 -1
  100. package/dist/src/redteam/util.d.ts +1 -0
  101. package/dist/src/redteam/util.d.ts.map +1 -1
  102. package/dist/src/redteam/util.js +6 -0
  103. package/dist/src/redteam/util.js.map +1 -1
  104. package/dist/src/types/index.d.ts +40 -40
  105. package/dist/src/types/index.d.ts.map +1 -1
  106. package/dist/src/types/index.js.map +1 -1
  107. package/dist/src/types/redteam.d.ts +29 -35
  108. package/dist/src/types/redteam.d.ts.map +1 -1
  109. package/dist/src/validators/redteam.d.ts +20 -13
  110. package/dist/src/validators/redteam.d.ts.map +1 -1
  111. package/dist/src/validators/redteam.js +13 -0
  112. package/dist/src/validators/redteam.js.map +1 -1
  113. package/dist/src/web/nextui/404/index.html +1 -1
  114. package/dist/src/web/nextui/404.html +1 -1
  115. package/dist/src/web/nextui/_next/static/chunks/app/eval/[id]/{page-67165aedfd3a64fc.js → page-766e25cc9af8e519.js} +1 -1
  116. package/dist/src/web/nextui/_next/static/chunks/app/{layout-e9b86858e84ebd38.js → layout-3fb162429b886376.js} +1 -1
  117. package/dist/src/web/nextui/_next/static/chunks/app/page-b6714efe6c381b92.js +1 -0
  118. package/dist/src/web/nextui/_next/static/chunks/app/report/{page-0b89c8ba365b7195.js → page-a330d7b915e8a5b9.js} +1 -1
  119. package/dist/src/web/nextui/_next/static/chunks/main-app-cf76b7c55faa5c9b.js +1 -0
  120. package/dist/src/web/nextui/auth/login/index.html +1 -1
  121. package/dist/src/web/nextui/auth/login/index.txt +2 -2
  122. package/dist/src/web/nextui/auth/signup/index.html +1 -1
  123. package/dist/src/web/nextui/auth/signup/index.txt +2 -2
  124. package/dist/src/web/nextui/datasets/index.html +1 -1
  125. package/dist/src/web/nextui/datasets/index.txt +2 -2
  126. package/dist/src/web/nextui/eval/index.html +1 -1
  127. package/dist/src/web/nextui/eval/index.txt +3 -3
  128. package/dist/src/web/nextui/index.html +1 -1
  129. package/dist/src/web/nextui/index.txt +2 -2
  130. package/dist/src/web/nextui/progress/index.html +1 -1
  131. package/dist/src/web/nextui/progress/index.txt +2 -2
  132. package/dist/src/web/nextui/prompts/index.html +1 -1
  133. package/dist/src/web/nextui/prompts/index.txt +2 -2
  134. package/dist/src/web/nextui/report/index.html +1 -1
  135. package/dist/src/web/nextui/report/index.txt +3 -3
  136. package/dist/src/web/nextui/setup/index.html +1 -1
  137. package/dist/src/web/nextui/setup/index.txt +2 -2
  138. package/dist/test/commands/redteam/generate.test.d.ts +2 -0
  139. package/dist/test/commands/redteam/generate.test.d.ts.map +1 -0
  140. package/dist/test/commands/{generate/redteam.test.js → redteam/generate.test.js} +12 -13
  141. package/dist/test/commands/redteam/generate.test.js.map +1 -0
  142. package/dist/test/redteam/extraction/entities.test.js +45 -2
  143. package/dist/test/redteam/extraction/entities.test.js.map +1 -1
  144. package/dist/test/redteam/extraction/purpose.test.js +45 -10
  145. package/dist/test/redteam/extraction/purpose.test.js.map +1 -1
  146. package/dist/test/redteam/extraction/util.test.js +93 -4
  147. package/dist/test/redteam/extraction/util.test.js.map +1 -1
  148. package/dist/test/redteam/index.test.js +0 -23
  149. package/dist/test/redteam/index.test.js.map +1 -1
  150. package/dist/test/redteam/plugins/base.test.js +16 -4
  151. package/dist/test/redteam/plugins/base.test.js.map +1 -1
  152. package/dist/test/redteam/providers/shared.test.js +0 -8
  153. package/dist/test/redteam/providers/shared.test.js.map +1 -1
  154. package/dist/test/redteam/validators.test.js +1 -1
  155. package/dist/test/redteam/validators.test.js.map +1 -1
  156. package/package.json +8 -8
  157. package/dist/src/commands/generate/redteam.d.ts.map +0 -1
  158. package/dist/src/commands/generate/redteam.js.map +0 -1
  159. package/dist/src/commands/redteam.d.ts.map +0 -1
  160. package/dist/src/commands/redteam.js.map +0 -1
  161. package/dist/src/web/nextui/_next/static/chunks/app/page-81e3b8fee37eaf67.js +0 -1
  162. package/dist/src/web/nextui/_next/static/chunks/main-app-0dc90092cd7acaaf.js +0 -1
  163. package/dist/test/commands/generate/redteam.test.d.ts +0 -2
  164. package/dist/test/commands/generate/redteam.test.d.ts.map +0 -1
  165. package/dist/test/commands/generate/redteam.test.js.map +0 -1
  166. /package/dist/src/web/nextui/_next/static/{B-Wbtl8GsdNHqd1Jebs7I → 8ykUqaOH4zii7_PoqqHv2}/_buildManifest.js +0 -0
  167. /package/dist/src/web/nextui/_next/static/{B-Wbtl8GsdNHqd1Jebs7I → 8ykUqaOH4zii7_PoqqHv2}/_ssgManifest.js +0 -0
  168. /package/dist/src/web/nextui/_next/static/chunks/{258-5f4892005dadd945.js → 258-6060e00d93b0f598.js} +0 -0
package/README.md CHANGED
@@ -92,8 +92,12 @@ The YAML configuration format runs each prompt through a series of example input
92
92
  See the [Configuration docs](https://www.promptfoo.dev/docs/configuration/guide) for a detailed guide.
93
93
 
94
94
  ```yaml
95
- prompts: [prompt1.txt, prompt2.txt]
96
- providers: [openai:gpt-4o-mini, ollama:llama2:70b]
95
+ prompts:
96
+ - file://prompt1.txt
97
+ - file://prompt2.txt
98
+ providers:
99
+ - openai:gpt-4o-mini
100
+ - ollama:llama2:70b
97
101
  tests:
98
102
  - description: 'Test translation to French'
99
103
  vars:
@@ -173,8 +177,10 @@ Every test type can be negated by prepending `not-`. For example, `not-equals` o
173
177
  Some people prefer to configure their LLM tests in a CSV. In that case, the config is pretty simple:
174
178
 
175
179
  ```yaml
176
- prompts: [prompts.txt]
177
- providers: [openai:gpt-4o-mini]
180
+ prompts:
181
+ - file://prompts.txt
182
+ providers:
183
+ - openai:gpt-4o-mini
178
184
  tests: tests.csv
179
185
  ```
180
186
 
package/dist/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "promptfoo",
3
3
  "description": "LLM eval & testing toolkit",
4
4
  "author": "Ian Webster",
5
- "version": "0.81.5",
5
+ "version": "0.83.0",
6
6
  "license": "MIT",
7
7
  "type": "commonjs",
8
8
  "repository": {
@@ -72,12 +72,12 @@
72
72
  "node-sql-parser": "^5.2.0"
73
73
  },
74
74
  "devDependencies": {
75
- "@aws-sdk/client-bedrock-runtime": "^3.637.0",
75
+ "@aws-sdk/client-bedrock-runtime": "^3.642.0",
76
76
  "@azure/identity": "^4.4.1",
77
- "@eslint/js": "^9.9.0",
77
+ "@eslint/js": "^9.9.1",
78
78
  "@libsql/client": "^0.10.0",
79
79
  "@swc/cli": "^0.4.0",
80
- "@swc/core": "^1.7.19",
80
+ "@swc/core": "^1.7.23",
81
81
  "@swc/jest": "^0.2.36",
82
82
  "@trivago/prettier-plugin-sort-imports": "^4.3.0",
83
83
  "@types/async": "^3.2.24",
@@ -149,18 +149,18 @@
149
149
  "fast-xml-parser": "^4.4.1",
150
150
  "fastest-levenshtein": "^1.0.16",
151
151
  "glob": "^10.4.3",
152
- "groq-sdk": "^0.6.0",
153
- "inquirer": "^10.1.8",
152
+ "groq-sdk": "^0.6.1",
153
+ "inquirer": "^10.2.0",
154
154
  "js-rouge": "3.0.0",
155
155
  "js-yaml": "^4.1.0",
156
156
  "mathjs": "^13.1.1",
157
157
  "node-fetch": "^2.6.7",
158
158
  "nunjucks": "^3.2.4",
159
- "openai": "^4.56.1",
159
+ "openai": "^4.57.0",
160
160
  "opener": "^1.5.2",
161
161
  "proxy-agent": "^6.4.0",
162
162
  "python-shell": "^5.0.0",
163
- "replicate": "^0.32.0",
163
+ "replicate": "^0.32.1",
164
164
  "rfdc": "^1.4.1",
165
165
  "semver": "^7.6.3",
166
166
  "socket.io": "^4.7.5",
@@ -1,6 +1,6 @@
1
1
  import type { Command } from 'commander';
2
2
  import type { UnifiedConfig } from '../../types';
3
- import type { RedteamGenerateOptions } from '../../types/redteam';
4
- export declare function doGenerateRedteam(options: RedteamGenerateOptions): Promise<void>;
3
+ import type { RedteamCliGenerateOptions } from '../../types/redteam';
4
+ export declare function doGenerateRedteam(options: RedteamCliGenerateOptions): Promise<void>;
5
5
  export declare function generateRedteamCommand(program: Command, command: 'redteam' | 'generate', defaultConfig: Partial<UnifiedConfig>, defaultConfigPath: string | undefined): void;
6
- //# sourceMappingURL=redteam.d.ts.map
6
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../../../src/commands/redteam/generate.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmBzC,OAAO,KAAK,EAAa,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5D,OAAO,KAAK,EAAqB,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAKxF,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,yBAAyB,iBA0LzE;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,SAAS,GAAG,UAAU,EAC/B,aAAa,EAAE,OAAO,CAAC,aAAa,CAAC,EACrC,iBAAiB,EAAE,MAAM,GAAG,SAAS,QA0GtC"}
@@ -124,6 +124,7 @@ async function doGenerateRedteam(options) {
124
124
  provider: redteamConfig?.provider || options.provider,
125
125
  purpose: redteamConfig?.purpose || options.purpose,
126
126
  strategies: strategyObjs,
127
+ delay: redteamConfig?.delay || options.delay,
127
128
  };
128
129
  const parsedConfig = redteam_2.RedteamConfigSchema.safeParse(config);
129
130
  if (!parsedConfig.success) {
@@ -137,6 +138,7 @@ async function doGenerateRedteam(options) {
137
138
  numTests: config.numTests,
138
139
  prompts: testSuite.prompts.map((prompt) => prompt.raw),
139
140
  maxConcurrency: config.maxConcurrency,
141
+ delay: config.delay,
140
142
  });
141
143
  const updatedRedteamConfig = {
142
144
  purpose,
@@ -231,6 +233,7 @@ function generateRedteamCommand(program, command, defaultConfig, defaultConfigPa
231
233
  .option('--no-cache', 'Do not read or write results to disk cache', false)
232
234
  .option('--env-file <path>', 'Path to .env file')
233
235
  .option('-j, --max-concurrency <number>', 'Maximum number of concurrent API calls', (val) => Number.parseInt(val, 10), defaultConfig.evaluateOptions?.maxConcurrency)
236
+ .option('--delay <number>', 'Delay in milliseconds between plugin API calls', (val) => Number.parseInt(val, 10))
234
237
  .action((opts) => {
235
238
  try {
236
239
  let overrides = {};
@@ -255,10 +258,9 @@ function generateRedteamCommand(program, command, defaultConfig, defaultConfigPa
255
258
  }
256
259
  const validatedOpts = redteam_2.RedteamGenerateOptionsSchema.parse({
257
260
  ...opts,
261
+ ...overrides,
258
262
  defaultConfig,
259
263
  defaultConfigPath,
260
- ...(overrides.plugins ? { plugins: overrides.plugins } : {}),
261
- ...(overrides.strategies ? { strategies: overrides.strategies } : {}),
262
264
  });
263
265
  doGenerateRedteam(validatedOpts);
264
266
  }
@@ -276,4 +278,4 @@ function generateRedteamCommand(program, command, defaultConfig, defaultConfigPa
276
278
  }
277
279
  });
278
280
  }
279
- //# sourceMappingURL=redteam.js.map
281
+ //# sourceMappingURL=generate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../../src/commands/redteam/generate.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,4 @@
1
1
  import type { Command } from 'commander';
2
2
  export declare function redteamInit(directory: string | undefined): Promise<void>;
3
3
  export declare function initCommand(program: Command): void;
4
- export declare function pluginsCommand(program: Command): void;
5
- //# sourceMappingURL=redteam.d.ts.map
4
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../../src/commands/redteam/init.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4JzC,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,iBAoa9D;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,QA2B3C"}
@@ -28,7 +28,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
29
  exports.redteamInit = redteamInit;
30
30
  exports.initCommand = initCommand;
31
- exports.pluginsCommand = pluginsCommand;
32
31
  const checkbox_1 = __importDefault(require("@inquirer/checkbox"));
33
32
  const checkbox_2 = require("@inquirer/checkbox");
34
33
  const confirm_1 = __importDefault(require("@inquirer/confirm"));
@@ -41,14 +40,14 @@ const chalk_1 = __importDefault(require("chalk"));
41
40
  const dedent_1 = __importDefault(require("dedent"));
42
41
  const fs = __importStar(require("fs"));
43
42
  const path = __importStar(require("path"));
44
- const accounts_1 = require("../accounts");
45
- const envars_1 = require("../envars");
46
- const globalConfig_1 = require("../globalConfig");
47
- const logger_1 = __importDefault(require("../logger"));
48
- const constants_1 = require("../redteam/constants");
49
- const telemetry_1 = __importDefault(require("../telemetry"));
50
- const templates_1 = require("../util/templates");
51
- const redteam_1 = require("./generate/redteam");
43
+ const accounts_1 = require("../../accounts");
44
+ const envars_1 = require("../../envars");
45
+ const globalConfig_1 = require("../../globalConfig");
46
+ const logger_1 = __importDefault(require("../../logger"));
47
+ const constants_1 = require("../../redteam/constants");
48
+ const telemetry_1 = __importDefault(require("../../telemetry"));
49
+ const templates_1 = require("../../util/templates");
50
+ const generate_1 = require("./generate");
52
51
  const REDTEAM_CONFIG_TEMPLATE = `# Red teaming configuration
53
52
  # Docs: https://promptfoo.dev/docs/red-team/configuration
54
53
 
@@ -71,7 +70,15 @@ providers:
71
70
  # Providers are red team targets. To talk directly to your application, use a custom provider.
72
71
  # See https://promptfoo.dev/docs/red-team/configuration/#providers
73
72
  {% for provider in providers -%}
73
+ {% if provider is string -%}
74
74
  - {{ provider }}
75
+ {% else -%}
76
+ - id: {{ provider.id }}
77
+ config:
78
+ {% for k, v in provider.config -%}
79
+ {{ k }}: {{ v | dump }}
80
+ {% endfor -%}
81
+ {% endif -%}
75
82
  {% endfor %}
76
83
 
77
84
  redteam:
@@ -151,14 +158,14 @@ async function getSystemPrompt(numVariablesRequired = 1) {
151
158
  default: prompt,
152
159
  });
153
160
  prompt = prompt.replace(NOTE, '');
154
- let variables = (0, templates_1.extractVariablesFromTemplate)(prompt);
155
- while (variables.length < numVariablesRequired) {
156
- logger_1.default.info(chalk_1.default.red(`For real though, your prompt must include ${numVariablesRequired} ${numVariablesRequired === 1 ? 'variable' : 'variables'} like "{{query}}" as a placeholder for user input`));
161
+ const variables = (0, templates_1.extractVariablesFromTemplate)(prompt);
162
+ if (variables.length < numVariablesRequired) {
163
+ // Give the user another chance to edit their prompt
164
+ logger_1.default.info(chalk_1.default.red(`Your prompt must include ${numVariablesRequired} ${numVariablesRequired === 1 ? 'variable' : 'variables'} like "{{query}}" as a placeholder for user input.`));
157
165
  prompt = await (0, editor_1.default)({
158
166
  message: 'Enter the prompt you want to test against:',
159
167
  default: prompt,
160
168
  });
161
- variables = (0, templates_1.extractVariablesFromTemplate)(prompt);
162
169
  }
163
170
  return prompt;
164
171
  }
@@ -178,6 +185,7 @@ async function redteamInit(directory) {
178
185
  choices: [
179
186
  { name: 'Not sure yet', value: 'not_sure' },
180
187
  { name: 'Red team a prompt, model, or chatbot', value: 'prompt_model_chatbot' },
188
+ { name: 'Red team an HTTP endpoint', value: 'http_endpoint' },
181
189
  { name: 'Red team a RAG', value: 'rag' },
182
190
  { name: 'Red team an Agent', value: 'agent' },
183
191
  ],
@@ -185,9 +193,8 @@ async function redteamInit(directory) {
185
193
  });
186
194
  recordOnboardingStep('choose app type', { value: redTeamChoice });
187
195
  const prompts = [];
188
- let defaultPromptUsed = false;
189
196
  let purpose;
190
- const useCustomProvider = redTeamChoice === 'rag' || redTeamChoice === 'agent';
197
+ const useCustomProvider = redTeamChoice === 'rag' || redTeamChoice === 'agent' || redTeamChoice === 'http_endpoint';
191
198
  let deferGeneration = useCustomProvider;
192
199
  const defaultPrompt = 'You are a travel agent specialized in budget trips to Europe\n\nUser query: {{query}}';
193
200
  const defaultPurpose = 'Travel agent specializing in budget trips to Europe';
@@ -214,19 +221,36 @@ async function redteamInit(directory) {
214
221
  prompt = await getSystemPrompt();
215
222
  }
216
223
  else {
217
- defaultPromptUsed = true;
218
224
  prompt = defaultPrompt;
219
225
  deferGeneration = true;
220
226
  }
221
227
  prompts.push(prompt);
222
228
  }
223
229
  else {
224
- defaultPromptUsed = true;
225
230
  prompts.push('You are a travel agent specialized in budget trips to Europe\n\nUser query: {{query}}');
226
231
  }
227
232
  let providers;
228
233
  if (useCustomProvider) {
229
- providers = ['python:chat.py'];
234
+ if (redTeamChoice === 'http_endpoint') {
235
+ providers = [
236
+ {
237
+ id: 'https://example.com/generate',
238
+ config: {
239
+ method: 'POST',
240
+ headers: {
241
+ 'Content-Type': 'application/json',
242
+ },
243
+ body: {
244
+ myPrompt: '{{prompt}}',
245
+ },
246
+ responseParser: 'json.output',
247
+ },
248
+ },
249
+ ];
250
+ }
251
+ else {
252
+ providers = ['python:chat.py'];
253
+ }
230
254
  }
231
255
  else {
232
256
  const providerChoices = [
@@ -281,27 +305,49 @@ async function redteamInit(directory) {
281
305
  }
282
306
  console.clear();
283
307
  recordOnboardingStep('begin plugin & strategy selection');
284
- logger_1.default.info(chalk_1.default.bold('Plugin Configuration\n'));
285
- const pluginChoices = Array.from(constants_1.ALL_PLUGINS)
286
- .sort()
287
- .map((plugin) => ({
288
- name: `${plugin} - ${constants_1.subCategoryDescriptions[plugin] || 'No description'}`,
289
- value: plugin,
290
- checked: constants_1.DEFAULT_PLUGINS.has(plugin),
291
- }));
292
- const plugins = await (0, checkbox_1.default)({
293
- message: `Plugins generate adversarial inputs. Select the ones you want to use. Don't worry, you can change this later:`,
294
- choices: pluginChoices,
295
- pageSize: process.stdout.rows - 6,
296
- loop: false,
297
- validate: (answer) => answer.length > 0 || 'You must select at least one plugin.',
298
- });
299
- recordOnboardingStep('choose plugins', {
300
- value: plugins.map((p) => (typeof p === 'string' ? p : p.id)),
308
+ logger_1.default.info(chalk_1.default.bold('Plugin Configuration'));
309
+ logger_1.default.info('Plugins generate adversarial inputs.\n');
310
+ const pluginConfigChoice = await (0, select_1.default)({
311
+ message: 'How would you like to configure plugins?',
312
+ choices: [
313
+ { name: 'Use the defaults (configure later)', value: 'default' },
314
+ { name: 'Manually select', value: 'manual' },
315
+ ],
301
316
  });
302
- // Handle policy plugin
317
+ recordOnboardingStep('choose plugin config method', { value: pluginConfigChoice });
318
+ let plugins;
319
+ if (pluginConfigChoice === 'default') {
320
+ if (redTeamChoice === 'rag') {
321
+ plugins = Array.from(constants_1.DEFAULT_PLUGINS);
322
+ }
323
+ else if (redTeamChoice === 'agent') {
324
+ plugins = [...constants_1.DEFAULT_PLUGINS, 'rbac', 'bola', 'bfla', 'ssrf'];
325
+ }
326
+ else {
327
+ plugins = Array.from(constants_1.DEFAULT_PLUGINS);
328
+ }
329
+ }
330
+ else {
331
+ const pluginChoices = Array.from(constants_1.ALL_PLUGINS)
332
+ .sort()
333
+ .map((plugin) => ({
334
+ name: `${plugin} - ${constants_1.subCategoryDescriptions[plugin] || 'No description'}`,
335
+ value: plugin,
336
+ checked: constants_1.DEFAULT_PLUGINS.has(plugin),
337
+ }));
338
+ plugins = await (0, checkbox_1.default)({
339
+ message: `Select the plugins you want to use. Don't worry, you can change this later:`,
340
+ choices: pluginChoices,
341
+ pageSize: process.stdout.rows - 6,
342
+ loop: false,
343
+ validate: (answer) => answer.length > 0 || 'You must select at least one plugin.',
344
+ });
345
+ recordOnboardingStep('choose plugins', {
346
+ value: plugins.map((p) => (typeof p === 'string' ? p : p.id)),
347
+ });
348
+ }
349
+ // Plugins that require additional configuration
303
350
  if (plugins.includes('policy')) {
304
- // Remove the original 'policy' string if it exists
305
351
  const policyIndex = plugins.indexOf('policy');
306
352
  if (policyIndex !== -1) {
307
353
  plugins.splice(policyIndex, 1);
@@ -318,104 +364,80 @@ async function redteamInit(directory) {
318
364
  });
319
365
  }
320
366
  }
321
- // Handle prompt extraction plugin
322
367
  if (plugins.includes('prompt-extraction')) {
323
- const promptExtractionIdx = plugins.indexOf('prompt-extraction');
324
- if (promptExtractionIdx !== -1) {
325
- plugins.splice(promptExtractionIdx, 1);
326
- }
327
- if (defaultPromptUsed) {
328
- recordOnboardingStep('collect system prompt');
329
- const systemPrompt = await getSystemPrompt();
330
- recordOnboardingStep('choose system prompt', { value: systemPrompt.length });
331
- if (systemPrompt.trim() !== '') {
332
- plugins.push({
333
- id: 'prompt-extraction',
334
- config: { systemPrompt: (0, dedent_1.default)(systemPrompt.trim()) },
335
- });
336
- prompts[0] = systemPrompt;
337
- }
338
- }
339
- else {
340
- plugins.push({
341
- id: 'prompt-extraction',
342
- config: { systemPrompt: prompts[0] },
343
- });
344
- }
368
+ plugins.push({
369
+ id: 'prompt-extraction',
370
+ config: { systemPrompt: prompts[0] },
371
+ });
345
372
  }
346
- // Handle prompt extraction plugin
347
373
  if (plugins.includes('indirect-prompt-injection')) {
374
+ recordOnboardingStep('choose indirect prompt injection variable');
348
375
  logger_1.default.info(chalk_1.default.bold('Indirect Prompt Injection Configuration\n'));
349
- logger_1.default.info(chalk_1.default.yellow('This plugin tests if the prompt is vulnerable to instructions injected into the prompt.\n'));
350
- logger_1.default.info(chalk_1.default.yellow('This plugin requires two pieces of information:\n' +
351
- '1. The system prompt: This is the template that includes variables where content will be injected.\n' +
352
- '2. The indirectInjectionVarName: This is the name of the variable in your system prompt where untrusted content will be injected.\n\n' +
353
- 'These are needed to test if the model is vulnerable to instructions injected into the prompt through this variable.\n'));
354
- await (0, input_1.default)({
355
- message: 'Read the above and Press Enter to continue setting up the plugin.',
356
- });
357
- const promptExtractionIdx = plugins.indexOf('indirect-prompt-injection');
358
- if (promptExtractionIdx !== -1) {
359
- plugins.splice(promptExtractionIdx, 1);
360
- }
361
- if (defaultPromptUsed) {
362
- const systemPrompt = await getSystemPrompt(2);
363
- const variables = (0, templates_1.extractVariablesFromTemplate)(systemPrompt);
364
- let indirectInjectionVar = variables[0].trim();
365
- indirectInjectionVar = await (0, input_1.default)({
366
- message: `What is the name of the variable where content will be injected into the prompt? (e.g. "name")`,
367
- default: indirectInjectionVar,
376
+ const variables = (0, templates_1.extractVariablesFromTemplate)(prompts[0]);
377
+ if (variables.length > 1) {
378
+ const indirectInjectionVar = await (0, select_1.default)({
379
+ message: 'Which variable would you like to test for indirect prompt injection?',
380
+ choices: variables.sort().map((variable) => ({
381
+ name: variable,
382
+ value: variable,
383
+ })),
368
384
  });
369
- indirectInjectionVar = indirectInjectionVar.trim();
370
- if (!variables.includes(indirectInjectionVar)) {
371
- logger_1.default.info(chalk_1.default.red(`The variable ${indirectInjectionVar} is not found in the prompt. Please go back and edit your prompt to add the variable to your prompt`));
372
- await (0, input_1.default)({
373
- message: 'Press Enter to continue...',
374
- });
375
- }
376
- if (indirectInjectionVar === variables[variables.length - 1]) {
377
- logger_1.default.info(chalk_1.default.red(`The variable ${indirectInjectionVar} is the last variable in the prompt. This might cause some issues with the plugin since we assume the last variable is the main injectVar. Please make sure you set injectVar properly in your config.`));
378
- await (0, input_1.default)({
379
- message: 'Press Enter to continue...',
380
- });
381
- }
382
- if (systemPrompt.trim() !== '') {
383
- plugins.push({
384
- id: 'indirect-prompt-injection',
385
- config: {
386
- systemPrompt: (0, dedent_1.default)(systemPrompt.trim()),
387
- indirectInjectionVar: indirectInjectionVar.trim(),
388
- },
389
- });
390
- prompts[0] = systemPrompt;
391
- }
392
- }
393
- else {
385
+ recordOnboardingStep('chose indirect prompt injection variable');
394
386
  plugins.push({
395
- id: 'prompt-extraction',
396
- config: { systemPrompt: prompts[0] },
387
+ id: 'indirect-prompt-injection',
388
+ config: {
389
+ indirectInjectionVar,
390
+ },
397
391
  });
398
392
  }
393
+ else {
394
+ recordOnboardingStep('skip indirect prompt injection');
395
+ logger_1.default.warn(`Skipping indirect prompt injection plugin because it requires at least two {{variables}} in the prompt. Learn more: https://www.promptfoo.dev/docs/red-team/plugins/indirect-prompt-injection/`);
396
+ }
399
397
  }
400
398
  console.clear();
401
- logger_1.default.info(chalk_1.default.bold('Strategy Configuration\n'));
402
- const strategyChoices = [
403
- ...Array.from(constants_1.DEFAULT_STRATEGIES).sort(),
404
- new checkbox_2.Separator(),
405
- ...Array.from(constants_1.ADDITIONAL_STRATEGIES).sort(),
406
- ].map((strategy) => typeof strategy === 'string'
407
- ? {
408
- name: `${strategy} - ${constants_1.subCategoryDescriptions[strategy] || 'No description'}`,
409
- value: strategy,
410
- checked: constants_1.DEFAULT_STRATEGIES.includes(strategy),
411
- }
412
- : strategy);
413
- const strategies = await (0, checkbox_1.default)({
414
- message: `Strategies are attack methods. Select the ones you want to use. Don't worry, you can change this later:`,
415
- choices: strategyChoices,
416
- pageSize: process.stdout.rows - 6,
417
- loop: false,
399
+ logger_1.default.info(chalk_1.default.bold('Strategy Configuration'));
400
+ logger_1.default.info('Strategies are attack methods.\n');
401
+ const strategyConfigChoice = await (0, select_1.default)({
402
+ message: 'How would you like to configure strategies?',
403
+ choices: [
404
+ { name: 'Use the defaults (configure later)', value: 'default' },
405
+ { name: 'Manually select', value: 'manual' },
406
+ ],
418
407
  });
408
+ recordOnboardingStep('choose strategy config method', { value: strategyConfigChoice });
409
+ let strategies;
410
+ if (strategyConfigChoice === 'default') {
411
+ // TODO(ian): Differentiate strategies
412
+ if (redTeamChoice === 'rag') {
413
+ strategies = Array.from(constants_1.DEFAULT_STRATEGIES);
414
+ }
415
+ else if (redTeamChoice === 'agent') {
416
+ strategies = Array.from(constants_1.DEFAULT_STRATEGIES);
417
+ }
418
+ else {
419
+ strategies = Array.from(constants_1.DEFAULT_STRATEGIES);
420
+ }
421
+ }
422
+ else {
423
+ const strategyChoices = [
424
+ ...Array.from(constants_1.DEFAULT_STRATEGIES).sort(),
425
+ new checkbox_2.Separator(),
426
+ ...Array.from(constants_1.ADDITIONAL_STRATEGIES).sort(),
427
+ ].map((strategy) => typeof strategy === 'string'
428
+ ? {
429
+ name: `${strategy} - ${constants_1.subCategoryDescriptions[strategy] || 'No description'}`,
430
+ value: strategy,
431
+ checked: constants_1.DEFAULT_STRATEGIES.includes(strategy),
432
+ }
433
+ : strategy);
434
+ strategies = await (0, checkbox_1.default)({
435
+ message: `Select the ones you want to use. Don't worry, you can change this later:`,
436
+ choices: strategyChoices,
437
+ pageSize: process.stdout.rows - 6,
438
+ loop: false,
439
+ });
440
+ }
419
441
  recordOnboardingStep('choose strategies', {
420
442
  value: strategies,
421
443
  });
@@ -490,7 +512,7 @@ async function redteamInit(directory) {
490
512
  });
491
513
  recordOnboardingStep('choose generate', { value: readyToGenerate });
492
514
  if (readyToGenerate) {
493
- await (0, redteam_1.doGenerateRedteam)({
515
+ await (0, generate_1.doGenerateRedteam)({
494
516
  purpose,
495
517
  plugins: plugins.map((plugin) => (typeof plugin === 'string' ? { id: plugin } : plugin)),
496
518
  cache: false,
@@ -532,25 +554,4 @@ function initCommand(program) {
532
554
  }
533
555
  });
534
556
  }
535
- function pluginsCommand(program) {
536
- program
537
- .command('plugins')
538
- .description('List all available plugins')
539
- .option('--ids-only', 'Show only plugin IDs without descriptions')
540
- .option('--default', 'Show only the default plugins')
541
- .action(async (options) => {
542
- const pluginsToShow = options.default ? constants_1.DEFAULT_PLUGINS : constants_1.ALL_PLUGINS;
543
- if (options.idsOnly) {
544
- pluginsToShow.forEach((plugin) => {
545
- logger_1.default.info(plugin);
546
- });
547
- }
548
- else {
549
- pluginsToShow.forEach((plugin) => {
550
- const description = constants_1.subCategoryDescriptions[plugin] || 'No description available';
551
- logger_1.default.info(`${chalk_1.default.blue.bold(plugin)}: ${description}`);
552
- });
553
- }
554
- });
555
- }
556
- //# sourceMappingURL=redteam.js.map
557
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../../src/commands/redteam/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function pluginsCommand(program: Command): void;
3
+ //# sourceMappingURL=plugins.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugins.d.ts","sourceRoot":"","sources":["../../../../src/commands/redteam/plugins.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,QAoB9C"}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.pluginsCommand = pluginsCommand;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const logger_1 = __importDefault(require("../../logger"));
9
+ const constants_1 = require("../../redteam/constants");
10
+ function pluginsCommand(program) {
11
+ program
12
+ .command('plugins')
13
+ .description('List all available plugins')
14
+ .option('--ids-only', 'Show only plugin IDs without descriptions')
15
+ .option('--default', 'Show only the default plugins')
16
+ .action(async (options) => {
17
+ const pluginsToShow = options.default ? constants_1.DEFAULT_PLUGINS : constants_1.ALL_PLUGINS;
18
+ if (options.idsOnly) {
19
+ pluginsToShow.forEach((plugin) => {
20
+ logger_1.default.info(plugin);
21
+ });
22
+ }
23
+ else {
24
+ pluginsToShow.forEach((plugin) => {
25
+ const description = constants_1.subCategoryDescriptions[plugin] || 'No description available';
26
+ logger_1.default.info(`${chalk_1.default.blue.bold(plugin)}: ${description}`);
27
+ });
28
+ }
29
+ });
30
+ }
31
+ //# sourceMappingURL=plugins.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugins.js","sourceRoot":"","sources":["../../../../src/commands/redteam/plugins.ts"],"names":[],"mappings":";;;;;AAKA,wCAoBC;AAzBD,kDAA0B;AAE1B,0DAAkC;AAClC,uDAAgG;AAEhG,SAAgB,cAAc,CAAC,OAAgB;IAC7C,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,4BAA4B,CAAC;SACzC,MAAM,CAAC,YAAY,EAAE,2CAA2C,CAAC;SACjE,MAAM,CAAC,WAAW,EAAE,+BAA+B,CAAC;SACpD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,2BAAe,CAAC,CAAC,CAAC,uBAAW,CAAC;QAEtE,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,aAAa,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;gBAC/B,gBAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACtB,CAAC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,aAAa,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;gBAC/B,MAAM,WAAW,GAAG,mCAAuB,CAAC,MAAM,CAAC,IAAI,0BAA0B,CAAC;gBAClF,gBAAM,CAAC,IAAI,CAAC,GAAG,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,WAAW,EAAE,CAAC,CAAC;YAC5D,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}