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,7 +1,8 @@
1
1
  import { t as __exportAll } from "./chunk-DEq-mXcV.js";
2
- import { C as getEnvString, D as state, S as getEnvInt, a as logger, b as getEnvBool, d as sanitizeUrl, i as logRequestResponse, y as getConfigDirectoryPath } from "./logger-BnkjG2jt.js";
3
- import { t as invariant } from "./invariant-vgHWClmd.js";
4
- import * as fs$1 from "fs";
2
+ import { S as getEnvBool, T as getEnvString, a as logger, i as logRequestResponse, k as state, p as sanitizeUrl, w as getEnvInt, x as getConfigDirectoryPath } from "./logger-KD8JjCRJ.js";
3
+ import { n as VERSION } from "./version-0frU0UTr.js";
4
+ import { t as invariant } from "./invariant-DIYf9sP1.js";
5
+ import * as fs$2 from "fs";
5
6
  import * as path$1 from "path";
6
7
  import path from "path";
7
8
  import yaml from "js-yaml";
@@ -17,19 +18,6 @@ const FILE_METADATA_KEY = "_promptfooFileMetadata";
17
18
  * Used to distinguish human ratings from automated assertions.
18
19
  */
19
20
  const HUMAN_ASSERTION_TYPE = "human";
20
- //#endregion
21
- //#region src/version.ts
22
- /**
23
- * Application version from package.json.
24
- * Injected at build time, or read from npm environment in development.
25
- */
26
- const VERSION = "0.121.3";
27
- /**
28
- * PostHog analytics key.
29
- * Only populated during production builds via PROMPTFOO_POSTHOG_KEY env var.
30
- * Empty string in development/test.
31
- */
32
- const POSTHOG_KEY = "phc_E5n5uHnDo2eREJL1uqX1cIlbkoRby4yFWt3V94HqRRg";
33
21
  function getShareApiBaseUrl() {
34
22
  return getEnvString("PROMPTFOO_REMOTE_API_BASE_URL") || "https://api.promptfoo.app";
35
23
  }
@@ -72,8 +60,9 @@ function calculateCost(modelName, config, promptTokens, completionTokens, models
72
60
  if (!Number.isFinite(promptTokens) || !Number.isFinite(completionTokens) || typeof promptTokens === "undefined" || typeof completionTokens === "undefined") return;
73
61
  const model = models.find((m) => m.id === modelName);
74
62
  if (!model || !model.cost) return;
75
- const inputCost = config.cost ?? model.cost.input;
76
- const outputCost = config.cost ?? model.cost.output;
63
+ const longContextCost = model.cost.longContext && promptTokens > model.cost.longContext.threshold ? model.cost.longContext : void 0;
64
+ const inputCost = config.cost ?? longContextCost?.input ?? model.cost.input;
65
+ const outputCost = config.cost ?? longContextCost?.output ?? model.cost.output;
77
66
  return inputCost * promptTokens + outputCost * completionTokens;
78
67
  }
79
68
  /**
@@ -150,7 +139,7 @@ function isOpenAIToolChoice(obj) {
150
139
  function openaiToolChoiceToAnthropic(choice) {
151
140
  if (typeof choice === "string") switch (choice) {
152
141
  case "auto": return { type: "auto" };
153
- case "none": return { type: "auto" };
142
+ case "none": return { type: "none" };
154
143
  case "required": return { type: "any" };
155
144
  }
156
145
  return {
@@ -286,6 +275,155 @@ function transformTools(tools, format) {
286
275
  }
287
276
  }
288
277
  //#endregion
278
+ //#region src/scheduler/headerParser.ts
279
+ const OPENAI_HEADERS = {
280
+ remainingRequests: "x-ratelimit-remaining-requests",
281
+ remainingTokens: "x-ratelimit-remaining-tokens",
282
+ limitRequests: "x-ratelimit-limit-requests",
283
+ limitTokens: "x-ratelimit-limit-tokens",
284
+ resetRequests: "x-ratelimit-reset-requests",
285
+ resetTokens: "x-ratelimit-reset-tokens"
286
+ };
287
+ const ANTHROPIC_HEADERS = {
288
+ remainingRequests: "anthropic-ratelimit-requests-remaining",
289
+ remainingTokens: "anthropic-ratelimit-tokens-remaining",
290
+ limitRequests: "anthropic-ratelimit-requests-limit",
291
+ limitTokens: "anthropic-ratelimit-tokens-limit",
292
+ reset: "anthropic-ratelimit-requests-reset"
293
+ };
294
+ const STANDARD_HEADERS = {
295
+ remaining: "ratelimit-remaining",
296
+ limit: "ratelimit-limit",
297
+ reset: "ratelimit-reset",
298
+ remainingAlt: "x-ratelimit-remaining",
299
+ limitAlt: "x-ratelimit-limit",
300
+ resetAlt: "x-ratelimit-reset"
301
+ };
302
+ /**
303
+ * Parse rate limit headers from response.
304
+ */
305
+ function parseRateLimitHeaders(headers) {
306
+ const result = {};
307
+ const h = lowercaseKeys(headers);
308
+ result.remainingRequests = parseFirstMatch(h, [
309
+ OPENAI_HEADERS.remainingRequests,
310
+ ANTHROPIC_HEADERS.remainingRequests,
311
+ STANDARD_HEADERS.remainingAlt,
312
+ STANDARD_HEADERS.remaining
313
+ ]);
314
+ result.remainingTokens = parseFirstMatch(h, [OPENAI_HEADERS.remainingTokens, ANTHROPIC_HEADERS.remainingTokens]);
315
+ result.limitRequests = parseFirstMatch(h, [
316
+ OPENAI_HEADERS.limitRequests,
317
+ ANTHROPIC_HEADERS.limitRequests,
318
+ STANDARD_HEADERS.limitAlt,
319
+ STANDARD_HEADERS.limit
320
+ ]);
321
+ result.limitTokens = parseFirstMatch(h, [OPENAI_HEADERS.limitTokens, ANTHROPIC_HEADERS.limitTokens]);
322
+ for (const name of [
323
+ OPENAI_HEADERS.resetRequests,
324
+ OPENAI_HEADERS.resetTokens,
325
+ ANTHROPIC_HEADERS.reset,
326
+ STANDARD_HEADERS.resetAlt,
327
+ STANDARD_HEADERS.reset
328
+ ]) if (h[name] !== void 0) {
329
+ const parsed = parseResetTime(h[name]);
330
+ if (parsed !== null) {
331
+ result.resetAt = parsed;
332
+ break;
333
+ }
334
+ }
335
+ if (h["retry-after-ms"] !== void 0) {
336
+ const ms = parseInt(h["retry-after-ms"], 10);
337
+ if (!isNaN(ms) && ms >= 0) {
338
+ result.retryAfterMs = ms;
339
+ if (result.resetAt === void 0) result.resetAt = Date.now() + ms;
340
+ }
341
+ } else if (h["retry-after"] !== void 0) {
342
+ const parsed = parseRetryAfter(h["retry-after"]);
343
+ if (parsed !== null) {
344
+ result.retryAfterMs = parsed;
345
+ if (result.resetAt === void 0) result.resetAt = Date.now() + parsed;
346
+ }
347
+ }
348
+ return result;
349
+ }
350
+ /**
351
+ * Parse Retry-After header value.
352
+ * Returns duration in milliseconds.
353
+ * Exported for integration use.
354
+ */
355
+ function parseRetryAfter(value) {
356
+ const seconds = parseInt(value, 10);
357
+ if (!isNaN(seconds) && seconds >= 0 && String(seconds) === value.trim()) return seconds * 1e3;
358
+ const httpDate = parseHttpDate(value);
359
+ if (httpDate !== null) return Math.max(0, httpDate - Date.now());
360
+ return null;
361
+ }
362
+ function parseFirstMatch(headers, names) {
363
+ for (const name of names) {
364
+ const value = headers[name];
365
+ if (value !== void 0) {
366
+ const num = parseInt(value, 10);
367
+ if (!isNaN(num) && num >= 0) return num;
368
+ }
369
+ }
370
+ }
371
+ /**
372
+ * Parse reset time from various formats.
373
+ * Returns absolute Unix timestamp in milliseconds.
374
+ */
375
+ function parseResetTime(value) {
376
+ const durationMs = parseDuration(value);
377
+ if (durationMs !== null) return Date.now() + durationMs;
378
+ const num = parseFloat(value);
379
+ if (!isNaN(num)) if (num < 1e9) return Date.now() + num * 1e3;
380
+ else if (num < 1e10) return num * 1e3;
381
+ else return num;
382
+ const httpDate = parseHttpDate(value);
383
+ if (httpDate !== null) return httpDate;
384
+ return null;
385
+ }
386
+ /**
387
+ * Parse HTTP-date format (RFC 7231).
388
+ */
389
+ function parseHttpDate(value) {
390
+ const timestamp = Date.parse(value);
391
+ if (!isNaN(timestamp)) {
392
+ const now = Date.now();
393
+ const oneYearMs = 365 * 24 * 60 * 60 * 1e3;
394
+ if (timestamp > now - oneYearMs && timestamp < now + oneYearMs) return timestamp;
395
+ }
396
+ return null;
397
+ }
398
+ /**
399
+ * Parse duration strings like "1s", "100ms", "1m30s", "1h30s", "2h15m30s".
400
+ *
401
+ * Supported formats:
402
+ * - Xms (milliseconds)
403
+ * - Xs or X.Xs (seconds)
404
+ * - Xm or XmYs (minutes with optional seconds)
405
+ * - Xh or XhYm or XhYs or XhYmZs (hours with optional minutes/seconds)
406
+ */
407
+ function parseDuration(value) {
408
+ const match = value.match(/^(?:(\d+)h)?(?:(\d+)m(?!s))?(?:(\d+(?:\.\d+)?)(ms|s))?$/);
409
+ if (!match) return null;
410
+ const [, hours, minutes, secondsValue, secondsUnit] = match;
411
+ if (!hours && !minutes && !secondsValue) return null;
412
+ let ms = 0;
413
+ if (hours) ms += parseInt(hours, 10) * 36e5;
414
+ if (minutes) ms += parseInt(minutes, 10) * 6e4;
415
+ if (secondsValue) {
416
+ const num = parseFloat(secondsValue);
417
+ ms += secondsUnit === "ms" ? num : num * 1e3;
418
+ }
419
+ return ms;
420
+ }
421
+ function lowercaseKeys(obj) {
422
+ const result = {};
423
+ for (const [key, value] of Object.entries(obj)) result[key.toLowerCase()] = value;
424
+ return result;
425
+ }
426
+ //#endregion
289
427
  //#region src/util/time.ts
290
428
  function getCurrentTimestamp() {
291
429
  return Math.floor((/* @__PURE__ */ new Date()).getTime() / 1e3);
@@ -298,14 +436,14 @@ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
298
436
  * ~/.promptfoo/promptfoo.yaml by default.
299
437
  */
300
438
  function writeGlobalConfig(config) {
301
- fs$1.writeFileSync(path$1.join(getConfigDirectoryPath(true), "promptfoo.yaml"), yaml.dump(config));
439
+ fs$2.writeFileSync(path$1.join(getConfigDirectoryPath(true), "promptfoo.yaml"), yaml.dump(config));
302
440
  }
303
441
  function readGlobalConfig() {
304
442
  const configDir = getConfigDirectoryPath();
305
443
  const configFilePath = path$1.join(configDir, "promptfoo.yaml");
306
444
  let globalConfig = { id: crypto.randomUUID() };
307
- if (fs$1.existsSync(configFilePath)) {
308
- globalConfig = yaml.load(fs$1.readFileSync(configFilePath, "utf-8")) || {};
445
+ if (fs$2.existsSync(configFilePath)) {
446
+ globalConfig = yaml.load(fs$2.readFileSync(configFilePath, "utf-8")) || {};
309
447
  if (!globalConfig?.id) {
310
448
  globalConfig = {
311
449
  ...globalConfig,
@@ -314,8 +452,8 @@ function readGlobalConfig() {
314
452
  writeGlobalConfig(globalConfig);
315
453
  }
316
454
  } else {
317
- if (!fs$1.existsSync(configDir)) fs$1.mkdirSync(configDir, { recursive: true });
318
- fs$1.writeFileSync(configFilePath, yaml.dump(globalConfig));
455
+ if (!fs$2.existsSync(configDir)) fs$2.mkdirSync(configDir, { recursive: true });
456
+ fs$2.writeFileSync(configFilePath, yaml.dump(globalConfig));
319
457
  }
320
458
  return globalConfig;
321
459
  }
@@ -418,7 +556,17 @@ var CloudConfig = class {
418
556
  teams: savedConfig.teams
419
557
  };
420
558
  }
421
- async validateAndSetApiToken(token, apiHost) {
559
+ saveValidatedApiToken(token, apiHost, user, app, hasActiveLicense) {
560
+ this.setApiKey(token);
561
+ this.setApiHost(apiHost);
562
+ this.setAppUrl(app.url);
563
+ if (typeof hasActiveLicense === "boolean") {
564
+ const createdAt = user?.createdAt ? new Date(user.createdAt) : null;
565
+ const isGrandfathered = createdAt != null && createdAt < SHARING_CUTOFF_DATE;
566
+ this.setSharing(hasActiveLicense || isGrandfathered);
567
+ }
568
+ }
569
+ async validateApiToken(token, apiHost) {
422
570
  try {
423
571
  const { fetchWithProxy } = await Promise.resolve().then(() => fetch_exports);
424
572
  const response = await fetchWithProxy(`${apiHost}/api/v1/users/me`, { headers: { Authorization: `Bearer ${token}` } });
@@ -428,19 +576,11 @@ var CloudConfig = class {
428
576
  throw new Error("Failed to validate API token: " + response.statusText);
429
577
  }
430
578
  const { user, organization, app, hasActiveLicense } = await response.json();
431
- this.setApiKey(token);
432
- this.setApiHost(apiHost);
433
- this.setAppUrl(app.url);
434
- if (typeof hasActiveLicense === "boolean") {
435
- const createdAt = user?.createdAt ? new Date(user.createdAt) : null;
436
- const isGrandfathered = createdAt != null && createdAt < SHARING_CUTOFF_DATE;
437
- this.setSharing(hasActiveLicense || isGrandfathered);
438
- }
439
579
  return {
440
580
  user,
441
581
  organization,
442
582
  app,
443
- hasActiveLicense: typeof hasActiveLicense === "boolean" ? hasActiveLicense : false
583
+ ...typeof hasActiveLicense === "boolean" ? { hasActiveLicense } : {}
444
584
  };
445
585
  } catch (err) {
446
586
  const error = err;
@@ -450,6 +590,16 @@ var CloudConfig = class {
450
590
  throw error;
451
591
  }
452
592
  }
593
+ async validateAndSetApiToken(token, apiHost) {
594
+ const { user, organization, app, hasActiveLicense } = await this.validateApiToken(token, apiHost);
595
+ this.saveValidatedApiToken(token, apiHost, user, app, hasActiveLicense);
596
+ return {
597
+ user,
598
+ organization,
599
+ app,
600
+ hasActiveLicense: typeof hasActiveLicense === "boolean" ? hasActiveLicense : false
601
+ };
602
+ }
453
603
  getCurrentOrganizationId() {
454
604
  return this.config.currentOrganizationId;
455
605
  }
@@ -564,9 +714,8 @@ var fetch_exports = /* @__PURE__ */ __exportAll({
564
714
  isRateLimited: () => isRateLimited,
565
715
  isTransientError: () => isTransientError
566
716
  });
567
- let cachedAgent = null;
568
- let cachedAgentConcurrency;
569
- let cachedProxyAgents = /* @__PURE__ */ new Map();
717
+ const cachedAgents = /* @__PURE__ */ new Map();
718
+ const cachedProxyAgents = /* @__PURE__ */ new Map();
570
719
  /**
571
720
  * Get the connection pool size for HTTP agents.
572
721
  * Priority: PROMPTFOO_FETCH_CONNECTIONS env var > CLI -j flag > DEFAULT_MAX_CONCURRENCY (4).
@@ -583,36 +732,37 @@ function getConnectionPoolSize() {
583
732
  }
584
733
  function getOrCreateAgent(tlsOptions) {
585
734
  const concurrency = getConnectionPoolSize();
586
- if (cachedAgent && cachedAgentConcurrency !== concurrency) {
587
- if (typeof cachedAgent.close === "function") cachedAgent.close();
588
- cachedAgent = null;
589
- }
590
- if (!cachedAgent) {
591
- cachedAgent = new Agent({
592
- headersTimeout: REQUEST_TIMEOUT_MS,
593
- keepAliveTimeout: 3e4,
594
- keepAliveMaxTimeout: 6e4,
595
- connections: concurrency,
596
- connect: tlsOptions
597
- });
598
- cachedAgentConcurrency = concurrency;
599
- }
600
- return cachedAgent;
735
+ const existing = cachedAgents.get(concurrency);
736
+ if (existing) return existing;
737
+ const agent = new Agent({
738
+ headersTimeout: REQUEST_TIMEOUT_MS,
739
+ keepAliveTimeout: 3e4,
740
+ keepAliveMaxTimeout: 6e4,
741
+ connections: concurrency,
742
+ connect: tlsOptions
743
+ });
744
+ cachedAgents.set(concurrency, agent);
745
+ return agent;
746
+ }
747
+ function getProxyAgentCacheKey(proxyUrl, concurrency) {
748
+ return `${proxyUrl}::${concurrency}`;
601
749
  }
602
750
  function getOrCreateProxyAgent(proxyUrl, tlsOptions) {
603
- if (!cachedProxyAgents.has(proxyUrl)) {
604
- const agent = new ProxyAgent({
605
- uri: proxyUrl,
606
- proxyTls: tlsOptions,
607
- requestTls: tlsOptions,
608
- headersTimeout: REQUEST_TIMEOUT_MS,
609
- keepAliveTimeout: 3e4,
610
- keepAliveMaxTimeout: 6e4,
611
- connections: getConnectionPoolSize()
612
- });
613
- cachedProxyAgents.set(proxyUrl, agent);
614
- }
615
- return cachedProxyAgents.get(proxyUrl);
751
+ const concurrency = getConnectionPoolSize();
752
+ const cacheKey = getProxyAgentCacheKey(proxyUrl, concurrency);
753
+ const existing = cachedProxyAgents.get(cacheKey);
754
+ if (existing) return existing;
755
+ const agent = new ProxyAgent({
756
+ uri: proxyUrl,
757
+ proxyTls: tlsOptions,
758
+ requestTls: tlsOptions,
759
+ headersTimeout: REQUEST_TIMEOUT_MS,
760
+ keepAliveTimeout: 3e4,
761
+ keepAliveMaxTimeout: 6e4,
762
+ connections: concurrency
763
+ });
764
+ cachedProxyAgents.set(cacheKey, agent);
765
+ return agent;
616
766
  }
617
767
  async function fetchWithProxy(url, options = {}, abortSignal) {
618
768
  let finalUrl = url;
@@ -714,12 +864,14 @@ async function handleRateLimit(response) {
714
864
  const retryAfter = response.headers.get("Retry-After");
715
865
  const openaiReset = response.headers.get("x-ratelimit-reset-requests") || response.headers.get("x-ratelimit-reset-tokens");
716
866
  let waitTime = 6e4;
717
- if (openaiReset) waitTime = Math.max(Number.parseInt(openaiReset) * 1e3, 0);
718
- else if (rateLimitReset) {
867
+ if (openaiReset) {
868
+ const parsedHeaders = parseRateLimitHeaders(Object.fromEntries(response.headers.entries()));
869
+ if (parsedHeaders.resetAt !== void 0) waitTime = Math.max(parsedHeaders.resetAt - Date.now(), 0);
870
+ } else if (rateLimitReset) {
719
871
  const resetTime = /* @__PURE__ */ new Date(Number.parseInt(rateLimitReset) * 1e3);
720
872
  const now = /* @__PURE__ */ new Date();
721
873
  waitTime = Math.max(resetTime.getTime() - now.getTime() + 1e3, 0);
722
- } else if (retryAfter) waitTime = Number.parseInt(retryAfter) * 1e3;
874
+ } else if (retryAfter) waitTime = parseRetryAfter(retryAfter) ?? waitTime;
723
875
  logger.debug(`Rate limited, waiting ${waitTime}ms before retry`);
724
876
  await sleep(waitTime);
725
877
  }
@@ -775,6 +927,6 @@ async function fetchWithRetries(url, options = {}, timeout, maxRetries) {
775
927
  throw new Error(`Request failed after ${maxRetries} retries: ${lastErrorMessage}`);
776
928
  }
777
929
  //#endregion
778
- export { getDefaultShareViewBaseUrl as A, transformTools as C, R_ENDPOINT as D, EVENTS_ENDPOINT as E, FILE_METADATA_KEY as F, HUMAN_ASSERTION_TYPE as I, getShareViewBaseUrl as M, POSTHOG_KEY as N, TERMINAL_MAX_WIDTH as O, VERSION as P, transformToolChoice as S, CONSENT_ENDPOINT as T, isPromptfooSampleTarget as _, CloudConfig as a, parseChatPrompt as b, writeGlobalConfig as c, sleep as d, LONG_RUNNING_MODEL_TIMEOUT_MS as f, isOpenAIToolChoice as g, isOpenAIToolArray as h, fetch_exports as i, getShareApiBaseUrl as j, getDefaultPort as k, writeGlobalConfigPartial as l, calculateCost as m, fetchWithRetries as n, cloudConfig as o, REQUEST_TIMEOUT_MS as p, fetchWithTimeout as r, readGlobalConfig as s, fetchWithProxy as t, getCurrentTimestamp as u, openaiToolChoiceToBedrock as v, CLOUD_PROVIDER_PREFIX as w, toTitleCase as x, openaiToolsToBedrock as y };
930
+ export { TERMINAL_MAX_WIDTH as A, toTitleCase as C, CONSENT_ENDPOINT as D, CLOUD_PROVIDER_PREFIX as E, FILE_METADATA_KEY as F, HUMAN_ASSERTION_TYPE as I, getDefaultShareViewBaseUrl as M, getShareApiBaseUrl as N, EVENTS_ENDPOINT as O, getShareViewBaseUrl as P, parseChatPrompt as S, transformTools as T, isOpenAIToolArray as _, CloudConfig as a, openaiToolChoiceToBedrock as b, writeGlobalConfig as c, sleep as d, parseRateLimitHeaders as f, calculateCost as g, REQUEST_TIMEOUT_MS as h, fetch_exports as i, getDefaultPort as j, R_ENDPOINT as k, writeGlobalConfigPartial as l, LONG_RUNNING_MODEL_TIMEOUT_MS as m, fetchWithRetries as n, cloudConfig as o, parseRetryAfter as p, fetchWithTimeout as r, readGlobalConfig as s, fetchWithProxy as t, getCurrentTimestamp as u, isOpenAIToolChoice as v, transformToolChoice as w, openaiToolsToBedrock as x, isPromptfooSampleTarget as y };
779
931
 
780
- //# sourceMappingURL=fetch-BiYv2BZc.js.map
932
+ //# sourceMappingURL=fetch-Y5qX_kST.js.map
@@ -82,4 +82,4 @@ function isAudioFile(filePath) {
82
82
  //#endregion
83
83
  export { isVideoFile as a, isJavascriptFile as i, isAudioFile as n, isImageFile as r, JAVASCRIPT_EXTENSIONS as t };
84
84
 
85
- //# sourceMappingURL=fileExtensions-LcDYkU4v.js.map
85
+ //# sourceMappingURL=fileExtensions-8CjoL7vB.js.map
@@ -82,4 +82,4 @@ function isAudioFile(filePath) {
82
82
  //#endregion
83
83
  export { isVideoFile as a, isJavascriptFile as i, isAudioFile as n, isImageFile as r, JAVASCRIPT_EXTENSIONS as t };
84
84
 
85
- //# sourceMappingURL=fileExtensions-DnqA1y9x.js.map
85
+ //# sourceMappingURL=fileExtensions-BGh-W-HT.js.map
@@ -111,4 +111,4 @@ Object.defineProperty(exports, "isVideoFile", {
111
111
  }
112
112
  });
113
113
 
114
- //# sourceMappingURL=fileExtensions-bYh77CN8.cjs.map
114
+ //# sourceMappingURL=fileExtensions-D9h-8Wxg.cjs.map
@@ -83,4 +83,4 @@ function isAudioFile(filePath) {
83
83
  //#endregion
84
84
  export { isVideoFile as a, isJavascriptFile as i, isAudioFile as n, isImageFile as r, JAVASCRIPT_EXTENSIONS as t };
85
85
 
86
- //# sourceMappingURL=fileExtensions-Ds-foDzt.js.map
86
+ //# sourceMappingURL=fileExtensions-DysCsxNG.js.map
@@ -20,4 +20,4 @@ function formatDuration(seconds) {
20
20
  //#endregion
21
21
  export { formatDuration as t };
22
22
 
23
- //# sourceMappingURL=formatDuration-DgBVMN65.js.map
23
+ //# sourceMappingURL=formatDuration-Ch4A7G3o.js.map
@@ -1,4 +1,4 @@
1
- require("./logger-D5iKBpu_.cjs");
1
+ require("./logger-COuQb2xB.cjs");
2
2
  let _opentelemetry_api = require("@opentelemetry/api");
3
3
  //#region src/tracing/genaiTracer.ts
4
4
  const TRACER_NAME = "promptfoo.providers";
@@ -23,7 +23,9 @@ const GenAIAttributes = {
23
23
  USAGE_CACHED_TOKENS: "gen_ai.usage.cached_tokens",
24
24
  USAGE_REASONING_TOKENS: "gen_ai.usage.reasoning_tokens",
25
25
  USAGE_ACCEPTED_PREDICTION_TOKENS: "gen_ai.usage.accepted_prediction_tokens",
26
- USAGE_REJECTED_PREDICTION_TOKENS: "gen_ai.usage.rejected_prediction_tokens"
26
+ USAGE_REJECTED_PREDICTION_TOKENS: "gen_ai.usage.rejected_prediction_tokens",
27
+ USAGE_CACHE_READ_INPUT_TOKENS: "gen_ai.usage.cache_read_input_tokens",
28
+ USAGE_CACHE_CREATION_INPUT_TOKENS: "gen_ai.usage.cache_creation_input_tokens"
27
29
  };
28
30
  const PromptfooAttributes = {
29
31
  PROVIDER_ID: "promptfoo.provider.id",
@@ -226,6 +228,8 @@ function setGenAIResponseAttributes(span, result, sanitize = true) {
226
228
  if (usage.completionDetails.reasoning !== void 0) span.setAttribute(GenAIAttributes.USAGE_REASONING_TOKENS, usage.completionDetails.reasoning);
227
229
  if (usage.completionDetails.acceptedPrediction !== void 0) span.setAttribute(GenAIAttributes.USAGE_ACCEPTED_PREDICTION_TOKENS, usage.completionDetails.acceptedPrediction);
228
230
  if (usage.completionDetails.rejectedPrediction !== void 0) span.setAttribute(GenAIAttributes.USAGE_REJECTED_PREDICTION_TOKENS, usage.completionDetails.rejectedPrediction);
231
+ if (usage.completionDetails.cacheReadInputTokens !== void 0) span.setAttribute(GenAIAttributes.USAGE_CACHE_READ_INPUT_TOKENS, usage.completionDetails.cacheReadInputTokens);
232
+ if (usage.completionDetails.cacheCreationInputTokens !== void 0) span.setAttribute(GenAIAttributes.USAGE_CACHE_CREATION_INPUT_TOKENS, usage.completionDetails.cacheCreationInputTokens);
229
233
  }
230
234
  }
231
235
  if (result.responseModel) span.setAttribute(GenAIAttributes.RESPONSE_MODEL, result.responseModel);
@@ -265,4 +269,4 @@ Object.defineProperty(exports, "withGenAISpan", {
265
269
  }
266
270
  });
267
271
 
268
- //# sourceMappingURL=genaiTracer-BfxrvSUb.cjs.map
272
+ //# sourceMappingURL=genaiTracer-BokHC-MW.cjs.map
@@ -23,7 +23,9 @@ const GenAIAttributes = {
23
23
  USAGE_CACHED_TOKENS: "gen_ai.usage.cached_tokens",
24
24
  USAGE_REASONING_TOKENS: "gen_ai.usage.reasoning_tokens",
25
25
  USAGE_ACCEPTED_PREDICTION_TOKENS: "gen_ai.usage.accepted_prediction_tokens",
26
- USAGE_REJECTED_PREDICTION_TOKENS: "gen_ai.usage.rejected_prediction_tokens"
26
+ USAGE_REJECTED_PREDICTION_TOKENS: "gen_ai.usage.rejected_prediction_tokens",
27
+ USAGE_CACHE_READ_INPUT_TOKENS: "gen_ai.usage.cache_read_input_tokens",
28
+ USAGE_CACHE_CREATION_INPUT_TOKENS: "gen_ai.usage.cache_creation_input_tokens"
27
29
  };
28
30
  const PromptfooAttributes = {
29
31
  PROVIDER_ID: "promptfoo.provider.id",
@@ -226,6 +228,8 @@ function setGenAIResponseAttributes(span, result, sanitize = true) {
226
228
  if (usage.completionDetails.reasoning !== void 0) span.setAttribute(GenAIAttributes.USAGE_REASONING_TOKENS, usage.completionDetails.reasoning);
227
229
  if (usage.completionDetails.acceptedPrediction !== void 0) span.setAttribute(GenAIAttributes.USAGE_ACCEPTED_PREDICTION_TOKENS, usage.completionDetails.acceptedPrediction);
228
230
  if (usage.completionDetails.rejectedPrediction !== void 0) span.setAttribute(GenAIAttributes.USAGE_REJECTED_PREDICTION_TOKENS, usage.completionDetails.rejectedPrediction);
231
+ if (usage.completionDetails.cacheReadInputTokens !== void 0) span.setAttribute(GenAIAttributes.USAGE_CACHE_READ_INPUT_TOKENS, usage.completionDetails.cacheReadInputTokens);
232
+ if (usage.completionDetails.cacheCreationInputTokens !== void 0) span.setAttribute(GenAIAttributes.USAGE_CACHE_CREATION_INPUT_TOKENS, usage.completionDetails.cacheCreationInputTokens);
229
233
  }
230
234
  }
231
235
  if (result.responseModel) span.setAttribute(GenAIAttributes.RESPONSE_MODEL, result.responseModel);
@@ -254,4 +258,4 @@ function getTraceparent() {
254
258
  //#endregion
255
259
  export { withGenAISpan as n, getTraceparent as t };
256
260
 
257
- //# sourceMappingURL=genaiTracer-C1rxGO8Q.js.map
261
+ //# sourceMappingURL=genaiTracer-C3ZPQU60.js.map
@@ -22,7 +22,9 @@ const GenAIAttributes = {
22
22
  USAGE_CACHED_TOKENS: "gen_ai.usage.cached_tokens",
23
23
  USAGE_REASONING_TOKENS: "gen_ai.usage.reasoning_tokens",
24
24
  USAGE_ACCEPTED_PREDICTION_TOKENS: "gen_ai.usage.accepted_prediction_tokens",
25
- USAGE_REJECTED_PREDICTION_TOKENS: "gen_ai.usage.rejected_prediction_tokens"
25
+ USAGE_REJECTED_PREDICTION_TOKENS: "gen_ai.usage.rejected_prediction_tokens",
26
+ USAGE_CACHE_READ_INPUT_TOKENS: "gen_ai.usage.cache_read_input_tokens",
27
+ USAGE_CACHE_CREATION_INPUT_TOKENS: "gen_ai.usage.cache_creation_input_tokens"
26
28
  };
27
29
  const PromptfooAttributes = {
28
30
  PROVIDER_ID: "promptfoo.provider.id",
@@ -225,6 +227,8 @@ function setGenAIResponseAttributes(span, result, sanitize = true) {
225
227
  if (usage.completionDetails.reasoning !== void 0) span.setAttribute(GenAIAttributes.USAGE_REASONING_TOKENS, usage.completionDetails.reasoning);
226
228
  if (usage.completionDetails.acceptedPrediction !== void 0) span.setAttribute(GenAIAttributes.USAGE_ACCEPTED_PREDICTION_TOKENS, usage.completionDetails.acceptedPrediction);
227
229
  if (usage.completionDetails.rejectedPrediction !== void 0) span.setAttribute(GenAIAttributes.USAGE_REJECTED_PREDICTION_TOKENS, usage.completionDetails.rejectedPrediction);
230
+ if (usage.completionDetails.cacheReadInputTokens !== void 0) span.setAttribute(GenAIAttributes.USAGE_CACHE_READ_INPUT_TOKENS, usage.completionDetails.cacheReadInputTokens);
231
+ if (usage.completionDetails.cacheCreationInputTokens !== void 0) span.setAttribute(GenAIAttributes.USAGE_CACHE_CREATION_INPUT_TOKENS, usage.completionDetails.cacheCreationInputTokens);
228
232
  }
229
233
  }
230
234
  if (result.responseModel) span.setAttribute(GenAIAttributes.RESPONSE_MODEL, result.responseModel);
@@ -253,4 +257,4 @@ function getTraceparent() {
253
257
  //#endregion
254
258
  export { withGenAISpan as n, getTraceparent as t };
255
259
 
256
- //# sourceMappingURL=genaiTracer-70Z8BIuV.js.map
260
+ //# sourceMappingURL=genaiTracer-CFny3gOy.js.map
@@ -22,7 +22,9 @@ const GenAIAttributes = {
22
22
  USAGE_CACHED_TOKENS: "gen_ai.usage.cached_tokens",
23
23
  USAGE_REASONING_TOKENS: "gen_ai.usage.reasoning_tokens",
24
24
  USAGE_ACCEPTED_PREDICTION_TOKENS: "gen_ai.usage.accepted_prediction_tokens",
25
- USAGE_REJECTED_PREDICTION_TOKENS: "gen_ai.usage.rejected_prediction_tokens"
25
+ USAGE_REJECTED_PREDICTION_TOKENS: "gen_ai.usage.rejected_prediction_tokens",
26
+ USAGE_CACHE_READ_INPUT_TOKENS: "gen_ai.usage.cache_read_input_tokens",
27
+ USAGE_CACHE_CREATION_INPUT_TOKENS: "gen_ai.usage.cache_creation_input_tokens"
26
28
  };
27
29
  const PromptfooAttributes = {
28
30
  PROVIDER_ID: "promptfoo.provider.id",
@@ -225,6 +227,8 @@ function setGenAIResponseAttributes(span, result, sanitize = true) {
225
227
  if (usage.completionDetails.reasoning !== void 0) span.setAttribute(GenAIAttributes.USAGE_REASONING_TOKENS, usage.completionDetails.reasoning);
226
228
  if (usage.completionDetails.acceptedPrediction !== void 0) span.setAttribute(GenAIAttributes.USAGE_ACCEPTED_PREDICTION_TOKENS, usage.completionDetails.acceptedPrediction);
227
229
  if (usage.completionDetails.rejectedPrediction !== void 0) span.setAttribute(GenAIAttributes.USAGE_REJECTED_PREDICTION_TOKENS, usage.completionDetails.rejectedPrediction);
230
+ if (usage.completionDetails.cacheReadInputTokens !== void 0) span.setAttribute(GenAIAttributes.USAGE_CACHE_READ_INPUT_TOKENS, usage.completionDetails.cacheReadInputTokens);
231
+ if (usage.completionDetails.cacheCreationInputTokens !== void 0) span.setAttribute(GenAIAttributes.USAGE_CACHE_CREATION_INPUT_TOKENS, usage.completionDetails.cacheCreationInputTokens);
228
232
  }
229
233
  }
230
234
  if (result.responseModel) span.setAttribute(GenAIAttributes.RESPONSE_MODEL, result.responseModel);
@@ -253,4 +257,4 @@ function getTraceparent() {
253
257
  //#endregion
254
258
  export { withGenAISpan as n, getTraceparent as t };
255
259
 
256
- //# sourceMappingURL=genaiTracer-D3fD9dNV.js.map
260
+ //# sourceMappingURL=genaiTracer-DxODqT9e.js.map
@@ -28,7 +28,7 @@ func main() {
28
28
  }
29
29
 
30
30
  // Get the function by name using reflection
31
- f := reflect.ValueOf(nil)
31
+ var f reflect.Value
32
32
  switch functionName {
33
33
  case "call_api", "CallApi":
34
34
  // Use the CallApi function defined in the user's code