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.
- package/dist/src/{accounts-D4iTShVh.js → accounts-BGs8AMhG.js} +4 -4
- package/dist/src/{accounts-ECb2xAYn.js → accounts-BjCiVnil.js} +4 -4
- package/dist/src/{accounts-DbmMSaOW.js → accounts-C06-4dXo.js} +5 -5
- package/dist/src/{accounts-5Sf1PCNo.cjs → accounts-C6NiTdum.cjs} +4 -4
- package/dist/src/{agentic-utils-DxzgjGfK.js → agentic-utils-B5IO5YR-.js} +2 -2
- package/dist/src/{agentic-utils-eGLKHNlT.cjs → agentic-utils-BDKz7KHx.cjs} +2 -2
- package/dist/src/{agentic-utils-CLrqlGZc.js → agentic-utils-Bj9P7suD.js} +2 -2
- package/dist/src/{agentic-utils-jiE8RROB.js → agentic-utils-kgc1YTAx.js} +2 -2
- package/dist/src/{agents-CI9ETpr0.js → agents-BMcjQUHA.js} +2 -2
- package/dist/src/{agents-B0gmhYyj.js → agents-CyHaf9xC.js} +2 -2
- package/dist/src/{agents-Dl4uviKE.cjs → agents-DOhrSQhK.cjs} +4 -4
- package/dist/src/{agents-CK9Kxnix.js → agents-DT1nSZix.js} +4 -4
- package/dist/src/{agents-6d6pdEFT.js → agents-DgakfoxG.js} +4 -4
- package/dist/src/{agents-C5zoy2ZS.js → agents-VKHVNG4J.js} +2 -2
- package/dist/src/{agents-Br5HYLBT.cjs → agents-zYAXB2ja.cjs} +2 -2
- package/dist/src/{agents-CvL6W9kz.js → agents-zzIht0lm.js} +4 -4
- package/dist/src/{aimlapi-DGCN4rpi.cjs → aimlapi-Bv6rnE4W.cjs} +6 -6
- package/dist/src/{aimlapi-BonWl7zl.js → aimlapi-C05Ca41Z.js} +6 -6
- package/dist/src/{aimlapi-NJzALFkC.js → aimlapi-CLaCvZn8.js} +6 -6
- package/dist/src/{aimlapi-UwsBeqRG.js → aimlapi-DW7KNdkd.js} +6 -6
- package/dist/src/app/app/tsconfig.app.tsbuildinfo +1 -1
- package/dist/src/app/assets/Report-BgwGPDAJ.js +1 -0
- package/dist/src/app/assets/index-CBwcpPdR.js +413 -0
- package/dist/src/app/assets/index-ZYpt1xFX.css +1 -0
- package/dist/src/app/index.html +2 -2
- package/dist/src/{audio-yUZrS0JJ.js → audio-Cd92j4tr.js} +3 -3
- package/dist/src/{audio-9N6nZqw9.js → audio-De3snmla.js} +3 -3
- package/dist/src/{audio-DBqadfGk.js → audio-Dh44iWq7.js} +3 -3
- package/dist/src/{audio-BR4j1oG1.cjs → audio-MqvGQVvP.cjs} +3 -3
- package/dist/src/{authoritativeMarkupInjection-2C63bFKe.cjs → authoritativeMarkupInjection-BAuWkXwn.cjs} +5 -5
- package/dist/src/{authoritativeMarkupInjection-B2MJXBR1.js → authoritativeMarkupInjection-CDCg-jRQ.js} +4 -4
- package/dist/src/{authoritativeMarkupInjection-CE4HOCHa.js → authoritativeMarkupInjection-COd4q9Hp.js} +5 -5
- package/dist/src/{authoritativeMarkupInjection-DrBqZVP1.js → authoritativeMarkupInjection-D5oKM43M.js} +5 -5
- package/dist/src/{base-tmVReihS.js → base-B8G9Ob46.js} +2 -2
- package/dist/src/{base-6Aaed910.js → base-CzDq5YwX.js} +2 -2
- package/dist/src/{base-S8I8vPVY.js → base-DqNtZTrF.js} +2 -2
- package/dist/src/{base-BS60m8JA.cjs → base-OeMKpFIB.cjs} +2 -2
- package/dist/src/{bestOfN-BkH9d3Lr.js → bestOfN-B89i9zc7.js} +6 -6
- package/dist/src/{bestOfN-C1_WFZFb.js → bestOfN-BEfIajMY.js} +5 -5
- package/dist/src/{bestOfN-DfRpoheE.js → bestOfN-Czr-c62W.js} +6 -6
- package/dist/src/{bestOfN-b6uHssUC.cjs → bestOfN-QWGyCB5j.cjs} +6 -6
- package/dist/src/{billing-DwpSQ_4i.js → billing-BhghtFas.js} +2 -2
- package/dist/src/{billing-CAB1s36q.js → billing-BkQJKKdm.js} +2 -2
- package/dist/src/{billing-Dn9Gm2tN.cjs → billing-Co_1rjfG.cjs} +2 -2
- package/dist/src/{billing-DimGp80i.js → billing-MY86Oqwg.js} +2 -2
- package/dist/src/{blobs-7T2OXYkC.js → blobs-B8d9jKvz.js} +2 -2
- package/dist/src/{blobs-CqhgM_fa.js → blobs-BTzPmpq-.js} +2 -2
- package/dist/src/{blobs-DQ6pIlJQ.cjs → blobs-BcpoigIU.cjs} +7 -1
- package/dist/src/{blobs-Dxfq3woN.js → blobs-DQ4bXN5O.js} +2 -2
- package/dist/src/{cache-DgKlV56y.js → cache-BEZBHFxd.js} +2 -2
- package/dist/src/cache-Cqg9f4d4.js +3 -0
- package/dist/src/{cache-CmidsPv2.js → cache-D2MfIrzr.js} +3 -3
- package/dist/src/{cache-B-fzj_aE.cjs → cache-DWEZYdJG.cjs} +2 -2
- package/dist/src/{cache-Z4cklSHj.js → cache-WT_2CYA-.js} +2 -2
- package/dist/src/{chat-uLo5fkVu.js → chat-C9yx5XD4.js} +2 -2
- package/dist/src/{chat-VVJW_GJC.js → chat-CuPbIKVa.js} +2 -2
- package/dist/src/{chat-BWdNGktf.js → chat-DBG4VxM7.js} +7 -7
- package/dist/src/{chat-CrOCT2BA.js → chat-Dwfr4jHi.js} +2 -2
- package/dist/src/{chat-BE0BP7oZ.js → chat-FNWhaysj.js} +7 -7
- package/dist/src/{chat-CvN2w9fY.js → chat-PfM8xgFA.js} +7 -7
- package/dist/src/{chat-CpFzezkO.cjs → chat-XVIowajy.cjs} +7 -7
- package/dist/src/{chat-DAkk46Lf.cjs → chat-sZgq1_-v.cjs} +2 -2
- package/dist/src/{claude-agent-sdk-CocknPbL.js → claude-agent-sdk-B0AZ38ny.js} +4 -4
- package/dist/src/{claude-agent-sdk-BH0L9H8Y.js → claude-agent-sdk-BfYAjuTk.js} +4 -4
- package/dist/src/{claude-agent-sdk-DxyDxejT.cjs → claude-agent-sdk-CklMerFa.cjs} +4 -4
- package/dist/src/{claude-agent-sdk-Bh0MH9Z9.js → claude-agent-sdk-DTFpCefB.js} +4 -4
- package/dist/src/cloud-BNr2N1RY.js +3 -0
- package/dist/src/{cloud-DJB9yPQB.js → cloud-DKKGeJBV.js} +2 -2
- package/dist/src/{cloudflare-ai-DeUFFMJE.cjs → cloudflare-ai-C7pMPgpc.cjs} +4 -4
- package/dist/src/{cloudflare-ai-Bg1wwMId.js → cloudflare-ai-Cqz_3WD2.js} +4 -4
- package/dist/src/{cloudflare-ai-CpbxtQGT.js → cloudflare-ai-CuUCQanF.js} +4 -4
- package/dist/src/{cloudflare-ai-B2Sjijq0.js → cloudflare-ai-lAgV52qE.js} +4 -4
- package/dist/src/{cloudflare-gateway-DKsO0VKU.js → cloudflare-gateway-8T5x83eI.js} +3 -3
- package/dist/src/{cloudflare-gateway-CvQV6nA1.js → cloudflare-gateway-Bq7SdErk.js} +3 -3
- package/dist/src/{cloudflare-gateway-BwdJezUO.js → cloudflare-gateway-moRfeZJJ.js} +3 -3
- package/dist/src/{cloudflare-gateway-cBHiORfX.cjs → cloudflare-gateway-peUrx9oi.cjs} +3 -3
- package/dist/src/{codex-app-server-BHVKRhkY.js → codex-app-server-BvPHEwJg.js} +5 -5
- package/dist/src/{codex-app-server-CojV6u3_.js → codex-app-server-DBTBsZ1t.js} +5 -5
- package/dist/src/{codex-app-server-B471dabg.cjs → codex-app-server-Dwl3iupA.cjs} +5 -5
- package/dist/src/{codex-app-server-DF2PMuc1.js → codex-app-server-t-QoeeGd.js} +5 -5
- package/dist/src/{codex-sdk-Bj4uY6sS.js → codex-sdk-C4FTldKU.js} +4 -4
- package/dist/src/{codex-sdk-D4JF0nj6.js → codex-sdk-C4aieKza.js} +4 -4
- package/dist/src/codex-sdk-CTD1qSKx.js +3 -0
- package/dist/src/{codex-sdk-aezPvTAB.js → codex-sdk-CnSzlhih.js} +4 -4
- package/dist/src/{codex-sdk-C9c-416d.cjs → codex-sdk-bWIQVOBL.cjs} +4 -4
- package/dist/src/{cometapi-CgaDmO4i.js → cometapi-B0mQIIzf.js} +7 -7
- package/dist/src/{cometapi-BlBmHq7-.js → cometapi-CFrYNMs5.js} +7 -7
- package/dist/src/{cometapi-mtyRjerU.js → cometapi-CMnFU1wL.js} +7 -7
- package/dist/src/{cometapi-D8sWSnb1.cjs → cometapi-D2thnPaL.cjs} +7 -7
- package/dist/src/{completion-RkFAOVSF.js → completion-B0yVZF3v.js} +5 -5
- package/dist/src/{completion-CHnFmpnp.js → completion-Dz36rtPd.js} +5 -5
- package/dist/src/{completion-Di0-4tYi.cjs → completion-Ny3XQpqx.cjs} +5 -5
- package/dist/src/{completion-Bd8G9VHW.js → completion-sMpCTaBm.js} +5 -5
- package/dist/src/{crescendo-C8YuBd9K.js → crescendo-BpVWWleP.js} +11 -11
- package/dist/src/{crescendo-TWgp7uGp.cjs → crescendo-CqQhmeC0.cjs} +13 -13
- package/dist/src/{crescendo-BgGio6G0.js → crescendo-JAvyVRKK.js} +13 -13
- package/dist/src/{crescendo-BQ2VI9FD.js → crescendo-RfCMSIM-.js} +13 -13
- package/dist/src/{custom-D0p5pikf.cjs → custom-B_fKUq6j.cjs} +11 -11
- package/dist/src/{custom-DsSELzzx.js → custom-Bm6Tu-ji.js} +11 -11
- package/dist/src/{custom-CFnjgHKp.js → custom-LxkvkOvG.js} +9 -9
- package/dist/src/{custom-CSaH4Qj9.js → custom-jLsK8Wf9.js} +11 -11
- package/dist/src/{docker-ByT3LmHN.js → docker-B60virtZ.js} +5 -5
- package/dist/src/{docker-BRA5ruGU.cjs → docker-D_f3qyDE.cjs} +5 -5
- package/dist/src/{docker-CVY-oMv4.js → docker-DogRc30z.js} +5 -5
- package/dist/src/{docker-DIxhfwlx.js → docker-wwQ1pPGy.js} +5 -5
- package/dist/src/{embedding-BpX-WENP.js → embedding-BMe9ZgQF.js} +5 -5
- package/dist/src/{embedding-B_0mJpXs.cjs → embedding-ClHIOEld.cjs} +5 -5
- package/dist/src/{embedding-LplgjBJ0.js → embedding-Dy2o5RFQ.js} +5 -5
- package/dist/src/{embedding-CCbgRo4z.js → embedding-HXOpA992.js} +5 -5
- package/dist/src/{eval-BXF3bRvV.js → eval-BLgDYWPd.js} +4 -4
- package/dist/src/{eval-BcM9YiOW.js → eval-DbGugzR8.js} +1 -1
- package/dist/src/evalResult-B6Jpy3kJ.js +3 -0
- package/dist/src/{evalResult-C8MROHS8.js → evalResult-BWE17Tqm.js} +3 -3
- package/dist/src/{evalResult-CIxAdUVQ.cjs → evalResult-DDohNAHL.cjs} +3 -3
- package/dist/src/{evalResult-DaACTv0f.js → evalResult-DOh0QQix.js} +3 -3
- package/dist/src/evaluator-CTl-lKuh.js +3 -0
- package/dist/src/{evaluator-C_gCkBe3.js → evaluator-DbOsHSRe.js} +212 -21
- package/dist/src/{evaluatorHelpers-BVvi8tWH.cjs → evaluatorHelpers-CaaC50RB.cjs} +4 -4
- package/dist/src/{evaluatorHelpers-C6-aKnJe.js → evaluatorHelpers-CoLW5rKU.js} +4 -4
- package/dist/src/{evaluatorHelpers-RQo-m90b.js → evaluatorHelpers-DTtYkrGO.js} +4 -4
- package/dist/src/{extractor-B1hELWwJ.js → extractor-BIqe0lMN.js} +70 -12
- package/dist/src/{extractor-_E41W0Fl.cjs → extractor-CUVurbDW.cjs} +71 -12
- package/dist/src/{extractor-DV6WBfAi.js → extractor-DOhjGS0m.js} +70 -12
- package/dist/src/{extractor-ItsKh8lH.js → extractor-h1HS9f6y.js} +70 -12
- package/dist/src/{fetch-BBa1Lxgp.js → fetch-B1Rb0VdL.js} +3 -3
- package/dist/src/{fetch-BtdsABrj.js → fetch-BErWGTUY.js} +2 -2
- package/dist/src/{fetch-CFIU30wy.js → fetch-BNUDixbE.js} +2 -2
- package/dist/src/{fetch-OePjzUmA.cjs → fetch-C7yU9CNr.cjs} +2 -2
- package/dist/src/fetch-DVj4dF4V.js +3 -0
- package/dist/src/{goat-kpeOOE-K.js → goat-BnB1zGir.js} +13 -13
- package/dist/src/{goat-Coh2te0S.cjs → goat-C1RkjWv1.cjs} +13 -13
- package/dist/src/{goat-BCFeW4zk.js → goat-CNpA_tT8.js} +11 -11
- package/dist/src/{goat-Dr2YGfiG.js → goat-ZRARvAD5.js} +13 -13
- package/dist/src/graders-CA3QVnK3.js +3 -0
- package/dist/src/{graders-BrLOEmxX.js → graders-CO5drf0x.js} +17 -17
- package/dist/src/{graders-DEz7EeRy.js → graders-CpUlNVnh.js} +17 -17
- package/dist/src/{graders-CY4Ft8A9.js → graders-Z5qzvpuI.js} +17 -17
- package/dist/src/{graders-CCrX0NG3.cjs → graders-t_K-nZ_X.cjs} +17 -17
- package/dist/src/{hydra-C90CylNi.js → hydra-BMb0WtZA.js} +13 -13
- package/dist/src/{hydra-dOBPmWHt.js → hydra-BXmf4FCK.js} +11 -11
- package/dist/src/{hydra-Cq_3qKz_.js → hydra-C5_Vuh-m.js} +13 -13
- package/dist/src/{hydra-B524i6K6.cjs → hydra-c1_7vPsg.cjs} +13 -13
- package/dist/src/{image-DBnzfeuJ.cjs → image-BhHFD4Vb.cjs} +3 -3
- package/dist/src/{image-CvhTr1GY.cjs → image-CYFea400.cjs} +5 -5
- package/dist/src/{image-CHJ-KjNE.js → image-CgkOODNn.js} +5 -5
- package/dist/src/{image-_-h6GCQ7.js → image-DGQkq3aK.js} +5 -5
- package/dist/src/{image-CkF1ruDX.js → image-DWveOfTz.js} +3 -3
- package/dist/src/{image-BmVZRCkS.js → image-DfF12xzt.js} +5 -5
- package/dist/src/{image-B6P9JAV2.js → image-DkSUFfLd.js} +3 -3
- package/dist/src/{image-CD22vXth.js → image-nYwdqnax.js} +3 -3
- package/dist/src/index.cjs +218 -26
- package/dist/src/index.js +216 -26
- package/dist/src/{indirectWebPwn-BgIfQ2ON.js → indirectWebPwn-BajQ_evT.js} +5 -5
- package/dist/src/{indirectWebPwn-A16xYmav.js → indirectWebPwn-BbFMiv79.js} +4 -4
- package/dist/src/{indirectWebPwn-BRhR4Dk9.js → indirectWebPwn-BnrxhAAL.js} +4 -4
- package/dist/src/{indirectWebPwn-Bfp-t224.cjs → indirectWebPwn-BqOgtzny.cjs} +5 -5
- package/dist/src/{indirectWebPwn-8G6tgDBW.js → indirectWebPwn-C6_BaxjA.js} +5 -5
- package/dist/src/{indirectWebPwn-BWGexuih.js → indirectWebPwn-C779yDi6.js} +4 -4
- package/dist/src/{indirectWebPwn-DcKDbCn_.cjs → indirectWebPwn-CDo9rC06.cjs} +4 -4
- package/dist/src/{indirectWebPwn-CZ2kTy4r.js → indirectWebPwn-k8D0JacN.js} +5 -5
- package/dist/src/{iterative-BIHF31Io.js → iterative-BzKNkXHn.js} +13 -13
- package/dist/src/{iterative-XRfxQ0i8.cjs → iterative-CD3I_Rwq.cjs} +13 -13
- package/dist/src/{iterative-CZPHLUKZ.js → iterative-DL8iDwrE.js} +13 -13
- package/dist/src/{iterative-DZkNlFE-.js → iterative-DyEoFedI.js} +11 -11
- package/dist/src/{iterativeImage-BFRM8Jdx.js → iterativeImage-B7qV6kzP.js} +4 -4
- package/dist/src/{iterativeImage-DJtVKlFX.cjs → iterativeImage-BaOAhF-S.cjs} +5 -5
- package/dist/src/{iterativeImage-7WjhjpHE.js → iterativeImage-D85THuYb.js} +5 -5
- package/dist/src/{iterativeImage-CbRn9_MH.js → iterativeImage-noXhuElt.js} +5 -5
- package/dist/src/{iterativeMeta-2gyieWbU.js → iterativeMeta-BHNJgPy0.js} +12 -12
- package/dist/src/{iterativeMeta-dkFD9UKg.cjs → iterativeMeta-BQrhQ-iJ.cjs} +12 -12
- package/dist/src/{iterativeMeta-Bh2AQq8Y.js → iterativeMeta-CAN36NIN.js} +12 -12
- package/dist/src/{iterativeMeta-CmMnD77T.js → iterativeMeta-CnPYPYH0.js} +10 -10
- package/dist/src/{iterativeTree-DuIk7wjS.js → iterativeTree-B7116aK-.js} +10 -10
- package/dist/src/{iterativeTree-bjH__9en.js → iterativeTree-DdXSpkqE.js} +12 -12
- package/dist/src/{iterativeTree-DSNss1kE.js → iterativeTree-cKlxQWhi.js} +12 -12
- package/dist/src/{iterativeTree-DoE-8nC3.cjs → iterativeTree-u2hKQ51y.cjs} +12 -12
- package/dist/src/{knowledgeBase-kyTJpbr0.js → knowledgeBase-D9xW79dS.js} +4 -4
- package/dist/src/{knowledgeBase-CQasebQt.js → knowledgeBase-DfwVbdwp.js} +4 -4
- package/dist/src/{knowledgeBase-DebHrXhD.cjs → knowledgeBase-DhT8uaMH.cjs} +4 -4
- package/dist/src/{knowledgeBase-mzMh6UZt.js → knowledgeBase-DlH6NRlX.js} +4 -4
- package/dist/src/{litellm-wSD4Q6-H.cjs → litellm-BA2Fti7H.cjs} +4 -4
- package/dist/src/{litellm-BJFH4uKd.js → litellm-CHybAu4l.js} +4 -4
- package/dist/src/{litellm-A2eV_lM0.js → litellm-Cn_zDWeA.js} +4 -4
- package/dist/src/{litellm-CeJEe_jQ.js → litellm-CnqX4jfm.js} +4 -4
- package/dist/src/{luma-ray-DpuaR6Wa.js → luma-ray-C_AWu7K6.js} +4 -4
- package/dist/src/{luma-ray-B0GNCw6S.js → luma-ray-CbFOvJZw.js} +4 -4
- package/dist/src/{luma-ray-qBfU-mGO.cjs → luma-ray-D7hDEZaC.cjs} +4 -4
- package/dist/src/{luma-ray-CM6bvN4t.js → luma-ray-RQAhTNvK.js} +4 -4
- package/dist/src/main.js +27 -27
- package/dist/src/{memoryPoisoning-9mIgiE3F.cjs → memoryPoisoning-A8N_cbrW.cjs} +5 -5
- package/dist/src/{memoryPoisoning-BYBQ1Ns5.js → memoryPoisoning-BGe4fuFU.js} +5 -5
- package/dist/src/{memoryPoisoning-SvtQxFjF.js → memoryPoisoning-DDfIRZnk.js} +5 -5
- package/dist/src/{memoryPoisoning-D4iqi_nT.js → memoryPoisoning-DtJ5vYZW.js} +5 -5
- package/dist/src/{messages-BofXErqC.js → messages-BH83TS-n.js} +7 -7
- package/dist/src/{messages-DxzhBs74.js → messages-aXox3d04.js} +7 -7
- package/dist/src/{messages-CHZtL-k0.cjs → messages-qapmFqOQ.cjs} +7 -7
- package/dist/src/{messages-BKTseD_x.js → messages-yVMPGJ4n.js} +7 -7
- package/dist/src/{mischievousUser-D23wQ8f0.js → mischievousUser-BPDyepmu.js} +5 -5
- package/dist/src/{mischievousUser-DX1gGvUB.js → mischievousUser-D1mbddId.js} +5 -5
- package/dist/src/{mischievousUser-ECTv-u4g.cjs → mischievousUser-DHYVKotH.cjs} +5 -5
- package/dist/src/{mischievousUser-B5oT1xjM.js → mischievousUser-D_8tmPfA.js} +5 -5
- package/dist/src/{modelslab-D5vwtIYR.js → modelslab-BwywPRoU.js} +5 -5
- package/dist/src/{modelslab-DE9CfYYT.js → modelslab-Cc6fn99l.js} +5 -5
- package/dist/src/{modelslab-CVkeR8mC.cjs → modelslab-D2F3FtnI.cjs} +5 -5
- package/dist/src/{modelslab-BU_qCK1m.js → modelslab-D_izTsvD.js} +5 -5
- package/dist/src/{nova-reel-BSM7U8Bp.js → nova-reel-B1Jg1XBk.js} +4 -4
- package/dist/src/{nova-reel-BKAkU37Y.js → nova-reel-CZeHbWUe.js} +4 -4
- package/dist/src/{nova-reel-BvWH15rr.cjs → nova-reel-CcWrhmGJ.cjs} +4 -4
- package/dist/src/{nova-reel-D2tla7dy.js → nova-reel-DFrk1Ey2.js} +4 -4
- package/dist/src/{nova-sonic-DU7_krhB.js → nova-sonic-4wwR0tZJ.js} +2 -2
- package/dist/src/{nova-sonic-C7CNjG9n.cjs → nova-sonic-BqRQ9CWO.cjs} +2 -2
- package/dist/src/{nova-sonic-BQkU8weK.js → nova-sonic-D-IJHou2.js} +2 -2
- package/dist/src/{nova-sonic-B8PB4mU2.js → nova-sonic-DJUXNWUJ.js} +2 -2
- package/dist/src/{openclaw-CLNjF8ox.js → openclaw-5U8yiy9P.js} +5 -5
- package/dist/src/{openclaw-laZmy-8p.cjs → openclaw-B0vjRb3y.cjs} +5 -5
- package/dist/src/{openclaw-Gl2a1gR3.js → openclaw-C8xQtncQ.js} +5 -5
- package/dist/src/{openclaw-D5yEpk1f.js → openclaw-CqZoWsh0.js} +5 -5
- package/dist/src/{opencode-sdk-CGPqE4m0.js → opencode-sdk-B2qz1kCI.js} +2 -2
- package/dist/src/{opencode-sdk-5XXP3gNb.js → opencode-sdk-BGO1zuPF.js} +2 -2
- package/dist/src/{opencode-sdk-C7mIxApB.cjs → opencode-sdk-Bk9G3WGQ.cjs} +2 -2
- package/dist/src/{opencode-sdk-E1fh3vlz.js → opencode-sdk-NhbhYcsR.js} +2 -2
- package/dist/src/{promptfoo-C4g2Lx9t.js → promptfoo-CkDcgxiW.js} +4 -4
- package/dist/src/{promptfoo-DdsPYNm7.js → promptfoo-De6vQq9F.js} +4 -4
- package/dist/src/{promptfoo-x112UyE1.js → promptfoo-DhGR7OQn.js} +4 -4
- package/dist/src/{promptfoo-B9KuhWM0.cjs → promptfoo-Dtw3i6YK.cjs} +4 -4
- package/dist/src/{providers-xrARCHcC.js → providers-BIgLuX4Z.js} +1 -1
- package/dist/src/{providers-BZ-QJYop.cjs → providers-CCRHPNv1.cjs} +50 -49
- package/dist/src/{providers-DdNIebwz.js → providers-am7xTa5w.js} +51 -50
- package/dist/src/{providers-BnjFZtaq.js → providers-gntyGa2T.js} +50 -49
- package/dist/src/{providers-D_OinWvd.js → providers-j-ulWCzy.js} +50 -49
- package/dist/src/quiverai-CHV12wRE.js +324 -0
- package/dist/src/quiverai-CNSyaZhh.js +325 -0
- package/dist/src/quiverai-CNfaxZ3K.cjs +324 -0
- package/dist/src/quiverai-CzROwhTy.js +324 -0
- package/dist/src/{registry-C57trbNM.js → registry-B0pFfEzq.js} +14 -14
- package/dist/src/{registry-Bnb9O892.cjs → registry-BH1mZ37j.cjs} +14 -14
- package/dist/src/{registry-CmhcDYtj.js → registry-Bvfyz9Xt.js} +14 -14
- package/dist/src/{registry-DhaGoOuz.js → registry-Dzut7txg.js} +14 -14
- package/dist/src/{remoteGeneration-BlwssRVS.js → remoteGeneration-CW6zHjQx.js} +4 -4
- package/dist/src/{remoteGeneration--4NPfyL-.js → remoteGeneration-DuxbIn94.js} +4 -4
- package/dist/src/{remoteGeneration-B0K7iojS.cjs → remoteGeneration-oSmtgmBY.cjs} +4 -4
- package/dist/src/{remoteGeneration-DiAuGk9s.js → remoteGeneration-wvnQpzN1.js} +4 -4
- package/dist/src/{responses-C57h4gaW.js → responses-CI7uikKQ.js} +6 -6
- package/dist/src/{responses-B9ygvEC-.cjs → responses-DRLyW4Lj.cjs} +6 -6
- package/dist/src/{responses-CXKL6TPn.js → responses-DxFUQTN2.js} +6 -6
- package/dist/src/{responses-CTfu1ToN.js → responses-JNrMb3zS.js} +6 -6
- package/dist/src/{sagemaker-DHdeSsnJ.js → sagemaker-5AwedTwq.js} +9 -9
- package/dist/src/{sagemaker-CHL8TZFs.js → sagemaker-B5yQiSKh.js} +9 -9
- package/dist/src/{sagemaker-DdVGF_UD.cjs → sagemaker-C3aoiFup.cjs} +9 -9
- package/dist/src/{sagemaker-DUjuHnmj.js → sagemaker-XmAlwYoN.js} +9 -9
- package/dist/src/{scanner-BdoS5ILQ.js → scanner-BdEduFjO.js} +5 -5
- package/dist/src/server/index.js +214 -24
- package/dist/src/{server-B8UpdwtX.cjs → server-B3QXCltR.cjs} +3 -3
- package/dist/src/{server-DaonK4kI.js → server-Ctq0NOMp.js} +3 -3
- package/dist/src/{server-Ds_P02x6.js → server-D0pdY_yM.js} +4 -4
- package/dist/src/{server-CYxCnoVw.js → server-DMCug-jv.js} +4 -4
- package/dist/src/server-Ty5m26Vh.js +3 -0
- package/dist/src/{shared-BavzGCp0.js → shared-C-G3NQ1-.js} +7 -7
- package/dist/src/{shared-D_0FXjLS.js → shared-CnrYC0Dk.js} +7 -7
- package/dist/src/{shared-DY3IzJlT.cjs → shared-D3PxrdDh.cjs} +7 -7
- package/dist/src/{shared-B3IkjkNV.js → shared-DHDR-oS4.js} +7 -7
- package/dist/src/{simulatedUser-CokouWJT.js → simulatedUser-AhNbPm55.js} +5 -5
- package/dist/src/{simulatedUser-DNiOb7YE.js → simulatedUser-DV977ZD0.js} +5 -5
- package/dist/src/{simulatedUser-BJabLGod.js → simulatedUser-Dq8cpKLQ.js} +5 -5
- package/dist/src/{simulatedUser-CPDlAc1R.cjs → simulatedUser-tAjEGnxH.cjs} +5 -5
- package/dist/src/{storage-CH8WC1r3.cjs → storage-C8WR4y77.cjs} +3 -3
- package/dist/src/{storage-D_qaZpfe.js → storage-CK2YYGUg.js} +3 -3
- package/dist/src/{storage-CLyYkZk-.js → storage-Nc_eXGrV.js} +4 -4
- package/dist/src/{storage-3dpIy6f2.js → storage-P9MrA5xv.js} +3 -3
- package/dist/src/{strategies-2Q_uZxBs.cjs → strategies-B6Y6G9UV.cjs} +8 -8
- package/dist/src/{strategies-DVDC487a.js → strategies-CaefFyHy.js} +9 -9
- package/dist/src/{strategies-BuIPOuYL.js → strategies-DE3UN_VH.js} +8 -8
- package/dist/src/telemetry-Bbd-BlA7.js +3 -0
- package/dist/src/{telemetry-Bh3HJU7r.js → telemetry-C7v0I4YX.js} +3 -3
- package/dist/src/{telemetry-B-NTbvDj.js → telemetry-CTYOje0d.js} +3 -3
- package/dist/src/{telemetry-3fTnWcSU.js → telemetry-CvJEPKK6.js} +3 -3
- package/dist/src/{telemetry-Be4rklbJ.cjs → telemetry-hDovhwWp.cjs} +3 -3
- package/dist/src/{tracingOptions-CYCHrrQQ.cjs → tracingOptions-DGai7e5l.cjs} +2 -2
- package/dist/src/{tracingOptions-CLKNUvF4.js → tracingOptions-DL2vOmYS.js} +2 -2
- package/dist/src/{tracingOptions-CZpFCwyr.js → tracingOptions-e_c5TlHv.js} +2 -2
- package/dist/src/{tracingOptions-Bi477wlC.js → tracingOptions-xCBDF3nM.js} +2 -2
- package/dist/src/{transcription-CtLhhmYq.js → transcription-BCasJfFB.js} +4 -4
- package/dist/src/{transcription-BB9i78R3.js → transcription-BLOD9lN7.js} +4 -4
- package/dist/src/{transcription-BRd477OO.js → transcription-BOjp5wlV.js} +4 -4
- package/dist/src/{transcription-O3Nc-kEc.cjs → transcription-G6JwbB2P.cjs} +4 -4
- package/dist/src/{transform-D9nfyIts.cjs → transform-B92noEAU.cjs} +13 -3
- package/dist/src/{transform-DmSzMsCP.js → transform-CD9wrP31.js} +8 -4
- package/dist/src/{transform-CUPglRUI.js → transform-D7-gzzhD.js} +8 -4
- package/dist/src/{transform-CLzSt5fi.js → transform-D8kXC-nB.js} +8 -4
- package/dist/src/{util-CnqjxsAd.js → util-BTAyQmdN.js} +2 -2
- package/dist/src/{util-Bg-aMimr.js → util-BbMJxgff.js} +3 -3
- package/dist/src/{util-mVC_YCag.cjs → util-C62dCLH_.cjs} +3 -3
- package/dist/src/{util-16aq4oHW.js → util-CD4LxH5h.js} +4 -4
- package/dist/src/{util-CRYfgRHi.js → util-CHCKTSi5.js} +3 -3
- package/dist/src/{util-BIYgspDB.js → util-CKQ_tuWG.js} +4 -4
- package/dist/src/{util-Bptzcit_.js → util-CVI1oD-n.js} +3 -3
- package/dist/src/{util-DHG9r5sC.js → util-CcW4TZSn.js} +2 -2
- package/dist/src/{util-DJLHqGS5.js → util-Ci_vm5u1.js} +2 -2
- package/dist/src/{util-D9xyoiGG.js → util-CkLsVF3e.js} +3 -3
- package/dist/src/{util-BsKq95ai.js → util-CqfcdA-f.js} +3 -3
- package/dist/src/{util-tsZfE0-_.js → util-CubC5Tyt.js} +3 -3
- package/dist/src/{util-BHfVEhSs.cjs → util-cAY5C8xI.cjs} +3 -3
- package/dist/src/{util-DEMRW89M2.cjs → util-jOGJmpWE2.cjs} +4 -4
- package/dist/src/{util-CpS555tc2.js → util-s0NU5XTE2.js} +4 -4
- package/dist/src/{util-DJFl6JZF.cjs → util-tFLdovkA.cjs} +2 -2
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/dist/src/app/assets/Report-Cx3cN9Nt.js +0 -1
- package/dist/src/app/assets/index-D44ihjH5.css +0 -1
- package/dist/src/app/assets/index-DzyLrNWM.js +0 -413
- package/dist/src/cache-D_D5rsiE.js +0 -3
- package/dist/src/cloud-BmVZ8W_3.js +0 -3
- package/dist/src/codex-sdk-BTI9Fvnt.js +0 -3
- package/dist/src/evalResult-uL1BStGk.js +0 -3
- package/dist/src/evaluator-C2YPxWQP.js +0 -3
- package/dist/src/fetch-DAe6a2ih.js +0 -3
- package/dist/src/graders-BZe_w0E4.js +0 -3
- package/dist/src/quiverai-B8a5RqGP.js +0 -213
- package/dist/src/quiverai-BoHFg1Vw.js +0 -214
- package/dist/src/quiverai-DYyzyVTF.cjs +0 -213
- package/dist/src/quiverai-ktAnwSBA.js +0 -213
- package/dist/src/server-DY7p-P4-.js +0 -3
- package/dist/src/telemetry-BOwRcACl.js +0 -3
|
@@ -1,44 +1,47 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { t as getProcessShim } from "./processShim-PekFOUjm.js";
|
|
3
3
|
import { A as getEvalTimeoutMs, C as summarizeEvaluateResultForLogging, E as getEnvBool, M as isCI, O as getEnvInt, P as state, S as safeJsonStringify, _ as extractFirstJsonObject, c as logger, i as globalLogCallback, j as getMaxEvalTimeMs, k as getEnvString, l as setLogCallback, v as extractJsonObjects, y as getAjv } from "./logger-DNHkR_3S.js";
|
|
4
|
-
import { K as VERSION, M as parseChatPrompt, _ as isNonTransientHttpStatus, b as sleep, i as fetchWithRetries, k as isPromptfooSampleTarget, q as FILE_METADATA_KEY } from "./fetch-
|
|
4
|
+
import { K as VERSION, M as parseChatPrompt, _ as isNonTransientHttpStatus, b as sleep, i as fetchWithRetries, k as isPromptfooSampleTarget, q as FILE_METADATA_KEY } from "./fetch-B1Rb0VdL.js";
|
|
5
5
|
import { t as invariant } from "./invariant-BtWWVVhl.js";
|
|
6
|
-
import { n as telemetry } from "./telemetry-
|
|
6
|
+
import { n as telemetry } from "./telemetry-C7v0I4YX.js";
|
|
7
7
|
import { at as LLAMA_GUARD_REPLICATE_PROVIDER, ct as MULTI_INPUT_VAR, d as isGradingResult, h as isCliEventSource, p as isApiProvider, s as ResultFailureReason, y as filterByRange } from "./types-C7iPXxc5.js";
|
|
8
8
|
import { i as isJavascriptFile } from "./fileExtensions-PGPK8Wcw.js";
|
|
9
9
|
import { t as providerRegistry } from "./providerRegistry-DaK_MD80.js";
|
|
10
|
-
import { C as isAnthropicProvider, E as isProviderAllowed, H as loadFunction, K as analyzeTemplateReference, L as maybeLoadToolsFromExternalFile, T as isOpenAiProvider, U as parseFileUrl, Y as getNunjucksEngine, q as extractVariablesFromTemplate, w as isGoogleProvider } from "./util-
|
|
11
|
-
import { c as withCacheNamespace, i as getCache } from "./cache-
|
|
10
|
+
import { C as isAnthropicProvider, E as isProviderAllowed, H as loadFunction, K as analyzeTemplateReference, L as maybeLoadToolsFromExternalFile, T as isOpenAiProvider, U as parseFileUrl, Y as getNunjucksEngine, q as extractVariablesFromTemplate, w as isGoogleProvider } from "./util-CcW4TZSn.js";
|
|
11
|
+
import { c as withCacheNamespace, i as getCache } from "./cache-D2MfIrzr.js";
|
|
12
12
|
import { r as runPython } from "./pythonUtils-yoUkCRXx.js";
|
|
13
|
-
import { d as validateFunctionCall } from "./util-
|
|
14
|
-
import { l as shouldGenerateRemote } from "./remoteGeneration-
|
|
15
|
-
import { c as promptYesNo } from "./server-
|
|
16
|
-
import { t as OpenAiChatCompletionProvider } from "./chat-
|
|
17
|
-
import { y as validateFunctionCall$1 } from "./transform-
|
|
18
|
-
import { _ as VertexChatProvider, b as GoogleLiveProvider, n as loadApiProvider, x as AIStudioChatProvider } from "./providers-
|
|
13
|
+
import { d as validateFunctionCall } from "./util-CkLsVF3e.js";
|
|
14
|
+
import { l as shouldGenerateRemote } from "./remoteGeneration-CW6zHjQx.js";
|
|
15
|
+
import { c as promptYesNo } from "./server-DMCug-jv.js";
|
|
16
|
+
import { t as OpenAiChatCompletionProvider } from "./chat-PfM8xgFA.js";
|
|
17
|
+
import { y as validateFunctionCall$1 } from "./transform-CD9wrP31.js";
|
|
18
|
+
import { _ as VertexChatProvider, b as GoogleLiveProvider, n as loadApiProvider, p as MCPProvider, x as AIStudioChatProvider } from "./providers-am7xTa5w.js";
|
|
19
19
|
import { a as createEmptyTokenUsage, i as createEmptyAssertions, n as accumulateResponseTokenUsage, o as normalizeTokenUsage, r as accumulateTokenUsage, t as accumulateAssertionTokenUsage } from "./tokenUsageUtils-kXKUpxyr.js";
|
|
20
20
|
import { n as loadFromPackage, t as isPackagePath } from "./packageParser-C_T8xu-D.js";
|
|
21
21
|
import { n as runRuby } from "./rubyUtils-BjUJ_Cj-.js";
|
|
22
|
-
import { c as isBasicRefusal, o as getSessionId } from "./util-
|
|
23
|
-
import { $ as SELECT_BEST_PROMPT, Ct as DEFAULT_ANTHROPIC_MODEL, Dt as getProviderCallExecutionContext, Et as getGradingProvider, G as matchesLlmRubric, H as matchesClosedQa, J as doRemoteGrading, K as matchesPiScore, Ot as withProviderCallExecutionContext, Q as DEFAULT_WEB_SEARCH_PROMPT, St as getDefaultProviders, Tt as getAndCheckProvider, U as matchesFactuality, V as isGraderFailure, W as matchesGEval, _t as tryParse, at as CONTEXT_RECALL_ATTRIBUTED_TOKEN, bt as loadFromJavaScriptFile, ct as CONTEXT_RELEVANCE_BAD, dt as cosineSimilarity, et as SUGGEST_PROMPTS_SYSTEM_MESSAGE, ft as dotProduct, gt as splitIntoSentences, ht as normalizeMatcherTokenUsage, it as CONTEXT_RECALL, lt as loadRubricPrompt, mt as fail, n as getGraderById, nt as CONTEXT_FAITHFULNESS_LONGFORM, ot as CONTEXT_RECALL_NOT_ATTRIBUTED_TOKEN, pt as euclideanDistance, q as matchesTrajectoryGoalSuccess, rt as CONTEXT_FAITHFULNESS_NLI_STATEMENTS, st as CONTEXT_RELEVANCE, tt as ANSWER_RELEVANCY_GENERATE, ut as renderLlmRubricPrompt, vt as coerceString, wt as callProviderWithContext, xt as processFileReference, yt as getFinalTest } from "./graders-
|
|
24
|
-
import { f as redteamProviderManager, g as createProviderRateLimitOptions, h as createRateLimitRegistry, m as TokenUsageTracker } from "./shared-
|
|
22
|
+
import { c as isBasicRefusal, o as getSessionId } from "./util-CD4LxH5h.js";
|
|
23
|
+
import { $ as SELECT_BEST_PROMPT, Ct as DEFAULT_ANTHROPIC_MODEL, Dt as getProviderCallExecutionContext, Et as getGradingProvider, G as matchesLlmRubric, H as matchesClosedQa, J as doRemoteGrading, K as matchesPiScore, Ot as withProviderCallExecutionContext, Q as DEFAULT_WEB_SEARCH_PROMPT, St as getDefaultProviders, Tt as getAndCheckProvider, U as matchesFactuality, V as isGraderFailure, W as matchesGEval, _t as tryParse, at as CONTEXT_RECALL_ATTRIBUTED_TOKEN, bt as loadFromJavaScriptFile, ct as CONTEXT_RELEVANCE_BAD, dt as cosineSimilarity, et as SUGGEST_PROMPTS_SYSTEM_MESSAGE, ft as dotProduct, gt as splitIntoSentences, ht as normalizeMatcherTokenUsage, it as CONTEXT_RECALL, lt as loadRubricPrompt, mt as fail, n as getGraderById, nt as CONTEXT_FAITHFULNESS_LONGFORM, ot as CONTEXT_RECALL_NOT_ATTRIBUTED_TOKEN, pt as euclideanDistance, q as matchesTrajectoryGoalSuccess, rt as CONTEXT_FAITHFULNESS_NLI_STATEMENTS, st as CONTEXT_RELEVANCE, tt as ANSWER_RELEVANCY_GENERATE, ut as renderLlmRubricPrompt, vt as coerceString, wt as callProviderWithContext, xt as processFileReference, yt as getFinalTest } from "./graders-CpUlNVnh.js";
|
|
24
|
+
import { f as redteamProviderManager, g as createProviderRateLimitOptions, h as createRateLimitRegistry, m as TokenUsageTracker } from "./shared-C-G3NQ1-.js";
|
|
25
25
|
import { i as generateIdFromPrompt } from "./utils-CsmoLRsV.js";
|
|
26
26
|
import { a as getTransformLabel, i as getTransformErrorMessage, o as transform, r as TransformInputType } from "./transform-Dou53MRF2.js";
|
|
27
27
|
import { n as getTraceStore } from "./store-Bn1-Urtg.js";
|
|
28
28
|
import { a as getActualPromptWithFallback, r as updateSignalFile } from "./signal-DdhkLwgQ.js";
|
|
29
|
-
import { t as extractAndStoreBinaryData } from "./extractor-
|
|
29
|
+
import { t as extractAndStoreBinaryData } from "./extractor-DOhjGS0m.js";
|
|
30
30
|
import { i as throwIfTargetPromptExceedsMaxChars } from "./promptLength-DYfhyE9j.js";
|
|
31
|
-
import { n as checkExfilTracking } from "./indirectWebPwn-
|
|
31
|
+
import { n as checkExfilTracking } from "./indirectWebPwn-BbFMiv79.js";
|
|
32
32
|
import { n as getFirstStringAttribute, r as getToolNameFromAttributes, t as TOOL_ARGUMENT_ATTRIBUTE_KEYS } from "./toolAttributes-DkzTVYQF.js";
|
|
33
|
-
import { i as filterFiniteScores, n as renderPrompt, r as runExtensionHook, t as collectFileMetadata } from "./evaluatorHelpers-
|
|
33
|
+
import { i as filterFiniteScores, n as renderPrompt, r as runExtensionHook, t as collectFileMetadata } from "./evaluatorHelpers-CoLW5rKU.js";
|
|
34
34
|
import { AsyncResource } from "node:async_hooks";
|
|
35
35
|
import chalk from "chalk";
|
|
36
36
|
import { createWriteStream } from "fs";
|
|
37
37
|
import path from "path";
|
|
38
38
|
import os from "os";
|
|
39
|
+
import Ajv from "ajv";
|
|
40
|
+
import addFormats from "ajv-formats";
|
|
39
41
|
import yaml from "js-yaml";
|
|
40
42
|
import fs$1 from "fs/promises";
|
|
41
43
|
import util from "util";
|
|
44
|
+
import dedent from "dedent";
|
|
42
45
|
import { randomBytes } from "crypto";
|
|
43
46
|
import { DiagConsoleLogger, DiagLogLevel, diag, propagation } from "@opentelemetry/api";
|
|
44
47
|
import { globSync } from "glob";
|
|
@@ -5025,6 +5028,193 @@ function maybeEmitAzureOpenAiWarning(testSuite, tests) {
|
|
|
5025
5028
|
return false;
|
|
5026
5029
|
}
|
|
5027
5030
|
//#endregion
|
|
5031
|
+
//#region src/redteam/mcpMaterialization.ts
|
|
5032
|
+
const TOOL_NAME_FIELDS = [
|
|
5033
|
+
"tool",
|
|
5034
|
+
"toolName",
|
|
5035
|
+
"function",
|
|
5036
|
+
"functionName",
|
|
5037
|
+
"name"
|
|
5038
|
+
];
|
|
5039
|
+
const TOOL_ARGS_FIELDS = [
|
|
5040
|
+
"args",
|
|
5041
|
+
"arguments",
|
|
5042
|
+
"params",
|
|
5043
|
+
"parameters"
|
|
5044
|
+
];
|
|
5045
|
+
const ajv = new Ajv({
|
|
5046
|
+
allErrors: true,
|
|
5047
|
+
strictSchema: false
|
|
5048
|
+
});
|
|
5049
|
+
addFormats(ajv);
|
|
5050
|
+
function parseMcpToolCall(value, allowedToolNames) {
|
|
5051
|
+
let parsed = value;
|
|
5052
|
+
if (typeof value === "string") try {
|
|
5053
|
+
parsed = JSON.parse(value);
|
|
5054
|
+
} catch {
|
|
5055
|
+
return;
|
|
5056
|
+
}
|
|
5057
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) return;
|
|
5058
|
+
const record = parsed;
|
|
5059
|
+
const toolName = TOOL_NAME_FIELDS.map((field) => record[field]).find((fieldValue) => typeof fieldValue === "string" && allowedToolNames.has(fieldValue));
|
|
5060
|
+
if (!toolName) return;
|
|
5061
|
+
return {
|
|
5062
|
+
tool: toolName,
|
|
5063
|
+
args: TOOL_ARGS_FIELDS.map((field) => record[field]).find((fieldValue) => typeof fieldValue === "object" && fieldValue !== null && !Array.isArray(fieldValue)) ?? {}
|
|
5064
|
+
};
|
|
5065
|
+
}
|
|
5066
|
+
function validateMcpToolCall(toolCall, toolByName) {
|
|
5067
|
+
if (!toolCall) return false;
|
|
5068
|
+
const tool = toolByName.get(toolCall.tool);
|
|
5069
|
+
if (!tool) return false;
|
|
5070
|
+
try {
|
|
5071
|
+
return ajv.validate(tool.inputSchema ?? { type: "object" }, toolCall.args) === true;
|
|
5072
|
+
} catch (error) {
|
|
5073
|
+
logger.warn(`Failed to validate MCP tool call for ${tool.name}: ${error instanceof Error ? error.message : String(error)}`);
|
|
5074
|
+
return false;
|
|
5075
|
+
}
|
|
5076
|
+
}
|
|
5077
|
+
function stringifyToolCall(toolCall) {
|
|
5078
|
+
return JSON.stringify({
|
|
5079
|
+
tool: toolCall.tool,
|
|
5080
|
+
args: toolCall.args
|
|
5081
|
+
});
|
|
5082
|
+
}
|
|
5083
|
+
function getProviderOutputString(response) {
|
|
5084
|
+
if (Array.isArray(response.output)) return response.output.join("\n");
|
|
5085
|
+
return response.output === void 0 ? "" : String(response.output);
|
|
5086
|
+
}
|
|
5087
|
+
async function repairMcpToolCallWithProvider({ allowedToolNames, purpose, provider, toolByName, tools, value }) {
|
|
5088
|
+
let response;
|
|
5089
|
+
try {
|
|
5090
|
+
response = await provider.callApi(dedent`
|
|
5091
|
+
Convert this red team test intent into exactly one MCP tool call JSON object.
|
|
5092
|
+
|
|
5093
|
+
Return JSON only, with this exact shape:
|
|
5094
|
+
{"tool":"tool_name","args":{}}
|
|
5095
|
+
|
|
5096
|
+
Choose only one of these MCP tools and use its input schema:
|
|
5097
|
+
${JSON.stringify(tools, null, 2)}
|
|
5098
|
+
|
|
5099
|
+
Application purpose:
|
|
5100
|
+
${purpose}
|
|
5101
|
+
|
|
5102
|
+
Red team test intent:
|
|
5103
|
+
${typeof value === "string" ? value : JSON.stringify(value)}
|
|
5104
|
+
`.trim());
|
|
5105
|
+
} catch (error) {
|
|
5106
|
+
logger.debug(`Failed to repair MCP value with provider: ${error instanceof Error ? error.message : String(error)}`);
|
|
5107
|
+
return;
|
|
5108
|
+
}
|
|
5109
|
+
if (response.error) {
|
|
5110
|
+
logger.warn(`Failed to materialize MCP value: ${response.error}`);
|
|
5111
|
+
return;
|
|
5112
|
+
}
|
|
5113
|
+
const parsedObjects = extractJsonObjects(getProviderOutputString(response));
|
|
5114
|
+
for (const parsedObject of parsedObjects) {
|
|
5115
|
+
const toolCall = parseMcpToolCall(parsedObject, allowedToolNames);
|
|
5116
|
+
if (validateMcpToolCall(toolCall, toolByName)) return toolCall;
|
|
5117
|
+
}
|
|
5118
|
+
}
|
|
5119
|
+
async function materializeMcpValue({ intentValue, purpose, provider, tools, value }) {
|
|
5120
|
+
if (tools.length === 0) return typeof value === "string" ? value : value === void 0 ? "" : JSON.stringify(value);
|
|
5121
|
+
const allowedToolNames = new Set(tools.map((tool) => tool.name));
|
|
5122
|
+
const toolByName = new Map(tools.map((tool) => [tool.name, tool]));
|
|
5123
|
+
const existingToolCall = parseMcpToolCall(value, allowedToolNames);
|
|
5124
|
+
if (existingToolCall && validateMcpToolCall(existingToolCall, toolByName)) return stringifyToolCall(existingToolCall);
|
|
5125
|
+
const materializationIntentValue = intentValue ?? value;
|
|
5126
|
+
if (!provider) throw new Error(`Failed to materialize MCP value: inference provider is required for non-JSON MCP input ${JSON.stringify(value)}`);
|
|
5127
|
+
const toolCall = await repairMcpToolCallWithProvider({
|
|
5128
|
+
allowedToolNames,
|
|
5129
|
+
provider,
|
|
5130
|
+
purpose: purpose ?? "",
|
|
5131
|
+
toolByName,
|
|
5132
|
+
tools,
|
|
5133
|
+
value: materializationIntentValue
|
|
5134
|
+
});
|
|
5135
|
+
if (!toolCall || !validateMcpToolCall(toolCall, toolByName)) throw new Error(`Failed to materialize MCP value: ${JSON.stringify(value)}`);
|
|
5136
|
+
return stringifyToolCall(toolCall);
|
|
5137
|
+
}
|
|
5138
|
+
//#endregion
|
|
5139
|
+
//#region src/redteam/mcpTargetProvider.ts
|
|
5140
|
+
const WRAPPED_MCP_PROVIDER = Symbol("wrappedMcpProvider");
|
|
5141
|
+
function isRedteamTest(test) {
|
|
5142
|
+
return Boolean(test?.metadata?.pluginId || test?.metadata?.strategyId);
|
|
5143
|
+
}
|
|
5144
|
+
function isMcpProviderWithTools(provider) {
|
|
5145
|
+
return provider instanceof MCPProvider && typeof provider.getAvailableTools === "function";
|
|
5146
|
+
}
|
|
5147
|
+
var RedteamMcpTargetProvider = class {
|
|
5148
|
+
[WRAPPED_MCP_PROVIDER] = true;
|
|
5149
|
+
label;
|
|
5150
|
+
config;
|
|
5151
|
+
delay;
|
|
5152
|
+
transform;
|
|
5153
|
+
inputs;
|
|
5154
|
+
toolsPromise;
|
|
5155
|
+
constructor(target) {
|
|
5156
|
+
this.target = target;
|
|
5157
|
+
this.label = target.label;
|
|
5158
|
+
this.config = target.config;
|
|
5159
|
+
this.delay = target.delay;
|
|
5160
|
+
this.transform = target.transform;
|
|
5161
|
+
this.inputs = target.inputs;
|
|
5162
|
+
}
|
|
5163
|
+
id() {
|
|
5164
|
+
return this.target.id();
|
|
5165
|
+
}
|
|
5166
|
+
toString() {
|
|
5167
|
+
return this.target.toString?.() ?? this.id();
|
|
5168
|
+
}
|
|
5169
|
+
async callApi(prompt, context, options) {
|
|
5170
|
+
const tools = await this.getTools();
|
|
5171
|
+
if (tools.length === 0) return this.target.callApi(prompt, context, options);
|
|
5172
|
+
try {
|
|
5173
|
+
const intentValue = context?.test?.metadata?.goal ?? context?.test?.metadata?.originalPrompt ?? prompt;
|
|
5174
|
+
const purpose = String(context?.test?.metadata?.purpose ?? "");
|
|
5175
|
+
let materializedPrompt;
|
|
5176
|
+
try {
|
|
5177
|
+
materializedPrompt = await materializeMcpValue({
|
|
5178
|
+
intentValue,
|
|
5179
|
+
purpose,
|
|
5180
|
+
tools,
|
|
5181
|
+
value: prompt
|
|
5182
|
+
});
|
|
5183
|
+
} catch (error) {
|
|
5184
|
+
logger.debug(`MCP target prompt requires inference materialization: ${error instanceof Error ? error.message : String(error)}`);
|
|
5185
|
+
materializedPrompt = await materializeMcpValue({
|
|
5186
|
+
intentValue,
|
|
5187
|
+
provider: await redteamProviderManager.getProvider({ jsonOnly: true }),
|
|
5188
|
+
purpose,
|
|
5189
|
+
tools,
|
|
5190
|
+
value: prompt
|
|
5191
|
+
});
|
|
5192
|
+
}
|
|
5193
|
+
const materializedContext = context ? {
|
|
5194
|
+
...context,
|
|
5195
|
+
vars: {
|
|
5196
|
+
...context.vars,
|
|
5197
|
+
prompt: materializedPrompt
|
|
5198
|
+
}
|
|
5199
|
+
} : void 0;
|
|
5200
|
+
return this.target.callApi(materializedPrompt, materializedContext, options);
|
|
5201
|
+
} catch (error) {
|
|
5202
|
+
return { error: `Failed to materialize MCP target prompt: ${error instanceof Error ? error.message : String(error)}` };
|
|
5203
|
+
}
|
|
5204
|
+
}
|
|
5205
|
+
async cleanup() {
|
|
5206
|
+
await this.target.cleanup?.();
|
|
5207
|
+
}
|
|
5208
|
+
getTools() {
|
|
5209
|
+
this.toolsPromise ??= this.target.getAvailableTools();
|
|
5210
|
+
return this.toolsPromise;
|
|
5211
|
+
}
|
|
5212
|
+
};
|
|
5213
|
+
function maybeWrapMcpProviderForRedteam(provider, test) {
|
|
5214
|
+
if (!isRedteamTest(test) || provider[WRAPPED_MCP_PROVIDER]) return provider;
|
|
5215
|
+
return isMcpProviderWithTools(provider) ? new RedteamMcpTargetProvider(provider) : provider;
|
|
5216
|
+
}
|
|
5217
|
+
//#endregion
|
|
5028
5218
|
//#region src/scheduler/providerCallQueue.ts
|
|
5029
5219
|
var ProviderGroupedCallQueue = class {
|
|
5030
5220
|
jobs = [];
|
|
@@ -5834,12 +6024,13 @@ async function callProviderForRunEval({ abortSignal, evalId, evaluateOptions, fi
|
|
|
5834
6024
|
};
|
|
5835
6025
|
}
|
|
5836
6026
|
async function callActiveProvider({ abortSignal, evalId, filters, promptForRender, provider, rateLimitRegistry, renderedPrompt, repeatIndex, test, traceContext, vars }) {
|
|
5837
|
-
const
|
|
6027
|
+
const originalProvider = maybeWrapMcpProviderForRedteam(provider, test);
|
|
6028
|
+
const activeProvider = maybeWrapMcpProviderForRedteam(isApiProvider(test.provider) ? test.provider : originalProvider, test);
|
|
5838
6029
|
logger.debug(`Provider type: ${activeProvider.id()}`);
|
|
5839
6030
|
const callApiContext = buildCallApiContext({
|
|
5840
6031
|
evalId,
|
|
5841
6032
|
filters,
|
|
5842
|
-
originalProvider
|
|
6033
|
+
originalProvider,
|
|
5843
6034
|
promptForRender,
|
|
5844
6035
|
repeatIndex,
|
|
5845
6036
|
test,
|
|
@@ -6565,7 +6756,7 @@ async function resolveDefaultTestProvider(defaultTest, testCase) {
|
|
|
6565
6756
|
const defaultProvider = defaultTest.provider;
|
|
6566
6757
|
if (isApiProvider(defaultProvider)) return defaultProvider;
|
|
6567
6758
|
if (typeof defaultProvider === "object" && defaultProvider.id) {
|
|
6568
|
-
const { loadApiProvider } = await import("./providers-
|
|
6759
|
+
const { loadApiProvider } = await import("./providers-BIgLuX4Z.js");
|
|
6569
6760
|
return loadApiProvider(typeof defaultProvider.id === "function" ? defaultProvider.id() : defaultProvider.id, { options: defaultProvider });
|
|
6570
6761
|
}
|
|
6571
6762
|
return defaultProvider;
|
|
@@ -6725,7 +6916,7 @@ function buildRepeatCacheContextByTestIdx(runEvalOptions) {
|
|
|
6725
6916
|
async function filterCompletedResumeSteps(runEvalOptions, evalRecord) {
|
|
6726
6917
|
if (!state.resume || !evalRecord.persisted) return;
|
|
6727
6918
|
try {
|
|
6728
|
-
const { default: EvalResult } = await import("./evalResult-
|
|
6919
|
+
const { default: EvalResult } = await import("./evalResult-B6Jpy3kJ.js");
|
|
6729
6920
|
const completedPairs = await EvalResult.getCompletedIndexPairs(evalRecord.id, { excludeErrors: state.retryMode });
|
|
6730
6921
|
const originalCount = runEvalOptions.length;
|
|
6731
6922
|
for (let i = runEvalOptions.length - 1; i >= 0; i--) {
|
|
@@ -7835,4 +8026,4 @@ function evaluate(testSuite, evalRecord, options) {
|
|
|
7835
8026
|
//#endregion
|
|
7836
8027
|
export { generateVarCombinations as a, doesPromptRefMatch as c, runAssertions as d, formatVarsForDisplay as i, warnEmptyFilterRange as l, PromptSuggestionsRejectedError as n, isAllowedPrompt as o, evaluate as r, accumulateNamedMetric as s, ProgressBarManager as t, readAssertions as u };
|
|
7837
8028
|
|
|
7838
|
-
//# sourceMappingURL=evaluator-
|
|
8029
|
+
//# sourceMappingURL=evaluator-DbOsHSRe.js.map
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
const require_rolldown_runtime = require("./rolldown-runtime-D_mwlA32.cjs");
|
|
2
2
|
const require_logger = require("./logger-DPITYeiW.cjs");
|
|
3
3
|
const require_invariant = require("./invariant-QtnLD03y.cjs");
|
|
4
|
-
const require_fetch = require("./fetch-
|
|
4
|
+
const require_fetch = require("./fetch-C7yU9CNr.cjs");
|
|
5
5
|
const require_fileExtensions = require("./fileExtensions-DB9eTs4y.cjs");
|
|
6
6
|
const require_esm = require("./esm-BXQgvlCe.cjs");
|
|
7
|
-
const require_util = require("./util-
|
|
7
|
+
const require_util = require("./util-tFLdovkA.cjs");
|
|
8
8
|
const require_pythonUtils = require("./pythonUtils-Dm5aZDp2.cjs");
|
|
9
|
-
const require_telemetry = require("./telemetry-
|
|
9
|
+
const require_telemetry = require("./telemetry-hDovhwWp.cjs");
|
|
10
10
|
const require_packageParser = require("./packageParser-ClroutLT.cjs");
|
|
11
11
|
const require_transform = require("./transform-vjEQU-TM.cjs");
|
|
12
12
|
let fs_promises = require("fs/promises");
|
|
@@ -533,4 +533,4 @@ Object.defineProperty(exports, "runExtensionHook", {
|
|
|
533
533
|
}
|
|
534
534
|
});
|
|
535
535
|
|
|
536
|
-
//# sourceMappingURL=evaluatorHelpers-
|
|
536
|
+
//# sourceMappingURL=evaluatorHelpers-CaaC50RB.cjs.map
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { E as getEnvBool, P as state, c as logger, k as getEnvString } from "./logger-DNHkR_3S.js";
|
|
3
|
-
import { r as fetchWithProxy } from "./fetch-
|
|
3
|
+
import { r as fetchWithProxy } from "./fetch-B1Rb0VdL.js";
|
|
4
4
|
import { t as invariant } from "./invariant-BtWWVVhl.js";
|
|
5
|
-
import { n as telemetry } from "./telemetry-
|
|
5
|
+
import { n as telemetry } from "./telemetry-C7v0I4YX.js";
|
|
6
6
|
import { a as isVideoFile, i as isJavascriptFile, n as isAudioFile, r as isImageFile } from "./fileExtensions-PGPK8Wcw.js";
|
|
7
7
|
import { r as importModule } from "./esm-ClRKphVo.js";
|
|
8
|
-
import { G as renderVarsInObject, Y as getNunjucksEngine, q as extractVariablesFromTemplate } from "./util-
|
|
8
|
+
import { G as renderVarsInObject, Y as getNunjucksEngine, q as extractVariablesFromTemplate } from "./util-CcW4TZSn.js";
|
|
9
9
|
import { r as runPython } from "./pythonUtils-yoUkCRXx.js";
|
|
10
10
|
import { n as loadFromPackage, t as isPackagePath } from "./packageParser-C_T8xu-D.js";
|
|
11
11
|
import { o as transform } from "./transform-Dou53MRF2.js";
|
|
@@ -507,4 +507,4 @@ async function runExtensionHook(extensions, hookName, context) {
|
|
|
507
507
|
//#endregion
|
|
508
508
|
export { filterFiniteScores as i, renderPrompt as n, runExtensionHook as r, collectFileMetadata as t };
|
|
509
509
|
|
|
510
|
-
//# sourceMappingURL=evaluatorHelpers-
|
|
510
|
+
//# sourceMappingURL=evaluatorHelpers-CoLW5rKU.js.map
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { A as state, C as getEnvBool, E as getEnvString, o as logger } from "./logger-2ZstxKQf.js";
|
|
2
2
|
import { t as invariant } from "./invariant-Ddh24eXh.js";
|
|
3
|
-
import { t as fetchWithProxy } from "./fetch-
|
|
3
|
+
import { t as fetchWithProxy } from "./fetch-BNUDixbE.js";
|
|
4
4
|
import { a as isVideoFile, i as isJavascriptFile, n as isAudioFile, r as isImageFile } from "./fileExtensions-CvD3YVfM.js";
|
|
5
5
|
import { r as importModule } from "./esm-D78sHVp9.js";
|
|
6
|
-
import { B as getNunjucksEngine, I as renderVarsInObject, R as extractVariablesFromTemplate } from "./util-
|
|
6
|
+
import { B as getNunjucksEngine, I as renderVarsInObject, R as extractVariablesFromTemplate } from "./util-BTAyQmdN.js";
|
|
7
7
|
import { r as runPython } from "./pythonUtils-E3AlITsZ.js";
|
|
8
|
-
import { t as telemetry } from "./telemetry-
|
|
8
|
+
import { t as telemetry } from "./telemetry-CTYOje0d.js";
|
|
9
9
|
import { n as loadFromPackage, t as isPackagePath } from "./packageParser-D0SUUwqU.js";
|
|
10
10
|
import { o as transform } from "./transform-5CliVIgB.js";
|
|
11
11
|
import fs from "fs/promises";
|
|
@@ -506,4 +506,4 @@ async function runExtensionHook(extensions, hookName, context) {
|
|
|
506
506
|
//#endregion
|
|
507
507
|
export { filterFiniteScores as i, renderPrompt as n, runExtensionHook as r, collectFileMetadata as t };
|
|
508
508
|
|
|
509
|
-
//# sourceMappingURL=evaluatorHelpers-
|
|
509
|
+
//# sourceMappingURL=evaluatorHelpers-DTtYkrGO.js.map
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { C as getEnvBool, o as logger } from "./logger-2ZstxKQf.js";
|
|
2
|
-
import { M as cloudConfig } from "./fetch-
|
|
3
|
-
import { s as isLoggedIntoCloud } from "./accounts-
|
|
4
|
-
import { n as
|
|
2
|
+
import { M as cloudConfig } from "./fetch-BNUDixbE.js";
|
|
3
|
+
import { s as isLoggedIntoCloud } from "./accounts-BGs8AMhG.js";
|
|
4
|
+
import { n as sha256 } from "./createHash-CM2Vkqac.js";
|
|
5
|
+
import { a as BLOB_MIN_SIZE, n as recordBlobReference, o as BLOB_SCHEME, r as storeBlob } from "./blobs-B8d9jKvz.js";
|
|
6
|
+
import { XMLParser, XMLValidator } from "fast-xml-parser";
|
|
5
7
|
//#region src/blobs/remoteUpload.ts
|
|
6
8
|
function buildRemoteUploadTarget() {
|
|
7
9
|
if (getEnvBool("PROMPTFOO_DISABLE_SHARING")) return null;
|
|
@@ -28,7 +30,7 @@ async function uploadBlobRemote(buffer, mimeType, context) {
|
|
|
28
30
|
const target = buildRemoteUploadTarget();
|
|
29
31
|
if (!target) return null;
|
|
30
32
|
try {
|
|
31
|
-
const { fetchWithProxy } = await import("./fetch-
|
|
33
|
+
const { fetchWithProxy } = await import("./fetch-BNUDixbE.js").then((n) => n.i);
|
|
32
34
|
const response = await fetchWithProxy(target.url, {
|
|
33
35
|
method: "POST",
|
|
34
36
|
headers: {
|
|
@@ -86,9 +88,9 @@ function extractBase64(value) {
|
|
|
86
88
|
return null;
|
|
87
89
|
}
|
|
88
90
|
}
|
|
89
|
-
function shouldExternalize(buffer) {
|
|
91
|
+
function shouldExternalize(buffer, minSizeBytes = BLOB_MIN_SIZE) {
|
|
90
92
|
const size = buffer.length;
|
|
91
|
-
return size >=
|
|
93
|
+
return size >= minSizeBytes && size <= 52428800;
|
|
92
94
|
}
|
|
93
95
|
function getKindFromMimeType(mimeType) {
|
|
94
96
|
return mimeType.startsWith("audio/") ? "audio" : "image";
|
|
@@ -135,9 +137,9 @@ function parseBinary(base64OrDataUrl, defaultMimeType) {
|
|
|
135
137
|
return null;
|
|
136
138
|
}
|
|
137
139
|
}
|
|
138
|
-
async function maybeStore(base64OrDataUrl, defaultMimeType, context, location, kind) {
|
|
140
|
+
async function maybeStore(base64OrDataUrl, defaultMimeType, context, location, kind, minSizeBytes = BLOB_MIN_SIZE) {
|
|
139
141
|
const parsed = parseBinary(base64OrDataUrl, defaultMimeType);
|
|
140
|
-
if (!parsed || !shouldExternalize(parsed.buffer)) return null;
|
|
142
|
+
if (!parsed || !shouldExternalize(parsed.buffer, minSizeBytes)) return null;
|
|
141
143
|
if (!isBlobStorageEnabled()) return null;
|
|
142
144
|
const mimeType = parsed.mimeType || "application/octet-stream";
|
|
143
145
|
const { ref } = await storeBlob(parsed.buffer, mimeType, {
|
|
@@ -161,13 +163,13 @@ async function maybeStore(base64OrDataUrl, defaultMimeType, context, location, k
|
|
|
161
163
|
}
|
|
162
164
|
function createStoreOnce(blobContext) {
|
|
163
165
|
const cache = /* @__PURE__ */ new Map();
|
|
164
|
-
return async (base64OrDataUrl, defaultMimeType, location, kind) => {
|
|
166
|
+
return async (base64OrDataUrl, defaultMimeType, location, kind, minSizeBytes) => {
|
|
165
167
|
const parsed = parseBinary(base64OrDataUrl, defaultMimeType);
|
|
166
|
-
if (!parsed || !shouldExternalize(parsed.buffer)) return null;
|
|
168
|
+
if (!parsed || !shouldExternalize(parsed.buffer, minSizeBytes)) return null;
|
|
167
169
|
const cacheKey = `${kind}:${parsed.buffer.toString("base64")}`;
|
|
168
170
|
const existing = cache.get(cacheKey);
|
|
169
171
|
if (existing) return existing;
|
|
170
|
-
const pendingStore = maybeStore(base64OrDataUrl, defaultMimeType, blobContext, location, kind);
|
|
172
|
+
const pendingStore = maybeStore(base64OrDataUrl, defaultMimeType, blobContext, location, kind, minSizeBytes);
|
|
171
173
|
cache.set(cacheKey, pendingStore);
|
|
172
174
|
try {
|
|
173
175
|
const stored = await pendingStore;
|
|
@@ -179,6 +181,57 @@ function createStoreOnce(blobContext) {
|
|
|
179
181
|
}
|
|
180
182
|
};
|
|
181
183
|
}
|
|
184
|
+
function getRawSvgOutputPreview(output) {
|
|
185
|
+
const trimmed = output.trim();
|
|
186
|
+
if (!trimmed.startsWith("<")) return null;
|
|
187
|
+
if (XMLValidator.validate(trimmed) !== true) return null;
|
|
188
|
+
try {
|
|
189
|
+
const parsed = new XMLParser({ ignoreAttributes: false }).parse(trimmed);
|
|
190
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed) || !("svg" in parsed)) return null;
|
|
191
|
+
} catch {
|
|
192
|
+
return null;
|
|
193
|
+
}
|
|
194
|
+
const buffer = Buffer.from(trimmed, "utf8");
|
|
195
|
+
return {
|
|
196
|
+
dataUrl: `data:image/svg+xml;base64,${buffer.toString("base64")}`,
|
|
197
|
+
uri: `${BLOB_SCHEME}${sha256(buffer)}`
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
function appendMetadataBlobUri(metadata, uri) {
|
|
201
|
+
const existingBlobUris = Array.isArray(metadata?.blobUris) ? metadata.blobUris.filter((value) => typeof value === "string") : [];
|
|
202
|
+
return {
|
|
203
|
+
...metadata || {},
|
|
204
|
+
blobUris: [...new Set([...existingBlobUris, uri])]
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
async function storeRawSvgOutputPreview(output, metadata, storeOnce, context) {
|
|
208
|
+
if (typeof output !== "string") return {
|
|
209
|
+
metadata,
|
|
210
|
+
mutated: false
|
|
211
|
+
};
|
|
212
|
+
const preview = getRawSvgOutputPreview(output);
|
|
213
|
+
if (!preview) return {
|
|
214
|
+
metadata,
|
|
215
|
+
mutated: false
|
|
216
|
+
};
|
|
217
|
+
if ((Array.isArray(metadata?.blobUris) ? metadata.blobUris.filter((value) => typeof value === "string") : []).includes(preview.uri)) return {
|
|
218
|
+
metadata,
|
|
219
|
+
mutated: false
|
|
220
|
+
};
|
|
221
|
+
const stored = await storeOnce(preview.dataUrl, "image/svg+xml", "response.output", "image", 0);
|
|
222
|
+
if (!stored) return {
|
|
223
|
+
metadata,
|
|
224
|
+
mutated: false
|
|
225
|
+
};
|
|
226
|
+
logger.debug("[BlobExtractor] Stored raw SVG output blob", {
|
|
227
|
+
...context,
|
|
228
|
+
hash: stored.hash
|
|
229
|
+
});
|
|
230
|
+
return {
|
|
231
|
+
metadata: appendMetadataBlobUri(metadata, stored.uri),
|
|
232
|
+
mutated: true
|
|
233
|
+
};
|
|
234
|
+
}
|
|
182
235
|
async function externalizeDataUrls(value, storeOnce, location) {
|
|
183
236
|
if (typeof value === "string") {
|
|
184
237
|
if (!isDataUrl(value)) return {
|
|
@@ -312,6 +365,11 @@ async function extractAndStoreBinaryData(response, context) {
|
|
|
312
365
|
}
|
|
313
366
|
return img;
|
|
314
367
|
}));
|
|
368
|
+
const rawSvgPreview = await storeRawSvgOutputPreview(response.output, next.metadata || response.metadata, storeOnce, context);
|
|
369
|
+
if (rawSvgPreview.mutated) {
|
|
370
|
+
next.metadata = rawSvgPreview.metadata;
|
|
371
|
+
mutated = true;
|
|
372
|
+
}
|
|
315
373
|
const turns = response.turns;
|
|
316
374
|
if (Array.isArray(turns)) next.turns = await Promise.all(turns.map(async (turn, idx) => {
|
|
317
375
|
if (turn?.audio?.data && typeof turn.audio.data === "string") {
|
|
@@ -429,4 +487,4 @@ async function recordExistingBlobReferences(value, context, location) {
|
|
|
429
487
|
//#endregion
|
|
430
488
|
export { isBlobStorageEnabled as n, shouldAttemptRemoteBlobUpload as r, extractAndStoreBinaryData as t };
|
|
431
489
|
|
|
432
|
-
//# sourceMappingURL=extractor-
|
|
490
|
+
//# sourceMappingURL=extractor-BIqe0lMN.js.map
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
+
require("./rolldown-runtime-D_mwlA32.cjs");
|
|
1
2
|
const require_logger = require("./logger-DPITYeiW.cjs");
|
|
2
|
-
const require_fetch = require("./fetch-
|
|
3
|
-
const require_accounts = require("./accounts-
|
|
4
|
-
const
|
|
3
|
+
const require_fetch = require("./fetch-C7yU9CNr.cjs");
|
|
4
|
+
const require_accounts = require("./accounts-C6NiTdum.cjs");
|
|
5
|
+
const require_createHash = require("./createHash-CF-N1FBc.cjs");
|
|
6
|
+
const require_blobs = require("./blobs-BcpoigIU.cjs");
|
|
7
|
+
let fast_xml_parser = require("fast-xml-parser");
|
|
5
8
|
//#region src/blobs/remoteUpload.ts
|
|
6
9
|
function buildRemoteUploadTarget() {
|
|
7
10
|
if (require_logger.getEnvBool("PROMPTFOO_DISABLE_SHARING")) return null;
|
|
@@ -28,7 +31,7 @@ async function uploadBlobRemote(buffer, mimeType, context) {
|
|
|
28
31
|
const target = buildRemoteUploadTarget();
|
|
29
32
|
if (!target) return null;
|
|
30
33
|
try {
|
|
31
|
-
const { fetchWithProxy } = await Promise.resolve().then(() => require("./fetch-
|
|
34
|
+
const { fetchWithProxy } = await Promise.resolve().then(() => require("./fetch-C7yU9CNr.cjs")).then((n) => n.fetch_exports);
|
|
32
35
|
const response = await fetchWithProxy(target.url, {
|
|
33
36
|
method: "POST",
|
|
34
37
|
headers: {
|
|
@@ -86,9 +89,9 @@ function extractBase64(value) {
|
|
|
86
89
|
return null;
|
|
87
90
|
}
|
|
88
91
|
}
|
|
89
|
-
function shouldExternalize(buffer) {
|
|
92
|
+
function shouldExternalize(buffer, minSizeBytes = require_blobs.BLOB_MIN_SIZE) {
|
|
90
93
|
const size = buffer.length;
|
|
91
|
-
return size >=
|
|
94
|
+
return size >= minSizeBytes && size <= 52428800;
|
|
92
95
|
}
|
|
93
96
|
function getKindFromMimeType(mimeType) {
|
|
94
97
|
return mimeType.startsWith("audio/") ? "audio" : "image";
|
|
@@ -135,9 +138,9 @@ function parseBinary(base64OrDataUrl, defaultMimeType) {
|
|
|
135
138
|
return null;
|
|
136
139
|
}
|
|
137
140
|
}
|
|
138
|
-
async function maybeStore(base64OrDataUrl, defaultMimeType, context, location, kind) {
|
|
141
|
+
async function maybeStore(base64OrDataUrl, defaultMimeType, context, location, kind, minSizeBytes = require_blobs.BLOB_MIN_SIZE) {
|
|
139
142
|
const parsed = parseBinary(base64OrDataUrl, defaultMimeType);
|
|
140
|
-
if (!parsed || !shouldExternalize(parsed.buffer)) return null;
|
|
143
|
+
if (!parsed || !shouldExternalize(parsed.buffer, minSizeBytes)) return null;
|
|
141
144
|
if (!isBlobStorageEnabled()) return null;
|
|
142
145
|
const mimeType = parsed.mimeType || "application/octet-stream";
|
|
143
146
|
const { ref } = await require_blobs.storeBlob(parsed.buffer, mimeType, {
|
|
@@ -161,13 +164,13 @@ async function maybeStore(base64OrDataUrl, defaultMimeType, context, location, k
|
|
|
161
164
|
}
|
|
162
165
|
function createStoreOnce(blobContext) {
|
|
163
166
|
const cache = /* @__PURE__ */ new Map();
|
|
164
|
-
return async (base64OrDataUrl, defaultMimeType, location, kind) => {
|
|
167
|
+
return async (base64OrDataUrl, defaultMimeType, location, kind, minSizeBytes) => {
|
|
165
168
|
const parsed = parseBinary(base64OrDataUrl, defaultMimeType);
|
|
166
|
-
if (!parsed || !shouldExternalize(parsed.buffer)) return null;
|
|
169
|
+
if (!parsed || !shouldExternalize(parsed.buffer, minSizeBytes)) return null;
|
|
167
170
|
const cacheKey = `${kind}:${parsed.buffer.toString("base64")}`;
|
|
168
171
|
const existing = cache.get(cacheKey);
|
|
169
172
|
if (existing) return existing;
|
|
170
|
-
const pendingStore = maybeStore(base64OrDataUrl, defaultMimeType, blobContext, location, kind);
|
|
173
|
+
const pendingStore = maybeStore(base64OrDataUrl, defaultMimeType, blobContext, location, kind, minSizeBytes);
|
|
171
174
|
cache.set(cacheKey, pendingStore);
|
|
172
175
|
try {
|
|
173
176
|
const stored = await pendingStore;
|
|
@@ -179,6 +182,57 @@ function createStoreOnce(blobContext) {
|
|
|
179
182
|
}
|
|
180
183
|
};
|
|
181
184
|
}
|
|
185
|
+
function getRawSvgOutputPreview(output) {
|
|
186
|
+
const trimmed = output.trim();
|
|
187
|
+
if (!trimmed.startsWith("<")) return null;
|
|
188
|
+
if (fast_xml_parser.XMLValidator.validate(trimmed) !== true) return null;
|
|
189
|
+
try {
|
|
190
|
+
const parsed = new fast_xml_parser.XMLParser({ ignoreAttributes: false }).parse(trimmed);
|
|
191
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed) || !("svg" in parsed)) return null;
|
|
192
|
+
} catch {
|
|
193
|
+
return null;
|
|
194
|
+
}
|
|
195
|
+
const buffer = Buffer.from(trimmed, "utf8");
|
|
196
|
+
return {
|
|
197
|
+
dataUrl: `data:image/svg+xml;base64,${buffer.toString("base64")}`,
|
|
198
|
+
uri: `${require_blobs.BLOB_SCHEME}${require_createHash.sha256(buffer)}`
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
function appendMetadataBlobUri(metadata, uri) {
|
|
202
|
+
const existingBlobUris = Array.isArray(metadata?.blobUris) ? metadata.blobUris.filter((value) => typeof value === "string") : [];
|
|
203
|
+
return {
|
|
204
|
+
...metadata || {},
|
|
205
|
+
blobUris: [...new Set([...existingBlobUris, uri])]
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
async function storeRawSvgOutputPreview(output, metadata, storeOnce, context) {
|
|
209
|
+
if (typeof output !== "string") return {
|
|
210
|
+
metadata,
|
|
211
|
+
mutated: false
|
|
212
|
+
};
|
|
213
|
+
const preview = getRawSvgOutputPreview(output);
|
|
214
|
+
if (!preview) return {
|
|
215
|
+
metadata,
|
|
216
|
+
mutated: false
|
|
217
|
+
};
|
|
218
|
+
if ((Array.isArray(metadata?.blobUris) ? metadata.blobUris.filter((value) => typeof value === "string") : []).includes(preview.uri)) return {
|
|
219
|
+
metadata,
|
|
220
|
+
mutated: false
|
|
221
|
+
};
|
|
222
|
+
const stored = await storeOnce(preview.dataUrl, "image/svg+xml", "response.output", "image", 0);
|
|
223
|
+
if (!stored) return {
|
|
224
|
+
metadata,
|
|
225
|
+
mutated: false
|
|
226
|
+
};
|
|
227
|
+
require_logger.logger.debug("[BlobExtractor] Stored raw SVG output blob", {
|
|
228
|
+
...context,
|
|
229
|
+
hash: stored.hash
|
|
230
|
+
});
|
|
231
|
+
return {
|
|
232
|
+
metadata: appendMetadataBlobUri(metadata, stored.uri),
|
|
233
|
+
mutated: true
|
|
234
|
+
};
|
|
235
|
+
}
|
|
182
236
|
async function externalizeDataUrls(value, storeOnce, location) {
|
|
183
237
|
if (typeof value === "string") {
|
|
184
238
|
if (!isDataUrl(value)) return {
|
|
@@ -312,6 +366,11 @@ async function extractAndStoreBinaryData(response, context) {
|
|
|
312
366
|
}
|
|
313
367
|
return img;
|
|
314
368
|
}));
|
|
369
|
+
const rawSvgPreview = await storeRawSvgOutputPreview(response.output, next.metadata || response.metadata, storeOnce, context);
|
|
370
|
+
if (rawSvgPreview.mutated) {
|
|
371
|
+
next.metadata = rawSvgPreview.metadata;
|
|
372
|
+
mutated = true;
|
|
373
|
+
}
|
|
315
374
|
const turns = response.turns;
|
|
316
375
|
if (Array.isArray(turns)) next.turns = await Promise.all(turns.map(async (turn, idx) => {
|
|
317
376
|
if (turn?.audio?.data && typeof turn.audio.data === "string") {
|
|
@@ -446,4 +505,4 @@ Object.defineProperty(exports, "shouldAttemptRemoteBlobUpload", {
|
|
|
446
505
|
}
|
|
447
506
|
});
|
|
448
507
|
|
|
449
|
-
//# sourceMappingURL=extractor-
|
|
508
|
+
//# sourceMappingURL=extractor-CUVurbDW.cjs.map
|