wyxrouter 0.4.71
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/CHANGELOG.md +222 -0
- package/LICENSE +21 -0
- package/README.md +96 -0
- package/README.zh-CN.md +1311 -0
- package/assets/pixel-router-2d.png +0 -0
- package/cli/LICENSE +42 -0
- package/cli/README.md +125 -0
- package/cli/app/package.json +58 -0
- package/cli/cli.js +806 -0
- package/cli/package.json +48 -0
- package/i18n/README.ja-JP.md +1209 -0
- package/i18n/README.ru.md +1311 -0
- package/i18n/README.vi.md +1310 -0
- package/i18n/README.zh-CN.md +1306 -0
- package/images/9router.png +0 -0
- package/jsconfig.json +12 -0
- package/next.config.mjs +71 -0
- package/open-sse/config/appConstants.js +203 -0
- package/open-sse/config/codexInstructions.js +119 -0
- package/open-sse/config/constants.js +4 -0
- package/open-sse/config/defaultThinkingSignature.js +12 -0
- package/open-sse/config/errorConfig.js +85 -0
- package/open-sse/config/googleTtsLanguages.js +62 -0
- package/open-sse/config/kiroConstants.js +322 -0
- package/open-sse/config/models.js +13 -0
- package/open-sse/config/ollamaModels.js +19 -0
- package/open-sse/config/providerModels.js +944 -0
- package/open-sse/config/providers.js +458 -0
- package/open-sse/config/runtimeConfig.js +72 -0
- package/open-sse/config/ttsModels.js +129 -0
- package/open-sse/executors/antigravity.js +504 -0
- package/open-sse/executors/azure.js +57 -0
- package/open-sse/executors/base.js +185 -0
- package/open-sse/executors/codex.js +469 -0
- package/open-sse/executors/commandcode.js +88 -0
- package/open-sse/executors/cursor.js +795 -0
- package/open-sse/executors/default.js +497 -0
- package/open-sse/executors/gemini-cli.js +89 -0
- package/open-sse/executors/github.js +379 -0
- package/open-sse/executors/grok-web.js +345 -0
- package/open-sse/executors/iflow.js +108 -0
- package/open-sse/executors/index.js +75 -0
- package/open-sse/executors/kiro.js +508 -0
- package/open-sse/executors/ollama-local.js +14 -0
- package/open-sse/executors/opencode-go.js +41 -0
- package/open-sse/executors/opencode.js +32 -0
- package/open-sse/executors/perplexity-web.js +507 -0
- package/open-sse/executors/qoder.js +450 -0
- package/open-sse/executors/qwen.js +129 -0
- package/open-sse/executors/vertex.js +131 -0
- package/open-sse/executors/xiaomi-tokenplan.js +19 -0
- package/open-sse/handlers/chatCore/nonStreamingHandler.js +230 -0
- package/open-sse/handlers/chatCore/requestDetail.js +102 -0
- package/open-sse/handlers/chatCore/sseToJsonHandler.js +231 -0
- package/open-sse/handlers/chatCore/streamingHandler.js +103 -0
- package/open-sse/handlers/chatCore.js +287 -0
- package/open-sse/handlers/embeddingProviders/_base.js +4 -0
- package/open-sse/handlers/embeddingProviders/gemini.js +54 -0
- package/open-sse/handlers/embeddingProviders/index.js +23 -0
- package/open-sse/handlers/embeddingProviders/openai.js +39 -0
- package/open-sse/handlers/embeddingProviders/openaiCompatNode.js +13 -0
- package/open-sse/handlers/embeddingsCore.js +126 -0
- package/open-sse/handlers/fetch/index.js +237 -0
- package/open-sse/handlers/imageGenerationCore.js +189 -0
- package/open-sse/handlers/imageProviders/_base.js +31 -0
- package/open-sse/handlers/imageProviders/blackForestLabs.js +43 -0
- package/open-sse/handlers/imageProviders/cloudflareAi.js +178 -0
- package/open-sse/handlers/imageProviders/codex.js +198 -0
- package/open-sse/handlers/imageProviders/comfyui.js +8 -0
- package/open-sse/handlers/imageProviders/falAi.js +41 -0
- package/open-sse/handlers/imageProviders/gemini.js +25 -0
- package/open-sse/handlers/imageProviders/huggingface.js +22 -0
- package/open-sse/handlers/imageProviders/index.js +40 -0
- package/open-sse/handlers/imageProviders/nanobanana.js +58 -0
- package/open-sse/handlers/imageProviders/openai.js +40 -0
- package/open-sse/handlers/imageProviders/runwayml.js +47 -0
- package/open-sse/handlers/imageProviders/sdwebui.js +17 -0
- package/open-sse/handlers/imageProviders/stabilityAi.js +34 -0
- package/open-sse/handlers/responsesHandler.js +103 -0
- package/open-sse/handlers/search/callers.js +371 -0
- package/open-sse/handlers/search/chatSearch.js +409 -0
- package/open-sse/handlers/search/index.js +201 -0
- package/open-sse/handlers/search/normalizers.js +223 -0
- package/open-sse/handlers/sttCore.js +194 -0
- package/open-sse/handlers/ttsCore.js +74 -0
- package/open-sse/handlers/ttsProviders/_base.js +39 -0
- package/open-sse/handlers/ttsProviders/edgeTts.js +89 -0
- package/open-sse/handlers/ttsProviders/elevenlabs.js +48 -0
- package/open-sse/handlers/ttsProviders/gemini.js +117 -0
- package/open-sse/handlers/ttsProviders/genericFormats.js +169 -0
- package/open-sse/handlers/ttsProviders/googleTts.js +54 -0
- package/open-sse/handlers/ttsProviders/index.js +50 -0
- package/open-sse/handlers/ttsProviders/localDevice.js +87 -0
- package/open-sse/handlers/ttsProviders/minimax.js +59 -0
- package/open-sse/handlers/ttsProviders/openai.js +30 -0
- package/open-sse/handlers/ttsProviders/openrouter.js +70 -0
- package/open-sse/index.js +82 -0
- package/open-sse/rtk/applyFilter.js +15 -0
- package/open-sse/rtk/autodetect.js +111 -0
- package/open-sse/rtk/caveman.js +100 -0
- package/open-sse/rtk/cavemanPrompts.js +78 -0
- package/open-sse/rtk/constants.js +55 -0
- package/open-sse/rtk/filters/buildOutput.js +127 -0
- package/open-sse/rtk/filters/dedupLog.js +44 -0
- package/open-sse/rtk/filters/find.js +49 -0
- package/open-sse/rtk/filters/gitDiff.js +92 -0
- package/open-sse/rtk/filters/gitStatus.js +117 -0
- package/open-sse/rtk/filters/grep.js +48 -0
- package/open-sse/rtk/filters/ls.js +79 -0
- package/open-sse/rtk/filters/readNumbered.js +27 -0
- package/open-sse/rtk/filters/searchList.js +52 -0
- package/open-sse/rtk/filters/smartTruncate.js +15 -0
- package/open-sse/rtk/filters/tree.js +32 -0
- package/open-sse/rtk/index.js +155 -0
- package/open-sse/rtk/registry.js +38 -0
- package/open-sse/services/accountFallback.js +238 -0
- package/open-sse/services/combo.js +198 -0
- package/open-sse/services/compact.js +71 -0
- package/open-sse/services/kiroModels.js +332 -0
- package/open-sse/services/model.js +261 -0
- package/open-sse/services/oauthCredentialManager.js +151 -0
- package/open-sse/services/projectId.js +306 -0
- package/open-sse/services/provider.js +356 -0
- package/open-sse/services/qoderModels.js +214 -0
- package/open-sse/services/tokenRefresh.js +939 -0
- package/open-sse/services/usage.js +1496 -0
- package/open-sse/transformer/responsesTransformer.js +439 -0
- package/open-sse/transformer/streamToJsonConverter.js +103 -0
- package/open-sse/translator/formats.js +36 -0
- package/open-sse/translator/helpers/claudeHelper.js +216 -0
- package/open-sse/translator/helpers/geminiHelper.js +372 -0
- package/open-sse/translator/helpers/imageHelper.js +34 -0
- package/open-sse/translator/helpers/maxTokensHelper.js +27 -0
- package/open-sse/translator/helpers/openaiHelper.js +130 -0
- package/open-sse/translator/helpers/responsesApiHelper.js +139 -0
- package/open-sse/translator/helpers/toolCallHelper.js +148 -0
- package/open-sse/translator/index.js +251 -0
- package/open-sse/translator/request/antigravity-to-openai.js +229 -0
- package/open-sse/translator/request/claude-to-openai.js +232 -0
- package/open-sse/translator/request/gemini-to-openai.js +147 -0
- package/open-sse/translator/request/openai-responses.js +318 -0
- package/open-sse/translator/request/openai-to-claude.js +401 -0
- package/open-sse/translator/request/openai-to-commandcode.js +170 -0
- package/open-sse/translator/request/openai-to-cursor.js +183 -0
- package/open-sse/translator/request/openai-to-gemini.js +470 -0
- package/open-sse/translator/request/openai-to-kiro.js +629 -0
- package/open-sse/translator/request/openai-to-kiro.old.js +278 -0
- package/open-sse/translator/request/openai-to-ollama.js +192 -0
- package/open-sse/translator/request/openai-to-vertex.js +42 -0
- package/open-sse/translator/response/claude-to-openai.js +206 -0
- package/open-sse/translator/response/commandcode-to-openai.js +197 -0
- package/open-sse/translator/response/cursor-to-openai.js +30 -0
- package/open-sse/translator/response/gemini-to-openai.js +245 -0
- package/open-sse/translator/response/kiro-to-openai.js +195 -0
- package/open-sse/translator/response/ollama-to-openai.js +152 -0
- package/open-sse/translator/response/openai-responses.js +590 -0
- package/open-sse/translator/response/openai-to-antigravity.js +122 -0
- package/open-sse/translator/response/openai-to-claude.js +266 -0
- package/open-sse/utils/bypassHandler.js +298 -0
- package/open-sse/utils/claudeCloaking.js +155 -0
- package/open-sse/utils/claudeHeaderCache.js +70 -0
- package/open-sse/utils/clientDetector.js +63 -0
- package/open-sse/utils/cursorChecksum.js +149 -0
- package/open-sse/utils/cursorProtobuf.js +904 -0
- package/open-sse/utils/debugLog.js +14 -0
- package/open-sse/utils/error.js +147 -0
- package/open-sse/utils/ollamaTransform.js +85 -0
- package/open-sse/utils/proxyFetch.js +368 -0
- package/open-sse/utils/reasoningContentInjector.js +79 -0
- package/open-sse/utils/requestLogger.js +260 -0
- package/open-sse/utils/responsesStreamHelpers.js +49 -0
- package/open-sse/utils/sessionManager.js +82 -0
- package/open-sse/utils/stream.js +462 -0
- package/open-sse/utils/streamHandler.js +250 -0
- package/open-sse/utils/streamHelpers.js +122 -0
- package/open-sse/utils/toolDeduper.js +49 -0
- package/open-sse/utils/usageTracking.js +347 -0
- package/package.json +100 -0
- package/postcss.config.mjs +12 -0
- package/public/favicon.svg +11 -0
- package/public/file.svg +1 -0
- package/public/globe.svg +1 -0
- package/public/i18n/literals/ar.json +195 -0
- package/public/i18n/literals/bn.json +195 -0
- package/public/i18n/literals/cs.json +195 -0
- package/public/i18n/literals/da.json +195 -0
- package/public/i18n/literals/de.json +195 -0
- package/public/i18n/literals/el.json +195 -0
- package/public/i18n/literals/es.json +195 -0
- package/public/i18n/literals/fi.json +195 -0
- package/public/i18n/literals/fr.json +195 -0
- package/public/i18n/literals/he.json +195 -0
- package/public/i18n/literals/hi.json +195 -0
- package/public/i18n/literals/hu.json +195 -0
- package/public/i18n/literals/id.json +195 -0
- package/public/i18n/literals/it.json +195 -0
- package/public/i18n/literals/ja.json +195 -0
- package/public/i18n/literals/ko.json +195 -0
- package/public/i18n/literals/nl.json +195 -0
- package/public/i18n/literals/no.json +195 -0
- package/public/i18n/literals/pl.json +195 -0
- package/public/i18n/literals/pt-BR.json +195 -0
- package/public/i18n/literals/pt-PT.json +195 -0
- package/public/i18n/literals/ro.json +195 -0
- package/public/i18n/literals/ru.json +195 -0
- package/public/i18n/literals/sv.json +195 -0
- package/public/i18n/literals/th.json +195 -0
- package/public/i18n/literals/tl.json +195 -0
- package/public/i18n/literals/tr.json +195 -0
- package/public/i18n/literals/uk.json +195 -0
- package/public/i18n/literals/ur.json +195 -0
- package/public/i18n/literals/vi.json +195 -0
- package/public/i18n/literals/zh-CN.json +772 -0
- package/public/i18n/literals/zh-TW.json +195 -0
- package/public/icons/discord.svg +4 -0
- package/public/icons/icon-192.svg +4 -0
- package/public/icons/icon-512.svg +4 -0
- package/public/next.svg +1 -0
- package/public/providers/alicode-intl.png +0 -0
- package/public/providers/alicode.png +0 -0
- package/public/providers/amp.png +0 -0
- package/public/providers/anthropic-m.png +0 -0
- package/public/providers/anthropic.png +0 -0
- package/public/providers/antigravity.png +0 -0
- package/public/providers/assemblyai.png +0 -0
- package/public/providers/aws-polly.png +0 -0
- package/public/providers/azure.png +0 -0
- package/public/providers/black-forest-labs.png +0 -0
- package/public/providers/blackbox.png +0 -0
- package/public/providers/brave-search.png +0 -0
- package/public/providers/byteplus.png +0 -0
- package/public/providers/cartesia.png +0 -0
- package/public/providers/cerebras.png +0 -0
- package/public/providers/chutes.png +0 -0
- package/public/providers/claude.png +0 -0
- package/public/providers/cline.png +0 -0
- package/public/providers/cloudflare-ai.png +0 -0
- package/public/providers/codebuddy.svg +37 -0
- package/public/providers/codex.png +0 -0
- package/public/providers/cohere.png +0 -0
- package/public/providers/comfyui.png +0 -0
- package/public/providers/commandcode.png +0 -0
- package/public/providers/continue.png +0 -0
- package/public/providers/copilot.png +0 -0
- package/public/providers/coqui.png +0 -0
- package/public/providers/cursor.png +0 -0
- package/public/providers/deepgram.png +0 -0
- package/public/providers/deepseek-tui.png +0 -0
- package/public/providers/deepseek.png +0 -0
- package/public/providers/droid.png +0 -0
- package/public/providers/edge-tts.png +0 -0
- package/public/providers/elevenlabs.png +0 -0
- package/public/providers/exa.png +0 -0
- package/public/providers/fal-ai.png +0 -0
- package/public/providers/firecrawl.png +0 -0
- package/public/providers/fireworks.png +0 -0
- package/public/providers/gemini-cli.png +0 -0
- package/public/providers/gemini.png +0 -0
- package/public/providers/github.png +0 -0
- package/public/providers/glm-cn.png +0 -0
- package/public/providers/glm.png +0 -0
- package/public/providers/google-pse.png +0 -0
- package/public/providers/google-tts.png +0 -0
- package/public/providers/grok-web.png +0 -0
- package/public/providers/groq.png +0 -0
- package/public/providers/hermes.png +0 -0
- package/public/providers/huggingface.png +0 -0
- package/public/providers/hyperbolic.png +0 -0
- package/public/providers/iflow.png +0 -0
- package/public/providers/inworld.png +0 -0
- package/public/providers/jcode.png +0 -0
- package/public/providers/jina-ai.png +0 -0
- package/public/providers/jina-reader.png +0 -0
- package/public/providers/kilocode.png +0 -0
- package/public/providers/kimi-coding.png +0 -0
- package/public/providers/kimi.png +0 -0
- package/public/providers/kiro.png +0 -0
- package/public/providers/linkup.png +0 -0
- package/public/providers/local-device.png +0 -0
- package/public/providers/minimax-cn.png +0 -0
- package/public/providers/minimax.png +0 -0
- package/public/providers/mistral.png +0 -0
- package/public/providers/nanobanana.png +0 -0
- package/public/providers/nebius.png +0 -0
- package/public/providers/nvidia.png +0 -0
- package/public/providers/oai-cc.png +0 -0
- package/public/providers/oai-r.png +0 -0
- package/public/providers/ollama-local.png +0 -0
- package/public/providers/ollama.png +0 -0
- package/public/providers/openai.png +0 -0
- package/public/providers/openclaw.png +0 -0
- package/public/providers/opencode-go.png +0 -0
- package/public/providers/opencode.png +0 -0
- package/public/providers/openrouter.png +0 -0
- package/public/providers/perplexity-web.png +0 -0
- package/public/providers/perplexity.png +0 -0
- package/public/providers/playht.png +0 -0
- package/public/providers/qoder.png +0 -0
- package/public/providers/qwen.png +0 -0
- package/public/providers/recraft.png +0 -0
- package/public/providers/roo.png +0 -0
- package/public/providers/runwayml.png +0 -0
- package/public/providers/sdwebui.png +0 -0
- package/public/providers/searchapi.png +0 -0
- package/public/providers/searxng.png +0 -0
- package/public/providers/serper.png +0 -0
- package/public/providers/siliconflow.png +0 -0
- package/public/providers/stability-ai.png +0 -0
- package/public/providers/tavily.png +0 -0
- package/public/providers/together.png +0 -0
- package/public/providers/topaz.png +0 -0
- package/public/providers/tortoise.png +0 -0
- package/public/providers/vertex-partner.png +0 -0
- package/public/providers/vertex.png +0 -0
- package/public/providers/volcengine-ark.png +0 -0
- package/public/providers/voyage-ai.png +0 -0
- package/public/providers/xai.png +0 -0
- package/public/providers/xiaomi-mimo.png +0 -0
- package/public/providers/xiaomi-tokenplan.png +0 -0
- package/public/providers/youcom.png +0 -0
- package/public/sw.js +22 -0
- package/public/vercel.svg +1 -0
- package/public/window.svg +1 -0
- package/scripts/compact-request-details.mjs +71 -0
- package/scripts/import-codex-gptjson.mjs +342 -0
- package/scripts/start-standalone.mjs +25 -0
- package/scripts/translate-readme.js +201 -0
- package/src/app/(dashboard)/dashboard/automation/page.js +294 -0
- package/src/app/(dashboard)/dashboard/basic-chat/BasicChatPageClient.js +967 -0
- package/src/app/(dashboard)/dashboard/basic-chat/page.js +5 -0
- package/src/app/(dashboard)/dashboard/cli-tools/CLIToolsPageClient.js +66 -0
- package/src/app/(dashboard)/dashboard/cli-tools/[toolId]/ToolDetailClient.js +173 -0
- package/src/app/(dashboard)/dashboard/cli-tools/[toolId]/page.js +11 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/AntigravityToolCard.js +481 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/ApiKeySelect.js +66 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/BaseUrlSelect.js +174 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/ClaudeToolCard.js +390 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/ClineToolCard.js +301 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/CodexToolCard.js +458 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/CopilotToolCard.js +323 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/CoworkToolCard.js +640 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/DeepSeekTuiToolCard.js +338 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/DefaultToolCard.js +271 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/DroidToolCard.js +410 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/EndpointPresetControl.js +128 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/HermesToolCard.js +317 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/JcodeToolCard.js +380 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/KiloToolCard.js +275 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/MitmLinkCard.js +40 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/MitmServerCard.js +329 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/MitmToolCard.js +318 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/OpenClawToolCard.js +388 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/OpenCodeToolCard.js +500 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/ToolSummaryCard.js +39 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/cliEndpointMatch.js +13 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/index.js +19 -0
- package/src/app/(dashboard)/dashboard/cli-tools/page.js +7 -0
- package/src/app/(dashboard)/dashboard/combos/page.js +612 -0
- package/src/app/(dashboard)/dashboard/console-log/ConsoleLogClient.js +91 -0
- package/src/app/(dashboard)/dashboard/console-log/page.js +8 -0
- package/src/app/(dashboard)/dashboard/endpoint/EndpointPageClient.js +1555 -0
- package/src/app/(dashboard)/dashboard/endpoint/page.js +7 -0
- package/src/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page.js +1903 -0
- package/src/app/(dashboard)/dashboard/media-providers/[kind]/page.js +289 -0
- package/src/app/(dashboard)/dashboard/media-providers/combo/[id]/page.js +410 -0
- package/src/app/(dashboard)/dashboard/media-providers/web/page.js +209 -0
- package/src/app/(dashboard)/dashboard/mitm/MitmPageClient.js +117 -0
- package/src/app/(dashboard)/dashboard/mitm/page.js +5 -0
- package/src/app/(dashboard)/dashboard/page.js +7 -0
- package/src/app/(dashboard)/dashboard/profile/page.js +1140 -0
- package/src/app/(dashboard)/dashboard/providers/[id]/AddApiKeyModal.js +389 -0
- package/src/app/(dashboard)/dashboard/providers/[id]/AddCustomModelModal.js +125 -0
- package/src/app/(dashboard)/dashboard/providers/[id]/CompatibleModelsSection.js +250 -0
- package/src/app/(dashboard)/dashboard/providers/[id]/ConnectionRow.js +299 -0
- package/src/app/(dashboard)/dashboard/providers/[id]/CooldownTimer.js +42 -0
- package/src/app/(dashboard)/dashboard/providers/[id]/EditCompatibleNodeModal.js +161 -0
- package/src/app/(dashboard)/dashboard/providers/[id]/ModelRow.js +95 -0
- package/src/app/(dashboard)/dashboard/providers/[id]/PassthroughModelsSection.js +183 -0
- package/src/app/(dashboard)/dashboard/providers/[id]/page.js +2053 -0
- package/src/app/(dashboard)/dashboard/providers/[id]/page.new.js +1724 -0
- package/src/app/(dashboard)/dashboard/providers/components/ConnectionsCard.js +497 -0
- package/src/app/(dashboard)/dashboard/providers/components/ModelAvailabilityBadge.js +185 -0
- package/src/app/(dashboard)/dashboard/providers/components/ModelsCard.js +294 -0
- package/src/app/(dashboard)/dashboard/providers/new/page.js +220 -0
- package/src/app/(dashboard)/dashboard/providers/page.js +1365 -0
- package/src/app/(dashboard)/dashboard/proxy-pools/page.js +1092 -0
- package/src/app/(dashboard)/dashboard/quota/page.js +11 -0
- package/src/app/(dashboard)/dashboard/skills/page.js +112 -0
- package/src/app/(dashboard)/dashboard/translator/page.js +303 -0
- package/src/app/(dashboard)/dashboard/usage/components/OverviewCards.js +35 -0
- package/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/ProviderLimitCard.js +185 -0
- package/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/QuotaProgressBar.js +127 -0
- package/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/QuotaTable.js +259 -0
- package/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/index.js +1394 -0
- package/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/utils.js +244 -0
- package/src/app/(dashboard)/dashboard/usage/components/ProviderTopology.js +327 -0
- package/src/app/(dashboard)/dashboard/usage/components/RequestDetailsTab.js +433 -0
- package/src/app/(dashboard)/dashboard/usage/components/UsageChart.js +141 -0
- package/src/app/(dashboard)/dashboard/usage/components/UsageTable.js +247 -0
- package/src/app/(dashboard)/dashboard/usage/page.js +75 -0
- package/src/app/(dashboard)/layout.js +6 -0
- package/src/app/api/auth/login/route.js +76 -0
- package/src/app/api/auth/logout/route.js +12 -0
- package/src/app/api/auth/oidc/callback/route.js +87 -0
- package/src/app/api/auth/oidc/start/route.js +52 -0
- package/src/app/api/auth/oidc/test/route.js +84 -0
- package/src/app/api/auth/status/route.js +45 -0
- package/src/app/api/cli-tools/all-statuses/route.js +46 -0
- package/src/app/api/cli-tools/antigravity-mitm/alias/route.js +53 -0
- package/src/app/api/cli-tools/antigravity-mitm/route.js +202 -0
- package/src/app/api/cli-tools/claude-settings/route.js +203 -0
- package/src/app/api/cli-tools/cline-settings/route.js +133 -0
- package/src/app/api/cli-tools/codex-gateway/accounts/route.js +16 -0
- package/src/app/api/cli-tools/codex-settings/route.js +239 -0
- package/src/app/api/cli-tools/copilot-settings/route.js +148 -0
- package/src/app/api/cli-tools/cowork-mcp-registry/route.js +77 -0
- package/src/app/api/cli-tools/cowork-mcp-tools/route.js +95 -0
- package/src/app/api/cli-tools/cowork-settings/route.js +412 -0
- package/src/app/api/cli-tools/deepseek-tui-settings/route.js +164 -0
- package/src/app/api/cli-tools/droid-settings/route.js +213 -0
- package/src/app/api/cli-tools/hermes-settings/route.js +175 -0
- package/src/app/api/cli-tools/jcode-settings/route.js +216 -0
- package/src/app/api/cli-tools/kilo-settings/route.js +131 -0
- package/src/app/api/cli-tools/openclaw-settings/route.js +292 -0
- package/src/app/api/cli-tools/opencode-settings/route.js +259 -0
- package/src/app/api/combos/[id]/route.js +81 -0
- package/src/app/api/combos/route.js +48 -0
- package/src/app/api/health/route.js +15 -0
- package/src/app/api/init/route.js +4 -0
- package/src/app/api/keys/[id]/route.js +58 -0
- package/src/app/api/keys/route.js +42 -0
- package/src/app/api/locale/route.js +30 -0
- package/src/app/api/mcp/[plugin]/message/route.js +21 -0
- package/src/app/api/mcp/[plugin]/sse/route.js +37 -0
- package/src/app/api/media-providers/tts/deepgram/voices/route.js +65 -0
- package/src/app/api/media-providers/tts/elevenlabs/voices/route.js +71 -0
- package/src/app/api/media-providers/tts/inworld/voices/route.js +61 -0
- package/src/app/api/media-providers/tts/minimax/voices/route.js +113 -0
- package/src/app/api/media-providers/tts/voices/route.js +99 -0
- package/src/app/api/models/alias/route.js +53 -0
- package/src/app/api/models/availability/route.js +103 -0
- package/src/app/api/models/custom/route.js +48 -0
- package/src/app/api/models/disabled/route.js +50 -0
- package/src/app/api/models/route.js +64 -0
- package/src/app/api/models/test/ping.js +191 -0
- package/src/app/api/models/test/route.js +14 -0
- package/src/app/api/oauth/[provider]/[action]/route.js +343 -0
- package/src/app/api/oauth/codebuddy/bulk-import/[jobId]/cancel/route.js +19 -0
- package/src/app/api/oauth/codebuddy/bulk-import/[jobId]/manual/[workerId]/route.js +30 -0
- package/src/app/api/oauth/codebuddy/bulk-import/[jobId]/route.js +23 -0
- package/src/app/api/oauth/codebuddy/bulk-import/latest/route.js +25 -0
- package/src/app/api/oauth/codebuddy/bulk-import/route.js +49 -0
- package/src/app/api/oauth/codebuddy/quota-cookie/route.js +133 -0
- package/src/app/api/oauth/codex/import-token/route.js +96 -0
- package/src/app/api/oauth/cursor/auto-import/route.js +258 -0
- package/src/app/api/oauth/cursor/import/route.js +100 -0
- package/src/app/api/oauth/gitlab/pat/route.js +62 -0
- package/src/app/api/oauth/iflow/cookie/route.js +137 -0
- package/src/app/api/oauth/kiro/auto-import/route.js +85 -0
- package/src/app/api/oauth/kiro/bulk-import/[jobId]/cancel/route.js +18 -0
- package/src/app/api/oauth/kiro/bulk-import/[jobId]/manual/[workerId]/route.js +29 -0
- package/src/app/api/oauth/kiro/bulk-import/[jobId]/route.js +22 -0
- package/src/app/api/oauth/kiro/bulk-import/latest/route.js +25 -0
- package/src/app/api/oauth/kiro/bulk-import/route.js +49 -0
- package/src/app/api/oauth/kiro/import/route.js +110 -0
- package/src/app/api/oauth/kiro/social-authorize/route.js +27 -0
- package/src/app/api/oauth/kiro/social-exchange/route.js +41 -0
- package/src/app/api/pricing/route.js +134 -0
- package/src/app/api/provider-nodes/[id]/route.js +101 -0
- package/src/app/api/provider-nodes/route.js +104 -0
- package/src/app/api/provider-nodes/validate/route.js +201 -0
- package/src/app/api/providers/[id]/models/route.js +526 -0
- package/src/app/api/providers/[id]/route.js +189 -0
- package/src/app/api/providers/[id]/test/route.js +23 -0
- package/src/app/api/providers/[id]/test/testUtils.js +714 -0
- package/src/app/api/providers/[id]/test-models/route.js +66 -0
- package/src/app/api/providers/client/route.js +126 -0
- package/src/app/api/providers/kilo/free-models/route.js +55 -0
- package/src/app/api/providers/route.js +206 -0
- package/src/app/api/providers/suggested-models/filters.js +20 -0
- package/src/app/api/providers/suggested-models/route.js +32 -0
- package/src/app/api/providers/test-batch/route.js +131 -0
- package/src/app/api/providers/validate/route.js +637 -0
- package/src/app/api/proxy-pools/[id]/route.js +123 -0
- package/src/app/api/proxy-pools/[id]/test/route.js +70 -0
- package/src/app/api/proxy-pools/cloudflare-deploy/route.js +145 -0
- package/src/app/api/proxy-pools/deno-deploy/route.js +175 -0
- package/src/app/api/proxy-pools/route.js +93 -0
- package/src/app/api/proxy-pools/vercel-deploy/route.js +142 -0
- package/src/app/api/settings/database/route.js +36 -0
- package/src/app/api/settings/proxy-test/route.js +23 -0
- package/src/app/api/settings/require-login/route.js +15 -0
- package/src/app/api/settings/route.js +100 -0
- package/src/app/api/shutdown/route.js +24 -0
- package/src/app/api/tags/route.js +18 -0
- package/src/app/api/translator/console-logs/route.js +24 -0
- package/src/app/api/translator/console-logs/stream/route.js +79 -0
- package/src/app/api/translator/load/route.js +45 -0
- package/src/app/api/translator/save/route.js +44 -0
- package/src/app/api/translator/send/route.js +94 -0
- package/src/app/api/translator/translate/route.js +90 -0
- package/src/app/api/tunnel/disable/route.js +12 -0
- package/src/app/api/tunnel/enable/route.js +16 -0
- package/src/app/api/tunnel/status/route.js +13 -0
- package/src/app/api/tunnel/tailscale-check/route.js +50 -0
- package/src/app/api/tunnel/tailscale-disable/route.js +12 -0
- package/src/app/api/tunnel/tailscale-enable/route.js +12 -0
- package/src/app/api/tunnel/tailscale-install/route.js +72 -0
- package/src/app/api/usage/[connectionId]/route.js +188 -0
- package/src/app/api/usage/chart/route.js +21 -0
- package/src/app/api/usage/history/route.js +12 -0
- package/src/app/api/usage/logs/route.js +12 -0
- package/src/app/api/usage/providers/route.js +42 -0
- package/src/app/api/usage/request-details/route.js +57 -0
- package/src/app/api/usage/request-logs/route.js +13 -0
- package/src/app/api/usage/stats/route.js +23 -0
- package/src/app/api/usage/stream/route.js +79 -0
- package/src/app/api/v1/api/chat/route.js +37 -0
- package/src/app/api/v1/audio/speech/route.js +16 -0
- package/src/app/api/v1/audio/transcriptions/route.js +19 -0
- package/src/app/api/v1/audio/voices/route.js +68 -0
- package/src/app/api/v1/chat/completions/route.js +35 -0
- package/src/app/api/v1/embeddings/route.js +21 -0
- package/src/app/api/v1/images/generations/route.js +16 -0
- package/src/app/api/v1/messages/count_tokens/route.js +52 -0
- package/src/app/api/v1/messages/route.js +36 -0
- package/src/app/api/v1/models/[kind]/route.js +55 -0
- package/src/app/api/v1/models/info/route.js +110 -0
- package/src/app/api/v1/models/route.js +451 -0
- package/src/app/api/v1/responses/compact/route.js +37 -0
- package/src/app/api/v1/responses/route.js +30 -0
- package/src/app/api/v1/route.js +1 -0
- package/src/app/api/v1/search/route.js +21 -0
- package/src/app/api/v1/web/fetch/route.js +21 -0
- package/src/app/api/v1beta/models/[...path]/route.js +328 -0
- package/src/app/api/v1beta/models/route.js +44 -0
- package/src/app/api/version/route.js +45 -0
- package/src/app/api/version/shutdown/route.js +15 -0
- package/src/app/api/version/update/route.js +21 -0
- package/src/app/callback/page.js +148 -0
- package/src/app/dashboard/settings/pricing/page.js +173 -0
- package/src/app/favicon.ico +0 -0
- package/src/app/globals.css +496 -0
- package/src/app/landing/components/AnimatedBackground.js +57 -0
- package/src/app/landing/components/Features.js +133 -0
- package/src/app/landing/components/FlowAnimation.js +175 -0
- package/src/app/landing/components/Footer.js +61 -0
- package/src/app/landing/components/GetStarted.js +97 -0
- package/src/app/landing/components/HeroSection.js +47 -0
- package/src/app/landing/components/HowItWorks.js +66 -0
- package/src/app/landing/components/Navigation.js +72 -0
- package/src/app/landing/page.js +106 -0
- package/src/app/layout.js +49 -0
- package/src/app/login/page.js +197 -0
- package/src/app/manifest.js +30 -0
- package/src/app/page.js +5 -0
- package/src/dashboardGuard.js +242 -0
- package/src/i18n/RuntimeI18nProvider.js +27 -0
- package/src/i18n/config.js +146 -0
- package/src/i18n/runtime.js +162 -0
- package/src/lib/appUpdater.js +200 -0
- package/src/lib/auth/dashboardSession.js +68 -0
- package/src/lib/auth/loginLimiter.js +52 -0
- package/src/lib/auth/oidc.js +234 -0
- package/src/lib/consoleLogBuffer.js +79 -0
- package/src/lib/dataDir.js +29 -0
- package/src/lib/db/adapters/betterSqliteAdapter.js +55 -0
- package/src/lib/db/adapters/bunSqliteAdapter.js +63 -0
- package/src/lib/db/adapters/nodeSqliteAdapter.js +84 -0
- package/src/lib/db/adapters/sqljsAdapter.js +115 -0
- package/src/lib/db/backup.js +35 -0
- package/src/lib/db/driver.js +85 -0
- package/src/lib/db/helpers/jsonCol.js +9 -0
- package/src/lib/db/helpers/kvStore.js +39 -0
- package/src/lib/db/helpers/metaStore.js +22 -0
- package/src/lib/db/index.js +171 -0
- package/src/lib/db/migrate.js +286 -0
- package/src/lib/db/migrations/001-initial.js +14 -0
- package/src/lib/db/migrations/index.js +10 -0
- package/src/lib/db/paths.js +18 -0
- package/src/lib/db/repos/aliasRepo.js +62 -0
- package/src/lib/db/repos/apiKeysRepo.js +75 -0
- package/src/lib/db/repos/combosRepo.js +73 -0
- package/src/lib/db/repos/connectionsRepo.js +226 -0
- package/src/lib/db/repos/disabledModelsRepo.js +56 -0
- package/src/lib/db/repos/nodesRepo.js +95 -0
- package/src/lib/db/repos/pricingRepo.js +108 -0
- package/src/lib/db/repos/proxyPoolsRepo.js +103 -0
- package/src/lib/db/repos/requestDetailsRepo.js +259 -0
- package/src/lib/db/repos/settingsRepo.js +104 -0
- package/src/lib/db/repos/usageRepo.js +731 -0
- package/src/lib/db/schema.js +157 -0
- package/src/lib/db/version.js +21 -0
- package/src/lib/disabledModelsDb.js +4 -0
- package/src/lib/localDb.js +21 -0
- package/src/lib/mcp/stdioSseBridge.js +198 -0
- package/src/lib/mitmAliasCache.js +46 -0
- package/src/lib/network/connectionProxy.js +160 -0
- package/src/lib/network/initOutboundProxy.js +25 -0
- package/src/lib/network/outboundProxy.js +68 -0
- package/src/lib/network/proxyTest.js +91 -0
- package/src/lib/oauth/constants/oauth.js +284 -0
- package/src/lib/oauth/constants/xai.js +61 -0
- package/src/lib/oauth/providers.js +1506 -0
- package/src/lib/oauth/services/antigravity.js +321 -0
- package/src/lib/oauth/services/claude.js +136 -0
- package/src/lib/oauth/services/codebuddyBulkImportManager.js +454 -0
- package/src/lib/oauth/services/codex.js +144 -0
- package/src/lib/oauth/services/cursor.js +179 -0
- package/src/lib/oauth/services/gemini.js +240 -0
- package/src/lib/oauth/services/github.js +225 -0
- package/src/lib/oauth/services/iflow.js +202 -0
- package/src/lib/oauth/services/index.js +17 -0
- package/src/lib/oauth/services/kiro.js +334 -0
- package/src/lib/oauth/services/kiroBulkImportManager.js +778 -0
- package/src/lib/oauth/services/kiroConnections.js +93 -0
- package/src/lib/oauth/services/kiroGoogleAutomation.js +1136 -0
- package/src/lib/oauth/services/oauth.js +157 -0
- package/src/lib/oauth/services/openai.js +123 -0
- package/src/lib/oauth/services/qoder.js +216 -0
- package/src/lib/oauth/services/qwen.js +170 -0
- package/src/lib/oauth/services/xai.js +238 -0
- package/src/lib/oauth/utils/banner.js +63 -0
- package/src/lib/oauth/utils/pkce.js +39 -0
- package/src/lib/oauth/utils/server.js +415 -0
- package/src/lib/oauth/utils/ui.js +48 -0
- package/src/lib/providerNormalization.js +45 -0
- package/src/lib/qoder/constants.js +64 -0
- package/src/lib/qoder/cosy.js +175 -0
- package/src/lib/qoder/encoding.js +55 -0
- package/src/lib/requestDetailsDb.js +4 -0
- package/src/lib/tunnel/cloudflare/cloudflared.js +449 -0
- package/src/lib/tunnel/cloudflare/config.js +9 -0
- package/src/lib/tunnel/cloudflare/healthCheck.js +29 -0
- package/src/lib/tunnel/cloudflare/manager.js +151 -0
- package/src/lib/tunnel/cloudflare/pid.js +23 -0
- package/src/lib/tunnel/index.js +48 -0
- package/src/lib/tunnel/shared/dnsResolver.js +17 -0
- package/src/lib/tunnel/shared/internetCheck.js +26 -0
- package/src/lib/tunnel/shared/state.js +41 -0
- package/src/lib/tunnel/shared/watchdogConfig.js +8 -0
- package/src/lib/tunnel/tailscale/config.js +7 -0
- package/src/lib/tunnel/tailscale/healthCheck.js +29 -0
- package/src/lib/tunnel/tailscale/manager.js +129 -0
- package/src/lib/tunnel/tailscale/tailscale.js +790 -0
- package/src/lib/updater/updater.js +235 -0
- package/src/lib/usage/fetcher.js +208 -0
- package/src/lib/usageDb.js +7 -0
- package/src/mitm/antigravityIdeVersion.js +50 -0
- package/src/mitm/cert/generate.js +32 -0
- package/src/mitm/cert/install.js +269 -0
- package/src/mitm/cert/rootCA.js +173 -0
- package/src/mitm/config.js +87 -0
- package/src/mitm/dbReader.js +22 -0
- package/src/mitm/dns/dnsConfig.js +266 -0
- package/src/mitm/handlers/antigravity.js +33 -0
- package/src/mitm/handlers/base.js +226 -0
- package/src/mitm/handlers/copilot.js +35 -0
- package/src/mitm/handlers/cursor.js +15 -0
- package/src/mitm/handlers/kiro.js +526 -0
- package/src/mitm/logger.js +106 -0
- package/src/mitm/manager.js +851 -0
- package/src/mitm/paths.js +32 -0
- package/src/mitm/server.js +435 -0
- package/src/mitm/winElevated.js +81 -0
- package/src/models/index.js +38 -0
- package/src/proxy.js +5 -0
- package/src/shared/components/AddCustomEmbeddingModal.js +183 -0
- package/src/shared/components/Avatar.js +88 -0
- package/src/shared/components/Badge.js +54 -0
- package/src/shared/components/BulkAccountAutomationModal.js +508 -0
- package/src/shared/components/Button.js +56 -0
- package/src/shared/components/Card.js +116 -0
- package/src/shared/components/ChangelogModal.js +97 -0
- package/src/shared/components/CodeBuddyQuotaCookieModal.js +109 -0
- package/src/shared/components/ComboFormModal.js +176 -0
- package/src/shared/components/CursorAuthModal.js +212 -0
- package/src/shared/components/DonateModal.js +136 -0
- package/src/shared/components/Drawer.js +82 -0
- package/src/shared/components/EditConnectionModal.js +286 -0
- package/src/shared/components/Footer.js +132 -0
- package/src/shared/components/GitLabAuthModal.js +194 -0
- package/src/shared/components/Header.js +380 -0
- package/src/shared/components/HeaderLanguage.js +46 -0
- package/src/shared/components/HeaderMenu.js +126 -0
- package/src/shared/components/IFlowCookieModal.js +132 -0
- package/src/shared/components/Input.js +65 -0
- package/src/shared/components/KiroAuthModal.js +1171 -0
- package/src/shared/components/KiroOAuthWrapper.js +149 -0
- package/src/shared/components/KiroSocialOAuthModal.js +205 -0
- package/src/shared/components/LanguageSwitcher.js +190 -0
- package/src/shared/components/Loading.js +75 -0
- package/src/shared/components/ManualConfigModal.js +44 -0
- package/src/shared/components/McpMarketplaceModal.js +255 -0
- package/src/shared/components/Modal.js +146 -0
- package/src/shared/components/ModelSelectModal.js +537 -0
- package/src/shared/components/NineRemoteButton.js +23 -0
- package/src/shared/components/NineRemotePromoModal.js +99 -0
- package/src/shared/components/NoAuthProxyCard.js +86 -0
- package/src/shared/components/OAuthModal.js +682 -0
- package/src/shared/components/Pagination.js +150 -0
- package/src/shared/components/PricingModal.js +208 -0
- package/src/shared/components/ProviderIcon.js +63 -0
- package/src/shared/components/ProviderInfoCard.js +82 -0
- package/src/shared/components/RequestLogger.js +121 -0
- package/src/shared/components/SegmentedControl.js +48 -0
- package/src/shared/components/Select.js +67 -0
- package/src/shared/components/Sidebar.js +441 -0
- package/src/shared/components/ThemeProvider.js +15 -0
- package/src/shared/components/ThemeToggle.js +42 -0
- package/src/shared/components/Toggle.js +69 -0
- package/src/shared/components/Tooltip.js +25 -0
- package/src/shared/components/UsageStats.js +505 -0
- package/src/shared/components/index.js +46 -0
- package/src/shared/components/layouts/AuthLayout.js +29 -0
- package/src/shared/components/layouts/DashboardLayout.js +104 -0
- package/src/shared/components/layouts/index.js +4 -0
- package/src/shared/constants/cliTools.js +397 -0
- package/src/shared/constants/colors.js +77 -0
- package/src/shared/constants/config.js +99 -0
- package/src/shared/constants/coworkPlugins.js +75 -0
- package/src/shared/constants/index.js +4 -0
- package/src/shared/constants/locales.js +36 -0
- package/src/shared/constants/mitmToolHosts.js +12 -0
- package/src/shared/constants/models.js +38 -0
- package/src/shared/constants/pricing.js +303 -0
- package/src/shared/constants/providers.js +289 -0
- package/src/shared/constants/skills.js +78 -0
- package/src/shared/constants/ttsProviders.js +138 -0
- package/src/shared/hooks/index.js +2 -0
- package/src/shared/hooks/useCopyToClipboard.js +43 -0
- package/src/shared/hooks/useTheme.js +60 -0
- package/src/shared/services/bootstrap.js +12 -0
- package/src/shared/services/initializeApp.js +268 -0
- package/src/shared/utils/api.js +93 -0
- package/src/shared/utils/apiKey.js +98 -0
- package/src/shared/utils/clineAuth.js +37 -0
- package/src/shared/utils/cn.js +11 -0
- package/src/shared/utils/connectionStatus.js +162 -0
- package/src/shared/utils/index.js +40 -0
- package/src/shared/utils/machine.js +6 -0
- package/src/shared/utils/machineId.js +66 -0
- package/src/shared/utils/providerModelsFetcher.js +30 -0
- package/src/sse/handlers/chat.js +261 -0
- package/src/sse/handlers/embeddings.js +141 -0
- package/src/sse/handlers/fetch.js +213 -0
- package/src/sse/handlers/imageGeneration.js +142 -0
- package/src/sse/handlers/search.js +206 -0
- package/src/sse/handlers/stt.js +88 -0
- package/src/sse/handlers/tts.js +114 -0
- package/src/sse/services/auth.js +346 -0
- package/src/sse/services/codexGateway.js +215 -0
- package/src/sse/services/model.js +99 -0
- package/src/sse/services/tokenRefresh.js +319 -0
- package/src/sse/utils/logger.js +75 -0
- package/src/store/headerSearchStore.js +19 -0
- package/src/store/index.js +6 -0
- package/src/store/notificationStore.js +45 -0
- package/src/store/providerStore.js +55 -0
- package/src/store/settingsStore.js +51 -0
- package/src/store/themeStore.js +54 -0
- package/src/store/userStore.js +20 -0
- package/start.sh +4 -0
|
@@ -0,0 +1,1311 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
<img src="../images/9router.png?1" alt="Панель управления 9Router" width="800"/>
|
|
3
|
+
|
|
4
|
+
# 9Router - Free AI Router
|
|
5
|
+
|
|
6
|
+
**Никогда не прекращайте кодить. Автоматическая маршрутизация к БЕСПЛАТНЫМ и дешёвым AI-моделям с умным механизмом резервирования.**
|
|
7
|
+
|
|
8
|
+
**Бесплатный AI-провайдер для OpenClaw.**
|
|
9
|
+
|
|
10
|
+
<p align="center">
|
|
11
|
+
<img src="../public/providers/openclaw.png" alt="OpenClaw" width="80"/>
|
|
12
|
+
</p>
|
|
13
|
+
|
|
14
|
+
[](https://www.npmjs.com/package/9router)
|
|
15
|
+
[](https://www.npmjs.com/package/9router)
|
|
16
|
+
[](https://github.com/decolua/9router/blob/main/LICENSE)
|
|
17
|
+
|
|
18
|
+
[🚀 Быстрый старт](#-quick-start) • [💡 Возможности](#-key-features) • [📖 Установка](#-setup-guide) • [🌐 Сайт](https://9router.com)
|
|
19
|
+
</div>
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## 🤔 Почему 9Router?
|
|
24
|
+
|
|
25
|
+
**Перестаньте тратить деньги и упираться в лимиты:**
|
|
26
|
+
|
|
27
|
+
- ❌ Квота подписки сгорает каждый месяц, не будучи израсходованной
|
|
28
|
+
- ❌ Ограничение скорости (rate limit) прерывает вас прямо во время работы
|
|
29
|
+
- ❌ Дорогие API ($20-50/мес за каждого провайдера)
|
|
30
|
+
- ❌ Приходится вручную переключаться между провайдерами
|
|
31
|
+
|
|
32
|
+
**9Router решает это:**
|
|
33
|
+
|
|
34
|
+
- ✅ **Максимум из подписки** — Отслеживает квоту, использует каждый бит до сброса
|
|
35
|
+
- ✅ **Автоматическое резервирование** — Подписка → Дёшево → Бесплатно, нулевой простой
|
|
36
|
+
- ✅ **Несколько аккаунтов** — Round-robin по аккаунтам каждого провайдера
|
|
37
|
+
- ✅ **Универсальность** — Работает с Claude Code, Codex, Gemini CLI, Cursor, Cline, любым CLI-инструментом
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## 🔄 Как это работает
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
┌─────────────┐
|
|
45
|
+
│ Your CLI │ (Claude Code, Codex, Gemini CLI, OpenClaw, Cursor, Cline...)
|
|
46
|
+
│ Tool │
|
|
47
|
+
└──────┬──────┘
|
|
48
|
+
│ http://localhost:20128/v1
|
|
49
|
+
↓
|
|
50
|
+
┌────────────────────────────────────────┐
|
|
51
|
+
│ 9Router (Smart Router) │
|
|
52
|
+
│ • Format translation (OpenAI ↔ Claude) │
|
|
53
|
+
│ • Quota tracking │
|
|
54
|
+
│ • Auto token refresh │
|
|
55
|
+
└──────┬──────────────────────────────────┘
|
|
56
|
+
│
|
|
57
|
+
├─→ [Tier 1: SUBSCRIPTION] Claude Code, Codex, Gemini CLI
|
|
58
|
+
│ ↓ quota exhausted
|
|
59
|
+
├─→ [Tier 2: CHEAP] GLM ($0.6/1M), MiniMax ($0.2/1M)
|
|
60
|
+
│ budget limit
|
|
61
|
+
└─→ [Tier 3: FREE] iFlow, Qwen, Kiro (unlimited)
|
|
62
|
+
|
|
63
|
+
Result: Never stop coding, minimal cost
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## ⚡ Быстрый старт
|
|
69
|
+
|
|
70
|
+
**1. Глобальная установка:**
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
npm install -g 9router
|
|
74
|
+
9router
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
🎉 Панель управления откроется на `http://localhost:20128`
|
|
78
|
+
|
|
79
|
+
**2. Подключите БЕСПЛАТНОГО провайдера (без подписки):**
|
|
80
|
+
|
|
81
|
+
Панель управления → Providers → Подключить **Claude Code** или **Antigravity** → Вход через OAuth → Готово!
|
|
82
|
+
|
|
83
|
+
**3. Используйте в вашем CLI-инструменте:**
|
|
84
|
+
|
|
85
|
+
```
|
|
86
|
+
Настройки Claude Code/Codex/Gemini CLI/OpenClaw/Cursor/Cline:
|
|
87
|
+
Endpoint: http://localhost:20128/v1
|
|
88
|
+
API Key: [скопируйте из панели управления]
|
|
89
|
+
Model: if/kimi-k2-thinking
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
**Готово!** Начинайте кодить с БЕСПЛАТНЫМИ AI-моделями.
|
|
93
|
+
|
|
94
|
+
**Альтернатива: запуск из исходников (этот репозиторий):**
|
|
95
|
+
|
|
96
|
+
Пакет этого репозитория приватный (`9router-app`), поэтому запуск из исходников/Docker — это ожидаемый путь локальной разработки.
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
cp .env.example .env
|
|
100
|
+
npm install
|
|
101
|
+
PORT=20128 NEXT_PUBLIC_BASE_URL=http://localhost:20128 npm run dev
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Режим Production:
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
npm run build
|
|
108
|
+
PORT=20128 HOSTNAME=0.0.0.0 NEXT_PUBLIC_BASE_URL=http://localhost:20128 npm run start
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
URL по умолчанию:
|
|
112
|
+
- Панель управления: `http://localhost:20128/dashboard`
|
|
113
|
+
- OpenAI-совместимый API: `http://localhost:20128/v1`
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## 🎥 Видео-руководство
|
|
118
|
+
|
|
119
|
+
<div align="center">
|
|
120
|
+
|
|
121
|
+
### 📺 Полное руководство по настройке - 9Router + Claude Code БЕСПЛАТНО
|
|
122
|
+
|
|
123
|
+
[](https://www.youtube.com/watch?v=raEyZPg5xE0)
|
|
124
|
+
|
|
125
|
+
**🎬 Полное пошаговое руководство:**
|
|
126
|
+
- ✅ Установка и настройка 9Router
|
|
127
|
+
- ✅ Настройка Claude Sonnet 4.5 БЕСПЛАТНО
|
|
128
|
+
- ✅ Интеграция с Claude Code
|
|
129
|
+
- ✅ Тестирование кода вживую
|
|
130
|
+
|
|
131
|
+
**⏱️ Длительность:** 20 минут | **👥 Автор:** Сообщество разработчиков
|
|
132
|
+
|
|
133
|
+
[▶️ Смотреть на YouTube](https://www.youtube.com/watch?v=o3qYCyjrFYg)
|
|
134
|
+
|
|
135
|
+
</div>
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## 🛠️ Поддерживаемые CLI-инструменты
|
|
140
|
+
|
|
141
|
+
9Router бесшовно работает со всеми основными AI-инструментами для кодинга:
|
|
142
|
+
|
|
143
|
+
<div align="center">
|
|
144
|
+
<table>
|
|
145
|
+
<tr>
|
|
146
|
+
<td align="center" width="120">
|
|
147
|
+
<img src="../public/providers/claude.png" width="60" alt="Claude Code"/><br/>
|
|
148
|
+
<b>Claude-Code</b>
|
|
149
|
+
</td>
|
|
150
|
+
<td align="center" width="120">
|
|
151
|
+
<img src="../public/providers/openclaw.png" width="60" alt="OpenClaw"/><br/>
|
|
152
|
+
<b>OpenClaw</b>
|
|
153
|
+
</td>
|
|
154
|
+
<td align="center" width="120">
|
|
155
|
+
<img src="../public/providers/codex.png" width="60" alt="Codex"/><br/>
|
|
156
|
+
<b>Codex</b>
|
|
157
|
+
</td>
|
|
158
|
+
<td align="center" width="120">
|
|
159
|
+
<img src="../public/providers/opencode.png" width="60" alt="OpenCode"/><br/>
|
|
160
|
+
<b>OpenCode</b>
|
|
161
|
+
</td>
|
|
162
|
+
<td align="center" width="120">
|
|
163
|
+
<img src="../public/providers/cursor.png" width="60" alt="Cursor"/><br/>
|
|
164
|
+
<b>Cursor</b>
|
|
165
|
+
</td>
|
|
166
|
+
<td align="center" width="120">
|
|
167
|
+
<img src="../public/providers/antigravity.png" width="60" alt="Antigravity"/><br/>
|
|
168
|
+
<b>Antigravity</b>
|
|
169
|
+
</td>
|
|
170
|
+
</tr>
|
|
171
|
+
<tr>
|
|
172
|
+
<td align="center" width="120">
|
|
173
|
+
<img src="../public/providers/cline.png" width="60" alt="Cline"/><br/>
|
|
174
|
+
<b>Cline</b>
|
|
175
|
+
</td>
|
|
176
|
+
<td align="center" width="120">
|
|
177
|
+
<img src="../public/providers/continue.png" width="60" alt="Continue"/><br/>
|
|
178
|
+
<b>Continue</b>
|
|
179
|
+
</td>
|
|
180
|
+
<td align="center" width="120">
|
|
181
|
+
<img src="../public/providers/droid.png" width="60" alt="Droid"/><br/>
|
|
182
|
+
<b>Droid</b>
|
|
183
|
+
</td>
|
|
184
|
+
<td align="center" width="120">
|
|
185
|
+
<img src="../public/providers/roo.png" width="60" alt="Roo"/><br/>
|
|
186
|
+
<b>Roo</b>
|
|
187
|
+
</td>
|
|
188
|
+
<td align="center" width="120">
|
|
189
|
+
<img src="../public/providers/copilot.png" width="60" alt="Copilot"/><br/>
|
|
190
|
+
<b>Copilot</b>
|
|
191
|
+
</td>
|
|
192
|
+
<td align="center" width="120">
|
|
193
|
+
<img src="../public/providers/kilocode.png" width="60" alt="Kilo Code"/><br/>
|
|
194
|
+
<b>Kilo Code</b>
|
|
195
|
+
</td>
|
|
196
|
+
</tr>
|
|
197
|
+
</table>
|
|
198
|
+
</div>
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
## Поддерживаемые провайдеры
|
|
203
|
+
|
|
204
|
+
### 🔐 OAuth-провайдеры
|
|
205
|
+
|
|
206
|
+
<div align="center">
|
|
207
|
+
<table>
|
|
208
|
+
<tr>
|
|
209
|
+
<td align="center" width="120">
|
|
210
|
+
<img src="../public/providers/claude.png" width="60" alt="Claude Code"/><br/>
|
|
211
|
+
<b>Claude-Code</b>
|
|
212
|
+
</td>
|
|
213
|
+
<td align="center" width="120">
|
|
214
|
+
<img src="../public/providers/antigravity.png" width="60" alt="Antigravity"/><br/>
|
|
215
|
+
<b>Antigravity</b>
|
|
216
|
+
</td>
|
|
217
|
+
<td align="center" width="120">
|
|
218
|
+
<img src="../public/providers/codex.png" width="60" alt="Codex"/><br/>
|
|
219
|
+
<b>Codex</b>
|
|
220
|
+
</td>
|
|
221
|
+
<td align="center" width="120">
|
|
222
|
+
<img src="../public/providers/github.png" width="60" alt="GitHub"/><br/>
|
|
223
|
+
<b>GitHub</b>
|
|
224
|
+
</td>
|
|
225
|
+
<td align="center" width="120">
|
|
226
|
+
<img src="../public/providers/cursor.png" width="60" alt="Cursor"/><br/>
|
|
227
|
+
<b>Cursor</b>
|
|
228
|
+
</td>
|
|
229
|
+
</tr>
|
|
230
|
+
</table>
|
|
231
|
+
</div>
|
|
232
|
+
|
|
233
|
+
### 🆓 Бесплатные провайдеры
|
|
234
|
+
|
|
235
|
+
<div align="center">
|
|
236
|
+
<table>
|
|
237
|
+
<tr>
|
|
238
|
+
<td align="center" width="150">
|
|
239
|
+
<img src="../public/providers/iflow.png" width="70" alt="iFlow"/><br/>
|
|
240
|
+
<b>iFlow AI</b><br/>
|
|
241
|
+
<sub>8+ моделей • Без ограничений</sub>
|
|
242
|
+
</td>
|
|
243
|
+
<td align="center" width="150">
|
|
244
|
+
<img src="../public/providers/qwen.png" width="70" alt="Qwen"/><br/>
|
|
245
|
+
<b>Qwen Code</b><br/>
|
|
246
|
+
<sub>3+ моделей • Без ограничений</sub>
|
|
247
|
+
</td>
|
|
248
|
+
<td align="center" width="150">
|
|
249
|
+
<img src="../public/providers/gemini-cli.png" width="70" alt="Gemini CLI"/><br/>
|
|
250
|
+
<b>Gemini CLI</b><br/>
|
|
251
|
+
<sub>180K/мес БЕСПЛАТНО</sub>
|
|
252
|
+
</td>
|
|
253
|
+
<td align="center" width="150">
|
|
254
|
+
<img src="../public/providers/kiro.png" width="70" alt="Kiro"/><br/>
|
|
255
|
+
<b>Kiro AI</b><br/>
|
|
256
|
+
<sub>Claude • Без ограничений</sub>
|
|
257
|
+
</td>
|
|
258
|
+
</tr>
|
|
259
|
+
</table>
|
|
260
|
+
</div>
|
|
261
|
+
|
|
262
|
+
### 🔑 Провайдеры с API Key (40+)
|
|
263
|
+
|
|
264
|
+
<div align="center">
|
|
265
|
+
<table>
|
|
266
|
+
<tr>
|
|
267
|
+
<td align="center" width="100">
|
|
268
|
+
<img src="../public/providers/openrouter.png" width="50" alt="OpenRouter"/><br/>
|
|
269
|
+
<sub>OpenRouter</sub>
|
|
270
|
+
</td>
|
|
271
|
+
<td align="center" width="100">
|
|
272
|
+
<img src="../public/providers/glm.png" width="50" alt="GLM"/><br/>
|
|
273
|
+
<sub>GLM</sub>
|
|
274
|
+
</td>
|
|
275
|
+
<td align="center" width="100">
|
|
276
|
+
<img src="../public/providers/kimi.png" width="50" alt="Kimi"/><br/>
|
|
277
|
+
<sub>Kimi</sub>
|
|
278
|
+
</td>
|
|
279
|
+
<td align="center" width="100">
|
|
280
|
+
<img src="../public/providers/minimax.png" width="50" alt="MiniMax"/><br/>
|
|
281
|
+
<sub>MiniMax</sub>
|
|
282
|
+
</td>
|
|
283
|
+
<td align="center" width="100">
|
|
284
|
+
<img src="../public/providers/openai.png" width="50" alt="OpenAI"/><br/>
|
|
285
|
+
<sub>OpenAI</sub>
|
|
286
|
+
</td>
|
|
287
|
+
<td align="center" width="100">
|
|
288
|
+
<img src="../public/providers/anthropic.png" width="50" alt="Anthropic"/><br/>
|
|
289
|
+
<sub>Anthropic</sub>
|
|
290
|
+
</td>
|
|
291
|
+
</tr>
|
|
292
|
+
<tr>
|
|
293
|
+
<td align="center" width="100">
|
|
294
|
+
<img src="../public/providers/gemini.png" width="50" alt="Gemini"/><br/>
|
|
295
|
+
<sub>Gemini</sub>
|
|
296
|
+
</td>
|
|
297
|
+
<td align="center" width="100">
|
|
298
|
+
<img src="../public/providers/deepseek.png" width="50" alt="DeepSeek"/><br/>
|
|
299
|
+
<sub>DeepSeek</sub>
|
|
300
|
+
</td>
|
|
301
|
+
<td align="center" width="100">
|
|
302
|
+
<img src="../public/providers/groq.png" width="50" alt="Groq"/><br/>
|
|
303
|
+
<sub>Groq</sub>
|
|
304
|
+
</td>
|
|
305
|
+
<td align="center" width="100">
|
|
306
|
+
<img src="../public/providers/xai.png" width="50" alt="xAI"/><br/>
|
|
307
|
+
<sub>xAI</sub>
|
|
308
|
+
</td>
|
|
309
|
+
<td align="center" width="100">
|
|
310
|
+
<img src="../public/providers/mistral.png" width="50" alt="Mistral"/><br/>
|
|
311
|
+
<sub>Mistral</sub>
|
|
312
|
+
</td>
|
|
313
|
+
<td align="center" width="100">
|
|
314
|
+
<img src="../public/providers/perplexity.png" width="50" alt="Perplexity"/><br/>
|
|
315
|
+
<sub>Perplexity</sub>
|
|
316
|
+
</td>
|
|
317
|
+
</tr>
|
|
318
|
+
<tr>
|
|
319
|
+
<td align="center" width="100">
|
|
320
|
+
<img src="../public/providers/together.png" width="50" alt="Together"/><br/>
|
|
321
|
+
<sub>Together AI</sub>
|
|
322
|
+
</td>
|
|
323
|
+
<td align="center" width="100">
|
|
324
|
+
<img src="../public/providers/fireworks.png" width="50" alt="Fireworks"/><br/>
|
|
325
|
+
<sub>Fireworks</sub>
|
|
326
|
+
</td>
|
|
327
|
+
<td align="center" width="100">
|
|
328
|
+
<img src="../public/providers/cerebras.png" width="50" alt="Cerebras"/><br/>
|
|
329
|
+
<sub>Cerebras</sub>
|
|
330
|
+
</td>
|
|
331
|
+
<td align="center" width="100">
|
|
332
|
+
<img src="../public/providers/cohere.png" width="50" alt="Cohere"/><br/>
|
|
333
|
+
<sub>Cohere</sub>
|
|
334
|
+
</td>
|
|
335
|
+
<td align="center" width="100">
|
|
336
|
+
<img src="../public/providers/nvidia.png" width="50" alt="NVIDIA"/><br/>
|
|
337
|
+
<sub>NVIDIA</sub>
|
|
338
|
+
</td>
|
|
339
|
+
<td align="center" width="100">
|
|
340
|
+
<img src="../public/providers/siliconflow.png" width="50" alt="SiliconFlow"/><br/>
|
|
341
|
+
<sub>SiliconFlow</sub>
|
|
342
|
+
</td>
|
|
343
|
+
</tr>
|
|
344
|
+
</table>
|
|
345
|
+
<p><i>...и более 20 других провайдеров, включая Nebius, Chutes, Hyperbolic и пользовательские OpenAI/Anthropic-совместимые эндпоинты</i></p>
|
|
346
|
+
</div>
|
|
347
|
+
|
|
348
|
+
---
|
|
349
|
+
|
|
350
|
+
## 💡 Ключевые возможности
|
|
351
|
+
|
|
352
|
+
| Возможность | Что делает | Почему это важно |
|
|
353
|
+
|---------|--------------|----------------|
|
|
354
|
+
| 🎯 **Smart 3-Tier Fallback** | Авто-маршрутизация: Подписка → Дёшево → Бесплатно | Никогда не прекращайте кодить, нулевой простой |
|
|
355
|
+
| 📊 **Отслеживание квоты в реальном времени** | Живой подсчёт токенов + обратный отсчёт до сброса | Максимум ценности из подписки |
|
|
356
|
+
| 🔄 **Трансляция форматов** | OpenAI ↔ Claude ↔ Gemini бесшовно | Работает с любым CLI-инструментом |
|
|
357
|
+
| 👥 **Поддержка нескольких аккаунтов** | Несколько аккаунтов на каждого провайдера | Балансировка нагрузки + резервирование |
|
|
358
|
+
| 🔄 **Авто-обновление токена** | OAuth-токены обновляются автоматически | Не нужно входить вручную заново |
|
|
359
|
+
| 🎨 **Пользовательские комбо** | Создавайте безграничные комбинации моделей | Настройте резервирование под себя |
|
|
360
|
+
| 📝 **Логирование запросов** | Режим отладки с полным логом запросов/ответов | Лёгкая диагностика проблем |
|
|
361
|
+
| 💾 **Облачная синхронизация** | Синхронизация конфигурации между устройствами | Одинаковые настройки везде |
|
|
362
|
+
| 📊 **Аналитика использования** | Отслеживание токенов, затрат, трендов во времени | Оптимизация расходов |
|
|
363
|
+
| 🌐 **Развёртывание где угодно** | Localhost, VPS, Docker, Cloudflare Workers | Гибкие варианты развёртывания |
|
|
364
|
+
|
|
365
|
+
<details>
|
|
366
|
+
<summary><b>📖 Подробности о возможностях</b></summary>
|
|
367
|
+
|
|
368
|
+
### 🎯 Smart 3-Tier Fallback
|
|
369
|
+
|
|
370
|
+
Создавайте комбо с автоматическим резервированием:
|
|
371
|
+
|
|
372
|
+
```
|
|
373
|
+
Combo: "my-coding-stack"
|
|
374
|
+
1. cc/claude-opus-4-6 (ваша подписка)
|
|
375
|
+
2. glm/glm-4.7 (дешёвый бэкап, $0.6/1M)
|
|
376
|
+
3. if/kimi-k2-thinking (бесплатное резервирование)
|
|
377
|
+
|
|
378
|
+
→ Автопереключение при исчерпании квоты или ошибке
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
### 📊 Отслеживание квоты в реальном времени
|
|
382
|
+
|
|
383
|
+
- Потребление токенов по каждому провайдеру
|
|
384
|
+
- Обратный отсчёт до сброса (5 часов, ежедневно, еженедельно)
|
|
385
|
+
- Оценка затрат для платных уровней
|
|
386
|
+
- Ежемесячный отчёт о расходах
|
|
387
|
+
|
|
388
|
+
### 🔄 Трансляция форматов
|
|
389
|
+
|
|
390
|
+
Бесшовная трансляция между форматами:
|
|
391
|
+
- **OpenAI** ↔ **Claude** ↔ **Gemini** ↔ **OpenAI Responses**
|
|
392
|
+
- Ваш CLI-инструмент отправляет формат OpenAI → 9Router транслирует → Провайдер получает родной формат
|
|
393
|
+
- Работает с любым инструментом, поддерживающим пользовательский эндпоинт OpenAI
|
|
394
|
+
|
|
395
|
+
### 👥 Поддержка нескольких аккаунтов
|
|
396
|
+
|
|
397
|
+
- Добавляйте несколько аккаунтов на каждого провайдера
|
|
398
|
+
- Round-robin или маршрутизация по приоритету автоматически
|
|
399
|
+
- Резервирование на следующий аккаунт при достижении квоты
|
|
400
|
+
|
|
401
|
+
### 🔄 Авто-обновление токена
|
|
402
|
+
|
|
403
|
+
- OAuth-токены автоматически обновляются до истечения срока
|
|
404
|
+
- Не нужна повторная ручная аутентификация
|
|
405
|
+
- Бесшовный опыт со всеми провайдерами
|
|
406
|
+
|
|
407
|
+
### 🎨 Пользовательские комбо
|
|
408
|
+
|
|
409
|
+
- Создавайте безграничные комбинации моделей
|
|
410
|
+
- Сочетайте уровни подписки, дешёвые и бесплатные
|
|
411
|
+
- Называйте комбо для удобного доступа
|
|
412
|
+
- Делитесь комбо между устройствами через облачную синхронизацию
|
|
413
|
+
|
|
414
|
+
### 📝 Логирование запросов
|
|
415
|
+
|
|
416
|
+
- Включите режим отладки для просмотра полного лога запросов/ответов
|
|
417
|
+
- Отслеживайте вызовы API, заголовки и payload
|
|
418
|
+
- Диагностируйте проблемы интеграции
|
|
419
|
+
- Экспортируйте логи для анализа
|
|
420
|
+
|
|
421
|
+
### 💾 Облачная синхронизация
|
|
422
|
+
|
|
423
|
+
- Синхронизация провайдеров, комбо и настроек между устройствами
|
|
424
|
+
- Автоматическая фоновая синхронизация
|
|
425
|
+
- Безопасное зашифрованное хранилище
|
|
426
|
+
- Доступ к настройкам откуда угодно
|
|
427
|
+
|
|
428
|
+
#### Заметки о облачном рантайме
|
|
429
|
+
|
|
430
|
+
- Приоритет серверным облачным переменным в production-окружении:
|
|
431
|
+
- `BASE_URL` (внутренний callback URL, используемый планировщиком синхронизации)
|
|
432
|
+
- `CLOUD_URL` (база эндпоинта облачной синхронизации)
|
|
433
|
+
- `NEXT_PUBLIC_BASE_URL` и `NEXT_PUBLIC_CLOUD_URL` по-прежнему поддерживаются для совместимости/UI, но серверный рантайм теперь приоритезирует `BASE_URL`/`CLOUD_URL`.
|
|
434
|
+
- Запросы облачной синхронизации теперь используют тайм-аут + fail-fast поведение, чтобы избежать зависания UI при недоступности DNS/облачной сети.
|
|
435
|
+
|
|
436
|
+
### 📊 Аналитика использования
|
|
437
|
+
|
|
438
|
+
- Отслеживание использования токенов по провайдеру и модели
|
|
439
|
+
- Оценка затрат и тренды расходов
|
|
440
|
+
- Ежемесячные отчёты и инсайты
|
|
441
|
+
- Оптимизация ваших AI-расходов
|
|
442
|
+
|
|
443
|
+
> **💡 ВАЖНО - Понимание «Затрат» на панели управления:**
|
|
444
|
+
>
|
|
445
|
+
> «Затраты», показанные в Аналитике использования, предназначены **только для отслеживания и сравнения**.
|
|
446
|
+
> Сам 9Router **никогда ничего не взимает** с вас. Вы платите напрямую провайдерам (если используете платные сервисы).
|
|
447
|
+
>
|
|
448
|
+
> **Пример:** Если на панели показано «общие затраты $290» при использовании моделей iFlow, это представляет
|
|
449
|
+
> сумму, которую вы заплатили бы при прямом использовании платного API. Ваши фактические затраты = **$0** (iFlow бесплатен без ограничений).
|
|
450
|
+
>
|
|
451
|
+
> Считайте это «трекером экономии», показывающим, сколько вы экономите, используя бесплатные модели или
|
|
452
|
+
> маршрутизацию через 9Router!
|
|
453
|
+
|
|
454
|
+
### 🌐 Развёртывание где угодно
|
|
455
|
+
|
|
456
|
+
- 💻 **Localhost** — По умолчанию, работает офлайн
|
|
457
|
+
- ☁️ **VPS/Cloud** — Общий доступ между устройствами
|
|
458
|
+
- 🐳 **Docker** — Развёртывание одной командой
|
|
459
|
+
- 🚀 **Cloudflare Workers** — Глобальная edge-сеть
|
|
460
|
+
|
|
461
|
+
</details>
|
|
462
|
+
|
|
463
|
+
---
|
|
464
|
+
|
|
465
|
+
## 💰 Обзор цен
|
|
466
|
+
|
|
467
|
+
| Уровень | Провайдер | Стоимость | Сброс квоты | Лучше всего для |
|
|
468
|
+
|------|----------|------|-------------|----------|
|
|
469
|
+
| **💳 ПОДПИСКА** | Claude Code (Pro) | $20/мес | 5ч + еженедельно | Уже подписаны |
|
|
470
|
+
| | Codex (Plus/Pro) | $20-200/мес | 5ч + еженедельно | Пользователи OpenAI |
|
|
471
|
+
| | Gemini CLI | **БЕСПЛАТНО** | 180K/мес + 1K/день | Для всех! |
|
|
472
|
+
| | GitHub Copilot | $10-19/мес | Ежемесячно | Пользователи GitHub |
|
|
473
|
+
| **💰 ДЁШЕВО** | GLM-4.7 | $0.6/1M | 10:00 ежедневно | Бюджетный бэкап |
|
|
474
|
+
| | MiniMax M2.1 | $0.2/1M | Скользящие 5 часов | Самый дешёвый вариант |
|
|
475
|
+
| | Kimi K2 | $9/мес фикс. | 10M токенов/мес | Предсказуемая стоимость |
|
|
476
|
+
| **🆓 БЕСПЛАТНО** | iFlow | $0 | Без ограничений | 8 бесплатных моделей |
|
|
477
|
+
| | Qwen | $0 | Без ограничений | 3 бесплатные модели |
|
|
478
|
+
| | Kiro | $0 | Без ограничений | Claude бесплатно |
|
|
479
|
+
|
|
480
|
+
**💡 Профи-совет:** Начните с комбо Gemini CLI (180K бесплатно/мес) + iFlow (без ограничений бесплатно) = $0 затрат!
|
|
481
|
+
|
|
482
|
+
---
|
|
483
|
+
|
|
484
|
+
### 📊 Понимание затрат и оплаты в 9Router
|
|
485
|
+
|
|
486
|
+
**Реальность оплаты 9Router:**
|
|
487
|
+
|
|
488
|
+
✅ **Софт 9Router = БЕСПЛАТНО навсегда** (открытый код, никогда не взимает плату)
|
|
489
|
+
✅ **«Затраты» на панели = Только для отображения/отслеживания** (не реальный счёт)
|
|
490
|
+
✅ **Вы платите напрямую провайдерам** (подписка или плата за API)
|
|
491
|
+
✅ **БЕСПЛАТНЫЕ провайдеры остаются БЕСПЛАТНЫМИ** (iFlow, Kiro, Qwen = $0 без ограничений)
|
|
492
|
+
❌ **9Router никогда не выставляет счёт** и не списывает с вашей карты
|
|
493
|
+
|
|
494
|
+
**Как работает отображение затрат:**
|
|
495
|
+
|
|
496
|
+
Панель показывает **оценочные затраты**, как если бы вы напрямую использовали платный API. Это **не оплата** — это инструмент сравнения, показывающий вашу экономию.
|
|
497
|
+
|
|
498
|
+
**Пример сценария:**
|
|
499
|
+
```
|
|
500
|
+
Показано на панели:
|
|
501
|
+
• Всего запросов: 1,662
|
|
502
|
+
• Всего токенов: 47M
|
|
503
|
+
• Отображаемые затраты: $290
|
|
504
|
+
|
|
505
|
+
Реальная проверка:
|
|
506
|
+
• Провайдер: iFlow (БЕСПЛАТНО без ограничений)
|
|
507
|
+
• Фактическая оплата: $0.00
|
|
508
|
+
• Значение $290: Сумма, которую вы СЭКОНОМИЛИ, используя бесплатные модели!
|
|
509
|
+
```
|
|
510
|
+
|
|
511
|
+
**Правила оплаты:**
|
|
512
|
+
- **Провайдеры подписки** (Claude Code, Codex): Платите им напрямую через их сайт
|
|
513
|
+
- **Дешёвые провайдеры** (GLM, MiniMax): Платите им напрямую, 9Router только маршрутизирует
|
|
514
|
+
- **БЕСПЛАТНЫЕ провайдеры** (iFlow, Kiro, Qwen): Действительно бесплатны навсегда, без скрытых платежей
|
|
515
|
+
- **9Router**: Никогда ничего не взимает, никогда
|
|
516
|
+
|
|
517
|
+
---
|
|
518
|
+
|
|
519
|
+
## 🎯 Сценарии использования
|
|
520
|
+
|
|
521
|
+
### Сценарий 1: «У меня подписка Claude Pro»
|
|
522
|
+
|
|
523
|
+
**Проблема:** Квота сгорает неиспользованной, rate limit при интенсивной работе
|
|
524
|
+
|
|
525
|
+
**Решение:**
|
|
526
|
+
```
|
|
527
|
+
Combo: "maximize-claude"
|
|
528
|
+
1. cc/claude-opus-4-6 (полное использование подписки)
|
|
529
|
+
2. glm/glm-4.7 (дешёвый бэкап при исчерпании квоты)
|
|
530
|
+
3. if/kimi-k2-thinking (бесплатное аварийное резервирование)
|
|
531
|
+
|
|
532
|
+
Месячная стоимость: $20 (подписка) + ~$5 (бэкап) = $25 итого
|
|
533
|
+
против $20 + упирание в лимит = разочарование
|
|
534
|
+
```
|
|
535
|
+
|
|
536
|
+
### Сценарий 2: «Хочу нулевые затраты»
|
|
537
|
+
|
|
538
|
+
**Проблема:** Не могу позволить подписку, нужен надёжный AI-кодинг
|
|
539
|
+
|
|
540
|
+
**Решение:**
|
|
541
|
+
```
|
|
542
|
+
Combo: "free-forever"
|
|
543
|
+
1. gc/gemini-3-flash (180K бесплатно/мес)
|
|
544
|
+
2. if/kimi-k2-thinking (без ограничений бесплатно)
|
|
545
|
+
3. qw/qwen3-coder-plus (без ограничений бесплатно)
|
|
546
|
+
|
|
547
|
+
Месячная стоимость: $0
|
|
548
|
+
Качество: Production-ready модели
|
|
549
|
+
```
|
|
550
|
+
|
|
551
|
+
### Сценарий 3: «Нужно кодить 24/7, без перерывов»
|
|
552
|
+
|
|
553
|
+
**Проблема:** Дедлайны, нельзя допустить простоя
|
|
554
|
+
|
|
555
|
+
**Решение:**
|
|
556
|
+
```
|
|
557
|
+
Combo: "always-on"
|
|
558
|
+
1. cc/claude-opus-4-6 (лучшее качество)
|
|
559
|
+
2. cx/gpt-5.2-codex (вторая подписка)
|
|
560
|
+
3. glm/glm-4.7 (дёшево, ежедневный сброс)
|
|
561
|
+
4. minimax/MiniMax-M2.1 (самый дешёвый, сброс 5ч)
|
|
562
|
+
5. if/kimi-k2-thinking (бесплатно без ограничений)
|
|
563
|
+
|
|
564
|
+
Результат: 5 слоёв резервирования = нулевой простой
|
|
565
|
+
Месячная стоимость: $20-200 (подписки) + $10-20 (бэкап)
|
|
566
|
+
```
|
|
567
|
+
|
|
568
|
+
### Сценарий 4: «Хочу БЕСПЛАТНЫЙ AI в OpenClaw»
|
|
569
|
+
|
|
570
|
+
**Проблема:** Нужен AI-ассистент в мессенджерах (WhatsApp, Telegram, Slack...), полностью бесплатно
|
|
571
|
+
|
|
572
|
+
**Решение:**
|
|
573
|
+
```
|
|
574
|
+
Combo: "openclaw-free"
|
|
575
|
+
1. if/glm-4.7 (без ограничений бесплатно)
|
|
576
|
+
2. if/minimax-m2.1 (без ограничений бесплатно)
|
|
577
|
+
3. if/kimi-k2-thinking (без ограничений бесплатно)
|
|
578
|
+
|
|
579
|
+
Месячная стоимость: $0
|
|
580
|
+
Доступ через: WhatsApp, Telegram, Slack, Discord, iMessage, Signal...
|
|
581
|
+
```
|
|
582
|
+
|
|
583
|
+
---
|
|
584
|
+
|
|
585
|
+
## ❓ Часто задаваемые вопросы
|
|
586
|
+
|
|
587
|
+
<details>
|
|
588
|
+
<summary><b>📊 Почему моя панель показывает высокие затраты?</b></summary>
|
|
589
|
+
|
|
590
|
+
Панель отслеживает ваше использование токенов и показывает **оценочные затраты**, как если бы вы напрямую использовали платный API. Это **не реальная оплата** — это справка, показывающая, сколько вы экономите, используя бесплатные модели или существующие подписки через 9Router.
|
|
591
|
+
|
|
592
|
+
**Пример:**
|
|
593
|
+
- **Панель показывает:** «Общие затраты $290»
|
|
594
|
+
- **Реальность:** Вы используете iFlow (БЕСПЛАТНО без ограничений)
|
|
595
|
+
- **Ваши фактические затраты:** **$0.00**
|
|
596
|
+
- **Значение $290:** Сумма, которую вы **экономите**, используя бесплатные модели вместо платного API!
|
|
597
|
+
|
|
598
|
+
Отображение затрат — это «трекер экономии», помогающий понять паттерны использования и возможности оптимизации.
|
|
599
|
+
|
|
600
|
+
</details>
|
|
601
|
+
|
|
602
|
+
<details>
|
|
603
|
+
<summary><b>💳 Взимает ли с меня плату 9Router?</b></summary>
|
|
604
|
+
|
|
605
|
+
**Нет.** 9Router — это бесплатное ПО с открытым кодом, работающее на вашем собственном компьютере. Оно никогда ничего с вас не взимает.
|
|
606
|
+
|
|
607
|
+
**Вы платите только:**
|
|
608
|
+
- ✅ **Провайдерам подписки** (Claude Code $20/мес, Codex $20-200/мес) → Платите им напрямую на их сайте
|
|
609
|
+
- ✅ **Дешёвым провайдерам** (GLM, MiniMax) → Платите им напрямую, 9Router только маршрутизирует ваши запросы
|
|
610
|
+
- ❌ **Самому 9Router** → **Никогда ничего не взимает, никогда**
|
|
611
|
+
|
|
612
|
+
9Router — это локальный прокси/роутер. У него нет вашей кредитной карты, он не может выставлять счета и не имеет платёжной системы. Это полностью бесплатное ПО.
|
|
613
|
+
|
|
614
|
+
</details>
|
|
615
|
+
|
|
616
|
+
<details>
|
|
617
|
+
<summary><b>🆓 Действительно ли БЕСПЛАТНЫЕ провайдеры безлимитны?</b></summary>
|
|
618
|
+
|
|
619
|
+
**Да!** Провайдеры, отмеченные как БЕСПЛАТНЫЕ (iFlow, Kiro, Qwen), действительно безлимитны и **без скрытых платежей**.
|
|
620
|
+
|
|
621
|
+
Это бесплатные сервисы, предоставляемые соответствующими компаниями:
|
|
622
|
+
- **iFlow**: Бесплатный безлимитный доступ к 8+ моделям через OAuth
|
|
623
|
+
- **Kiro**: Бесплатные безлимитные модели Claude через AWS Builder ID
|
|
624
|
+
- **Qwen**: Бесплатный безлимитный доступ к моделям Qwen через аутентификацию устройства
|
|
625
|
+
|
|
626
|
+
9Router только маршрутизирует ваши запросы к ним — никаких «ловушек» или будущих платежей. Это действительно бесплатные сервисы, а 9Router облегчает их использование с поддержкой резервирования.
|
|
627
|
+
|
|
628
|
+
**Примечание:** Некоторые провайдеры подписки (Antigravity, GitHub Copilot) могут иметь бесплатные пробные периоды, которые позже становятся платными, но об этом чётко уведомляют сами провайдеры, а не 9Router.
|
|
629
|
+
|
|
630
|
+
</details>
|
|
631
|
+
|
|
632
|
+
<details>
|
|
633
|
+
<summary><b>💰 Как минимизировать мои реальные AI-затраты?</b></summary>
|
|
634
|
+
|
|
635
|
+
**Стратегия «Бесплатное в приоритете»:**
|
|
636
|
+
|
|
637
|
+
1. **Начните со 100% бесплатного комбо:**
|
|
638
|
+
```
|
|
639
|
+
1. gc/gemini-3-flash (180K/мес бесплатно от Google)
|
|
640
|
+
2. if/kimi-k2-thinking (без ограничений бесплатно от iFlow)
|
|
641
|
+
3. qw/qwen3-coder-plus (без ограничений бесплатно от Qwen)
|
|
642
|
+
```
|
|
643
|
+
**Стоимость: $0/мес**
|
|
644
|
+
|
|
645
|
+
2. **Добавьте дешёвый бэкап** только при необходимости:
|
|
646
|
+
```
|
|
647
|
+
4. glm/glm-4.7 ($0.6/1M токенов)
|
|
648
|
+
```
|
|
649
|
+
**Доп. стоимость:** Платите только за то, что фактически используете
|
|
650
|
+
|
|
651
|
+
3. **Используйте провайдеров подписки в последнюю очередь:**
|
|
652
|
+
- Только если они у вас уже есть
|
|
653
|
+
- 9Router помогает максимизировать их ценность через отслеживание квоты
|
|
654
|
+
|
|
655
|
+
**Результат:** Большинство пользователей могут работать за $0/мес, используя только бесплатные уровни!
|
|
656
|
+
|
|
657
|
+
</details>
|
|
658
|
+
|
|
659
|
+
<details>
|
|
660
|
+
<summary><b>📈 Что если моё использование внезапно вырастет?</b></summary>
|
|
661
|
+
|
|
662
|
+
Умный механизм резервирования 9Router предотвращает неожиданные расходы:
|
|
663
|
+
|
|
664
|
+
**Сценарий:** Вы в спринте кодинга и превышаете квоты
|
|
665
|
+
|
|
666
|
+
**Без 9Router:**
|
|
667
|
+
- ❌ Упёрлись в rate limit → Работа остановилась → Разочарование
|
|
668
|
+
- ❌ Или: Случайно накопили огромный счёт за API
|
|
669
|
+
|
|
670
|
+
**С 9Router:**
|
|
671
|
+
- ✅ Подписка упёрлась в лимит → Авторезервирование на дешёвый уровень
|
|
672
|
+
- ✅ Дешёвый уровень становится дорогим → Авторезервирование на бесплатный уровень
|
|
673
|
+
- ✅ Никогда не прекращаете кодить → Предсказуемая стоимость
|
|
674
|
+
|
|
675
|
+
**Вы контролируете:** Установите лимиты расходов на каждого провайдера в панели, и 9Router будет их соблюдать.
|
|
676
|
+
|
|
677
|
+
</details>
|
|
678
|
+
|
|
679
|
+
---
|
|
680
|
+
|
|
681
|
+
## 📖 Руководство по настройке
|
|
682
|
+
|
|
683
|
+
<details>
|
|
684
|
+
<summary><b>🔐 Провайдеры подписки (Максимум ценности)</b></summary>
|
|
685
|
+
|
|
686
|
+
### Claude Code (Pro/Max)
|
|
687
|
+
|
|
688
|
+
```bash
|
|
689
|
+
Панель управления → Providers → Подключить Claude Code
|
|
690
|
+
→ Вход через OAuth → Авто-обновление токена
|
|
691
|
+
→ Отслеживание квоты 5 часов + еженедельно
|
|
692
|
+
|
|
693
|
+
Модели:
|
|
694
|
+
cc/claude-opus-4-6
|
|
695
|
+
cc/claude-sonnet-4-5-20250929
|
|
696
|
+
cc/claude-haiku-4-5-20251001
|
|
697
|
+
```
|
|
698
|
+
|
|
699
|
+
**Профи-совет:** Используйте Opus для сложных задач, Sonnet для скорости. 9Router отслеживает квоту для каждой модели!
|
|
700
|
+
|
|
701
|
+
### OpenAI Codex (Plus/Pro)
|
|
702
|
+
|
|
703
|
+
```bash
|
|
704
|
+
Панель управления → Providers → Подключить Codex
|
|
705
|
+
→ Вход через OAuth (порт 1455)
|
|
706
|
+
→ Сброс 5 часов + еженедельно
|
|
707
|
+
|
|
708
|
+
Модели:
|
|
709
|
+
cx/gpt-5.2-codex
|
|
710
|
+
cx/gpt-5.1-codex-max
|
|
711
|
+
```
|
|
712
|
+
|
|
713
|
+
### Gemini CLI (БЕСПЛАТНО 180K/мес!)
|
|
714
|
+
|
|
715
|
+
```bash
|
|
716
|
+
Панель управления → Providers → Подключить Gemini CLI
|
|
717
|
+
→ Google OAuth
|
|
718
|
+
→ 180K запросов/мес + 1K/день
|
|
719
|
+
|
|
720
|
+
Модели:
|
|
721
|
+
gc/gemini-3-flash-preview
|
|
722
|
+
gc/gemini-2.5-pro
|
|
723
|
+
```
|
|
724
|
+
|
|
725
|
+
**Лучшая ценность:** Огромный бесплатный уровень! Используйте его перед платными уровнями.
|
|
726
|
+
|
|
727
|
+
### GitHub Copilot
|
|
728
|
+
|
|
729
|
+
```bash
|
|
730
|
+
Панель управления → Providers → Подключить GitHub
|
|
731
|
+
→ OAuth через GitHub
|
|
732
|
+
→ Ежемесячный сброс (1-го числа месяца)
|
|
733
|
+
|
|
734
|
+
Модели:
|
|
735
|
+
gh/gpt-5
|
|
736
|
+
gh/claude-4.5-sonnet
|
|
737
|
+
gh/gemini-3-pro
|
|
738
|
+
```
|
|
739
|
+
|
|
740
|
+
</details>
|
|
741
|
+
|
|
742
|
+
<details>
|
|
743
|
+
<summary><b>💰 Дешёвые провайдеры (Бэкап)</b></summary>
|
|
744
|
+
|
|
745
|
+
### GLM-4.7 (Ежедневный сброс, $0.6/1M)
|
|
746
|
+
|
|
747
|
+
1. Регистрация: [Zhipu AI](https://open.bigmodel.cn/)
|
|
748
|
+
2. Получите API key из Coding Plan
|
|
749
|
+
3. Панель управления → Добавить API Key:
|
|
750
|
+
- Провайдер: `glm`
|
|
751
|
+
- API Key: `your-key`
|
|
752
|
+
|
|
753
|
+
**Использование:** `glm/glm-4.7`
|
|
754
|
+
|
|
755
|
+
**Профи-совет:** Coding Plan даёт втрое больше квоты за 1/7 стоимости! Сброс ежедневно в 10:00.
|
|
756
|
+
|
|
757
|
+
### MiniMax M2.1 (Сброс 5ч, $0.20/1M)
|
|
758
|
+
|
|
759
|
+
1. Регистрация: [MiniMax](https://www.minimax.io/)
|
|
760
|
+
2. Получите API key
|
|
761
|
+
3. Панель управления → Добавить API Key
|
|
762
|
+
|
|
763
|
+
**Использование:** `minimax/MiniMax-M2.1`
|
|
764
|
+
|
|
765
|
+
**Профи-совет:** Самый дешёвый вариант для длинного контекста (1M)!
|
|
766
|
+
|
|
767
|
+
### Kimi K2 ($9/мес фиксированно)
|
|
768
|
+
|
|
769
|
+
1. Регистрация: [Moonshot AI](https://platform.moonshot.ai/)
|
|
770
|
+
2. Получите API key
|
|
771
|
+
3. Панель управления → Добавить API Key
|
|
772
|
+
|
|
773
|
+
**Использование:** `kimi/kimi-latest`
|
|
774
|
+
|
|
775
|
+
**Профи-совет:** Фиксированные $9/мес за 10M токенов = реальная стоимость $0.90/1M!
|
|
776
|
+
|
|
777
|
+
</details>
|
|
778
|
+
|
|
779
|
+
<details>
|
|
780
|
+
<summary><b>🆓 БЕСПЛАТНЫЕ провайдеры (Аварийное резервирование)</b></summary>
|
|
781
|
+
|
|
782
|
+
### iFlow (8 БЕСПЛАТНЫХ моделей)
|
|
783
|
+
|
|
784
|
+
```bash
|
|
785
|
+
Панель управления → Подключить iFlow
|
|
786
|
+
→ Вход через OAuth iFlow
|
|
787
|
+
→ Безлимитное использование
|
|
788
|
+
|
|
789
|
+
Модели:
|
|
790
|
+
if/kimi-k2-thinking
|
|
791
|
+
if/qwen3-coder-plus
|
|
792
|
+
if/glm-4.7
|
|
793
|
+
if/minimax-m2
|
|
794
|
+
if/deepseek-r1
|
|
795
|
+
```
|
|
796
|
+
|
|
797
|
+
### Qwen (3 БЕСПЛАТНЫЕ модели)
|
|
798
|
+
|
|
799
|
+
```bash
|
|
800
|
+
Панель управления → Подключить Qwen
|
|
801
|
+
→ Авторизация по коду устройства
|
|
802
|
+
→ Безлимитное использование
|
|
803
|
+
|
|
804
|
+
Модели:
|
|
805
|
+
qw/qwen3-coder-plus
|
|
806
|
+
qw/qwen3-coder-flash
|
|
807
|
+
```
|
|
808
|
+
|
|
809
|
+
### Kiro (БЕСПЛАТНЫЙ Claude)
|
|
810
|
+
|
|
811
|
+
```bash
|
|
812
|
+
Панель управления → Подключить Kiro
|
|
813
|
+
→ AWS Builder ID или Google/GitHub
|
|
814
|
+
→ Безлимитное использование
|
|
815
|
+
|
|
816
|
+
Модели:
|
|
817
|
+
kr/claude-sonnet-4.5
|
|
818
|
+
kr/claude-haiku-4.5
|
|
819
|
+
```
|
|
820
|
+
|
|
821
|
+
</details>
|
|
822
|
+
|
|
823
|
+
<details>
|
|
824
|
+
<summary><b>🎨 Создание комбо</b></summary>
|
|
825
|
+
|
|
826
|
+
### Пример 1: Максимум из подписки → Дешёвый бэкап
|
|
827
|
+
|
|
828
|
+
```
|
|
829
|
+
Панель управления → Combos → Создать новое
|
|
830
|
+
|
|
831
|
+
Имя: premium-coding
|
|
832
|
+
Модели:
|
|
833
|
+
1. cc/claude-opus-4-6 (Основная подписка)
|
|
834
|
+
2. glm/glm-4.7 (Дешёвый бэкап, $0.6/1M)
|
|
835
|
+
3. minimax/MiniMax-M2.1 (Самое дешёвое резервирование, $0.20/1M)
|
|
836
|
+
|
|
837
|
+
Использование в CLI: premium-coding
|
|
838
|
+
|
|
839
|
+
Пример месячной стоимости (100M токенов):
|
|
840
|
+
80M через Claude (подписка): $0 дополнительно
|
|
841
|
+
15M через GLM: $9
|
|
842
|
+
5M через MiniMax: $1
|
|
843
|
+
Итого: $10 + ваша подписка
|
|
844
|
+
```
|
|
845
|
+
|
|
846
|
+
### Пример 2: Только бесплатно (Нулевая стоимость)
|
|
847
|
+
|
|
848
|
+
```
|
|
849
|
+
Имя: free-combo
|
|
850
|
+
Модели:
|
|
851
|
+
1. gc/gemini-3-flash-preview (180K бесплатно/мес)
|
|
852
|
+
2. if/kimi-k2-thinking (без ограничений)
|
|
853
|
+
3. qw/qwen3-coder-plus (без ограничений)
|
|
854
|
+
|
|
855
|
+
Стоимость: $0 навсегда!
|
|
856
|
+
```
|
|
857
|
+
|
|
858
|
+
</details>
|
|
859
|
+
|
|
860
|
+
<details>
|
|
861
|
+
<summary><b>🔧 Интеграция CLI</b></summary>
|
|
862
|
+
|
|
863
|
+
### Cursor IDE
|
|
864
|
+
|
|
865
|
+
```
|
|
866
|
+
Settings → Models → Advanced:
|
|
867
|
+
OpenAI API Base URL: http://localhost:20128/v1
|
|
868
|
+
OpenAI API Key: [из панели управления 9router]
|
|
869
|
+
Model: cc/claude-opus-4-6
|
|
870
|
+
```
|
|
871
|
+
|
|
872
|
+
Или используйте комбо: `premium-coding`
|
|
873
|
+
|
|
874
|
+
### Claude Code
|
|
875
|
+
|
|
876
|
+
Отредактируйте `~/.claude/config.json`:
|
|
877
|
+
|
|
878
|
+
```json
|
|
879
|
+
{
|
|
880
|
+
"anthropic_api_base": "http://localhost:20128/v1",
|
|
881
|
+
"anthropic_api_key": "your-9router-api-key"
|
|
882
|
+
}
|
|
883
|
+
```
|
|
884
|
+
|
|
885
|
+
### Codex CLI
|
|
886
|
+
|
|
887
|
+
```bash
|
|
888
|
+
export OPENAI_BASE_URL="http://localhost:20128"
|
|
889
|
+
export OPENAI_API_KEY="your-9router-api-key"
|
|
890
|
+
|
|
891
|
+
codex "ваш промпт"
|
|
892
|
+
```
|
|
893
|
+
|
|
894
|
+
### OpenClaw
|
|
895
|
+
|
|
896
|
+
**Вариант 1 — Панель управления (рекомендуется):**
|
|
897
|
+
|
|
898
|
+
```
|
|
899
|
+
Панель управления → CLI Tools → OpenClaw → Выбрать модель → Применить
|
|
900
|
+
```
|
|
901
|
+
|
|
902
|
+
**Вариант 2 — Вручную:** Отредактируйте `~/.openclaw/openclaw.json`:
|
|
903
|
+
|
|
904
|
+
```json
|
|
905
|
+
{
|
|
906
|
+
"agents": {
|
|
907
|
+
"defaults": {
|
|
908
|
+
"model": {
|
|
909
|
+
"primary": "9router/if/glm-4.7"
|
|
910
|
+
}
|
|
911
|
+
}
|
|
912
|
+
},
|
|
913
|
+
"models": {
|
|
914
|
+
"providers": {
|
|
915
|
+
"9router": {
|
|
916
|
+
"baseUrl": "http://127.0.0.1:20128/v1",
|
|
917
|
+
"apiKey": "sk_9router",
|
|
918
|
+
"api": "openai-completions",
|
|
919
|
+
"models": [
|
|
920
|
+
{
|
|
921
|
+
"id": "if/glm-4.7",
|
|
922
|
+
"name": "glm-4.7"
|
|
923
|
+
}
|
|
924
|
+
]
|
|
925
|
+
}
|
|
926
|
+
}
|
|
927
|
+
}
|
|
928
|
+
}
|
|
929
|
+
```
|
|
930
|
+
|
|
931
|
+
> **Примечание:** OpenClaw работает только с локальным 9Router. Используйте `127.0.0.1` вместо `localhost`, чтобы избежать проблем с разрешением имён.
|
|
932
|
+
|
|
933
|
+
### Cline / Continue / RooCode
|
|
934
|
+
|
|
935
|
+
```
|
|
936
|
+
Provider: OpenAI Compatible
|
|
937
|
+
Base URL: http://localhost:20128/v1
|
|
938
|
+
API Key: [из панели управления]
|
|
939
|
+
Model: cc/claude-opus-4-6
|
|
940
|
+
```
|
|
941
|
+
|
|
942
|
+
</details>
|
|
943
|
+
|
|
944
|
+
<details>
|
|
945
|
+
<summary><b>🚀 Развёртывание</b></summary>
|
|
946
|
+
|
|
947
|
+
### Развёртывание на VPS
|
|
948
|
+
|
|
949
|
+
```bash
|
|
950
|
+
# Clone and install
|
|
951
|
+
git clone https://github.com/decolua/9router.git
|
|
952
|
+
cd 9router
|
|
953
|
+
npm install
|
|
954
|
+
npm run build
|
|
955
|
+
|
|
956
|
+
# Configure
|
|
957
|
+
export JWT="your-secure-secret-change-this"
|
|
958
|
+
export INITIAL_PASSWORD="your-password"
|
|
959
|
+
export DATA_DIR="/var/lib/9router"
|
|
960
|
+
export PORT="20128"
|
|
961
|
+
export HOSTNAME="0.0.0.0"
|
|
962
|
+
export NODE_ENV="production"
|
|
963
|
+
export NEXT_PUBLIC_BASE_URL="http://localhost:20128"
|
|
964
|
+
export NEXT_PUBLIC_CLOUD_URL="https://9router.com"
|
|
965
|
+
export API_KEY_SECRET="endpoint-proxy-api-key-secret"
|
|
966
|
+
export MACHINE_ID_SALT="endpoint-proxy-salt"
|
|
967
|
+
|
|
968
|
+
# Start
|
|
969
|
+
npm run start
|
|
970
|
+
|
|
971
|
+
# Or use PM2
|
|
972
|
+
npm install -g pm2
|
|
973
|
+
pm2 start --name 9router -- start
|
|
974
|
+
pm2 save
|
|
975
|
+
pm2 startup
|
|
976
|
+
```
|
|
977
|
+
|
|
978
|
+
### Docker
|
|
979
|
+
|
|
980
|
+
```bash
|
|
981
|
+
# Build image (from repository root)
|
|
982
|
+
docker build -t 9router .
|
|
983
|
+
|
|
984
|
+
# Run container (command used in current setup)
|
|
985
|
+
docker run -d \
|
|
986
|
+
--name 9router \
|
|
987
|
+
-p 20128:20128 \
|
|
988
|
+
--env-file /root/dev/9router/.env \
|
|
989
|
+
-v 9router-data:/app/data \
|
|
990
|
+
-v 9router-usage:/root/.9router \
|
|
991
|
+
9router
|
|
992
|
+
```
|
|
993
|
+
|
|
994
|
+
Портативная команда (если вы уже в корне репозитория):
|
|
995
|
+
|
|
996
|
+
```bash
|
|
997
|
+
docker run -d \
|
|
998
|
+
--name 9router \
|
|
999
|
+
-p 20128:20128 \
|
|
1000
|
+
--env-file ./.env \
|
|
1001
|
+
-v 9router-data:/app/data \
|
|
1002
|
+
-v 9router-usage:/root/.9router \
|
|
1003
|
+
9router
|
|
1004
|
+
```
|
|
1005
|
+
|
|
1006
|
+
Значения по умолчанию контейнера:
|
|
1007
|
+
- `PORT=20128`
|
|
1008
|
+
- `HOSTNAME=0.0.0.0`
|
|
1009
|
+
|
|
1010
|
+
Полезные команды:
|
|
1011
|
+
|
|
1012
|
+
```bash
|
|
1013
|
+
docker logs -f 9router
|
|
1014
|
+
docker restart 9router
|
|
1015
|
+
docker stop 9router && docker rm 9router
|
|
1016
|
+
```
|
|
1017
|
+
|
|
1018
|
+
### Переменные окружения
|
|
1019
|
+
|
|
1020
|
+
| Переменная | По умолчанию | Описание |
|
|
1021
|
+
|----------|---------|-------------|
|
|
1022
|
+
| `JWT_SECRET` | Автогенерация (`~/.9router/jwt-secret`) | Секрет подписи JWT для cookie аутентификации панели (задайте для общего доступа между инстансами) |
|
|
1023
|
+
| `INITIAL_PASSWORD` | `123456` | Пароль первого входа при отсутствии сохранённого хеша |
|
|
1024
|
+
| `DATA_DIR` | `~/.9router` | Расположение основной БД приложения (`db.json`) |
|
|
1025
|
+
| `PORT` | framework default | Порт сервиса (`20128` в примерах) |
|
|
1026
|
+
| `HOSTNAME` | framework default | Bind host (Docker по умолчанию `0.0.0.0`) |
|
|
1027
|
+
| `NODE_ENV` | runtime default | Установите `production` для развёртывания |
|
|
1028
|
+
| `BASE_URL` | `http://localhost:20128` | Внутренний серверный базовый URL для задач облачной синхронизации |
|
|
1029
|
+
| `CLOUD_URL` | `https://9router.com` | Серверный базовый URL эндпоинта облачной синхронизации |
|
|
1030
|
+
| `NEXT_PUBLIC_BASE_URL` | `http://localhost:3000` | Обратно совместимый/публичный базовый URL (приоритет `BASE_URL` для серверного рантайма) |
|
|
1031
|
+
| `NEXT_PUBLIC_CLOUD_URL` | `https://9router.com` | Обратно совместимый/публичный облачный URL (приоритет `CLOUD_URL` для серверного рантайма) |
|
|
1032
|
+
| `API_KEY_SECRET` | `endpoint-proxy-api-key-secret` | HMAC-секрет для генерируемых API-ключей |
|
|
1033
|
+
| `MACHINE_ID_SALT` | `endpoint-proxy-salt` | Соль для стабильного хеширования ID машины |
|
|
1034
|
+
| `ENABLE_REQUEST_LOGS` | `false` | Включить лог запросов/ответов в `logs/` |
|
|
1035
|
+
| `AUTH_COOKIE_SECURE` | `false` | Принудительный `Secure` cookie аутентификации (задайте `true` за HTTPS reverse proxy) |
|
|
1036
|
+
| `REQUIRE_API_KEY` | `false` | Требовать Bearer API key на маршрутах `/v1/*` (рекомендуется для развёртываний с выходом в интернет) |
|
|
1037
|
+
| `HTTP_PROXY`, `HTTPS_PROXY`, `ALL_PROXY`, `NO_PROXY` | empty | Опциональный исходящий прокси для вызовов к провайдерам |
|
|
1038
|
+
|
|
1039
|
+
Примечания:
|
|
1040
|
+
- Прокси-переменные в нижнем регистре также поддерживаются: `http_proxy`, `https_proxy`, `all_proxy`, `no_proxy`.
|
|
1041
|
+
- `.env` не запекается в Docker-образ (`.dockerignore`); подавайте runtime-конфигурацию через `--env-file` или `-e`.
|
|
1042
|
+
- В Windows для разрешения путей локального хранилища может использоваться `APPDATA`.
|
|
1043
|
+
- `INSTANCE_NAME` встречается в старых docs/env-шаблонах, но сейчас в рантайме не используется.
|
|
1044
|
+
|
|
1045
|
+
### Runtime-файлы и хранилище
|
|
1046
|
+
|
|
1047
|
+
- Основное состояние приложения: `${DATA_DIR}/db.json` (провайдеры, комбо, alias, ключи, настройки), управляется `src/lib/localDb.js`.
|
|
1048
|
+
- История использования и логи: `~/.9router/usage.json` и `~/.9router/log.txt`, управляется `src/lib/usageDb.js`.
|
|
1049
|
+
- Опциональные логи запросов/транслятора: `<repo>/logs/...` при `ENABLE_REQUEST_LOGS=true`.
|
|
1050
|
+
- Хранилище использования следует логике пути `~/.9router` и независимо от `DATA_DIR`.
|
|
1051
|
+
|
|
1052
|
+
</details>
|
|
1053
|
+
|
|
1054
|
+
---
|
|
1055
|
+
|
|
1056
|
+
## 📊 Доступные модели
|
|
1057
|
+
|
|
1058
|
+
<details>
|
|
1059
|
+
<summary><b>Показать все доступные модели</b></summary>
|
|
1060
|
+
|
|
1061
|
+
**Claude Code (`cc/`)** - Pro/Max:
|
|
1062
|
+
- `cc/claude-opus-4-6`
|
|
1063
|
+
- `cc/claude-sonnet-4-5-20250929`
|
|
1064
|
+
- `cc/claude-haiku-4-5-20251001`
|
|
1065
|
+
|
|
1066
|
+
**Codex (`cx/`)** - Plus/Pro:
|
|
1067
|
+
- `cx/gpt-5.2-codex`
|
|
1068
|
+
- `cx/gpt-5.1-codex-max`
|
|
1069
|
+
|
|
1070
|
+
**Gemini CLI (`gc/`)** - БЕСПЛАТНО:
|
|
1071
|
+
- `gc/gemini-3-flash-preview`
|
|
1072
|
+
- `gc/gemini-2.5-pro`
|
|
1073
|
+
|
|
1074
|
+
**GitHub Copilot (`gh/`)**:
|
|
1075
|
+
- `gh/gpt-5`
|
|
1076
|
+
- `gh/claude-4.5-sonnet`
|
|
1077
|
+
|
|
1078
|
+
**GLM (`glm/`)** - $0.6/1M:
|
|
1079
|
+
- `glm/glm-4.7`
|
|
1080
|
+
|
|
1081
|
+
**MiniMax (`minimax/`)** - $0.2/1M:
|
|
1082
|
+
- `minimax/MiniMax-M2.1`
|
|
1083
|
+
|
|
1084
|
+
**iFlow (`if/`)** - БЕСПЛАТНО:
|
|
1085
|
+
- `if/kimi-k2-thinking`
|
|
1086
|
+
- `if/qwen3-coder-plus`
|
|
1087
|
+
- `if/deepseek-r1`
|
|
1088
|
+
|
|
1089
|
+
**Qwen (`qw/`)** - БЕСПЛАТНО:
|
|
1090
|
+
- `qw/qwen3-coder-plus`
|
|
1091
|
+
- `qw/qwen3-coder-flash`
|
|
1092
|
+
|
|
1093
|
+
**Kiro (`kr/`)** - БЕСПЛАТНО:
|
|
1094
|
+
- `kr/claude-sonnet-4.5`
|
|
1095
|
+
- `kr/claude-haiku-4.5`
|
|
1096
|
+
|
|
1097
|
+
</details>
|
|
1098
|
+
|
|
1099
|
+
---
|
|
1100
|
+
|
|
1101
|
+
## 🐛 Устранение неполадок
|
|
1102
|
+
|
|
1103
|
+
**"Language model did not provide messages"**
|
|
1104
|
+
- Исчерпана квота провайдера → Проверьте трекер квоты на панели
|
|
1105
|
+
- Решение: Используйте резервирование комбо или переключитесь на более дешёвый уровень
|
|
1106
|
+
|
|
1107
|
+
**Ограничение скорости (Rate limiting)**
|
|
1108
|
+
- Исчерпана квота подписки → Резервирование на GLM/MiniMax
|
|
1109
|
+
- Добавьте комбо: `cc/claude-opus-4-6 → glm/glm-4.7 → if/kimi-k2-thinking`
|
|
1110
|
+
|
|
1111
|
+
**OAuth-токен истёк**
|
|
1112
|
+
- Автообновление 9Router
|
|
1113
|
+
- Если проблема сохраняется: Панель управления → Провайдеры → Переподключить
|
|
1114
|
+
|
|
1115
|
+
**Высокие затраты**
|
|
1116
|
+
- Проверьте статистику использования в панели
|
|
1117
|
+
- Переключите основную модель на GLM/MiniMax
|
|
1118
|
+
- Используйте бесплатные уровни (Gemini CLI, iFlow) для некритичных задач
|
|
1119
|
+
|
|
1120
|
+
**Панель открывается на неверном порту**
|
|
1121
|
+
- Установите `PORT=20128` и `NEXT_PUBLIC_BASE_URL=http://localhost:20128`
|
|
1122
|
+
|
|
1123
|
+
**Ошибки облачной синхронизации**
|
|
1124
|
+
- Убедитесь, что `BASE_URL` указывает на ваш работающий инстанс (например, `http://localhost:20128`)
|
|
1125
|
+
- Убедитесь, что `CLOUD_URL` указывает на ожидаемый облачный эндпоинт (например, `https://9router.com`)
|
|
1126
|
+
- По возможности держите значения `NEXT_PUBLIC_*` согласованными с серверными значениями.
|
|
1127
|
+
|
|
1128
|
+
**Облачный эндпоинт `stream=false` возвращает 500 (`Unexpected token 'd'...`)**
|
|
1129
|
+
- Симптом обычно появляется на публичном облачном эндпоинте (`https://9router.com/v1`) для непотоковых (non-streaming) вызовов.
|
|
1130
|
+
- Корневая причина: upstream возвращает SSE-payload (`data: ...`), тогда как клиент ожидает JSON.
|
|
1131
|
+
- Обходное решение: используйте `stream=true` для прямых вызовов в облако.
|
|
1132
|
+
- Локальный рантайм 9Router включает резервирование SSE→JSON для непотоковых вызовов, когда upstream возвращает `text/event-stream`.
|
|
1133
|
+
|
|
1134
|
+
**Облако сообщает о подключении, но запрос всё равно падает с `Invalid API key`**
|
|
1135
|
+
- Создайте новый ключ в локальной панели (`/api/keys`) и запустите облачную синхронизацию (`Enable Cloud`, затем `Sync Now`).
|
|
1136
|
+
- Старые/несинхронизированные ключи могут возвращать `401` в облаке, даже если локальный эндпоинт работает.
|
|
1137
|
+
|
|
1138
|
+
**Первый вход не работает**
|
|
1139
|
+
- Проверьте `INITIAL_PASSWORD` в `.env`
|
|
1140
|
+
- Если не задан, резервный пароль — `123456`
|
|
1141
|
+
|
|
1142
|
+
**Нет логов запросов в `logs/`**
|
|
1143
|
+
- Установите `ENABLE_REQUEST_LOGS=true`
|
|
1144
|
+
|
|
1145
|
+
---
|
|
1146
|
+
|
|
1147
|
+
## 🛠️ Tech Stack
|
|
1148
|
+
|
|
1149
|
+
- **Runtime**: Node.js 20+
|
|
1150
|
+
- **Framework**: Next.js 16
|
|
1151
|
+
- **UI**: React 19 + Tailwind 4
|
|
1152
|
+
- **Database**: LowDB (на основе JSON-файлов)
|
|
1153
|
+
- **Streaming**: Server-Sent Events (SSE)
|
|
1154
|
+
- **Auth**: OAuth 2.0 (PKCE) + JWT + API Keys
|
|
1155
|
+
|
|
1156
|
+
---
|
|
1157
|
+
|
|
1158
|
+
## 📝 Справочник по API
|
|
1159
|
+
|
|
1160
|
+
### Chat Completions
|
|
1161
|
+
|
|
1162
|
+
```bash
|
|
1163
|
+
POST http://localhost:20128/v1/chat/completions
|
|
1164
|
+
Authorization: Bearer your-api-key
|
|
1165
|
+
Content-Type: application/json
|
|
1166
|
+
|
|
1167
|
+
{
|
|
1168
|
+
"model": "cc/claude-opus-4-6",
|
|
1169
|
+
"messages": [
|
|
1170
|
+
{"role": "user", "content": "Напиши функцию для..."}
|
|
1171
|
+
],
|
|
1172
|
+
"stream": true
|
|
1173
|
+
}
|
|
1174
|
+
```
|
|
1175
|
+
|
|
1176
|
+
### Список моделей
|
|
1177
|
+
|
|
1178
|
+
```bash
|
|
1179
|
+
GET http://localhost:20128/v1/models
|
|
1180
|
+
Authorization: Bearer your-api-key
|
|
1181
|
+
|
|
1182
|
+
→ Возвращает все модели + комбо в формате OpenAI
|
|
1183
|
+
```
|
|
1184
|
+
|
|
1185
|
+
### Совместимые эндпоинты
|
|
1186
|
+
|
|
1187
|
+
- `POST /v1/chat/completions`
|
|
1188
|
+
- `POST /v1/messages`
|
|
1189
|
+
- `POST /v1/responses`
|
|
1190
|
+
- `GET /v1/models`
|
|
1191
|
+
- `POST /v1/messages/count_tokens`
|
|
1192
|
+
- `GET /v1beta/models`
|
|
1193
|
+
- `POST /v1beta/models/{...path}` (Gemini-style `generateContent`)
|
|
1194
|
+
- `POST /v1/api/chat` (путь конвертации в стиле Ollama)
|
|
1195
|
+
|
|
1196
|
+
### Скрипты облачной аутентификации
|
|
1197
|
+
|
|
1198
|
+
Добавлены тестовые скрипты в `tester/security/`:
|
|
1199
|
+
|
|
1200
|
+
- `tester/security/test-docker-hardening.sh`
|
|
1201
|
+
- Собирает Docker-образ и проверяет hardening-проверки (`/api/cloud/auth` auth guard, `REQUIRE_API_KEY`, безопасное поведение cookie аутентификации).
|
|
1202
|
+
- `tester/security/test-cloud-openai-compatible.sh`
|
|
1203
|
+
- Отправляет OpenAI-совместимый запрос напрямую на облачный эндпоинт (`https://9router.com/v1/chat/completions`) с указанной моделью/ключом.
|
|
1204
|
+
- `tester/security/test-cloud-sync-and-call.sh`
|
|
1205
|
+
- End-to-end процесс: создание локального ключа → включение/синхронизация облака → вызов облачного эндпоинта с повтором.
|
|
1206
|
+
- Включает резервную проверку с `stream=true`, чтобы отличить ошибки аутентификации от проблем разбора потока.
|
|
1207
|
+
|
|
1208
|
+
Заметки по безопасности для облачных тестовых скриптов:
|
|
1209
|
+
|
|
1210
|
+
- Никогда не хардкодьте реальные API-ключи в скриптах/коммитах.
|
|
1211
|
+
- Передавайте ключи только через переменные окружения:
|
|
1212
|
+
- `API_KEY`, `CLOUD_API_KEY` или `OPENAI_API_KEY` (поддерживается `test-cloud-openai-compatible.sh`)
|
|
1213
|
+
- Пример:
|
|
1214
|
+
|
|
1215
|
+
```bash
|
|
1216
|
+
OPENAI_API_KEY="your-cloud-key" bash tester/security/test-cloud-openai-compatible.sh
|
|
1217
|
+
```
|
|
1218
|
+
|
|
1219
|
+
Ожидаемое поведение по результатам недавней проверки:
|
|
1220
|
+
|
|
1221
|
+
- Локально (`http://127.0.0.1:20128/v1/chat/completions`): работает с `stream=false` и `stream=true`.
|
|
1222
|
+
- Docker-рантайм (тот же API-путь, экспонируемый контейнером): hardening-проверки проходят, cloud auth guard работает, строгий режим API-ключа работает при включении.
|
|
1223
|
+
- Публичный облачный эндпоинт (`https://9router.com/v1/chat/completions`):
|
|
1224
|
+
- `stream=true`: ожидается успех (возвращает SSE-чанки).
|
|
1225
|
+
- `stream=false`: может падать с `500` + ошибкой разбора (`Unexpected token 'd'`), когда upstream возвращает SSE-контент для непотокового клиентского пути.
|
|
1226
|
+
|
|
1227
|
+
### API управления и панели
|
|
1228
|
+
|
|
1229
|
+
- Аутентификация/настройки: `/api/auth/login`, `/api/auth/logout`, `/api/settings`, `/api/settings/require-login`
|
|
1230
|
+
- Управление провайдерами: `/api/providers`, `/api/providers/[id]`, `/api/providers/[id]/test`, `/api/providers/[id]/models`, `/api/providers/validate`, `/api/provider-n*`
|
|
1231
|
+
- OAuth-потоки: `/api/oauth/[provider]/[action]` (+ специфичные для провайдеров импорты, такие как Cursor/Kiro)
|
|
1232
|
+
- Конфигурация маршрутизации: `/api/models/alias`, `/api/combos*`, `/api/keys*`, `/api/pricing`
|
|
1233
|
+
- Использование/логи: `/api/usage/history`, `/api/usage/logs`, `/api/usage/request-logs`, `/api/usage/[connectionId]`
|
|
1234
|
+
- Облачная синхронизация: `/api/sync/cloud`, `/api/sync/initialize`, `/api/cloud/*`
|
|
1235
|
+
- Помощники CLI: `/api/cli-tools/claude-settings`, `/api/cli-tools/codex-settings`, `/api/cli-tools/droid-settings`, `/api/cli-tools/openclaw-settings`
|
|
1236
|
+
|
|
1237
|
+
### Поведение аутентификации
|
|
1238
|
+
|
|
1239
|
+
- Маршруты панели (`/dashboard/*`) используют защиту cookie `auth_token`.
|
|
1240
|
+
- Вход использует сохранённый хеш пароля при наличии; иначе откатывается к `INITIAL_PASSWORD`.
|
|
1241
|
+
- `requireLogin` можно переключить через `/api/settings/require-login`.
|
|
1242
|
+
|
|
1243
|
+
### Обработка запросов (высокоуровнево)
|
|
1244
|
+
|
|
1245
|
+
1. Клиент отправляет запрос на `/v1/*`.
|
|
1246
|
+
2. Обработчик маршрута вызывает `handleChat` (`src/sse/handlers/chat.js`).
|
|
1247
|
+
3. Модель разрешается (прямой провайдер/модель или разрешение alias/combo).
|
|
1248
|
+
4. Учётные данные выбираются из локальной БД с фильтром доступности аккаунта.
|
|
1249
|
+
5. `handleChatCore` (`open-sse/handlers/chatCore.js`) определяет формат и транслирует запрос.
|
|
1250
|
+
6. Исполнитель провайдера отправляет upstream-запрос.
|
|
1251
|
+
7. Поток при необходимости транслируется обратно в клиентский формат.
|
|
1252
|
+
8. Использование/логи записываются (`src/lib/usageDb.js`).
|
|
1253
|
+
9. Резервирование применяется при ошибках провайдера/аккаунта/модели по правилам комбо.
|
|
1254
|
+
|
|
1255
|
+
Полный справочник по архитектуре: [`docs/ARCHITECTURE.md`](../docs/ARCHITECTURE.md)
|
|
1256
|
+
|
|
1257
|
+
---
|
|
1258
|
+
|
|
1259
|
+
## 📧 Поддержка
|
|
1260
|
+
|
|
1261
|
+
- **Сайт**: [9router.com](https://9router.com)
|
|
1262
|
+
- **GitHub**: [github.com/decolua/9router](https://github.com/decolua/9router)
|
|
1263
|
+
- **Issues**: [github.com/decolua/9router/issues](https://github.com/decolua/9router/issues)
|
|
1264
|
+
|
|
1265
|
+
---
|
|
1266
|
+
|
|
1267
|
+
## 👥 Контрибьюторы
|
|
1268
|
+
|
|
1269
|
+
Спасибо всем, кто помогает делать 9Router лучше!
|
|
1270
|
+
|
|
1271
|
+
[](https://github.com/decolua/9router/graphs/contributors)
|
|
1272
|
+
|
|
1273
|
+
---
|
|
1274
|
+
|
|
1275
|
+
## 📊 Star Chart
|
|
1276
|
+
|
|
1277
|
+
[](https://starchart.cc/decolua/9router)
|
|
1278
|
+
|
|
1279
|
+
### Как внести вклад
|
|
1280
|
+
|
|
1281
|
+
1. Сделайте форк репозитория
|
|
1282
|
+
2. Создайте свою feature-ветку (`git checkout -b feature/amazing-feature`)
|
|
1283
|
+
3. Закоммитьте изменения (`git commit -m 'Add amazing feature'`)
|
|
1284
|
+
4. Запушьте в ветку (`git push origin feature/amazing-feature`)
|
|
1285
|
+
5. Откройте Pull Request
|
|
1286
|
+
|
|
1287
|
+
См. [Pull Requests](https://github.com/decolua/9router/pulls) для подробных инструкций.
|
|
1288
|
+
|
|
1289
|
+
---
|
|
1290
|
+
|
|
1291
|
+
## 🔀 Форки
|
|
1292
|
+
|
|
1293
|
+
**[OmniRoute](https://github.com/diegosouzapw/OmniRoute)** — Полнофункциональный TypeScript-форк 9Router. Добавляет 36+ провайдеров, авторезервирование на 4 уровнях, мультимодальный API (изображения, embedding, аудио, TTS), circuit breaker, семантическое кеширование, оценку LLM и доработанную панель. 368+ юнит-тестов. Доступен через npm.
|
|
1294
|
+
|
|
1295
|
+
---
|
|
1296
|
+
|
|
1297
|
+
## 🙏 Благодарности
|
|
1298
|
+
|
|
1299
|
+
Особая благодарность **CLIProxyAPI** — оригинальной Go-реализации, вдохновившей этот JavaScript-порт.
|
|
1300
|
+
|
|
1301
|
+
---
|
|
1302
|
+
|
|
1303
|
+
## 📄 Лицензия
|
|
1304
|
+
|
|
1305
|
+
Лицензия MIT — см. [LICENSE](../LICENSE) для деталей.
|
|
1306
|
+
|
|
1307
|
+
---
|
|
1308
|
+
|
|
1309
|
+
<div align="center">
|
|
1310
|
+
<sub>Создано с ❤️ для разработчиков, которые кодят 24/7</sub>
|
|
1311
|
+
</div>
|