promptfoo 0.121.2 → 0.121.4

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 (379) hide show
  1. package/README.md +2 -0
  2. package/dist/src/{ListApp-Du7YVwj5.js → ListApp-DQkFNqE9.js} +1 -1
  3. package/dist/src/{accounts-B0pgC1oV.js → accounts-DdJ2pHMI.js} +5 -5
  4. package/dist/src/{accounts-CiBLOnA7.js → accounts-DhMYUUbu.js} +5 -5
  5. package/dist/src/{accounts-gtkH-5KX.cjs → accounts-Dy17bs4D.cjs} +5 -5
  6. package/dist/src/{accounts-Bm2D8Db9.js → accounts-F9d_5sMC.js} +6 -6
  7. package/dist/src/{cometapi-C4xSqeID.cjs → agentic-utils-BpX5b23w.cjs} +24 -62
  8. package/dist/src/{cometapi-CUQq3H_a.js → agentic-utils-P172hM8B.js} +4 -61
  9. package/dist/src/agentic-utils-qFlm6zes.js +153 -0
  10. package/dist/src/{agentic-utils-DS1g3GLF.js → agentic-utils-w68v6_Dz.js} +3 -3
  11. package/dist/src/{agents-CmvBq8LV.js → agents-8FDnTriG.js} +6 -7
  12. package/dist/src/{agents-DbRtpYxR.cjs → agents-BahDpe5G.cjs} +255 -20
  13. package/dist/src/{agents-DgF2zDag.js → agents-C-R_jfzI.js} +255 -20
  14. package/dist/src/{agents-9qiOy0ho.js → agents-CgaMXvLM.js} +5 -7
  15. package/dist/src/{agents-Di9DKPzn.cjs → agents-D7-HGxUj.cjs} +5 -7
  16. package/dist/src/{agents-CBr9A01V.js → agents-DJ35I3Nt.js} +255 -20
  17. package/dist/src/{agents-cLXA8a_8.js → agents-aYPQLf8W.js} +5 -9
  18. package/dist/src/{agents-D__IdAlg.js → agents-pQeBEXMm.js} +255 -21
  19. package/dist/src/{aimlapi-B4rcnZgv.js → aimlapi-BCq3MHeL.js} +8 -14
  20. package/dist/src/{aimlapi-DHJU_kcV.js → aimlapi-BD6J9oKt.js} +7 -14
  21. package/dist/src/{aimlapi-BvlNH0gr.cjs → aimlapi-qcK4OT55.cjs} +8 -15
  22. package/dist/src/{aimlapi-CnkC2HqE.js → aimlapi-sgYnkE54.js} +7 -16
  23. package/dist/src/app/app/tsconfig.app.tsbuildinfo +1 -0
  24. package/dist/src/app/assets/Report-CQYFezYu.js +1 -0
  25. package/dist/src/app/assets/index-BXGkeMwh.css +1 -0
  26. package/dist/src/app/assets/index-BzJt18Jz.js +385 -0
  27. package/dist/src/app/assets/rolldown-runtime-COnpUsM8.js +1 -0
  28. package/dist/src/app/assets/scroll-timeline-D9IT_e8Z.js +1 -0
  29. package/dist/src/app/assets/sync-IjzpWrOE.js +4 -0
  30. package/dist/src/app/assets/vendor-charts-BNdH8TCw.js +36 -0
  31. package/dist/src/app/assets/vendor-markdown-Ch00wnNI.js +29 -0
  32. package/dist/src/app/assets/vendor-react-CVvmk1UB.js +9 -0
  33. package/dist/src/app/assets/vendor-utils-BnEYbx2Q.js +37 -0
  34. package/dist/src/app/index.html +7 -7
  35. package/dist/src/{audio-Dz3z7s3J.js → audio-B7izf48x.js} +4 -5
  36. package/dist/src/{audio-CGMyULza.cjs → audio-BQtNuYBj.cjs} +4 -4
  37. package/dist/src/{audio-Bkv46et0.js → audio-COrn8rM6.js} +4 -4
  38. package/dist/src/{audio-ClI_AFre.js → audio-DcVKoInv.js} +4 -4
  39. package/dist/src/{base-CGrhspbK.cjs → base-D-670DX8.cjs} +3 -3
  40. package/dist/src/{base-CpjcHe4e.js → base-PYJvBE1i.js} +3 -3
  41. package/dist/src/{base-Dy1V8--Z.js → base-fZ9wgg50.js} +3 -3
  42. package/dist/src/{base-DLKtKMFh.js → base-yrI1Yal4.js} +3 -3
  43. package/dist/src/{blobs-BDbfYdrJ.js → blobs-BCZavS8s.js} +4 -4
  44. package/dist/src/{blobs-CMHN0Qcz.js → blobs-BQWqnnvL.js} +4 -4
  45. package/dist/src/{blobs-CBO20krR.js → blobs-C-F78Kfn.js} +3 -3
  46. package/dist/src/{blobs-D23XLin-.cjs → blobs-D2FAd1Q5.cjs} +3 -3
  47. package/dist/src/cache-BIyPcp5v.cjs +376 -0
  48. package/dist/src/cache-C4Xb-hNb.js +310 -0
  49. package/dist/src/cache-Cr9oLMUa.js +3 -0
  50. package/dist/src/cache-D5NZmMiT.js +310 -0
  51. package/dist/src/cache-DbLsVWB2.cjs +3 -0
  52. package/dist/src/cache-mb7c8hbp.js +280 -0
  53. package/dist/src/{chat-C2jrdPMx.js → chat-0bwXjVP0.js} +3 -13
  54. package/dist/src/{chat-C1Qst7jL.cjs → chat-BPXSW8Bv.cjs} +3 -13
  55. package/dist/src/{chat-DJIw17u0.js → chat-BfPaS15_.js} +68 -42
  56. package/dist/src/{chat-CgF-J-Jj.cjs → chat-CclRbxGf.cjs} +68 -42
  57. package/dist/src/{chat-BiKyneZl.js → chat-Dr3DUQ0D.js} +68 -42
  58. package/dist/src/{chat-DqxYYtWA.js → chat-I9izLm49.js} +67 -41
  59. package/dist/src/{chat-CzkrVDfz.js → chat-MKxMnZJZ.js} +3 -13
  60. package/dist/src/{chat-qmatte1u.js → chat-mW0ORo8G.js} +3 -14
  61. package/dist/src/{chatkit-DKyPi1Gs.cjs → chatkit-BoWoSgXl.cjs} +4 -4
  62. package/dist/src/{chatkit-65VXf5SR.js → chatkit-CJnHRRMM.js} +4 -4
  63. package/dist/src/{chatkit-Be-Q-a9F.js → chatkit-Cv6AhukM.js} +4 -4
  64. package/dist/src/{chatkit-BxFvW8KY.js → chatkit-zUIVoDos.js} +4 -4
  65. package/dist/src/{claude-agent-sdk-Apiy0iaz.js → claude-agent-sdk-BQNuLaAK.js} +41 -18
  66. package/dist/src/{claude-agent-sdk-D9Z5Pr9X.cjs → claude-agent-sdk-CPJo3dBQ.cjs} +45 -22
  67. package/dist/src/{claude-agent-sdk-D2bJee9S.js → claude-agent-sdk-Dtq_L-Sc.js} +40 -17
  68. package/dist/src/{claude-agent-sdk-DfCoW0E6.js → claude-agent-sdk-nfAIcxNf.js} +42 -20
  69. package/dist/src/{cloud-C0dlstV_.js → cloud-DQZ5sVjW.js} +25 -13
  70. package/dist/src/cloud-Hphvo8kr.js +3 -0
  71. package/dist/src/{cloudflare-ai-8TDxHR0x.js → cloudflare-ai-BIB567w6.js} +5 -14
  72. package/dist/src/{cloudflare-ai-g7PB6VHR.js → cloudflare-ai-DGLte7Py.js} +5 -14
  73. package/dist/src/{cloudflare-ai-CknbZ5LJ.cjs → cloudflare-ai-Dl3N9OVD.cjs} +6 -15
  74. package/dist/src/{cloudflare-ai-BxAGvfju.js → cloudflare-ai-DlKr0rY7.js} +5 -15
  75. package/dist/src/{cloudflare-gateway-B9HWA5wf.js → cloudflare-gateway-BDZrYydE.js} +4 -16
  76. package/dist/src/{cloudflare-gateway-BSnDmHYo.cjs → cloudflare-gateway-BYDp495F.cjs} +4 -15
  77. package/dist/src/{cloudflare-gateway-CKDb4dJ8.js → cloudflare-gateway-CiIZHU0Q.js} +5 -164
  78. package/dist/src/{cloudflare-gateway-CP9QEWYS.js → cloudflare-gateway-DI1HNP5F.js} +4 -15
  79. package/dist/src/codex-sdk-BAmYE7qy.js +3 -0
  80. package/dist/src/codex-sdk-C2_M2pl_.cjs +1172 -0
  81. package/dist/src/codex-sdk-CErXn7qh.js +1165 -0
  82. package/dist/src/codex-sdk-CWEnH70W.cjs +2 -0
  83. package/dist/src/codex-sdk-CpqiOqDO.js +1164 -0
  84. package/dist/src/codex-sdk-Rtky3M4I.js +1165 -0
  85. package/dist/src/{cometapi-BL9yvj_f.js → cometapi-BUlt_ELa.js} +8 -15
  86. package/dist/src/{cometapi-DFNiKmSz.js → cometapi-CtJ-mS8R.js} +8 -16
  87. package/dist/src/cometapi-DT-jlVCB.js +55 -0
  88. package/dist/src/cometapi-UVOryo4W.cjs +55 -0
  89. package/dist/src/{completion-CM6oK8PS.cjs → completion-BozdoXba.cjs} +7 -62
  90. package/dist/src/{completion-5MzrpJxT.js → completion-Dnxn7E-j.js} +8 -57
  91. package/dist/src/{completion-qRoZAYRB.js → completion-HUe8wDhZ.js} +8 -57
  92. package/dist/src/{completion-DZ083F31.js → completion-x0a_c2y1.js} +8 -57
  93. package/dist/src/{createHash-CTQmL3G2.js → createHash-4gFQpDDv.js} +3 -3
  94. package/dist/src/{createHash-CfZSc0b4.cjs → createHash-B7KvgoOD.cjs} +4 -4
  95. package/dist/src/{createHash-Da8fMwqB.js → createHash-ChI45QR1.js} +3 -3
  96. package/dist/src/{createHash-DmPQkvBh.js → createHash-CwDVU5xr.js} +3 -3
  97. package/dist/src/{docker-ExVyLp0S.js → docker-CQmlA2NU.js} +7 -14
  98. package/dist/src/{docker-Bb5dcxr8.js → docker-ClnmCf1Z.js} +6 -14
  99. package/dist/src/{docker-BvfL2BrW.js → docker-DCgsveLD.js} +6 -16
  100. package/dist/src/{docker-DcF2pRrj.cjs → docker-DS4_Osau.cjs} +7 -15
  101. package/dist/src/embedding-D3xTseo7.js +59 -0
  102. package/dist/src/embedding-DD9wa3ae.js +58 -0
  103. package/dist/src/embedding-I45KG3o7.cjs +63 -0
  104. package/dist/src/embedding-nFbumxcv.js +58 -0
  105. package/dist/src/entrypoint.js +69 -6
  106. package/dist/src/{errors-P6ll7XSJ.js → errors-Cw810C93.js} +1 -1
  107. package/dist/src/{esm-CaIwzWR5.js → esm-C7PnfdF8.js} +16 -7
  108. package/dist/src/{esm-CnNt7sI4.cjs → esm-CtEPLdAj.cjs} +15 -6
  109. package/dist/src/{esm-Cd1AjG1D.js → esm-Dh4dOLlt.js} +15 -6
  110. package/dist/src/{esm-C03C-mv3.js → esm-tVgYPY-f.js} +27 -18
  111. package/dist/src/eval-CzJFfFO9.js +3 -0
  112. package/dist/src/{eval-Dg2nG4v2.js → eval-u4UVafl6.js} +49 -20
  113. package/dist/src/{evalResult-BDMqrapS.js → evalResult-Bgm9ZH31.js} +7 -7
  114. package/dist/src/{evalResult-BBRNtX4I.js → evalResult-D3hVYFis.js} +7 -7
  115. package/dist/src/evalResult-D8MT9p0s.js +3 -0
  116. package/dist/src/evalResult-DElBuddX.js +2 -0
  117. package/dist/src/evalResult-Dvc-iucu.cjs +2 -0
  118. package/dist/src/{evalResult-fuaI8HkH.cjs → evalResult-KZqXl4XP.cjs} +7 -7
  119. package/dist/src/evaluator-CVessDWe.js +3 -0
  120. package/dist/src/{evaluator-BhoWwp5b.js → evaluator-IvuDYSvQ.js} +3080 -1254
  121. package/dist/src/{extractor-D25qpmGX.js → extractor-CAfTSraf.js} +6 -6
  122. package/dist/src/{extractor-DReVID0K.js → extractor-DNSeBVOJ.js} +6 -6
  123. package/dist/src/{extractor-C0EVHewb.js → extractor-Dk6bRWkv.js} +6 -6
  124. package/dist/src/{extractor-pYLLi3wS.cjs → extractor-WVPOrH43.cjs} +6 -6
  125. package/dist/src/{fetch-HaqdX7U1.js → fetch-B0Z3Oe4k.js} +218 -55
  126. package/dist/src/{fetch-Dxpd4_sr.js → fetch-BEWnXrrG.js} +195 -45
  127. package/dist/src/fetch-C7bGKDlQ.js +3 -0
  128. package/dist/src/{fetch-BPkYtG8K.cjs → fetch-CJU5ELPa.cjs} +223 -48
  129. package/dist/src/{fetch-Cwxnd8zz.js → fetch-Di00EQrc.js} +218 -55
  130. package/dist/src/{fileExtensions-Ds-foDzt.js → fileExtensions-AWa2ZML4.js} +1 -1
  131. package/dist/src/{fileExtensions-LcDYkU4v.js → fileExtensions-BArZuxsI.js} +1 -1
  132. package/dist/src/{formatDuration-DgBVMN65.js → formatDuration-DZzPsexs.js} +1 -1
  133. package/dist/src/{genaiTracer-D3fD9dNV.js → genaiTracer-COYDi-tC.js} +6 -2
  134. package/dist/src/{genaiTracer-C1rxGO8Q.js → genaiTracer-DWdZ28hY.js} +6 -2
  135. package/dist/src/{genaiTracer-70Z8BIuV.js → genaiTracer-XnrcgDCe.js} +6 -2
  136. package/dist/src/{genaiTracer-DN4dQywX.cjs → genaiTracer-yRuxj9-L.cjs} +7 -3
  137. package/dist/src/golang/wrapper.go +1 -1
  138. package/dist/src/{graders-DU49_J8Y.cjs → graders--zknU_uk.cjs} +5747 -3206
  139. package/dist/src/graders-BOAzQEUe.cjs +2 -0
  140. package/dist/src/graders-D4BTsZdG2.js +3 -0
  141. package/dist/src/graders-DOJK1XpV.js +2 -0
  142. package/dist/src/graders-NAv9LcBn.js +2 -0
  143. package/dist/src/{graders-BTeBGqjJ.js → graders-Zy3x0zqX.js} +5727 -3218
  144. package/dist/src/{graders-Bj_Odv7c.js → graders-eIHhRqoC.js} +5719 -3210
  145. package/dist/src/{graders-DP7KFFo-.js → graders-pvbReLLn.js} +5728 -3219
  146. package/dist/src/{image-B0h9VEMc.js → image-9302QVqR.js} +4 -4
  147. package/dist/src/{image-CHfWvljl.js → image-B5Mv-Z3h.js} +8 -8
  148. package/dist/src/{image-DS-o-0ph.js → image-DVz2RiMF.js} +8 -8
  149. package/dist/src/{image-C1madmKh.cjs → image-De2FBmYV.cjs} +4 -4
  150. package/dist/src/{image-B02ogr_b.js → image-dnoUgPrC.js} +4 -5
  151. package/dist/src/{image-Dpxa1Jt6.js → image-qUpPvmNZ.js} +8 -8
  152. package/dist/src/{image-Bb4vWQLM.js → image-u7-rKnYU.js} +4 -4
  153. package/dist/src/{image-BLmROtN3.cjs → image-x6KqLQl4.cjs} +8 -8
  154. package/dist/src/index.cjs +3728 -1482
  155. package/dist/src/index.d.cts +3232 -79
  156. package/dist/src/index.d.ts +3232 -79
  157. package/dist/src/index.js +3735 -1490
  158. package/dist/src/{interactiveCheck-BgLZUIt3.js → interactiveCheck-CLERUB0c.js} +2 -2
  159. package/dist/src/{knowledgeBase-DOO_BM9b.cjs → knowledgeBase-Bpoe_nLu.cjs} +6 -8
  160. package/dist/src/{knowledgeBase-D33Ty2l6.js → knowledgeBase-Dgc7CBWF.js} +6 -8
  161. package/dist/src/{knowledgeBase-B3OoKIej.js → knowledgeBase-RhFPGWDc.js} +6 -8
  162. package/dist/src/{knowledgeBase-CYTLHOt1.js → knowledgeBase-lm9RXSAm.js} +6 -9
  163. package/dist/src/{litellm-NbjknEh6.js → litellm-C2kqjxqp.js} +6 -14
  164. package/dist/src/{litellm-I_hbp_dc.cjs → litellm-CoyI4IAl.cjs} +6 -15
  165. package/dist/src/{litellm-TrljxD9G.js → litellm-DRjpcSa7.js} +5 -14
  166. package/dist/src/{litellm-AaeZcZQF.js → litellm-p37R1dzQ.js} +5 -16
  167. package/dist/src/{logger-DLcq4dWf.js → logger-B88EkIn6.js} +48 -23
  168. package/dist/src/{logger-Cp1GPUjj.cjs → logger-COuQb2xB.cjs} +77 -22
  169. package/dist/src/{logger-CT3IKMKA.js → logger-Ct2S6Yx-.js} +48 -23
  170. package/dist/src/{logger-KkObSCzq.js → logger-DksKw1Qc.js} +48 -23
  171. package/dist/src/{luma-ray-f6I2fft-.js → luma-ray-B863CmuZ.js} +6 -10
  172. package/dist/src/{luma-ray-DDsjcgZZ.js → luma-ray-BTTLtqQ8.js} +7 -10
  173. package/dist/src/{luma-ray-Due0n7di.cjs → luma-ray-BxVKaW2a.cjs} +6 -10
  174. package/dist/src/{luma-ray-BS2_tY8L.js → luma-ray-KgTCXrZC.js} +6 -12
  175. package/dist/src/main.d.ts +1 -26
  176. package/dist/src/main.js +1011 -548
  177. package/dist/src/{messages-Bs1kC7P4.cjs → messages-811uVVW5.cjs} +74 -19
  178. package/dist/src/{messages-BS17jdMx.js → messages-BTQz42fn.js} +74 -19
  179. package/dist/src/{messages-ZJk778GH.js → messages-MYTQ2TWp.js} +74 -19
  180. package/dist/src/{messages-D0lx5qK7.js → messages-zWbkLLHz.js} +74 -19
  181. package/dist/src/{meteor-D-SotUw9.js → meteor-CU5UAE-H.js} +1 -1
  182. package/dist/src/{meteor-DLZZ3osF.cjs → meteor-Co1VQ1u5.cjs} +1 -1
  183. package/dist/src/{meteor-44VjEACX.js → meteor-DHdzY1Ss.js} +1 -1
  184. package/dist/src/{meteor-DUiCJRC-.js → meteor-DuAFv6gF.js} +1 -1
  185. package/dist/src/{modelslab-Bmni6skY.js → modelslab-D0erNWKe.js} +7 -10
  186. package/dist/src/{modelslab-DRb74SP4.js → modelslab-DIq-6y7x.js} +7 -10
  187. package/dist/src/{modelslab-CoUX6Jc_.cjs → modelslab-Dk1JAtVo.cjs} +7 -10
  188. package/dist/src/{modelslab-Bx9IrZfS.js → modelslab-wu9yi5GE.js} +7 -11
  189. package/dist/src/{nova-reel-BfPq-0Yk.js → nova-reel-CCFRfeRb.js} +7 -10
  190. package/dist/src/{nova-reel-C_QM18Xn.cjs → nova-reel-CrLXVKQf.cjs} +6 -10
  191. package/dist/src/{nova-reel-bgjxilYW.js → nova-reel-DQrm74ng.js} +6 -10
  192. package/dist/src/{nova-reel-D_W1tjMH.js → nova-reel-gr11WG7f.js} +6 -12
  193. package/dist/src/{nova-sonic-DIGQNR07.js → nova-sonic-BYdp-QLs.js} +5 -7
  194. package/dist/src/{nova-sonic-CFb5GYhg.js → nova-sonic-B_ZXcUJB.js} +4 -7
  195. package/dist/src/{nova-sonic-De1HW5fD.js → nova-sonic-TDgrlTk7.js} +4 -9
  196. package/dist/src/{nova-sonic-zfcljeRp.cjs → nova-sonic-i5tUvXKn.cjs} +4 -7
  197. package/dist/src/{openai-DElQ-fPX.js → openai-DhVEmgeZ.js} +6 -3
  198. package/dist/src/{openai-DhbB7eWK.js → openai-Qsvz25mV.js} +6 -3
  199. package/dist/src/{openai-Cuif0GEt.cjs → openai-URNyItar.cjs} +6 -3
  200. package/dist/src/{openai-j-sE2O7r.js → openai-iYtrXzOX.js} +6 -3
  201. package/dist/src/openclaw-CLWrW03k.js +1200 -0
  202. package/dist/src/openclaw-CnQ363Wi.js +1199 -0
  203. package/dist/src/openclaw-CwzlQSQX.js +1199 -0
  204. package/dist/src/openclaw-wX9rtfke.cjs +1205 -0
  205. package/dist/src/{opencode-sdk-B3CWY9h_.js → opencode-sdk-BUu5Nevv.js} +12 -14
  206. package/dist/src/{opencode-sdk-BL764Jdi.cjs → opencode-sdk-BZ2idgYA.cjs} +16 -18
  207. package/dist/src/{opencode-sdk-0j6rTWNb.js → opencode-sdk-BxD8vXp_.js} +12 -15
  208. package/dist/src/{opencode-sdk-C2y6UkP2.js → opencode-sdk-GI2KaAXq.js} +12 -14
  209. package/dist/src/{otlpReceiver-C99PPb48.js → otlpReceiver-B2z58l4e.js} +154 -98
  210. package/dist/src/{otlpReceiver-CGq6LspY.cjs → otlpReceiver-BfcVq2Nq.cjs} +154 -98
  211. package/dist/src/{otlpReceiver-D89fR-rC.js → otlpReceiver-BntK801g.js} +154 -98
  212. package/dist/src/{otlpReceiver-CdNBdbsk.js → otlpReceiver-DmVulbhC.js} +154 -98
  213. package/dist/src/{providerRegistry-CD8MEar9.js → providerRegistry-Bvh8mv85.js} +2 -2
  214. package/dist/src/{providerRegistry-DM8rZYol.js → providerRegistry-CPQ_CmVO.js} +2 -2
  215. package/dist/src/{providerRegistry-Civky8Ar.cjs → providerRegistry-CQMdTmHP.cjs} +2 -2
  216. package/dist/src/{providerRegistry-B0RUOLI_.js → providerRegistry-CWoPjKFZ.js} +2 -2
  217. package/dist/src/{providers-CgKOSgTR.cjs → providers-1eKkXBKp.cjs} +1435 -930
  218. package/dist/src/{providers-BlqUifFg.js → providers-BV_KMZje.js} +1419 -944
  219. package/dist/src/providers-Bp4S-FvO.js +2 -0
  220. package/dist/src/providers-DV3ax9e_.cjs +3 -0
  221. package/dist/src/{providers-D8lF1sqW.js → providers-Domz_llv.js} +1427 -952
  222. package/dist/src/{providers-Dk_6ocUX.js → providers-DruaQfwu.js} +1424 -949
  223. package/dist/src/providers-iUt5fbAN.js +3 -0
  224. package/dist/src/providers-u9Enmfok.js +2 -0
  225. package/dist/src/python/persistent_wrapper.py +0 -5
  226. package/dist/src/{pythonUtils-D6fwaDSg.js → pythonUtils-C2UQ30Rz.js} +4 -4
  227. package/dist/src/{pythonUtils-D5nxkQ0P.js → pythonUtils-Cldx7huE.js} +4 -4
  228. package/dist/src/{pythonUtils-C3py6GC1.js → pythonUtils-CnndUbW-.js} +3 -3
  229. package/dist/src/{pythonUtils-CTU3Y3lw.cjs → pythonUtils-tAJvvpS-.cjs} +3 -3
  230. package/dist/src/{quiverai-CIaELU_m.js → quiverai-CtWi6x_g.js} +4 -4
  231. package/dist/src/{quiverai-PdShCPox.cjs → quiverai-DFotyafY.cjs} +4 -4
  232. package/dist/src/{quiverai-BbOUOn2L.js → quiverai-DR0SnIQV.js} +4 -4
  233. package/dist/src/{quiverai-uH-dcTIr.js → quiverai-aPPvXOgn.js} +4 -5
  234. package/dist/src/render-CH-62LbA.js +135 -0
  235. package/dist/src/render-CMEpfLaO.js +136 -0
  236. package/dist/src/{render-Drod8m7K.js → render-CgVDrJmM.js} +2 -3
  237. package/dist/src/render-DHIZ6_k8.js +135 -0
  238. package/dist/src/render-DfQSFxGE.cjs +165 -0
  239. package/dist/src/{responses-DIR9Ud3j.js → responses--OsX2aYW.js} +23 -14
  240. package/dist/src/{responses-D8SBTL64.cjs → responses-Bi9vBuW_.cjs} +24 -15
  241. package/dist/src/{responses-CB2jwoAr.js → responses-C-flexAY.js} +24 -15
  242. package/dist/src/{responses-WNGNYe3K.js → responses-DL9m8CyY.js} +24 -15
  243. package/dist/src/{rubyUtils-DhCAlxZr.cjs → rubyUtils-B6eljPuh.cjs} +3 -3
  244. package/dist/src/{rubyUtils-BcuGX77l.js → rubyUtils-CYSQEG4a.js} +3 -3
  245. package/dist/src/rubyUtils-D1L2d3jb.js +3 -0
  246. package/dist/src/rubyUtils-DUbq4tff.cjs +2 -0
  247. package/dist/src/{rubyUtils-BUVePouc.js → rubyUtils-DVLeA2jg.js} +3 -3
  248. package/dist/src/{rubyUtils-Boc4HZzX.js → rubyUtils-DsGrTx8R.js} +3 -3
  249. package/dist/src/{sagemaker-CNBxx5CJ.js → sagemaker-BVkaG2-l.js} +14 -18
  250. package/dist/src/{sagemaker-CemTFp2h.js → sagemaker-BveBvuxm.js} +14 -18
  251. package/dist/src/{sagemaker-YSyBXQQh.js → sagemaker-D67yzMzs.js} +14 -19
  252. package/dist/src/{sagemaker-Cl28mZU2.cjs → sagemaker-XnfhheQv.cjs} +14 -18
  253. package/dist/src/{scanner-BsBlNXNn.js → scanner-1DqWi1Ej.js} +130 -35
  254. package/dist/src/server/golang/wrapper.go +1 -1
  255. package/dist/src/server/index.js +3757 -1511
  256. package/dist/src/server/python/persistent_wrapper.py +0 -5
  257. package/dist/src/{server-CqzrVGpF.js → server-BNYztJkh.js} +128 -9
  258. package/dist/src/{server-CuxBbeSY.js → server-BSB45Nt9.js} +127 -8
  259. package/dist/src/{server-VWgWb00X.js → server-D6Il2Sob.js} +126 -7
  260. package/dist/src/server-DCtHUqlp.js +3 -0
  261. package/dist/src/server-DaA2eR26.cjs +2 -0
  262. package/dist/src/{server-C_7Ax-hA.cjs → server-Dx2TyCH2.cjs} +140 -6
  263. package/dist/src/{signal-4U3mfRvL.js → signal-CE5G3a7x.js} +3 -3
  264. package/dist/src/{slack-BmVAVGaK.cjs → slack-1Rhq0EoV.cjs} +2 -2
  265. package/dist/src/{slack-DCUPTzS2.js → slack-D5Wpy8LM.js} +2 -2
  266. package/dist/src/{slack-DXMKtA-f.js → slack-DDUe-5MC.js} +2 -2
  267. package/dist/src/{slack-DOdy_kyv.js → slack-acRb0IqQ.js} +2 -2
  268. package/dist/src/store-CWOSz6D_.cjs +2 -0
  269. package/dist/src/{store-Dim__MDd.js → store-CYEy5J2D.js} +17 -5
  270. package/dist/src/{store-DLlFCC4h.cjs → store-DAAyxcy6.cjs} +17 -5
  271. package/dist/src/store-DCDBhv7B.js +3 -0
  272. package/dist/src/{store-CXGFv4aR.js → store-Dn9HUkdW.js} +17 -5
  273. package/dist/src/{store-DXilxTl-.js → store-M0b1WfYb.js} +17 -5
  274. package/dist/src/{tables-gftXzE9I.js → tables-C4CH3zRr.js} +3 -3
  275. package/dist/src/{tables-DLJPUdUE.js → tables-CsWou1Bx.js} +3 -3
  276. package/dist/src/{tables-6YKwjN9-.js → tables-DQ4WU5tX.js} +3 -3
  277. package/dist/src/{tables-DPi7wKeM.cjs → tables-DUfh1F7Z.cjs} +3 -3
  278. package/dist/src/telemetry-C1IqxcdW.js +3 -0
  279. package/dist/src/telemetry-C4ZEa_es.cjs +2 -0
  280. package/dist/src/{telemetry-CMrFgtPB.js → telemetry-CQPez_Jp.js} +4 -4
  281. package/dist/src/{telemetry-DaX14Chu.cjs → telemetry-Dsw_faFj.cjs} +4 -4
  282. package/dist/src/{telemetry-Dthj_BbD.js → telemetry-Dvqxv3YC.js} +4 -4
  283. package/dist/src/{telemetry-Cps3mIU-.js → telemetry-dbaJ0E98.js} +4 -4
  284. package/dist/src/{text-CW1cyrwj.cjs → text-BVi-cLPJ.cjs} +1 -1
  285. package/dist/src/{text-B_UCRPp2.js → text-CZr46tp_.js} +1 -1
  286. package/dist/src/{text-TIv0QYnd.js → text-DHxdyQqT.js} +1 -1
  287. package/dist/src/{text-Db-Wt2u2.js → text-KvuD2Iko.js} +1 -1
  288. package/dist/src/{tokenUsageUtils-bVa1ga6f.cjs → tokenUsageUtils-Bb7DkZPz.cjs} +7 -3
  289. package/dist/src/{tokenUsageUtils-NYT-WKS6.js → tokenUsageUtils-C-bmyHoE.js} +7 -3
  290. package/dist/src/{tokenUsageUtils-DflFMjS0.js → tokenUsageUtils-CXrvO-wA.js} +7 -3
  291. package/dist/src/{transcription-NLVG9MT1.cjs → transcription-BvjmiYB1.cjs} +12 -16
  292. package/dist/src/{transcription-BNYURcXg.js → transcription-CJspiD2c.js} +11 -14
  293. package/dist/src/{transcription-B_OdaHp7.js → transcription-DuWDupG7.js} +10 -14
  294. package/dist/src/{transcription-s6A-bNrZ.js → transcription-V2HaAmy2.js} +10 -16
  295. package/dist/src/{transform-DECvGmzp.js → transform-Bbg6A8Jk.js} +4 -4
  296. package/dist/src/{transform-vNucnNr0.js → transform-CG0ehZNG.js} +11 -7
  297. package/dist/src/{transform-DuHvhZpj.cjs → transform-CTeuTR3S.cjs} +31 -9
  298. package/dist/src/{transform-CzK1Q0zl.cjs → transform-CUnzlsbn.cjs} +4 -4
  299. package/dist/src/{transform-aa6tmVpZ.js → transform-DYX1_Xnh.js} +5 -5
  300. package/dist/src/transform-DgKlRr73.cjs +2 -0
  301. package/dist/src/transform-M6ITAESf.js +3 -0
  302. package/dist/src/{transform-DilY9wbS.js → transform-UN5UGu8U.js} +5 -5
  303. package/dist/src/{transform-uAytVuyX.js → transform-lQrDE1BQ.js} +11 -7
  304. package/dist/src/{transform-D5HsjduX.js → transform-zDhMmzwX.js} +11 -7
  305. package/dist/src/{transformersAvailability-CEVM2GNQ.js → transformersAvailability-CcHusyhw.js} +1 -1
  306. package/dist/src/{transformersAvailability-CwayUSlh.cjs → transformersAvailability-Cju9mHgR.cjs} +1 -1
  307. package/dist/src/{transformersAvailability-D6c6ROpT.js → transformersAvailability-DLlROWhg.js} +1 -1
  308. package/dist/src/{types-DmyIJ-sR.js → types-BGQDAP8i.js} +357 -22
  309. package/dist/src/{types-CzW2QFyi.js → types-Bgh5SOn6.js} +358 -24
  310. package/dist/src/{types-C_7nyzr1.cjs → types-CeaeaZdP.cjs} +393 -22
  311. package/dist/src/{types-Cbd8uOMq.js → types-Dm9JM6Vb.js} +368 -23
  312. package/dist/src/{util-BHGHw5G1.js → util-BYvQUPp7.js} +138 -36
  313. package/dist/src/{util-B9vlHIIh.cjs → util-Bxn8emtE.cjs} +15 -168
  314. package/dist/src/{util-ZzmqNPlg.js → util-C8e5uydV.js} +19 -142
  315. package/dist/src/{util-CMy69ZgQ.js → util-C9J8ahRn.js} +18 -4
  316. package/dist/src/{util-BzMcevZc.cjs → util-CN3SrLT4.cjs} +18 -4
  317. package/dist/src/{util-BV4XUC0n.js → util-D3q0WQ-0.js} +18 -4
  318. package/dist/src/{util-Dnmk2mBQ.js → util-D9TisOyk.js} +18 -4
  319. package/dist/src/{util-B3xGByQh.js → util-DDs-7g6-.js} +138 -36
  320. package/dist/src/{util-Bv6uGDfH.js → util-DvU2Pw8c.js} +138 -36
  321. package/dist/src/{util-C1CeHl-P.js → util-DxWpWjhc.js} +13 -136
  322. package/dist/src/{util-BRYkYPTd.js → util-oGMLA7vc.js} +17 -140
  323. package/dist/src/{util-DGNOS1db.cjs → util-olYL5C6N.cjs} +143 -35
  324. package/dist/src/{utils-Cz9qXqII.cjs → utils-B05gLxER.cjs} +6 -4
  325. package/dist/src/{utils-f2-Moju7.js → utils-BLJKfv0y.js} +6 -4
  326. package/dist/src/{utils-dLokC-eR.js → utils-DJfvjyMj.js} +6 -4
  327. package/dist/src/{utils-XiOAgly5.js → utils-hXtCYanr.js} +6 -4
  328. package/dist/tsconfig.tsbuildinfo +1 -1
  329. package/package.json +66 -57
  330. package/dist/src/app/assets/index-4LKxG2CG.js +0 -439
  331. package/dist/src/app/assets/index-C3zcsZFQ.css +0 -1
  332. package/dist/src/app/assets/scroll-timeline-BdJZVXlz.js +0 -1
  333. package/dist/src/app/assets/sync-9qqYcY-B.js +0 -4
  334. package/dist/src/app/assets/vendor-charts-BnDWwBlI.js +0 -36
  335. package/dist/src/app/assets/vendor-markdown-0tekx3KX.js +0 -29
  336. package/dist/src/app/assets/vendor-react-AtKqiNEf.js +0 -4
  337. package/dist/src/app/assets/vendor-syntax-D06x6TQF.js +0 -2
  338. package/dist/src/app/assets/vendor-utils-BvMHZmO7.js +0 -37
  339. package/dist/src/app/tsconfig.app.tsbuildinfo +0 -1
  340. package/dist/src/cache-BVeDlD87.js +0 -726
  341. package/dist/src/cache-C4Nxf52C.js +0 -756
  342. package/dist/src/cache-CeUpFm3M.cjs +0 -5
  343. package/dist/src/cache-Dh5WtQps.cjs +0 -816
  344. package/dist/src/cache-i1P6crbO.js +0 -756
  345. package/dist/src/cache-n-RCJ-hL.js +0 -6
  346. package/dist/src/cloud-BBh91EUK.js +0 -4
  347. package/dist/src/codex-sdk-C6UMlxwV.js +0 -665
  348. package/dist/src/codex-sdk-DUwKWezN.js +0 -665
  349. package/dist/src/codex-sdk-GGAw0qbD.js +0 -666
  350. package/dist/src/codex-sdk-fAO0c3yA.cjs +0 -669
  351. package/dist/src/eval-B3r2CVXr.js +0 -15
  352. package/dist/src/evalResult-5xwYnECe.js +0 -12
  353. package/dist/src/evalResult-71lY93Kj.cjs +0 -10
  354. package/dist/src/evalResult-Dx5P5cIv.js +0 -10
  355. package/dist/src/evaluator-Jx6bRZV6.js +0 -36
  356. package/dist/src/fetch-BxNb_Lp3.js +0 -5
  357. package/dist/src/graders-B_pgMLS2.js +0 -34
  358. package/dist/src/graders-DErokPDO.cjs +0 -32
  359. package/dist/src/graders-DR_uNe54.js +0 -32
  360. package/dist/src/graders-w3176Wz-.js +0 -32
  361. package/dist/src/openclaw-CSugPYAr.cjs +0 -586
  362. package/dist/src/openclaw-DiSz3I5L.js +0 -582
  363. package/dist/src/openclaw-DuvJKEW5.js +0 -580
  364. package/dist/src/openclaw-tiVYRtr-.js +0 -580
  365. package/dist/src/providers-B7V0njNs.js +0 -32
  366. package/dist/src/providers-BEwbhv0X.js +0 -30
  367. package/dist/src/providers-CH3C7zf7.js +0 -30
  368. package/dist/src/providers-zyB6k_38.cjs +0 -31
  369. package/dist/src/rubyUtils-BUHu6PhO.js +0 -5
  370. package/dist/src/rubyUtils-CP42kMvq.cjs +0 -4
  371. package/dist/src/server-DA4Cyrrq.js +0 -7
  372. package/dist/src/server-Dulb-4-K.cjs +0 -5
  373. package/dist/src/store-CXS-Q_91.js +0 -6
  374. package/dist/src/store-eYkaKMwq.cjs +0 -5
  375. package/dist/src/telemetry-BpMfhthR.cjs +0 -5
  376. package/dist/src/telemetry-Dw38hanS.js +0 -7
  377. package/dist/src/tokenUsageUtils-BDGe-iyI.js +0 -138
  378. package/dist/src/transform-DTGDnAzW.js +0 -6
  379. package/dist/src/transform-m3qNw4KP.cjs +0 -5
@@ -0,0 +1,310 @@
1
+ import { t as __exportAll } from "./chunk-DEq-mXcV.js";
2
+ import { S as getEnvBool, T as getEnvString, a as logger, w as getEnvInt, x as getConfigDirectoryPath } from "./logger-Ct2S6Yx-.js";
3
+ import { d as sleep, h as REQUEST_TIMEOUT_MS, n as fetchWithRetries } from "./fetch-Di00EQrc.js";
4
+ import fs from "fs";
5
+ import path from "path";
6
+ import { AsyncLocalStorage } from "node:async_hooks";
7
+ import { createCache } from "cache-manager";
8
+ import { Keyv } from "keyv";
9
+ import { KeyvFile } from "keyv-file";
10
+ //#region src/util/fetch/errors.ts
11
+ /**
12
+ * Non-transient HTTP status codes that indicate the target is unavailable or misconfigured.
13
+ * These errors will not resolve on retry and should abort the scan immediately.
14
+ *
15
+ * - 401: Unauthorized - authentication required or invalid credentials
16
+ * - 403: Forbidden - valid credentials but access denied
17
+ * - 404: Not Found - target endpoint doesn't exist
18
+ * - 501: Not Implemented - server doesn't support the request method
19
+ *
20
+ * Excluded: 500 (often transient — server crashes, DB timeouts, deployment rollouts,
21
+ * or input-dependent bugs where one prompt triggers it but the next doesn't),
22
+ * 502/503/504 (typically transient gateway issues).
23
+ */
24
+ const NON_TRANSIENT_HTTP_STATUSES = [
25
+ 401,
26
+ 403,
27
+ 404,
28
+ 501
29
+ ];
30
+ function isNonTransientHttpStatus(status) {
31
+ return NON_TRANSIENT_HTTP_STATUSES.includes(status);
32
+ }
33
+ function isTransientConnectionError(error) {
34
+ if (!error) return false;
35
+ const code = error.code;
36
+ if (code === "ECONNRESET" || code === "EPIPE") return true;
37
+ const message = (error.message ?? "").toLowerCase();
38
+ if (message.includes("eproto") && (message.includes("wrong version number") || message.includes("self signed") || message.includes("unable to verify") || message.includes("unknown ca") || message.includes("cert"))) return false;
39
+ return message.includes("bad record mac") || message.includes("eproto") || message.includes("econnreset") || message.includes("socket hang up");
40
+ }
41
+ //#endregion
42
+ //#region src/cache.ts
43
+ var cache_exports = /* @__PURE__ */ __exportAll({
44
+ clearCache: () => clearCache,
45
+ disableCache: () => disableCache,
46
+ enableCache: () => enableCache,
47
+ fetchWithCache: () => fetchWithCache,
48
+ getCache: () => getCache,
49
+ isCacheEnabled: () => isCacheEnabled,
50
+ withCacheNamespace: () => withCacheNamespace
51
+ });
52
+ let cacheInstance;
53
+ const namespacedCacheInstances = /* @__PURE__ */ new Map();
54
+ const cacheNamespaceStorage = new AsyncLocalStorage();
55
+ let enabled = getEnvBool("PROMPTFOO_CACHE_ENABLED", true);
56
+ const cacheType = getEnvString("PROMPTFOO_CACHE_TYPE") || (getEnvString("NODE_ENV") === "test" ? "memory" : "disk");
57
+ /** Default cache TTL: 14 days in seconds */
58
+ const DEFAULT_CACHE_TTL_SECONDS = 3600 * 24 * 14;
59
+ /**
60
+ * Get the cache TTL in milliseconds.
61
+ * Reads from PROMPTFOO_CACHE_TTL environment variable (in seconds) or uses default.
62
+ */
63
+ function getCacheTtlMs() {
64
+ return getEnvInt("PROMPTFOO_CACHE_TTL", DEFAULT_CACHE_TTL_SECONDS) * 1e3;
65
+ }
66
+ function getCache() {
67
+ const namespace = cacheNamespaceStorage.getStore()?.namespace;
68
+ if (namespace) return getNamespacedCache(namespace);
69
+ return getCacheInstance();
70
+ }
71
+ function getCacheInstance() {
72
+ if (!cacheInstance) {
73
+ let cachePath = "";
74
+ const stores = [];
75
+ if (cacheType === "disk" && enabled) {
76
+ cachePath = getEnvString("PROMPTFOO_CACHE_PATH") || path.join(getConfigDirectoryPath(), "cache");
77
+ if (!fs.existsSync(cachePath)) {
78
+ logger.info(`Creating cache folder at ${cachePath}.`);
79
+ fs.mkdirSync(cachePath, { recursive: true });
80
+ }
81
+ const newCacheFile = path.join(cachePath, "cache.json");
82
+ try {
83
+ const keyv = new Keyv({
84
+ store: new KeyvFile({ filename: newCacheFile }),
85
+ ttl: getCacheTtlMs()
86
+ });
87
+ stores.push(keyv);
88
+ } catch (err) {
89
+ logger.warn(`[Cache] Failed to initialize disk cache: ${err.message}. Using memory cache instead.`);
90
+ }
91
+ }
92
+ cacheInstance = createCache({
93
+ stores,
94
+ ttl: getCacheTtlMs(),
95
+ refreshThreshold: 0
96
+ });
97
+ }
98
+ return cacheInstance;
99
+ }
100
+ function getNamespacedCache(namespace) {
101
+ const cachedNamespaceInstance = namespacedCacheInstances.get(namespace);
102
+ if (cachedNamespaceInstance) return cachedNamespaceInstance;
103
+ const cache = getCacheInstance();
104
+ const namespacedCache = {
105
+ ...cache,
106
+ get: (key) => cache.get(getScopedCacheKey(key, namespace)),
107
+ set: (key, value, ttl) => cache.set(getScopedCacheKey(key, namespace), value, ttl),
108
+ del: (key) => cache.del(getScopedCacheKey(key, namespace)),
109
+ mget: (keys) => cache.mget(keys.map((key) => getScopedCacheKey(key, namespace))),
110
+ mset: async (list) => {
111
+ const scopedList = list.map(({ key, value, ttl }) => ({
112
+ key: getScopedCacheKey(key, namespace),
113
+ value,
114
+ ttl
115
+ }));
116
+ return (await cache.mset(scopedList) ?? scopedList).map(({ key, value, ttl }) => ({
117
+ key: getUnscopedCacheKey(key, namespace),
118
+ value,
119
+ ttl
120
+ }));
121
+ },
122
+ mdel: (keys) => cache.mdel(keys.map((key) => getScopedCacheKey(key, namespace))),
123
+ ttl: (key) => cache.ttl(getScopedCacheKey(key, namespace)),
124
+ clear: () => clearNamespacedCache(cache, namespace),
125
+ wrap: (...args) => cache.wrap(getScopedCacheKey(args[0], namespace), ...args.slice(1))
126
+ };
127
+ namespacedCacheInstances.set(namespace, namespacedCache);
128
+ return namespacedCache;
129
+ }
130
+ function getCurrentCacheNamespace() {
131
+ return cacheNamespaceStorage.getStore()?.namespace;
132
+ }
133
+ function getScopedCacheKey(cacheKey, namespace = getCurrentCacheNamespace()) {
134
+ return namespace ? `${namespace}:${cacheKey}` : cacheKey;
135
+ }
136
+ function getUnscopedCacheKey(cacheKey, namespace) {
137
+ const namespacePrefix = `${namespace}:`;
138
+ return cacheKey.startsWith(namespacePrefix) ? cacheKey.slice(namespacePrefix.length) : cacheKey;
139
+ }
140
+ async function clearNamespacedCache(cache, namespace) {
141
+ const namespacePrefix = `${namespace}:`;
142
+ for (const store of cache.stores) {
143
+ if (!store.iterator) throw new Error(`[Cache] Cannot clear namespace ${namespace} because a cache store does not support key iteration.`);
144
+ const keysToDelete = [];
145
+ for await (const [key] of store.iterator(void 0)) if (typeof key === "string" && key.startsWith(namespacePrefix)) keysToDelete.push(key);
146
+ if (keysToDelete.length === 0) continue;
147
+ try {
148
+ if (store.deleteMany) await store.deleteMany(keysToDelete);
149
+ else await Promise.all(keysToDelete.map((key) => store.delete(key)));
150
+ } catch (err) {
151
+ throw new Error(`[Cache] Failed to clear ${keysToDelete.length} keys for namespace "${namespace}": ${err.message}`);
152
+ }
153
+ }
154
+ return true;
155
+ }
156
+ function withCacheNamespace(namespace, fn) {
157
+ if (!namespace) return fn();
158
+ const parentNamespace = getCurrentCacheNamespace();
159
+ if (parentNamespace === namespace) return fn();
160
+ const scopedNamespace = parentNamespace ? `${parentNamespace}:${namespace}` : namespace;
161
+ return cacheNamespaceStorage.run({ namespace: scopedNamespace }, fn);
162
+ }
163
+ const inflightFetchResponses = /* @__PURE__ */ new Map();
164
+ function serializeFetchResponse(data, status, statusText, headers, latencyMs) {
165
+ return JSON.stringify({
166
+ data,
167
+ status,
168
+ statusText,
169
+ headers,
170
+ latencyMs
171
+ });
172
+ }
173
+ function deserializeFetchResponse(response, cached, cache, cacheKey) {
174
+ const parsedResponse = JSON.parse(response);
175
+ return {
176
+ cached,
177
+ data: parsedResponse.data,
178
+ status: parsedResponse.status,
179
+ statusText: parsedResponse.statusText,
180
+ headers: parsedResponse.headers,
181
+ latencyMs: parsedResponse.latencyMs,
182
+ deleteFromCache: async () => {
183
+ await cache.del(cacheKey);
184
+ logger.debug(`Evicted from cache: ${cacheKey}`);
185
+ }
186
+ };
187
+ }
188
+ async function fetchAndReadBody(url, options, timeout, maxRetries, isIdempotent) {
189
+ const maxBodyRetries = isIdempotent ? 2 : 0;
190
+ for (let bodyAttempt = 0; bodyAttempt <= maxBodyRetries; bodyAttempt++) {
191
+ const fetchStart = Date.now();
192
+ const resp = await fetchWithRetries(url, options, timeout, maxRetries);
193
+ const fetchLatencyMs = Date.now() - fetchStart;
194
+ try {
195
+ return {
196
+ respText: await resp.text(),
197
+ resp,
198
+ fetchLatencyMs
199
+ };
200
+ } catch (err) {
201
+ if (isTransientConnectionError(err) && bodyAttempt < maxBodyRetries) {
202
+ const backoffMs = Math.pow(2, bodyAttempt) * 1e3;
203
+ logger.debug("[Cache] Body stream failed with transient error, retrying", {
204
+ attempt: bodyAttempt + 1,
205
+ maxRetries: maxBodyRetries,
206
+ backoffMs,
207
+ error: err?.message?.slice(0, 200)
208
+ });
209
+ await sleep(backoffMs);
210
+ continue;
211
+ }
212
+ throw err;
213
+ }
214
+ }
215
+ throw new Error("Exhausted body retries without returning or throwing");
216
+ }
217
+ async function prepareFetchResponse(url, options, timeout, maxRetries, isIdempotent, format) {
218
+ const result = await fetchAndReadBody(url, options, timeout, maxRetries, isIdempotent);
219
+ const response = result.resp;
220
+ const responseText = result.respText;
221
+ const fetchLatencyMs = result.fetchLatencyMs;
222
+ const headers = Object.fromEntries(response.headers.entries());
223
+ try {
224
+ const parsedData = format === "json" ? JSON.parse(responseText) : responseText;
225
+ const serializedResponse = serializeFetchResponse(parsedData, response.status, response.statusText, headers, fetchLatencyMs);
226
+ if (!response.ok) return {
227
+ response: responseText === "" ? serializeFetchResponse(`Empty Response: ${response.status}: ${response.statusText}`, response.status, response.statusText, headers, fetchLatencyMs) : serializedResponse,
228
+ cacheable: false
229
+ };
230
+ if (format === "json" && parsedData?.error) {
231
+ logger.debug(`Not caching ${url} because it contains an 'error' key: ${parsedData.error}`);
232
+ return {
233
+ response: serializedResponse,
234
+ cacheable: false
235
+ };
236
+ }
237
+ logger.debug(`Storing ${url} response in cache with latencyMs=${fetchLatencyMs}: ${serializedResponse}`);
238
+ return {
239
+ response: serializedResponse,
240
+ cacheable: true
241
+ };
242
+ } catch (err) {
243
+ throw new Error(`Error parsing response from ${url}: ${err.message}. Received text: ${responseText}`);
244
+ }
245
+ }
246
+ async function fetchWithCache(url, options = {}, timeout = REQUEST_TIMEOUT_MS, format = "json", bust = false, maxRetries) {
247
+ const method = (options.method ?? (url instanceof Request ? url.method : "GET")).toUpperCase();
248
+ const isIdempotent = [
249
+ "GET",
250
+ "HEAD",
251
+ "OPTIONS",
252
+ "PUT",
253
+ "DELETE"
254
+ ].includes(method);
255
+ if (!enabled || bust) {
256
+ const { respText, resp, fetchLatencyMs } = await fetchAndReadBody(url, options, timeout, maxRetries, isIdempotent);
257
+ try {
258
+ return {
259
+ cached: false,
260
+ data: format === "json" ? JSON.parse(respText) : respText,
261
+ status: resp.status,
262
+ statusText: resp.statusText,
263
+ headers: Object.fromEntries(resp.headers.entries()),
264
+ latencyMs: fetchLatencyMs,
265
+ deleteFromCache: async () => {}
266
+ };
267
+ } catch {
268
+ throw new Error(`Error parsing response as JSON: ${respText}`);
269
+ }
270
+ }
271
+ const copy = Object.assign({}, options);
272
+ delete copy.headers;
273
+ const cacheKey = getScopedCacheKey(`fetch:v2:${url}:${JSON.stringify(copy)}`);
274
+ const cache = getCacheInstance();
275
+ const cachedResponse = await cache.get(cacheKey);
276
+ if (cachedResponse != null) {
277
+ logger.debug(`Returning cached response for ${url}: ${cachedResponse}`);
278
+ return deserializeFetchResponse(cachedResponse, true, cache, cacheKey);
279
+ }
280
+ let inflightResponse = inflightFetchResponses.get(cacheKey);
281
+ if (!inflightResponse) {
282
+ inflightResponse = (async () => {
283
+ const preparedResponse = await prepareFetchResponse(url, options, timeout, maxRetries, isIdempotent, format);
284
+ if (preparedResponse.cacheable) await cache.set(cacheKey, preparedResponse.response);
285
+ return preparedResponse.response;
286
+ })().finally(() => {
287
+ inflightFetchResponses.delete(cacheKey);
288
+ });
289
+ inflightFetchResponses.set(cacheKey, inflightResponse);
290
+ }
291
+ return deserializeFetchResponse(await inflightResponse, false, cache, cacheKey);
292
+ }
293
+ function enableCache() {
294
+ enabled = true;
295
+ }
296
+ function disableCache() {
297
+ enabled = false;
298
+ }
299
+ async function clearCache() {
300
+ inflightFetchResponses.clear();
301
+ namespacedCacheInstances.clear();
302
+ return getCacheInstance().clear();
303
+ }
304
+ function isCacheEnabled() {
305
+ return enabled;
306
+ }
307
+ //#endregion
308
+ export { isCacheEnabled as a, isNonTransientHttpStatus as c, getCache as i, isTransientConnectionError as l, disableCache as n, withCacheNamespace as o, fetchWithCache as r, NON_TRANSIENT_HTTP_STATUSES as s, cache_exports as t };
309
+
310
+ //# sourceMappingURL=cache-D5NZmMiT.js.map
@@ -0,0 +1,3 @@
1
+ const require_cache = require("./cache-BIyPcp5v.cjs");
2
+ exports.getCache = require_cache.getCache;
3
+ exports.isCacheEnabled = require_cache.isCacheEnabled;
@@ -0,0 +1,280 @@
1
+ #!/usr/bin/env node
2
+ import { t as __exportAll } from "./chunk-DRamLcfz.js";
3
+ import { C as getConfigDirectoryPath, D as getEnvInt, O as getEnvString, T as getEnvBool, s as logger } from "./logger-DksKw1Qc.js";
4
+ import { l as sleep, m as REQUEST_TIMEOUT_MS, r as fetchWithRetries } from "./fetch-BEWnXrrG.js";
5
+ import { r as isTransientConnectionError } from "./errors-Cw810C93.js";
6
+ import { AsyncLocalStorage } from "node:async_hooks";
7
+ import fs from "fs";
8
+ import path from "path";
9
+ import { createCache } from "cache-manager";
10
+ import { Keyv } from "keyv";
11
+ import { KeyvFile } from "keyv-file";
12
+ //#region src/cache.ts
13
+ var cache_exports = /* @__PURE__ */ __exportAll({
14
+ clearCache: () => clearCache,
15
+ disableCache: () => disableCache,
16
+ enableCache: () => enableCache,
17
+ fetchWithCache: () => fetchWithCache,
18
+ getCache: () => getCache,
19
+ isCacheEnabled: () => isCacheEnabled,
20
+ withCacheNamespace: () => withCacheNamespace
21
+ });
22
+ let cacheInstance;
23
+ const namespacedCacheInstances = /* @__PURE__ */ new Map();
24
+ const cacheNamespaceStorage = new AsyncLocalStorage();
25
+ let enabled = getEnvBool("PROMPTFOO_CACHE_ENABLED", true);
26
+ const cacheType = getEnvString("PROMPTFOO_CACHE_TYPE") || (getEnvString("NODE_ENV") === "test" ? "memory" : "disk");
27
+ /** Default cache TTL: 14 days in seconds */
28
+ const DEFAULT_CACHE_TTL_SECONDS = 3600 * 24 * 14;
29
+ /**
30
+ * Get the cache TTL in milliseconds.
31
+ * Reads from PROMPTFOO_CACHE_TTL environment variable (in seconds) or uses default.
32
+ */
33
+ function getCacheTtlMs() {
34
+ return getEnvInt("PROMPTFOO_CACHE_TTL", DEFAULT_CACHE_TTL_SECONDS) * 1e3;
35
+ }
36
+ function getCache() {
37
+ const namespace = cacheNamespaceStorage.getStore()?.namespace;
38
+ if (namespace) return getNamespacedCache(namespace);
39
+ return getCacheInstance();
40
+ }
41
+ function getCacheInstance() {
42
+ if (!cacheInstance) {
43
+ let cachePath = "";
44
+ const stores = [];
45
+ if (cacheType === "disk" && enabled) {
46
+ cachePath = getEnvString("PROMPTFOO_CACHE_PATH") || path.join(getConfigDirectoryPath(), "cache");
47
+ if (!fs.existsSync(cachePath)) {
48
+ logger.info(`Creating cache folder at ${cachePath}.`);
49
+ fs.mkdirSync(cachePath, { recursive: true });
50
+ }
51
+ const newCacheFile = path.join(cachePath, "cache.json");
52
+ try {
53
+ const keyv = new Keyv({
54
+ store: new KeyvFile({ filename: newCacheFile }),
55
+ ttl: getCacheTtlMs()
56
+ });
57
+ stores.push(keyv);
58
+ } catch (err) {
59
+ logger.warn(`[Cache] Failed to initialize disk cache: ${err.message}. Using memory cache instead.`);
60
+ }
61
+ }
62
+ cacheInstance = createCache({
63
+ stores,
64
+ ttl: getCacheTtlMs(),
65
+ refreshThreshold: 0
66
+ });
67
+ }
68
+ return cacheInstance;
69
+ }
70
+ function getNamespacedCache(namespace) {
71
+ const cachedNamespaceInstance = namespacedCacheInstances.get(namespace);
72
+ if (cachedNamespaceInstance) return cachedNamespaceInstance;
73
+ const cache = getCacheInstance();
74
+ const namespacedCache = {
75
+ ...cache,
76
+ get: (key) => cache.get(getScopedCacheKey(key, namespace)),
77
+ set: (key, value, ttl) => cache.set(getScopedCacheKey(key, namespace), value, ttl),
78
+ del: (key) => cache.del(getScopedCacheKey(key, namespace)),
79
+ mget: (keys) => cache.mget(keys.map((key) => getScopedCacheKey(key, namespace))),
80
+ mset: async (list) => {
81
+ const scopedList = list.map(({ key, value, ttl }) => ({
82
+ key: getScopedCacheKey(key, namespace),
83
+ value,
84
+ ttl
85
+ }));
86
+ return (await cache.mset(scopedList) ?? scopedList).map(({ key, value, ttl }) => ({
87
+ key: getUnscopedCacheKey(key, namespace),
88
+ value,
89
+ ttl
90
+ }));
91
+ },
92
+ mdel: (keys) => cache.mdel(keys.map((key) => getScopedCacheKey(key, namespace))),
93
+ ttl: (key) => cache.ttl(getScopedCacheKey(key, namespace)),
94
+ clear: () => clearNamespacedCache(cache, namespace),
95
+ wrap: (...args) => cache.wrap(getScopedCacheKey(args[0], namespace), ...args.slice(1))
96
+ };
97
+ namespacedCacheInstances.set(namespace, namespacedCache);
98
+ return namespacedCache;
99
+ }
100
+ function getCurrentCacheNamespace() {
101
+ return cacheNamespaceStorage.getStore()?.namespace;
102
+ }
103
+ function getScopedCacheKey(cacheKey, namespace = getCurrentCacheNamespace()) {
104
+ return namespace ? `${namespace}:${cacheKey}` : cacheKey;
105
+ }
106
+ function getUnscopedCacheKey(cacheKey, namespace) {
107
+ const namespacePrefix = `${namespace}:`;
108
+ return cacheKey.startsWith(namespacePrefix) ? cacheKey.slice(namespacePrefix.length) : cacheKey;
109
+ }
110
+ async function clearNamespacedCache(cache, namespace) {
111
+ const namespacePrefix = `${namespace}:`;
112
+ for (const store of cache.stores) {
113
+ if (!store.iterator) throw new Error(`[Cache] Cannot clear namespace ${namespace} because a cache store does not support key iteration.`);
114
+ const keysToDelete = [];
115
+ for await (const [key] of store.iterator(void 0)) if (typeof key === "string" && key.startsWith(namespacePrefix)) keysToDelete.push(key);
116
+ if (keysToDelete.length === 0) continue;
117
+ try {
118
+ if (store.deleteMany) await store.deleteMany(keysToDelete);
119
+ else await Promise.all(keysToDelete.map((key) => store.delete(key)));
120
+ } catch (err) {
121
+ throw new Error(`[Cache] Failed to clear ${keysToDelete.length} keys for namespace "${namespace}": ${err.message}`);
122
+ }
123
+ }
124
+ return true;
125
+ }
126
+ function withCacheNamespace(namespace, fn) {
127
+ if (!namespace) return fn();
128
+ const parentNamespace = getCurrentCacheNamespace();
129
+ if (parentNamespace === namespace) return fn();
130
+ const scopedNamespace = parentNamespace ? `${parentNamespace}:${namespace}` : namespace;
131
+ return cacheNamespaceStorage.run({ namespace: scopedNamespace }, fn);
132
+ }
133
+ const inflightFetchResponses = /* @__PURE__ */ new Map();
134
+ function serializeFetchResponse(data, status, statusText, headers, latencyMs) {
135
+ return JSON.stringify({
136
+ data,
137
+ status,
138
+ statusText,
139
+ headers,
140
+ latencyMs
141
+ });
142
+ }
143
+ function deserializeFetchResponse(response, cached, cache, cacheKey) {
144
+ const parsedResponse = JSON.parse(response);
145
+ return {
146
+ cached,
147
+ data: parsedResponse.data,
148
+ status: parsedResponse.status,
149
+ statusText: parsedResponse.statusText,
150
+ headers: parsedResponse.headers,
151
+ latencyMs: parsedResponse.latencyMs,
152
+ deleteFromCache: async () => {
153
+ await cache.del(cacheKey);
154
+ logger.debug(`Evicted from cache: ${cacheKey}`);
155
+ }
156
+ };
157
+ }
158
+ async function fetchAndReadBody(url, options, timeout, maxRetries, isIdempotent) {
159
+ const maxBodyRetries = isIdempotent ? 2 : 0;
160
+ for (let bodyAttempt = 0; bodyAttempt <= maxBodyRetries; bodyAttempt++) {
161
+ const fetchStart = Date.now();
162
+ const resp = await fetchWithRetries(url, options, timeout, maxRetries);
163
+ const fetchLatencyMs = Date.now() - fetchStart;
164
+ try {
165
+ return {
166
+ respText: await resp.text(),
167
+ resp,
168
+ fetchLatencyMs
169
+ };
170
+ } catch (err) {
171
+ if (isTransientConnectionError(err) && bodyAttempt < maxBodyRetries) {
172
+ const backoffMs = Math.pow(2, bodyAttempt) * 1e3;
173
+ logger.debug("[Cache] Body stream failed with transient error, retrying", {
174
+ attempt: bodyAttempt + 1,
175
+ maxRetries: maxBodyRetries,
176
+ backoffMs,
177
+ error: err?.message?.slice(0, 200)
178
+ });
179
+ await sleep(backoffMs);
180
+ continue;
181
+ }
182
+ throw err;
183
+ }
184
+ }
185
+ throw new Error("Exhausted body retries without returning or throwing");
186
+ }
187
+ async function prepareFetchResponse(url, options, timeout, maxRetries, isIdempotent, format) {
188
+ const result = await fetchAndReadBody(url, options, timeout, maxRetries, isIdempotent);
189
+ const response = result.resp;
190
+ const responseText = result.respText;
191
+ const fetchLatencyMs = result.fetchLatencyMs;
192
+ const headers = Object.fromEntries(response.headers.entries());
193
+ try {
194
+ const parsedData = format === "json" ? JSON.parse(responseText) : responseText;
195
+ const serializedResponse = serializeFetchResponse(parsedData, response.status, response.statusText, headers, fetchLatencyMs);
196
+ if (!response.ok) return {
197
+ response: responseText === "" ? serializeFetchResponse(`Empty Response: ${response.status}: ${response.statusText}`, response.status, response.statusText, headers, fetchLatencyMs) : serializedResponse,
198
+ cacheable: false
199
+ };
200
+ if (format === "json" && parsedData?.error) {
201
+ logger.debug(`Not caching ${url} because it contains an 'error' key: ${parsedData.error}`);
202
+ return {
203
+ response: serializedResponse,
204
+ cacheable: false
205
+ };
206
+ }
207
+ logger.debug(`Storing ${url} response in cache with latencyMs=${fetchLatencyMs}: ${serializedResponse}`);
208
+ return {
209
+ response: serializedResponse,
210
+ cacheable: true
211
+ };
212
+ } catch (err) {
213
+ throw new Error(`Error parsing response from ${url}: ${err.message}. Received text: ${responseText}`);
214
+ }
215
+ }
216
+ async function fetchWithCache(url, options = {}, timeout = REQUEST_TIMEOUT_MS, format = "json", bust = false, maxRetries) {
217
+ const method = (options.method ?? (url instanceof Request ? url.method : "GET")).toUpperCase();
218
+ const isIdempotent = [
219
+ "GET",
220
+ "HEAD",
221
+ "OPTIONS",
222
+ "PUT",
223
+ "DELETE"
224
+ ].includes(method);
225
+ if (!enabled || bust) {
226
+ const { respText, resp, fetchLatencyMs } = await fetchAndReadBody(url, options, timeout, maxRetries, isIdempotent);
227
+ try {
228
+ return {
229
+ cached: false,
230
+ data: format === "json" ? JSON.parse(respText) : respText,
231
+ status: resp.status,
232
+ statusText: resp.statusText,
233
+ headers: Object.fromEntries(resp.headers.entries()),
234
+ latencyMs: fetchLatencyMs,
235
+ deleteFromCache: async () => {}
236
+ };
237
+ } catch {
238
+ throw new Error(`Error parsing response as JSON: ${respText}`);
239
+ }
240
+ }
241
+ const copy = Object.assign({}, options);
242
+ delete copy.headers;
243
+ const cacheKey = getScopedCacheKey(`fetch:v2:${url}:${JSON.stringify(copy)}`);
244
+ const cache = getCacheInstance();
245
+ const cachedResponse = await cache.get(cacheKey);
246
+ if (cachedResponse != null) {
247
+ logger.debug(`Returning cached response for ${url}: ${cachedResponse}`);
248
+ return deserializeFetchResponse(cachedResponse, true, cache, cacheKey);
249
+ }
250
+ let inflightResponse = inflightFetchResponses.get(cacheKey);
251
+ if (!inflightResponse) {
252
+ inflightResponse = (async () => {
253
+ const preparedResponse = await prepareFetchResponse(url, options, timeout, maxRetries, isIdempotent, format);
254
+ if (preparedResponse.cacheable) await cache.set(cacheKey, preparedResponse.response);
255
+ return preparedResponse.response;
256
+ })().finally(() => {
257
+ inflightFetchResponses.delete(cacheKey);
258
+ });
259
+ inflightFetchResponses.set(cacheKey, inflightResponse);
260
+ }
261
+ return deserializeFetchResponse(await inflightResponse, false, cache, cacheKey);
262
+ }
263
+ function enableCache() {
264
+ enabled = true;
265
+ }
266
+ function disableCache() {
267
+ enabled = false;
268
+ }
269
+ async function clearCache() {
270
+ inflightFetchResponses.clear();
271
+ namespacedCacheInstances.clear();
272
+ return getCacheInstance().clear();
273
+ }
274
+ function isCacheEnabled() {
275
+ return enabled;
276
+ }
277
+ //#endregion
278
+ export { fetchWithCache as a, withCacheNamespace as c, enableCache as i, clearCache as n, getCache as o, disableCache as r, isCacheEnabled as s, cache_exports as t };
279
+
280
+ //# sourceMappingURL=cache-mb7c8hbp.js.map
@@ -1,16 +1,6 @@
1
- import { i as logger } from "./logger-DLcq4dWf.js";
2
- import "./fetch-HaqdX7U1.js";
1
+ import { a as logger } from "./logger-B88EkIn6.js";
3
2
  import { t as invariant } from "./invariant-vgHWClmd.js";
4
- import "./esm-CaIwzWR5.js";
5
- import "./types-CzW2QFyi.js";
6
- import "./cache-i1P6crbO.js";
7
- import "./genaiTracer-70Z8BIuV.js";
8
- import "./pythonUtils-D6fwaDSg.js";
9
- import "./util-ZzmqNPlg.js";
10
- import { t as OpenAiChatCompletionProvider } from "./chat-DJIw17u0.js";
11
- import "./transform-uAytVuyX.js";
12
- import "./openai-j-sE2O7r.js";
13
- import "./util-BV4XUC0n.js";
3
+ import { t as OpenAiChatCompletionProvider } from "./chat-BfPaS15_.js";
14
4
  //#region src/providers/hyperbolic/chat.ts
15
5
  const HYPERBOLIC_CHAT_MODELS = [
16
6
  {
@@ -296,4 +286,4 @@ function createHyperbolicProvider(providerPath, options = {}) {
296
286
  //#endregion
297
287
  export { createHyperbolicProvider };
298
288
 
299
- //# sourceMappingURL=chat-C2jrdPMx.js.map
289
+ //# sourceMappingURL=chat-0bwXjVP0.js.map
@@ -1,16 +1,6 @@
1
- const require_logger = require("./logger-Cp1GPUjj.cjs");
1
+ const require_logger = require("./logger-COuQb2xB.cjs");
2
2
  const require_invariant = require("./invariant-kfQ8Bu82.cjs");
3
- require("./esm-CnNt7sI4.cjs");
4
- require("./pythonUtils-CTU3Y3lw.cjs");
5
- require("./types-C_7nyzr1.cjs");
6
- require("./util-B9vlHIIh.cjs");
7
- require("./fetch-BPkYtG8K.cjs");
8
- require("./cache-Dh5WtQps.cjs");
9
- require("./genaiTracer-DN4dQywX.cjs");
10
- const require_chat = require("./chat-CgF-J-Jj.cjs");
11
- require("./transform-DuHvhZpj.cjs");
12
- require("./openai-Cuif0GEt.cjs");
13
- require("./util-BzMcevZc.cjs");
3
+ const require_chat = require("./chat-CclRbxGf.cjs");
14
4
  //#region src/providers/hyperbolic/chat.ts
15
5
  const HYPERBOLIC_CHAT_MODELS = [
16
6
  {
@@ -296,4 +286,4 @@ function createHyperbolicProvider(providerPath, options = {}) {
296
286
  //#endregion
297
287
  exports.createHyperbolicProvider = createHyperbolicProvider;
298
288
 
299
- //# sourceMappingURL=chat-C1Qst7jL.cjs.map
289
+ //# sourceMappingURL=chat-BPXSW8Bv.cjs.map