promptfoo 0.121.4 → 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-DQkFNqE9.js → ListApp-DLmM02JS.js} +1 -1
- package/dist/src/{accounts-DhMYUUbu.js → accounts-Ca7WIoPY.js} +12 -7
- package/dist/src/{accounts-F9d_5sMC.js → accounts-CjFnOPmb.js} +14 -9
- package/dist/src/{accounts-Dy17bs4D.cjs → accounts-CmWzeD2d.cjs} +16 -10
- package/dist/src/{accounts-DdJ2pHMI.js → accounts-DanM1wq_.js} +13 -8
- package/dist/src/{agentic-utils-qFlm6zes.js → agentic-utils-CJ0j3fBi.js} +3 -3
- package/dist/src/{agentic-utils-w68v6_Dz.js → agentic-utils-DDEGRV9v.js} +3 -3
- package/dist/src/{agentic-utils-BpX5b23w.cjs → agentic-utils-DvPWSUpb.cjs} +8 -7
- package/dist/src/{agentic-utils-P172hM8B.js → agentic-utils-TxUEMPYS.js} +2 -2
- package/dist/src/{agents-BahDpe5G.cjs → agents-B4sRuXg3.cjs} +7 -6
- package/dist/src/{agents-pQeBEXMm.js → agents-B8q7h_ek.js} +5 -5
- package/dist/src/{agents-CgaMXvLM.js → agents-CBgJvRkB.js} +21 -10
- package/dist/src/{agents-C-R_jfzI.js → agents-CYn2n3QP.js} +4 -4
- package/dist/src/{agents-8FDnTriG.js → agents-D-vDNFx4.js} +21 -10
- package/dist/src/{agents-aYPQLf8W.js → agents-LrHuQqr1.js} +20 -9
- package/dist/src/{agents-DJ35I3Nt.js → agents-QGg76OF-.js} +5 -5
- package/dist/src/{agents-D7-HGxUj.cjs → agents-eHZ9nlgA.cjs} +21 -10
- package/dist/src/{aimlapi-sgYnkE54.js → aimlapi-CJEbQ0o6.js} +7 -7
- package/dist/src/{aimlapi-BD6J9oKt.js → aimlapi-D5HXzZ0s.js} +6 -6
- package/dist/src/{aimlapi-qcK4OT55.cjs → aimlapi-T6HGNxNe.cjs} +7 -7
- package/dist/src/{aimlapi-BCq3MHeL.js → aimlapi-eYv3a_DK.js} +7 -7
- 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 +31 -6
- package/dist/src/{audio-COrn8rM6.js → audio-BqnRvcWG.js} +3 -3
- package/dist/src/{audio-DcVKoInv.js → audio-CPMtV1yR.js} +4 -4
- package/dist/src/{audio-B7izf48x.js → audio-DyiebVB3.js} +4 -4
- package/dist/src/{audio-BQtNuYBj.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-PYJvBE1i.js → base-CKLo890h.js} +4 -3
- package/dist/src/{base-fZ9wgg50.js → base-Co80MMCi.js} +5 -4
- package/dist/src/{base-D-670DX8.cjs → base-DGJW48uz.cjs} +5 -4
- package/dist/src/{base-yrI1Yal4.js → base-E9I8zXjz.js} +5 -4
- 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-D2FAd1Q5.cjs → blobs-B0977K1O.cjs} +7 -6
- package/dist/src/{blobs-BCZavS8s.js → blobs-CeFdPn_T.js} +3 -3
- package/dist/src/{blobs-BQWqnnvL.js → blobs-DODuTK-a.js} +3 -3
- package/dist/src/{blobs-C-F78Kfn.js → blobs-Dwef1Ao1.js} +2 -2
- package/dist/src/{cache-BIyPcp5v.cjs → cache-CPGUA4Yl.cjs} +135 -25
- package/dist/src/cache-Cf7b4pWE.js +3 -0
- package/dist/src/{cache-D5NZmMiT.js → cache-DIXbtkNO.js} +125 -10
- package/dist/src/{cache-mb7c8hbp.js → cache-DpPWrkTE.js} +128 -12
- package/dist/src/{cache-C4Xb-hNb.js → cache-roFAE0cI.js} +126 -11
- package/dist/src/{chat-I9izLm49.js → chat-CUCorGiL.js} +12 -12
- package/dist/src/{chat-BPXSW8Bv.cjs → chat-DG1wG4w0.cjs} +6 -6
- package/dist/src/{chat-BfPaS15_.js → chat-Dabu84Br.js} +12 -12
- package/dist/src/{chat-Dr3DUQ0D.js → chat-DqUFcWI0.js} +12 -12
- package/dist/src/{chat-CclRbxGf.cjs → chat-DxTDQ83C.cjs} +14 -13
- package/dist/src/{chat-MKxMnZJZ.js → chat-GmlolEwo.js} +4 -4
- package/dist/src/{chat-0bwXjVP0.js → chat-TP8Qifkh.js} +6 -6
- package/dist/src/{chat-mW0ORo8G.js → chat-iwaM5UTQ.js} +6 -6
- package/dist/src/{chatkit-zUIVoDos.js → chatkit-B6DWi70Q.js} +4 -4
- package/dist/src/{chatkit-BoWoSgXl.cjs → chatkit-BYveR48_.cjs} +6 -5
- package/dist/src/{chatkit-Cv6AhukM.js → chatkit-fARZwEfV.js} +3 -3
- package/dist/src/{chatkit-CJnHRRMM.js → chatkit-lb6FK02w.js} +4 -4
- package/dist/src/{claude-agent-sdk-Dtq_L-Sc.js → claude-agent-sdk-BQNp_y-F.js} +212 -67
- package/dist/src/{claude-agent-sdk-BQNuLaAK.js → claude-agent-sdk-D5Jl0SDh.js} +212 -67
- package/dist/src/{claude-agent-sdk-CPJo3dBQ.cjs → claude-agent-sdk-DH416NBD.cjs} +218 -72
- package/dist/src/{claude-agent-sdk-nfAIcxNf.js → claude-agent-sdk-x1XJ1-pU.js} +212 -67
- package/dist/src/{cloud-DQZ5sVjW.js → cloud-D3DiFqH6.js} +3 -3
- package/dist/src/cloud-p96PA4MH.js +3 -0
- package/dist/src/{cloudflare-ai-BIB567w6.js → cloudflare-ai-B6NVI3ax.js} +4 -4
- package/dist/src/{cloudflare-ai-Dl3N9OVD.cjs → cloudflare-ai-CEAW-xQa.cjs} +6 -6
- package/dist/src/{cloudflare-ai-DlKr0rY7.js → cloudflare-ai-RFSojyXG.js} +6 -6
- package/dist/src/{cloudflare-ai-DGLte7Py.js → cloudflare-ai-r4tbYmWU.js} +6 -6
- package/dist/src/{cloudflare-gateway-CiIZHU0Q.js → cloudflare-gateway-BCkLouto.js} +5 -5
- package/dist/src/{cloudflare-gateway-DI1HNP5F.js → cloudflare-gateway-BaZ4insB.js} +3 -3
- package/dist/src/{cloudflare-gateway-BDZrYydE.js → cloudflare-gateway-CF-Vb-2Z.js} +5 -5
- package/dist/src/{cloudflare-gateway-BYDp495F.cjs → cloudflare-gateway-TJMLBj6I.cjs} +5 -5
- package/dist/src/codex-app-server-B8KHEiF4.js +1915 -0
- package/dist/src/codex-app-server-CnrLBCeA.cjs +1921 -0
- package/dist/src/codex-app-server-DIXZ230V.js +1915 -0
- package/dist/src/codex-app-server-Dd22dC_N.js +1916 -0
- package/dist/src/{codex-sdk-CpqiOqDO.js → codex-sdk-B6Wah8Pa.js} +6 -6
- package/dist/src/codex-sdk-BGjVAk23.js +3 -0
- package/dist/src/{codex-sdk-C2_M2pl_.cjs → codex-sdk-CFF6gUyi.cjs} +18 -10
- package/dist/src/{codex-sdk-Rtky3M4I.js → codex-sdk-CmQABzV3.js} +6 -6
- package/dist/src/{codex-sdk-CErXn7qh.js → codex-sdk-D2d54RL8.js} +5 -5
- package/dist/src/{cometapi-CtJ-mS8R.js → cometapi-Bu9B8NUY.js} +8 -8
- package/dist/src/{cometapi-DT-jlVCB.js → cometapi-CtzNCHKu.js} +7 -7
- package/dist/src/{cometapi-UVOryo4W.cjs → cometapi-DHCDlQUI.cjs} +8 -8
- package/dist/src/{cometapi-BUlt_ELa.js → cometapi-OBILPLlu.js} +8 -8
- package/dist/src/{completion-HUe8wDhZ.js → completion-CO2e1_62.js} +6 -6
- package/dist/src/{completion-BozdoXba.cjs → completion-CSYfl2cd.cjs} +6 -6
- package/dist/src/{completion-x0a_c2y1.js → completion-DZNxcyfG.js} +6 -6
- package/dist/src/{completion-Dnxn7E-j.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-CwDVU5xr.js → createHash-CGVzWdjj.js} +1 -1
- package/dist/src/{createHash-B7KvgoOD.cjs → createHash-CSiqnK5P.cjs} +2 -2
- package/dist/src/{createHash-ChI45QR1.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-DCgsveLD.js → docker-4D1eL6Gq.js} +6 -6
- package/dist/src/{docker-ClnmCf1Z.js → docker-BBv1WUDu.js} +5 -5
- package/dist/src/{docker-DS4_Osau.cjs → docker-D06JUoe2.cjs} +6 -6
- package/dist/src/{docker-CQmlA2NU.js → docker-DdJQBxK9.js} +6 -6
- package/dist/src/{embedding-D3xTseo7.js → embedding--UZVe4_7.js} +6 -6
- package/dist/src/{embedding-I45KG3o7.cjs → embedding-BbrwopfX.cjs} +6 -6
- package/dist/src/{embedding-nFbumxcv.js → embedding-Bi3rxrZF.js} +5 -5
- package/dist/src/{embedding-DD9wa3ae.js → embedding-C251p1-8.js} +6 -6
- package/dist/src/{errors-Cw810C93.js → errors-9PcUL8BC.js} +1 -1
- package/dist/src/{esm-Dh4dOLlt.js → esm-B6whoAcf.js} +2 -2
- package/dist/src/{esm-CtEPLdAj.cjs → esm-BIKakvNa.cjs} +8 -7
- package/dist/src/{esm-C7PnfdF8.js → esm-BTK1W7lG.js} +1 -1
- package/dist/src/{esm-tVgYPY-f.js → esm-Bexx2PFc.js} +2 -2
- package/dist/src/{eval-u4UVafl6.js → eval-0VRANImH.js} +21 -21
- package/dist/src/{eval-CzJFfFO9.js → eval-DscR5iOM.js} +1 -1
- package/dist/src/{evalResult-Bgm9ZH31.js → evalResult-2RRJvFyB.js} +41 -16
- package/dist/src/{evalResult-KZqXl4XP.cjs → evalResult-CvtS8h8u.cjs} +51 -15
- package/dist/src/evalResult-DqzsS6_W.js +3 -0
- package/dist/src/{evalResult-D3hVYFis.js → evalResult-eUkJv9Ko.js} +40 -15
- package/dist/src/evaluator-DNdJF1Gv.js +3 -0
- package/dist/src/{evaluator-IvuDYSvQ.js → evaluator-DRoiYB2q.js} +1060 -187
- 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-CAfTSraf.js → extractor-BR7XAzAL.js} +6 -6
- package/dist/src/{extractor-WVPOrH43.cjs → extractor-BdxEtt3J.cjs} +6 -6
- package/dist/src/{extractor-DNSeBVOJ.js → extractor-CIW3iN-b.js} +6 -6
- package/dist/src/{extractor-Dk6bRWkv.js → extractor-CxRtnaHl.js} +5 -5
- package/dist/src/{fetch-B0Z3Oe4k.js → fetch-BufrQtvR.js} +93 -40
- package/dist/src/{fetch-BEWnXrrG.js → fetch-DXUnXkVU.js} +89 -40
- package/dist/src/{fetch-CJU5ELPa.cjs → fetch-Dw4XZHjj.cjs} +330 -270
- package/dist/src/{fetch-Di00EQrc.js → fetch-It34O8Ur.js} +305 -252
- package/dist/src/fetch-_YgGd2qv.js +3 -0
- package/dist/src/{fileExtensions-bYh77CN8.cjs → fileExtensions-BhdwzYaD.cjs} +24 -1
- package/dist/src/{fileExtensions-DnqA1y9x.js → fileExtensions-CXRfY3Ss.js} +12 -2
- package/dist/src/{fileExtensions-AWa2ZML4.js → fileExtensions-D4GCJ67J.js} +12 -2
- package/dist/src/{formatDuration-DZzPsexs.js → formatDuration-CMVNrYvE.js} +1 -1
- package/dist/src/{genaiTracer-yRuxj9-L.cjs → genaiTracer-14nugQQx.cjs} +14 -2
- package/dist/src/{genaiTracer-DWdZ28hY.js → genaiTracer-BPVvltoW.js} +2 -2
- package/dist/src/{genaiTracer-XnrcgDCe.js → genaiTracer-D18lYzhB.js} +2 -2
- package/dist/src/{genaiTracer-COYDi-tC.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-eIHhRqoC.js → graders-BGP99PdK.js} +2416 -2224
- package/dist/src/{graders-Zy3x0zqX.js → graders-BX0f2tvS.js} +2423 -2226
- package/dist/src/{graders-pvbReLLn.js → graders-C0nXU_ZP.js} +1806 -1609
- package/dist/src/{graders--zknU_uk.cjs → graders-ClrU2fnd.cjs} +2219 -1949
- 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-dnoUgPrC.js → image-BN-hjLL9.js} +4 -4
- package/dist/src/{image-9302QVqR.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-De2FBmYV.cjs → image-DfVCGPbI.cjs} +4 -4
- package/dist/src/{image-u7-rKnYU.js → image-QzmydkiG.js} +4 -4
- package/dist/src/image-X0oY4350.cjs +465 -0
- package/dist/src/index.cjs +1689 -558
- package/dist/src/index.d.cts +3270 -1624
- package/dist/src/index.d.ts +3270 -1624
- package/dist/src/index.js +1553 -438
- 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-CLERUB0c.js → interactiveCheck-C4QlIuoR.js} +2 -2
- package/dist/src/{invariant-BtWWVVhl.js → invariant-B2Rf6avk.js} +1 -1
- package/dist/src/{invariant-vgHWClmd.js → invariant-DIYf9sP1.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-Dgc7CBWF.js → knowledgeBase-BadkINlJ.js} +24 -10
- package/dist/src/{knowledgeBase-RhFPGWDc.js → knowledgeBase-Bi_8sV-H.js} +25 -11
- package/dist/src/{knowledgeBase-lm9RXSAm.js → knowledgeBase-CkMljjdg.js} +25 -11
- package/dist/src/{knowledgeBase-Bpoe_nLu.cjs → knowledgeBase-DUh34xba.cjs} +25 -11
- package/dist/src/{litellm-DRjpcSa7.js → litellm-BKBo0jpC.js} +5 -5
- package/dist/src/{litellm-C2kqjxqp.js → litellm-BXyn5kZK.js} +5 -5
- package/dist/src/{litellm-p37R1dzQ.js → litellm-CNcfbCfa.js} +4 -4
- package/dist/src/{litellm-CoyI4IAl.cjs → litellm-CtAr7bKG.cjs} +5 -5
- package/dist/src/{logger-DksKw1Qc.js → logger-BbY6ypFL.js} +2 -2
- package/dist/src/{logger-B88EkIn6.js → logger-KD8JjCRJ.js} +2 -2
- package/dist/src/{logger-COuQb2xB.cjs → logger-cfNpzI4o.cjs} +13 -55
- package/dist/src/{luma-ray-KgTCXrZC.js → luma-ray-BMX1iEB6.js} +5 -5
- package/dist/src/{luma-ray-B863CmuZ.js → luma-ray-CR5TSpp4.js} +5 -5
- package/dist/src/{luma-ray-BxVKaW2a.cjs → luma-ray-D3FUc2K3.cjs} +9 -8
- package/dist/src/{luma-ray-BTTLtqQ8.js → luma-ray-OEMmS1RB.js} +6 -6
- package/dist/src/main.js +909 -369
- 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-BTQz42fn.js → messages-BabO-cX8.js} +273 -17
- package/dist/src/{messages-811uVVW5.cjs → messages-DBPir0TQ.cjs} +278 -18
- package/dist/src/{messages-zWbkLLHz.js → messages-DGUlSNU7.js} +273 -17
- package/dist/src/{messages-MYTQ2TWp.js → messages-vsE_-Lv0.js} +273 -17
- package/dist/src/{meteor-DHdzY1Ss.js → meteor--TZYICTI.js} +2 -2
- package/dist/src/{meteor-Co1VQ1u5.cjs → meteor-CR226f7Z.cjs} +2 -2
- package/dist/src/{meteor-CU5UAE-H.js → meteor-Cl_yd7rJ.js} +2 -2
- package/dist/src/{meteor-DuAFv6gF.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-Dk1JAtVo.cjs → modelslab-CNV5bMSk.cjs} +7 -7
- package/dist/src/{modelslab-D0erNWKe.js → modelslab-Cogmu4mG.js} +6 -6
- package/dist/src/{modelslab-DIq-6y7x.js → modelslab-Dzst7VTU.js} +6 -6
- package/dist/src/{modelslab-wu9yi5GE.js → modelslab-EyDczZ5A.js} +7 -7
- package/dist/src/{nova-reel-CCFRfeRb.js → nova-reel-BGPNBOMS.js} +6 -6
- package/dist/src/{nova-reel-DQrm74ng.js → nova-reel-B_5NKFu1.js} +5 -5
- package/dist/src/{nova-reel-gr11WG7f.js → nova-reel-C4eUJGse.js} +5 -5
- package/dist/src/{nova-reel-CrLXVKQf.cjs → nova-reel-CjJRxI1X.cjs} +9 -8
- package/dist/src/{nova-sonic-BYdp-QLs.js → nova-sonic-BNGmgfFz.js} +4 -4
- package/dist/src/{nova-sonic-TDgrlTk7.js → nova-sonic-ChPlh5na.js} +4 -4
- package/dist/src/{nova-sonic-B_ZXcUJB.js → nova-sonic-CrV0iaY_.js} +3 -3
- package/dist/src/{nova-sonic-i5tUvXKn.cjs → nova-sonic-DuOG9Aun.cjs} +5 -4
- package/dist/src/{openai-DhVEmgeZ.js → openai-BMHD2Huo.js} +2 -2
- package/dist/src/{openai-URNyItar.cjs → openai-C3uXv8wS.cjs} +2 -2
- package/dist/src/{openai-Qsvz25mV.js → openai-CJrsh9n4.js} +2 -2
- package/dist/src/{openai-iYtrXzOX.js → openai-zgwBb4Ff.js} +1 -1
- package/dist/src/{openclaw-CnQ363Wi.js → openclaw-BIHlu_36.js} +10 -8
- package/dist/src/{openclaw-CwzlQSQX.js → openclaw-CF7fMido.js} +9 -7
- package/dist/src/{openclaw-wX9rtfke.cjs → openclaw-Dphc01BY.cjs} +18 -15
- package/dist/src/{openclaw-CLWrW03k.js → openclaw-zIJAsz3P.js} +10 -8
- package/dist/src/{opencode-sdk-BUu5Nevv.js → opencode-sdk-B3vlPLsp.js} +40 -5
- package/dist/src/{opencode-sdk-BxD8vXp_.js → opencode-sdk-D05JSgMQ.js} +40 -5
- package/dist/src/{opencode-sdk-BZ2idgYA.cjs → opencode-sdk-DoY6GbWw.cjs} +46 -10
- package/dist/src/{opencode-sdk-GI2KaAXq.js → opencode-sdk-sRKYHGoI.js} +39 -4
- package/dist/src/{otlpReceiver-BntK801g.js → otlpReceiver--gTpSagc.js} +120 -4
- package/dist/src/{otlpReceiver-DmVulbhC.js → otlpReceiver-B2eaKC8C.js} +120 -4
- package/dist/src/{otlpReceiver-B2z58l4e.js → otlpReceiver-BXjcRqAM.js} +119 -3
- package/dist/src/{otlpReceiver-BfcVq2Nq.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-CPQ_CmVO.js → providerRegistry-1gB5vtzQ.js} +2 -2
- package/dist/src/{providerRegistry-CQMdTmHP.cjs → providerRegistry-CZO_w7ue.cjs} +2 -2
- package/dist/src/{providerRegistry-Bvh8mv85.js → providerRegistry-DHcFiVWX.js} +1 -1
- package/dist/src/{providerRegistry-CWoPjKFZ.js → providerRegistry-ReCd0sFa.js} +2 -2
- package/dist/src/{providers-BV_KMZje.js → providers-B9KzWxAX.js} +10558 -21587
- package/dist/src/{providers-DruaQfwu.js → providers-BCCz6_IX.js} +1228 -12196
- package/dist/src/{providers-1eKkXBKp.cjs → providers-BDVVIQM6.cjs} +10649 -21843
- package/dist/src/{providers-iUt5fbAN.js → providers-BYAn82cf.js} +1 -1
- package/dist/src/{providers-Domz_llv.js → providers-DVYRZP4E.js} +10589 -21570
- package/dist/src/{pythonUtils-Cldx7huE.js → pythonUtils-CLCgQ9tt.js} +3 -3
- package/dist/src/{pythonUtils-CnndUbW-.js → pythonUtils-CgYxeSmO.js} +3 -3
- package/dist/src/{pythonUtils-tAJvvpS-.cjs → pythonUtils-Cokhluq3.cjs} +8 -7
- package/dist/src/{pythonUtils-C2UQ30Rz.js → pythonUtils-D0BYebvX.js} +3 -3
- package/dist/src/{quiverai-DFotyafY.cjs → quiverai-BAp6iTZD.cjs} +4 -4
- package/dist/src/{quiverai-aPPvXOgn.js → quiverai-BvIhI_0l.js} +4 -4
- package/dist/src/{quiverai-DR0SnIQV.js → quiverai-CdTWPe-A.js} +3 -3
- package/dist/src/{quiverai-CtWi6x_g.js → quiverai-Cv7rJKDz.js} +4 -4
- 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-D6Il2Sob.js → remoteGeneration-B1_XsKXU.js} +16 -108
- package/dist/src/{server-BSB45Nt9.js → remoteGeneration-COpWcmWd.js} +15 -146
- package/dist/src/{server-Dx2TyCH2.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-CgVDrJmM.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-Bi9vBuW_.cjs → responses-1UFFF9N_.cjs} +51 -16
- package/dist/src/{responses-DL9m8CyY.js → responses-B3W2JvOQ.js} +49 -15
- package/dist/src/{responses--OsX2aYW.js → responses-B6ktc3Ra.js} +49 -15
- package/dist/src/{responses-C-flexAY.js → responses-URRzV8qE.js} +49 -15
- package/dist/src/rolldown-runtime-D_mwlA32.cjs +43 -0
- package/dist/src/rubyUtils-BYVlQ94c.js +3 -0
- package/dist/src/{rubyUtils-DsGrTx8R.js → rubyUtils-CXlFM2rR.js} +3 -3
- package/dist/src/{rubyUtils-DVLeA2jg.js → rubyUtils-CnlW8AYb.js} +3 -3
- package/dist/src/{rubyUtils-B6eljPuh.cjs → rubyUtils-CqUWBZAt.cjs} +18 -27
- package/dist/src/{rubyUtils-CYSQEG4a.js → rubyUtils-DdGojpfv.js} +3 -3
- 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-BVkaG2-l.js → sagemaker-CujrzP1a.js} +62 -51
- package/dist/src/{sagemaker-XnfhheQv.cjs → sagemaker-DzffAqo_.cjs} +65 -53
- package/dist/src/{sagemaker-D67yzMzs.js → sagemaker-vhtSV7JI.js} +62 -51
- package/dist/src/{sagemaker-BveBvuxm.js → sagemaker-yr1QKeBs.js} +61 -50
- package/dist/src/{scanner-1DqWi1Ej.js → scanner-DS0109SS.js} +7 -7
- package/dist/src/server/index.js +5105 -605
- 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-BArZuxsI.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-CE5G3a7x.js → signal-CSurUUyV.js} +3 -3
- 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-DDUe-5MC.js → slack-Bapo-7_8.js} +2 -2
- package/dist/src/{slack-1Rhq0EoV.cjs → slack-DMC1QVEg.cjs} +3 -2
- package/dist/src/{slack-D5Wpy8LM.js → slack-DTEFhrMn.js} +2 -2
- package/dist/src/{slack-acRb0IqQ.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-DAAyxcy6.cjs → store-B2NDDooM.cjs} +60 -24
- package/dist/src/{store-CYEy5J2D.js → store-DKd5592Q.js} +51 -20
- package/dist/src/{store-M0b1WfYb.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-DQ4WU5tX.js → tables-CRSXQ2Ke.js} +2 -2
- package/dist/src/{tables-CsWou1Bx.js → tables-CxjU7bBd.js} +3 -3
- package/dist/src/{tables-DUfh1F7Z.cjs → tables-DBIJU0WE.cjs} +6 -5
- package/dist/src/{tables-C4CH3zRr.js → tables-DafUHOeh.js} +3 -3
- package/dist/src/{telemetry-CQPez_Jp.js → telemetry-00ezXr_t.js} +5 -4
- package/dist/src/telemetry-ByPqDcKC.js +3 -0
- package/dist/src/{telemetry-Dsw_faFj.cjs → telemetry-CJ7FnCsc.cjs} +18 -11
- package/dist/src/{telemetry-dbaJ0E98.js → telemetry-DmXYcJNV.js} +5 -4
- package/dist/src/{telemetry-Dvqxv3YC.js → telemetry-DwX9XUN5.js} +4 -3
- package/dist/src/{text-KvuD2Iko.js → text-Db-Wt2u2.js} +1 -1
- package/dist/src/{text-DHxdyQqT.js → text-DwYK5EBn.js} +1 -1
- package/dist/src/{text-BVi-cLPJ.cjs → text-nywWsRBM.cjs} +1 -1
- package/dist/src/{tokenUsageUtils-C-bmyHoE.js → tokenUsageUtils-BjVkdk18.js} +1 -1
- package/dist/src/{tokenUsageUtils-CXrvO-wA.js → tokenUsageUtils-CDet74yk.js} +1 -1
- package/dist/src/tokenUsageUtils-CmnQ0G2m.js +142 -0
- package/dist/src/{tokenUsageUtils-Bb7DkZPz.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-DuWDupG7.js → transcription-B8uIgCYX.js} +5 -5
- package/dist/src/{transcription-CJspiD2c.js → transcription-CfU5loSq.js} +6 -6
- package/dist/src/{transcription-V2HaAmy2.js → transcription-Dkd22_4K.js} +6 -6
- package/dist/src/{transcription-BvjmiYB1.cjs → transcription-mzuf18Mq.cjs} +9 -8
- package/dist/src/{transform-lQrDE1BQ.js → transform-BIMynQsA.js} +9 -9
- 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-CTeuTR3S.cjs → transform-DhNkAUs8.cjs} +13 -12
- package/dist/src/{transform-CG0ehZNG.js → transform-DmvYBRll.js} +9 -9
- package/dist/src/{transform-zDhMmzwX.js → transform-EtD4jAWi.js} +9 -9
- package/dist/src/{transformersAvailability-CcHusyhw.js → transformersAvailability-0ThtPved.js} +1 -1
- package/dist/src/transformersAvailability-BYydDE5U.js +35 -0
- package/dist/src/{transformersAvailability-DLlROWhg.js → transformersAvailability-BvyU9vDD.js} +1 -1
- package/dist/src/{transformersAvailability-Cju9mHgR.cjs → transformersAvailability-BytPvKUW.cjs} +1 -1
- package/dist/src/{types-Dm9JM6Vb.js → types-BFevViUY.js} +115 -19
- package/dist/src/{types-Bgh5SOn6.js → types-BJQBBPTP.js} +115 -19
- package/dist/src/{types-CeaeaZdP.cjs → types-CxJvaY2S.cjs} +357 -172
- package/dist/src/{types-BGQDAP8i.js → types-D6glLbdF.js} +271 -170
- package/dist/src/{util-BYvQUPp7.js → util--WMgw7wM.js} +28 -8
- package/dist/src/{util-C9J8ahRn.js → util-5WnCSb0h.js} +72 -48
- package/dist/src/{util-CN3SrLT4.cjs → util-BSIuSLVK.cjs} +74 -49
- package/dist/src/{util-C8e5uydV.js → util-Bx677_k2.js} +154 -147
- package/dist/src/util-CN8om2rz.cjs +386 -0
- package/dist/src/{util-DDs-7g6-.js → util-CoQWM76y.js} +28 -8
- package/dist/src/util-DNl96nNs.js +327 -0
- package/dist/src/{util-DxWpWjhc.js → util-DURocbYR.js} +667 -507
- package/dist/src/util-Df8YMvS1.js +327 -0
- package/dist/src/{util-DvU2Pw8c.js → util-DiQ3QvBB.js} +28 -8
- package/dist/src/{util-oGMLA7vc.js → util-I-Rf-KaD.js} +862 -577
- package/dist/src/{util-olYL5C6N.cjs → util-IYzs5Y04.cjs} +33 -7
- package/dist/src/{util-D9TisOyk.js → util-LKTmNsMQ.js} +71 -47
- package/dist/src/{util-Bxn8emtE.cjs → util-SPsvFONY.cjs} +738 -582
- package/dist/src/{util-D3q0WQ-0.js → util-efByNxcr.js} +72 -48
- package/dist/src/util-kDURhgJW.js +328 -0
- package/dist/src/{utils-DJfvjyMj.js → utils-B0lzitHZ.js} +3 -3
- package/dist/src/{utils-BLJKfv0y.js → utils-BFOh20Gb.js} +3 -3
- package/dist/src/{utils-hXtCYanr.js → utils-BGY69tk_.js} +2 -2
- package/dist/src/{utils-B05gLxER.cjs → utils-Ve6kuJsa.cjs} +3 -3
- package/dist/src/version-BK20a4sw.js +16 -0
- package/dist/src/version-BWCSaByA.cjs +27 -0
- package/dist/src/version-eRkNuGv8.js +17 -0
- package/dist/src/version-lpHV_53E.js +16 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +56 -28
- package/dist/src/app/assets/Report-CQYFezYu.js +0 -1
- package/dist/src/app/assets/index-BXGkeMwh.css +0 -1
- package/dist/src/app/assets/index-BzJt18Jz.js +0 -385
- 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-Cr9oLMUa.js +0 -3
- package/dist/src/cache-DbLsVWB2.cjs +0 -3
- package/dist/src/cloud-Hphvo8kr.js +0 -3
- package/dist/src/codex-sdk-BAmYE7qy.js +0 -3
- package/dist/src/codex-sdk-CWEnH70W.cjs +0 -2
- package/dist/src/evalResult-D8MT9p0s.js +0 -3
- package/dist/src/evalResult-DElBuddX.js +0 -2
- package/dist/src/evalResult-Dvc-iucu.cjs +0 -2
- package/dist/src/evaluator-CVessDWe.js +0 -3
- package/dist/src/fetch-C7bGKDlQ.js +0 -3
- package/dist/src/graders-BOAzQEUe.cjs +0 -2
- package/dist/src/graders-D4BTsZdG2.js +0 -3
- package/dist/src/graders-DOJK1XpV.js +0 -2
- package/dist/src/graders-NAv9LcBn.js +0 -2
- package/dist/src/image-B5Mv-Z3h.js +0 -257
- package/dist/src/image-DVz2RiMF.js +0 -258
- package/dist/src/image-qUpPvmNZ.js +0 -257
- package/dist/src/image-x6KqLQl4.cjs +0 -280
- package/dist/src/providers-Bp4S-FvO.js +0 -2
- package/dist/src/providers-DV3ax9e_.cjs +0 -3
- package/dist/src/providers-u9Enmfok.js +0 -2
- package/dist/src/render-CH-62LbA.js +0 -135
- package/dist/src/render-CMEpfLaO.js +0 -136
- package/dist/src/render-DHIZ6_k8.js +0 -135
- package/dist/src/render-DfQSFxGE.cjs +0 -165
- package/dist/src/rubyUtils-D1L2d3jb.js +0 -3
- package/dist/src/rubyUtils-DUbq4tff.cjs +0 -2
- package/dist/src/server-BNYztJkh.js +0 -385
- package/dist/src/server-DCtHUqlp.js +0 -3
- package/dist/src/server-DaA2eR26.cjs +0 -2
- package/dist/src/store-CWOSz6D_.cjs +0 -2
- package/dist/src/store-DCDBhv7B.js +0 -3
- package/dist/src/store-Dn9HUkdW.js +0 -240
- package/dist/src/telemetry-C1IqxcdW.js +0 -3
- package/dist/src/telemetry-C4ZEa_es.cjs +0 -2
- package/dist/src/transform-Bbg6A8Jk.js +0 -216
- package/dist/src/transform-CUnzlsbn.cjs +0 -228
- package/dist/src/transform-DYX1_Xnh.js +0 -216
- package/dist/src/transform-DgKlRr73.cjs +0 -2
- package/dist/src/transform-M6ITAESf.js +0 -3
- package/dist/src/transform-UN5UGu8U.js +0 -213
|
@@ -1,14 +1,16 @@
|
|
|
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-Ct2S6Yx-.js";
|
|
3
3
|
import { t as invariant } from "./invariant-Ddh24eXh.js";
|
|
4
|
+
import { n as VERSION } from "./version-lpHV_53E.js";
|
|
4
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";
|
|
8
|
-
import {
|
|
9
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
9
10
|
import * as fsPromises from "fs/promises";
|
|
10
11
|
import { getProxyForUrl } from "proxy-from-env";
|
|
11
12
|
import { Agent, ProxyAgent } from "undici";
|
|
13
|
+
import { promisify } from "util";
|
|
12
14
|
import { gzip } from "zlib";
|
|
13
15
|
//#region src/providers/constants.ts
|
|
14
16
|
const FILE_METADATA_KEY = "_promptfooFileMetadata";
|
|
@@ -17,19 +19,6 @@ const FILE_METADATA_KEY = "_promptfooFileMetadata";
|
|
|
17
19
|
* Used to distinguish human ratings from automated assertions.
|
|
18
20
|
*/
|
|
19
21
|
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.4";
|
|
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
22
|
function getShareApiBaseUrl() {
|
|
34
23
|
return getEnvString("PROMPTFOO_REMOTE_API_BASE_URL") || "https://api.promptfoo.app";
|
|
35
24
|
}
|
|
@@ -45,6 +34,223 @@ const CONSENT_ENDPOINT = "https://api.promptfoo.dev/consent";
|
|
|
45
34
|
const EVENTS_ENDPOINT = "https://a.promptfoo.app";
|
|
46
35
|
const R_ENDPOINT = "https://r.promptfoo.app/";
|
|
47
36
|
//#endregion
|
|
37
|
+
//#region src/globalConfig/globalConfig.ts
|
|
38
|
+
/**
|
|
39
|
+
* Functions for manipulating the global configuration file, which lives at
|
|
40
|
+
* ~/.promptfoo/promptfoo.yaml by default.
|
|
41
|
+
*/
|
|
42
|
+
function writeGlobalConfig(config) {
|
|
43
|
+
fs$2.writeFileSync(path$1.join(getConfigDirectoryPath(true), "promptfoo.yaml"), yaml.dump(config));
|
|
44
|
+
}
|
|
45
|
+
function readGlobalConfig() {
|
|
46
|
+
const configDir = getConfigDirectoryPath();
|
|
47
|
+
const configFilePath = path$1.join(configDir, "promptfoo.yaml");
|
|
48
|
+
let globalConfig = { id: crypto.randomUUID() };
|
|
49
|
+
if (fs$2.existsSync(configFilePath)) {
|
|
50
|
+
globalConfig = yaml.load(fs$2.readFileSync(configFilePath, "utf-8")) || {};
|
|
51
|
+
if (!globalConfig?.id) {
|
|
52
|
+
globalConfig = {
|
|
53
|
+
...globalConfig,
|
|
54
|
+
id: crypto.randomUUID()
|
|
55
|
+
};
|
|
56
|
+
writeGlobalConfig(globalConfig);
|
|
57
|
+
}
|
|
58
|
+
} else {
|
|
59
|
+
if (!fs$2.existsSync(configDir)) fs$2.mkdirSync(configDir, { recursive: true });
|
|
60
|
+
fs$2.writeFileSync(configFilePath, yaml.dump(globalConfig));
|
|
61
|
+
}
|
|
62
|
+
return globalConfig;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Merges the top-level keys into existing config.
|
|
66
|
+
* @param partialConfig New keys to merge into the existing config.
|
|
67
|
+
*/
|
|
68
|
+
function writeGlobalConfigPartial(partialConfig) {
|
|
69
|
+
const updatedConfig = { ...readGlobalConfig() };
|
|
70
|
+
Object.entries(partialConfig).forEach(([key, value]) => {
|
|
71
|
+
if (value !== void 0 && value !== null) updatedConfig[key] = value;
|
|
72
|
+
else delete updatedConfig[key];
|
|
73
|
+
});
|
|
74
|
+
writeGlobalConfig(updatedConfig);
|
|
75
|
+
}
|
|
76
|
+
//#endregion
|
|
77
|
+
//#region src/globalConfig/cloud.ts
|
|
78
|
+
const CLOUD_API_HOST = "https://api.promptfoo.app";
|
|
79
|
+
const API_HOST = getEnvString("API_HOST", CLOUD_API_HOST);
|
|
80
|
+
const SHARING_CUTOFF_DATE = /* @__PURE__ */ new Date("2026-03-09T00:00:00Z");
|
|
81
|
+
var CloudConfig = class {
|
|
82
|
+
config;
|
|
83
|
+
constructor() {
|
|
84
|
+
const savedConfig = readGlobalConfig()?.cloud || {};
|
|
85
|
+
this.config = {
|
|
86
|
+
appUrl: savedConfig.appUrl || "https://www.promptfoo.app",
|
|
87
|
+
apiHost: savedConfig.apiHost,
|
|
88
|
+
apiKey: savedConfig.apiKey,
|
|
89
|
+
sharing: savedConfig.sharing,
|
|
90
|
+
currentOrganizationId: savedConfig.currentOrganizationId,
|
|
91
|
+
currentTeamId: savedConfig.currentTeamId,
|
|
92
|
+
teams: savedConfig.teams
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Returns the API key from config file or PROMPTFOO_API_KEY environment variable.
|
|
97
|
+
* Config file takes precedence over environment variable.
|
|
98
|
+
*/
|
|
99
|
+
resolveApiKey() {
|
|
100
|
+
return this.config.apiKey || process.env.PROMPTFOO_API_KEY;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Returns the API host from config file, PROMPTFOO_CLOUD_API_URL environment variable,
|
|
104
|
+
* or defaults to the standard cloud API host.
|
|
105
|
+
* Config file takes precedence over environment variable.
|
|
106
|
+
*/
|
|
107
|
+
resolveApiHost() {
|
|
108
|
+
return this.config.apiHost || process.env.PROMPTFOO_CLOUD_API_URL || API_HOST;
|
|
109
|
+
}
|
|
110
|
+
isEnabled() {
|
|
111
|
+
return !!this.resolveApiKey();
|
|
112
|
+
}
|
|
113
|
+
setApiHost(apiHost) {
|
|
114
|
+
this.config.apiHost = apiHost;
|
|
115
|
+
this.saveConfig();
|
|
116
|
+
}
|
|
117
|
+
setApiKey(apiKey) {
|
|
118
|
+
this.config.apiKey = apiKey;
|
|
119
|
+
this.saveConfig();
|
|
120
|
+
}
|
|
121
|
+
getApiKey() {
|
|
122
|
+
return this.resolveApiKey();
|
|
123
|
+
}
|
|
124
|
+
getApiHost() {
|
|
125
|
+
return this.resolveApiHost();
|
|
126
|
+
}
|
|
127
|
+
setAppUrl(appUrl) {
|
|
128
|
+
this.config.appUrl = appUrl;
|
|
129
|
+
this.saveConfig();
|
|
130
|
+
}
|
|
131
|
+
getAppUrl() {
|
|
132
|
+
return this.config.appUrl;
|
|
133
|
+
}
|
|
134
|
+
getSharing() {
|
|
135
|
+
return this.config.sharing;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Sets the sharing preference. Note: this value is only updated at authentication time
|
|
139
|
+
* (via `validateAndSetApiToken`) and may become stale if the user's license status
|
|
140
|
+
* changes between re-authentications.
|
|
141
|
+
*/
|
|
142
|
+
setSharing(sharing) {
|
|
143
|
+
this.config.sharing = sharing;
|
|
144
|
+
this.saveConfig();
|
|
145
|
+
}
|
|
146
|
+
delete() {
|
|
147
|
+
writeGlobalConfigPartial({ cloud: {} });
|
|
148
|
+
this.reload();
|
|
149
|
+
}
|
|
150
|
+
saveConfig() {
|
|
151
|
+
writeGlobalConfigPartial({ cloud: this.config });
|
|
152
|
+
this.reload();
|
|
153
|
+
}
|
|
154
|
+
reload() {
|
|
155
|
+
const savedConfig = readGlobalConfig()?.cloud || {};
|
|
156
|
+
this.config = {
|
|
157
|
+
appUrl: savedConfig.appUrl || "https://www.promptfoo.app",
|
|
158
|
+
apiHost: savedConfig.apiHost,
|
|
159
|
+
apiKey: savedConfig.apiKey,
|
|
160
|
+
sharing: savedConfig.sharing,
|
|
161
|
+
currentOrganizationId: savedConfig.currentOrganizationId,
|
|
162
|
+
currentTeamId: savedConfig.currentTeamId,
|
|
163
|
+
teams: savedConfig.teams
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
saveValidatedApiToken(token, apiHost, user, app, hasActiveLicense) {
|
|
167
|
+
this.setApiKey(token);
|
|
168
|
+
this.setApiHost(apiHost);
|
|
169
|
+
this.setAppUrl(app.url);
|
|
170
|
+
if (typeof hasActiveLicense === "boolean") {
|
|
171
|
+
const createdAt = user?.createdAt ? new Date(user.createdAt) : null;
|
|
172
|
+
const isGrandfathered = createdAt != null && createdAt < SHARING_CUTOFF_DATE;
|
|
173
|
+
this.setSharing(hasActiveLicense || isGrandfathered);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
async validateApiToken(token, apiHost) {
|
|
177
|
+
try {
|
|
178
|
+
const { fetchWithProxy } = await Promise.resolve().then(() => fetch_exports);
|
|
179
|
+
const response = await fetchWithProxy(`${apiHost}/api/v1/users/me`, { headers: { Authorization: `Bearer ${token}` } });
|
|
180
|
+
if (!response.ok) {
|
|
181
|
+
const errorMessage = await response.text();
|
|
182
|
+
logger.error(`[Cloud] Failed to validate API token: ${errorMessage}. HTTP Status: ${response.status} - ${response.statusText}.`);
|
|
183
|
+
throw new Error("Failed to validate API token: " + response.statusText);
|
|
184
|
+
}
|
|
185
|
+
const { user, organization, app, hasActiveLicense } = await response.json();
|
|
186
|
+
return {
|
|
187
|
+
user,
|
|
188
|
+
organization,
|
|
189
|
+
app,
|
|
190
|
+
...typeof hasActiveLicense === "boolean" ? { hasActiveLicense } : {}
|
|
191
|
+
};
|
|
192
|
+
} catch (err) {
|
|
193
|
+
const error = err;
|
|
194
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
195
|
+
logger.error(`[Cloud] Failed to validate API token with host ${apiHost}: ${errorMessage}`);
|
|
196
|
+
if (error.cause) logger.error(`Cause: ${error.cause}`);
|
|
197
|
+
throw error;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
async validateAndSetApiToken(token, apiHost) {
|
|
201
|
+
const { user, organization, app, hasActiveLicense } = await this.validateApiToken(token, apiHost);
|
|
202
|
+
this.saveValidatedApiToken(token, apiHost, user, app, hasActiveLicense);
|
|
203
|
+
return {
|
|
204
|
+
user,
|
|
205
|
+
organization,
|
|
206
|
+
app,
|
|
207
|
+
hasActiveLicense: typeof hasActiveLicense === "boolean" ? hasActiveLicense : false
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
getCurrentOrganizationId() {
|
|
211
|
+
return this.config.currentOrganizationId;
|
|
212
|
+
}
|
|
213
|
+
setCurrentOrganization(organizationId) {
|
|
214
|
+
this.config.currentOrganizationId = organizationId;
|
|
215
|
+
this.saveConfig();
|
|
216
|
+
}
|
|
217
|
+
getCurrentTeamId(organizationId) {
|
|
218
|
+
if (organizationId) return this.config.teams?.[organizationId]?.currentTeamId;
|
|
219
|
+
return this.config.currentTeamId;
|
|
220
|
+
}
|
|
221
|
+
setCurrentTeamId(teamId, organizationId) {
|
|
222
|
+
if (organizationId) {
|
|
223
|
+
if (!this.config.teams) this.config.teams = {};
|
|
224
|
+
if (!this.config.teams[organizationId]) this.config.teams[organizationId] = {};
|
|
225
|
+
this.config.teams[organizationId].currentTeamId = teamId;
|
|
226
|
+
} else this.config.currentTeamId = teamId;
|
|
227
|
+
this.saveConfig();
|
|
228
|
+
}
|
|
229
|
+
clearCurrentTeamId(organizationId) {
|
|
230
|
+
if (organizationId) {
|
|
231
|
+
if (this.config.teams?.[organizationId]) delete this.config.teams[organizationId].currentTeamId;
|
|
232
|
+
} else delete this.config.currentTeamId;
|
|
233
|
+
this.saveConfig();
|
|
234
|
+
}
|
|
235
|
+
cacheTeams(teams, organizationId) {
|
|
236
|
+
if (organizationId) {
|
|
237
|
+
if (!this.config.teams) this.config.teams = {};
|
|
238
|
+
if (!this.config.teams[organizationId]) this.config.teams[organizationId] = {};
|
|
239
|
+
this.config.teams[organizationId].cache = teams.map((t) => ({
|
|
240
|
+
id: t.id,
|
|
241
|
+
name: t.name,
|
|
242
|
+
slug: t.slug,
|
|
243
|
+
lastFetched: (/* @__PURE__ */ new Date()).toISOString()
|
|
244
|
+
}));
|
|
245
|
+
}
|
|
246
|
+
this.saveConfig();
|
|
247
|
+
}
|
|
248
|
+
getCachedTeams(organizationId) {
|
|
249
|
+
if (organizationId) return this.config.teams?.[organizationId]?.cache;
|
|
250
|
+
}
|
|
251
|
+
};
|
|
252
|
+
const cloudConfig = new CloudConfig();
|
|
253
|
+
//#endregion
|
|
48
254
|
//#region src/providers/shared.ts
|
|
49
255
|
/**
|
|
50
256
|
* The default timeout for API requests in milliseconds.
|
|
@@ -69,8 +275,9 @@ function calculateCost(modelName, config, promptTokens, completionTokens, models
|
|
|
69
275
|
if (!Number.isFinite(promptTokens) || !Number.isFinite(completionTokens) || typeof promptTokens === "undefined" || typeof completionTokens === "undefined") return;
|
|
70
276
|
const model = models.find((m) => m.id === modelName);
|
|
71
277
|
if (!model || !model.cost) return;
|
|
72
|
-
const
|
|
73
|
-
const
|
|
278
|
+
const longContextCost = model.cost.longContext && promptTokens > model.cost.longContext.threshold ? model.cost.longContext : void 0;
|
|
279
|
+
const inputCost = config.inputCost ?? config.cost ?? longContextCost?.input ?? model.cost.input;
|
|
280
|
+
const outputCost = config.outputCost ?? config.cost ?? longContextCost?.output ?? model.cost.output;
|
|
74
281
|
return inputCost * promptTokens + outputCost * completionTokens;
|
|
75
282
|
}
|
|
76
283
|
/**
|
|
@@ -438,220 +645,6 @@ function getCurrentTimestamp() {
|
|
|
438
645
|
}
|
|
439
646
|
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
440
647
|
//#endregion
|
|
441
|
-
//#region src/globalConfig/globalConfig.ts
|
|
442
|
-
/**
|
|
443
|
-
* Functions for manipulating the global configuration file, which lives at
|
|
444
|
-
* ~/.promptfoo/promptfoo.yaml by default.
|
|
445
|
-
*/
|
|
446
|
-
function writeGlobalConfig(config) {
|
|
447
|
-
fs$2.writeFileSync(path$1.join(getConfigDirectoryPath(true), "promptfoo.yaml"), yaml.dump(config));
|
|
448
|
-
}
|
|
449
|
-
function readGlobalConfig() {
|
|
450
|
-
const configDir = getConfigDirectoryPath();
|
|
451
|
-
const configFilePath = path$1.join(configDir, "promptfoo.yaml");
|
|
452
|
-
let globalConfig = { id: crypto.randomUUID() };
|
|
453
|
-
if (fs$2.existsSync(configFilePath)) {
|
|
454
|
-
globalConfig = yaml.load(fs$2.readFileSync(configFilePath, "utf-8")) || {};
|
|
455
|
-
if (!globalConfig?.id) {
|
|
456
|
-
globalConfig = {
|
|
457
|
-
...globalConfig,
|
|
458
|
-
id: crypto.randomUUID()
|
|
459
|
-
};
|
|
460
|
-
writeGlobalConfig(globalConfig);
|
|
461
|
-
}
|
|
462
|
-
} else {
|
|
463
|
-
if (!fs$2.existsSync(configDir)) fs$2.mkdirSync(configDir, { recursive: true });
|
|
464
|
-
fs$2.writeFileSync(configFilePath, yaml.dump(globalConfig));
|
|
465
|
-
}
|
|
466
|
-
return globalConfig;
|
|
467
|
-
}
|
|
468
|
-
/**
|
|
469
|
-
* Merges the top-level keys into existing config.
|
|
470
|
-
* @param partialConfig New keys to merge into the existing config.
|
|
471
|
-
*/
|
|
472
|
-
function writeGlobalConfigPartial(partialConfig) {
|
|
473
|
-
const updatedConfig = { ...readGlobalConfig() };
|
|
474
|
-
Object.entries(partialConfig).forEach(([key, value]) => {
|
|
475
|
-
if (value !== void 0 && value !== null) updatedConfig[key] = value;
|
|
476
|
-
else delete updatedConfig[key];
|
|
477
|
-
});
|
|
478
|
-
writeGlobalConfig(updatedConfig);
|
|
479
|
-
}
|
|
480
|
-
const API_HOST = getEnvString("API_HOST", "https://api.promptfoo.app");
|
|
481
|
-
const SHARING_CUTOFF_DATE = /* @__PURE__ */ new Date("2026-03-09T00:00:00Z");
|
|
482
|
-
var CloudConfig = class {
|
|
483
|
-
config;
|
|
484
|
-
constructor() {
|
|
485
|
-
const savedConfig = readGlobalConfig()?.cloud || {};
|
|
486
|
-
this.config = {
|
|
487
|
-
appUrl: savedConfig.appUrl || "https://www.promptfoo.app",
|
|
488
|
-
apiHost: savedConfig.apiHost,
|
|
489
|
-
apiKey: savedConfig.apiKey,
|
|
490
|
-
sharing: savedConfig.sharing,
|
|
491
|
-
currentOrganizationId: savedConfig.currentOrganizationId,
|
|
492
|
-
currentTeamId: savedConfig.currentTeamId,
|
|
493
|
-
teams: savedConfig.teams
|
|
494
|
-
};
|
|
495
|
-
}
|
|
496
|
-
/**
|
|
497
|
-
* Returns the API key from config file or PROMPTFOO_API_KEY environment variable.
|
|
498
|
-
* Config file takes precedence over environment variable.
|
|
499
|
-
*/
|
|
500
|
-
resolveApiKey() {
|
|
501
|
-
return this.config.apiKey || process.env.PROMPTFOO_API_KEY;
|
|
502
|
-
}
|
|
503
|
-
/**
|
|
504
|
-
* Returns the API host from config file, PROMPTFOO_CLOUD_API_URL environment variable,
|
|
505
|
-
* or defaults to the standard cloud API host.
|
|
506
|
-
* Config file takes precedence over environment variable.
|
|
507
|
-
*/
|
|
508
|
-
resolveApiHost() {
|
|
509
|
-
return this.config.apiHost || process.env.PROMPTFOO_CLOUD_API_URL || API_HOST;
|
|
510
|
-
}
|
|
511
|
-
isEnabled() {
|
|
512
|
-
return !!this.resolveApiKey();
|
|
513
|
-
}
|
|
514
|
-
setApiHost(apiHost) {
|
|
515
|
-
this.config.apiHost = apiHost;
|
|
516
|
-
this.saveConfig();
|
|
517
|
-
}
|
|
518
|
-
setApiKey(apiKey) {
|
|
519
|
-
this.config.apiKey = apiKey;
|
|
520
|
-
this.saveConfig();
|
|
521
|
-
}
|
|
522
|
-
getApiKey() {
|
|
523
|
-
return this.resolveApiKey();
|
|
524
|
-
}
|
|
525
|
-
getApiHost() {
|
|
526
|
-
return this.resolveApiHost();
|
|
527
|
-
}
|
|
528
|
-
setAppUrl(appUrl) {
|
|
529
|
-
this.config.appUrl = appUrl;
|
|
530
|
-
this.saveConfig();
|
|
531
|
-
}
|
|
532
|
-
getAppUrl() {
|
|
533
|
-
return this.config.appUrl;
|
|
534
|
-
}
|
|
535
|
-
getSharing() {
|
|
536
|
-
return this.config.sharing;
|
|
537
|
-
}
|
|
538
|
-
/**
|
|
539
|
-
* Sets the sharing preference. Note: this value is only updated at authentication time
|
|
540
|
-
* (via `validateAndSetApiToken`) and may become stale if the user's license status
|
|
541
|
-
* changes between re-authentications.
|
|
542
|
-
*/
|
|
543
|
-
setSharing(sharing) {
|
|
544
|
-
this.config.sharing = sharing;
|
|
545
|
-
this.saveConfig();
|
|
546
|
-
}
|
|
547
|
-
delete() {
|
|
548
|
-
writeGlobalConfigPartial({ cloud: {} });
|
|
549
|
-
this.reload();
|
|
550
|
-
}
|
|
551
|
-
saveConfig() {
|
|
552
|
-
writeGlobalConfigPartial({ cloud: this.config });
|
|
553
|
-
this.reload();
|
|
554
|
-
}
|
|
555
|
-
reload() {
|
|
556
|
-
const savedConfig = readGlobalConfig()?.cloud || {};
|
|
557
|
-
this.config = {
|
|
558
|
-
appUrl: savedConfig.appUrl || "https://www.promptfoo.app",
|
|
559
|
-
apiHost: savedConfig.apiHost,
|
|
560
|
-
apiKey: savedConfig.apiKey,
|
|
561
|
-
sharing: savedConfig.sharing,
|
|
562
|
-
currentOrganizationId: savedConfig.currentOrganizationId,
|
|
563
|
-
currentTeamId: savedConfig.currentTeamId,
|
|
564
|
-
teams: savedConfig.teams
|
|
565
|
-
};
|
|
566
|
-
}
|
|
567
|
-
saveValidatedApiToken(token, apiHost, user, app, hasActiveLicense) {
|
|
568
|
-
this.setApiKey(token);
|
|
569
|
-
this.setApiHost(apiHost);
|
|
570
|
-
this.setAppUrl(app.url);
|
|
571
|
-
if (typeof hasActiveLicense === "boolean") {
|
|
572
|
-
const createdAt = user?.createdAt ? new Date(user.createdAt) : null;
|
|
573
|
-
const isGrandfathered = createdAt != null && createdAt < SHARING_CUTOFF_DATE;
|
|
574
|
-
this.setSharing(hasActiveLicense || isGrandfathered);
|
|
575
|
-
}
|
|
576
|
-
}
|
|
577
|
-
async validateApiToken(token, apiHost) {
|
|
578
|
-
try {
|
|
579
|
-
const { fetchWithProxy } = await Promise.resolve().then(() => fetch_exports);
|
|
580
|
-
const response = await fetchWithProxy(`${apiHost}/api/v1/users/me`, { headers: { Authorization: `Bearer ${token}` } });
|
|
581
|
-
if (!response.ok) {
|
|
582
|
-
const errorMessage = await response.text();
|
|
583
|
-
logger.error(`[Cloud] Failed to validate API token: ${errorMessage}. HTTP Status: ${response.status} - ${response.statusText}.`);
|
|
584
|
-
throw new Error("Failed to validate API token: " + response.statusText);
|
|
585
|
-
}
|
|
586
|
-
const { user, organization, app, hasActiveLicense } = await response.json();
|
|
587
|
-
return {
|
|
588
|
-
user,
|
|
589
|
-
organization,
|
|
590
|
-
app,
|
|
591
|
-
...typeof hasActiveLicense === "boolean" ? { hasActiveLicense } : {}
|
|
592
|
-
};
|
|
593
|
-
} catch (err) {
|
|
594
|
-
const error = err;
|
|
595
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
596
|
-
logger.error(`[Cloud] Failed to validate API token with host ${apiHost}: ${errorMessage}`);
|
|
597
|
-
if (error.cause) logger.error(`Cause: ${error.cause}`);
|
|
598
|
-
throw error;
|
|
599
|
-
}
|
|
600
|
-
}
|
|
601
|
-
async validateAndSetApiToken(token, apiHost) {
|
|
602
|
-
const { user, organization, app, hasActiveLicense } = await this.validateApiToken(token, apiHost);
|
|
603
|
-
this.saveValidatedApiToken(token, apiHost, user, app, hasActiveLicense);
|
|
604
|
-
return {
|
|
605
|
-
user,
|
|
606
|
-
organization,
|
|
607
|
-
app,
|
|
608
|
-
hasActiveLicense: typeof hasActiveLicense === "boolean" ? hasActiveLicense : false
|
|
609
|
-
};
|
|
610
|
-
}
|
|
611
|
-
getCurrentOrganizationId() {
|
|
612
|
-
return this.config.currentOrganizationId;
|
|
613
|
-
}
|
|
614
|
-
setCurrentOrganization(organizationId) {
|
|
615
|
-
this.config.currentOrganizationId = organizationId;
|
|
616
|
-
this.saveConfig();
|
|
617
|
-
}
|
|
618
|
-
getCurrentTeamId(organizationId) {
|
|
619
|
-
if (organizationId) return this.config.teams?.[organizationId]?.currentTeamId;
|
|
620
|
-
return this.config.currentTeamId;
|
|
621
|
-
}
|
|
622
|
-
setCurrentTeamId(teamId, organizationId) {
|
|
623
|
-
if (organizationId) {
|
|
624
|
-
if (!this.config.teams) this.config.teams = {};
|
|
625
|
-
if (!this.config.teams[organizationId]) this.config.teams[organizationId] = {};
|
|
626
|
-
this.config.teams[organizationId].currentTeamId = teamId;
|
|
627
|
-
} else this.config.currentTeamId = teamId;
|
|
628
|
-
this.saveConfig();
|
|
629
|
-
}
|
|
630
|
-
clearCurrentTeamId(organizationId) {
|
|
631
|
-
if (organizationId) {
|
|
632
|
-
if (this.config.teams?.[organizationId]) delete this.config.teams[organizationId].currentTeamId;
|
|
633
|
-
} else delete this.config.currentTeamId;
|
|
634
|
-
this.saveConfig();
|
|
635
|
-
}
|
|
636
|
-
cacheTeams(teams, organizationId) {
|
|
637
|
-
if (organizationId) {
|
|
638
|
-
if (!this.config.teams) this.config.teams = {};
|
|
639
|
-
if (!this.config.teams[organizationId]) this.config.teams[organizationId] = {};
|
|
640
|
-
this.config.teams[organizationId].cache = teams.map((t) => ({
|
|
641
|
-
id: t.id,
|
|
642
|
-
name: t.name,
|
|
643
|
-
slug: t.slug,
|
|
644
|
-
lastFetched: (/* @__PURE__ */ new Date()).toISOString()
|
|
645
|
-
}));
|
|
646
|
-
}
|
|
647
|
-
this.saveConfig();
|
|
648
|
-
}
|
|
649
|
-
getCachedTeams(organizationId) {
|
|
650
|
-
if (organizationId) return this.config.teams?.[organizationId]?.cache;
|
|
651
|
-
}
|
|
652
|
-
};
|
|
653
|
-
const cloudConfig = new CloudConfig();
|
|
654
|
-
//#endregion
|
|
655
648
|
//#region src/util/fetch/monkeyPatchFetch.ts
|
|
656
649
|
const gzipAsync = promisify(gzip);
|
|
657
650
|
function isConnectionError(error) {
|
|
@@ -660,6 +653,14 @@ function isConnectionError(error) {
|
|
|
660
653
|
/**
|
|
661
654
|
* Enhanced fetch wrapper that adds logging, authentication, error handling, and optional compression
|
|
662
655
|
*/
|
|
656
|
+
function isPromptfooCloudApiHost(url) {
|
|
657
|
+
try {
|
|
658
|
+
const targetUrl = url instanceof Request ? url.url : url.toString();
|
|
659
|
+
return new URL(targetUrl).origin === CLOUD_API_HOST;
|
|
660
|
+
} catch {
|
|
661
|
+
return false;
|
|
662
|
+
}
|
|
663
|
+
}
|
|
663
664
|
async function monkeyPatchFetch(url, options) {
|
|
664
665
|
const NO_LOG_URLS = [
|
|
665
666
|
R_ENDPOINT,
|
|
@@ -679,7 +680,7 @@ async function monkeyPatchFetch(url, options) {
|
|
|
679
680
|
} catch (e) {
|
|
680
681
|
logger.warn(`Failed to compress request body: ${e}`);
|
|
681
682
|
}
|
|
682
|
-
if (
|
|
683
|
+
if (isPromptfooCloudApiHost(url)) {
|
|
683
684
|
const token = cloudConfig.getApiKey();
|
|
684
685
|
opts.headers = {
|
|
685
686
|
...opts.headers || {},
|
|
@@ -713,11 +714,31 @@ async function monkeyPatchFetch(url, options) {
|
|
|
713
714
|
}
|
|
714
715
|
}
|
|
715
716
|
//#endregion
|
|
717
|
+
//#region src/util/fetch/retryContext.ts
|
|
718
|
+
const fetchRetryContext = new AsyncLocalStorage();
|
|
719
|
+
/**
|
|
720
|
+
* Run `fn` with a fetch retry context so nested `fetchWithRetries` /
|
|
721
|
+
* `fetchWithProxy` calls inherit the provider's configured `maxRetries`.
|
|
722
|
+
*
|
|
723
|
+
* When `maxRetries` is `undefined`, the new scope deliberately shadows any
|
|
724
|
+
* outer provider context so providers without an override fall back to defaults.
|
|
725
|
+
*/
|
|
726
|
+
function withFetchRetryContext(maxRetries, fn) {
|
|
727
|
+
return fetchRetryContext.run({ maxRetries }, fn);
|
|
728
|
+
}
|
|
729
|
+
/**
|
|
730
|
+
* Read the active context's `maxRetries`, or `undefined` when none is set.
|
|
731
|
+
*/
|
|
732
|
+
function getFetchRetryContextMaxRetries() {
|
|
733
|
+
return fetchRetryContext.getStore()?.maxRetries;
|
|
734
|
+
}
|
|
735
|
+
//#endregion
|
|
716
736
|
//#region src/util/fetch/index.ts
|
|
717
737
|
var fetch_exports = /* @__PURE__ */ __exportAll({
|
|
718
738
|
fetchWithProxy: () => fetchWithProxy,
|
|
719
739
|
fetchWithRetries: () => fetchWithRetries,
|
|
720
740
|
fetchWithTimeout: () => fetchWithTimeout,
|
|
741
|
+
getFetchWithProxyHeaders: () => getFetchWithProxyHeaders,
|
|
721
742
|
handleRateLimit: () => handleRateLimit,
|
|
722
743
|
isRateLimited: () => isRateLimited,
|
|
723
744
|
isTransientError: () => isTransientError
|
|
@@ -772,20 +793,44 @@ function getOrCreateProxyAgent(proxyUrl, tlsOptions) {
|
|
|
772
793
|
cachedProxyAgents.set(cacheKey, agent);
|
|
773
794
|
return agent;
|
|
774
795
|
}
|
|
796
|
+
/**
|
|
797
|
+
* Resolve whether to disable transient-error retries. An explicit caller flag
|
|
798
|
+
* always wins (a caller may opt back in even when the provider set
|
|
799
|
+
* `maxRetries: 0`); otherwise we disable only when the retry context carries
|
|
800
|
+
* `maxRetries === 0`.
|
|
801
|
+
*/
|
|
802
|
+
function resolveTransientRetryDisabled(explicit) {
|
|
803
|
+
if (explicit !== void 0) return explicit;
|
|
804
|
+
return getFetchRetryContextMaxRetries() === 0;
|
|
805
|
+
}
|
|
806
|
+
function headersInitToRecord(headers) {
|
|
807
|
+
if (!headers) return {};
|
|
808
|
+
if (headers instanceof Headers) return Object.fromEntries(headers.entries());
|
|
809
|
+
if (Array.isArray(headers)) return Object.fromEntries(new Headers(headers).entries());
|
|
810
|
+
return { ...headers };
|
|
811
|
+
}
|
|
812
|
+
function getFetchWithProxyHeaders(url, options) {
|
|
813
|
+
const requestHeaders = url instanceof Request && options.headers === void 0 ? headersInitToRecord(url.headers) : {};
|
|
814
|
+
const optionHeaders = headersInitToRecord(options.headers);
|
|
815
|
+
return {
|
|
816
|
+
...requestHeaders,
|
|
817
|
+
...optionHeaders,
|
|
818
|
+
"x-promptfoo-version": VERSION
|
|
819
|
+
};
|
|
820
|
+
}
|
|
821
|
+
function getFetchUrlString(url) {
|
|
822
|
+
if (typeof url === "string") return url;
|
|
823
|
+
if (url instanceof URL) return url.toString();
|
|
824
|
+
if (url instanceof Request) return url.url;
|
|
825
|
+
}
|
|
775
826
|
async function fetchWithProxy(url, options = {}, abortSignal) {
|
|
776
827
|
let finalUrl = url;
|
|
777
|
-
let finalUrlString;
|
|
778
|
-
if (typeof url === "string") finalUrlString = url;
|
|
779
|
-
else if (url instanceof URL) finalUrlString = url.toString();
|
|
780
|
-
else if (url instanceof Request) finalUrlString = url.url;
|
|
828
|
+
let finalUrlString = getFetchUrlString(url);
|
|
781
829
|
if (!finalUrlString) throw new Error("Invalid URL");
|
|
782
830
|
const combinedSignal = abortSignal ? options.signal ? AbortSignal.any([options.signal, abortSignal]) : abortSignal : options.signal;
|
|
783
831
|
const finalOptions = {
|
|
784
832
|
...options,
|
|
785
|
-
headers:
|
|
786
|
-
...options.headers,
|
|
787
|
-
"x-promptfoo-version": VERSION
|
|
788
|
-
},
|
|
833
|
+
headers: getFetchWithProxyHeaders(url, options),
|
|
789
834
|
signal: combinedSignal
|
|
790
835
|
};
|
|
791
836
|
if (typeof url === "string") try {
|
|
@@ -823,10 +868,11 @@ async function fetchWithProxy(url, options = {}, abortSignal) {
|
|
|
823
868
|
logger.debug(`Using proxy: ${sanitizeUrl(proxyUrl)}`);
|
|
824
869
|
finalOptions.dispatcher = getOrCreateProxyAgent(proxyUrl, tlsOptions);
|
|
825
870
|
} else finalOptions.dispatcher = getOrCreateAgent(tlsOptions);
|
|
826
|
-
const
|
|
871
|
+
const disableTransientRetries = resolveTransientRetryDisabled(options.disableTransientRetries);
|
|
872
|
+
const maxTransientRetries = disableTransientRetries ? 0 : 3;
|
|
827
873
|
for (let attempt = 0; attempt <= maxTransientRetries; attempt++) {
|
|
828
874
|
const response = await monkeyPatchFetch(finalUrl, finalOptions);
|
|
829
|
-
if (!
|
|
875
|
+
if (!disableTransientRetries && isTransientError(response) && attempt < maxTransientRetries) {
|
|
830
876
|
const backoffMs = Math.pow(2, attempt) * 1e3;
|
|
831
877
|
logger.debug(`Transient error (${response.status} ${response.statusText}), retry ${attempt + 1}/${maxTransientRetries} after ${backoffMs}ms`);
|
|
832
878
|
await sleep(backoffMs);
|
|
@@ -899,8 +945,17 @@ function isTransientError(response) {
|
|
|
899
945
|
default: return false;
|
|
900
946
|
}
|
|
901
947
|
}
|
|
948
|
+
function formatFetchErrorMessage(error) {
|
|
949
|
+
if (!(error instanceof Error)) return String(error);
|
|
950
|
+
const typedError = error;
|
|
951
|
+
let message = `${typedError.name}: ${typedError.message}`;
|
|
952
|
+
if (typedError.cause) message += ` (Cause: ${typedError.cause})`;
|
|
953
|
+
if (typedError.code) message += ` (Code: ${typedError.code})`;
|
|
954
|
+
return message;
|
|
955
|
+
}
|
|
902
956
|
async function fetchWithRetries(url, options = {}, timeout, maxRetries) {
|
|
903
|
-
|
|
957
|
+
const contextMaxRetries = getFetchRetryContextMaxRetries();
|
|
958
|
+
maxRetries = Math.max(0, maxRetries ?? contextMaxRetries ?? 4);
|
|
904
959
|
let lastErrorMessage;
|
|
905
960
|
const backoff = getEnvInt("PROMPTFOO_REQUEST_BACKOFF_MS", 5e3);
|
|
906
961
|
for (let i = 0; i <= maxRetries; i++) {
|
|
@@ -912,21 +967,19 @@ async function fetchWithRetries(url, options = {}, timeout, maxRetries) {
|
|
|
912
967
|
}, timeout);
|
|
913
968
|
if (getEnvBool("PROMPTFOO_RETRY_5XX") && response.status >= 500 && response.status < 600) throw new Error(`Internal Server Error: ${response.status} ${response.statusText}`);
|
|
914
969
|
if (response && isRateLimited(response)) {
|
|
915
|
-
logger.debug(`Rate limited on URL ${url}: ${response.status} ${response.statusText}, attempt ${i + 1}/${maxRetries + 1}, waiting before retry...`);
|
|
916
970
|
lastErrorMessage = `Rate limited: ${response.status} ${response.statusText}`;
|
|
971
|
+
if (i >= maxRetries) {
|
|
972
|
+
logger.debug(`Rate limited on URL ${url}: ${response.status} ${response.statusText}, attempt ${i + 1}/${maxRetries + 1}, no retries remain.`);
|
|
973
|
+
break;
|
|
974
|
+
}
|
|
975
|
+
logger.debug(`Rate limited on URL ${url}: ${response.status} ${response.statusText}, attempt ${i + 1}/${maxRetries + 1}, waiting before retry...`);
|
|
917
976
|
await handleRateLimit(response);
|
|
918
977
|
continue;
|
|
919
978
|
}
|
|
920
979
|
return response;
|
|
921
980
|
} catch (error) {
|
|
922
981
|
if (error instanceof Error && error.name === "AbortError") throw error;
|
|
923
|
-
|
|
924
|
-
if (error instanceof Error) {
|
|
925
|
-
const typedError = error;
|
|
926
|
-
errorMessage = `${typedError.name}: ${typedError.message}`;
|
|
927
|
-
if (typedError.cause) errorMessage += ` (Cause: ${typedError.cause})`;
|
|
928
|
-
if (typedError.code) errorMessage += ` (Code: ${typedError.code})`;
|
|
929
|
-
} else errorMessage = String(error);
|
|
982
|
+
const errorMessage = formatFetchErrorMessage(error);
|
|
930
983
|
logger.debug(`Request to ${url} failed (attempt #${i + 1}), retrying: ${errorMessage}`);
|
|
931
984
|
if (i < maxRetries) await sleep(Math.pow(2, i) * (backoff + 1e3 * Math.random()));
|
|
932
985
|
lastErrorMessage = errorMessage;
|
|
@@ -935,6 +988,6 @@ async function fetchWithRetries(url, options = {}, timeout, maxRetries) {
|
|
|
935
988
|
throw new Error(`Request failed after ${maxRetries} retries: ${lastErrorMessage}`);
|
|
936
989
|
}
|
|
937
990
|
//#endregion
|
|
938
|
-
export {
|
|
991
|
+
export { CONSENT_ENDPOINT as A, transformTools as C, writeGlobalConfig as D, readGlobalConfig as E, getShareApiBaseUrl as F, getShareViewBaseUrl as I, FILE_METADATA_KEY as L, R_ENDPOINT as M, TERMINAL_MAX_WIDTH as N, writeGlobalConfigPartial as O, getDefaultShareViewBaseUrl as P, HUMAN_ASSERTION_TYPE as R, transformToolChoice as S, cloudConfig as T, isPromptfooSampleTarget as _, getFetchWithProxyHeaders as a, parseChatPrompt as b, getCurrentTimestamp as c, parseRetryAfter as d, LONG_RUNNING_MODEL_TIMEOUT_MS as f, isOpenAIToolChoice as g, isOpenAIToolArray as h, fetch_exports as i, EVENTS_ENDPOINT as j, CLOUD_PROVIDER_PREFIX as k, sleep as l, calculateCost as m, fetchWithRetries as n, withFetchRetryContext as o, REQUEST_TIMEOUT_MS as p, fetchWithTimeout as r, isPromptfooCloudApiHost as s, fetchWithProxy as t, parseRateLimitHeaders as u, openaiToolChoiceToBedrock as v, CloudConfig as w, toTitleCase as x, openaiToolsToBedrock as y };
|
|
939
992
|
|
|
940
|
-
//# sourceMappingURL=fetch-
|
|
993
|
+
//# sourceMappingURL=fetch-It34O8Ur.js.map
|