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.
Files changed (366) hide show
  1. package/README.md +1 -1
  2. package/dist/drizzle/0023_wooden_mandrill.sql +2 -0
  3. package/dist/drizzle/meta/0023_snapshot.json +1496 -0
  4. package/dist/drizzle/meta/_journal.json +7 -0
  5. package/dist/src/{ListApp-D3DG0F8h.js → ListApp-Du7YVwj5.js} +2 -4
  6. package/dist/src/accounts-BgNJDBE6.js +206 -0
  7. package/dist/src/{accounts-BzEY8H3v.cjs → accounts-Bx-x3bmW.cjs} +99 -80
  8. package/dist/src/{accounts-DHHiXsy6.js → accounts-CMqkzrVf.js} +61 -36
  9. package/dist/src/{accounts-R3gfCR_g.js → accounts-xrUGFA6n.js} +60 -35
  10. package/dist/src/{agentic-utils-D6_gzOUF.js → agentic-utils-BKIN5PKu.js} +9 -10
  11. package/dist/src/{agents-CwM7re15.cjs → agents-B0f4HICh.cjs} +37 -40
  12. package/dist/src/{agents-Cnph5GLD.js → agents-C-dDThPK.js} +37 -37
  13. package/dist/src/{agents-C7BiinFI.cjs → agents-CErsqg5U.cjs} +19 -27
  14. package/dist/src/{agents-v4cW_ZgC.js → agents-CVIn-Utx.js} +19 -22
  15. package/dist/src/{agents-GiUianme.js → agents-CXknwsFX.js} +37 -40
  16. package/dist/src/{agents-DETIQHqF.js → agents-DeH4Gu94.js} +21 -28
  17. package/dist/src/{agents-DYIT-hQy.js → agents-Dy2YpZpa.js} +38 -41
  18. package/dist/src/{agents-Cao4i7AX.js → agents-aF4-T121.js} +19 -30
  19. package/dist/src/{aimlapi-DMF6v_vb.js → aimlapi-BAGZDo5G.js} +16 -18
  20. package/dist/src/{aimlapi-CMJpKK-B.js → aimlapi-BNfTBexL.js} +15 -17
  21. package/dist/src/{aimlapi-DtSf1ykJ.js → aimlapi-DHRKlBEA.js} +15 -4
  22. package/dist/src/{aimlapi-DoGLcQW_.cjs → aimlapi-tg0Gkcvr.cjs} +15 -16
  23. package/dist/src/app/assets/index-BFCZg7hQ.js +439 -0
  24. package/dist/src/app/assets/index-NCn4eVBv.css +1 -0
  25. package/dist/src/app/assets/{vendor-charts-CYyo8R8v.js → vendor-charts-CCl15Imd.js} +1 -1
  26. package/dist/src/app/assets/{vendor-markdown-DSmzq4Jh.js → vendor-markdown-0tekx3KX.js} +1 -1
  27. package/dist/src/app/index.html +4 -34
  28. package/dist/src/{audio-DUH4q0Xq.js → audio-BRODU0UK.js} +7 -9
  29. package/dist/src/{audio-BWjyvHn9.cjs → audio-BWeaWovU.cjs} +6 -7
  30. package/dist/src/{audio-U580w8jM.js → audio-CHQ4r-RV.js} +6 -5
  31. package/dist/src/{audio-BrJBFN2b.js → audio-tf_NBjlC.js} +6 -8
  32. package/dist/src/base-B0tcrnq_.js +193 -0
  33. package/dist/src/base-B4QJRyFS.js +194 -0
  34. package/dist/src/base-DBtwl2FR.cjs +222 -0
  35. package/dist/src/base-fEDN28WM.js +193 -0
  36. package/dist/src/{blobs-kt8v3UyH.js → blobs-BAU-dXan.js} +9 -12
  37. package/dist/src/{blobs-C9J2mVgo.js → blobs-Bpg5rH6i.js} +9 -12
  38. package/dist/src/{blobs-673H0jCl.cjs → blobs-DvS-O6be.cjs} +34 -37
  39. package/dist/src/blobs-qTYm-1PY.js +236 -0
  40. package/dist/src/{cache-BLLayYEN.js → cache-8XhNqPKW.js} +64 -67
  41. package/dist/src/cache-Bbn1Nyrd.cjs +5 -0
  42. package/dist/src/cache-BwsMSda7.js +6 -0
  43. package/dist/src/{cache-mIszOnuz.js → cache-CG0SlR1d.js} +64 -66
  44. package/dist/src/{cache-7xULbvt3.cjs → cache-COish3-W.cjs} +114 -117
  45. package/dist/src/cache-D3eqDYGU.js +739 -0
  46. package/dist/src/{chat-Fl6TZJRS.cjs → chat-2K608PeQ.cjs} +20 -21
  47. package/dist/src/chat-BKm79wib.js +764 -0
  48. package/dist/src/{chat-XPN9YHhr.js → chat-CM_kyI8B.js} +20 -9
  49. package/dist/src/{chat-DIywASPG.js → chat-CRWNNq73.js} +49 -49
  50. package/dist/src/{chat-C8Ei4f87.js → chat-CznLWr_D.js} +49 -49
  51. package/dist/src/{chat-CgyGj2hC.js → chat-DHMH-N64.js} +20 -22
  52. package/dist/src/{chat-C4zqjObh.cjs → chat-DaqekjFr.cjs} +69 -69
  53. package/dist/src/{chat-Cpz3O-Xl.js → chat-DxysjBvt.js} +21 -23
  54. package/dist/src/{chatkit-Dpxrq4eD.js → chatkit-65VXf5SR.js} +58 -58
  55. package/dist/src/{chatkit-DIrJX8xk.js → chatkit-Be-Q-a9F.js} +58 -60
  56. package/dist/src/{chatkit-DEls11hE.js → chatkit-BxFvW8KY.js} +58 -60
  57. package/dist/src/{chatkit-e25Ziu17.cjs → chatkit-DKyPi1Gs.cjs} +58 -60
  58. package/dist/src/chunk-DEq-mXcV.js +15 -0
  59. package/dist/src/chunk-DRamLcfz.js +16 -0
  60. package/dist/src/{claude-agent-sdk-6-xTaLwM.js → claude-agent-sdk-BLTu0WBO.js} +45 -31
  61. package/dist/src/{claude-agent-sdk-BzxF6NIJ.cjs → claude-agent-sdk-CJH22shf.cjs} +44 -29
  62. package/dist/src/{claude-agent-sdk-CmkTnKGH.js → claude-agent-sdk-D6_k9FKA.js} +45 -33
  63. package/dist/src/{claude-agent-sdk-rXCBLK_o.js → claude-agent-sdk-Dy5lT-Tx.js} +46 -21
  64. package/dist/src/{cloud-BMbRVJFw.js → cloud-Bc9526yV.js} +32 -12
  65. package/dist/src/cloud-DmE0EwsY.js +4 -0
  66. package/dist/src/{cloudflare-ai-CUg4BTcj.js → cloudflare-ai-C9r2sRhw.js} +16 -18
  67. package/dist/src/{cloudflare-ai-Z9X219gp.js → cloudflare-ai-CWWJCRim.js} +16 -4
  68. package/dist/src/{cloudflare-ai-BAQ0u_dg.cjs → cloudflare-ai-ClWSdor4.cjs} +16 -17
  69. package/dist/src/{cloudflare-ai-CobxMTR4.js → cloudflare-ai-ICsOuD-z.js} +17 -19
  70. package/dist/src/{cloudflare-gateway-C0sgfr_z.cjs → cloudflare-gateway-C2_-KG5o.cjs} +21 -22
  71. package/dist/src/{cloudflare-gateway-_itGuXry.js → cloudflare-gateway-D6O7AlYb.js} +23 -23
  72. package/dist/src/{cloudflare-gateway-D2_yi-Fh.js → cloudflare-gateway-D6xFc5pa.js} +21 -25
  73. package/dist/src/{cloudflare-gateway-Djf3F3_H.js → cloudflare-gateway-pXGHxJ47.js} +26 -14
  74. package/dist/src/{codex-sdk-ibXwdglL.js → codex-sdk-C6UMlxwV.js} +49 -32
  75. package/dist/src/{codex-sdk-BASDNkIl.js → codex-sdk-DUwKWezN.js} +49 -30
  76. package/dist/src/{codex-sdk-dSnGdgIp.js → codex-sdk-GGAw0qbD.js} +49 -32
  77. package/dist/src/{codex-sdk-wTEpMM_X.cjs → codex-sdk-fAO0c3yA.cjs} +49 -32
  78. package/dist/src/{cometapi-B01btbfb.js → cometapi-BasUi7-_.js} +17 -19
  79. package/dist/src/{cometapi-DHUAH6nK.js → cometapi-Bbjp5V4x.js} +16 -4
  80. package/dist/src/{cometapi-ChAaRjg5.js → cometapi-DkXrKi5z.js} +21 -24
  81. package/dist/src/{cometapi-JbvOJSCO.cjs → cometapi-vY6aDZgo.cjs} +21 -22
  82. package/dist/src/{completion-D9_MDlnd.js → completion-6Mx_iXxK.js} +11 -13
  83. package/dist/src/{completion-BBJ6zmG3.js → completion-C5rtR_9P.js} +11 -13
  84. package/dist/src/{completion-DDyL3Cb2.cjs → completion-CDOouNzq.cjs} +21 -23
  85. package/dist/src/completion-C_P3ypkJ.js +120 -0
  86. package/dist/src/createHash-CTQmL3G2.js +15 -0
  87. package/dist/src/createHash-CfZSc0b4.cjs +27 -0
  88. package/dist/src/createHash-Da8fMwqB.js +16 -0
  89. package/dist/src/createHash-DmPQkvBh.js +15 -0
  90. package/dist/src/{docker-JAAubMw3.js → docker-5KcG-_86.js} +18 -20
  91. package/dist/src/{docker-Ckw-j7Rr.cjs → docker-BwsKwxFs.cjs} +18 -19
  92. package/dist/src/{docker-vnOg96gi.js → docker-CZnqU1XV.js} +18 -7
  93. package/dist/src/{docker-BuButc4D.js → docker-DzxyDPIj.js} +19 -21
  94. package/dist/src/entrypoint.js +2 -3
  95. package/dist/src/{errors-DnGCbnx8.js → errors-P6ll7XSJ.js} +2 -2
  96. package/dist/src/{esm-CYhseqj4.js → esm-C03C-mv3.js} +17 -20
  97. package/dist/src/{esm-rDtG_2rg.js → esm-CaIwzWR5.js} +18 -21
  98. package/dist/src/esm-Cd1AjG1D.js +379 -0
  99. package/dist/src/{esm-BQkx5roy.cjs → esm-CnNt7sI4.cjs} +47 -49
  100. package/dist/src/eval-17JizQIv.js +15 -0
  101. package/dist/src/{eval-CYrbG57o.js → eval-DmFyWU7i.js} +49 -55
  102. package/dist/src/{evalResult-COsVttMA.js → evalResult-CDQiuUuf.js} +16 -12
  103. package/dist/src/{evalResult-6JaUIStC.js → evalResult-CTG2AHOS.js} +10 -11
  104. package/dist/src/evalResult-Cqj8pldJ.js +12 -0
  105. package/dist/src/{evalResult-DlRfu_Rq.cjs → evalResult-Dap2CekP.cjs} +20 -21
  106. package/dist/src/evalResult-DvcJAWJU.cjs +10 -0
  107. package/dist/src/evalResult-Hftn-S_i.js +10 -0
  108. package/dist/src/evaluator-B2CFNt-P.js +36 -0
  109. package/dist/src/{evaluator-3EJCMTs0.js → evaluator-DPFRbFIL.js} +210 -232
  110. package/dist/src/{extractor-LSYjrhK0.js → extractor-CFG6bcWJ.js} +23 -38
  111. package/dist/src/{extractor-DbhlYEeo.cjs → extractor-DX36oYEv.cjs} +37 -64
  112. package/dist/src/{extractor-Hs7la_19.js → extractor-M67RUtg6.js} +23 -38
  113. package/dist/src/extractor-YMU_Gvt8.js +374 -0
  114. package/dist/src/fetch-4M3YRaqL.js +780 -0
  115. package/dist/src/{fetch-18MuNu9i.js → fetch-60Gzydls.js} +60 -46
  116. package/dist/src/{fetch-SRsE6Ctl.js → fetch-BMv0O527.js} +41 -35
  117. package/dist/src/{fetch-ZMn_oemb.cjs → fetch-BxUk8odA.cjs} +268 -279
  118. package/dist/src/fetch-KV5kNASw.js +5 -0
  119. package/dist/src/{fileExtensions-ePDqouxn.js → fileExtensions-DnqA1y9x.js} +2 -2
  120. package/dist/src/{fileExtensions-BpuMmaFL.js → fileExtensions-Ds-foDzt.js} +2 -2
  121. package/dist/src/fileExtensions-LcDYkU4v.js +85 -0
  122. package/dist/src/{fileExtensions-DkJYkWUy.cjs → fileExtensions-bYh77CN8.cjs} +27 -28
  123. package/dist/src/{formatDuration-Doo0xq-z.js → formatDuration-DgBVMN65.js} +2 -2
  124. package/dist/src/{genaiTracer-Ce19n68P.js → genaiTracer-70Z8BIuV.js} +2 -3
  125. package/dist/src/{genaiTracer-CqNnnXrE.js → genaiTracer-C1rxGO8Q.js} +2 -3
  126. package/dist/src/genaiTracer-D3fD9dNV.js +256 -0
  127. package/dist/src/{genaiTracer-CQlpZkrp.cjs → genaiTracer-DN4dQywX.cjs} +13 -14
  128. package/dist/src/graders-Bu0H9nXi.js +32 -0
  129. package/dist/src/{graders-BaMCwIKp.js → graders-CHO8EPM4.js} +385 -417
  130. package/dist/src/graders-Cfhkvx-e.js +34 -0
  131. package/dist/src/{graders-QsALpIdy.js → graders-CpdqD9PI.js} +385 -417
  132. package/dist/src/graders-DClJVpGP.cjs +32 -0
  133. package/dist/src/{graders-DzUUnUjC.cjs → graders-DOXycdlG.cjs} +721 -753
  134. package/dist/src/graders-DcnJsrMO.js +32 -0
  135. package/dist/src/graders-R9rYUM0d.js +13466 -0
  136. package/dist/src/{image-BiEVdpdP.js → image-BmEZqVmk.js} +57 -18
  137. package/dist/src/{image-mhAGP07h.js → image-CBBVXWuT.js} +57 -18
  138. package/dist/src/{image-D10zEe1f.cjs → image-CDLQOcqT.cjs} +6 -7
  139. package/dist/src/{image-COCWy5dX.js → image-DJEvKveK.js} +6 -5
  140. package/dist/src/{image-C3BjJUAU.cjs → image-DTedmQPg.cjs} +77 -32
  141. package/dist/src/{image-DB4sHxdJ.js → image-gvmivTEe.js} +7 -9
  142. package/dist/src/image-pAX56tPG.js +257 -0
  143. package/dist/src/{image-BXt_7u0v.js → image-tL5hIOFh.js} +6 -8
  144. package/dist/src/index.cjs +696 -693
  145. package/dist/src/index.d.cts +113 -10
  146. package/dist/src/index.d.ts +113 -6
  147. package/dist/src/index.js +657 -658
  148. package/dist/src/{interactiveCheck-DU-MAhp5.js → interactiveCheck-BgLZUIt3.js} +7 -8
  149. package/dist/src/{invariant-DT20jrBd.js → invariant-BtWWVVhl.js} +2 -2
  150. package/dist/src/{invariant-1pAf2CD1.js → invariant-Ddh24eXh.js} +2 -2
  151. package/dist/src/{invariant-CKcJAQ6M.cjs → invariant-kfQ8Bu82.cjs} +7 -8
  152. package/dist/src/invariant-vgHWClmd.js +25 -0
  153. package/dist/src/{knowledgeBase-DotRBzUE.js → knowledgeBase-CLJybhnF.js} +19 -34
  154. package/dist/src/{knowledgeBase-XJQ0Qyez.js → knowledgeBase-CoU-UQBg.js} +17 -41
  155. package/dist/src/{knowledgeBase-CMvMlLZR.js → knowledgeBase-DjWPVqSb.js} +17 -43
  156. package/dist/src/{knowledgeBase-Bnb00xKs.cjs → knowledgeBase-wkxuRFhA.cjs} +17 -40
  157. package/dist/src/{litellm-CHrRmPAe.js → litellm-B9Hysuri.js} +16 -18
  158. package/dist/src/{litellm-CrLJrPIm.js → litellm-CTfa0hqi.js} +15 -17
  159. package/dist/src/{litellm-BrnZhMcL.cjs → litellm-NYpQ8RQu.cjs} +15 -16
  160. package/dist/src/{litellm-BECdjOTx.js → litellm-ePxtr9F1.js} +15 -4
  161. package/dist/src/{logger-w8Ozp0Td.js → logger-CT3IKMKA.js} +24 -41
  162. package/dist/src/{logger-BdZ-IqBc.cjs → logger-Cp1GPUjj.cjs} +166 -192
  163. package/dist/src/logger-DLcq4dWf.js +713 -0
  164. package/dist/src/{logger-BotXmWKW.js → logger-KkObSCzq.js} +27 -43
  165. package/dist/src/{luma-ray-C0RkI3lt.cjs → luma-ray-B0GGNRc1.cjs} +20 -21
  166. package/dist/src/{luma-ray-C-w6EsJm.js → luma-ray-BE2mOt6N.js} +20 -13
  167. package/dist/src/{luma-ray-BOeX-h0M.js → luma-ray-BW9IRGIc.js} +22 -21
  168. package/dist/src/{luma-ray-DgKLS0BF.js → luma-ray-Cm1KZBhs.js} +20 -23
  169. package/dist/src/main.js +1985 -2055
  170. package/dist/src/{messages-DXV3Qh8_.cjs → messages-1JrJs91T.cjs} +35 -34
  171. package/dist/src/{messages-D61tPFQo.js → messages-1x9atZmP.js} +25 -24
  172. package/dist/src/{messages-CDZYGNlS.js → messages-BLbWdsyt.js} +25 -24
  173. package/dist/src/messages-D8EA0oDc.js +240 -0
  174. package/dist/src/{meteor-P2rUE-Uz.js → meteor-44VjEACX.js} +3 -4
  175. package/dist/src/{meteor-SLNTgmXm.js → meteor-D-SotUw9.js} +3 -4
  176. package/dist/src/{meteor-odmwVbyG.cjs → meteor-DLZZ3osF.cjs} +3 -4
  177. package/dist/src/{meteor-Dj8cTkU_.js → meteor-DUiCJRC-.js} +3 -4
  178. package/dist/src/modelslab-C1OLRmVX.js +166 -0
  179. package/dist/src/modelslab-CqXBy3U8.js +168 -0
  180. package/dist/src/modelslab-DcOSFwKh.cjs +166 -0
  181. package/dist/src/modelslab-X5-4LroM.js +166 -0
  182. package/dist/src/{nova-reel-C2LFfVTf.js → nova-reel-BgS1ZWuK.js} +20 -13
  183. package/dist/src/{nova-reel-DtCjbD5O.js → nova-reel-D2ZkOSyr.js} +22 -21
  184. package/dist/src/{nova-reel-D9FXq3Mt.cjs → nova-reel-D9xfaMBs.cjs} +20 -21
  185. package/dist/src/{nova-reel-Bk5npr2q.js → nova-reel-DihqLeol.js} +20 -23
  186. package/dist/src/{nova-sonic-BoRSY_U6.cjs → nova-sonic-DVu3mMIy.cjs} +30 -31
  187. package/dist/src/{nova-sonic-D_qERM-K.js → nova-sonic-DezhVUYT.js} +30 -26
  188. package/dist/src/{nova-sonic-CgaWLDM1.js → nova-sonic-P-CdUMlV.js} +30 -31
  189. package/dist/src/{nova-sonic-BXRfQyF-.js → nova-sonic-Q3BOJeig.js} +31 -32
  190. package/dist/src/{openai-Bigwjgo1.cjs → openai-Cuif0GEt.cjs} +8 -9
  191. package/dist/src/{openai-Dz3surb_.js → openai-DElQ-fPX.js} +3 -4
  192. package/dist/src/{openai-CT5fwbve.js → openai-DhbB7eWK.js} +3 -4
  193. package/dist/src/openai-j-sE2O7r.js +44 -0
  194. package/dist/src/{openclaw-dHLcXUWZ.js → openclaw-BiSZPL7J.js} +20 -14
  195. package/dist/src/{openclaw-CpPrXwf6.js → openclaw-Bv1DINsX.js} +20 -27
  196. package/dist/src/{openclaw-B6XY2kUf.js → openclaw-D1D_ej1z.js} +21 -28
  197. package/dist/src/{openclaw-DDSfq5fp.cjs → openclaw-DAfWQn-o.cjs} +33 -39
  198. package/dist/src/opencode-sdk-C7m-wRfI.js +560 -0
  199. package/dist/src/opencode-sdk-CfaLN8PY.cjs +564 -0
  200. package/dist/src/opencode-sdk-D95s6SnR.js +562 -0
  201. package/dist/src/opencode-sdk-DxUPkLT7.js +560 -0
  202. package/dist/src/{otlpReceiver-DmRb0NBj.js → otlpReceiver--AIRW_S4.js} +53 -51
  203. package/dist/src/{otlpReceiver-Dg817agV.js → otlpReceiver-Bn5wGB1v.js} +53 -55
  204. package/dist/src/{otlpReceiver-B6Xo4KZM.cjs → otlpReceiver-Diec4cln.cjs} +53 -55
  205. package/dist/src/{otlpReceiver-BO0rbDzh.js → otlpReceiver-g3ByGaXs.js} +53 -55
  206. package/dist/src/{providerRegistry-Xf0qdqGQ.js → providerRegistry-B0RUOLI_.js} +7 -8
  207. package/dist/src/{providerRegistry-wCWd7sKQ.js → providerRegistry-CD8MEar9.js} +7 -8
  208. package/dist/src/{providerRegistry-lc7a7utN.cjs → providerRegistry-Civky8Ar.cjs} +12 -13
  209. package/dist/src/providerRegistry-DM8rZYol.js +45 -0
  210. package/dist/src/providers-B3HvufyI.js +33246 -0
  211. package/dist/src/{providers-BiNq_Iyc.js → providers-BKRJTjBz.js} +1743 -1795
  212. package/dist/src/providers-C1rOSHiR.js +32 -0
  213. package/dist/src/{providers-BlEhY5mi.js → providers-CFLy1_ji.js} +1750 -1802
  214. package/dist/src/{providers-BNKVY53V.cjs → providers-CFu-TZl-.cjs} +2111 -2163
  215. package/dist/src/providers-CxmDwEFf.cjs +31 -0
  216. package/dist/src/providers-Dodakqr0.js +30 -0
  217. package/dist/src/providers-GIQ2TcsA.js +30 -0
  218. package/dist/src/{pythonUtils-r1uBuA0n.js → pythonUtils-C3py6GC1.js} +18 -19
  219. package/dist/src/{pythonUtils-DZ6EbdY4.cjs → pythonUtils-CTU3Y3lw.cjs} +42 -43
  220. package/dist/src/{pythonUtils-vMlk9Qp5.js → pythonUtils-D5nxkQ0P.js} +18 -19
  221. package/dist/src/pythonUtils-D6fwaDSg.js +249 -0
  222. package/dist/src/quiverai-C2jVwbH1.js +213 -0
  223. package/dist/src/quiverai-CI6gYJVI.js +213 -0
  224. package/dist/src/quiverai-CLkWkyZc.cjs +213 -0
  225. package/dist/src/quiverai-MHSxbmmZ.js +215 -0
  226. package/dist/src/{render-CAZvKKkB.js → render-Drod8m7K.js} +4 -5
  227. package/dist/src/{responses-DLLjADw5.js → responses-BKqJmhhc.js} +34 -27
  228. package/dist/src/{responses-TsdODUpm.js → responses-CGw0DCzh.js} +34 -27
  229. package/dist/src/responses-jxdehPkC.js +660 -0
  230. package/dist/src/{responses-zOtKtnY_.cjs → responses-tD4Bd4dc.cjs} +49 -42
  231. package/dist/src/rubyUtils-BUHu6PhO.js +5 -0
  232. package/dist/src/{rubyUtils-Cs35SDYa.js → rubyUtils-BUVePouc.js} +27 -20
  233. package/dist/src/rubyUtils-BcuGX77l.js +222 -0
  234. package/dist/src/{rubyUtils-BtjlqyXt.js → rubyUtils-Boc4HZzX.js} +18 -19
  235. package/dist/src/rubyUtils-CP42kMvq.cjs +4 -0
  236. package/dist/src/{rubyUtils-DCVaJ3mc.cjs → rubyUtils-DhCAlxZr.cjs} +48 -50
  237. package/dist/src/{sagemaker-Du4LIR97.js → sagemaker-BK4Zb993.js} +75 -70
  238. package/dist/src/{sagemaker-CLdUAv5z.js → sagemaker-BfiWTmvn.js} +77 -77
  239. package/dist/src/{sagemaker-DwNnEVYt.cjs → sagemaker-CcQHM1jV.cjs} +75 -76
  240. package/dist/src/{sagemaker-BcgLu0U4.js → sagemaker-D2Q1c-sD.js} +75 -79
  241. package/dist/src/{scanner-Dyw21Wg_.js → scanner-J8CA3LsV.js} +149 -122
  242. package/dist/src/server/index.js +5620 -67302
  243. package/dist/src/{server-CgUQ25qW.cjs → server-B0PPuDw-.cjs} +57 -67
  244. package/dist/src/server-B1vi21hA.js +7 -0
  245. package/dist/src/{server-CbMTRQkg.js → server-BC7XJFgr.js} +19 -24
  246. package/dist/src/server-Cm9Kai_h.cjs +5 -0
  247. package/dist/src/{server-DWmZLfCy.js → server-DbFphssR.js} +26 -29
  248. package/dist/src/server-OAs3nBRT.js +229 -0
  249. package/dist/src/{signal-Bl32q42d.js → signal-BOTbd53Z.js} +9 -11
  250. package/dist/src/{slack-BtMkB6xP.cjs → slack-BmVAVGaK.cjs} +7 -8
  251. package/dist/src/{slack-OZYxoVON.js → slack-DCUPTzS2.js} +8 -8
  252. package/dist/src/{slack-DPqj42Ts.js → slack-DOdy_kyv.js} +7 -8
  253. package/dist/src/{slack-BfdBx2tO.js → slack-DXMKtA-f.js} +7 -9
  254. package/dist/src/store-BNmZ1KAz.cjs +5 -0
  255. package/dist/src/{store-BqwfFEyF.cjs → store-BSc-TF2w.cjs} +44 -45
  256. package/dist/src/store-BltJg2cd.js +6 -0
  257. package/dist/src/{store-D4gdn9ih.js → store-D1tv90v3.js} +34 -35
  258. package/dist/src/{store-2ocbYY9D.js → store-DQLEjuEO.js} +40 -36
  259. package/dist/src/store-Ub2vaGJ1.js +228 -0
  260. package/dist/src/{tables-D-NSwNIb.js → tables-5EvT_Bwn.js} +23 -23
  261. package/dist/src/{tables-B9E1kRp-.cjs → tables-C7K-XKWp.cjs} +93 -93
  262. package/dist/src/{tables-C7TT2XVn.js → tables-D36WTqKX.js} +25 -25
  263. package/dist/src/tables-xKANLRBD.js +288 -0
  264. package/dist/src/telemetry-5BCRNBbe.cjs +5 -0
  265. package/dist/src/{telemetry-DZ_7PaVq.js → telemetry-C15ziL8u.js} +17 -14
  266. package/dist/src/{telemetry-BXyVqyAg.js → telemetry-C2YDkUQH.js} +11 -13
  267. package/dist/src/{telemetry-D0_yFdtU.cjs → telemetry-CbrnxHp_.cjs} +21 -24
  268. package/dist/src/telemetry-D4W5hboe.js +7 -0
  269. package/dist/src/telemetry-DMb2Mpfm.js +171 -0
  270. package/dist/src/{text-Dm78AVGG.js → text-B_UCRPp2.js} +2 -2
  271. package/dist/src/{text-DF2hMKdg.cjs → text-CW1cyrwj.cjs} +12 -13
  272. package/dist/src/{text-DgMr_tiM.js → text-Db-Wt2u2.js} +2 -2
  273. package/dist/src/text-TIv0QYnd.js +22 -0
  274. package/dist/src/{tokenUsageUtils-FZd5O_4A.js → tokenUsageUtils-BDGe-iyI.js} +2 -2
  275. package/dist/src/{tokenUsageUtils-DmZSD2eU.js → tokenUsageUtils-DflFMjS0.js} +2 -2
  276. package/dist/src/tokenUsageUtils-NYT-WKS6.js +138 -0
  277. package/dist/src/{tokenUsageUtils-CXhxVj72.cjs → tokenUsageUtils-bVa1ga6f.cjs} +32 -33
  278. package/dist/src/{transcription-FNIz3YOe.cjs → transcription-CL78qbOU.cjs} +14 -15
  279. package/dist/src/{transcription-C-M81iDA.js → transcription-DAtxHhAM.js} +14 -7
  280. package/dist/src/{transcription-CYuY5sFO.js → transcription-LNZTNUUL.js} +14 -16
  281. package/dist/src/{transcription-Ch7S-LWw.js → transcription-QHh3AH6Z.js} +15 -17
  282. package/dist/src/{transform-CoP2bJ7P.js → transform-Cgi24fJ7.js} +94 -66
  283. package/dist/src/{transform-Kd6u-oNm.cjs → transform-CzK1Q0zl.cjs} +24 -26
  284. package/dist/src/{transform-D8dILpfZ.js → transform-DECvGmzp.js} +15 -13
  285. package/dist/src/{transform-DMaxQwDx.js → transform-DGLazrMm.js} +94 -66
  286. package/dist/src/transform-DGxXocjk.js +1506 -0
  287. package/dist/src/{transform-ivxEY4f7.cjs → transform-DOcQeLld.cjs} +234 -206
  288. package/dist/src/transform-DTGDnAzW.js +6 -0
  289. package/dist/src/{transform-CqTFr7KR.js → transform-DilY9wbS.js} +10 -12
  290. package/dist/src/transform-aa6tmVpZ.js +216 -0
  291. package/dist/src/transform-m3qNw4KP.cjs +5 -0
  292. package/dist/src/{transformersAvailability-DEU2naS1.js → transformersAvailability-CEVM2GNQ.js} +2 -2
  293. package/dist/src/{transformersAvailability-Bkep3ka7.cjs → transformersAvailability-CwayUSlh.cjs} +2 -3
  294. package/dist/src/{transformersAvailability-DwmezkVe.js → transformersAvailability-D6c6ROpT.js} +2 -2
  295. package/dist/src/{types-t52w-XsS.js → types-CH3Ge2sE.js} +103 -92
  296. package/dist/src/{types-DMVjYLpx.js → types-CLKiCBW3.js} +98 -91
  297. package/dist/src/types-CN_TZ2GJ.js +3260 -0
  298. package/dist/src/{types-BIfttHrT.cjs → types-LJ0r3wbR.cjs} +573 -566
  299. package/dist/src/util-5cB-L7U3.js +1430 -0
  300. package/dist/src/util-6-GqIvzS.js +599 -0
  301. package/dist/src/{util-vjscpUzy.js → util-B7T3SiBS.js} +5 -6
  302. package/dist/src/{util-Cl0zfT3V.js → util-Betm42rL.js} +44 -17
  303. package/dist/src/{util-CUEt0Vum.js → util-C-PPYSMq.js} +44 -17
  304. package/dist/src/{util-DkFTvieG.cjs → util-CchiqXh_.cjs} +35 -36
  305. package/dist/src/{util-mJ58qbbw.js → util-DaWTWKBK.js} +5 -6
  306. package/dist/src/{util-C08Kns6-.cjs → util-Db0a0AFH.cjs} +89 -62
  307. package/dist/src/{util-DiCePfDu.js → util-Dlz_Wvgm.js} +102 -53
  308. package/dist/src/{util-BSh4a_Q8.js → util-YT5HPZaS.js} +102 -53
  309. package/dist/src/{util-DUYOvxAy.cjs → util-Yz-1aEhW.cjs} +274 -219
  310. package/dist/src/util-ZZH-3QZz.js +293 -0
  311. package/dist/src/{utils-DFaZa6Rf.cjs → utils-Cz9qXqII.cjs} +32 -35
  312. package/dist/src/{utils-CVzb4YiI.js → utils-XiOAgly5.js} +4 -7
  313. package/dist/src/utils-dLokC-eR.js +94 -0
  314. package/dist/src/{utils-JaY9veb5.js → utils-f2-Moju7.js} +4 -7
  315. package/dist/tsconfig.tsbuildinfo +1 -1
  316. package/package.json +59 -53
  317. package/dist/src/app/assets/index-BOgkICuY.css +0 -1
  318. package/dist/src/app/assets/index-CSgqn_Vd.js +0 -428
  319. package/dist/src/app/tsconfig.app.tsbuildinfo +0 -1
  320. package/dist/src/base-BaXmtXYp.js +0 -107
  321. package/dist/src/base-Dtp8b4_N.js +0 -106
  322. package/dist/src/base-f71xxWai.cjs +0 -111
  323. package/dist/src/cache-BUPcq0Ad.js +0 -6
  324. package/dist/src/cache-CVfRb-HD.cjs +0 -6
  325. package/dist/src/cache-O4EuX2JV.js +0 -8
  326. package/dist/src/chunk-DHDDz29n.js +0 -22
  327. package/dist/src/chunk-FhC4c-0y.js +0 -21
  328. package/dist/src/cloud-CZ4hytdm.js +0 -5
  329. package/dist/src/eval-CKHWqG9f.js +0 -16
  330. package/dist/src/evalResult-CxTP-LMm.cjs +0 -11
  331. package/dist/src/evalResult-CzLURDcP.js +0 -13
  332. package/dist/src/evalResult-DyttNQ_G.js +0 -11
  333. package/dist/src/evaluator-0PvfeBYh.js +0 -38
  334. package/dist/src/fetch-Bi0o-fdp.js +0 -4
  335. package/dist/src/fetch-CMptBDVg.cjs +0 -4
  336. package/dist/src/fetch-DAZkv3gV.js +0 -6
  337. package/dist/src/graders-BCytzXrb.js +0 -34
  338. package/dist/src/graders-CGZQShfJ.cjs +0 -33
  339. package/dist/src/graders-spkuVC-E.js +0 -36
  340. package/dist/src/opencode-sdk-CImWVqy9.js +0 -382
  341. package/dist/src/opencode-sdk-CuCztr4P.js +0 -380
  342. package/dist/src/opencode-sdk-DhcfRbBH.js +0 -376
  343. package/dist/src/opencode-sdk-mqF-Oj3f.cjs +0 -383
  344. package/dist/src/providers-BMZZmPBJ.cjs +0 -32
  345. package/dist/src/providers-CQQrNaJk.js +0 -32
  346. package/dist/src/providers-Ck8HyrC-.js +0 -34
  347. package/dist/src/quiverai-BNfIwKCO.cjs +0 -54
  348. package/dist/src/quiverai-BQigKdIH.js +0 -57
  349. package/dist/src/quiverai-Bfy2WnE2.js +0 -55
  350. package/dist/src/quiverai-CedIP0PJ.js +0 -43
  351. package/dist/src/rubyUtils-D7--T12C.js +0 -6
  352. package/dist/src/rubyUtils-DRRiMFV2.js +0 -5
  353. package/dist/src/rubyUtils-vb8OYFC-.cjs +0 -5
  354. package/dist/src/server-BUbS0Qfh.js +0 -6
  355. package/dist/src/server-XpGXFHkS.cjs +0 -6
  356. package/dist/src/server-gfOx5Zrk.js +0 -8
  357. package/dist/src/store-5u2yriTV.js +0 -7
  358. package/dist/src/store-D_lq_8oQ.js +0 -6
  359. package/dist/src/store-m5KT6Ly7.cjs +0 -6
  360. package/dist/src/telemetry-5RHFoCJh.js +0 -6
  361. package/dist/src/telemetry-Do8wMnA-.js +0 -8
  362. package/dist/src/telemetry-LojxPoFq.cjs +0 -6
  363. package/dist/src/transform-8eGmaH-7.js +0 -7
  364. package/dist/src/transform-BRVvWaG4.cjs +0 -6
  365. package/dist/src/transform-GybT0X0u.js +0 -8
  366. package/dist/src/transformersAvailability-DkAWaK5B.js +0 -35
@@ -0,0 +1,249 @@
1
+ import { _ as getEnvBool, b as getEnvString, i as logger, m as safeJsonStringify } from "./logger-DLcq4dWf.js";
2
+ import { n as getWrapperDir } from "./esm-CaIwzWR5.js";
3
+ import fs from "fs";
4
+ import path from "path";
5
+ import os from "os";
6
+ import { promisify } from "util";
7
+ import { execFile } from "child_process";
8
+ import { PythonShell } from "python-shell";
9
+ //#region src/python/pythonUtils.ts
10
+ const execFileAsync = promisify(execFile);
11
+ /**
12
+ * Gets an integer value from an environment variable.
13
+ * @param key - The environment variable name
14
+ * @returns The parsed integer value, or undefined if not set or not a valid integer
15
+ */
16
+ function getEnvInt(key) {
17
+ const value = process.env[key];
18
+ if (value === void 0) return;
19
+ const parsed = parseInt(value, 10);
20
+ return isNaN(parsed) ? void 0 : parsed;
21
+ }
22
+ /**
23
+ * Resolves the Python executable path from explicit config and environment.
24
+ * This centralizes the fallback logic: configPath > PROMPTFOO_PYTHON env var.
25
+ *
26
+ * Note: Does NOT apply the final 'python' default - that's handled by
27
+ * validatePythonPath. This preserves the distinction between "explicitly
28
+ * configured" (should fail if invalid) and "using system default" (should
29
+ * try fallback detection).
30
+ *
31
+ * @param configPath - Explicitly configured Python path from provider config
32
+ * @returns The configured path, or undefined if neither config nor env var is set
33
+ */
34
+ function getConfiguredPythonPath(configPath) {
35
+ if (configPath) return configPath;
36
+ return getEnvString("PROMPTFOO_PYTHON") || void 0;
37
+ }
38
+ const state = {
39
+ cachedPythonPath: null,
40
+ validationPromise: null
41
+ };
42
+ /**
43
+ * Try to find Python using Windows 'where' command, filtering out Microsoft Store stubs.
44
+ */
45
+ async function tryWindowsWhere() {
46
+ try {
47
+ const output = (await execFileAsync("where", ["python"])).stdout.trim();
48
+ if (!output) {
49
+ logger.debug("Windows 'where python' returned empty output");
50
+ return null;
51
+ }
52
+ const paths = output.split("\n").filter((path) => path.trim());
53
+ for (const pythonPath of paths) {
54
+ const trimmedPath = pythonPath.trim();
55
+ if (trimmedPath.includes("WindowsApps") || !trimmedPath.endsWith(".exe")) continue;
56
+ const validated = await tryPath(trimmedPath);
57
+ if (validated) return validated;
58
+ }
59
+ } catch (error) {
60
+ const errorMsg = error instanceof Error ? error.message : String(error);
61
+ logger.debug(`Windows 'where python' failed: ${errorMsg}`);
62
+ if (errorMsg.includes("Access is denied") || errorMsg.includes("EACCES")) logger.warn(`Permission denied when searching for Python: ${errorMsg}`);
63
+ }
64
+ return null;
65
+ }
66
+ /**
67
+ * Try Python commands to get sys.executable path.
68
+ */
69
+ async function tryPythonCommands(commands) {
70
+ for (const cmd of commands) try {
71
+ const executablePath = (await execFileAsync(cmd, ["-c", "import sys; print(sys.executable)"])).stdout.trim();
72
+ if (executablePath && executablePath !== "None") {
73
+ if (process.platform === "win32" && !executablePath.toLowerCase().endsWith(".exe")) {
74
+ if (executablePath.includes("\\") || /^[A-Za-z]:/.test(executablePath)) return executablePath + ".exe";
75
+ }
76
+ return executablePath;
77
+ }
78
+ } catch (error) {
79
+ const errorMsg = error instanceof Error ? error.message : String(error);
80
+ logger.debug(`Python command "${cmd}" failed: ${errorMsg}`);
81
+ if (errorMsg.includes("Access is denied") || errorMsg.includes("EACCES") || errorMsg.includes("EPERM")) logger.warn(`Permission denied when trying Python command "${cmd}": ${errorMsg}`);
82
+ }
83
+ return null;
84
+ }
85
+ /**
86
+ * Try direct command validation as final fallback.
87
+ */
88
+ async function tryDirectCommands(commands) {
89
+ for (const cmd of commands) try {
90
+ const validated = await tryPath(cmd);
91
+ if (validated) return validated;
92
+ } catch (error) {
93
+ const errorMsg = error instanceof Error ? error.message : String(error);
94
+ logger.debug(`Direct command "${cmd}" failed: ${errorMsg}`);
95
+ if (errorMsg.includes("Access is denied") || errorMsg.includes("EACCES") || errorMsg.includes("EPERM")) logger.warn(`Permission denied when trying Python command "${cmd}": ${errorMsg}`);
96
+ }
97
+ return null;
98
+ }
99
+ /**
100
+ * Attempts to get the Python executable path using platform-appropriate strategies.
101
+ * @returns The Python executable path if successful, or null if failed.
102
+ */
103
+ async function getSysExecutable() {
104
+ if (process.platform === "win32") {
105
+ const whereResult = await tryWindowsWhere();
106
+ if (whereResult) return whereResult;
107
+ const sysResult = await tryPythonCommands(["py", "py -3"]);
108
+ if (sysResult) return sysResult;
109
+ return await tryDirectCommands(["python"]);
110
+ } else return await tryPythonCommands(["python3", "python"]);
111
+ }
112
+ /**
113
+ * Attempts to validate a Python executable path.
114
+ * @param path - The path to the Python executable to test.
115
+ * @returns The validated path if successful, or null if invalid.
116
+ */
117
+ async function tryPath(path) {
118
+ let timeoutId;
119
+ try {
120
+ const timeoutPromise = new Promise((_, reject) => {
121
+ timeoutId = setTimeout(() => reject(/* @__PURE__ */ new Error("Command timed out")), 2500);
122
+ });
123
+ const result = await Promise.race([execFileAsync(path, ["--version"]), timeoutPromise]);
124
+ if (timeoutId) clearTimeout(timeoutId);
125
+ if (result.stdout.trim().startsWith("Python")) return path;
126
+ return null;
127
+ } catch {
128
+ if (timeoutId) clearTimeout(timeoutId);
129
+ return null;
130
+ }
131
+ }
132
+ /**
133
+ * Validates and caches the Python executable path.
134
+ *
135
+ * @param pythonPath - Path to the Python executable.
136
+ * @param isExplicit - If true, only tries the provided path.
137
+ * @returns Validated Python executable path.
138
+ * @throws {Error} If no valid Python executable is found.
139
+ */
140
+ async function validatePythonPath(pythonPath, isExplicit) {
141
+ if (state.cachedPythonPath) return state.cachedPythonPath;
142
+ if (!state.validationPromise) state.validationPromise = (async () => {
143
+ try {
144
+ const primaryPath = await tryPath(pythonPath);
145
+ if (primaryPath) {
146
+ state.cachedPythonPath = primaryPath;
147
+ state.validationPromise = null;
148
+ return primaryPath;
149
+ }
150
+ if (isExplicit) {
151
+ const error = /* @__PURE__ */ new Error(`Python 3 not found. Tried "${pythonPath}" Please ensure Python 3 is installed and set the PROMPTFOO_PYTHON environment variable to your Python 3 executable path (e.g., '${process.platform === "win32" ? "C:\\Python39\\python.exe" : "/usr/bin/python3"}').`);
152
+ state.validationPromise = null;
153
+ throw error;
154
+ }
155
+ const detectedPath = await getSysExecutable();
156
+ if (detectedPath) {
157
+ state.cachedPythonPath = detectedPath;
158
+ state.validationPromise = null;
159
+ return detectedPath;
160
+ }
161
+ const error = /* @__PURE__ */ new Error(`Python 3 not found. Tried "${pythonPath}", sys.executable detection, and fallback commands. Please ensure Python 3 is installed and set the PROMPTFOO_PYTHON environment variable to your Python 3 executable path (e.g., '${process.platform === "win32" ? "C:\\Python39\\python.exe" : "/usr/bin/python3"}').`);
162
+ state.validationPromise = null;
163
+ throw error;
164
+ } catch (error) {
165
+ state.validationPromise = null;
166
+ throw error;
167
+ }
168
+ })();
169
+ return state.validationPromise;
170
+ }
171
+ /**
172
+ * Runs a Python script with the specified method and arguments.
173
+ *
174
+ * @param scriptPath - The path to the Python script to run.
175
+ * @param method - The name of the method to call in the Python script.
176
+ * @param args - An array of arguments to pass to the Python script.
177
+ * @param options - Optional settings for running the Python script.
178
+ * @param options.pythonExecutable - Optional path to the Python executable.
179
+ * @returns A promise that resolves to the output of the Python script.
180
+ * @throws An error if there's an issue running the Python script or parsing its output.
181
+ */
182
+ async function runPython(scriptPath, method, args, options = {}) {
183
+ const absPath = path.resolve(scriptPath);
184
+ const tempJsonPath = path.join(os.tmpdir(), `promptfoo-python-input-json-${Date.now()}-${Math.random().toString(16).slice(2)}.json`);
185
+ const outputPath = path.join(os.tmpdir(), `promptfoo-python-output-json-${Date.now()}-${Math.random().toString(16).slice(2)}.json`);
186
+ const customPath = getConfiguredPythonPath(options.pythonExecutable);
187
+ let pythonPath = customPath || "python";
188
+ pythonPath = await validatePythonPath(pythonPath, typeof customPath === "string");
189
+ const pythonOptions = {
190
+ args: [
191
+ absPath,
192
+ method,
193
+ tempJsonPath,
194
+ outputPath
195
+ ],
196
+ env: process.env,
197
+ mode: "binary",
198
+ pythonPath,
199
+ scriptPath: getWrapperDir("python"),
200
+ ...getEnvBool("PROMPTFOO_PYTHON_DEBUG_ENABLED") && { stdio: "inherit" }
201
+ };
202
+ try {
203
+ fs.writeFileSync(tempJsonPath, safeJsonStringify(args), "utf-8");
204
+ logger.debug(`Running Python wrapper with args: ${safeJsonStringify(args)}`);
205
+ await new Promise((resolve, reject) => {
206
+ try {
207
+ const pyshell = new PythonShell("wrapper.py", pythonOptions);
208
+ pyshell.stdout?.on("data", (chunk) => {
209
+ logger.debug(chunk.toString("utf-8").trim());
210
+ });
211
+ pyshell.stderr?.on("data", (chunk) => {
212
+ logger.error(chunk.toString("utf-8").trim());
213
+ });
214
+ pyshell.end((err) => {
215
+ if (err) reject(err);
216
+ else resolve();
217
+ });
218
+ } catch (error) {
219
+ reject(error);
220
+ }
221
+ });
222
+ const output = fs.readFileSync(outputPath, "utf-8");
223
+ logger.debug(`Python script ${absPath} returned: ${output}`);
224
+ let result;
225
+ try {
226
+ result = JSON.parse(output);
227
+ logger.debug(`Python script ${absPath} parsed output type: ${typeof result}, structure: ${result ? JSON.stringify(Object.keys(result)) : "undefined"}`);
228
+ } catch (error) {
229
+ throw new Error(`Invalid JSON: ${error.message} when parsing result: ${output}\nStack Trace: ${error.stack}`);
230
+ }
231
+ if (result?.type !== "final_result") throw new Error("The Python script `call_api` function must return a dict with an `output`");
232
+ return result.data;
233
+ } catch (error) {
234
+ logger.error(`Error running Python script: ${error.message}\nStack Trace: ${error.stack?.replace("--- Python Traceback ---", "Python Traceback: ") || "No Python traceback available"}`);
235
+ throw new Error(`Error running Python script: ${error.message}\nStack Trace: ${error.stack?.replace("--- Python Traceback ---", "Python Traceback: ") || "No Python traceback available"}`);
236
+ } finally {
237
+ [tempJsonPath, outputPath].forEach((file) => {
238
+ try {
239
+ fs.unlinkSync(file);
240
+ } catch (error) {
241
+ logger.error(`Error removing ${file}: ${error}`);
242
+ }
243
+ });
244
+ }
245
+ }
246
+ //#endregion
247
+ export { validatePythonPath as i, getEnvInt as n, runPython as r, getConfiguredPythonPath as t };
248
+
249
+ //# sourceMappingURL=pythonUtils-D6fwaDSg.js.map
@@ -0,0 +1,213 @@
1
+ import { b as getEnvString, i as logger } from "./logger-DLcq4dWf.js";
2
+ import { p as REQUEST_TIMEOUT_MS, t as fetchWithProxy } from "./fetch-4M3YRaqL.js";
3
+ import { r as fetchWithCache } from "./cache-D3eqDYGU.js";
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 || 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
+ 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 fetchWithCache(this.getApiUrl(), {
71
+ method: "POST",
72
+ headers: this.getHeaders(),
73
+ body: JSON.stringify(body)
74
+ }, 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(), REQUEST_TIMEOUT_MS);
92
+ let reader;
93
+ try {
94
+ lastResp = await 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
+ 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
+ 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
+ export { createQuiverAiProvider };
212
+
213
+ //# sourceMappingURL=quiverai-C2jVwbH1.js.map
@@ -0,0 +1,213 @@
1
+ import { b as getEnvString, i as logger } from "./logger-CT3IKMKA.js";
2
+ import { p as REQUEST_TIMEOUT_MS, t as fetchWithProxy } from "./fetch-60Gzydls.js";
3
+ import { r as fetchWithCache } from "./cache-8XhNqPKW.js";
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 || 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
+ 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 fetchWithCache(this.getApiUrl(), {
71
+ method: "POST",
72
+ headers: this.getHeaders(),
73
+ body: JSON.stringify(body)
74
+ }, 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(), REQUEST_TIMEOUT_MS);
92
+ let reader;
93
+ try {
94
+ lastResp = await 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
+ 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
+ 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
+ export { createQuiverAiProvider };
212
+
213
+ //# sourceMappingURL=quiverai-CI6gYJVI.js.map