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
@@ -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-0dc90092cd7acaaf.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-0dc90092cd7acaaf.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-e9b86858e84ebd38.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\":\"B-Wbtl8GsdNHqd1Jebs7I\",\"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-0b89c8ba365b7195.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
+ <!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:["B-Wbtl8GsdNHqd1Jebs7I",[[["",{"children":["report",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],"$L3",[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/de0307797e31a3e6.css","precedence":"next"}]],"$L4"]]]]
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-e9b86858e84ebd38.js"],"name":"PageShell","async":false}
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-0b89c8ba365b7195.js"],"name":"","async":false}
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-0dc90092cd7acaaf.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-0dc90092cd7acaaf.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-e9b86858e84ebd38.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\":\"B-Wbtl8GsdNHqd1Jebs7I\",\"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
+ <!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:["B-Wbtl8GsdNHqd1Jebs7I",[[["",{"children":["setup",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],"$L3",[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/de0307797e31a3e6.css","precedence":"next"}]],"$L4"]]]]
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-e9b86858e84ebd38.js"],"name":"PageShell","async":false}
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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=generate.test.d.ts.map
@@ -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 redteam_1 = require("../../../src/commands/generate/redteam");
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 redteam_2 = require("../../../src/redteam");
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(redteam_2.synthesize).mockResolvedValue({
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, redteam_1.doGenerateRedteam)(options);
94
- expect(redteam_2.synthesize).toHaveBeenCalledWith(expect.objectContaining({
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(redteam_2.synthesize).mockResolvedValue({
131
+ jest.mocked(redteam_1.synthesize).mockResolvedValue({
133
132
  testCases: [],
134
133
  purpose: 'Test purpose',
135
134
  entities: [],
136
135
  });
137
- await (0, redteam_1.doGenerateRedteam)(options);
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, redteam_1.doGenerateRedteam)(options);
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(redteam_2.synthesize).mockResolvedValue({
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, redteam_1.doGenerateRedteam)(options);
176
- expect(redteam_2.synthesize).toHaveBeenCalledWith({
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=redteam.test.js.map
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
- it('should extract entities correctly', async () => {
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;CACjB,CAAC,CAAC,CAAC;AAEJ,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,IAAI,QAAqB,CAAC;IAE1B,UAAU,CAAC,GAAG,EAAE;QACd,QAAQ,GAAG;YACT,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,MAAM,EAAE,+BAA+B,EAAE,CAAC;YACjF,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,eAAe,CAAC;SAC/C,CAAC;QACF,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,MAAM,GAAG,MAAM,IAAA,0BAAe,EAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;QACvE,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC5C,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC;QAClF,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,iBAAiB,CAAC,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC,CAAC;QACjF,MAAM,MAAM,GAAG,MAAM,IAAA,0BAAe,EAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC3D,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC3B,MAAM,CAAC,gBAAM,CAAC,KAAK,CAAC,CAAC,oBAAoB,CAAC,8CAA8C,CAAC,CAAC;IAC5F,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
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
- jest.clearAllMocks();
11
- });
12
- it('should extract system purpose when returned in xml', async () => {
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
- await expect((0, purpose_1.extractSystemPurpose)(provider, ['prompt1', 'prompt2'])).resolves.toBe('Extracted system purpose');
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
- const provider = {
25
- callApi: jest.fn().mockResolvedValue({ output: 'Extracted system purpose' }),
26
- id: jest.fn().mockReturnValue('test-provider'),
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;CACjB,CAAC,CAAC,CAAC;AAEJ,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,UAAU,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,QAAQ,GAAgB;YAC5B,OAAO,EAAE,IAAI;iBACV,EAAE,EAAE;iBACJ,iBAAiB,CAAC,EAAE,MAAM,EAAE,6CAA6C,EAAE,CAAC;YAC/E,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,eAAe,CAAC;SAC/C,CAAC;QACF,MAAM,MAAM,CAAC,IAAA,8BAAoB,EAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAChF,0BAA0B,CAC3B,CAAC;QACF,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC;QAClF,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC5E,MAAM,QAAQ,GAAgB;YAC5B,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,MAAM,EAAE,0BAA0B,EAAE,CAAC;YAC5E,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,eAAe,CAAC;SAC/C,CAAC;QACF,MAAM,MAAM,CAAC,IAAA,8BAAoB,EAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAChF,0BAA0B,CAC3B,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
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', () => {