promptfoo 0.121.4 → 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/dist/src/{ListApp-DQkFNqE9.js → ListApp-BRUsT43Y.js} +1 -1
- package/dist/src/{accounts-Dy17bs4D.cjs → accounts-BIFntVWB.cjs} +4 -4
- package/dist/src/{accounts-F9d_5sMC.js → accounts-CLJHCDDb.js} +6 -6
- package/dist/src/{accounts-DhMYUUbu.js → accounts-CaLNYnf7.js} +4 -4
- package/dist/src/{accounts-DdJ2pHMI.js → accounts-bnyHT7Ju.js} +5 -5
- package/dist/src/{agentic-utils-w68v6_Dz.js → agentic-utils-B5krlibj.js} +3 -3
- package/dist/src/{agentic-utils-P172hM8B.js → agentic-utils-Ba67xmgs.js} +2 -2
- package/dist/src/{agentic-utils-qFlm6zes.js → agentic-utils-BclbiXiq.js} +3 -3
- package/dist/src/{agentic-utils-BpX5b23w.cjs → agentic-utils-D2x0wGhB.cjs} +2 -2
- package/dist/src/{agents-CgaMXvLM.js → agents-BGqaTDnr.js} +5 -5
- package/dist/src/{agents-8FDnTriG.js → agents-BV9yFpXX.js} +5 -5
- package/dist/src/{agents-aYPQLf8W.js → agents-BYdMl1UE.js} +4 -4
- package/dist/src/{agents-pQeBEXMm.js → agents-DhxWMCtH.js} +5 -5
- package/dist/src/{agents-D7-HGxUj.cjs → agents-DiWmQYH9.cjs} +4 -4
- package/dist/src/{agents-BahDpe5G.cjs → agents-WULPVjbH.cjs} +4 -4
- package/dist/src/{agents-DJ35I3Nt.js → agents-emVcx3yh.js} +5 -5
- package/dist/src/{agents-C-R_jfzI.js → agents-n6vPqV3i.js} +4 -4
- package/dist/src/{aimlapi-BCq3MHeL.js → aimlapi-BxqK9HF_.js} +7 -7
- package/dist/src/{aimlapi-qcK4OT55.cjs → aimlapi-BzLjZI_m.cjs} +6 -6
- package/dist/src/{aimlapi-BD6J9oKt.js → aimlapi-DR4pgeiC.js} +6 -6
- package/dist/src/{aimlapi-sgYnkE54.js → aimlapi-uPGp0Zdo.js} +7 -7
- package/dist/src/app/app/tsconfig.app.tsbuildinfo +1 -1
- 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-BXGkeMwh.css → index-Cli2yAXv.css} +1 -1
- package/dist/src/app/index.html +27 -2
- package/dist/src/{audio-DcVKoInv.js → audio-BvpTOArF.js} +4 -4
- package/dist/src/{audio-BQtNuYBj.cjs → audio-C0vDeS0j.cjs} +3 -3
- package/dist/src/{audio-B7izf48x.js → audio-CScmnmEB.js} +4 -4
- package/dist/src/{audio-COrn8rM6.js → audio-Da8U9IS5.js} +3 -3
- package/dist/src/{base-fZ9wgg50.js → base-BOMaNEes.js} +3 -3
- package/dist/src/{base-PYJvBE1i.js → base-BTux96b1.js} +2 -2
- package/dist/src/{base-D-670DX8.cjs → base-Tw6uhH8K.cjs} +2 -2
- package/dist/src/{base-yrI1Yal4.js → base-dYsl2hmL.js} +3 -3
- package/dist/src/{blobs-D2FAd1Q5.cjs → blobs-B95F_7vE.cjs} +2 -2
- package/dist/src/{blobs-C-F78Kfn.js → blobs-BW4U31ue.js} +2 -2
- package/dist/src/{blobs-BCZavS8s.js → blobs-D_gg8nbm.js} +3 -3
- package/dist/src/{blobs-BQWqnnvL.js → blobs-DjLby-uP.js} +3 -3
- package/dist/src/{cache-mb7c8hbp.js → cache-BI5BY7ey.js} +4 -4
- package/dist/src/{cache-DbLsVWB2.cjs → cache-BRkhlH3k.cjs} +1 -1
- package/dist/src/cache-BlC6aeJ0.js +3 -0
- package/dist/src/{cache-D5NZmMiT.js → cache-Bzttsk0X.js} +2 -2
- package/dist/src/{cache-C4Xb-hNb.js → cache-Cr-qWIbP.js} +3 -3
- package/dist/src/{cache-BIyPcp5v.cjs → cache-DGg-yTZG.cjs} +2 -2
- package/dist/src/{chat-Dr3DUQ0D.js → chat-BLOdH60v.js} +12 -12
- package/dist/src/{chat-BfPaS15_.js → chat-Cx_LkwvZ.js} +12 -12
- package/dist/src/{chat-mW0ORo8G.js → chat-D9nudO9b.js} +4 -4
- package/dist/src/{chat-I9izLm49.js → chat-DChSH_Es.js} +12 -12
- package/dist/src/{chat-MKxMnZJZ.js → chat-DG2LkwLq.js} +2 -2
- package/dist/src/{chat-BPXSW8Bv.cjs → chat-DH97tVV9.cjs} +2 -2
- package/dist/src/{chat-0bwXjVP0.js → chat-aMQZw6R7.js} +4 -4
- package/dist/src/{chat-CclRbxGf.cjs → chat-vYqqv1gP.cjs} +11 -11
- package/dist/src/{chatkit-zUIVoDos.js → chatkit-B8X34dQc.js} +4 -4
- package/dist/src/{chatkit-Cv6AhukM.js → chatkit-BXu42Qwt.js} +3 -3
- package/dist/src/{chatkit-CJnHRRMM.js → chatkit-CbMRoeYw.js} +4 -4
- package/dist/src/{chatkit-BoWoSgXl.cjs → chatkit-D44VyUyB.cjs} +3 -3
- package/dist/src/{claude-agent-sdk-CPJo3dBQ.cjs → claude-agent-sdk-BRq0bbIK.cjs} +8 -8
- package/dist/src/{claude-agent-sdk-BQNuLaAK.js → claude-agent-sdk-BjriSVRZ.js} +7 -7
- package/dist/src/{claude-agent-sdk-Dtq_L-Sc.js → claude-agent-sdk-BzNZeZ0N.js} +7 -7
- package/dist/src/{claude-agent-sdk-nfAIcxNf.js → claude-agent-sdk-DYv_AJ8u.js} +7 -7
- package/dist/src/cloud-CoD5OacT.js +3 -0
- package/dist/src/{cloud-DQZ5sVjW.js → cloud-Da0bofJd.js} +3 -3
- package/dist/src/{cloudflare-ai-BIB567w6.js → cloudflare-ai-CXC4b1EU.js} +4 -4
- package/dist/src/{cloudflare-ai-DlKr0rY7.js → cloudflare-ai-CyBoIs1Q.js} +6 -6
- package/dist/src/{cloudflare-ai-DGLte7Py.js → cloudflare-ai-DGOwgexC.js} +6 -6
- package/dist/src/{cloudflare-ai-Dl3N9OVD.cjs → cloudflare-ai-DJv5qnyb.cjs} +4 -4
- package/dist/src/{cloudflare-gateway-BDZrYydE.js → cloudflare-gateway-1sAoOyft.js} +5 -5
- package/dist/src/{cloudflare-gateway-CiIZHU0Q.js → cloudflare-gateway-D-dnkzCF.js} +5 -5
- package/dist/src/{cloudflare-gateway-BYDp495F.cjs → cloudflare-gateway-DKVjkDav.cjs} +3 -3
- package/dist/src/{cloudflare-gateway-DI1HNP5F.js → cloudflare-gateway-TJkVrZlB.js} +3 -3
- 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-C2_M2pl_.cjs → codex-sdk-Bd8UbO9q.cjs} +5 -5
- package/dist/src/{codex-sdk-CpqiOqDO.js → codex-sdk-BgEFQ70r.js} +6 -6
- package/dist/src/{codex-sdk-Rtky3M4I.js → codex-sdk-Bzb_TqX9.js} +6 -6
- package/dist/src/{codex-sdk-CWEnH70W.cjs → codex-sdk-Danroptg.cjs} +1 -1
- package/dist/src/{codex-sdk-CErXn7qh.js → codex-sdk-DfvDTN33.js} +5 -5
- package/dist/src/{cometapi-CtJ-mS8R.js → cometapi-B5ImDlSm.js} +8 -8
- package/dist/src/{cometapi-UVOryo4W.cjs → cometapi-BgAkuYCw.cjs} +7 -7
- package/dist/src/{cometapi-BUlt_ELa.js → cometapi-CC7hWxmX.js} +8 -8
- package/dist/src/{cometapi-DT-jlVCB.js → cometapi-CCbpHkuF.js} +7 -7
- package/dist/src/{completion-x0a_c2y1.js → completion-2iuYVxwi.js} +6 -6
- package/dist/src/{completion-Dnxn7E-j.js → completion-CrD6MQ93.js} +5 -5
- package/dist/src/{completion-BozdoXba.cjs → completion-DtQ72Bm3.cjs} +5 -5
- package/dist/src/{completion-HUe8wDhZ.js → completion-Vq_ad618.js} +6 -6
- package/dist/src/{createHash-ChI45QR1.js → createHash-DPpsZgFF.js} +1 -1
- package/dist/src/{createHash-CwDVU5xr.js → createHash-Un4Q_huE.js} +1 -1
- package/dist/src/{createHash-B7KvgoOD.cjs → createHash-VvBIc-AW.cjs} +1 -1
- package/dist/src/{docker-DCgsveLD.js → docker--3qzPa-6.js} +6 -6
- package/dist/src/{docker-DS4_Osau.cjs → docker-D3AY-5F5.cjs} +5 -5
- package/dist/src/{docker-CQmlA2NU.js → docker-DCsCDvwM.js} +6 -6
- package/dist/src/{docker-ClnmCf1Z.js → docker-Dorv4_Dg.js} +5 -5
- package/dist/src/{embedding-I45KG3o7.cjs → embedding-BXhN5lCH.cjs} +5 -5
- package/dist/src/{embedding-nFbumxcv.js → embedding-ChS1ivFS.js} +5 -5
- package/dist/src/{embedding-D3xTseo7.js → embedding-DNRvZwRN.js} +6 -6
- package/dist/src/{embedding-DD9wa3ae.js → embedding-D_bI4NDq.js} +6 -6
- package/dist/src/{errors-Cw810C93.js → errors-DFHe4L-n.js} +1 -1
- package/dist/src/{esm-Dh4dOLlt.js → esm-B6whoAcf.js} +2 -2
- package/dist/src/{esm-C7PnfdF8.js → esm-BRkfNsYs.js} +1 -1
- package/dist/src/{esm-tVgYPY-f.js → esm-BX8fwlAO.js} +2 -2
- package/dist/src/{esm-CtEPLdAj.cjs → esm-B_rGuPTo.cjs} +1 -1
- package/dist/src/{eval-CzJFfFO9.js → eval-BQPLBJbw.js} +1 -1
- package/dist/src/{eval-u4UVafl6.js → eval-DJ_4A-tr.js} +14 -14
- package/dist/src/evalResult-BBJAHAtw.cjs +2 -0
- package/dist/src/evalResult-BBK58h2B.js +3 -0
- package/dist/src/{evalResult-KZqXl4XP.cjs → evalResult-Cx-8OWkb.cjs} +28 -10
- package/dist/src/{evalResult-D3hVYFis.js → evalResult-D6P5I5il.js} +29 -11
- package/dist/src/{evalResult-Bgm9ZH31.js → evalResult-pSvGWFMo.js} +29 -11
- package/dist/src/{evaluator-IvuDYSvQ.js → evaluator-D-UIbbYq.js} +845 -98
- package/dist/src/evaluator-DgLKaZk8.js +3 -0
- package/dist/src/{extractor-Dk6bRWkv.js → extractor-BM3jRERL.js} +5 -5
- package/dist/src/{extractor-WVPOrH43.cjs → extractor-Dxr2J_wK.cjs} +5 -5
- package/dist/src/{extractor-DNSeBVOJ.js → extractor-DxyiFhPk.js} +6 -6
- package/dist/src/{extractor-CAfTSraf.js → extractor-YlZbUMsL.js} +6 -6
- package/dist/src/fetch-8viavNv8.js +3 -0
- package/dist/src/{fetch-BEWnXrrG.js → fetch-B6ch2nU2.js} +9 -20
- package/dist/src/{fetch-Di00EQrc.js → fetch-D9xxyC1p.js} +221 -232
- package/dist/src/{fetch-CJU5ELPa.cjs → fetch-NuqXW1Xb.cjs} +221 -244
- package/dist/src/{fetch-B0Z3Oe4k.js → fetch-Y5qX_kST.js} +8 -19
- package/dist/src/{fileExtensions-BArZuxsI.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-AWa2ZML4.js → fileExtensions-DysCsxNG.js} +1 -1
- package/dist/src/{formatDuration-DZzPsexs.js → formatDuration-Ch4A7G3o.js} +1 -1
- package/dist/src/{genaiTracer-yRuxj9-L.cjs → genaiTracer-BokHC-MW.cjs} +1 -1
- package/dist/src/{genaiTracer-DWdZ28hY.js → genaiTracer-C3ZPQU60.js} +1 -1
- package/dist/src/{genaiTracer-XnrcgDCe.js → genaiTracer-CFny3gOy.js} +1 -1
- package/dist/src/{genaiTracer-COYDi-tC.js → genaiTracer-DxODqT9e.js} +1 -1
- package/dist/src/{graders-Zy3x0zqX.js → graders-BoUqsCEm.js} +1303 -2044
- package/dist/src/{graders--zknU_uk.cjs → graders-Bw1wk_21.cjs} +1553 -2240
- 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-eIHhRqoC.js → graders-CgPn32yp.js} +1300 -2041
- package/dist/src/{graders-pvbReLLn.js → graders-CwrbifOo.js} +747 -1488
- package/dist/src/graders-DS42d3ZG.js +2 -0
- package/dist/src/{image-9302QVqR.js → image-BeWaInPF.js} +3 -3
- package/dist/src/{image-DVz2RiMF.js → image-BmilRNqO.js} +7 -7
- package/dist/src/{image-x6KqLQl4.cjs → image-CxJoa3aW.cjs} +6 -6
- package/dist/src/{image-De2FBmYV.cjs → image-D10dNAav.cjs} +3 -3
- package/dist/src/{image-dnoUgPrC.js → image-Dr_3I3nK.js} +4 -4
- package/dist/src/{image-B5Mv-Z3h.js → image-DsGRlkh7.js} +7 -7
- package/dist/src/{image-qUpPvmNZ.js → image-a_SGUobh.js} +6 -6
- package/dist/src/{image-u7-rKnYU.js → image-qjO6FWPs.js} +4 -4
- package/dist/src/index.cjs +1052 -296
- package/dist/src/index.d.cts +124 -13
- package/dist/src/index.d.ts +125 -14
- package/dist/src/index.js +1018 -262
- package/dist/src/{interactiveCheck-CLERUB0c.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-RhFPGWDc.js → knowledgeBase-BBETc5-S.js} +6 -6
- package/dist/src/{knowledgeBase-Bpoe_nLu.cjs → knowledgeBase-C8qOo26M.cjs} +5 -5
- package/dist/src/{knowledgeBase-lm9RXSAm.js → knowledgeBase-CzAi2rUI.js} +6 -6
- package/dist/src/{knowledgeBase-Dgc7CBWF.js → knowledgeBase-Dr3Kib7F.js} +5 -5
- package/dist/src/{litellm-C2kqjxqp.js → litellm-BLSiANhk.js} +5 -5
- package/dist/src/{litellm-CoyI4IAl.cjs → litellm-CaUmV7Mk.cjs} +4 -4
- package/dist/src/{litellm-p37R1dzQ.js → litellm-DQGo_juI.js} +4 -4
- package/dist/src/{litellm-DRjpcSa7.js → litellm-DRc4qWfc.js} +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/{luma-ray-KgTCXrZC.js → luma-ray-B-tNZzqW.js} +6 -6
- package/dist/src/{luma-ray-B863CmuZ.js → luma-ray-CtS3OlGq.js} +5 -5
- package/dist/src/{luma-ray-BTTLtqQ8.js → luma-ray-PJJgUjOc.js} +6 -6
- package/dist/src/{luma-ray-BxVKaW2a.cjs → luma-ray-if-Ml4R9.cjs} +5 -5
- package/dist/src/main.js +242 -198
- package/dist/src/{messages-zWbkLLHz.js → messages-B9dSjrNf.js} +264 -16
- package/dist/src/{messages-811uVVW5.cjs → messages-BnsVHUnm.cjs} +266 -15
- package/dist/src/{messages-MYTQ2TWp.js → messages-CI69Lasb.js} +264 -16
- package/dist/src/{messages-BTQz42fn.js → messages-CewuNcNS.js} +264 -16
- package/dist/src/{meteor-Co1VQ1u5.cjs → meteor-BBGcGeCa.cjs} +1 -1
- package/dist/src/{meteor-DuAFv6gF.js → meteor-BKTM-7KS.js} +1 -1
- package/dist/src/{meteor-DHdzY1Ss.js → meteor-CeGo0Lu2.js} +2 -2
- package/dist/src/{meteor-CU5UAE-H.js → meteor-Wc_aUVvu.js} +2 -2
- package/dist/src/{modelslab-wu9yi5GE.js → modelslab-BCLOtfek.js} +7 -7
- package/dist/src/{modelslab-Dk1JAtVo.cjs → modelslab-BkapYJhh.cjs} +6 -6
- package/dist/src/{modelslab-DIq-6y7x.js → modelslab-D73OnKSx.js} +6 -6
- package/dist/src/{modelslab-D0erNWKe.js → modelslab-zpz9JcK0.js} +7 -7
- package/dist/src/{nova-reel-CCFRfeRb.js → nova-reel-B8F_TK5w.js} +6 -6
- package/dist/src/{nova-reel-DQrm74ng.js → nova-reel-Bx0NFV2f.js} +5 -5
- package/dist/src/{nova-reel-gr11WG7f.js → nova-reel-CNGJTLtG.js} +6 -6
- package/dist/src/{nova-reel-CrLXVKQf.cjs → nova-reel-DkT7tnoB.cjs} +5 -5
- package/dist/src/{nova-sonic-BYdp-QLs.js → nova-sonic-BaXRN1cr.js} +4 -4
- package/dist/src/{nova-sonic-TDgrlTk7.js → nova-sonic-BeTRaFOh.js} +4 -4
- package/dist/src/{nova-sonic-B_ZXcUJB.js → nova-sonic-CL7Zqv0G.js} +3 -3
- package/dist/src/{nova-sonic-i5tUvXKn.cjs → nova-sonic-YT426juD.cjs} +3 -3
- package/dist/src/{openai-DhVEmgeZ.js → openai-BMHD2Huo.js} +2 -2
- package/dist/src/{openai-Qsvz25mV.js → openai-BT-JvDse.js} +2 -2
- package/dist/src/{openai-URNyItar.cjs → openai-Cy1XLs0c.cjs} +1 -1
- package/dist/src/{openai-iYtrXzOX.js → openai-D4fxGvRx.js} +1 -1
- package/dist/src/{openclaw-CwzlQSQX.js → openclaw-Bq7RVR3k.js} +7 -6
- package/dist/src/{openclaw-CLWrW03k.js → openclaw-DA8U4DsD.js} +8 -7
- package/dist/src/{openclaw-CnQ363Wi.js → openclaw-DObVgpjC.js} +8 -7
- package/dist/src/{openclaw-wX9rtfke.cjs → openclaw-DUBZP3GL.cjs} +8 -7
- package/dist/src/{opencode-sdk-BUu5Nevv.js → opencode-sdk-BB40Wir1.js} +4 -4
- package/dist/src/{opencode-sdk-GI2KaAXq.js → opencode-sdk-BM1UAIv1.js} +3 -3
- package/dist/src/{opencode-sdk-BZ2idgYA.cjs → opencode-sdk-CeqiOcOU.cjs} +4 -4
- package/dist/src/{opencode-sdk-BxD8vXp_.js → opencode-sdk-ChdK7F7z.js} +4 -4
- package/dist/src/{otlpReceiver-DmVulbhC.js → otlpReceiver-C6thJRXi.js} +4 -4
- package/dist/src/{otlpReceiver-B2z58l4e.js → otlpReceiver-CcdIikOu.js} +3 -3
- package/dist/src/{otlpReceiver-BfcVq2Nq.cjs → otlpReceiver-DNSQj6bf.cjs} +3 -3
- package/dist/src/{otlpReceiver-BntK801g.js → otlpReceiver-UYMQx3sy.js} +4 -4
- package/dist/src/{providerRegistry-CPQ_CmVO.js → providerRegistry-1gB5vtzQ.js} +2 -2
- package/dist/src/{providerRegistry-CQMdTmHP.cjs → providerRegistry-BESeALrr.cjs} +1 -1
- package/dist/src/{providerRegistry-Bvh8mv85.js → providerRegistry-DoACwqhD.js} +1 -1
- package/dist/src/{providerRegistry-CWoPjKFZ.js → providerRegistry-PMsleEzs.js} +2 -2
- package/dist/src/{providers-Bp4S-FvO.js → providers-BuyzKt7C.js} +1 -1
- package/dist/src/{providers-DV3ax9e_.cjs → providers-C7lNVBjX.cjs} +1 -1
- package/dist/src/{providers-u9Enmfok.js → providers-CCE2COJi2.js} +1 -1
- package/dist/src/{providers-DruaQfwu.js → providers-CJh7iriU.js} +18103 -17952
- package/dist/src/{providers-iUt5fbAN.js → providers-Ctcc592x.js} +1 -1
- package/dist/src/{providers-Domz_llv.js → providers-DRrerKra.js} +432 -281
- package/dist/src/{providers-BV_KMZje.js → providers-DT-GtF2t.js} +19094 -18943
- package/dist/src/{providers-1eKkXBKp.cjs → providers-eDShy16E.cjs} +17946 -17795
- package/dist/src/{pythonUtils-Cldx7huE.js → pythonUtils-C4tltmIn.js} +3 -3
- package/dist/src/{pythonUtils-tAJvvpS-.cjs → pythonUtils-CoLaCwNY.cjs} +3 -3
- package/dist/src/{pythonUtils-C2UQ30Rz.js → pythonUtils-DMO68Jg7.js} +3 -3
- package/dist/src/{pythonUtils-CnndUbW-.js → pythonUtils-DNqbnRdx.js} +3 -3
- package/dist/src/{quiverai-DR0SnIQV.js → quiverai-BSS9a7wV.js} +3 -3
- package/dist/src/{quiverai-CtWi6x_g.js → quiverai-Bk1KrvL6.js} +4 -4
- package/dist/src/{quiverai-DFotyafY.cjs → quiverai-Bpx6MZ7T.cjs} +3 -3
- package/dist/src/{quiverai-aPPvXOgn.js → quiverai-CPKhWgaT.js} +4 -4
- package/dist/src/{render-DHIZ6_k8.js → render-7uNJ2V14.js} +2 -2
- package/dist/src/{render-CH-62LbA.js → render-DlscvAUJ.js} +1 -1
- package/dist/src/{render-CMEpfLaO.js → render-eui5p5mL.js} +2 -2
- package/dist/src/{render-CgVDrJmM.js → render-nj-UaPdn.js} +2 -2
- package/dist/src/{render-DfQSFxGE.cjs → render-tG6ir9_g.cjs} +1 -1
- package/dist/src/{responses--OsX2aYW.js → responses-1ztiVYsx.js} +49 -15
- package/dist/src/{responses-DL9m8CyY.js → responses-B8haB-mD.js} +49 -15
- package/dist/src/{responses-C-flexAY.js → responses-BiaBguAu.js} +49 -15
- package/dist/src/{responses-Bi9vBuW_.cjs → responses-CF-ayauu.cjs} +48 -14
- package/dist/src/rubyUtils-4hjGxvju.js +3 -0
- package/dist/src/{rubyUtils-DVLeA2jg.js → rubyUtils-BI0p46eZ.js} +3 -3
- package/dist/src/{rubyUtils-DsGrTx8R.js → rubyUtils-CIQFnVz4.js} +3 -3
- package/dist/src/rubyUtils-CO-tuszQ.cjs +2 -0
- package/dist/src/{rubyUtils-CYSQEG4a.js → rubyUtils-DGnoCYL2.js} +3 -3
- package/dist/src/{rubyUtils-B6eljPuh.cjs → rubyUtils-DoifqkiA.cjs} +4 -3
- package/dist/src/{sagemaker-BveBvuxm.js → sagemaker-BDLeW29y.js} +12 -12
- package/dist/src/{sagemaker-D67yzMzs.js → sagemaker-C5T60MKf.js} +13 -13
- package/dist/src/{sagemaker-BVkaG2-l.js → sagemaker-ClS_NB07.js} +13 -13
- package/dist/src/{sagemaker-XnfhheQv.cjs → sagemaker-ljtY12VM.cjs} +12 -12
- package/dist/src/{scanner-1DqWi1Ej.js → scanner-nOCWNIXa.js} +7 -7
- package/dist/src/server/index.js +1067 -265
- package/dist/src/{server-Dx2TyCH2.cjs → server-BEECpeGG.cjs} +5 -5
- package/dist/src/{server-BNYztJkh.js → server-ByiF3qlg.js} +9 -8
- package/dist/src/{server-BSB45Nt9.js → server-ByxbqAcQ.js} +8 -7
- package/dist/src/{server-DaA2eR26.cjs → server-C0XKRNB_.cjs} +1 -1
- package/dist/src/server-C_15p79-.js +3 -0
- package/dist/src/{server-D6Il2Sob.js → server-gyd6d4Hc.js} +5 -5
- package/dist/src/{signal-CE5G3a7x.js → signal-DTtUuU3l.js} +3 -3
- package/dist/src/{slack-acRb0IqQ.js → slack-4zZX1OKP.js} +1 -1
- package/dist/src/{slack-1Rhq0EoV.cjs → slack-BLlsDpfG.cjs} +1 -1
- package/dist/src/{slack-D5Wpy8LM.js → slack-BPYLQLgb.js} +2 -2
- package/dist/src/{slack-DDUe-5MC.js → slack-Bamy_7te.js} +2 -2
- package/dist/src/{store-DAAyxcy6.cjs → store-2K0kDi80.cjs} +2 -2
- package/dist/src/{store-Dn9HUkdW.js → store-2OXm_eBY.js} +3 -3
- package/dist/src/store-BELqNwvz.js +3 -0
- package/dist/src/{store-M0b1WfYb.js → store-BPkzEyFM.js} +2 -2
- package/dist/src/{store-CYEy5J2D.js → store-CPh25336.js} +3 -3
- package/dist/src/store-uQZ4AjPe.cjs +2 -0
- package/dist/src/{tables-CsWou1Bx.js → tables-BMSOS2Gg.js} +3 -3
- package/dist/src/{tables-DUfh1F7Z.cjs → tables-CXbaZ9y1.cjs} +2 -2
- package/dist/src/{tables-C4CH3zRr.js → tables-NlvH23ky.js} +3 -3
- package/dist/src/{tables-DQ4WU5tX.js → tables-WgdUZ8Ck.js} +2 -2
- package/dist/src/{telemetry-dbaJ0E98.js → telemetry--iqaGyaS.js} +5 -4
- package/dist/src/{telemetry-Dsw_faFj.cjs → telemetry-CEQxGnMZ.cjs} +7 -6
- package/dist/src/{telemetry-Dvqxv3YC.js → telemetry-CgdVGV8N.js} +4 -3
- package/dist/src/{telemetry-CQPez_Jp.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-BVi-cLPJ.cjs → text-BiNME7QG.cjs} +1 -1
- package/dist/src/{text-KvuD2Iko.js → text-D4lz-Jg_.js} +1 -1
- package/dist/src/{text-DHxdyQqT.js → text-DDQP0tuQ.js} +1 -1
- package/dist/src/{text-CZr46tp_.js → text-NWvfMfkF.js} +1 -1
- package/dist/src/{tokenUsageUtils-CXrvO-wA.js → tokenUsageUtils-2wIvAhB3.js} +1 -1
- package/dist/src/{tokenUsageUtils-C-bmyHoE.js → tokenUsageUtils-4c780gFd.js} +1 -1
- package/dist/src/tokenUsageUtils-BjVkdk18.js +142 -0
- package/dist/src/{tokenUsageUtils-Bb7DkZPz.cjs → tokenUsageUtils-C9odhsbW.cjs} +1 -1
- package/dist/src/{transcription-DuWDupG7.js → transcription-84t4ALo2.js} +5 -5
- package/dist/src/{transcription-CJspiD2c.js → transcription-Bm2emLmJ.js} +6 -6
- package/dist/src/{transcription-BvjmiYB1.cjs → transcription-CZ4LG5hQ.cjs} +5 -5
- package/dist/src/{transcription-V2HaAmy2.js → transcription-D7Q0vJsh.js} +6 -6
- package/dist/src/{transform-zDhMmzwX.js → transform-B-b6Cq-q.js} +5 -5
- package/dist/src/transform-BQt0BeAW.js +3 -0
- package/dist/src/{transform-DgKlRr73.cjs → transform-Bq5oqC0s.cjs} +1 -1
- package/dist/src/{transform-CUnzlsbn.cjs → transform-C9izGX54.cjs} +4 -4
- package/dist/src/{transform-DYX1_Xnh.js → transform-CwbAZ84V.js} +5 -5
- package/dist/src/{transform-CTeuTR3S.cjs → transform-Dg4LcO1Y.cjs} +6 -6
- package/dist/src/{transform-CG0ehZNG.js → transform-DtooZqYY.js} +6 -6
- package/dist/src/{transform-UN5UGu8U.js → transform-DzCF-wqV.js} +5 -5
- package/dist/src/{transform-lQrDE1BQ.js → transform-_DpNB4qp.js} +5 -5
- package/dist/src/{transform-Bbg6A8Jk.js → transform-eGiUAv86.js} +4 -4
- package/dist/src/{transformersAvailability-Cju9mHgR.cjs → transformersAvailability-B22swDxr.cjs} +1 -1
- package/dist/src/{transformersAvailability-CcHusyhw.js → transformersAvailability-lvCCvuPT.js} +1 -1
- package/dist/src/{transformersAvailability-DLlROWhg.js → transformersAvailability-rJGPccjr.js} +1 -1
- package/dist/src/{types-Bgh5SOn6.js → types-BDjGOq4E.js} +4 -2
- package/dist/src/{types-Dm9JM6Vb.js → types-BVH9hjgW.js} +4 -2
- package/dist/src/{types-CeaeaZdP.cjs → types-CgG2rKiW.cjs} +151 -149
- package/dist/src/{types-BGQDAP8i.js → types-DNRZVOue.js} +152 -150
- package/dist/src/{util-C8e5uydV.js → util-3pBZZb_H.js} +142 -17
- package/dist/src/{util-CN3SrLT4.cjs → util-A5_ZsQUn.cjs} +65 -43
- package/dist/src/{util-D3q0WQ-0.js → util-B9CNhyac.js} +66 -44
- package/dist/src/{util-DxWpWjhc.js → util-BQOCAHQC.js} +700 -575
- package/dist/src/{util-BYvQUPp7.js → util-BVXcTwXu.js} +3 -3
- package/dist/src/{util-D9TisOyk.js → util-BlFVL0UF.js} +65 -43
- package/dist/src/{util-C9J8ahRn.js → util-C-kmRosx.js} +66 -44
- package/dist/src/{util-DvU2Pw8c.js → util-DFPeFkiV.js} +3 -3
- package/dist/src/{util-DDs-7g6-.js → util-DN0-b81k.js} +3 -3
- package/dist/src/{util-olYL5C6N.cjs → util-Dpmm_dAI.cjs} +3 -3
- package/dist/src/{util-oGMLA7vc.js → util-Dub0f_ej.js} +700 -575
- package/dist/src/{util-Bxn8emtE.cjs → util-DvpHnLt0.cjs} +718 -570
- package/dist/src/{utils-DJfvjyMj.js → utils-BUMN8orw.js} +3 -3
- package/dist/src/{utils-B05gLxER.cjs → utils-DkVeShIB.cjs} +2 -2
- package/dist/src/{utils-BLJKfv0y.js → utils-kt7lv30R.js} +3 -3
- package/dist/src/{utils-hXtCYanr.js → utils-o8S5huU2.js} +2 -2
- 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 +22 -20
- package/dist/src/app/assets/Report-CQYFezYu.js +0 -1
- package/dist/src/app/assets/index-BzJt18Jz.js +0 -385
- package/dist/src/cache-Cr9oLMUa.js +0 -3
- package/dist/src/cloud-Hphvo8kr.js +0 -3
- package/dist/src/codex-sdk-BAmYE7qy.js +0 -3
- package/dist/src/evalResult-D8MT9p0s.js +0 -3
- 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/rubyUtils-D1L2d3jb.js +0 -3
- package/dist/src/rubyUtils-DUbq4tff.cjs +0 -2
- package/dist/src/server-DCtHUqlp.js +0 -3
- package/dist/src/store-CWOSz6D_.cjs +0 -2
- package/dist/src/store-DCDBhv7B.js +0 -3
- package/dist/src/telemetry-C1IqxcdW.js +0 -3
- package/dist/src/telemetry-C4ZEa_es.cjs +0 -2
- package/dist/src/transform-M6ITAESf.js +0 -3
- /package/dist/src/{evalResult-DElBuddX.js → evalResult-spPqh1G_.js} +0 -0
|
@@ -1,24 +1,231 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { D as getEnvInt, E as getEnvFloat, O as getEnvString, s as logger } from "./logger-
|
|
3
|
-
import { C as transformToolChoice, w as transformTools } from "./fetch-
|
|
4
|
-
import { n as withGenAISpan } from "./genaiTracer-
|
|
5
|
-
import { o as getCache, s as isCacheEnabled } from "./cache-
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import { n as transformMCPToolsToAnthropic } from "./transform-
|
|
10
|
-
import { a as outputFromMessage, i as getTokenUsage, n as calculateAnthropicCost, o as parseMessages, r as getRefusalDetails, s as processAnthropicTools, t as ANTHROPIC_MODELS } from "./util-
|
|
2
|
+
import { D as getEnvInt, E as getEnvFloat, O as getEnvString, s as logger } from "./logger-BbY6ypFL.js";
|
|
3
|
+
import { C as transformToolChoice, w as transformTools } from "./fetch-B6ch2nU2.js";
|
|
4
|
+
import { n as withGenAISpan } from "./genaiTracer-C3ZPQU60.js";
|
|
5
|
+
import { o as getCache, s as isCacheEnabled } from "./cache-BI5BY7ey.js";
|
|
6
|
+
import { M as maybeLoadResponseFormatFromExternalFile, N as maybeLoadToolsFromExternalFile } from "./util-BQOCAHQC.js";
|
|
7
|
+
import { a as createEmptyTokenUsage } from "./tokenUsageUtils-2wIvAhB3.js";
|
|
8
|
+
import { i as normalizeFinishReason, n as MCPClient } from "./chat-BLOdH60v.js";
|
|
9
|
+
import { n as transformMCPToolsToAnthropic } from "./transform-B-b6Cq-q.js";
|
|
10
|
+
import { a as outputFromMessage, i as getTokenUsage, n as calculateAnthropicCost, o as parseMessages, r as getRefusalDetails, s as processAnthropicTools, t as ANTHROPIC_MODELS } from "./util-DN0-b81k.js";
|
|
11
|
+
import path from "node:path";
|
|
12
|
+
import fs from "node:fs";
|
|
11
13
|
import Anthropic, { APIError } from "@anthropic-ai/sdk";
|
|
14
|
+
import { execFileSync } from "node:child_process";
|
|
15
|
+
import os from "node:os";
|
|
16
|
+
//#region src/providers/anthropic/claudeCodeAuth.ts
|
|
17
|
+
/**
|
|
18
|
+
* Claude Code prepends this identity block as the first `system` message when
|
|
19
|
+
* calling the Anthropic Messages API with an OAuth token. As of 2025-Q4 the
|
|
20
|
+
* API returns HTTP 400 `invalid_request_error` when an OAuth-authenticated
|
|
21
|
+
* request's first system block is not this exact string, so any caller
|
|
22
|
+
* reusing a Claude Code OAuth token must inject this block before the
|
|
23
|
+
* user-provided system prompt. Re-verify if Anthropic ships an OAuth-native
|
|
24
|
+
* `/v1/messages` path that drops the requirement.
|
|
25
|
+
*/
|
|
26
|
+
const CLAUDE_CODE_IDENTITY_PROMPT = "You are Claude Code, Anthropic's official CLI for Claude.";
|
|
27
|
+
/**
|
|
28
|
+
* Anthropic beta headers required when authenticating the Messages API with a
|
|
29
|
+
* Claude Code OAuth token (e.g. a Claude Max subscription access token, or a
|
|
30
|
+
* long-lived token minted by `claude setup-token`).
|
|
31
|
+
*
|
|
32
|
+
* - `oauth-2025-04-20` enables OAuth bearer tokens on `/v1/messages`.
|
|
33
|
+
* - `claude-code-20250219` enables the Claude Code tool-use surface area the
|
|
34
|
+
* OAuth token is scoped to.
|
|
35
|
+
*
|
|
36
|
+
* Revisit if Anthropic ships an OAuth-native Messages path that no longer
|
|
37
|
+
* requires these betas.
|
|
38
|
+
*/
|
|
39
|
+
const CLAUDE_CODE_OAUTH_BETA_FEATURES = Object.freeze(["claude-code-20250219", "oauth-2025-04-20"]);
|
|
40
|
+
/**
|
|
41
|
+
* The `user-agent` value Claude Code CLI sends on OAuth-authenticated
|
|
42
|
+
* Messages requests. Anthropic's API gates OAuth tokens to the Claude Code
|
|
43
|
+
* app identity, so requests that use a different user-agent fail with 401.
|
|
44
|
+
*
|
|
45
|
+
* The `1.0.0` suffix is cosmetic — Anthropic gates on the `claude-cli`
|
|
46
|
+
* product identifier, not the semver. Revisit if OAuth requests start
|
|
47
|
+
* returning 401 after SDK or CLI updates.
|
|
48
|
+
*/
|
|
49
|
+
const CLAUDE_CODE_USER_AGENT = "claude-cli/1.0.0 (external, promptfoo)";
|
|
50
|
+
const CLAUDE_CODE_KEYCHAIN_SERVICE = "Claude Code-credentials";
|
|
51
|
+
const CLAUDE_CODE_CREDENTIALS_FILE = path.join(".claude", ".credentials.json");
|
|
52
|
+
function resolveCredentialsPath() {
|
|
53
|
+
return path.join(os.homedir(), CLAUDE_CODE_CREDENTIALS_FILE);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* `security` exits with status 44 when the requested generic-password entry
|
|
57
|
+
* does not exist. Any other non-zero exit (or throw) indicates a real failure
|
|
58
|
+
* — ACL denial, corrupted entry, missing binary, timeout — and is worth a
|
|
59
|
+
* `warn` log rather than silently falling through.
|
|
60
|
+
*/
|
|
61
|
+
const SECURITY_ENTRY_NOT_FOUND = 44;
|
|
62
|
+
function parseCredential(raw) {
|
|
63
|
+
if (!raw || typeof raw !== "object") return {
|
|
64
|
+
ok: false,
|
|
65
|
+
reason: "credential JSON is not an object"
|
|
66
|
+
};
|
|
67
|
+
const claudeAiOauth = raw.claudeAiOauth;
|
|
68
|
+
if (!claudeAiOauth || typeof claudeAiOauth !== "object") return {
|
|
69
|
+
ok: false,
|
|
70
|
+
reason: "missing `claudeAiOauth` object"
|
|
71
|
+
};
|
|
72
|
+
const inner = claudeAiOauth;
|
|
73
|
+
const accessToken = inner.accessToken;
|
|
74
|
+
if (typeof accessToken !== "string" || !accessToken) return {
|
|
75
|
+
ok: false,
|
|
76
|
+
reason: "missing `claudeAiOauth.accessToken` string"
|
|
77
|
+
};
|
|
78
|
+
const credential = { accessToken };
|
|
79
|
+
if (typeof inner.refreshToken === "string" && inner.refreshToken) credential.refreshToken = inner.refreshToken;
|
|
80
|
+
if (typeof inner.expiresAt === "number" && Number.isFinite(inner.expiresAt)) credential.expiresAt = inner.expiresAt;
|
|
81
|
+
if (typeof inner.subscriptionType === "string") credential.subscriptionType = inner.subscriptionType;
|
|
82
|
+
return {
|
|
83
|
+
ok: true,
|
|
84
|
+
credential
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
function parseJsonBlob(blob) {
|
|
88
|
+
let parsed;
|
|
89
|
+
try {
|
|
90
|
+
parsed = JSON.parse(blob);
|
|
91
|
+
} catch (err) {
|
|
92
|
+
return {
|
|
93
|
+
ok: false,
|
|
94
|
+
reason: `invalid JSON: ${err instanceof Error ? err.message : String(err)}`
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
return parseCredential(parsed);
|
|
98
|
+
}
|
|
99
|
+
function readFromMacosKeychain() {
|
|
100
|
+
if (process.platform !== "darwin") return null;
|
|
101
|
+
let out;
|
|
102
|
+
try {
|
|
103
|
+
out = execFileSync("security", [
|
|
104
|
+
"find-generic-password",
|
|
105
|
+
"-s",
|
|
106
|
+
CLAUDE_CODE_KEYCHAIN_SERVICE,
|
|
107
|
+
"-w"
|
|
108
|
+
], {
|
|
109
|
+
encoding: "utf-8",
|
|
110
|
+
stdio: [
|
|
111
|
+
"ignore",
|
|
112
|
+
"pipe",
|
|
113
|
+
"ignore"
|
|
114
|
+
],
|
|
115
|
+
timeout: 5e3
|
|
116
|
+
});
|
|
117
|
+
} catch (err) {
|
|
118
|
+
if (err?.status === SECURITY_ENTRY_NOT_FOUND) {
|
|
119
|
+
logger.debug("[anthropic] No Claude Code credential entry in the macOS keychain; trying file fallback.");
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
logger.warn("[anthropic] Failed to read Claude Code credential from macOS keychain; falling back to file lookup.", { error: err instanceof Error ? err.message : String(err) });
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
const trimmed = out.trim();
|
|
126
|
+
if (!trimmed) {
|
|
127
|
+
logger.warn("[anthropic] Claude Code macOS keychain entry is empty. Run `claude /login` to refresh it.");
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
const result = parseJsonBlob(trimmed);
|
|
131
|
+
if (!result.ok) {
|
|
132
|
+
logger.warn(`[anthropic] Claude Code macOS keychain entry is malformed (${result.reason}). Run \`claude /login\` to refresh it.`);
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
return result.credential;
|
|
136
|
+
}
|
|
137
|
+
function readFromFile() {
|
|
138
|
+
const filePath = resolveCredentialsPath();
|
|
139
|
+
if (!fs.existsSync(filePath)) return null;
|
|
140
|
+
let raw;
|
|
141
|
+
try {
|
|
142
|
+
raw = fs.readFileSync(filePath, "utf-8");
|
|
143
|
+
} catch (err) {
|
|
144
|
+
logger.warn(`[anthropic] Claude Code credentials file at ${filePath} exists but could not be read. Run \`claude /login\` to refresh it.`, { error: err instanceof Error ? err.message : String(err) });
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
const result = parseJsonBlob(raw);
|
|
148
|
+
if (!result.ok) {
|
|
149
|
+
logger.warn(`[anthropic] Claude Code credentials file at ${filePath} is malformed (${result.reason}). Run \`claude /login\` to refresh it.`);
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
return result.credential;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Loads a Claude Code OAuth credential from the local environment.
|
|
156
|
+
*
|
|
157
|
+
* Resolution order:
|
|
158
|
+
* 1. macOS keychain (`security find-generic-password -s "Claude Code-credentials"`)
|
|
159
|
+
* — only attempted on darwin.
|
|
160
|
+
* 2. `$HOME/.claude/.credentials.json` — the Linux/Windows default used by
|
|
161
|
+
* Claude Code, and a fallback on macOS when the keychain entry is missing.
|
|
162
|
+
* On Windows this resolves to `%USERPROFILE%\.claude\.credentials.json`.
|
|
163
|
+
*
|
|
164
|
+
* Returns `null` when no credential is available. Callers should check
|
|
165
|
+
* {@link isCredentialExpired} on a non-null return before using it — this
|
|
166
|
+
* function does not filter out expired credentials so callers can decide
|
|
167
|
+
* whether to warn, refuse, or surface a 401 to the user.
|
|
168
|
+
*
|
|
169
|
+
* Never throws. Missing credentials fall through silently; corrupted or
|
|
170
|
+
* unreadable credentials are logged at `warn` level with a reason so broken
|
|
171
|
+
* setups are diagnosable without enabling debug logging.
|
|
172
|
+
*/
|
|
173
|
+
function loadClaudeCodeCredential() {
|
|
174
|
+
return readFromMacosKeychain() ?? readFromFile();
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Returns `true` when the credential's `expiresAt` (ms since epoch) is in the
|
|
178
|
+
* past. Credentials without an `expiresAt` are treated as non-expired — the
|
|
179
|
+
* Anthropic API will reject them with a 401 if the token is actually invalid.
|
|
180
|
+
*/
|
|
181
|
+
function isCredentialExpired(credential) {
|
|
182
|
+
if (credential.expiresAt == null) return false;
|
|
183
|
+
return Date.now() >= credential.expiresAt;
|
|
184
|
+
}
|
|
185
|
+
//#endregion
|
|
12
186
|
//#region src/providers/anthropic/generic.ts
|
|
13
187
|
/**
|
|
14
|
-
* Generic provider class for Anthropic APIs
|
|
15
|
-
*
|
|
188
|
+
* Generic provider class for Anthropic APIs.
|
|
189
|
+
*
|
|
190
|
+
* Serves as a base class with shared functionality for all Anthropic
|
|
191
|
+
* subclass providers. Handles API key resolution and, for subclasses that
|
|
192
|
+
* opt in via {@link AnthropicGenericProvider.SUPPORTS_CLAUDE_CODE_OAUTH},
|
|
193
|
+
* falls back to an OAuth token loaded from a local Claude Code session so
|
|
194
|
+
* Claude.ai subscribers can run evals without a separate console API key.
|
|
195
|
+
*
|
|
196
|
+
* The OAuth fallback is opt-in so it only affects
|
|
197
|
+
* `AnthropicMessagesProvider`. Claude Code OAuth tokens are gated to the
|
|
198
|
+
* Messages API (`/v1/messages`) — forwarding them to the legacy
|
|
199
|
+
* text-completion endpoint would fail at request time, which would cause
|
|
200
|
+
* `anthropic:completion:*` configs to bypass promptfoo's upfront preflight
|
|
201
|
+
* check and then produce a less useful error for every test case.
|
|
16
202
|
*/
|
|
17
203
|
var AnthropicGenericProvider = class {
|
|
204
|
+
/**
|
|
205
|
+
* Subclasses that can authenticate via a Claude Code OAuth session
|
|
206
|
+
* should override this to `true`. The base class's constructor reads the
|
|
207
|
+
* flag from `this.constructor` so only OAuth-capable subclasses attempt
|
|
208
|
+
* the credential lookup (and only they honor `apiKeyRequired: false`).
|
|
209
|
+
*/
|
|
210
|
+
static SUPPORTS_CLAUDE_CODE_OAUTH = false;
|
|
18
211
|
modelName;
|
|
19
212
|
config;
|
|
20
213
|
env;
|
|
21
214
|
apiKey;
|
|
215
|
+
/**
|
|
216
|
+
* `true` when this provider is authenticating via a Claude Code OAuth token
|
|
217
|
+
* rather than a standard `ANTHROPIC_API_KEY`. Subclasses use this to inject
|
|
218
|
+
* the Claude Code identity system block that Anthropic's API requires for
|
|
219
|
+
* OAuth-authenticated Messages requests.
|
|
220
|
+
*/
|
|
221
|
+
usingClaudeCodeOAuth;
|
|
222
|
+
/**
|
|
223
|
+
* The Claude Code credential used to authenticate, when
|
|
224
|
+
* `usingClaudeCodeOAuth` is `true`. Kept so subclasses can re-check expiry
|
|
225
|
+
* at request time and surface a "run `claude /login`" error instead of a
|
|
226
|
+
* raw 401 from the SDK.
|
|
227
|
+
*/
|
|
228
|
+
claudeCodeCredential;
|
|
22
229
|
anthropic;
|
|
23
230
|
constructor(modelName, options = {}) {
|
|
24
231
|
const { config, id, env } = options;
|
|
@@ -26,9 +233,28 @@ var AnthropicGenericProvider = class {
|
|
|
26
233
|
this.modelName = modelName;
|
|
27
234
|
this.config = config || {};
|
|
28
235
|
this.apiKey = this.getApiKey();
|
|
236
|
+
this.usingClaudeCodeOAuth = false;
|
|
237
|
+
let authToken;
|
|
238
|
+
const defaultHeaders = {};
|
|
239
|
+
const subclass = this.constructor;
|
|
240
|
+
if (!this.apiKey && this.config.apiKeyRequired === false && subclass.SUPPORTS_CLAUDE_CODE_OAUTH) {
|
|
241
|
+
const credential = loadClaudeCodeCredential();
|
|
242
|
+
if (credential) {
|
|
243
|
+
if (isCredentialExpired(credential)) logger.warn("[anthropic] Claude Code OAuth credential is expired. Run `claude /login` to refresh it.");
|
|
244
|
+
else logger.debug("[anthropic] Authenticating with Claude Code OAuth credential from local session.");
|
|
245
|
+
authToken = credential.accessToken;
|
|
246
|
+
this.usingClaudeCodeOAuth = true;
|
|
247
|
+
this.claudeCodeCredential = credential;
|
|
248
|
+
defaultHeaders["anthropic-beta"] = CLAUDE_CODE_OAUTH_BETA_FEATURES.join(",");
|
|
249
|
+
defaultHeaders["user-agent"] = CLAUDE_CODE_USER_AGENT;
|
|
250
|
+
defaultHeaders["x-app"] = "cli";
|
|
251
|
+
} else logger.warn("[anthropic] apiKeyRequired is false but no Claude Code credential was found. Run `claude /login` to create one, or set ANTHROPIC_API_KEY.");
|
|
252
|
+
}
|
|
29
253
|
this.anthropic = new Anthropic({
|
|
30
|
-
apiKey: this.apiKey,
|
|
31
|
-
|
|
254
|
+
apiKey: this.apiKey ?? null,
|
|
255
|
+
authToken: authToken ?? null,
|
|
256
|
+
baseURL: this.getApiBaseUrl(),
|
|
257
|
+
...Object.keys(defaultHeaders).length > 0 ? { defaultHeaders } : {}
|
|
32
258
|
});
|
|
33
259
|
this.id = id ? () => id : this.id;
|
|
34
260
|
}
|
|
@@ -38,7 +264,16 @@ var AnthropicGenericProvider = class {
|
|
|
38
264
|
toString() {
|
|
39
265
|
return `[Anthropic Provider ${this.modelName}]`;
|
|
40
266
|
}
|
|
267
|
+
/**
|
|
268
|
+
* Whether promptfoo's preflight check should require an API key before
|
|
269
|
+
* dispatching requests to this provider. Returns `false` only for
|
|
270
|
+
* OAuth-capable subclasses (see {@link SUPPORTS_CLAUDE_CODE_OAUTH}) when
|
|
271
|
+
* the user has opted in via `apiKeyRequired: false`. All other subclasses
|
|
272
|
+
* keep the preflight check so missing-credential errors surface upfront
|
|
273
|
+
* rather than at per-request call time.
|
|
274
|
+
*/
|
|
41
275
|
requiresApiKey() {
|
|
276
|
+
if (this.constructor.SUPPORTS_CLAUDE_CODE_OAUTH && this.config.apiKeyRequired === false) return false;
|
|
42
277
|
return true;
|
|
43
278
|
}
|
|
44
279
|
getApiKey() {
|
|
@@ -70,6 +305,7 @@ function isThinkingEnabled(thinking) {
|
|
|
70
305
|
var AnthropicMessagesProvider = class AnthropicMessagesProvider extends AnthropicGenericProvider {
|
|
71
306
|
mcpClient = null;
|
|
72
307
|
initializationPromise = null;
|
|
308
|
+
static SUPPORTS_CLAUDE_CODE_OAUTH = true;
|
|
73
309
|
static ANTHROPIC_MODELS = ANTHROPIC_MODELS;
|
|
74
310
|
static ANTHROPIC_MODELS_NAMES = ANTHROPIC_MODELS.map((model) => model.id);
|
|
75
311
|
constructor(modelName, options = {}) {
|
|
@@ -96,7 +332,8 @@ var AnthropicMessagesProvider = class AnthropicMessagesProvider extends Anthropi
|
|
|
96
332
|
}
|
|
97
333
|
async callApi(prompt, context) {
|
|
98
334
|
if (this.initializationPromise != null) await this.initializationPromise;
|
|
99
|
-
if (!this.apiKey) throw new Error("Anthropic API key is not set. Set the ANTHROPIC_API_KEY environment variable or add `apiKey` to the provider config.");
|
|
335
|
+
if (!this.apiKey && !this.usingClaudeCodeOAuth) throw new Error("Anthropic API key is not set. Set the ANTHROPIC_API_KEY environment variable or add `apiKey` to the provider config. Alternatively, if you have an active Claude Code session, set `apiKeyRequired: false` in the provider config to authenticate via Claude Code.");
|
|
336
|
+
if (this.usingClaudeCodeOAuth && this.claudeCodeCredential && isCredentialExpired(this.claudeCodeCredential)) throw new Error("Claude Code OAuth credential is expired. Run `claude /login` to refresh it, then re-run the eval.");
|
|
100
337
|
if (!this.modelName) throw new Error("Anthropic model name is not set. Please provide a valid model name.");
|
|
101
338
|
const spanContext = {
|
|
102
339
|
system: "anthropic",
|
|
@@ -159,10 +396,14 @@ var AnthropicMessagesProvider = class AnthropicMessagesProvider extends Anthropi
|
|
|
159
396
|
if (this.modelName.startsWith("claude-opus-4-6") && extractedMessages.length > 0) {
|
|
160
397
|
if (extractedMessages[extractedMessages.length - 1].role === "assistant") logger.warn("Assistant message prefilling is not supported on Claude Opus 4.6 and will cause a 400 error. Remove the trailing assistant message from your prompt.");
|
|
161
398
|
}
|
|
399
|
+
const resolvedSystem = this.usingClaudeCodeOAuth ? [{
|
|
400
|
+
type: "text",
|
|
401
|
+
text: CLAUDE_CODE_IDENTITY_PROMPT
|
|
402
|
+
}, ...system ?? []] : system;
|
|
162
403
|
const shouldStream = config.stream ?? false;
|
|
163
404
|
const params = {
|
|
164
405
|
model: this.modelName,
|
|
165
|
-
...
|
|
406
|
+
...resolvedSystem && resolvedSystem.length > 0 ? { system: resolvedSystem } : {},
|
|
166
407
|
max_tokens: config.max_tokens ?? getEnvInt("ANTHROPIC_MAX_TOKENS", thinkingEnabled ? 2048 : 1024),
|
|
167
408
|
messages: extractedMessages,
|
|
168
409
|
stream: shouldStream,
|
|
@@ -185,9 +426,16 @@ var AnthropicMessagesProvider = class AnthropicMessagesProvider extends Anthropi
|
|
|
185
426
|
logger.debug("Calling Anthropic Messages API", { params });
|
|
186
427
|
const headers = { ...config.headers || {} };
|
|
187
428
|
let allBetaFeatures = [...config.beta || [], ...requiredBetaFeatures];
|
|
429
|
+
const userBetaHeader = config.headers?.["anthropic-beta"];
|
|
430
|
+
if (typeof userBetaHeader === "string" && userBetaHeader.length > 0) allBetaFeatures.push(...userBetaHeader.split(",").map((entry) => entry.trim()).filter((entry) => entry.length > 0));
|
|
188
431
|
if (processedOutputFormat && !allBetaFeatures.includes("structured-outputs-2025-11-13")) allBetaFeatures.push("structured-outputs-2025-11-13");
|
|
432
|
+
if (this.usingClaudeCodeOAuth) allBetaFeatures.push(...CLAUDE_CODE_OAUTH_BETA_FEATURES);
|
|
189
433
|
allBetaFeatures = [...new Set(allBetaFeatures)];
|
|
190
434
|
if (allBetaFeatures.length > 0) headers["anthropic-beta"] = allBetaFeatures.join(",");
|
|
435
|
+
if (this.usingClaudeCodeOAuth) {
|
|
436
|
+
headers["user-agent"] = CLAUDE_CODE_USER_AGENT;
|
|
437
|
+
headers["x-app"] = "cli";
|
|
438
|
+
}
|
|
191
439
|
const cache = await getCache();
|
|
192
440
|
const { metadata: _metadata, ...cacheKeyParams } = params;
|
|
193
441
|
const cacheKey = `anthropic:${JSON.stringify(cacheKeyParams)}`;
|
|
@@ -293,4 +541,4 @@ var AnthropicMessagesProvider = class AnthropicMessagesProvider extends Anthropi
|
|
|
293
541
|
//#endregion
|
|
294
542
|
export { AnthropicGenericProvider as n, AnthropicMessagesProvider as t };
|
|
295
543
|
|
|
296
|
-
//# sourceMappingURL=messages-
|
|
544
|
+
//# sourceMappingURL=messages-B9dSjrNf.js.map
|