@fudrouter/fsrouter 0.6.72 → 0.6.74
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/headroom/detect.js +97 -7
- package/dist/lib/headroom/process.js +136 -4
- package/dist/open-sse/config/appConstants.js +23 -79
- package/dist/open-sse/config/cliFingerprints.js +1 -1
- package/dist/open-sse/config/errorConfig.js +0 -11
- package/dist/open-sse/config/grokCli.js +10 -0
- package/dist/open-sse/config/kiroConstants.js +99 -46
- package/dist/open-sse/config/runtimeConfig.js +2 -0
- package/dist/open-sse/config/ttsModels.js +2 -0
- package/dist/open-sse/executors/antigravity.js +250 -164
- package/dist/open-sse/executors/base.js +16 -11
- package/dist/open-sse/executors/codex.js +269 -1108
- package/dist/open-sse/executors/commandCode.js +1 -1
- package/dist/open-sse/executors/commandcode.js +10 -4
- package/dist/open-sse/executors/cursor.js +96 -203
- package/dist/open-sse/executors/default.js +146 -244
- package/dist/open-sse/executors/github.js +128 -73
- package/dist/open-sse/executors/grok-cli.js +527 -94
- package/dist/open-sse/executors/grok-web.js +5 -7
- package/dist/open-sse/executors/index.js +12 -0
- package/dist/open-sse/executors/kiro.js +150 -61
- package/dist/open-sse/executors/opencode-go.js +12 -4
- package/dist/open-sse/executors/opencode.js +1 -1
- package/dist/open-sse/executors/perplexity-web.js +20 -96
- package/dist/open-sse/executors/qoder.js +28 -18
- package/dist/open-sse/executors/vertex.js +53 -7
- package/dist/open-sse/executors/xiaomi-tokenplan.js +6 -5
- package/dist/open-sse/handlers/chatCore/nonStreamingHandler.js +97 -85
- package/dist/open-sse/handlers/chatCore/requestDetail.js +32 -8
- package/dist/open-sse/handlers/chatCore/sseToJsonHandler.js +13 -7
- package/dist/open-sse/handlers/chatCore/streamingHandler.js +74 -25
- package/dist/open-sse/handlers/chatCore.js +35 -41
- package/dist/open-sse/handlers/embeddingProviders/index.js +1 -0
- package/dist/open-sse/handlers/embeddingProviders/openai.js +8 -16
- package/dist/open-sse/handlers/imageProviders/blackForestLabs.js +2 -21
- package/dist/open-sse/handlers/imageProviders/cloudflareAi.js +2 -30
- package/dist/open-sse/handlers/imageProviders/codex.js +2 -20
- package/dist/open-sse/handlers/imageProviders/comfyui.js +5 -18
- package/dist/open-sse/handlers/imageProviders/falAi.js +2 -22
- package/dist/open-sse/handlers/imageProviders/gemini.js +2 -16
- package/dist/open-sse/handlers/imageProviders/huggingface.js +2 -17
- package/dist/open-sse/handlers/imageProviders/index.js +3 -4
- package/dist/open-sse/handlers/imageProviders/leonardo.js +1 -1
- package/dist/open-sse/handlers/imageProviders/nanobanana.js +4 -23
- package/dist/open-sse/handlers/imageProviders/openai.js +15 -43
- package/dist/open-sse/handlers/imageProviders/runwayml.js +2 -26
- package/dist/open-sse/handlers/imageProviders/sdwebui.js +4 -20
- package/dist/open-sse/handlers/imageProviders/stabilityAi.js +2 -26
- package/dist/open-sse/handlers/imageProviders/weavy.js +1 -1
- package/dist/open-sse/handlers/search/chatSearch.js +60 -14
- package/dist/open-sse/handlers/ttsProviders/gemini.js +14 -3
- package/dist/open-sse/handlers/ttsProviders/index.js +4 -2
- package/dist/open-sse/handlers/ttsProviders/openai.js +4 -1
- package/dist/open-sse/handlers/ttsProviders/openrouter.js +7 -4
- package/dist/open-sse/handlers/videoCore.js +166 -0
- package/dist/open-sse/handlers/videoProviders/weavy.js +1 -1
- package/dist/open-sse/mcp-server/catalog.js +1 -1
- package/dist/open-sse/mcp-server/server.js +2 -2
- package/dist/open-sse/mcp-server/tools/advancedTools.js +2 -2
- package/dist/open-sse/mcp-server/tools/agentSkillTools.js +1 -1
- package/dist/open-sse/mcp-server/tools/compressionTools.js +4 -4
- package/dist/open-sse/mcp-server/tools/gamificationTools.js +10 -10
- package/dist/open-sse/mcp-server/tools/githubSkillTools.js +1 -1
- package/dist/open-sse/mcp-server/tools/memoryTools.js +3 -3
- package/dist/open-sse/mcp-server/tools/notionTools.js +2 -2
- package/dist/open-sse/mcp-server/tools/obsidianTools.js +2 -2
- package/dist/open-sse/mcp-server/tools/pickFastestModel.js +1 -1
- package/dist/open-sse/mcp-server/tools/pluginTools.js +4 -4
- package/dist/open-sse/mcp-server/tools/skillTools.js +2 -2
- package/dist/open-sse/providers/capabilities.js +24 -4
- package/dist/open-sse/providers/registry/alicode-intl.js +1 -1
- package/dist/open-sse/providers/registry/anthropic.js +1 -8
- package/dist/open-sse/providers/registry/codex.js +0 -9
- package/dist/open-sse/providers/registry/cohere.js +0 -2
- package/dist/open-sse/providers/registry/gemini.js +0 -2
- package/dist/open-sse/providers/registry/github.js +9 -6
- package/dist/open-sse/providers/registry/grok-cli.js +28 -18
- package/dist/open-sse/providers/registry/index.js +74 -80
- package/dist/open-sse/providers/registry/kiro.js +12 -0
- package/dist/open-sse/providers/registry/mistral.js +0 -3
- package/dist/open-sse/providers/registry/openai.js +0 -3
- package/dist/open-sse/providers/registry/perplexity.js +0 -2
- package/dist/open-sse/providers/registry/xai.js +5 -3
- package/dist/open-sse/rtk/autodetect.js +10 -2
- package/dist/open-sse/rtk/caveman.js +2 -93
- package/dist/open-sse/rtk/cavemanPrompts.js +34 -2
- package/dist/open-sse/rtk/constants.js +7 -2
- package/dist/open-sse/rtk/headroom.js +133 -0
- package/dist/open-sse/rtk/ponytail.js +1 -1
- package/dist/open-sse/rtk/registry.js +2 -0
- package/dist/open-sse/services/accountFallback.js +0 -108
- package/dist/open-sse/services/combo/quotaExhaustionCutoff.js +2 -2
- package/dist/open-sse/services/combo/quotaShareStrategy.js +1 -1
- package/dist/open-sse/services/combo/resolveAutoStrategy.js +1 -1
- package/dist/open-sse/services/combo/sessionStickiness.js +1 -1
- package/dist/open-sse/services/combo/targetSorters.js +2 -2
- package/dist/open-sse/services/combo/validateQuality.js +1 -1
- package/dist/open-sse/services/comboConfig.js +1 -1
- package/dist/open-sse/services/emergencyFallback.js +1 -1
- package/dist/open-sse/services/grokCliModels.js +127 -0
- package/dist/open-sse/services/model.js +7 -1
- package/dist/open-sse/services/provider.js +1 -1
- package/dist/open-sse/services/proxyAutoSelector.js +1 -1
- package/dist/open-sse/services/tokenRefresh/providers.js +3 -3
- package/dist/open-sse/services/usage/codex.js +148 -214
- package/dist/open-sse/services/usage/grok-cli.js +61 -7
- package/dist/open-sse/services/usage/misc.js +0 -19
- package/dist/open-sse/services/usage.js +0 -2
- package/dist/open-sse/translator/concerns/paramSupport.js +2 -2
- package/dist/open-sse/translator/concerns/thinkingUnified.js +6 -0
- package/dist/open-sse/translator/index.js +97 -59
- package/dist/open-sse/translator/request/claude-to-kiro.js +67 -40
- package/dist/open-sse/translator/request/openai-responses.js +1 -0
- package/dist/open-sse/translator/request/openai-to-commandcode.js +0 -4
- package/dist/open-sse/translator/request/openai-to-kiro.js +49 -20
- package/dist/open-sse/translator/response/commandcode-to-openai.js +0 -4
- package/dist/open-sse/utils/bypassHandler.js +18 -3
- package/dist/open-sse/utils/claudeCloaking.js +15 -5
- package/dist/open-sse/utils/cursorImages.js +1 -1
- package/dist/open-sse/utils/error.js +0 -17
- package/dist/open-sse/utils/keepaliveThreshold.js +4 -4
- package/dist/open-sse/utils/kiroSessionReplay.js +125 -0
- package/dist/open-sse/utils/noThinkingAlias.js +1 -1
- package/dist/open-sse/utils/proxyFetch.js +0 -1
- package/dist/open-sse/utils/reasoningContentInjector.js +4 -7
- package/dist/open-sse/utils/responsesStatePolicy.js +1 -1
- package/dist/open-sse/utils/responsesStreamHelpers.js +1 -0
- package/dist/open-sse/utils/sessionManager.js +49 -22
- package/dist/open-sse/utils/stream.js +54 -77
- package/dist/open-sse/utils/streamHandler.js +19 -15
- package/dist/open-sse/utils/streamHelpers.js +2 -17
- package/dist/open-sse/utils/usageTracking.js +103 -12
- package/dist/routes/headroom/extras/route.js +58 -0
- package/dist/routes/headroom/restart/route.js +33 -0
- package/open-sse/config/appConstants.js +23 -79
- package/open-sse/config/errorConfig.js +0 -11
- package/open-sse/config/grokCli.js +10 -0
- package/open-sse/config/kiroConstants.js +99 -46
- package/open-sse/config/runtimeConfig.js +2 -0
- package/open-sse/config/ttsModels.js +2 -0
- package/open-sse/executors/antigravity.js +250 -164
- package/open-sse/executors/base.js +16 -11
- package/open-sse/executors/codex.js +269 -1108
- package/open-sse/executors/commandcode.js +10 -4
- package/open-sse/executors/cursor.js +96 -203
- package/open-sse/executors/default.js +146 -244
- package/open-sse/executors/github.js +128 -73
- package/open-sse/executors/grok-cli.js +527 -94
- package/open-sse/executors/grok-web.js +5 -7
- package/open-sse/executors/index.js +12 -0
- package/open-sse/executors/kiro.js +150 -61
- package/open-sse/executors/opencode-go.js +12 -4
- package/open-sse/executors/opencode.js +1 -1
- package/open-sse/executors/perplexity-web.js +20 -96
- package/open-sse/executors/qoder.js +28 -18
- package/open-sse/executors/vertex.js +53 -7
- package/open-sse/executors/xiaomi-tokenplan.js +6 -5
- package/open-sse/handlers/chatCore/nonStreamingHandler.js +97 -85
- package/open-sse/handlers/chatCore/requestDetail.js +32 -8
- package/open-sse/handlers/chatCore/sseToJsonHandler.js +13 -7
- package/open-sse/handlers/chatCore/streamingHandler.js +74 -25
- package/open-sse/handlers/chatCore.js +35 -41
- package/open-sse/handlers/embeddingProviders/index.js +1 -0
- package/open-sse/handlers/embeddingProviders/openai.js +8 -16
- package/open-sse/handlers/imageProviders/blackForestLabs.js +2 -21
- package/open-sse/handlers/imageProviders/cloudflareAi.js +2 -30
- package/open-sse/handlers/imageProviders/codex.js +2 -20
- package/open-sse/handlers/imageProviders/comfyui.js +5 -18
- package/open-sse/handlers/imageProviders/falAi.js +2 -22
- package/open-sse/handlers/imageProviders/gemini.js +2 -16
- package/open-sse/handlers/imageProviders/huggingface.js +2 -17
- package/open-sse/handlers/imageProviders/index.js +3 -4
- package/open-sse/handlers/imageProviders/leonardo.js +1 -1
- package/open-sse/handlers/imageProviders/nanobanana.js +4 -23
- package/open-sse/handlers/imageProviders/openai.js +15 -43
- package/open-sse/handlers/imageProviders/runwayml.js +2 -26
- package/open-sse/handlers/imageProviders/sdwebui.js +4 -20
- package/open-sse/handlers/imageProviders/stabilityAi.js +2 -26
- package/open-sse/handlers/imageProviders/weavy.js +1 -1
- package/open-sse/handlers/search/chatSearch.js +60 -14
- package/open-sse/handlers/ttsProviders/gemini.js +14 -3
- package/open-sse/handlers/ttsProviders/index.js +4 -2
- package/open-sse/handlers/ttsProviders/openai.js +4 -1
- package/open-sse/handlers/ttsProviders/openrouter.js +7 -4
- package/open-sse/handlers/videoCore.js +166 -0
- package/open-sse/handlers/videoProviders/weavy.js +1 -1
- package/open-sse/mcp-server/audit.js +1 -1
- package/open-sse/mcp-server/catalog.js +2 -2
- package/open-sse/mcp-server/descriptionCompressor.js +1 -1
- package/open-sse/mcp-server/mcpCallerIdentity.js +1 -1
- package/open-sse/mcp-server/schemas/tools.js +1 -1
- package/open-sse/mcp-server/server.js +4 -4
- package/open-sse/mcp-server/tools/advancedTools.js +5 -5
- package/open-sse/mcp-server/tools/agentSkillTools.js +1 -1
- package/open-sse/mcp-server/tools/compressionTools.js +4 -4
- package/open-sse/mcp-server/tools/gamificationTools.js +10 -10
- package/open-sse/mcp-server/tools/githubSkillTools.js +1 -1
- package/open-sse/mcp-server/tools/memoryTools.js +3 -3
- package/open-sse/mcp-server/tools/notionTools.js +2 -2
- package/open-sse/mcp-server/tools/obsidianTools.js +2 -2
- package/open-sse/mcp-server/tools/pickFastestModel.js +3 -3
- package/open-sse/mcp-server/tools/pluginTools.js +4 -4
- package/open-sse/mcp-server/tools/skillTools.js +2 -2
- package/open-sse/providers/capabilities.js +24 -4
- package/open-sse/providers/registry/alicode-intl.js +1 -1
- package/open-sse/providers/registry/anthropic.js +1 -8
- package/open-sse/providers/registry/codex.js +0 -9
- package/open-sse/providers/registry/cohere.js +0 -2
- package/open-sse/providers/registry/gemini.js +0 -2
- package/open-sse/providers/registry/github.js +9 -6
- package/open-sse/providers/registry/grok-cli.js +28 -18
- package/open-sse/providers/registry/index.js +74 -80
- package/open-sse/providers/registry/kiro.js +12 -0
- package/open-sse/providers/registry/mistral.js +0 -3
- package/open-sse/providers/registry/openai.js +0 -3
- package/open-sse/providers/registry/perplexity.js +0 -2
- package/open-sse/providers/registry/xai.js +5 -3
- package/open-sse/rtk/autodetect.js +10 -2
- package/open-sse/rtk/caveman.js +2 -93
- package/open-sse/rtk/cavemanPrompts.js +34 -2
- package/open-sse/rtk/constants.js +7 -2
- package/open-sse/rtk/headroom.js +133 -0
- package/open-sse/rtk/ponytail.js +1 -1
- package/open-sse/rtk/registry.js +2 -0
- package/open-sse/services/accountFallback.js +0 -108
- package/open-sse/services/combo/quotaExhaustionCutoff.js +2 -2
- package/open-sse/services/combo/quotaShareStrategy.js +1 -1
- package/open-sse/services/combo/resolveAutoStrategy.js +1 -1
- package/open-sse/services/combo/sessionStickiness.js +1 -1
- package/open-sse/services/combo/shadowRouting.js +1 -1
- package/open-sse/services/combo/targetSorters.js +4 -4
- package/open-sse/services/combo/validateQuality.js +1 -1
- package/open-sse/services/evalRouting.js +1 -1
- package/open-sse/services/grokCliModels.js +127 -0
- package/open-sse/services/model.js +7 -1
- package/open-sse/services/modelCapabilities.js +1 -1
- package/open-sse/services/modelFamilyFallback.js +1 -1
- package/open-sse/services/provider.js +1 -1
- package/open-sse/services/providerCooldownTracker.js +1 -1
- package/open-sse/services/rateLimitManager.js +1 -1
- package/open-sse/services/tokenRefresh/providers.js +3 -3
- package/open-sse/services/usage/codex.js +148 -214
- package/open-sse/services/usage/grok-cli.js +61 -7
- package/open-sse/services/usage/misc.js +0 -19
- package/open-sse/services/usage.js +0 -2
- package/open-sse/translator/concerns/paramSupport.js +2 -2
- package/open-sse/translator/concerns/thinkingUnified.js +6 -0
- package/open-sse/translator/index.js +97 -59
- package/open-sse/translator/request/claude-to-kiro.js +67 -40
- package/open-sse/translator/request/openai-responses.js +1 -0
- package/open-sse/translator/request/openai-to-commandcode.js +0 -4
- package/open-sse/translator/request/openai-to-kiro.js +49 -20
- package/open-sse/translator/response/commandcode-to-openai.js +0 -4
- package/open-sse/utils/bypassHandler.js +18 -3
- package/open-sse/utils/claudeCloaking.js +15 -5
- package/open-sse/utils/error.js +0 -17
- package/open-sse/utils/kiroSessionReplay.js +125 -0
- package/open-sse/utils/logger.js +1 -1
- package/open-sse/utils/proxyFetch.js +0 -1
- package/open-sse/utils/reasoningContentInjector.js +4 -7
- package/open-sse/utils/responsesStreamHelpers.js +1 -0
- package/open-sse/utils/sessionManager.js +49 -22
- package/open-sse/utils/stream.js +54 -77
- package/open-sse/utils/streamHandler.js +19 -15
- package/open-sse/utils/streamHelpers.js +2 -17
- package/open-sse/utils/usageTracking.js +103 -12
- package/package.json +4 -7
- package/public/assets/EndpointPageClient.C2WMTYy0.js +6 -0
- package/public/assets/{Loading.Bj-WGl4k.js → Loading.BHPtQ9vj.js} +1 -1
- package/public/assets/{NoAuthProxyCard.qAv57b-0.js → NoAuthProxyCard.BDcXaWvM.js} +1 -1
- package/public/assets/index.Be3gbrBl.js +89 -0
- package/public/assets/index.COMgQZYj.css +1 -0
- package/public/assets/{page.CbkENBd5.js → page.-lpNgYAw.js} +1 -1
- package/public/assets/{page.CssmrzTT.js → page.11hpNKmq.js} +1 -1
- package/public/assets/{page.C72FTTJr.js → page.B-LxsnqU.js} +1 -1
- package/public/assets/{page.sOFOrxqq.js → page.B-dzeIUC.js} +1 -1
- package/public/assets/{page.CsxWmPoI.js → page.B-nBR75u.js} +1 -1
- package/public/assets/{page.Dx_GRRdT.js → page.B3QqvLep.js} +1 -1
- package/public/assets/{page.DPyOkPVo.js → page.B8xdkCWA.js} +1 -1
- package/public/assets/{page.DUI8kqOY.js → page.BFb7yUd8.js} +1 -1
- package/public/assets/page.BbPPdoas.js +1 -0
- package/public/assets/page.BdS20a1O.js +1 -0
- package/public/assets/{page.DibhF7f-.js → page.BfmI9KYe.js} +1 -1
- package/public/assets/{page.DX4Nno6M.js → page.BgGJovOg.js} +1 -1
- package/public/assets/{page.BnmTC5jG.js → page.C0gBvR4O.js} +1 -1
- package/public/assets/{page.D5gj98Oe.js → page.C6bYizL7.js} +1 -1
- package/public/assets/{page.vla5Mzki.js → page.C8sLEMa6.js} +1 -1
- package/public/assets/{page.CXd_R9yU.js → page.CCNsZBXp.js} +1 -1
- package/public/assets/{page.CQlVGoXg.js → page.CF_YSLwP.js} +1 -1
- package/public/assets/{page.BbO1pspY.js → page.CPTtRDxw.js} +1 -1
- package/public/assets/{page.D1oKew1j.js → page.CdMmlUEm.js} +1 -1
- package/public/assets/{page.DxMDTbSx.js → page.Cged1bOZ.js} +1 -1
- package/public/assets/{page.Cj5h09Zo.js → page.Ch647dVk.js} +1 -1
- package/public/assets/{page.DVIHRbxB.js → page.CpvXDkQF.js} +1 -1
- package/public/assets/{page.i4KDuWcM.js → page.CrBl7f8N.js} +1 -1
- package/public/assets/{page.BSLJ4tx5.js → page.CrP7niA2.js} +1 -1
- package/public/assets/{page.CnTop8Zt.js → page.CvUFZzXr.js} +1 -1
- package/public/assets/{page.O2ddJYoT.js → page.CyUqJPmx.js} +1 -1
- package/public/assets/{page.DBhu4Arl.js → page.D8Rp8fFR.js} +1 -1
- package/public/assets/{page.CPZav1_c.js → page.Df9qtrdG.js} +1 -1
- package/public/assets/{page.Qkkv8roc.js → page.DiL4Gwqe.js} +1 -1
- package/public/assets/{page.BdmJ3yY3.js → page.Dl1apZE2.js} +1 -1
- package/public/assets/{page.1qjqvrwX.js → page.HV0w1d5C.js} +1 -1
- package/public/assets/{page.ChX1NqmC.js → page.N1x4YL8_.js} +1 -1
- package/public/assets/{page.Dh5f0XJC.js → page.P2Ny5veR.js} +1 -1
- package/public/assets/{page.CSs3-gdt.js → page.fOOCr18J.js} +1 -1
- package/public/assets/{page.Ir7KvKcF.js → page.sUIPWIiF.js} +1 -1
- package/public/assets/{page.CzlQTyAL.js → page.tE7PpWYW.js} +1 -1
- package/public/assets/{page.DzZLqI5Q.js → page.uziaGZsT.js} +1 -1
- package/public/index.html +2 -2
- package/public/assets/EndpointPageClient.LyNNvZ4z.js +0 -6
- package/public/assets/index.BuPfZebu.css +0 -1
- package/public/assets/index.CShjRV_B.js +0 -89
- package/public/assets/page.DD_czjjP.js +0 -1
|
@@ -1,32 +1,8 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Stability AI v2beta image generation adapter.
|
|
3
|
-
*
|
|
4
|
-
* Providers: stability-ai
|
|
5
|
-
* Auth: Bearer token via Authorization header (apiKey or accessToken)
|
|
6
|
-
* Format: JSON body → sync JSON response ({ image: "<b64>" })
|
|
7
|
-
* Polling: None (synchronous)
|
|
8
|
-
*
|
|
9
|
-
* Endpoint routing by model:
|
|
10
|
-
* - "stable-image-ultra" → /ultra
|
|
11
|
-
* - "sd3*" → /sd3
|
|
12
|
-
* - all others → /core
|
|
13
|
-
*
|
|
14
|
-
* Supported request params:
|
|
15
|
-
* @param {string} prompt - (required) Image description
|
|
16
|
-
* @param {string} [size="1024x1024"] - Maps to aspect_ratio: "1:1"|"16:9"|"9:16"|"4:3"|"3:2"|"2:3"
|
|
17
|
-
* @param {string} [style] - Style preset (core only): "anime"|"photographic"|"cinematic" etc.
|
|
18
|
-
* @param {string} [negative_prompt] - Elements to exclude
|
|
19
|
-
* @param {number} [seed] - Fixed seed
|
|
20
|
-
* @param {number} [guidance] - CFG scale
|
|
21
|
-
* @param {string} [output_format="png"] - "png"|"jpeg"|"webp"
|
|
22
|
-
* @param {string} [model] - SD3 only: "sd3.5-large"|"sd3.5-large-turbo"|"sd3.5-medium"
|
|
23
|
-
*
|
|
24
|
-
* Response normalize: { image: b64 } → { created, data: [{ b64_json }] }.
|
|
25
|
-
*/
|
|
26
1
|
// Stability AI v2 — sync, returns { image: "<b64>" }
|
|
27
2
|
import { nowSec, sizeToAspectRatio } from "./_base.js";
|
|
3
|
+
import { PROVIDER_MEDIA } from "../../providers/index.js";
|
|
28
4
|
|
|
29
|
-
const BASE_URL = "
|
|
5
|
+
const BASE_URL = PROVIDER_MEDIA["stability-ai"]?.imageConfig?.baseUrl;
|
|
30
6
|
|
|
31
7
|
// Map model id → endpoint segment
|
|
32
8
|
function modelToEndpoint(model) {
|
|
@@ -39,7 +39,7 @@ import path from "path";
|
|
|
39
39
|
import { execFile } from "child_process";
|
|
40
40
|
import { promisify } from "util";
|
|
41
41
|
import { PROVIDER_MODELS } from "../../config/providerModels.js";
|
|
42
|
-
import { updateProviderConnection } from '
|
|
42
|
+
import { updateProviderConnection } from '../../../dist/lib/localDb.js';
|
|
43
43
|
|
|
44
44
|
const TEMPLATE_ID = "SZXXYN7L9PN2SCTVYAlt";
|
|
45
45
|
|
|
@@ -2,6 +2,12 @@
|
|
|
2
2
|
* Wrap chat-completions endpoints (with built-in web search) into the unified
|
|
3
3
|
* /v1/search response format. Supports gemini, openai, xai, kimi, minimax, perplexity.
|
|
4
4
|
*/
|
|
5
|
+
import { PROVIDER_MEDIA } from "../../providers/index.js";
|
|
6
|
+
|
|
7
|
+
// Default search model + endpoint derive from registry searchViaChat (single source)
|
|
8
|
+
const searchModel = (id) => PROVIDER_MEDIA[id]?.searchViaChat?.defaultModel;
|
|
9
|
+
const searchEndpoint = (id, model) =>
|
|
10
|
+
(PROVIDER_MEDIA[id]?.searchViaChat?.endpoint || "").replace("{model}", model || "");
|
|
5
11
|
|
|
6
12
|
const REQUEST_TIMEOUT_MS = 15000;
|
|
7
13
|
const DEFAULT_MAX_RESULTS = 10;
|
|
@@ -43,9 +49,7 @@ function normalizeCitation(c) {
|
|
|
43
49
|
*/
|
|
44
50
|
const CHAT_SEARCH_CONFIG = {
|
|
45
51
|
gemini: {
|
|
46
|
-
endpoint: (model) =>
|
|
47
|
-
`https://generativelanguage.googleapis.com/v1beta/models/${model}:generateContent`,
|
|
48
|
-
defaultModel: "gemini-2.5-flash",
|
|
52
|
+
endpoint: (model) => searchEndpoint("gemini", model),
|
|
49
53
|
buildBody: (query) => ({
|
|
50
54
|
contents: [{ role: "user", parts: [{ text: query }] }],
|
|
51
55
|
tools: [{ google_search: {} }]
|
|
@@ -70,8 +74,7 @@ const CHAT_SEARCH_CONFIG = {
|
|
|
70
74
|
},
|
|
71
75
|
|
|
72
76
|
openai: {
|
|
73
|
-
endpoint: () => "
|
|
74
|
-
defaultModel: "gpt-4o-mini",
|
|
77
|
+
endpoint: () => searchEndpoint("openai"),
|
|
75
78
|
buildBody: (query, model) => {
|
|
76
79
|
const body = {
|
|
77
80
|
model,
|
|
@@ -105,8 +108,7 @@ const CHAT_SEARCH_CONFIG = {
|
|
|
105
108
|
},
|
|
106
109
|
|
|
107
110
|
xai: {
|
|
108
|
-
endpoint: () => "
|
|
109
|
-
defaultModel: "grok-4.20-reasoning",
|
|
111
|
+
endpoint: () => searchEndpoint("xai"),
|
|
110
112
|
buildBody: (query, model) => ({
|
|
111
113
|
model,
|
|
112
114
|
input: [{ role: "user", content: query }],
|
|
@@ -145,8 +147,7 @@ const CHAT_SEARCH_CONFIG = {
|
|
|
145
147
|
},
|
|
146
148
|
|
|
147
149
|
kimi: {
|
|
148
|
-
endpoint: () => "
|
|
149
|
-
defaultModel: "kimi-k2.5",
|
|
150
|
+
endpoint: () => searchEndpoint("kimi"),
|
|
150
151
|
buildBody: (query, model) => ({
|
|
151
152
|
model,
|
|
152
153
|
messages: [{ role: "user", content: query }],
|
|
@@ -195,8 +196,7 @@ const CHAT_SEARCH_CONFIG = {
|
|
|
195
196
|
},
|
|
196
197
|
|
|
197
198
|
minimax: {
|
|
198
|
-
endpoint: () => "
|
|
199
|
-
defaultModel: "MiniMax-M2.7",
|
|
199
|
+
endpoint: () => searchEndpoint("minimax"),
|
|
200
200
|
buildBody: (query, model) => ({
|
|
201
201
|
model,
|
|
202
202
|
messages: [{ role: "user", content: query }],
|
|
@@ -254,8 +254,7 @@ const CHAT_SEARCH_CONFIG = {
|
|
|
254
254
|
},
|
|
255
255
|
|
|
256
256
|
perplexity: {
|
|
257
|
-
endpoint: () => "
|
|
258
|
-
defaultModel: "sonar",
|
|
257
|
+
endpoint: () => searchEndpoint("perplexity"),
|
|
259
258
|
buildBody: (query, model) => ({
|
|
260
259
|
model,
|
|
261
260
|
messages: [{ role: "user", content: query }]
|
|
@@ -274,6 +273,53 @@ const CHAT_SEARCH_CONFIG = {
|
|
|
274
273
|
const tokens = data?.usage?.total_tokens || 0;
|
|
275
274
|
return { text, citations, tokens };
|
|
276
275
|
}
|
|
276
|
+
},
|
|
277
|
+
|
|
278
|
+
"perplexity-agent": {
|
|
279
|
+
endpoint: () => searchEndpoint("perplexity-agent"),
|
|
280
|
+
buildBody: (query, model) => ({
|
|
281
|
+
model,
|
|
282
|
+
input: query,
|
|
283
|
+
tools: [{ type: "web_search" }]
|
|
284
|
+
}),
|
|
285
|
+
buildHeaders: (token) => ({
|
|
286
|
+
"Content-Type": "application/json",
|
|
287
|
+
Authorization: `Bearer ${token}`
|
|
288
|
+
}),
|
|
289
|
+
extractAnswer: (data) => {
|
|
290
|
+
const output = Array.isArray(data?.output) ? data.output : [];
|
|
291
|
+
let text = "";
|
|
292
|
+
const citations = [];
|
|
293
|
+
for (const item of output) {
|
|
294
|
+
const parts = Array.isArray(item?.content) ? item.content : [];
|
|
295
|
+
for (const p of parts) {
|
|
296
|
+
if (typeof p?.text === "string") text += p.text;
|
|
297
|
+
const anns = Array.isArray(p?.annotations) ? p.annotations : [];
|
|
298
|
+
for (const a of anns) {
|
|
299
|
+
const c = normalizeCitation(a?.url ? a : a?.url_citation);
|
|
300
|
+
if (c) citations.push(c);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
const results = Array.isArray(item?.results) ? item.results : [];
|
|
304
|
+
for (const r of results) {
|
|
305
|
+
const url = r?.url || r?.link;
|
|
306
|
+
if (!url) continue;
|
|
307
|
+
citations.push({
|
|
308
|
+
url,
|
|
309
|
+
title: r?.title || "",
|
|
310
|
+
snippet: r?.snippet || ""
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
if (!citations.length && Array.isArray(data?.citations)) {
|
|
315
|
+
for (const c of data.citations) {
|
|
316
|
+
const n = normalizeCitation(c);
|
|
317
|
+
if (n) citations.push(n);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
const tokens = data?.usage?.total_tokens || 0;
|
|
321
|
+
return { text, citations, tokens };
|
|
322
|
+
}
|
|
277
323
|
}
|
|
278
324
|
};
|
|
279
325
|
|
|
@@ -324,7 +370,7 @@ export async function handleChatSearch({
|
|
|
324
370
|
Number.isFinite(maxResults) && maxResults > 0
|
|
325
371
|
? Math.floor(maxResults)
|
|
326
372
|
: DEFAULT_MAX_RESULTS;
|
|
327
|
-
const useModel = model ||
|
|
373
|
+
const useModel = model || searchModel(provider);
|
|
328
374
|
const url = cfg.endpoint(useModel);
|
|
329
375
|
const body = cfg.buildBody(query, useModel);
|
|
330
376
|
const headers = cfg.buildHeaders(token);
|
|
@@ -1,9 +1,20 @@
|
|
|
1
1
|
// Gemini TTS — generateContent with AUDIO modality returns PCM L16, wrap as WAV
|
|
2
2
|
import { Buffer } from "node:buffer";
|
|
3
|
+
import { PROVIDER_MEDIA, PROVIDER_MODELS } from "../../providers/index.js";
|
|
3
4
|
|
|
4
|
-
const
|
|
5
|
+
const TTS_CFG = PROVIDER_MEDIA["gemini"]?.ttsConfig || {};
|
|
6
|
+
const TTS_BASE = TTS_CFG.baseUrl;
|
|
7
|
+
const FALLBACK_MODEL = "gemini-3.1-flash-tts-preview";
|
|
8
|
+
const KNOWN_MODELS = [
|
|
9
|
+
...(TTS_CFG.models || []),
|
|
10
|
+
...(PROVIDER_MODELS["gemini-tts-models"] || []),
|
|
11
|
+
...(PROVIDER_MODELS.gemini || []).filter((m) => (m.kind || m.type) === "tts"),
|
|
12
|
+
]
|
|
13
|
+
.map((m) => m?.id)
|
|
14
|
+
.filter(Boolean)
|
|
15
|
+
.filter((id, index, list) => list.indexOf(id) === index);
|
|
16
|
+
const DEFAULT_MODEL = KNOWN_MODELS[0] || FALLBACK_MODEL;
|
|
5
17
|
const DEFAULT_VOICE = "Kore";
|
|
6
|
-
const KNOWN_MODELS = ["gemini-2.5-flash-preview-tts", "gemini-2.5-pro-preview-tts"];
|
|
7
18
|
|
|
8
19
|
// Parse "model/voice" — if input doesn't match a known TTS model, treat it as voice with default model
|
|
9
20
|
function parseGeminiModelVoice(input) {
|
|
@@ -51,7 +62,7 @@ export default {
|
|
|
51
62
|
async synthesize(text, model, credentials, _responseFormat, opts = {}) {
|
|
52
63
|
if (!credentials?.apiKey) throw new Error("No Gemini API key configured");
|
|
53
64
|
const { modelId, voiceId } = parseGeminiModelVoice(model);
|
|
54
|
-
const url =
|
|
65
|
+
const url = `${TTS_BASE}/${modelId}:generateContent?key=${credentials.apiKey}`;
|
|
55
66
|
const res = await fetch(url, {
|
|
56
67
|
method: "POST",
|
|
57
68
|
headers: { "Content-Type": "application/json" },
|
|
@@ -33,8 +33,10 @@ export async function synthesizeViaConfig(provider, text, model, credentials) {
|
|
|
33
33
|
if (!handler) return null;
|
|
34
34
|
const apiKey = credentials?.apiKey;
|
|
35
35
|
if (cfg.authType !== "none" && !apiKey) throw new Error(`${provider} API key required`);
|
|
36
|
-
const
|
|
37
|
-
const
|
|
36
|
+
const { PROVIDER_MODELS } = await import("open-sse/config/providerModels.js");
|
|
37
|
+
const ttsModels = (PROVIDER_MODELS[provider] || []).filter(m => (m.kind || m.type) === "tts");
|
|
38
|
+
const defaultModel = ttsModels[0]?.id || "";
|
|
39
|
+
const { modelId, voiceId } = parseModelVoice(model, defaultModel, "", ttsModels);
|
|
38
40
|
return handler({ baseUrl: cfg.baseUrl, apiKey, text, modelId, voiceId });
|
|
39
41
|
}
|
|
40
42
|
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
// OpenAI TTS — model format: "tts-model/voice"
|
|
2
2
|
import { Buffer } from "node:buffer";
|
|
3
|
+
import { PROVIDER_MEDIA } from "../../providers/index.js";
|
|
4
|
+
|
|
5
|
+
const DEFAULT_TTS_MODEL = PROVIDER_MEDIA["openai"]?.ttsConfig?.defaultModel;
|
|
3
6
|
|
|
4
7
|
export default {
|
|
5
8
|
async synthesize(text, model, credentials) {
|
|
6
9
|
if (!credentials?.apiKey) throw new Error("No OpenAI API key configured");
|
|
7
10
|
|
|
8
|
-
let ttsModel =
|
|
11
|
+
let ttsModel = DEFAULT_TTS_MODEL;
|
|
9
12
|
let voice = "alloy";
|
|
10
13
|
if (model && model.includes("/")) {
|
|
11
14
|
const parts = model.split("/");
|
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
// OpenRouter TTS — via chat completions + audio modality (SSE stream)
|
|
2
|
+
import { PROVIDER_MEDIA } from "../../providers/index.js";
|
|
3
|
+
|
|
4
|
+
const TTS_CFG = PROVIDER_MEDIA["openrouter"]?.ttsConfig || {};
|
|
5
|
+
|
|
2
6
|
export default {
|
|
3
7
|
async synthesize(text, model, credentials) {
|
|
4
8
|
if (!credentials?.apiKey) throw new Error("No OpenRouter API key configured");
|
|
5
9
|
|
|
6
10
|
// model format: "tts-model/voice" e.g. "openai/gpt-4o-mini-tts/alloy"
|
|
7
|
-
let ttsModel =
|
|
11
|
+
let ttsModel = TTS_CFG.defaultModel;
|
|
8
12
|
let voice = "alloy";
|
|
9
13
|
if (model && model.includes("/")) {
|
|
10
14
|
const lastSlash = model.lastIndexOf("/");
|
|
@@ -20,13 +24,12 @@ export default {
|
|
|
20
24
|
voice = model;
|
|
21
25
|
}
|
|
22
26
|
|
|
23
|
-
const res = await fetch(
|
|
27
|
+
const res = await fetch(TTS_CFG.baseUrl, {
|
|
24
28
|
method: "POST",
|
|
25
29
|
headers: {
|
|
26
30
|
"Content-Type": "application/json",
|
|
27
31
|
"Authorization": `Bearer ${credentials.apiKey}`,
|
|
28
|
-
|
|
29
|
-
"X-Title": "Endpoint Proxy",
|
|
32
|
+
...(TTS_CFG.headers || {}),
|
|
30
33
|
},
|
|
31
34
|
body: JSON.stringify({
|
|
32
35
|
model: ttsModel,
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { createErrorResult } from "../utils/error.js";
|
|
2
|
+
import { HTTP_STATUS } from "../config/runtimeConfig.js";
|
|
3
|
+
import { refreshTokenByProvider } from "../services/tokenRefresh.js";
|
|
4
|
+
import { PROVIDER_MEDIA } from "../providers/index.js";
|
|
5
|
+
|
|
6
|
+
// Upstream fetch deadline for video job submission/polling (the job itself is
|
|
7
|
+
// async upstream — this only bounds the HTTP round-trip, not video rendering).
|
|
8
|
+
const VIDEO_FETCH_TIMEOUT_MS = Number(process.env.VIDEO_FETCH_TIMEOUT_MS || 120000);
|
|
9
|
+
|
|
10
|
+
// POST /videos/* creates a billable upstream job. A network error after the
|
|
11
|
+
// request left the socket may still have created the job, so creation is NEVER
|
|
12
|
+
// auto-retried (the only re-send is the auth retry after a 401/403 refresh,
|
|
13
|
+
// which upstream rejects before job creation).
|
|
14
|
+
export const VIDEO_ACTIONS = new Set(["generations", "edits", "extensions"]);
|
|
15
|
+
|
|
16
|
+
export function getVideoConfig(provider) {
|
|
17
|
+
return PROVIDER_MEDIA[provider]?.videoConfig || null;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** Strip bearer tokens / obvious secrets from text destined for clients or logs. */
|
|
21
|
+
export function sanitizeSecrets(text, credentials = null) {
|
|
22
|
+
if (!text) return text;
|
|
23
|
+
let out = String(text).replace(/Bearer\s+[A-Za-z0-9._~+/=-]{8,}/gi, "Bearer [redacted]");
|
|
24
|
+
for (const key of ["accessToken", "refreshToken", "apiKey"]) {
|
|
25
|
+
const secret = credentials?.[key];
|
|
26
|
+
if (typeof secret === "string" && secret.length >= 8) {
|
|
27
|
+
out = out.split(secret).join("[redacted]");
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return out;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function buildUpstreamUrl(config, action, requestId) {
|
|
34
|
+
const base = config.baseUrl.replace(/\/$/, "");
|
|
35
|
+
return requestId ? `${base}/${encodeURIComponent(requestId)}` : `${base}/${action}`;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function buildHeaders({ token, contentType, idempotencyKey }) {
|
|
39
|
+
const headers = { Accept: "application/json" };
|
|
40
|
+
if (token) headers.Authorization = `Bearer ${token}`;
|
|
41
|
+
if (contentType) headers["Content-Type"] = contentType;
|
|
42
|
+
if (idempotencyKey) headers["Idempotency-Key"] = idempotencyKey;
|
|
43
|
+
return headers;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function combineSignals(signal, timeoutMs) {
|
|
47
|
+
const timeoutSignal = typeof AbortSignal?.timeout === "function" ? AbortSignal.timeout(timeoutMs) : null;
|
|
48
|
+
if (signal && timeoutSignal && typeof AbortSignal.any === "function") {
|
|
49
|
+
return AbortSignal.any([signal, timeoutSignal]);
|
|
50
|
+
}
|
|
51
|
+
return signal || timeoutSignal || undefined;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Transparent proxy for async video jobs (xAI Grok Imagine shape).
|
|
56
|
+
*
|
|
57
|
+
* - Forwards the raw body byte-for-byte (JSON or multipart) — no reshaping.
|
|
58
|
+
* - Passes upstream JSON (request_id, status, video.url, error) back verbatim.
|
|
59
|
+
* - 401/403 with a refresh token: refresh ONCE, retry ONCE. No other retry.
|
|
60
|
+
* - Upstream error text is sanitized before it reaches the client.
|
|
61
|
+
*
|
|
62
|
+
* @param {object} options
|
|
63
|
+
* @param {string} options.provider - Provider id (must have registry videoConfig)
|
|
64
|
+
* @param {"generations"|"edits"|"extensions"|null} options.action - Creation action (POST)
|
|
65
|
+
* @param {string|null} [options.requestId] - Poll target (GET /videos/{id})
|
|
66
|
+
* @param {Buffer|string|null} [options.rawBody] - Exact body to forward
|
|
67
|
+
* @param {string|null} [options.contentType] - Original Content-Type header
|
|
68
|
+
* @param {string|null} [options.idempotencyKey] - Forwarded Idempotency-Key
|
|
69
|
+
* @param {object} options.credentials - { accessToken?, apiKey?, refreshToken?, authType? }
|
|
70
|
+
* @param {AbortSignal} [options.signal] - Client cancellation signal
|
|
71
|
+
* @param {number} [options.timeoutMs]
|
|
72
|
+
* @param {object} [options.log]
|
|
73
|
+
* @param {function} [options.onCredentialsRefreshed]
|
|
74
|
+
* @returns {Promise<{ success: boolean, response: Response, status?: number, error?: string }>}
|
|
75
|
+
*/
|
|
76
|
+
export async function handleVideoProxyCore({
|
|
77
|
+
provider,
|
|
78
|
+
action = null,
|
|
79
|
+
requestId = null,
|
|
80
|
+
rawBody = null,
|
|
81
|
+
contentType = null,
|
|
82
|
+
idempotencyKey = null,
|
|
83
|
+
credentials,
|
|
84
|
+
signal,
|
|
85
|
+
timeoutMs = VIDEO_FETCH_TIMEOUT_MS,
|
|
86
|
+
log,
|
|
87
|
+
onCredentialsRefreshed,
|
|
88
|
+
}) {
|
|
89
|
+
const config = getVideoConfig(provider);
|
|
90
|
+
if (!config) {
|
|
91
|
+
return createErrorResult(HTTP_STATUS.BAD_REQUEST, `Provider '${provider}' does not support video generation`);
|
|
92
|
+
}
|
|
93
|
+
if (!requestId && !VIDEO_ACTIONS.has(action)) {
|
|
94
|
+
return createErrorResult(HTTP_STATUS.BAD_REQUEST, `Unknown video action: ${action}`);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const method = requestId ? "GET" : "POST";
|
|
98
|
+
const url = buildUpstreamUrl(config, action, requestId);
|
|
99
|
+
const fetchSignal = combineSignals(signal, timeoutMs);
|
|
100
|
+
|
|
101
|
+
const doFetch = (token) =>
|
|
102
|
+
fetch(url, {
|
|
103
|
+
method,
|
|
104
|
+
headers: buildHeaders({ token, contentType: method === "POST" ? contentType : null, idempotencyKey: method === "POST" ? idempotencyKey : null }),
|
|
105
|
+
body: method === "POST" ? rawBody : undefined,
|
|
106
|
+
signal: fetchSignal,
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
let upstream;
|
|
110
|
+
try {
|
|
111
|
+
upstream = await doFetch(credentials?.accessToken || credentials?.apiKey);
|
|
112
|
+
} catch (error) {
|
|
113
|
+
if (error?.name === "AbortError" || error?.name === "TimeoutError") {
|
|
114
|
+
return createErrorResult(HTTP_STATUS.REQUEST_TIMEOUT, `[${provider}] video ${method} aborted: ${error.message}`);
|
|
115
|
+
}
|
|
116
|
+
// Never re-send a creation POST on network error — the job may already exist upstream.
|
|
117
|
+
return createErrorResult(HTTP_STATUS.BAD_GATEWAY, sanitizeSecrets(`[${provider}] video upstream fetch failed: ${error.message}`, credentials));
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// 401/403 → refresh once → retry once (OAuth accounts only; API keys can't refresh)
|
|
121
|
+
if (
|
|
122
|
+
(upstream.status === HTTP_STATUS.UNAUTHORIZED || upstream.status === HTTP_STATUS.FORBIDDEN) &&
|
|
123
|
+
credentials?.refreshToken
|
|
124
|
+
) {
|
|
125
|
+
let refreshed = null;
|
|
126
|
+
try {
|
|
127
|
+
refreshed = await refreshTokenByProvider(provider, credentials, log);
|
|
128
|
+
} catch (error) {
|
|
129
|
+
log?.warn?.("TOKEN", `${provider} | video refresh error: ${sanitizeSecrets(error.message, credentials)}`);
|
|
130
|
+
}
|
|
131
|
+
if (refreshed?.accessToken) {
|
|
132
|
+
log?.info?.("TOKEN", `${provider.toUpperCase()} | refreshed for video ${method}`);
|
|
133
|
+
Object.assign(credentials, refreshed);
|
|
134
|
+
if (onCredentialsRefreshed) await onCredentialsRefreshed(refreshed);
|
|
135
|
+
try {
|
|
136
|
+
await upstream.body?.cancel?.();
|
|
137
|
+
} catch { /* noop */ }
|
|
138
|
+
try {
|
|
139
|
+
upstream = await doFetch(credentials.accessToken || credentials.apiKey);
|
|
140
|
+
} catch (error) {
|
|
141
|
+
return createErrorResult(HTTP_STATUS.BAD_GATEWAY, sanitizeSecrets(`[${provider}] video retry after refresh failed: ${error.message}`, credentials));
|
|
142
|
+
}
|
|
143
|
+
} else {
|
|
144
|
+
log?.warn?.("TOKEN", `${provider.toUpperCase()} | video refresh failed — account needs re-auth`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
const bodyText = await upstream.text().catch(() => "");
|
|
149
|
+
|
|
150
|
+
if (!upstream.ok) {
|
|
151
|
+
const message = sanitizeSecrets(bodyText || `HTTP ${upstream.status}`, credentials);
|
|
152
|
+
return createErrorResult(upstream.status, `[${provider}] ${message.slice(0, 2000)}`);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// Success: pass the upstream JSON through untouched (request_id / status / video.url).
|
|
156
|
+
return {
|
|
157
|
+
success: true,
|
|
158
|
+
response: new Response(bodyText, {
|
|
159
|
+
status: upstream.status,
|
|
160
|
+
headers: {
|
|
161
|
+
"Content-Type": upstream.headers.get("content-type") || "application/json",
|
|
162
|
+
"Access-Control-Allow-Origin": "*",
|
|
163
|
+
},
|
|
164
|
+
}),
|
|
165
|
+
};
|
|
166
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import path from "path";
|
|
2
2
|
import { execFile } from "child_process";
|
|
3
3
|
import { promisify } from "util";
|
|
4
|
-
import { updateProviderConnection } from '
|
|
4
|
+
import { updateProviderConnection } from '../../../dist/lib/localDb.js';
|
|
5
5
|
|
|
6
6
|
// 10 MB buffer — video polling can produce large stderr logs
|
|
7
7
|
const MAX_BUFFER = 10 * 1024 * 1024;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { getCodexRequestDefaults } from "../../lib/providers/requestDefaults.ts";
|
|
2
2
|
import { getProviderConnections } from "../../lib/db/providers.ts";
|
|
3
|
-
import { AI_PROVIDERS, NOAUTH_PROVIDERS } from '
|
|
3
|
+
import { AI_PROVIDERS, NOAUTH_PROVIDERS } from '../../dist/shared/constants/providers.ts.js';
|
|
4
4
|
function toRecord(value) {
|
|
5
5
|
return value && typeof value === "object" && !Array.isArray(value) ? value : {};
|
|
6
6
|
}
|
|
@@ -83,8 +83,8 @@ import {
|
|
|
83
83
|
clampMcpAccessibilityConfig
|
|
84
84
|
} from "../services/compression/engines/mcpAccessibility/constants.ts";
|
|
85
85
|
import { getDbInstance } from "../../lib/db/core.ts";
|
|
86
|
-
import { normalizeQuotaResponse } from '
|
|
87
|
-
import { resolveOmniRouteBaseUrl } from '
|
|
86
|
+
import { normalizeQuotaResponse } from '../../dist/shared/contracts/quota.ts.js';
|
|
87
|
+
import { resolveOmniRouteBaseUrl } from '../../dist/shared/utils/resolveOmniRouteBaseUrl.ts.js';
|
|
88
88
|
import { getMcpModelsCatalog } from "./catalog.ts";
|
|
89
89
|
import { getMcpModelsCatalog as getMcpModelsCatalog2 } from "./catalog.ts";
|
|
90
90
|
const OMNIROUTE_BASE_URL = resolveOmniRouteBaseUrl();
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
getComboModelProvider,
|
|
7
7
|
getComboModelString,
|
|
8
8
|
getComboStepTarget
|
|
9
|
-
} from '
|
|
9
|
+
} from '../../../dist/lib/combos/steps.ts.js';
|
|
10
10
|
import { normalizeRoutingStrategy } from "../../../shared/constants/routingStrategies.ts";
|
|
11
11
|
const OMNIROUTE_BASE_URL = resolveOmniRouteBaseUrl();
|
|
12
12
|
const OMNIROUTE_API_KEY = process.env.OMNIROUTE_API_KEY || "";
|
|
@@ -684,7 +684,7 @@ async function handleDbHealthCheck(args) {
|
|
|
684
684
|
const start = Date.now();
|
|
685
685
|
const autoRepair = args.autoRepair === true;
|
|
686
686
|
try {
|
|
687
|
-
const { runManagedDbHealthCheck } = await import('
|
|
687
|
+
const { runManagedDbHealthCheck } = await import('../../../dist/lib/db/core.ts.js');
|
|
688
688
|
const result = runManagedDbHealthCheck({ autoRepair });
|
|
689
689
|
await logToolCall(
|
|
690
690
|
"omniroute_db_health_check",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { getCatalog, getSkillById, filterCatalog, computeCoverage, fetchSkillMarkdown } from '
|
|
2
|
+
import { getCatalog, getSkillById, filterCatalog, computeCoverage, fetchSkillMarkdown } from '../../../dist/lib/agentSkills/catalog.js';
|
|
3
3
|
const AgentSkillsListSchema = z.object({
|
|
4
4
|
category: z.enum(["api", "cli"]).optional().describe("Filter by category: 'api' or 'cli'"),
|
|
5
5
|
area: z.string().optional().describe("Filter by area (e.g. 'providers', 'models', 'cli-serve')")
|
|
@@ -2,10 +2,10 @@ import { logToolCall } from "../audit.ts";
|
|
|
2
2
|
import {
|
|
3
3
|
getCompressionSettings,
|
|
4
4
|
updateCompressionSettings
|
|
5
|
-
} from '
|
|
6
|
-
import { getCompressionAnalyticsSummary } from '
|
|
7
|
-
import { getCacheStatsSummary } from '
|
|
8
|
-
import { listCompressionCombos } from '
|
|
5
|
+
} from '../../../dist/lib/db/compression.ts.js';
|
|
6
|
+
import { getCompressionAnalyticsSummary } from '../../../dist/lib/db/compressionAnalytics.ts.js';
|
|
7
|
+
import { getCacheStatsSummary } from '../../../dist/lib/db/compressionCacheStats.ts.js';
|
|
8
|
+
import { listCompressionCombos } from '../../../dist/lib/db/compressionCombos.ts.js';
|
|
9
9
|
import {
|
|
10
10
|
getMcpDescriptionCompressionStats,
|
|
11
11
|
snapshotMcpDescriptionCompressionStats
|
|
@@ -9,7 +9,7 @@ const gamificationTools = [
|
|
|
9
9
|
limit: z.number().min(1).max(100).default(50)
|
|
10
10
|
}),
|
|
11
11
|
handler: async (args) => {
|
|
12
|
-
const { getTopN } = await import('
|
|
12
|
+
const { getTopN } = await import('../../../dist/lib/gamification/leaderboard.js');
|
|
13
13
|
const entries = await getTopN(args.scope, args.limit);
|
|
14
14
|
return { entries };
|
|
15
15
|
}
|
|
@@ -23,7 +23,7 @@ const gamificationTools = [
|
|
|
23
23
|
scope: z.enum(["global", "weekly", "monthly", "tokens_shared"]).default("global")
|
|
24
24
|
}),
|
|
25
25
|
handler: async (args) => {
|
|
26
|
-
const { getRank } = await import('
|
|
26
|
+
const { getRank } = await import('../../../dist/lib/gamification/leaderboard.js');
|
|
27
27
|
const rank = await getRank(args.apiKeyId, args.scope);
|
|
28
28
|
return { rank };
|
|
29
29
|
}
|
|
@@ -36,9 +36,9 @@ const gamificationTools = [
|
|
|
36
36
|
apiKeyId: z.string()
|
|
37
37
|
}),
|
|
38
38
|
handler: async (args) => {
|
|
39
|
-
const { getXp, getBadges } = await import('
|
|
40
|
-
const { calculateLevel, getLevelTitle, getLevelTier } = await import('
|
|
41
|
-
const { getStreak } = await import('
|
|
39
|
+
const { getXp, getBadges } = await import('../../../dist/lib/db/gamification.js');
|
|
40
|
+
const { calculateLevel, getLevelTitle, getLevelTier } = await import('../../../dist/lib/gamification/xp.js');
|
|
41
|
+
const { getStreak } = await import('../../../dist/lib/gamification/streaks.js');
|
|
42
42
|
const xp = getXp(args.apiKeyId);
|
|
43
43
|
const badges = getBadges(args.apiKeyId);
|
|
44
44
|
const streak = await getStreak(args.apiKeyId);
|
|
@@ -63,7 +63,7 @@ const gamificationTools = [
|
|
|
63
63
|
category: z.string().optional()
|
|
64
64
|
}),
|
|
65
65
|
handler: async (args) => {
|
|
66
|
-
const { getBadgeDefinitions, getBadges } = await import('
|
|
66
|
+
const { getBadgeDefinitions, getBadges } = await import('../../../dist/lib/db/gamification.js');
|
|
67
67
|
if (args.apiKeyId) {
|
|
68
68
|
const badges = getBadges(args.apiKeyId);
|
|
69
69
|
return { earned: badges };
|
|
@@ -83,7 +83,7 @@ const gamificationTools = [
|
|
|
83
83
|
reason: z.string().optional()
|
|
84
84
|
}),
|
|
85
85
|
handler: async (args) => {
|
|
86
|
-
const { transferTokens } = await import('
|
|
86
|
+
const { transferTokens } = await import('../../../dist/lib/gamification/sharing.js');
|
|
87
87
|
const result = await transferTokens(
|
|
88
88
|
args.fromApiKeyId,
|
|
89
89
|
args.toApiKeyId,
|
|
@@ -103,7 +103,7 @@ const gamificationTools = [
|
|
|
103
103
|
maxUses: z.number().positive().default(1)
|
|
104
104
|
}),
|
|
105
105
|
handler: async (args) => {
|
|
106
|
-
const { createInvite } = await import('
|
|
106
|
+
const { createInvite } = await import('../../../dist/lib/gamification/invites.js');
|
|
107
107
|
const result = await createInvite(args.apiKeyId, args.serverUrl, args.maxUses);
|
|
108
108
|
return result;
|
|
109
109
|
}
|
|
@@ -114,7 +114,7 @@ const gamificationTools = [
|
|
|
114
114
|
scopes: ["read:gamification"],
|
|
115
115
|
inputSchema: z.object({}),
|
|
116
116
|
handler: async () => {
|
|
117
|
-
const { listServers } = await import('
|
|
117
|
+
const { listServers } = await import('../../../dist/lib/gamification/servers.js');
|
|
118
118
|
return { servers: await listServers() };
|
|
119
119
|
}
|
|
120
120
|
},
|
|
@@ -124,7 +124,7 @@ const gamificationTools = [
|
|
|
124
124
|
scopes: ["read:gamification"],
|
|
125
125
|
inputSchema: z.object({}),
|
|
126
126
|
handler: async () => {
|
|
127
|
-
const { getAnomalies } = await import('
|
|
127
|
+
const { getAnomalies } = await import('../../../dist/lib/gamification/antiCheat.js');
|
|
128
128
|
return { anomalies: await getAnomalies() };
|
|
129
129
|
}
|
|
130
130
|
}
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
GitHubSkillsSearchSchema,
|
|
7
7
|
GitHubSkillsScanSchema,
|
|
8
8
|
GitHubSkillsInstallSchema
|
|
9
|
-
} from '
|
|
9
|
+
} from '../../../dist/lib/skills/githubCollector.js';
|
|
10
10
|
async function handleSearch(args) {
|
|
11
11
|
const { repos, errors } = await searchGitHubSkills({
|
|
12
12
|
minStars: args.minStars,
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { retrieveMemories } from '
|
|
3
|
-
import { createMemory, deleteMemory, listMemories } from '
|
|
2
|
+
import { retrieveMemories } from '../../../dist/lib/memory/retrieval.js';
|
|
3
|
+
import { createMemory, deleteMemory, listMemories } from '../../../dist/lib/memory/store.js';
|
|
4
4
|
import {
|
|
5
5
|
getMemorySettings,
|
|
6
6
|
toMemoryRetrievalConfig,
|
|
7
7
|
DEFAULT_MEMORY_SETTINGS
|
|
8
|
-
} from '
|
|
8
|
+
} from '../../../dist/lib/memory/settings.js';
|
|
9
9
|
const MemorySearchSchema = z.object({
|
|
10
10
|
apiKeyId: z.string(),
|
|
11
11
|
query: z.string().optional(),
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { createNotionClient } from '
|
|
3
|
-
import { getNotionToken } from '
|
|
2
|
+
import { createNotionClient } from '../../../dist/lib/notion/api.ts.js';
|
|
3
|
+
import { getNotionToken } from '../../../dist/lib/db/notion.ts.js';
|
|
4
4
|
function requireToken() {
|
|
5
5
|
const token = getNotionToken();
|
|
6
6
|
if (!token) throw new Error("Notion integration token not configured. Set it in Settings > Context Sources.");
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { createObsidianClient, createSyncServerClient, getSyncToken } from '
|
|
2
|
+
import { createObsidianClient, createSyncServerClient, getSyncToken } from '../../../dist/lib/obsidian/api.ts.js';
|
|
3
3
|
import {
|
|
4
4
|
getObsidianConfigForApiKey
|
|
5
|
-
} from '
|
|
5
|
+
} from '../../../dist/lib/db/obsidian.ts.js';
|
|
6
6
|
function extractApiKeyId(extra) {
|
|
7
7
|
const id = extra?.authInfo?.clientId;
|
|
8
8
|
return typeof id === "string" && id.length > 0 && id !== "anonymous" && id !== "env-key" ? id : void 0;
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
getComboModelProvider,
|
|
7
7
|
getComboModelString,
|
|
8
8
|
getComboStepTarget
|
|
9
|
-
} from '
|
|
9
|
+
} from '../../../dist/lib/combos/steps.ts.js';
|
|
10
10
|
import { rankBySpeed, DEFAULT_SPEED_WEIGHTS } from "../../services/autoCombo/speedRanking.ts";
|
|
11
11
|
const OMNIROUTE_BASE_URL = resolveOmniRouteBaseUrl();
|
|
12
12
|
const OMNIROUTE_API_KEY = process.env.OMNIROUTE_API_KEY || "";
|