promptfoo 0.120.25 → 0.120.26

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 (237) hide show
  1. package/README.md +35 -22
  2. package/dist/src/{ListApp-CYTAaS6A.js → ListApp-D3DG0F8h.js} +1 -1
  3. package/dist/src/{accounts-CwqY22lU.cjs → accounts-BzEY8H3v.cjs} +4 -4
  4. package/dist/src/{accounts-Bzx8GnL6.js → accounts-DHHiXsy6.js} +5 -5
  5. package/dist/src/{accounts-BSwMxhY3.js → accounts-R3gfCR_g.js} +4 -4
  6. package/dist/src/{agentic-utils-5K7LzooV.js → agentic-utils-D6_gzOUF.js} +2 -2
  7. package/dist/src/{agents-B8RWrA68.cjs → agents-C7BiinFI.cjs} +6 -6
  8. package/dist/src/{agents-zHyWnnQ2.js → agents-Cao4i7AX.js} +7 -7
  9. package/dist/src/{agents-KZxXwlyn.cjs → agents-CwM7re15.cjs} +2 -2
  10. package/dist/src/{agents-DleC7rb4.js → agents-DETIQHqF.js} +6 -6
  11. package/dist/src/{agents-CkA9l77-.js → agents-DYIT-hQy.js} +5 -5
  12. package/dist/src/{agents-B20gl7hH.js → agents-GiUianme.js} +2 -2
  13. package/dist/src/{aimlapi-DgbFGPTX.js → aimlapi-CMJpKK-B.js} +9 -9
  14. package/dist/src/{aimlapi-DILJovhN.js → aimlapi-DMF6v_vb.js} +14 -14
  15. package/dist/src/{aimlapi-DIdWBHtH.cjs → aimlapi-DoGLcQW_.cjs} +9 -9
  16. package/dist/src/app/assets/index-BOgkICuY.css +1 -0
  17. package/dist/src/app/assets/index-CSgqn_Vd.js +428 -0
  18. package/dist/src/app/assets/{vendor-charts-DnwydkkY.js → vendor-charts-CYyo8R8v.js} +1 -1
  19. package/dist/src/app/assets/{vendor-markdown-DjKAU15k.js → vendor-markdown-DSmzq4Jh.js} +1 -1
  20. package/dist/src/app/assets/vendor-react-AtKqiNEf.js +4 -0
  21. package/dist/src/app/assets/{vendor-syntax-Dc86c4Bu.js → vendor-syntax-D06x6TQF.js} +1 -1
  22. package/dist/src/app/index.html +6 -6
  23. package/dist/src/app/tsconfig.app.tsbuildinfo +1 -1
  24. package/dist/src/{audio-BoR9KZV8.cjs → audio-BWjyvHn9.cjs} +3 -3
  25. package/dist/src/{audio-nUSOpXY7.js → audio-BrJBFN2b.js} +3 -3
  26. package/dist/src/{audio-BDrAkpVc.js → audio-DUH4q0Xq.js} +4 -4
  27. package/dist/src/{base-DumUXbOH.js → base-BaXmtXYp.js} +2 -2
  28. package/dist/src/{base-CwCV0t8r.js → base-Dtp8b4_N.js} +2 -2
  29. package/dist/src/{base-D8VQYhNQ.cjs → base-f71xxWai.cjs} +2 -2
  30. package/dist/src/{blobs-_kNRY6vU.cjs → blobs-673H0jCl.cjs} +2 -2
  31. package/dist/src/{blobs-Dnt2rxpc.js → blobs-C9J2mVgo.js} +2 -2
  32. package/dist/src/{blobs-DlB5fwyF.js → blobs-kt8v3UyH.js} +2 -2
  33. package/dist/src/{cache-S9MAoF9H.cjs → cache-7xULbvt3.cjs} +34 -7
  34. package/dist/src/{cache-C4A4H4Xb.js → cache-BLLayYEN.js} +23 -8
  35. package/dist/src/{cache-B2oIvf92.js → cache-BUPcq0Ad.js} +2 -2
  36. package/dist/src/cache-CVfRb-HD.cjs +6 -0
  37. package/dist/src/{cache-DofebEnH.js → cache-O4EuX2JV.js} +3 -3
  38. package/dist/src/{cache-Bg1Wpvzq.js → cache-mIszOnuz.js} +4 -21
  39. package/dist/src/{chat-DTCPbuld.cjs → chat-C4zqjObh.cjs} +6 -6
  40. package/dist/src/{chat-noXtEAh5.js → chat-C8Ei4f87.js} +6 -6
  41. package/dist/src/{chat-BiImdLJf.js → chat-CgyGj2hC.js} +8 -8
  42. package/dist/src/{chat-DQ6Z5Cbn.js → chat-Cpz3O-Xl.js} +13 -13
  43. package/dist/src/{chat-D_cro0wd.js → chat-DIywASPG.js} +10 -10
  44. package/dist/src/{chat-BR2x1dG_.cjs → chat-Fl6TZJRS.cjs} +8 -8
  45. package/dist/src/{chatkit-TnC1YoVi.js → chatkit-DEls11hE.js} +3 -3
  46. package/dist/src/{claude-agent-sdk-CBpAZV5h.js → claude-agent-sdk-6-xTaLwM.js} +45 -16
  47. package/dist/src/{claude-agent-sdk-uHLgAUZj.cjs → claude-agent-sdk-BzxF6NIJ.cjs} +45 -16
  48. package/dist/src/{claude-agent-sdk-qxE5mGVi.js → claude-agent-sdk-CmkTnKGH.js} +48 -19
  49. package/dist/src/{claude-agent-sdk-DyPvrj-1.js → claude-agent-sdk-rXCBLK_o.js} +38 -9
  50. package/dist/src/{cloud-lRosK6Nk.js → cloud-BMbRVJFw.js} +2 -2
  51. package/dist/src/{cloud-DHWE-9nj.js → cloud-CZ4hytdm.js} +1 -1
  52. package/dist/src/{cloudflare-ai-D0OtFY6g.cjs → cloudflare-ai-BAQ0u_dg.cjs} +9 -9
  53. package/dist/src/{cloudflare-ai-BprwSD6d.js → cloudflare-ai-CUg4BTcj.js} +9 -9
  54. package/dist/src/{cloudflare-ai-CB7OWRAP.js → cloudflare-ai-CobxMTR4.js} +14 -14
  55. package/dist/src/{cloudflare-gateway-C29gWj5O.cjs → cloudflare-gateway-C0sgfr_z.cjs} +10 -10
  56. package/dist/src/{cloudflare-gateway-BaVwoBjE.js → cloudflare-gateway-D2_yi-Fh.js} +15 -15
  57. package/dist/src/{cloudflare-gateway-BjoxwqUw.js → cloudflare-gateway-_itGuXry.js} +10 -10
  58. package/dist/src/{codex-sdk-DNkCbb7c.js → codex-sdk-dSnGdgIp.js} +3 -3
  59. package/dist/src/{cometapi-BGxGZ7VA.js → cometapi-B01btbfb.js} +15 -15
  60. package/dist/src/{cometapi-xiTQZp8R.js → cometapi-ChAaRjg5.js} +10 -10
  61. package/dist/src/{cometapi-DalITP94.cjs → cometapi-JbvOJSCO.cjs} +10 -10
  62. package/dist/src/{completion-BTbouQDz.js → completion-BBJ6zmG3.js} +5 -5
  63. package/dist/src/{completion-HYrX5gEL.js → completion-D9_MDlnd.js} +4 -4
  64. package/dist/src/{completion-DV0Ys99K.cjs → completion-DDyL3Cb2.cjs} +4 -4
  65. package/dist/src/{docker-Dx_FN1ag.js → docker-BuButc4D.js} +14 -14
  66. package/dist/src/{docker-zUAnbYTM.cjs → docker-Ckw-j7Rr.cjs} +9 -9
  67. package/dist/src/{docker-BAYnlbAW.js → docker-JAAubMw3.js} +9 -9
  68. package/dist/src/errors-DnGCbnx8.js +36 -0
  69. package/dist/src/{esm-79BpbQzg.js → esm-CYhseqj4.js} +1 -1
  70. package/dist/src/eval-CKHWqG9f.js +16 -0
  71. package/dist/src/{eval-Cxb9alW8.js → eval-CYrbG57o.js} +45 -13
  72. package/dist/src/{evalResult-B8LbgWMA.js → evalResult-6JaUIStC.js} +6 -6
  73. package/dist/src/{evalResult-CJNSpa3q.js → evalResult-COsVttMA.js} +6 -6
  74. package/dist/src/evalResult-CxTP-LMm.cjs +11 -0
  75. package/dist/src/evalResult-CzLURDcP.js +13 -0
  76. package/dist/src/{evalResult-hI1mhi_g.cjs → evalResult-DlRfu_Rq.cjs} +6 -6
  77. package/dist/src/evalResult-DyttNQ_G.js +11 -0
  78. package/dist/src/evaluator-0PvfeBYh.js +38 -0
  79. package/dist/src/{evaluator-1Tkdu8MK.js → evaluator-3EJCMTs0.js} +74 -48
  80. package/dist/src/{extractor-BPBlLyOn.cjs → extractor-DbhlYEeo.cjs} +22 -5
  81. package/dist/src/{extractor-CuUWqwrE.js → extractor-Hs7la_19.js} +22 -5
  82. package/dist/src/{extractor-BFoThUOa.js → extractor-LSYjrhK0.js} +22 -5
  83. package/dist/src/{fetch-zJuFPxN1.js → fetch-18MuNu9i.js} +4 -4
  84. package/dist/src/{fetch-BdiCecAv.js → fetch-Bi0o-fdp.js} +1 -1
  85. package/dist/src/fetch-CMptBDVg.cjs +4 -0
  86. package/dist/src/{fetch-BQgz6x7S.js → fetch-DAZkv3gV.js} +2 -2
  87. package/dist/src/{fetch-BuP-gm0E.js → fetch-SRsE6Ctl.js} +4 -4
  88. package/dist/src/{fetch-Dy2YML9G.cjs → fetch-ZMn_oemb.cjs} +4 -4
  89. package/dist/src/{fileExtensions-CzcPkiKZ.js → fileExtensions-BpuMmaFL.js} +1 -1
  90. package/dist/src/{formatDuration-CGa0ZDQ8.js → formatDuration-Doo0xq-z.js} +1 -1
  91. package/dist/src/{genaiTracer-foKtbVa2.js → genaiTracer-CqNnnXrE.js} +1 -1
  92. package/dist/src/graders-BCytzXrb.js +34 -0
  93. package/dist/src/{graders-DMAzEgEF.js → graders-BaMCwIKp.js} +211 -91
  94. package/dist/src/graders-CGZQShfJ.cjs +33 -0
  95. package/dist/src/{graders-NBsuYeMx.cjs → graders-DzUUnUjC.cjs} +206 -86
  96. package/dist/src/{graders-CtvuaC8D.js → graders-QsALpIdy.js} +206 -86
  97. package/dist/src/graders-spkuVC-E.js +36 -0
  98. package/dist/src/{image-Bf8RiJ2g.js → image-BXt_7u0v.js} +3 -3
  99. package/dist/src/{image-LhLO5KCW.js → image-BiEVdpdP.js} +4 -4
  100. package/dist/src/{image-CaVWfZub.cjs → image-C3BjJUAU.cjs} +4 -4
  101. package/dist/src/{image-BnF25Osq.cjs → image-D10zEe1f.cjs} +3 -3
  102. package/dist/src/{image-DIn_AW1Z.js → image-DB4sHxdJ.js} +4 -4
  103. package/dist/src/{image-DFwp1aAV.js → image-mhAGP07h.js} +6 -6
  104. package/dist/src/index.cjs +152 -69
  105. package/dist/src/index.d.cts +20 -3
  106. package/dist/src/index.d.ts +20 -3
  107. package/dist/src/index.js +152 -69
  108. package/dist/src/{interactiveCheck-Dmm9vjpx.js → interactiveCheck-DU-MAhp5.js} +1 -1
  109. package/dist/src/{knowledgeBase-Bf57PI7g.cjs → knowledgeBase-Bnb00xKs.cjs} +6 -6
  110. package/dist/src/{knowledgeBase-DZw2L9kf.js → knowledgeBase-CMvMlLZR.js} +8 -8
  111. package/dist/src/{knowledgeBase-CfOvyF2s.js → knowledgeBase-XJQ0Qyez.js} +6 -6
  112. package/dist/src/{litellm-Ds8YmO1b.js → litellm-BECdjOTx.js} +3 -3
  113. package/dist/src/{litellm-ByNRN2Vh.cjs → litellm-BrnZhMcL.cjs} +11 -11
  114. package/dist/src/{litellm-fU-xV6T4.js → litellm-CHrRmPAe.js} +16 -16
  115. package/dist/src/{litellm-DexU8FFp.js → litellm-CrLJrPIm.js} +11 -11
  116. package/dist/src/{luma-ray-y26EHFO8.js → luma-ray-BOeX-h0M.js} +8 -8
  117. package/dist/src/{luma-ray-BIe5ctI4.cjs → luma-ray-C0RkI3lt.cjs} +8 -8
  118. package/dist/src/{luma-ray-vvE-O9EA.js → luma-ray-DgKLS0BF.js} +10 -10
  119. package/dist/src/main.js +1011 -404
  120. package/dist/src/{messages-Bg2ekFPc.js → messages-CDZYGNlS.js} +7 -7
  121. package/dist/src/{messages-DpoCLD_8.js → messages-D61tPFQo.js} +9 -9
  122. package/dist/src/{messages-16jb9LP7.cjs → messages-DXV3Qh8_.cjs} +7 -7
  123. package/dist/src/{meteor-DLCdreag.js → meteor-P2rUE-Uz.js} +1 -1
  124. package/dist/src/{nova-reel-BM0snD2m.js → nova-reel-Bk5npr2q.js} +10 -10
  125. package/dist/src/{nova-reel-CvXCVn3f.cjs → nova-reel-D9FXq3Mt.cjs} +8 -8
  126. package/dist/src/{nova-reel-CJLpBKSI.js → nova-reel-DtCjbD5O.js} +8 -8
  127. package/dist/src/{nova-sonic-CklvraBd.js → nova-sonic-BXRfQyF-.js} +7 -7
  128. package/dist/src/{nova-sonic-DEx_FdFW.cjs → nova-sonic-BoRSY_U6.cjs} +5 -5
  129. package/dist/src/{nova-sonic-Cjh_qopr.js → nova-sonic-CgaWLDM1.js} +5 -5
  130. package/dist/src/{openai-jNIREoAW.js → openai-CT5fwbve.js} +1 -1
  131. package/dist/src/{openclaw-CnAwBfPO.js → openclaw-B6XY2kUf.js} +14 -14
  132. package/dist/src/{openclaw-DBSSY4SP.js → openclaw-CpPrXwf6.js} +9 -9
  133. package/dist/src/{openclaw-CbHtt3B8.cjs → openclaw-DDSfq5fp.cjs} +9 -9
  134. package/dist/src/{opencode-sdk-CqxTHrk0.js → opencode-sdk-CImWVqy9.js} +6 -6
  135. package/dist/src/{opencode-sdk-xUrRk5Jx.js → opencode-sdk-CuCztr4P.js} +4 -4
  136. package/dist/src/{opencode-sdk-DdmtRB6D.cjs → opencode-sdk-mqF-Oj3f.cjs} +4 -4
  137. package/dist/src/{otlpReceiver-th2zHwjZ.cjs → otlpReceiver-B6Xo4KZM.cjs} +4 -4
  138. package/dist/src/{otlpReceiver-uytrRKdo.js → otlpReceiver-BO0rbDzh.js} +4 -4
  139. package/dist/src/{otlpReceiver-C-1cdVDr.js → otlpReceiver-Dg817agV.js} +5 -5
  140. package/dist/src/{providerRegistry-DAZoFmGv.js → providerRegistry-Xf0qdqGQ.js} +1 -1
  141. package/dist/src/providers-BMZZmPBJ.cjs +32 -0
  142. package/dist/src/{providers-CpUrPa8s.cjs → providers-BNKVY53V.cjs} +94 -64
  143. package/dist/src/{providers-D3lk_R7Q.js → providers-BiNq_Iyc.js} +94 -64
  144. package/dist/src/{providers-BOvl9qv5.js → providers-BlEhY5mi.js} +110 -79
  145. package/dist/src/providers-CQQrNaJk.js +32 -0
  146. package/dist/src/providers-Ck8HyrC-.js +34 -0
  147. package/dist/src/{pythonUtils-CUPlf1H0.js → pythonUtils-r1uBuA0n.js} +2 -2
  148. package/dist/src/{quiverai-BNGJOQym.cjs → quiverai-BNfIwKCO.cjs} +8 -8
  149. package/dist/src/{quiverai-Y7Is4wah.js → quiverai-BQigKdIH.js} +13 -13
  150. package/dist/src/{quiverai-DthRqZs9.js → quiverai-Bfy2WnE2.js} +8 -8
  151. package/dist/src/{render-kFatbqG6.js → render-CAZvKKkB.js} +3 -3
  152. package/dist/src/{responses-BtU_i-R0.js → responses-DLLjADw5.js} +5 -5
  153. package/dist/src/{responses-B85halqh.js → responses-TsdODUpm.js} +8 -8
  154. package/dist/src/{responses-CXJACENh.cjs → responses-zOtKtnY_.cjs} +5 -5
  155. package/dist/src/{rubyUtils-DYKoa7Ze.js → rubyUtils-BtjlqyXt.js} +2 -2
  156. package/dist/src/{rubyUtils-BA4D4gMX.js → rubyUtils-D7--T12C.js} +2 -2
  157. package/dist/src/{sagemaker-hRS_Jj3-.js → sagemaker-BcgLu0U4.js} +17 -17
  158. package/dist/src/{sagemaker-DI6IOTjT.js → sagemaker-CLdUAv5z.js} +11 -11
  159. package/dist/src/{sagemaker-BUagsrJ-.cjs → sagemaker-DwNnEVYt.cjs} +11 -11
  160. package/dist/src/{scanner-C6QXA9Pn.js → scanner-Dyw21Wg_.js} +10 -10
  161. package/dist/src/server/index.js +1376 -486
  162. package/dist/src/server-BUbS0Qfh.js +6 -0
  163. package/dist/src/{server-BPC37wlX.js → server-CbMTRQkg.js} +3 -3
  164. package/dist/src/{server-C_O6-VE4.cjs → server-CgUQ25qW.cjs} +3 -3
  165. package/dist/src/{server-HQtz_gUy.js → server-DWmZLfCy.js} +4 -4
  166. package/dist/src/server-XpGXFHkS.cjs +6 -0
  167. package/dist/src/server-gfOx5Zrk.js +8 -0
  168. package/dist/src/{signal-D4VhSJOY.js → signal-Bl32q42d.js} +2 -2
  169. package/dist/src/{slack-DTUSadx4.js → slack-BfdBx2tO.js} +1 -1
  170. package/dist/src/{store-BTdkdmK9.js → store-2ocbYY9D.js} +2 -2
  171. package/dist/src/store-5u2yriTV.js +7 -0
  172. package/dist/src/{store-F-KTiqfb.cjs → store-BqwfFEyF.cjs} +2 -2
  173. package/dist/src/{store-rueRdzcm.js → store-D4gdn9ih.js} +2 -2
  174. package/dist/src/store-D_lq_8oQ.js +6 -0
  175. package/dist/src/store-m5KT6Ly7.cjs +6 -0
  176. package/dist/src/{tables-w-r-abWq.cjs → tables-B9E1kRp-.cjs} +2 -2
  177. package/dist/src/{tables-ChjAuVAR.js → tables-C7TT2XVn.js} +2 -2
  178. package/dist/src/{tables-dNaVPyDr.js → tables-D-NSwNIb.js} +2 -2
  179. package/dist/src/telemetry-5RHFoCJh.js +6 -0
  180. package/dist/src/{telemetry-wXyCQ1Nz.js → telemetry-BXyVqyAg.js} +3 -3
  181. package/dist/src/{telemetry-Y1esJM0v.cjs → telemetry-D0_yFdtU.cjs} +3 -3
  182. package/dist/src/{telemetry-Dai7PdlR.js → telemetry-DZ_7PaVq.js} +3 -3
  183. package/dist/src/telemetry-Do8wMnA-.js +8 -0
  184. package/dist/src/telemetry-LojxPoFq.cjs +6 -0
  185. package/dist/src/{text-C1cXk9ij.js → text-DgMr_tiM.js} +1 -1
  186. package/dist/src/{tokenUsageUtils-D2ko2eFQ.js → tokenUsageUtils-DmZSD2eU.js} +1 -1
  187. package/dist/src/{transcription-i6EfSMie.js → transcription-CYuY5sFO.js} +6 -6
  188. package/dist/src/{transcription-CcYTL4wi.js → transcription-Ch7S-LWw.js} +10 -10
  189. package/dist/src/{transcription-C-K2hDJX.cjs → transcription-FNIz3YOe.cjs} +6 -6
  190. package/dist/src/{transform-gpzlPrwG.js → transform-CoP2bJ7P.js} +43 -4
  191. package/dist/src/{transform-B86_0IIb.js → transform-CqTFr7KR.js} +4 -4
  192. package/dist/src/{transform-DosdxVdh.js → transform-DMaxQwDx.js} +43 -4
  193. package/dist/src/{transform-DwsntMEQ.js → transform-GybT0X0u.js} +3 -3
  194. package/dist/src/{transform-CCSNqTI-.cjs → transform-ivxEY4f7.cjs} +54 -3
  195. package/dist/src/{transformersAvailability-DM54tWzt.js → transformersAvailability-DwmezkVe.js} +1 -1
  196. package/dist/src/{types-Brw5kggg.cjs → types-BIfttHrT.cjs} +13 -1
  197. package/dist/src/{types-CslP2TyG.js → types-DMVjYLpx.js} +13 -1
  198. package/dist/src/{types-CMDs7Kzu.js → types-t52w-XsS.js} +16 -2
  199. package/dist/src/{util-BECSJ0T_.js → util-BSh4a_Q8.js} +6 -6
  200. package/dist/src/{util-D8z5QOy8.cjs → util-C08Kns6-.cjs} +3 -3
  201. package/dist/src/{util-CttPoePn.js → util-CUEt0Vum.js} +3 -3
  202. package/dist/src/{util-CfPdWQJX.js → util-Cl0zfT3V.js} +3 -3
  203. package/dist/src/{util-Dab5xp2E.cjs → util-DUYOvxAy.cjs} +3 -3
  204. package/dist/src/{util-CY_XguB9.js → util-DiCePfDu.js} +3 -3
  205. package/dist/src/{util-CBAXTxfy.cjs → util-DkFTvieG.cjs} +3 -3
  206. package/dist/src/{util-Dft1RxsL.js → util-mJ58qbbw.js} +3 -3
  207. package/dist/src/{util-Ba18wQ8e.js → util-vjscpUzy.js} +3 -3
  208. package/dist/src/{utils-BTeLHwiH.js → utils-CVzb4YiI.js} +2 -2
  209. package/dist/src/{utils-Db5KwiXp.cjs → utils-DFaZa6Rf.cjs} +2 -2
  210. package/dist/src/{utils-ICP7kLcY.js → utils-JaY9veb5.js} +2 -2
  211. package/dist/tsconfig.tsbuildinfo +1 -1
  212. package/package.json +43 -42
  213. package/dist/src/app/assets/index-COIipVf1.css +0 -1
  214. package/dist/src/app/assets/index-ClD64gUa.js +0 -428
  215. package/dist/src/app/assets/vendor-react-DHoaNLma.js +0 -4
  216. package/dist/src/cache-BJ31KhNT.cjs +0 -6
  217. package/dist/src/eval-DgiEH2xe.js +0 -16
  218. package/dist/src/evalResult-Boel8xoS.js +0 -13
  219. package/dist/src/evalResult-DGx1-Ela.js +0 -11
  220. package/dist/src/evalResult-DzRxYLDH.cjs +0 -11
  221. package/dist/src/evaluator-B4qKt437.js +0 -38
  222. package/dist/src/fetch-DwhKew9e.cjs +0 -4
  223. package/dist/src/graders-BpEqZT2Q.js +0 -34
  224. package/dist/src/graders-DTGI-hHE.cjs +0 -33
  225. package/dist/src/graders-DgMr-E4I.js +0 -36
  226. package/dist/src/providers-DVsoSup2.js +0 -34
  227. package/dist/src/providers-D_tJatIk.js +0 -32
  228. package/dist/src/providers-wpMPsMZ7.cjs +0 -32
  229. package/dist/src/server-BeqUuSvj.js +0 -6
  230. package/dist/src/server-CwQsQ6dl.cjs +0 -6
  231. package/dist/src/server-Dhbq83-d.js +0 -8
  232. package/dist/src/store-C7U17qcu.js +0 -6
  233. package/dist/src/store-CuDU_jDN.js +0 -7
  234. package/dist/src/store-awdDxuiD.cjs +0 -6
  235. package/dist/src/telemetry-ClcYTCOG.js +0 -8
  236. package/dist/src/telemetry-DEWuLu_s.js +0 -6
  237. package/dist/src/telemetry-tADmeX6E.cjs +0 -6
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env node
2
+ import "./chunk-DHDDz29n.js";
3
+ import "./logger-BotXmWKW.js";
4
+ import "./fetch-SRsE6Ctl.js";
5
+ import "./accounts-DHHiXsy6.js";
6
+ import "./cloud-BMbRVJFw.js";
7
+ import "./telemetry-BXyVqyAg.js";
8
+ import "./types-t52w-XsS.js";
9
+ import "./server-DWmZLfCy.js";
10
+ import "./providers-BlEhY5mi.js";
11
+ import "./cache-mIszOnuz.js";
12
+ import "./util-BSh4a_Q8.js";
13
+ import "./esm-CYhseqj4.js";
14
+ import "./pythonUtils-r1uBuA0n.js";
15
+ import "./transform-CqTFr7KR.js";
16
+ import { n as getGraderById, t as GRADERS } from "./graders-BaMCwIKp.js";
17
+ import "./utils-JaY9veb5.js";
18
+ import "./extractor-LSYjrhK0.js";
19
+ import "./genaiTracer-CqNnnXrE.js";
20
+ import "./chat-DIywASPG.js";
21
+ import "./transform-CoP2bJ7P.js";
22
+ import "./messages-D61tPFQo.js";
23
+ import "./util-vjscpUzy.js";
24
+ import "./responses-TsdODUpm.js";
25
+ import "./openai-CT5fwbve.js";
26
+ import "./util-CUEt0Vum.js";
27
+ import "./completion-BBJ6zmG3.js";
28
+ import "./blobs-kt8v3UyH.js";
29
+ import "./tables-C7TT2XVn.js";
30
+ import "./store-D4gdn9ih.js";
31
+ import "./base-BaXmtXYp.js";
32
+ import "./image-mhAGP07h.js";
33
+ import "./providerRegistry-Xf0qdqGQ.js";
34
+ import "./rubyUtils-BtjlqyXt.js";
35
+
36
+ export { getGraderById };
@@ -1,7 +1,7 @@
1
1
  import "./chunk-FhC4c-0y.js";
2
2
  import { b as getEnvString, i as logger_default } from "./logger-w8Ozp0Td.js";
3
- import { h as REQUEST_TIMEOUT_MS } from "./fetch-zJuFPxN1.js";
4
- import { a as fetchWithCache } from "./cache-C4A4H4Xb.js";
3
+ import { h as REQUEST_TIMEOUT_MS } from "./fetch-18MuNu9i.js";
4
+ import { a as fetchWithCache } from "./cache-BLLayYEN.js";
5
5
 
6
6
  //#region src/providers/hyperbolic/image.ts
7
7
  const HYPERBOLIC_IMAGE_MODELS = [
@@ -162,4 +162,4 @@ function createHyperbolicImageProvider(providerPath, options = {}) {
162
162
 
163
163
  //#endregion
164
164
  export { createHyperbolicImageProvider };
165
- //# sourceMappingURL=image-Bf8RiJ2g.js.map
165
+ //# sourceMappingURL=image-BXt_7u0v.js.map
@@ -1,8 +1,8 @@
1
1
  import { i as logger_default } from "./logger-w8Ozp0Td.js";
2
- import { h as REQUEST_TIMEOUT_MS } from "./fetch-zJuFPxN1.js";
3
- import { a as fetchWithCache } from "./cache-C4A4H4Xb.js";
2
+ import { h as REQUEST_TIMEOUT_MS } from "./fetch-18MuNu9i.js";
3
+ import { a as fetchWithCache } from "./cache-BLLayYEN.js";
4
4
  import { t as OpenAiGenericProvider } from "./openai-Dz3surb_.js";
5
- import { s as formatOpenAiError } from "./util-CfPdWQJX.js";
5
+ import { s as formatOpenAiError } from "./util-Cl0zfT3V.js";
6
6
  import { t as ellipsize } from "./text-Dm78AVGG.js";
7
7
 
8
8
  //#region src/providers/openai/image.ts
@@ -215,4 +215,4 @@ var OpenAiImageProvider = class extends OpenAiGenericProvider {
215
215
 
216
216
  //#endregion
217
217
  export { callOpenAiImageApi as n, formatOutput as r, OpenAiImageProvider as t };
218
- //# sourceMappingURL=image-LhLO5KCW.js.map
218
+ //# sourceMappingURL=image-BiEVdpdP.js.map
@@ -1,8 +1,8 @@
1
1
  const require_logger = require('./logger-BdZ-IqBc.cjs');
2
- const require_fetch = require('./fetch-Dy2YML9G.cjs');
3
- const require_cache = require('./cache-S9MAoF9H.cjs');
2
+ const require_fetch = require('./fetch-ZMn_oemb.cjs');
3
+ const require_cache = require('./cache-7xULbvt3.cjs');
4
4
  const require_openai = require('./openai-Bigwjgo1.cjs');
5
- const require_util = require('./util-D8z5QOy8.cjs');
5
+ const require_util = require('./util-C08Kns6-.cjs');
6
6
  const require_text = require('./text-DF2hMKdg.cjs');
7
7
 
8
8
  //#region src/providers/openai/image.ts
@@ -232,4 +232,4 @@ Object.defineProperty(exports, 'formatOutput', {
232
232
  return formatOutput;
233
233
  }
234
234
  });
235
- //# sourceMappingURL=image-CaVWfZub.cjs.map
235
+ //# sourceMappingURL=image-C3BjJUAU.cjs.map
@@ -1,6 +1,6 @@
1
1
  const require_logger = require('./logger-BdZ-IqBc.cjs');
2
- const require_fetch = require('./fetch-Dy2YML9G.cjs');
3
- const require_cache = require('./cache-S9MAoF9H.cjs');
2
+ const require_fetch = require('./fetch-ZMn_oemb.cjs');
3
+ const require_cache = require('./cache-7xULbvt3.cjs');
4
4
 
5
5
  //#region src/providers/hyperbolic/image.ts
6
6
  const HYPERBOLIC_IMAGE_MODELS = [
@@ -161,4 +161,4 @@ function createHyperbolicImageProvider(providerPath, options = {}) {
161
161
 
162
162
  //#endregion
163
163
  exports.createHyperbolicImageProvider = createHyperbolicImageProvider;
164
- //# sourceMappingURL=image-BnF25Osq.cjs.map
164
+ //# sourceMappingURL=image-D10zEe1f.cjs.map
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import "./chunk-DHDDz29n.js";
3
3
  import { C as getEnvString, o as logger_default } from "./logger-BotXmWKW.js";
4
- import { d as REQUEST_TIMEOUT_MS } from "./fetch-BuP-gm0E.js";
5
- import "./cloud-lRosK6Nk.js";
6
- import { a as fetchWithCache } from "./cache-Bg1Wpvzq.js";
4
+ import { d as REQUEST_TIMEOUT_MS } from "./fetch-SRsE6Ctl.js";
5
+ import "./cloud-BMbRVJFw.js";
6
+ import { a as fetchWithCache } from "./cache-mIszOnuz.js";
7
7
 
8
8
  //#region src/providers/hyperbolic/image.ts
9
9
  const HYPERBOLIC_IMAGE_MODELS = [
@@ -164,4 +164,4 @@ function createHyperbolicImageProvider(providerPath, options = {}) {
164
164
 
165
165
  //#endregion
166
166
  export { createHyperbolicImageProvider };
167
- //# sourceMappingURL=image-DIn_AW1Z.js.map
167
+ //# sourceMappingURL=image-DB4sHxdJ.js.map
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import { o as logger_default } from "./logger-BotXmWKW.js";
3
- import { d as REQUEST_TIMEOUT_MS } from "./fetch-BuP-gm0E.js";
4
- import { a as fetchWithCache } from "./cache-Bg1Wpvzq.js";
5
- import { t as OpenAiGenericProvider } from "./openai-jNIREoAW.js";
6
- import { s as formatOpenAiError } from "./util-CttPoePn.js";
7
- import { t as ellipsize } from "./text-C1cXk9ij.js";
3
+ import { d as REQUEST_TIMEOUT_MS } from "./fetch-SRsE6Ctl.js";
4
+ import { a as fetchWithCache } from "./cache-mIszOnuz.js";
5
+ import { t as OpenAiGenericProvider } from "./openai-CT5fwbve.js";
6
+ import { s as formatOpenAiError } from "./util-CUEt0Vum.js";
7
+ import { t as ellipsize } from "./text-DgMr_tiM.js";
8
8
 
9
9
  //#region src/providers/openai/image.ts
10
10
  const DALLE2_VALID_SIZES = [
@@ -216,4 +216,4 @@ var OpenAiImageProvider = class extends OpenAiGenericProvider {
216
216
 
217
217
  //#endregion
218
218
  export { callOpenAiImageApi as n, formatOutput as r, OpenAiImageProvider as t };
219
- //# sourceMappingURL=image-DFwp1aAV.js.map
219
+ //# sourceMappingURL=image-mhAGP07h.js.map
@@ -5,36 +5,36 @@ const require_esm = require('./esm-BQkx5roy.cjs');
5
5
  const require_pythonUtils = require('./pythonUtils-DZ6EbdY4.cjs');
6
6
  const require_fileExtensions = require('./fileExtensions-DkJYkWUy.cjs');
7
7
  const require_transform = require('./transform-Kd6u-oNm.cjs');
8
- const require_graders = require('./graders-NBsuYeMx.cjs');
9
- const require_types = require('./types-Brw5kggg.cjs');
10
- const require_util = require('./util-Dab5xp2E.cjs');
11
- const require_fetch = require('./fetch-Dy2YML9G.cjs');
12
- const require_cache = require('./cache-S9MAoF9H.cjs');
13
- const require_providers = require('./providers-CpUrPa8s.cjs');
14
- const require_utils = require('./utils-Db5KwiXp.cjs');
15
- const require_extractor = require('./extractor-BPBlLyOn.cjs');
8
+ const require_graders = require('./graders-DzUUnUjC.cjs');
9
+ const require_types = require('./types-BIfttHrT.cjs');
10
+ const require_util = require('./util-DUYOvxAy.cjs');
11
+ const require_fetch = require('./fetch-ZMn_oemb.cjs');
12
+ const require_cache = require('./cache-7xULbvt3.cjs');
13
+ const require_providers = require('./providers-BNKVY53V.cjs');
14
+ const require_utils = require('./utils-DFaZa6Rf.cjs');
15
+ const require_extractor = require('./extractor-DbhlYEeo.cjs');
16
16
  require('./genaiTracer-CQlpZkrp.cjs');
17
- const require_chat = require('./chat-DTCPbuld.cjs');
17
+ const require_chat = require('./chat-C4zqjObh.cjs');
18
18
  const require_tokenUsageUtils = require('./tokenUsageUtils-CXhxVj72.cjs');
19
- const require_transform$1 = require('./transform-CCSNqTI-.cjs');
20
- require('./messages-16jb9LP7.cjs');
21
- require('./util-CBAXTxfy.cjs');
22
- require('./responses-CXJACENh.cjs');
19
+ const require_transform$1 = require('./transform-ivxEY4f7.cjs');
20
+ require('./messages-DXV3Qh8_.cjs');
21
+ require('./util-DkFTvieG.cjs');
22
+ require('./responses-zOtKtnY_.cjs');
23
23
  require('./openai-Bigwjgo1.cjs');
24
- const require_util$2 = require('./util-D8z5QOy8.cjs');
25
- require('./completion-DV0Ys99K.cjs');
26
- const require_accounts = require('./accounts-CwqY22lU.cjs');
27
- const require_server = require('./server-C_O6-VE4.cjs');
28
- const require_blobs = require('./blobs-_kNRY6vU.cjs');
29
- const require_tables = require('./tables-w-r-abWq.cjs');
30
- const require_telemetry = require('./telemetry-Y1esJM0v.cjs');
24
+ const require_util$2 = require('./util-C08Kns6-.cjs');
25
+ require('./completion-DDyL3Cb2.cjs');
26
+ const require_accounts = require('./accounts-BzEY8H3v.cjs');
27
+ const require_server = require('./server-CgUQ25qW.cjs');
28
+ const require_blobs = require('./blobs-673H0jCl.cjs');
29
+ const require_tables = require('./tables-B9E1kRp-.cjs');
30
+ const require_telemetry = require('./telemetry-D0_yFdtU.cjs');
31
31
  const require_text = require('./text-DF2hMKdg.cjs');
32
- const require_store = require('./store-F-KTiqfb.cjs');
33
- require('./base-D8VQYhNQ.cjs');
34
- require('./image-CaVWfZub.cjs');
32
+ const require_store = require('./store-BqwfFEyF.cjs');
33
+ require('./base-f71xxWai.cjs');
34
+ require('./image-C3BjJUAU.cjs');
35
35
  const require_providerRegistry = require('./providerRegistry-lc7a7utN.cjs');
36
36
  const require_rubyUtils = require('./rubyUtils-DCVaJ3mc.cjs');
37
- const require_evalResult = require('./evalResult-hI1mhi_g.cjs');
37
+ const require_evalResult = require('./evalResult-DlRfu_Rq.cjs');
38
38
  let fs = require("fs");
39
39
  fs = require_logger.__toESM(fs);
40
40
  let path = require("path");
@@ -307,7 +307,7 @@ async function startOtlpReceiverIfNeeded(testSuite) {
307
307
  require_telemetry.telemetry_default.record("feature_used", { feature: "tracing" });
308
308
  try {
309
309
  require_logger.logger_default.debug("[EvaluatorTracing] Tracing configuration detected, starting OTLP receiver");
310
- const { startOTLPReceiver } = await Promise.resolve().then(() => require("./otlpReceiver-th2zHwjZ.cjs"));
310
+ const { startOTLPReceiver } = await Promise.resolve().then(() => require("./otlpReceiver-B6Xo4KZM.cjs"));
311
311
  const port = testSuite.tracing.otlp.http.port || 4318;
312
312
  const host = testSuite.tracing.otlp.http.host || "127.0.0.1";
313
313
  require_logger.logger_default.debug(`[EvaluatorTracing] Starting OTLP receiver on ${host}:${port}`);
@@ -330,7 +330,7 @@ async function startOtlpReceiverIfNeeded(testSuite) {
330
330
  async function stopOtlpReceiverIfNeeded() {
331
331
  if (otlpReceiverStarted) try {
332
332
  require_logger.logger_default.debug("[EvaluatorTracing] Stopping OTLP receiver");
333
- const { stopOTLPReceiver } = await Promise.resolve().then(() => require("./otlpReceiver-th2zHwjZ.cjs"));
333
+ const { stopOTLPReceiver } = await Promise.resolve().then(() => require("./otlpReceiver-B6Xo4KZM.cjs"));
334
334
  await stopOTLPReceiver();
335
335
  otlpReceiverStarted = false;
336
336
  require_logger.logger_default.info("[EvaluatorTracing] OTLP receiver stopped successfully");
@@ -365,7 +365,7 @@ async function generateTraceContextIfNeeded(test, evaluateOptions, testIdx, prom
365
365
  }
366
366
  if (!tracingEnabled) return null;
367
367
  require_logger.logger_default.debug("[EvaluatorTracing] Importing trace store");
368
- const { getTraceStore } = await Promise.resolve().then(() => require("./store-awdDxuiD.cjs"));
368
+ const { getTraceStore } = await Promise.resolve().then(() => require("./store-m5KT6Ly7.cjs"));
369
369
  const traceStore = getTraceStore();
370
370
  const traceId = generateTraceId();
371
371
  const spanId = generateSpanId();
@@ -2886,9 +2886,9 @@ async function runAssertion({ prompt, provider, assertion, test, vars, latencyMs
2886
2886
  let filePath = fileRef;
2887
2887
  let functionName;
2888
2888
  if (fileRef.includes(":")) {
2889
- const [pathPart, funcPart] = fileRef.split(":");
2890
- filePath = pathPart;
2891
- functionName = funcPart;
2889
+ const colonIndex = fileRef.indexOf(":");
2890
+ filePath = fileRef.slice(0, colonIndex);
2891
+ functionName = fileRef.slice(colonIndex + 1);
2892
2892
  }
2893
2893
  filePath = path.default.resolve(basePath, filePath);
2894
2894
  if (require_fileExtensions.isJavascriptFile(filePath)) {
@@ -3914,7 +3914,7 @@ async function runEval({ provider, prompt, test, testSuite, delay, nunjucksFilte
3914
3914
  promptIdx,
3915
3915
  testIdx
3916
3916
  });
3917
- require_logger.logger_default.error("Provider call failed during eval", logContext);
3917
+ if (!(err instanceof Error && err.name === "AbortError")) require_logger.logger_default.error("Provider call failed during eval", logContext);
3918
3918
  return [{
3919
3919
  ...setup,
3920
3920
  error: errorWithStack,
@@ -4095,11 +4095,17 @@ var Evaluator = class {
4095
4095
  let globalTimeout;
4096
4096
  let globalAbortController;
4097
4097
  const processedIndices = /* @__PURE__ */ new Set();
4098
+ let targetUnavailable = false;
4099
+ let targetErrorStatus;
4100
+ const targetErrorAbortController = new AbortController();
4098
4101
  let ciProgressReporter = null;
4099
4102
  let progressBarManager = null;
4103
+ let providerAbortSignal = options.abortSignal;
4104
+ let combinedAbortSignal = options.abortSignal ? AbortSignal.any([options.abortSignal, targetErrorAbortController.signal]) : targetErrorAbortController.signal;
4100
4105
  if (maxEvalTimeMs > 0) {
4101
4106
  globalAbortController = new AbortController();
4102
- options.abortSignal = options.abortSignal ? AbortSignal.any([options.abortSignal, globalAbortController.signal]) : globalAbortController.signal;
4107
+ providerAbortSignal = providerAbortSignal ? AbortSignal.any([providerAbortSignal, globalAbortController.signal]) : globalAbortController.signal;
4108
+ combinedAbortSignal = AbortSignal.any([combinedAbortSignal, globalAbortController.signal]);
4103
4109
  globalTimeout = setTimeout(() => {
4104
4110
  evalTimedOut = true;
4105
4111
  globalAbortController?.abort();
@@ -4107,7 +4113,7 @@ var Evaluator = class {
4107
4113
  }
4108
4114
  const vars = /* @__PURE__ */ new Set();
4109
4115
  const checkAbort = () => {
4110
- if (options.abortSignal?.aborted) throw new Error("Operation cancelled");
4116
+ if (combinedAbortSignal.aborted) throw new Error("Operation cancelled");
4111
4117
  };
4112
4118
  if (!options.silent) require_logger.logger_default.info(`Starting evaluation ${this.evalRecord.id}`);
4113
4119
  checkAbort();
@@ -4268,7 +4274,7 @@ var Evaluator = class {
4268
4274
  const defaultProvider = testSuite.defaultTest.provider;
4269
4275
  if (require_types.isApiProvider(defaultProvider)) testCase.provider = defaultProvider;
4270
4276
  else if (typeof defaultProvider === "object" && defaultProvider.id) {
4271
- const { loadApiProvider } = await Promise.resolve().then(() => require("./providers-wpMPsMZ7.cjs"));
4277
+ const { loadApiProvider } = await Promise.resolve().then(() => require("./providers-BMZZmPBJ.cjs"));
4272
4278
  testCase.provider = await loadApiProvider(typeof defaultProvider.id === "function" ? defaultProvider.id() : defaultProvider.id, { options: defaultProvider });
4273
4279
  } else testCase.provider = defaultProvider;
4274
4280
  }
@@ -4338,7 +4344,7 @@ var Evaluator = class {
4338
4344
  registers: this.registers,
4339
4345
  isRedteam: testSuite.redteam != null,
4340
4346
  concurrency,
4341
- abortSignal: options.abortSignal,
4347
+ abortSignal: providerAbortSignal,
4342
4348
  evalId: this.evalRecord.id,
4343
4349
  rateLimitRegistry: this.rateLimitRegistry
4344
4350
  });
@@ -4352,7 +4358,7 @@ var Evaluator = class {
4352
4358
  if (evalOption.test.assert?.some((a) => a.type === "max-score")) rowsWithMaxScoreAssertion.add(evalOption.testIdx);
4353
4359
  }
4354
4360
  if (require_logger.cliState_default.resume && this.evalRecord.persisted) try {
4355
- const { default: EvalResult } = await Promise.resolve().then(() => require("./evalResult-DzRxYLDH.cjs"));
4361
+ const { default: EvalResult } = await Promise.resolve().then(() => require("./evalResult-CxTP-LMm.cjs"));
4356
4362
  const completedPairs = await EvalResult.getCompletedIndexPairs(this.evalRecord.id, { excludeErrors: require_logger.cliState_default.retryMode });
4357
4363
  const originalCount = runEvalOptions.length;
4358
4364
  for (let i = runEvalOptions.length - 1; i >= 0; i--) {
@@ -4405,6 +4411,14 @@ var Evaluator = class {
4405
4411
  require_logger.logger_default.error(`Error saving result: ${error} ${require_logger.safeJsonStringify(resultSummary)}`);
4406
4412
  }
4407
4413
  for (const writer of this.fileWriters) await writer.write(row);
4414
+ const httpStatus = row.response?.metadata?.http?.status;
4415
+ if (typeof httpStatus === "number" && require_cache.isNonTransientHttpStatus(httpStatus)) {
4416
+ targetUnavailable = true;
4417
+ targetErrorStatus = httpStatus;
4418
+ require_logger.logger_default.error(`Target returned HTTP ${httpStatus}. Aborting scan - this error will not resolve on retry.`);
4419
+ targetErrorAbortController.abort();
4420
+ break;
4421
+ }
4408
4422
  const { promptIdx } = row;
4409
4423
  const metrics = prompts[promptIdx].metrics;
4410
4424
  require_invariant.invariant(metrics, "Expected prompt.metrics to be set");
@@ -4568,6 +4582,7 @@ var Evaluator = class {
4568
4582
  if (this.options.showProgressBar && progressBarManager) await progressBarManager.initialize(runEvalOptions, concurrency, 0);
4569
4583
  try {
4570
4584
  if (serialRunEvalOptions.length > 0) for (const evalStep of serialRunEvalOptions) {
4585
+ checkAbort();
4571
4586
  if (isWebUI) {
4572
4587
  const provider = evalStep.provider.label || evalStep.provider.id();
4573
4588
  const vars = formatVarsForDisplay(evalStep.test.vars || {}, 50);
@@ -4585,22 +4600,32 @@ var Evaluator = class {
4585
4600
  await this.evalRecord.addPrompts(prompts);
4586
4601
  });
4587
4602
  } catch (err) {
4588
- if (options.abortSignal?.aborted) if (evalTimedOut) require_logger.logger_default.warn(`Evaluation stopped after reaching max duration (${maxEvalTimeMs}ms)`);
4589
- else {
4590
- require_logger.logger_default.info("Evaluation interrupted, saving progress...");
4591
- if (globalTimeout) clearTimeout(globalTimeout);
4592
- if (progressBarManager) progressBarManager.stop();
4593
- if (ciProgressReporter) ciProgressReporter.finish();
4594
- this.evalRecord.setVars(Array.from(vars));
4595
- await this.evalRecord.addPrompts(prompts);
4596
- updateSignalFile(this.evalRecord.id);
4597
- return this.evalRecord;
4598
- }
4599
- else {
4603
+ if (combinedAbortSignal.aborted) {
4604
+ if (evalTimedOut) require_logger.logger_default.warn(`Evaluation stopped after reaching max duration (${maxEvalTimeMs}ms)`);
4605
+ else if (!targetUnavailable) {
4606
+ require_logger.logger_default.info("Evaluation interrupted, saving progress...");
4607
+ if (globalTimeout) clearTimeout(globalTimeout);
4608
+ if (progressBarManager) progressBarManager.stop();
4609
+ if (ciProgressReporter) ciProgressReporter.finish();
4610
+ this.evalRecord.setVars(Array.from(vars));
4611
+ await this.evalRecord.addPrompts(prompts);
4612
+ updateSignalFile(this.evalRecord.id);
4613
+ return this.evalRecord;
4614
+ }
4615
+ } else {
4600
4616
  if (ciProgressReporter) ciProgressReporter.error(`Evaluation failed: ${String(err)}`);
4601
4617
  throw err;
4602
4618
  }
4603
4619
  }
4620
+ if (targetUnavailable) {
4621
+ if (globalTimeout) clearTimeout(globalTimeout);
4622
+ if (progressBarManager) progressBarManager.stop();
4623
+ if (ciProgressReporter) ciProgressReporter.error(`Target unavailable (HTTP ${targetErrorStatus})`);
4624
+ this.evalRecord.setVars(Array.from(vars));
4625
+ await this.evalRecord.addPrompts(prompts);
4626
+ updateSignalFile(this.evalRecord.id);
4627
+ return this.evalRecord;
4628
+ }
4604
4629
  const compareRowsCount = rowsWithSelectBestAssertion.size + rowsWithMaxScoreAssertion.size;
4605
4630
  if (progressBarManager) {
4606
4631
  if (compareRowsCount > 0) progressBarManager.updateTotalCount(compareRowsCount);
@@ -5373,7 +5398,12 @@ function convertResultsToTable(eval_) {
5373
5398
  model: result.response.video.model,
5374
5399
  aspectRatio: result.response.video.aspectRatio,
5375
5400
  resolution: result.response.video.resolution
5376
- } : void 0
5401
+ } : void 0,
5402
+ images: result.response?.images?.map((img) => ({
5403
+ data: img.data,
5404
+ blobRef: img.blobRef,
5405
+ mimeType: img.mimeType
5406
+ }))
5377
5407
  };
5378
5408
  require_invariant.invariant(result.promptId, "Prompt ID is required");
5379
5409
  row.testIdx = result.testIdx;
@@ -5439,7 +5469,12 @@ function convertEvalResultToTableCell(result) {
5439
5469
  model: result.response.video.model,
5440
5470
  aspectRatio: result.response.video.aspectRatio,
5441
5471
  resolution: result.response.video.resolution
5442
- } : void 0
5472
+ } : void 0,
5473
+ images: result.response?.images?.map((img) => ({
5474
+ data: img.data,
5475
+ blobRef: img.blobRef,
5476
+ mimeType: img.mimeType
5477
+ }))
5443
5478
  };
5444
5479
  }
5445
5480
  function convertTestResultsToTableRow(results, varsForHeader) {
@@ -5997,6 +6032,27 @@ var Eval = class Eval {
5997
6032
  async getTotalResultRowCount() {
5998
6033
  return getTotalResultRowCount(this.id);
5999
6034
  }
6035
+ /**
6036
+ * Find a non-transient HTTP error status from evaluation results.
6037
+ * Returns the first non-transient status (401, 403, 404, 500, 501) found, or undefined.
6038
+ *
6039
+ * For persisted evals: Uses efficient O(1) database query with LIMIT 1.
6040
+ * For non-persisted evals: Falls back to scanning in-memory results.
6041
+ */
6042
+ async findTargetErrorStatus() {
6043
+ const scanInMemory = () => {
6044
+ for (const result of this.results) {
6045
+ const status = result.response?.metadata?.http?.status;
6046
+ if (typeof status === "number" && require_cache.isNonTransientHttpStatus(status)) return status;
6047
+ }
6048
+ };
6049
+ if (!this.persisted) return scanInMemory();
6050
+ try {
6051
+ return require_tables.getDb().select({ httpStatus: drizzle_orm.sql`CAST(json_extract(${require_tables.evalResultsTable.response}, '$.metadata.http.status') AS INTEGER)` }).from(require_tables.evalResultsTable).where((0, drizzle_orm.and)((0, drizzle_orm.eq)(require_tables.evalResultsTable.evalId, this.id), drizzle_orm.sql`json_extract(${require_tables.evalResultsTable.response}, '$.metadata.http.status') IN (${drizzle_orm.sql.join(require_cache.NON_TRANSIENT_HTTP_STATUSES.map((s) => drizzle_orm.sql`${s}`), drizzle_orm.sql`, `)})`)).limit(1).get()?.httpStatus ?? void 0;
6052
+ } catch {
6053
+ return scanInMemory();
6054
+ }
6055
+ }
6000
6056
  async fetchResultsByTestIdx(testIdx) {
6001
6057
  return await require_evalResult.EvalResult.findManyByEvalId(this.id, { testIdx });
6002
6058
  }
@@ -9677,6 +9733,7 @@ async function synthesize({ abortSignal, delay, entities: entitiesOverride, inje
9677
9733
  seen.add(key);
9678
9734
  return true;
9679
9735
  });
9736
+ const needsGoalExtraction = strategies.some((s) => require_providers.Strategies.find((def) => def.id === s.id)?.requiresGoalExtraction);
9680
9737
  await require_providers.validateStrategies(strategies);
9681
9738
  await validateSharpDependency(strategies, plugins);
9682
9739
  const redteamProvider = await require_providers.redteamProviderManager.getProvider({ provider });
@@ -9868,13 +9925,15 @@ async function synthesize({ abortSignal, delay, entities: entitiesOverride, inje
9868
9925
  if (!Array.isArray(allPluginTests) || allPluginTests.length === 0) require_logger.logger_default.warn(`Failed to generate tests for ${plugin.id}`);
9869
9926
  else {
9870
9927
  const testCasesWithMetadata = allPluginTests;
9871
- require_logger.logger_default.debug(`Extracting goal for ${testCasesWithMetadata.length} tests from ${plugin.id}...`);
9872
- for (const testCase of testCasesWithMetadata) {
9873
- const promptVar = testCase.vars?.[injectVar];
9874
- const prompt = Array.isArray(promptVar) ? promptVar[0] : String(promptVar);
9875
- const policy = getPolicyText(testCase.metadata);
9876
- const extractedGoal = await require_providers.extractGoalFromPrompt(prompt, purpose, plugin.id, policy);
9877
- testCase.metadata.goal = extractedGoal;
9928
+ if (needsGoalExtraction) {
9929
+ require_logger.logger_default.debug(`Extracting goal for ${testCasesWithMetadata.length} tests from ${plugin.id}...`);
9930
+ for (const testCase of testCasesWithMetadata) {
9931
+ const promptVar = testCase.vars?.[injectVar];
9932
+ const prompt = Array.isArray(promptVar) ? promptVar[0] : String(promptVar);
9933
+ const policy = getPolicyText(testCase.metadata);
9934
+ const extractedGoal = await require_providers.extractGoalFromPrompt(prompt, purpose, plugin.id, policy);
9935
+ testCase.metadata.goal = extractedGoal;
9936
+ }
9878
9937
  }
9879
9938
  testCases.push(...testCasesWithMetadata);
9880
9939
  }
@@ -9909,13 +9968,15 @@ async function synthesize({ abortSignal, delay, entities: entitiesOverride, inje
9909
9968
  ...t.metadata || {}
9910
9969
  }
9911
9970
  }));
9912
- require_logger.logger_default.debug(`Extracting goal for ${testCasesWithMetadata.length} custom tests from ${plugin.id}...`);
9913
- for (const testCase of testCasesWithMetadata) {
9914
- const promptVar = testCase.vars?.[injectVar];
9915
- const prompt = Array.isArray(promptVar) ? promptVar[0] : String(promptVar);
9916
- const policy = getPolicyText(testCase.metadata);
9917
- const extractedGoal = await require_providers.extractGoalFromPrompt(prompt, purpose, plugin.id, policy);
9918
- testCase.metadata.goal = extractedGoal;
9971
+ if (needsGoalExtraction) {
9972
+ require_logger.logger_default.debug(`Extracting goal for ${testCasesWithMetadata.length} custom tests from ${plugin.id}...`);
9973
+ for (const testCase of testCasesWithMetadata) {
9974
+ const promptVar = testCase.vars?.[injectVar];
9975
+ const prompt = Array.isArray(promptVar) ? promptVar[0] : String(promptVar);
9976
+ const policy = getPolicyText(testCase.metadata);
9977
+ const extractedGoal = await require_providers.extractGoalFromPrompt(prompt, purpose, plugin.id, policy);
9978
+ testCase.metadata.goal = extractedGoal;
9979
+ }
9919
9980
  }
9920
9981
  testCases.push(...testCasesWithMetadata);
9921
9982
  require_logger.logger_default.debug(`Added ${customTests.length} custom test cases from ${plugin.id}`);
@@ -11044,11 +11105,31 @@ function formatDuration(seconds) {
11044
11105
  * ```
11045
11106
  */
11046
11107
  function generateEvalSummary(params) {
11047
- const { evalId, isRedteam, writeToDatabase, shareableUrl, wantsToShare, hasExplicitDisable, cloudEnabled, activelySharing = false, tokenUsage, successes, failures, errors, duration, maxConcurrency, tracker } = params;
11108
+ const { evalId, isRedteam, writeToDatabase, shareableUrl, wantsToShare, hasExplicitDisable, cloudEnabled, activelySharing = false, tokenUsage, successes, failures, errors, duration, maxConcurrency, tracker, targetErrorStatus } = params;
11048
11109
  const lines = [];
11049
11110
  const completionType = isRedteam ? "Red team" : "Eval";
11050
- const completionMessage = writeToDatabase && shareableUrl ? `${chalk.default.green("✓")} ${completionType} complete: ${shareableUrl}` : writeToDatabase && activelySharing ? `${chalk.default.green("✓")} ${completionType} complete` : writeToDatabase ? `${chalk.default.green("✓")} ${completionType} complete (ID: ${chalk.default.cyan(evalId)})` : `${chalk.default.green("✓")} ${completionType} complete`;
11111
+ const wasAborted = targetErrorStatus != null;
11112
+ let completionMessage;
11113
+ if (wasAborted) {
11114
+ completionMessage = `${chalk.default.red("✗")} ${completionType} aborted`;
11115
+ if (writeToDatabase) completionMessage += ` (ID: ${chalk.default.cyan(evalId)})`;
11116
+ } else if (writeToDatabase && shareableUrl) completionMessage = `${chalk.default.green("✓")} ${completionType} complete: ${shareableUrl}`;
11117
+ else if (writeToDatabase && activelySharing) completionMessage = `${chalk.default.green("✓")} ${completionType} complete`;
11118
+ else if (writeToDatabase) completionMessage = `${chalk.default.green("✓")} ${completionType} complete (ID: ${chalk.default.cyan(evalId)})`;
11119
+ else completionMessage = `${chalk.default.green("✓")} ${completionType} complete`;
11051
11120
  lines.push(completionMessage);
11121
+ if (wasAborted && targetErrorStatus != null) {
11122
+ lines.push("");
11123
+ lines.push(chalk.default.red.bold("Scan stopped: Target is unavailable and will not recover on retry."));
11124
+ lines.push(chalk.default.red(` Target returned HTTP ${targetErrorStatus}`));
11125
+ lines.push("");
11126
+ lines.push(chalk.default.yellow("Possible causes:"));
11127
+ lines.push(chalk.default.yellow(" • Invalid API key or authentication (401/403)"));
11128
+ lines.push(chalk.default.yellow(" • Target endpoint does not exist (404)"));
11129
+ lines.push(chalk.default.yellow(" • Server does not support the request (501)"));
11130
+ lines.push("");
11131
+ lines.push(chalk.default.cyan("To fix: Check your target configuration and credentials."));
11132
+ }
11052
11133
  if (writeToDatabase && !shareableUrl && !wantsToShare && !activelySharing) {
11053
11134
  lines.push("");
11054
11135
  lines.push(`» View results: ${chalk.default.green.bold("promptfoo view")}`);
@@ -11609,6 +11690,7 @@ async function doEval(cmdObj, defaultConfig, defaultConfigPath, evaluateOptions)
11609
11690
  const isRedteam = Boolean(config.redteam);
11610
11691
  const duration = Math.round((Date.now() - startTime) / 1e3);
11611
11692
  const tracker = require_providers.TokenUsageTracker.getInstance();
11693
+ const targetErrorStatus = await evalRecord.findTargetErrorStatus();
11612
11694
  const summaryLines = generateEvalSummary({
11613
11695
  evalId: evalRecord.id,
11614
11696
  isRedteam,
@@ -11624,7 +11706,8 @@ async function doEval(cmdObj, defaultConfig, defaultConfigPath, evaluateOptions)
11624
11706
  errors,
11625
11707
  duration,
11626
11708
  maxConcurrency,
11627
- tracker
11709
+ tracker,
11710
+ targetErrorStatus
11628
11711
  });
11629
11712
  if (cmdObj.write && wantsToShare && !canShareEval) {
11630
11713
  require_logger.logger_default.info(summaryLines[0]);
@@ -11679,7 +11762,7 @@ async function doEval(cmdObj, defaultConfig, defaultConfigPath, evaluateOptions)
11679
11762
  if (initialization) {
11680
11763
  const configPaths = (cmdObj.config || [defaultConfigPath]).filter(Boolean);
11681
11764
  if (!configPaths.length) {
11682
- require_logger.logger_default.error("Could not locate config file(s) to watch");
11765
+ require_logger.logger_default.error(`Could not locate config file(s) to watch. Pass --config path/to/promptfooconfig.yaml or run from a directory containing promptfooconfig.{${DEFAULT_CONFIG_EXTENSIONS.join(",")}}.`);
11683
11766
  process.exitCode = 1;
11684
11767
  return ret;
11685
11768
  }
@@ -11891,7 +11974,7 @@ async function doRedteamRun(options) {
11891
11974
  const evalMs = evalResult.evaluationDurationMs ?? 0;
11892
11975
  require_logger.logger_default.info(chalk.default.gray(`Total scan time: ${formatDuration(totalMs / 1e3)} (generation: ${formatDuration(generationDurationMs / 1e3)}, evaluation: ${formatDuration(evalMs / 1e3)})`));
11893
11976
  }
11894
- require_logger.logger_default.info(chalk.default.green("\nRed team scan complete!"));
11977
+ if (evalResult ? await evalResult.findTargetErrorStatus() != null : false) {} else require_logger.logger_default.info(chalk.default.green("\nRed team scan complete!"));
11895
11978
  if (!evalResult?.shared) if (options.liveRedteamConfig) require_logger.logger_default.info(chalk.default.blue(`To view the results, click the ${chalk.default.bold("View Report")} button or run ${chalk.default.bold(promptfooCommand("redteam report"))} on the command line.`));
11896
11979
  else require_logger.logger_default.info(chalk.default.blue(`To view the results, run ${chalk.default.bold(promptfooCommand("redteam report"))}`));
11897
11980
  require_logger.setLogCallback(null);