promptfoo 0.125.0 → 0.125.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/src/accounts-BOxNYxVN.js +229 -0
- package/dist/src/accounts-BezXLdAW.cjs +276 -0
- package/dist/src/accounts-CPISMNlh.js +227 -0
- package/dist/src/accounts-vJBPs89d.js +222 -0
- package/dist/src/agentWorkspace-Bom7SpF2.js +592 -0
- package/dist/src/agentWorkspace-CEomAcws.cjs +619 -0
- package/dist/src/agentWorkspace-DPtMLrlI.js +593 -0
- package/dist/src/agentWorkspace-DkAeEYLz.js +592 -0
- package/dist/src/agentic-utils-121v7mJo.js +197 -0
- package/dist/src/agentic-utils-CBWD_rcd.cjs +237 -0
- package/dist/src/agentic-utils-D8wyQwPG.js +198 -0
- package/dist/src/agentic-utils-EP1QkQCs.js +197 -0
- package/dist/src/agents-Br3ah8iA.js +778 -0
- package/dist/src/agents-C5wj_UTv.js +777 -0
- package/dist/src/agents-C9Efp4mC.js +266 -0
- package/dist/src/agents-CQYwaVCO.js +267 -0
- package/dist/src/agents-CjCd4Vo8.js +777 -0
- package/dist/src/agents-DRWiCHYz.js +266 -0
- package/dist/src/agents-F2rhx0iL.cjs +266 -0
- package/dist/src/agents-RTYyy69h.cjs +777 -0
- package/dist/src/agents-api-CY72O86e.js +711 -0
- package/dist/src/agents-api-CsSsC21b.js +710 -0
- package/dist/src/agents-api-DN-ibDc8.js +710 -0
- package/dist/src/agents-api-cNDsCCv1.cjs +710 -0
- package/dist/src/ai.studio-Bj6Dyi6o.js +2 -0
- package/dist/src/ai.studio-C-e0LzyW.js +369 -0
- package/dist/src/ai.studio-CR8M6Aqf.cjs +391 -0
- package/dist/src/ai.studio-YKk7F0tv.js +374 -0
- package/dist/src/aimlapi-BGunsuTu.js +30 -0
- package/dist/src/aimlapi-BkzcfBsL.js +29 -0
- package/dist/src/aimlapi-DXFcEdP8.js +28 -0
- package/dist/src/aimlapi-r-8iCcAw.cjs +29 -0
- package/dist/src/anthropicMessages-7-YNRgQR.js +114 -0
- package/dist/src/anthropicMessages-C8m9Whrd.cjs +114 -0
- package/dist/src/anthropicMessages-DS1vXD0f.js +115 -0
- package/dist/src/anthropicMessages-DmvGkz-0.js +114 -0
- package/dist/src/app/assets/index-CrdXWTXm.js +392 -0
- package/dist/src/app/browser-inventory.json +4 -4
- package/dist/src/app/index.html +1 -1
- package/dist/src/audio-BLgFgyw-.cjs +104 -0
- package/dist/src/audio-C2sibT7Q.js +104 -0
- package/dist/src/audio-DXEXb03H.js +104 -0
- package/dist/src/audio-TkvojpwO.js +105 -0
- package/dist/src/authoritativeMarkupInjection-BAT9B-Wj.js +79 -0
- package/dist/src/authoritativeMarkupInjection-B_yHETKT.js +78 -0
- package/dist/src/authoritativeMarkupInjection-BfjecQ3Q.cjs +78 -0
- package/dist/src/authoritativeMarkupInjection-D-hDKrhD.js +78 -0
- package/dist/src/aws-B_9unI_-.js +1149 -0
- package/dist/src/aws-D0FY3qkc.js +2433 -0
- package/dist/src/aws-Dh1-a90n.js +2433 -0
- package/dist/src/aws-qskKGczY.cjs +2454 -0
- package/dist/src/base-CaWlBkVz.js +462 -0
- package/dist/src/base-CcViNwVs.js +255 -0
- package/dist/src/base-CsVbPJkU.cjs +467 -0
- package/dist/src/base-DNK9py25.js +255 -0
- package/dist/src/base-DlH5tjEZ.js +463 -0
- package/dist/src/base-DyLOZ_iX.js +256 -0
- package/dist/src/base-RRYXfG7l.cjs +305 -0
- package/dist/src/base-oXVgvtVn.js +462 -0
- package/dist/src/bedrock-BP17ZXbR.cjs +2 -0
- package/dist/src/bedrock-CsjM1dOt.js +1300 -0
- package/dist/src/bedrock-CzPwj8GO.js +1 -0
- package/dist/src/bedrock-eGXZw8oh.js +1 -0
- package/dist/src/bedrock-tSWjmXdj.js +2 -0
- package/dist/src/bestOfN-BQ93nUKV.js +160 -0
- package/dist/src/bestOfN-ByGGwlcb.cjs +161 -0
- package/dist/src/bestOfN-CbP7csHr.js +159 -0
- package/dist/src/bestOfN-xn6i2Xs2.js +159 -0
- package/dist/src/cache-CHq9hPz9.js +2 -0
- package/dist/src/cache-D-9eZN3I.js +754 -0
- package/dist/src/cache-DSm6t1MZ.js +741 -0
- package/dist/src/cache-DeF5zIEN.js +782 -0
- package/dist/src/cache-iG87oYan.cjs +856 -0
- package/dist/src/cerebras-CTtM4yMH.js +98 -0
- package/dist/src/cerebras-CogcJ3ce.cjs +97 -0
- package/dist/src/cerebras-DmkRypTh.js +97 -0
- package/dist/src/cerebras-GUp0B8JY.js +97 -0
- package/dist/src/chat-B4ihd3fw.js +226 -0
- package/dist/src/chat-B9cAQ_rS.js +227 -0
- package/dist/src/chat-BU7EB4R-.cjs +76 -0
- package/dist/src/chat-C8yxJ2-s.cjs +226 -0
- package/dist/src/chat-ClTFM3qq.js +934 -0
- package/dist/src/chat-Cnq0Is68.js +123 -0
- package/dist/src/chat-CwrurR57.cjs +987 -0
- package/dist/src/chat-D0lsojPv.js +124 -0
- package/dist/src/chat-D7_8yFIx.js +76 -0
- package/dist/src/chat-DCoETlLG.js +226 -0
- package/dist/src/chat-DHE7xaTR.js +76 -0
- package/dist/src/chat-DmhT6rz2.cjs +123 -0
- package/dist/src/chat-DvfMe8KI.js +123 -0
- package/dist/src/chat-DwP5kVnl.js +935 -0
- package/dist/src/chat-MB7U-QE2.js +77 -0
- package/dist/src/chat-zCWuBKAj.js +934 -0
- package/dist/src/claude-agent-sdk-23bIVI75.js +999 -0
- package/dist/src/claude-agent-sdk-BACpnIJi.cjs +1005 -0
- package/dist/src/claude-agent-sdk-BlYlmcEr.js +999 -0
- package/dist/src/claude-agent-sdk-Cr-jqJZl.js +1000 -0
- package/dist/src/client-BktbiPx9.cjs +357 -0
- package/dist/src/client-CjztEBmW.js +351 -0
- package/dist/src/client-mRs2UvH9.js +351 -0
- package/dist/src/client-uCz0ydjC.js +352 -0
- package/dist/src/cloud-BtYF555L.js +2 -0
- package/dist/src/cloud-CVSUEmAy.js +287 -0
- package/dist/src/cloud-D7Ifb-Fl.js +599 -0
- package/dist/src/cloud-DB5oK5NX.cjs +666 -0
- package/dist/src/cloud-ecu989Em.js +657 -0
- package/dist/src/cloud-ramjGURF.js +599 -0
- package/dist/src/cloudflare-ai-BfDkIjO8.js +133 -0
- package/dist/src/cloudflare-ai-D9HaXz1M.js +134 -0
- package/dist/src/cloudflare-ai-HrD5WUK8.js +132 -0
- package/dist/src/cloudflare-ai-Qdj8aKP2.cjs +133 -0
- package/dist/src/cloudflare-gateway-C81uKETQ.js +276 -0
- package/dist/src/cloudflare-gateway-CX5Z9X0k.js +276 -0
- package/dist/src/cloudflare-gateway-DW-og8gb.js +277 -0
- package/dist/src/cloudflare-gateway-iRyXo9n2.cjs +276 -0
- package/dist/src/codex-app-server-BFIrSgdy.js +2155 -0
- package/dist/src/codex-app-server-By1eDVD4.js +2 -0
- package/dist/src/codex-app-server-DKsF4qmY.js +2156 -0
- package/dist/src/codex-app-server-n7n4uZzC.cjs +2162 -0
- package/dist/src/codex-app-server-xAoELVxu.js +2155 -0
- package/dist/src/codex-sdk-C2ZLxa6r.js +1552 -0
- package/dist/src/codex-sdk-CzG02tQt.cjs +1588 -0
- package/dist/src/codex-sdk-DNxAOhiV.js +2 -0
- package/dist/src/codex-sdk-DT3aQezK.js +1557 -0
- package/dist/src/codex-sdk-pw9DpcJP.js +1557 -0
- package/dist/src/codex-security-B0bLmXJF.js +406 -0
- package/dist/src/codex-security-BhYs-3iY.js +406 -0
- package/dist/src/codex-security-DQcOfxYW.js +407 -0
- package/dist/src/codex-security-DsCWr6GZ.cjs +411 -0
- package/dist/src/cometapi-B16asPLX.cjs +55 -0
- package/dist/src/cometapi-MgTbZA_H.js +53 -0
- package/dist/src/cometapi-i33vKzPV.js +55 -0
- package/dist/src/cometapi-wK2UWK0X.js +56 -0
- package/dist/src/compatible-COj8ZCy9.js +24 -0
- package/dist/src/compatible-CRSsIUGb.cjs +24 -0
- package/dist/src/compatible-Dy1vCcNF.js +25 -0
- package/dist/src/compatible-aUItQrpk.js +24 -0
- package/dist/src/completion-Bn7COFMk.js +119 -0
- package/dist/src/completion-Bub2N48b.js +118 -0
- package/dist/src/completion-Cf2G9OlM.cjs +123 -0
- package/dist/src/conversationScoring-BiTYJ9MD.js +374 -0
- package/dist/src/conversationScoring-CKL47uIu.js +373 -0
- package/dist/src/conversationScoring-DCvQKp6k.cjs +398 -0
- package/dist/src/conversationScoring-DLNJtDZI.js +373 -0
- package/dist/src/crescendo-5iLk9WiJ.cjs +734 -0
- package/dist/src/crescendo-B5ylG7kW.js +733 -0
- package/dist/src/crescendo-BD7k6TIx.js +730 -0
- package/dist/src/crescendo-DqO2Ch0P.js +732 -0
- package/dist/src/custom-8rv_aG2K.js +617 -0
- package/dist/src/custom-BOtrIHFN.js +619 -0
- package/dist/src/custom-BvN8seCs.cjs +620 -0
- package/dist/src/custom-Cld9v_Y4.js +618 -0
- package/dist/src/dataUrl-BdHUey2l.cjs +3187 -0
- package/dist/src/dataUrl-DBMifX6C.js +3133 -0
- package/dist/src/dataUrl-DUSr-ZvI.js +2868 -0
- package/dist/src/decisions-CLazADTw.js +516 -0
- package/dist/src/decisions-D5X93awq.js +515 -0
- package/dist/src/decisions-DmaeArEn.js +515 -0
- package/dist/src/decisions-DyQJyHJz.cjs +514 -0
- package/dist/src/docker-C9NYQFeu.js +94 -0
- package/dist/src/docker-CGq3mMol.cjs +94 -0
- package/dist/src/docker-DOm7nmpl.js +95 -0
- package/dist/src/docker-skFN-Kfo.js +93 -0
- package/dist/src/embedding-0UbzkTk9.js +82 -0
- package/dist/src/embedding-DTrSDt7k.cjs +86 -0
- package/dist/src/embedding-j2ORNl5H.js +81 -0
- package/dist/src/envoy-BvS8XTQO.js +60 -0
- package/dist/src/envoy-Cn6Hzw0e.js +60 -0
- package/dist/src/envoy-DC3KWcUY.cjs +60 -0
- package/dist/src/envoy-DetHjo5B.js +61 -0
- package/dist/src/eval-Cer9dPe9.js +1920 -0
- package/dist/src/eval-CytYmI2Z.js +2 -0
- package/dist/src/evalResult-DzOq5wt9.js +1300 -0
- package/dist/src/evaluator-BxCmvGtv.js +10578 -0
- package/dist/src/evaluator-Ct7YDELm.js +2 -0
- package/dist/src/evaluatorHelpers-B_AwIrsl.js +600 -0
- package/dist/src/evaluatorHelpers-D1Tpc7gd.js +601 -0
- package/dist/src/evaluatorHelpers-DRR3rLq0.cjs +622 -0
- package/dist/src/fetch-B5KxZuKu.js +1559 -0
- package/dist/src/fetch-BG_Jl7ty.js +1556 -0
- package/dist/src/fetch-BKlgUg08.cjs +1853 -0
- package/dist/src/fetch-C9Fsja0R.js +2 -0
- package/dist/src/fetch-CM7P8KWA.cjs +14 -0
- package/dist/src/fetch-D0FkIB3G.js +9 -0
- package/dist/src/fetch-RXHsZF-J.js +1280 -0
- package/dist/src/fetch-rSECy8jR.js +10 -0
- package/dist/src/functionCallbackUtils-BB9tmf6a.cjs +262 -0
- package/dist/src/functionCallbackUtils-BXk2iY01.js +246 -0
- package/dist/src/functionCallbackUtils-B_cYp7P5.js +245 -0
- package/dist/src/functionCallbackUtils-BfXnPo0o.js +245 -0
- package/dist/src/gemini-image-BXLMADDz.js +471 -0
- package/dist/src/gemini-image-BYUZyEUx.js +472 -0
- package/dist/src/gemini-image-DSt1QubZ.cjs +471 -0
- package/dist/src/gemini-image-DdNDMiZ_.js +471 -0
- package/dist/src/goat-9b-uU_k6.js +514 -0
- package/dist/src/goat-BCJuiDd0.js +515 -0
- package/dist/src/goat-CmAHbemm.js +512 -0
- package/dist/src/goat-DdOTdyoS.cjs +515 -0
- package/dist/src/goblin-Bp5C5lyb.js +22 -0
- package/dist/src/goblin-Dmr7GItI.js +23 -0
- package/dist/src/goblin-DpM8wxlf.cjs +22 -0
- package/dist/src/goblin-cJyH6Pq-.js +22 -0
- package/dist/src/google-B6eaPAbE.js +142 -0
- package/dist/src/google-D-FStdN6.cjs +142 -0
- package/dist/src/google-DAC7BsCW.js +142 -0
- package/dist/src/google-Id18H0Va.js +143 -0
- package/dist/src/graders-BjNQWkaB.js +2 -0
- package/dist/src/graders-CqdIp_vl.js +15470 -0
- package/dist/src/hydra-6Ouh74DE.js +610 -0
- package/dist/src/hydra-BHjhZnLB.cjs +612 -0
- package/dist/src/hydra-BL6k2REV.js +2 -0
- package/dist/src/hydra-BWUc0o67.js +613 -0
- package/dist/src/hydra-CUkEOLKw.js +612 -0
- package/dist/src/image-B6hG_xhb.js +481 -0
- package/dist/src/image-BFaq7Krd.cjs +209 -0
- package/dist/src/image-Bql5C0N9.cjs +504 -0
- package/dist/src/image-BtZfI2pT.js +163 -0
- package/dist/src/image-CIM4oN7Z.cjs +163 -0
- package/dist/src/image-CbAl7Jpu.js +209 -0
- package/dist/src/image-CiYm_yFw.js +209 -0
- package/dist/src/image-DCMNvBiV.js +163 -0
- package/dist/src/image-DL7pIuUZ.js +210 -0
- package/dist/src/image-ey0kxF8o.js +164 -0
- package/dist/src/image-smgIk3rE.js +482 -0
- package/dist/src/index.cjs +27 -27
- package/dist/src/index.d.cts +8 -8
- package/dist/src/index.js +27 -27
- package/dist/src/indirectWebPwn-B_-UpWY5.js +285 -0
- package/dist/src/indirectWebPwn-Cz3SLiEq.js +434 -0
- package/dist/src/indirectWebPwn-D2s8zGiM.cjs +463 -0
- package/dist/src/indirectWebPwn-DXbj2wGu.cjs +285 -0
- package/dist/src/indirectWebPwn-D_4H44E6.js +285 -0
- package/dist/src/indirectWebPwn-L044SrpV.js +434 -0
- package/dist/src/indirectWebPwn-cnmvdavH.js +435 -0
- package/dist/src/indirectWebPwn-zUBzsqTt.js +286 -0
- package/dist/src/interactions-Bu3oVQ-j.js +850 -0
- package/dist/src/interactions-CND010Lh.cjs +850 -0
- package/dist/src/interactions-DAx7tqUz.js +851 -0
- package/dist/src/interactions-DPkIumeh.js +850 -0
- package/dist/src/iterative-BO4JRnpG.js +545 -0
- package/dist/src/iterative-CAK-k9rz.js +548 -0
- package/dist/src/iterative-CDgHc0xO.cjs +549 -0
- package/dist/src/iterative-CXJlHLl9.js +547 -0
- package/dist/src/iterativeImage-BEdGKSmh.cjs +419 -0
- package/dist/src/iterativeImage-BfL0QZw5.js +417 -0
- package/dist/src/iterativeImage-C9KhnibC.js +417 -0
- package/dist/src/iterativeImage-btjkOfWG.js +418 -0
- package/dist/src/iterativeMeta-B5Bdw6QA.js +437 -0
- package/dist/src/iterativeMeta-C3mI4gpT.js +440 -0
- package/dist/src/iterativeMeta-Co2BKyqS.cjs +439 -0
- package/dist/src/iterativeMeta-DD8ihRWD.js +439 -0
- package/dist/src/iterativeTree-AMi4GV2O.js +878 -0
- package/dist/src/iterativeTree-C8FJOEje.cjs +879 -0
- package/dist/src/iterativeTree-CvrY1f2Z.js +877 -0
- package/dist/src/iterativeTree-bPtESmaD.js +876 -0
- package/dist/src/knowledgeBase-Cf5871e3.js +163 -0
- package/dist/src/knowledgeBase-D2PQhqLH.js +164 -0
- package/dist/src/knowledgeBase-DpoMw1IH.cjs +163 -0
- package/dist/src/knowledgeBase-npGFl763.js +163 -0
- package/dist/src/litellm-BBB5DQdt.cjs +146 -0
- package/dist/src/litellm-Bo43ow7r.js +145 -0
- package/dist/src/litellm-CaU8CMLS.js +146 -0
- package/dist/src/litellm-wY7Unh8o.js +147 -0
- package/dist/src/live-5g2w-M-E.js +891 -0
- package/dist/src/live-BfaXsDyD.cjs +891 -0
- package/dist/src/live-C1xewnGD.js +2 -0
- package/dist/src/live-DaF7nYy5.js +892 -0
- package/dist/src/live-lp3urLUw.js +891 -0
- package/dist/src/luma-ray-B7zvKGVG.js +309 -0
- package/dist/src/luma-ray-DCf5fnrz.cjs +309 -0
- package/dist/src/luma-ray-DepBcn6z.js +309 -0
- package/dist/src/luma-ray-XQC4M1pt.js +310 -0
- package/dist/src/main.js +26 -26
- package/dist/src/mantleChat-7xm95vSV.js +154 -0
- package/dist/src/mantleChat-CXhAs5RD.js +155 -0
- package/dist/src/mantleChat-CcE-zjfj.cjs +154 -0
- package/dist/src/mantleChat-Cpefl7Zm.js +154 -0
- package/dist/src/mcp-B0V0ikdM.js +84 -0
- package/dist/src/mcp-CV2k2gwj.js +85 -0
- package/dist/src/memoryPoisoning-BC5FQQWZ.js +111 -0
- package/dist/src/memoryPoisoning-BDwrtZKX.js +111 -0
- package/dist/src/memoryPoisoning-BFemS_FF.js +112 -0
- package/dist/src/memoryPoisoning-DRs2rbVV.cjs +111 -0
- package/dist/src/messages-Bc5oZoAJ.js +1128 -0
- package/dist/src/messages-BkaH8fRW.js +1127 -0
- package/dist/src/messages-CoHlziS5.js +1127 -0
- package/dist/src/messages-Cv_m6kYs.cjs +1161 -0
- package/dist/src/mischievousUser-BcyFxrqJ.js +51 -0
- package/dist/src/mischievousUser-BlhOQSd2.js +52 -0
- package/dist/src/mischievousUser-BuQiKE8D.js +51 -0
- package/dist/src/mischievousUser-ChIOk6cT.cjs +51 -0
- package/dist/src/modelslab-BXIWBTgX.js +171 -0
- package/dist/src/modelslab-ChVsUiaJ.js +170 -0
- package/dist/src/modelslab-DZ6BFlDv.js +170 -0
- package/dist/src/modelslab-DhRr-vyo.cjs +170 -0
- package/dist/src/nova-reel-BL8DrN4_.js +272 -0
- package/dist/src/nova-reel-BiOMUm5q.cjs +272 -0
- package/dist/src/nova-reel-CTsya1hV.js +273 -0
- package/dist/src/nova-reel-kgBY4Svd.js +272 -0
- package/dist/src/nova-sonic-CaSSA3Jq.cjs +374 -0
- package/dist/src/nova-sonic-DLpmoGsR.js +375 -0
- package/dist/src/nova-sonic-DwWc4SoN.js +374 -0
- package/dist/src/nova-sonic-qnReTaXm.js +374 -0
- package/dist/src/novita-B5mAt3Ui.js +114 -0
- package/dist/src/novita-D57vCjDD.js +116 -0
- package/dist/src/novita-ITRtG8IJ.js +115 -0
- package/dist/src/novita-Rh3T13YO.cjs +115 -0
- package/dist/src/nscale-8V7iZ_pI.js +210 -0
- package/dist/src/nscale-BQnMv4pH.cjs +209 -0
- package/dist/src/nscale-BWZXHZVF.js +209 -0
- package/dist/src/nscale-BqrHiUqU.js +207 -0
- package/dist/src/openaiResponses-BMtGTu8R.js +317 -0
- package/dist/src/openaiResponses-CvcI_viE.js +318 -0
- package/dist/src/openaiResponses-DYPZEMX1.cjs +318 -0
- package/dist/src/openaiResponses-DZTg1-kb.js +319 -0
- package/dist/src/openclaw-BeKuig4g.js +1338 -0
- package/dist/src/openclaw-COkdQ83y.js +1337 -0
- package/dist/src/openclaw-CSoX_HQ5.cjs +1344 -0
- package/dist/src/openclaw-DJlhPGCb.js +1336 -0
- package/dist/src/opencode-sdk-BEJftEs6.cjs +1018 -0
- package/dist/src/opencode-sdk-DMvBB3V7.js +1013 -0
- package/dist/src/opencode-sdk-Df7hMjLO.js +1012 -0
- package/dist/src/opencode-sdk-bQp5Xf3W.js +1012 -0
- package/dist/src/openinterpreter-B3GgVZjK.js +431 -0
- package/dist/src/openinterpreter-BiGcU-HN.cjs +435 -0
- package/dist/src/openinterpreter-Buj2l3Eh.js +432 -0
- package/dist/src/openinterpreter-C3_Cg5b_.js +431 -0
- package/dist/src/pricing-0Pampf0q.cjs +999 -0
- package/dist/src/pricing-B8VdhEhY.js +976 -0
- package/dist/src/pricing-CtLA-rKA.js +976 -0
- package/dist/src/promptfoo-4OkHtH9P.cjs +341 -0
- package/dist/src/promptfoo-Bhpm7sH6.js +286 -0
- package/dist/src/promptfoo-BqV8ogVA.js +285 -0
- package/dist/src/promptfoo-S1Q9OHk_.js +286 -0
- package/dist/src/providers-B5zs1ZRv.js +24437 -0
- package/dist/src/providers-Cd6CJh6m.js +2 -0
- package/dist/src/providers-CpJlgHET.js +24039 -0
- package/dist/src/providers-CzvLvK6G.cjs +24180 -0
- package/dist/src/quiverai-1E_IvLHn.js +325 -0
- package/dist/src/quiverai-BXH004Vv.js +325 -0
- package/dist/src/quiverai-Ccya2z8Y.cjs +325 -0
- package/dist/src/quiverai-Cez57oe-.js +326 -0
- package/dist/src/registry-3zX_M9Ik.js +131 -0
- package/dist/src/registry-AuCrKTvS.js +132 -0
- package/dist/src/registry-CxXWKtQG.js +131 -0
- package/dist/src/registry-DG3o66JQ.cjs +131 -0
- package/dist/src/remoteGeneration-CAtvamG6.js +370 -0
- package/dist/src/remoteGeneration-CF225pDl.cjs +482 -0
- package/dist/src/remoteGeneration-DtnqocnL.js +370 -0
- package/dist/src/remoteGeneration-g3KvW-sP.js +371 -0
- package/dist/src/responses-BMbaUXQI.js +1098 -0
- package/dist/src/responses-B_TOSof-.js +1099 -0
- package/dist/src/responses-v-yANwTA.cjs +1109 -0
- package/dist/src/runtimeTransform-BBZv-oUZ.js +156 -0
- package/dist/src/runtimeTransform-DT2v5ovW.js +156 -0
- package/dist/src/runtimeTransform-GXXEIXdS.cjs +161 -0
- package/dist/src/runtimeTransform-JTwBQc-P.js +157 -0
- package/dist/src/sagemaker-B8D0L4rj.cjs +716 -0
- package/dist/src/sagemaker-CR2_AGdB.js +713 -0
- package/dist/src/sagemaker-Cd9qSQUV.js +714 -0
- package/dist/src/sagemaker-mKlltN4p.js +713 -0
- package/dist/src/scanner-PG_8lh8r.js +1971 -0
- package/dist/src/server/index.js +55 -55
- package/dist/src/server-Bmh7sd9F.js +155 -0
- package/dist/src/server-C7b8z6aC.js +63 -0
- package/dist/src/server-CAcovgtL.js +2 -0
- package/dist/src/server-CuuMfKlh.cjs +74 -0
- package/dist/src/server-DMPCj9jy.js +189 -0
- package/dist/src/session-BksXvRH_.cjs +69 -0
- package/dist/src/session-DOxUjqGQ.js +63 -0
- package/dist/src/session-Dujsc-b9.js +62 -0
- package/dist/src/session-VjtIxREd.js +62 -0
- package/dist/src/shared-Bkyz_7e5.cjs +2185 -0
- package/dist/src/shared-DDJg8ycC.js +1929 -0
- package/dist/src/shared-Dh3yfRBd.js +1927 -0
- package/dist/src/shared-tfPT8Tna.js +1928 -0
- package/dist/src/simulatedUser-6JdkyL3k.cjs +252 -0
- package/dist/src/simulatedUser-CFr2mr3M.js +248 -0
- package/dist/src/simulatedUser-DjwwUqx-.js +247 -0
- package/dist/src/slack-C_gIYiUs.js +144 -0
- package/dist/src/slack-DhNbz9CM.cjs +144 -0
- package/dist/src/slack-Dm2iI1zu.js +145 -0
- package/dist/src/strategies-BIY-bNul.js +2248 -0
- package/dist/src/strategies-C1KQQj9G.cjs +2420 -0
- package/dist/src/strategies-DM_3mReG.js +2385 -0
- package/dist/src/telemetry-BhMTibZO.js +2 -0
- package/dist/src/telemetry-C04d25BM.cjs +216 -0
- package/dist/src/telemetry-CIqy4fSC.js +201 -0
- package/dist/src/telemetry-CXozp_6C.js +205 -0
- package/dist/src/telemetry-g7PkBxmY.js +205 -0
- package/dist/src/togetherai-BvCim68-.js +50 -0
- package/dist/src/togetherai-CWyDCA9m.cjs +49 -0
- package/dist/src/togetherai-CeSE31vK.js +49 -0
- package/dist/src/togetherai-_2W0URf8.js +48 -0
- package/dist/src/traceContext-Brw3Oe41.js +1016 -0
- package/dist/src/traceContext-DpAYv27G.js +1015 -0
- package/dist/src/traceContext-KSqhzZI2.cjs +1032 -0
- package/dist/src/transcription-BySopazW.js +175 -0
- package/dist/src/transcription-DO4UPkRI.cjs +178 -0
- package/dist/src/transcription-RJGBa-pC.js +176 -0
- package/dist/src/transcription-fZenF3G5.js +175 -0
- package/dist/src/transform-BzhRc5z2.js +125 -0
- package/dist/src/transform-CPQu05u6.cjs +154 -0
- package/dist/src/transform-DAED8imp.js +126 -0
- package/dist/src/transform-DIOIQDmM.js +125 -0
- package/dist/src/typesafe-ByE0Kxfg.js +253 -0
- package/dist/src/typesafe-CFqGFY34.js +253 -0
- package/dist/src/typesafe-DCWIw-CP.cjs +253 -0
- package/dist/src/typesafe-DyHFV5Qk.js +254 -0
- package/dist/src/util-BHkj9joz.js +2049 -0
- package/dist/src/util-CICwIpmu.cjs +934 -0
- package/dist/src/util-CePiY2xZ.js +286 -0
- package/dist/src/util-CgT3uf4p.js +743 -0
- package/dist/src/util-Cj9drvOY.js +1770 -0
- package/dist/src/util-ClJRjlQA.cjs +357 -0
- package/dist/src/util-Cxf8VF2M.js +395 -0
- package/dist/src/util-D7RdV7rS.js +395 -0
- package/dist/src/util-DMNFhk47.js +351 -0
- package/dist/src/util-DNzh3M0z.js +396 -0
- package/dist/src/util-Df7rfMGb.cjs +2305 -0
- package/dist/src/util-Kf0KnG_6.js +2051 -0
- package/dist/src/util-LEbeiYw_.js +743 -0
- package/dist/src/util-WH8CgVs4.js +352 -0
- package/dist/src/util-cx6Xw8Lw.cjs +478 -0
- package/dist/src/util-qzBqirBH.js +2050 -0
- package/dist/src/vertex-CBAMfRz3.js +854 -0
- package/dist/src/vertex-CMP2IpN9.js +2 -0
- package/dist/src/vertex-CZ5YOotT.js +848 -0
- package/dist/src/vertex-DNsh1F1M.cjs +871 -0
- package/dist/src/vertexLive-BTXYj3-F.js +55 -0
- package/dist/src/vertexLive-Ba_LAqEF.cjs +55 -0
- package/dist/src/vertexLive-DM4sFaaj.js +56 -0
- package/dist/src/vertexLive-JqZOw7HC.js +55 -0
- package/dist/src/video-BY7Q2Gii.cjs +706 -0
- package/dist/src/video-CYElP-CK.js +703 -0
- package/dist/src/video-C_AdEDH0.js +702 -0
- package/dist/src/video-DGvjQ_4j.js +702 -0
- package/package.json +1 -1
- package/dist/src/accounts-Dpb43yde.cjs +0 -276
- package/dist/src/accounts-GKrO1olH.js +0 -229
- package/dist/src/accounts-e4FGOsji.js +0 -227
- package/dist/src/accounts-sUiEJfkB.js +0 -222
- package/dist/src/agentWorkspace-B8A_wuMR.cjs +0 -619
- package/dist/src/agentWorkspace-DSPIscXR.js +0 -593
- package/dist/src/agentWorkspace-DxUqd-XK.js +0 -592
- package/dist/src/agentWorkspace-n0uOJXhD.js +0 -592
- package/dist/src/agentic-utils-9bCj4twQ.js +0 -197
- package/dist/src/agentic-utils-CyCLuLoj.js +0 -197
- package/dist/src/agentic-utils-D23qtOlx.cjs +0 -237
- package/dist/src/agentic-utils-DuBMMNCw.js +0 -198
- package/dist/src/agents-6hDRNoYD.js +0 -777
- package/dist/src/agents-B8w2o7Sc.cjs +0 -777
- package/dist/src/agents-Ck0NXl7v.js +0 -777
- package/dist/src/agents-CwT3B1qB.js +0 -778
- package/dist/src/agents-DOLjfOEq.js +0 -266
- package/dist/src/agents-OcF9hq--.js +0 -267
- package/dist/src/agents-api-CnZZt8bn.cjs +0 -710
- package/dist/src/agents-api-D04u3bmL.js +0 -711
- package/dist/src/agents-api-DWw0_Vio.js +0 -710
- package/dist/src/agents-api-IWHEwp8i.js +0 -710
- package/dist/src/agents-mHt2Mh9O.cjs +0 -266
- package/dist/src/agents-sICccZCA.js +0 -266
- package/dist/src/ai.studio-Ci4rypDT.js +0 -2
- package/dist/src/ai.studio-KkQ6KaHa.js +0 -369
- package/dist/src/ai.studio-gSXK2cGI.js +0 -374
- package/dist/src/ai.studio-nQF_B4DH.cjs +0 -391
- package/dist/src/aimlapi-BeSk5BDV.js +0 -30
- package/dist/src/aimlapi-CzNUhdKu.cjs +0 -29
- package/dist/src/aimlapi-DCkazDPI.js +0 -29
- package/dist/src/aimlapi-WeH5B6K1.js +0 -28
- package/dist/src/anthropicMessages-AcNWTpYO.js +0 -115
- package/dist/src/anthropicMessages-BUtvzbpL.js +0 -114
- package/dist/src/anthropicMessages-DTWhZDCd.js +0 -114
- package/dist/src/anthropicMessages-lGVnSgyx.cjs +0 -114
- package/dist/src/app/assets/index-CyEI5aDN.js +0 -392
- package/dist/src/audio-BE_Duiu1.js +0 -104
- package/dist/src/audio-CiUd00k2.cjs +0 -104
- package/dist/src/audio-Dop6omna.js +0 -105
- package/dist/src/audio-EZNTInr_.js +0 -104
- package/dist/src/authoritativeMarkupInjection-BUqH6hNk.js +0 -78
- package/dist/src/authoritativeMarkupInjection-BmbJdJO0.cjs +0 -78
- package/dist/src/authoritativeMarkupInjection-Cpz12Y3w.js +0 -78
- package/dist/src/authoritativeMarkupInjection-W4XfcH91.js +0 -79
- package/dist/src/aws-B2Jqbnet.js +0 -2433
- package/dist/src/aws-DHtuUIzQ.js +0 -1149
- package/dist/src/aws-DLqXP6wY.js +0 -2433
- package/dist/src/aws-DfduhmwL.cjs +0 -2454
- package/dist/src/base-B9L2Xvpc.js +0 -255
- package/dist/src/base-BTZnIsuH.cjs +0 -305
- package/dist/src/base-BhaWNQPJ.js +0 -462
- package/dist/src/base-Br-G_Xou.js +0 -256
- package/dist/src/base-Bzo8hiUS.cjs +0 -467
- package/dist/src/base-C82fd2jq.js +0 -463
- package/dist/src/base-CRdQwC1W.js +0 -462
- package/dist/src/base-CjGwZNOQ.js +0 -255
- package/dist/src/bedrock-BdMru_ro.js +0 -1300
- package/dist/src/bedrock-CBUmfLX1.cjs +0 -2
- package/dist/src/bedrock-DBDxBaF9.js +0 -2
- package/dist/src/bedrock-DDrECM21.js +0 -1
- package/dist/src/bedrock-DVwkgvRS.js +0 -1
- package/dist/src/bestOfN-AKF5beq4.js +0 -159
- package/dist/src/bestOfN-C1UIVGJV.js +0 -160
- package/dist/src/bestOfN-DlkETbXy.cjs +0 -161
- package/dist/src/bestOfN-XIfEgU-g.js +0 -159
- package/dist/src/cache-BZaVoKaA.js +0 -2
- package/dist/src/cache-CEYhFUsH.js +0 -741
- package/dist/src/cache-Cbw1zH6q.js +0 -782
- package/dist/src/cache-CdaZNb75.js +0 -754
- package/dist/src/cache-DpuIzPxh.cjs +0 -856
- package/dist/src/cerebras-Bpn6FPkJ.js +0 -97
- package/dist/src/cerebras-CqJ0BRCJ.cjs +0 -97
- package/dist/src/cerebras-D4ILa_TY.js +0 -97
- package/dist/src/cerebras-DR8uc7ee.js +0 -98
- package/dist/src/chat-B7PZfaYp.cjs +0 -987
- package/dist/src/chat-BVuSjdEb.js +0 -227
- package/dist/src/chat-BsaZRjXN.js +0 -76
- package/dist/src/chat-C5liqe3Y.js +0 -226
- package/dist/src/chat-C9hyHf5B.js +0 -124
- package/dist/src/chat-CFLalAck.js +0 -226
- package/dist/src/chat-CN8JGrHu.js +0 -76
- package/dist/src/chat-CaHBBpCb.js +0 -123
- package/dist/src/chat-CcbLSghx.js +0 -123
- package/dist/src/chat-CoSN6sr2.js +0 -934
- package/dist/src/chat-CsJRFX8a.cjs +0 -226
- package/dist/src/chat-DFoZLvO_.js +0 -934
- package/dist/src/chat-DiLQvL7r.js +0 -77
- package/dist/src/chat-F6qVSDk3.cjs +0 -123
- package/dist/src/chat-Oq4FaJgI.cjs +0 -76
- package/dist/src/chat-knMfQUKz.js +0 -935
- package/dist/src/claude-agent-sdk-CJkOLpnI.js +0 -999
- package/dist/src/claude-agent-sdk-Ckn76PRD.js +0 -999
- package/dist/src/claude-agent-sdk-DX0gTr11.cjs +0 -1005
- package/dist/src/claude-agent-sdk-LMeikxoR.js +0 -1000
- package/dist/src/client-BFf1r6Z8.js +0 -352
- package/dist/src/client-CdXyDdDi.js +0 -351
- package/dist/src/client-DV8XMu7i.js +0 -351
- package/dist/src/client-iEXtOBKW.cjs +0 -357
- package/dist/src/cloud-B02qcpjf.js +0 -2
- package/dist/src/cloud-BlHP-g1v.cjs +0 -666
- package/dist/src/cloud-C9BI4isF.js +0 -287
- package/dist/src/cloud-CTTLNdvj.js +0 -657
- package/dist/src/cloud-D5X5yQ_d.js +0 -599
- package/dist/src/cloud-QxPkpsHA.js +0 -599
- package/dist/src/cloudflare-ai-DRTRT1fc.js +0 -132
- package/dist/src/cloudflare-ai-DgaXapAV.cjs +0 -133
- package/dist/src/cloudflare-ai-DkuJXijS.js +0 -134
- package/dist/src/cloudflare-ai-wy9QCHku.js +0 -133
- package/dist/src/cloudflare-gateway-9cAN8g29.cjs +0 -276
- package/dist/src/cloudflare-gateway-BVFMD292.js +0 -277
- package/dist/src/cloudflare-gateway-BuUI4p6I.js +0 -276
- package/dist/src/cloudflare-gateway-TlYHizbW.js +0 -276
- package/dist/src/codex-app-server-BPz_feug.cjs +0 -2162
- package/dist/src/codex-app-server-C9noXM9C.js +0 -2155
- package/dist/src/codex-app-server-CEmD-Y5U.js +0 -2
- package/dist/src/codex-app-server-DZolc18r.js +0 -2156
- package/dist/src/codex-app-server-Dd0A37nO.js +0 -2155
- package/dist/src/codex-sdk-BbxjBvBk.cjs +0 -1588
- package/dist/src/codex-sdk-BpXeIs-_.js +0 -1557
- package/dist/src/codex-sdk-BtQp5X0f.js +0 -1552
- package/dist/src/codex-sdk-CH0v9Bk1.js +0 -2
- package/dist/src/codex-sdk-CgrN7JB8.js +0 -1557
- package/dist/src/codex-security-B5fENNUr.js +0 -406
- package/dist/src/codex-security-C6uuJx-y.cjs +0 -411
- package/dist/src/codex-security-CifWtZR_.js +0 -407
- package/dist/src/codex-security-Kg2bOEKy.js +0 -406
- package/dist/src/cometapi-BFpIDLIx.js +0 -55
- package/dist/src/cometapi-C6O2PIrN.js +0 -56
- package/dist/src/cometapi-D5Yupc6F.js +0 -53
- package/dist/src/cometapi-DzgIwJzJ.cjs +0 -55
- package/dist/src/compatible-0jhmVfOp.js +0 -25
- package/dist/src/compatible-DdtwWdJi.cjs +0 -24
- package/dist/src/compatible-Di4nR3sU.js +0 -24
- package/dist/src/compatible-iJKLWdnf.js +0 -24
- package/dist/src/completion-B0_hVUDG.js +0 -119
- package/dist/src/completion-BdI6v0-Q.cjs +0 -123
- package/dist/src/completion-CWcJscwv.js +0 -118
- package/dist/src/conversationScoring-99EOPJRa.js +0 -373
- package/dist/src/conversationScoring-BIq4J0Cq.js +0 -374
- package/dist/src/conversationScoring-DARyeATr.cjs +0 -398
- package/dist/src/conversationScoring-DS48t4Hb.js +0 -373
- package/dist/src/crescendo-CebvXIu4.js +0 -730
- package/dist/src/crescendo-CxrLS0oo.js +0 -732
- package/dist/src/crescendo-DZQXBSkj.js +0 -733
- package/dist/src/crescendo-wjEx68uD.cjs +0 -734
- package/dist/src/custom-BiQ-aUNw.cjs +0 -620
- package/dist/src/custom-ByyB5Z93.js +0 -619
- package/dist/src/custom-C5jOevNb.js +0 -617
- package/dist/src/custom-CCrsCz8o.js +0 -618
- package/dist/src/dataUrl-C9J7wz9H.js +0 -3133
- package/dist/src/dataUrl-CGsBT7UZ.cjs +0 -3187
- package/dist/src/dataUrl-CzKvvWNO.js +0 -2868
- package/dist/src/decisions-BTusXCUx.cjs +0 -514
- package/dist/src/decisions-BYtL9edD.js +0 -515
- package/dist/src/decisions-jYix_gCF.js +0 -515
- package/dist/src/decisions-nxxfHRAN.js +0 -516
- package/dist/src/docker-DDIv4zkg.js +0 -93
- package/dist/src/docker-DVLp_5OG.js +0 -94
- package/dist/src/docker-INm9w0SY.cjs +0 -94
- package/dist/src/docker-sGuoCul_.js +0 -95
- package/dist/src/embedding-CAhqLLrR.js +0 -82
- package/dist/src/embedding-D94GAsti.cjs +0 -86
- package/dist/src/embedding-zb4MAzQy.js +0 -81
- package/dist/src/envoy-BMPszwEa.cjs +0 -60
- package/dist/src/envoy-Bp-s39_8.js +0 -60
- package/dist/src/envoy-BswDt-Ou.js +0 -61
- package/dist/src/envoy-rVbYcV80.js +0 -60
- package/dist/src/eval-B1-XfrC7.js +0 -2
- package/dist/src/eval-pC4qCvLw.js +0 -1920
- package/dist/src/evalResult-CzjCb5bd.js +0 -1300
- package/dist/src/evaluator-CNq2K7J_.js +0 -10578
- package/dist/src/evaluator-LtfxdxEu.js +0 -2
- package/dist/src/evaluatorHelpers-C5J0NYpQ.js +0 -601
- package/dist/src/evaluatorHelpers-DcdCglCs.cjs +0 -622
- package/dist/src/evaluatorHelpers-Rvb88W6B.js +0 -600
- package/dist/src/fetch-5HtnNhHg.js +0 -1556
- package/dist/src/fetch-BCwjoIFd.js +0 -1559
- package/dist/src/fetch-BhfUnKen.js +0 -1280
- package/dist/src/fetch-C08w4vVl.js +0 -9
- package/dist/src/fetch-DBxy8Tlb.cjs +0 -14
- package/dist/src/fetch-DYte6oQX.cjs +0 -1853
- package/dist/src/fetch-ElpfcAVG.js +0 -10
- package/dist/src/fetch-lM1OIaSt.js +0 -2
- package/dist/src/functionCallbackUtils-BCAdWfHO.js +0 -246
- package/dist/src/functionCallbackUtils-BYq9qOhG.js +0 -245
- package/dist/src/functionCallbackUtils-ByWkmVud.cjs +0 -262
- package/dist/src/functionCallbackUtils-D_C_JaFd.js +0 -245
- package/dist/src/gemini-image-CAlwaJhZ.js +0 -471
- package/dist/src/gemini-image-DJoVoOnZ.cjs +0 -471
- package/dist/src/gemini-image-Waio-9Xx.js +0 -472
- package/dist/src/gemini-image-vbY6Ftbf.js +0 -471
- package/dist/src/goat-BWbtyY9c.js +0 -512
- package/dist/src/goat-CXzzeCOQ.cjs +0 -515
- package/dist/src/goat-CfgvzSgZ.js +0 -514
- package/dist/src/goat-DLeoIHBp.js +0 -515
- package/dist/src/goblin-CmfCfwqk.cjs +0 -22
- package/dist/src/goblin-CtcaORRH.js +0 -22
- package/dist/src/goblin-DF6DDhM-.js +0 -22
- package/dist/src/goblin-Nai0xxBV.js +0 -23
- package/dist/src/google-ClpkLtKL.cjs +0 -142
- package/dist/src/google-CrFgKu9k.js +0 -143
- package/dist/src/google-Dj_EIBqS.js +0 -142
- package/dist/src/google-e4-vARv6.js +0 -142
- package/dist/src/graders-BN1IIa71.js +0 -15470
- package/dist/src/graders-C5sCfSP5.js +0 -2
- package/dist/src/hydra-B7RfXVBK.js +0 -2
- package/dist/src/hydra-C1cFN-Jg.js +0 -613
- package/dist/src/hydra-CK6Uc1ia.js +0 -612
- package/dist/src/hydra-Dg65rAP_.js +0 -610
- package/dist/src/hydra-Fqx8l_Xu.cjs +0 -612
- package/dist/src/image-BdlUDAtp.js +0 -163
- package/dist/src/image-C-KwEhwt.cjs +0 -163
- package/dist/src/image-C76fp6NK.cjs +0 -209
- package/dist/src/image-D75ehv3D.js +0 -482
- package/dist/src/image-DKtc5v5W.js +0 -209
- package/dist/src/image-DT_xOkJY.js +0 -163
- package/dist/src/image-DVpdllEE.js +0 -209
- package/dist/src/image-DXZ8AzMf.js +0 -481
- package/dist/src/image-DZl_1mvy.js +0 -164
- package/dist/src/image-DcTD7Ak0.cjs +0 -504
- package/dist/src/image-ndxEvBKB.js +0 -210
- package/dist/src/indirectWebPwn-70WA5x_q.js +0 -435
- package/dist/src/indirectWebPwn-BRVyd3qV.cjs +0 -463
- package/dist/src/indirectWebPwn-BsJVsu0q.js +0 -285
- package/dist/src/indirectWebPwn-Cw6yJu0i.js +0 -285
- package/dist/src/indirectWebPwn-D-PhJzo4.js +0 -286
- package/dist/src/indirectWebPwn-DRPHt2I8.js +0 -434
- package/dist/src/indirectWebPwn-DXtfFhd9.cjs +0 -285
- package/dist/src/indirectWebPwn-DvpNouzc.js +0 -434
- package/dist/src/interactions-5ixfW7Cl.js +0 -850
- package/dist/src/interactions-BOUzfmg1.cjs +0 -850
- package/dist/src/interactions-CSSXcGNc.js +0 -851
- package/dist/src/interactions-WB_sgkN0.js +0 -850
- package/dist/src/iterative-BShRNqjC.cjs +0 -549
- package/dist/src/iterative-BcW_ELtB.js +0 -548
- package/dist/src/iterative-BpHbHz8B.js +0 -547
- package/dist/src/iterative-YcchP12d.js +0 -545
- package/dist/src/iterativeImage-BMFE5Hl7.cjs +0 -419
- package/dist/src/iterativeImage-CkSaYLMY.js +0 -417
- package/dist/src/iterativeImage-DAEUlQX_.js +0 -418
- package/dist/src/iterativeImage-DeUSkEnj.js +0 -417
- package/dist/src/iterativeMeta-DbdaKdEO.cjs +0 -439
- package/dist/src/iterativeMeta-DcF9JWEK.js +0 -437
- package/dist/src/iterativeMeta-DkfPqWIC.js +0 -439
- package/dist/src/iterativeMeta-DkrpnVSs.js +0 -440
- package/dist/src/iterativeTree-CEMY1FhE.cjs +0 -879
- package/dist/src/iterativeTree-Cv5W4tX9.js +0 -877
- package/dist/src/iterativeTree-DGvomd3M.js +0 -876
- package/dist/src/iterativeTree-KbtC2Mkz.js +0 -878
- package/dist/src/knowledgeBase-AYRXn4wO.js +0 -163
- package/dist/src/knowledgeBase-BNqQfx01.js +0 -163
- package/dist/src/knowledgeBase-C0IaCCVs.js +0 -164
- package/dist/src/knowledgeBase-C2uj6wK4.cjs +0 -163
- package/dist/src/litellm-CN1ScAwZ.js +0 -147
- package/dist/src/litellm-CTjwiKSa.js +0 -146
- package/dist/src/litellm-Cd4Nj5ue.js +0 -145
- package/dist/src/litellm-DMqLpEBg.cjs +0 -146
- package/dist/src/live-Bt50-InO.cjs +0 -891
- package/dist/src/live-Bu2ujadG.js +0 -2
- package/dist/src/live-C3M52i3p.js +0 -891
- package/dist/src/live-CRfHMO3B.js +0 -892
- package/dist/src/live-iCIpO14m.js +0 -891
- package/dist/src/luma-ray-B8eHC4c8.cjs +0 -309
- package/dist/src/luma-ray-BIvkPw0s.js +0 -309
- package/dist/src/luma-ray-ChsiBxMA.js +0 -309
- package/dist/src/luma-ray-DAvKrInz.js +0 -310
- package/dist/src/mantleChat-5YeEXAZI.js +0 -154
- package/dist/src/mantleChat-D--mW3hl.js +0 -154
- package/dist/src/mantleChat-DHP3siNg.cjs +0 -154
- package/dist/src/mantleChat-wBfAX46o.js +0 -155
- package/dist/src/mcp-49jlEcTQ.js +0 -85
- package/dist/src/mcp-__PIz81I.js +0 -84
- package/dist/src/memoryPoisoning-Chxge74M.js +0 -111
- package/dist/src/memoryPoisoning-QH6NCUVE.js +0 -112
- package/dist/src/memoryPoisoning-tCxZt8Nz.js +0 -111
- package/dist/src/memoryPoisoning-ymrRItRR.cjs +0 -111
- package/dist/src/messages-BE_eZ7NA.js +0 -1127
- package/dist/src/messages-Bo638ShI.js +0 -1127
- package/dist/src/messages-BzR0-NQ1.js +0 -1128
- package/dist/src/messages-Cbg5Pfd0.cjs +0 -1161
- package/dist/src/mischievousUser-BtED2Z5Z.cjs +0 -51
- package/dist/src/mischievousUser-KqSOjrDJ.js +0 -51
- package/dist/src/mischievousUser-YMD41YNZ.js +0 -51
- package/dist/src/mischievousUser-zBxlNdCu.js +0 -52
- package/dist/src/modelslab-B8gZxtfE.js +0 -171
- package/dist/src/modelslab-C7bmVpTB.js +0 -170
- package/dist/src/modelslab-CCeQCTZg.js +0 -170
- package/dist/src/modelslab-CvBJGv7y.cjs +0 -170
- package/dist/src/nova-reel-BOEWsEKA.cjs +0 -272
- package/dist/src/nova-reel-BtyBXq5M.js +0 -273
- package/dist/src/nova-reel-C1eF3-EE.js +0 -272
- package/dist/src/nova-reel-YhgrxEKT.js +0 -272
- package/dist/src/nova-sonic-BaERP20w.js +0 -374
- package/dist/src/nova-sonic-CxgM3O-P.cjs +0 -374
- package/dist/src/nova-sonic-DJS22fC3.js +0 -375
- package/dist/src/nova-sonic-DwvwHyRX.js +0 -374
- package/dist/src/novita-D1l2tG0O.js +0 -116
- package/dist/src/novita-D84VM3v0.cjs +0 -115
- package/dist/src/novita-DGInvwfR.js +0 -115
- package/dist/src/novita-vXHkXhTg.js +0 -114
- package/dist/src/nscale-CU0Ldr00.js +0 -209
- package/dist/src/nscale-ClfKlQeM.cjs +0 -209
- package/dist/src/nscale-DxaVnF0x.js +0 -210
- package/dist/src/nscale-_poVxIrO.js +0 -207
- package/dist/src/openaiResponses-CJGsneNj.js +0 -317
- package/dist/src/openaiResponses-CKSl5Sdg.js +0 -319
- package/dist/src/openaiResponses-DC8rzFUc.js +0 -318
- package/dist/src/openaiResponses-rMHIA3dV.cjs +0 -318
- package/dist/src/openclaw-CCbvsNFW.cjs +0 -1344
- package/dist/src/openclaw-CZw1lCDZ.js +0 -1336
- package/dist/src/openclaw-ChFLgC-a.js +0 -1338
- package/dist/src/openclaw-DrPMoRrH.js +0 -1337
- package/dist/src/opencode-sdk-2EfIDhFp.cjs +0 -1018
- package/dist/src/opencode-sdk-CHw3F845.js +0 -1013
- package/dist/src/opencode-sdk-D0EGGxvy.js +0 -1012
- package/dist/src/opencode-sdk-jSS7NI2Q.js +0 -1012
- package/dist/src/openinterpreter-CY622xHC.js +0 -431
- package/dist/src/openinterpreter-DATyhuhP.js +0 -432
- package/dist/src/openinterpreter-DDUMyIf1.js +0 -431
- package/dist/src/openinterpreter-s5Tz6Lid.cjs +0 -435
- package/dist/src/pricing-C498twd2.js +0 -976
- package/dist/src/pricing-DBd_bMIh.cjs +0 -999
- package/dist/src/pricing-ISrMCskv.js +0 -976
- package/dist/src/promptfoo-6p0WG2ih.js +0 -286
- package/dist/src/promptfoo-BQRfgNs_.js +0 -285
- package/dist/src/promptfoo-Bqo88z20.cjs +0 -341
- package/dist/src/promptfoo-Cq5AVI3I.js +0 -286
- package/dist/src/providers-ATbeMX5E.cjs +0 -24180
- package/dist/src/providers-B7F1FiNI.js +0 -2
- package/dist/src/providers-DazIw8mI.js +0 -24039
- package/dist/src/providers-QvGlNAD0.js +0 -24437
- package/dist/src/quiverai-BPlNcLkV.cjs +0 -325
- package/dist/src/quiverai-By99-YmJ.js +0 -325
- package/dist/src/quiverai-CmmByDqo.js +0 -325
- package/dist/src/quiverai-HZkoJJqw.js +0 -326
- package/dist/src/registry-BLTnTfjT.cjs +0 -131
- package/dist/src/registry-BMC-COHT.js +0 -132
- package/dist/src/registry-C8UZtmBp.js +0 -131
- package/dist/src/registry-CfwEUYXG.js +0 -131
- package/dist/src/remoteGeneration-Bgg6kC5V.js +0 -370
- package/dist/src/remoteGeneration-CKJFE960.cjs +0 -482
- package/dist/src/remoteGeneration-DaxwJDKv.js +0 -370
- package/dist/src/remoteGeneration-vHMGVKr1.js +0 -371
- package/dist/src/responses-BvnyIHrq.js +0 -1099
- package/dist/src/responses-CERAgvf-.js +0 -1098
- package/dist/src/responses-CwgjeuOg.cjs +0 -1109
- package/dist/src/runtimeTransform-3RF9Avyg.cjs +0 -161
- package/dist/src/runtimeTransform-C51Z5j4H.js +0 -156
- package/dist/src/runtimeTransform-CKE_Iyv8.js +0 -157
- package/dist/src/runtimeTransform-Cs11xJpj.js +0 -156
- package/dist/src/sagemaker-BJ4dOCxE.js +0 -713
- package/dist/src/sagemaker-Bt3JUAWq.js +0 -714
- package/dist/src/sagemaker-QVKyLgLF.cjs +0 -716
- package/dist/src/sagemaker-l3IB8iTs.js +0 -713
- package/dist/src/scanner-DGjIiTZ1.js +0 -1971
- package/dist/src/server-BNaLZH6u.js +0 -63
- package/dist/src/server-CBMuQul3.js +0 -189
- package/dist/src/server-CMKKIzKv.cjs +0 -74
- package/dist/src/server-CN2IS9Cs.js +0 -155
- package/dist/src/server-ua4cqbjC.js +0 -2
- package/dist/src/session-CQIjq_HZ.cjs +0 -69
- package/dist/src/session-FTlg8sEu.js +0 -62
- package/dist/src/session-GBQXtPWp.js +0 -63
- package/dist/src/session-_0-rTdwY.js +0 -62
- package/dist/src/shared-BtuO-OAM.js +0 -1927
- package/dist/src/shared-Ci78wTZX.js +0 -1928
- package/dist/src/shared-Dd3rimdM.js +0 -1929
- package/dist/src/shared-KAjFxRre.cjs +0 -2185
- package/dist/src/simulatedUser--OjW6xCx.js +0 -247
- package/dist/src/simulatedUser-D0-slRye.cjs +0 -252
- package/dist/src/simulatedUser-D1Kh_cwA.js +0 -248
- package/dist/src/slack-BX0FUevO.js +0 -144
- package/dist/src/slack-CcwXFiJE.cjs +0 -144
- package/dist/src/slack-CnfqKfXp.js +0 -145
- package/dist/src/strategies-2ntcK4tN.js +0 -2248
- package/dist/src/strategies-DZIW7Zcs.js +0 -2385
- package/dist/src/strategies-YRDF2j-N.cjs +0 -2420
- package/dist/src/telemetry-CL8CVA4p.js +0 -205
- package/dist/src/telemetry-Cix90qqz.js +0 -201
- package/dist/src/telemetry-CkmlqTjV.js +0 -205
- package/dist/src/telemetry-DQH7l5bb.js +0 -2
- package/dist/src/telemetry-DUCXc1-r.cjs +0 -216
- package/dist/src/togetherai-3yUt5Ck7.js +0 -49
- package/dist/src/togetherai-BJUByLwt.cjs +0 -49
- package/dist/src/togetherai-Bh6KZkmd.js +0 -50
- package/dist/src/togetherai-DDl9yk3b.js +0 -48
- package/dist/src/traceContext-BiJVppjT.cjs +0 -1032
- package/dist/src/traceContext-CKKluULP.js +0 -1016
- package/dist/src/traceContext-D3Sk8fO-.js +0 -1015
- package/dist/src/transcription-BoVQKIVz.js +0 -175
- package/dist/src/transcription-Bs5u8780.js +0 -175
- package/dist/src/transcription-Dl654d1p.cjs +0 -178
- package/dist/src/transcription-VEvhM1Fu.js +0 -176
- package/dist/src/transform-BAbkGpvl.js +0 -125
- package/dist/src/transform-C_j4hUH8.js +0 -126
- package/dist/src/transform-Da86hs4M.cjs +0 -154
- package/dist/src/transform-_i1raQNo.js +0 -125
- package/dist/src/typesafe-CKXBeh82.cjs +0 -253
- package/dist/src/typesafe-D3VaGeNm.js +0 -253
- package/dist/src/typesafe-DYM-SFNH.js +0 -253
- package/dist/src/typesafe-LXmSbw8F.js +0 -254
- package/dist/src/util-41rb0XHX.js +0 -743
- package/dist/src/util-B0WlHYFM.js +0 -2049
- package/dist/src/util-BD1R_PsR.js +0 -1770
- package/dist/src/util-BLbM_ItC.js +0 -395
- package/dist/src/util-C72P0iIa.js +0 -352
- package/dist/src/util-C7MpGlJ6.cjs +0 -2305
- package/dist/src/util-CCtqagKc.js +0 -286
- package/dist/src/util-CM2Ec_uY.js +0 -2051
- package/dist/src/util-CSSAWO8v.js +0 -351
- package/dist/src/util-CkQc-fx3.cjs +0 -934
- package/dist/src/util-DcOlFTFa.cjs +0 -478
- package/dist/src/util-DluGTGVB.js +0 -395
- package/dist/src/util-PfQ60chz.js +0 -743
- package/dist/src/util-f14-CPij.js +0 -396
- package/dist/src/util-l9pXX3Eu.cjs +0 -357
- package/dist/src/util-o_BnlYqS.js +0 -2050
- package/dist/src/vertex-B_-gQgzc.js +0 -2
- package/dist/src/vertex-CU4gqoYa.js +0 -854
- package/dist/src/vertex-DZ42UHb3.js +0 -848
- package/dist/src/vertex-DsYQJA0T.cjs +0 -871
- package/dist/src/vertexLive-BvIaHKGB.js +0 -55
- package/dist/src/vertexLive-CTULqNx7.js +0 -56
- package/dist/src/vertexLive-DjJ_YQBe.cjs +0 -55
- package/dist/src/vertexLive-STUGcteB.js +0 -55
- package/dist/src/video-CAQGmtEV.js +0 -703
- package/dist/src/video-_FSTWlwX.js +0 -702
- package/dist/src/video-aBPJPWdt.js +0 -702
- package/dist/src/video-gDjkWv5m.cjs +0 -706
|
@@ -0,0 +1,891 @@
|
|
|
1
|
+
import { $ as getProcessEnv, X as getEnvString, o as logger } from "./logger-Gff7RMNF.js";
|
|
2
|
+
import "./dataUrl-DBMifX6C.js";
|
|
3
|
+
import { t as fetchWithProxy } from "./fetch-B5KxZuKu.js";
|
|
4
|
+
import { n as resolveProviderApiKey } from "./credentials-DH6z4brQ.js";
|
|
5
|
+
import { g as withGenAIToolSpan } from "./genaiTracer-CuSjHi4t.js";
|
|
6
|
+
import { r as validatePythonPath } from "./pythonUtils-DC5a7NAK.js";
|
|
7
|
+
import { c as maybeLoadToolsFromExternalFile } from "./file-Di0ypTgN.js";
|
|
8
|
+
import "./tracing-CfUes1dH.js";
|
|
9
|
+
import { A as stripExecutableToolFileReferences, C as normalizeTools, D as removeGoogleFunctionDeclarations, N as GOOGLE_MODELS, O as resolveGoogleToolConfig, V as loadCredentials, _ as mergeGoogleCompletionOptions, j as validateFunctionCall, l as getGoogleAccessToken, s as geminiFormatAndSystemInstructions, t as calculateGoogleCost } from "./util-BHkj9joz.js";
|
|
10
|
+
import { r as loadProviderCallbackFromFileUrl } from "./functionCallbackUtils-BfXnPo0o.js";
|
|
11
|
+
import { spawn } from "child_process";
|
|
12
|
+
//#region src/providers/google/live.ts
|
|
13
|
+
const GEMINI_LIVE_TRANSLATE_MODEL = "gemini-3.5-live-translate-preview";
|
|
14
|
+
const ROBOTICS_TEXT_MODALITY_ERROR = "Gemini Robotics ER 2 Streaming only supports TEXT response modality. Omit generationConfig.response_modalities/responseModalities to use the TEXT default, or set it to [\"TEXT\"].";
|
|
15
|
+
const LIVE_TRANSLATE_AUDIO_MODALITY_ERROR = "Gemini 3.5 Live Translate only supports AUDIO response modality. Omit generationConfig.response_modalities/responseModalities to use the AUDIO default, or set it to [\"AUDIO\"].";
|
|
16
|
+
const ROBOTICS_CODE_EXECUTION_ERROR = "Gemini Robotics ER 2 Streaming does not support code execution. Use function calling or Google Search instead.";
|
|
17
|
+
const ROBOTICS_FILE_SEARCH_OR_COMPUTER_USE_ERROR = "Gemini Robotics ER 2 Streaming does not support file search or computer use.";
|
|
18
|
+
const ROBOTICS_GROUNDING_ERROR = "Gemini Robotics ER 2 Streaming does not support Google Maps or URL context grounding. Use Google Search instead.";
|
|
19
|
+
const ROBOTICS_STRUCTURED_OUTPUT_ERROR = "Gemini Robotics ER 2 Streaming does not support structured output. Remove responseSchema and generationConfig response schema/MIME type options.";
|
|
20
|
+
const LIVE_TRANSLATE_STRUCTURED_OUTPUT_ERROR = "Gemini 3.5 Live Translate does not support structured output. Remove responseSchema and generationConfig response schema/MIME type options.";
|
|
21
|
+
const ROBOTICS_UNSUPPORTED_TOOL_ERROR = "Gemini Robotics ER 2 Streaming only supports function declarations and Google Search tools.";
|
|
22
|
+
const ROBOTICS_API_VERSION_ERROR = "Gemini Robotics ER 2 Streaming requires apiVersion v1beta; remove the override or set apiVersion to v1beta.";
|
|
23
|
+
const ROBOTICS_SUPPORTED_TOOL_FIELDS = /* @__PURE__ */ new Set(["functionDeclarations", "googleSearch"]);
|
|
24
|
+
const LIVE_TRANSLATE_SILENCE_PEAK_THRESHOLD = 32;
|
|
25
|
+
function hasStructuredOutputConfiguration(config) {
|
|
26
|
+
const generationConfig = config.generationConfig;
|
|
27
|
+
return config.responseSchema !== void 0 || generationConfig?.response_schema !== void 0 || generationConfig?.response_mime_type !== void 0 || generationConfig?.responseSchema !== void 0 || generationConfig?.responseMimeType !== void 0;
|
|
28
|
+
}
|
|
29
|
+
function hasCodeExecutionTool(tools) {
|
|
30
|
+
return tools.some((tool) => tool.codeExecution !== void 0 || tool.code_execution !== void 0);
|
|
31
|
+
}
|
|
32
|
+
function hasUnsupportedRoboticsGroundingTool(tools) {
|
|
33
|
+
return tools.some((tool) => {
|
|
34
|
+
const groundingTool = tool;
|
|
35
|
+
return groundingTool.googleMaps !== void 0 || groundingTool.google_maps !== void 0 || groundingTool.urlContext !== void 0 || groundingTool.url_context !== void 0;
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
function hasUnsupportedRoboticsFileSearchOrComputerUseTool(tools) {
|
|
39
|
+
return tools.some((tool) => {
|
|
40
|
+
const unsupportedTool = tool;
|
|
41
|
+
return unsupportedTool.computerUse !== void 0 || unsupportedTool.computer_use !== void 0 || unsupportedTool.fileSearch !== void 0 || unsupportedTool.file_search !== void 0;
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
function hasUnsupportedRoboticsTool(tools) {
|
|
45
|
+
return tools.some((tool) => {
|
|
46
|
+
const fields = Object.keys(tool);
|
|
47
|
+
return fields.length === 0 || fields.some((field) => !ROBOTICS_SUPPORTED_TOOL_FIELDS.has(field));
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
function getRoboticsConfigError(isRoboticsStreamingModel, config, responseModalities, tools) {
|
|
51
|
+
if (!isRoboticsStreamingModel) return;
|
|
52
|
+
if (responseModalities !== void 0 && (responseModalities.length !== 1 || responseModalities[0] !== "TEXT")) return ROBOTICS_TEXT_MODALITY_ERROR;
|
|
53
|
+
if (hasStructuredOutputConfiguration(config)) return ROBOTICS_STRUCTURED_OUTPUT_ERROR;
|
|
54
|
+
if (hasCodeExecutionTool(tools)) return ROBOTICS_CODE_EXECUTION_ERROR;
|
|
55
|
+
if (hasUnsupportedRoboticsFileSearchOrComputerUseTool(tools)) return ROBOTICS_FILE_SEARCH_OR_COMPUTER_USE_ERROR;
|
|
56
|
+
if (hasUnsupportedRoboticsGroundingTool(tools)) return ROBOTICS_GROUNDING_ERROR;
|
|
57
|
+
return hasUnsupportedRoboticsTool(tools) ? ROBOTICS_UNSUPPORTED_TOOL_ERROR : void 0;
|
|
58
|
+
}
|
|
59
|
+
function hasUnsupportedLiveTranslateToolsOrInstructions(config, systemInstruction) {
|
|
60
|
+
return (Array.isArray(config.tools) ? config.tools.length > 0 : Boolean(config.tools)) || config.tool_choice !== void 0 || config.toolConfig !== void 0 || config.tool_config !== void 0 || config.mcp?.enabled || Boolean(config.functionToolStatefulApi?.file) || Boolean(systemInstruction);
|
|
61
|
+
}
|
|
62
|
+
function hasUnsupportedLiveTranslateThinkingConfig(config) {
|
|
63
|
+
const generationConfig = config.generationConfig;
|
|
64
|
+
return generationConfig?.thinkingConfig !== void 0 || generationConfig?.thinking_config !== void 0;
|
|
65
|
+
}
|
|
66
|
+
function getEffectiveLiveTranslateServiceTier(mergedConfig, promptConfig) {
|
|
67
|
+
const providerPassthrough = mergedConfig.passthrough;
|
|
68
|
+
const promptPassthrough = promptConfig?.passthrough;
|
|
69
|
+
const providerServiceTier = providerPassthrough?.service_tier ?? providerPassthrough?.serviceTier ?? mergedConfig.service_tier;
|
|
70
|
+
return promptPassthrough?.service_tier ?? promptPassthrough?.serviceTier ?? promptConfig?.service_tier ?? providerServiceTier;
|
|
71
|
+
}
|
|
72
|
+
function hasMeaningfulPcm(audio) {
|
|
73
|
+
for (let offset = 0; offset + 1 < audio.length; offset += 2) if (Math.abs(audio.readInt16LE(offset)) > LIVE_TRANSLATE_SILENCE_PEAK_THRESHOLD) return true;
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
function getUnsupportedLiveTranslateConfigurationError(config, systemInstruction, responseModalities, serviceTier) {
|
|
77
|
+
if (responseModalities !== void 0 && (responseModalities.length !== 1 || responseModalities[0] !== "AUDIO")) return LIVE_TRANSLATE_AUDIO_MODALITY_ERROR;
|
|
78
|
+
return (hasUnsupportedLiveTranslateToolsOrInstructions(config, systemInstruction) ? "Gemini 3.5 Live Translate does not support tools or instructions." : void 0) ?? (hasStructuredOutputConfiguration(config) ? LIVE_TRANSLATE_STRUCTURED_OUTPUT_ERROR : void 0) ?? (serviceTier !== void 0 && serviceTier !== "standard" ? "Gemini 3.5 Live Translate does not support flex, priority, batch, or other non-standard inference tiers; remove service_tier/serviceTier or set it to standard." : void 0);
|
|
79
|
+
}
|
|
80
|
+
const formatContentMessages = (contents, contentIndex, useRealtimeTextInput = false, useManualAudioActivity = false, useClientContentText = false) => {
|
|
81
|
+
if (contents[contentIndex].role !== "user") throw new Error("Can only take user role inputs.");
|
|
82
|
+
const parts = contents[contentIndex].parts;
|
|
83
|
+
if (useClientContentText && parts.every((part) => typeof part.text === "string")) return [{ clientContent: {
|
|
84
|
+
turns: [{
|
|
85
|
+
role: "user",
|
|
86
|
+
parts
|
|
87
|
+
}],
|
|
88
|
+
turnComplete: true
|
|
89
|
+
} }];
|
|
90
|
+
if (useRealtimeTextInput) {
|
|
91
|
+
const mappedMessages = parts.map((part) => {
|
|
92
|
+
const userPart = part;
|
|
93
|
+
if (userPart.text !== void 0) return { realtimeInput: { text: userPart.text } };
|
|
94
|
+
const inlineData = userPart.inlineData ?? userPart.inline_data;
|
|
95
|
+
if (inlineData) {
|
|
96
|
+
const mimeType = "mimeType" in inlineData ? inlineData.mimeType : inlineData.mime_type;
|
|
97
|
+
if (mimeType.startsWith("video/")) throw new Error("Google Live video input must be sent as individual image/jpeg or image/png frames (maximum 1 frame per second).");
|
|
98
|
+
if (mimeType.startsWith("audio/") && !mimeType.startsWith("audio/pcm")) throw new Error(`Unsupported Google Live realtime input MIME type: ${mimeType}. Audio input must be raw 16-bit PCM (for example, audio/pcm;rate=16000).`);
|
|
99
|
+
if (!mimeType.startsWith("audio/") && mimeType !== "image/jpeg" && mimeType !== "image/png") throw new Error(`Unsupported Google Live realtime input MIME type: ${mimeType}`);
|
|
100
|
+
return { realtimeInput: { [mimeType.startsWith("audio/") ? "audio" : "video"]: {
|
|
101
|
+
mimeType,
|
|
102
|
+
data: inlineData.data
|
|
103
|
+
} } };
|
|
104
|
+
}
|
|
105
|
+
throw new Error("Unsupported part in Google Live realtime input.");
|
|
106
|
+
});
|
|
107
|
+
const textMessages = mappedMessages.filter((message) => "text" in message.realtimeInput);
|
|
108
|
+
const contentMessages = mappedMessages.filter((message) => !("text" in message.realtimeInput));
|
|
109
|
+
if (useClientContentText && textMessages.length > 0) {
|
|
110
|
+
const text = textMessages.map((message) => message.realtimeInput.text).join("\n");
|
|
111
|
+
const hasAudio = contentMessages.some((message) => "audio" in message.realtimeInput);
|
|
112
|
+
const clientContent = { clientContent: {
|
|
113
|
+
turns: [{
|
|
114
|
+
role: "user",
|
|
115
|
+
parts: [{ text }]
|
|
116
|
+
}],
|
|
117
|
+
turnComplete: !hasAudio
|
|
118
|
+
} };
|
|
119
|
+
if (hasAudio) return [
|
|
120
|
+
clientContent,
|
|
121
|
+
{ realtimeInput: { activityStart: {} } },
|
|
122
|
+
...contentMessages,
|
|
123
|
+
{ realtimeInput: { activityEnd: {} } }
|
|
124
|
+
];
|
|
125
|
+
return [...contentMessages, clientContent];
|
|
126
|
+
}
|
|
127
|
+
if (textMessages.length > 0) contentMessages.push({ realtimeInput: { text: textMessages.map((message) => message.realtimeInput.text).join("\n") } });
|
|
128
|
+
if (contentMessages.some((message) => "audio" in message.realtimeInput)) {
|
|
129
|
+
if (useManualAudioActivity) return [
|
|
130
|
+
{ realtimeInput: { activityStart: {} } },
|
|
131
|
+
...contentMessages,
|
|
132
|
+
{ realtimeInput: { activityEnd: {} } }
|
|
133
|
+
];
|
|
134
|
+
contentMessages.push({ realtimeInput: { audioStreamEnd: true } });
|
|
135
|
+
} else if (contentMessages.some((message) => "video" in message.realtimeInput) && textMessages.length === 0) contentMessages.push({ clientContent: { turnComplete: true } });
|
|
136
|
+
return contentMessages;
|
|
137
|
+
}
|
|
138
|
+
if (parts.length !== 1) throw new Error("Unexpected number of parts in user input.");
|
|
139
|
+
return [{ client_content: {
|
|
140
|
+
turns: [{
|
|
141
|
+
role: "user",
|
|
142
|
+
parts: [{ text: parts[0].text }]
|
|
143
|
+
}],
|
|
144
|
+
turn_complete: true
|
|
145
|
+
} }];
|
|
146
|
+
};
|
|
147
|
+
const getModalityTokenCount = (details, modality) => {
|
|
148
|
+
if (!Array.isArray(details)) return 0;
|
|
149
|
+
return details.reduce((total, detail) => {
|
|
150
|
+
const count = detail?.tokenCount ?? detail?.token_count;
|
|
151
|
+
return detail?.modality === modality && typeof count === "number" && Number.isFinite(count) ? total + Math.max(count, 0) : total;
|
|
152
|
+
}, 0);
|
|
153
|
+
};
|
|
154
|
+
const getTokenCount = (...values) => {
|
|
155
|
+
const value = values.find((entry) => typeof entry === "number" && Number.isFinite(entry));
|
|
156
|
+
return typeof value === "number" ? Math.max(value, 0) : 0;
|
|
157
|
+
};
|
|
158
|
+
const getGemini38ConfigError = (generationConfig, extendedThinking) => {
|
|
159
|
+
const thinking = generationConfig?.thinkingConfig;
|
|
160
|
+
if (!extendedThinking && thinking) return "gemini-3.8-live does not support thinkingConfig. Use gemini-3.8-live-extended-thinking instead.";
|
|
161
|
+
if (thinking?.thinkingBudget !== void 0) return "gemini-3.8-live-extended-thinking does not support thinkingBudget. Use thinkingLevel LOW, MEDIUM, or HIGH.";
|
|
162
|
+
if (thinking?.thinkingLevel !== void 0 && ![
|
|
163
|
+
"LOW",
|
|
164
|
+
"MEDIUM",
|
|
165
|
+
"HIGH"
|
|
166
|
+
].includes(thinking.thinkingLevel)) return "gemini-3.8-live-extended-thinking supports thinkingLevel LOW, MEDIUM, or HIGH.";
|
|
167
|
+
if (generationConfig?.enableAffectiveDialog !== void 0) return "Gemini 3.8 Live does not support enableAffectiveDialog.";
|
|
168
|
+
if (generationConfig?.proactivity?.proactiveAudio === false) return "Gemini 3.8 Live has permanently enabled proactive audio; proactivity.proactiveAudio cannot be false.";
|
|
169
|
+
};
|
|
170
|
+
/**
|
|
171
|
+
* Helper function to fetch JSON with error handling
|
|
172
|
+
*/
|
|
173
|
+
const fetchJson = async (url, options) => {
|
|
174
|
+
const response = await fetchWithProxy(url, options);
|
|
175
|
+
if (!response.ok) throw new Error(`HTTP error - status: ${response.status}`);
|
|
176
|
+
return response.json();
|
|
177
|
+
};
|
|
178
|
+
/**
|
|
179
|
+
* Helper function to try GET with query params, fallback to POST with JSON body
|
|
180
|
+
*/
|
|
181
|
+
const tryGetThenPost = async (url, data) => {
|
|
182
|
+
try {
|
|
183
|
+
const urlWithParams = new URL(url);
|
|
184
|
+
if (data) {
|
|
185
|
+
const params = typeof data === "string" ? JSON.parse(data) : data;
|
|
186
|
+
Object.entries(params).forEach(([key, value]) => {
|
|
187
|
+
urlWithParams.searchParams.append(key, String(value));
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
return await fetchJson(urlWithParams.href);
|
|
191
|
+
} catch {
|
|
192
|
+
return fetchJson(url, {
|
|
193
|
+
method: "POST",
|
|
194
|
+
headers: { "Content-Type": "application/json" },
|
|
195
|
+
body: data ? JSON.stringify(typeof data === "string" ? JSON.parse(data) : data) : null
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
};
|
|
199
|
+
var GoogleLiveProvider = class {
|
|
200
|
+
config;
|
|
201
|
+
modelName;
|
|
202
|
+
env;
|
|
203
|
+
isVertex = false;
|
|
204
|
+
loadedFunctionCallbacks = {};
|
|
205
|
+
constructor(modelName, options) {
|
|
206
|
+
this.modelName = modelName;
|
|
207
|
+
this.config = options.config || {};
|
|
208
|
+
this.env = options.env;
|
|
209
|
+
}
|
|
210
|
+
validateFunctionToolCall(output, vars) {
|
|
211
|
+
validateFunctionCall(output, this.config.tools, vars);
|
|
212
|
+
}
|
|
213
|
+
id() {
|
|
214
|
+
return `google:live:${this.modelName}`;
|
|
215
|
+
}
|
|
216
|
+
toString() {
|
|
217
|
+
return `[Google Live Provider ${this.modelName}]`;
|
|
218
|
+
}
|
|
219
|
+
convertPcmToWav(pcmBuffer) {
|
|
220
|
+
const wavBuffer = this.createWavHeader(pcmBuffer.length, 24e3, 16, 1);
|
|
221
|
+
return Buffer.concat([wavBuffer, pcmBuffer]).toString("base64");
|
|
222
|
+
}
|
|
223
|
+
createWavHeader(dataLength, sampleRate, bitsPerSample, channels) {
|
|
224
|
+
const header = Buffer.alloc(44);
|
|
225
|
+
header.write("RIFF", 0);
|
|
226
|
+
header.writeUInt32LE(36 + dataLength, 4);
|
|
227
|
+
header.write("WAVE", 8);
|
|
228
|
+
header.write("fmt ", 12);
|
|
229
|
+
header.writeUInt32LE(16, 16);
|
|
230
|
+
header.writeUInt16LE(1, 20);
|
|
231
|
+
header.writeUInt16LE(channels, 22);
|
|
232
|
+
header.writeUInt32LE(sampleRate, 24);
|
|
233
|
+
header.writeUInt32LE(sampleRate * channels * bitsPerSample / 8, 28);
|
|
234
|
+
header.writeUInt16LE(channels * bitsPerSample / 8, 32);
|
|
235
|
+
header.writeUInt16LE(bitsPerSample, 34);
|
|
236
|
+
header.write("data", 36);
|
|
237
|
+
header.writeUInt32LE(dataLength, 40);
|
|
238
|
+
return header;
|
|
239
|
+
}
|
|
240
|
+
getApiKey() {
|
|
241
|
+
return resolveProviderApiKey({ apiKey: this.config.apiKey }, this.env, ["GOOGLE_API_KEY", "GEMINI_API_KEY"]);
|
|
242
|
+
}
|
|
243
|
+
async getAccessToken(config) {
|
|
244
|
+
const credentials = loadCredentials(config.credentials);
|
|
245
|
+
return getGoogleAccessToken(credentials);
|
|
246
|
+
}
|
|
247
|
+
async getConnection(config) {
|
|
248
|
+
const apiKey = config.apiKey || (config.credentials ? void 0 : this.getApiKey());
|
|
249
|
+
const accessToken = apiKey ? void 0 : await this.getAccessToken(config);
|
|
250
|
+
if (!accessToken && !apiKey) throw new Error("Google authentication is not configured. For the Live API, set apiKey in the provider config, GOOGLE_API_KEY, or GEMINI_API_KEY. Alternatively, configure OAuth2 credentials; see https://ai.google.dev/gemini-api/docs/oauth.");
|
|
251
|
+
const prefersV1beta = this.modelName === GEMINI_LIVE_TRANSLATE_MODEL || this.modelName.startsWith("gemini-robotics-er-2-streaming-") || this.modelName.startsWith("gemini-3.1-flash-live") || this.modelName.startsWith("gemini-2.5-flash-native-audio-") || this.modelName.startsWith("gemini-live-2.5-flash-preview-native-audio-");
|
|
252
|
+
const apiVersion = config.apiVersion || (prefersV1beta ? "v1beta" : "v1alpha");
|
|
253
|
+
return {
|
|
254
|
+
url: `wss://generativelanguage.googleapis.com/ws/google.ai.generativelanguage.${apiVersion}.GenerativeService.BidiGenerateContent?${accessToken ? `access_token=${accessToken}` : `key=${apiKey}`}`,
|
|
255
|
+
model: `models/${this.modelName}`,
|
|
256
|
+
apiVersion
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
async callApi(prompt, context) {
|
|
260
|
+
const isGemini38Live = this.modelName === "gemini-3.8-live" || this.modelName === "gemini-3.8-live-extended-thinking";
|
|
261
|
+
const usesInteractionStatus = this.modelName === "gemini-3.8-live-extended-thinking";
|
|
262
|
+
const promptConfig = context?.prompt?.config;
|
|
263
|
+
const config = mergeGoogleCompletionOptions(this.config, promptConfig);
|
|
264
|
+
const promptBasePath = promptConfig?.basePath ?? this.config.basePath;
|
|
265
|
+
const supportsTextResponse = this.modelName.startsWith("gemini-robotics-er-2-streaming-");
|
|
266
|
+
const configuredResponseModalities = (config.generationConfig?.response_modalities ?? config.generationConfig?.responseModalities)?.map((modality) => modality.toUpperCase());
|
|
267
|
+
if (isGemini38Live) {
|
|
268
|
+
const error = getGemini38ConfigError(config.generationConfig, usesInteractionStatus);
|
|
269
|
+
if (error) return { error };
|
|
270
|
+
}
|
|
271
|
+
const connection = await this.getConnection(config);
|
|
272
|
+
const usesRealtimeTextInput = isGemini38Live || connection.apiVersion === "v1beta" || this.isVertex;
|
|
273
|
+
const { toolConfig, toolsDisabled } = resolveGoogleToolConfig(config);
|
|
274
|
+
const { contents, systemInstruction } = geminiFormatAndSystemInstructions(prompt, context?.vars, config.systemInstruction, {
|
|
275
|
+
basePath: promptConfig?.systemInstruction === void 0 ? this.config.basePath : promptBasePath,
|
|
276
|
+
useAssistantRole: config.useAssistantRole
|
|
277
|
+
});
|
|
278
|
+
const useManualAudioActivity = (isGemini38Live || this.isVertex) && contents.some((content) => content.parts.some((part) => {
|
|
279
|
+
const audioPart = part;
|
|
280
|
+
return (audioPart.inlineData?.mimeType ?? audioPart.inline_data?.mime_type)?.startsWith("audio/");
|
|
281
|
+
}));
|
|
282
|
+
let contentIndex = 0;
|
|
283
|
+
if (this.modelName === GEMINI_LIVE_TRANSLATE_MODEL) {
|
|
284
|
+
const translationConfig = config.generationConfig?.translationConfig;
|
|
285
|
+
if (!translationConfig) return { error: "Gemini 3.5 Live Translate requires generationConfig.translationConfig (targetLanguageCode defaults to en)." };
|
|
286
|
+
if (translationConfig.targetLanguageCode !== void 0 && (typeof translationConfig.targetLanguageCode !== "string" || translationConfig.targetLanguageCode.trim().length === 0)) return { error: "Gemini 3.5 Live Translate requires a non-empty targetLanguageCode in generationConfig.translationConfig when provided." };
|
|
287
|
+
if (translationConfig.targetLanguageCode === void 0) config.generationConfig = {
|
|
288
|
+
...config.generationConfig,
|
|
289
|
+
translationConfig: {
|
|
290
|
+
...translationConfig,
|
|
291
|
+
targetLanguageCode: "en"
|
|
292
|
+
}
|
|
293
|
+
};
|
|
294
|
+
if (hasUnsupportedLiveTranslateThinkingConfig(config)) return { error: "Gemini 3.5 Live Translate does not support generationConfig.thinkingConfig or generationConfig.thinking_config; remove the thinking configuration." };
|
|
295
|
+
if (!this.isVertex && config.apiVersion && config.apiVersion !== "v1beta") return { error: "Gemini 3.5 Live Translate requires apiVersion v1beta; remove the override or set apiVersion to v1beta." };
|
|
296
|
+
const unsupportedConfigurationError = getUnsupportedLiveTranslateConfigurationError(config, systemInstruction, configuredResponseModalities, getEffectiveLiveTranslateServiceTier(config, promptConfig));
|
|
297
|
+
if (unsupportedConfigurationError) return { error: unsupportedConfigurationError };
|
|
298
|
+
if (!(contents.length > 0 && contents.every((content) => content.role === "user" && content.parts.length > 0 && content.parts.every((part) => {
|
|
299
|
+
const inlineData = part.inlineData ?? part.inline_data;
|
|
300
|
+
return (inlineData?.mimeType ?? inlineData?.mime_type)?.toLowerCase() === "audio/pcm;rate=16000" && typeof inlineData?.data === "string" && inlineData.data.trim().length > 0;
|
|
301
|
+
})))) return { error: "Gemini 3.5 Live Translate only supports raw PCM audio input with MIME type audio/pcm;rate=16000 (16-bit mono) and non-empty base64 data; text, image, video, missing sample rates, and other sample rates are not supported." };
|
|
302
|
+
}
|
|
303
|
+
const configTools = toolsDisabled ? stripExecutableToolFileReferences(config.tools, context?.vars) : config.tools;
|
|
304
|
+
const fileTools = configTools ? await maybeLoadToolsFromExternalFile(configTools, context?.vars) : [];
|
|
305
|
+
const normalizedTools = fileTools ? normalizeTools(Array.isArray(fileTools) ? fileTools : [fileTools]) : [];
|
|
306
|
+
const requestTools = toolsDisabled ? removeGoogleFunctionDeclarations(normalizedTools) : normalizedTools;
|
|
307
|
+
if (supportsTextResponse && !this.isVertex && config.apiVersion && config.apiVersion !== "v1beta") return { error: ROBOTICS_API_VERSION_ERROR };
|
|
308
|
+
const roboticsConfigError = getRoboticsConfigError(supportsTextResponse, config, configuredResponseModalities, requestTools);
|
|
309
|
+
if (roboticsConfigError) return { error: roboticsConfigError };
|
|
310
|
+
if (usesInteractionStatus) for (const tool of requestTools) {
|
|
311
|
+
if (tool.functionDeclarations?.some((declaration) => declaration.behavior === "BLOCKING")) return { error: "gemini-3.8-live-extended-thinking requires NON_BLOCKING function declarations." };
|
|
312
|
+
if (tool.functionDeclarations) tool.functionDeclarations = tool.functionDeclarations.map((declaration) => ({
|
|
313
|
+
...declaration,
|
|
314
|
+
behavior: "NON_BLOCKING"
|
|
315
|
+
}));
|
|
316
|
+
}
|
|
317
|
+
let statefulApi;
|
|
318
|
+
if (!toolsDisabled && config.functionToolStatefulApi?.file) try {
|
|
319
|
+
const pythonPath = await validatePythonPath(config.functionToolStatefulApi.pythonExecutable || getEnvString("PROMPTFOO_PYTHON") || "python3", !!config.functionToolStatefulApi.pythonExecutable || !!getEnvString("PROMPTFOO_PYTHON"));
|
|
320
|
+
logger.debug(`Spawning API with Python executable: ${pythonPath}`);
|
|
321
|
+
statefulApi = spawn(pythonPath, [config.functionToolStatefulApi.file], { env: getProcessEnv() });
|
|
322
|
+
statefulApi.on("error", (err) => {
|
|
323
|
+
logger.error(`Error spawning Python process: ${JSON.stringify(err)}`);
|
|
324
|
+
});
|
|
325
|
+
statefulApi.stdout?.on("data", (data) => {
|
|
326
|
+
logger.debug(`Python API stdout: ${data.toString()}`);
|
|
327
|
+
});
|
|
328
|
+
statefulApi.stderr?.on("data", (data) => {
|
|
329
|
+
logger.error(`Python API stderr: ${data.toString()}`);
|
|
330
|
+
});
|
|
331
|
+
await new Promise((resolve) => setTimeout(resolve, 1e3));
|
|
332
|
+
logger.debug("Stateful API process started");
|
|
333
|
+
} catch (err) {
|
|
334
|
+
logger.error(`Failed to spawn Python API: ${JSON.stringify(err)}`);
|
|
335
|
+
}
|
|
336
|
+
const WebSocketCtor = (await import("ws")).default;
|
|
337
|
+
return new Promise((resolve) => {
|
|
338
|
+
const isNativeAudioModel = this.modelName.includes("native-audio");
|
|
339
|
+
let isResolved = false;
|
|
340
|
+
let liveTranslateCompletionTimeout;
|
|
341
|
+
let liveTranslateHardTimeout;
|
|
342
|
+
let timeout;
|
|
343
|
+
let cancelFinalStateRetrieval;
|
|
344
|
+
let statefulApiCleanupStarted = false;
|
|
345
|
+
let armLiveTranslateCompletion = () => {};
|
|
346
|
+
let armLiveTranslateHardTimeout = () => {};
|
|
347
|
+
const safeResolve = (response) => {
|
|
348
|
+
if (!isResolved) {
|
|
349
|
+
isResolved = true;
|
|
350
|
+
clearTimeout(timeout);
|
|
351
|
+
clearTimeout(liveTranslateCompletionTimeout);
|
|
352
|
+
clearTimeout(liveTranslateHardTimeout);
|
|
353
|
+
cancelFinalStateRetrieval?.(/* @__PURE__ */ new Error("Final state retrieval cancelled"));
|
|
354
|
+
if (statefulApi && !statefulApiCleanupStarted) {
|
|
355
|
+
statefulApiCleanupStarted = true;
|
|
356
|
+
try {
|
|
357
|
+
statefulApi.kill("SIGTERM");
|
|
358
|
+
} catch (error) {
|
|
359
|
+
logger.error("Failed to terminate stateful API process", { error });
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
resolve(response);
|
|
363
|
+
}
|
|
364
|
+
};
|
|
365
|
+
const ws = connection.headers ? new WebSocketCtor(connection.url, { headers: connection.headers }) : new WebSocketCtor(connection.url);
|
|
366
|
+
let response_text_total = "";
|
|
367
|
+
const responseAudioChunks = [];
|
|
368
|
+
let response_audio_transcript = "";
|
|
369
|
+
let hasAudioContent = false;
|
|
370
|
+
const function_calls_total = [];
|
|
371
|
+
let statefulApiState = void 0;
|
|
372
|
+
const usageMetadata = [];
|
|
373
|
+
let pendingUsageMetadata;
|
|
374
|
+
let completedGenerations = 0;
|
|
375
|
+
let completedTurns = 0;
|
|
376
|
+
let hasPendingToolFollowup = false;
|
|
377
|
+
let receivedMessageIndex = 0;
|
|
378
|
+
let lastToolResponseMessageIndex = 0;
|
|
379
|
+
let lastVideoFrameSentAt = 0;
|
|
380
|
+
let hasFinalized = false;
|
|
381
|
+
let liveTranslateInputEnded = false;
|
|
382
|
+
const requestedText = configuredResponseModalities?.includes("TEXT") ?? false;
|
|
383
|
+
const responseModalities = usesRealtimeTextInput && !supportsTextResponse ? configuredResponseModalities?.filter((modality) => modality !== "TEXT") : configuredResponseModalities;
|
|
384
|
+
const effectiveResponseModalities = supportsTextResponse && responseModalities === void 0 ? ["TEXT"] : usesRealtimeTextInput && !supportsTextResponse && !responseModalities?.length ? ["AUDIO"] : responseModalities;
|
|
385
|
+
if (requestedText && !effectiveResponseModalities?.includes("TEXT")) logger.warn(`[Google Live] ${this.modelName} does not support TEXT response modality; requesting AUDIO with output transcription instead. Audio output is billed at audio rates.`);
|
|
386
|
+
const isTextExpected = effectiveResponseModalities?.includes("TEXT") ?? false;
|
|
387
|
+
const isAudioExpected = effectiveResponseModalities?.includes("AUDIO") ?? false;
|
|
388
|
+
let hasTextStreamEnded = !isTextExpected;
|
|
389
|
+
let hasAudioStreamEnded = !isAudioExpected;
|
|
390
|
+
const sendContentMessages = async (contentMessages) => {
|
|
391
|
+
if (this.modelName === GEMINI_LIVE_TRANSLATE_MODEL) {
|
|
392
|
+
liveTranslateInputEnded = false;
|
|
393
|
+
clearTimeout(liveTranslateHardTimeout);
|
|
394
|
+
liveTranslateHardTimeout = void 0;
|
|
395
|
+
}
|
|
396
|
+
for (const contentMessage of contentMessages) {
|
|
397
|
+
if (contentMessage.realtimeInput?.video) {
|
|
398
|
+
const delayMs = Math.max(lastVideoFrameSentAt + 1e3 - Date.now(), 0);
|
|
399
|
+
if (delayMs > 0) await new Promise((resolve) => setTimeout(resolve, delayMs));
|
|
400
|
+
if (isResolved) return;
|
|
401
|
+
lastVideoFrameSentAt = Date.now();
|
|
402
|
+
}
|
|
403
|
+
ws.send(JSON.stringify(contentMessage));
|
|
404
|
+
if (this.modelName === GEMINI_LIVE_TRANSLATE_MODEL && contentMessage.realtimeInput?.audioStreamEnd) {
|
|
405
|
+
liveTranslateInputEnded = true;
|
|
406
|
+
armLiveTranslateHardTimeout();
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
};
|
|
410
|
+
const hasOutputTranscription = !!config.generationConfig?.outputAudioTranscription || isGemini38Live || this.isVertex || usesRealtimeTextInput && !supportsTextResponse && requestedText;
|
|
411
|
+
const videoFrameCount = contents.reduce((total, content) => total + content.parts.filter((part) => {
|
|
412
|
+
const inlineData = part.inlineData ?? part.inline_data;
|
|
413
|
+
const mimeType = inlineData?.mimeType ?? inlineData?.mime_type;
|
|
414
|
+
return mimeType === "image/jpeg" || mimeType === "image/png";
|
|
415
|
+
}).length, 0);
|
|
416
|
+
const framePacingAllowanceMs = Math.max(videoFrameCount - 1, 0) * 1e3;
|
|
417
|
+
const effectiveTimeoutMs = (config.timeoutMs || 3e4) + framePacingAllowanceMs;
|
|
418
|
+
const liveTranslateCompletionGraceMs = Math.min(4e3, Math.max(1, Math.floor(effectiveTimeoutMs / 2)));
|
|
419
|
+
const liveTranslateHardDeadlineMs = effectiveTimeoutMs + liveTranslateCompletionGraceMs;
|
|
420
|
+
const armIdleTimeout = () => {
|
|
421
|
+
clearTimeout(timeout);
|
|
422
|
+
if (isResolved || hasFinalized) return;
|
|
423
|
+
timeout = setTimeout(() => {
|
|
424
|
+
logger.error(`WebSocket connection timed out after ${effectiveTimeoutMs}ms of inactivity`);
|
|
425
|
+
ws.close();
|
|
426
|
+
safeResolve({ error: `WebSocket request timed out after ${effectiveTimeoutMs}ms of inactivity` });
|
|
427
|
+
}, effectiveTimeoutMs);
|
|
428
|
+
};
|
|
429
|
+
armIdleTimeout();
|
|
430
|
+
armLiveTranslateHardTimeout = () => {
|
|
431
|
+
clearTimeout(liveTranslateHardTimeout);
|
|
432
|
+
liveTranslateHardTimeout = setTimeout(() => {
|
|
433
|
+
liveTranslateHardTimeout = void 0;
|
|
434
|
+
logger.error(`WebSocket request timed out after ${liveTranslateHardDeadlineMs}ms waiting for Live Translate output`);
|
|
435
|
+
ws.close();
|
|
436
|
+
safeResolve({ error: `WebSocket request timed out after ${liveTranslateHardDeadlineMs}ms waiting for Live Translate output` });
|
|
437
|
+
}, liveTranslateHardDeadlineMs);
|
|
438
|
+
};
|
|
439
|
+
const sendNextContentMessages = async (isMultiTurn = false) => {
|
|
440
|
+
if (contentIndex >= contents.length) return;
|
|
441
|
+
clearTimeout(liveTranslateCompletionTimeout);
|
|
442
|
+
liveTranslateCompletionTimeout = void 0;
|
|
443
|
+
const contentMessages = formatContentMessages(contents, contentIndex, usesRealtimeTextInput, useManualAudioActivity, this.isVertex && !isGemini38Live);
|
|
444
|
+
contentIndex += 1;
|
|
445
|
+
armIdleTimeout();
|
|
446
|
+
logger.debug(isMultiTurn ? "WebSocket sent (multi-turn)" : "WebSocket sent", { messageCount: contentMessages.length });
|
|
447
|
+
await sendContentMessages(contentMessages);
|
|
448
|
+
};
|
|
449
|
+
const finalizeResponse = async () => {
|
|
450
|
+
if (hasFinalized || isResolved) {
|
|
451
|
+
logger.debug("Response already finalized or resolved, skipping finalization");
|
|
452
|
+
return;
|
|
453
|
+
}
|
|
454
|
+
hasFinalized = true;
|
|
455
|
+
clearTimeout(liveTranslateCompletionTimeout);
|
|
456
|
+
clearTimeout(liveTranslateHardTimeout);
|
|
457
|
+
if (pendingUsageMetadata) {
|
|
458
|
+
usageMetadata.push(pendingUsageMetadata);
|
|
459
|
+
pendingUsageMetadata = void 0;
|
|
460
|
+
}
|
|
461
|
+
if (ws.readyState === WebSocketCtor.OPEN) ws.close();
|
|
462
|
+
clearTimeout(timeout);
|
|
463
|
+
if (!isResolved && !toolsDisabled && config.functionToolStatefulApi) {
|
|
464
|
+
const controller = new AbortController();
|
|
465
|
+
const finalStateTimeoutMs = config.timeoutMs || 3e4;
|
|
466
|
+
let finalStateTimeout;
|
|
467
|
+
const cancelled = new Promise((_, reject) => {
|
|
468
|
+
cancelFinalStateRetrieval = (reason) => {
|
|
469
|
+
clearTimeout(finalStateTimeout);
|
|
470
|
+
reject(reason);
|
|
471
|
+
controller.abort();
|
|
472
|
+
};
|
|
473
|
+
finalStateTimeout = setTimeout(() => {
|
|
474
|
+
cancelFinalStateRetrieval?.(/* @__PURE__ */ new Error(`Final state retrieval timed out after ${finalStateTimeoutMs}ms`));
|
|
475
|
+
}, finalStateTimeoutMs);
|
|
476
|
+
});
|
|
477
|
+
try {
|
|
478
|
+
const url = new URL("get_state", config.functionToolStatefulApi.url).href;
|
|
479
|
+
const state = await Promise.race([fetchJson(url, { signal: controller.signal }), cancelled]);
|
|
480
|
+
if (isResolved) return;
|
|
481
|
+
statefulApiState = state;
|
|
482
|
+
logger.debug(`Stateful api state: ${JSON.stringify(statefulApiState)}`);
|
|
483
|
+
} catch (err) {
|
|
484
|
+
if (!isResolved) logger.error("Error retrieving final state of api", { error: err });
|
|
485
|
+
} finally {
|
|
486
|
+
clearTimeout(finalStateTimeout);
|
|
487
|
+
cancelFinalStateRetrieval = void 0;
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
if (isResolved) return;
|
|
491
|
+
let outputText = response_text_total;
|
|
492
|
+
let thinking = void 0;
|
|
493
|
+
if (hasAudioContent && response_audio_transcript) {
|
|
494
|
+
if (response_text_total) {
|
|
495
|
+
thinking = response_text_total;
|
|
496
|
+
outputText = response_audio_transcript;
|
|
497
|
+
} else outputText = response_audio_transcript;
|
|
498
|
+
}
|
|
499
|
+
const result = {
|
|
500
|
+
output: {
|
|
501
|
+
text: outputText,
|
|
502
|
+
toolCall: { functionCalls: function_calls_total },
|
|
503
|
+
statefulApiState,
|
|
504
|
+
...thinking && { thinking }
|
|
505
|
+
},
|
|
506
|
+
metadata: {}
|
|
507
|
+
};
|
|
508
|
+
if (usageMetadata.length > 0) {
|
|
509
|
+
const promptTokens = usageMetadata.reduce((total, usage) => total + getTokenCount(usage.promptTokenCount, usage.prompt_token_count) + getTokenCount(usage.toolUsePromptTokenCount, usage.tool_use_prompt_token_count), 0);
|
|
510
|
+
const responseTokens = usageMetadata.reduce((total, usage) => total + getTokenCount(usage.responseTokenCount, usage.candidatesTokenCount, usage.response_token_count, usage.candidates_token_count), 0);
|
|
511
|
+
const thoughtTokens = usageMetadata.reduce((total, usage) => total + getTokenCount(usage.thoughtsTokenCount, usage.thoughts_token_count), 0);
|
|
512
|
+
const billableCompletionTokens = usageMetadata.reduce((total, usage) => {
|
|
513
|
+
const promptTokenCount = getTokenCount(usage.promptTokenCount, usage.prompt_token_count);
|
|
514
|
+
const toolUsePromptTokenCount = getTokenCount(usage.toolUsePromptTokenCount, usage.tool_use_prompt_token_count);
|
|
515
|
+
const responseTokenCount = getTokenCount(usage.responseTokenCount, usage.candidatesTokenCount, usage.response_token_count, usage.candidates_token_count);
|
|
516
|
+
const totalTokenCount = getTokenCount(usage.totalTokenCount, usage.total_token_count);
|
|
517
|
+
const thoughtsTokenCount = getTokenCount(usage.thoughtsTokenCount, usage.thoughts_token_count);
|
|
518
|
+
const thoughtsIncluded = totalTokenCount > 0 && (totalTokenCount === promptTokenCount + responseTokenCount || totalTokenCount === promptTokenCount + toolUsePromptTokenCount + responseTokenCount);
|
|
519
|
+
return total + responseTokenCount + (thoughtsIncluded ? 0 : thoughtsTokenCount);
|
|
520
|
+
}, 0);
|
|
521
|
+
const audioPromptTokens = usageMetadata.reduce((total, usage) => {
|
|
522
|
+
const details = usage.promptTokensDetails ?? usage.prompt_tokens_details;
|
|
523
|
+
if (this.modelName === GEMINI_LIVE_TRANSLATE_MODEL && (!Array.isArray(details) || details.length === 0)) return total + getTokenCount(usage.promptTokenCount, usage.prompt_token_count) + getTokenCount(usage.toolUsePromptTokenCount, usage.tool_use_prompt_token_count);
|
|
524
|
+
return total + getModalityTokenCount(details, "AUDIO") + getModalityTokenCount(usage.toolUsePromptTokensDetails ?? usage.tool_use_prompt_tokens_details, "AUDIO");
|
|
525
|
+
}, 0);
|
|
526
|
+
const audioCompletionTokens = usageMetadata.reduce((total, usage) => {
|
|
527
|
+
const details = usage.responseTokensDetails ?? usage.candidatesTokensDetails ?? usage.response_tokens_details ?? usage.candidates_tokens_details;
|
|
528
|
+
if (this.modelName === GEMINI_LIVE_TRANSLATE_MODEL && (!Array.isArray(details) || details.length === 0)) return total + getTokenCount(usage.responseTokenCount, usage.candidatesTokenCount, usage.response_token_count, usage.candidates_token_count);
|
|
529
|
+
return total + getModalityTokenCount(details, "AUDIO");
|
|
530
|
+
}, 0);
|
|
531
|
+
const imagePromptTokens = usageMetadata.reduce((total, usage) => total + getModalityTokenCount(usage.promptTokensDetails ?? usage.prompt_tokens_details, "IMAGE") + getModalityTokenCount(usage.toolUsePromptTokensDetails ?? usage.tool_use_prompt_tokens_details, "IMAGE") + getModalityTokenCount(usage.promptTokensDetails ?? usage.prompt_tokens_details, "DOCUMENT") + getModalityTokenCount(usage.toolUsePromptTokensDetails ?? usage.tool_use_prompt_tokens_details, "DOCUMENT"), 0);
|
|
532
|
+
const videoPromptTokens = usageMetadata.reduce((total, usage) => total + getModalityTokenCount(usage.promptTokensDetails ?? usage.prompt_tokens_details, "VIDEO") + getModalityTokenCount(usage.toolUsePromptTokensDetails ?? usage.tool_use_prompt_tokens_details, "VIDEO"), 0);
|
|
533
|
+
const cachedPromptTokens = usageMetadata.reduce((total, usage) => total + getTokenCount(usage.cachedContentTokenCount, usage.cached_content_token_count), 0);
|
|
534
|
+
const cachedAudioPromptTokens = usageMetadata.reduce((total, usage) => total + getModalityTokenCount(usage.cacheTokensDetails ?? usage.cache_tokens_details, "AUDIO"), 0);
|
|
535
|
+
const cachedImagePromptTokens = usageMetadata.reduce((total, usage) => total + getModalityTokenCount(usage.cacheTokensDetails ?? usage.cache_tokens_details, "IMAGE") + getModalityTokenCount(usage.cacheTokensDetails ?? usage.cache_tokens_details, "DOCUMENT"), 0);
|
|
536
|
+
const cachedVideoPromptTokens = usageMetadata.reduce((total, usage) => total + getModalityTokenCount(usage.cacheTokensDetails ?? usage.cache_tokens_details, "VIDEO"), 0);
|
|
537
|
+
const videoInputPerSecond = GOOGLE_MODELS.find((model) => model.id === this.modelName)?.cost?.videoInputPerSecond;
|
|
538
|
+
const billVideoPerSecond = videoFrameCount > 0 && videoInputPerSecond !== void 0 && (videoPromptTokens > 0 || imagePromptTokens === 0);
|
|
539
|
+
const billableVideoFrameCount = videoPromptTokens > 0 ? Math.min(videoFrameCount, Math.ceil(videoPromptTokens / 263)) : videoFrameCount;
|
|
540
|
+
result.tokenUsage = {
|
|
541
|
+
prompt: promptTokens,
|
|
542
|
+
completion: responseTokens,
|
|
543
|
+
total: usageMetadata.reduce((total, usage) => total + getTokenCount(usage.totalTokenCount, usage.total_token_count), 0),
|
|
544
|
+
numRequests: usageMetadata.length,
|
|
545
|
+
...cachedPromptTokens > 0 ? { cached: cachedPromptTokens } : {},
|
|
546
|
+
...thoughtTokens > 0 ? { completionDetails: { reasoning: thoughtTokens } } : {}
|
|
547
|
+
};
|
|
548
|
+
const costPromptTokens = this.modelName === GEMINI_LIVE_TRANSLATE_MODEL ? audioPromptTokens : Math.max(promptTokens - (billVideoPerSecond ? videoPromptTokens : 0), 0);
|
|
549
|
+
const costCompletionTokens = this.modelName === GEMINI_LIVE_TRANSLATE_MODEL ? audioCompletionTokens : billableCompletionTokens;
|
|
550
|
+
const tokenCost = calculateGoogleCost(this.modelName, config, costPromptTokens, costCompletionTokens, this.isVertex, audioPromptTokens, audioCompletionTokens, void 0, imagePromptTokens + (billVideoPerSecond ? 0 : videoPromptTokens), Math.max(cachedPromptTokens - (billVideoPerSecond ? cachedVideoPromptTokens : 0), 0), cachedAudioPromptTokens, cachedImagePromptTokens + (billVideoPerSecond ? 0 : cachedVideoPromptTokens));
|
|
551
|
+
result.cost = tokenCost === void 0 ? void 0 : tokenCost + (billVideoPerSecond ? billableVideoFrameCount * videoInputPerSecond : 0);
|
|
552
|
+
}
|
|
553
|
+
if (hasAudioContent && responseAudioChunks.length > 0) result.audio = {
|
|
554
|
+
data: this.convertPcmToWav(Buffer.concat(responseAudioChunks)),
|
|
555
|
+
format: "wav",
|
|
556
|
+
transcript: response_audio_transcript || response_text_total || void 0
|
|
557
|
+
};
|
|
558
|
+
safeResolve(result);
|
|
559
|
+
};
|
|
560
|
+
armLiveTranslateCompletion = () => {
|
|
561
|
+
if (this.modelName !== GEMINI_LIVE_TRANSLATE_MODEL || !liveTranslateInputEnded || hasFinalized || isResolved) return;
|
|
562
|
+
clearTimeout(liveTranslateHardTimeout);
|
|
563
|
+
liveTranslateHardTimeout = void 0;
|
|
564
|
+
clearTimeout(liveTranslateCompletionTimeout);
|
|
565
|
+
liveTranslateCompletionTimeout = setTimeout(() => {
|
|
566
|
+
liveTranslateCompletionTimeout = void 0;
|
|
567
|
+
(async () => {
|
|
568
|
+
if (contentIndex < contents.length) {
|
|
569
|
+
await sendNextContentMessages(true);
|
|
570
|
+
return;
|
|
571
|
+
}
|
|
572
|
+
await finalizeResponse();
|
|
573
|
+
})().catch((err) => {
|
|
574
|
+
logger.error(`Error advancing Live Translate response: ${err}`);
|
|
575
|
+
safeResolve({ error: `Error advancing Live Translate response: ${err}` });
|
|
576
|
+
});
|
|
577
|
+
}, liveTranslateCompletionGraceMs);
|
|
578
|
+
};
|
|
579
|
+
ws.onopen = () => {
|
|
580
|
+
logger.debug("WebSocket connection is opening...");
|
|
581
|
+
const { speechConfig: generationSpeechConfig, response_modalities: _responseModalities, responseModalities: _camelResponseModalities, outputAudioTranscription: configuredOutputAudioTranscription, inputAudioTranscription, enableAffectiveDialog, proactivity, ...restGenerationConfig } = config.generationConfig || {};
|
|
582
|
+
const speechConfig = generationSpeechConfig ?? config.speechConfig;
|
|
583
|
+
const outputAudioTranscription = configuredOutputAudioTranscription ?? (isGemini38Live || this.isVertex || usesRealtimeTextInput && !supportsTextResponse && requestedText ? {} : void 0);
|
|
584
|
+
let formattedSpeechConfig;
|
|
585
|
+
if (speechConfig) formattedSpeechConfig = {
|
|
586
|
+
...speechConfig.voiceConfig && { [usesRealtimeTextInput ? "voiceConfig" : "voice_config"]: { [usesRealtimeTextInput ? "prebuiltVoiceConfig" : "prebuilt_voice_config"]: { [usesRealtimeTextInput ? "voiceName" : "voice_name"]: speechConfig.voiceConfig.prebuiltVoiceConfig?.voiceName } } },
|
|
587
|
+
...speechConfig.languageCode && { [usesRealtimeTextInput ? "languageCode" : "language_code"]: speechConfig.languageCode }
|
|
588
|
+
};
|
|
589
|
+
let formattedProactivity;
|
|
590
|
+
if (proactivity && !usesRealtimeTextInput) formattedProactivity = { proactive_audio: proactivity.proactiveAudio };
|
|
591
|
+
const setupMessage = { setup: {
|
|
592
|
+
model: connection.model,
|
|
593
|
+
...useManualAudioActivity ? { realtimeInputConfig: { automaticActivityDetection: { disabled: true } } } : {},
|
|
594
|
+
[usesRealtimeTextInput ? "generationConfig" : "generation_config"]: {
|
|
595
|
+
context: config.context,
|
|
596
|
+
examples: config.examples,
|
|
597
|
+
stopSequences: config.stopSequences,
|
|
598
|
+
temperature: config.temperature,
|
|
599
|
+
maxOutputTokens: config.maxOutputTokens,
|
|
600
|
+
topP: config.topP,
|
|
601
|
+
topK: config.topK,
|
|
602
|
+
...restGenerationConfig,
|
|
603
|
+
...usesInteractionStatus ? { thinkingConfig: {
|
|
604
|
+
thinkingLevel: "LOW",
|
|
605
|
+
...restGenerationConfig.thinkingConfig
|
|
606
|
+
} } : {},
|
|
607
|
+
...effectiveResponseModalities ? { [usesRealtimeTextInput ? "responseModalities" : "response_modalities"]: effectiveResponseModalities } : {},
|
|
608
|
+
...formattedSpeechConfig ? { [usesRealtimeTextInput ? "speechConfig" : "speech_config"]: formattedSpeechConfig } : {},
|
|
609
|
+
...enableAffectiveDialog && !usesRealtimeTextInput ? { enable_affective_dialog: enableAffectiveDialog } : {},
|
|
610
|
+
...formattedProactivity ? { proactivity: formattedProactivity } : {},
|
|
611
|
+
...this.modelName === GEMINI_LIVE_TRANSLATE_MODEL && inputAudioTranscription ? { inputAudioTranscription } : {},
|
|
612
|
+
...this.modelName === GEMINI_LIVE_TRANSLATE_MODEL && outputAudioTranscription ? { outputAudioTranscription } : {}
|
|
613
|
+
},
|
|
614
|
+
...toolConfig ? { toolConfig } : {},
|
|
615
|
+
...requestTools.length > 0 ? { tools: requestTools } : {},
|
|
616
|
+
...systemInstruction ? { systemInstruction } : {},
|
|
617
|
+
...this.modelName !== GEMINI_LIVE_TRANSLATE_MODEL && outputAudioTranscription ? { [usesRealtimeTextInput ? "outputAudioTranscription" : "output_audio_transcription"]: outputAudioTranscription } : {},
|
|
618
|
+
...this.modelName !== GEMINI_LIVE_TRANSLATE_MODEL && inputAudioTranscription ? { [usesRealtimeTextInput ? "inputAudioTranscription" : "input_audio_transcription"]: inputAudioTranscription } : {}
|
|
619
|
+
} };
|
|
620
|
+
logger.debug("Sending setup message", {
|
|
621
|
+
model: this.modelName,
|
|
622
|
+
hasTools: requestTools.length > 0,
|
|
623
|
+
hasSystemInstruction: !!systemInstruction
|
|
624
|
+
});
|
|
625
|
+
ws.send(JSON.stringify(setupMessage));
|
|
626
|
+
};
|
|
627
|
+
const processMessage = async (event, messageIndex) => {
|
|
628
|
+
if (isResolved) return;
|
|
629
|
+
armIdleTimeout();
|
|
630
|
+
logger.debug("WebSocket message received");
|
|
631
|
+
let responseData;
|
|
632
|
+
if (event.data instanceof ArrayBuffer || event.data instanceof Buffer) {
|
|
633
|
+
const dataString = event.data.toString("utf-8");
|
|
634
|
+
try {
|
|
635
|
+
JSON.parse(dataString);
|
|
636
|
+
responseData = dataString;
|
|
637
|
+
} catch {
|
|
638
|
+
hasAudioContent = true;
|
|
639
|
+
const audioBuffer = Buffer.isBuffer(event.data) ? event.data : Buffer.from(event.data);
|
|
640
|
+
responseAudioChunks.push(audioBuffer);
|
|
641
|
+
hasPendingToolFollowup = false;
|
|
642
|
+
if (isAudioExpected) hasAudioStreamEnded = false;
|
|
643
|
+
if (hasMeaningfulPcm(audioBuffer)) armLiveTranslateCompletion();
|
|
644
|
+
return;
|
|
645
|
+
}
|
|
646
|
+
} else if (typeof event.data === "string") responseData = event.data;
|
|
647
|
+
else {
|
|
648
|
+
logger.warn(`Unexpected event.data type: ${typeof event.data}`);
|
|
649
|
+
ws.close();
|
|
650
|
+
safeResolve({ error: "Unexpected response data format" });
|
|
651
|
+
return;
|
|
652
|
+
}
|
|
653
|
+
try {
|
|
654
|
+
const responseText = await new Response(responseData).text();
|
|
655
|
+
if (isResolved) return;
|
|
656
|
+
const response = JSON.parse(responseText);
|
|
657
|
+
if ((isGemini38Live || this.isVertex) && Object.keys(response).length === 0) return;
|
|
658
|
+
const interactionStatus = response.interactionStatus ?? response.interaction_status ?? response.serverContent?.interactionStatus ?? response.serverContent?.interaction_status;
|
|
659
|
+
const interactionComplete = usesInteractionStatus && interactionStatus === "IDLE";
|
|
660
|
+
const frameUsageMetadata = response.usageMetadata ?? response.usage_metadata;
|
|
661
|
+
if (frameUsageMetadata) pendingUsageMetadata = frameUsageMetadata;
|
|
662
|
+
if ((response.serverContent?.turnComplete || response.toolCall || interactionComplete) && pendingUsageMetadata) {
|
|
663
|
+
usageMetadata.push(pendingUsageMetadata);
|
|
664
|
+
pendingUsageMetadata = void 0;
|
|
665
|
+
}
|
|
666
|
+
if (response.error) {
|
|
667
|
+
logger.error(`Google Live API error: ${JSON.stringify(response.error)}`);
|
|
668
|
+
ws.close();
|
|
669
|
+
safeResolve({ error: `Google Live API error: ${JSON.stringify(response.error)}` });
|
|
670
|
+
return;
|
|
671
|
+
}
|
|
672
|
+
const messageType = response.setupComplete ? "setupComplete" : response.serverContent?.modelTurn ? "modelTurn" : response.serverContent?.generationComplete ? "generationComplete" : response.serverContent?.turnComplete ? "turnComplete" : response.toolCall ? "toolCall" : response.streamingCustomOp ? "streamingCustomOp" : "unknown";
|
|
673
|
+
logger.debug(`Message type: ${messageType}, hasAudioContent: ${hasAudioContent}, hasOutputTranscription: ${hasOutputTranscription}`);
|
|
674
|
+
if (response.setupComplete) await sendNextContentMessages();
|
|
675
|
+
else if (response.serverContent || interactionComplete) {
|
|
676
|
+
const serverContent = response.serverContent ?? {};
|
|
677
|
+
let hasMeaningfulLiveTranslateOutput = false;
|
|
678
|
+
const inputComplete = usesInteractionStatus ? interactionComplete && messageIndex > lastToolResponseMessageIndex : serverContent.turnComplete;
|
|
679
|
+
if (Boolean(serverContent.modelTurn?.parts?.length) || Boolean(serverContent.outputTranscription?.text) || !isGemini38Live && !this.isVertex && Boolean(serverContent.generationComplete)) hasPendingToolFollowup = false;
|
|
680
|
+
else if (!usesInteractionStatus && serverContent.turnComplete && hasPendingToolFollowup) {
|
|
681
|
+
hasPendingToolFollowup = false;
|
|
682
|
+
logger.debug("Ignoring Gemini Live bookkeeping turnComplete after a tool response.");
|
|
683
|
+
return;
|
|
684
|
+
}
|
|
685
|
+
if (serverContent.modelTurn?.parts) {
|
|
686
|
+
for (const part of serverContent.modelTurn.parts) {
|
|
687
|
+
if (part.text) {
|
|
688
|
+
response_text_total += part.text;
|
|
689
|
+
hasMeaningfulLiveTranslateOutput = true;
|
|
690
|
+
}
|
|
691
|
+
if (part.inlineData?.mimeType?.includes("audio")) {
|
|
692
|
+
hasAudioContent = true;
|
|
693
|
+
const audioChunk = Buffer.from(part.inlineData.data, "base64");
|
|
694
|
+
responseAudioChunks.push(audioChunk);
|
|
695
|
+
if (hasMeaningfulPcm(audioChunk)) hasMeaningfulLiveTranslateOutput = true;
|
|
696
|
+
if (isAudioExpected) hasAudioStreamEnded = false;
|
|
697
|
+
}
|
|
698
|
+
}
|
|
699
|
+
if (serverContent.outputTranscription?.text) {
|
|
700
|
+
response_audio_transcript += serverContent.outputTranscription.text;
|
|
701
|
+
hasMeaningfulLiveTranslateOutput = true;
|
|
702
|
+
if (isAudioExpected) hasAudioContent = true;
|
|
703
|
+
}
|
|
704
|
+
} else if (serverContent.outputTranscription?.text) {
|
|
705
|
+
response_audio_transcript += serverContent.outputTranscription.text;
|
|
706
|
+
hasMeaningfulLiveTranslateOutput = true;
|
|
707
|
+
if (isAudioExpected) hasAudioContent = true;
|
|
708
|
+
}
|
|
709
|
+
if (serverContent.generationComplete) {
|
|
710
|
+
completedGenerations += 1;
|
|
711
|
+
logger.debug(`Generation complete received - text expected: ${isTextExpected}, audio expected: ${isAudioExpected}, has transcription: ${hasOutputTranscription}`);
|
|
712
|
+
if (isTextExpected && !hasTextStreamEnded) hasTextStreamEnded = true;
|
|
713
|
+
if (isAudioExpected && !hasAudioStreamEnded && hasOutputTranscription) hasAudioStreamEnded = true;
|
|
714
|
+
}
|
|
715
|
+
if (hasMeaningfulLiveTranslateOutput) armLiveTranslateCompletion();
|
|
716
|
+
if (inputComplete && contentIndex < contents.length) {
|
|
717
|
+
completedTurns += 1;
|
|
718
|
+
hasTextStreamEnded = !isTextExpected;
|
|
719
|
+
hasAudioStreamEnded = !isAudioExpected;
|
|
720
|
+
await sendNextContentMessages(true);
|
|
721
|
+
return;
|
|
722
|
+
}
|
|
723
|
+
if (inputComplete && contentIndex >= contents.length) {
|
|
724
|
+
completedTurns += 1;
|
|
725
|
+
logger.debug(`Turn complete received - text expected: ${isTextExpected}, text ended: ${hasTextStreamEnded}, audio expected: ${isAudioExpected}, audio ended: ${hasAudioStreamEnded}, has audio: ${hasAudioContent}, has transcription: ${!!response_audio_transcript}`);
|
|
726
|
+
if (isTextExpected && !hasTextStreamEnded) hasTextStreamEnded = true;
|
|
727
|
+
if (isAudioExpected && !hasAudioStreamEnded) hasAudioStreamEnded = true;
|
|
728
|
+
}
|
|
729
|
+
if (inputComplete && Math.max(completedGenerations, completedTurns) >= contents.length && hasTextStreamEnded && hasAudioStreamEnded && contentIndex >= contents.length) try {
|
|
730
|
+
await finalizeResponse();
|
|
731
|
+
} catch (err) {
|
|
732
|
+
logger.error(`Error in finalizeResponse: ${err}`);
|
|
733
|
+
safeResolve({ error: `Error finalizing response: ${err}` });
|
|
734
|
+
}
|
|
735
|
+
return;
|
|
736
|
+
} else if (response.toolCall?.functionCalls) {
|
|
737
|
+
if (isResolved) return;
|
|
738
|
+
hasPendingToolFollowup = response.toolCall.functionCalls.some((functionCall) => Boolean(functionCall?.id && functionCall.name));
|
|
739
|
+
if (toolsDisabled) {
|
|
740
|
+
logger.warn("Ignoring function calls received while tools are disabled.");
|
|
741
|
+
for (const functionCall of response.toolCall.functionCalls) if (functionCall?.id && functionCall.name) {
|
|
742
|
+
const functionResponse = {
|
|
743
|
+
id: functionCall.id,
|
|
744
|
+
name: functionCall.name,
|
|
745
|
+
response: { error: "Tool calls are disabled for this request." }
|
|
746
|
+
};
|
|
747
|
+
const toolMessage = usesRealtimeTextInput ? { toolResponse: { functionResponses: [functionResponse] } } : { tool_response: { function_responses: functionResponse } };
|
|
748
|
+
lastToolResponseMessageIndex = receivedMessageIndex;
|
|
749
|
+
ws.send(JSON.stringify(toolMessage));
|
|
750
|
+
}
|
|
751
|
+
} else for (const functionCall of response.toolCall.functionCalls) {
|
|
752
|
+
function_calls_total.push(functionCall);
|
|
753
|
+
if (functionCall && functionCall.id && functionCall.name) {
|
|
754
|
+
let callbackResponse = {};
|
|
755
|
+
const functionName = functionCall.name;
|
|
756
|
+
try {
|
|
757
|
+
if (config.functionToolCallbacks?.[functionName]) callbackResponse = await this.executeFunctionCallback(functionName, JSON.stringify(typeof functionCall.args === "string" ? JSON.parse(functionCall.args) : functionCall.args), config.functionToolCallbacks, functionCall.id);
|
|
758
|
+
else if (config.functionToolStatefulApi) {
|
|
759
|
+
logger.warn("functionToolStatefulApi configured but no HTTP client implemented for it after cleanup.");
|
|
760
|
+
const baseUrl = new URL(functionName, config.functionToolStatefulApi.url).href;
|
|
761
|
+
try {
|
|
762
|
+
callbackResponse = await tryGetThenPost(baseUrl, functionCall.args);
|
|
763
|
+
logger.debug(`Stateful api response: ${JSON.stringify(callbackResponse)}`);
|
|
764
|
+
} catch (err) {
|
|
765
|
+
callbackResponse = { error: `Error executing function ${functionName}: ${JSON.stringify(err)}` };
|
|
766
|
+
logger.error(`Error executing function ${functionName}: ${JSON.stringify(err)}`);
|
|
767
|
+
}
|
|
768
|
+
}
|
|
769
|
+
} catch (err) {
|
|
770
|
+
callbackResponse = { error: `Error executing function ${functionName}: ${JSON.stringify(err)}` };
|
|
771
|
+
logger.error(`Error executing function ${functionName}: ${JSON.stringify(err)}`);
|
|
772
|
+
}
|
|
773
|
+
if (isResolved) return;
|
|
774
|
+
const functionResponse = {
|
|
775
|
+
id: functionCall.id,
|
|
776
|
+
name: functionName,
|
|
777
|
+
response: callbackResponse !== null && typeof callbackResponse === "object" && !Array.isArray(callbackResponse) ? callbackResponse : { result: callbackResponse }
|
|
778
|
+
};
|
|
779
|
+
const toolMessage = usesRealtimeTextInput ? { toolResponse: { functionResponses: [functionResponse] } } : { tool_response: { function_responses: functionResponse } };
|
|
780
|
+
logger.debug(`WebSocket sent: ${JSON.stringify(toolMessage)}`);
|
|
781
|
+
lastToolResponseMessageIndex = receivedMessageIndex;
|
|
782
|
+
ws.send(JSON.stringify(toolMessage));
|
|
783
|
+
}
|
|
784
|
+
}
|
|
785
|
+
} else if (frameUsageMetadata) logger.debug("Usage metadata update received.");
|
|
786
|
+
else if (response.sessionResumptionUpdate) logger.debug(`Session resumption update received: ${JSON.stringify(response.sessionResumptionUpdate)}`);
|
|
787
|
+
else if (response.realtimeInput?.mediaChunks) {
|
|
788
|
+
for (const chunk of response.realtimeInput.mediaChunks) if (chunk.mimeType?.includes("audio")) {
|
|
789
|
+
hasAudioContent = true;
|
|
790
|
+
responseAudioChunks.push(Buffer.from(chunk.data, "base64"));
|
|
791
|
+
hasPendingToolFollowup = false;
|
|
792
|
+
}
|
|
793
|
+
} else if (response.candidates?.[0]?.content?.parts) {
|
|
794
|
+
for (const part of response.candidates[0].content.parts) if (part.inlineData?.mimeType?.includes("audio")) {
|
|
795
|
+
hasAudioContent = true;
|
|
796
|
+
responseAudioChunks.push(Buffer.from(part.inlineData.data, "base64"));
|
|
797
|
+
hasPendingToolFollowup = false;
|
|
798
|
+
}
|
|
799
|
+
} else if (response.streamingCustomOp?.["type.googleapis.com/google.ai.generativelanguage.v1alpha.StreamingCustomOpOutput"]?.audioCompletionSignal) hasAudioStreamEnded = true;
|
|
800
|
+
else if (!response.setupComplete && !response.serverContent && !response.toolCall && !interactionStatus && !response.realtimeInput && !response.candidates && !response.streamingCustomOp) {
|
|
801
|
+
logger.warn(`Received unhandled WebSocket message structure: ${JSON.stringify(response).substring(0, 200)}`);
|
|
802
|
+
if (hasOutputTranscription && !isGemini38Live && !this.isVertex && hasAudioContent && isAudioExpected && !hasAudioStreamEnded) {
|
|
803
|
+
logger.debug("Unknown message with transcription enabled - marking audio as complete");
|
|
804
|
+
hasAudioStreamEnded = true;
|
|
805
|
+
if (hasTextStreamEnded) try {
|
|
806
|
+
await finalizeResponse();
|
|
807
|
+
} catch (err) {
|
|
808
|
+
logger.error(`Error in finalizeResponse: ${err}`);
|
|
809
|
+
safeResolve({ error: `Error finalizing response: ${err}` });
|
|
810
|
+
}
|
|
811
|
+
}
|
|
812
|
+
}
|
|
813
|
+
} catch (err) {
|
|
814
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
815
|
+
logger.error(`Failed to process WebSocket response: ${message}`);
|
|
816
|
+
ws.close();
|
|
817
|
+
safeResolve({ error: `Failed to process WebSocket response: ${message}` });
|
|
818
|
+
}
|
|
819
|
+
};
|
|
820
|
+
let messageQueue = Promise.resolve();
|
|
821
|
+
ws.onmessage = (event) => {
|
|
822
|
+
if (isResolved) return;
|
|
823
|
+
const messageIndex = ++receivedMessageIndex;
|
|
824
|
+
if (!isGemini38Live && !this.isVertex) return processMessage(event, messageIndex);
|
|
825
|
+
armIdleTimeout();
|
|
826
|
+
messageQueue = messageQueue.then(() => processMessage(event, messageIndex));
|
|
827
|
+
return messageQueue;
|
|
828
|
+
};
|
|
829
|
+
ws.onerror = (err) => {
|
|
830
|
+
const message = err.message || "Connection failed";
|
|
831
|
+
logger.error("Google Live WebSocket error", {
|
|
832
|
+
model: this.modelName,
|
|
833
|
+
message
|
|
834
|
+
});
|
|
835
|
+
if (isNativeAudioModel) logger.error(`Native audio model ${this.modelName} may not be available or may require different configuration`);
|
|
836
|
+
clearTimeout(timeout);
|
|
837
|
+
ws.close();
|
|
838
|
+
safeResolve({ error: `WebSocket error for model ${this.modelName}: ${message}` });
|
|
839
|
+
};
|
|
840
|
+
ws.onclose = (event) => {
|
|
841
|
+
logger.debug(`WebSocket connection closed. Code: ${event.code}, Reason: ${event.reason}, Clean: ${event.wasClean}`);
|
|
842
|
+
if (hasFinalized) return;
|
|
843
|
+
clearTimeout(timeout);
|
|
844
|
+
if (!isResolved) safeResolve({ error: `WebSocket connection closed unexpectedly. Code: ${event.code}, Reason: ${event.reason}` });
|
|
845
|
+
};
|
|
846
|
+
});
|
|
847
|
+
}
|
|
848
|
+
/**
|
|
849
|
+
* Loads a function from an external file
|
|
850
|
+
* @param fileRef The file reference in the format 'file://path/to/file:functionName'
|
|
851
|
+
* @returns The loaded function
|
|
852
|
+
*/
|
|
853
|
+
loadExternalFunction(fileRef) {
|
|
854
|
+
return loadProviderCallbackFromFileUrl(fileRef);
|
|
855
|
+
}
|
|
856
|
+
/**
|
|
857
|
+
* Executes a function callback with proper error handling
|
|
858
|
+
*/
|
|
859
|
+
async executeFunctionCallback(functionName, args, callbacks = this.config.functionToolCallbacks, callId) {
|
|
860
|
+
try {
|
|
861
|
+
const shouldUseSharedCache = callbacks === this.config.functionToolCallbacks;
|
|
862
|
+
let callback = shouldUseSharedCache ? this.loadedFunctionCallbacks[functionName] : void 0;
|
|
863
|
+
if (!callback) {
|
|
864
|
+
const callbackRef = callbacks?.[functionName];
|
|
865
|
+
if (callbackRef && typeof callbackRef === "string") {
|
|
866
|
+
const callbackStr = callbackRef;
|
|
867
|
+
if (callbackStr.startsWith("file://")) callback = await this.loadExternalFunction(callbackStr);
|
|
868
|
+
else callback = new Function("return " + callbackStr)();
|
|
869
|
+
if (shouldUseSharedCache && callback) this.loadedFunctionCallbacks[functionName] = callback;
|
|
870
|
+
} else if (typeof callbackRef === "function") {
|
|
871
|
+
callback = callbackRef;
|
|
872
|
+
if (shouldUseSharedCache) this.loadedFunctionCallbacks[functionName] = callback;
|
|
873
|
+
}
|
|
874
|
+
}
|
|
875
|
+
if (!callback) throw new Error(`No callback found for function '${functionName}'`);
|
|
876
|
+
logger.debug(`Executing function '${functionName}' with args: ${args}`);
|
|
877
|
+
return await withGenAIToolSpan({
|
|
878
|
+
name: functionName,
|
|
879
|
+
arguments: args,
|
|
880
|
+
callId
|
|
881
|
+
}, () => callback(args));
|
|
882
|
+
} catch (error) {
|
|
883
|
+
logger.error(`Error executing function '${functionName}': ${error.message || String(error)}`);
|
|
884
|
+
throw error;
|
|
885
|
+
}
|
|
886
|
+
}
|
|
887
|
+
};
|
|
888
|
+
//#endregion
|
|
889
|
+
export { GoogleLiveProvider };
|
|
890
|
+
|
|
891
|
+
//# sourceMappingURL=live-5g2w-M-E.js.map
|