promptfoo 0.120.26 → 0.121.1
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/drizzle/0023_wooden_mandrill.sql +2 -0
- package/dist/drizzle/meta/0023_snapshot.json +1496 -0
- package/dist/drizzle/meta/_journal.json +7 -0
- package/dist/src/{ListApp-D3DG0F8h.js → ListApp-Du7YVwj5.js} +2 -4
- package/dist/src/accounts-BgNJDBE6.js +206 -0
- package/dist/src/{accounts-BzEY8H3v.cjs → accounts-Bx-x3bmW.cjs} +99 -80
- package/dist/src/{accounts-DHHiXsy6.js → accounts-CMqkzrVf.js} +61 -36
- package/dist/src/{accounts-R3gfCR_g.js → accounts-xrUGFA6n.js} +60 -35
- package/dist/src/{agentic-utils-D6_gzOUF.js → agentic-utils-BKIN5PKu.js} +9 -10
- package/dist/src/{agents-CwM7re15.cjs → agents-B0f4HICh.cjs} +37 -40
- package/dist/src/{agents-Cnph5GLD.js → agents-C-dDThPK.js} +37 -37
- package/dist/src/{agents-C7BiinFI.cjs → agents-CErsqg5U.cjs} +19 -27
- package/dist/src/{agents-v4cW_ZgC.js → agents-CVIn-Utx.js} +19 -22
- package/dist/src/{agents-GiUianme.js → agents-CXknwsFX.js} +37 -40
- package/dist/src/{agents-DETIQHqF.js → agents-DeH4Gu94.js} +21 -28
- package/dist/src/{agents-DYIT-hQy.js → agents-Dy2YpZpa.js} +38 -41
- package/dist/src/{agents-Cao4i7AX.js → agents-aF4-T121.js} +19 -30
- package/dist/src/{aimlapi-DMF6v_vb.js → aimlapi-BAGZDo5G.js} +16 -18
- package/dist/src/{aimlapi-CMJpKK-B.js → aimlapi-BNfTBexL.js} +15 -17
- package/dist/src/{aimlapi-DtSf1ykJ.js → aimlapi-DHRKlBEA.js} +15 -4
- package/dist/src/{aimlapi-DoGLcQW_.cjs → aimlapi-tg0Gkcvr.cjs} +15 -16
- package/dist/src/app/assets/index-BFCZg7hQ.js +439 -0
- package/dist/src/app/assets/index-NCn4eVBv.css +1 -0
- package/dist/src/app/assets/{vendor-charts-CYyo8R8v.js → vendor-charts-CCl15Imd.js} +1 -1
- package/dist/src/app/assets/{vendor-markdown-DSmzq4Jh.js → vendor-markdown-0tekx3KX.js} +1 -1
- package/dist/src/app/index.html +4 -34
- package/dist/src/{audio-DUH4q0Xq.js → audio-BRODU0UK.js} +7 -9
- package/dist/src/{audio-BWjyvHn9.cjs → audio-BWeaWovU.cjs} +6 -7
- package/dist/src/{audio-U580w8jM.js → audio-CHQ4r-RV.js} +6 -5
- package/dist/src/{audio-BrJBFN2b.js → audio-tf_NBjlC.js} +6 -8
- package/dist/src/base-B0tcrnq_.js +193 -0
- package/dist/src/base-B4QJRyFS.js +194 -0
- package/dist/src/base-DBtwl2FR.cjs +222 -0
- package/dist/src/base-fEDN28WM.js +193 -0
- package/dist/src/{blobs-kt8v3UyH.js → blobs-BAU-dXan.js} +9 -12
- package/dist/src/{blobs-C9J2mVgo.js → blobs-Bpg5rH6i.js} +9 -12
- package/dist/src/{blobs-673H0jCl.cjs → blobs-DvS-O6be.cjs} +34 -37
- package/dist/src/blobs-qTYm-1PY.js +236 -0
- package/dist/src/{cache-BLLayYEN.js → cache-8XhNqPKW.js} +64 -67
- package/dist/src/cache-Bbn1Nyrd.cjs +5 -0
- package/dist/src/cache-BwsMSda7.js +6 -0
- package/dist/src/{cache-mIszOnuz.js → cache-CG0SlR1d.js} +64 -66
- package/dist/src/{cache-7xULbvt3.cjs → cache-COish3-W.cjs} +114 -117
- package/dist/src/cache-D3eqDYGU.js +739 -0
- package/dist/src/{chat-Fl6TZJRS.cjs → chat-2K608PeQ.cjs} +20 -21
- package/dist/src/chat-BKm79wib.js +764 -0
- package/dist/src/{chat-XPN9YHhr.js → chat-CM_kyI8B.js} +20 -9
- package/dist/src/{chat-DIywASPG.js → chat-CRWNNq73.js} +49 -49
- package/dist/src/{chat-C8Ei4f87.js → chat-CznLWr_D.js} +49 -49
- package/dist/src/{chat-CgyGj2hC.js → chat-DHMH-N64.js} +20 -22
- package/dist/src/{chat-C4zqjObh.cjs → chat-DaqekjFr.cjs} +69 -69
- package/dist/src/{chat-Cpz3O-Xl.js → chat-DxysjBvt.js} +21 -23
- package/dist/src/{chatkit-Dpxrq4eD.js → chatkit-65VXf5SR.js} +58 -58
- package/dist/src/{chatkit-DIrJX8xk.js → chatkit-Be-Q-a9F.js} +58 -60
- package/dist/src/{chatkit-DEls11hE.js → chatkit-BxFvW8KY.js} +58 -60
- package/dist/src/{chatkit-e25Ziu17.cjs → chatkit-DKyPi1Gs.cjs} +58 -60
- package/dist/src/chunk-DEq-mXcV.js +15 -0
- package/dist/src/chunk-DRamLcfz.js +16 -0
- package/dist/src/{claude-agent-sdk-6-xTaLwM.js → claude-agent-sdk-BLTu0WBO.js} +45 -31
- package/dist/src/{claude-agent-sdk-BzxF6NIJ.cjs → claude-agent-sdk-CJH22shf.cjs} +44 -29
- package/dist/src/{claude-agent-sdk-CmkTnKGH.js → claude-agent-sdk-D6_k9FKA.js} +45 -33
- package/dist/src/{claude-agent-sdk-rXCBLK_o.js → claude-agent-sdk-Dy5lT-Tx.js} +46 -21
- package/dist/src/{cloud-BMbRVJFw.js → cloud-Bc9526yV.js} +32 -12
- package/dist/src/cloud-DmE0EwsY.js +4 -0
- package/dist/src/{cloudflare-ai-CUg4BTcj.js → cloudflare-ai-C9r2sRhw.js} +16 -18
- package/dist/src/{cloudflare-ai-Z9X219gp.js → cloudflare-ai-CWWJCRim.js} +16 -4
- package/dist/src/{cloudflare-ai-BAQ0u_dg.cjs → cloudflare-ai-ClWSdor4.cjs} +16 -17
- package/dist/src/{cloudflare-ai-CobxMTR4.js → cloudflare-ai-ICsOuD-z.js} +17 -19
- package/dist/src/{cloudflare-gateway-C0sgfr_z.cjs → cloudflare-gateway-C2_-KG5o.cjs} +21 -22
- package/dist/src/{cloudflare-gateway-_itGuXry.js → cloudflare-gateway-D6O7AlYb.js} +23 -23
- package/dist/src/{cloudflare-gateway-D2_yi-Fh.js → cloudflare-gateway-D6xFc5pa.js} +21 -25
- package/dist/src/{cloudflare-gateway-Djf3F3_H.js → cloudflare-gateway-pXGHxJ47.js} +26 -14
- package/dist/src/{codex-sdk-ibXwdglL.js → codex-sdk-C6UMlxwV.js} +49 -32
- package/dist/src/{codex-sdk-BASDNkIl.js → codex-sdk-DUwKWezN.js} +49 -30
- package/dist/src/{codex-sdk-dSnGdgIp.js → codex-sdk-GGAw0qbD.js} +49 -32
- package/dist/src/{codex-sdk-wTEpMM_X.cjs → codex-sdk-fAO0c3yA.cjs} +49 -32
- package/dist/src/{cometapi-B01btbfb.js → cometapi-BasUi7-_.js} +17 -19
- package/dist/src/{cometapi-DHUAH6nK.js → cometapi-Bbjp5V4x.js} +16 -4
- package/dist/src/{cometapi-ChAaRjg5.js → cometapi-DkXrKi5z.js} +21 -24
- package/dist/src/{cometapi-JbvOJSCO.cjs → cometapi-vY6aDZgo.cjs} +21 -22
- package/dist/src/{completion-D9_MDlnd.js → completion-6Mx_iXxK.js} +11 -13
- package/dist/src/{completion-BBJ6zmG3.js → completion-C5rtR_9P.js} +11 -13
- package/dist/src/{completion-DDyL3Cb2.cjs → completion-CDOouNzq.cjs} +21 -23
- package/dist/src/completion-C_P3ypkJ.js +120 -0
- package/dist/src/createHash-CTQmL3G2.js +15 -0
- package/dist/src/createHash-CfZSc0b4.cjs +27 -0
- package/dist/src/createHash-Da8fMwqB.js +16 -0
- package/dist/src/createHash-DmPQkvBh.js +15 -0
- package/dist/src/{docker-JAAubMw3.js → docker-5KcG-_86.js} +18 -20
- package/dist/src/{docker-Ckw-j7Rr.cjs → docker-BwsKwxFs.cjs} +18 -19
- package/dist/src/{docker-vnOg96gi.js → docker-CZnqU1XV.js} +18 -7
- package/dist/src/{docker-BuButc4D.js → docker-DzxyDPIj.js} +19 -21
- package/dist/src/entrypoint.js +2 -3
- package/dist/src/{errors-DnGCbnx8.js → errors-P6ll7XSJ.js} +2 -2
- package/dist/src/{esm-CYhseqj4.js → esm-C03C-mv3.js} +17 -20
- package/dist/src/{esm-rDtG_2rg.js → esm-CaIwzWR5.js} +18 -21
- package/dist/src/esm-Cd1AjG1D.js +379 -0
- package/dist/src/{esm-BQkx5roy.cjs → esm-CnNt7sI4.cjs} +47 -49
- package/dist/src/eval-17JizQIv.js +15 -0
- package/dist/src/{eval-CYrbG57o.js → eval-DmFyWU7i.js} +49 -55
- package/dist/src/{evalResult-COsVttMA.js → evalResult-CDQiuUuf.js} +16 -12
- package/dist/src/{evalResult-6JaUIStC.js → evalResult-CTG2AHOS.js} +10 -11
- package/dist/src/evalResult-Cqj8pldJ.js +12 -0
- package/dist/src/{evalResult-DlRfu_Rq.cjs → evalResult-Dap2CekP.cjs} +20 -21
- package/dist/src/evalResult-DvcJAWJU.cjs +10 -0
- package/dist/src/evalResult-Hftn-S_i.js +10 -0
- package/dist/src/evaluator-B2CFNt-P.js +36 -0
- package/dist/src/{evaluator-3EJCMTs0.js → evaluator-DPFRbFIL.js} +210 -232
- package/dist/src/{extractor-LSYjrhK0.js → extractor-CFG6bcWJ.js} +23 -38
- package/dist/src/{extractor-DbhlYEeo.cjs → extractor-DX36oYEv.cjs} +37 -64
- package/dist/src/{extractor-Hs7la_19.js → extractor-M67RUtg6.js} +23 -38
- package/dist/src/extractor-YMU_Gvt8.js +374 -0
- package/dist/src/fetch-4M3YRaqL.js +780 -0
- package/dist/src/{fetch-18MuNu9i.js → fetch-60Gzydls.js} +60 -46
- package/dist/src/{fetch-SRsE6Ctl.js → fetch-BMv0O527.js} +41 -35
- package/dist/src/{fetch-ZMn_oemb.cjs → fetch-BxUk8odA.cjs} +268 -279
- package/dist/src/fetch-KV5kNASw.js +5 -0
- package/dist/src/{fileExtensions-ePDqouxn.js → fileExtensions-DnqA1y9x.js} +2 -2
- package/dist/src/{fileExtensions-BpuMmaFL.js → fileExtensions-Ds-foDzt.js} +2 -2
- package/dist/src/fileExtensions-LcDYkU4v.js +85 -0
- package/dist/src/{fileExtensions-DkJYkWUy.cjs → fileExtensions-bYh77CN8.cjs} +27 -28
- package/dist/src/{formatDuration-Doo0xq-z.js → formatDuration-DgBVMN65.js} +2 -2
- package/dist/src/{genaiTracer-Ce19n68P.js → genaiTracer-70Z8BIuV.js} +2 -3
- package/dist/src/{genaiTracer-CqNnnXrE.js → genaiTracer-C1rxGO8Q.js} +2 -3
- package/dist/src/genaiTracer-D3fD9dNV.js +256 -0
- package/dist/src/{genaiTracer-CQlpZkrp.cjs → genaiTracer-DN4dQywX.cjs} +13 -14
- package/dist/src/graders-Bu0H9nXi.js +32 -0
- package/dist/src/{graders-BaMCwIKp.js → graders-CHO8EPM4.js} +385 -417
- package/dist/src/graders-Cfhkvx-e.js +34 -0
- package/dist/src/{graders-QsALpIdy.js → graders-CpdqD9PI.js} +385 -417
- package/dist/src/graders-DClJVpGP.cjs +32 -0
- package/dist/src/{graders-DzUUnUjC.cjs → graders-DOXycdlG.cjs} +721 -753
- package/dist/src/graders-DcnJsrMO.js +32 -0
- package/dist/src/graders-R9rYUM0d.js +13466 -0
- package/dist/src/{image-BiEVdpdP.js → image-BmEZqVmk.js} +57 -18
- package/dist/src/{image-mhAGP07h.js → image-CBBVXWuT.js} +57 -18
- package/dist/src/{image-D10zEe1f.cjs → image-CDLQOcqT.cjs} +6 -7
- package/dist/src/{image-COCWy5dX.js → image-DJEvKveK.js} +6 -5
- package/dist/src/{image-C3BjJUAU.cjs → image-DTedmQPg.cjs} +77 -32
- package/dist/src/{image-DB4sHxdJ.js → image-gvmivTEe.js} +7 -9
- package/dist/src/image-pAX56tPG.js +257 -0
- package/dist/src/{image-BXt_7u0v.js → image-tL5hIOFh.js} +6 -8
- package/dist/src/index.cjs +696 -693
- package/dist/src/index.d.cts +113 -10
- package/dist/src/index.d.ts +113 -6
- package/dist/src/index.js +657 -658
- package/dist/src/{interactiveCheck-DU-MAhp5.js → interactiveCheck-BgLZUIt3.js} +7 -8
- package/dist/src/{invariant-DT20jrBd.js → invariant-BtWWVVhl.js} +2 -2
- package/dist/src/{invariant-1pAf2CD1.js → invariant-Ddh24eXh.js} +2 -2
- package/dist/src/{invariant-CKcJAQ6M.cjs → invariant-kfQ8Bu82.cjs} +7 -8
- package/dist/src/invariant-vgHWClmd.js +25 -0
- package/dist/src/{knowledgeBase-DotRBzUE.js → knowledgeBase-CLJybhnF.js} +19 -34
- package/dist/src/{knowledgeBase-XJQ0Qyez.js → knowledgeBase-CoU-UQBg.js} +17 -41
- package/dist/src/{knowledgeBase-CMvMlLZR.js → knowledgeBase-DjWPVqSb.js} +17 -43
- package/dist/src/{knowledgeBase-Bnb00xKs.cjs → knowledgeBase-wkxuRFhA.cjs} +17 -40
- package/dist/src/{litellm-CHrRmPAe.js → litellm-B9Hysuri.js} +16 -18
- package/dist/src/{litellm-CrLJrPIm.js → litellm-CTfa0hqi.js} +15 -17
- package/dist/src/{litellm-BrnZhMcL.cjs → litellm-NYpQ8RQu.cjs} +15 -16
- package/dist/src/{litellm-BECdjOTx.js → litellm-ePxtr9F1.js} +15 -4
- package/dist/src/{logger-w8Ozp0Td.js → logger-CT3IKMKA.js} +24 -41
- package/dist/src/{logger-BdZ-IqBc.cjs → logger-Cp1GPUjj.cjs} +166 -192
- package/dist/src/logger-DLcq4dWf.js +713 -0
- package/dist/src/{logger-BotXmWKW.js → logger-KkObSCzq.js} +27 -43
- package/dist/src/{luma-ray-C0RkI3lt.cjs → luma-ray-B0GGNRc1.cjs} +20 -21
- package/dist/src/{luma-ray-C-w6EsJm.js → luma-ray-BE2mOt6N.js} +20 -13
- package/dist/src/{luma-ray-BOeX-h0M.js → luma-ray-BW9IRGIc.js} +22 -21
- package/dist/src/{luma-ray-DgKLS0BF.js → luma-ray-Cm1KZBhs.js} +20 -23
- package/dist/src/main.js +1985 -2055
- package/dist/src/{messages-DXV3Qh8_.cjs → messages-1JrJs91T.cjs} +35 -34
- package/dist/src/{messages-D61tPFQo.js → messages-1x9atZmP.js} +25 -24
- package/dist/src/{messages-CDZYGNlS.js → messages-BLbWdsyt.js} +25 -24
- package/dist/src/messages-D8EA0oDc.js +240 -0
- package/dist/src/{meteor-P2rUE-Uz.js → meteor-44VjEACX.js} +3 -4
- package/dist/src/{meteor-SLNTgmXm.js → meteor-D-SotUw9.js} +3 -4
- package/dist/src/{meteor-odmwVbyG.cjs → meteor-DLZZ3osF.cjs} +3 -4
- package/dist/src/{meteor-Dj8cTkU_.js → meteor-DUiCJRC-.js} +3 -4
- package/dist/src/modelslab-C1OLRmVX.js +166 -0
- package/dist/src/modelslab-CqXBy3U8.js +168 -0
- package/dist/src/modelslab-DcOSFwKh.cjs +166 -0
- package/dist/src/modelslab-X5-4LroM.js +166 -0
- package/dist/src/{nova-reel-C2LFfVTf.js → nova-reel-BgS1ZWuK.js} +20 -13
- package/dist/src/{nova-reel-DtCjbD5O.js → nova-reel-D2ZkOSyr.js} +22 -21
- package/dist/src/{nova-reel-D9FXq3Mt.cjs → nova-reel-D9xfaMBs.cjs} +20 -21
- package/dist/src/{nova-reel-Bk5npr2q.js → nova-reel-DihqLeol.js} +20 -23
- package/dist/src/{nova-sonic-BoRSY_U6.cjs → nova-sonic-DVu3mMIy.cjs} +30 -31
- package/dist/src/{nova-sonic-D_qERM-K.js → nova-sonic-DezhVUYT.js} +30 -26
- package/dist/src/{nova-sonic-CgaWLDM1.js → nova-sonic-P-CdUMlV.js} +30 -31
- package/dist/src/{nova-sonic-BXRfQyF-.js → nova-sonic-Q3BOJeig.js} +31 -32
- package/dist/src/{openai-Bigwjgo1.cjs → openai-Cuif0GEt.cjs} +8 -9
- package/dist/src/{openai-Dz3surb_.js → openai-DElQ-fPX.js} +3 -4
- package/dist/src/{openai-CT5fwbve.js → openai-DhbB7eWK.js} +3 -4
- package/dist/src/openai-j-sE2O7r.js +44 -0
- package/dist/src/{openclaw-dHLcXUWZ.js → openclaw-BiSZPL7J.js} +20 -14
- package/dist/src/{openclaw-CpPrXwf6.js → openclaw-Bv1DINsX.js} +20 -27
- package/dist/src/{openclaw-B6XY2kUf.js → openclaw-D1D_ej1z.js} +21 -28
- package/dist/src/{openclaw-DDSfq5fp.cjs → openclaw-DAfWQn-o.cjs} +33 -39
- package/dist/src/opencode-sdk-C7m-wRfI.js +560 -0
- package/dist/src/opencode-sdk-CfaLN8PY.cjs +564 -0
- package/dist/src/opencode-sdk-D95s6SnR.js +562 -0
- package/dist/src/opencode-sdk-DxUPkLT7.js +560 -0
- package/dist/src/{otlpReceiver-DmRb0NBj.js → otlpReceiver--AIRW_S4.js} +53 -51
- package/dist/src/{otlpReceiver-Dg817agV.js → otlpReceiver-Bn5wGB1v.js} +53 -55
- package/dist/src/{otlpReceiver-B6Xo4KZM.cjs → otlpReceiver-Diec4cln.cjs} +53 -55
- package/dist/src/{otlpReceiver-BO0rbDzh.js → otlpReceiver-g3ByGaXs.js} +53 -55
- package/dist/src/{providerRegistry-Xf0qdqGQ.js → providerRegistry-B0RUOLI_.js} +7 -8
- package/dist/src/{providerRegistry-wCWd7sKQ.js → providerRegistry-CD8MEar9.js} +7 -8
- package/dist/src/{providerRegistry-lc7a7utN.cjs → providerRegistry-Civky8Ar.cjs} +12 -13
- package/dist/src/providerRegistry-DM8rZYol.js +45 -0
- package/dist/src/providers-B3HvufyI.js +33246 -0
- package/dist/src/{providers-BiNq_Iyc.js → providers-BKRJTjBz.js} +1743 -1795
- package/dist/src/providers-C1rOSHiR.js +32 -0
- package/dist/src/{providers-BlEhY5mi.js → providers-CFLy1_ji.js} +1750 -1802
- package/dist/src/{providers-BNKVY53V.cjs → providers-CFu-TZl-.cjs} +2111 -2163
- package/dist/src/providers-CxmDwEFf.cjs +31 -0
- package/dist/src/providers-Dodakqr0.js +30 -0
- package/dist/src/providers-GIQ2TcsA.js +30 -0
- package/dist/src/{pythonUtils-r1uBuA0n.js → pythonUtils-C3py6GC1.js} +18 -19
- package/dist/src/{pythonUtils-DZ6EbdY4.cjs → pythonUtils-CTU3Y3lw.cjs} +42 -43
- package/dist/src/{pythonUtils-vMlk9Qp5.js → pythonUtils-D5nxkQ0P.js} +18 -19
- package/dist/src/pythonUtils-D6fwaDSg.js +249 -0
- package/dist/src/quiverai-C2jVwbH1.js +213 -0
- package/dist/src/quiverai-CI6gYJVI.js +213 -0
- package/dist/src/quiverai-CLkWkyZc.cjs +213 -0
- package/dist/src/quiverai-MHSxbmmZ.js +215 -0
- package/dist/src/{render-CAZvKKkB.js → render-Drod8m7K.js} +4 -5
- package/dist/src/{responses-DLLjADw5.js → responses-BKqJmhhc.js} +34 -27
- package/dist/src/{responses-TsdODUpm.js → responses-CGw0DCzh.js} +34 -27
- package/dist/src/responses-jxdehPkC.js +660 -0
- package/dist/src/{responses-zOtKtnY_.cjs → responses-tD4Bd4dc.cjs} +49 -42
- package/dist/src/rubyUtils-BUHu6PhO.js +5 -0
- package/dist/src/{rubyUtils-Cs35SDYa.js → rubyUtils-BUVePouc.js} +27 -20
- package/dist/src/rubyUtils-BcuGX77l.js +222 -0
- package/dist/src/{rubyUtils-BtjlqyXt.js → rubyUtils-Boc4HZzX.js} +18 -19
- package/dist/src/rubyUtils-CP42kMvq.cjs +4 -0
- package/dist/src/{rubyUtils-DCVaJ3mc.cjs → rubyUtils-DhCAlxZr.cjs} +48 -50
- package/dist/src/{sagemaker-Du4LIR97.js → sagemaker-BK4Zb993.js} +75 -70
- package/dist/src/{sagemaker-CLdUAv5z.js → sagemaker-BfiWTmvn.js} +77 -77
- package/dist/src/{sagemaker-DwNnEVYt.cjs → sagemaker-CcQHM1jV.cjs} +75 -76
- package/dist/src/{sagemaker-BcgLu0U4.js → sagemaker-D2Q1c-sD.js} +75 -79
- package/dist/src/{scanner-Dyw21Wg_.js → scanner-J8CA3LsV.js} +149 -122
- package/dist/src/server/index.js +5620 -67302
- package/dist/src/{server-CgUQ25qW.cjs → server-B0PPuDw-.cjs} +57 -67
- package/dist/src/server-B1vi21hA.js +7 -0
- package/dist/src/{server-CbMTRQkg.js → server-BC7XJFgr.js} +19 -24
- package/dist/src/server-Cm9Kai_h.cjs +5 -0
- package/dist/src/{server-DWmZLfCy.js → server-DbFphssR.js} +26 -29
- package/dist/src/server-OAs3nBRT.js +229 -0
- package/dist/src/{signal-Bl32q42d.js → signal-BOTbd53Z.js} +9 -11
- package/dist/src/{slack-BtMkB6xP.cjs → slack-BmVAVGaK.cjs} +7 -8
- package/dist/src/{slack-OZYxoVON.js → slack-DCUPTzS2.js} +8 -8
- package/dist/src/{slack-DPqj42Ts.js → slack-DOdy_kyv.js} +7 -8
- package/dist/src/{slack-BfdBx2tO.js → slack-DXMKtA-f.js} +7 -9
- package/dist/src/store-BNmZ1KAz.cjs +5 -0
- package/dist/src/{store-BqwfFEyF.cjs → store-BSc-TF2w.cjs} +44 -45
- package/dist/src/store-BltJg2cd.js +6 -0
- package/dist/src/{store-D4gdn9ih.js → store-D1tv90v3.js} +34 -35
- package/dist/src/{store-2ocbYY9D.js → store-DQLEjuEO.js} +40 -36
- package/dist/src/store-Ub2vaGJ1.js +228 -0
- package/dist/src/{tables-D-NSwNIb.js → tables-5EvT_Bwn.js} +23 -23
- package/dist/src/{tables-B9E1kRp-.cjs → tables-C7K-XKWp.cjs} +93 -93
- package/dist/src/{tables-C7TT2XVn.js → tables-D36WTqKX.js} +25 -25
- package/dist/src/tables-xKANLRBD.js +288 -0
- package/dist/src/telemetry-5BCRNBbe.cjs +5 -0
- package/dist/src/{telemetry-DZ_7PaVq.js → telemetry-C15ziL8u.js} +17 -14
- package/dist/src/{telemetry-BXyVqyAg.js → telemetry-C2YDkUQH.js} +11 -13
- package/dist/src/{telemetry-D0_yFdtU.cjs → telemetry-CbrnxHp_.cjs} +21 -24
- package/dist/src/telemetry-D4W5hboe.js +7 -0
- package/dist/src/telemetry-DMb2Mpfm.js +171 -0
- package/dist/src/{text-Dm78AVGG.js → text-B_UCRPp2.js} +2 -2
- package/dist/src/{text-DF2hMKdg.cjs → text-CW1cyrwj.cjs} +12 -13
- package/dist/src/{text-DgMr_tiM.js → text-Db-Wt2u2.js} +2 -2
- package/dist/src/text-TIv0QYnd.js +22 -0
- package/dist/src/{tokenUsageUtils-FZd5O_4A.js → tokenUsageUtils-BDGe-iyI.js} +2 -2
- package/dist/src/{tokenUsageUtils-DmZSD2eU.js → tokenUsageUtils-DflFMjS0.js} +2 -2
- package/dist/src/tokenUsageUtils-NYT-WKS6.js +138 -0
- package/dist/src/{tokenUsageUtils-CXhxVj72.cjs → tokenUsageUtils-bVa1ga6f.cjs} +32 -33
- package/dist/src/{transcription-FNIz3YOe.cjs → transcription-CL78qbOU.cjs} +14 -15
- package/dist/src/{transcription-C-M81iDA.js → transcription-DAtxHhAM.js} +14 -7
- package/dist/src/{transcription-CYuY5sFO.js → transcription-LNZTNUUL.js} +14 -16
- package/dist/src/{transcription-Ch7S-LWw.js → transcription-QHh3AH6Z.js} +15 -17
- package/dist/src/{transform-CoP2bJ7P.js → transform-Cgi24fJ7.js} +94 -66
- package/dist/src/{transform-Kd6u-oNm.cjs → transform-CzK1Q0zl.cjs} +24 -26
- package/dist/src/{transform-D8dILpfZ.js → transform-DECvGmzp.js} +15 -13
- package/dist/src/{transform-DMaxQwDx.js → transform-DGLazrMm.js} +94 -66
- package/dist/src/transform-DGxXocjk.js +1506 -0
- package/dist/src/{transform-ivxEY4f7.cjs → transform-DOcQeLld.cjs} +234 -206
- package/dist/src/transform-DTGDnAzW.js +6 -0
- package/dist/src/{transform-CqTFr7KR.js → transform-DilY9wbS.js} +10 -12
- package/dist/src/transform-aa6tmVpZ.js +216 -0
- package/dist/src/transform-m3qNw4KP.cjs +5 -0
- package/dist/src/{transformersAvailability-DEU2naS1.js → transformersAvailability-CEVM2GNQ.js} +2 -2
- package/dist/src/{transformersAvailability-Bkep3ka7.cjs → transformersAvailability-CwayUSlh.cjs} +2 -3
- package/dist/src/{transformersAvailability-DwmezkVe.js → transformersAvailability-D6c6ROpT.js} +2 -2
- package/dist/src/{types-t52w-XsS.js → types-CH3Ge2sE.js} +103 -92
- package/dist/src/{types-DMVjYLpx.js → types-CLKiCBW3.js} +98 -91
- package/dist/src/types-CN_TZ2GJ.js +3260 -0
- package/dist/src/{types-BIfttHrT.cjs → types-LJ0r3wbR.cjs} +573 -566
- package/dist/src/util-5cB-L7U3.js +1430 -0
- package/dist/src/util-6-GqIvzS.js +599 -0
- package/dist/src/{util-vjscpUzy.js → util-B7T3SiBS.js} +5 -6
- package/dist/src/{util-Cl0zfT3V.js → util-Betm42rL.js} +44 -17
- package/dist/src/{util-CUEt0Vum.js → util-C-PPYSMq.js} +44 -17
- package/dist/src/{util-DkFTvieG.cjs → util-CchiqXh_.cjs} +35 -36
- package/dist/src/{util-mJ58qbbw.js → util-DaWTWKBK.js} +5 -6
- package/dist/src/{util-C08Kns6-.cjs → util-Db0a0AFH.cjs} +89 -62
- package/dist/src/{util-DiCePfDu.js → util-Dlz_Wvgm.js} +102 -53
- package/dist/src/{util-BSh4a_Q8.js → util-YT5HPZaS.js} +102 -53
- package/dist/src/{util-DUYOvxAy.cjs → util-Yz-1aEhW.cjs} +274 -219
- package/dist/src/util-ZZH-3QZz.js +293 -0
- package/dist/src/{utils-DFaZa6Rf.cjs → utils-Cz9qXqII.cjs} +32 -35
- package/dist/src/{utils-CVzb4YiI.js → utils-XiOAgly5.js} +4 -7
- package/dist/src/utils-dLokC-eR.js +94 -0
- package/dist/src/{utils-JaY9veb5.js → utils-f2-Moju7.js} +4 -7
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +59 -53
- package/dist/src/app/assets/index-BOgkICuY.css +0 -1
- package/dist/src/app/assets/index-CSgqn_Vd.js +0 -428
- package/dist/src/app/tsconfig.app.tsbuildinfo +0 -1
- package/dist/src/base-BaXmtXYp.js +0 -107
- package/dist/src/base-Dtp8b4_N.js +0 -106
- package/dist/src/base-f71xxWai.cjs +0 -111
- package/dist/src/cache-BUPcq0Ad.js +0 -6
- package/dist/src/cache-CVfRb-HD.cjs +0 -6
- package/dist/src/cache-O4EuX2JV.js +0 -8
- package/dist/src/chunk-DHDDz29n.js +0 -22
- package/dist/src/chunk-FhC4c-0y.js +0 -21
- package/dist/src/cloud-CZ4hytdm.js +0 -5
- package/dist/src/eval-CKHWqG9f.js +0 -16
- package/dist/src/evalResult-CxTP-LMm.cjs +0 -11
- package/dist/src/evalResult-CzLURDcP.js +0 -13
- package/dist/src/evalResult-DyttNQ_G.js +0 -11
- package/dist/src/evaluator-0PvfeBYh.js +0 -38
- package/dist/src/fetch-Bi0o-fdp.js +0 -4
- package/dist/src/fetch-CMptBDVg.cjs +0 -4
- package/dist/src/fetch-DAZkv3gV.js +0 -6
- package/dist/src/graders-BCytzXrb.js +0 -34
- package/dist/src/graders-CGZQShfJ.cjs +0 -33
- package/dist/src/graders-spkuVC-E.js +0 -36
- package/dist/src/opencode-sdk-CImWVqy9.js +0 -382
- package/dist/src/opencode-sdk-CuCztr4P.js +0 -380
- package/dist/src/opencode-sdk-DhcfRbBH.js +0 -376
- package/dist/src/opencode-sdk-mqF-Oj3f.cjs +0 -383
- package/dist/src/providers-BMZZmPBJ.cjs +0 -32
- package/dist/src/providers-CQQrNaJk.js +0 -32
- package/dist/src/providers-Ck8HyrC-.js +0 -34
- package/dist/src/quiverai-BNfIwKCO.cjs +0 -54
- package/dist/src/quiverai-BQigKdIH.js +0 -57
- package/dist/src/quiverai-Bfy2WnE2.js +0 -55
- package/dist/src/quiverai-CedIP0PJ.js +0 -43
- package/dist/src/rubyUtils-D7--T12C.js +0 -6
- package/dist/src/rubyUtils-DRRiMFV2.js +0 -5
- package/dist/src/rubyUtils-vb8OYFC-.cjs +0 -5
- package/dist/src/server-BUbS0Qfh.js +0 -6
- package/dist/src/server-XpGXFHkS.cjs +0 -6
- package/dist/src/server-gfOx5Zrk.js +0 -8
- package/dist/src/store-5u2yriTV.js +0 -7
- package/dist/src/store-D_lq_8oQ.js +0 -6
- package/dist/src/store-m5KT6Ly7.cjs +0 -6
- package/dist/src/telemetry-5RHFoCJh.js +0 -6
- package/dist/src/telemetry-Do8wMnA-.js +0 -8
- package/dist/src/telemetry-LojxPoFq.cjs +0 -6
- package/dist/src/transform-8eGmaH-7.js +0 -7
- package/dist/src/transform-BRVvWaG4.cjs +0 -6
- package/dist/src/transform-GybT0X0u.js +0 -8
- package/dist/src/transformersAvailability-DkAWaK5B.js +0 -35
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
const require_logger = require("./logger-Cp1GPUjj.cjs");
|
|
2
|
+
const require_fetch = require("./fetch-BxUk8odA.cjs");
|
|
3
|
+
const require_cache = require("./cache-COish3-W.cjs");
|
|
4
|
+
//#region src/providers/quiverai.ts
|
|
5
|
+
const QUIVERAI_API_BASE_URL = "https://api.quiver.ai/v1";
|
|
6
|
+
const QUIVERAI_DEFAULT_MODEL = "arrow-preview";
|
|
7
|
+
/**
|
|
8
|
+
* QuiverAI provider for SVG vector graphics generation using the Arrow model.
|
|
9
|
+
* Uses QuiverAI's native SVG generation API (POST /v1/svgs/generations).
|
|
10
|
+
* Streams by default for faster time-to-first-token.
|
|
11
|
+
*/
|
|
12
|
+
var QuiverAiProvider = class {
|
|
13
|
+
config;
|
|
14
|
+
modelName;
|
|
15
|
+
apiKey;
|
|
16
|
+
apiBaseUrl;
|
|
17
|
+
constructor(modelName, options = {}) {
|
|
18
|
+
const { config, id, env } = options;
|
|
19
|
+
this.modelName = modelName;
|
|
20
|
+
this.apiKey = config?.apiKey || env?.QUIVERAI_API_KEY || require_logger.getEnvString("QUIVERAI_API_KEY") || "";
|
|
21
|
+
this.apiBaseUrl = config?.apiBaseUrl || QUIVERAI_API_BASE_URL;
|
|
22
|
+
if (id) this.id = () => id;
|
|
23
|
+
this.config = config || {};
|
|
24
|
+
}
|
|
25
|
+
id() {
|
|
26
|
+
return `quiverai:${this.modelName}`;
|
|
27
|
+
}
|
|
28
|
+
toString() {
|
|
29
|
+
return `[QuiverAI Provider ${this.modelName}]`;
|
|
30
|
+
}
|
|
31
|
+
getApiUrl() {
|
|
32
|
+
return `${this.apiBaseUrl}/svgs/generations`;
|
|
33
|
+
}
|
|
34
|
+
getHeaders() {
|
|
35
|
+
return {
|
|
36
|
+
"Content-Type": "application/json",
|
|
37
|
+
Authorization: `Bearer ${this.apiKey}`
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
async callApi(prompt, context) {
|
|
41
|
+
if (!this.apiKey) return { error: "QuiverAI API key is not set. Set the QUIVERAI_API_KEY environment variable or add apiKey to the provider config. Get a key at https://app.quiver.ai/settings/api-keys" };
|
|
42
|
+
const config = {
|
|
43
|
+
...this.config,
|
|
44
|
+
...context?.prompt?.config
|
|
45
|
+
};
|
|
46
|
+
const useStream = config.stream !== false;
|
|
47
|
+
const body = {
|
|
48
|
+
model: this.modelName,
|
|
49
|
+
prompt,
|
|
50
|
+
stream: useStream,
|
|
51
|
+
...pickDefined(config, [
|
|
52
|
+
"instructions",
|
|
53
|
+
"references",
|
|
54
|
+
"n",
|
|
55
|
+
"temperature",
|
|
56
|
+
"top_p",
|
|
57
|
+
"presence_penalty",
|
|
58
|
+
"max_output_tokens"
|
|
59
|
+
])
|
|
60
|
+
};
|
|
61
|
+
try {
|
|
62
|
+
if (useStream) return await this.callApiStreaming(body);
|
|
63
|
+
return await this.callApiNonStreaming(body, context);
|
|
64
|
+
} catch (error) {
|
|
65
|
+
require_logger.logger.error(`QuiverAI API call error: ${error}`);
|
|
66
|
+
return { error: `QuiverAI API call error: ${error}` };
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
async callApiNonStreaming(body, context) {
|
|
70
|
+
const { data, cached, status, statusText } = await require_cache.fetchWithCache(this.getApiUrl(), {
|
|
71
|
+
method: "POST",
|
|
72
|
+
headers: this.getHeaders(),
|
|
73
|
+
body: JSON.stringify(body)
|
|
74
|
+
}, require_fetch.REQUEST_TIMEOUT_MS, "json", context?.bustCache ?? context?.debug);
|
|
75
|
+
if (status < 200 || status >= 300) {
|
|
76
|
+
if (data && typeof data === "object" && "code" in data && "message" in data) return { error: formatError(data) };
|
|
77
|
+
return { error: `API error: ${status} ${statusText}\n${typeof data === "string" ? data : JSON.stringify(data)}` };
|
|
78
|
+
}
|
|
79
|
+
const response = data;
|
|
80
|
+
return {
|
|
81
|
+
cached,
|
|
82
|
+
output: extractSvgOutput(response),
|
|
83
|
+
tokenUsage: mapTokenUsage(response.usage, cached ? 0 : 1)
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
async callApiStreaming(body) {
|
|
87
|
+
const maxRetries = 3;
|
|
88
|
+
let lastResp;
|
|
89
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
90
|
+
const controller = new AbortController();
|
|
91
|
+
const timeout = setTimeout(() => controller.abort(), require_fetch.REQUEST_TIMEOUT_MS);
|
|
92
|
+
let reader;
|
|
93
|
+
try {
|
|
94
|
+
lastResp = await require_fetch.fetchWithProxy(this.getApiUrl(), {
|
|
95
|
+
method: "POST",
|
|
96
|
+
headers: this.getHeaders(),
|
|
97
|
+
body: JSON.stringify(body),
|
|
98
|
+
signal: controller.signal
|
|
99
|
+
});
|
|
100
|
+
if (lastResp.status === 429 && attempt < maxRetries) {
|
|
101
|
+
const waitMs = getRetryAfterMs(lastResp.headers, attempt);
|
|
102
|
+
require_logger.logger.debug(`QuiverAI: rate limited, retry ${attempt + 1}/${maxRetries} in ${waitMs}ms`);
|
|
103
|
+
await lastResp.body?.cancel();
|
|
104
|
+
await new Promise((resolve) => setTimeout(resolve, waitMs));
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
if (!lastResp.ok) return await handleStreamingError(lastResp);
|
|
108
|
+
if (!lastResp.body) return { error: "QuiverAI streaming response has no body" };
|
|
109
|
+
reader = lastResp.body.getReader();
|
|
110
|
+
return await readSSEStream(reader);
|
|
111
|
+
} finally {
|
|
112
|
+
reader?.cancel().catch(() => {});
|
|
113
|
+
clearTimeout(timeout);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return handleStreamingError(lastResp);
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
async function handleStreamingError(resp) {
|
|
120
|
+
try {
|
|
121
|
+
return { error: formatError(await resp.json()) };
|
|
122
|
+
} catch {
|
|
123
|
+
return { error: `QuiverAI API error: HTTP ${resp.status}` };
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
async function readSSEStream(reader) {
|
|
127
|
+
const decoder = new TextDecoder();
|
|
128
|
+
let buffer = "";
|
|
129
|
+
let finalSvg = "";
|
|
130
|
+
let usage;
|
|
131
|
+
while (true) {
|
|
132
|
+
const { done, value } = await reader.read();
|
|
133
|
+
if (done) break;
|
|
134
|
+
buffer += decoder.decode(value, { stream: true });
|
|
135
|
+
const lines = buffer.split("\n");
|
|
136
|
+
buffer = lines.pop() || "";
|
|
137
|
+
for (const line of lines) {
|
|
138
|
+
const parsed = parseSSELine(line);
|
|
139
|
+
if (parsed.svg) finalSvg = parsed.svg;
|
|
140
|
+
if (parsed.usage) usage = parsed.usage;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
if (buffer.trim()) {
|
|
144
|
+
const parsed = parseSSELine(buffer);
|
|
145
|
+
if (parsed.svg) finalSvg = parsed.svg;
|
|
146
|
+
if (parsed.usage) usage = parsed.usage;
|
|
147
|
+
}
|
|
148
|
+
if (!finalSvg) return { error: "QuiverAI streaming response contained no SVG content" };
|
|
149
|
+
return {
|
|
150
|
+
output: finalSvg,
|
|
151
|
+
tokenUsage: mapTokenUsage(usage, 1)
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
function pickDefined(obj, keys) {
|
|
155
|
+
return Object.fromEntries(keys.filter((k) => obj[k] != null).map((k) => [k, obj[k]]));
|
|
156
|
+
}
|
|
157
|
+
function formatError(err) {
|
|
158
|
+
const base = `${err.message} [${err.code}]`;
|
|
159
|
+
return err.request_id ? `${base} (request_id: ${err.request_id})` : base;
|
|
160
|
+
}
|
|
161
|
+
function mapTokenUsage(usage, numRequests) {
|
|
162
|
+
return {
|
|
163
|
+
total: usage?.total_tokens || 0,
|
|
164
|
+
prompt: usage?.input_tokens || 0,
|
|
165
|
+
completion: usage?.output_tokens || 0,
|
|
166
|
+
numRequests
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
const MAX_RETRY_AFTER_MS = 6e4;
|
|
170
|
+
function getRetryAfterMs(headers, attempt) {
|
|
171
|
+
const retryAfter = headers.get("retry-after");
|
|
172
|
+
if (retryAfter) {
|
|
173
|
+
const seconds = Number(retryAfter);
|
|
174
|
+
if (!Number.isNaN(seconds)) return Math.min(seconds * 1e3, MAX_RETRY_AFTER_MS);
|
|
175
|
+
const date = new Date(retryAfter);
|
|
176
|
+
if (!Number.isNaN(date.getTime())) return Math.min(Math.max(0, date.getTime() - Date.now()), MAX_RETRY_AFTER_MS);
|
|
177
|
+
}
|
|
178
|
+
return Math.pow(2, attempt) * 1e3;
|
|
179
|
+
}
|
|
180
|
+
function parseSSELine(line) {
|
|
181
|
+
if (!line.startsWith("data:")) return {};
|
|
182
|
+
const payload = line.slice(line.startsWith("data: ") ? 6 : 5).trim();
|
|
183
|
+
if (!payload || payload === "[DONE]") return {};
|
|
184
|
+
try {
|
|
185
|
+
const event = JSON.parse(payload);
|
|
186
|
+
return {
|
|
187
|
+
svg: event.type === "content" && event.svg ? event.svg : void 0,
|
|
188
|
+
usage: event.usage
|
|
189
|
+
};
|
|
190
|
+
} catch {
|
|
191
|
+
require_logger.logger.debug(`QuiverAI: failed to parse SSE data: ${payload}`);
|
|
192
|
+
return {};
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
function extractSvgOutput(response) {
|
|
196
|
+
if (Array.isArray(response.data)) {
|
|
197
|
+
const svgs = response.data.map((item) => item.svg).filter(Boolean);
|
|
198
|
+
return svgs.length === 1 ? svgs[0] : svgs.join("\n\n");
|
|
199
|
+
}
|
|
200
|
+
return JSON.stringify(response);
|
|
201
|
+
}
|
|
202
|
+
function createQuiverAiProvider(providerPath, providerOptions = {}, env) {
|
|
203
|
+
const splits = providerPath.split(":");
|
|
204
|
+
return new QuiverAiProvider((splits[1] === "chat" ? splits.slice(2) : splits.slice(1)).join(":") || QUIVERAI_DEFAULT_MODEL, {
|
|
205
|
+
config: providerOptions.config,
|
|
206
|
+
id: providerOptions.id,
|
|
207
|
+
env: providerOptions.env ?? env
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
//#endregion
|
|
211
|
+
exports.createQuiverAiProvider = createQuiverAiProvider;
|
|
212
|
+
|
|
213
|
+
//# sourceMappingURL=quiverai-CLkWkyZc.cjs.map
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { C as getEnvString, o as logger } from "./logger-KkObSCzq.js";
|
|
3
|
+
import { f as REQUEST_TIMEOUT_MS, n as fetchWithProxy } from "./fetch-BMv0O527.js";
|
|
4
|
+
import "./cloud-Bc9526yV.js";
|
|
5
|
+
import { a as fetchWithCache } from "./cache-CG0SlR1d.js";
|
|
6
|
+
//#region src/providers/quiverai.ts
|
|
7
|
+
const QUIVERAI_API_BASE_URL = "https://api.quiver.ai/v1";
|
|
8
|
+
const QUIVERAI_DEFAULT_MODEL = "arrow-preview";
|
|
9
|
+
/**
|
|
10
|
+
* QuiverAI provider for SVG vector graphics generation using the Arrow model.
|
|
11
|
+
* Uses QuiverAI's native SVG generation API (POST /v1/svgs/generations).
|
|
12
|
+
* Streams by default for faster time-to-first-token.
|
|
13
|
+
*/
|
|
14
|
+
var QuiverAiProvider = class {
|
|
15
|
+
config;
|
|
16
|
+
modelName;
|
|
17
|
+
apiKey;
|
|
18
|
+
apiBaseUrl;
|
|
19
|
+
constructor(modelName, options = {}) {
|
|
20
|
+
const { config, id, env } = options;
|
|
21
|
+
this.modelName = modelName;
|
|
22
|
+
this.apiKey = config?.apiKey || env?.QUIVERAI_API_KEY || getEnvString("QUIVERAI_API_KEY") || "";
|
|
23
|
+
this.apiBaseUrl = config?.apiBaseUrl || QUIVERAI_API_BASE_URL;
|
|
24
|
+
if (id) this.id = () => id;
|
|
25
|
+
this.config = config || {};
|
|
26
|
+
}
|
|
27
|
+
id() {
|
|
28
|
+
return `quiverai:${this.modelName}`;
|
|
29
|
+
}
|
|
30
|
+
toString() {
|
|
31
|
+
return `[QuiverAI Provider ${this.modelName}]`;
|
|
32
|
+
}
|
|
33
|
+
getApiUrl() {
|
|
34
|
+
return `${this.apiBaseUrl}/svgs/generations`;
|
|
35
|
+
}
|
|
36
|
+
getHeaders() {
|
|
37
|
+
return {
|
|
38
|
+
"Content-Type": "application/json",
|
|
39
|
+
Authorization: `Bearer ${this.apiKey}`
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
async callApi(prompt, context) {
|
|
43
|
+
if (!this.apiKey) return { error: "QuiverAI API key is not set. Set the QUIVERAI_API_KEY environment variable or add apiKey to the provider config. Get a key at https://app.quiver.ai/settings/api-keys" };
|
|
44
|
+
const config = {
|
|
45
|
+
...this.config,
|
|
46
|
+
...context?.prompt?.config
|
|
47
|
+
};
|
|
48
|
+
const useStream = config.stream !== false;
|
|
49
|
+
const body = {
|
|
50
|
+
model: this.modelName,
|
|
51
|
+
prompt,
|
|
52
|
+
stream: useStream,
|
|
53
|
+
...pickDefined(config, [
|
|
54
|
+
"instructions",
|
|
55
|
+
"references",
|
|
56
|
+
"n",
|
|
57
|
+
"temperature",
|
|
58
|
+
"top_p",
|
|
59
|
+
"presence_penalty",
|
|
60
|
+
"max_output_tokens"
|
|
61
|
+
])
|
|
62
|
+
};
|
|
63
|
+
try {
|
|
64
|
+
if (useStream) return await this.callApiStreaming(body);
|
|
65
|
+
return await this.callApiNonStreaming(body, context);
|
|
66
|
+
} catch (error) {
|
|
67
|
+
logger.error(`QuiverAI API call error: ${error}`);
|
|
68
|
+
return { error: `QuiverAI API call error: ${error}` };
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
async callApiNonStreaming(body, context) {
|
|
72
|
+
const { data, cached, status, statusText } = await fetchWithCache(this.getApiUrl(), {
|
|
73
|
+
method: "POST",
|
|
74
|
+
headers: this.getHeaders(),
|
|
75
|
+
body: JSON.stringify(body)
|
|
76
|
+
}, REQUEST_TIMEOUT_MS, "json", context?.bustCache ?? context?.debug);
|
|
77
|
+
if (status < 200 || status >= 300) {
|
|
78
|
+
if (data && typeof data === "object" && "code" in data && "message" in data) return { error: formatError(data) };
|
|
79
|
+
return { error: `API error: ${status} ${statusText}\n${typeof data === "string" ? data : JSON.stringify(data)}` };
|
|
80
|
+
}
|
|
81
|
+
const response = data;
|
|
82
|
+
return {
|
|
83
|
+
cached,
|
|
84
|
+
output: extractSvgOutput(response),
|
|
85
|
+
tokenUsage: mapTokenUsage(response.usage, cached ? 0 : 1)
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
async callApiStreaming(body) {
|
|
89
|
+
const maxRetries = 3;
|
|
90
|
+
let lastResp;
|
|
91
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
92
|
+
const controller = new AbortController();
|
|
93
|
+
const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);
|
|
94
|
+
let reader;
|
|
95
|
+
try {
|
|
96
|
+
lastResp = await fetchWithProxy(this.getApiUrl(), {
|
|
97
|
+
method: "POST",
|
|
98
|
+
headers: this.getHeaders(),
|
|
99
|
+
body: JSON.stringify(body),
|
|
100
|
+
signal: controller.signal
|
|
101
|
+
});
|
|
102
|
+
if (lastResp.status === 429 && attempt < maxRetries) {
|
|
103
|
+
const waitMs = getRetryAfterMs(lastResp.headers, attempt);
|
|
104
|
+
logger.debug(`QuiverAI: rate limited, retry ${attempt + 1}/${maxRetries} in ${waitMs}ms`);
|
|
105
|
+
await lastResp.body?.cancel();
|
|
106
|
+
await new Promise((resolve) => setTimeout(resolve, waitMs));
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
if (!lastResp.ok) return await handleStreamingError(lastResp);
|
|
110
|
+
if (!lastResp.body) return { error: "QuiverAI streaming response has no body" };
|
|
111
|
+
reader = lastResp.body.getReader();
|
|
112
|
+
return await readSSEStream(reader);
|
|
113
|
+
} finally {
|
|
114
|
+
reader?.cancel().catch(() => {});
|
|
115
|
+
clearTimeout(timeout);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return handleStreamingError(lastResp);
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
async function handleStreamingError(resp) {
|
|
122
|
+
try {
|
|
123
|
+
return { error: formatError(await resp.json()) };
|
|
124
|
+
} catch {
|
|
125
|
+
return { error: `QuiverAI API error: HTTP ${resp.status}` };
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
async function readSSEStream(reader) {
|
|
129
|
+
const decoder = new TextDecoder();
|
|
130
|
+
let buffer = "";
|
|
131
|
+
let finalSvg = "";
|
|
132
|
+
let usage;
|
|
133
|
+
while (true) {
|
|
134
|
+
const { done, value } = await reader.read();
|
|
135
|
+
if (done) break;
|
|
136
|
+
buffer += decoder.decode(value, { stream: true });
|
|
137
|
+
const lines = buffer.split("\n");
|
|
138
|
+
buffer = lines.pop() || "";
|
|
139
|
+
for (const line of lines) {
|
|
140
|
+
const parsed = parseSSELine(line);
|
|
141
|
+
if (parsed.svg) finalSvg = parsed.svg;
|
|
142
|
+
if (parsed.usage) usage = parsed.usage;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
if (buffer.trim()) {
|
|
146
|
+
const parsed = parseSSELine(buffer);
|
|
147
|
+
if (parsed.svg) finalSvg = parsed.svg;
|
|
148
|
+
if (parsed.usage) usage = parsed.usage;
|
|
149
|
+
}
|
|
150
|
+
if (!finalSvg) return { error: "QuiverAI streaming response contained no SVG content" };
|
|
151
|
+
return {
|
|
152
|
+
output: finalSvg,
|
|
153
|
+
tokenUsage: mapTokenUsage(usage, 1)
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
function pickDefined(obj, keys) {
|
|
157
|
+
return Object.fromEntries(keys.filter((k) => obj[k] != null).map((k) => [k, obj[k]]));
|
|
158
|
+
}
|
|
159
|
+
function formatError(err) {
|
|
160
|
+
const base = `${err.message} [${err.code}]`;
|
|
161
|
+
return err.request_id ? `${base} (request_id: ${err.request_id})` : base;
|
|
162
|
+
}
|
|
163
|
+
function mapTokenUsage(usage, numRequests) {
|
|
164
|
+
return {
|
|
165
|
+
total: usage?.total_tokens || 0,
|
|
166
|
+
prompt: usage?.input_tokens || 0,
|
|
167
|
+
completion: usage?.output_tokens || 0,
|
|
168
|
+
numRequests
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
const MAX_RETRY_AFTER_MS = 6e4;
|
|
172
|
+
function getRetryAfterMs(headers, attempt) {
|
|
173
|
+
const retryAfter = headers.get("retry-after");
|
|
174
|
+
if (retryAfter) {
|
|
175
|
+
const seconds = Number(retryAfter);
|
|
176
|
+
if (!Number.isNaN(seconds)) return Math.min(seconds * 1e3, MAX_RETRY_AFTER_MS);
|
|
177
|
+
const date = new Date(retryAfter);
|
|
178
|
+
if (!Number.isNaN(date.getTime())) return Math.min(Math.max(0, date.getTime() - Date.now()), MAX_RETRY_AFTER_MS);
|
|
179
|
+
}
|
|
180
|
+
return Math.pow(2, attempt) * 1e3;
|
|
181
|
+
}
|
|
182
|
+
function parseSSELine(line) {
|
|
183
|
+
if (!line.startsWith("data:")) return {};
|
|
184
|
+
const payload = line.slice(line.startsWith("data: ") ? 6 : 5).trim();
|
|
185
|
+
if (!payload || payload === "[DONE]") return {};
|
|
186
|
+
try {
|
|
187
|
+
const event = JSON.parse(payload);
|
|
188
|
+
return {
|
|
189
|
+
svg: event.type === "content" && event.svg ? event.svg : void 0,
|
|
190
|
+
usage: event.usage
|
|
191
|
+
};
|
|
192
|
+
} catch {
|
|
193
|
+
logger.debug(`QuiverAI: failed to parse SSE data: ${payload}`);
|
|
194
|
+
return {};
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
function extractSvgOutput(response) {
|
|
198
|
+
if (Array.isArray(response.data)) {
|
|
199
|
+
const svgs = response.data.map((item) => item.svg).filter(Boolean);
|
|
200
|
+
return svgs.length === 1 ? svgs[0] : svgs.join("\n\n");
|
|
201
|
+
}
|
|
202
|
+
return JSON.stringify(response);
|
|
203
|
+
}
|
|
204
|
+
function createQuiverAiProvider(providerPath, providerOptions = {}, env) {
|
|
205
|
+
const splits = providerPath.split(":");
|
|
206
|
+
return new QuiverAiProvider((splits[1] === "chat" ? splits.slice(2) : splits.slice(1)).join(":") || QUIVERAI_DEFAULT_MODEL, {
|
|
207
|
+
config: providerOptions.config,
|
|
208
|
+
id: providerOptions.id,
|
|
209
|
+
env: providerOptions.env ?? env
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
//#endregion
|
|
213
|
+
export { createQuiverAiProvider };
|
|
214
|
+
|
|
215
|
+
//# sourceMappingURL=quiverai-MHSxbmmZ.js.map
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import "./logger-
|
|
3
|
-
import { t as canUseInteractiveUI } from "./interactiveCheck-
|
|
4
|
-
|
|
2
|
+
import "./logger-KkObSCzq.js";
|
|
3
|
+
import { t as canUseInteractiveUI } from "./interactiveCheck-BgLZUIt3.js";
|
|
5
4
|
//#region src/ui/render.ts
|
|
6
5
|
/**
|
|
7
6
|
* Process exit codes for signal handling.
|
|
@@ -112,7 +111,7 @@ function supportsColor() {
|
|
|
112
111
|
if (process.env.FORCE_COLOR) return true;
|
|
113
112
|
return process.stdout.isTTY && process.stdout.hasColors?.() !== false;
|
|
114
113
|
}
|
|
115
|
-
|
|
116
114
|
//#endregion
|
|
117
115
|
export { canUseInteractiveUI, getTerminalSize, renderInteractive, runInteractive, supportsColor };
|
|
118
|
-
|
|
116
|
+
|
|
117
|
+
//# sourceMappingURL=render-Drod8m7K.js.map
|
|
@@ -1,13 +1,12 @@
|
|
|
1
|
-
import { b as getEnvString, i as
|
|
2
|
-
import { r as importModule } from "./esm-
|
|
3
|
-
import { i as isJavascriptFile } from "./fileExtensions-
|
|
4
|
-
import { d as maybeLoadToolsFromExternalFile, g as renderVarsInObject, u as maybeLoadResponseFormatFromExternalFile } from "./util-
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import { t as OpenAiGenericProvider } from "./openai-
|
|
8
|
-
import { a as calculateOpenAICost, c as getTokenUsage$1, s as formatOpenAiError } from "./util-
|
|
1
|
+
import { b as getEnvString, i as logger, v as getEnvFloat, w as state, y as getEnvInt } from "./logger-CT3IKMKA.js";
|
|
2
|
+
import { r as importModule } from "./esm-Cd1AjG1D.js";
|
|
3
|
+
import { i as isJavascriptFile } from "./fileExtensions-DnqA1y9x.js";
|
|
4
|
+
import { d as maybeLoadToolsFromExternalFile, g as renderVarsInObject, u as maybeLoadResponseFormatFromExternalFile } from "./util-Dlz_Wvgm.js";
|
|
5
|
+
import { f as LONG_RUNNING_MODEL_TIMEOUT_MS, p as REQUEST_TIMEOUT_MS } from "./fetch-60Gzydls.js";
|
|
6
|
+
import { r as fetchWithCache } from "./cache-8XhNqPKW.js";
|
|
7
|
+
import { t as OpenAiGenericProvider } from "./openai-DElQ-fPX.js";
|
|
8
|
+
import { a as calculateOpenAICost, c as getTokenUsage$1, s as formatOpenAiError } from "./util-Betm42rL.js";
|
|
9
9
|
import path from "path";
|
|
10
|
-
|
|
11
10
|
//#region src/providers/functionCallbackUtils.ts
|
|
12
11
|
/**
|
|
13
12
|
* Handles function callback execution for AI providers.
|
|
@@ -45,7 +44,7 @@ var FunctionCallbackHandler = class {
|
|
|
45
44
|
isError: false
|
|
46
45
|
};
|
|
47
46
|
} catch (error) {
|
|
48
|
-
|
|
47
|
+
logger.debug(`Function callback failed for ${functionInfo.name}: ${error}`);
|
|
49
48
|
return {
|
|
50
49
|
output: typeof call === "string" ? call : JSON.stringify(call),
|
|
51
50
|
isError: true
|
|
@@ -115,8 +114,8 @@ var FunctionCallbackHandler = class {
|
|
|
115
114
|
if (splits[0] && isJavascriptFile(splits[0])) [filePath, functionName] = splits;
|
|
116
115
|
}
|
|
117
116
|
try {
|
|
118
|
-
const resolvedPath = path.resolve(
|
|
119
|
-
|
|
117
|
+
const resolvedPath = path.resolve(state.basePath || "", filePath);
|
|
118
|
+
logger.debug(`Loading function from ${resolvedPath}${functionName ? `:${functionName}` : ""}`);
|
|
120
119
|
const mod = await importModule(resolvedPath);
|
|
121
120
|
const func = functionName && mod[functionName] ? mod[functionName] : mod.default || mod;
|
|
122
121
|
if (typeof func !== "function") throw new Error(`Expected ${resolvedPath}${functionName ? `:${functionName}` : ""} to export a function, got ${typeof func}`);
|
|
@@ -158,7 +157,7 @@ var FunctionCallbackHandler = class {
|
|
|
158
157
|
};
|
|
159
158
|
} catch (error) {
|
|
160
159
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
161
|
-
|
|
160
|
+
logger.debug(`MCP tool execution failed for ${toolName}: ${errorMessage}`);
|
|
162
161
|
return {
|
|
163
162
|
output: `MCP Tool Error (${toolName}): ${errorMessage}`,
|
|
164
163
|
isError: true
|
|
@@ -179,7 +178,6 @@ var FunctionCallbackHandler = class {
|
|
|
179
178
|
this.loadedCallbacks = {};
|
|
180
179
|
}
|
|
181
180
|
};
|
|
182
|
-
|
|
183
181
|
//#endregion
|
|
184
182
|
//#region src/providers/responses/processor.ts
|
|
185
183
|
/**
|
|
@@ -231,7 +229,7 @@ var ResponsesProcessor = class {
|
|
|
231
229
|
this.config = config;
|
|
232
230
|
}
|
|
233
231
|
async processResponseOutput(data, requestConfig, cached) {
|
|
234
|
-
|
|
232
|
+
logger.debug(`Processing ${this.config.providerType} responses output`, {
|
|
235
233
|
responseId: data.id,
|
|
236
234
|
model: data.model
|
|
237
235
|
});
|
|
@@ -256,7 +254,7 @@ var ResponsesProcessor = class {
|
|
|
256
254
|
if (requestConfig.response_format?.type === "json_schema" && typeof finalOutput === "string") try {
|
|
257
255
|
finalOutput = JSON.parse(finalOutput);
|
|
258
256
|
} catch (error) {
|
|
259
|
-
|
|
257
|
+
logger.error(`Failed to parse JSON output: ${error}`);
|
|
260
258
|
}
|
|
261
259
|
const result = {
|
|
262
260
|
output: finalOutput,
|
|
@@ -276,7 +274,7 @@ var ResponsesProcessor = class {
|
|
|
276
274
|
}
|
|
277
275
|
}
|
|
278
276
|
async processOutput(output, context) {
|
|
279
|
-
if (this.config.modelName.includes("deep-research"))
|
|
277
|
+
if (this.config.modelName.includes("deep-research")) logger.debug(`Deep research response structure: ${JSON.stringify(context.data, null, 2)}`);
|
|
280
278
|
if (!output || !Array.isArray(output) || output.length === 0) throw new Error("Invalid response format: Missing output array");
|
|
281
279
|
let result = "";
|
|
282
280
|
let refusal = "";
|
|
@@ -284,7 +282,7 @@ var ResponsesProcessor = class {
|
|
|
284
282
|
const annotations = [];
|
|
285
283
|
for (const item of output) {
|
|
286
284
|
if (!item || typeof item !== "object") {
|
|
287
|
-
|
|
285
|
+
logger.warn(`Skipping invalid output item: ${JSON.stringify(item)}`);
|
|
288
286
|
continue;
|
|
289
287
|
}
|
|
290
288
|
const processed = await this.processOutputItem(item, context);
|
|
@@ -314,7 +312,7 @@ var ResponsesProcessor = class {
|
|
|
314
312
|
case "mcp_call": return this.processMcpCall(item);
|
|
315
313
|
case "mcp_approval_request": return this.processMcpApprovalRequest(item);
|
|
316
314
|
default:
|
|
317
|
-
|
|
315
|
+
logger.debug(`Unknown output item type: ${item.type}`);
|
|
318
316
|
return {};
|
|
319
317
|
}
|
|
320
318
|
}
|
|
@@ -337,7 +335,7 @@ var ResponsesProcessor = class {
|
|
|
337
335
|
const annotations = [];
|
|
338
336
|
if (item.content) for (const contentItem of item.content) {
|
|
339
337
|
if (!contentItem || typeof contentItem !== "object") {
|
|
340
|
-
|
|
338
|
+
logger.warn(`Skipping invalid content item: ${JSON.stringify(contentItem)}`);
|
|
341
339
|
continue;
|
|
342
340
|
}
|
|
343
341
|
if (contentItem.type === "output_text") {
|
|
@@ -398,7 +396,6 @@ var ResponsesProcessor = class {
|
|
|
398
396
|
return Promise.resolve({ content });
|
|
399
397
|
}
|
|
400
398
|
};
|
|
401
|
-
|
|
402
399
|
//#endregion
|
|
403
400
|
//#region src/providers/openai/responses.ts
|
|
404
401
|
var OpenAiResponsesProvider = class extends OpenAiGenericProvider {
|
|
@@ -437,8 +434,17 @@ var OpenAiResponsesProvider = class extends OpenAiGenericProvider {
|
|
|
437
434
|
"gpt-5.1-chat-latest",
|
|
438
435
|
"gpt-5.2",
|
|
439
436
|
"gpt-5.2-2025-12-11",
|
|
437
|
+
"gpt-5.2-chat-latest",
|
|
438
|
+
"gpt-5.2-codex",
|
|
439
|
+
"gpt-5.2-pro",
|
|
440
|
+
"gpt-5.2-pro-2025-12-11",
|
|
441
|
+
"gpt-5.3-chat-latest",
|
|
440
442
|
"gpt-5.3-codex",
|
|
441
443
|
"gpt-5.3-codex-spark",
|
|
444
|
+
"gpt-5.4",
|
|
445
|
+
"gpt-5.4-2026-03-05",
|
|
446
|
+
"gpt-5.4-pro",
|
|
447
|
+
"gpt-5.4-pro-2026-03-05",
|
|
442
448
|
"gpt-audio",
|
|
443
449
|
"gpt-audio-2025-08-28",
|
|
444
450
|
"gpt-audio-mini",
|
|
@@ -531,7 +537,7 @@ var OpenAiResponsesProvider = class extends OpenAiGenericProvider {
|
|
|
531
537
|
...reasoningEffort ? { reasoning: { effort: reasoningEffort } } : {},
|
|
532
538
|
...temperature !== void 0 ? { temperature } : {},
|
|
533
539
|
...instructions ? { instructions } : {},
|
|
534
|
-
...config.top_p !== void 0 || getEnvString("OPENAI_TOP_P") ? { top_p: config.top_p ?? getEnvFloat("OPENAI_TOP_P", 1) } : {},
|
|
540
|
+
...(!reasoningEffort || reasoningEffort === "none") && (config.top_p !== void 0 || getEnvString("OPENAI_TOP_P")) ? { top_p: config.top_p ?? getEnvFloat("OPENAI_TOP_P", 1) } : {},
|
|
535
541
|
...loadedTools ? { tools: loadedTools } : {},
|
|
536
542
|
...config.tool_choice ? { tool_choice: config.tool_choice } : {},
|
|
537
543
|
...config.max_tool_calls ? { max_tool_calls: config.max_tool_calls } : {},
|
|
@@ -567,10 +573,11 @@ var OpenAiResponsesProvider = class extends OpenAiGenericProvider {
|
|
|
567
573
|
for (const mcpTool of mcpTools) if (mcpTool.require_approval !== "never") return { error: `Deep research model ${this.modelName} requires MCP tools to have require_approval: 'never'. Update your MCP tool configuration:\ntools:\n - type: mcp\n require_approval: never` };
|
|
568
574
|
}
|
|
569
575
|
let timeout = REQUEST_TIMEOUT_MS;
|
|
570
|
-
|
|
576
|
+
const isGpt5ProModel = /(^|\/)gpt-5(?:\.\d+)?-pro(?:-|$)/.test(this.modelName);
|
|
577
|
+
if (isDeepResearchModel || isGpt5ProModel) {
|
|
571
578
|
const evalTimeout = getEnvInt("PROMPTFOO_EVAL_TIMEOUT_MS", 0);
|
|
572
579
|
timeout = evalTimeout > 0 ? evalTimeout : LONG_RUNNING_MODEL_TIMEOUT_MS;
|
|
573
|
-
|
|
580
|
+
logger.debug(`Using timeout of ${timeout}ms for long-running model ${this.modelName}`);
|
|
574
581
|
}
|
|
575
582
|
let data;
|
|
576
583
|
let status;
|
|
@@ -611,7 +618,7 @@ var OpenAiResponsesProvider = class extends OpenAiGenericProvider {
|
|
|
611
618
|
};
|
|
612
619
|
}
|
|
613
620
|
} catch (err) {
|
|
614
|
-
|
|
621
|
+
logger.error(`API call error: ${String(err)}`);
|
|
615
622
|
await deleteFromCache?.();
|
|
616
623
|
return {
|
|
617
624
|
error: `API call error: ${String(err)}`,
|
|
@@ -647,7 +654,7 @@ var OpenAiResponsesProvider = class extends OpenAiGenericProvider {
|
|
|
647
654
|
};
|
|
648
655
|
}
|
|
649
656
|
};
|
|
650
|
-
|
|
651
657
|
//#endregion
|
|
652
658
|
export { ResponsesProcessor as n, FunctionCallbackHandler as r, OpenAiResponsesProvider as t };
|
|
653
|
-
|
|
659
|
+
|
|
660
|
+
//# sourceMappingURL=responses-BKqJmhhc.js.map
|