promptfoo 0.121.3 → 0.121.5

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 (394) hide show
  1. package/README.md +1 -1
  2. package/dist/src/{ListApp-Du7YVwj5.js → ListApp-BRUsT43Y.js} +1 -1
  3. package/dist/src/{accounts-BPyfpSeU.cjs → accounts-BIFntVWB.cjs} +5 -5
  4. package/dist/src/{accounts-CFLK3mnD.js → accounts-CLJHCDDb.js} +6 -6
  5. package/dist/src/{accounts-B2XmGjty.js → accounts-CaLNYnf7.js} +5 -5
  6. package/dist/src/{accounts-Xatc0RYb.js → accounts-bnyHT7Ju.js} +5 -5
  7. package/dist/src/{agentic-utils-36epdqwB.js → agentic-utils-B5krlibj.js} +3 -3
  8. package/dist/src/{agentic-utils-DIYAAYE7.js → agentic-utils-Ba67xmgs.js} +3 -3
  9. package/dist/src/{agentic-utils-D8yXo5Lm.js → agentic-utils-BclbiXiq.js} +4 -4
  10. package/dist/src/{agentic-utils-DAVsChuB.cjs → agentic-utils-D2x0wGhB.cjs} +3 -3
  11. package/dist/src/{agents-CLQ-P15P.js → agents-BGqaTDnr.js} +5 -7
  12. package/dist/src/{agents-wg3ohknq.js → agents-BV9yFpXX.js} +6 -7
  13. package/dist/src/{agents-CgBniSlI.js → agents-BYdMl1UE.js} +5 -9
  14. package/dist/src/{agents-Bqgfdokm.js → agents-DhxWMCtH.js} +35 -14
  15. package/dist/src/{agents-BBWxKSM0.cjs → agents-DiWmQYH9.cjs} +5 -7
  16. package/dist/src/{agents-CAYbM7qD.cjs → agents-WULPVjbH.cjs} +34 -12
  17. package/dist/src/{agents-DSSTV4bv.js → agents-emVcx3yh.js} +35 -13
  18. package/dist/src/{agents-BBVJCIYr.js → agents-n6vPqV3i.js} +35 -13
  19. package/dist/src/{aimlapi-BwGC1TtS.js → aimlapi-BxqK9HF_.js} +8 -14
  20. package/dist/src/{aimlapi-Bv8Fmc-b.cjs → aimlapi-BzLjZI_m.cjs} +8 -15
  21. package/dist/src/{aimlapi-MgSLdvy7.js → aimlapi-DR4pgeiC.js} +7 -14
  22. package/dist/src/{aimlapi-DaC3qZ-o.js → aimlapi-uPGp0Zdo.js} +7 -16
  23. package/dist/src/app/app/tsconfig.app.tsbuildinfo +1 -0
  24. package/dist/src/app/assets/Report-vjzrbgce.js +1 -0
  25. package/dist/src/app/assets/index-B3NQ8HTd.js +385 -0
  26. package/dist/src/app/assets/index-Cli2yAXv.css +1 -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 +32 -7
  35. package/dist/src/{audio-Bn44pQxv.js → audio-BvpTOArF.js} +4 -4
  36. package/dist/src/{audio-DVFjQ67_.cjs → audio-C0vDeS0j.cjs} +4 -4
  37. package/dist/src/{audio-DjU9GswO.js → audio-CScmnmEB.js} +4 -5
  38. package/dist/src/{audio-DDA5WHdx.js → audio-Da8U9IS5.js} +4 -4
  39. package/dist/src/{base-CKjwebIH.js → base-BOMaNEes.js} +3 -3
  40. package/dist/src/{base-CqzQ4K8j.js → base-BTux96b1.js} +3 -3
  41. package/dist/src/{base-BboXIF_0.cjs → base-Tw6uhH8K.cjs} +3 -3
  42. package/dist/src/{base-Cz2ZC_iA.js → base-dYsl2hmL.js} +3 -3
  43. package/dist/src/{blobs-C6j0bvFz.cjs → blobs-B95F_7vE.cjs} +3 -3
  44. package/dist/src/{blobs-DXTl6J3H.js → blobs-BW4U31ue.js} +3 -3
  45. package/dist/src/{blobs-BUWmKWzo.js → blobs-D_gg8nbm.js} +4 -4
  46. package/dist/src/{blobs-B1JriOyi.js → blobs-DjLby-uP.js} +4 -4
  47. package/dist/src/cache-BI5BY7ey.js +280 -0
  48. package/dist/src/cache-BRkhlH3k.cjs +3 -0
  49. package/dist/src/cache-BlC6aeJ0.js +3 -0
  50. package/dist/src/cache-Bzttsk0X.js +310 -0
  51. package/dist/src/cache-Cr-qWIbP.js +310 -0
  52. package/dist/src/cache-DGg-yTZG.cjs +376 -0
  53. package/dist/src/{chat-BEwdgGEg.js → chat-BLOdH60v.js} +63 -37
  54. package/dist/src/{chat-B0iaWhoh.js → chat-Cx_LkwvZ.js} +63 -37
  55. package/dist/src/{chat-DK1U-eZ-.js → chat-D9nudO9b.js} +5 -14
  56. package/dist/src/{chat-pxmiVpWe.js → chat-DChSH_Es.js} +63 -37
  57. package/dist/src/{chat-B-52XYI1.js → chat-DG2LkwLq.js} +3 -13
  58. package/dist/src/{chat-BtIKkLKx.cjs → chat-DH97tVV9.cjs} +3 -13
  59. package/dist/src/{chat-BE0qTA8e.js → chat-aMQZw6R7.js} +4 -16
  60. package/dist/src/{chat-CM8qWR3_.cjs → chat-vYqqv1gP.cjs} +64 -38
  61. package/dist/src/{chatkit-_8eJqKcD.js → chatkit-B8X34dQc.js} +4 -4
  62. package/dist/src/{chatkit-BYGQlHlV.js → chatkit-BXu42Qwt.js} +4 -4
  63. package/dist/src/{chatkit-a2D6mY6s.js → chatkit-CbMRoeYw.js} +4 -4
  64. package/dist/src/{chatkit-Cx174XI3.cjs → chatkit-D44VyUyB.cjs} +4 -4
  65. package/dist/src/{claude-agent-sdk-8ddRp1L2.cjs → claude-agent-sdk-BRq0bbIK.cjs} +23 -18
  66. package/dist/src/{claude-agent-sdk-CMjh4LFH.js → claude-agent-sdk-BjriSVRZ.js} +20 -15
  67. package/dist/src/{claude-agent-sdk-HgbFioFw.js → claude-agent-sdk-BzNZeZ0N.js} +20 -15
  68. package/dist/src/{claude-agent-sdk-Bq5EArsX.js → claude-agent-sdk-DYv_AJ8u.js} +21 -17
  69. package/dist/src/cloud-CoD5OacT.js +3 -0
  70. package/dist/src/{cloud-z8KZpUoa.js → cloud-Da0bofJd.js} +25 -13
  71. package/dist/src/{cloudflare-ai-Bbp26N0L.js → cloudflare-ai-CXC4b1EU.js} +5 -14
  72. package/dist/src/{cloudflare-ai-BGyXlpXJ.js → cloudflare-ai-CyBoIs1Q.js} +7 -15
  73. package/dist/src/{cloudflare-ai-DdKP9TKT.js → cloudflare-ai-DGOwgexC.js} +6 -17
  74. package/dist/src/{cloudflare-ai-C62x6MQG.cjs → cloudflare-ai-DJv5qnyb.cjs} +6 -15
  75. package/dist/src/{cloudflare-gateway-DXhtXDRb.js → cloudflare-gateway-1sAoOyft.js} +6 -16
  76. package/dist/src/{cloudflare-gateway-D-e9i1Sn.js → cloudflare-gateway-D-dnkzCF.js} +5 -18
  77. package/dist/src/{cloudflare-gateway-Dx36ftqF.cjs → cloudflare-gateway-DKVjkDav.cjs} +4 -15
  78. package/dist/src/{cloudflare-gateway-BwAaUgeW.js → cloudflare-gateway-TJkVrZlB.js} +4 -15
  79. package/dist/src/codex-app-server-CCLjqCh9.js +1915 -0
  80. package/dist/src/codex-app-server-CCe0TiDc.js +1915 -0
  81. package/dist/src/codex-app-server-CPW1LFwh.js +1916 -0
  82. package/dist/src/codex-app-server-VMRnjZ68.cjs +1920 -0
  83. package/dist/src/codex-sdk-1jm_qPHf.js +3 -0
  84. package/dist/src/codex-sdk-Bd8UbO9q.cjs +1172 -0
  85. package/dist/src/codex-sdk-BgEFQ70r.js +1164 -0
  86. package/dist/src/codex-sdk-Bzb_TqX9.js +1165 -0
  87. package/dist/src/codex-sdk-Danroptg.cjs +2 -0
  88. package/dist/src/codex-sdk-DfvDTN33.js +1165 -0
  89. package/dist/src/{cometapi-BDyV-NNm.js → cometapi-B5ImDlSm.js} +9 -15
  90. package/dist/src/{cometapi-C3hOlM7-.cjs → cometapi-BgAkuYCw.cjs} +9 -16
  91. package/dist/src/{cometapi-hhL4TAh3.js → cometapi-CC7hWxmX.js} +8 -15
  92. package/dist/src/{cometapi-sp7sJpBD.js → cometapi-CCbpHkuF.js} +8 -17
  93. package/dist/src/{completion-DoYy49ti.js → completion-2iuYVxwi.js} +8 -57
  94. package/dist/src/{completion-BCimtq-h.js → completion-CrD6MQ93.js} +8 -57
  95. package/dist/src/{completion-DlXUhj5c.cjs → completion-DtQ72Bm3.cjs} +7 -62
  96. package/dist/src/{completion-DCjv7RZ3.js → completion-Vq_ad618.js} +8 -57
  97. package/dist/src/{createHash-CTQmL3G2.js → createHash-4gFQpDDv.js} +3 -3
  98. package/dist/src/{createHash-Da8fMwqB.js → createHash-DPpsZgFF.js} +3 -3
  99. package/dist/src/{createHash-DmPQkvBh.js → createHash-Un4Q_huE.js} +3 -3
  100. package/dist/src/{createHash-BYwImsYv.cjs → createHash-VvBIc-AW.cjs} +4 -4
  101. package/dist/src/{docker-CxCkwMzc.js → docker--3qzPa-6.js} +6 -14
  102. package/dist/src/{docker-Cqj2-QVi.cjs → docker-D3AY-5F5.cjs} +7 -15
  103. package/dist/src/{docker-FeBni2dw.js → docker-DCsCDvwM.js} +7 -14
  104. package/dist/src/{docker-DpguQj-w.js → docker-Dorv4_Dg.js} +6 -16
  105. package/dist/src/embedding-BXhN5lCH.cjs +63 -0
  106. package/dist/src/embedding-ChS1ivFS.js +58 -0
  107. package/dist/src/embedding-DNRvZwRN.js +59 -0
  108. package/dist/src/embedding-D_bI4NDq.js +58 -0
  109. package/dist/src/entrypoint.js +69 -6
  110. package/dist/src/{errors-P6ll7XSJ.js → errors-DFHe4L-n.js} +1 -1
  111. package/dist/src/{esm-SUNIX1x3.js → esm-B6whoAcf.js} +15 -6
  112. package/dist/src/{esm-CKWP3u_P.js → esm-BRkfNsYs.js} +16 -7
  113. package/dist/src/{esm-7UIl0pPM.js → esm-BX8fwlAO.js} +27 -18
  114. package/dist/src/{esm-CipptfDu.cjs → esm-B_rGuPTo.cjs} +15 -6
  115. package/dist/src/eval-BQPLBJbw.js +3 -0
  116. package/dist/src/{eval-BTqTn7lb.js → eval-DJ_4A-tr.js} +50 -21
  117. package/dist/src/evalResult-BBJAHAtw.cjs +2 -0
  118. package/dist/src/evalResult-BBK58h2B.js +3 -0
  119. package/dist/src/{evalResult-DpARzUCb.cjs → evalResult-Cx-8OWkb.cjs} +29 -11
  120. package/dist/src/{evalResult-DUDShQrm.js → evalResult-D6P5I5il.js} +29 -11
  121. package/dist/src/{evalResult-BkIhRdTe.js → evalResult-pSvGWFMo.js} +29 -11
  122. package/dist/src/evalResult-spPqh1G_.js +2 -0
  123. package/dist/src/{evaluator-BcvOGaam.js → evaluator-D-UIbbYq.js} +3975 -2152
  124. package/dist/src/evaluator-DgLKaZk8.js +3 -0
  125. package/dist/src/{extractor-D_wd8jxt.js → extractor-BM3jRERL.js} +6 -6
  126. package/dist/src/{extractor-DG3sSfXE.cjs → extractor-Dxr2J_wK.cjs} +6 -6
  127. package/dist/src/{extractor-CAZ2G3Kh.js → extractor-DxyiFhPk.js} +6 -6
  128. package/dist/src/{extractor-C8XwivI9.js → extractor-YlZbUMsL.js} +6 -6
  129. package/dist/src/fetch-8viavNv8.js +3 -0
  130. package/dist/src/{fetch-DoVRJZhJ.js → fetch-B6ch2nU2.js} +199 -60
  131. package/dist/src/{fetch-CVAtKnI3.js → fetch-D9xxyC1p.js} +404 -252
  132. package/dist/src/{fetch-BnR9wSnm.cjs → fetch-NuqXW1Xb.cjs} +415 -263
  133. package/dist/src/{fetch-BiYv2BZc.js → fetch-Y5qX_kST.js} +222 -70
  134. package/dist/src/{fileExtensions-LcDYkU4v.js → fileExtensions-8CjoL7vB.js} +1 -1
  135. package/dist/src/{fileExtensions-DnqA1y9x.js → fileExtensions-BGh-W-HT.js} +1 -1
  136. package/dist/src/{fileExtensions-bYh77CN8.cjs → fileExtensions-D9h-8Wxg.cjs} +1 -1
  137. package/dist/src/{fileExtensions-Ds-foDzt.js → fileExtensions-DysCsxNG.js} +1 -1
  138. package/dist/src/{formatDuration-DgBVMN65.js → formatDuration-Ch4A7G3o.js} +1 -1
  139. package/dist/src/{genaiTracer-BfxrvSUb.cjs → genaiTracer-BokHC-MW.cjs} +7 -3
  140. package/dist/src/{genaiTracer-C1rxGO8Q.js → genaiTracer-C3ZPQU60.js} +6 -2
  141. package/dist/src/{genaiTracer-70Z8BIuV.js → genaiTracer-CFny3gOy.js} +6 -2
  142. package/dist/src/{genaiTracer-D3fD9dNV.js → genaiTracer-DxODqT9e.js} +6 -2
  143. package/dist/src/golang/wrapper.go +1 -1
  144. package/dist/src/{graders-DG7mhg-b.js → graders-BoUqsCEm.js} +7402 -5699
  145. package/dist/src/{graders-BElhu9ZY.cjs → graders-Bw1wk_21.cjs} +5220 -3437
  146. package/dist/src/graders-C84JI-m5.js +2 -0
  147. package/dist/src/graders-CBbd0K0Q.cjs +2 -0
  148. package/dist/src/graders-CbQqpHSN.js +3 -0
  149. package/dist/src/{graders-RjHF8VfG.js → graders-CgPn32yp.js} +7400 -5697
  150. package/dist/src/{graders-BXAJ0sbS.js → graders-CwrbifOo.js} +6136 -4433
  151. package/dist/src/graders-DS42d3ZG.js +2 -0
  152. package/dist/src/{image-6WQXK8m8.js → image-BeWaInPF.js} +4 -4
  153. package/dist/src/{image-PoF6DN3x.js → image-BmilRNqO.js} +8 -8
  154. package/dist/src/{image--F58eEIn.cjs → image-CxJoa3aW.cjs} +8 -8
  155. package/dist/src/{image-fza3zuKs.cjs → image-D10dNAav.cjs} +4 -4
  156. package/dist/src/{image-DO0RYnjH.js → image-Dr_3I3nK.js} +4 -5
  157. package/dist/src/{image-B8b6f36E.js → image-DsGRlkh7.js} +8 -8
  158. package/dist/src/{image-CoxZp9PZ.js → image-a_SGUobh.js} +8 -8
  159. package/dist/src/{image-xNbw5ph2.js → image-qjO6FWPs.js} +4 -4
  160. package/dist/src/index.cjs +4835 -2582
  161. package/dist/src/index.d.cts +2782 -31
  162. package/dist/src/index.d.ts +2783 -32
  163. package/dist/src/index.js +4817 -2564
  164. package/dist/src/{interactiveCheck-BnMYOjMu.js → interactiveCheck-CCICw2cy.js} +2 -2
  165. package/dist/src/{invariant-BtWWVVhl.js → invariant-B2Rf6avk.js} +1 -1
  166. package/dist/src/{invariant-vgHWClmd.js → invariant-DIYf9sP1.js} +1 -1
  167. package/dist/src/{knowledgeBase-Bi7CmDbx.js → knowledgeBase-BBETc5-S.js} +6 -8
  168. package/dist/src/{knowledgeBase-DqrLX8fy.cjs → knowledgeBase-C8qOo26M.cjs} +6 -8
  169. package/dist/src/{knowledgeBase-DFRXPZl_.js → knowledgeBase-CzAi2rUI.js} +7 -8
  170. package/dist/src/{knowledgeBase-Ce3ofVan.js → knowledgeBase-Dr3Kib7F.js} +6 -10
  171. package/dist/src/{litellm-CKiAxnoM.js → litellm-BLSiANhk.js} +6 -14
  172. package/dist/src/{litellm-CnHI69aj.cjs → litellm-CaUmV7Mk.cjs} +6 -15
  173. package/dist/src/{litellm-Tc294Jhj.js → litellm-DQGo_juI.js} +5 -14
  174. package/dist/src/{litellm-Bo2gQXpo.js → litellm-DRc4qWfc.js} +5 -16
  175. package/dist/src/{logger-BcJBzSSA.js → logger-BbY6ypFL.js} +41 -12
  176. package/dist/src/{logger-D5iKBpu_.cjs → logger-COuQb2xB.cjs} +51 -10
  177. package/dist/src/{logger-DO8_zM18.js → logger-Ct2S6Yx-.js} +40 -11
  178. package/dist/src/{logger-BnkjG2jt.js → logger-KD8JjCRJ.js} +41 -12
  179. package/dist/src/{luma-ray-C9q8rdQe.js → luma-ray-B-tNZzqW.js} +6 -10
  180. package/dist/src/{luma-ray-DP0QA9qn.js → luma-ray-CtS3OlGq.js} +6 -10
  181. package/dist/src/{luma-ray-0ehMPt5N.js → luma-ray-PJJgUjOc.js} +6 -11
  182. package/dist/src/{luma-ray-m9Ku2meV.cjs → luma-ray-if-Ml4R9.cjs} +6 -10
  183. package/dist/src/main.d.ts +1 -26
  184. package/dist/src/main.js +1188 -679
  185. package/dist/src/messages-B9dSjrNf.js +544 -0
  186. package/dist/src/messages-BnsVHUnm.cjs +558 -0
  187. package/dist/src/messages-CI69Lasb.js +543 -0
  188. package/dist/src/messages-CewuNcNS.js +543 -0
  189. package/dist/src/{meteor-DLZZ3osF.cjs → meteor-BBGcGeCa.cjs} +1 -1
  190. package/dist/src/{meteor-DUiCJRC-.js → meteor-BKTM-7KS.js} +1 -1
  191. package/dist/src/{meteor-44VjEACX.js → meteor-CeGo0Lu2.js} +2 -2
  192. package/dist/src/{meteor-D-SotUw9.js → meteor-Wc_aUVvu.js} +2 -2
  193. package/dist/src/{modelslab-B5J-ZM5c.js → modelslab-BCLOtfek.js} +8 -10
  194. package/dist/src/{modelslab-IQbNg-r7.cjs → modelslab-BkapYJhh.cjs} +7 -10
  195. package/dist/src/{modelslab-BTOT8FUO.js → modelslab-D73OnKSx.js} +7 -10
  196. package/dist/src/{modelslab-BI458moT.js → modelslab-zpz9JcK0.js} +7 -12
  197. package/dist/src/{nova-reel-BZ9y-Y5s.js → nova-reel-B8F_TK5w.js} +7 -10
  198. package/dist/src/{nova-reel-Xw1SXLpg.js → nova-reel-Bx0NFV2f.js} +6 -10
  199. package/dist/src/{nova-reel-DEeQlnOJ.js → nova-reel-CNGJTLtG.js} +6 -12
  200. package/dist/src/{nova-reel-CE5etkv9.cjs → nova-reel-DkT7tnoB.cjs} +6 -10
  201. package/dist/src/{nova-sonic-Ogqf-csn.js → nova-sonic-BaXRN1cr.js} +5 -7
  202. package/dist/src/{nova-sonic-DXTLpi-r.js → nova-sonic-BeTRaFOh.js} +4 -7
  203. package/dist/src/{nova-sonic-DWswpN1E.js → nova-sonic-CL7Zqv0G.js} +4 -9
  204. package/dist/src/{nova-sonic-N0yCm0vb.cjs → nova-sonic-YT426juD.cjs} +4 -7
  205. package/dist/src/{openai-BcB5KlTk.js → openai-BMHD2Huo.js} +6 -3
  206. package/dist/src/{openai-BMcwgD5C.js → openai-BT-JvDse.js} +6 -3
  207. package/dist/src/{openai-CoxGAQwn.cjs → openai-Cy1XLs0c.cjs} +6 -3
  208. package/dist/src/{openai-D6wITiVn.js → openai-D4fxGvRx.js} +6 -3
  209. package/dist/src/openclaw-Bq7RVR3k.js +1200 -0
  210. package/dist/src/openclaw-DA8U4DsD.js +1201 -0
  211. package/dist/src/openclaw-DObVgpjC.js +1200 -0
  212. package/dist/src/openclaw-DUBZP3GL.cjs +1206 -0
  213. package/dist/src/{opencode-sdk-CHCs7dEb.js → opencode-sdk-BB40Wir1.js} +6 -8
  214. package/dist/src/{opencode-sdk-DDxj4QqH.js → opencode-sdk-BM1UAIv1.js} +6 -8
  215. package/dist/src/{opencode-sdk-WWJhnbKr.cjs → opencode-sdk-CeqiOcOU.cjs} +7 -9
  216. package/dist/src/{opencode-sdk-C71Z0ehR.js → opencode-sdk-ChdK7F7z.js} +6 -9
  217. package/dist/src/{otlpReceiver-CZL48YfC.js → otlpReceiver-C6thJRXi.js} +154 -98
  218. package/dist/src/{otlpReceiver-C9KlUtxh.js → otlpReceiver-CcdIikOu.js} +154 -98
  219. package/dist/src/{otlpReceiver-DHKqJlsz.cjs → otlpReceiver-DNSQj6bf.cjs} +154 -98
  220. package/dist/src/{otlpReceiver-CavGAA6k.js → otlpReceiver-UYMQx3sy.js} +154 -98
  221. package/dist/src/{providerRegistry-BkzVH5Ba.js → providerRegistry-1gB5vtzQ.js} +2 -2
  222. package/dist/src/{providerRegistry-BTDgfV5h.cjs → providerRegistry-BESeALrr.cjs} +2 -2
  223. package/dist/src/{providerRegistry-CUWki5mQ.js → providerRegistry-DoACwqhD.js} +2 -2
  224. package/dist/src/{providerRegistry-B9lh-_tx.js → providerRegistry-PMsleEzs.js} +2 -2
  225. package/dist/src/providers-BuyzKt7C.js +2 -0
  226. package/dist/src/providers-C7lNVBjX.cjs +3 -0
  227. package/dist/src/providers-CCE2COJi2.js +2 -0
  228. package/dist/src/{providers-Cn73d5sr.js → providers-CJh7iriU.js} +17180 -16823
  229. package/dist/src/providers-Ctcc592x.js +3 -0
  230. package/dist/src/{providers-DvddrgxL.js → providers-DRrerKra.js} +1052 -695
  231. package/dist/src/{providers-Ch6Mr0gn.js → providers-DT-GtF2t.js} +16716 -16359
  232. package/dist/src/{providers-CScd1wN6.cjs → providers-eDShy16E.cjs} +19893 -19506
  233. package/dist/src/python/persistent_wrapper.py +0 -5
  234. package/dist/src/{pythonUtils-Cpo0Ez1p.js → pythonUtils-C4tltmIn.js} +4 -4
  235. package/dist/src/{pythonUtils-dAVigVK-.cjs → pythonUtils-CoLaCwNY.cjs} +4 -4
  236. package/dist/src/{pythonUtils-Bzwbgpbg.js → pythonUtils-DMO68Jg7.js} +3 -3
  237. package/dist/src/{pythonUtils-wIqk7zAf.js → pythonUtils-DNqbnRdx.js} +3 -3
  238. package/dist/src/{quiverai-BeofbLVc.js → quiverai-BSS9a7wV.js} +4 -4
  239. package/dist/src/{quiverai-DVSEqJiq.js → quiverai-Bk1KrvL6.js} +4 -4
  240. package/dist/src/{quiverai-CcUhPIBg.cjs → quiverai-Bpx6MZ7T.cjs} +4 -4
  241. package/dist/src/{quiverai-CCQn73lq.js → quiverai-CPKhWgaT.js} +4 -5
  242. package/dist/src/render-7uNJ2V14.js +135 -0
  243. package/dist/src/render-DlscvAUJ.js +135 -0
  244. package/dist/src/render-eui5p5mL.js +136 -0
  245. package/dist/src/{render-BHl6QVq9.js → render-nj-UaPdn.js} +2 -3
  246. package/dist/src/render-tG6ir9_g.cjs +165 -0
  247. package/dist/src/{responses-CgNyTPsY.js → responses-1ztiVYsx.js} +56 -17
  248. package/dist/src/{responses-BKP_WYis.js → responses-B8haB-mD.js} +56 -17
  249. package/dist/src/{responses-CQb1Tj69.js → responses-BiaBguAu.js} +56 -17
  250. package/dist/src/{responses-mo0KQDbu.cjs → responses-CF-ayauu.cjs} +56 -17
  251. package/dist/src/rubyUtils-4hjGxvju.js +3 -0
  252. package/dist/src/{rubyUtils-DECSbsfY.js → rubyUtils-BI0p46eZ.js} +3 -3
  253. package/dist/src/{rubyUtils-CiVfln3g.js → rubyUtils-CIQFnVz4.js} +3 -3
  254. package/dist/src/rubyUtils-CO-tuszQ.cjs +2 -0
  255. package/dist/src/{rubyUtils-PgU-gHmx.js → rubyUtils-DGnoCYL2.js} +4 -4
  256. package/dist/src/{rubyUtils-CGeUtCfW.cjs → rubyUtils-DoifqkiA.cjs} +5 -4
  257. package/dist/src/{sagemaker-CqeASYE5.js → sagemaker-BDLeW29y.js} +14 -18
  258. package/dist/src/{sagemaker-MUbD5V3v.js → sagemaker-C5T60MKf.js} +14 -19
  259. package/dist/src/{sagemaker-CVv8W7so.js → sagemaker-ClS_NB07.js} +14 -18
  260. package/dist/src/{sagemaker-jiw1wQa-.cjs → sagemaker-ljtY12VM.cjs} +14 -18
  261. package/dist/src/{scanner-DVDeUz1r.js → scanner-nOCWNIXa.js} +130 -35
  262. package/dist/src/server/golang/wrapper.go +1 -1
  263. package/dist/src/server/index.js +4829 -2529
  264. package/dist/src/server/python/persistent_wrapper.py +0 -5
  265. package/dist/src/{server-BtoCXeXI.cjs → server-BEECpeGG.cjs} +140 -6
  266. package/dist/src/{server-DZ9MtCn0.js → server-ByiF3qlg.js} +129 -9
  267. package/dist/src/{server-Cns05F1j.js → server-ByxbqAcQ.js} +128 -8
  268. package/dist/src/server-C0XKRNB_.cjs +2 -0
  269. package/dist/src/server-C_15p79-.js +3 -0
  270. package/dist/src/{server-CP9qKM40.js → server-gyd6d4Hc.js} +126 -7
  271. package/dist/src/{signal-C3ZTsUgi.js → signal-DTtUuU3l.js} +3 -3
  272. package/dist/src/{slack-DCEV-vWP.js → slack-4zZX1OKP.js} +2 -2
  273. package/dist/src/{slack-94iG3T0s.cjs → slack-BLlsDpfG.cjs} +2 -2
  274. package/dist/src/{slack-BR0HtO3K.js → slack-BPYLQLgb.js} +2 -2
  275. package/dist/src/{slack-2sdpGzbt.js → slack-Bamy_7te.js} +2 -2
  276. package/dist/src/{store-CLyU7AtI.cjs → store-2K0kDi80.cjs} +3 -3
  277. package/dist/src/{store-VB0GP46K.js → store-2OXm_eBY.js} +3 -3
  278. package/dist/src/store-BELqNwvz.js +3 -0
  279. package/dist/src/{store-Cj258DgL.js → store-BPkzEyFM.js} +3 -3
  280. package/dist/src/{store-P8OKm19S.js → store-CPh25336.js} +3 -3
  281. package/dist/src/store-uQZ4AjPe.cjs +2 -0
  282. package/dist/src/{tables-BEIFz2tM.js → tables-BMSOS2Gg.js} +3 -3
  283. package/dist/src/{tables-BdZQEpRz.cjs → tables-CXbaZ9y1.cjs} +3 -3
  284. package/dist/src/{tables-DmzvLbeZ.js → tables-NlvH23ky.js} +3 -3
  285. package/dist/src/{tables-kC7R5kiK.js → tables-WgdUZ8Ck.js} +3 -3
  286. package/dist/src/{telemetry-DPXLd7UE.js → telemetry--iqaGyaS.js} +5 -4
  287. package/dist/src/{telemetry-re627Lre.cjs → telemetry-CEQxGnMZ.cjs} +8 -7
  288. package/dist/src/{telemetry-BugWqKiu.js → telemetry-CgdVGV8N.js} +5 -4
  289. package/dist/src/{telemetry-BnH5VJAU.js → telemetry-DWdGHvEf.js} +5 -4
  290. package/dist/src/telemetry-DjNoC_n3.cjs +2 -0
  291. package/dist/src/telemetry-ZdPZc0fm.js +3 -0
  292. package/dist/src/{text-CW1cyrwj.cjs → text-BiNME7QG.cjs} +1 -1
  293. package/dist/src/{text-Db-Wt2u2.js → text-D4lz-Jg_.js} +1 -1
  294. package/dist/src/{text-TIv0QYnd.js → text-DDQP0tuQ.js} +1 -1
  295. package/dist/src/{text-B_UCRPp2.js → text-NWvfMfkF.js} +1 -1
  296. package/dist/src/{tokenUsageUtils-DflFMjS0.js → tokenUsageUtils-2wIvAhB3.js} +7 -3
  297. package/dist/src/{tokenUsageUtils-BDGe-iyI.js → tokenUsageUtils-4c780gFd.js} +7 -3
  298. package/dist/src/{tokenUsageUtils-NYT-WKS6.js → tokenUsageUtils-BjVkdk18.js} +7 -3
  299. package/dist/src/{tokenUsageUtils-bVa1ga6f.cjs → tokenUsageUtils-C9odhsbW.cjs} +7 -3
  300. package/dist/src/{transcription-CaMivnjG.js → transcription-84t4ALo2.js} +7 -11
  301. package/dist/src/{transcription-Hb3VnC4M.js → transcription-Bm2emLmJ.js} +8 -11
  302. package/dist/src/{transcription-BvtsrzRG.cjs → transcription-CZ4LG5hQ.cjs} +9 -13
  303. package/dist/src/{transcription-DOMMTu01.js → transcription-D7Q0vJsh.js} +7 -13
  304. package/dist/src/{transform-DrleutM3.js → transform-B-b6Cq-q.js} +8 -6
  305. package/dist/src/transform-BQt0BeAW.js +3 -0
  306. package/dist/src/transform-Bq5oqC0s.cjs +2 -0
  307. package/dist/src/{transform-ZrG2dvlo.cjs → transform-C9izGX54.cjs} +5 -5
  308. package/dist/src/{transform-BzK09Q_9.js → transform-CwbAZ84V.js} +5 -5
  309. package/dist/src/{transform-0BwoBsvO.cjs → transform-Dg4LcO1Y.cjs} +18 -10
  310. package/dist/src/{transform-B2-jIv68.js → transform-DtooZqYY.js} +8 -6
  311. package/dist/src/{transform-ljLYHEPh.js → transform-DzCF-wqV.js} +5 -5
  312. package/dist/src/{transform-DyDAwEpE.js → transform-_DpNB4qp.js} +9 -7
  313. package/dist/src/{transform-BqPkNPYm.js → transform-eGiUAv86.js} +5 -5
  314. package/dist/src/{transformersAvailability-DKoRtQLy.cjs → transformersAvailability-B22swDxr.cjs} +1 -1
  315. package/dist/src/{transformersAvailability-BGkzavwb.js → transformersAvailability-lvCCvuPT.js} +1 -1
  316. package/dist/src/{transformersAvailability-D6c6ROpT.js → transformersAvailability-rJGPccjr.js} +1 -1
  317. package/dist/src/{types-Cd3ygw8W.js → types-BDjGOq4E.js} +354 -24
  318. package/dist/src/{types-CIhFeUC4.js → types-BVH9hjgW.js} +364 -23
  319. package/dist/src/{types-D8cGDZbL.cjs → types-CgG2rKiW.cjs} +534 -167
  320. package/dist/src/{types-q8GXGF65.js → types-DNRZVOue.js} +498 -167
  321. package/dist/src/{util-BLvy9qfE.js → util-3pBZZb_H.js} +151 -149
  322. package/dist/src/{util-CFj4YKIn.cjs → util-A5_ZsQUn.cjs} +66 -44
  323. package/dist/src/{util-BtoGs5Cb.js → util-B9CNhyac.js} +66 -44
  324. package/dist/src/{util-Bm3E9jpK.js → util-BQOCAHQC.js} +692 -690
  325. package/dist/src/{util-vNmDL5DT.js → util-BVXcTwXu.js} +138 -36
  326. package/dist/src/{util-CgDCK4KI.js → util-BlFVL0UF.js} +66 -44
  327. package/dist/src/{util-DM2rTn_6.js → util-C-kmRosx.js} +66 -44
  328. package/dist/src/{util-DbVG-yZU.js → util-DFPeFkiV.js} +138 -36
  329. package/dist/src/{util-DMFeUvLz.js → util-DN0-b81k.js} +138 -36
  330. package/dist/src/{util--9u9UVCt.cjs → util-Dpmm_dAI.cjs} +143 -35
  331. package/dist/src/{util-CMMkIxfU.js → util-Dub0f_ej.js} +693 -691
  332. package/dist/src/{util-CuLo2pMR.cjs → util-DvpHnLt0.cjs} +714 -719
  333. package/dist/src/{utils-DOjD4dTC.js → utils-BUMN8orw.js} +6 -4
  334. package/dist/src/{utils-DKw8mrgr.cjs → utils-DkVeShIB.cjs} +6 -4
  335. package/dist/src/{utils-DEuL4VNB.js → utils-kt7lv30R.js} +6 -4
  336. package/dist/src/{utils-CFxO9KGo.js → utils-o8S5huU2.js} +6 -4
  337. package/dist/src/version-0frU0UTr.js +16 -0
  338. package/dist/src/version-CbpiUINz.js +17 -0
  339. package/dist/src/version-CbuBKu2U.js +16 -0
  340. package/dist/src/version-D9zu9FWB.cjs +27 -0
  341. package/dist/tsconfig.tsbuildinfo +1 -1
  342. package/package.json +57 -46
  343. package/dist/src/app/assets/index-B6l9CVVb.js +0 -439
  344. package/dist/src/app/assets/index-DyZ0Ep37.css +0 -1
  345. package/dist/src/app/assets/scroll-timeline-BdJZVXlz.js +0 -1
  346. package/dist/src/app/assets/sync-CStkzc6u.js +0 -4
  347. package/dist/src/app/assets/vendor-charts-BnDWwBlI.js +0 -36
  348. package/dist/src/app/assets/vendor-markdown-Bz7N-ca6.js +0 -29
  349. package/dist/src/app/assets/vendor-react-AtKqiNEf.js +0 -4
  350. package/dist/src/app/assets/vendor-syntax-D06x6TQF.js +0 -2
  351. package/dist/src/app/assets/vendor-utils-BvMHZmO7.js +0 -37
  352. package/dist/src/cache-C5yFZ4gC.cjs +0 -816
  353. package/dist/src/cache-CaT5tPgo.js +0 -756
  354. package/dist/src/cache-CyCanoMu.js +0 -6
  355. package/dist/src/cache-DSqR6ezl.js +0 -726
  356. package/dist/src/cache-Df_QFDNu.cjs +0 -5
  357. package/dist/src/cache-HP0NP4k3.js +0 -756
  358. package/dist/src/cloud-DE3t1-ZI.js +0 -4
  359. package/dist/src/codex-sdk-BQEw16R_.js +0 -834
  360. package/dist/src/codex-sdk-C_07GuVS.js +0 -834
  361. package/dist/src/codex-sdk-DE5G18dx.js +0 -835
  362. package/dist/src/codex-sdk-ZLKfDjqP.cjs +0 -838
  363. package/dist/src/eval-7aEqoMs3.js +0 -15
  364. package/dist/src/evalResult-CYNHkk5A.js +0 -12
  365. package/dist/src/evalResult-CuvJeNiM.js +0 -10
  366. package/dist/src/evalResult-tGdilrWt.cjs +0 -10
  367. package/dist/src/evaluator-BBUqRhz1.js +0 -36
  368. package/dist/src/fetch-UWU706qb.js +0 -5
  369. package/dist/src/graders-BxfEguVY.js +0 -32
  370. package/dist/src/graders-CzVMbEnv.js +0 -34
  371. package/dist/src/graders-DjCXfj0l.cjs +0 -32
  372. package/dist/src/graders-kHzIWOKu.js +0 -32
  373. package/dist/src/messages-DJNo37Ko.js +0 -246
  374. package/dist/src/messages-Dy9QecMs.js +0 -245
  375. package/dist/src/messages-HJsyEh4o.cjs +0 -257
  376. package/dist/src/messages-biC_ex-p.js +0 -245
  377. package/dist/src/openclaw-0Sv7AK3O.js +0 -580
  378. package/dist/src/openclaw-CXxbKgDH.cjs +0 -586
  379. package/dist/src/openclaw-D1FSCps-.js +0 -580
  380. package/dist/src/openclaw-D2ENvu7a.js +0 -582
  381. package/dist/src/providers-BSLEaIQG.js +0 -32
  382. package/dist/src/providers-D-FnDg8k.cjs +0 -31
  383. package/dist/src/providers-DEYiFVAo.js +0 -30
  384. package/dist/src/providers-sS2WI8YD.js +0 -30
  385. package/dist/src/rubyUtils-B1HXG4ej.cjs +0 -4
  386. package/dist/src/rubyUtils-Rt6pKA96.js +0 -5
  387. package/dist/src/server-B0Xh1Gx-.js +0 -7
  388. package/dist/src/server-DJTKu9IR.cjs +0 -5
  389. package/dist/src/store-C5u6MgC8.js +0 -6
  390. package/dist/src/store-CNHk-De4.cjs +0 -5
  391. package/dist/src/telemetry-Yig0Tino.js +0 -7
  392. package/dist/src/telemetry-p8Pwqm1i.cjs +0 -5
  393. package/dist/src/transform-ChNIpHz7.js +0 -6
  394. package/dist/src/transform-PtQ6rAE3.cjs +0 -5
@@ -1,16 +1,17 @@
1
- const require_logger = require("./logger-D5iKBpu_.cjs");
1
+ const require_logger = require("./logger-COuQb2xB.cjs");
2
2
  const require_invariant = require("./invariant-kfQ8Bu82.cjs");
3
+ const require_version = require("./version-D9zu9FWB.cjs");
3
4
  let fs = require("fs");
4
5
  fs = require_logger.__toESM(fs);
5
6
  let path = require("path");
6
7
  path = require_logger.__toESM(path);
7
8
  let js_yaml = require("js-yaml");
8
9
  js_yaml = require_logger.__toESM(js_yaml);
9
- let util = require("util");
10
10
  let fs_promises = require("fs/promises");
11
11
  fs_promises = require_logger.__toESM(fs_promises);
12
12
  let proxy_from_env = require("proxy-from-env");
13
13
  let undici = require("undici");
14
+ let util = require("util");
14
15
  let zlib = require("zlib");
15
16
  //#region src/providers/constants.ts
16
17
  const FILE_METADATA_KEY = "_promptfooFileMetadata";
@@ -19,19 +20,6 @@ const FILE_METADATA_KEY = "_promptfooFileMetadata";
19
20
  * Used to distinguish human ratings from automated assertions.
20
21
  */
21
22
  const HUMAN_ASSERTION_TYPE = "human";
22
- //#endregion
23
- //#region src/version.ts
24
- /**
25
- * Application version from package.json.
26
- * Injected at build time, or read from npm environment in development.
27
- */
28
- const VERSION = "0.121.3";
29
- /**
30
- * PostHog analytics key.
31
- * Only populated during production builds via PROMPTFOO_POSTHOG_KEY env var.
32
- * Empty string in development/test.
33
- */
34
- const POSTHOG_KEY = "phc_E5n5uHnDo2eREJL1uqX1cIlbkoRby4yFWt3V94HqRRg";
35
23
  function getShareApiBaseUrl() {
36
24
  return require_logger.getEnvString("PROMPTFOO_REMOTE_API_BASE_URL") || "https://api.promptfoo.app";
37
25
  }
@@ -47,6 +35,220 @@ const CONSENT_ENDPOINT = "https://api.promptfoo.dev/consent";
47
35
  const EVENTS_ENDPOINT = "https://a.promptfoo.app";
48
36
  const R_ENDPOINT = "https://r.promptfoo.app/";
49
37
  //#endregion
38
+ //#region src/globalConfig/globalConfig.ts
39
+ /**
40
+ * Functions for manipulating the global configuration file, which lives at
41
+ * ~/.promptfoo/promptfoo.yaml by default.
42
+ */
43
+ function writeGlobalConfig(config) {
44
+ fs.writeFileSync(path.join(require_logger.getConfigDirectoryPath(true), "promptfoo.yaml"), js_yaml.default.dump(config));
45
+ }
46
+ function readGlobalConfig() {
47
+ const configDir = require_logger.getConfigDirectoryPath();
48
+ const configFilePath = path.join(configDir, "promptfoo.yaml");
49
+ let globalConfig = { id: crypto.randomUUID() };
50
+ if (fs.existsSync(configFilePath)) {
51
+ globalConfig = js_yaml.default.load(fs.readFileSync(configFilePath, "utf-8")) || {};
52
+ if (!globalConfig?.id) {
53
+ globalConfig = {
54
+ ...globalConfig,
55
+ id: crypto.randomUUID()
56
+ };
57
+ writeGlobalConfig(globalConfig);
58
+ }
59
+ } else {
60
+ if (!fs.existsSync(configDir)) fs.mkdirSync(configDir, { recursive: true });
61
+ fs.writeFileSync(configFilePath, js_yaml.default.dump(globalConfig));
62
+ }
63
+ return globalConfig;
64
+ }
65
+ /**
66
+ * Merges the top-level keys into existing config.
67
+ * @param partialConfig New keys to merge into the existing config.
68
+ */
69
+ function writeGlobalConfigPartial(partialConfig) {
70
+ const updatedConfig = { ...readGlobalConfig() };
71
+ Object.entries(partialConfig).forEach(([key, value]) => {
72
+ if (value !== void 0 && value !== null) updatedConfig[key] = value;
73
+ else delete updatedConfig[key];
74
+ });
75
+ writeGlobalConfig(updatedConfig);
76
+ }
77
+ const API_HOST = require_logger.getEnvString("API_HOST", "https://api.promptfoo.app");
78
+ const SHARING_CUTOFF_DATE = /* @__PURE__ */ new Date("2026-03-09T00:00:00Z");
79
+ var CloudConfig = class {
80
+ config;
81
+ constructor() {
82
+ const savedConfig = readGlobalConfig()?.cloud || {};
83
+ this.config = {
84
+ appUrl: savedConfig.appUrl || "https://www.promptfoo.app",
85
+ apiHost: savedConfig.apiHost,
86
+ apiKey: savedConfig.apiKey,
87
+ sharing: savedConfig.sharing,
88
+ currentOrganizationId: savedConfig.currentOrganizationId,
89
+ currentTeamId: savedConfig.currentTeamId,
90
+ teams: savedConfig.teams
91
+ };
92
+ }
93
+ /**
94
+ * Returns the API key from config file or PROMPTFOO_API_KEY environment variable.
95
+ * Config file takes precedence over environment variable.
96
+ */
97
+ resolveApiKey() {
98
+ return this.config.apiKey || process.env.PROMPTFOO_API_KEY;
99
+ }
100
+ /**
101
+ * Returns the API host from config file, PROMPTFOO_CLOUD_API_URL environment variable,
102
+ * or defaults to the standard cloud API host.
103
+ * Config file takes precedence over environment variable.
104
+ */
105
+ resolveApiHost() {
106
+ return this.config.apiHost || process.env.PROMPTFOO_CLOUD_API_URL || API_HOST;
107
+ }
108
+ isEnabled() {
109
+ return !!this.resolveApiKey();
110
+ }
111
+ setApiHost(apiHost) {
112
+ this.config.apiHost = apiHost;
113
+ this.saveConfig();
114
+ }
115
+ setApiKey(apiKey) {
116
+ this.config.apiKey = apiKey;
117
+ this.saveConfig();
118
+ }
119
+ getApiKey() {
120
+ return this.resolveApiKey();
121
+ }
122
+ getApiHost() {
123
+ return this.resolveApiHost();
124
+ }
125
+ setAppUrl(appUrl) {
126
+ this.config.appUrl = appUrl;
127
+ this.saveConfig();
128
+ }
129
+ getAppUrl() {
130
+ return this.config.appUrl;
131
+ }
132
+ getSharing() {
133
+ return this.config.sharing;
134
+ }
135
+ /**
136
+ * Sets the sharing preference. Note: this value is only updated at authentication time
137
+ * (via `validateAndSetApiToken`) and may become stale if the user's license status
138
+ * changes between re-authentications.
139
+ */
140
+ setSharing(sharing) {
141
+ this.config.sharing = sharing;
142
+ this.saveConfig();
143
+ }
144
+ delete() {
145
+ writeGlobalConfigPartial({ cloud: {} });
146
+ this.reload();
147
+ }
148
+ saveConfig() {
149
+ writeGlobalConfigPartial({ cloud: this.config });
150
+ this.reload();
151
+ }
152
+ reload() {
153
+ const savedConfig = readGlobalConfig()?.cloud || {};
154
+ this.config = {
155
+ appUrl: savedConfig.appUrl || "https://www.promptfoo.app",
156
+ apiHost: savedConfig.apiHost,
157
+ apiKey: savedConfig.apiKey,
158
+ sharing: savedConfig.sharing,
159
+ currentOrganizationId: savedConfig.currentOrganizationId,
160
+ currentTeamId: savedConfig.currentTeamId,
161
+ teams: savedConfig.teams
162
+ };
163
+ }
164
+ saveValidatedApiToken(token, apiHost, user, app, hasActiveLicense) {
165
+ this.setApiKey(token);
166
+ this.setApiHost(apiHost);
167
+ this.setAppUrl(app.url);
168
+ if (typeof hasActiveLicense === "boolean") {
169
+ const createdAt = user?.createdAt ? new Date(user.createdAt) : null;
170
+ const isGrandfathered = createdAt != null && createdAt < SHARING_CUTOFF_DATE;
171
+ this.setSharing(hasActiveLicense || isGrandfathered);
172
+ }
173
+ }
174
+ async validateApiToken(token, apiHost) {
175
+ try {
176
+ const { fetchWithProxy } = await Promise.resolve().then(() => fetch_exports);
177
+ const response = await fetchWithProxy(`${apiHost}/api/v1/users/me`, { headers: { Authorization: `Bearer ${token}` } });
178
+ if (!response.ok) {
179
+ const errorMessage = await response.text();
180
+ require_logger.logger.error(`[Cloud] Failed to validate API token: ${errorMessage}. HTTP Status: ${response.status} - ${response.statusText}.`);
181
+ throw new Error("Failed to validate API token: " + response.statusText);
182
+ }
183
+ const { user, organization, app, hasActiveLicense } = await response.json();
184
+ return {
185
+ user,
186
+ organization,
187
+ app,
188
+ ...typeof hasActiveLicense === "boolean" ? { hasActiveLicense } : {}
189
+ };
190
+ } catch (err) {
191
+ const error = err;
192
+ const errorMessage = error instanceof Error ? error.message : String(error);
193
+ require_logger.logger.error(`[Cloud] Failed to validate API token with host ${apiHost}: ${errorMessage}`);
194
+ if (error.cause) require_logger.logger.error(`Cause: ${error.cause}`);
195
+ throw error;
196
+ }
197
+ }
198
+ async validateAndSetApiToken(token, apiHost) {
199
+ const { user, organization, app, hasActiveLicense } = await this.validateApiToken(token, apiHost);
200
+ this.saveValidatedApiToken(token, apiHost, user, app, hasActiveLicense);
201
+ return {
202
+ user,
203
+ organization,
204
+ app,
205
+ hasActiveLicense: typeof hasActiveLicense === "boolean" ? hasActiveLicense : false
206
+ };
207
+ }
208
+ getCurrentOrganizationId() {
209
+ return this.config.currentOrganizationId;
210
+ }
211
+ setCurrentOrganization(organizationId) {
212
+ this.config.currentOrganizationId = organizationId;
213
+ this.saveConfig();
214
+ }
215
+ getCurrentTeamId(organizationId) {
216
+ if (organizationId) return this.config.teams?.[organizationId]?.currentTeamId;
217
+ return this.config.currentTeamId;
218
+ }
219
+ setCurrentTeamId(teamId, organizationId) {
220
+ if (organizationId) {
221
+ if (!this.config.teams) this.config.teams = {};
222
+ if (!this.config.teams[organizationId]) this.config.teams[organizationId] = {};
223
+ this.config.teams[organizationId].currentTeamId = teamId;
224
+ } else this.config.currentTeamId = teamId;
225
+ this.saveConfig();
226
+ }
227
+ clearCurrentTeamId(organizationId) {
228
+ if (organizationId) {
229
+ if (this.config.teams?.[organizationId]) delete this.config.teams[organizationId].currentTeamId;
230
+ } else delete this.config.currentTeamId;
231
+ this.saveConfig();
232
+ }
233
+ cacheTeams(teams, organizationId) {
234
+ if (organizationId) {
235
+ if (!this.config.teams) this.config.teams = {};
236
+ if (!this.config.teams[organizationId]) this.config.teams[organizationId] = {};
237
+ this.config.teams[organizationId].cache = teams.map((t) => ({
238
+ id: t.id,
239
+ name: t.name,
240
+ slug: t.slug,
241
+ lastFetched: (/* @__PURE__ */ new Date()).toISOString()
242
+ }));
243
+ }
244
+ this.saveConfig();
245
+ }
246
+ getCachedTeams(organizationId) {
247
+ if (organizationId) return this.config.teams?.[organizationId]?.cache;
248
+ }
249
+ };
250
+ const cloudConfig = new CloudConfig();
251
+ //#endregion
50
252
  //#region src/providers/shared.ts
51
253
  /**
52
254
  * The default timeout for API requests in milliseconds.
@@ -71,8 +273,9 @@ function calculateCost(modelName, config, promptTokens, completionTokens, models
71
273
  if (!Number.isFinite(promptTokens) || !Number.isFinite(completionTokens) || typeof promptTokens === "undefined" || typeof completionTokens === "undefined") return;
72
274
  const model = models.find((m) => m.id === modelName);
73
275
  if (!model || !model.cost) return;
74
- const inputCost = config.cost ?? model.cost.input;
75
- const outputCost = config.cost ?? model.cost.output;
276
+ const longContextCost = model.cost.longContext && promptTokens > model.cost.longContext.threshold ? model.cost.longContext : void 0;
277
+ const inputCost = config.cost ?? longContextCost?.input ?? model.cost.input;
278
+ const outputCost = config.cost ?? longContextCost?.output ?? model.cost.output;
76
279
  return inputCost * promptTokens + outputCost * completionTokens;
77
280
  }
78
281
  /**
@@ -149,7 +352,7 @@ function isOpenAIToolChoice(obj) {
149
352
  function openaiToolChoiceToAnthropic(choice) {
150
353
  if (typeof choice === "string") switch (choice) {
151
354
  case "auto": return { type: "auto" };
152
- case "none": return { type: "auto" };
355
+ case "none": return { type: "none" };
153
356
  case "required": return { type: "any" };
154
357
  }
155
358
  return {
@@ -285,213 +488,160 @@ function transformTools(tools, format) {
285
488
  }
286
489
  }
287
490
  //#endregion
288
- //#region src/util/time.ts
289
- function getCurrentTimestamp() {
290
- return Math.floor((/* @__PURE__ */ new Date()).getTime() / 1e3);
291
- }
292
- const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
293
- //#endregion
294
- //#region src/globalConfig/globalConfig.ts
491
+ //#region src/scheduler/headerParser.ts
492
+ const OPENAI_HEADERS = {
493
+ remainingRequests: "x-ratelimit-remaining-requests",
494
+ remainingTokens: "x-ratelimit-remaining-tokens",
495
+ limitRequests: "x-ratelimit-limit-requests",
496
+ limitTokens: "x-ratelimit-limit-tokens",
497
+ resetRequests: "x-ratelimit-reset-requests",
498
+ resetTokens: "x-ratelimit-reset-tokens"
499
+ };
500
+ const ANTHROPIC_HEADERS = {
501
+ remainingRequests: "anthropic-ratelimit-requests-remaining",
502
+ remainingTokens: "anthropic-ratelimit-tokens-remaining",
503
+ limitRequests: "anthropic-ratelimit-requests-limit",
504
+ limitTokens: "anthropic-ratelimit-tokens-limit",
505
+ reset: "anthropic-ratelimit-requests-reset"
506
+ };
507
+ const STANDARD_HEADERS = {
508
+ remaining: "ratelimit-remaining",
509
+ limit: "ratelimit-limit",
510
+ reset: "ratelimit-reset",
511
+ remainingAlt: "x-ratelimit-remaining",
512
+ limitAlt: "x-ratelimit-limit",
513
+ resetAlt: "x-ratelimit-reset"
514
+ };
295
515
  /**
296
- * Functions for manipulating the global configuration file, which lives at
297
- * ~/.promptfoo/promptfoo.yaml by default.
516
+ * Parse rate limit headers from response.
298
517
  */
299
- function writeGlobalConfig(config) {
300
- fs.writeFileSync(path.join(require_logger.getConfigDirectoryPath(true), "promptfoo.yaml"), js_yaml.default.dump(config));
301
- }
302
- function readGlobalConfig() {
303
- const configDir = require_logger.getConfigDirectoryPath();
304
- const configFilePath = path.join(configDir, "promptfoo.yaml");
305
- let globalConfig = { id: crypto.randomUUID() };
306
- if (fs.existsSync(configFilePath)) {
307
- globalConfig = js_yaml.default.load(fs.readFileSync(configFilePath, "utf-8")) || {};
308
- if (!globalConfig?.id) {
309
- globalConfig = {
310
- ...globalConfig,
311
- id: crypto.randomUUID()
312
- };
313
- writeGlobalConfig(globalConfig);
518
+ function parseRateLimitHeaders(headers) {
519
+ const result = {};
520
+ const h = lowercaseKeys(headers);
521
+ result.remainingRequests = parseFirstMatch(h, [
522
+ OPENAI_HEADERS.remainingRequests,
523
+ ANTHROPIC_HEADERS.remainingRequests,
524
+ STANDARD_HEADERS.remainingAlt,
525
+ STANDARD_HEADERS.remaining
526
+ ]);
527
+ result.remainingTokens = parseFirstMatch(h, [OPENAI_HEADERS.remainingTokens, ANTHROPIC_HEADERS.remainingTokens]);
528
+ result.limitRequests = parseFirstMatch(h, [
529
+ OPENAI_HEADERS.limitRequests,
530
+ ANTHROPIC_HEADERS.limitRequests,
531
+ STANDARD_HEADERS.limitAlt,
532
+ STANDARD_HEADERS.limit
533
+ ]);
534
+ result.limitTokens = parseFirstMatch(h, [OPENAI_HEADERS.limitTokens, ANTHROPIC_HEADERS.limitTokens]);
535
+ for (const name of [
536
+ OPENAI_HEADERS.resetRequests,
537
+ OPENAI_HEADERS.resetTokens,
538
+ ANTHROPIC_HEADERS.reset,
539
+ STANDARD_HEADERS.resetAlt,
540
+ STANDARD_HEADERS.reset
541
+ ]) if (h[name] !== void 0) {
542
+ const parsed = parseResetTime(h[name]);
543
+ if (parsed !== null) {
544
+ result.resetAt = parsed;
545
+ break;
314
546
  }
315
- } else {
316
- if (!fs.existsSync(configDir)) fs.mkdirSync(configDir, { recursive: true });
317
- fs.writeFileSync(configFilePath, js_yaml.default.dump(globalConfig));
318
547
  }
319
- return globalConfig;
548
+ if (h["retry-after-ms"] !== void 0) {
549
+ const ms = parseInt(h["retry-after-ms"], 10);
550
+ if (!isNaN(ms) && ms >= 0) {
551
+ result.retryAfterMs = ms;
552
+ if (result.resetAt === void 0) result.resetAt = Date.now() + ms;
553
+ }
554
+ } else if (h["retry-after"] !== void 0) {
555
+ const parsed = parseRetryAfter(h["retry-after"]);
556
+ if (parsed !== null) {
557
+ result.retryAfterMs = parsed;
558
+ if (result.resetAt === void 0) result.resetAt = Date.now() + parsed;
559
+ }
560
+ }
561
+ return result;
320
562
  }
321
563
  /**
322
- * Merges the top-level keys into existing config.
323
- * @param partialConfig New keys to merge into the existing config.
564
+ * Parse Retry-After header value.
565
+ * Returns duration in milliseconds.
566
+ * Exported for integration use.
324
567
  */
325
- function writeGlobalConfigPartial(partialConfig) {
326
- const updatedConfig = { ...readGlobalConfig() };
327
- Object.entries(partialConfig).forEach(([key, value]) => {
328
- if (value !== void 0 && value !== null) updatedConfig[key] = value;
329
- else delete updatedConfig[key];
330
- });
331
- writeGlobalConfig(updatedConfig);
568
+ function parseRetryAfter(value) {
569
+ const seconds = parseInt(value, 10);
570
+ if (!isNaN(seconds) && seconds >= 0 && String(seconds) === value.trim()) return seconds * 1e3;
571
+ const httpDate = parseHttpDate(value);
572
+ if (httpDate !== null) return Math.max(0, httpDate - Date.now());
573
+ return null;
332
574
  }
333
- const API_HOST = require_logger.getEnvString("API_HOST", "https://api.promptfoo.app");
334
- const SHARING_CUTOFF_DATE = /* @__PURE__ */ new Date("2026-03-09T00:00:00Z");
335
- var CloudConfig = class {
336
- config;
337
- constructor() {
338
- const savedConfig = readGlobalConfig()?.cloud || {};
339
- this.config = {
340
- appUrl: savedConfig.appUrl || "https://www.promptfoo.app",
341
- apiHost: savedConfig.apiHost,
342
- apiKey: savedConfig.apiKey,
343
- sharing: savedConfig.sharing,
344
- currentOrganizationId: savedConfig.currentOrganizationId,
345
- currentTeamId: savedConfig.currentTeamId,
346
- teams: savedConfig.teams
347
- };
348
- }
349
- /**
350
- * Returns the API key from config file or PROMPTFOO_API_KEY environment variable.
351
- * Config file takes precedence over environment variable.
352
- */
353
- resolveApiKey() {
354
- return this.config.apiKey || process.env.PROMPTFOO_API_KEY;
355
- }
356
- /**
357
- * Returns the API host from config file, PROMPTFOO_CLOUD_API_URL environment variable,
358
- * or defaults to the standard cloud API host.
359
- * Config file takes precedence over environment variable.
360
- */
361
- resolveApiHost() {
362
- return this.config.apiHost || process.env.PROMPTFOO_CLOUD_API_URL || API_HOST;
363
- }
364
- isEnabled() {
365
- return !!this.resolveApiKey();
366
- }
367
- setApiHost(apiHost) {
368
- this.config.apiHost = apiHost;
369
- this.saveConfig();
370
- }
371
- setApiKey(apiKey) {
372
- this.config.apiKey = apiKey;
373
- this.saveConfig();
374
- }
375
- getApiKey() {
376
- return this.resolveApiKey();
377
- }
378
- getApiHost() {
379
- return this.resolveApiHost();
380
- }
381
- setAppUrl(appUrl) {
382
- this.config.appUrl = appUrl;
383
- this.saveConfig();
384
- }
385
- getAppUrl() {
386
- return this.config.appUrl;
387
- }
388
- getSharing() {
389
- return this.config.sharing;
390
- }
391
- /**
392
- * Sets the sharing preference. Note: this value is only updated at authentication time
393
- * (via `validateAndSetApiToken`) and may become stale if the user's license status
394
- * changes between re-authentications.
395
- */
396
- setSharing(sharing) {
397
- this.config.sharing = sharing;
398
- this.saveConfig();
399
- }
400
- delete() {
401
- writeGlobalConfigPartial({ cloud: {} });
402
- this.reload();
403
- }
404
- saveConfig() {
405
- writeGlobalConfigPartial({ cloud: this.config });
406
- this.reload();
407
- }
408
- reload() {
409
- const savedConfig = readGlobalConfig()?.cloud || {};
410
- this.config = {
411
- appUrl: savedConfig.appUrl || "https://www.promptfoo.app",
412
- apiHost: savedConfig.apiHost,
413
- apiKey: savedConfig.apiKey,
414
- sharing: savedConfig.sharing,
415
- currentOrganizationId: savedConfig.currentOrganizationId,
416
- currentTeamId: savedConfig.currentTeamId,
417
- teams: savedConfig.teams
418
- };
419
- }
420
- async validateAndSetApiToken(token, apiHost) {
421
- try {
422
- const { fetchWithProxy } = await Promise.resolve().then(() => fetch_exports);
423
- const response = await fetchWithProxy(`${apiHost}/api/v1/users/me`, { headers: { Authorization: `Bearer ${token}` } });
424
- if (!response.ok) {
425
- const errorMessage = await response.text();
426
- require_logger.logger.error(`[Cloud] Failed to validate API token: ${errorMessage}. HTTP Status: ${response.status} - ${response.statusText}.`);
427
- throw new Error("Failed to validate API token: " + response.statusText);
428
- }
429
- const { user, organization, app, hasActiveLicense } = await response.json();
430
- this.setApiKey(token);
431
- this.setApiHost(apiHost);
432
- this.setAppUrl(app.url);
433
- if (typeof hasActiveLicense === "boolean") {
434
- const createdAt = user?.createdAt ? new Date(user.createdAt) : null;
435
- const isGrandfathered = createdAt != null && createdAt < SHARING_CUTOFF_DATE;
436
- this.setSharing(hasActiveLicense || isGrandfathered);
437
- }
438
- return {
439
- user,
440
- organization,
441
- app,
442
- hasActiveLicense: typeof hasActiveLicense === "boolean" ? hasActiveLicense : false
443
- };
444
- } catch (err) {
445
- const error = err;
446
- const errorMessage = error instanceof Error ? error.message : String(error);
447
- require_logger.logger.error(`[Cloud] Failed to validate API token with host ${apiHost}: ${errorMessage}`);
448
- if (error.cause) require_logger.logger.error(`Cause: ${error.cause}`);
449
- throw error;
575
+ function parseFirstMatch(headers, names) {
576
+ for (const name of names) {
577
+ const value = headers[name];
578
+ if (value !== void 0) {
579
+ const num = parseInt(value, 10);
580
+ if (!isNaN(num) && num >= 0) return num;
450
581
  }
451
582
  }
452
- getCurrentOrganizationId() {
453
- return this.config.currentOrganizationId;
454
- }
455
- setCurrentOrganization(organizationId) {
456
- this.config.currentOrganizationId = organizationId;
457
- this.saveConfig();
458
- }
459
- getCurrentTeamId(organizationId) {
460
- if (organizationId) return this.config.teams?.[organizationId]?.currentTeamId;
461
- return this.config.currentTeamId;
462
- }
463
- setCurrentTeamId(teamId, organizationId) {
464
- if (organizationId) {
465
- if (!this.config.teams) this.config.teams = {};
466
- if (!this.config.teams[organizationId]) this.config.teams[organizationId] = {};
467
- this.config.teams[organizationId].currentTeamId = teamId;
468
- } else this.config.currentTeamId = teamId;
469
- this.saveConfig();
470
- }
471
- clearCurrentTeamId(organizationId) {
472
- if (organizationId) {
473
- if (this.config.teams?.[organizationId]) delete this.config.teams[organizationId].currentTeamId;
474
- } else delete this.config.currentTeamId;
475
- this.saveConfig();
476
- }
477
- cacheTeams(teams, organizationId) {
478
- if (organizationId) {
479
- if (!this.config.teams) this.config.teams = {};
480
- if (!this.config.teams[organizationId]) this.config.teams[organizationId] = {};
481
- this.config.teams[organizationId].cache = teams.map((t) => ({
482
- id: t.id,
483
- name: t.name,
484
- slug: t.slug,
485
- lastFetched: (/* @__PURE__ */ new Date()).toISOString()
486
- }));
487
- }
488
- this.saveConfig();
489
- }
490
- getCachedTeams(organizationId) {
491
- if (organizationId) return this.config.teams?.[organizationId]?.cache;
492
- }
493
- };
494
- const cloudConfig = new CloudConfig();
583
+ }
584
+ /**
585
+ * Parse reset time from various formats.
586
+ * Returns absolute Unix timestamp in milliseconds.
587
+ */
588
+ function parseResetTime(value) {
589
+ const durationMs = parseDuration(value);
590
+ if (durationMs !== null) return Date.now() + durationMs;
591
+ const num = parseFloat(value);
592
+ if (!isNaN(num)) if (num < 1e9) return Date.now() + num * 1e3;
593
+ else if (num < 1e10) return num * 1e3;
594
+ else return num;
595
+ const httpDate = parseHttpDate(value);
596
+ if (httpDate !== null) return httpDate;
597
+ return null;
598
+ }
599
+ /**
600
+ * Parse HTTP-date format (RFC 7231).
601
+ */
602
+ function parseHttpDate(value) {
603
+ const timestamp = Date.parse(value);
604
+ if (!isNaN(timestamp)) {
605
+ const now = Date.now();
606
+ const oneYearMs = 365 * 24 * 60 * 60 * 1e3;
607
+ if (timestamp > now - oneYearMs && timestamp < now + oneYearMs) return timestamp;
608
+ }
609
+ return null;
610
+ }
611
+ /**
612
+ * Parse duration strings like "1s", "100ms", "1m30s", "1h30s", "2h15m30s".
613
+ *
614
+ * Supported formats:
615
+ * - Xms (milliseconds)
616
+ * - Xs or X.Xs (seconds)
617
+ * - Xm or XmYs (minutes with optional seconds)
618
+ * - Xh or XhYm or XhYs or XhYmZs (hours with optional minutes/seconds)
619
+ */
620
+ function parseDuration(value) {
621
+ const match = value.match(/^(?:(\d+)h)?(?:(\d+)m(?!s))?(?:(\d+(?:\.\d+)?)(ms|s))?$/);
622
+ if (!match) return null;
623
+ const [, hours, minutes, secondsValue, secondsUnit] = match;
624
+ if (!hours && !minutes && !secondsValue) return null;
625
+ let ms = 0;
626
+ if (hours) ms += parseInt(hours, 10) * 36e5;
627
+ if (minutes) ms += parseInt(minutes, 10) * 6e4;
628
+ if (secondsValue) {
629
+ const num = parseFloat(secondsValue);
630
+ ms += secondsUnit === "ms" ? num : num * 1e3;
631
+ }
632
+ return ms;
633
+ }
634
+ function lowercaseKeys(obj) {
635
+ const result = {};
636
+ for (const [key, value] of Object.entries(obj)) result[key.toLowerCase()] = value;
637
+ return result;
638
+ }
639
+ //#endregion
640
+ //#region src/util/time.ts
641
+ function getCurrentTimestamp() {
642
+ return Math.floor((/* @__PURE__ */ new Date()).getTime() / 1e3);
643
+ }
644
+ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
495
645
  //#endregion
496
646
  //#region src/util/fetch/monkeyPatchFetch.ts
497
647
  const gzipAsync = (0, util.promisify)(zlib.gzip);
@@ -563,9 +713,8 @@ var fetch_exports = /* @__PURE__ */ require_logger.__exportAll({
563
713
  isRateLimited: () => isRateLimited,
564
714
  isTransientError: () => isTransientError
565
715
  });
566
- let cachedAgent = null;
567
- let cachedAgentConcurrency;
568
- let cachedProxyAgents = /* @__PURE__ */ new Map();
716
+ const cachedAgents = /* @__PURE__ */ new Map();
717
+ const cachedProxyAgents = /* @__PURE__ */ new Map();
569
718
  /**
570
719
  * Get the connection pool size for HTTP agents.
571
720
  * Priority: PROMPTFOO_FETCH_CONNECTIONS env var > CLI -j flag > DEFAULT_MAX_CONCURRENCY (4).
@@ -582,36 +731,37 @@ function getConnectionPoolSize() {
582
731
  }
583
732
  function getOrCreateAgent(tlsOptions) {
584
733
  const concurrency = getConnectionPoolSize();
585
- if (cachedAgent && cachedAgentConcurrency !== concurrency) {
586
- if (typeof cachedAgent.close === "function") cachedAgent.close();
587
- cachedAgent = null;
588
- }
589
- if (!cachedAgent) {
590
- cachedAgent = new undici.Agent({
591
- headersTimeout: REQUEST_TIMEOUT_MS,
592
- keepAliveTimeout: 3e4,
593
- keepAliveMaxTimeout: 6e4,
594
- connections: concurrency,
595
- connect: tlsOptions
596
- });
597
- cachedAgentConcurrency = concurrency;
598
- }
599
- return cachedAgent;
734
+ const existing = cachedAgents.get(concurrency);
735
+ if (existing) return existing;
736
+ const agent = new undici.Agent({
737
+ headersTimeout: REQUEST_TIMEOUT_MS,
738
+ keepAliveTimeout: 3e4,
739
+ keepAliveMaxTimeout: 6e4,
740
+ connections: concurrency,
741
+ connect: tlsOptions
742
+ });
743
+ cachedAgents.set(concurrency, agent);
744
+ return agent;
745
+ }
746
+ function getProxyAgentCacheKey(proxyUrl, concurrency) {
747
+ return `${proxyUrl}::${concurrency}`;
600
748
  }
601
749
  function getOrCreateProxyAgent(proxyUrl, tlsOptions) {
602
- if (!cachedProxyAgents.has(proxyUrl)) {
603
- const agent = new undici.ProxyAgent({
604
- uri: proxyUrl,
605
- proxyTls: tlsOptions,
606
- requestTls: tlsOptions,
607
- headersTimeout: REQUEST_TIMEOUT_MS,
608
- keepAliveTimeout: 3e4,
609
- keepAliveMaxTimeout: 6e4,
610
- connections: getConnectionPoolSize()
611
- });
612
- cachedProxyAgents.set(proxyUrl, agent);
613
- }
614
- return cachedProxyAgents.get(proxyUrl);
750
+ const concurrency = getConnectionPoolSize();
751
+ const cacheKey = getProxyAgentCacheKey(proxyUrl, concurrency);
752
+ const existing = cachedProxyAgents.get(cacheKey);
753
+ if (existing) return existing;
754
+ const agent = new undici.ProxyAgent({
755
+ uri: proxyUrl,
756
+ proxyTls: tlsOptions,
757
+ requestTls: tlsOptions,
758
+ headersTimeout: REQUEST_TIMEOUT_MS,
759
+ keepAliveTimeout: 3e4,
760
+ keepAliveMaxTimeout: 6e4,
761
+ connections: concurrency
762
+ });
763
+ cachedProxyAgents.set(cacheKey, agent);
764
+ return agent;
615
765
  }
616
766
  async function fetchWithProxy(url, options = {}, abortSignal) {
617
767
  let finalUrl = url;
@@ -625,7 +775,7 @@ async function fetchWithProxy(url, options = {}, abortSignal) {
625
775
  ...options,
626
776
  headers: {
627
777
  ...options.headers,
628
- "x-promptfoo-version": VERSION
778
+ "x-promptfoo-version": require_version.VERSION
629
779
  },
630
780
  signal: combinedSignal
631
781
  };
@@ -713,12 +863,14 @@ async function handleRateLimit(response) {
713
863
  const retryAfter = response.headers.get("Retry-After");
714
864
  const openaiReset = response.headers.get("x-ratelimit-reset-requests") || response.headers.get("x-ratelimit-reset-tokens");
715
865
  let waitTime = 6e4;
716
- if (openaiReset) waitTime = Math.max(Number.parseInt(openaiReset) * 1e3, 0);
717
- else if (rateLimitReset) {
866
+ if (openaiReset) {
867
+ const parsedHeaders = parseRateLimitHeaders(Object.fromEntries(response.headers.entries()));
868
+ if (parsedHeaders.resetAt !== void 0) waitTime = Math.max(parsedHeaders.resetAt - Date.now(), 0);
869
+ } else if (rateLimitReset) {
718
870
  const resetTime = /* @__PURE__ */ new Date(Number.parseInt(rateLimitReset) * 1e3);
719
871
  const now = /* @__PURE__ */ new Date();
720
872
  waitTime = Math.max(resetTime.getTime() - now.getTime() + 1e3, 0);
721
- } else if (retryAfter) waitTime = Number.parseInt(retryAfter) * 1e3;
873
+ } else if (retryAfter) waitTime = parseRetryAfter(retryAfter) ?? waitTime;
722
874
  require_logger.logger.debug(`Rate limited, waiting ${waitTime}ms before retry`);
723
875
  await sleep(waitTime);
724
876
  }
@@ -816,12 +968,6 @@ Object.defineProperty(exports, "LONG_RUNNING_MODEL_TIMEOUT_MS", {
816
968
  return LONG_RUNNING_MODEL_TIMEOUT_MS;
817
969
  }
818
970
  });
819
- Object.defineProperty(exports, "POSTHOG_KEY", {
820
- enumerable: true,
821
- get: function() {
822
- return POSTHOG_KEY;
823
- }
824
- });
825
971
  Object.defineProperty(exports, "REQUEST_TIMEOUT_MS", {
826
972
  enumerable: true,
827
973
  get: function() {
@@ -840,12 +986,6 @@ Object.defineProperty(exports, "TERMINAL_MAX_WIDTH", {
840
986
  return TERMINAL_MAX_WIDTH;
841
987
  }
842
988
  });
843
- Object.defineProperty(exports, "VERSION", {
844
- enumerable: true,
845
- get: function() {
846
- return VERSION;
847
- }
848
- });
849
989
  Object.defineProperty(exports, "calculateCost", {
850
990
  enumerable: true,
851
991
  get: function() {
@@ -942,6 +1082,18 @@ Object.defineProperty(exports, "parseChatPrompt", {
942
1082
  return parseChatPrompt;
943
1083
  }
944
1084
  });
1085
+ Object.defineProperty(exports, "parseRateLimitHeaders", {
1086
+ enumerable: true,
1087
+ get: function() {
1088
+ return parseRateLimitHeaders;
1089
+ }
1090
+ });
1091
+ Object.defineProperty(exports, "parseRetryAfter", {
1092
+ enumerable: true,
1093
+ get: function() {
1094
+ return parseRetryAfter;
1095
+ }
1096
+ });
945
1097
  Object.defineProperty(exports, "readGlobalConfig", {
946
1098
  enumerable: true,
947
1099
  get: function() {
@@ -985,4 +1137,4 @@ Object.defineProperty(exports, "writeGlobalConfigPartial", {
985
1137
  }
986
1138
  });
987
1139
 
988
- //# sourceMappingURL=fetch-BnR9wSnm.cjs.map
1140
+ //# sourceMappingURL=fetch-NuqXW1Xb.cjs.map