@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
|
@@ -24,6 +24,11 @@
|
|
|
24
24
|
|
|
25
25
|
import { proxyAwareFetch } from "../../utils/proxyFetch.js";
|
|
26
26
|
import { U, parseResetTime, toFiniteNumber } from "./shared.js";
|
|
27
|
+
import {
|
|
28
|
+
GROK_CLI_CLIENT_IDENTIFIER,
|
|
29
|
+
GROK_CLI_USER_AGENT,
|
|
30
|
+
GROK_CLI_VERSION,
|
|
31
|
+
} from "../../config/grokCli.js";
|
|
27
32
|
|
|
28
33
|
const USAGE = U("grok-cli");
|
|
29
34
|
const BILLING_URL = USAGE.url || "https://cli-chat-proxy.grok.com/v1/billing?format=credits";
|
|
@@ -43,10 +48,11 @@ function buildGrokCliHeaders(accessToken, providerSpecificData = {}) {
|
|
|
43
48
|
const headers = {
|
|
44
49
|
Authorization: `Bearer ${accessToken}`,
|
|
45
50
|
Accept: "application/json",
|
|
46
|
-
"User-Agent":
|
|
51
|
+
"User-Agent": GROK_CLI_USER_AGENT,
|
|
47
52
|
"x-xai-token-auth": "xai-grok-cli",
|
|
48
|
-
"x-grok-client-identifier":
|
|
49
|
-
"x-grok-client-version":
|
|
53
|
+
"x-grok-client-identifier": GROK_CLI_CLIENT_IDENTIFIER,
|
|
54
|
+
"x-grok-client-version": GROK_CLI_VERSION,
|
|
55
|
+
"x-grok-client-mode": "headless",
|
|
50
56
|
};
|
|
51
57
|
const email = psd.email;
|
|
52
58
|
const userId = psd.userId || psd.principalId;
|
|
@@ -55,8 +61,18 @@ function buildGrokCliHeaders(accessToken, providerSpecificData = {}) {
|
|
|
55
61
|
return headers;
|
|
56
62
|
}
|
|
57
63
|
|
|
64
|
+
function subscriptionTier(user, config) {
|
|
65
|
+
const rawTier =
|
|
66
|
+
user?.subscriptionTier ??
|
|
67
|
+
user?.subscription_tier ??
|
|
68
|
+
user?.subscription?.tier ??
|
|
69
|
+
config?.subscriptionTier ??
|
|
70
|
+
config?.subscription_tier;
|
|
71
|
+
return typeof rawTier === "string" ? rawTier.trim() : "";
|
|
72
|
+
}
|
|
73
|
+
|
|
58
74
|
function resolvePlan(user, config) {
|
|
59
|
-
const tier =
|
|
75
|
+
const tier = subscriptionTier(user, config);
|
|
60
76
|
if (tier) {
|
|
61
77
|
return tier
|
|
62
78
|
.replace(/[_-]+/g, " ")
|
|
@@ -105,11 +121,42 @@ export function parseGrokCliBilling(billing, user = null) {
|
|
|
105
121
|
|
|
106
122
|
const periodEnd =
|
|
107
123
|
parseResetTime(config.billingPeriodEnd) ||
|
|
124
|
+
parseResetTime(config.billing_period_end) ||
|
|
108
125
|
parseResetTime(config.currentPeriod?.end) ||
|
|
126
|
+
parseResetTime(config.resetAt || config.resetsAt || config.periodEnd) ||
|
|
109
127
|
parseResetTime(root.billingPeriodEnd) ||
|
|
128
|
+
parseResetTime(root.billing_period_end) ||
|
|
129
|
+
parseResetTime(root.resetAt || root.resetsAt || root.periodEnd) ||
|
|
110
130
|
null;
|
|
111
131
|
|
|
112
132
|
const quotas = {};
|
|
133
|
+
const tier = subscriptionTier(user, config);
|
|
134
|
+
const subscriptionAccess = Boolean(tier) && !/^(free|none|null)$/i.test(tier);
|
|
135
|
+
|
|
136
|
+
// Current Grok Build responses expose included monthly usage at top level.
|
|
137
|
+
const monthlyLimit = unwrapVal(
|
|
138
|
+
config.monthlyLimit ?? config.monthly_limit ?? root.monthlyLimit ?? root.monthly_limit,
|
|
139
|
+
NaN,
|
|
140
|
+
);
|
|
141
|
+
const includedUsed = unwrapVal(
|
|
142
|
+
config.includedUsed ?? config.included_used ?? root.includedUsed ?? root.included_used,
|
|
143
|
+
NaN,
|
|
144
|
+
);
|
|
145
|
+
const totalUsed = unwrapVal(
|
|
146
|
+
config.totalUsed ?? config.total_used ?? root.totalUsed ?? root.total_used,
|
|
147
|
+
NaN,
|
|
148
|
+
);
|
|
149
|
+
if (Number.isFinite(monthlyLimit) && monthlyLimit > 0) {
|
|
150
|
+
quotas["Monthly included"] = makeQuota({
|
|
151
|
+
used: Number.isFinite(includedUsed)
|
|
152
|
+
? includedUsed
|
|
153
|
+
: Number.isFinite(totalUsed)
|
|
154
|
+
? totalUsed
|
|
155
|
+
: 0,
|
|
156
|
+
total: monthlyLimit,
|
|
157
|
+
resetAt: periodEnd,
|
|
158
|
+
});
|
|
159
|
+
}
|
|
113
160
|
|
|
114
161
|
// Primary: on-demand spending window (subscription / promo credits)
|
|
115
162
|
const onDemandCap = unwrapVal(config.onDemandCap ?? root.onDemandCap, NaN);
|
|
@@ -121,7 +168,12 @@ export function parseGrokCliBilling(billing, user = null) {
|
|
|
121
168
|
total: onDemandCap,
|
|
122
169
|
resetAt: periodEnd,
|
|
123
170
|
});
|
|
124
|
-
} else if (
|
|
171
|
+
} else if (
|
|
172
|
+
!subscriptionAccess &&
|
|
173
|
+
Number.isFinite(onDemandCap) &&
|
|
174
|
+
onDemandCap === 0 &&
|
|
175
|
+
Number.isFinite(onDemandUsed)
|
|
176
|
+
) {
|
|
125
177
|
// Cap 0 is the exhausted free/promo state (chat returns 402 spending-limit).
|
|
126
178
|
// UI treats total===0 as unlimited, so use a synthetic 1/1 depleted row.
|
|
127
179
|
quotas["On-demand"] = {
|
|
@@ -199,6 +251,7 @@ export function parseGrokCliBilling(billing, user = null) {
|
|
|
199
251
|
quotas,
|
|
200
252
|
periodEnd,
|
|
201
253
|
exhausted,
|
|
254
|
+
subscriptionAccess,
|
|
202
255
|
rawConfig: config,
|
|
203
256
|
};
|
|
204
257
|
}
|
|
@@ -255,8 +308,9 @@ export async function getGrokCliUsage(accessToken, providerSpecificData = null,
|
|
|
255
308
|
if (!parsed.quotas || Object.keys(parsed.quotas).length === 0) {
|
|
256
309
|
return {
|
|
257
310
|
plan: parsed.plan,
|
|
258
|
-
message:
|
|
259
|
-
"
|
|
311
|
+
message: parsed.subscriptionAccess
|
|
312
|
+
? "Subscription access is active; Grok does not expose a numeric included quota."
|
|
313
|
+
: "Grok Build connected, but no credit allotment was returned. Free promo may be exhausted.",
|
|
260
314
|
quotas: {},
|
|
261
315
|
};
|
|
262
316
|
}
|
|
@@ -267,22 +267,3 @@ export async function getQoderUsage(accessToken, proxyOptions = null) {
|
|
|
267
267
|
return { message: `Qoder connected. Unable to fetch usage: ${error.message}` };
|
|
268
268
|
}
|
|
269
269
|
}
|
|
270
|
-
|
|
271
|
-
/**
|
|
272
|
-
* Cloudflare Workers AI Usage
|
|
273
|
-
* Free tier: 10,000 neurons/day. No public usage API — returns free tier info.
|
|
274
|
-
*/
|
|
275
|
-
export async function getCloudflareAiUsage(apiKey, providerSpecificData) {
|
|
276
|
-
return {
|
|
277
|
-
plan: "Workers AI Free",
|
|
278
|
-
quotas: {
|
|
279
|
-
neurons: {
|
|
280
|
-
used: 0,
|
|
281
|
-
total: 10000,
|
|
282
|
-
resetAt: null,
|
|
283
|
-
unlimited: false,
|
|
284
|
-
displayName: "Neurons (daily free)",
|
|
285
|
-
},
|
|
286
|
-
},
|
|
287
|
-
};
|
|
288
|
-
}
|
|
@@ -12,7 +12,6 @@ import { getKiroUsage } from "./usage/kiro.js";
|
|
|
12
12
|
import { getMiniMaxUsage } from "./usage/minimax.js";
|
|
13
13
|
import { getCodeBuddyCnUsage } from "./usage/codebuddy-cn.js";
|
|
14
14
|
import { getGrokCliUsage } from "./usage/grok-cli.js";
|
|
15
|
-
import { getCloudflareAiUsage } from "./usage/misc.js";
|
|
16
15
|
import {
|
|
17
16
|
getQwenUsage,
|
|
18
17
|
getIflowUsage,
|
|
@@ -46,7 +45,6 @@ const USAGE_HANDLERS = {
|
|
|
46
45
|
"vercel-ai-gateway": (c) => getVercelAiGatewayUsage(c.apiKey, c.proxyOptions),
|
|
47
46
|
"codebuddy-cn": (c) => getCodeBuddyCnUsage(c.accessToken, c.apiKey, c.providerSpecificData, c.proxyOptions),
|
|
48
47
|
"grok-cli": (c) => getGrokCliUsage(c.accessToken, c.providerSpecificData, c.proxyOptions),
|
|
49
|
-
"cloudflare-ai": (c) => getCloudflareAiUsage(c.apiKey, c.providerSpecificData),
|
|
50
48
|
};
|
|
51
49
|
|
|
52
50
|
export async function getUsageForProvider(connection, proxyOptions = null) {
|
|
@@ -6,8 +6,8 @@ import { getCapabilitiesForModel } from "../../providers/capabilities.js";
|
|
|
6
6
|
// Each rule: optional provider, regex match on model, list of params to drop.
|
|
7
7
|
// A param is removed only when it is present (!== undefined).
|
|
8
8
|
const STRIP_RULES = [
|
|
9
|
-
//
|
|
10
|
-
{ match: /claude
|
|
9
|
+
// All Claude models: temperature deprecated/rejected upstream (Anthropic 400). #1748
|
|
10
|
+
{ match: /claude/i, drop: ["temperature"] },
|
|
11
11
|
// GitHub Copilot gpt-5.4: temperature unsupported.
|
|
12
12
|
{ provider: "github", match: /gpt-5\.4/i, drop: ["temperature"] },
|
|
13
13
|
// GitHub Copilot Claude (except opus/sonnet 4.6): thinking + reasoning_effort rejected. #713
|
|
@@ -229,6 +229,12 @@ function applyFormat(fmt, body, cfg, caps) {
|
|
|
229
229
|
}
|
|
230
230
|
case "claude-adaptive": {
|
|
231
231
|
if (none && canDisable) { body.thinking = { type: "disabled" }; break; }
|
|
232
|
+
// output_config.effort alone does NOT turn thinking on: Anthropic requires
|
|
233
|
+
// an explicit thinking:{type:"adaptive"} on Opus 4.6/4.7/4.8 and Sonnet 4.6
|
|
234
|
+
// ("thinking is off unless you explicitly set it"), and Anthropic-compatible
|
|
235
|
+
// shims (e.g. GitHub Copilot /v1/messages) default thinking off even for
|
|
236
|
+
// Sonnet 5. Send both fields — the documented adaptive-thinking shape.
|
|
237
|
+
body.thinking = { type: "adaptive" };
|
|
232
238
|
const level = toLevel(eff);
|
|
233
239
|
body.output_config = { effort: level === "xhigh" ? "high" : level };
|
|
234
240
|
break;
|
|
@@ -1,23 +1,24 @@
|
|
|
1
1
|
import { FORMATS } from "./formats.js";
|
|
2
|
-
import { ensureToolCallIds, fixMissingToolResponses } from "./
|
|
3
|
-
import { prepareClaudeRequest } from "./
|
|
2
|
+
import { ensureToolCallIds, fixMissingToolResponses } from "./concerns/toolCall.js";
|
|
3
|
+
import { prepareClaudeRequest } from "./formats/claude.js";
|
|
4
4
|
import { cloakClaudeTools } from "../utils/claudeCloaking.js";
|
|
5
|
-
import { filterToOpenAIFormat } from "./
|
|
5
|
+
import { filterToOpenAIFormat } from "./formats/openai.js";
|
|
6
6
|
import { normalizeThinkingConfig } from "../services/provider.js";
|
|
7
|
+
import { applyThinking, captureThinking } from "./concerns/thinkingUnified.js";
|
|
8
|
+
import { captureSessionId } from "../utils/sessionManager.js";
|
|
7
9
|
import { AntigravityExecutor } from "../executors/antigravity.js";
|
|
10
|
+
import { PROVIDERS } from "../providers/index.js";
|
|
8
11
|
|
|
9
|
-
// Registry for translators
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
const require = createRequire(import.meta.url);
|
|
15
|
-
|
|
16
|
-
// Track initialization state
|
|
17
|
-
let initialized = false;
|
|
12
|
+
// Registry for translators. Lazy-init guards against circular-import order:
|
|
13
|
+
// translator modules call register() (side-effect) before this module's body runs.
|
|
14
|
+
// var (not let): hoisted as undefined so register() can run during circular import (no TDZ).
|
|
15
|
+
var requestRegistry;
|
|
16
|
+
var responseRegistry;
|
|
18
17
|
|
|
19
18
|
// Register translator
|
|
20
19
|
export function register(from, to, requestFn, responseFn) {
|
|
20
|
+
requestRegistry ??= new Map();
|
|
21
|
+
responseRegistry ??= new Map();
|
|
21
22
|
const key = `${from}:${to}`;
|
|
22
23
|
if (requestFn) {
|
|
23
24
|
requestRegistry.set(key, requestFn);
|
|
@@ -27,35 +28,8 @@ export function register(from, to, requestFn, responseFn) {
|
|
|
27
28
|
}
|
|
28
29
|
}
|
|
29
30
|
|
|
30
|
-
//
|
|
31
|
-
function ensureInitialized() {
|
|
32
|
-
if (initialized) return;
|
|
33
|
-
initialized = true;
|
|
34
|
-
|
|
35
|
-
// Request translators - sync require pattern for bundler
|
|
36
|
-
require("./request/claude-to-openai.js");
|
|
37
|
-
require("./request/openai-to-claude.js");
|
|
38
|
-
require("./request/gemini-to-openai.js");
|
|
39
|
-
require("./request/openai-to-gemini.js");
|
|
40
|
-
require("./request/openai-to-vertex.js");
|
|
41
|
-
require("./request/antigravity-to-openai.js");
|
|
42
|
-
require("./request/openai-responses.js");
|
|
43
|
-
require("./request/openai-to-kiro.js");
|
|
44
|
-
require("./request/openai-to-cursor.js");
|
|
45
|
-
require("./request/openai-to-ollama.js");
|
|
46
|
-
require("./request/openai-to-commandcode.js");
|
|
47
|
-
|
|
48
|
-
// Response translators
|
|
49
|
-
require("./response/claude-to-openai.js");
|
|
50
|
-
require("./response/openai-to-claude.js");
|
|
51
|
-
require("./response/gemini-to-openai.js");
|
|
52
|
-
require("./response/openai-to-antigravity.js");
|
|
53
|
-
require("./response/openai-responses.js");
|
|
54
|
-
require("./response/kiro-to-openai.js");
|
|
55
|
-
require("./response/cursor-to-openai.js");
|
|
56
|
-
require("./response/ollama-to-openai.js");
|
|
57
|
-
require("./response/commandcode-to-openai.js");
|
|
58
|
-
}
|
|
31
|
+
// No-op: translators self-register via the static imports at the bottom of this file.
|
|
32
|
+
function ensureInitialized() {}
|
|
59
33
|
|
|
60
34
|
// Strip specific content types from messages (explicit opt-in via strip[] in PROVIDER_MODELS)
|
|
61
35
|
function stripContentTypes(body, stripList = []) {
|
|
@@ -91,42 +65,72 @@ export function translateRequest(sourceFormat, targetFormat, model, body, stream
|
|
|
91
65
|
// Fix missing tool responses (insert empty tool_result if needed)
|
|
92
66
|
fixMissingToolResponses(result);
|
|
93
67
|
|
|
68
|
+
// Capture thinking intent from the original (pre-translation) body, before any
|
|
69
|
+
// format conversion strips/renames the fields. Applied after translation.
|
|
70
|
+
const thinkingIntent = captureThinking(result);
|
|
71
|
+
|
|
72
|
+
// Capture session id from the original body (envelope still intact, e.g. antigravity request.sessionId)
|
|
73
|
+
const clientSessionId = captureSessionId(result, credentials, connectionId, targetFormat);
|
|
74
|
+
// Expose to downstream translators (gemini-cli/antigravity envelopes) that run after envelope is stripped
|
|
75
|
+
if (credentials) credentials._clientSessionId = clientSessionId;
|
|
76
|
+
|
|
94
77
|
// If same format, skip translation steps
|
|
95
78
|
if (sourceFormat !== targetFormat) {
|
|
96
|
-
//
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
79
|
+
// Direct route: if a translator is registered for this exact source:target
|
|
80
|
+
// pair, use it instead of pivoting through OpenAI. This is lossless for
|
|
81
|
+
// pairs like claude:kiro (avoids the claude->openai->kiro double-hop).
|
|
82
|
+
const directFn = requestRegistry.get(`${sourceFormat}:${targetFormat}`);
|
|
83
|
+
if (directFn) {
|
|
84
|
+
result = directFn(model, result, stream, credentials);
|
|
85
|
+
} else {
|
|
86
|
+
// Step 1: source -> openai (if source is not openai)
|
|
87
|
+
if (sourceFormat !== FORMATS.OPENAI) {
|
|
88
|
+
const toOpenAI = requestRegistry.get(`${sourceFormat}:${FORMATS.OPENAI}`);
|
|
89
|
+
if (toOpenAI) {
|
|
90
|
+
result = toOpenAI(model, result, stream, credentials);
|
|
91
|
+
// Log OpenAI intermediate format
|
|
92
|
+
reqLogger?.logOpenAIRequest?.(result);
|
|
93
|
+
}
|
|
103
94
|
}
|
|
104
|
-
}
|
|
105
95
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
96
|
+
// Step 2: openai -> target (if target is not openai)
|
|
97
|
+
if (targetFormat !== FORMATS.OPENAI) {
|
|
98
|
+
const fromOpenAI = requestRegistry.get(`${FORMATS.OPENAI}:${targetFormat}`);
|
|
99
|
+
if (fromOpenAI) {
|
|
100
|
+
result = fromOpenAI(model, result, stream, credentials);
|
|
101
|
+
}
|
|
111
102
|
}
|
|
112
103
|
}
|
|
113
104
|
}
|
|
114
105
|
|
|
106
|
+
// Normalize thinking to the target provider-native format (config-driven, capability-aware).
|
|
107
|
+
// Kiro's GenerateAssistantResponse request does not accept the generic top-level
|
|
108
|
+
// `thinking` field; its translators map thinking intent to KAS-compatible
|
|
109
|
+
// systemPrompt/additionalModelRequestFields instead.
|
|
110
|
+
const kiroThinkingMappedByTranslator =
|
|
111
|
+
targetFormat === FORMATS.KIRO &&
|
|
112
|
+
(sourceFormat === FORMATS.OPENAI || sourceFormat === FORMATS.CLAUDE);
|
|
113
|
+
if (!kiroThinkingMappedByTranslator) {
|
|
114
|
+
applyThinking(targetFormat, model, result, provider, thinkingIntent);
|
|
115
|
+
}
|
|
116
|
+
|
|
115
117
|
// Always normalize to clean OpenAI format when target is OpenAI
|
|
116
118
|
// This handles hybrid requests (e.g., OpenAI messages + Claude tools)
|
|
117
119
|
if (targetFormat === FORMATS.OPENAI) {
|
|
118
|
-
result = filterToOpenAIFormat(result
|
|
120
|
+
result = filterToOpenAIFormat(result, {
|
|
121
|
+
preserveCacheControl: !!PROVIDERS[provider]?.quirks?.preserveCacheControl,
|
|
122
|
+
});
|
|
119
123
|
}
|
|
120
124
|
|
|
121
125
|
// Final step: prepare request for Claude format endpoints
|
|
122
126
|
if (targetFormat === FORMATS.CLAUDE) {
|
|
123
127
|
const apiKey = credentials?.accessToken || credentials?.apiKey || null;
|
|
124
|
-
result = prepareClaudeRequest(result, provider, apiKey, connectionId);
|
|
128
|
+
result = prepareClaudeRequest(result, provider, apiKey, connectionId, credentials?.rawHeaders, clientSessionId);
|
|
125
129
|
}
|
|
126
130
|
|
|
127
131
|
// Claude cloaking: rename client tools with _cc suffix (anti-ban)
|
|
128
|
-
//
|
|
129
|
-
if (provider
|
|
132
|
+
// quirk: only providers flagged cloakToolsOnOAuth, and only with an OAuth token
|
|
133
|
+
if (PROVIDERS[provider]?.quirks?.cloakToolsOnOAuth) {
|
|
130
134
|
const apiKey = credentials?.accessToken || credentials?.apiKey || null;
|
|
131
135
|
if (apiKey?.includes("sk-ant-oat")) {
|
|
132
136
|
const { body: cloakedBody, toolNameMap } = cloakClaudeTools(result);
|
|
@@ -160,6 +164,16 @@ export function translateResponse(targetFormat, sourceFormat, chunk, state) {
|
|
|
160
164
|
let results = [chunk];
|
|
161
165
|
let openaiResults = null; // Store OpenAI intermediate results
|
|
162
166
|
|
|
167
|
+
// Direct route: if a response translator is registered for this exact
|
|
168
|
+
// target:source pair, use it instead of pivoting through OpenAI. Mirrors the
|
|
169
|
+
// request-side direct route (e.g. kiro:claude — KiroExecutor already emits
|
|
170
|
+
// OpenAI-shaped chunks, so this converts them straight to Claude SSE).
|
|
171
|
+
const directFn = responseRegistry.get(`${targetFormat}:${sourceFormat}`);
|
|
172
|
+
if (directFn) {
|
|
173
|
+
const converted = directFn(chunk, state);
|
|
174
|
+
return converted ? (Array.isArray(converted) ? converted : [converted]) : [];
|
|
175
|
+
}
|
|
176
|
+
|
|
163
177
|
// Step 1: target -> openai (if target is not openai)
|
|
164
178
|
if (targetFormat !== FORMATS.OPENAI) {
|
|
165
179
|
const toOpenAI = responseRegistry.get(`${targetFormat}:${FORMATS.OPENAI}`);
|
|
@@ -248,7 +262,31 @@ export function initState(sourceFormat) {
|
|
|
248
262
|
return base;
|
|
249
263
|
}
|
|
250
264
|
|
|
251
|
-
//
|
|
265
|
+
// Kept for backward compatibility; translators are already registered at import time.
|
|
252
266
|
export function initTranslators() {
|
|
253
267
|
ensureInitialized();
|
|
254
268
|
}
|
|
269
|
+
|
|
270
|
+
// Static side-effect imports: each module calls register() at load (works in ESM + bundler).
|
|
271
|
+
import "./request/claude-to-openai.js";
|
|
272
|
+
import "./request/openai-to-claude.js";
|
|
273
|
+
import "./request/gemini-to-openai.js";
|
|
274
|
+
import "./request/openai-to-gemini.js";
|
|
275
|
+
import "./request/openai-to-vertex.js";
|
|
276
|
+
import "./request/antigravity-to-openai.js";
|
|
277
|
+
import "./request/openai-responses.js";
|
|
278
|
+
import "./request/openai-to-kiro.js";
|
|
279
|
+
import "./request/openai-to-cursor.js";
|
|
280
|
+
import "./request/openai-to-ollama.js";
|
|
281
|
+
import "./request/openai-to-commandcode.js";
|
|
282
|
+
import "./request/claude-to-kiro.js";
|
|
283
|
+
import "./response/claude-to-openai.js";
|
|
284
|
+
import "./response/openai-to-claude.js";
|
|
285
|
+
import "./response/gemini-to-openai.js";
|
|
286
|
+
import "./response/openai-to-antigravity.js";
|
|
287
|
+
import "./response/openai-responses.js";
|
|
288
|
+
import "./response/kiro-to-openai.js";
|
|
289
|
+
import "./response/cursor-to-openai.js";
|
|
290
|
+
import "./response/ollama-to-openai.js";
|
|
291
|
+
import "./response/commandcode-to-openai.js";
|
|
292
|
+
import "./response/kiro-to-claude.js";
|
|
@@ -24,14 +24,16 @@
|
|
|
24
24
|
*/
|
|
25
25
|
import { register } from "../index.js";
|
|
26
26
|
import { FORMATS } from "../formats.js";
|
|
27
|
-
import {
|
|
27
|
+
import { applyKiroSessionReplay } from "../../utils/kiroSessionReplay.js";
|
|
28
|
+
import { resolveContinuationId, resolveSessionIdentity } from "../../utils/sessionManager.js";
|
|
28
29
|
import {
|
|
29
30
|
resolveKiroModel,
|
|
31
|
+
resolveKiroThinkingBudget,
|
|
30
32
|
buildThinkingSystemPrefix,
|
|
31
33
|
KIRO_AGENTIC_SYSTEM_PROMPT,
|
|
32
34
|
resolveDefaultProfileArn,
|
|
35
|
+
buildKiroAdditionalModelRequestFieldsForModel,
|
|
33
36
|
} from "../../config/kiroConstants.js";
|
|
34
|
-
import { resolveKiroThinkingBudget } from "../../services/thinkingBudget.js";
|
|
35
37
|
import { DEFAULT_IMAGE_MIME } from "../schema/index.js";
|
|
36
38
|
import { ROLE, CLAUDE_BLOCK } from "../schema/index.js";
|
|
37
39
|
|
|
@@ -363,6 +365,18 @@ function reconcileOrphanedToolResults(history, currentMessage) {
|
|
|
363
365
|
}
|
|
364
366
|
}
|
|
365
367
|
|
|
368
|
+
function extractClaudeSystemText(system) {
|
|
369
|
+
if (!system) return "";
|
|
370
|
+
if (typeof system === "string") return system;
|
|
371
|
+
if (Array.isArray(system)) {
|
|
372
|
+
return system.map((s) => {
|
|
373
|
+
if (typeof s === "string") return s;
|
|
374
|
+
return s?.text || "";
|
|
375
|
+
}).filter(Boolean).join("\n");
|
|
376
|
+
}
|
|
377
|
+
return "";
|
|
378
|
+
}
|
|
379
|
+
|
|
366
380
|
/**
|
|
367
381
|
* Build a Kiro payload directly from a Claude Messages API request body.
|
|
368
382
|
*/
|
|
@@ -402,62 +416,75 @@ export function claudeToKiroRequest(model, body, stream, credentials) {
|
|
|
402
416
|
? (credentials?.providerSpecificData?.profileArn || "")
|
|
403
417
|
: (credentials?.providerSpecificData?.profileArn || resolveDefaultProfileArn(authMethod));
|
|
404
418
|
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
//
|
|
408
|
-
// and also prepend as <instructions> in user content as fallback for upstreams
|
|
409
|
-
// that don't support the native field.
|
|
410
|
-
let systemInstruction = undefined;
|
|
411
|
-
if (body.system) {
|
|
412
|
-
let systemText = "";
|
|
413
|
-
if (typeof body.system === "string") {
|
|
414
|
-
systemText = body.system;
|
|
415
|
-
} else if (Array.isArray(body.system)) {
|
|
416
|
-
systemText = body.system.map((s) => s.text || "").join("\n");
|
|
417
|
-
}
|
|
418
|
-
if (systemText) {
|
|
419
|
-
systemInstruction = systemText;
|
|
420
|
-
finalContent = `<instructions>\n${systemText}\n</instructions>\n\n${finalContent}`;
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
// Prefix order: thinking_mode tag, timestamp marker, then agentic prompt.
|
|
419
|
+
// Kiro CLI/KAS sends system prompt as top-level `systemPrompt`. Keep a
|
|
420
|
+
// content fallback too because the CodeWhisperer surface does not always
|
|
421
|
+
// enforce top-level systemPrompt for direct calls.
|
|
425
422
|
const timestamp = new Date().toISOString();
|
|
426
|
-
const
|
|
427
|
-
if (thinkingBudget !== null)
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
423
|
+
const systemPromptParts = [];
|
|
424
|
+
if (thinkingBudget !== null) systemPromptParts.push(buildThinkingSystemPrefix(thinkingBudget));
|
|
425
|
+
if (agentic) systemPromptParts.push(KIRO_AGENTIC_SYSTEM_PROMPT);
|
|
426
|
+
const systemInstruction = extractClaudeSystemText(body.system);
|
|
427
|
+
if (systemInstruction) systemPromptParts.push(systemInstruction);
|
|
428
|
+
const systemPrompt = systemPromptParts.filter(Boolean).join("\n\n");
|
|
429
|
+
const currentTimeContext = `[Context: Current time is ${timestamp}]`;
|
|
430
|
+
const contentPrefix = [systemPrompt, currentTimeContext].filter(Boolean).join("\n\n");
|
|
431
|
+
|
|
432
|
+
const sessionIdentity = resolveSessionIdentity({
|
|
433
|
+
headers: credentials?.rawHeaders,
|
|
434
|
+
body,
|
|
435
|
+
connectionId: credentials?.connectionId,
|
|
436
|
+
scope: "kiro",
|
|
437
|
+
});
|
|
438
|
+
const conversationId = sessionIdentity.sessionId;
|
|
439
|
+
const continuationId = resolveContinuationId({
|
|
440
|
+
sessionId: conversationId,
|
|
441
|
+
connectionId: credentials?.connectionId,
|
|
442
|
+
scope: "kiro",
|
|
443
|
+
ephemeral: sessionIdentity.ephemeral,
|
|
444
|
+
});
|
|
445
|
+
const replay = applyKiroSessionReplay({
|
|
446
|
+
conversationId,
|
|
447
|
+
connectionId: credentials?.connectionId,
|
|
448
|
+
modelId: upstreamModel,
|
|
449
|
+
systemPrompt,
|
|
450
|
+
contentPrefix,
|
|
451
|
+
currentContentPrefix: currentTimeContext,
|
|
452
|
+
history,
|
|
453
|
+
currentMessage,
|
|
454
|
+
});
|
|
455
|
+
const replayCurrent = replay.currentMessage?.userInputMessage || {};
|
|
432
456
|
const userInputMessage = {
|
|
433
|
-
content:
|
|
457
|
+
content: replayCurrent.content || "",
|
|
434
458
|
modelId: upstreamModel,
|
|
435
459
|
origin: "AI_EDITOR",
|
|
436
|
-
...(
|
|
437
|
-
userInputMessageContext:
|
|
438
|
-
currentMessage.userInputMessage.userInputMessageContext,
|
|
460
|
+
...(replayCurrent.userInputMessageContext && {
|
|
461
|
+
userInputMessageContext: replayCurrent.userInputMessageContext,
|
|
439
462
|
}),
|
|
440
|
-
...(
|
|
441
|
-
images:
|
|
463
|
+
...(replayCurrent.images && {
|
|
464
|
+
images: replayCurrent.images,
|
|
442
465
|
}),
|
|
443
466
|
};
|
|
444
467
|
|
|
445
|
-
if (systemInstruction) {
|
|
446
|
-
userInputMessage.systemInstruction = systemInstruction;
|
|
447
|
-
}
|
|
448
|
-
|
|
449
468
|
const payload = {
|
|
450
469
|
conversationState: {
|
|
451
470
|
chatTriggerType: "MANUAL",
|
|
452
|
-
conversationId
|
|
471
|
+
conversationId,
|
|
472
|
+
agentContinuationId: continuationId,
|
|
473
|
+
agentTaskType: "vibe",
|
|
453
474
|
currentMessage: {
|
|
454
475
|
userInputMessage,
|
|
455
476
|
},
|
|
456
|
-
history,
|
|
477
|
+
history: replay.history,
|
|
457
478
|
},
|
|
479
|
+
agentMode: "vibe",
|
|
458
480
|
};
|
|
459
481
|
|
|
460
482
|
if (profileArn) payload.profileArn = profileArn;
|
|
483
|
+
if (systemPrompt) payload.systemPrompt = systemPrompt;
|
|
484
|
+
const additionalModelRequestFields = buildKiroAdditionalModelRequestFieldsForModel(body, upstreamModel);
|
|
485
|
+
if (additionalModelRequestFields) {
|
|
486
|
+
payload.additionalModelRequestFields = additionalModelRequestFields;
|
|
487
|
+
}
|
|
461
488
|
|
|
462
489
|
if (maxTokens || temperature !== undefined || topP !== undefined) {
|
|
463
490
|
payload.inferenceConfig = {};
|
|
@@ -170,7 +170,3 @@ export function openaiToCommandCodeRequest(model, body, stream /* , credentials
|
|
|
170
170
|
}
|
|
171
171
|
|
|
172
172
|
register(FORMATS.OPENAI, FORMATS.COMMANDCODE, openaiToCommandCodeRequest, null);
|
|
173
|
-
|
|
174
|
-
// Backwards-compatible alias
|
|
175
|
-
export const openaiToCommandCode = openaiToCommandCodeRequest;
|
|
176
|
-
|