@fudrouter/fsrouter 0.6.59 → 0.6.60
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/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,448 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* QoderExecutor — sends OpenAI-format chat requests to Qoder's COSY-signed
|
|
3
|
-
* inference endpoint at api3.qoder.sh, then unwraps Qoder's `{statusCodeValue,
|
|
4
|
-
* body}` SSE envelope back into plain OpenAI SSE for the rest of the pipeline.
|
|
5
|
-
*
|
|
6
|
-
* Differences vs the previous placeholder:
|
|
7
|
-
* - URL is api3.qoder.sh/algo/api/v2/service/pro/sse/agent_chat_generation
|
|
8
|
-
* with `&Encode=1` so we can ship the body through the WAF-bypass
|
|
9
|
-
* encoder.
|
|
10
|
-
* - Authentication is COSY (RSA + AES + MD5 + ~17 Cosy-* headers), not
|
|
11
|
-
* a static HMAC.
|
|
12
|
-
* - The request shape Qoder expects is non-trivial (chat_context with
|
|
13
|
-
* mirrored modelConfig, business block with stable IDs, system text
|
|
14
|
-
* hoisted out of the messages array). All ported from the reference.
|
|
15
|
-
* - Model identifier is one of the canonical Qoder keys (auto / ultimate /
|
|
16
|
-
* performance / efficient / lite + frontier "*model" ids); the
|
|
17
|
-
* translator layer feeds us "qoder/<key>" so we strip the prefix.
|
|
18
|
-
* - Per-model `model_config` is fetched live from /algo/api/v2/model/list
|
|
19
|
-
* and cached. Sending the wrong block silently downgrades to a
|
|
20
|
-
* different model upstream, so a missing entry is a hard error.
|
|
21
|
-
*/
|
|
22
|
-
|
|
23
|
-
import { qoderEncodeBody } from '../../dist/lib/qoder/encoding.js';
|
|
24
|
-
import { buildCosyHeaders } from '../../dist/lib/qoder/cosy.js';
|
|
25
|
-
import { v4 as uuidv4 } from "uuid";
|
|
26
|
-
import { createHash } from "crypto";
|
|
27
|
-
|
|
28
|
-
import { BaseExecutor } from "./base.js";
|
|
29
|
-
import { PROVIDERS } from "../config/providers.js";
|
|
30
|
-
import { proxyAwareFetch } from "../utils/proxyFetch.js";
|
|
31
|
-
import {
|
|
32
|
-
QODER_CHAT_URL_ENCODED,
|
|
33
|
-
QODER_MODEL_MAP,
|
|
34
|
-
} from '../../dist/lib/qoder/constants.js';
|
|
35
|
-
import { getQoderModelConfig, resolveQoderModels } from "../services/qoderModels.js";
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Hoist role:"system" messages out of the messages array (Qoder rejects
|
|
39
|
-
* system in messages) and flatten any multipart content arrays.
|
|
40
|
-
*/
|
|
41
|
-
function normalizeMessages(messages) {
|
|
42
|
-
if (!Array.isArray(messages) || messages.length === 0) {
|
|
43
|
-
return { messages: [], systemText: "" };
|
|
44
|
-
}
|
|
45
|
-
const systemParts = [];
|
|
46
|
-
const out = [];
|
|
47
|
-
for (const msg of messages) {
|
|
48
|
-
if (!msg || typeof msg !== "object") continue;
|
|
49
|
-
const text = extractText(msg.content);
|
|
50
|
-
if (msg.role === "system") {
|
|
51
|
-
if (text) systemParts.push(text);
|
|
52
|
-
continue;
|
|
53
|
-
}
|
|
54
|
-
const cloned = { ...msg };
|
|
55
|
-
cloned.content = text;
|
|
56
|
-
out.push(cloned);
|
|
57
|
-
}
|
|
58
|
-
return { messages: out, systemText: systemParts.join("\n\n") };
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
function extractText(content) {
|
|
62
|
-
if (typeof content === "string") return content;
|
|
63
|
-
if (content == null) return "";
|
|
64
|
-
if (Array.isArray(content)) {
|
|
65
|
-
const parts = [];
|
|
66
|
-
for (const item of content) {
|
|
67
|
-
if (item && typeof item === "object") {
|
|
68
|
-
if (item.type === "text" && typeof item.text === "string") {
|
|
69
|
-
parts.push(item.text);
|
|
70
|
-
} else if (typeof item.text === "string") {
|
|
71
|
-
parts.push(item.text);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
return parts.join("\n");
|
|
76
|
-
}
|
|
77
|
-
return String(content);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
function lastUserText(messages) {
|
|
81
|
-
for (let i = messages.length - 1; i >= 0; i--) {
|
|
82
|
-
const m = messages[i];
|
|
83
|
-
if (m?.role === "user" && typeof m.content === "string") {
|
|
84
|
-
return m.content;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
return "";
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
function stableHash(prefix, ...parts) {
|
|
91
|
-
const h = createHash("sha256");
|
|
92
|
-
h.update(prefix);
|
|
93
|
-
for (const p of parts) {
|
|
94
|
-
h.update("\0");
|
|
95
|
-
h.update(String(p ?? ""));
|
|
96
|
-
}
|
|
97
|
-
return h.digest("hex").slice(0, 16);
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
function stableChatRecordId(model, messages, tools, maxTokens) {
|
|
101
|
-
const h = createHash("sha256");
|
|
102
|
-
h.update("qoder-record\0");
|
|
103
|
-
h.update(String(model));
|
|
104
|
-
for (const m of messages) {
|
|
105
|
-
if (!m || typeof m !== "object") continue;
|
|
106
|
-
if (m.role) { h.update("\0"); h.update(m.role); }
|
|
107
|
-
if (typeof m.content === "string" && m.content) {
|
|
108
|
-
h.update("\0"); h.update(m.content);
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
if (tools) {
|
|
112
|
-
h.update("\0");
|
|
113
|
-
try { h.update(JSON.stringify(tools)); } catch {}
|
|
114
|
-
}
|
|
115
|
-
h.update(`\0mt=${maxTokens}`);
|
|
116
|
-
return h.digest("hex").slice(0, 16);
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
function truncate(s, n) {
|
|
120
|
-
return s && s.length > n ? `${s.slice(0, n)}...` : s || "";
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
/**
|
|
124
|
-
* Map the OpenAI-style request body into the exact shape Qoder expects.
|
|
125
|
-
*/
|
|
126
|
-
async function buildQoderRequestBody({ model, body, credentials, log, proxyOptions, signal }) {
|
|
127
|
-
const qoderKey = String(model || "").replace(/^(qoder|qd)\//, "");
|
|
128
|
-
|
|
129
|
-
// Fetch model config from dynamic API instead of relying on static QODER_MODEL_MAP.
|
|
130
|
-
// This allows support for new Qoder models (e.g., qmodel_latest) without code changes.
|
|
131
|
-
let modelConfig = await getQoderModelConfig(credentials, qoderKey, { log, proxyOptions, signal });
|
|
132
|
-
if (!modelConfig) {
|
|
133
|
-
// Try a forced refresh once before giving up — the cache may simply
|
|
134
|
-
// not be populated yet on first ever call for this credential.
|
|
135
|
-
const refreshed = await resolveQoderModels(credentials, { forceRefresh: true, log, proxyOptions, signal });
|
|
136
|
-
const retried = refreshed?.rawConfigs.get(qoderKey);
|
|
137
|
-
if (!retried) {
|
|
138
|
-
throw new Error(
|
|
139
|
-
`qoder: model_config for "${qoderKey}" not yet known (run a model list fetch or check upstream connectivity)`,
|
|
140
|
-
);
|
|
141
|
-
}
|
|
142
|
-
modelConfig = { ...retried, key: qoderKey };
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
const { messages, systemText } = normalizeMessages(body.messages || []);
|
|
146
|
-
const tools = body.tools;
|
|
147
|
-
const isReasoning = !!modelConfig.is_reasoning;
|
|
148
|
-
const maxOutputTokens = Number(modelConfig.max_output_tokens) || 0;
|
|
149
|
-
|
|
150
|
-
let maxTokens = 32_768;
|
|
151
|
-
if (maxOutputTokens > 0) maxTokens = maxOutputTokens;
|
|
152
|
-
if (typeof body.max_tokens === "number" && body.max_tokens > 0 && body.max_tokens < maxTokens) {
|
|
153
|
-
maxTokens = body.max_tokens;
|
|
154
|
-
}
|
|
155
|
-
if (typeof body.max_completion_tokens === "number" && body.max_completion_tokens > 0 && body.max_completion_tokens < maxTokens) {
|
|
156
|
-
maxTokens = body.max_completion_tokens;
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
const lastUser = lastUserText(messages);
|
|
160
|
-
const psd = credentials.providerSpecificData || {};
|
|
161
|
-
const sessionId = stableHash("qoder-session", psd.userId, qoderKey);
|
|
162
|
-
const recordId = stableChatRecordId(qoderKey, messages, tools, maxTokens);
|
|
163
|
-
|
|
164
|
-
return {
|
|
165
|
-
qoderKey,
|
|
166
|
-
payload: {
|
|
167
|
-
request_id: uuidv4(),
|
|
168
|
-
request_set_id: recordId,
|
|
169
|
-
chat_record_id: recordId,
|
|
170
|
-
session_id: sessionId,
|
|
171
|
-
stream: true,
|
|
172
|
-
chat_task: "FREE_INPUT",
|
|
173
|
-
is_reply: true,
|
|
174
|
-
is_retry: false,
|
|
175
|
-
source: 1,
|
|
176
|
-
version: "3",
|
|
177
|
-
session_type: "qodercli",
|
|
178
|
-
agent_id: "agent_common",
|
|
179
|
-
task_id: "common",
|
|
180
|
-
code_language: "",
|
|
181
|
-
chat_prompt: "",
|
|
182
|
-
image_urls: null,
|
|
183
|
-
aliyun_user_type: "",
|
|
184
|
-
system: systemText,
|
|
185
|
-
messages,
|
|
186
|
-
tools: Array.isArray(tools) ? tools : [],
|
|
187
|
-
parameters: { max_tokens: maxTokens },
|
|
188
|
-
chat_context: {
|
|
189
|
-
chatPrompt: "",
|
|
190
|
-
imageUrls: null,
|
|
191
|
-
extra: {
|
|
192
|
-
context: [],
|
|
193
|
-
modelConfig: { key: qoderKey, is_reasoning: isReasoning },
|
|
194
|
-
originalContent: lastUser,
|
|
195
|
-
},
|
|
196
|
-
features: [],
|
|
197
|
-
text: lastUser,
|
|
198
|
-
},
|
|
199
|
-
model_config: modelConfig,
|
|
200
|
-
business: {
|
|
201
|
-
product: "cli",
|
|
202
|
-
version: "1.0.0",
|
|
203
|
-
type: "agent",
|
|
204
|
-
stage: "start",
|
|
205
|
-
id: uuidv4(),
|
|
206
|
-
name: truncate(lastUser, 30),
|
|
207
|
-
begin_at: Date.now(),
|
|
208
|
-
},
|
|
209
|
-
},
|
|
210
|
-
modelConfig,
|
|
211
|
-
};
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
/**
|
|
215
|
-
* Wrap the upstream's `{statusCodeValue, body}` SSE envelope into plain
|
|
216
|
-
* OpenAI SSE chunks the rest of the chatCore pipeline understands.
|
|
217
|
-
*
|
|
218
|
-
* Each upstream line looks like:
|
|
219
|
-
* data: {"statusCodeValue":200,"body":"{\"choices\":[{\"delta\":{...}}]}"}
|
|
220
|
-
* The inner body is an OpenAI streaming chunk (or "[DONE]"). We unwrap it
|
|
221
|
-
* and re-emit as `data: <inner>\n\n`. Errors become `data: [DONE]\n\n` plus
|
|
222
|
-
* a synthetic OpenAI error chunk.
|
|
223
|
-
*/
|
|
224
|
-
function wrapQoderSSE(response, model) {
|
|
225
|
-
if (!response.ok || !response.body) return response;
|
|
226
|
-
|
|
227
|
-
const decoder = new TextDecoder();
|
|
228
|
-
const encoder = new TextEncoder();
|
|
229
|
-
let buffer = "";
|
|
230
|
-
let doneEmitted = false;
|
|
231
|
-
|
|
232
|
-
// Process one already-extracted SSE line (no trailing newline). Returns
|
|
233
|
-
// false when the line indicated end-of-stream so the caller can stop
|
|
234
|
-
// forwarding any remaining chunks after [DONE].
|
|
235
|
-
const processLine = (line, controller) => {
|
|
236
|
-
const trimmed = line.replace(/\r$/, "").trim();
|
|
237
|
-
if (!trimmed) return;
|
|
238
|
-
if (!trimmed.startsWith("data:")) return;
|
|
239
|
-
if (doneEmitted) return; // never forward chunks past stream end
|
|
240
|
-
|
|
241
|
-
const data = trimmed.slice(5).trimStart();
|
|
242
|
-
if (data === "[DONE]") {
|
|
243
|
-
controller.enqueue(encoder.encode("data: [DONE]\n\n"));
|
|
244
|
-
doneEmitted = true;
|
|
245
|
-
try { controller.terminate(); } catch {}
|
|
246
|
-
return;
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
let envelope;
|
|
250
|
-
try { envelope = JSON.parse(data); } catch { return; }
|
|
251
|
-
const statusVal = typeof envelope.statusCodeValue === "number" ? envelope.statusCodeValue : 200;
|
|
252
|
-
const inner = typeof envelope.body === "string" ? envelope.body : "";
|
|
253
|
-
if (statusVal !== 200) {
|
|
254
|
-
const msg = inner || `upstream status ${statusVal}`;
|
|
255
|
-
const errChunk = JSON.stringify({
|
|
256
|
-
id: `qoder-error-${Date.now()}`,
|
|
257
|
-
object: "chat.completion.chunk",
|
|
258
|
-
created: Math.floor(Date.now() / 1000),
|
|
259
|
-
model,
|
|
260
|
-
choices: [{ index: 0, delta: { content: `\n[qoder error ${statusVal}: ${truncate(msg, 200)}]` }, finish_reason: "stop" }],
|
|
261
|
-
});
|
|
262
|
-
controller.enqueue(encoder.encode(`data: ${errChunk}\n\n`));
|
|
263
|
-
controller.enqueue(encoder.encode("data: [DONE]\n\n"));
|
|
264
|
-
doneEmitted = true;
|
|
265
|
-
try { controller.terminate(); } catch {}
|
|
266
|
-
return;
|
|
267
|
-
}
|
|
268
|
-
if (!inner) return;
|
|
269
|
-
if (inner === "[DONE]") {
|
|
270
|
-
controller.enqueue(encoder.encode("data: [DONE]\n\n"));
|
|
271
|
-
doneEmitted = true;
|
|
272
|
-
try { controller.terminate(); } catch {}
|
|
273
|
-
return;
|
|
274
|
-
}
|
|
275
|
-
// Inner is an OpenAI-shaped chunk. Strip any embedded newlines so the
|
|
276
|
-
// SSE frame stays a single event (a literal "\n" inside `inner` would
|
|
277
|
-
// otherwise split the frame across multiple data: lines and downstream
|
|
278
|
-
// parsers would reassemble them as separate events).
|
|
279
|
-
const sanitized = inner.replace(/\r?\n/g, "");
|
|
280
|
-
controller.enqueue(encoder.encode(`data: ${sanitized}\n\n`));
|
|
281
|
-
};
|
|
282
|
-
|
|
283
|
-
const transform = new TransformStream({
|
|
284
|
-
transform(chunk, controller) {
|
|
285
|
-
buffer += decoder.decode(chunk, { stream: true });
|
|
286
|
-
let nl;
|
|
287
|
-
while ((nl = buffer.indexOf("\n")) !== -1) {
|
|
288
|
-
const line = buffer.slice(0, nl);
|
|
289
|
-
buffer = buffer.slice(nl + 1);
|
|
290
|
-
processLine(line, controller);
|
|
291
|
-
}
|
|
292
|
-
},
|
|
293
|
-
flush(controller) {
|
|
294
|
-
// Finalize the decoder so any pending multi-byte sequence is
|
|
295
|
-
// released into `buffer` instead of being silently dropped.
|
|
296
|
-
buffer += decoder.decode();
|
|
297
|
-
// Drain any trailing line that arrived without a terminating newline
|
|
298
|
-
// (e.g. upstream closed the socket immediately after the last write,
|
|
299
|
-
// or a CDN stripped the final CRLF). Without this, the chunk that
|
|
300
|
-
// carries finish_reason is silently lost.
|
|
301
|
-
if (buffer.length > 0) {
|
|
302
|
-
processLine(buffer, controller);
|
|
303
|
-
buffer = "";
|
|
304
|
-
}
|
|
305
|
-
if (!doneEmitted) {
|
|
306
|
-
controller.enqueue(encoder.encode("data: [DONE]\n\n"));
|
|
307
|
-
doneEmitted = true;
|
|
308
|
-
}
|
|
309
|
-
},
|
|
310
|
-
});
|
|
311
|
-
|
|
312
|
-
const transformed = response.body.pipeThrough(transform);
|
|
313
|
-
// Build a Response with passable headers; the streaming handler reads
|
|
314
|
-
// `.body` as a ReadableStream regardless of Content-Type.
|
|
315
|
-
return new Response(transformed, {
|
|
316
|
-
status: response.status,
|
|
317
|
-
statusText: response.statusText,
|
|
318
|
-
headers: {
|
|
319
|
-
"Content-Type": "text/event-stream",
|
|
320
|
-
"Cache-Control": "no-cache",
|
|
321
|
-
},
|
|
322
|
-
});
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
export class QoderExecutor extends BaseExecutor {
|
|
326
|
-
constructor() {
|
|
327
|
-
super("qoder", PROVIDERS.qoder);
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
buildUrl() {
|
|
331
|
-
return QODER_CHAT_URL_ENCODED;
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
// Override execute entirely — Qoder needs:
|
|
335
|
-
// - body built from translated chat completion payload
|
|
336
|
-
// - body encoded with QoderEncodeBody before signing
|
|
337
|
-
// - COSY headers built from the *encoded* body bytes
|
|
338
|
-
// - response stream re-wrapped from {statusCodeValue, body} to OpenAI SSE
|
|
339
|
-
async execute({ model, body, stream, credentials, signal, log, proxyOptions = null }) {
|
|
340
|
-
const url = this.buildUrl();
|
|
341
|
-
|
|
342
|
-
const psd = credentials?.providerSpecificData || {};
|
|
343
|
-
if (!psd.userId) {
|
|
344
|
-
// No user id → no way to sign. Surface a 401 so the dashboard nudges
|
|
345
|
-
// the user back to OAuth.
|
|
346
|
-
const fakeResp = new Response(
|
|
347
|
-
JSON.stringify({ error: { message: "qoder credential is missing userId; reconnect the account" } }),
|
|
348
|
-
{ status: 401, headers: { "Content-Type": "application/json" } },
|
|
349
|
-
);
|
|
350
|
-
return { response: fakeResp, url, headers: {}, transformedBody: body };
|
|
351
|
-
}
|
|
352
|
-
if (!credentials?.accessToken) {
|
|
353
|
-
// Same shape as the userId guard — clean 401 so chatCore reports
|
|
354
|
-
// "reconnect" rather than bubbling cosy.js's synchronous throw as 500.
|
|
355
|
-
const fakeResp = new Response(
|
|
356
|
-
JSON.stringify({ error: { message: "qoder credential is missing accessToken; reconnect the account" } }),
|
|
357
|
-
{ status: 401, headers: { "Content-Type": "application/json" } },
|
|
358
|
-
);
|
|
359
|
-
return { response: fakeResp, url, headers: {}, transformedBody: body };
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
let qoderKey;
|
|
363
|
-
let payload;
|
|
364
|
-
try {
|
|
365
|
-
({ qoderKey, payload } = await buildQoderRequestBody({ model, body, credentials, log, proxyOptions, signal }));
|
|
366
|
-
} catch (err) {
|
|
367
|
-
const fakeResp = new Response(
|
|
368
|
-
JSON.stringify({ error: { message: err.message } }),
|
|
369
|
-
{ status: 400, headers: { "Content-Type": "application/json" } },
|
|
370
|
-
);
|
|
371
|
-
return { response: fakeResp, url, headers: {}, transformedBody: body };
|
|
372
|
-
}
|
|
373
|
-
|
|
374
|
-
const plainBody = Buffer.from(JSON.stringify(payload), "utf8");
|
|
375
|
-
const encodedBodyStr = qoderEncodeBody(plainBody);
|
|
376
|
-
const encodedBodyBuf = Buffer.from(encodedBodyStr, "latin1");
|
|
377
|
-
|
|
378
|
-
let cosyHeaders;
|
|
379
|
-
try {
|
|
380
|
-
cosyHeaders = buildCosyHeaders(
|
|
381
|
-
encodedBodyBuf,
|
|
382
|
-
url,
|
|
383
|
-
{
|
|
384
|
-
userId: psd.userId,
|
|
385
|
-
authToken: credentials.accessToken,
|
|
386
|
-
name: credentials.displayName || "",
|
|
387
|
-
email: credentials.email || "",
|
|
388
|
-
machineId: psd.machineId || "",
|
|
389
|
-
},
|
|
390
|
-
);
|
|
391
|
-
} catch (err) {
|
|
392
|
-
// cosy.js throws synchronously on missing userId/authToken — surface
|
|
393
|
-
// as 401 so chatCore prompts re-auth instead of returning a 500.
|
|
394
|
-
const fakeResp = new Response(
|
|
395
|
-
JSON.stringify({ error: { message: `qoder cosy signing failed: ${err.message}` } }),
|
|
396
|
-
{ status: 401, headers: { "Content-Type": "application/json" } },
|
|
397
|
-
);
|
|
398
|
-
return { response: fakeResp, url, headers: {}, transformedBody: body };
|
|
399
|
-
}
|
|
400
|
-
|
|
401
|
-
const modelSource = (payload.model_config && payload.model_config.source) || "system";
|
|
402
|
-
const headers = {
|
|
403
|
-
"Content-Type": "application/json",
|
|
404
|
-
Accept: "text/event-stream",
|
|
405
|
-
"Cache-Control": "no-cache",
|
|
406
|
-
"X-Model-Key": qoderKey,
|
|
407
|
-
"X-Model-Source": modelSource,
|
|
408
|
-
// gzip triggers signature validation on Qoder's CDN; force identity.
|
|
409
|
-
"Accept-Encoding": "identity",
|
|
410
|
-
...cosyHeaders,
|
|
411
|
-
};
|
|
412
|
-
|
|
413
|
-
let response;
|
|
414
|
-
try {
|
|
415
|
-
response = await proxyAwareFetch(
|
|
416
|
-
url,
|
|
417
|
-
{ method: "POST", headers, body: encodedBodyBuf, signal },
|
|
418
|
-
proxyOptions,
|
|
419
|
-
);
|
|
420
|
-
} catch (err) {
|
|
421
|
-
throw err;
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
if (!response.ok) {
|
|
425
|
-
// Pass error response through unchanged so chatCore can capture it.
|
|
426
|
-
return { response, url, headers, transformedBody: payload };
|
|
427
|
-
}
|
|
428
|
-
|
|
429
|
-
const wrapped = wrapQoderSSE(response, `qoder/${qoderKey}`);
|
|
430
|
-
return { response: wrapped, url, headers, transformedBody: payload };
|
|
431
|
-
}
|
|
432
|
-
|
|
433
|
-
// Refresh Qoder device tokens using openapi.qoder.sh/api/v1/deviceToken/refresh.
|
|
434
|
-
async refreshCredentials(credentials, log, proxyOptions = null) {
|
|
435
|
-
const { refreshQoderToken } = await import("../services/tokenRefresh.js");
|
|
436
|
-
return refreshQoderToken(credentials.refreshToken, log, proxyOptions);
|
|
437
|
-
}
|
|
438
|
-
}
|
|
439
|
-
|
|
440
|
-
export default QoderExecutor;
|
|
441
|
-
|
|
442
|
-
// Internals exposed for unit tests. Not part of the public API — callers
|
|
443
|
-
// should import QoderExecutor and use its public methods.
|
|
444
|
-
export const __test__ = {
|
|
445
|
-
normalizeMessages,
|
|
446
|
-
wrapQoderSSE,
|
|
447
|
-
buildQoderRequestBody,
|
|
448
|
-
};
|