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