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
@@ -1,27 +1,28 @@
1
1
  #!/usr/bin/env node
2
2
  import { C as getEnvString, E as isCI, O as cliState_default, S as getEnvInt, T as getMaxEvalTimeMs, _ as summarizeEvaluateResultForLogging, b as getEnvBool, f as extractJsonObjects, g as safeJsonStringify, o as logger_default, p as getAjv, w as getEvalTimeoutMs } from "./logger-BotXmWKW.js";
3
- import { F as FILE_METADATA_KEY, P as VERSION, h as isPromptfooSampleTarget, l as sleep, r as fetchWithRetries, v as parseChatPrompt, w as DEFAULT_MAX_CONCURRENCY } from "./fetch-BuP-gm0E.js";
3
+ import { F as FILE_METADATA_KEY, P as VERSION, h as isPromptfooSampleTarget, l as sleep, r as fetchWithRetries, v as parseChatPrompt, w as DEFAULT_MAX_CONCURRENCY } from "./fetch-SRsE6Ctl.js";
4
4
  import { t as invariant } from "./invariant-DT20jrBd.js";
5
- import { r as telemetry_default } from "./telemetry-wXyCQ1Nz.js";
6
- import { d as isGradingResult, p as isApiProvider, s as ResultFailureReason } from "./types-CMDs7Kzu.js";
7
- import { c as promptYesNo } from "./server-HQtz_gUy.js";
8
- import { A as renderPrompt, E as isBasicRefusal, F as TokenUsageTracker, G as VertexChatProvider, I as createRateLimitRegistry, K as AIStudioChatProvider, L as createProviderRateLimitOptions, M as isPackagePath, N as loadFromPackage, P as redteamProviderManager, j as runExtensionHook, k as collectFileMetadata, u as GoogleLiveProvider, v as checkExfilTracking, w as getSessionId } from "./providers-BOvl9qv5.js";
9
- import { o as getCache } from "./cache-Bg1Wpvzq.js";
10
- import { i as isJavascriptFile } from "./fileExtensions-CzcPkiKZ.js";
11
- import { E as parseFileUrl, F as isAnthropicProvider, I as isGoogleProvider, L as isOpenAiProvider, R as isProviderAllowed, T as loadFunction, g as maybeLoadToolsFromExternalFile, w as getNunjucksEngine } from "./util-BECSJ0T_.js";
12
- import { r as runPython } from "./pythonUtils-CUPlf1H0.js";
13
- import { n as transform, r as getProcessShim, t as TransformInputType } from "./transform-B86_0IIb.js";
14
- import { $ as matchesSearchRubric, B as getAndCheckProvider, G as matchesContextFaithfulness, H as matchesAnswerRelevance, J as matchesFactuality, K as matchesContextRecall, Q as matchesPiScore, R as callProviderWithContext, U as matchesClassification, V as loadRubricPrompt, W as matchesClosedQa, X as matchesLlmRubric, Y as matchesGEval, Z as matchesModeration, at as DefaultSuggestionsProvider, dt as getFinalTest, et as matchesSelectBest, ft as loadFromJavaScriptFile, it as getDefaultProviders, lt as SUGGEST_PROMPTS_SYSTEM_MESSAGE, mt as resolveContext, n as getGraderById, nt as selectMaxScore, pt as processFileReference, q as matchesContextRelevance, tt as matchesSimilarity, ut as coerceString, z as fail } from "./graders-DMAzEgEF.js";
15
- import { i as generateIdFromPrompt } from "./utils-ICP7kLcY.js";
16
- import { t as extractAndStoreBinaryData } from "./extractor-BFoThUOa.js";
17
- import { t as OpenAiChatCompletionProvider } from "./chat-D_cro0wd.js";
18
- import { a as createEmptyTokenUsage, i as createEmptyAssertions, n as accumulateResponseTokenUsage, o as normalizeTokenUsage, r as accumulateTokenUsage, t as accumulateAssertionTokenUsage } from "./tokenUsageUtils-D2ko2eFQ.js";
19
- import { p as validateFunctionCall } from "./transform-gpzlPrwG.js";
20
- import { l as validateFunctionCall$1 } from "./util-CttPoePn.js";
21
- import { n as getTraceStore } from "./store-rueRdzcm.js";
22
- import { t as providerRegistry } from "./providerRegistry-DAZoFmGv.js";
23
- import { n as runRuby } from "./rubyUtils-DYKoa7Ze.js";
24
- import { a as getActualPromptWithFallback, r as updateSignalFile } from "./signal-D4VhSJOY.js";
5
+ import { r as telemetry_default } from "./telemetry-BXyVqyAg.js";
6
+ import { d as isGradingResult, p as isApiProvider, s as ResultFailureReason } from "./types-t52w-XsS.js";
7
+ import { c as promptYesNo } from "./server-DWmZLfCy.js";
8
+ import { A as renderPrompt, E as isBasicRefusal, F as TokenUsageTracker, G as VertexChatProvider, I as createRateLimitRegistry, K as AIStudioChatProvider, L as createProviderRateLimitOptions, M as isPackagePath, N as loadFromPackage, P as redteamProviderManager, j as runExtensionHook, k as collectFileMetadata, u as GoogleLiveProvider, v as checkExfilTracking, w as getSessionId } from "./providers-BlEhY5mi.js";
9
+ import { o as getCache } from "./cache-mIszOnuz.js";
10
+ import { n as isNonTransientHttpStatus } from "./errors-DnGCbnx8.js";
11
+ import { i as isJavascriptFile } from "./fileExtensions-BpuMmaFL.js";
12
+ import { E as parseFileUrl, F as isAnthropicProvider, I as isGoogleProvider, L as isOpenAiProvider, R as isProviderAllowed, T as loadFunction, g as maybeLoadToolsFromExternalFile, w as getNunjucksEngine } from "./util-BSh4a_Q8.js";
13
+ import { r as runPython } from "./pythonUtils-r1uBuA0n.js";
14
+ import { n as transform, r as getProcessShim, t as TransformInputType } from "./transform-CqTFr7KR.js";
15
+ import { $ as matchesSearchRubric, B as getAndCheckProvider, G as matchesContextFaithfulness, H as matchesAnswerRelevance, J as matchesFactuality, K as matchesContextRecall, Q as matchesPiScore, R as callProviderWithContext, U as matchesClassification, V as loadRubricPrompt, W as matchesClosedQa, X as matchesLlmRubric, Y as matchesGEval, Z as matchesModeration, at as DefaultSuggestionsProvider, dt as getFinalTest, et as matchesSelectBest, ft as loadFromJavaScriptFile, it as getDefaultProviders, lt as SUGGEST_PROMPTS_SYSTEM_MESSAGE, mt as resolveContext, n as getGraderById, nt as selectMaxScore, pt as processFileReference, q as matchesContextRelevance, tt as matchesSimilarity, ut as coerceString, z as fail } from "./graders-BaMCwIKp.js";
16
+ import { i as generateIdFromPrompt } from "./utils-JaY9veb5.js";
17
+ import { t as extractAndStoreBinaryData } from "./extractor-LSYjrhK0.js";
18
+ import { t as OpenAiChatCompletionProvider } from "./chat-DIywASPG.js";
19
+ import { a as createEmptyTokenUsage, i as createEmptyAssertions, n as accumulateResponseTokenUsage, o as normalizeTokenUsage, r as accumulateTokenUsage, t as accumulateAssertionTokenUsage } from "./tokenUsageUtils-DmZSD2eU.js";
20
+ import { m as validateFunctionCall } from "./transform-CoP2bJ7P.js";
21
+ import { l as validateFunctionCall$1 } from "./util-CUEt0Vum.js";
22
+ import { n as getTraceStore } from "./store-D4gdn9ih.js";
23
+ import { t as providerRegistry } from "./providerRegistry-Xf0qdqGQ.js";
24
+ import { n as runRuby } from "./rubyUtils-BtjlqyXt.js";
25
+ import { a as getActualPromptWithFallback, r as updateSignalFile } from "./signal-Bl32q42d.js";
25
26
  import chalk from "chalk";
26
27
  import fs, { createWriteStream } from "fs";
27
28
  import path from "path";
@@ -259,7 +260,7 @@ async function startOtlpReceiverIfNeeded(testSuite) {
259
260
  telemetry_default.record("feature_used", { feature: "tracing" });
260
261
  try {
261
262
  logger_default.debug("[EvaluatorTracing] Tracing configuration detected, starting OTLP receiver");
262
- const { startOTLPReceiver } = await import("./otlpReceiver-C-1cdVDr.js");
263
+ const { startOTLPReceiver } = await import("./otlpReceiver-Dg817agV.js");
263
264
  const port = testSuite.tracing.otlp.http.port || 4318;
264
265
  const host = testSuite.tracing.otlp.http.host || "127.0.0.1";
265
266
  logger_default.debug(`[EvaluatorTracing] Starting OTLP receiver on ${host}:${port}`);
@@ -282,7 +283,7 @@ async function startOtlpReceiverIfNeeded(testSuite) {
282
283
  async function stopOtlpReceiverIfNeeded() {
283
284
  if (otlpReceiverStarted) try {
284
285
  logger_default.debug("[EvaluatorTracing] Stopping OTLP receiver");
285
- const { stopOTLPReceiver } = await import("./otlpReceiver-C-1cdVDr.js");
286
+ const { stopOTLPReceiver } = await import("./otlpReceiver-Dg817agV.js");
286
287
  await stopOTLPReceiver();
287
288
  otlpReceiverStarted = false;
288
289
  logger_default.info("[EvaluatorTracing] OTLP receiver stopped successfully");
@@ -317,7 +318,7 @@ async function generateTraceContextIfNeeded(test, evaluateOptions, testIdx, prom
317
318
  }
318
319
  if (!tracingEnabled) return null;
319
320
  logger_default.debug("[EvaluatorTracing] Importing trace store");
320
- const { getTraceStore } = await import("./store-CuDU_jDN.js");
321
+ const { getTraceStore } = await import("./store-5u2yriTV.js");
321
322
  const traceStore = getTraceStore();
322
323
  const traceId = generateTraceId();
323
324
  const spanId = generateSpanId();
@@ -2685,7 +2686,7 @@ const ASSERTION_HANDLERS = {
2685
2686
  "llm-rubric": handleLlmRubric,
2686
2687
  meteor: async (params) => {
2687
2688
  try {
2688
- const { handleMeteorAssertion } = await import("./meteor-DLCdreag.js");
2689
+ const { handleMeteorAssertion } = await import("./meteor-P2rUE-Uz.js");
2689
2690
  return handleMeteorAssertion(params);
2690
2691
  } catch (error) {
2691
2692
  if (error instanceof Error && (error.message.includes("Cannot find module") || error.message.includes("natural\" package is required"))) return {
@@ -2795,9 +2796,9 @@ async function runAssertion({ prompt, provider, assertion, test, vars, latencyMs
2795
2796
  let filePath = fileRef;
2796
2797
  let functionName;
2797
2798
  if (fileRef.includes(":")) {
2798
- const [pathPart, funcPart] = fileRef.split(":");
2799
- filePath = pathPart;
2800
- functionName = funcPart;
2799
+ const colonIndex = fileRef.indexOf(":");
2800
+ filePath = fileRef.slice(0, colonIndex);
2801
+ functionName = fileRef.slice(colonIndex + 1);
2801
2802
  }
2802
2803
  filePath = path.resolve(basePath, filePath);
2803
2804
  if (isJavascriptFile(filePath)) {
@@ -2815,7 +2816,7 @@ async function runAssertion({ prompt, provider, assertion, test, vars, latencyMs
2815
2816
  };
2816
2817
  }
2817
2818
  else if (filePath.endsWith(".rb")) try {
2818
- const { runRuby } = await import("./rubyUtils-BA4D4gMX.js");
2819
+ const { runRuby } = await import("./rubyUtils-D7--T12C.js");
2819
2820
  valueFromScript = await runRuby(filePath, functionName || "get_assert", [output, context]);
2820
2821
  logger_default.debug(`Ruby script ${filePath} output: ${valueFromScript}`);
2821
2822
  } catch (error) {
@@ -3805,7 +3806,7 @@ async function runEval({ provider, prompt, test, testSuite, delay, nunjucksFilte
3805
3806
  promptIdx,
3806
3807
  testIdx
3807
3808
  });
3808
- logger_default.error("Provider call failed during eval", logContext);
3809
+ if (!(err instanceof Error && err.name === "AbortError")) logger_default.error("Provider call failed during eval", logContext);
3809
3810
  return [{
3810
3811
  ...setup,
3811
3812
  error: errorWithStack,
@@ -3986,11 +3987,17 @@ var Evaluator = class {
3986
3987
  let globalTimeout;
3987
3988
  let globalAbortController;
3988
3989
  const processedIndices = /* @__PURE__ */ new Set();
3990
+ let targetUnavailable = false;
3991
+ let targetErrorStatus;
3992
+ const targetErrorAbortController = new AbortController();
3989
3993
  let ciProgressReporter = null;
3990
3994
  let progressBarManager = null;
3995
+ let providerAbortSignal = options.abortSignal;
3996
+ let combinedAbortSignal = options.abortSignal ? AbortSignal.any([options.abortSignal, targetErrorAbortController.signal]) : targetErrorAbortController.signal;
3991
3997
  if (maxEvalTimeMs > 0) {
3992
3998
  globalAbortController = new AbortController();
3993
- options.abortSignal = options.abortSignal ? AbortSignal.any([options.abortSignal, globalAbortController.signal]) : globalAbortController.signal;
3999
+ providerAbortSignal = providerAbortSignal ? AbortSignal.any([providerAbortSignal, globalAbortController.signal]) : globalAbortController.signal;
4000
+ combinedAbortSignal = AbortSignal.any([combinedAbortSignal, globalAbortController.signal]);
3994
4001
  globalTimeout = setTimeout(() => {
3995
4002
  evalTimedOut = true;
3996
4003
  globalAbortController?.abort();
@@ -3998,7 +4005,7 @@ var Evaluator = class {
3998
4005
  }
3999
4006
  const vars = /* @__PURE__ */ new Set();
4000
4007
  const checkAbort = () => {
4001
- if (options.abortSignal?.aborted) throw new Error("Operation cancelled");
4008
+ if (combinedAbortSignal.aborted) throw new Error("Operation cancelled");
4002
4009
  };
4003
4010
  if (!options.silent) logger_default.info(`Starting evaluation ${this.evalRecord.id}`);
4004
4011
  checkAbort();
@@ -4159,7 +4166,7 @@ var Evaluator = class {
4159
4166
  const defaultProvider = testSuite.defaultTest.provider;
4160
4167
  if (isApiProvider(defaultProvider)) testCase.provider = defaultProvider;
4161
4168
  else if (typeof defaultProvider === "object" && defaultProvider.id) {
4162
- const { loadApiProvider } = await import("./providers-DVsoSup2.js");
4169
+ const { loadApiProvider } = await import("./providers-Ck8HyrC-.js");
4163
4170
  testCase.provider = await loadApiProvider(typeof defaultProvider.id === "function" ? defaultProvider.id() : defaultProvider.id, { options: defaultProvider });
4164
4171
  } else testCase.provider = defaultProvider;
4165
4172
  }
@@ -4229,7 +4236,7 @@ var Evaluator = class {
4229
4236
  registers: this.registers,
4230
4237
  isRedteam: testSuite.redteam != null,
4231
4238
  concurrency,
4232
- abortSignal: options.abortSignal,
4239
+ abortSignal: providerAbortSignal,
4233
4240
  evalId: this.evalRecord.id,
4234
4241
  rateLimitRegistry: this.rateLimitRegistry
4235
4242
  });
@@ -4243,7 +4250,7 @@ var Evaluator = class {
4243
4250
  if (evalOption.test.assert?.some((a) => a.type === "max-score")) rowsWithMaxScoreAssertion.add(evalOption.testIdx);
4244
4251
  }
4245
4252
  if (cliState_default.resume && this.evalRecord.persisted) try {
4246
- const { default: EvalResult } = await import("./evalResult-Boel8xoS.js");
4253
+ const { default: EvalResult } = await import("./evalResult-CzLURDcP.js");
4247
4254
  const completedPairs = await EvalResult.getCompletedIndexPairs(this.evalRecord.id, { excludeErrors: cliState_default.retryMode });
4248
4255
  const originalCount = runEvalOptions.length;
4249
4256
  for (let i = runEvalOptions.length - 1; i >= 0; i--) {
@@ -4296,6 +4303,14 @@ var Evaluator = class {
4296
4303
  logger_default.error(`Error saving result: ${error} ${safeJsonStringify(resultSummary)}`);
4297
4304
  }
4298
4305
  for (const writer of this.fileWriters) await writer.write(row);
4306
+ const httpStatus = row.response?.metadata?.http?.status;
4307
+ if (typeof httpStatus === "number" && isNonTransientHttpStatus(httpStatus)) {
4308
+ targetUnavailable = true;
4309
+ targetErrorStatus = httpStatus;
4310
+ logger_default.error(`Target returned HTTP ${httpStatus}. Aborting scan - this error will not resolve on retry.`);
4311
+ targetErrorAbortController.abort();
4312
+ break;
4313
+ }
4299
4314
  const { promptIdx } = row;
4300
4315
  const metrics = prompts[promptIdx].metrics;
4301
4316
  invariant(metrics, "Expected prompt.metrics to be set");
@@ -4459,6 +4474,7 @@ var Evaluator = class {
4459
4474
  if (this.options.showProgressBar && progressBarManager) await progressBarManager.initialize(runEvalOptions, concurrency, 0);
4460
4475
  try {
4461
4476
  if (serialRunEvalOptions.length > 0) for (const evalStep of serialRunEvalOptions) {
4477
+ checkAbort();
4462
4478
  if (isWebUI) {
4463
4479
  const provider = evalStep.provider.label || evalStep.provider.id();
4464
4480
  const vars = formatVarsForDisplay(evalStep.test.vars || {}, 50);
@@ -4476,22 +4492,32 @@ var Evaluator = class {
4476
4492
  await this.evalRecord.addPrompts(prompts);
4477
4493
  });
4478
4494
  } catch (err) {
4479
- if (options.abortSignal?.aborted) if (evalTimedOut) logger_default.warn(`Evaluation stopped after reaching max duration (${maxEvalTimeMs}ms)`);
4480
- else {
4481
- logger_default.info("Evaluation interrupted, saving progress...");
4482
- if (globalTimeout) clearTimeout(globalTimeout);
4483
- if (progressBarManager) progressBarManager.stop();
4484
- if (ciProgressReporter) ciProgressReporter.finish();
4485
- this.evalRecord.setVars(Array.from(vars));
4486
- await this.evalRecord.addPrompts(prompts);
4487
- updateSignalFile(this.evalRecord.id);
4488
- return this.evalRecord;
4489
- }
4490
- else {
4495
+ if (combinedAbortSignal.aborted) {
4496
+ if (evalTimedOut) logger_default.warn(`Evaluation stopped after reaching max duration (${maxEvalTimeMs}ms)`);
4497
+ else if (!targetUnavailable) {
4498
+ logger_default.info("Evaluation interrupted, saving progress...");
4499
+ if (globalTimeout) clearTimeout(globalTimeout);
4500
+ if (progressBarManager) progressBarManager.stop();
4501
+ if (ciProgressReporter) ciProgressReporter.finish();
4502
+ this.evalRecord.setVars(Array.from(vars));
4503
+ await this.evalRecord.addPrompts(prompts);
4504
+ updateSignalFile(this.evalRecord.id);
4505
+ return this.evalRecord;
4506
+ }
4507
+ } else {
4491
4508
  if (ciProgressReporter) ciProgressReporter.error(`Evaluation failed: ${String(err)}`);
4492
4509
  throw err;
4493
4510
  }
4494
4511
  }
4512
+ if (targetUnavailable) {
4513
+ if (globalTimeout) clearTimeout(globalTimeout);
4514
+ if (progressBarManager) progressBarManager.stop();
4515
+ if (ciProgressReporter) ciProgressReporter.error(`Target unavailable (HTTP ${targetErrorStatus})`);
4516
+ this.evalRecord.setVars(Array.from(vars));
4517
+ await this.evalRecord.addPrompts(prompts);
4518
+ updateSignalFile(this.evalRecord.id);
4519
+ return this.evalRecord;
4520
+ }
4495
4521
  const compareRowsCount = rowsWithSelectBestAssertion.size + rowsWithMaxScoreAssertion.size;
4496
4522
  if (progressBarManager) {
4497
4523
  if (compareRowsCount > 0) progressBarManager.updateTotalCount(compareRowsCount);
@@ -4788,4 +4814,4 @@ function evaluate(testSuite, evalRecord, options) {
4788
4814
 
4789
4815
  //#endregion
4790
4816
  export { runEval as a, readAssertions as c, isAllowedPrompt as i, renderMetricName as l, formatVarsForDisplay as n, doesPromptRefMatch as o, generateVarCombinations as r, assertions_default as s, evaluate as t, runAssertions as u };
4791
- //# sourceMappingURL=evaluator-1Tkdu8MK.js.map
4817
+ //# sourceMappingURL=evaluator-3EJCMTs0.js.map
@@ -1,7 +1,7 @@
1
1
  const require_logger = require('./logger-BdZ-IqBc.cjs');
2
- const require_fetch = require('./fetch-Dy2YML9G.cjs');
3
- const require_accounts = require('./accounts-CwqY22lU.cjs');
4
- const require_blobs = require('./blobs-_kNRY6vU.cjs');
2
+ const require_fetch = require('./fetch-ZMn_oemb.cjs');
3
+ const require_accounts = require('./accounts-BzEY8H3v.cjs');
4
+ const require_blobs = require('./blobs-673H0jCl.cjs');
5
5
  let crypto = require("crypto");
6
6
 
7
7
  //#region src/util/createHash.ts
@@ -39,7 +39,7 @@ async function uploadBlobRemote(buffer, mimeType, context) {
39
39
  const apiKey = require_fetch.cloudConfig.getApiKey();
40
40
  if (!url || !apiKey) return null;
41
41
  try {
42
- const { fetchWithProxy } = await Promise.resolve().then(() => require("./fetch-DwhKew9e.cjs"));
42
+ const { fetchWithProxy } = await Promise.resolve().then(() => require("./fetch-CMptBDVg.cjs"));
43
43
  const response = await fetchWithProxy(url, {
44
44
  method: "POST",
45
45
  headers: {
@@ -254,6 +254,23 @@ async function extractAndStoreBinaryData(response, context) {
254
254
  });
255
255
  }
256
256
  }
257
+ if (response.images?.length) next.images = await Promise.all(response.images.map(async (img, idx) => {
258
+ if (!img.data || typeof img.data !== "string" || !isDataUrl(img.data)) return img;
259
+ const stored = await maybeStore(img.data, img.mimeType || "image/png", blobContext, `response.images[${idx}].data`, "image");
260
+ if (stored) {
261
+ mutated = true;
262
+ require_logger.logger_default.debug("[BlobExtractor] Stored image blob", {
263
+ ...context,
264
+ hash: stored.hash
265
+ });
266
+ return {
267
+ ...img,
268
+ data: void 0,
269
+ blobRef: stored
270
+ };
271
+ }
272
+ return img;
273
+ }));
257
274
  const turns = response.turns;
258
275
  if (Array.isArray(turns)) next.turns = await Promise.all(turns.map(async (turn, idx) => {
259
276
  if (turn?.audio?.data && typeof turn.audio.data === "string") {
@@ -398,4 +415,4 @@ Object.defineProperty(exports, 'shouldAttemptRemoteBlobUpload', {
398
415
  return shouldAttemptRemoteBlobUpload;
399
416
  }
400
417
  });
401
- //# sourceMappingURL=extractor-BPBlLyOn.cjs.map
418
+ //# sourceMappingURL=extractor-DbhlYEeo.cjs.map
@@ -1,7 +1,7 @@
1
1
  import { _ as getEnvBool, i as logger_default } from "./logger-w8Ozp0Td.js";
2
- import { c as cloudConfig } from "./fetch-zJuFPxN1.js";
3
- import { o as isLoggedIntoCloud } from "./accounts-BSwMxhY3.js";
4
- import { a as BLOB_MIN_SIZE, i as BLOB_MAX_SIZE, n as recordBlobReference, r as storeBlob } from "./blobs-Dnt2rxpc.js";
2
+ import { c as cloudConfig } from "./fetch-18MuNu9i.js";
3
+ import { o as isLoggedIntoCloud } from "./accounts-R3gfCR_g.js";
4
+ import { a as BLOB_MIN_SIZE, i as BLOB_MAX_SIZE, n as recordBlobReference, r as storeBlob } from "./blobs-C9J2mVgo.js";
5
5
  import { createHash } from "crypto";
6
6
 
7
7
  //#region src/util/createHash.ts
@@ -39,7 +39,7 @@ async function uploadBlobRemote(buffer, mimeType, context) {
39
39
  const apiKey = cloudConfig.getApiKey();
40
40
  if (!url || !apiKey) return null;
41
41
  try {
42
- const { fetchWithProxy } = await import("./fetch-BdiCecAv.js");
42
+ const { fetchWithProxy } = await import("./fetch-Bi0o-fdp.js");
43
43
  const response = await fetchWithProxy(url, {
44
44
  method: "POST",
45
45
  headers: {
@@ -254,6 +254,23 @@ async function extractAndStoreBinaryData(response, context) {
254
254
  });
255
255
  }
256
256
  }
257
+ if (response.images?.length) next.images = await Promise.all(response.images.map(async (img, idx) => {
258
+ if (!img.data || typeof img.data !== "string" || !isDataUrl(img.data)) return img;
259
+ const stored = await maybeStore(img.data, img.mimeType || "image/png", blobContext, `response.images[${idx}].data`, "image");
260
+ if (stored) {
261
+ mutated = true;
262
+ logger_default.debug("[BlobExtractor] Stored image blob", {
263
+ ...context,
264
+ hash: stored.hash
265
+ });
266
+ return {
267
+ ...img,
268
+ data: void 0,
269
+ blobRef: stored
270
+ };
271
+ }
272
+ return img;
273
+ }));
257
274
  const turns = response.turns;
258
275
  if (Array.isArray(turns)) next.turns = await Promise.all(turns.map(async (turn, idx) => {
259
276
  if (turn?.audio?.data && typeof turn.audio.data === "string") {
@@ -369,4 +386,4 @@ async function recordExistingBlobReferences(value, context, location) {
369
386
 
370
387
  //#endregion
371
388
  export { sha256 as a, randomSequence as i, isBlobStorageEnabled as n, shouldAttemptRemoteBlobUpload as r, extractAndStoreBinaryData as t };
372
- //# sourceMappingURL=extractor-CuUWqwrE.js.map
389
+ //# sourceMappingURL=extractor-Hs7la_19.js.map
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import { b as getEnvBool, o as logger_default } from "./logger-BotXmWKW.js";
3
- import { c as isLoggedIntoCloud } from "./accounts-Bzx8GnL6.js";
4
- import { i as cloudConfig } from "./cloud-lRosK6Nk.js";
5
- import { a as BLOB_MAX_SIZE, i as storeBlob, o as BLOB_MIN_SIZE, r as recordBlobReference } from "./blobs-DlB5fwyF.js";
3
+ import { c as isLoggedIntoCloud } from "./accounts-DHHiXsy6.js";
4
+ import { i as cloudConfig } from "./cloud-BMbRVJFw.js";
5
+ import { a as BLOB_MAX_SIZE, i as storeBlob, o as BLOB_MIN_SIZE, r as recordBlobReference } from "./blobs-kt8v3UyH.js";
6
6
  import { createHash } from "crypto";
7
7
 
8
8
  //#region src/util/createHash.ts
@@ -40,7 +40,7 @@ async function uploadBlobRemote(buffer, mimeType, context) {
40
40
  const apiKey = cloudConfig.getApiKey();
41
41
  if (!url || !apiKey) return null;
42
42
  try {
43
- const { fetchWithProxy } = await import("./fetch-BQgz6x7S.js");
43
+ const { fetchWithProxy } = await import("./fetch-DAZkv3gV.js");
44
44
  const response = await fetchWithProxy(url, {
45
45
  method: "POST",
46
46
  headers: {
@@ -255,6 +255,23 @@ async function extractAndStoreBinaryData(response, context) {
255
255
  });
256
256
  }
257
257
  }
258
+ if (response.images?.length) next.images = await Promise.all(response.images.map(async (img, idx) => {
259
+ if (!img.data || typeof img.data !== "string" || !isDataUrl(img.data)) return img;
260
+ const stored = await maybeStore(img.data, img.mimeType || "image/png", blobContext, `response.images[${idx}].data`, "image");
261
+ if (stored) {
262
+ mutated = true;
263
+ logger_default.debug("[BlobExtractor] Stored image blob", {
264
+ ...context,
265
+ hash: stored.hash
266
+ });
267
+ return {
268
+ ...img,
269
+ data: void 0,
270
+ blobRef: stored
271
+ };
272
+ }
273
+ return img;
274
+ }));
258
275
  const turns = response.turns;
259
276
  if (Array.isArray(turns)) next.turns = await Promise.all(turns.map(async (turn, idx) => {
260
277
  if (turn?.audio?.data && typeof turn.audio.data === "string") {
@@ -370,4 +387,4 @@ async function recordExistingBlobReferences(value, context, location) {
370
387
 
371
388
  //#endregion
372
389
  export { sha256 as a, randomSequence as i, isBlobStorageEnabled as n, shouldAttemptRemoteBlobUpload as r, extractAndStoreBinaryData as t };
373
- //# sourceMappingURL=extractor-BFoThUOa.js.map
390
+ //# sourceMappingURL=extractor-LSYjrhK0.js.map
@@ -24,7 +24,7 @@ const HUMAN_ASSERTION_TYPE = "human";
24
24
  * Application version from package.json.
25
25
  * Injected at build time, or read from npm environment in development.
26
26
  */
27
- const VERSION = "0.120.25";
27
+ const VERSION = "0.120.26";
28
28
  /**
29
29
  * PostHog analytics key.
30
30
  * Only populated during production builds via PROMPTFOO_POSTHOG_KEY env var.
@@ -415,7 +415,7 @@ var CloudConfig = class {
415
415
  }
416
416
  async validateAndSetApiToken(token, apiHost) {
417
417
  try {
418
- const { fetchWithProxy } = await import("./fetch-BdiCecAv.js");
418
+ const { fetchWithProxy } = await import("./fetch-Bi0o-fdp.js");
419
419
  const response = await fetchWithProxy(`${apiHost}/api/v1/users/me`, { headers: { Authorization: `Bearer ${token}` } });
420
420
  if (!response.ok) {
421
421
  const errorMessage = await response.text();
@@ -644,7 +644,7 @@ async function fetchWithProxy(url, options = {}, abortSignal) {
644
644
  logger_default.warn(`Failed to read CA certificate from ${caCertPath}: ${e}`);
645
645
  }
646
646
  const proxyUrl = finalUrlString ? getProxyForUrl(finalUrlString) : "";
647
- if (proxyUrl) {
647
+ if (!finalOptions.dispatcher) if (proxyUrl) {
648
648
  logger_default.debug(`Using proxy: ${sanitizeUrl(proxyUrl)}`);
649
649
  finalOptions.dispatcher = getOrCreateProxyAgent(proxyUrl, tlsOptions);
650
650
  } else finalOptions.dispatcher = getOrCreateAgent(tlsOptions);
@@ -760,4 +760,4 @@ async function fetchWithRetries(url, options = {}, timeout, maxRetries) {
760
760
 
761
761
  //#endregion
762
762
  export { EVENTS_ENDPOINT as A, toTitleCase as C, CONSENT_ENDPOINT as D, CLOUD_PROVIDER_PREFIX as E, getShareViewBaseUrl as F, POSTHOG_KEY as I, VERSION as L, TERMINAL_MAX_WIDTH as M, getDefaultShareViewBaseUrl as N, DEFAULT_MAX_CONCURRENCY as O, getShareApiBaseUrl as P, FILE_METADATA_KEY as R, parseChatPrompt as S, transformTools as T, isOpenAIToolArray as _, isRateLimited as a, openaiToolChoiceToBedrock as b, cloudConfig as c, writeGlobalConfigPartial as d, getCurrentTimestamp as f, calculateCost as g, REQUEST_TIMEOUT_MS as h, handleRateLimit as i, R_ENDPOINT as j, DEFAULT_QUERY_LIMIT as k, readGlobalConfig as l, LONG_RUNNING_MODEL_TIMEOUT_MS as m, fetchWithRetries as n, isTransientError as o, sleep as p, fetchWithTimeout as r, CloudConfig as s, fetchWithProxy as t, writeGlobalConfig as u, isOpenAIToolChoice as v, transformToolChoice as w, openaiToolsToBedrock as x, isPromptfooSampleTarget as y, HUMAN_ASSERTION_TYPE as z };
763
- //# sourceMappingURL=fetch-zJuFPxN1.js.map
763
+ //# sourceMappingURL=fetch-18MuNu9i.js.map
@@ -1,4 +1,4 @@
1
1
  import "./logger-w8Ozp0Td.js";
2
- import { a as isRateLimited, i as handleRateLimit, n as fetchWithRetries, o as isTransientError, r as fetchWithTimeout, t as fetchWithProxy } from "./fetch-zJuFPxN1.js";
2
+ import { a as isRateLimited, i as handleRateLimit, n as fetchWithRetries, o as isTransientError, r as fetchWithTimeout, t as fetchWithProxy } from "./fetch-18MuNu9i.js";
3
3
 
4
4
  export { fetchWithProxy };
@@ -0,0 +1,4 @@
1
+ require('./logger-BdZ-IqBc.cjs');
2
+ const require_fetch = require('./fetch-ZMn_oemb.cjs');
3
+
4
+ exports.fetchWithProxy = require_fetch.fetchWithProxy;
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import "./logger-BotXmWKW.js";
3
- import { a as handleRateLimit, i as fetchWithTimeout, n as fetchWithProxy, o as isRateLimited, r as fetchWithRetries, s as isTransientError, t as clearAgentCache } from "./fetch-BuP-gm0E.js";
4
- import "./cloud-lRosK6Nk.js";
3
+ import { a as handleRateLimit, i as fetchWithTimeout, n as fetchWithProxy, o as isRateLimited, r as fetchWithRetries, s as isTransientError, t as clearAgentCache } from "./fetch-SRsE6Ctl.js";
4
+ import "./cloud-BMbRVJFw.js";
5
5
 
6
6
  export { fetchWithProxy };
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { C as getEnvString, O as cliState_default, S as getEnvInt, a as logRequestResponse, b as getEnvBool, o as logger_default, u as sanitizeUrl } from "./logger-BotXmWKW.js";
3
3
  import { t as invariant } from "./invariant-DT20jrBd.js";
4
- import { i as cloudConfig, n as CLOUD_API_HOST } from "./cloud-lRosK6Nk.js";
4
+ import { i as cloudConfig, n as CLOUD_API_HOST } from "./cloud-BMbRVJFw.js";
5
5
  import { Agent, ProxyAgent } from "undici";
6
6
  import path from "path";
7
7
  import yaml from "js-yaml";
@@ -24,7 +24,7 @@ const HUMAN_ASSERTION_TYPE = "human";
24
24
  * Application version from package.json.
25
25
  * Injected at build time, or read from npm environment in development.
26
26
  */
27
- const VERSION = "0.120.25";
27
+ const VERSION = "0.120.26";
28
28
  /**
29
29
  * PostHog analytics key.
30
30
  * Only populated during production builds via PROMPTFOO_POSTHOG_KEY env var.
@@ -473,7 +473,7 @@ async function fetchWithProxy(url, options = {}, abortSignal) {
473
473
  logger_default.warn(`Failed to read CA certificate from ${caCertPath}: ${e}`);
474
474
  }
475
475
  const proxyUrl = finalUrlString ? getProxyForUrl(finalUrlString) : "";
476
- if (proxyUrl) {
476
+ if (!finalOptions.dispatcher) if (proxyUrl) {
477
477
  logger_default.debug(`Using proxy: ${sanitizeUrl(proxyUrl)}`);
478
478
  finalOptions.dispatcher = getOrCreateProxyAgent(proxyUrl, tlsOptions);
479
479
  } else finalOptions.dispatcher = getOrCreateAgent(tlsOptions);
@@ -589,4 +589,4 @@ async function fetchWithRetries(url, options = {}, timeout, maxRetries) {
589
589
 
590
590
  //#endregion
591
591
  export { getDefaultShareViewBaseUrl as A, CONSENT_ENDPOINT as C, R_ENDPOINT as D, EVENTS_ENDPOINT as E, FILE_METADATA_KEY as F, HUMAN_ASSERTION_TYPE as I, getShareViewBaseUrl as M, POSTHOG_KEY as N, TERMINAL_MAX_WIDTH as O, VERSION as P, CLOUD_PROVIDER_PREFIX as S, DEFAULT_QUERY_LIMIT as T, openaiToolsToBedrock as _, handleRateLimit as a, transformToolChoice as b, getCurrentTimestamp as c, REQUEST_TIMEOUT_MS as d, calculateCost as f, openaiToolChoiceToBedrock as g, isPromptfooSampleTarget as h, fetchWithTimeout as i, getShareApiBaseUrl as j, getDefaultPort as k, sleep as l, isOpenAIToolChoice as m, fetchWithProxy as n, isRateLimited as o, isOpenAIToolArray as p, fetchWithRetries as r, isTransientError as s, clearAgentCache as t, LONG_RUNNING_MODEL_TIMEOUT_MS as u, parseChatPrompt as v, DEFAULT_MAX_CONCURRENCY as w, transformTools as x, toTitleCase as y };
592
- //# sourceMappingURL=fetch-BuP-gm0E.js.map
592
+ //# sourceMappingURL=fetch-SRsE6Ctl.js.map
@@ -27,7 +27,7 @@ const HUMAN_ASSERTION_TYPE = "human";
27
27
  * Application version from package.json.
28
28
  * Injected at build time, or read from npm environment in development.
29
29
  */
30
- const VERSION = "0.120.25";
30
+ const VERSION = "0.120.26";
31
31
  /**
32
32
  * PostHog analytics key.
33
33
  * Only populated during production builds via PROMPTFOO_POSTHOG_KEY env var.
@@ -418,7 +418,7 @@ var CloudConfig = class {
418
418
  }
419
419
  async validateAndSetApiToken(token, apiHost) {
420
420
  try {
421
- const { fetchWithProxy } = await Promise.resolve().then(() => require("./fetch-DwhKew9e.cjs"));
421
+ const { fetchWithProxy } = await Promise.resolve().then(() => require("./fetch-CMptBDVg.cjs"));
422
422
  const response = await fetchWithProxy(`${apiHost}/api/v1/users/me`, { headers: { Authorization: `Bearer ${token}` } });
423
423
  if (!response.ok) {
424
424
  const errorMessage = await response.text();
@@ -647,7 +647,7 @@ async function fetchWithProxy(url, options = {}, abortSignal) {
647
647
  require_logger.logger_default.warn(`Failed to read CA certificate from ${caCertPath}: ${e}`);
648
648
  }
649
649
  const proxyUrl = finalUrlString ? (0, proxy_from_env.getProxyForUrl)(finalUrlString) : "";
650
- if (proxyUrl) {
650
+ if (!finalOptions.dispatcher) if (proxyUrl) {
651
651
  require_logger.logger_default.debug(`Using proxy: ${require_logger.sanitizeUrl(proxyUrl)}`);
652
652
  finalOptions.dispatcher = getOrCreateProxyAgent(proxyUrl, tlsOptions);
653
653
  } else finalOptions.dispatcher = getOrCreateAgent(tlsOptions);
@@ -996,4 +996,4 @@ Object.defineProperty(exports, 'writeGlobalConfigPartial', {
996
996
  return writeGlobalConfigPartial;
997
997
  }
998
998
  });
999
- //# sourceMappingURL=fetch-Dy2YML9G.cjs.map
999
+ //# sourceMappingURL=fetch-ZMn_oemb.cjs.map
@@ -83,4 +83,4 @@ function isAudioFile(filePath) {
83
83
 
84
84
  //#endregion
85
85
  export { isVideoFile as a, isJavascriptFile as i, isAudioFile as n, isImageFile as r, JAVASCRIPT_EXTENSIONS as t };
86
- //# sourceMappingURL=fileExtensions-CzcPkiKZ.js.map
86
+ //# sourceMappingURL=fileExtensions-BpuMmaFL.js.map
@@ -20,4 +20,4 @@ function formatDuration(seconds) {
20
20
 
21
21
  //#endregion
22
22
  export { formatDuration as t };
23
- //# sourceMappingURL=formatDuration-CGa0ZDQ8.js.map
23
+ //# sourceMappingURL=formatDuration-Doo0xq-z.js.map
@@ -255,4 +255,4 @@ function getTraceparent() {
255
255
 
256
256
  //#endregion
257
257
  export { withGenAISpan as n, getTraceparent as t };
258
- //# sourceMappingURL=genaiTracer-foKtbVa2.js.map
258
+ //# sourceMappingURL=genaiTracer-CqNnnXrE.js.map
@@ -0,0 +1,34 @@
1
+ import "./chunk-FhC4c-0y.js";
2
+ import "./logger-w8Ozp0Td.js";
3
+ import "./esm-rDtG_2rg.js";
4
+ import "./pythonUtils-vMlk9Qp5.js";
5
+ import "./transform-D8dILpfZ.js";
6
+ import { n as getGraderById, t as GRADERS } from "./graders-QsALpIdy.js";
7
+ import "./types-DMVjYLpx.js";
8
+ import "./util-DiCePfDu.js";
9
+ import "./fetch-18MuNu9i.js";
10
+ import "./cache-BLLayYEN.js";
11
+ import "./providers-BiNq_Iyc.js";
12
+ import "./utils-CVzb4YiI.js";
13
+ import "./extractor-Hs7la_19.js";
14
+ import "./genaiTracer-Ce19n68P.js";
15
+ import "./chat-C8Ei4f87.js";
16
+ import "./transform-DMaxQwDx.js";
17
+ import "./messages-CDZYGNlS.js";
18
+ import "./util-mJ58qbbw.js";
19
+ import "./responses-DLLjADw5.js";
20
+ import "./openai-Dz3surb_.js";
21
+ import "./util-Cl0zfT3V.js";
22
+ import "./completion-D9_MDlnd.js";
23
+ import "./accounts-R3gfCR_g.js";
24
+ import "./server-CbMTRQkg.js";
25
+ import "./blobs-C9J2mVgo.js";
26
+ import "./tables-D-NSwNIb.js";
27
+ import "./telemetry-DZ_7PaVq.js";
28
+ import "./store-2ocbYY9D.js";
29
+ import "./base-Dtp8b4_N.js";
30
+ import "./image-BiEVdpdP.js";
31
+ import "./providerRegistry-wCWd7sKQ.js";
32
+ import "./rubyUtils-Cs35SDYa.js";
33
+
34
+ export { getGraderById };