@fudrouter/fsrouter 0.6.63 → 0.6.64
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/bin/rewriteSseImports.js +5 -1
- package/dist/open-sse/executors/cliproxyapi.js +2 -2
- package/dist/open-sse/services/rateLimitManager.js +4 -4
- package/package.json +1 -1
- package/open-sse/AGENTS.md +0 -39
- package/open-sse/config/anthropicHeaders.js +0 -87
- package/open-sse/config/appConstants.js +0 -238
- package/open-sse/config/audioRegistry.js +0 -506
- package/open-sse/config/cliFingerprints.js +0 -304
- package/open-sse/config/codexInstructions.js +0 -119
- package/open-sse/config/codexQuotaScopes.js +0 -42
- package/open-sse/config/constants.js +0 -4
- package/open-sse/config/contextEditing.js +0 -68
- package/open-sse/config/credentialLoader.js +0 -83
- package/open-sse/config/defaultThinkingSignature.js +0 -12
- package/open-sse/config/embeddingRegistry.js +0 -264
- package/open-sse/config/errorConfig.js +0 -96
- package/open-sse/config/freeModelCatalog.data.js +0 -121
- package/open-sse/config/freeModelCatalog.js +0 -90
- package/open-sse/config/freeTierCatalog.js +0 -81
- package/open-sse/config/googleTtsLanguages.js +0 -62
- package/open-sse/config/imageParamDefs.js +0 -360
- package/open-sse/config/imageRegistry.js +0 -493
- package/open-sse/config/kiroConstants.js +0 -268
- package/open-sse/config/mediaConfig.js +0 -27
- package/open-sse/config/mediaServiceKinds.js +0 -71
- package/open-sse/config/models.js +0 -13
- package/open-sse/config/moderationRegistry.js +0 -71
- package/open-sse/config/musicRegistry.js +0 -99
- package/open-sse/config/ocrRegistry.js +0 -61
- package/open-sse/config/ollamaModels.js +0 -19
- package/open-sse/config/providerErrorRules.js +0 -114
- package/open-sse/config/providerFieldStrips.js +0 -35
- package/open-sse/config/providerHeaderProfiles.js +0 -191
- package/open-sse/config/providerModels.js +0 -106
- package/open-sse/config/providerRegistry.js +0 -16
- package/open-sse/config/providers.js +0 -19
- package/open-sse/config/registryUtils.js +0 -106
- package/open-sse/config/rerankRegistry.js +0 -177
- package/open-sse/config/runtimeConfig.js +0 -96
- package/open-sse/config/runway.js +0 -39
- package/open-sse/config/searchRegistry.js +0 -153
- package/open-sse/config/toolCloaking.js +0 -199
- package/open-sse/config/ttsModels.js +0 -129
- package/open-sse/config/videoRegistry.js +0 -207
- package/open-sse/executors/adapta-web.js +0 -435
- package/open-sse/executors/antigravity.js +0 -534
- package/open-sse/executors/antigravityUpstreamError.js +0 -13
- package/open-sse/executors/auggie.js +0 -437
- package/open-sse/executors/azure-openai.js +0 -32
- package/open-sse/executors/azure.js +0 -57
- package/open-sse/executors/base.js +0 -181
- package/open-sse/executors/bedrock.js +0 -633
- package/open-sse/executors/blackbox-web.js +0 -578
- package/open-sse/executors/chatgpt-web.js +0 -2042
- package/open-sse/executors/chipotle.js +0 -357
- package/open-sse/executors/claude-web-with-auto-refresh.js +0 -73
- package/open-sse/executors/claude-web.js +0 -586
- package/open-sse/executors/cliproxyapi.js +0 -296
- package/open-sse/executors/cloudflare-ai.js +0 -46
- package/open-sse/executors/codebuddy-cn.js +0 -40
- package/open-sse/executors/codex.js +0 -1324
- package/open-sse/executors/commandCode.js +0 -558
- package/open-sse/executors/commandcode.js +0 -88
- package/open-sse/executors/copilot-m365-connection.js +0 -176
- package/open-sse/executors/copilot-m365-frames.js +0 -192
- package/open-sse/executors/copilot-m365-web.js +0 -299
- package/open-sse/executors/copilot-web.js +0 -580
- package/open-sse/executors/cursor.js +0 -795
- package/open-sse/executors/deepseek-web-with-auto-refresh.js +0 -150
- package/open-sse/executors/deepseek-web.js +0 -875
- package/open-sse/executors/default.js +0 -430
- package/open-sse/executors/devin-cli.js +0 -351
- package/open-sse/executors/doubao-web.js +0 -550
- package/open-sse/executors/duckduckgo-web.js +0 -629
- package/open-sse/executors/forceResponsesUpstream.js +0 -33
- package/open-sse/executors/gemini-business.js +0 -320
- package/open-sse/executors/gemini-cli.js +0 -89
- package/open-sse/executors/gemini-web.js +0 -297
- package/open-sse/executors/github.js +0 -379
- package/open-sse/executors/gitlab.js +0 -569
- package/open-sse/executors/glm.js +0 -361
- package/open-sse/executors/grok-cli.js +0 -119
- package/open-sse/executors/grok-web.js +0 -345
- package/open-sse/executors/huggingchat.js +0 -467
- package/open-sse/executors/iflow.js +0 -108
- package/open-sse/executors/index.js +0 -78
- package/open-sse/executors/inner-ai.js +0 -527
- package/open-sse/executors/kimchi.js +0 -123
- package/open-sse/executors/kimi-web.js +0 -325
- package/open-sse/executors/kimi.js +0 -97
- package/open-sse/executors/kiro.js +0 -503
- package/open-sse/executors/kiroThinking.js +0 -44
- package/open-sse/executors/lmarena.js +0 -395
- package/open-sse/executors/mimo-free.js +0 -167
- package/open-sse/executors/mimocode.js +0 -392
- package/open-sse/executors/ninerouter.js +0 -155
- package/open-sse/executors/nlpcloud.js +0 -438
- package/open-sse/executors/ollama-local.js +0 -14
- package/open-sse/executors/opencode-go.js +0 -41
- package/open-sse/executors/opencode.js +0 -32
- package/open-sse/executors/perplexity-web.js +0 -581
- package/open-sse/executors/poe-web.js +0 -133
- package/open-sse/executors/pollinations.js +0 -95
- package/open-sse/executors/puter.js +0 -31
- package/open-sse/executors/qoder.js +0 -448
- package/open-sse/executors/qwen-web.js +0 -372
- package/open-sse/executors/qwen.js +0 -129
- package/open-sse/executors/t3-chat-web.js +0 -417
- package/open-sse/executors/theoldllm.js +0 -290
- package/open-sse/executors/trae.js +0 -418
- package/open-sse/executors/v0-vercel-web.js +0 -141
- package/open-sse/executors/venice-web.js +0 -142
- package/open-sse/executors/vertex.js +0 -131
- package/open-sse/executors/vertexMedia.js +0 -236
- package/open-sse/executors/windsurf.js +0 -560
- package/open-sse/executors/xai.js +0 -46
- package/open-sse/executors/xiaomi-tokenplan.js +0 -19
- package/open-sse/executors/yuanbao-web.js +0 -385
- package/open-sse/executors/zed-hosted.js +0 -281
- package/open-sse/executors/zenmux-free.js +0 -247
- package/open-sse/handlers/audioSpeech.js +0 -759
- package/open-sse/handlers/audioTranscription.js +0 -395
- package/open-sse/handlers/audioTranslation.js +0 -181
- package/open-sse/handlers/chatCore/nonStreamingHandler.js +0 -300
- package/open-sse/handlers/chatCore/requestDetail.js +0 -102
- package/open-sse/handlers/chatCore/sseToJsonHandler.js +0 -231
- package/open-sse/handlers/chatCore/streamingHandler.js +0 -95
- package/open-sse/handlers/chatCore.js +0 -404
- package/open-sse/handlers/embeddingProviders/_base.js +0 -4
- package/open-sse/handlers/embeddingProviders/gemini.js +0 -54
- package/open-sse/handlers/embeddingProviders/index.js +0 -23
- package/open-sse/handlers/embeddingProviders/openai.js +0 -39
- package/open-sse/handlers/embeddingProviders/openaiCompatNode.js +0 -13
- package/open-sse/handlers/embeddingsCore.js +0 -126
- package/open-sse/handlers/fetch/index.js +0 -237
- package/open-sse/handlers/imageGenerationCore.js +0 -230
- package/open-sse/handlers/imageProviders/_base.js +0 -31
- package/open-sse/handlers/imageProviders/antigravity.js +0 -73
- package/open-sse/handlers/imageProviders/blackForestLabs.js +0 -63
- package/open-sse/handlers/imageProviders/cloudflareAi.js +0 -207
- package/open-sse/handlers/imageProviders/codex.js +0 -217
- package/open-sse/handlers/imageProviders/comfyui.js +0 -25
- package/open-sse/handlers/imageProviders/falAi.js +0 -62
- package/open-sse/handlers/imageProviders/gemini.js +0 -40
- package/open-sse/handlers/imageProviders/huggingface.js +0 -38
- package/open-sse/handlers/imageProviders/index.js +0 -44
- package/open-sse/handlers/imageProviders/leonardo.js +0 -435
- package/open-sse/handlers/imageProviders/nanobanana.js +0 -79
- package/open-sse/handlers/imageProviders/openai.js +0 -61
- package/open-sse/handlers/imageProviders/runwayml.js +0 -72
- package/open-sse/handlers/imageProviders/sdwebui.js +0 -36
- package/open-sse/handlers/imageProviders/stabilityAi.js +0 -59
- package/open-sse/handlers/imageProviders/weavy.js +0 -222
- package/open-sse/handlers/moderations.js +0 -92
- package/open-sse/handlers/ocr.js +0 -89
- package/open-sse/handlers/rerank.js +0 -223
- package/open-sse/handlers/responseSanitizer/reasoning.js +0 -144
- package/open-sse/handlers/responsesHandler.js +0 -99
- package/open-sse/handlers/search/callers.js +0 -371
- package/open-sse/handlers/search/chatSearch.js +0 -409
- package/open-sse/handlers/search/index.js +0 -201
- package/open-sse/handlers/search/normalizers.js +0 -223
- package/open-sse/handlers/search.js +0 -1056
- package/open-sse/handlers/sseParser.js +0 -469
- package/open-sse/handlers/sttCore.js +0 -193
- package/open-sse/handlers/ttsCore.js +0 -74
- package/open-sse/handlers/ttsProviders/_base.js +0 -39
- package/open-sse/handlers/ttsProviders/edgeTts.js +0 -89
- package/open-sse/handlers/ttsProviders/elevenlabs.js +0 -48
- package/open-sse/handlers/ttsProviders/gemini.js +0 -117
- package/open-sse/handlers/ttsProviders/genericFormats.js +0 -169
- package/open-sse/handlers/ttsProviders/googleTts.js +0 -54
- package/open-sse/handlers/ttsProviders/index.js +0 -50
- package/open-sse/handlers/ttsProviders/localDevice.js +0 -87
- package/open-sse/handlers/ttsProviders/minimax.js +0 -59
- package/open-sse/handlers/ttsProviders/openai.js +0 -30
- package/open-sse/handlers/ttsProviders/openrouter.js +0 -70
- package/open-sse/handlers/usageExtractor.js +0 -93
- package/open-sse/handlers/videoGenerationCore.js +0 -119
- package/open-sse/handlers/videoProviders/index.js +0 -22
- package/open-sse/handlers/videoProviders/leonardo.js +0 -511
- package/open-sse/handlers/videoProviders/weavy.js +0 -198
- package/open-sse/handlers/webFetch.js +0 -200
- package/open-sse/index.js +0 -79
- package/open-sse/mcp-server/audit.js +0 -283
- package/open-sse/mcp-server/catalog.js +0 -184
- package/open-sse/mcp-server/descriptionCompressor.js +0 -175
- package/open-sse/mcp-server/httpAuthContext.js +0 -32
- package/open-sse/mcp-server/httpTransport.js +0 -229
- package/open-sse/mcp-server/index.js +0 -33
- package/open-sse/mcp-server/mcpCallerIdentity.js +0 -21
- package/open-sse/mcp-server/runtimeHeartbeat.js +0 -110
- package/open-sse/mcp-server/schemas/a2a.js +0 -153
- package/open-sse/mcp-server/schemas/audit.js +0 -17
- package/open-sse/mcp-server/schemas/index.js +0 -166
- package/open-sse/mcp-server/schemas/pickFastestModel.js +0 -90
- package/open-sse/mcp-server/schemas/toolDefinition.js +0 -0
- package/open-sse/mcp-server/schemas/toolSearch.js +0 -32
- package/open-sse/mcp-server/schemas/tools.js +0 -1219
- package/open-sse/mcp-server/scopeEnforcement.js +0 -80
- package/open-sse/mcp-server/server.js +0 -1168
- package/open-sse/mcp-server/toolCardinality.js +0 -78
- package/open-sse/mcp-server/toolSearch/catalog.js +0 -66
- package/open-sse/mcp-server/toolSearch/handler.js +0 -20
- package/open-sse/mcp-server/toolSearch/index.js +0 -10
- package/open-sse/mcp-server/toolSearch/register.js +0 -21
- package/open-sse/mcp-server/toolSearch/search.js +0 -55
- package/open-sse/mcp-server/toolSearch/signature.js +0 -67
- package/open-sse/mcp-server/tools/advancedTools.js +0 -893
- package/open-sse/mcp-server/tools/agentSkillTools.js +0 -69
- package/open-sse/mcp-server/tools/compressionTools.js +0 -309
- package/open-sse/mcp-server/tools/gamificationTools.js +0 -134
- package/open-sse/mcp-server/tools/githubSkillTools.js +0 -102
- package/open-sse/mcp-server/tools/memoryTools.js +0 -118
- package/open-sse/mcp-server/tools/notionTools.js +0 -101
- package/open-sse/mcp-server/tools/obsidianTools.js +0 -307
- package/open-sse/mcp-server/tools/pickFastestModel.js +0 -223
- package/open-sse/mcp-server/tools/pluginTools.js +0 -181
- package/open-sse/mcp-server/tools/poolTools.js +0 -139
- package/open-sse/mcp-server/tools/skillTools.js +0 -113
- package/open-sse/package.json +0 -10
- package/open-sse/providers/REGISTRY_TEMPLATE.js +0 -98
- package/open-sse/providers/capabilities.js +0 -293
- package/open-sse/providers/index.js +0 -51
- package/open-sse/providers/models/helpers.js +0 -20
- package/open-sse/providers/models/namePatterns.js +0 -33
- package/open-sse/providers/models/schema.js +0 -40
- package/open-sse/providers/pricing.js +0 -308
- package/open-sse/providers/registry/alicode-intl.js +0 -30
- package/open-sse/providers/registry/alicode.js +0 -31
- package/open-sse/providers/registry/anthropic.js +0 -37
- package/open-sse/providers/registry/antigravity.js +0 -81
- package/open-sse/providers/registry/assemblyai.js +0 -38
- package/open-sse/providers/registry/aws-polly.js +0 -45
- package/open-sse/providers/registry/azure.js +0 -21
- package/open-sse/providers/registry/black-forest-labs.js +0 -32
- package/open-sse/providers/registry/blackbox.js +0 -41
- package/open-sse/providers/registry/brave-search.js +0 -35
- package/open-sse/providers/registry/byteplus.js +0 -35
- package/open-sse/providers/registry/cartesia.js +0 -36
- package/open-sse/providers/registry/cerebras.js +0 -31
- package/open-sse/providers/registry/chutes.js +0 -24
- package/open-sse/providers/registry/claude.js +0 -87
- package/open-sse/providers/registry/cline.js +0 -51
- package/open-sse/providers/registry/clinepass.js +0 -57
- package/open-sse/providers/registry/cloudflare-ai.js +0 -55
- package/open-sse/providers/registry/codebuddy-cn.js +0 -77
- package/open-sse/providers/registry/codex.js +0 -100
- package/open-sse/providers/registry/cohere.js +0 -27
- package/open-sse/providers/registry/comfyui.js +0 -20
- package/open-sse/providers/registry/commandcode.js +0 -43
- package/open-sse/providers/registry/coqui.js +0 -30
- package/open-sse/providers/registry/cursor.js +0 -58
- package/open-sse/providers/registry/deepgram.js +0 -33
- package/open-sse/providers/registry/deepseek.js +0 -51
- package/open-sse/providers/registry/digitalocean.js +0 -92
- package/open-sse/providers/registry/edge-tts.js +0 -24
- package/open-sse/providers/registry/elevenlabs.js +0 -35
- package/open-sse/providers/registry/exa.js +0 -50
- package/open-sse/providers/registry/fal-ai.js +0 -34
- package/open-sse/providers/registry/featherless.js +0 -34
- package/open-sse/providers/registry/firecrawl.js +0 -34
- package/open-sse/providers/registry/fireworks.js +0 -29
- package/open-sse/providers/registry/gemini-cli.js +0 -58
- package/open-sse/providers/registry/gemini.js +0 -83
- package/open-sse/providers/registry/github.js +0 -88
- package/open-sse/providers/registry/gitlab.js +0 -32
- package/open-sse/providers/registry/glm-cn.js +0 -35
- package/open-sse/providers/registry/glm.js +0 -58
- package/open-sse/providers/registry/google-pse.js +0 -35
- package/open-sse/providers/registry/google-tts.js +0 -24
- package/open-sse/providers/registry/grok-cli.js +0 -86
- package/open-sse/providers/registry/grok-web.js +0 -39
- package/open-sse/providers/registry/groq.js +0 -37
- package/open-sse/providers/registry/huggingface.js +0 -34
- package/open-sse/providers/registry/hyperbolic.js +0 -35
- package/open-sse/providers/registry/ibm-bob.js +0 -27
- package/open-sse/providers/registry/iflow.js +0 -52
- package/open-sse/providers/registry/index.js +0 -210
- package/open-sse/providers/registry/inworld.js +0 -36
- package/open-sse/providers/registry/jina-ai.js +0 -42
- package/open-sse/providers/registry/jina-reader.js +0 -34
- package/open-sse/providers/registry/kilocode.js +0 -51
- package/open-sse/providers/registry/kimchi.js +0 -49
- package/open-sse/providers/registry/kimi-coding.js +0 -65
- package/open-sse/providers/registry/kimi.js +0 -56
- package/open-sse/providers/registry/kiro.js +0 -115
- package/open-sse/providers/registry/linkup.js +0 -34
- package/open-sse/providers/registry/local-device.js +0 -24
- package/open-sse/providers/registry/mimo-free.js +0 -24
- package/open-sse/providers/registry/minimax-cn.js +0 -76
- package/open-sse/providers/registry/minimax.js +0 -83
- package/open-sse/providers/registry/mistral.js +0 -34
- package/open-sse/providers/registry/mmf.js +0 -19
- package/open-sse/providers/registry/nanobanana.js +0 -35
- package/open-sse/providers/registry/nebius.js +0 -27
- package/open-sse/providers/registry/nvidia.js +0 -43
- package/open-sse/providers/registry/ollama-local.js +0 -19
- package/open-sse/providers/registry/ollama.js +0 -36
- package/open-sse/providers/registry/openai.js +0 -84
- package/open-sse/providers/registry/opencode-go.js +0 -41
- package/open-sse/providers/registry/opencode.js +0 -25
- package/open-sse/providers/registry/openrouter.js +0 -60
- package/open-sse/providers/registry/perplexity-agent.js +0 -49
- package/open-sse/providers/registry/perplexity-web.js +0 -33
- package/open-sse/providers/registry/perplexity.js +0 -37
- package/open-sse/providers/registry/playht.js +0 -36
- package/open-sse/providers/registry/qoder.js +0 -54
- package/open-sse/providers/registry/qwen.js +0 -33
- package/open-sse/providers/registry/recraft.js +0 -24
- package/open-sse/providers/registry/runwayml.js +0 -30
- package/open-sse/providers/registry/sdwebui.js +0 -20
- package/open-sse/providers/registry/searchapi.js +0 -35
- package/open-sse/providers/registry/searxng.js +0 -35
- package/open-sse/providers/registry/serper.js +0 -35
- package/open-sse/providers/registry/siliconflow.js +0 -39
- package/open-sse/providers/registry/stability-ai.js +0 -31
- package/open-sse/providers/registry/tavily.js +0 -50
- package/open-sse/providers/registry/together.js +0 -31
- package/open-sse/providers/registry/topaz.js +0 -19
- package/open-sse/providers/registry/tortoise.js +0 -30
- package/open-sse/providers/registry/venice.js +0 -56
- package/open-sse/providers/registry/vercel-ai-gateway.js +0 -41
- package/open-sse/providers/registry/vertex-partner.js +0 -29
- package/open-sse/providers/registry/vertex.js +0 -32
- package/open-sse/providers/registry/volcengine-ark.js +0 -35
- package/open-sse/providers/registry/voyage-ai.js +0 -30
- package/open-sse/providers/registry/xai.js +0 -45
- package/open-sse/providers/registry/xiaomi-mimo.js +0 -46
- package/open-sse/providers/registry/xiaomi-tokenplan.js +0 -63
- package/open-sse/providers/registry/youcom.js +0 -35
- package/open-sse/providers/schema.js +0 -76
- package/open-sse/providers/shared.js +0 -74
- package/open-sse/providers/thinkingLevels.js +0 -48
- package/open-sse/rtk/applyFilter.js +0 -15
- package/open-sse/rtk/autodetect.js +0 -111
- package/open-sse/rtk/caveman.js +0 -100
- package/open-sse/rtk/cavemanPrompts.js +0 -78
- package/open-sse/rtk/constants.js +0 -55
- package/open-sse/rtk/filters/buildOutput.js +0 -127
- package/open-sse/rtk/filters/dedupLog.js +0 -44
- package/open-sse/rtk/filters/find.js +0 -50
- package/open-sse/rtk/filters/gitDiff.js +0 -92
- package/open-sse/rtk/filters/gitLog.js +0 -99
- package/open-sse/rtk/filters/gitStatus.js +0 -117
- package/open-sse/rtk/filters/grep.js +0 -48
- package/open-sse/rtk/filters/ls.js +0 -79
- package/open-sse/rtk/filters/readNumbered.js +0 -27
- package/open-sse/rtk/filters/searchList.js +0 -52
- package/open-sse/rtk/filters/smartTruncate.js +0 -15
- package/open-sse/rtk/filters/tree.js +0 -32
- package/open-sse/rtk/headroom.js +0 -215
- package/open-sse/rtk/index.js +0 -155
- package/open-sse/rtk/paleo.js +0 -47
- package/open-sse/rtk/ponytail.js +0 -9
- package/open-sse/rtk/ponytailPrompt.js +0 -52
- package/open-sse/rtk/ponytailPrompts.js +0 -76
- package/open-sse/rtk/pxpipe.js +0 -104
- package/open-sse/rtk/registry.js +0 -38
- package/open-sse/rtk/systemInject.js +0 -98
- package/open-sse/services/accountFallback.js +0 -323
- package/open-sse/services/antigravityHeaders.js +0 -91
- package/open-sse/services/antigravityVersion.js +0 -154
- package/open-sse/services/clinepassModels.js +0 -63
- package/open-sse/services/codexQuotaFetcher.js +0 -312
- package/open-sse/services/codexVerbosity.js +0 -30
- package/open-sse/services/combo/context.js +0 -12
- package/open-sse/services/combo/fingerprintExpansion.js +0 -51
- package/open-sse/services/combo/headroomRanking.js +0 -28
- package/open-sse/services/combo/quotaExhaustionCutoff.js +0 -87
- package/open-sse/services/combo/quotaScoring.js +0 -226
- package/open-sse/services/combo/quotaShareConcurrency.js +0 -25
- package/open-sse/services/combo/quotaShareInflight.js +0 -50
- package/open-sse/services/combo/quotaShareStrategy.js +0 -130
- package/open-sse/services/combo/resolveAutoStrategy.js +0 -231
- package/open-sse/services/combo/responseValidation.js +0 -140
- package/open-sse/services/combo/runtimeUnits.js +0 -195
- package/open-sse/services/combo/sessionStickiness.js +0 -128
- package/open-sse/services/combo/shadowRouting.js +0 -131
- package/open-sse/services/combo/targetExhaustion.js +0 -75
- package/open-sse/services/combo/targetSorters.js +0 -126
- package/open-sse/services/combo/targetTimeoutRunner.js +0 -65
- package/open-sse/services/combo/validateQuality.js +0 -271
- package/open-sse/services/combo.js +0 -571
- package/open-sse/services/comboAgentMiddleware.js +0 -91
- package/open-sse/services/comboConfig.js +0 -153
- package/open-sse/services/comboManifestMetrics.js +0 -10
- package/open-sse/services/comboMetrics.js +0 -278
- package/open-sse/services/compact.js +0 -71
- package/open-sse/services/copilotModels.js +0 -155
- package/open-sse/services/emergencyFallback.js +0 -109
- package/open-sse/services/errorClassifier.js +0 -190
- package/open-sse/services/evalRouting.js +0 -201
- package/open-sse/services/freeWebSearch.js +0 -4
- package/open-sse/services/fusion.js +0 -223
- package/open-sse/services/intentClassifier.js +0 -631
- package/open-sse/services/kimchiModels.js +0 -176
- package/open-sse/services/kiroModels.js +0 -332
- package/open-sse/services/model.js +0 -136
- package/open-sse/services/modelCapabilities.js +0 -5
- package/open-sse/services/modelDeprecation.js +0 -101
- package/open-sse/services/modelFamilyFallback.js +0 -166
- package/open-sse/services/oauthCredentialManager.js +0 -156
- package/open-sse/services/pipeline.js +0 -107
- package/open-sse/services/projectId.js +0 -306
- package/open-sse/services/provider.js +0 -169
- package/open-sse/services/providerCooldownTracker.js +0 -94
- package/open-sse/services/providerDefaultRateLimit.js +0 -11
- package/open-sse/services/proxyAutoSelector.js +0 -24
- package/open-sse/services/qoderModels.js +0 -214
- package/open-sse/services/quotaFetchThrottle.js +0 -103
- package/open-sse/services/quotaMonitor.js +0 -310
- package/open-sse/services/quotaPreflight.js +0 -266
- package/open-sse/services/rateLimitManager/headers.js +0 -56
- package/open-sse/services/rateLimitManager.js +0 -616
- package/open-sse/services/rateLimitSemaphore.js +0 -112
- package/open-sse/services/responsesInputSanitizer.js +0 -99
- package/open-sse/services/slidingWindowLimiter.js +0 -44
- package/open-sse/services/streamRecovery.js +0 -355
- package/open-sse/services/taskAwareRouter.js +0 -227
- package/open-sse/services/taskAwareRouting.js +0 -332
- package/open-sse/services/thinkingBudget.js +0 -247
- package/open-sse/services/tokenRefresh/dedup.js +0 -31
- package/open-sse/services/tokenRefresh/providers.js +0 -624
- package/open-sse/services/tokenRefresh.js +0 -254
- package/open-sse/services/usage/claude.js +0 -147
- package/open-sse/services/usage/codebuddy-cn.js +0 -138
- package/open-sse/services/usage/codex.js +0 -267
- package/open-sse/services/usage/github.js +0 -100
- package/open-sse/services/usage/google.js +0 -241
- package/open-sse/services/usage/grok-cli.js +0 -274
- package/open-sse/services/usage/kiro.js +0 -188
- package/open-sse/services/usage/minimax.js +0 -234
- package/open-sse/services/usage/misc.js +0 -288
- package/open-sse/services/usage/shared.js +0 -70
- package/open-sse/services/usage.js +0 -62
- package/open-sse/services/usageDb.js +0 -2
- package/open-sse/services/webSearchRouting.js +0 -25
- package/open-sse/services/wildcardRouter.js +0 -59
- package/open-sse/shared/clineAuth.js +0 -37
- package/open-sse/shared/machineId.js +0 -19
- package/open-sse/shared/qoder/constants.js +0 -64
- package/open-sse/shared/qoder/cosy.js +0 -175
- package/open-sse/shared/qoder/encoding.js +0 -55
- package/open-sse/transformer/responsesTransformer.js +0 -439
- package/open-sse/transformer/streamToJsonConverter.js +0 -103
- package/open-sse/translator/concerns/chunk.js +0 -11
- package/open-sse/translator/concerns/finishReason.js +0 -63
- package/open-sse/translator/concerns/image.js +0 -124
- package/open-sse/translator/concerns/json.js +0 -5
- package/open-sse/translator/concerns/message.js +0 -7
- package/open-sse/translator/concerns/modality.js +0 -155
- package/open-sse/translator/concerns/paramSupport.js +0 -75
- package/open-sse/translator/concerns/prefetch.js +0 -96
- package/open-sse/translator/concerns/reasoning.js +0 -24
- package/open-sse/translator/concerns/thinking.js +0 -53
- package/open-sse/translator/concerns/thinkingUnified.js +0 -329
- package/open-sse/translator/concerns/toolCall.js +0 -153
- package/open-sse/translator/concerns/usage.js +0 -69
- package/open-sse/translator/formats/claude.js +0 -368
- package/open-sse/translator/formats/gemini.js +0 -380
- package/open-sse/translator/formats/maxTokens.js +0 -34
- package/open-sse/translator/formats/openai.js +0 -134
- package/open-sse/translator/formats/responsesApi.js +0 -141
- package/open-sse/translator/formats.js +0 -36
- package/open-sse/translator/helpers/claudeHelper.js +0 -216
- package/open-sse/translator/helpers/geminiHelper.js +0 -372
- package/open-sse/translator/helpers/imageHelper.js +0 -34
- package/open-sse/translator/helpers/maxTokensHelper.js +0 -27
- package/open-sse/translator/helpers/openaiHelper.js +0 -130
- package/open-sse/translator/helpers/responsesApiHelper.js +0 -139
- package/open-sse/translator/helpers/toolCallHelper.js +0 -148
- package/open-sse/translator/index.js +0 -252
- package/open-sse/translator/request/antigravity-to-openai.js +0 -242
- package/open-sse/translator/request/claude-to-kiro.js +0 -478
- package/open-sse/translator/request/claude-to-openai.js +0 -263
- package/open-sse/translator/request/gemini-to-openai.js +0 -152
- package/open-sse/translator/request/openai-responses.js +0 -385
- package/open-sse/translator/request/openai-to-claude.js +0 -383
- package/open-sse/translator/request/openai-to-commandcode.js +0 -176
- package/open-sse/translator/request/openai-to-cursor.js +0 -185
- package/open-sse/translator/request/openai-to-gemini.js +0 -442
- package/open-sse/translator/request/openai-to-kiro.js +0 -607
- package/open-sse/translator/request/openai-to-kiro.old.js +0 -278
- package/open-sse/translator/request/openai-to-ollama.js +0 -195
- package/open-sse/translator/request/openai-to-vertex.js +0 -42
- package/open-sse/translator/response/claude-to-openai.js +0 -195
- package/open-sse/translator/response/commandcode-to-openai.js +0 -188
- package/open-sse/translator/response/cursor-to-openai.js +0 -30
- package/open-sse/translator/response/gemini-to-openai.js +0 -147
- package/open-sse/translator/response/kiro-to-claude.js +0 -261
- package/open-sse/translator/response/kiro-to-openai.js +0 -160
- package/open-sse/translator/response/ollama-to-openai.js +0 -134
- package/open-sse/translator/response/openai-responses.js +0 -535
- package/open-sse/translator/response/openai-to-antigravity.js +0 -123
- package/open-sse/translator/response/openai-to-claude.js +0 -265
- package/open-sse/translator/schema/blocks.js +0 -43
- package/open-sse/translator/schema/defaults.js +0 -7
- package/open-sse/translator/schema/finishReasons.js +0 -27
- package/open-sse/translator/schema/index.js +0 -8
- package/open-sse/translator/schema/roles.js +0 -16
- package/open-sse/utils/agentGoalPolicy.js +0 -85
- package/open-sse/utils/aiSdkCompat.js +0 -75
- package/open-sse/utils/bypassHandler.js +0 -298
- package/open-sse/utils/cacheControlPolicy.js +0 -189
- package/open-sse/utils/claudeCloaking.js +0 -155
- package/open-sse/utils/claudeHeaderCache.js +0 -70
- package/open-sse/utils/claudeSignature.js +0 -41
- package/open-sse/utils/clientDetector.js +0 -63
- package/open-sse/utils/codebuddySanitizer.js +0 -96
- package/open-sse/utils/composerToolCalls.js +0 -158
- package/open-sse/utils/cors.js +0 -13
- package/open-sse/utils/cursorChecksum.js +0 -149
- package/open-sse/utils/cursorImages.js +0 -224
- package/open-sse/utils/cursorProtobuf.js +0 -904
- package/open-sse/utils/cursorVersionDetector.js +0 -55
- package/open-sse/utils/debugLog.js +0 -14
- package/open-sse/utils/diagnostics.js +0 -143
- package/open-sse/utils/error.js +0 -164
- package/open-sse/utils/estimateSize.js +0 -33
- package/open-sse/utils/finishReason.js +0 -32
- package/open-sse/utils/flattenToolHistory.js +0 -68
- package/open-sse/utils/headers.js +0 -36
- package/open-sse/utils/heapPressure.js +0 -35
- package/open-sse/utils/jsonToSse.js +0 -125
- package/open-sse/utils/keepaliveThreshold.js +0 -40
- package/open-sse/utils/logger.js +0 -104
- package/open-sse/utils/noThinkingAlias.js +0 -74
- package/open-sse/utils/number.js +0 -7
- package/open-sse/utils/ollamaTransform.js +0 -85
- package/open-sse/utils/opencodeHeaders.js +0 -47
- package/open-sse/utils/progressTracker.js +0 -81
- package/open-sse/utils/providerRequestLogging.js +0 -219
- package/open-sse/utils/proxyFetch.js +0 -369
- package/open-sse/utils/reasoningContentInjector.js +0 -79
- package/open-sse/utils/reasoningFields.js +0 -70
- package/open-sse/utils/requestLogger.js +0 -260
- package/open-sse/utils/responsesInputNormalization.js +0 -92
- package/open-sse/utils/responsesStatePolicy.js +0 -52
- package/open-sse/utils/responsesStreamHelpers.js +0 -49
- package/open-sse/utils/sessionManager.js +0 -240
- package/open-sse/utils/sleep.js +0 -6
- package/open-sse/utils/sse.js +0 -14
- package/open-sse/utils/sseConstants.js +0 -23
- package/open-sse/utils/sseHeartbeat.js +0 -104
- package/open-sse/utils/stream.js +0 -517
- package/open-sse/utils/streamFailureFinalization.js +0 -134
- package/open-sse/utils/streamHandler.js +0 -250
- package/open-sse/utils/streamHelpers.js +0 -137
- package/open-sse/utils/textualToolCall.js +0 -104
- package/open-sse/utils/thinkCloseMarker.js +0 -72
- package/open-sse/utils/thinkTagParser.js +0 -146
- package/open-sse/utils/toolCallArguments.js +0 -12
- package/open-sse/utils/toolDeduper.js +0 -49
- package/open-sse/utils/toolSources.js +0 -31
- package/open-sse/utils/upstreamResponseHeaders.js +0 -25
- package/open-sse/utils/urlSanitize.js +0 -15
- package/open-sse/utils/usageTracking.js +0 -347
|
@@ -1,298 +0,0 @@
|
|
|
1
|
-
import { detectFormat } from "../services/provider.js";
|
|
2
|
-
import { translateResponse, initState } from "../translator/index.js";
|
|
3
|
-
import { FORMATS } from "../translator/formats.js";
|
|
4
|
-
import { SKIP_PATTERNS } from "../config/runtimeConfig.js";
|
|
5
|
-
import { formatSSE } from "./stream.js";
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Check for bypass patterns - return fake response without calling provider
|
|
9
|
-
* Only works for Claude CLI requests
|
|
10
|
-
*/
|
|
11
|
-
export function handleBypassRequest(body, model, userAgent = "", ccFilterNaming = false) {
|
|
12
|
-
if (!userAgent.includes("claude-cli")) return null;
|
|
13
|
-
if (!body.messages?.length) return null;
|
|
14
|
-
|
|
15
|
-
const messages = body.messages;
|
|
16
|
-
const getText = (content) => {
|
|
17
|
-
if (typeof content === "string") return content;
|
|
18
|
-
if (Array.isArray(content)) {
|
|
19
|
-
return content.filter(c => c.type === "text").map(c => c.text).join(" ");
|
|
20
|
-
}
|
|
21
|
-
return "";
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
let shouldBypass = false;
|
|
25
|
-
let namingBypass = false;
|
|
26
|
-
|
|
27
|
-
// Pattern 1: Title extraction (assistant message = "{")
|
|
28
|
-
const lastMsg = messages[messages.length - 1];
|
|
29
|
-
if (lastMsg?.role === "assistant" && lastMsg.content?.[0]?.text === "{") {
|
|
30
|
-
shouldBypass = true;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
// Pattern 2: Warmup
|
|
34
|
-
if (!shouldBypass) {
|
|
35
|
-
const firstText = getText(messages[0]?.content);
|
|
36
|
-
if (firstText === "Warmup") {
|
|
37
|
-
shouldBypass = true;
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
// Pattern 3: Count
|
|
42
|
-
if (!shouldBypass && messages.length === 1 && messages[0]?.role === "user") {
|
|
43
|
-
const firstText = getText(messages[0]?.content);
|
|
44
|
-
if (firstText === "count") {
|
|
45
|
-
shouldBypass = true;
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
// Pattern 4: Skip patterns
|
|
50
|
-
if (!shouldBypass && SKIP_PATTERNS?.length) {
|
|
51
|
-
const userMessages = messages.filter(m => m.role === "user");
|
|
52
|
-
const userText = userMessages.map(m => getText(m.content)).join(" ");
|
|
53
|
-
if (SKIP_PATTERNS.some(p => userText.includes(p))) {
|
|
54
|
-
shouldBypass = true;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
// Pattern 5: CC naming request (topic title extraction by Claude Code CLI)
|
|
59
|
-
// Claude format: system is top-level body.system field, not inside messages
|
|
60
|
-
if (!shouldBypass && ccFilterNaming) {
|
|
61
|
-
const systemMsg = messages.find(m => m.role === "system");
|
|
62
|
-
const systemFromMessages = getText(systemMsg?.content);
|
|
63
|
-
const systemFromBody = Array.isArray(body.system)
|
|
64
|
-
? body.system.filter(s => s.type === "text").map(s => s.text).join(" ")
|
|
65
|
-
: (typeof body.system === "string" ? body.system : "");
|
|
66
|
-
const systemText = systemFromMessages || systemFromBody;
|
|
67
|
-
if (systemText.includes("isNewTopic")) {
|
|
68
|
-
shouldBypass = true;
|
|
69
|
-
namingBypass = true;
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
if (!shouldBypass) return null;
|
|
74
|
-
|
|
75
|
-
const sourceFormat = detectFormat(body);
|
|
76
|
-
const stream = body.stream !== false;
|
|
77
|
-
|
|
78
|
-
// For naming bypass, generate title from user message
|
|
79
|
-
if (namingBypass) {
|
|
80
|
-
const userMsg = messages.find(m => m.role === "user");
|
|
81
|
-
const userText = getText(userMsg?.content);
|
|
82
|
-
const title = userText.trim().split(/\s+/).slice(0, 3).join(" ");
|
|
83
|
-
const namingText = JSON.stringify({ isNewTopic: true, title });
|
|
84
|
-
return stream
|
|
85
|
-
? createStreamingResponse(sourceFormat, model, namingText)
|
|
86
|
-
: createNonStreamingResponse(sourceFormat, model, namingText);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
return stream
|
|
90
|
-
? createStreamingResponse(sourceFormat, model)
|
|
91
|
-
: createNonStreamingResponse(sourceFormat, model);
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
const DEFAULT_BYPASS_TEXT = "CLI Command Execution: Clear Terminal";
|
|
95
|
-
|
|
96
|
-
/**
|
|
97
|
-
* Create OpenAI standard format response
|
|
98
|
-
*/
|
|
99
|
-
function createOpenAIResponse(model, text = DEFAULT_BYPASS_TEXT) {
|
|
100
|
-
const id = `chatcmpl-${Date.now()}`;
|
|
101
|
-
const created = Math.floor(Date.now() / 1000);
|
|
102
|
-
|
|
103
|
-
return {
|
|
104
|
-
id,
|
|
105
|
-
object: "chat.completion",
|
|
106
|
-
created,
|
|
107
|
-
model,
|
|
108
|
-
choices: [{
|
|
109
|
-
index: 0,
|
|
110
|
-
message: {
|
|
111
|
-
role: "assistant",
|
|
112
|
-
content: text
|
|
113
|
-
},
|
|
114
|
-
finish_reason: "stop"
|
|
115
|
-
}],
|
|
116
|
-
usage: {
|
|
117
|
-
prompt_tokens: 1,
|
|
118
|
-
completion_tokens: 1,
|
|
119
|
-
total_tokens: 2
|
|
120
|
-
}
|
|
121
|
-
};
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
/**
|
|
125
|
-
* Create non-streaming response with translation
|
|
126
|
-
* Use translator to convert OpenAI → sourceFormat
|
|
127
|
-
*/
|
|
128
|
-
function createNonStreamingResponse(sourceFormat, model, text) {
|
|
129
|
-
const openaiResponse = createOpenAIResponse(model, text);
|
|
130
|
-
|
|
131
|
-
// If sourceFormat is OpenAI, return directly
|
|
132
|
-
if (sourceFormat === FORMATS.OPENAI) {
|
|
133
|
-
return {
|
|
134
|
-
success: true,
|
|
135
|
-
response: new Response(JSON.stringify(openaiResponse), {
|
|
136
|
-
headers: {
|
|
137
|
-
"Content-Type": "application/json",
|
|
138
|
-
"Access-Control-Allow-Origin": "*"
|
|
139
|
-
}
|
|
140
|
-
})
|
|
141
|
-
};
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
// Use translator to convert: simulate streaming then collect all chunks
|
|
145
|
-
const state = initState(sourceFormat);
|
|
146
|
-
state.model = model;
|
|
147
|
-
|
|
148
|
-
const openaiChunks = createOpenAIStreamingChunks(openaiResponse);
|
|
149
|
-
const allTranslated = [];
|
|
150
|
-
|
|
151
|
-
for (const chunk of openaiChunks) {
|
|
152
|
-
const translated = translateResponse(FORMATS.OPENAI, sourceFormat, chunk, state);
|
|
153
|
-
if (translated?.length > 0) {
|
|
154
|
-
allTranslated.push(...translated);
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
// Flush remaining
|
|
159
|
-
const flushed = translateResponse(FORMATS.OPENAI, sourceFormat, null, state);
|
|
160
|
-
if (flushed?.length > 0) {
|
|
161
|
-
allTranslated.push(...flushed);
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
// For non-streaming, merge all chunks into final response
|
|
165
|
-
const finalResponse = mergeChunksToResponse(allTranslated, sourceFormat);
|
|
166
|
-
|
|
167
|
-
return {
|
|
168
|
-
success: true,
|
|
169
|
-
response: new Response(JSON.stringify(finalResponse), {
|
|
170
|
-
headers: {
|
|
171
|
-
"Content-Type": "application/json",
|
|
172
|
-
"Access-Control-Allow-Origin": "*"
|
|
173
|
-
}
|
|
174
|
-
})
|
|
175
|
-
};
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
/**
|
|
179
|
-
* Create streaming response with translation
|
|
180
|
-
* Use translator to convert OpenAI chunks → sourceFormat
|
|
181
|
-
*/
|
|
182
|
-
function createStreamingResponse(sourceFormat, model, text) {
|
|
183
|
-
const openaiResponse = createOpenAIResponse(model, text);
|
|
184
|
-
const state = initState(sourceFormat);
|
|
185
|
-
state.model = model;
|
|
186
|
-
|
|
187
|
-
// Create OpenAI streaming chunks
|
|
188
|
-
const openaiChunks = createOpenAIStreamingChunks(openaiResponse);
|
|
189
|
-
|
|
190
|
-
// Translate each chunk to sourceFormat using translator
|
|
191
|
-
const translatedChunks = [];
|
|
192
|
-
|
|
193
|
-
for (const chunk of openaiChunks) {
|
|
194
|
-
const translated = translateResponse(FORMATS.OPENAI, sourceFormat, chunk, state);
|
|
195
|
-
if (translated?.length > 0) {
|
|
196
|
-
for (const item of translated) {
|
|
197
|
-
translatedChunks.push(formatSSE(item, sourceFormat));
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
// Flush remaining events
|
|
203
|
-
const flushed = translateResponse(FORMATS.OPENAI, sourceFormat, null, state);
|
|
204
|
-
if (flushed?.length > 0) {
|
|
205
|
-
for (const item of flushed) {
|
|
206
|
-
translatedChunks.push(formatSSE(item, sourceFormat));
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
// Add [DONE]
|
|
211
|
-
translatedChunks.push("data: [DONE]\n\n");
|
|
212
|
-
|
|
213
|
-
return {
|
|
214
|
-
success: true,
|
|
215
|
-
response: new Response(translatedChunks.join(""), {
|
|
216
|
-
headers: {
|
|
217
|
-
"Content-Type": "text/event-stream",
|
|
218
|
-
"Cache-Control": "no-cache",
|
|
219
|
-
"Connection": "keep-alive",
|
|
220
|
-
"Access-Control-Allow-Origin": "*"
|
|
221
|
-
}
|
|
222
|
-
})
|
|
223
|
-
};
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
/**
|
|
227
|
-
* Merge translated chunks into final response object (for non-streaming)
|
|
228
|
-
* Takes the last complete chunk as the final response
|
|
229
|
-
*/
|
|
230
|
-
function mergeChunksToResponse(chunks, sourceFormat) {
|
|
231
|
-
if (!chunks || chunks.length === 0) {
|
|
232
|
-
return createOpenAIResponse("unknown");
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
// For most formats, the last chunk before done contains the complete response
|
|
236
|
-
// Find the most complete chunk (usually the last one with content)
|
|
237
|
-
let finalChunk = chunks[chunks.length - 1];
|
|
238
|
-
|
|
239
|
-
// For Claude format, find the message_stop or final message
|
|
240
|
-
if (sourceFormat === FORMATS.CLAUDE) {
|
|
241
|
-
const messageStop = chunks.find(c => c.type === "message_stop");
|
|
242
|
-
if (messageStop) {
|
|
243
|
-
// Reconstruct complete message from chunks
|
|
244
|
-
const contentDelta = chunks.find(c => c.type === "content_block_delta");
|
|
245
|
-
const messageDelta = chunks.find(c => c.type === "message_delta");
|
|
246
|
-
const messageStart = chunks.find(c => c.type === "message_start");
|
|
247
|
-
|
|
248
|
-
if (messageStart?.message) {
|
|
249
|
-
finalChunk = messageStart.message;
|
|
250
|
-
// Merge usage if available
|
|
251
|
-
if (messageDelta?.usage) {
|
|
252
|
-
finalChunk.usage = messageDelta.usage;
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
return finalChunk;
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
/**
|
|
262
|
-
* Create OpenAI streaming chunks from complete response
|
|
263
|
-
*/
|
|
264
|
-
function createOpenAIStreamingChunks(completeResponse) {
|
|
265
|
-
const { id, created, model, choices } = completeResponse;
|
|
266
|
-
const content = choices[0].message.content;
|
|
267
|
-
|
|
268
|
-
return [
|
|
269
|
-
// Chunk with content
|
|
270
|
-
{
|
|
271
|
-
id,
|
|
272
|
-
object: "chat.completion.chunk",
|
|
273
|
-
created,
|
|
274
|
-
model,
|
|
275
|
-
choices: [{
|
|
276
|
-
index: 0,
|
|
277
|
-
delta: {
|
|
278
|
-
role: "assistant",
|
|
279
|
-
content
|
|
280
|
-
},
|
|
281
|
-
finish_reason: null
|
|
282
|
-
}]
|
|
283
|
-
},
|
|
284
|
-
// Final chunk with finish_reason
|
|
285
|
-
{
|
|
286
|
-
id,
|
|
287
|
-
object: "chat.completion.chunk",
|
|
288
|
-
created,
|
|
289
|
-
model,
|
|
290
|
-
choices: [{
|
|
291
|
-
index: 0,
|
|
292
|
-
delta: {},
|
|
293
|
-
finish_reason: "stop"
|
|
294
|
-
}],
|
|
295
|
-
usage: completeResponse.usage
|
|
296
|
-
}
|
|
297
|
-
];
|
|
298
|
-
}
|
|
@@ -1,189 +0,0 @@
|
|
|
1
|
-
const DETERMINISTIC_STRATEGIES = /* @__PURE__ */ new Set(["priority", "cost-optimized"]);
|
|
2
|
-
const CACHING_PROVIDERS = /* @__PURE__ */ new Set([
|
|
3
|
-
"claude",
|
|
4
|
-
"anthropic",
|
|
5
|
-
"zai",
|
|
6
|
-
"qwen",
|
|
7
|
-
"deepseek",
|
|
8
|
-
// #3088 — Xiaomi MiMo honors OpenAI-format cache_control breakpoints. Without
|
|
9
|
-
// this entry, shouldPreserveCacheControl() returns false for Claude Code
|
|
10
|
-
// clients and filterToOpenAIFormat() strips cache_control, so Xiaomi never
|
|
11
|
-
// sees the cache hints and every request is a cache miss.
|
|
12
|
-
"xiaomi-mimo",
|
|
13
|
-
// #3955 — OpenAI / Codex / Azure-OpenAI use AUTOMATIC prefix caching: the longest
|
|
14
|
-
// matching prefix of a request is cached upstream WITHOUT any explicit cache_control
|
|
15
|
-
// markers. They must count as caching providers so the cache-aware compression guard
|
|
16
|
-
// preserves the cacheable prefix (system prompt / earliest messages) instead of
|
|
17
|
-
// rewriting it and forcing a cache miss. This also activates the intended
|
|
18
|
-
// `prompt_cache_key` cache-routing hint for OpenAI in chatCore.
|
|
19
|
-
"openai",
|
|
20
|
-
"codex",
|
|
21
|
-
"azure",
|
|
22
|
-
// #2069 — Alibaba DashScope's OpenAI-compatible endpoints (alibaba /
|
|
23
|
-
// alibaba-cn, upstream "alicode"/"alicode-intl") natively honor
|
|
24
|
-
// `cache_control: {type:"ephemeral"}` breakpoints. Without these entries
|
|
25
|
-
// shouldPreserveCacheControl() returns false for Claude Code clients and the
|
|
26
|
-
// OpenAI-format translator strips cache_control, so DashScope never sees the
|
|
27
|
-
// hints and every request is a cache miss.
|
|
28
|
-
"alibaba",
|
|
29
|
-
"alibaba-cn"
|
|
30
|
-
]);
|
|
31
|
-
const OPENAI_FORMAT_CACHE_CONTROL_PROVIDERS = /* @__PURE__ */ new Set([
|
|
32
|
-
// #2069 — DashScope OpenAI-compatible endpoints accept ephemeral breakpoints.
|
|
33
|
-
"alibaba",
|
|
34
|
-
"alibaba-cn",
|
|
35
|
-
// #3088 — Xiaomi MiMo honors OpenAI-format cache_control breakpoints.
|
|
36
|
-
"xiaomi-mimo"
|
|
37
|
-
]);
|
|
38
|
-
function providerHonorsOpenAIFormatCacheControl(provider) {
|
|
39
|
-
if (!provider) return false;
|
|
40
|
-
return OPENAI_FORMAT_CACHE_CONTROL_PROVIDERS.has(provider.toLowerCase());
|
|
41
|
-
}
|
|
42
|
-
function isClaudeCodeClient(userAgent) {
|
|
43
|
-
if (!userAgent) return false;
|
|
44
|
-
const ua = userAgent.toLowerCase();
|
|
45
|
-
if (ua.includes("claude-code") || ua.includes("claude_code")) return true;
|
|
46
|
-
if (ua.includes("claude-cli/")) return true;
|
|
47
|
-
if (ua.includes("sdk-cli")) return true;
|
|
48
|
-
if (ua.includes("anthropic") && ua.includes("cli")) return true;
|
|
49
|
-
return false;
|
|
50
|
-
}
|
|
51
|
-
function providerSupportsCaching(provider, targetFormat) {
|
|
52
|
-
if (!provider) return false;
|
|
53
|
-
if (CACHING_PROVIDERS.has(provider.toLowerCase())) return true;
|
|
54
|
-
if (targetFormat === "claude") return true;
|
|
55
|
-
return false;
|
|
56
|
-
}
|
|
57
|
-
function isDeterministicStrategy(strategy) {
|
|
58
|
-
if (!strategy) return false;
|
|
59
|
-
return DETERMINISTIC_STRATEGIES.has(strategy);
|
|
60
|
-
}
|
|
61
|
-
function shouldPreserveCacheControl({
|
|
62
|
-
userAgent,
|
|
63
|
-
isCombo,
|
|
64
|
-
comboStrategy,
|
|
65
|
-
targetProvider,
|
|
66
|
-
targetFormat,
|
|
67
|
-
settings
|
|
68
|
-
}) {
|
|
69
|
-
if (settings?.alwaysPreserveClientCache === "always") {
|
|
70
|
-
return true;
|
|
71
|
-
}
|
|
72
|
-
if (settings?.alwaysPreserveClientCache === "never") {
|
|
73
|
-
return false;
|
|
74
|
-
}
|
|
75
|
-
if (!isClaudeCodeClient(userAgent)) {
|
|
76
|
-
return false;
|
|
77
|
-
}
|
|
78
|
-
if (!providerSupportsCaching(targetProvider, targetFormat)) {
|
|
79
|
-
return false;
|
|
80
|
-
}
|
|
81
|
-
if (!isCombo) {
|
|
82
|
-
return true;
|
|
83
|
-
}
|
|
84
|
-
return isDeterministicStrategy(comboStrategy);
|
|
85
|
-
}
|
|
86
|
-
function trackCacheMetrics({
|
|
87
|
-
preserved,
|
|
88
|
-
provider,
|
|
89
|
-
strategy,
|
|
90
|
-
metrics,
|
|
91
|
-
inputTokens,
|
|
92
|
-
cachedTokens,
|
|
93
|
-
cacheCreationTokens
|
|
94
|
-
}) {
|
|
95
|
-
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
96
|
-
if (!metrics) {
|
|
97
|
-
metrics = {
|
|
98
|
-
totalRequests: 0,
|
|
99
|
-
requestsWithCacheControl: 0,
|
|
100
|
-
totalInputTokens: 0,
|
|
101
|
-
totalCachedTokens: 0,
|
|
102
|
-
totalCacheCreationTokens: 0,
|
|
103
|
-
tokensSaved: 0,
|
|
104
|
-
estimatedCostSaved: 0,
|
|
105
|
-
byProvider: {},
|
|
106
|
-
byStrategy: {},
|
|
107
|
-
lastUpdated: now
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
metrics.totalRequests++;
|
|
111
|
-
const input = inputTokens || 0;
|
|
112
|
-
const cached = cachedTokens || 0;
|
|
113
|
-
const creation = cacheCreationTokens || 0;
|
|
114
|
-
metrics.totalInputTokens += input;
|
|
115
|
-
metrics.totalCachedTokens += cached;
|
|
116
|
-
metrics.totalCacheCreationTokens += creation;
|
|
117
|
-
if (cached > 0) {
|
|
118
|
-
metrics.tokensSaved += cached;
|
|
119
|
-
}
|
|
120
|
-
if (preserved) {
|
|
121
|
-
metrics.requestsWithCacheControl++;
|
|
122
|
-
if (!metrics.byProvider[provider]) {
|
|
123
|
-
metrics.byProvider[provider] = {
|
|
124
|
-
requests: 0,
|
|
125
|
-
inputTokens: 0,
|
|
126
|
-
cachedTokens: 0,
|
|
127
|
-
cacheCreationTokens: 0
|
|
128
|
-
};
|
|
129
|
-
}
|
|
130
|
-
metrics.byProvider[provider].requests++;
|
|
131
|
-
metrics.byProvider[provider].inputTokens += input;
|
|
132
|
-
metrics.byProvider[provider].cachedTokens += cached;
|
|
133
|
-
metrics.byProvider[provider].cacheCreationTokens += creation;
|
|
134
|
-
if (strategy && !metrics.byStrategy[strategy]) {
|
|
135
|
-
metrics.byStrategy[strategy] = {
|
|
136
|
-
requests: 0,
|
|
137
|
-
inputTokens: 0,
|
|
138
|
-
cachedTokens: 0,
|
|
139
|
-
cacheCreationTokens: 0
|
|
140
|
-
};
|
|
141
|
-
}
|
|
142
|
-
if (strategy) {
|
|
143
|
-
metrics.byStrategy[strategy].requests++;
|
|
144
|
-
metrics.byStrategy[strategy].inputTokens += input;
|
|
145
|
-
metrics.byStrategy[strategy].cachedTokens += cached;
|
|
146
|
-
metrics.byStrategy[strategy].cacheCreationTokens += creation;
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
metrics.lastUpdated = now;
|
|
150
|
-
return metrics;
|
|
151
|
-
}
|
|
152
|
-
function updateCacheTokenMetrics({
|
|
153
|
-
metrics,
|
|
154
|
-
provider,
|
|
155
|
-
strategy,
|
|
156
|
-
inputTokens,
|
|
157
|
-
cachedTokens,
|
|
158
|
-
cacheCreationTokens,
|
|
159
|
-
costSaved
|
|
160
|
-
}) {
|
|
161
|
-
metrics.totalCachedTokens += cachedTokens;
|
|
162
|
-
metrics.totalCacheCreationTokens += cacheCreationTokens;
|
|
163
|
-
metrics.totalInputTokens += inputTokens;
|
|
164
|
-
metrics.tokensSaved += cachedTokens;
|
|
165
|
-
if (costSaved !== void 0) {
|
|
166
|
-
metrics.estimatedCostSaved += costSaved;
|
|
167
|
-
}
|
|
168
|
-
if (metrics.byProvider[provider]) {
|
|
169
|
-
metrics.byProvider[provider].cachedTokens += cachedTokens;
|
|
170
|
-
metrics.byProvider[provider].cacheCreationTokens += cacheCreationTokens;
|
|
171
|
-
metrics.byProvider[provider].inputTokens += inputTokens;
|
|
172
|
-
}
|
|
173
|
-
if (strategy && metrics.byStrategy[strategy]) {
|
|
174
|
-
metrics.byStrategy[strategy].cachedTokens += cachedTokens;
|
|
175
|
-
metrics.byStrategy[strategy].cacheCreationTokens += cacheCreationTokens;
|
|
176
|
-
metrics.byStrategy[strategy].inputTokens += inputTokens;
|
|
177
|
-
}
|
|
178
|
-
metrics.lastUpdated = (/* @__PURE__ */ new Date()).toISOString();
|
|
179
|
-
return metrics;
|
|
180
|
-
}
|
|
181
|
-
export {
|
|
182
|
-
isClaudeCodeClient,
|
|
183
|
-
isDeterministicStrategy,
|
|
184
|
-
providerHonorsOpenAIFormatCacheControl,
|
|
185
|
-
providerSupportsCaching,
|
|
186
|
-
shouldPreserveCacheControl,
|
|
187
|
-
trackCacheMetrics,
|
|
188
|
-
updateCacheTokenMetrics
|
|
189
|
-
};
|
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
import { createHash, randomBytes, randomUUID } from "crypto";
|
|
2
|
-
import { CLAUDE_TOOL_SUFFIX, CC_DEFAULT_TOOLS } from "../config/appConstants.js";
|
|
3
|
-
|
|
4
|
-
const CLAUDE_VERSION = "2.1.92";
|
|
5
|
-
const CC_ENTRYPOINT = "sdk-cli";
|
|
6
|
-
|
|
7
|
-
// Generate billing header matching real Claude Code 2.1.92+ format:
|
|
8
|
-
// x-anthropic-billing-header: cc_version=<ver>.<build>; cc_entrypoint=sdk-cli; cch=<hash>;
|
|
9
|
-
function generateBillingHeader(payload) {
|
|
10
|
-
const content = JSON.stringify(payload);
|
|
11
|
-
const cch = createHash("sha256").update(content).digest("hex").slice(0, 5);
|
|
12
|
-
const buildHash = randomBytes(2).toString("hex").slice(0, 3);
|
|
13
|
-
return `x-anthropic-billing-header: cc_version=${CLAUDE_VERSION}.${buildHash}; cc_entrypoint=${CC_ENTRYPOINT}; cch=${cch};`;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
// Generate fake user ID in Claude Code 2.1.92+ JSON format:
|
|
17
|
-
// {"device_id":"<64hex>","account_uuid":"<uuid>","session_id":"<uuid>"}
|
|
18
|
-
function generateFakeUserID(sessionId) {
|
|
19
|
-
const deviceId = randomBytes(32).toString("hex");
|
|
20
|
-
const accountUuid = randomUUID();
|
|
21
|
-
const sessionUuid = sessionId || randomUUID();
|
|
22
|
-
return `{"device_id":"${deviceId}","account_uuid":"${accountUuid}","session_id":"${sessionUuid}"}`;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Cloak tools before sending to Claude provider (anti-ban):
|
|
27
|
-
* - Rename non-CC client tools with _cc suffix in tools[] and messages[]
|
|
28
|
-
* - Skip tools that are already CC default names (they become decoys as-is)
|
|
29
|
-
* - Inject CC_DECOY_TOOLS after client tools
|
|
30
|
-
* Returns { body, toolNameMap } where toolNameMap maps suffixed → original
|
|
31
|
-
* @param {object} body - Claude API request body
|
|
32
|
-
* @returns {{ body: object, toolNameMap: Map|null }}
|
|
33
|
-
*/
|
|
34
|
-
export function cloakClaudeTools(body) {
|
|
35
|
-
const tools = body.tools;
|
|
36
|
-
if (!tools || tools.length === 0) return { body, toolNameMap: null };
|
|
37
|
-
|
|
38
|
-
const suffix = (name) => `${name}${CLAUDE_TOOL_SUFFIX}`;
|
|
39
|
-
const toolNameMap = new Map();
|
|
40
|
-
const clientToolNames = new Set();
|
|
41
|
-
const clientDeclarations = [];
|
|
42
|
-
|
|
43
|
-
// All client tools get renamed with suffix
|
|
44
|
-
for (const tool of tools) {
|
|
45
|
-
const suffixed = suffix(tool.name);
|
|
46
|
-
toolNameMap.set(suffixed, tool.name);
|
|
47
|
-
clientToolNames.add(tool.name);
|
|
48
|
-
clientDeclarations.push({ ...tool, name: suffixed });
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
// Client tools first, then CC decoy tools (no overlap: client tools all have _cc suffix)
|
|
52
|
-
const allTools = [...clientDeclarations, ...CC_DECOY_TOOLS];
|
|
53
|
-
|
|
54
|
-
// Rename tool_use in message history (all client tools get suffix)
|
|
55
|
-
const renamedMessages = body.messages?.map(msg => {
|
|
56
|
-
if (!Array.isArray(msg.content)) return msg;
|
|
57
|
-
const renamedContent = msg.content.map(block =>
|
|
58
|
-
block.type === "tool_use" ? { ...block, name: suffix(block.name) } : block
|
|
59
|
-
);
|
|
60
|
-
return { ...msg, content: renamedContent };
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
const cloakedBody = { ...body, tools: allTools, messages: renamedMessages || body.messages };
|
|
64
|
-
|
|
65
|
-
// A forced tool_choice ({ type: "tool", name }) must point at the suffixed
|
|
66
|
-
// tool name, otherwise Claude rejects it: "Tool '<name>' not found in provided tools".
|
|
67
|
-
// Only rewrite when the choice targets one of the client tools we actually
|
|
68
|
-
// renamed — never a decoy/built-in name (those are sent unsuffixed).
|
|
69
|
-
if (
|
|
70
|
-
body.tool_choice?.type === "tool" &&
|
|
71
|
-
clientToolNames.has(body.tool_choice.name)
|
|
72
|
-
) {
|
|
73
|
-
cloakedBody.tool_choice = { ...body.tool_choice, name: suffix(body.tool_choice.name) };
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
return {
|
|
77
|
-
body: cloakedBody,
|
|
78
|
-
toolNameMap: toolNameMap.size > 0 ? toolNameMap : null
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
// Decloak tool_use names in non-streaming Claude response body (INPUT side)
|
|
83
|
-
export function decloakToolNames(body, toolNameMap) {
|
|
84
|
-
if (!toolNameMap?.size || !Array.isArray(body?.content)) return body;
|
|
85
|
-
const content = body.content.map(block => {
|
|
86
|
-
if (block?.type === "tool_use" && toolNameMap.has(block.name)) {
|
|
87
|
-
return { ...block, name: toolNameMap.get(block.name) };
|
|
88
|
-
}
|
|
89
|
-
return block;
|
|
90
|
-
});
|
|
91
|
-
return { ...body, content };
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
// CC decoy tools — Claude Code native tool names, marked unavailable
|
|
95
|
-
const CC_DECOY_TOOLS = [
|
|
96
|
-
{ name: "Task", description: "This tool is currently unavailable.", input_schema: { type: "object", properties: {} } },
|
|
97
|
-
{ name: "TaskOutput", description: "This tool is currently unavailable.", input_schema: { type: "object", properties: {} } },
|
|
98
|
-
{ name: "TaskStop", description: "This tool is currently unavailable.", input_schema: { type: "object", properties: {} } },
|
|
99
|
-
{ name: "TaskCreate", description: "This tool is currently unavailable.", input_schema: { type: "object", properties: {} } },
|
|
100
|
-
{ name: "TaskGet", description: "This tool is currently unavailable.", input_schema: { type: "object", properties: {} } },
|
|
101
|
-
{ name: "TaskUpdate", description: "This tool is currently unavailable.", input_schema: { type: "object", properties: {} } },
|
|
102
|
-
{ name: "TaskList", description: "This tool is currently unavailable.", input_schema: { type: "object", properties: {} } },
|
|
103
|
-
{ name: "Bash", description: "This tool is currently unavailable.", input_schema: { type: "object", properties: {} } },
|
|
104
|
-
{ name: "Glob", description: "This tool is currently unavailable.", input_schema: { type: "object", properties: {} } },
|
|
105
|
-
{ name: "Grep", description: "This tool is currently unavailable.", input_schema: { type: "object", properties: {} } },
|
|
106
|
-
{ name: "Read", description: "This tool is currently unavailable.", input_schema: { type: "object", properties: {} } },
|
|
107
|
-
{ name: "Edit", description: "This tool is currently unavailable.", input_schema: { type: "object", properties: {} } },
|
|
108
|
-
{ name: "Write", description: "This tool is currently unavailable.", input_schema: { type: "object", properties: {} } },
|
|
109
|
-
{ name: "NotebookEdit", description: "This tool is currently unavailable.", input_schema: { type: "object", properties: {} } },
|
|
110
|
-
{ name: "WebFetch", description: "This tool is currently unavailable.", input_schema: { type: "object", properties: {} } },
|
|
111
|
-
{ name: "WebSearch", description: "This tool is currently unavailable.", input_schema: { type: "object", properties: {} } },
|
|
112
|
-
{ name: "AskUserQuestion", description: "This tool is currently unavailable.", input_schema: { type: "object", properties: {} } },
|
|
113
|
-
{ name: "Skill", description: "This tool is currently unavailable.", input_schema: { type: "object", properties: {} } },
|
|
114
|
-
{ name: "EnterPlanMode", description: "This tool is currently unavailable.", input_schema: { type: "object", properties: {} } },
|
|
115
|
-
{ name: "ExitPlanMode", description: "This tool is currently unavailable.", input_schema: { type: "object", properties: {} } },
|
|
116
|
-
];
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* Apply Claude cloaking to request body:
|
|
120
|
-
* 1. Inject billing header as first system block
|
|
121
|
-
* 2. Inject fake user ID into metadata (JSON format, session_id aligned with X-Claude-Code-Session-Id)
|
|
122
|
-
* Only applies when using OAuth token (sk-ant-oat).
|
|
123
|
-
* @param {object} body - Claude API request body
|
|
124
|
-
* @param {string} apiKey - API key or OAuth token
|
|
125
|
-
* @param {string} [sessionId] - Session ID to align with X-Claude-Code-Session-Id header
|
|
126
|
-
* @returns {object} Modified body
|
|
127
|
-
*/
|
|
128
|
-
export function applyCloaking(body, apiKey, sessionId) {
|
|
129
|
-
if (!apiKey || !apiKey.includes("sk-ant-oat")) return body;
|
|
130
|
-
|
|
131
|
-
const result = { ...body };
|
|
132
|
-
|
|
133
|
-
// Inject billing header as system[0], preserve existing system blocks
|
|
134
|
-
const billingText = generateBillingHeader(body);
|
|
135
|
-
const billingBlock = { type: "text", text: billingText };
|
|
136
|
-
|
|
137
|
-
if (Array.isArray(result.system)) {
|
|
138
|
-
// Skip if already injected
|
|
139
|
-
if (!result.system[0]?.text?.startsWith("x-anthropic-billing-header:")) {
|
|
140
|
-
result.system = [billingBlock, ...result.system];
|
|
141
|
-
}
|
|
142
|
-
} else if (typeof result.system === "string") {
|
|
143
|
-
result.system = [billingBlock, { type: "text", text: result.system }];
|
|
144
|
-
} else {
|
|
145
|
-
result.system = [billingBlock];
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
// Inject fake user ID into metadata (session_id must match X-Claude-Code-Session-Id)
|
|
149
|
-
const existingUserId = result.metadata?.user_id;
|
|
150
|
-
if (!existingUserId) {
|
|
151
|
-
result.metadata = { ...result.metadata, user_id: generateFakeUserID(sessionId) };
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
return result;
|
|
155
|
-
}
|