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.
- package/README.md +10 -4
- package/dist/package.json +8 -8
- package/dist/src/commands/{generate/redteam.d.ts → redteam/generate.d.ts} +3 -3
- package/dist/src/commands/redteam/generate.d.ts.map +1 -0
- package/dist/src/commands/{generate/redteam.js → redteam/generate.js} +5 -3
- package/dist/src/commands/redteam/generate.js.map +1 -0
- package/dist/src/commands/{redteam.d.ts → redteam/init.d.ts} +1 -2
- package/dist/src/commands/redteam/init.d.ts.map +1 -0
- package/dist/src/commands/{redteam.js → redteam/init.js} +148 -147
- package/dist/src/commands/redteam/init.js.map +1 -0
- package/dist/src/commands/redteam/plugins.d.ts +3 -0
- package/dist/src/commands/redteam/plugins.d.ts.map +1 -0
- package/dist/src/commands/redteam/plugins.js +31 -0
- package/dist/src/commands/redteam/plugins.js.map +1 -0
- package/dist/src/database/tables.d.ts +6 -6
- package/dist/src/envars.d.ts +3 -0
- package/dist/src/envars.d.ts.map +1 -1
- package/dist/src/envars.js.map +1 -1
- package/dist/src/index.d.ts +15 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +14 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/main.d.ts.map +1 -1
- package/dist/src/main.js +7 -6
- package/dist/src/main.js.map +1 -1
- package/dist/src/onboarding.js +2 -2
- package/dist/src/onboarding.js.map +1 -1
- package/dist/src/redteam/constants.d.ts +1 -0
- package/dist/src/redteam/constants.d.ts.map +1 -1
- package/dist/src/redteam/constants.js +3 -1
- package/dist/src/redteam/constants.js.map +1 -1
- package/dist/src/redteam/extraction/entities.d.ts.map +1 -1
- package/dist/src/redteam/extraction/entities.js +14 -3
- package/dist/src/redteam/extraction/entities.js.map +1 -1
- package/dist/src/redteam/extraction/purpose.d.ts.map +1 -1
- package/dist/src/redteam/extraction/purpose.js +15 -3
- package/dist/src/redteam/extraction/purpose.js.map +1 -1
- package/dist/src/redteam/extraction/util.d.ts +27 -0
- package/dist/src/redteam/extraction/util.d.ts.map +1 -1
- package/dist/src/redteam/extraction/util.js +46 -0
- package/dist/src/redteam/extraction/util.js.map +1 -1
- package/dist/src/redteam/index.d.ts +1 -1
- package/dist/src/redteam/index.d.ts.map +1 -1
- package/dist/src/redteam/index.js +38 -23
- package/dist/src/redteam/index.js.map +1 -1
- package/dist/src/redteam/plugins/base.d.ts +6 -5
- package/dist/src/redteam/plugins/base.d.ts.map +1 -1
- package/dist/src/redteam/plugins/base.js +21 -7
- package/dist/src/redteam/plugins/base.js.map +1 -1
- package/dist/src/redteam/plugins/bfla.d.ts +1 -1
- package/dist/src/redteam/plugins/bfla.d.ts.map +1 -1
- package/dist/src/redteam/plugins/bfla.js +11 -5
- package/dist/src/redteam/plugins/bfla.js.map +1 -1
- package/dist/src/redteam/plugins/bola.d.ts +1 -1
- package/dist/src/redteam/plugins/bola.d.ts.map +1 -1
- package/dist/src/redteam/plugins/bola.js +11 -7
- package/dist/src/redteam/plugins/bola.js.map +1 -1
- package/dist/src/redteam/plugins/custom.d.ts +1 -1
- package/dist/src/redteam/plugins/custom.d.ts.map +1 -1
- package/dist/src/redteam/plugins/custom.js +2 -2
- package/dist/src/redteam/plugins/custom.js.map +1 -1
- package/dist/src/redteam/plugins/harmful.d.ts +1 -1
- package/dist/src/redteam/plugins/harmful.d.ts.map +1 -1
- package/dist/src/redteam/plugins/harmful.js +45 -34
- package/dist/src/redteam/plugins/harmful.js.map +1 -1
- package/dist/src/redteam/plugins/index.d.ts +5 -4
- package/dist/src/redteam/plugins/index.d.ts.map +1 -1
- package/dist/src/redteam/plugins/index.js +78 -83
- package/dist/src/redteam/plugins/index.js.map +1 -1
- package/dist/src/redteam/plugins/indirectPromptInjection.d.ts +0 -2
- package/dist/src/redteam/plugins/indirectPromptInjection.d.ts.map +1 -1
- package/dist/src/redteam/plugins/indirectPromptInjection.js +0 -3
- package/dist/src/redteam/plugins/indirectPromptInjection.js.map +1 -1
- package/dist/src/redteam/plugins/policy.d.ts +1 -1
- package/dist/src/redteam/plugins/policy.d.ts.map +1 -1
- package/dist/src/redteam/plugins/policy.js +4 -2
- package/dist/src/redteam/plugins/policy.js.map +1 -1
- package/dist/src/redteam/plugins/promptExtraction.d.ts +1 -1
- package/dist/src/redteam/plugins/promptExtraction.d.ts.map +1 -1
- package/dist/src/redteam/plugins/promptExtraction.js +1 -1
- package/dist/src/redteam/plugins/promptExtraction.js.map +1 -1
- package/dist/src/redteam/plugins/ssrf.d.ts +1 -1
- package/dist/src/redteam/plugins/ssrf.d.ts.map +1 -1
- package/dist/src/redteam/plugins/ssrf.js +2 -2
- package/dist/src/redteam/plugins/ssrf.js.map +1 -1
- package/dist/src/redteam/providers/crescendo/index.d.ts +2 -2
- package/dist/src/redteam/providers/crescendo/index.d.ts.map +1 -1
- package/dist/src/redteam/providers/iterative.d.ts.map +1 -1
- package/dist/src/redteam/providers/iterativeImage.d.ts.map +1 -1
- package/dist/src/redteam/providers/shared.d.ts +2 -2
- package/dist/src/redteam/providers/shared.d.ts.map +1 -1
- package/dist/src/redteam/providers/shared.js +1 -1
- package/dist/src/redteam/providers/shared.js.map +1 -1
- package/dist/src/redteam/strategies/index.d.ts +2 -4
- package/dist/src/redteam/strategies/index.d.ts.map +1 -1
- package/dist/src/redteam/strategies/index.js.map +1 -1
- package/dist/src/redteam/strategies/multilingual.d.ts.map +1 -1
- package/dist/src/redteam/strategies/multilingual.js +20 -0
- package/dist/src/redteam/strategies/multilingual.js.map +1 -1
- package/dist/src/redteam/util.d.ts +1 -0
- package/dist/src/redteam/util.d.ts.map +1 -1
- package/dist/src/redteam/util.js +6 -0
- package/dist/src/redteam/util.js.map +1 -1
- package/dist/src/types/index.d.ts +40 -40
- package/dist/src/types/index.d.ts.map +1 -1
- package/dist/src/types/index.js.map +1 -1
- package/dist/src/types/redteam.d.ts +29 -35
- package/dist/src/types/redteam.d.ts.map +1 -1
- package/dist/src/validators/redteam.d.ts +20 -13
- package/dist/src/validators/redteam.d.ts.map +1 -1
- package/dist/src/validators/redteam.js +13 -0
- package/dist/src/validators/redteam.js.map +1 -1
- package/dist/src/web/nextui/404/index.html +1 -1
- package/dist/src/web/nextui/404.html +1 -1
- package/dist/src/web/nextui/_next/static/chunks/app/eval/[id]/{page-67165aedfd3a64fc.js → page-766e25cc9af8e519.js} +1 -1
- package/dist/src/web/nextui/_next/static/chunks/app/{layout-e9b86858e84ebd38.js → layout-3fb162429b886376.js} +1 -1
- package/dist/src/web/nextui/_next/static/chunks/app/page-b6714efe6c381b92.js +1 -0
- package/dist/src/web/nextui/_next/static/chunks/app/report/{page-0b89c8ba365b7195.js → page-a330d7b915e8a5b9.js} +1 -1
- package/dist/src/web/nextui/_next/static/chunks/main-app-cf76b7c55faa5c9b.js +1 -0
- package/dist/src/web/nextui/auth/login/index.html +1 -1
- package/dist/src/web/nextui/auth/login/index.txt +2 -2
- package/dist/src/web/nextui/auth/signup/index.html +1 -1
- package/dist/src/web/nextui/auth/signup/index.txt +2 -2
- package/dist/src/web/nextui/datasets/index.html +1 -1
- package/dist/src/web/nextui/datasets/index.txt +2 -2
- package/dist/src/web/nextui/eval/index.html +1 -1
- package/dist/src/web/nextui/eval/index.txt +3 -3
- package/dist/src/web/nextui/index.html +1 -1
- package/dist/src/web/nextui/index.txt +2 -2
- package/dist/src/web/nextui/progress/index.html +1 -1
- package/dist/src/web/nextui/progress/index.txt +2 -2
- package/dist/src/web/nextui/prompts/index.html +1 -1
- package/dist/src/web/nextui/prompts/index.txt +2 -2
- package/dist/src/web/nextui/report/index.html +1 -1
- package/dist/src/web/nextui/report/index.txt +3 -3
- package/dist/src/web/nextui/setup/index.html +1 -1
- package/dist/src/web/nextui/setup/index.txt +2 -2
- package/dist/test/commands/redteam/generate.test.d.ts +2 -0
- package/dist/test/commands/redteam/generate.test.d.ts.map +1 -0
- package/dist/test/commands/{generate/redteam.test.js → redteam/generate.test.js} +12 -13
- package/dist/test/commands/redteam/generate.test.js.map +1 -0
- package/dist/test/redteam/extraction/entities.test.js +45 -2
- package/dist/test/redteam/extraction/entities.test.js.map +1 -1
- package/dist/test/redteam/extraction/purpose.test.js +45 -10
- package/dist/test/redteam/extraction/purpose.test.js.map +1 -1
- package/dist/test/redteam/extraction/util.test.js +93 -4
- package/dist/test/redteam/extraction/util.test.js.map +1 -1
- package/dist/test/redteam/index.test.js +0 -23
- package/dist/test/redteam/index.test.js.map +1 -1
- package/dist/test/redteam/plugins/base.test.js +16 -4
- package/dist/test/redteam/plugins/base.test.js.map +1 -1
- package/dist/test/redteam/providers/shared.test.js +0 -8
- package/dist/test/redteam/providers/shared.test.js.map +1 -1
- package/dist/test/redteam/validators.test.js +1 -1
- package/dist/test/redteam/validators.test.js.map +1 -1
- package/package.json +8 -8
- package/dist/src/commands/generate/redteam.d.ts.map +0 -1
- package/dist/src/commands/generate/redteam.js.map +0 -1
- package/dist/src/commands/redteam.d.ts.map +0 -1
- package/dist/src/commands/redteam.js.map +0 -1
- package/dist/src/web/nextui/_next/static/chunks/app/page-81e3b8fee37eaf67.js +0 -1
- package/dist/src/web/nextui/_next/static/chunks/main-app-0dc90092cd7acaaf.js +0 -1
- package/dist/test/commands/generate/redteam.test.d.ts +0 -2
- package/dist/test/commands/generate/redteam.test.d.ts.map +0 -1
- package/dist/test/commands/generate/redteam.test.js.map +0 -1
- /package/dist/src/web/nextui/_next/static/{B-Wbtl8GsdNHqd1Jebs7I → 8ykUqaOH4zii7_PoqqHv2}/_buildManifest.js +0 -0
- /package/dist/src/web/nextui/_next/static/{B-Wbtl8GsdNHqd1Jebs7I → 8ykUqaOH4zii7_PoqqHv2}/_ssgManifest.js +0 -0
- /package/dist/src/web/nextui/_next/static/chunks/{258-5f4892005dadd945.js → 258-6060e00d93b0f598.js} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><link rel="preload" as="font" href="/_next/static/media/a34f9d1faa5f3315-s.p.woff2" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/css/de0307797e31a3e6.css" data-precedence="next"/><link rel="preload" as="style" href="/_next/static/css/ed73533d059fd179.css"/><link rel="preload" href="/_next/static/chunks/webpack-2bde9ee952171572.js" as="script"/><link rel="preload" href="/_next/static/chunks/b6261da7-e9d81a4364ddd0c0.js" as="script"/><link rel="preload" href="/_next/static/chunks/730-3eb7255cd813a727.js" as="script"/><link rel="preload" href="/_next/static/chunks/main-app-
|
|
1
|
+
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><link rel="preload" as="font" href="/_next/static/media/a34f9d1faa5f3315-s.p.woff2" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/css/de0307797e31a3e6.css" data-precedence="next"/><link rel="preload" as="style" href="/_next/static/css/ed73533d059fd179.css"/><link rel="preload" href="/_next/static/chunks/webpack-2bde9ee952171572.js" as="script"/><link rel="preload" href="/_next/static/chunks/b6261da7-e9d81a4364ddd0c0.js" as="script"/><link rel="preload" href="/_next/static/chunks/730-3eb7255cd813a727.js" as="script"/><link rel="preload" href="/_next/static/chunks/main-app-cf76b7c55faa5c9b.js" as="script"/><title>promptfoo</title><meta name="description" content="LLM testing and evaluation"/><meta name="viewport" content="width=device-width, initial-scale=1"/><meta property="og:image" content="https://www.promptfoo.dev/img/thumbnail.png"/><meta name="twitter:card" content="summary"/><meta name="twitter:image" content="https://www.promptfoo.dev/img/thumbnail.png"/><meta name="next-size-adjust"/><script src="/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js" noModule=""></script></head><body class="__className_85e967"><script src="/_next/static/chunks/webpack-2bde9ee952171572.js" async=""></script><script src="/_next/static/chunks/b6261da7-e9d81a4364ddd0c0.js" async=""></script><script src="/_next/static/chunks/730-3eb7255cd813a727.js" async=""></script><script src="/_next/static/chunks/main-app-cf76b7c55faa5c9b.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:HL[\"/_next/static/media/a34f9d1faa5f3315-s.p.woff2\",{\"as\":\"font\",\"type\":\"font/woff2\"}]\n2:HL[\"/_next/static/css/de0307797e31a3e6.css\",{\"as\":\"style\"}]\n0:\"$L3\"\n"])</script><script>self.__next_f.push([1,"4:HL[\"/_next/static/css/ed73533d059fd179.css\",{\"as\":\"style\"}]\n"])</script><script>self.__next_f.push([1,"5:I{\"id\":83507,\"chunks\":[\"272:static/chunks/webpack-2bde9ee952171572.js\",\"470:static/chunks/b6261da7-e9d81a4364ddd0c0.js\",\"730:static/chunks/730-3eb7255cd813a727.js\"],\"name\":\"default\",\"async\":false}\n7:I{\"id\":6020,\"chunks\":[\"272:static/chunks/webpack-2bde9ee952171572.js\",\"470:static/chunks/b6261da7-e9d81a4364ddd0c0.js\",\"730:static/chunks/730-3eb7255cd813a727.js\"],\"name\":\"\",\"async\":false}\n8:I{\"id\":5071,\"chunks\":[\"148:static/chunks/148-1c1aa4563e769657.js\",\"640:static/chunks/640-0f757e2fe135173d.js\",\"193:stati"])</script><script>self.__next_f.push([1,"c/chunks/193-fbb29b23a7b3df82.js\",\"65:static/chunks/65-d3958feb29430005.js\",\"132:static/chunks/132-d6bea93785831786.js\",\"415:static/chunks/415-f4cc6df99e1d251e.js\",\"185:static/chunks/app/layout-3fb162429b886376.js\"],\"name\":\"PageShell\",\"async\":false}\n9:I{\"id\":27883,\"chunks\":[\"272:static/chunks/webpack-2bde9ee952171572.js\",\"470:static/chunks/b6261da7-e9d81a4364ddd0c0.js\",\"730:static/chunks/730-3eb7255cd813a727.js\"],\"name\":\"default\",\"async\":false}\na:I{\"id\":46785,\"chunks\":[\"272:static/chunks/webpack-2bde9ee9521"])</script><script>self.__next_f.push([1,"71572.js\",\"470:static/chunks/b6261da7-e9d81a4364ddd0c0.js\",\"730:static/chunks/730-3eb7255cd813a727.js\"],\"name\":\"default\",\"async\":false}\n"])</script><script>self.__next_f.push([1,"3:[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/de0307797e31a3e6.css\",\"precedence\":\"next\"}]],[\"$\",\"$L5\",null,{\"buildId\":\"8ykUqaOH4zii7_PoqqHv2\",\"assetPrefix\":\"\",\"initialCanonicalUrl\":\"/report/\",\"initialTree\":[\"\",{\"children\":[\"report\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],\"initialHead\":\"$L6\",\"globalErrorComponent\":\"$7\",\"children\":[null,[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[\"$\",\"body\",null,{\"className\":\"__className_85e967\",\"children\":[\"$\",\"$L8\",null,{\"children\":[\"$\",\"$L9\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"loading\":\"$undefined\",\"loadingStyles\":\"$undefined\",\"hasLoading\":false,\"template\":[\"$\",\"$La\",null,{}],\"templateStyles\":\"$undefined\",\"notFound\":[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],\"notFoundStyles\":\"$undefined\",\"childProp\":{\"current\":[\"$\",\"$L9\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"report\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"loading\":\"$undefined\",\"loadingStyles\":\"$undefined\",\"hasLoading\":false,\"template\":[\"$\",\"$La\",null,{}],\"templateStyles\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\",\"childProp\":{\"current\":[\"$Lb\",\"$Lc\",null],\"segment\":\"__PAGE__\"},\"styles\":[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/ed73533d059fd179.css\",\"precedence\":\"next\"}]]}],\"segment\":\"report\"},\"styles\":[]}]}]}]}],null]}]]\n"])</script><script>self.__next_f.push([1,"d:I{\"id\":24406,\"chunks\":[\"949:static/chunks/565431e5-7b9122ac20f7a0ae.js\",\"799:static/chunks/a5c829b0-07a2c92898a6780c.js\",\"148:static/chunks/148-1c1aa4563e769657.js\",\"193:static/chunks/193-fbb29b23a7b3df82.js\",\"391:static/chunks/391-9f6f260597339469.js\",\"654:static/chunks/654-7ef84f69b226e6ab.js\",\"65:static/chunks/65-d3958feb29430005.js\",\"276:static/chunks/276-b1a73ab92831c2f8.js\",\"874:static/chunks/874-66f90697795eddbc.js\",\"264:static/chunks/264-f97b27096cb02f29.js\",\"459:static/chunks/459-2e6701613d682903.js\",\"178:static/chunks/178-fbe9007ed9d0d1f2.js\",\"420:static/chunks/app/report/page-a330d7b915e8a5b9.js\"],\"name\":\"\",\"async\":false}\n"])</script><script>self.__next_f.push([1,"c:[\"$\",\"$Ld\",null,{}]\n"])</script><script>self.__next_f.push([1,"6:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"title\",\"1\",{\"children\":\"promptfoo\"}],[\"$\",\"meta\",\"2\",{\"name\":\"description\",\"content\":\"LLM testing and evaluation\"}],[\"$\",\"meta\",\"3\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"4\",{\"property\":\"og:image\",\"content\":\"https://www.promptfoo.dev/img/thumbnail.png\"}],[\"$\",\"meta\",\"5\",{\"name\":\"twitter:card\",\"content\":\"summary\"}],[\"$\",\"meta\",\"6\",{\"name\":\"twitter:image\",\"content\":\"https://www.promptfoo.dev/img/thumbnail.png\"}],[\"$\",\"meta\",\"7\",{\"name\":\"next-size-adjust\"}]]\n"])</script><script>self.__next_f.push([1,"b:null\n"])</script></body></html>
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
1:HL["/_next/static/media/a34f9d1faa5f3315-s.p.woff2",{"as":"font","type":"font/woff2"}]
|
|
2
2
|
2:HL["/_next/static/css/de0307797e31a3e6.css",{"as":"style"}]
|
|
3
|
-
0:["
|
|
3
|
+
0:["8ykUqaOH4zii7_PoqqHv2",[[["",{"children":["report",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],"$L3",[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/de0307797e31a3e6.css","precedence":"next"}]],"$L4"]]]]
|
|
4
4
|
5:HL["/_next/static/css/ed73533d059fd179.css",{"as":"style"}]
|
|
5
|
-
6:I{"id":5071,"chunks":["148:static/chunks/148-1c1aa4563e769657.js","640:static/chunks/640-0f757e2fe135173d.js","193:static/chunks/193-fbb29b23a7b3df82.js","65:static/chunks/65-d3958feb29430005.js","132:static/chunks/132-d6bea93785831786.js","415:static/chunks/415-f4cc6df99e1d251e.js","185:static/chunks/app/layout-
|
|
5
|
+
6:I{"id":5071,"chunks":["148:static/chunks/148-1c1aa4563e769657.js","640:static/chunks/640-0f757e2fe135173d.js","193:static/chunks/193-fbb29b23a7b3df82.js","65:static/chunks/65-d3958feb29430005.js","132:static/chunks/132-d6bea93785831786.js","415:static/chunks/415-f4cc6df99e1d251e.js","185:static/chunks/app/layout-3fb162429b886376.js"],"name":"PageShell","async":false}
|
|
6
6
|
7:I{"id":27883,"chunks":["272:static/chunks/webpack-2bde9ee952171572.js","470:static/chunks/b6261da7-e9d81a4364ddd0c0.js","730:static/chunks/730-3eb7255cd813a727.js"],"name":"default","async":false}
|
|
7
7
|
8:I{"id":46785,"chunks":["272:static/chunks/webpack-2bde9ee952171572.js","470:static/chunks/b6261da7-e9d81a4364ddd0c0.js","730:static/chunks/730-3eb7255cd813a727.js"],"name":"default","async":false}
|
|
8
8
|
3:[null,["$","html",null,{"lang":"en","children":["$","body",null,{"className":"__className_85e967","children":["$","$L6",null,{"children":["$","$L7",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","loading":"$undefined","loadingStyles":"$undefined","hasLoading":false,"template":["$","$L8",null,{}],"templateStyles":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":"$undefined","childProp":{"current":["$","$L7",null,{"parallelRouterKey":"children","segmentPath":["children","report","children"],"error":"$undefined","errorStyles":"$undefined","loading":"$undefined","loadingStyles":"$undefined","hasLoading":false,"template":["$","$L8",null,{}],"templateStyles":"$undefined","notFound":"$undefined","notFoundStyles":"$undefined","childProp":{"current":["$L9","$La",null],"segment":"__PAGE__"},"styles":[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/ed73533d059fd179.css","precedence":"next"}]]}],"segment":"report"},"styles":[]}]}]}]}],null]
|
|
9
9
|
4:[["$","meta","0",{"charSet":"utf-8"}],["$","title","1",{"children":"promptfoo"}],["$","meta","2",{"name":"description","content":"LLM testing and evaluation"}],["$","meta","3",{"name":"viewport","content":"width=device-width, initial-scale=1"}],["$","meta","4",{"property":"og:image","content":"https://www.promptfoo.dev/img/thumbnail.png"}],["$","meta","5",{"name":"twitter:card","content":"summary"}],["$","meta","6",{"name":"twitter:image","content":"https://www.promptfoo.dev/img/thumbnail.png"}],["$","meta","7",{"name":"next-size-adjust"}]]
|
|
10
|
-
b:I{"id":24406,"chunks":["949:static/chunks/565431e5-7b9122ac20f7a0ae.js","799:static/chunks/a5c829b0-07a2c92898a6780c.js","148:static/chunks/148-1c1aa4563e769657.js","193:static/chunks/193-fbb29b23a7b3df82.js","391:static/chunks/391-9f6f260597339469.js","654:static/chunks/654-7ef84f69b226e6ab.js","65:static/chunks/65-d3958feb29430005.js","276:static/chunks/276-b1a73ab92831c2f8.js","874:static/chunks/874-66f90697795eddbc.js","264:static/chunks/264-f97b27096cb02f29.js","459:static/chunks/459-2e6701613d682903.js","178:static/chunks/178-fbe9007ed9d0d1f2.js","420:static/chunks/app/report/page-
|
|
10
|
+
b:I{"id":24406,"chunks":["949:static/chunks/565431e5-7b9122ac20f7a0ae.js","799:static/chunks/a5c829b0-07a2c92898a6780c.js","148:static/chunks/148-1c1aa4563e769657.js","193:static/chunks/193-fbb29b23a7b3df82.js","391:static/chunks/391-9f6f260597339469.js","654:static/chunks/654-7ef84f69b226e6ab.js","65:static/chunks/65-d3958feb29430005.js","276:static/chunks/276-b1a73ab92831c2f8.js","874:static/chunks/874-66f90697795eddbc.js","264:static/chunks/264-f97b27096cb02f29.js","459:static/chunks/459-2e6701613d682903.js","178:static/chunks/178-fbe9007ed9d0d1f2.js","420:static/chunks/app/report/page-a330d7b915e8a5b9.js"],"name":"","async":false}
|
|
11
11
|
a:["$","$Lb",null,{}]
|
|
12
12
|
9:null
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><link rel="preload" as="font" href="/_next/static/media/a34f9d1faa5f3315-s.p.woff2" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/css/de0307797e31a3e6.css" data-precedence="next"/><link rel="preload" as="style" href="/_next/static/css/edcd6f0b6c902fde.css"/><link rel="preload" href="/_next/static/chunks/webpack-2bde9ee952171572.js" as="script"/><link rel="preload" href="/_next/static/chunks/b6261da7-e9d81a4364ddd0c0.js" as="script"/><link rel="preload" href="/_next/static/chunks/730-3eb7255cd813a727.js" as="script"/><link rel="preload" href="/_next/static/chunks/main-app-
|
|
1
|
+
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><link rel="preload" as="font" href="/_next/static/media/a34f9d1faa5f3315-s.p.woff2" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/css/de0307797e31a3e6.css" data-precedence="next"/><link rel="preload" as="style" href="/_next/static/css/edcd6f0b6c902fde.css"/><link rel="preload" href="/_next/static/chunks/webpack-2bde9ee952171572.js" as="script"/><link rel="preload" href="/_next/static/chunks/b6261da7-e9d81a4364ddd0c0.js" as="script"/><link rel="preload" href="/_next/static/chunks/730-3eb7255cd813a727.js" as="script"/><link rel="preload" href="/_next/static/chunks/main-app-cf76b7c55faa5c9b.js" as="script"/><title>promptfoo</title><meta name="description" content="LLM testing and evaluation"/><meta name="viewport" content="width=device-width, initial-scale=1"/><meta property="og:image" content="https://www.promptfoo.dev/img/thumbnail.png"/><meta name="twitter:card" content="summary"/><meta name="twitter:image" content="https://www.promptfoo.dev/img/thumbnail.png"/><meta name="next-size-adjust"/><script src="/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js" noModule=""></script></head><body class="__className_85e967"><script src="/_next/static/chunks/webpack-2bde9ee952171572.js" async=""></script><script src="/_next/static/chunks/b6261da7-e9d81a4364ddd0c0.js" async=""></script><script src="/_next/static/chunks/730-3eb7255cd813a727.js" async=""></script><script src="/_next/static/chunks/main-app-cf76b7c55faa5c9b.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:HL[\"/_next/static/media/a34f9d1faa5f3315-s.p.woff2\",{\"as\":\"font\",\"type\":\"font/woff2\"}]\n2:HL[\"/_next/static/css/de0307797e31a3e6.css\",{\"as\":\"style\"}]\n0:\"$L3\"\n"])</script><script>self.__next_f.push([1,"4:HL[\"/_next/static/css/edcd6f0b6c902fde.css\",{\"as\":\"style\"}]\n"])</script><script>self.__next_f.push([1,"5:I{\"id\":83507,\"chunks\":[\"272:static/chunks/webpack-2bde9ee952171572.js\",\"470:static/chunks/b6261da7-e9d81a4364ddd0c0.js\",\"730:static/chunks/730-3eb7255cd813a727.js\"],\"name\":\"default\",\"async\":false}\n7:I{\"id\":6020,\"chunks\":[\"272:static/chunks/webpack-2bde9ee952171572.js\",\"470:static/chunks/b6261da7-e9d81a4364ddd0c0.js\",\"730:static/chunks/730-3eb7255cd813a727.js\"],\"name\":\"\",\"async\":false}\n8:I{\"id\":5071,\"chunks\":[\"148:static/chunks/148-1c1aa4563e769657.js\",\"640:static/chunks/640-0f757e2fe135173d.js\",\"193:stati"])</script><script>self.__next_f.push([1,"c/chunks/193-fbb29b23a7b3df82.js\",\"65:static/chunks/65-d3958feb29430005.js\",\"132:static/chunks/132-d6bea93785831786.js\",\"415:static/chunks/415-f4cc6df99e1d251e.js\",\"185:static/chunks/app/layout-3fb162429b886376.js\"],\"name\":\"PageShell\",\"async\":false}\n9:I{\"id\":27883,\"chunks\":[\"272:static/chunks/webpack-2bde9ee952171572.js\",\"470:static/chunks/b6261da7-e9d81a4364ddd0c0.js\",\"730:static/chunks/730-3eb7255cd813a727.js\"],\"name\":\"default\",\"async\":false}\na:I{\"id\":46785,\"chunks\":[\"272:static/chunks/webpack-2bde9ee9521"])</script><script>self.__next_f.push([1,"71572.js\",\"470:static/chunks/b6261da7-e9d81a4364ddd0c0.js\",\"730:static/chunks/730-3eb7255cd813a727.js\"],\"name\":\"default\",\"async\":false}\nc:I{\"id\":27382,\"chunks\":[\"272:static/chunks/webpack-2bde9ee952171572.js\",\"470:static/chunks/b6261da7-e9d81a4364ddd0c0.js\",\"730:static/chunks/730-3eb7255cd813a727.js\"],\"name\":\"default\",\"async\":false}\n"])</script><script>self.__next_f.push([1,"d:I{\"id\":83013,\"chunks\":[\"148:static/chunks/148-1c1aa4563e769657.js\",\"640:static/chunks/640-0f757e2fe135173d.js\",\"193:static/chunks/193-fbb29b23a7b3df82.js\",\"391:static/chunks/391-9f6f260597339469.js\",\"654:static/chunks/654-7ef84f69b226e6ab.js\",\"65:static/chunks/65-d3958feb29430005.js\",\"975:static/chunks/975-db84f98b8dd028ab.js\",\"276:static/chunks/276-b1a73ab92831c2f8.js\",\"874:static/chunks/874-66f90697795eddbc.js\",\"235:static/chunks/235-2bbcbc3cd37eef0f.js\",\"264:static/chunks/264-f97b27096cb02f29.js\",\"734:static/chunks/734-d2ca9e7d051c494c.js\",\"972:static/chunks/972-cbb6d905c3a19e41.js\",\"325:static/chunks/325-07eac9e397582e87.js\",\"413:static/chunks/app/setup/page-1966e3fc2c36f287.js\"],\"name\":\"\",\"async\":false}\n"])</script><script>self.__next_f.push([1,"3:[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/de0307797e31a3e6.css\",\"precedence\":\"next\"}]],[\"$\",\"$L5\",null,{\"buildId\":\"8ykUqaOH4zii7_PoqqHv2\",\"assetPrefix\":\"\",\"initialCanonicalUrl\":\"/setup/\",\"initialTree\":[\"\",{\"children\":[\"setup\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],\"initialHead\":\"$L6\",\"globalErrorComponent\":\"$7\",\"children\":[null,[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[\"$\",\"body\",null,{\"className\":\"__className_85e967\",\"children\":[\"$\",\"$L8\",null,{\"children\":[\"$\",\"$L9\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"loading\":\"$undefined\",\"loadingStyles\":\"$undefined\",\"hasLoading\":false,\"template\":[\"$\",\"$La\",null,{}],\"templateStyles\":\"$undefined\",\"notFound\":[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],\"notFoundStyles\":\"$undefined\",\"childProp\":{\"current\":[\"$\",\"$L9\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"setup\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"loading\":\"$undefined\",\"loadingStyles\":\"$undefined\",\"hasLoading\":false,\"template\":[\"$\",\"$La\",null,{}],\"templateStyles\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\",\"childProp\":{\"current\":[\"$Lb\",[\"$\",\"$Lc\",null,{\"propsForComponent\":{\"params\":{}},\"Component\":\"$d\"}],null],\"segment\":\"__PAGE__\"},\"styles\":[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/edcd6f0b6c902fde.css\",\"precedence\":\"next\"}]]}],\"segment\":\"setup\"},\"styles\":[]}]}]}]}],null]}]]\n"])</script><script>self.__next_f.push([1,"6:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"title\",\"1\",{\"children\":\"promptfoo\"}],[\"$\",\"meta\",\"2\",{\"name\":\"description\",\"content\":\"LLM testing and evaluation\"}],[\"$\",\"meta\",\"3\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"4\",{\"property\":\"og:image\",\"content\":\"https://www.promptfoo.dev/img/thumbnail.png\"}],[\"$\",\"meta\",\"5\",{\"name\":\"twitter:card\",\"content\":\"summary\"}],[\"$\",\"meta\",\"6\",{\"name\":\"twitter:image\",\"content\":\"https://www.promptfoo.dev/img/thumbnail.png\"}],[\"$\",\"meta\",\"7\",{\"name\":\"next-size-adjust\"}]]\n"])</script><script>self.__next_f.push([1,"b:null\n"])</script></body></html>
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
1:HL["/_next/static/media/a34f9d1faa5f3315-s.p.woff2",{"as":"font","type":"font/woff2"}]
|
|
2
2
|
2:HL["/_next/static/css/de0307797e31a3e6.css",{"as":"style"}]
|
|
3
|
-
0:["
|
|
3
|
+
0:["8ykUqaOH4zii7_PoqqHv2",[[["",{"children":["setup",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],"$L3",[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/de0307797e31a3e6.css","precedence":"next"}]],"$L4"]]]]
|
|
4
4
|
5:HL["/_next/static/css/edcd6f0b6c902fde.css",{"as":"style"}]
|
|
5
|
-
6:I{"id":5071,"chunks":["148:static/chunks/148-1c1aa4563e769657.js","640:static/chunks/640-0f757e2fe135173d.js","193:static/chunks/193-fbb29b23a7b3df82.js","65:static/chunks/65-d3958feb29430005.js","132:static/chunks/132-d6bea93785831786.js","415:static/chunks/415-f4cc6df99e1d251e.js","185:static/chunks/app/layout-
|
|
5
|
+
6:I{"id":5071,"chunks":["148:static/chunks/148-1c1aa4563e769657.js","640:static/chunks/640-0f757e2fe135173d.js","193:static/chunks/193-fbb29b23a7b3df82.js","65:static/chunks/65-d3958feb29430005.js","132:static/chunks/132-d6bea93785831786.js","415:static/chunks/415-f4cc6df99e1d251e.js","185:static/chunks/app/layout-3fb162429b886376.js"],"name":"PageShell","async":false}
|
|
6
6
|
7:I{"id":27883,"chunks":["272:static/chunks/webpack-2bde9ee952171572.js","470:static/chunks/b6261da7-e9d81a4364ddd0c0.js","730:static/chunks/730-3eb7255cd813a727.js"],"name":"default","async":false}
|
|
7
7
|
8:I{"id":46785,"chunks":["272:static/chunks/webpack-2bde9ee952171572.js","470:static/chunks/b6261da7-e9d81a4364ddd0c0.js","730:static/chunks/730-3eb7255cd813a727.js"],"name":"default","async":false}
|
|
8
8
|
a:I{"id":27382,"chunks":["272:static/chunks/webpack-2bde9ee952171572.js","470:static/chunks/b6261da7-e9d81a4364ddd0c0.js","730:static/chunks/730-3eb7255cd813a727.js"],"name":"default","async":false}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.test.d.ts","sourceRoot":"","sources":["../../../../test/commands/redteam/generate.test.ts"],"names":[],"mappings":""}
|
|
@@ -27,10 +27,10 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
27
27
|
};
|
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
29
|
const fs_1 = __importDefault(require("fs"));
|
|
30
|
-
const
|
|
30
|
+
const generate_1 = require("../../../src/commands/redteam/generate");
|
|
31
31
|
const configModule = __importStar(require("../../../src/config"));
|
|
32
32
|
const logger_1 = __importDefault(require("../../../src/logger"));
|
|
33
|
-
const
|
|
33
|
+
const redteam_1 = require("../../../src/redteam");
|
|
34
34
|
const config_1 = require("../../../src/util/config");
|
|
35
35
|
jest.mock('fs');
|
|
36
36
|
jest.mock('yaml');
|
|
@@ -79,7 +79,7 @@ describe('doGenerateRedteam', () => {
|
|
|
79
79
|
providers: [],
|
|
80
80
|
tests: [],
|
|
81
81
|
}));
|
|
82
|
-
jest.mocked(
|
|
82
|
+
jest.mocked(redteam_1.synthesize).mockResolvedValue({
|
|
83
83
|
testCases: [
|
|
84
84
|
{
|
|
85
85
|
vars: { input: 'Test input' },
|
|
@@ -90,8 +90,8 @@ describe('doGenerateRedteam', () => {
|
|
|
90
90
|
purpose: 'Test purpose',
|
|
91
91
|
entities: ['Test entity'],
|
|
92
92
|
});
|
|
93
|
-
await (0,
|
|
94
|
-
expect(
|
|
93
|
+
await (0, generate_1.doGenerateRedteam)(options);
|
|
94
|
+
expect(redteam_1.synthesize).toHaveBeenCalledWith(expect.objectContaining({
|
|
95
95
|
language: undefined,
|
|
96
96
|
numTests: undefined,
|
|
97
97
|
plugins: expect.any(Array),
|
|
@@ -119,7 +119,6 @@ describe('doGenerateRedteam', () => {
|
|
|
119
119
|
},
|
|
120
120
|
},
|
|
121
121
|
}), 'output.yaml');
|
|
122
|
-
expect(logger_1.default.info).toHaveBeenCalledWith(expect.stringContaining('Wrote 1 new test cases'));
|
|
123
122
|
});
|
|
124
123
|
it('should write to config file when write option is true', async () => {
|
|
125
124
|
const options = {
|
|
@@ -129,12 +128,12 @@ describe('doGenerateRedteam', () => {
|
|
|
129
128
|
write: true,
|
|
130
129
|
};
|
|
131
130
|
jest.mocked(fs_1.default.readFileSync).mockReturnValue(JSON.stringify({}));
|
|
132
|
-
jest.mocked(
|
|
131
|
+
jest.mocked(redteam_1.synthesize).mockResolvedValue({
|
|
133
132
|
testCases: [],
|
|
134
133
|
purpose: 'Test purpose',
|
|
135
134
|
entities: [],
|
|
136
135
|
});
|
|
137
|
-
await (0,
|
|
136
|
+
await (0, generate_1.doGenerateRedteam)(options);
|
|
138
137
|
expect(config_1.writePromptfooConfig).toHaveBeenCalledWith(expect.objectContaining({
|
|
139
138
|
tests: [],
|
|
140
139
|
redteam: expect.objectContaining({
|
|
@@ -150,7 +149,7 @@ describe('doGenerateRedteam', () => {
|
|
|
150
149
|
write: true,
|
|
151
150
|
output: 'redteam.yaml',
|
|
152
151
|
};
|
|
153
|
-
await (0,
|
|
152
|
+
await (0, generate_1.doGenerateRedteam)(options);
|
|
154
153
|
expect(logger_1.default.info).toHaveBeenCalledWith(expect.stringContaining("Can't generate without configuration"));
|
|
155
154
|
});
|
|
156
155
|
it('should use purpose when no config is provided', async () => {
|
|
@@ -161,7 +160,7 @@ describe('doGenerateRedteam', () => {
|
|
|
161
160
|
write: true,
|
|
162
161
|
output: 'redteam.yaml',
|
|
163
162
|
};
|
|
164
|
-
jest.mocked(
|
|
163
|
+
jest.mocked(redteam_1.synthesize).mockResolvedValue({
|
|
165
164
|
testCases: [
|
|
166
165
|
{
|
|
167
166
|
vars: { input: 'Test input' },
|
|
@@ -172,8 +171,8 @@ describe('doGenerateRedteam', () => {
|
|
|
172
171
|
purpose: 'Test purpose',
|
|
173
172
|
entities: ['Test entity'],
|
|
174
173
|
});
|
|
175
|
-
await (0,
|
|
176
|
-
expect(
|
|
174
|
+
await (0, generate_1.doGenerateRedteam)(options);
|
|
175
|
+
expect(redteam_1.synthesize).toHaveBeenCalledWith({
|
|
177
176
|
language: undefined,
|
|
178
177
|
numTests: undefined,
|
|
179
178
|
purpose: 'Test purpose',
|
|
@@ -196,4 +195,4 @@ describe('doGenerateRedteam', () => {
|
|
|
196
195
|
}), 'redteam.yaml');
|
|
197
196
|
});
|
|
198
197
|
});
|
|
199
|
-
//# sourceMappingURL=
|
|
198
|
+
//# sourceMappingURL=generate.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.test.js","sourceRoot":"","sources":["../../../../test/commands/redteam/generate.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,32 +3,75 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const cache_1 = require("../../../src/cache");
|
|
6
7
|
const logger_1 = __importDefault(require("../../../src/logger"));
|
|
7
8
|
const entities_1 = require("../../../src/redteam/extraction/entities");
|
|
8
9
|
jest.mock('../../../src/logger', () => ({
|
|
9
10
|
error: jest.fn(),
|
|
10
11
|
debug: jest.fn(),
|
|
12
|
+
warn: jest.fn(),
|
|
11
13
|
}));
|
|
14
|
+
jest.mock('../../../src/cache', () => ({
|
|
15
|
+
fetchWithCache: jest.fn(),
|
|
16
|
+
}));
|
|
17
|
+
jest.mock('../../../src/envars', () => {
|
|
18
|
+
const originalModule = jest.requireActual('../../../src/envars');
|
|
19
|
+
return {
|
|
20
|
+
...originalModule,
|
|
21
|
+
getEnvBool: jest.fn(originalModule.getEnvBool),
|
|
22
|
+
};
|
|
23
|
+
});
|
|
12
24
|
describe('Entities Extractor', () => {
|
|
13
25
|
let provider;
|
|
26
|
+
let originalEnv;
|
|
14
27
|
beforeEach(() => {
|
|
28
|
+
originalEnv = process.env;
|
|
29
|
+
process.env = { ...originalEnv };
|
|
15
30
|
provider = {
|
|
16
31
|
callApi: jest.fn().mockResolvedValue({ output: 'Entity: Apple\nEntity: Google' }),
|
|
17
32
|
id: jest.fn().mockReturnValue('test-provider'),
|
|
18
33
|
};
|
|
19
34
|
jest.clearAllMocks();
|
|
20
35
|
});
|
|
21
|
-
|
|
36
|
+
afterEach(() => {
|
|
37
|
+
process.env = originalEnv;
|
|
38
|
+
});
|
|
39
|
+
it('should use remote generation when enabled', async () => {
|
|
40
|
+
process.env.OPENAI_API_KEY = undefined;
|
|
41
|
+
process.env.PROMPTFOO_DISABLE_REDTEAM_REMOTE_GENERATION = 'false';
|
|
42
|
+
jest.mocked(cache_1.fetchWithCache).mockResolvedValue({
|
|
43
|
+
data: { task: 'entities', result: ['Apple', 'Google'] },
|
|
44
|
+
cached: false,
|
|
45
|
+
});
|
|
46
|
+
const result = await (0, entities_1.extractEntities)(provider, ['prompt1', 'prompt2']);
|
|
47
|
+
expect(result).toEqual(['Apple', 'Google']);
|
|
48
|
+
expect(cache_1.fetchWithCache).toHaveBeenCalledWith('https://api.promptfoo.dev/v1/generate', expect.objectContaining({
|
|
49
|
+
method: 'POST',
|
|
50
|
+
body: JSON.stringify({ task: 'entities', prompts: ['prompt1', 'prompt2'] }),
|
|
51
|
+
}), expect.any(Number), 'json');
|
|
52
|
+
});
|
|
53
|
+
it('should fall back to local extraction when remote generation fails', async () => {
|
|
54
|
+
process.env.OPENAI_API_KEY = undefined;
|
|
55
|
+
process.env.PROMPTFOO_DISABLE_REDTEAM_REMOTE_GENERATION = 'false';
|
|
56
|
+
jest.mocked(cache_1.fetchWithCache).mockRejectedValue(new Error('Remote generation failed'));
|
|
22
57
|
const result = await (0, entities_1.extractEntities)(provider, ['prompt1', 'prompt2']);
|
|
23
58
|
expect(result).toEqual(['Apple', 'Google']);
|
|
24
59
|
expect(provider.callApi).toHaveBeenCalledWith(expect.stringContaining('prompt1'));
|
|
25
60
|
expect(provider.callApi).toHaveBeenCalledWith(expect.stringContaining('prompt2'));
|
|
61
|
+
expect(logger_1.default.warn).toHaveBeenCalledWith(expect.stringContaining('Error using remote generation'));
|
|
62
|
+
});
|
|
63
|
+
it('should use local extraction when remote generation is disabled', async () => {
|
|
64
|
+
process.env.PROMPTFOO_DISABLE_REDTEAM_REMOTE_GENERATION = 'true';
|
|
65
|
+
const result = await (0, entities_1.extractEntities)(provider, ['prompt']);
|
|
66
|
+
expect(result).toEqual(['Apple', 'Google']);
|
|
67
|
+
expect(provider.callApi).toHaveBeenCalledWith(expect.stringContaining('prompt'));
|
|
68
|
+
expect(cache_1.fetchWithCache).not.toHaveBeenCalled();
|
|
26
69
|
});
|
|
27
70
|
it('should log debug message when no entities are found', async () => {
|
|
71
|
+
process.env.PROMPTFOO_DISABLE_REDTEAM_REMOTE_GENERATION = 'true';
|
|
28
72
|
jest.mocked(provider.callApi).mockResolvedValue({ output: 'No entities found' });
|
|
29
73
|
const result = await (0, entities_1.extractEntities)(provider, ['prompt']);
|
|
30
74
|
expect(result).toEqual([]);
|
|
31
|
-
expect(logger_1.default.debug).toHaveBeenCalledWith('No entities were extracted from the prompts.');
|
|
32
75
|
});
|
|
33
76
|
});
|
|
34
77
|
//# sourceMappingURL=entities.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entities.test.js","sourceRoot":"","sources":["../../../../test/redteam/extraction/entities.test.ts"],"names":[],"mappings":";;;;;AAAA,iEAAyC;AACzC,uEAA2E;AAG3E,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,GAAG,EAAE,CAAC,CAAC;IACtC,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;IAChB,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"entities.test.js","sourceRoot":"","sources":["../../../../test/redteam/extraction/entities.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,31 +1,66 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const cache_1 = require("../../../src/cache");
|
|
3
4
|
const purpose_1 = require("../../../src/redteam/extraction/purpose");
|
|
4
5
|
jest.mock('../../../src/logger', () => ({
|
|
5
6
|
error: jest.fn(),
|
|
6
7
|
debug: jest.fn(),
|
|
8
|
+
warn: jest.fn(),
|
|
9
|
+
}));
|
|
10
|
+
jest.mock('../../../src/cache', () => ({
|
|
11
|
+
fetchWithCache: jest.fn(),
|
|
7
12
|
}));
|
|
8
13
|
describe('System Purpose Extractor', () => {
|
|
14
|
+
let provider;
|
|
15
|
+
let originalEnv;
|
|
9
16
|
beforeEach(() => {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
const provider = {
|
|
17
|
+
originalEnv = process.env;
|
|
18
|
+
process.env = { ...originalEnv };
|
|
19
|
+
provider = {
|
|
14
20
|
callApi: jest
|
|
15
21
|
.fn()
|
|
16
22
|
.mockResolvedValue({ output: '<Purpose>Extracted system purpose</Purpose>' }),
|
|
17
23
|
id: jest.fn().mockReturnValue('test-provider'),
|
|
18
24
|
};
|
|
19
|
-
|
|
25
|
+
jest.clearAllMocks();
|
|
26
|
+
});
|
|
27
|
+
afterEach(() => {
|
|
28
|
+
process.env = originalEnv;
|
|
29
|
+
});
|
|
30
|
+
it('should use remote generation when enabled', async () => {
|
|
31
|
+
process.env.OPENAI_API_KEY = undefined;
|
|
32
|
+
process.env.PROMPTFOO_DISABLE_REDTEAM_REMOTE_GENERATION = 'false';
|
|
33
|
+
jest.mocked(cache_1.fetchWithCache).mockResolvedValue({
|
|
34
|
+
data: { task: 'purpose', result: 'Remote extracted purpose' },
|
|
35
|
+
cached: false,
|
|
36
|
+
});
|
|
37
|
+
const result = await (0, purpose_1.extractSystemPurpose)(provider, ['prompt1', 'prompt2']);
|
|
38
|
+
expect(result).toBe('Remote extracted purpose');
|
|
39
|
+
expect(cache_1.fetchWithCache).toHaveBeenCalledWith('https://api.promptfoo.dev/v1/generate', expect.objectContaining({
|
|
40
|
+
method: 'POST',
|
|
41
|
+
body: JSON.stringify({ task: 'purpose', prompts: ['prompt1', 'prompt2'] }),
|
|
42
|
+
}), expect.any(Number), 'json');
|
|
43
|
+
});
|
|
44
|
+
it('should fall back to local extraction when remote generation fails', async () => {
|
|
45
|
+
process.env.PROMPTFOO_DISABLE_REDTEAM_REMOTE_GENERATION = 'false';
|
|
46
|
+
jest.mocked(cache_1.fetchWithCache).mockRejectedValue(new Error('Remote generation failed'));
|
|
47
|
+
const result = await (0, purpose_1.extractSystemPurpose)(provider, ['prompt1', 'prompt2']);
|
|
48
|
+
expect(result).toBe('Extracted system purpose');
|
|
20
49
|
expect(provider.callApi).toHaveBeenCalledWith(expect.stringContaining('prompt1'));
|
|
21
50
|
expect(provider.callApi).toHaveBeenCalledWith(expect.stringContaining('prompt2'));
|
|
22
51
|
});
|
|
52
|
+
it('should use local extraction when remote generation is disabled', async () => {
|
|
53
|
+
process.env.PROMPTFOO_DISABLE_REDTEAM_REMOTE_GENERATION = 'true';
|
|
54
|
+
const result = await (0, purpose_1.extractSystemPurpose)(provider, ['prompt']);
|
|
55
|
+
expect(result).toBe('Extracted system purpose');
|
|
56
|
+
expect(provider.callApi).toHaveBeenCalledWith(expect.stringContaining('prompt'));
|
|
57
|
+
expect(cache_1.fetchWithCache).not.toHaveBeenCalled();
|
|
58
|
+
});
|
|
23
59
|
it('should extract system purpose when returned without xml tags', async () => {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
await expect((0, purpose_1.extractSystemPurpose)(provider, ['prompt1', 'prompt2'])).resolves.toBe('Extracted system purpose');
|
|
60
|
+
process.env.PROMPTFOO_DISABLE_REDTEAM_REMOTE_GENERATION = 'true';
|
|
61
|
+
jest.mocked(provider.callApi).mockResolvedValue({ output: 'Extracted system purpose' });
|
|
62
|
+
const result = await (0, purpose_1.extractSystemPurpose)(provider, ['prompt1', 'prompt2']);
|
|
63
|
+
expect(result).toBe('Extracted system purpose');
|
|
29
64
|
});
|
|
30
65
|
});
|
|
31
66
|
//# sourceMappingURL=purpose.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"purpose.test.js","sourceRoot":"","sources":["../../../../test/redteam/extraction/purpose.test.ts"],"names":[],"mappings":";;AAAA,qEAA+E;AAG/E,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,GAAG,EAAE,CAAC,CAAC;IACtC,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;IAChB,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"purpose.test.js","sourceRoot":"","sources":["../../../../test/redteam/extraction/purpose.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,12 +3,105 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const cache_1 = require("../../../src/cache");
|
|
6
7
|
const logger_1 = __importDefault(require("../../../src/logger"));
|
|
8
|
+
const shared_1 = require("../../../src/providers/shared");
|
|
7
9
|
const util_1 = require("../../../src/redteam/extraction/util");
|
|
8
10
|
jest.mock('../../../src/logger', () => ({
|
|
9
11
|
error: jest.fn(),
|
|
12
|
+
warn: jest.fn(),
|
|
10
13
|
debug: jest.fn(),
|
|
11
14
|
}));
|
|
15
|
+
jest.mock('../../../src/cache', () => ({
|
|
16
|
+
fetchWithCache: jest.fn(),
|
|
17
|
+
}));
|
|
18
|
+
describe('fetchRemoteGeneration', () => {
|
|
19
|
+
beforeEach(() => {
|
|
20
|
+
jest.clearAllMocks();
|
|
21
|
+
});
|
|
22
|
+
it('should fetch remote generation for purpose task', async () => {
|
|
23
|
+
const mockResponse = {
|
|
24
|
+
data: {
|
|
25
|
+
task: 'purpose',
|
|
26
|
+
result: 'This is a purpose',
|
|
27
|
+
},
|
|
28
|
+
cached: false,
|
|
29
|
+
};
|
|
30
|
+
jest.mocked(cache_1.fetchWithCache).mockResolvedValue(mockResponse);
|
|
31
|
+
const result = await (0, util_1.fetchRemoteGeneration)('purpose', ['prompt1', 'prompt2']);
|
|
32
|
+
expect(result).toBe('This is a purpose');
|
|
33
|
+
expect(cache_1.fetchWithCache).toHaveBeenCalledWith('https://api.promptfoo.dev/v1/generate', {
|
|
34
|
+
method: 'POST',
|
|
35
|
+
headers: { 'Content-Type': 'application/json' },
|
|
36
|
+
body: JSON.stringify({ task: 'purpose', prompts: ['prompt1', 'prompt2'] }),
|
|
37
|
+
}, shared_1.REQUEST_TIMEOUT_MS, 'json');
|
|
38
|
+
});
|
|
39
|
+
it('should fetch remote generation for entities task', async () => {
|
|
40
|
+
const mockResponse = {
|
|
41
|
+
data: {
|
|
42
|
+
task: 'entities',
|
|
43
|
+
result: ['Entity1', 'Entity2'],
|
|
44
|
+
},
|
|
45
|
+
cached: false,
|
|
46
|
+
};
|
|
47
|
+
jest.mocked(cache_1.fetchWithCache).mockResolvedValue(mockResponse);
|
|
48
|
+
const result = await (0, util_1.fetchRemoteGeneration)('entities', ['prompt1', 'prompt2']);
|
|
49
|
+
expect(result).toEqual(['Entity1', 'Entity2']);
|
|
50
|
+
expect(cache_1.fetchWithCache).toHaveBeenCalledWith('https://api.promptfoo.dev/v1/generate', {
|
|
51
|
+
method: 'POST',
|
|
52
|
+
headers: { 'Content-Type': 'application/json' },
|
|
53
|
+
body: JSON.stringify({ task: 'entities', prompts: ['prompt1', 'prompt2'] }),
|
|
54
|
+
}, shared_1.REQUEST_TIMEOUT_MS, 'json');
|
|
55
|
+
});
|
|
56
|
+
it('should throw an error when fetchWithCache fails', async () => {
|
|
57
|
+
const mockError = new Error('Network error');
|
|
58
|
+
jest.mocked(cache_1.fetchWithCache).mockRejectedValue(mockError);
|
|
59
|
+
await expect((0, util_1.fetchRemoteGeneration)('purpose', ['prompt'])).rejects.toThrow('Network error');
|
|
60
|
+
expect(logger_1.default.warn).toHaveBeenCalledWith("Error using remote generation for task 'purpose': Error: Network error");
|
|
61
|
+
});
|
|
62
|
+
it('should throw an error when response parsing fails', async () => {
|
|
63
|
+
const mockResponse = {
|
|
64
|
+
data: {
|
|
65
|
+
task: 'purpose',
|
|
66
|
+
// Missing 'result' field
|
|
67
|
+
},
|
|
68
|
+
cached: false,
|
|
69
|
+
};
|
|
70
|
+
jest.mocked(cache_1.fetchWithCache).mockResolvedValue(mockResponse);
|
|
71
|
+
await expect((0, util_1.fetchRemoteGeneration)('purpose', ['prompt'])).rejects.toThrow('Invalid input');
|
|
72
|
+
expect(logger_1.default.warn).toHaveBeenCalledWith(expect.stringContaining("Error using remote generation for task 'purpose':"));
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
describe('RedTeamGenerationResponse', () => {
|
|
76
|
+
it('should validate correct response structure', () => {
|
|
77
|
+
const validResponse = {
|
|
78
|
+
task: 'purpose',
|
|
79
|
+
result: 'This is a purpose',
|
|
80
|
+
};
|
|
81
|
+
expect(() => util_1.RedTeamGenerationResponse.parse(validResponse)).not.toThrow();
|
|
82
|
+
});
|
|
83
|
+
it('should throw error for invalid response structure', () => {
|
|
84
|
+
const invalidResponse = {
|
|
85
|
+
task: 'purpose',
|
|
86
|
+
// Missing 'result' field
|
|
87
|
+
};
|
|
88
|
+
expect(() => util_1.RedTeamGenerationResponse.parse(invalidResponse)).toThrow('Invalid input');
|
|
89
|
+
});
|
|
90
|
+
it('should validate response with string result', () => {
|
|
91
|
+
const response = {
|
|
92
|
+
task: 'purpose',
|
|
93
|
+
result: 'This is a purpose',
|
|
94
|
+
};
|
|
95
|
+
expect(() => util_1.RedTeamGenerationResponse.parse(response)).not.toThrow();
|
|
96
|
+
});
|
|
97
|
+
it('should validate response with array result', () => {
|
|
98
|
+
const response = {
|
|
99
|
+
task: 'entities',
|
|
100
|
+
result: ['Entity1', 'Entity2'],
|
|
101
|
+
};
|
|
102
|
+
expect(() => util_1.RedTeamGenerationResponse.parse(response)).not.toThrow();
|
|
103
|
+
});
|
|
104
|
+
});
|
|
12
105
|
describe('Extraction Utils', () => {
|
|
13
106
|
let provider;
|
|
14
107
|
beforeEach(() => {
|
|
@@ -28,12 +121,10 @@ describe('Extraction Utils', () => {
|
|
|
28
121
|
const error = new Error('API error');
|
|
29
122
|
jest.mocked(provider.callApi).mockResolvedValue({ error: error.message });
|
|
30
123
|
await expect((0, util_1.callExtraction)(provider, 'test prompt', jest.fn())).rejects.toThrow('Failed to perform extraction: API error');
|
|
31
|
-
expect(logger_1.default.error).toHaveBeenCalledWith('Error in extraction: API error');
|
|
32
124
|
});
|
|
33
125
|
it('should throw an error if output is not a string', async () => {
|
|
34
126
|
jest.mocked(provider.callApi).mockResolvedValue({ output: 123 });
|
|
35
127
|
await expect((0, util_1.callExtraction)(provider, 'test prompt', jest.fn())).rejects.toThrow('Invalid extraction output: expected string, got: 123');
|
|
36
|
-
expect(logger_1.default.error).toHaveBeenCalledWith('Invalid output from extraction. Got: 123');
|
|
37
128
|
});
|
|
38
129
|
it('should handle empty string output', async () => {
|
|
39
130
|
jest.mocked(provider.callApi).mockResolvedValue({ output: '' });
|
|
@@ -43,12 +134,10 @@ describe('Extraction Utils', () => {
|
|
|
43
134
|
it('should handle null output', async () => {
|
|
44
135
|
jest.mocked(provider.callApi).mockResolvedValue({ output: null });
|
|
45
136
|
await expect((0, util_1.callExtraction)(provider, 'test prompt', jest.fn())).rejects.toThrow('Invalid extraction output: expected string, got: null');
|
|
46
|
-
expect(logger_1.default.error).toHaveBeenCalledWith('Invalid output from extraction. Got: null');
|
|
47
137
|
});
|
|
48
138
|
it('should handle undefined output', async () => {
|
|
49
139
|
jest.mocked(provider.callApi).mockResolvedValue({ output: undefined });
|
|
50
140
|
await expect((0, util_1.callExtraction)(provider, 'test prompt', jest.fn())).rejects.toThrow('Invalid extraction output: expected string, got: undefined');
|
|
51
|
-
expect(logger_1.default.error).toHaveBeenCalledWith('Invalid output from extraction. Got: undefined');
|
|
52
141
|
});
|
|
53
142
|
});
|
|
54
143
|
describe('formatPrompts', () => {
|