promptfoo 0.121.5 → 0.121.7
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.
- package/dist/src/{ListApp-BRUsT43Y.js → ListApp-DLmM02JS.js} +1 -1
- package/dist/src/{accounts-CaLNYnf7.js → accounts-Ca7WIoPY.js} +12 -7
- package/dist/src/{accounts-CLJHCDDb.js → accounts-CjFnOPmb.js} +13 -8
- package/dist/src/{accounts-BIFntVWB.cjs → accounts-CmWzeD2d.cjs} +16 -10
- package/dist/src/{accounts-bnyHT7Ju.js → accounts-DanM1wq_.js} +12 -7
- package/dist/src/{agentic-utils-BclbiXiq.js → agentic-utils-CJ0j3fBi.js} +2 -2
- package/dist/src/{agentic-utils-B5krlibj.js → agentic-utils-DDEGRV9v.js} +2 -2
- package/dist/src/{agentic-utils-D2x0wGhB.cjs → agentic-utils-DvPWSUpb.cjs} +8 -7
- package/dist/src/{agentic-utils-Ba67xmgs.js → agentic-utils-TxUEMPYS.js} +2 -2
- package/dist/src/{agents-WULPVjbH.cjs → agents-B4sRuXg3.cjs} +7 -6
- package/dist/src/{agents-DhxWMCtH.js → agents-B8q7h_ek.js} +4 -4
- package/dist/src/{agents-BGqaTDnr.js → agents-CBgJvRkB.js} +20 -9
- package/dist/src/{agents-n6vPqV3i.js → agents-CYn2n3QP.js} +4 -4
- package/dist/src/{agents-BV9yFpXX.js → agents-D-vDNFx4.js} +20 -9
- package/dist/src/{agents-BYdMl1UE.js → agents-LrHuQqr1.js} +20 -9
- package/dist/src/{agents-emVcx3yh.js → agents-QGg76OF-.js} +2 -2
- package/dist/src/{agents-DiWmQYH9.cjs → agents-eHZ9nlgA.cjs} +21 -10
- package/dist/src/{aimlapi-uPGp0Zdo.js → aimlapi-CJEbQ0o6.js} +6 -6
- package/dist/src/{aimlapi-DR4pgeiC.js → aimlapi-D5HXzZ0s.js} +6 -6
- package/dist/src/{aimlapi-BzLjZI_m.cjs → aimlapi-T6HGNxNe.cjs} +7 -7
- package/dist/src/{aimlapi-BxqK9HF_.js → aimlapi-eYv3a_DK.js} +6 -6
- package/dist/src/app/app/tsconfig.app.tsbuildinfo +1 -1
- package/dist/src/app/assets/Report-BNHJKN35.js +1 -0
- package/dist/src/app/assets/index-BnT6P6sF.js +388 -0
- package/dist/src/app/assets/index-yhM8y1PP.css +1 -0
- package/dist/src/app/assets/{scroll-timeline-D9IT_e8Z.js → scroll-timeline-RpeTwOvs.js} +1 -1
- package/dist/src/app/assets/sync-5gq6fmG4.js +4 -0
- package/dist/src/app/assets/vendor-charts-BL9OMNU7.js +36 -0
- package/dist/src/app/assets/{vendor-markdown-Ch00wnNI.js → vendor-markdown-BYsQqn7Z.js} +10 -10
- package/dist/src/app/assets/{vendor-react-CVvmk1UB.js → vendor-react-CqWgVW6T.js} +2 -2
- package/dist/src/app/assets/{vendor-utils-BnEYbx2Q.js → vendor-utils-BHPO71pu.js} +1 -1
- package/dist/src/app/index.html +6 -6
- package/dist/src/{audio-Da8U9IS5.js → audio-BqnRvcWG.js} +3 -3
- package/dist/src/{audio-BvpTOArF.js → audio-CPMtV1yR.js} +3 -3
- package/dist/src/{audio-CScmnmEB.js → audio-DyiebVB3.js} +3 -3
- package/dist/src/{audio-C0vDeS0j.cjs → audio-FnxbEnSE.cjs} +4 -4
- package/dist/src/authoritativeMarkupInjection-BZIywVjG.js +74 -0
- package/dist/src/authoritativeMarkupInjection-DyAXAsSr.js +75 -0
- package/dist/src/authoritativeMarkupInjection-F2gBw0lN.cjs +74 -0
- package/dist/src/authoritativeMarkupInjection-QEQmFS83.js +74 -0
- package/dist/src/{base-BTux96b1.js → base-CKLo890h.js} +4 -3
- package/dist/src/{base-BOMaNEes.js → base-Co80MMCi.js} +4 -3
- package/dist/src/{base-Tw6uhH8K.cjs → base-DGJW48uz.cjs} +5 -4
- package/dist/src/{base-dYsl2hmL.js → base-E9I8zXjz.js} +4 -3
- package/dist/src/bestOfN-B3wNzjSB.js +137 -0
- package/dist/src/bestOfN-BBsO41z4.js +136 -0
- package/dist/src/bestOfN-CAwmg5UL.cjs +140 -0
- package/dist/src/bestOfN-_kTi8Bxe.js +136 -0
- package/dist/src/{blobs-B95F_7vE.cjs → blobs-B0977K1O.cjs} +7 -6
- package/dist/src/{blobs-D_gg8nbm.js → blobs-CeFdPn_T.js} +2 -2
- package/dist/src/{blobs-DjLby-uP.js → blobs-DODuTK-a.js} +2 -2
- package/dist/src/{blobs-BW4U31ue.js → blobs-Dwef1Ao1.js} +2 -2
- package/dist/src/{cache-DGg-yTZG.cjs → cache-CPGUA4Yl.cjs} +135 -25
- package/dist/src/cache-Cf7b4pWE.js +3 -0
- package/dist/src/{cache-Bzttsk0X.js → cache-DIXbtkNO.js} +125 -10
- package/dist/src/{cache-BI5BY7ey.js → cache-DpPWrkTE.js} +127 -11
- package/dist/src/{cache-Cr-qWIbP.js → cache-roFAE0cI.js} +125 -10
- package/dist/src/{chat-DChSH_Es.js → chat-CUCorGiL.js} +9 -9
- package/dist/src/{chat-DH97tVV9.cjs → chat-DG1wG4w0.cjs} +6 -6
- package/dist/src/{chat-Cx_LkwvZ.js → chat-Dabu84Br.js} +11 -11
- package/dist/src/{chat-BLOdH60v.js → chat-DqUFcWI0.js} +11 -11
- package/dist/src/{chat-vYqqv1gP.cjs → chat-DxTDQ83C.cjs} +14 -13
- package/dist/src/{chat-DG2LkwLq.js → chat-GmlolEwo.js} +4 -4
- package/dist/src/{chat-aMQZw6R7.js → chat-TP8Qifkh.js} +4 -4
- package/dist/src/{chat-D9nudO9b.js → chat-iwaM5UTQ.js} +4 -4
- package/dist/src/{chatkit-B8X34dQc.js → chatkit-B6DWi70Q.js} +3 -3
- package/dist/src/{chatkit-D44VyUyB.cjs → chatkit-BYveR48_.cjs} +6 -5
- package/dist/src/{chatkit-BXu42Qwt.js → chatkit-fARZwEfV.js} +3 -3
- package/dist/src/{chatkit-CbMRoeYw.js → chatkit-lb6FK02w.js} +1 -1
- package/dist/src/{claude-agent-sdk-BzNZeZ0N.js → claude-agent-sdk-BQNp_y-F.js} +209 -64
- package/dist/src/{claude-agent-sdk-BjriSVRZ.js → claude-agent-sdk-D5Jl0SDh.js} +210 -65
- package/dist/src/{claude-agent-sdk-BRq0bbIK.cjs → claude-agent-sdk-DH416NBD.cjs} +216 -70
- package/dist/src/{claude-agent-sdk-DYv_AJ8u.js → claude-agent-sdk-x1XJ1-pU.js} +210 -65
- package/dist/src/{cloud-Da0bofJd.js → cloud-D3DiFqH6.js} +2 -2
- package/dist/src/cloud-p96PA4MH.js +3 -0
- package/dist/src/{cloudflare-ai-CXC4b1EU.js → cloudflare-ai-B6NVI3ax.js} +4 -4
- package/dist/src/{cloudflare-ai-DJv5qnyb.cjs → cloudflare-ai-CEAW-xQa.cjs} +6 -6
- package/dist/src/{cloudflare-ai-CyBoIs1Q.js → cloudflare-ai-RFSojyXG.js} +4 -4
- package/dist/src/{cloudflare-ai-DGOwgexC.js → cloudflare-ai-r4tbYmWU.js} +4 -4
- package/dist/src/{cloudflare-gateway-D-dnkzCF.js → cloudflare-gateway-BCkLouto.js} +3 -3
- package/dist/src/{cloudflare-gateway-TJkVrZlB.js → cloudflare-gateway-BaZ4insB.js} +3 -3
- package/dist/src/{cloudflare-gateway-1sAoOyft.js → cloudflare-gateway-CF-Vb-2Z.js} +3 -3
- package/dist/src/{cloudflare-gateway-DKVjkDav.cjs → cloudflare-gateway-TJMLBj6I.cjs} +5 -5
- package/dist/src/{codex-app-server-CCe0TiDc.js → codex-app-server-B8KHEiF4.js} +5 -5
- package/dist/src/{codex-app-server-VMRnjZ68.cjs → codex-app-server-CnrLBCeA.cjs} +12 -11
- package/dist/src/{codex-app-server-CCLjqCh9.js → codex-app-server-DIXZ230V.js} +4 -4
- package/dist/src/{codex-app-server-CPW1LFwh.js → codex-app-server-Dd22dC_N.js} +5 -5
- package/dist/src/{codex-sdk-BgEFQ70r.js → codex-sdk-B6Wah8Pa.js} +5 -5
- package/dist/src/codex-sdk-BGjVAk23.js +3 -0
- package/dist/src/{codex-sdk-Bd8UbO9q.cjs → codex-sdk-CFF6gUyi.cjs} +18 -10
- package/dist/src/{codex-sdk-Bzb_TqX9.js → codex-sdk-CmQABzV3.js} +3 -3
- package/dist/src/{codex-sdk-DfvDTN33.js → codex-sdk-D2d54RL8.js} +5 -5
- package/dist/src/{cometapi-B5ImDlSm.js → cometapi-Bu9B8NUY.js} +7 -7
- package/dist/src/{cometapi-CCbpHkuF.js → cometapi-CtzNCHKu.js} +7 -7
- package/dist/src/{cometapi-BgAkuYCw.cjs → cometapi-DHCDlQUI.cjs} +8 -8
- package/dist/src/{cometapi-CC7hWxmX.js → cometapi-OBILPLlu.js} +7 -7
- package/dist/src/{completion-Vq_ad618.js → completion-CO2e1_62.js} +4 -4
- package/dist/src/{completion-DtQ72Bm3.cjs → completion-CSYfl2cd.cjs} +6 -6
- package/dist/src/{completion-2iuYVxwi.js → completion-DZNxcyfG.js} +5 -5
- package/dist/src/{completion-CrD6MQ93.js → completion-sNvCLTAP.js} +5 -5
- package/dist/src/constants-BjJV0cRr.js +6 -0
- package/dist/src/constants-DH5XYLKZ.js +7 -0
- package/dist/src/constants-DZGEFLsu.js +6 -0
- package/dist/src/constants-a2kYssQk.cjs +11 -0
- package/dist/src/{createHash-4gFQpDDv.js → createHash-BtbSX3mj.js} +1 -1
- package/dist/src/{createHash-Un4Q_huE.js → createHash-CGVzWdjj.js} +1 -1
- package/dist/src/{createHash-VvBIc-AW.cjs → createHash-CSiqnK5P.cjs} +2 -2
- package/dist/src/{createHash-DPpsZgFF.js → createHash-CgRvs4Fn.js} +1 -1
- package/dist/src/crescendo-BXEJK_bi.cjs +704 -0
- package/dist/src/crescendo-CU_Y2i-m.js +702 -0
- package/dist/src/crescendo-J1Xx4_zb.js +703 -0
- package/dist/src/crescendo-QiaSLW0d.js +701 -0
- package/dist/src/custom-BJfP00Bh.js +619 -0
- package/dist/src/custom-CZVn-1-r.js +620 -0
- package/dist/src/custom-Cqia7M0D.cjs +621 -0
- package/dist/src/custom-notggYVl.js +618 -0
- package/dist/src/{docker--3qzPa-6.js → docker-4D1eL6Gq.js} +5 -5
- package/dist/src/{docker-Dorv4_Dg.js → docker-BBv1WUDu.js} +5 -5
- package/dist/src/{docker-D3AY-5F5.cjs → docker-D06JUoe2.cjs} +6 -6
- package/dist/src/{docker-DCsCDvwM.js → docker-DdJQBxK9.js} +5 -5
- package/dist/src/{embedding-DNRvZwRN.js → embedding--UZVe4_7.js} +5 -5
- package/dist/src/{embedding-BXhN5lCH.cjs → embedding-BbrwopfX.cjs} +6 -6
- package/dist/src/{embedding-ChS1ivFS.js → embedding-Bi3rxrZF.js} +5 -5
- package/dist/src/{embedding-D_bI4NDq.js → embedding-C251p1-8.js} +4 -4
- package/dist/src/{errors-DFHe4L-n.js → errors-9PcUL8BC.js} +1 -1
- package/dist/src/{esm-B_rGuPTo.cjs → esm-BIKakvNa.cjs} +8 -7
- package/dist/src/{esm-BRkfNsYs.js → esm-BTK1W7lG.js} +1 -1
- package/dist/src/{esm-BX8fwlAO.js → esm-Bexx2PFc.js} +1 -1
- package/dist/src/{eval-DJ_4A-tr.js → eval-0VRANImH.js} +19 -19
- package/dist/src/{eval-BQPLBJbw.js → eval-DscR5iOM.js} +1 -1
- package/dist/src/{evalResult-pSvGWFMo.js → evalResult-2RRJvFyB.js} +18 -11
- package/dist/src/{evalResult-Cx-8OWkb.cjs → evalResult-CvtS8h8u.cjs} +29 -11
- package/dist/src/evalResult-DqzsS6_W.js +3 -0
- package/dist/src/{evalResult-D6P5I5il.js → evalResult-eUkJv9Ko.js} +17 -10
- package/dist/src/evaluator-DNdJF1Gv.js +3 -0
- package/dist/src/{evaluator-D-UIbbYq.js → evaluator-DRoiYB2q.js} +258 -132
- package/dist/src/evaluatorHelpers-BsYP_muT.js +511 -0
- package/dist/src/evaluatorHelpers-CRqTvSux.cjs +537 -0
- package/dist/src/evaluatorHelpers-DuqFFfq7.js +510 -0
- package/dist/src/{extractor-YlZbUMsL.js → extractor-BR7XAzAL.js} +5 -5
- package/dist/src/{extractor-Dxr2J_wK.cjs → extractor-BdxEtt3J.cjs} +6 -6
- package/dist/src/{extractor-DxyiFhPk.js → extractor-CIW3iN-b.js} +5 -5
- package/dist/src/{extractor-BM3jRERL.js → extractor-CxRtnaHl.js} +5 -5
- package/dist/src/{fetch-Y5qX_kST.js → fetch-BufrQtvR.js} +90 -26
- package/dist/src/{fetch-B6ch2nU2.js → fetch-DXUnXkVU.js} +86 -26
- package/dist/src/{fetch-NuqXW1Xb.cjs → fetch-Dw4XZHjj.cjs} +115 -32
- package/dist/src/{fetch-D9xxyC1p.js → fetch-It34O8Ur.js} +90 -26
- package/dist/src/fetch-_YgGd2qv.js +3 -0
- package/dist/src/{fileExtensions-D9h-8Wxg.cjs → fileExtensions-BhdwzYaD.cjs} +24 -1
- package/dist/src/{fileExtensions-BGh-W-HT.js → fileExtensions-CXRfY3Ss.js} +12 -2
- package/dist/src/{fileExtensions-DysCsxNG.js → fileExtensions-D4GCJ67J.js} +12 -2
- package/dist/src/{formatDuration-Ch4A7G3o.js → formatDuration-CMVNrYvE.js} +1 -1
- package/dist/src/{genaiTracer-BokHC-MW.cjs → genaiTracer-14nugQQx.cjs} +14 -2
- package/dist/src/{genaiTracer-C3ZPQU60.js → genaiTracer-BPVvltoW.js} +2 -2
- package/dist/src/{genaiTracer-DxODqT9e.js → genaiTracer-D18lYzhB.js} +2 -2
- package/dist/src/{genaiTracer-CFny3gOy.js → genaiTracer-jJKYsnjc.js} +2 -2
- package/dist/src/goat-Ckd3q3AY.js +467 -0
- package/dist/src/goat-Qgurm-NP.js +466 -0
- package/dist/src/goat-ghadEDdy.js +465 -0
- package/dist/src/goat-una6pZGP.cjs +469 -0
- package/dist/src/graders-BDT7dif6.js +3 -0
- package/dist/src/{graders-CgPn32yp.js → graders-BGP99PdK.js} +1017 -84
- package/dist/src/{graders-BoUqsCEm.js → graders-BX0f2tvS.js} +1022 -84
- package/dist/src/{graders-CwrbifOo.js → graders-C0nXU_ZP.js} +1020 -82
- package/dist/src/{graders-Bw1wk_21.cjs → graders-ClrU2fnd.cjs} +1085 -128
- package/dist/src/hydra-BSNZZm2M.js +543 -0
- package/dist/src/hydra-BxdG4nkg.js +541 -0
- package/dist/src/hydra-DE4xWwyc.js +542 -0
- package/dist/src/hydra-DrJttnvw.cjs +542 -0
- package/dist/src/image-B4oBtu6J.js +443 -0
- package/dist/src/{image-Dr_3I3nK.js → image-BN-hjLL9.js} +3 -3
- package/dist/src/{image-BeWaInPF.js → image-B_fPIwdg.js} +3 -3
- package/dist/src/image-BvUAW344.js +442 -0
- package/dist/src/image-Cvjwx1uY.js +442 -0
- package/dist/src/{image-D10dNAav.cjs → image-DfVCGPbI.cjs} +4 -4
- package/dist/src/{image-qjO6FWPs.js → image-QzmydkiG.js} +3 -3
- package/dist/src/image-X0oY4350.cjs +465 -0
- package/dist/src/index.cjs +688 -313
- package/dist/src/index.d.cts +3152 -1617
- package/dist/src/index.d.ts +3151 -1616
- package/dist/src/index.js +582 -223
- package/dist/src/indirectWebPwn-02ZIghCS.js +259 -0
- package/dist/src/indirectWebPwn-BJ22AbQa.cjs +397 -0
- package/dist/src/indirectWebPwn-CbjUG0rh.js +385 -0
- package/dist/src/indirectWebPwn-CfQJt3gk.cjs +260 -0
- package/dist/src/indirectWebPwn-DBQhOjoD.js +260 -0
- package/dist/src/indirectWebPwn-OsXnKejv.js +259 -0
- package/dist/src/indirectWebPwn-tNx9OZ35.js +385 -0
- package/dist/src/indirectWebPwn-uyWdHx04.js +386 -0
- package/dist/src/inputVariables-B0qUChbV.js +467 -0
- package/dist/src/inputVariables-DUGMb9Ka.js +464 -0
- package/dist/src/inputVariables-DXFdi7AI.js +468 -0
- package/dist/src/inputVariables-Dq9W-Z3a.cjs +475 -0
- package/dist/src/{interactiveCheck-CCICw2cy.js → interactiveCheck-C4QlIuoR.js} +1 -1
- package/dist/src/{invariant-kfQ8Bu82.cjs → invariant-QtnLD03y.cjs} +1 -1
- package/dist/src/iterative-CpU6i2As.js +490 -0
- package/dist/src/iterative-DJQEQpG3.js +491 -0
- package/dist/src/iterative-DQBuWM-j.cjs +493 -0
- package/dist/src/iterative-FTS4Bz67.js +492 -0
- package/dist/src/iterativeImage-BUABMVOA.js +413 -0
- package/dist/src/iterativeImage-ByFWkxax.cjs +415 -0
- package/dist/src/iterativeImage-BzUapOUi.js +414 -0
- package/dist/src/iterativeImage-Doz8mgxF.js +413 -0
- package/dist/src/iterativeMeta-B3YiAOc8.js +386 -0
- package/dist/src/iterativeMeta-C7APE_P1.js +385 -0
- package/dist/src/iterativeMeta-CSS8M6Ds.cjs +385 -0
- package/dist/src/iterativeMeta-DgoQ7bLh.js +384 -0
- package/dist/src/iterativeTree-B5zxBBSW.js +769 -0
- package/dist/src/iterativeTree-CNyIk0Yn.js +768 -0
- package/dist/src/iterativeTree-CPMF10ve.cjs +771 -0
- package/dist/src/iterativeTree-DvZ7GBwt.js +770 -0
- package/dist/src/{knowledgeBase-Dr3Kib7F.js → knowledgeBase-BadkINlJ.js} +24 -10
- package/dist/src/{knowledgeBase-BBETc5-S.js → knowledgeBase-Bi_8sV-H.js} +23 -9
- package/dist/src/{knowledgeBase-CzAi2rUI.js → knowledgeBase-CkMljjdg.js} +24 -10
- package/dist/src/{knowledgeBase-C8qOo26M.cjs → knowledgeBase-DUh34xba.cjs} +25 -11
- package/dist/src/{litellm-DRc4qWfc.js → litellm-BKBo0jpC.js} +4 -4
- package/dist/src/{litellm-BLSiANhk.js → litellm-BXyn5kZK.js} +4 -4
- package/dist/src/{litellm-DQGo_juI.js → litellm-CNcfbCfa.js} +4 -4
- package/dist/src/{litellm-CaUmV7Mk.cjs → litellm-CtAr7bKG.cjs} +5 -5
- package/dist/src/{logger-COuQb2xB.cjs → logger-cfNpzI4o.cjs} +13 -55
- package/dist/src/{luma-ray-B-tNZzqW.js → luma-ray-BMX1iEB6.js} +5 -5
- package/dist/src/{luma-ray-CtS3OlGq.js → luma-ray-CR5TSpp4.js} +5 -5
- package/dist/src/{luma-ray-if-Ml4R9.cjs → luma-ray-D3FUc2K3.cjs} +9 -8
- package/dist/src/{luma-ray-PJJgUjOc.js → luma-ray-OEMmS1RB.js} +5 -5
- package/dist/src/main.js +704 -208
- package/dist/src/memoryPoisoning-CM83NWYl.js +107 -0
- package/dist/src/memoryPoisoning-D8h9gXJF.js +106 -0
- package/dist/src/memoryPoisoning-Dp-btinn.cjs +106 -0
- package/dist/src/memoryPoisoning-cLuCoTuJ.js +106 -0
- package/dist/src/{messages-CewuNcNS.js → messages-BabO-cX8.js} +17 -9
- package/dist/src/{messages-BnsVHUnm.cjs → messages-DBPir0TQ.cjs} +24 -15
- package/dist/src/{messages-B9dSjrNf.js → messages-DGUlSNU7.js} +18 -10
- package/dist/src/{messages-CI69Lasb.js → messages-vsE_-Lv0.js} +18 -10
- package/dist/src/{meteor-CeGo0Lu2.js → meteor--TZYICTI.js} +1 -1
- package/dist/src/{meteor-BBGcGeCa.cjs → meteor-CR226f7Z.cjs} +2 -2
- package/dist/src/{meteor-Wc_aUVvu.js → meteor-Cl_yd7rJ.js} +1 -1
- package/dist/src/{meteor-BKTM-7KS.js → meteor-Dce-_zGQ.js} +1 -1
- package/dist/src/mischievousUser-0l8GD7Dp.js +46 -0
- package/dist/src/mischievousUser-BUOP9W5r.js +46 -0
- package/dist/src/mischievousUser-frFYKxu6.js +47 -0
- package/dist/src/mischievousUser-olGgHIVR.cjs +46 -0
- package/dist/src/{modelslab-BkapYJhh.cjs → modelslab-CNV5bMSk.cjs} +7 -7
- package/dist/src/{modelslab-zpz9JcK0.js → modelslab-Cogmu4mG.js} +6 -6
- package/dist/src/{modelslab-D73OnKSx.js → modelslab-Dzst7VTU.js} +6 -6
- package/dist/src/{modelslab-BCLOtfek.js → modelslab-EyDczZ5A.js} +6 -6
- package/dist/src/{nova-reel-B8F_TK5w.js → nova-reel-BGPNBOMS.js} +5 -5
- package/dist/src/{nova-reel-Bx0NFV2f.js → nova-reel-B_5NKFu1.js} +5 -5
- package/dist/src/{nova-reel-CNGJTLtG.js → nova-reel-C4eUJGse.js} +5 -5
- package/dist/src/{nova-reel-DkT7tnoB.cjs → nova-reel-CjJRxI1X.cjs} +9 -8
- package/dist/src/{nova-sonic-BaXRN1cr.js → nova-sonic-BNGmgfFz.js} +3 -3
- package/dist/src/{nova-sonic-BeTRaFOh.js → nova-sonic-ChPlh5na.js} +2 -2
- package/dist/src/{nova-sonic-CL7Zqv0G.js → nova-sonic-CrV0iaY_.js} +3 -3
- package/dist/src/{nova-sonic-YT426juD.cjs → nova-sonic-DuOG9Aun.cjs} +5 -4
- package/dist/src/{openai-Cy1XLs0c.cjs → openai-C3uXv8wS.cjs} +2 -2
- package/dist/src/{openai-BT-JvDse.js → openai-CJrsh9n4.js} +1 -1
- package/dist/src/{openai-D4fxGvRx.js → openai-zgwBb4Ff.js} +1 -1
- package/dist/src/{openclaw-Bq7RVR3k.js → openclaw-BIHlu_36.js} +9 -8
- package/dist/src/{openclaw-DObVgpjC.js → openclaw-CF7fMido.js} +9 -8
- package/dist/src/{openclaw-DUBZP3GL.cjs → openclaw-Dphc01BY.cjs} +17 -15
- package/dist/src/{openclaw-DA8U4DsD.js → openclaw-zIJAsz3P.js} +9 -8
- package/dist/src/{opencode-sdk-BB40Wir1.js → opencode-sdk-B3vlPLsp.js} +38 -3
- package/dist/src/{opencode-sdk-ChdK7F7z.js → opencode-sdk-D05JSgMQ.js} +39 -4
- package/dist/src/{opencode-sdk-CeqiOcOU.cjs → opencode-sdk-DoY6GbWw.cjs} +45 -9
- package/dist/src/{opencode-sdk-BM1UAIv1.js → opencode-sdk-sRKYHGoI.js} +39 -4
- package/dist/src/{otlpReceiver-UYMQx3sy.js → otlpReceiver--gTpSagc.js} +119 -3
- package/dist/src/{otlpReceiver-C6thJRXi.js → otlpReceiver-B2eaKC8C.js} +118 -2
- package/dist/src/{otlpReceiver-CcdIikOu.js → otlpReceiver-BXjcRqAM.js} +119 -3
- package/dist/src/{otlpReceiver-DNSQj6bf.cjs → otlpReceiver-CvJdBGSc.cjs} +125 -7
- package/dist/src/packageParser--MWTSrPW.js +36 -0
- package/dist/src/packageParser-CgE-ziRo.js +35 -0
- package/dist/src/packageParser-QoCS1FMl.cjs +54 -0
- package/dist/src/packageParser-hwwSGnAZ.js +35 -0
- package/dist/src/processShim-BBxt7LKO.js +95 -0
- package/dist/src/processShim-BcGzU8fY.js +94 -0
- package/dist/src/processShim-C_z3aRvF.js +94 -0
- package/dist/src/processShim-DSY9BV2T.cjs +98 -0
- package/dist/src/promptLength-0qIHyhA5.js +71 -0
- package/dist/src/promptLength-4X-Wd8PG.js +72 -0
- package/dist/src/promptLength-B9nZEfO6.js +71 -0
- package/dist/src/promptLength-BbBbDHNj.cjs +94 -0
- package/dist/src/promptfoo-BDrfT30-.js +180 -0
- package/dist/src/promptfoo-Cm4hiy1Y.js +180 -0
- package/dist/src/promptfoo-Rjp-MeBb.js +181 -0
- package/dist/src/promptfoo-b-baRMj-.cjs +205 -0
- package/dist/src/prompts-BYMtqPCw.js +259 -0
- package/dist/src/prompts-C-bqE1Yp.js +260 -0
- package/dist/src/prompts-Cp_Qx5Ml.js +270 -0
- package/dist/src/prompts-DHhQsANy.js +259 -0
- package/dist/src/prompts-D_QpZ2Dm.js +271 -0
- package/dist/src/prompts-hNvWBD3z.cjs +284 -0
- package/dist/src/prompts-huDVH2CI.js +270 -0
- package/dist/src/prompts-p78Hul5i.cjs +289 -0
- package/dist/src/{providerRegistry-BESeALrr.cjs → providerRegistry-CZO_w7ue.cjs} +2 -2
- package/dist/src/{providerRegistry-DoACwqhD.js → providerRegistry-DHcFiVWX.js} +1 -1
- package/dist/src/{providerRegistry-PMsleEzs.js → providerRegistry-ReCd0sFa.js} +1 -1
- package/dist/src/{providers-DT-GtF2t.js → providers-B9KzWxAX.js} +739 -11919
- package/dist/src/{providers-DRrerKra.js → providers-BCCz6_IX.js} +813 -11944
- package/dist/src/{providers-eDShy16E.cjs → providers-BDVVIQM6.cjs} +787 -12132
- package/dist/src/{providers-Ctcc592x.js → providers-BYAn82cf.js} +1 -1
- package/dist/src/{providers-CJh7iriU.js → providers-DVYRZP4E.js} +746 -11866
- package/dist/src/{pythonUtils-C4tltmIn.js → pythonUtils-CLCgQ9tt.js} +1 -1
- package/dist/src/{pythonUtils-DNqbnRdx.js → pythonUtils-CgYxeSmO.js} +2 -2
- package/dist/src/{pythonUtils-CoLaCwNY.cjs → pythonUtils-Cokhluq3.cjs} +7 -6
- package/dist/src/{pythonUtils-DMO68Jg7.js → pythonUtils-D0BYebvX.js} +2 -2
- package/dist/src/{quiverai-Bpx6MZ7T.cjs → quiverai-BAp6iTZD.cjs} +4 -4
- package/dist/src/{quiverai-CPKhWgaT.js → quiverai-BvIhI_0l.js} +3 -3
- package/dist/src/{quiverai-BSS9a7wV.js → quiverai-CdTWPe-A.js} +3 -3
- package/dist/src/{quiverai-Bk1KrvL6.js → quiverai-Cv7rJKDz.js} +3 -3
- package/dist/src/registry-BUJrgjwv.js +124 -0
- package/dist/src/registry-DXm1t_x0.js +125 -0
- package/dist/src/registry-Dp5EqoXc.js +124 -0
- package/dist/src/registry-KCVF1CFC.cjs +124 -0
- package/dist/src/{server-ByxbqAcQ.js → remoteGeneration-B1_XsKXU.js} +16 -147
- package/dist/src/{server-gyd6d4Hc.js → remoteGeneration-COpWcmWd.js} +15 -108
- package/dist/src/{server-BEECpeGG.cjs → remoteGeneration-DS9N3pgB.cjs} +30 -119
- package/dist/src/remoteGeneration-DsaSwmG2.js +217 -0
- package/dist/src/render-BNTrbmBw.cjs +384 -0
- package/dist/src/render-CSP99NLm.js +348 -0
- package/dist/src/render-DFfDeYUK.js +347 -0
- package/dist/src/{render-nj-UaPdn.js → render-DznWrxGO.js} +2 -2
- package/dist/src/render-_6ur1fhE.js +347 -0
- package/dist/src/resourceAttributes-D1jP3kL5.js +17 -0
- package/dist/src/resourceAttributes-DQbBB--2.js +16 -0
- package/dist/src/resourceAttributes-ephgOvdR.cjs +27 -0
- package/dist/src/resourceAttributes-v6-I67fn.js +16 -0
- package/dist/src/{responses-CF-ayauu.cjs → responses-1UFFF9N_.cjs} +12 -11
- package/dist/src/{responses-B8haB-mD.js → responses-B3W2JvOQ.js} +9 -9
- package/dist/src/{responses-1ztiVYsx.js → responses-B6ktc3Ra.js} +7 -7
- package/dist/src/{responses-BiaBguAu.js → responses-URRzV8qE.js} +9 -9
- package/dist/src/rolldown-runtime-D_mwlA32.cjs +43 -0
- package/dist/src/rubyUtils-BYVlQ94c.js +3 -0
- package/dist/src/{rubyUtils-CIQFnVz4.js → rubyUtils-CXlFM2rR.js} +2 -2
- package/dist/src/{rubyUtils-BI0p46eZ.js → rubyUtils-CnlW8AYb.js} +2 -2
- package/dist/src/{rubyUtils-DoifqkiA.cjs → rubyUtils-CqUWBZAt.cjs} +16 -26
- package/dist/src/{rubyUtils-DGnoCYL2.js → rubyUtils-DdGojpfv.js} +1 -1
- package/dist/src/runtimeTransform-BJOpL9Yc.js +142 -0
- package/dist/src/runtimeTransform-Dgh_D7DU.js +143 -0
- package/dist/src/runtimeTransform-DigbjU1r.js +142 -0
- package/dist/src/runtimeTransform-ON3YYILw.cjs +147 -0
- package/dist/src/{sagemaker-ClS_NB07.js → sagemaker-CujrzP1a.js} +61 -50
- package/dist/src/{sagemaker-ljtY12VM.cjs → sagemaker-DzffAqo_.cjs} +65 -53
- package/dist/src/{sagemaker-C5T60MKf.js → sagemaker-vhtSV7JI.js} +61 -50
- package/dist/src/{sagemaker-BDLeW29y.js → sagemaker-yr1QKeBs.js} +61 -50
- package/dist/src/{scanner-nOCWNIXa.js → scanner-DS0109SS.js} +6 -6
- package/dist/src/server/index.js +4147 -449
- package/dist/src/server-B8rqV126.cjs +126 -0
- package/dist/src/server-BaLytskk.js +3 -0
- package/dist/src/server-CMJD10J4.js +107 -0
- package/dist/src/server-Ddp8GNMp.js +146 -0
- package/dist/src/server-DhMHosWj.js +182 -0
- package/dist/src/shared-7pmVZLNO.js +1334 -0
- package/dist/src/shared-9WHQ1oNE.js +1335 -0
- package/dist/src/{fileExtensions-8CjoL7vB.js → shared-BoG7qLMv.js} +12 -2
- package/dist/src/shared-D6IjElRI.js +1334 -0
- package/dist/src/shared-WkgnDkcg.cjs +1436 -0
- package/dist/src/{signal-DTtUuU3l.js → signal-CSurUUyV.js} +2 -2
- package/dist/src/simulatedUser-C9aQObBI.js +222 -0
- package/dist/src/simulatedUser-Cu601Dd4.cjs +227 -0
- package/dist/src/simulatedUser-U_qAHnuB.js +222 -0
- package/dist/src/simulatedUser-p3tACcmw.js +223 -0
- package/dist/src/{slack-Bamy_7te.js → slack-Bapo-7_8.js} +1 -1
- package/dist/src/{slack-BLlsDpfG.cjs → slack-DMC1QVEg.cjs} +3 -2
- package/dist/src/{slack-BPYLQLgb.js → slack-DTEFhrMn.js} +1 -1
- package/dist/src/{slack-4zZX1OKP.js → slack-k-_CP84Q.js} +1 -1
- package/dist/src/storage-BU4qcnOb.js +875 -0
- package/dist/src/storage-CA-v9V2v.cjs +911 -0
- package/dist/src/storage-CD-GWAdx.js +822 -0
- package/dist/src/storage-QdU-SmvD.js +834 -0
- package/dist/src/{store-2K0kDi80.cjs → store-B2NDDooM.cjs} +60 -24
- package/dist/src/{store-CPh25336.js → store-DKd5592Q.js} +50 -19
- package/dist/src/{store-BPkzEyFM.js → store-HpopRVzl.js} +50 -19
- package/dist/src/store-IbiRIF3k.js +3 -0
- package/dist/src/strategies-7CS3Alao.cjs +2360 -0
- package/dist/src/strategies-CiSeroPH.js +2331 -0
- package/dist/src/strategies-DRJjGTIY.js +2333 -0
- package/dist/src/{tables-WgdUZ8Ck.js → tables-CRSXQ2Ke.js} +2 -2
- package/dist/src/{tables-BMSOS2Gg.js → tables-CxjU7bBd.js} +2 -2
- package/dist/src/{tables-CXbaZ9y1.cjs → tables-DBIJU0WE.cjs} +6 -5
- package/dist/src/{tables-NlvH23ky.js → tables-DafUHOeh.js} +2 -2
- package/dist/src/{telemetry-DWdGHvEf.js → telemetry-00ezXr_t.js} +4 -4
- package/dist/src/telemetry-ByPqDcKC.js +3 -0
- package/dist/src/{telemetry-CEQxGnMZ.cjs → telemetry-CJ7FnCsc.cjs} +15 -9
- package/dist/src/{telemetry--iqaGyaS.js → telemetry-DmXYcJNV.js} +4 -4
- package/dist/src/{telemetry-CgdVGV8N.js → telemetry-DwX9XUN5.js} +4 -4
- package/dist/src/{text-DDQP0tuQ.js → text-CZr46tp_.js} +1 -1
- package/dist/src/{text-D4lz-Jg_.js → text-Db-Wt2u2.js} +1 -1
- package/dist/src/{text-NWvfMfkF.js → text-DwYK5EBn.js} +1 -1
- package/dist/src/{text-BiNME7QG.cjs → text-nywWsRBM.cjs} +1 -1
- package/dist/src/{tokenUsageUtils-2wIvAhB3.js → tokenUsageUtils-CDet74yk.js} +1 -1
- package/dist/src/{tokenUsageUtils-4c780gFd.js → tokenUsageUtils-CmnQ0G2m.js} +1 -1
- package/dist/src/{tokenUsageUtils-C9odhsbW.cjs → tokenUsageUtils-_B-P8IAi.cjs} +1 -1
- package/dist/src/toolAttributes-BAjwcBf0.cjs +103 -0
- package/dist/src/toolAttributes-COVgDrBG.js +87 -0
- package/dist/src/toolAttributes-DJ9ZEKXD.js +86 -0
- package/dist/src/tracingOptions-BnwKCkSB.js +221 -0
- package/dist/src/tracingOptions-Chi74lOD.js +219 -0
- package/dist/src/tracingOptions-DrbSFaKy.cjs +249 -0
- package/dist/src/tracingOptions-ji2OuXbT.js +220 -0
- package/dist/src/{transcription-84t4ALo2.js → transcription-B8uIgCYX.js} +5 -5
- package/dist/src/{transcription-Bm2emLmJ.js → transcription-CfU5loSq.js} +5 -5
- package/dist/src/{transcription-D7Q0vJsh.js → transcription-Dkd22_4K.js} +4 -4
- package/dist/src/{transcription-CZ4LG5hQ.cjs → transcription-mzuf18Mq.cjs} +9 -8
- package/dist/src/{transform-DtooZqYY.js → transform-BIMynQsA.js} +8 -8
- package/dist/src/transform-BnSTnFlp.js +187 -0
- package/dist/src/transform-BnSXWmU_2.cjs +221 -0
- package/dist/src/transform-CGt7Kt3y2.js +186 -0
- package/dist/src/transform-CrPGTsij.js +186 -0
- package/dist/src/{transform-Dg4LcO1Y.cjs → transform-DhNkAUs8.cjs} +12 -11
- package/dist/src/{transform-_DpNB4qp.js → transform-DmvYBRll.js} +8 -8
- package/dist/src/{transform-B-b6Cq-q.js → transform-EtD4jAWi.js} +8 -8
- package/dist/src/{transformersAvailability-lvCCvuPT.js → transformersAvailability-0ThtPved.js} +1 -1
- package/dist/src/transformersAvailability-BYydDE5U.js +35 -0
- package/dist/src/{transformersAvailability-rJGPccjr.js → transformersAvailability-BvyU9vDD.js} +1 -1
- package/dist/src/{transformersAvailability-B22swDxr.cjs → transformersAvailability-BytPvKUW.cjs} +1 -1
- package/dist/src/{types-BVH9hjgW.js → types-BFevViUY.js} +113 -19
- package/dist/src/{types-BDjGOq4E.js → types-BJQBBPTP.js} +113 -19
- package/dist/src/{types-CgG2rKiW.cjs → types-CxJvaY2S.cjs} +211 -28
- package/dist/src/{types-DNRZVOue.js → types-D6glLbdF.js} +125 -26
- package/dist/src/{util-DFPeFkiV.js → util--WMgw7wM.js} +28 -8
- package/dist/src/{util-C-kmRosx.js → util-5WnCSb0h.js} +9 -7
- package/dist/src/{util-A5_ZsQUn.cjs → util-BSIuSLVK.cjs} +12 -9
- package/dist/src/{util-Dub0f_ej.js → util-Bx677_k2.js} +17 -10
- package/dist/src/util-CN8om2rz.cjs +386 -0
- package/dist/src/{util-DN0-b81k.js → util-CoQWM76y.js} +28 -8
- package/dist/src/util-DNl96nNs.js +327 -0
- package/dist/src/{util-BQOCAHQC.js → util-DURocbYR.js} +46 -11
- package/dist/src/util-Df8YMvS1.js +327 -0
- package/dist/src/{util-BVXcTwXu.js → util-DiQ3QvBB.js} +28 -8
- package/dist/src/{util-3pBZZb_H.js → util-I-Rf-KaD.js} +45 -10
- package/dist/src/{util-Dpmm_dAI.cjs → util-IYzs5Y04.cjs} +33 -7
- package/dist/src/{util-BlFVL0UF.js → util-LKTmNsMQ.js} +9 -7
- package/dist/src/{util-DvpHnLt0.cjs → util-SPsvFONY.cjs} +29 -21
- package/dist/src/{util-B9CNhyac.js → util-efByNxcr.js} +9 -7
- package/dist/src/util-kDURhgJW.js +328 -0
- package/dist/src/{utils-BUMN8orw.js → utils-B0lzitHZ.js} +2 -2
- package/dist/src/{utils-kt7lv30R.js → utils-BFOh20Gb.js} +2 -2
- package/dist/src/{utils-o8S5huU2.js → utils-BGY69tk_.js} +2 -2
- package/dist/src/{utils-DkVeShIB.cjs → utils-Ve6kuJsa.cjs} +3 -3
- package/dist/src/{version-CbuBKu2U.js → version-BK20a4sw.js} +2 -2
- package/dist/src/{version-D9zu9FWB.cjs → version-BWCSaByA.cjs} +2 -2
- package/dist/src/{version-CbpiUINz.js → version-eRkNuGv8.js} +2 -2
- package/dist/src/{version-0frU0UTr.js → version-lpHV_53E.js} +2 -2
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +48 -22
- package/dist/src/app/assets/Report-vjzrbgce.js +0 -1
- package/dist/src/app/assets/index-B3NQ8HTd.js +0 -385
- package/dist/src/app/assets/index-Cli2yAXv.css +0 -1
- package/dist/src/app/assets/sync-IjzpWrOE.js +0 -4
- package/dist/src/app/assets/vendor-charts-BNdH8TCw.js +0 -36
- package/dist/src/cache-BRkhlH3k.cjs +0 -3
- package/dist/src/cache-BlC6aeJ0.js +0 -3
- package/dist/src/cloud-CoD5OacT.js +0 -3
- package/dist/src/codex-sdk-1jm_qPHf.js +0 -3
- package/dist/src/codex-sdk-Danroptg.cjs +0 -2
- package/dist/src/evalResult-BBJAHAtw.cjs +0 -2
- package/dist/src/evalResult-BBK58h2B.js +0 -3
- package/dist/src/evalResult-spPqh1G_.js +0 -2
- package/dist/src/evaluator-DgLKaZk8.js +0 -3
- package/dist/src/fetch-8viavNv8.js +0 -3
- package/dist/src/graders-C84JI-m5.js +0 -2
- package/dist/src/graders-CBbd0K0Q.cjs +0 -2
- package/dist/src/graders-CbQqpHSN.js +0 -3
- package/dist/src/graders-DS42d3ZG.js +0 -2
- package/dist/src/image-BmilRNqO.js +0 -258
- package/dist/src/image-CxJoa3aW.cjs +0 -280
- package/dist/src/image-DsGRlkh7.js +0 -257
- package/dist/src/image-a_SGUobh.js +0 -257
- package/dist/src/providers-BuyzKt7C.js +0 -2
- package/dist/src/providers-C7lNVBjX.cjs +0 -3
- package/dist/src/providers-CCE2COJi2.js +0 -2
- package/dist/src/render-7uNJ2V14.js +0 -135
- package/dist/src/render-DlscvAUJ.js +0 -135
- package/dist/src/render-eui5p5mL.js +0 -136
- package/dist/src/render-tG6ir9_g.cjs +0 -165
- package/dist/src/rubyUtils-4hjGxvju.js +0 -3
- package/dist/src/rubyUtils-CO-tuszQ.cjs +0 -2
- package/dist/src/server-ByiF3qlg.js +0 -386
- package/dist/src/server-C0XKRNB_.cjs +0 -2
- package/dist/src/server-C_15p79-.js +0 -3
- package/dist/src/store-2OXm_eBY.js +0 -240
- package/dist/src/store-BELqNwvz.js +0 -3
- package/dist/src/store-uQZ4AjPe.cjs +0 -2
- package/dist/src/telemetry-DjNoC_n3.cjs +0 -2
- package/dist/src/telemetry-ZdPZc0fm.js +0 -3
- package/dist/src/transform-BQt0BeAW.js +0 -3
- package/dist/src/transform-Bq5oqC0s.cjs +0 -2
- package/dist/src/transform-C9izGX54.cjs +0 -228
- package/dist/src/transform-CwbAZ84V.js +0 -216
- package/dist/src/transform-DzCF-wqV.js +0 -213
- package/dist/src/transform-eGiUAv86.js +0 -216
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { t as __exportAll } from "./chunk-DEq-mXcV.js";
|
|
2
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-
|
|
3
|
+
import { n as VERSION } from "./version-BK20a4sw.js";
|
|
4
4
|
import { t as invariant } from "./invariant-DIYf9sP1.js";
|
|
5
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
5
6
|
import * as fs$2 from "fs";
|
|
6
7
|
import * as path$1 from "path";
|
|
7
8
|
import path from "path";
|
|
@@ -61,8 +62,8 @@ function calculateCost(modelName, config, promptTokens, completionTokens, models
|
|
|
61
62
|
const model = models.find((m) => m.id === modelName);
|
|
62
63
|
if (!model || !model.cost) return;
|
|
63
64
|
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;
|
|
65
|
+
const inputCost = config.inputCost ?? config.cost ?? longContextCost?.input ?? model.cost.input;
|
|
66
|
+
const outputCost = config.outputCost ?? config.cost ?? longContextCost?.output ?? model.cost.output;
|
|
66
67
|
return inputCost * promptTokens + outputCost * completionTokens;
|
|
67
68
|
}
|
|
68
69
|
/**
|
|
@@ -469,7 +470,10 @@ function writeGlobalConfigPartial(partialConfig) {
|
|
|
469
470
|
});
|
|
470
471
|
writeGlobalConfig(updatedConfig);
|
|
471
472
|
}
|
|
472
|
-
|
|
473
|
+
//#endregion
|
|
474
|
+
//#region src/globalConfig/cloud.ts
|
|
475
|
+
const CLOUD_API_HOST = "https://api.promptfoo.app";
|
|
476
|
+
const API_HOST = getEnvString("API_HOST", CLOUD_API_HOST);
|
|
473
477
|
const SHARING_CUTOFF_DATE = /* @__PURE__ */ new Date("2026-03-09T00:00:00Z");
|
|
474
478
|
var CloudConfig = class {
|
|
475
479
|
config;
|
|
@@ -652,6 +656,14 @@ function isConnectionError(error) {
|
|
|
652
656
|
/**
|
|
653
657
|
* Enhanced fetch wrapper that adds logging, authentication, error handling, and optional compression
|
|
654
658
|
*/
|
|
659
|
+
function isPromptfooCloudApiHost(url) {
|
|
660
|
+
try {
|
|
661
|
+
const targetUrl = url instanceof Request ? url.url : url.toString();
|
|
662
|
+
return new URL(targetUrl).origin === CLOUD_API_HOST;
|
|
663
|
+
} catch {
|
|
664
|
+
return false;
|
|
665
|
+
}
|
|
666
|
+
}
|
|
655
667
|
async function monkeyPatchFetch(url, options) {
|
|
656
668
|
const NO_LOG_URLS = [
|
|
657
669
|
R_ENDPOINT,
|
|
@@ -671,7 +683,7 @@ async function monkeyPatchFetch(url, options) {
|
|
|
671
683
|
} catch (e) {
|
|
672
684
|
logger.warn(`Failed to compress request body: ${e}`);
|
|
673
685
|
}
|
|
674
|
-
if (
|
|
686
|
+
if (isPromptfooCloudApiHost(url)) {
|
|
675
687
|
const token = cloudConfig.getApiKey();
|
|
676
688
|
opts.headers = {
|
|
677
689
|
...opts.headers || {},
|
|
@@ -705,11 +717,31 @@ async function monkeyPatchFetch(url, options) {
|
|
|
705
717
|
}
|
|
706
718
|
}
|
|
707
719
|
//#endregion
|
|
720
|
+
//#region src/util/fetch/retryContext.ts
|
|
721
|
+
const fetchRetryContext = new AsyncLocalStorage();
|
|
722
|
+
/**
|
|
723
|
+
* Run `fn` with a fetch retry context so nested `fetchWithRetries` /
|
|
724
|
+
* `fetchWithProxy` calls inherit the provider's configured `maxRetries`.
|
|
725
|
+
*
|
|
726
|
+
* When `maxRetries` is `undefined`, the new scope deliberately shadows any
|
|
727
|
+
* outer provider context so providers without an override fall back to defaults.
|
|
728
|
+
*/
|
|
729
|
+
function withFetchRetryContext(maxRetries, fn) {
|
|
730
|
+
return fetchRetryContext.run({ maxRetries }, fn);
|
|
731
|
+
}
|
|
732
|
+
/**
|
|
733
|
+
* Read the active context's `maxRetries`, or `undefined` when none is set.
|
|
734
|
+
*/
|
|
735
|
+
function getFetchRetryContextMaxRetries() {
|
|
736
|
+
return fetchRetryContext.getStore()?.maxRetries;
|
|
737
|
+
}
|
|
738
|
+
//#endregion
|
|
708
739
|
//#region src/util/fetch/index.ts
|
|
709
740
|
var fetch_exports = /* @__PURE__ */ __exportAll({
|
|
710
741
|
fetchWithProxy: () => fetchWithProxy,
|
|
711
742
|
fetchWithRetries: () => fetchWithRetries,
|
|
712
743
|
fetchWithTimeout: () => fetchWithTimeout,
|
|
744
|
+
getFetchWithProxyHeaders: () => getFetchWithProxyHeaders,
|
|
713
745
|
handleRateLimit: () => handleRateLimit,
|
|
714
746
|
isRateLimited: () => isRateLimited,
|
|
715
747
|
isTransientError: () => isTransientError
|
|
@@ -764,20 +796,44 @@ function getOrCreateProxyAgent(proxyUrl, tlsOptions) {
|
|
|
764
796
|
cachedProxyAgents.set(cacheKey, agent);
|
|
765
797
|
return agent;
|
|
766
798
|
}
|
|
799
|
+
/**
|
|
800
|
+
* Resolve whether to disable transient-error retries. An explicit caller flag
|
|
801
|
+
* always wins (a caller may opt back in even when the provider set
|
|
802
|
+
* `maxRetries: 0`); otherwise we disable only when the retry context carries
|
|
803
|
+
* `maxRetries === 0`.
|
|
804
|
+
*/
|
|
805
|
+
function resolveTransientRetryDisabled(explicit) {
|
|
806
|
+
if (explicit !== void 0) return explicit;
|
|
807
|
+
return getFetchRetryContextMaxRetries() === 0;
|
|
808
|
+
}
|
|
809
|
+
function headersInitToRecord(headers) {
|
|
810
|
+
if (!headers) return {};
|
|
811
|
+
if (headers instanceof Headers) return Object.fromEntries(headers.entries());
|
|
812
|
+
if (Array.isArray(headers)) return Object.fromEntries(new Headers(headers).entries());
|
|
813
|
+
return { ...headers };
|
|
814
|
+
}
|
|
815
|
+
function getFetchWithProxyHeaders(url, options) {
|
|
816
|
+
const requestHeaders = url instanceof Request && options.headers === void 0 ? headersInitToRecord(url.headers) : {};
|
|
817
|
+
const optionHeaders = headersInitToRecord(options.headers);
|
|
818
|
+
return {
|
|
819
|
+
...requestHeaders,
|
|
820
|
+
...optionHeaders,
|
|
821
|
+
"x-promptfoo-version": VERSION
|
|
822
|
+
};
|
|
823
|
+
}
|
|
824
|
+
function getFetchUrlString(url) {
|
|
825
|
+
if (typeof url === "string") return url;
|
|
826
|
+
if (url instanceof URL) return url.toString();
|
|
827
|
+
if (url instanceof Request) return url.url;
|
|
828
|
+
}
|
|
767
829
|
async function fetchWithProxy(url, options = {}, abortSignal) {
|
|
768
830
|
let finalUrl = url;
|
|
769
|
-
let finalUrlString;
|
|
770
|
-
if (typeof url === "string") finalUrlString = url;
|
|
771
|
-
else if (url instanceof URL) finalUrlString = url.toString();
|
|
772
|
-
else if (url instanceof Request) finalUrlString = url.url;
|
|
831
|
+
let finalUrlString = getFetchUrlString(url);
|
|
773
832
|
if (!finalUrlString) throw new Error("Invalid URL");
|
|
774
833
|
const combinedSignal = abortSignal ? options.signal ? AbortSignal.any([options.signal, abortSignal]) : abortSignal : options.signal;
|
|
775
834
|
const finalOptions = {
|
|
776
835
|
...options,
|
|
777
|
-
headers:
|
|
778
|
-
...options.headers,
|
|
779
|
-
"x-promptfoo-version": VERSION
|
|
780
|
-
},
|
|
836
|
+
headers: getFetchWithProxyHeaders(url, options),
|
|
781
837
|
signal: combinedSignal
|
|
782
838
|
};
|
|
783
839
|
if (typeof url === "string") try {
|
|
@@ -815,10 +871,11 @@ async function fetchWithProxy(url, options = {}, abortSignal) {
|
|
|
815
871
|
logger.debug(`Using proxy: ${sanitizeUrl(proxyUrl)}`);
|
|
816
872
|
finalOptions.dispatcher = getOrCreateProxyAgent(proxyUrl, tlsOptions);
|
|
817
873
|
} else finalOptions.dispatcher = getOrCreateAgent(tlsOptions);
|
|
818
|
-
const
|
|
874
|
+
const disableTransientRetries = resolveTransientRetryDisabled(options.disableTransientRetries);
|
|
875
|
+
const maxTransientRetries = disableTransientRetries ? 0 : 3;
|
|
819
876
|
for (let attempt = 0; attempt <= maxTransientRetries; attempt++) {
|
|
820
877
|
const response = await monkeyPatchFetch(finalUrl, finalOptions);
|
|
821
|
-
if (!
|
|
878
|
+
if (!disableTransientRetries && isTransientError(response) && attempt < maxTransientRetries) {
|
|
822
879
|
const backoffMs = Math.pow(2, attempt) * 1e3;
|
|
823
880
|
logger.debug(`Transient error (${response.status} ${response.statusText}), retry ${attempt + 1}/${maxTransientRetries} after ${backoffMs}ms`);
|
|
824
881
|
await sleep(backoffMs);
|
|
@@ -891,8 +948,17 @@ function isTransientError(response) {
|
|
|
891
948
|
default: return false;
|
|
892
949
|
}
|
|
893
950
|
}
|
|
951
|
+
function formatFetchErrorMessage(error) {
|
|
952
|
+
if (!(error instanceof Error)) return String(error);
|
|
953
|
+
const typedError = error;
|
|
954
|
+
let message = `${typedError.name}: ${typedError.message}`;
|
|
955
|
+
if (typedError.cause) message += ` (Cause: ${typedError.cause})`;
|
|
956
|
+
if (typedError.code) message += ` (Code: ${typedError.code})`;
|
|
957
|
+
return message;
|
|
958
|
+
}
|
|
894
959
|
async function fetchWithRetries(url, options = {}, timeout, maxRetries) {
|
|
895
|
-
|
|
960
|
+
const contextMaxRetries = getFetchRetryContextMaxRetries();
|
|
961
|
+
maxRetries = Math.max(0, maxRetries ?? contextMaxRetries ?? 4);
|
|
896
962
|
let lastErrorMessage;
|
|
897
963
|
const backoff = getEnvInt("PROMPTFOO_REQUEST_BACKOFF_MS", 5e3);
|
|
898
964
|
for (let i = 0; i <= maxRetries; i++) {
|
|
@@ -904,21 +970,19 @@ async function fetchWithRetries(url, options = {}, timeout, maxRetries) {
|
|
|
904
970
|
}, timeout);
|
|
905
971
|
if (getEnvBool("PROMPTFOO_RETRY_5XX") && response.status >= 500 && response.status < 600) throw new Error(`Internal Server Error: ${response.status} ${response.statusText}`);
|
|
906
972
|
if (response && isRateLimited(response)) {
|
|
907
|
-
logger.debug(`Rate limited on URL ${url}: ${response.status} ${response.statusText}, attempt ${i + 1}/${maxRetries + 1}, waiting before retry...`);
|
|
908
973
|
lastErrorMessage = `Rate limited: ${response.status} ${response.statusText}`;
|
|
974
|
+
if (i >= maxRetries) {
|
|
975
|
+
logger.debug(`Rate limited on URL ${url}: ${response.status} ${response.statusText}, attempt ${i + 1}/${maxRetries + 1}, no retries remain.`);
|
|
976
|
+
break;
|
|
977
|
+
}
|
|
978
|
+
logger.debug(`Rate limited on URL ${url}: ${response.status} ${response.statusText}, attempt ${i + 1}/${maxRetries + 1}, waiting before retry...`);
|
|
909
979
|
await handleRateLimit(response);
|
|
910
980
|
continue;
|
|
911
981
|
}
|
|
912
982
|
return response;
|
|
913
983
|
} catch (error) {
|
|
914
984
|
if (error instanceof Error && error.name === "AbortError") throw error;
|
|
915
|
-
|
|
916
|
-
if (error instanceof Error) {
|
|
917
|
-
const typedError = error;
|
|
918
|
-
errorMessage = `${typedError.name}: ${typedError.message}`;
|
|
919
|
-
if (typedError.cause) errorMessage += ` (Cause: ${typedError.cause})`;
|
|
920
|
-
if (typedError.code) errorMessage += ` (Code: ${typedError.code})`;
|
|
921
|
-
} else errorMessage = String(error);
|
|
985
|
+
const errorMessage = formatFetchErrorMessage(error);
|
|
922
986
|
logger.debug(`Request to ${url} failed (attempt #${i + 1}), retrying: ${errorMessage}`);
|
|
923
987
|
if (i < maxRetries) await sleep(Math.pow(2, i) * (backoff + 1e3 * Math.random()));
|
|
924
988
|
lastErrorMessage = errorMessage;
|
|
@@ -927,6 +991,6 @@ async function fetchWithRetries(url, options = {}, timeout, maxRetries) {
|
|
|
927
991
|
throw new Error(`Request failed after ${maxRetries} retries: ${lastErrorMessage}`);
|
|
928
992
|
}
|
|
929
993
|
//#endregion
|
|
930
|
-
export {
|
|
994
|
+
export { CONSENT_ENDPOINT as A, openaiToolChoiceToBedrock as C, transformToolChoice as D, toTitleCase as E, getDefaultShareViewBaseUrl as F, getShareApiBaseUrl as I, getShareViewBaseUrl as L, R_ENDPOINT as M, TERMINAL_MAX_WIDTH as N, transformTools as O, getDefaultPort as P, FILE_METADATA_KEY as R, isPromptfooSampleTarget as S, parseChatPrompt as T, LONG_RUNNING_MODEL_TIMEOUT_MS as _, getFetchWithProxyHeaders as a, isOpenAIToolArray as b, CloudConfig as c, writeGlobalConfig as d, writeGlobalConfigPartial as f, parseRetryAfter as g, parseRateLimitHeaders as h, fetch_exports as i, EVENTS_ENDPOINT as j, CLOUD_PROVIDER_PREFIX as k, cloudConfig as l, sleep as m, fetchWithRetries as n, withFetchRetryContext as o, getCurrentTimestamp as p, fetchWithTimeout as r, isPromptfooCloudApiHost as s, fetchWithProxy as t, readGlobalConfig as u, REQUEST_TIMEOUT_MS as v, openaiToolsToBedrock as w, isOpenAIToolChoice as x, calculateCost as y, HUMAN_ASSERTION_TYPE as z };
|
|
931
995
|
|
|
932
|
-
//# sourceMappingURL=fetch-
|
|
996
|
+
//# sourceMappingURL=fetch-BufrQtvR.js.map
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { D as getEnvInt, N as state, O as getEnvString, T as getEnvBool, h as sanitizeUrl, o as logRequestResponse, s as logger } from "./logger-BbY6ypFL.js";
|
|
3
|
-
import { n as VERSION } from "./version-
|
|
3
|
+
import { n as VERSION } from "./version-eRkNuGv8.js";
|
|
4
4
|
import { t as invariant } from "./invariant-B2Rf6avk.js";
|
|
5
|
-
import { a as cloudConfig } from "./cloud-
|
|
5
|
+
import { a as cloudConfig, n as CLOUD_API_HOST } from "./cloud-D3DiFqH6.js";
|
|
6
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
6
7
|
import path from "path";
|
|
7
8
|
import yaml from "js-yaml";
|
|
8
9
|
import * as fsPromises from "fs/promises";
|
|
@@ -60,8 +61,8 @@ function calculateCost(modelName, config, promptTokens, completionTokens, models
|
|
|
60
61
|
const model = models.find((m) => m.id === modelName);
|
|
61
62
|
if (!model || !model.cost) return;
|
|
62
63
|
const longContextCost = model.cost.longContext && promptTokens > model.cost.longContext.threshold ? model.cost.longContext : void 0;
|
|
63
|
-
const inputCost = config.cost ?? longContextCost?.input ?? model.cost.input;
|
|
64
|
-
const outputCost = config.cost ?? longContextCost?.output ?? model.cost.output;
|
|
64
|
+
const inputCost = config.inputCost ?? config.cost ?? longContextCost?.input ?? model.cost.input;
|
|
65
|
+
const outputCost = config.outputCost ?? config.cost ?? longContextCost?.output ?? model.cost.output;
|
|
65
66
|
return inputCost * promptTokens + outputCost * completionTokens;
|
|
66
67
|
}
|
|
67
68
|
/**
|
|
@@ -455,6 +456,14 @@ function isConnectionError(error) {
|
|
|
455
456
|
/**
|
|
456
457
|
* Enhanced fetch wrapper that adds logging, authentication, error handling, and optional compression
|
|
457
458
|
*/
|
|
459
|
+
function isPromptfooCloudApiHost(url) {
|
|
460
|
+
try {
|
|
461
|
+
const targetUrl = url instanceof Request ? url.url : url.toString();
|
|
462
|
+
return new URL(targetUrl).origin === CLOUD_API_HOST;
|
|
463
|
+
} catch {
|
|
464
|
+
return false;
|
|
465
|
+
}
|
|
466
|
+
}
|
|
458
467
|
async function monkeyPatchFetch(url, options) {
|
|
459
468
|
const NO_LOG_URLS = [
|
|
460
469
|
R_ENDPOINT,
|
|
@@ -474,7 +483,7 @@ async function monkeyPatchFetch(url, options) {
|
|
|
474
483
|
} catch (e) {
|
|
475
484
|
logger.warn(`Failed to compress request body: ${e}`);
|
|
476
485
|
}
|
|
477
|
-
if (
|
|
486
|
+
if (isPromptfooCloudApiHost(url)) {
|
|
478
487
|
const token = cloudConfig.getApiKey();
|
|
479
488
|
opts.headers = {
|
|
480
489
|
...opts.headers || {},
|
|
@@ -508,6 +517,25 @@ async function monkeyPatchFetch(url, options) {
|
|
|
508
517
|
}
|
|
509
518
|
}
|
|
510
519
|
//#endregion
|
|
520
|
+
//#region src/util/fetch/retryContext.ts
|
|
521
|
+
const fetchRetryContext = new AsyncLocalStorage();
|
|
522
|
+
/**
|
|
523
|
+
* Run `fn` with a fetch retry context so nested `fetchWithRetries` /
|
|
524
|
+
* `fetchWithProxy` calls inherit the provider's configured `maxRetries`.
|
|
525
|
+
*
|
|
526
|
+
* When `maxRetries` is `undefined`, the new scope deliberately shadows any
|
|
527
|
+
* outer provider context so providers without an override fall back to defaults.
|
|
528
|
+
*/
|
|
529
|
+
function withFetchRetryContext(maxRetries, fn) {
|
|
530
|
+
return fetchRetryContext.run({ maxRetries }, fn);
|
|
531
|
+
}
|
|
532
|
+
/**
|
|
533
|
+
* Read the active context's `maxRetries`, or `undefined` when none is set.
|
|
534
|
+
*/
|
|
535
|
+
function getFetchRetryContextMaxRetries() {
|
|
536
|
+
return fetchRetryContext.getStore()?.maxRetries;
|
|
537
|
+
}
|
|
538
|
+
//#endregion
|
|
511
539
|
//#region src/util/fetch/index.ts
|
|
512
540
|
const cachedAgents = /* @__PURE__ */ new Map();
|
|
513
541
|
const cachedProxyAgents = /* @__PURE__ */ new Map();
|
|
@@ -569,20 +597,44 @@ function getOrCreateProxyAgent(proxyUrl, tlsOptions) {
|
|
|
569
597
|
cachedProxyAgents.set(cacheKey, agent);
|
|
570
598
|
return agent;
|
|
571
599
|
}
|
|
600
|
+
/**
|
|
601
|
+
* Resolve whether to disable transient-error retries. An explicit caller flag
|
|
602
|
+
* always wins (a caller may opt back in even when the provider set
|
|
603
|
+
* `maxRetries: 0`); otherwise we disable only when the retry context carries
|
|
604
|
+
* `maxRetries === 0`.
|
|
605
|
+
*/
|
|
606
|
+
function resolveTransientRetryDisabled(explicit) {
|
|
607
|
+
if (explicit !== void 0) return explicit;
|
|
608
|
+
return getFetchRetryContextMaxRetries() === 0;
|
|
609
|
+
}
|
|
610
|
+
function headersInitToRecord(headers) {
|
|
611
|
+
if (!headers) return {};
|
|
612
|
+
if (headers instanceof Headers) return Object.fromEntries(headers.entries());
|
|
613
|
+
if (Array.isArray(headers)) return Object.fromEntries(new Headers(headers).entries());
|
|
614
|
+
return { ...headers };
|
|
615
|
+
}
|
|
616
|
+
function getFetchWithProxyHeaders(url, options) {
|
|
617
|
+
const requestHeaders = url instanceof Request && options.headers === void 0 ? headersInitToRecord(url.headers) : {};
|
|
618
|
+
const optionHeaders = headersInitToRecord(options.headers);
|
|
619
|
+
return {
|
|
620
|
+
...requestHeaders,
|
|
621
|
+
...optionHeaders,
|
|
622
|
+
"x-promptfoo-version": VERSION
|
|
623
|
+
};
|
|
624
|
+
}
|
|
625
|
+
function getFetchUrlString(url) {
|
|
626
|
+
if (typeof url === "string") return url;
|
|
627
|
+
if (url instanceof URL) return url.toString();
|
|
628
|
+
if (url instanceof Request) return url.url;
|
|
629
|
+
}
|
|
572
630
|
async function fetchWithProxy(url, options = {}, abortSignal) {
|
|
573
631
|
let finalUrl = url;
|
|
574
|
-
let finalUrlString;
|
|
575
|
-
if (typeof url === "string") finalUrlString = url;
|
|
576
|
-
else if (url instanceof URL) finalUrlString = url.toString();
|
|
577
|
-
else if (url instanceof Request) finalUrlString = url.url;
|
|
632
|
+
let finalUrlString = getFetchUrlString(url);
|
|
578
633
|
if (!finalUrlString) throw new Error("Invalid URL");
|
|
579
634
|
const combinedSignal = abortSignal ? options.signal ? AbortSignal.any([options.signal, abortSignal]) : abortSignal : options.signal;
|
|
580
635
|
const finalOptions = {
|
|
581
636
|
...options,
|
|
582
|
-
headers:
|
|
583
|
-
...options.headers,
|
|
584
|
-
"x-promptfoo-version": VERSION
|
|
585
|
-
},
|
|
637
|
+
headers: getFetchWithProxyHeaders(url, options),
|
|
586
638
|
signal: combinedSignal
|
|
587
639
|
};
|
|
588
640
|
if (typeof url === "string") try {
|
|
@@ -620,10 +672,11 @@ async function fetchWithProxy(url, options = {}, abortSignal) {
|
|
|
620
672
|
logger.debug(`Using proxy: ${sanitizeUrl(proxyUrl)}`);
|
|
621
673
|
finalOptions.dispatcher = getOrCreateProxyAgent(proxyUrl, tlsOptions);
|
|
622
674
|
} else finalOptions.dispatcher = getOrCreateAgent(tlsOptions);
|
|
623
|
-
const
|
|
675
|
+
const disableTransientRetries = resolveTransientRetryDisabled(options.disableTransientRetries);
|
|
676
|
+
const maxTransientRetries = disableTransientRetries ? 0 : 3;
|
|
624
677
|
for (let attempt = 0; attempt <= maxTransientRetries; attempt++) {
|
|
625
678
|
const response = await monkeyPatchFetch(finalUrl, finalOptions);
|
|
626
|
-
if (!
|
|
679
|
+
if (!disableTransientRetries && isTransientError(response) && attempt < maxTransientRetries) {
|
|
627
680
|
const backoffMs = Math.pow(2, attempt) * 1e3;
|
|
628
681
|
logger.debug(`Transient error (${response.status} ${response.statusText}), retry ${attempt + 1}/${maxTransientRetries} after ${backoffMs}ms`);
|
|
629
682
|
await sleep(backoffMs);
|
|
@@ -696,8 +749,17 @@ function isTransientError(response) {
|
|
|
696
749
|
default: return false;
|
|
697
750
|
}
|
|
698
751
|
}
|
|
752
|
+
function formatFetchErrorMessage(error) {
|
|
753
|
+
if (!(error instanceof Error)) return String(error);
|
|
754
|
+
const typedError = error;
|
|
755
|
+
let message = `${typedError.name}: ${typedError.message}`;
|
|
756
|
+
if (typedError.cause) message += ` (Cause: ${typedError.cause})`;
|
|
757
|
+
if (typedError.code) message += ` (Code: ${typedError.code})`;
|
|
758
|
+
return message;
|
|
759
|
+
}
|
|
699
760
|
async function fetchWithRetries(url, options = {}, timeout, maxRetries) {
|
|
700
|
-
|
|
761
|
+
const contextMaxRetries = getFetchRetryContextMaxRetries();
|
|
762
|
+
maxRetries = Math.max(0, maxRetries ?? contextMaxRetries ?? 4);
|
|
701
763
|
let lastErrorMessage;
|
|
702
764
|
const backoff = getEnvInt("PROMPTFOO_REQUEST_BACKOFF_MS", 5e3);
|
|
703
765
|
for (let i = 0; i <= maxRetries; i++) {
|
|
@@ -709,21 +771,19 @@ async function fetchWithRetries(url, options = {}, timeout, maxRetries) {
|
|
|
709
771
|
}, timeout);
|
|
710
772
|
if (getEnvBool("PROMPTFOO_RETRY_5XX") && response.status >= 500 && response.status < 600) throw new Error(`Internal Server Error: ${response.status} ${response.statusText}`);
|
|
711
773
|
if (response && isRateLimited(response)) {
|
|
712
|
-
logger.debug(`Rate limited on URL ${url}: ${response.status} ${response.statusText}, attempt ${i + 1}/${maxRetries + 1}, waiting before retry...`);
|
|
713
774
|
lastErrorMessage = `Rate limited: ${response.status} ${response.statusText}`;
|
|
775
|
+
if (i >= maxRetries) {
|
|
776
|
+
logger.debug(`Rate limited on URL ${url}: ${response.status} ${response.statusText}, attempt ${i + 1}/${maxRetries + 1}, no retries remain.`);
|
|
777
|
+
break;
|
|
778
|
+
}
|
|
779
|
+
logger.debug(`Rate limited on URL ${url}: ${response.status} ${response.statusText}, attempt ${i + 1}/${maxRetries + 1}, waiting before retry...`);
|
|
714
780
|
await handleRateLimit(response);
|
|
715
781
|
continue;
|
|
716
782
|
}
|
|
717
783
|
return response;
|
|
718
784
|
} catch (error) {
|
|
719
785
|
if (error instanceof Error && error.name === "AbortError") throw error;
|
|
720
|
-
|
|
721
|
-
if (error instanceof Error) {
|
|
722
|
-
const typedError = error;
|
|
723
|
-
errorMessage = `${typedError.name}: ${typedError.message}`;
|
|
724
|
-
if (typedError.cause) errorMessage += ` (Cause: ${typedError.cause})`;
|
|
725
|
-
if (typedError.code) errorMessage += ` (Code: ${typedError.code})`;
|
|
726
|
-
} else errorMessage = String(error);
|
|
786
|
+
const errorMessage = formatFetchErrorMessage(error);
|
|
727
787
|
logger.debug(`Request to ${url} failed (attempt #${i + 1}), retrying: ${errorMessage}`);
|
|
728
788
|
if (i < maxRetries) await sleep(Math.pow(2, i) * (backoff + 1e3 * Math.random()));
|
|
729
789
|
lastErrorMessage = errorMessage;
|
|
@@ -732,6 +792,6 @@ async function fetchWithRetries(url, options = {}, timeout, maxRetries) {
|
|
|
732
792
|
throw new Error(`Request failed after ${maxRetries} retries: ${lastErrorMessage}`);
|
|
733
793
|
}
|
|
734
794
|
//#endregion
|
|
735
|
-
export {
|
|
795
|
+
export { EVENTS_ENDPOINT as A, openaiToolsToBedrock as C, transformTools as D, transformToolChoice as E, getShareApiBaseUrl as F, getShareViewBaseUrl as I, FILE_METADATA_KEY as L, TERMINAL_MAX_WIDTH as M, getDefaultPort as N, CLOUD_PROVIDER_PREFIX as O, getDefaultShareViewBaseUrl as P, HUMAN_ASSERTION_TYPE as R, openaiToolChoiceToBedrock as S, toTitleCase as T, REQUEST_TIMEOUT_MS as _, getFetchWithProxyHeaders as a, isOpenAIToolChoice as b, isTransientError as c, getCurrentTimestamp as d, sleep as f, LONG_RUNNING_MODEL_TIMEOUT_MS as g, parseRetryAfter as h, fetchWithTimeout as i, R_ENDPOINT as j, CONSENT_ENDPOINT as k, withFetchRetryContext as l, parseRateLimitHeaders as m, fetchWithProxy as n, handleRateLimit as o, sleepWithAbort as p, fetchWithRetries as r, isRateLimited as s, clearAgentCache as t, isPromptfooCloudApiHost as u, calculateCost as v, parseChatPrompt as w, isPromptfooSampleTarget as x, isOpenAIToolArray as y };
|
|
736
796
|
|
|
737
|
-
//# sourceMappingURL=fetch-
|
|
797
|
+
//# sourceMappingURL=fetch-DXUnXkVU.js.map
|
|
@@ -1,14 +1,16 @@
|
|
|
1
|
-
const
|
|
2
|
-
const
|
|
3
|
-
const
|
|
1
|
+
const require_rolldown_runtime = require("./rolldown-runtime-D_mwlA32.cjs");
|
|
2
|
+
const require_logger = require("./logger-cfNpzI4o.cjs");
|
|
3
|
+
const require_invariant = require("./invariant-QtnLD03y.cjs");
|
|
4
|
+
const require_version = require("./version-BWCSaByA.cjs");
|
|
4
5
|
let fs = require("fs");
|
|
5
|
-
fs =
|
|
6
|
+
fs = require_rolldown_runtime.__toESM(fs, 1);
|
|
6
7
|
let path = require("path");
|
|
7
|
-
path =
|
|
8
|
+
path = require_rolldown_runtime.__toESM(path, 1);
|
|
8
9
|
let js_yaml = require("js-yaml");
|
|
9
|
-
js_yaml =
|
|
10
|
+
js_yaml = require_rolldown_runtime.__toESM(js_yaml, 1);
|
|
11
|
+
let node_async_hooks = require("node:async_hooks");
|
|
10
12
|
let fs_promises = require("fs/promises");
|
|
11
|
-
fs_promises =
|
|
13
|
+
fs_promises = require_rolldown_runtime.__toESM(fs_promises, 1);
|
|
12
14
|
let proxy_from_env = require("proxy-from-env");
|
|
13
15
|
let undici = require("undici");
|
|
14
16
|
let util = require("util");
|
|
@@ -74,7 +76,10 @@ function writeGlobalConfigPartial(partialConfig) {
|
|
|
74
76
|
});
|
|
75
77
|
writeGlobalConfig(updatedConfig);
|
|
76
78
|
}
|
|
77
|
-
|
|
79
|
+
//#endregion
|
|
80
|
+
//#region src/globalConfig/cloud.ts
|
|
81
|
+
const CLOUD_API_HOST = "https://api.promptfoo.app";
|
|
82
|
+
const API_HOST = require_logger.getEnvString("API_HOST", CLOUD_API_HOST);
|
|
78
83
|
const SHARING_CUTOFF_DATE = /* @__PURE__ */ new Date("2026-03-09T00:00:00Z");
|
|
79
84
|
var CloudConfig = class {
|
|
80
85
|
config;
|
|
@@ -274,8 +279,8 @@ function calculateCost(modelName, config, promptTokens, completionTokens, models
|
|
|
274
279
|
const model = models.find((m) => m.id === modelName);
|
|
275
280
|
if (!model || !model.cost) return;
|
|
276
281
|
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;
|
|
282
|
+
const inputCost = config.inputCost ?? config.cost ?? longContextCost?.input ?? model.cost.input;
|
|
283
|
+
const outputCost = config.outputCost ?? config.cost ?? longContextCost?.output ?? model.cost.output;
|
|
279
284
|
return inputCost * promptTokens + outputCost * completionTokens;
|
|
280
285
|
}
|
|
281
286
|
/**
|
|
@@ -651,6 +656,14 @@ function isConnectionError(error) {
|
|
|
651
656
|
/**
|
|
652
657
|
* Enhanced fetch wrapper that adds logging, authentication, error handling, and optional compression
|
|
653
658
|
*/
|
|
659
|
+
function isPromptfooCloudApiHost(url) {
|
|
660
|
+
try {
|
|
661
|
+
const targetUrl = url instanceof Request ? url.url : url.toString();
|
|
662
|
+
return new URL(targetUrl).origin === CLOUD_API_HOST;
|
|
663
|
+
} catch {
|
|
664
|
+
return false;
|
|
665
|
+
}
|
|
666
|
+
}
|
|
654
667
|
async function monkeyPatchFetch(url, options) {
|
|
655
668
|
const NO_LOG_URLS = [
|
|
656
669
|
R_ENDPOINT,
|
|
@@ -670,7 +683,7 @@ async function monkeyPatchFetch(url, options) {
|
|
|
670
683
|
} catch (e) {
|
|
671
684
|
require_logger.logger.warn(`Failed to compress request body: ${e}`);
|
|
672
685
|
}
|
|
673
|
-
if (
|
|
686
|
+
if (isPromptfooCloudApiHost(url)) {
|
|
674
687
|
const token = cloudConfig.getApiKey();
|
|
675
688
|
opts.headers = {
|
|
676
689
|
...opts.headers || {},
|
|
@@ -704,11 +717,31 @@ async function monkeyPatchFetch(url, options) {
|
|
|
704
717
|
}
|
|
705
718
|
}
|
|
706
719
|
//#endregion
|
|
720
|
+
//#region src/util/fetch/retryContext.ts
|
|
721
|
+
const fetchRetryContext = new node_async_hooks.AsyncLocalStorage();
|
|
722
|
+
/**
|
|
723
|
+
* Run `fn` with a fetch retry context so nested `fetchWithRetries` /
|
|
724
|
+
* `fetchWithProxy` calls inherit the provider's configured `maxRetries`.
|
|
725
|
+
*
|
|
726
|
+
* When `maxRetries` is `undefined`, the new scope deliberately shadows any
|
|
727
|
+
* outer provider context so providers without an override fall back to defaults.
|
|
728
|
+
*/
|
|
729
|
+
function withFetchRetryContext(maxRetries, fn) {
|
|
730
|
+
return fetchRetryContext.run({ maxRetries }, fn);
|
|
731
|
+
}
|
|
732
|
+
/**
|
|
733
|
+
* Read the active context's `maxRetries`, or `undefined` when none is set.
|
|
734
|
+
*/
|
|
735
|
+
function getFetchRetryContextMaxRetries() {
|
|
736
|
+
return fetchRetryContext.getStore()?.maxRetries;
|
|
737
|
+
}
|
|
738
|
+
//#endregion
|
|
707
739
|
//#region src/util/fetch/index.ts
|
|
708
|
-
var fetch_exports = /* @__PURE__ */
|
|
740
|
+
var fetch_exports = /* @__PURE__ */ require_rolldown_runtime.__exportAll({
|
|
709
741
|
fetchWithProxy: () => fetchWithProxy,
|
|
710
742
|
fetchWithRetries: () => fetchWithRetries,
|
|
711
743
|
fetchWithTimeout: () => fetchWithTimeout,
|
|
744
|
+
getFetchWithProxyHeaders: () => getFetchWithProxyHeaders,
|
|
712
745
|
handleRateLimit: () => handleRateLimit,
|
|
713
746
|
isRateLimited: () => isRateLimited,
|
|
714
747
|
isTransientError: () => isTransientError
|
|
@@ -763,20 +796,44 @@ function getOrCreateProxyAgent(proxyUrl, tlsOptions) {
|
|
|
763
796
|
cachedProxyAgents.set(cacheKey, agent);
|
|
764
797
|
return agent;
|
|
765
798
|
}
|
|
799
|
+
/**
|
|
800
|
+
* Resolve whether to disable transient-error retries. An explicit caller flag
|
|
801
|
+
* always wins (a caller may opt back in even when the provider set
|
|
802
|
+
* `maxRetries: 0`); otherwise we disable only when the retry context carries
|
|
803
|
+
* `maxRetries === 0`.
|
|
804
|
+
*/
|
|
805
|
+
function resolveTransientRetryDisabled(explicit) {
|
|
806
|
+
if (explicit !== void 0) return explicit;
|
|
807
|
+
return getFetchRetryContextMaxRetries() === 0;
|
|
808
|
+
}
|
|
809
|
+
function headersInitToRecord(headers) {
|
|
810
|
+
if (!headers) return {};
|
|
811
|
+
if (headers instanceof Headers) return Object.fromEntries(headers.entries());
|
|
812
|
+
if (Array.isArray(headers)) return Object.fromEntries(new Headers(headers).entries());
|
|
813
|
+
return { ...headers };
|
|
814
|
+
}
|
|
815
|
+
function getFetchWithProxyHeaders(url, options) {
|
|
816
|
+
const requestHeaders = url instanceof Request && options.headers === void 0 ? headersInitToRecord(url.headers) : {};
|
|
817
|
+
const optionHeaders = headersInitToRecord(options.headers);
|
|
818
|
+
return {
|
|
819
|
+
...requestHeaders,
|
|
820
|
+
...optionHeaders,
|
|
821
|
+
"x-promptfoo-version": require_version.VERSION
|
|
822
|
+
};
|
|
823
|
+
}
|
|
824
|
+
function getFetchUrlString(url) {
|
|
825
|
+
if (typeof url === "string") return url;
|
|
826
|
+
if (url instanceof URL) return url.toString();
|
|
827
|
+
if (url instanceof Request) return url.url;
|
|
828
|
+
}
|
|
766
829
|
async function fetchWithProxy(url, options = {}, abortSignal) {
|
|
767
830
|
let finalUrl = url;
|
|
768
|
-
let finalUrlString;
|
|
769
|
-
if (typeof url === "string") finalUrlString = url;
|
|
770
|
-
else if (url instanceof URL) finalUrlString = url.toString();
|
|
771
|
-
else if (url instanceof Request) finalUrlString = url.url;
|
|
831
|
+
let finalUrlString = getFetchUrlString(url);
|
|
772
832
|
if (!finalUrlString) throw new Error("Invalid URL");
|
|
773
833
|
const combinedSignal = abortSignal ? options.signal ? AbortSignal.any([options.signal, abortSignal]) : abortSignal : options.signal;
|
|
774
834
|
const finalOptions = {
|
|
775
835
|
...options,
|
|
776
|
-
headers:
|
|
777
|
-
...options.headers,
|
|
778
|
-
"x-promptfoo-version": require_version.VERSION
|
|
779
|
-
},
|
|
836
|
+
headers: getFetchWithProxyHeaders(url, options),
|
|
780
837
|
signal: combinedSignal
|
|
781
838
|
};
|
|
782
839
|
if (typeof url === "string") try {
|
|
@@ -814,10 +871,11 @@ async function fetchWithProxy(url, options = {}, abortSignal) {
|
|
|
814
871
|
require_logger.logger.debug(`Using proxy: ${require_logger.sanitizeUrl(proxyUrl)}`);
|
|
815
872
|
finalOptions.dispatcher = getOrCreateProxyAgent(proxyUrl, tlsOptions);
|
|
816
873
|
} else finalOptions.dispatcher = getOrCreateAgent(tlsOptions);
|
|
817
|
-
const
|
|
874
|
+
const disableTransientRetries = resolveTransientRetryDisabled(options.disableTransientRetries);
|
|
875
|
+
const maxTransientRetries = disableTransientRetries ? 0 : 3;
|
|
818
876
|
for (let attempt = 0; attempt <= maxTransientRetries; attempt++) {
|
|
819
877
|
const response = await monkeyPatchFetch(finalUrl, finalOptions);
|
|
820
|
-
if (!
|
|
878
|
+
if (!disableTransientRetries && isTransientError(response) && attempt < maxTransientRetries) {
|
|
821
879
|
const backoffMs = Math.pow(2, attempt) * 1e3;
|
|
822
880
|
require_logger.logger.debug(`Transient error (${response.status} ${response.statusText}), retry ${attempt + 1}/${maxTransientRetries} after ${backoffMs}ms`);
|
|
823
881
|
await sleep(backoffMs);
|
|
@@ -890,8 +948,17 @@ function isTransientError(response) {
|
|
|
890
948
|
default: return false;
|
|
891
949
|
}
|
|
892
950
|
}
|
|
951
|
+
function formatFetchErrorMessage(error) {
|
|
952
|
+
if (!(error instanceof Error)) return String(error);
|
|
953
|
+
const typedError = error;
|
|
954
|
+
let message = `${typedError.name}: ${typedError.message}`;
|
|
955
|
+
if (typedError.cause) message += ` (Cause: ${typedError.cause})`;
|
|
956
|
+
if (typedError.code) message += ` (Code: ${typedError.code})`;
|
|
957
|
+
return message;
|
|
958
|
+
}
|
|
893
959
|
async function fetchWithRetries(url, options = {}, timeout, maxRetries) {
|
|
894
|
-
|
|
960
|
+
const contextMaxRetries = getFetchRetryContextMaxRetries();
|
|
961
|
+
maxRetries = Math.max(0, maxRetries ?? contextMaxRetries ?? 4);
|
|
895
962
|
let lastErrorMessage;
|
|
896
963
|
const backoff = require_logger.getEnvInt("PROMPTFOO_REQUEST_BACKOFF_MS", 5e3);
|
|
897
964
|
for (let i = 0; i <= maxRetries; i++) {
|
|
@@ -903,21 +970,19 @@ async function fetchWithRetries(url, options = {}, timeout, maxRetries) {
|
|
|
903
970
|
}, timeout);
|
|
904
971
|
if (require_logger.getEnvBool("PROMPTFOO_RETRY_5XX") && response.status >= 500 && response.status < 600) throw new Error(`Internal Server Error: ${response.status} ${response.statusText}`);
|
|
905
972
|
if (response && isRateLimited(response)) {
|
|
906
|
-
require_logger.logger.debug(`Rate limited on URL ${url}: ${response.status} ${response.statusText}, attempt ${i + 1}/${maxRetries + 1}, waiting before retry...`);
|
|
907
973
|
lastErrorMessage = `Rate limited: ${response.status} ${response.statusText}`;
|
|
974
|
+
if (i >= maxRetries) {
|
|
975
|
+
require_logger.logger.debug(`Rate limited on URL ${url}: ${response.status} ${response.statusText}, attempt ${i + 1}/${maxRetries + 1}, no retries remain.`);
|
|
976
|
+
break;
|
|
977
|
+
}
|
|
978
|
+
require_logger.logger.debug(`Rate limited on URL ${url}: ${response.status} ${response.statusText}, attempt ${i + 1}/${maxRetries + 1}, waiting before retry...`);
|
|
908
979
|
await handleRateLimit(response);
|
|
909
980
|
continue;
|
|
910
981
|
}
|
|
911
982
|
return response;
|
|
912
983
|
} catch (error) {
|
|
913
984
|
if (error instanceof Error && error.name === "AbortError") throw error;
|
|
914
|
-
|
|
915
|
-
if (error instanceof Error) {
|
|
916
|
-
const typedError = error;
|
|
917
|
-
errorMessage = `${typedError.name}: ${typedError.message}`;
|
|
918
|
-
if (typedError.cause) errorMessage += ` (Cause: ${typedError.cause})`;
|
|
919
|
-
if (typedError.code) errorMessage += ` (Code: ${typedError.code})`;
|
|
920
|
-
} else errorMessage = String(error);
|
|
985
|
+
const errorMessage = formatFetchErrorMessage(error);
|
|
921
986
|
require_logger.logger.debug(`Request to ${url} failed (attempt #${i + 1}), retrying: ${errorMessage}`);
|
|
922
987
|
if (i < maxRetries) await sleep(Math.pow(2, i) * (backoff + 1e3 * Math.random()));
|
|
923
988
|
lastErrorMessage = errorMessage;
|
|
@@ -1034,6 +1099,12 @@ Object.defineProperty(exports, "getDefaultShareViewBaseUrl", {
|
|
|
1034
1099
|
return getDefaultShareViewBaseUrl;
|
|
1035
1100
|
}
|
|
1036
1101
|
});
|
|
1102
|
+
Object.defineProperty(exports, "getFetchWithProxyHeaders", {
|
|
1103
|
+
enumerable: true,
|
|
1104
|
+
get: function() {
|
|
1105
|
+
return getFetchWithProxyHeaders;
|
|
1106
|
+
}
|
|
1107
|
+
});
|
|
1037
1108
|
Object.defineProperty(exports, "getShareApiBaseUrl", {
|
|
1038
1109
|
enumerable: true,
|
|
1039
1110
|
get: function() {
|
|
@@ -1058,6 +1129,12 @@ Object.defineProperty(exports, "isOpenAIToolChoice", {
|
|
|
1058
1129
|
return isOpenAIToolChoice;
|
|
1059
1130
|
}
|
|
1060
1131
|
});
|
|
1132
|
+
Object.defineProperty(exports, "isPromptfooCloudApiHost", {
|
|
1133
|
+
enumerable: true,
|
|
1134
|
+
get: function() {
|
|
1135
|
+
return isPromptfooCloudApiHost;
|
|
1136
|
+
}
|
|
1137
|
+
});
|
|
1061
1138
|
Object.defineProperty(exports, "isPromptfooSampleTarget", {
|
|
1062
1139
|
enumerable: true,
|
|
1063
1140
|
get: function() {
|
|
@@ -1124,6 +1201,12 @@ Object.defineProperty(exports, "transformTools", {
|
|
|
1124
1201
|
return transformTools;
|
|
1125
1202
|
}
|
|
1126
1203
|
});
|
|
1204
|
+
Object.defineProperty(exports, "withFetchRetryContext", {
|
|
1205
|
+
enumerable: true,
|
|
1206
|
+
get: function() {
|
|
1207
|
+
return withFetchRetryContext;
|
|
1208
|
+
}
|
|
1209
|
+
});
|
|
1127
1210
|
Object.defineProperty(exports, "writeGlobalConfig", {
|
|
1128
1211
|
enumerable: true,
|
|
1129
1212
|
get: function() {
|
|
@@ -1137,4 +1220,4 @@ Object.defineProperty(exports, "writeGlobalConfigPartial", {
|
|
|
1137
1220
|
}
|
|
1138
1221
|
});
|
|
1139
1222
|
|
|
1140
|
-
//# sourceMappingURL=fetch-
|
|
1223
|
+
//# sourceMappingURL=fetch-Dw4XZHjj.cjs.map
|