promptfoo 0.121.10 → 0.121.11

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 (323) hide show
  1. package/dist/src/{accounts-D4iTShVh.js → accounts-BGs8AMhG.js} +4 -4
  2. package/dist/src/{accounts-ECb2xAYn.js → accounts-BjCiVnil.js} +4 -4
  3. package/dist/src/{accounts-DbmMSaOW.js → accounts-C06-4dXo.js} +5 -5
  4. package/dist/src/{accounts-5Sf1PCNo.cjs → accounts-C6NiTdum.cjs} +4 -4
  5. package/dist/src/{agentic-utils-DxzgjGfK.js → agentic-utils-B5IO5YR-.js} +2 -2
  6. package/dist/src/{agentic-utils-eGLKHNlT.cjs → agentic-utils-BDKz7KHx.cjs} +2 -2
  7. package/dist/src/{agentic-utils-CLrqlGZc.js → agentic-utils-Bj9P7suD.js} +2 -2
  8. package/dist/src/{agentic-utils-jiE8RROB.js → agentic-utils-kgc1YTAx.js} +2 -2
  9. package/dist/src/{agents-CI9ETpr0.js → agents-BMcjQUHA.js} +2 -2
  10. package/dist/src/{agents-B0gmhYyj.js → agents-CyHaf9xC.js} +2 -2
  11. package/dist/src/{agents-Dl4uviKE.cjs → agents-DOhrSQhK.cjs} +4 -4
  12. package/dist/src/{agents-CK9Kxnix.js → agents-DT1nSZix.js} +4 -4
  13. package/dist/src/{agents-6d6pdEFT.js → agents-DgakfoxG.js} +4 -4
  14. package/dist/src/{agents-C5zoy2ZS.js → agents-VKHVNG4J.js} +2 -2
  15. package/dist/src/{agents-Br5HYLBT.cjs → agents-zYAXB2ja.cjs} +2 -2
  16. package/dist/src/{agents-CvL6W9kz.js → agents-zzIht0lm.js} +4 -4
  17. package/dist/src/{aimlapi-DGCN4rpi.cjs → aimlapi-Bv6rnE4W.cjs} +6 -6
  18. package/dist/src/{aimlapi-BonWl7zl.js → aimlapi-C05Ca41Z.js} +6 -6
  19. package/dist/src/{aimlapi-NJzALFkC.js → aimlapi-CLaCvZn8.js} +6 -6
  20. package/dist/src/{aimlapi-UwsBeqRG.js → aimlapi-DW7KNdkd.js} +6 -6
  21. package/dist/src/app/app/tsconfig.app.tsbuildinfo +1 -1
  22. package/dist/src/app/assets/Report-BgwGPDAJ.js +1 -0
  23. package/dist/src/app/assets/index-CBwcpPdR.js +413 -0
  24. package/dist/src/app/assets/index-ZYpt1xFX.css +1 -0
  25. package/dist/src/app/index.html +2 -2
  26. package/dist/src/{audio-yUZrS0JJ.js → audio-Cd92j4tr.js} +3 -3
  27. package/dist/src/{audio-9N6nZqw9.js → audio-De3snmla.js} +3 -3
  28. package/dist/src/{audio-DBqadfGk.js → audio-Dh44iWq7.js} +3 -3
  29. package/dist/src/{audio-BR4j1oG1.cjs → audio-MqvGQVvP.cjs} +3 -3
  30. package/dist/src/{authoritativeMarkupInjection-2C63bFKe.cjs → authoritativeMarkupInjection-BAuWkXwn.cjs} +5 -5
  31. package/dist/src/{authoritativeMarkupInjection-B2MJXBR1.js → authoritativeMarkupInjection-CDCg-jRQ.js} +4 -4
  32. package/dist/src/{authoritativeMarkupInjection-CE4HOCHa.js → authoritativeMarkupInjection-COd4q9Hp.js} +5 -5
  33. package/dist/src/{authoritativeMarkupInjection-DrBqZVP1.js → authoritativeMarkupInjection-D5oKM43M.js} +5 -5
  34. package/dist/src/{base-tmVReihS.js → base-B8G9Ob46.js} +2 -2
  35. package/dist/src/{base-6Aaed910.js → base-CzDq5YwX.js} +2 -2
  36. package/dist/src/{base-S8I8vPVY.js → base-DqNtZTrF.js} +2 -2
  37. package/dist/src/{base-BS60m8JA.cjs → base-OeMKpFIB.cjs} +2 -2
  38. package/dist/src/{bestOfN-BkH9d3Lr.js → bestOfN-B89i9zc7.js} +6 -6
  39. package/dist/src/{bestOfN-C1_WFZFb.js → bestOfN-BEfIajMY.js} +5 -5
  40. package/dist/src/{bestOfN-DfRpoheE.js → bestOfN-Czr-c62W.js} +6 -6
  41. package/dist/src/{bestOfN-b6uHssUC.cjs → bestOfN-QWGyCB5j.cjs} +6 -6
  42. package/dist/src/{billing-DwpSQ_4i.js → billing-BhghtFas.js} +2 -2
  43. package/dist/src/{billing-CAB1s36q.js → billing-BkQJKKdm.js} +2 -2
  44. package/dist/src/{billing-Dn9Gm2tN.cjs → billing-Co_1rjfG.cjs} +2 -2
  45. package/dist/src/{billing-DimGp80i.js → billing-MY86Oqwg.js} +2 -2
  46. package/dist/src/{blobs-7T2OXYkC.js → blobs-B8d9jKvz.js} +2 -2
  47. package/dist/src/{blobs-CqhgM_fa.js → blobs-BTzPmpq-.js} +2 -2
  48. package/dist/src/{blobs-DQ6pIlJQ.cjs → blobs-BcpoigIU.cjs} +7 -1
  49. package/dist/src/{blobs-Dxfq3woN.js → blobs-DQ4bXN5O.js} +2 -2
  50. package/dist/src/{cache-DgKlV56y.js → cache-BEZBHFxd.js} +2 -2
  51. package/dist/src/cache-Cqg9f4d4.js +3 -0
  52. package/dist/src/{cache-CmidsPv2.js → cache-D2MfIrzr.js} +3 -3
  53. package/dist/src/{cache-B-fzj_aE.cjs → cache-DWEZYdJG.cjs} +2 -2
  54. package/dist/src/{cache-Z4cklSHj.js → cache-WT_2CYA-.js} +2 -2
  55. package/dist/src/{chat-uLo5fkVu.js → chat-C9yx5XD4.js} +2 -2
  56. package/dist/src/{chat-VVJW_GJC.js → chat-CuPbIKVa.js} +2 -2
  57. package/dist/src/{chat-BWdNGktf.js → chat-DBG4VxM7.js} +7 -7
  58. package/dist/src/{chat-CrOCT2BA.js → chat-Dwfr4jHi.js} +2 -2
  59. package/dist/src/{chat-BE0BP7oZ.js → chat-FNWhaysj.js} +7 -7
  60. package/dist/src/{chat-CvN2w9fY.js → chat-PfM8xgFA.js} +7 -7
  61. package/dist/src/{chat-CpFzezkO.cjs → chat-XVIowajy.cjs} +7 -7
  62. package/dist/src/{chat-DAkk46Lf.cjs → chat-sZgq1_-v.cjs} +2 -2
  63. package/dist/src/{claude-agent-sdk-CocknPbL.js → claude-agent-sdk-B0AZ38ny.js} +4 -4
  64. package/dist/src/{claude-agent-sdk-BH0L9H8Y.js → claude-agent-sdk-BfYAjuTk.js} +4 -4
  65. package/dist/src/{claude-agent-sdk-DxyDxejT.cjs → claude-agent-sdk-CklMerFa.cjs} +4 -4
  66. package/dist/src/{claude-agent-sdk-Bh0MH9Z9.js → claude-agent-sdk-DTFpCefB.js} +4 -4
  67. package/dist/src/cloud-BNr2N1RY.js +3 -0
  68. package/dist/src/{cloud-DJB9yPQB.js → cloud-DKKGeJBV.js} +2 -2
  69. package/dist/src/{cloudflare-ai-DeUFFMJE.cjs → cloudflare-ai-C7pMPgpc.cjs} +4 -4
  70. package/dist/src/{cloudflare-ai-Bg1wwMId.js → cloudflare-ai-Cqz_3WD2.js} +4 -4
  71. package/dist/src/{cloudflare-ai-CpbxtQGT.js → cloudflare-ai-CuUCQanF.js} +4 -4
  72. package/dist/src/{cloudflare-ai-B2Sjijq0.js → cloudflare-ai-lAgV52qE.js} +4 -4
  73. package/dist/src/{cloudflare-gateway-DKsO0VKU.js → cloudflare-gateway-8T5x83eI.js} +3 -3
  74. package/dist/src/{cloudflare-gateway-CvQV6nA1.js → cloudflare-gateway-Bq7SdErk.js} +3 -3
  75. package/dist/src/{cloudflare-gateway-BwdJezUO.js → cloudflare-gateway-moRfeZJJ.js} +3 -3
  76. package/dist/src/{cloudflare-gateway-cBHiORfX.cjs → cloudflare-gateway-peUrx9oi.cjs} +3 -3
  77. package/dist/src/{codex-app-server-BHVKRhkY.js → codex-app-server-BvPHEwJg.js} +5 -5
  78. package/dist/src/{codex-app-server-CojV6u3_.js → codex-app-server-DBTBsZ1t.js} +5 -5
  79. package/dist/src/{codex-app-server-B471dabg.cjs → codex-app-server-Dwl3iupA.cjs} +5 -5
  80. package/dist/src/{codex-app-server-DF2PMuc1.js → codex-app-server-t-QoeeGd.js} +5 -5
  81. package/dist/src/{codex-sdk-Bj4uY6sS.js → codex-sdk-C4FTldKU.js} +4 -4
  82. package/dist/src/{codex-sdk-D4JF0nj6.js → codex-sdk-C4aieKza.js} +4 -4
  83. package/dist/src/codex-sdk-CTD1qSKx.js +3 -0
  84. package/dist/src/{codex-sdk-aezPvTAB.js → codex-sdk-CnSzlhih.js} +4 -4
  85. package/dist/src/{codex-sdk-C9c-416d.cjs → codex-sdk-bWIQVOBL.cjs} +4 -4
  86. package/dist/src/{cometapi-CgaDmO4i.js → cometapi-B0mQIIzf.js} +7 -7
  87. package/dist/src/{cometapi-BlBmHq7-.js → cometapi-CFrYNMs5.js} +7 -7
  88. package/dist/src/{cometapi-mtyRjerU.js → cometapi-CMnFU1wL.js} +7 -7
  89. package/dist/src/{cometapi-D8sWSnb1.cjs → cometapi-D2thnPaL.cjs} +7 -7
  90. package/dist/src/{completion-RkFAOVSF.js → completion-B0yVZF3v.js} +5 -5
  91. package/dist/src/{completion-CHnFmpnp.js → completion-Dz36rtPd.js} +5 -5
  92. package/dist/src/{completion-Di0-4tYi.cjs → completion-Ny3XQpqx.cjs} +5 -5
  93. package/dist/src/{completion-Bd8G9VHW.js → completion-sMpCTaBm.js} +5 -5
  94. package/dist/src/{crescendo-C8YuBd9K.js → crescendo-BpVWWleP.js} +11 -11
  95. package/dist/src/{crescendo-TWgp7uGp.cjs → crescendo-CqQhmeC0.cjs} +13 -13
  96. package/dist/src/{crescendo-BgGio6G0.js → crescendo-JAvyVRKK.js} +13 -13
  97. package/dist/src/{crescendo-BQ2VI9FD.js → crescendo-RfCMSIM-.js} +13 -13
  98. package/dist/src/{custom-D0p5pikf.cjs → custom-B_fKUq6j.cjs} +11 -11
  99. package/dist/src/{custom-DsSELzzx.js → custom-Bm6Tu-ji.js} +11 -11
  100. package/dist/src/{custom-CFnjgHKp.js → custom-LxkvkOvG.js} +9 -9
  101. package/dist/src/{custom-CSaH4Qj9.js → custom-jLsK8Wf9.js} +11 -11
  102. package/dist/src/{docker-ByT3LmHN.js → docker-B60virtZ.js} +5 -5
  103. package/dist/src/{docker-BRA5ruGU.cjs → docker-D_f3qyDE.cjs} +5 -5
  104. package/dist/src/{docker-CVY-oMv4.js → docker-DogRc30z.js} +5 -5
  105. package/dist/src/{docker-DIxhfwlx.js → docker-wwQ1pPGy.js} +5 -5
  106. package/dist/src/{embedding-BpX-WENP.js → embedding-BMe9ZgQF.js} +5 -5
  107. package/dist/src/{embedding-B_0mJpXs.cjs → embedding-ClHIOEld.cjs} +5 -5
  108. package/dist/src/{embedding-LplgjBJ0.js → embedding-Dy2o5RFQ.js} +5 -5
  109. package/dist/src/{embedding-CCbgRo4z.js → embedding-HXOpA992.js} +5 -5
  110. package/dist/src/{eval-BXF3bRvV.js → eval-BLgDYWPd.js} +4 -4
  111. package/dist/src/{eval-BcM9YiOW.js → eval-DbGugzR8.js} +1 -1
  112. package/dist/src/evalResult-B6Jpy3kJ.js +3 -0
  113. package/dist/src/{evalResult-C8MROHS8.js → evalResult-BWE17Tqm.js} +3 -3
  114. package/dist/src/{evalResult-CIxAdUVQ.cjs → evalResult-DDohNAHL.cjs} +3 -3
  115. package/dist/src/{evalResult-DaACTv0f.js → evalResult-DOh0QQix.js} +3 -3
  116. package/dist/src/evaluator-CTl-lKuh.js +3 -0
  117. package/dist/src/{evaluator-C_gCkBe3.js → evaluator-DbOsHSRe.js} +212 -21
  118. package/dist/src/{evaluatorHelpers-BVvi8tWH.cjs → evaluatorHelpers-CaaC50RB.cjs} +4 -4
  119. package/dist/src/{evaluatorHelpers-C6-aKnJe.js → evaluatorHelpers-CoLW5rKU.js} +4 -4
  120. package/dist/src/{evaluatorHelpers-RQo-m90b.js → evaluatorHelpers-DTtYkrGO.js} +4 -4
  121. package/dist/src/{extractor-B1hELWwJ.js → extractor-BIqe0lMN.js} +70 -12
  122. package/dist/src/{extractor-_E41W0Fl.cjs → extractor-CUVurbDW.cjs} +71 -12
  123. package/dist/src/{extractor-DV6WBfAi.js → extractor-DOhjGS0m.js} +70 -12
  124. package/dist/src/{extractor-ItsKh8lH.js → extractor-h1HS9f6y.js} +70 -12
  125. package/dist/src/{fetch-BBa1Lxgp.js → fetch-B1Rb0VdL.js} +3 -3
  126. package/dist/src/{fetch-BtdsABrj.js → fetch-BErWGTUY.js} +2 -2
  127. package/dist/src/{fetch-CFIU30wy.js → fetch-BNUDixbE.js} +2 -2
  128. package/dist/src/{fetch-OePjzUmA.cjs → fetch-C7yU9CNr.cjs} +2 -2
  129. package/dist/src/fetch-DVj4dF4V.js +3 -0
  130. package/dist/src/{goat-kpeOOE-K.js → goat-BnB1zGir.js} +13 -13
  131. package/dist/src/{goat-Coh2te0S.cjs → goat-C1RkjWv1.cjs} +13 -13
  132. package/dist/src/{goat-BCFeW4zk.js → goat-CNpA_tT8.js} +11 -11
  133. package/dist/src/{goat-Dr2YGfiG.js → goat-ZRARvAD5.js} +13 -13
  134. package/dist/src/graders-CA3QVnK3.js +3 -0
  135. package/dist/src/{graders-BrLOEmxX.js → graders-CO5drf0x.js} +17 -17
  136. package/dist/src/{graders-DEz7EeRy.js → graders-CpUlNVnh.js} +17 -17
  137. package/dist/src/{graders-CY4Ft8A9.js → graders-Z5qzvpuI.js} +17 -17
  138. package/dist/src/{graders-CCrX0NG3.cjs → graders-t_K-nZ_X.cjs} +17 -17
  139. package/dist/src/{hydra-C90CylNi.js → hydra-BMb0WtZA.js} +13 -13
  140. package/dist/src/{hydra-dOBPmWHt.js → hydra-BXmf4FCK.js} +11 -11
  141. package/dist/src/{hydra-Cq_3qKz_.js → hydra-C5_Vuh-m.js} +13 -13
  142. package/dist/src/{hydra-B524i6K6.cjs → hydra-c1_7vPsg.cjs} +13 -13
  143. package/dist/src/{image-DBnzfeuJ.cjs → image-BhHFD4Vb.cjs} +3 -3
  144. package/dist/src/{image-CvhTr1GY.cjs → image-CYFea400.cjs} +5 -5
  145. package/dist/src/{image-CHJ-KjNE.js → image-CgkOODNn.js} +5 -5
  146. package/dist/src/{image-_-h6GCQ7.js → image-DGQkq3aK.js} +5 -5
  147. package/dist/src/{image-CkF1ruDX.js → image-DWveOfTz.js} +3 -3
  148. package/dist/src/{image-BmVZRCkS.js → image-DfF12xzt.js} +5 -5
  149. package/dist/src/{image-B6P9JAV2.js → image-DkSUFfLd.js} +3 -3
  150. package/dist/src/{image-CD22vXth.js → image-nYwdqnax.js} +3 -3
  151. package/dist/src/index.cjs +218 -26
  152. package/dist/src/index.js +216 -26
  153. package/dist/src/{indirectWebPwn-BgIfQ2ON.js → indirectWebPwn-BajQ_evT.js} +5 -5
  154. package/dist/src/{indirectWebPwn-A16xYmav.js → indirectWebPwn-BbFMiv79.js} +4 -4
  155. package/dist/src/{indirectWebPwn-BRhR4Dk9.js → indirectWebPwn-BnrxhAAL.js} +4 -4
  156. package/dist/src/{indirectWebPwn-Bfp-t224.cjs → indirectWebPwn-BqOgtzny.cjs} +5 -5
  157. package/dist/src/{indirectWebPwn-8G6tgDBW.js → indirectWebPwn-C6_BaxjA.js} +5 -5
  158. package/dist/src/{indirectWebPwn-BWGexuih.js → indirectWebPwn-C779yDi6.js} +4 -4
  159. package/dist/src/{indirectWebPwn-DcKDbCn_.cjs → indirectWebPwn-CDo9rC06.cjs} +4 -4
  160. package/dist/src/{indirectWebPwn-CZ2kTy4r.js → indirectWebPwn-k8D0JacN.js} +5 -5
  161. package/dist/src/{iterative-BIHF31Io.js → iterative-BzKNkXHn.js} +13 -13
  162. package/dist/src/{iterative-XRfxQ0i8.cjs → iterative-CD3I_Rwq.cjs} +13 -13
  163. package/dist/src/{iterative-CZPHLUKZ.js → iterative-DL8iDwrE.js} +13 -13
  164. package/dist/src/{iterative-DZkNlFE-.js → iterative-DyEoFedI.js} +11 -11
  165. package/dist/src/{iterativeImage-BFRM8Jdx.js → iterativeImage-B7qV6kzP.js} +4 -4
  166. package/dist/src/{iterativeImage-DJtVKlFX.cjs → iterativeImage-BaOAhF-S.cjs} +5 -5
  167. package/dist/src/{iterativeImage-7WjhjpHE.js → iterativeImage-D85THuYb.js} +5 -5
  168. package/dist/src/{iterativeImage-CbRn9_MH.js → iterativeImage-noXhuElt.js} +5 -5
  169. package/dist/src/{iterativeMeta-2gyieWbU.js → iterativeMeta-BHNJgPy0.js} +12 -12
  170. package/dist/src/{iterativeMeta-dkFD9UKg.cjs → iterativeMeta-BQrhQ-iJ.cjs} +12 -12
  171. package/dist/src/{iterativeMeta-Bh2AQq8Y.js → iterativeMeta-CAN36NIN.js} +12 -12
  172. package/dist/src/{iterativeMeta-CmMnD77T.js → iterativeMeta-CnPYPYH0.js} +10 -10
  173. package/dist/src/{iterativeTree-DuIk7wjS.js → iterativeTree-B7116aK-.js} +10 -10
  174. package/dist/src/{iterativeTree-bjH__9en.js → iterativeTree-DdXSpkqE.js} +12 -12
  175. package/dist/src/{iterativeTree-DSNss1kE.js → iterativeTree-cKlxQWhi.js} +12 -12
  176. package/dist/src/{iterativeTree-DoE-8nC3.cjs → iterativeTree-u2hKQ51y.cjs} +12 -12
  177. package/dist/src/{knowledgeBase-kyTJpbr0.js → knowledgeBase-D9xW79dS.js} +4 -4
  178. package/dist/src/{knowledgeBase-CQasebQt.js → knowledgeBase-DfwVbdwp.js} +4 -4
  179. package/dist/src/{knowledgeBase-DebHrXhD.cjs → knowledgeBase-DhT8uaMH.cjs} +4 -4
  180. package/dist/src/{knowledgeBase-mzMh6UZt.js → knowledgeBase-DlH6NRlX.js} +4 -4
  181. package/dist/src/{litellm-wSD4Q6-H.cjs → litellm-BA2Fti7H.cjs} +4 -4
  182. package/dist/src/{litellm-BJFH4uKd.js → litellm-CHybAu4l.js} +4 -4
  183. package/dist/src/{litellm-A2eV_lM0.js → litellm-Cn_zDWeA.js} +4 -4
  184. package/dist/src/{litellm-CeJEe_jQ.js → litellm-CnqX4jfm.js} +4 -4
  185. package/dist/src/{luma-ray-DpuaR6Wa.js → luma-ray-C_AWu7K6.js} +4 -4
  186. package/dist/src/{luma-ray-B0GNCw6S.js → luma-ray-CbFOvJZw.js} +4 -4
  187. package/dist/src/{luma-ray-qBfU-mGO.cjs → luma-ray-D7hDEZaC.cjs} +4 -4
  188. package/dist/src/{luma-ray-CM6bvN4t.js → luma-ray-RQAhTNvK.js} +4 -4
  189. package/dist/src/main.js +27 -27
  190. package/dist/src/{memoryPoisoning-9mIgiE3F.cjs → memoryPoisoning-A8N_cbrW.cjs} +5 -5
  191. package/dist/src/{memoryPoisoning-BYBQ1Ns5.js → memoryPoisoning-BGe4fuFU.js} +5 -5
  192. package/dist/src/{memoryPoisoning-SvtQxFjF.js → memoryPoisoning-DDfIRZnk.js} +5 -5
  193. package/dist/src/{memoryPoisoning-D4iqi_nT.js → memoryPoisoning-DtJ5vYZW.js} +5 -5
  194. package/dist/src/{messages-BofXErqC.js → messages-BH83TS-n.js} +7 -7
  195. package/dist/src/{messages-DxzhBs74.js → messages-aXox3d04.js} +7 -7
  196. package/dist/src/{messages-CHZtL-k0.cjs → messages-qapmFqOQ.cjs} +7 -7
  197. package/dist/src/{messages-BKTseD_x.js → messages-yVMPGJ4n.js} +7 -7
  198. package/dist/src/{mischievousUser-D23wQ8f0.js → mischievousUser-BPDyepmu.js} +5 -5
  199. package/dist/src/{mischievousUser-DX1gGvUB.js → mischievousUser-D1mbddId.js} +5 -5
  200. package/dist/src/{mischievousUser-ECTv-u4g.cjs → mischievousUser-DHYVKotH.cjs} +5 -5
  201. package/dist/src/{mischievousUser-B5oT1xjM.js → mischievousUser-D_8tmPfA.js} +5 -5
  202. package/dist/src/{modelslab-D5vwtIYR.js → modelslab-BwywPRoU.js} +5 -5
  203. package/dist/src/{modelslab-DE9CfYYT.js → modelslab-Cc6fn99l.js} +5 -5
  204. package/dist/src/{modelslab-CVkeR8mC.cjs → modelslab-D2F3FtnI.cjs} +5 -5
  205. package/dist/src/{modelslab-BU_qCK1m.js → modelslab-D_izTsvD.js} +5 -5
  206. package/dist/src/{nova-reel-BSM7U8Bp.js → nova-reel-B1Jg1XBk.js} +4 -4
  207. package/dist/src/{nova-reel-BKAkU37Y.js → nova-reel-CZeHbWUe.js} +4 -4
  208. package/dist/src/{nova-reel-BvWH15rr.cjs → nova-reel-CcWrhmGJ.cjs} +4 -4
  209. package/dist/src/{nova-reel-D2tla7dy.js → nova-reel-DFrk1Ey2.js} +4 -4
  210. package/dist/src/{nova-sonic-DU7_krhB.js → nova-sonic-4wwR0tZJ.js} +2 -2
  211. package/dist/src/{nova-sonic-C7CNjG9n.cjs → nova-sonic-BqRQ9CWO.cjs} +2 -2
  212. package/dist/src/{nova-sonic-BQkU8weK.js → nova-sonic-D-IJHou2.js} +2 -2
  213. package/dist/src/{nova-sonic-B8PB4mU2.js → nova-sonic-DJUXNWUJ.js} +2 -2
  214. package/dist/src/{openclaw-CLNjF8ox.js → openclaw-5U8yiy9P.js} +5 -5
  215. package/dist/src/{openclaw-laZmy-8p.cjs → openclaw-B0vjRb3y.cjs} +5 -5
  216. package/dist/src/{openclaw-Gl2a1gR3.js → openclaw-C8xQtncQ.js} +5 -5
  217. package/dist/src/{openclaw-D5yEpk1f.js → openclaw-CqZoWsh0.js} +5 -5
  218. package/dist/src/{opencode-sdk-CGPqE4m0.js → opencode-sdk-B2qz1kCI.js} +2 -2
  219. package/dist/src/{opencode-sdk-5XXP3gNb.js → opencode-sdk-BGO1zuPF.js} +2 -2
  220. package/dist/src/{opencode-sdk-C7mIxApB.cjs → opencode-sdk-Bk9G3WGQ.cjs} +2 -2
  221. package/dist/src/{opencode-sdk-E1fh3vlz.js → opencode-sdk-NhbhYcsR.js} +2 -2
  222. package/dist/src/{promptfoo-C4g2Lx9t.js → promptfoo-CkDcgxiW.js} +4 -4
  223. package/dist/src/{promptfoo-DdsPYNm7.js → promptfoo-De6vQq9F.js} +4 -4
  224. package/dist/src/{promptfoo-x112UyE1.js → promptfoo-DhGR7OQn.js} +4 -4
  225. package/dist/src/{promptfoo-B9KuhWM0.cjs → promptfoo-Dtw3i6YK.cjs} +4 -4
  226. package/dist/src/{providers-xrARCHcC.js → providers-BIgLuX4Z.js} +1 -1
  227. package/dist/src/{providers-BZ-QJYop.cjs → providers-CCRHPNv1.cjs} +50 -49
  228. package/dist/src/{providers-DdNIebwz.js → providers-am7xTa5w.js} +51 -50
  229. package/dist/src/{providers-BnjFZtaq.js → providers-gntyGa2T.js} +50 -49
  230. package/dist/src/{providers-D_OinWvd.js → providers-j-ulWCzy.js} +50 -49
  231. package/dist/src/quiverai-CHV12wRE.js +324 -0
  232. package/dist/src/quiverai-CNSyaZhh.js +325 -0
  233. package/dist/src/quiverai-CNfaxZ3K.cjs +324 -0
  234. package/dist/src/quiverai-CzROwhTy.js +324 -0
  235. package/dist/src/{registry-C57trbNM.js → registry-B0pFfEzq.js} +14 -14
  236. package/dist/src/{registry-Bnb9O892.cjs → registry-BH1mZ37j.cjs} +14 -14
  237. package/dist/src/{registry-CmhcDYtj.js → registry-Bvfyz9Xt.js} +14 -14
  238. package/dist/src/{registry-DhaGoOuz.js → registry-Dzut7txg.js} +14 -14
  239. package/dist/src/{remoteGeneration-BlwssRVS.js → remoteGeneration-CW6zHjQx.js} +4 -4
  240. package/dist/src/{remoteGeneration--4NPfyL-.js → remoteGeneration-DuxbIn94.js} +4 -4
  241. package/dist/src/{remoteGeneration-B0K7iojS.cjs → remoteGeneration-oSmtgmBY.cjs} +4 -4
  242. package/dist/src/{remoteGeneration-DiAuGk9s.js → remoteGeneration-wvnQpzN1.js} +4 -4
  243. package/dist/src/{responses-C57h4gaW.js → responses-CI7uikKQ.js} +6 -6
  244. package/dist/src/{responses-B9ygvEC-.cjs → responses-DRLyW4Lj.cjs} +6 -6
  245. package/dist/src/{responses-CXKL6TPn.js → responses-DxFUQTN2.js} +6 -6
  246. package/dist/src/{responses-CTfu1ToN.js → responses-JNrMb3zS.js} +6 -6
  247. package/dist/src/{sagemaker-DHdeSsnJ.js → sagemaker-5AwedTwq.js} +9 -9
  248. package/dist/src/{sagemaker-CHL8TZFs.js → sagemaker-B5yQiSKh.js} +9 -9
  249. package/dist/src/{sagemaker-DdVGF_UD.cjs → sagemaker-C3aoiFup.cjs} +9 -9
  250. package/dist/src/{sagemaker-DUjuHnmj.js → sagemaker-XmAlwYoN.js} +9 -9
  251. package/dist/src/{scanner-BdoS5ILQ.js → scanner-BdEduFjO.js} +5 -5
  252. package/dist/src/server/index.js +214 -24
  253. package/dist/src/{server-B8UpdwtX.cjs → server-B3QXCltR.cjs} +3 -3
  254. package/dist/src/{server-DaonK4kI.js → server-Ctq0NOMp.js} +3 -3
  255. package/dist/src/{server-Ds_P02x6.js → server-D0pdY_yM.js} +4 -4
  256. package/dist/src/{server-CYxCnoVw.js → server-DMCug-jv.js} +4 -4
  257. package/dist/src/server-Ty5m26Vh.js +3 -0
  258. package/dist/src/{shared-BavzGCp0.js → shared-C-G3NQ1-.js} +7 -7
  259. package/dist/src/{shared-D_0FXjLS.js → shared-CnrYC0Dk.js} +7 -7
  260. package/dist/src/{shared-DY3IzJlT.cjs → shared-D3PxrdDh.cjs} +7 -7
  261. package/dist/src/{shared-B3IkjkNV.js → shared-DHDR-oS4.js} +7 -7
  262. package/dist/src/{simulatedUser-CokouWJT.js → simulatedUser-AhNbPm55.js} +5 -5
  263. package/dist/src/{simulatedUser-DNiOb7YE.js → simulatedUser-DV977ZD0.js} +5 -5
  264. package/dist/src/{simulatedUser-BJabLGod.js → simulatedUser-Dq8cpKLQ.js} +5 -5
  265. package/dist/src/{simulatedUser-CPDlAc1R.cjs → simulatedUser-tAjEGnxH.cjs} +5 -5
  266. package/dist/src/{storage-CH8WC1r3.cjs → storage-C8WR4y77.cjs} +3 -3
  267. package/dist/src/{storage-D_qaZpfe.js → storage-CK2YYGUg.js} +3 -3
  268. package/dist/src/{storage-CLyYkZk-.js → storage-Nc_eXGrV.js} +4 -4
  269. package/dist/src/{storage-3dpIy6f2.js → storage-P9MrA5xv.js} +3 -3
  270. package/dist/src/{strategies-2Q_uZxBs.cjs → strategies-B6Y6G9UV.cjs} +8 -8
  271. package/dist/src/{strategies-DVDC487a.js → strategies-CaefFyHy.js} +9 -9
  272. package/dist/src/{strategies-BuIPOuYL.js → strategies-DE3UN_VH.js} +8 -8
  273. package/dist/src/telemetry-Bbd-BlA7.js +3 -0
  274. package/dist/src/{telemetry-Bh3HJU7r.js → telemetry-C7v0I4YX.js} +3 -3
  275. package/dist/src/{telemetry-B-NTbvDj.js → telemetry-CTYOje0d.js} +3 -3
  276. package/dist/src/{telemetry-3fTnWcSU.js → telemetry-CvJEPKK6.js} +3 -3
  277. package/dist/src/{telemetry-Be4rklbJ.cjs → telemetry-hDovhwWp.cjs} +3 -3
  278. package/dist/src/{tracingOptions-CYCHrrQQ.cjs → tracingOptions-DGai7e5l.cjs} +2 -2
  279. package/dist/src/{tracingOptions-CLKNUvF4.js → tracingOptions-DL2vOmYS.js} +2 -2
  280. package/dist/src/{tracingOptions-CZpFCwyr.js → tracingOptions-e_c5TlHv.js} +2 -2
  281. package/dist/src/{tracingOptions-Bi477wlC.js → tracingOptions-xCBDF3nM.js} +2 -2
  282. package/dist/src/{transcription-CtLhhmYq.js → transcription-BCasJfFB.js} +4 -4
  283. package/dist/src/{transcription-BB9i78R3.js → transcription-BLOD9lN7.js} +4 -4
  284. package/dist/src/{transcription-BRd477OO.js → transcription-BOjp5wlV.js} +4 -4
  285. package/dist/src/{transcription-O3Nc-kEc.cjs → transcription-G6JwbB2P.cjs} +4 -4
  286. package/dist/src/{transform-D9nfyIts.cjs → transform-B92noEAU.cjs} +13 -3
  287. package/dist/src/{transform-DmSzMsCP.js → transform-CD9wrP31.js} +8 -4
  288. package/dist/src/{transform-CUPglRUI.js → transform-D7-gzzhD.js} +8 -4
  289. package/dist/src/{transform-CLzSt5fi.js → transform-D8kXC-nB.js} +8 -4
  290. package/dist/src/{util-CnqjxsAd.js → util-BTAyQmdN.js} +2 -2
  291. package/dist/src/{util-Bg-aMimr.js → util-BbMJxgff.js} +3 -3
  292. package/dist/src/{util-mVC_YCag.cjs → util-C62dCLH_.cjs} +3 -3
  293. package/dist/src/{util-16aq4oHW.js → util-CD4LxH5h.js} +4 -4
  294. package/dist/src/{util-CRYfgRHi.js → util-CHCKTSi5.js} +3 -3
  295. package/dist/src/{util-BIYgspDB.js → util-CKQ_tuWG.js} +4 -4
  296. package/dist/src/{util-Bptzcit_.js → util-CVI1oD-n.js} +3 -3
  297. package/dist/src/{util-DHG9r5sC.js → util-CcW4TZSn.js} +2 -2
  298. package/dist/src/{util-DJLHqGS5.js → util-Ci_vm5u1.js} +2 -2
  299. package/dist/src/{util-D9xyoiGG.js → util-CkLsVF3e.js} +3 -3
  300. package/dist/src/{util-BsKq95ai.js → util-CqfcdA-f.js} +3 -3
  301. package/dist/src/{util-tsZfE0-_.js → util-CubC5Tyt.js} +3 -3
  302. package/dist/src/{util-BHfVEhSs.cjs → util-cAY5C8xI.cjs} +3 -3
  303. package/dist/src/{util-DEMRW89M2.cjs → util-jOGJmpWE2.cjs} +4 -4
  304. package/dist/src/{util-CpS555tc2.js → util-s0NU5XTE2.js} +4 -4
  305. package/dist/src/{util-DJFl6JZF.cjs → util-tFLdovkA.cjs} +2 -2
  306. package/dist/tsconfig.tsbuildinfo +1 -1
  307. package/package.json +1 -1
  308. package/dist/src/app/assets/Report-Cx3cN9Nt.js +0 -1
  309. package/dist/src/app/assets/index-D44ihjH5.css +0 -1
  310. package/dist/src/app/assets/index-DzyLrNWM.js +0 -413
  311. package/dist/src/cache-D_D5rsiE.js +0 -3
  312. package/dist/src/cloud-BmVZ8W_3.js +0 -3
  313. package/dist/src/codex-sdk-BTI9Fvnt.js +0 -3
  314. package/dist/src/evalResult-uL1BStGk.js +0 -3
  315. package/dist/src/evaluator-C2YPxWQP.js +0 -3
  316. package/dist/src/fetch-DAe6a2ih.js +0 -3
  317. package/dist/src/graders-BZe_w0E4.js +0 -3
  318. package/dist/src/quiverai-B8a5RqGP.js +0 -213
  319. package/dist/src/quiverai-BoHFg1Vw.js +0 -214
  320. package/dist/src/quiverai-DYyzyVTF.cjs +0 -213
  321. package/dist/src/quiverai-ktAnwSBA.js +0 -213
  322. package/dist/src/server-DY7p-P4-.js +0 -3
  323. package/dist/src/telemetry-BOwRcACl.js +0 -3
@@ -0,0 +1,325 @@
1
+ #!/usr/bin/env node
2
+ import { c as logger, k as getEnvString } from "./logger-DNHkR_3S.js";
3
+ import { E as getRequestTimeoutMs, r as fetchWithProxy } from "./fetch-B1Rb0VdL.js";
4
+ import { r as fetchWithCache } from "./cache-D2MfIrzr.js";
5
+ //#region src/providers/quiverai.ts
6
+ const QUIVERAI_API_BASE_URL = "https://api.quiver.ai/v1";
7
+ const QUIVERAI_DEFAULT_MODEL = "arrow-1.1";
8
+ const SAMPLING_KEYS = [
9
+ "temperature",
10
+ "top_p",
11
+ "presence_penalty",
12
+ "max_output_tokens"
13
+ ];
14
+ const GENERATION_KEYS = ["instructions", "n"];
15
+ const VECTORIZE_KEYS = ["auto_crop", "target_size"];
16
+ const NON_RETRYABLE_429_CODES = new Set(["weekly_limit_exceeded"]);
17
+ const MAX_RETRY_AFTER_MS = 6e4;
18
+ const MAX_RETRIES = 3;
19
+ /**
20
+ * QuiverAI provider for SVG vector graphics.
21
+ *
22
+ * Supports two endpoints:
23
+ * - Text → SVG via `POST /v1/svgs/generations` (mode: 'generation', the default).
24
+ * - Image → SVG via `POST /v1/svgs/vectorizations` (mode: 'vectorize').
25
+ *
26
+ * Streams by default for faster time-to-first-token; set `stream: false`
27
+ * to enable on-disk response caching.
28
+ */
29
+ var QuiverAiProvider = class {
30
+ config;
31
+ modelName;
32
+ mode;
33
+ apiKey;
34
+ apiBaseUrl;
35
+ constructor(modelName, options = {}) {
36
+ const { config, id, env, mode = "generation" } = options;
37
+ this.modelName = modelName;
38
+ this.mode = mode;
39
+ this.apiKey = config?.apiKey || env?.QUIVERAI_API_KEY || getEnvString("QUIVERAI_API_KEY") || "";
40
+ this.apiBaseUrl = config?.apiBaseUrl || QUIVERAI_API_BASE_URL;
41
+ if (id) this.id = () => id;
42
+ this.config = config || {};
43
+ }
44
+ id() {
45
+ return this.mode === "vectorize" ? `quiverai:vectorize:${this.modelName}` : `quiverai:${this.modelName}`;
46
+ }
47
+ toString() {
48
+ return `[QuiverAI ${this.mode === "vectorize" ? "Vectorize " : ""}Provider ${this.modelName}]`;
49
+ }
50
+ getApiUrl() {
51
+ const path = this.mode === "vectorize" ? "/svgs/vectorizations" : "/svgs/generations";
52
+ return `${this.apiBaseUrl}${path}`;
53
+ }
54
+ getHeaders() {
55
+ return {
56
+ "Content-Type": "application/json",
57
+ Authorization: `Bearer ${this.apiKey}`
58
+ };
59
+ }
60
+ async callApi(prompt, context) {
61
+ 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" };
62
+ const config = {
63
+ ...this.config,
64
+ ...context?.prompt?.config
65
+ };
66
+ const useStream = config.stream !== false;
67
+ let body;
68
+ try {
69
+ body = this.buildRequestBody(prompt, config, useStream);
70
+ } catch (error) {
71
+ return { error: `${error.message}` };
72
+ }
73
+ try {
74
+ if (useStream) return await this.callApiStreaming(body);
75
+ return await this.callApiNonStreaming(body, context);
76
+ } catch (error) {
77
+ logger.error(`QuiverAI API call error: ${error}`);
78
+ return { error: `QuiverAI API call error: ${error}` };
79
+ }
80
+ }
81
+ buildRequestBody(prompt, config, useStream) {
82
+ const sampling = pickDefined(config, [...SAMPLING_KEYS]);
83
+ if (this.mode === "vectorize") {
84
+ const image = getConfiguredVectorizeImage(config.image) ?? parsePromptAsImage(prompt);
85
+ return {
86
+ model: this.modelName,
87
+ image,
88
+ stream: useStream,
89
+ ...sampling,
90
+ ...pickDefined(config, [...VECTORIZE_KEYS])
91
+ };
92
+ }
93
+ return {
94
+ model: this.modelName,
95
+ prompt,
96
+ stream: useStream,
97
+ ...sampling,
98
+ ...pickDefined(config, [...GENERATION_KEYS]),
99
+ ...config.references && { references: normalizeReferences(config.references) }
100
+ };
101
+ }
102
+ async callApiNonStreaming(body, context) {
103
+ const { data, cached, status, statusText } = await fetchWithCache(this.getApiUrl(), {
104
+ method: "POST",
105
+ headers: this.getHeaders(),
106
+ body: JSON.stringify(body)
107
+ }, getRequestTimeoutMs(), "json", context?.bustCache ?? context?.debug);
108
+ if (status < 200 || status >= 300) {
109
+ if (data && typeof data === "object" && "code" in data && "message" in data) return { error: formatError(data) };
110
+ return { error: `API error: ${status} ${statusText}\n${typeof data === "string" ? data : JSON.stringify(data)}` };
111
+ }
112
+ const response = data;
113
+ return {
114
+ cached,
115
+ output: extractSvgOutput(response),
116
+ tokenUsage: mapTokenUsage(response.usage, cached ? 0 : 1),
117
+ metadata: buildMetadata({
118
+ responseId: response.id,
119
+ credits: response.credits
120
+ })
121
+ };
122
+ }
123
+ async callApiStreaming(body) {
124
+ let lastResp;
125
+ for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
126
+ const controller = new AbortController();
127
+ const timeout = setTimeout(() => controller.abort(), getRequestTimeoutMs());
128
+ let reader;
129
+ try {
130
+ lastResp = await fetchWithProxy(this.getApiUrl(), {
131
+ method: "POST",
132
+ headers: this.getHeaders(),
133
+ body: JSON.stringify(body),
134
+ signal: controller.signal
135
+ });
136
+ if (lastResp.status === 429 && attempt < MAX_RETRIES && !await isNonRetryable429(lastResp)) {
137
+ const waitMs = getRetryAfterMs(lastResp.headers, attempt);
138
+ logger.debug(`QuiverAI: rate limited, retry ${attempt + 1}/${MAX_RETRIES} in ${waitMs}ms`);
139
+ await lastResp.body?.cancel();
140
+ await new Promise((resolve) => setTimeout(resolve, waitMs));
141
+ continue;
142
+ }
143
+ if (!lastResp.ok) return await handleStreamingError(lastResp);
144
+ if (!lastResp.body) return { error: "QuiverAI streaming response has no body" };
145
+ reader = lastResp.body.getReader();
146
+ return await readSSEStream(reader);
147
+ } finally {
148
+ reader?.cancel().catch(() => {});
149
+ clearTimeout(timeout);
150
+ }
151
+ }
152
+ return handleStreamingError(lastResp);
153
+ }
154
+ };
155
+ async function isNonRetryable429(resp) {
156
+ try {
157
+ const data = await resp.clone().json();
158
+ return typeof data?.code === "string" && NON_RETRYABLE_429_CODES.has(data.code);
159
+ } catch {
160
+ return false;
161
+ }
162
+ }
163
+ async function handleStreamingError(resp) {
164
+ try {
165
+ return { error: formatError(await resp.json()) };
166
+ } catch {
167
+ return { error: `QuiverAI API error: HTTP ${resp.status}` };
168
+ }
169
+ }
170
+ async function readSSEStream(reader) {
171
+ const decoder = new TextDecoder();
172
+ let buffer = "";
173
+ const outputs = /* @__PURE__ */ new Map();
174
+ let totalCredits;
175
+ let lastUsage;
176
+ let responseId;
177
+ const ingest = (line) => {
178
+ const data = parseSSEData(line);
179
+ if (!data) return;
180
+ if (data.type === "content" && typeof data.svg === "string") {
181
+ const key = data.id ?? `${data.index ?? outputs.size}`;
182
+ outputs.set(key, {
183
+ index: data.index ?? outputs.size,
184
+ svg: data.svg,
185
+ credits: data.credits
186
+ });
187
+ if (typeof data.credits === "number") totalCredits = (totalCredits ?? 0) + data.credits;
188
+ if (!responseId && data.id) responseId = data.id;
189
+ }
190
+ if (data.usage) lastUsage = data.usage;
191
+ };
192
+ while (true) {
193
+ const { done, value } = await reader.read();
194
+ if (done) break;
195
+ buffer += decoder.decode(value, { stream: true });
196
+ const lines = buffer.split("\n");
197
+ buffer = lines.pop() || "";
198
+ for (const line of lines) ingest(line);
199
+ }
200
+ if (buffer.trim()) ingest(buffer);
201
+ if (outputs.size === 0) return { error: "QuiverAI streaming response contained no SVG content" };
202
+ const ordered = [...outputs.values()].sort((a, b) => a.index - b.index).map((o) => o.svg);
203
+ return {
204
+ output: ordered.length === 1 ? ordered[0] : ordered.join("\n\n"),
205
+ tokenUsage: mapTokenUsage(lastUsage, 1),
206
+ metadata: buildMetadata({
207
+ responseId,
208
+ credits: totalCredits
209
+ })
210
+ };
211
+ }
212
+ function pickDefined(obj, keys) {
213
+ return Object.fromEntries(keys.filter((k) => obj[k] != null).map((k) => [k, obj[k]]));
214
+ }
215
+ function formatError(err) {
216
+ const base = `${err.message} [${err.code}]`;
217
+ return err.request_id ? `${base} (request_id: ${err.request_id})` : base;
218
+ }
219
+ function mapTokenUsage(usage, numRequests) {
220
+ return {
221
+ total: usage?.total_tokens || 0,
222
+ prompt: usage?.input_tokens || 0,
223
+ completion: usage?.output_tokens || 0,
224
+ numRequests
225
+ };
226
+ }
227
+ function buildMetadata(parts) {
228
+ const meta = {};
229
+ if (parts.responseId) meta.responseId = parts.responseId;
230
+ if (typeof parts.credits === "number") meta.credits = parts.credits;
231
+ return Object.keys(meta).length ? meta : void 0;
232
+ }
233
+ function getRetryAfterMs(headers, attempt) {
234
+ const retryAfter = headers.get("retry-after");
235
+ if (retryAfter) {
236
+ const seconds = Number(retryAfter);
237
+ if (!Number.isNaN(seconds)) return Math.min(seconds * 1e3, MAX_RETRY_AFTER_MS);
238
+ const date = new Date(retryAfter);
239
+ if (!Number.isNaN(date.getTime())) return Math.min(Math.max(0, date.getTime() - Date.now()), MAX_RETRY_AFTER_MS);
240
+ }
241
+ return Math.pow(2, attempt) * 1e3;
242
+ }
243
+ function parseSSEData(line) {
244
+ if (!line.startsWith("data:")) return null;
245
+ const payload = line.slice(line.startsWith("data: ") ? 6 : 5).trim();
246
+ if (!payload || payload === "[DONE]") return null;
247
+ try {
248
+ return JSON.parse(payload);
249
+ } catch {
250
+ logger.debug(`QuiverAI: failed to parse SSE data: ${payload}`);
251
+ return null;
252
+ }
253
+ }
254
+ function extractSvgOutput(response) {
255
+ if (Array.isArray(response.data)) {
256
+ const svgs = response.data.map((item) => item.svg).filter(Boolean);
257
+ if (svgs.length === 1) return svgs[0];
258
+ if (svgs.length > 1) return svgs.join("\n\n");
259
+ }
260
+ return JSON.stringify(response);
261
+ }
262
+ function normalizeReferences(refs) {
263
+ return refs.map((ref) => typeof ref === "string" ? { url: ref } : ref);
264
+ }
265
+ const BASE64_DATA_URL_PATTERN = /^data:image\/[a-zA-Z0-9.+-]+(?:;[^,;]+)*;base64,(.+)$/i;
266
+ function normalizeImageReference(value) {
267
+ if (!value || typeof value !== "object" || Array.isArray(value)) return null;
268
+ const candidate = value;
269
+ if (typeof candidate.url === "string" && candidate.url.trim()) return { url: candidate.url };
270
+ if (typeof candidate.base64 === "string" && candidate.base64.trim()) return { base64: candidate.base64 };
271
+ return null;
272
+ }
273
+ function getConfiguredVectorizeImage(image) {
274
+ if (image === void 0) return;
275
+ const normalized = normalizeImageReference(image);
276
+ if (!normalized) throw new Error("QuiverAI vectorize `image` must contain a non-empty `url` or `base64` string.");
277
+ return normalized;
278
+ }
279
+ function parsePromptAsImage(prompt) {
280
+ const trimmed = prompt.trim();
281
+ if (!trimmed) throw new Error("QuiverAI vectorize requires an image: pass a URL or base64 string as the prompt, or set `image` in the provider config.");
282
+ const dataUrlMatch = BASE64_DATA_URL_PATTERN.exec(trimmed);
283
+ if (dataUrlMatch) return { base64: dataUrlMatch[1] };
284
+ if (/^data:image\//i.test(trimmed)) throw new Error("QuiverAI vectorize data URLs must be base64-encoded.");
285
+ if (/^https?:\/\//i.test(trimmed)) return { url: trimmed };
286
+ if (trimmed.startsWith("{")) {
287
+ let parsed;
288
+ try {
289
+ parsed = JSON.parse(trimmed);
290
+ } catch {
291
+ return { base64: trimmed };
292
+ }
293
+ if (parsed && typeof parsed === "object") {
294
+ const image = normalizeImageReference(parsed);
295
+ if (image) return image;
296
+ if ("image" in parsed) {
297
+ const nestedImage = normalizeImageReference(parsed.image);
298
+ if (nestedImage) return nestedImage;
299
+ throw new Error("QuiverAI vectorize nested `image` must contain a non-empty `url` or `base64` string.");
300
+ }
301
+ throw new Error("QuiverAI vectorize JSON image input must contain a non-empty `url` or `base64` string.");
302
+ }
303
+ }
304
+ return { base64: trimmed };
305
+ }
306
+ function createQuiverAiProvider(providerPath, providerOptions = {}, env) {
307
+ const splits = providerPath.split(":");
308
+ const modelType = splits[1];
309
+ let mode = "generation";
310
+ let modelStart = 1;
311
+ if (modelType === "vectorize") {
312
+ mode = "vectorize";
313
+ modelStart = 2;
314
+ } else if (modelType === "generate" || modelType === "chat") modelStart = 2;
315
+ return new QuiverAiProvider(splits.slice(modelStart).join(":") || QUIVERAI_DEFAULT_MODEL, {
316
+ config: providerOptions.config,
317
+ id: providerOptions.id,
318
+ env: providerOptions.env ?? env,
319
+ mode
320
+ });
321
+ }
322
+ //#endregion
323
+ export { createQuiverAiProvider };
324
+
325
+ //# sourceMappingURL=quiverai-CNSyaZhh.js.map
@@ -0,0 +1,324 @@
1
+ const require_logger = require("./logger-DPITYeiW.cjs");
2
+ const require_fetch = require("./fetch-C7yU9CNr.cjs");
3
+ const require_cache = require("./cache-DWEZYdJG.cjs");
4
+ //#region src/providers/quiverai.ts
5
+ const QUIVERAI_API_BASE_URL = "https://api.quiver.ai/v1";
6
+ const QUIVERAI_DEFAULT_MODEL = "arrow-1.1";
7
+ const SAMPLING_KEYS = [
8
+ "temperature",
9
+ "top_p",
10
+ "presence_penalty",
11
+ "max_output_tokens"
12
+ ];
13
+ const GENERATION_KEYS = ["instructions", "n"];
14
+ const VECTORIZE_KEYS = ["auto_crop", "target_size"];
15
+ const NON_RETRYABLE_429_CODES = new Set(["weekly_limit_exceeded"]);
16
+ const MAX_RETRY_AFTER_MS = 6e4;
17
+ const MAX_RETRIES = 3;
18
+ /**
19
+ * QuiverAI provider for SVG vector graphics.
20
+ *
21
+ * Supports two endpoints:
22
+ * - Text → SVG via `POST /v1/svgs/generations` (mode: 'generation', the default).
23
+ * - Image → SVG via `POST /v1/svgs/vectorizations` (mode: 'vectorize').
24
+ *
25
+ * Streams by default for faster time-to-first-token; set `stream: false`
26
+ * to enable on-disk response caching.
27
+ */
28
+ var QuiverAiProvider = class {
29
+ config;
30
+ modelName;
31
+ mode;
32
+ apiKey;
33
+ apiBaseUrl;
34
+ constructor(modelName, options = {}) {
35
+ const { config, id, env, mode = "generation" } = options;
36
+ this.modelName = modelName;
37
+ this.mode = mode;
38
+ this.apiKey = config?.apiKey || env?.QUIVERAI_API_KEY || require_logger.getEnvString("QUIVERAI_API_KEY") || "";
39
+ this.apiBaseUrl = config?.apiBaseUrl || QUIVERAI_API_BASE_URL;
40
+ if (id) this.id = () => id;
41
+ this.config = config || {};
42
+ }
43
+ id() {
44
+ return this.mode === "vectorize" ? `quiverai:vectorize:${this.modelName}` : `quiverai:${this.modelName}`;
45
+ }
46
+ toString() {
47
+ return `[QuiverAI ${this.mode === "vectorize" ? "Vectorize " : ""}Provider ${this.modelName}]`;
48
+ }
49
+ getApiUrl() {
50
+ const path = this.mode === "vectorize" ? "/svgs/vectorizations" : "/svgs/generations";
51
+ return `${this.apiBaseUrl}${path}`;
52
+ }
53
+ getHeaders() {
54
+ return {
55
+ "Content-Type": "application/json",
56
+ Authorization: `Bearer ${this.apiKey}`
57
+ };
58
+ }
59
+ async callApi(prompt, context) {
60
+ 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" };
61
+ const config = {
62
+ ...this.config,
63
+ ...context?.prompt?.config
64
+ };
65
+ const useStream = config.stream !== false;
66
+ let body;
67
+ try {
68
+ body = this.buildRequestBody(prompt, config, useStream);
69
+ } catch (error) {
70
+ return { error: `${error.message}` };
71
+ }
72
+ try {
73
+ if (useStream) return await this.callApiStreaming(body);
74
+ return await this.callApiNonStreaming(body, context);
75
+ } catch (error) {
76
+ require_logger.logger.error(`QuiverAI API call error: ${error}`);
77
+ return { error: `QuiverAI API call error: ${error}` };
78
+ }
79
+ }
80
+ buildRequestBody(prompt, config, useStream) {
81
+ const sampling = pickDefined(config, [...SAMPLING_KEYS]);
82
+ if (this.mode === "vectorize") {
83
+ const image = getConfiguredVectorizeImage(config.image) ?? parsePromptAsImage(prompt);
84
+ return {
85
+ model: this.modelName,
86
+ image,
87
+ stream: useStream,
88
+ ...sampling,
89
+ ...pickDefined(config, [...VECTORIZE_KEYS])
90
+ };
91
+ }
92
+ return {
93
+ model: this.modelName,
94
+ prompt,
95
+ stream: useStream,
96
+ ...sampling,
97
+ ...pickDefined(config, [...GENERATION_KEYS]),
98
+ ...config.references && { references: normalizeReferences(config.references) }
99
+ };
100
+ }
101
+ async callApiNonStreaming(body, context) {
102
+ const { data, cached, status, statusText } = await require_cache.fetchWithCache(this.getApiUrl(), {
103
+ method: "POST",
104
+ headers: this.getHeaders(),
105
+ body: JSON.stringify(body)
106
+ }, require_fetch.getRequestTimeoutMs(), "json", context?.bustCache ?? context?.debug);
107
+ if (status < 200 || status >= 300) {
108
+ if (data && typeof data === "object" && "code" in data && "message" in data) return { error: formatError(data) };
109
+ return { error: `API error: ${status} ${statusText}\n${typeof data === "string" ? data : JSON.stringify(data)}` };
110
+ }
111
+ const response = data;
112
+ return {
113
+ cached,
114
+ output: extractSvgOutput(response),
115
+ tokenUsage: mapTokenUsage(response.usage, cached ? 0 : 1),
116
+ metadata: buildMetadata({
117
+ responseId: response.id,
118
+ credits: response.credits
119
+ })
120
+ };
121
+ }
122
+ async callApiStreaming(body) {
123
+ let lastResp;
124
+ for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
125
+ const controller = new AbortController();
126
+ const timeout = setTimeout(() => controller.abort(), require_fetch.getRequestTimeoutMs());
127
+ let reader;
128
+ try {
129
+ lastResp = await require_fetch.fetchWithProxy(this.getApiUrl(), {
130
+ method: "POST",
131
+ headers: this.getHeaders(),
132
+ body: JSON.stringify(body),
133
+ signal: controller.signal
134
+ });
135
+ if (lastResp.status === 429 && attempt < MAX_RETRIES && !await isNonRetryable429(lastResp)) {
136
+ const waitMs = getRetryAfterMs(lastResp.headers, attempt);
137
+ require_logger.logger.debug(`QuiverAI: rate limited, retry ${attempt + 1}/${MAX_RETRIES} in ${waitMs}ms`);
138
+ await lastResp.body?.cancel();
139
+ await new Promise((resolve) => setTimeout(resolve, waitMs));
140
+ continue;
141
+ }
142
+ if (!lastResp.ok) return await handleStreamingError(lastResp);
143
+ if (!lastResp.body) return { error: "QuiverAI streaming response has no body" };
144
+ reader = lastResp.body.getReader();
145
+ return await readSSEStream(reader);
146
+ } finally {
147
+ reader?.cancel().catch(() => {});
148
+ clearTimeout(timeout);
149
+ }
150
+ }
151
+ return handleStreamingError(lastResp);
152
+ }
153
+ };
154
+ async function isNonRetryable429(resp) {
155
+ try {
156
+ const data = await resp.clone().json();
157
+ return typeof data?.code === "string" && NON_RETRYABLE_429_CODES.has(data.code);
158
+ } catch {
159
+ return false;
160
+ }
161
+ }
162
+ async function handleStreamingError(resp) {
163
+ try {
164
+ return { error: formatError(await resp.json()) };
165
+ } catch {
166
+ return { error: `QuiverAI API error: HTTP ${resp.status}` };
167
+ }
168
+ }
169
+ async function readSSEStream(reader) {
170
+ const decoder = new TextDecoder();
171
+ let buffer = "";
172
+ const outputs = /* @__PURE__ */ new Map();
173
+ let totalCredits;
174
+ let lastUsage;
175
+ let responseId;
176
+ const ingest = (line) => {
177
+ const data = parseSSEData(line);
178
+ if (!data) return;
179
+ if (data.type === "content" && typeof data.svg === "string") {
180
+ const key = data.id ?? `${data.index ?? outputs.size}`;
181
+ outputs.set(key, {
182
+ index: data.index ?? outputs.size,
183
+ svg: data.svg,
184
+ credits: data.credits
185
+ });
186
+ if (typeof data.credits === "number") totalCredits = (totalCredits ?? 0) + data.credits;
187
+ if (!responseId && data.id) responseId = data.id;
188
+ }
189
+ if (data.usage) lastUsage = data.usage;
190
+ };
191
+ while (true) {
192
+ const { done, value } = await reader.read();
193
+ if (done) break;
194
+ buffer += decoder.decode(value, { stream: true });
195
+ const lines = buffer.split("\n");
196
+ buffer = lines.pop() || "";
197
+ for (const line of lines) ingest(line);
198
+ }
199
+ if (buffer.trim()) ingest(buffer);
200
+ if (outputs.size === 0) return { error: "QuiverAI streaming response contained no SVG content" };
201
+ const ordered = [...outputs.values()].sort((a, b) => a.index - b.index).map((o) => o.svg);
202
+ return {
203
+ output: ordered.length === 1 ? ordered[0] : ordered.join("\n\n"),
204
+ tokenUsage: mapTokenUsage(lastUsage, 1),
205
+ metadata: buildMetadata({
206
+ responseId,
207
+ credits: totalCredits
208
+ })
209
+ };
210
+ }
211
+ function pickDefined(obj, keys) {
212
+ return Object.fromEntries(keys.filter((k) => obj[k] != null).map((k) => [k, obj[k]]));
213
+ }
214
+ function formatError(err) {
215
+ const base = `${err.message} [${err.code}]`;
216
+ return err.request_id ? `${base} (request_id: ${err.request_id})` : base;
217
+ }
218
+ function mapTokenUsage(usage, numRequests) {
219
+ return {
220
+ total: usage?.total_tokens || 0,
221
+ prompt: usage?.input_tokens || 0,
222
+ completion: usage?.output_tokens || 0,
223
+ numRequests
224
+ };
225
+ }
226
+ function buildMetadata(parts) {
227
+ const meta = {};
228
+ if (parts.responseId) meta.responseId = parts.responseId;
229
+ if (typeof parts.credits === "number") meta.credits = parts.credits;
230
+ return Object.keys(meta).length ? meta : void 0;
231
+ }
232
+ function getRetryAfterMs(headers, attempt) {
233
+ const retryAfter = headers.get("retry-after");
234
+ if (retryAfter) {
235
+ const seconds = Number(retryAfter);
236
+ if (!Number.isNaN(seconds)) return Math.min(seconds * 1e3, MAX_RETRY_AFTER_MS);
237
+ const date = new Date(retryAfter);
238
+ if (!Number.isNaN(date.getTime())) return Math.min(Math.max(0, date.getTime() - Date.now()), MAX_RETRY_AFTER_MS);
239
+ }
240
+ return Math.pow(2, attempt) * 1e3;
241
+ }
242
+ function parseSSEData(line) {
243
+ if (!line.startsWith("data:")) return null;
244
+ const payload = line.slice(line.startsWith("data: ") ? 6 : 5).trim();
245
+ if (!payload || payload === "[DONE]") return null;
246
+ try {
247
+ return JSON.parse(payload);
248
+ } catch {
249
+ require_logger.logger.debug(`QuiverAI: failed to parse SSE data: ${payload}`);
250
+ return null;
251
+ }
252
+ }
253
+ function extractSvgOutput(response) {
254
+ if (Array.isArray(response.data)) {
255
+ const svgs = response.data.map((item) => item.svg).filter(Boolean);
256
+ if (svgs.length === 1) return svgs[0];
257
+ if (svgs.length > 1) return svgs.join("\n\n");
258
+ }
259
+ return JSON.stringify(response);
260
+ }
261
+ function normalizeReferences(refs) {
262
+ return refs.map((ref) => typeof ref === "string" ? { url: ref } : ref);
263
+ }
264
+ const BASE64_DATA_URL_PATTERN = /^data:image\/[a-zA-Z0-9.+-]+(?:;[^,;]+)*;base64,(.+)$/i;
265
+ function normalizeImageReference(value) {
266
+ if (!value || typeof value !== "object" || Array.isArray(value)) return null;
267
+ const candidate = value;
268
+ if (typeof candidate.url === "string" && candidate.url.trim()) return { url: candidate.url };
269
+ if (typeof candidate.base64 === "string" && candidate.base64.trim()) return { base64: candidate.base64 };
270
+ return null;
271
+ }
272
+ function getConfiguredVectorizeImage(image) {
273
+ if (image === void 0) return;
274
+ const normalized = normalizeImageReference(image);
275
+ if (!normalized) throw new Error("QuiverAI vectorize `image` must contain a non-empty `url` or `base64` string.");
276
+ return normalized;
277
+ }
278
+ function parsePromptAsImage(prompt) {
279
+ const trimmed = prompt.trim();
280
+ if (!trimmed) throw new Error("QuiverAI vectorize requires an image: pass a URL or base64 string as the prompt, or set `image` in the provider config.");
281
+ const dataUrlMatch = BASE64_DATA_URL_PATTERN.exec(trimmed);
282
+ if (dataUrlMatch) return { base64: dataUrlMatch[1] };
283
+ if (/^data:image\//i.test(trimmed)) throw new Error("QuiverAI vectorize data URLs must be base64-encoded.");
284
+ if (/^https?:\/\//i.test(trimmed)) return { url: trimmed };
285
+ if (trimmed.startsWith("{")) {
286
+ let parsed;
287
+ try {
288
+ parsed = JSON.parse(trimmed);
289
+ } catch {
290
+ return { base64: trimmed };
291
+ }
292
+ if (parsed && typeof parsed === "object") {
293
+ const image = normalizeImageReference(parsed);
294
+ if (image) return image;
295
+ if ("image" in parsed) {
296
+ const nestedImage = normalizeImageReference(parsed.image);
297
+ if (nestedImage) return nestedImage;
298
+ throw new Error("QuiverAI vectorize nested `image` must contain a non-empty `url` or `base64` string.");
299
+ }
300
+ throw new Error("QuiverAI vectorize JSON image input must contain a non-empty `url` or `base64` string.");
301
+ }
302
+ }
303
+ return { base64: trimmed };
304
+ }
305
+ function createQuiverAiProvider(providerPath, providerOptions = {}, env) {
306
+ const splits = providerPath.split(":");
307
+ const modelType = splits[1];
308
+ let mode = "generation";
309
+ let modelStart = 1;
310
+ if (modelType === "vectorize") {
311
+ mode = "vectorize";
312
+ modelStart = 2;
313
+ } else if (modelType === "generate" || modelType === "chat") modelStart = 2;
314
+ return new QuiverAiProvider(splits.slice(modelStart).join(":") || QUIVERAI_DEFAULT_MODEL, {
315
+ config: providerOptions.config,
316
+ id: providerOptions.id,
317
+ env: providerOptions.env ?? env,
318
+ mode
319
+ });
320
+ }
321
+ //#endregion
322
+ exports.createQuiverAiProvider = createQuiverAiProvider;
323
+
324
+ //# sourceMappingURL=quiverai-CNfaxZ3K.cjs.map