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.
Files changed (763) hide show
  1. package/CHANGELOG.md +222 -0
  2. package/LICENSE +21 -0
  3. package/README.md +96 -0
  4. package/README.zh-CN.md +1311 -0
  5. package/assets/pixel-router-2d.png +0 -0
  6. package/cli/LICENSE +42 -0
  7. package/cli/README.md +125 -0
  8. package/cli/app/package.json +58 -0
  9. package/cli/cli.js +806 -0
  10. package/cli/package.json +48 -0
  11. package/i18n/README.ja-JP.md +1209 -0
  12. package/i18n/README.ru.md +1311 -0
  13. package/i18n/README.vi.md +1310 -0
  14. package/i18n/README.zh-CN.md +1306 -0
  15. package/images/9router.png +0 -0
  16. package/jsconfig.json +12 -0
  17. package/next.config.mjs +71 -0
  18. package/open-sse/config/appConstants.js +203 -0
  19. package/open-sse/config/codexInstructions.js +119 -0
  20. package/open-sse/config/constants.js +4 -0
  21. package/open-sse/config/defaultThinkingSignature.js +12 -0
  22. package/open-sse/config/errorConfig.js +85 -0
  23. package/open-sse/config/googleTtsLanguages.js +62 -0
  24. package/open-sse/config/kiroConstants.js +322 -0
  25. package/open-sse/config/models.js +13 -0
  26. package/open-sse/config/ollamaModels.js +19 -0
  27. package/open-sse/config/providerModels.js +944 -0
  28. package/open-sse/config/providers.js +458 -0
  29. package/open-sse/config/runtimeConfig.js +72 -0
  30. package/open-sse/config/ttsModels.js +129 -0
  31. package/open-sse/executors/antigravity.js +504 -0
  32. package/open-sse/executors/azure.js +57 -0
  33. package/open-sse/executors/base.js +185 -0
  34. package/open-sse/executors/codex.js +469 -0
  35. package/open-sse/executors/commandcode.js +88 -0
  36. package/open-sse/executors/cursor.js +795 -0
  37. package/open-sse/executors/default.js +497 -0
  38. package/open-sse/executors/gemini-cli.js +89 -0
  39. package/open-sse/executors/github.js +379 -0
  40. package/open-sse/executors/grok-web.js +345 -0
  41. package/open-sse/executors/iflow.js +108 -0
  42. package/open-sse/executors/index.js +75 -0
  43. package/open-sse/executors/kiro.js +508 -0
  44. package/open-sse/executors/ollama-local.js +14 -0
  45. package/open-sse/executors/opencode-go.js +41 -0
  46. package/open-sse/executors/opencode.js +32 -0
  47. package/open-sse/executors/perplexity-web.js +507 -0
  48. package/open-sse/executors/qoder.js +450 -0
  49. package/open-sse/executors/qwen.js +129 -0
  50. package/open-sse/executors/vertex.js +131 -0
  51. package/open-sse/executors/xiaomi-tokenplan.js +19 -0
  52. package/open-sse/handlers/chatCore/nonStreamingHandler.js +230 -0
  53. package/open-sse/handlers/chatCore/requestDetail.js +102 -0
  54. package/open-sse/handlers/chatCore/sseToJsonHandler.js +231 -0
  55. package/open-sse/handlers/chatCore/streamingHandler.js +103 -0
  56. package/open-sse/handlers/chatCore.js +287 -0
  57. package/open-sse/handlers/embeddingProviders/_base.js +4 -0
  58. package/open-sse/handlers/embeddingProviders/gemini.js +54 -0
  59. package/open-sse/handlers/embeddingProviders/index.js +23 -0
  60. package/open-sse/handlers/embeddingProviders/openai.js +39 -0
  61. package/open-sse/handlers/embeddingProviders/openaiCompatNode.js +13 -0
  62. package/open-sse/handlers/embeddingsCore.js +126 -0
  63. package/open-sse/handlers/fetch/index.js +237 -0
  64. package/open-sse/handlers/imageGenerationCore.js +189 -0
  65. package/open-sse/handlers/imageProviders/_base.js +31 -0
  66. package/open-sse/handlers/imageProviders/blackForestLabs.js +43 -0
  67. package/open-sse/handlers/imageProviders/cloudflareAi.js +178 -0
  68. package/open-sse/handlers/imageProviders/codex.js +198 -0
  69. package/open-sse/handlers/imageProviders/comfyui.js +8 -0
  70. package/open-sse/handlers/imageProviders/falAi.js +41 -0
  71. package/open-sse/handlers/imageProviders/gemini.js +25 -0
  72. package/open-sse/handlers/imageProviders/huggingface.js +22 -0
  73. package/open-sse/handlers/imageProviders/index.js +40 -0
  74. package/open-sse/handlers/imageProviders/nanobanana.js +58 -0
  75. package/open-sse/handlers/imageProviders/openai.js +40 -0
  76. package/open-sse/handlers/imageProviders/runwayml.js +47 -0
  77. package/open-sse/handlers/imageProviders/sdwebui.js +17 -0
  78. package/open-sse/handlers/imageProviders/stabilityAi.js +34 -0
  79. package/open-sse/handlers/responsesHandler.js +103 -0
  80. package/open-sse/handlers/search/callers.js +371 -0
  81. package/open-sse/handlers/search/chatSearch.js +409 -0
  82. package/open-sse/handlers/search/index.js +201 -0
  83. package/open-sse/handlers/search/normalizers.js +223 -0
  84. package/open-sse/handlers/sttCore.js +194 -0
  85. package/open-sse/handlers/ttsCore.js +74 -0
  86. package/open-sse/handlers/ttsProviders/_base.js +39 -0
  87. package/open-sse/handlers/ttsProviders/edgeTts.js +89 -0
  88. package/open-sse/handlers/ttsProviders/elevenlabs.js +48 -0
  89. package/open-sse/handlers/ttsProviders/gemini.js +117 -0
  90. package/open-sse/handlers/ttsProviders/genericFormats.js +169 -0
  91. package/open-sse/handlers/ttsProviders/googleTts.js +54 -0
  92. package/open-sse/handlers/ttsProviders/index.js +50 -0
  93. package/open-sse/handlers/ttsProviders/localDevice.js +87 -0
  94. package/open-sse/handlers/ttsProviders/minimax.js +59 -0
  95. package/open-sse/handlers/ttsProviders/openai.js +30 -0
  96. package/open-sse/handlers/ttsProviders/openrouter.js +70 -0
  97. package/open-sse/index.js +82 -0
  98. package/open-sse/rtk/applyFilter.js +15 -0
  99. package/open-sse/rtk/autodetect.js +111 -0
  100. package/open-sse/rtk/caveman.js +100 -0
  101. package/open-sse/rtk/cavemanPrompts.js +78 -0
  102. package/open-sse/rtk/constants.js +55 -0
  103. package/open-sse/rtk/filters/buildOutput.js +127 -0
  104. package/open-sse/rtk/filters/dedupLog.js +44 -0
  105. package/open-sse/rtk/filters/find.js +49 -0
  106. package/open-sse/rtk/filters/gitDiff.js +92 -0
  107. package/open-sse/rtk/filters/gitStatus.js +117 -0
  108. package/open-sse/rtk/filters/grep.js +48 -0
  109. package/open-sse/rtk/filters/ls.js +79 -0
  110. package/open-sse/rtk/filters/readNumbered.js +27 -0
  111. package/open-sse/rtk/filters/searchList.js +52 -0
  112. package/open-sse/rtk/filters/smartTruncate.js +15 -0
  113. package/open-sse/rtk/filters/tree.js +32 -0
  114. package/open-sse/rtk/index.js +155 -0
  115. package/open-sse/rtk/registry.js +38 -0
  116. package/open-sse/services/accountFallback.js +238 -0
  117. package/open-sse/services/combo.js +198 -0
  118. package/open-sse/services/compact.js +71 -0
  119. package/open-sse/services/kiroModels.js +332 -0
  120. package/open-sse/services/model.js +261 -0
  121. package/open-sse/services/oauthCredentialManager.js +151 -0
  122. package/open-sse/services/projectId.js +306 -0
  123. package/open-sse/services/provider.js +356 -0
  124. package/open-sse/services/qoderModels.js +214 -0
  125. package/open-sse/services/tokenRefresh.js +939 -0
  126. package/open-sse/services/usage.js +1496 -0
  127. package/open-sse/transformer/responsesTransformer.js +439 -0
  128. package/open-sse/transformer/streamToJsonConverter.js +103 -0
  129. package/open-sse/translator/formats.js +36 -0
  130. package/open-sse/translator/helpers/claudeHelper.js +216 -0
  131. package/open-sse/translator/helpers/geminiHelper.js +372 -0
  132. package/open-sse/translator/helpers/imageHelper.js +34 -0
  133. package/open-sse/translator/helpers/maxTokensHelper.js +27 -0
  134. package/open-sse/translator/helpers/openaiHelper.js +130 -0
  135. package/open-sse/translator/helpers/responsesApiHelper.js +139 -0
  136. package/open-sse/translator/helpers/toolCallHelper.js +148 -0
  137. package/open-sse/translator/index.js +251 -0
  138. package/open-sse/translator/request/antigravity-to-openai.js +229 -0
  139. package/open-sse/translator/request/claude-to-openai.js +232 -0
  140. package/open-sse/translator/request/gemini-to-openai.js +147 -0
  141. package/open-sse/translator/request/openai-responses.js +318 -0
  142. package/open-sse/translator/request/openai-to-claude.js +401 -0
  143. package/open-sse/translator/request/openai-to-commandcode.js +170 -0
  144. package/open-sse/translator/request/openai-to-cursor.js +183 -0
  145. package/open-sse/translator/request/openai-to-gemini.js +470 -0
  146. package/open-sse/translator/request/openai-to-kiro.js +629 -0
  147. package/open-sse/translator/request/openai-to-kiro.old.js +278 -0
  148. package/open-sse/translator/request/openai-to-ollama.js +192 -0
  149. package/open-sse/translator/request/openai-to-vertex.js +42 -0
  150. package/open-sse/translator/response/claude-to-openai.js +206 -0
  151. package/open-sse/translator/response/commandcode-to-openai.js +197 -0
  152. package/open-sse/translator/response/cursor-to-openai.js +30 -0
  153. package/open-sse/translator/response/gemini-to-openai.js +245 -0
  154. package/open-sse/translator/response/kiro-to-openai.js +195 -0
  155. package/open-sse/translator/response/ollama-to-openai.js +152 -0
  156. package/open-sse/translator/response/openai-responses.js +590 -0
  157. package/open-sse/translator/response/openai-to-antigravity.js +122 -0
  158. package/open-sse/translator/response/openai-to-claude.js +266 -0
  159. package/open-sse/utils/bypassHandler.js +298 -0
  160. package/open-sse/utils/claudeCloaking.js +155 -0
  161. package/open-sse/utils/claudeHeaderCache.js +70 -0
  162. package/open-sse/utils/clientDetector.js +63 -0
  163. package/open-sse/utils/cursorChecksum.js +149 -0
  164. package/open-sse/utils/cursorProtobuf.js +904 -0
  165. package/open-sse/utils/debugLog.js +14 -0
  166. package/open-sse/utils/error.js +147 -0
  167. package/open-sse/utils/ollamaTransform.js +85 -0
  168. package/open-sse/utils/proxyFetch.js +368 -0
  169. package/open-sse/utils/reasoningContentInjector.js +79 -0
  170. package/open-sse/utils/requestLogger.js +260 -0
  171. package/open-sse/utils/responsesStreamHelpers.js +49 -0
  172. package/open-sse/utils/sessionManager.js +82 -0
  173. package/open-sse/utils/stream.js +462 -0
  174. package/open-sse/utils/streamHandler.js +250 -0
  175. package/open-sse/utils/streamHelpers.js +122 -0
  176. package/open-sse/utils/toolDeduper.js +49 -0
  177. package/open-sse/utils/usageTracking.js +347 -0
  178. package/package.json +100 -0
  179. package/postcss.config.mjs +12 -0
  180. package/public/favicon.svg +11 -0
  181. package/public/file.svg +1 -0
  182. package/public/globe.svg +1 -0
  183. package/public/i18n/literals/ar.json +195 -0
  184. package/public/i18n/literals/bn.json +195 -0
  185. package/public/i18n/literals/cs.json +195 -0
  186. package/public/i18n/literals/da.json +195 -0
  187. package/public/i18n/literals/de.json +195 -0
  188. package/public/i18n/literals/el.json +195 -0
  189. package/public/i18n/literals/es.json +195 -0
  190. package/public/i18n/literals/fi.json +195 -0
  191. package/public/i18n/literals/fr.json +195 -0
  192. package/public/i18n/literals/he.json +195 -0
  193. package/public/i18n/literals/hi.json +195 -0
  194. package/public/i18n/literals/hu.json +195 -0
  195. package/public/i18n/literals/id.json +195 -0
  196. package/public/i18n/literals/it.json +195 -0
  197. package/public/i18n/literals/ja.json +195 -0
  198. package/public/i18n/literals/ko.json +195 -0
  199. package/public/i18n/literals/nl.json +195 -0
  200. package/public/i18n/literals/no.json +195 -0
  201. package/public/i18n/literals/pl.json +195 -0
  202. package/public/i18n/literals/pt-BR.json +195 -0
  203. package/public/i18n/literals/pt-PT.json +195 -0
  204. package/public/i18n/literals/ro.json +195 -0
  205. package/public/i18n/literals/ru.json +195 -0
  206. package/public/i18n/literals/sv.json +195 -0
  207. package/public/i18n/literals/th.json +195 -0
  208. package/public/i18n/literals/tl.json +195 -0
  209. package/public/i18n/literals/tr.json +195 -0
  210. package/public/i18n/literals/uk.json +195 -0
  211. package/public/i18n/literals/ur.json +195 -0
  212. package/public/i18n/literals/vi.json +195 -0
  213. package/public/i18n/literals/zh-CN.json +772 -0
  214. package/public/i18n/literals/zh-TW.json +195 -0
  215. package/public/icons/discord.svg +4 -0
  216. package/public/icons/icon-192.svg +4 -0
  217. package/public/icons/icon-512.svg +4 -0
  218. package/public/next.svg +1 -0
  219. package/public/providers/alicode-intl.png +0 -0
  220. package/public/providers/alicode.png +0 -0
  221. package/public/providers/amp.png +0 -0
  222. package/public/providers/anthropic-m.png +0 -0
  223. package/public/providers/anthropic.png +0 -0
  224. package/public/providers/antigravity.png +0 -0
  225. package/public/providers/assemblyai.png +0 -0
  226. package/public/providers/aws-polly.png +0 -0
  227. package/public/providers/azure.png +0 -0
  228. package/public/providers/black-forest-labs.png +0 -0
  229. package/public/providers/blackbox.png +0 -0
  230. package/public/providers/brave-search.png +0 -0
  231. package/public/providers/byteplus.png +0 -0
  232. package/public/providers/cartesia.png +0 -0
  233. package/public/providers/cerebras.png +0 -0
  234. package/public/providers/chutes.png +0 -0
  235. package/public/providers/claude.png +0 -0
  236. package/public/providers/cline.png +0 -0
  237. package/public/providers/cloudflare-ai.png +0 -0
  238. package/public/providers/codebuddy.svg +37 -0
  239. package/public/providers/codex.png +0 -0
  240. package/public/providers/cohere.png +0 -0
  241. package/public/providers/comfyui.png +0 -0
  242. package/public/providers/commandcode.png +0 -0
  243. package/public/providers/continue.png +0 -0
  244. package/public/providers/copilot.png +0 -0
  245. package/public/providers/coqui.png +0 -0
  246. package/public/providers/cursor.png +0 -0
  247. package/public/providers/deepgram.png +0 -0
  248. package/public/providers/deepseek-tui.png +0 -0
  249. package/public/providers/deepseek.png +0 -0
  250. package/public/providers/droid.png +0 -0
  251. package/public/providers/edge-tts.png +0 -0
  252. package/public/providers/elevenlabs.png +0 -0
  253. package/public/providers/exa.png +0 -0
  254. package/public/providers/fal-ai.png +0 -0
  255. package/public/providers/firecrawl.png +0 -0
  256. package/public/providers/fireworks.png +0 -0
  257. package/public/providers/gemini-cli.png +0 -0
  258. package/public/providers/gemini.png +0 -0
  259. package/public/providers/github.png +0 -0
  260. package/public/providers/glm-cn.png +0 -0
  261. package/public/providers/glm.png +0 -0
  262. package/public/providers/google-pse.png +0 -0
  263. package/public/providers/google-tts.png +0 -0
  264. package/public/providers/grok-web.png +0 -0
  265. package/public/providers/groq.png +0 -0
  266. package/public/providers/hermes.png +0 -0
  267. package/public/providers/huggingface.png +0 -0
  268. package/public/providers/hyperbolic.png +0 -0
  269. package/public/providers/iflow.png +0 -0
  270. package/public/providers/inworld.png +0 -0
  271. package/public/providers/jcode.png +0 -0
  272. package/public/providers/jina-ai.png +0 -0
  273. package/public/providers/jina-reader.png +0 -0
  274. package/public/providers/kilocode.png +0 -0
  275. package/public/providers/kimi-coding.png +0 -0
  276. package/public/providers/kimi.png +0 -0
  277. package/public/providers/kiro.png +0 -0
  278. package/public/providers/linkup.png +0 -0
  279. package/public/providers/local-device.png +0 -0
  280. package/public/providers/minimax-cn.png +0 -0
  281. package/public/providers/minimax.png +0 -0
  282. package/public/providers/mistral.png +0 -0
  283. package/public/providers/nanobanana.png +0 -0
  284. package/public/providers/nebius.png +0 -0
  285. package/public/providers/nvidia.png +0 -0
  286. package/public/providers/oai-cc.png +0 -0
  287. package/public/providers/oai-r.png +0 -0
  288. package/public/providers/ollama-local.png +0 -0
  289. package/public/providers/ollama.png +0 -0
  290. package/public/providers/openai.png +0 -0
  291. package/public/providers/openclaw.png +0 -0
  292. package/public/providers/opencode-go.png +0 -0
  293. package/public/providers/opencode.png +0 -0
  294. package/public/providers/openrouter.png +0 -0
  295. package/public/providers/perplexity-web.png +0 -0
  296. package/public/providers/perplexity.png +0 -0
  297. package/public/providers/playht.png +0 -0
  298. package/public/providers/qoder.png +0 -0
  299. package/public/providers/qwen.png +0 -0
  300. package/public/providers/recraft.png +0 -0
  301. package/public/providers/roo.png +0 -0
  302. package/public/providers/runwayml.png +0 -0
  303. package/public/providers/sdwebui.png +0 -0
  304. package/public/providers/searchapi.png +0 -0
  305. package/public/providers/searxng.png +0 -0
  306. package/public/providers/serper.png +0 -0
  307. package/public/providers/siliconflow.png +0 -0
  308. package/public/providers/stability-ai.png +0 -0
  309. package/public/providers/tavily.png +0 -0
  310. package/public/providers/together.png +0 -0
  311. package/public/providers/topaz.png +0 -0
  312. package/public/providers/tortoise.png +0 -0
  313. package/public/providers/vertex-partner.png +0 -0
  314. package/public/providers/vertex.png +0 -0
  315. package/public/providers/volcengine-ark.png +0 -0
  316. package/public/providers/voyage-ai.png +0 -0
  317. package/public/providers/xai.png +0 -0
  318. package/public/providers/xiaomi-mimo.png +0 -0
  319. package/public/providers/xiaomi-tokenplan.png +0 -0
  320. package/public/providers/youcom.png +0 -0
  321. package/public/sw.js +22 -0
  322. package/public/vercel.svg +1 -0
  323. package/public/window.svg +1 -0
  324. package/scripts/compact-request-details.mjs +71 -0
  325. package/scripts/import-codex-gptjson.mjs +342 -0
  326. package/scripts/start-standalone.mjs +25 -0
  327. package/scripts/translate-readme.js +201 -0
  328. package/src/app/(dashboard)/dashboard/automation/page.js +294 -0
  329. package/src/app/(dashboard)/dashboard/basic-chat/BasicChatPageClient.js +967 -0
  330. package/src/app/(dashboard)/dashboard/basic-chat/page.js +5 -0
  331. package/src/app/(dashboard)/dashboard/cli-tools/CLIToolsPageClient.js +66 -0
  332. package/src/app/(dashboard)/dashboard/cli-tools/[toolId]/ToolDetailClient.js +173 -0
  333. package/src/app/(dashboard)/dashboard/cli-tools/[toolId]/page.js +11 -0
  334. package/src/app/(dashboard)/dashboard/cli-tools/components/AntigravityToolCard.js +481 -0
  335. package/src/app/(dashboard)/dashboard/cli-tools/components/ApiKeySelect.js +66 -0
  336. package/src/app/(dashboard)/dashboard/cli-tools/components/BaseUrlSelect.js +174 -0
  337. package/src/app/(dashboard)/dashboard/cli-tools/components/ClaudeToolCard.js +390 -0
  338. package/src/app/(dashboard)/dashboard/cli-tools/components/ClineToolCard.js +301 -0
  339. package/src/app/(dashboard)/dashboard/cli-tools/components/CodexToolCard.js +458 -0
  340. package/src/app/(dashboard)/dashboard/cli-tools/components/CopilotToolCard.js +323 -0
  341. package/src/app/(dashboard)/dashboard/cli-tools/components/CoworkToolCard.js +640 -0
  342. package/src/app/(dashboard)/dashboard/cli-tools/components/DeepSeekTuiToolCard.js +338 -0
  343. package/src/app/(dashboard)/dashboard/cli-tools/components/DefaultToolCard.js +271 -0
  344. package/src/app/(dashboard)/dashboard/cli-tools/components/DroidToolCard.js +410 -0
  345. package/src/app/(dashboard)/dashboard/cli-tools/components/EndpointPresetControl.js +128 -0
  346. package/src/app/(dashboard)/dashboard/cli-tools/components/HermesToolCard.js +317 -0
  347. package/src/app/(dashboard)/dashboard/cli-tools/components/JcodeToolCard.js +380 -0
  348. package/src/app/(dashboard)/dashboard/cli-tools/components/KiloToolCard.js +275 -0
  349. package/src/app/(dashboard)/dashboard/cli-tools/components/MitmLinkCard.js +40 -0
  350. package/src/app/(dashboard)/dashboard/cli-tools/components/MitmServerCard.js +329 -0
  351. package/src/app/(dashboard)/dashboard/cli-tools/components/MitmToolCard.js +318 -0
  352. package/src/app/(dashboard)/dashboard/cli-tools/components/OpenClawToolCard.js +388 -0
  353. package/src/app/(dashboard)/dashboard/cli-tools/components/OpenCodeToolCard.js +500 -0
  354. package/src/app/(dashboard)/dashboard/cli-tools/components/ToolSummaryCard.js +39 -0
  355. package/src/app/(dashboard)/dashboard/cli-tools/components/cliEndpointMatch.js +13 -0
  356. package/src/app/(dashboard)/dashboard/cli-tools/components/index.js +19 -0
  357. package/src/app/(dashboard)/dashboard/cli-tools/page.js +7 -0
  358. package/src/app/(dashboard)/dashboard/combos/page.js +612 -0
  359. package/src/app/(dashboard)/dashboard/console-log/ConsoleLogClient.js +91 -0
  360. package/src/app/(dashboard)/dashboard/console-log/page.js +8 -0
  361. package/src/app/(dashboard)/dashboard/endpoint/EndpointPageClient.js +1555 -0
  362. package/src/app/(dashboard)/dashboard/endpoint/page.js +7 -0
  363. package/src/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page.js +1903 -0
  364. package/src/app/(dashboard)/dashboard/media-providers/[kind]/page.js +289 -0
  365. package/src/app/(dashboard)/dashboard/media-providers/combo/[id]/page.js +410 -0
  366. package/src/app/(dashboard)/dashboard/media-providers/web/page.js +209 -0
  367. package/src/app/(dashboard)/dashboard/mitm/MitmPageClient.js +117 -0
  368. package/src/app/(dashboard)/dashboard/mitm/page.js +5 -0
  369. package/src/app/(dashboard)/dashboard/page.js +7 -0
  370. package/src/app/(dashboard)/dashboard/profile/page.js +1140 -0
  371. package/src/app/(dashboard)/dashboard/providers/[id]/AddApiKeyModal.js +389 -0
  372. package/src/app/(dashboard)/dashboard/providers/[id]/AddCustomModelModal.js +125 -0
  373. package/src/app/(dashboard)/dashboard/providers/[id]/CompatibleModelsSection.js +250 -0
  374. package/src/app/(dashboard)/dashboard/providers/[id]/ConnectionRow.js +299 -0
  375. package/src/app/(dashboard)/dashboard/providers/[id]/CooldownTimer.js +42 -0
  376. package/src/app/(dashboard)/dashboard/providers/[id]/EditCompatibleNodeModal.js +161 -0
  377. package/src/app/(dashboard)/dashboard/providers/[id]/ModelRow.js +95 -0
  378. package/src/app/(dashboard)/dashboard/providers/[id]/PassthroughModelsSection.js +183 -0
  379. package/src/app/(dashboard)/dashboard/providers/[id]/page.js +2053 -0
  380. package/src/app/(dashboard)/dashboard/providers/[id]/page.new.js +1724 -0
  381. package/src/app/(dashboard)/dashboard/providers/components/ConnectionsCard.js +497 -0
  382. package/src/app/(dashboard)/dashboard/providers/components/ModelAvailabilityBadge.js +185 -0
  383. package/src/app/(dashboard)/dashboard/providers/components/ModelsCard.js +294 -0
  384. package/src/app/(dashboard)/dashboard/providers/new/page.js +220 -0
  385. package/src/app/(dashboard)/dashboard/providers/page.js +1365 -0
  386. package/src/app/(dashboard)/dashboard/proxy-pools/page.js +1092 -0
  387. package/src/app/(dashboard)/dashboard/quota/page.js +11 -0
  388. package/src/app/(dashboard)/dashboard/skills/page.js +112 -0
  389. package/src/app/(dashboard)/dashboard/translator/page.js +303 -0
  390. package/src/app/(dashboard)/dashboard/usage/components/OverviewCards.js +35 -0
  391. package/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/ProviderLimitCard.js +185 -0
  392. package/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/QuotaProgressBar.js +127 -0
  393. package/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/QuotaTable.js +259 -0
  394. package/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/index.js +1394 -0
  395. package/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/utils.js +244 -0
  396. package/src/app/(dashboard)/dashboard/usage/components/ProviderTopology.js +327 -0
  397. package/src/app/(dashboard)/dashboard/usage/components/RequestDetailsTab.js +433 -0
  398. package/src/app/(dashboard)/dashboard/usage/components/UsageChart.js +141 -0
  399. package/src/app/(dashboard)/dashboard/usage/components/UsageTable.js +247 -0
  400. package/src/app/(dashboard)/dashboard/usage/page.js +75 -0
  401. package/src/app/(dashboard)/layout.js +6 -0
  402. package/src/app/api/auth/login/route.js +76 -0
  403. package/src/app/api/auth/logout/route.js +12 -0
  404. package/src/app/api/auth/oidc/callback/route.js +87 -0
  405. package/src/app/api/auth/oidc/start/route.js +52 -0
  406. package/src/app/api/auth/oidc/test/route.js +84 -0
  407. package/src/app/api/auth/status/route.js +45 -0
  408. package/src/app/api/cli-tools/all-statuses/route.js +46 -0
  409. package/src/app/api/cli-tools/antigravity-mitm/alias/route.js +53 -0
  410. package/src/app/api/cli-tools/antigravity-mitm/route.js +202 -0
  411. package/src/app/api/cli-tools/claude-settings/route.js +203 -0
  412. package/src/app/api/cli-tools/cline-settings/route.js +133 -0
  413. package/src/app/api/cli-tools/codex-gateway/accounts/route.js +16 -0
  414. package/src/app/api/cli-tools/codex-settings/route.js +239 -0
  415. package/src/app/api/cli-tools/copilot-settings/route.js +148 -0
  416. package/src/app/api/cli-tools/cowork-mcp-registry/route.js +77 -0
  417. package/src/app/api/cli-tools/cowork-mcp-tools/route.js +95 -0
  418. package/src/app/api/cli-tools/cowork-settings/route.js +412 -0
  419. package/src/app/api/cli-tools/deepseek-tui-settings/route.js +164 -0
  420. package/src/app/api/cli-tools/droid-settings/route.js +213 -0
  421. package/src/app/api/cli-tools/hermes-settings/route.js +175 -0
  422. package/src/app/api/cli-tools/jcode-settings/route.js +216 -0
  423. package/src/app/api/cli-tools/kilo-settings/route.js +131 -0
  424. package/src/app/api/cli-tools/openclaw-settings/route.js +292 -0
  425. package/src/app/api/cli-tools/opencode-settings/route.js +259 -0
  426. package/src/app/api/combos/[id]/route.js +81 -0
  427. package/src/app/api/combos/route.js +48 -0
  428. package/src/app/api/health/route.js +15 -0
  429. package/src/app/api/init/route.js +4 -0
  430. package/src/app/api/keys/[id]/route.js +58 -0
  431. package/src/app/api/keys/route.js +42 -0
  432. package/src/app/api/locale/route.js +30 -0
  433. package/src/app/api/mcp/[plugin]/message/route.js +21 -0
  434. package/src/app/api/mcp/[plugin]/sse/route.js +37 -0
  435. package/src/app/api/media-providers/tts/deepgram/voices/route.js +65 -0
  436. package/src/app/api/media-providers/tts/elevenlabs/voices/route.js +71 -0
  437. package/src/app/api/media-providers/tts/inworld/voices/route.js +61 -0
  438. package/src/app/api/media-providers/tts/minimax/voices/route.js +113 -0
  439. package/src/app/api/media-providers/tts/voices/route.js +99 -0
  440. package/src/app/api/models/alias/route.js +53 -0
  441. package/src/app/api/models/availability/route.js +103 -0
  442. package/src/app/api/models/custom/route.js +48 -0
  443. package/src/app/api/models/disabled/route.js +50 -0
  444. package/src/app/api/models/route.js +64 -0
  445. package/src/app/api/models/test/ping.js +191 -0
  446. package/src/app/api/models/test/route.js +14 -0
  447. package/src/app/api/oauth/[provider]/[action]/route.js +343 -0
  448. package/src/app/api/oauth/codebuddy/bulk-import/[jobId]/cancel/route.js +19 -0
  449. package/src/app/api/oauth/codebuddy/bulk-import/[jobId]/manual/[workerId]/route.js +30 -0
  450. package/src/app/api/oauth/codebuddy/bulk-import/[jobId]/route.js +23 -0
  451. package/src/app/api/oauth/codebuddy/bulk-import/latest/route.js +25 -0
  452. package/src/app/api/oauth/codebuddy/bulk-import/route.js +49 -0
  453. package/src/app/api/oauth/codebuddy/quota-cookie/route.js +133 -0
  454. package/src/app/api/oauth/codex/import-token/route.js +96 -0
  455. package/src/app/api/oauth/cursor/auto-import/route.js +258 -0
  456. package/src/app/api/oauth/cursor/import/route.js +100 -0
  457. package/src/app/api/oauth/gitlab/pat/route.js +62 -0
  458. package/src/app/api/oauth/iflow/cookie/route.js +137 -0
  459. package/src/app/api/oauth/kiro/auto-import/route.js +85 -0
  460. package/src/app/api/oauth/kiro/bulk-import/[jobId]/cancel/route.js +18 -0
  461. package/src/app/api/oauth/kiro/bulk-import/[jobId]/manual/[workerId]/route.js +29 -0
  462. package/src/app/api/oauth/kiro/bulk-import/[jobId]/route.js +22 -0
  463. package/src/app/api/oauth/kiro/bulk-import/latest/route.js +25 -0
  464. package/src/app/api/oauth/kiro/bulk-import/route.js +49 -0
  465. package/src/app/api/oauth/kiro/import/route.js +110 -0
  466. package/src/app/api/oauth/kiro/social-authorize/route.js +27 -0
  467. package/src/app/api/oauth/kiro/social-exchange/route.js +41 -0
  468. package/src/app/api/pricing/route.js +134 -0
  469. package/src/app/api/provider-nodes/[id]/route.js +101 -0
  470. package/src/app/api/provider-nodes/route.js +104 -0
  471. package/src/app/api/provider-nodes/validate/route.js +201 -0
  472. package/src/app/api/providers/[id]/models/route.js +526 -0
  473. package/src/app/api/providers/[id]/route.js +189 -0
  474. package/src/app/api/providers/[id]/test/route.js +23 -0
  475. package/src/app/api/providers/[id]/test/testUtils.js +714 -0
  476. package/src/app/api/providers/[id]/test-models/route.js +66 -0
  477. package/src/app/api/providers/client/route.js +126 -0
  478. package/src/app/api/providers/kilo/free-models/route.js +55 -0
  479. package/src/app/api/providers/route.js +206 -0
  480. package/src/app/api/providers/suggested-models/filters.js +20 -0
  481. package/src/app/api/providers/suggested-models/route.js +32 -0
  482. package/src/app/api/providers/test-batch/route.js +131 -0
  483. package/src/app/api/providers/validate/route.js +637 -0
  484. package/src/app/api/proxy-pools/[id]/route.js +123 -0
  485. package/src/app/api/proxy-pools/[id]/test/route.js +70 -0
  486. package/src/app/api/proxy-pools/cloudflare-deploy/route.js +145 -0
  487. package/src/app/api/proxy-pools/deno-deploy/route.js +175 -0
  488. package/src/app/api/proxy-pools/route.js +93 -0
  489. package/src/app/api/proxy-pools/vercel-deploy/route.js +142 -0
  490. package/src/app/api/settings/database/route.js +36 -0
  491. package/src/app/api/settings/proxy-test/route.js +23 -0
  492. package/src/app/api/settings/require-login/route.js +15 -0
  493. package/src/app/api/settings/route.js +100 -0
  494. package/src/app/api/shutdown/route.js +24 -0
  495. package/src/app/api/tags/route.js +18 -0
  496. package/src/app/api/translator/console-logs/route.js +24 -0
  497. package/src/app/api/translator/console-logs/stream/route.js +79 -0
  498. package/src/app/api/translator/load/route.js +45 -0
  499. package/src/app/api/translator/save/route.js +44 -0
  500. package/src/app/api/translator/send/route.js +94 -0
  501. package/src/app/api/translator/translate/route.js +90 -0
  502. package/src/app/api/tunnel/disable/route.js +12 -0
  503. package/src/app/api/tunnel/enable/route.js +16 -0
  504. package/src/app/api/tunnel/status/route.js +13 -0
  505. package/src/app/api/tunnel/tailscale-check/route.js +50 -0
  506. package/src/app/api/tunnel/tailscale-disable/route.js +12 -0
  507. package/src/app/api/tunnel/tailscale-enable/route.js +12 -0
  508. package/src/app/api/tunnel/tailscale-install/route.js +72 -0
  509. package/src/app/api/usage/[connectionId]/route.js +188 -0
  510. package/src/app/api/usage/chart/route.js +21 -0
  511. package/src/app/api/usage/history/route.js +12 -0
  512. package/src/app/api/usage/logs/route.js +12 -0
  513. package/src/app/api/usage/providers/route.js +42 -0
  514. package/src/app/api/usage/request-details/route.js +57 -0
  515. package/src/app/api/usage/request-logs/route.js +13 -0
  516. package/src/app/api/usage/stats/route.js +23 -0
  517. package/src/app/api/usage/stream/route.js +79 -0
  518. package/src/app/api/v1/api/chat/route.js +37 -0
  519. package/src/app/api/v1/audio/speech/route.js +16 -0
  520. package/src/app/api/v1/audio/transcriptions/route.js +19 -0
  521. package/src/app/api/v1/audio/voices/route.js +68 -0
  522. package/src/app/api/v1/chat/completions/route.js +35 -0
  523. package/src/app/api/v1/embeddings/route.js +21 -0
  524. package/src/app/api/v1/images/generations/route.js +16 -0
  525. package/src/app/api/v1/messages/count_tokens/route.js +52 -0
  526. package/src/app/api/v1/messages/route.js +36 -0
  527. package/src/app/api/v1/models/[kind]/route.js +55 -0
  528. package/src/app/api/v1/models/info/route.js +110 -0
  529. package/src/app/api/v1/models/route.js +451 -0
  530. package/src/app/api/v1/responses/compact/route.js +37 -0
  531. package/src/app/api/v1/responses/route.js +30 -0
  532. package/src/app/api/v1/route.js +1 -0
  533. package/src/app/api/v1/search/route.js +21 -0
  534. package/src/app/api/v1/web/fetch/route.js +21 -0
  535. package/src/app/api/v1beta/models/[...path]/route.js +328 -0
  536. package/src/app/api/v1beta/models/route.js +44 -0
  537. package/src/app/api/version/route.js +45 -0
  538. package/src/app/api/version/shutdown/route.js +15 -0
  539. package/src/app/api/version/update/route.js +21 -0
  540. package/src/app/callback/page.js +148 -0
  541. package/src/app/dashboard/settings/pricing/page.js +173 -0
  542. package/src/app/favicon.ico +0 -0
  543. package/src/app/globals.css +496 -0
  544. package/src/app/landing/components/AnimatedBackground.js +57 -0
  545. package/src/app/landing/components/Features.js +133 -0
  546. package/src/app/landing/components/FlowAnimation.js +175 -0
  547. package/src/app/landing/components/Footer.js +61 -0
  548. package/src/app/landing/components/GetStarted.js +97 -0
  549. package/src/app/landing/components/HeroSection.js +47 -0
  550. package/src/app/landing/components/HowItWorks.js +66 -0
  551. package/src/app/landing/components/Navigation.js +72 -0
  552. package/src/app/landing/page.js +106 -0
  553. package/src/app/layout.js +49 -0
  554. package/src/app/login/page.js +197 -0
  555. package/src/app/manifest.js +30 -0
  556. package/src/app/page.js +5 -0
  557. package/src/dashboardGuard.js +242 -0
  558. package/src/i18n/RuntimeI18nProvider.js +27 -0
  559. package/src/i18n/config.js +146 -0
  560. package/src/i18n/runtime.js +162 -0
  561. package/src/lib/appUpdater.js +200 -0
  562. package/src/lib/auth/dashboardSession.js +68 -0
  563. package/src/lib/auth/loginLimiter.js +52 -0
  564. package/src/lib/auth/oidc.js +234 -0
  565. package/src/lib/consoleLogBuffer.js +79 -0
  566. package/src/lib/dataDir.js +29 -0
  567. package/src/lib/db/adapters/betterSqliteAdapter.js +55 -0
  568. package/src/lib/db/adapters/bunSqliteAdapter.js +63 -0
  569. package/src/lib/db/adapters/nodeSqliteAdapter.js +84 -0
  570. package/src/lib/db/adapters/sqljsAdapter.js +115 -0
  571. package/src/lib/db/backup.js +35 -0
  572. package/src/lib/db/driver.js +85 -0
  573. package/src/lib/db/helpers/jsonCol.js +9 -0
  574. package/src/lib/db/helpers/kvStore.js +39 -0
  575. package/src/lib/db/helpers/metaStore.js +22 -0
  576. package/src/lib/db/index.js +171 -0
  577. package/src/lib/db/migrate.js +286 -0
  578. package/src/lib/db/migrations/001-initial.js +14 -0
  579. package/src/lib/db/migrations/index.js +10 -0
  580. package/src/lib/db/paths.js +18 -0
  581. package/src/lib/db/repos/aliasRepo.js +62 -0
  582. package/src/lib/db/repos/apiKeysRepo.js +75 -0
  583. package/src/lib/db/repos/combosRepo.js +73 -0
  584. package/src/lib/db/repos/connectionsRepo.js +226 -0
  585. package/src/lib/db/repos/disabledModelsRepo.js +56 -0
  586. package/src/lib/db/repos/nodesRepo.js +95 -0
  587. package/src/lib/db/repos/pricingRepo.js +108 -0
  588. package/src/lib/db/repos/proxyPoolsRepo.js +103 -0
  589. package/src/lib/db/repos/requestDetailsRepo.js +259 -0
  590. package/src/lib/db/repos/settingsRepo.js +104 -0
  591. package/src/lib/db/repos/usageRepo.js +731 -0
  592. package/src/lib/db/schema.js +157 -0
  593. package/src/lib/db/version.js +21 -0
  594. package/src/lib/disabledModelsDb.js +4 -0
  595. package/src/lib/localDb.js +21 -0
  596. package/src/lib/mcp/stdioSseBridge.js +198 -0
  597. package/src/lib/mitmAliasCache.js +46 -0
  598. package/src/lib/network/connectionProxy.js +160 -0
  599. package/src/lib/network/initOutboundProxy.js +25 -0
  600. package/src/lib/network/outboundProxy.js +68 -0
  601. package/src/lib/network/proxyTest.js +91 -0
  602. package/src/lib/oauth/constants/oauth.js +284 -0
  603. package/src/lib/oauth/constants/xai.js +61 -0
  604. package/src/lib/oauth/providers.js +1506 -0
  605. package/src/lib/oauth/services/antigravity.js +321 -0
  606. package/src/lib/oauth/services/claude.js +136 -0
  607. package/src/lib/oauth/services/codebuddyBulkImportManager.js +454 -0
  608. package/src/lib/oauth/services/codex.js +144 -0
  609. package/src/lib/oauth/services/cursor.js +179 -0
  610. package/src/lib/oauth/services/gemini.js +240 -0
  611. package/src/lib/oauth/services/github.js +225 -0
  612. package/src/lib/oauth/services/iflow.js +202 -0
  613. package/src/lib/oauth/services/index.js +17 -0
  614. package/src/lib/oauth/services/kiro.js +334 -0
  615. package/src/lib/oauth/services/kiroBulkImportManager.js +778 -0
  616. package/src/lib/oauth/services/kiroConnections.js +93 -0
  617. package/src/lib/oauth/services/kiroGoogleAutomation.js +1136 -0
  618. package/src/lib/oauth/services/oauth.js +157 -0
  619. package/src/lib/oauth/services/openai.js +123 -0
  620. package/src/lib/oauth/services/qoder.js +216 -0
  621. package/src/lib/oauth/services/qwen.js +170 -0
  622. package/src/lib/oauth/services/xai.js +238 -0
  623. package/src/lib/oauth/utils/banner.js +63 -0
  624. package/src/lib/oauth/utils/pkce.js +39 -0
  625. package/src/lib/oauth/utils/server.js +415 -0
  626. package/src/lib/oauth/utils/ui.js +48 -0
  627. package/src/lib/providerNormalization.js +45 -0
  628. package/src/lib/qoder/constants.js +64 -0
  629. package/src/lib/qoder/cosy.js +175 -0
  630. package/src/lib/qoder/encoding.js +55 -0
  631. package/src/lib/requestDetailsDb.js +4 -0
  632. package/src/lib/tunnel/cloudflare/cloudflared.js +449 -0
  633. package/src/lib/tunnel/cloudflare/config.js +9 -0
  634. package/src/lib/tunnel/cloudflare/healthCheck.js +29 -0
  635. package/src/lib/tunnel/cloudflare/manager.js +151 -0
  636. package/src/lib/tunnel/cloudflare/pid.js +23 -0
  637. package/src/lib/tunnel/index.js +48 -0
  638. package/src/lib/tunnel/shared/dnsResolver.js +17 -0
  639. package/src/lib/tunnel/shared/internetCheck.js +26 -0
  640. package/src/lib/tunnel/shared/state.js +41 -0
  641. package/src/lib/tunnel/shared/watchdogConfig.js +8 -0
  642. package/src/lib/tunnel/tailscale/config.js +7 -0
  643. package/src/lib/tunnel/tailscale/healthCheck.js +29 -0
  644. package/src/lib/tunnel/tailscale/manager.js +129 -0
  645. package/src/lib/tunnel/tailscale/tailscale.js +790 -0
  646. package/src/lib/updater/updater.js +235 -0
  647. package/src/lib/usage/fetcher.js +208 -0
  648. package/src/lib/usageDb.js +7 -0
  649. package/src/mitm/antigravityIdeVersion.js +50 -0
  650. package/src/mitm/cert/generate.js +32 -0
  651. package/src/mitm/cert/install.js +269 -0
  652. package/src/mitm/cert/rootCA.js +173 -0
  653. package/src/mitm/config.js +87 -0
  654. package/src/mitm/dbReader.js +22 -0
  655. package/src/mitm/dns/dnsConfig.js +266 -0
  656. package/src/mitm/handlers/antigravity.js +33 -0
  657. package/src/mitm/handlers/base.js +226 -0
  658. package/src/mitm/handlers/copilot.js +35 -0
  659. package/src/mitm/handlers/cursor.js +15 -0
  660. package/src/mitm/handlers/kiro.js +526 -0
  661. package/src/mitm/logger.js +106 -0
  662. package/src/mitm/manager.js +851 -0
  663. package/src/mitm/paths.js +32 -0
  664. package/src/mitm/server.js +435 -0
  665. package/src/mitm/winElevated.js +81 -0
  666. package/src/models/index.js +38 -0
  667. package/src/proxy.js +5 -0
  668. package/src/shared/components/AddCustomEmbeddingModal.js +183 -0
  669. package/src/shared/components/Avatar.js +88 -0
  670. package/src/shared/components/Badge.js +54 -0
  671. package/src/shared/components/BulkAccountAutomationModal.js +508 -0
  672. package/src/shared/components/Button.js +56 -0
  673. package/src/shared/components/Card.js +116 -0
  674. package/src/shared/components/ChangelogModal.js +97 -0
  675. package/src/shared/components/CodeBuddyQuotaCookieModal.js +109 -0
  676. package/src/shared/components/ComboFormModal.js +176 -0
  677. package/src/shared/components/CursorAuthModal.js +212 -0
  678. package/src/shared/components/DonateModal.js +136 -0
  679. package/src/shared/components/Drawer.js +82 -0
  680. package/src/shared/components/EditConnectionModal.js +286 -0
  681. package/src/shared/components/Footer.js +132 -0
  682. package/src/shared/components/GitLabAuthModal.js +194 -0
  683. package/src/shared/components/Header.js +380 -0
  684. package/src/shared/components/HeaderLanguage.js +46 -0
  685. package/src/shared/components/HeaderMenu.js +126 -0
  686. package/src/shared/components/IFlowCookieModal.js +132 -0
  687. package/src/shared/components/Input.js +65 -0
  688. package/src/shared/components/KiroAuthModal.js +1171 -0
  689. package/src/shared/components/KiroOAuthWrapper.js +149 -0
  690. package/src/shared/components/KiroSocialOAuthModal.js +205 -0
  691. package/src/shared/components/LanguageSwitcher.js +190 -0
  692. package/src/shared/components/Loading.js +75 -0
  693. package/src/shared/components/ManualConfigModal.js +44 -0
  694. package/src/shared/components/McpMarketplaceModal.js +255 -0
  695. package/src/shared/components/Modal.js +146 -0
  696. package/src/shared/components/ModelSelectModal.js +537 -0
  697. package/src/shared/components/NineRemoteButton.js +23 -0
  698. package/src/shared/components/NineRemotePromoModal.js +99 -0
  699. package/src/shared/components/NoAuthProxyCard.js +86 -0
  700. package/src/shared/components/OAuthModal.js +682 -0
  701. package/src/shared/components/Pagination.js +150 -0
  702. package/src/shared/components/PricingModal.js +208 -0
  703. package/src/shared/components/ProviderIcon.js +63 -0
  704. package/src/shared/components/ProviderInfoCard.js +82 -0
  705. package/src/shared/components/RequestLogger.js +121 -0
  706. package/src/shared/components/SegmentedControl.js +48 -0
  707. package/src/shared/components/Select.js +67 -0
  708. package/src/shared/components/Sidebar.js +441 -0
  709. package/src/shared/components/ThemeProvider.js +15 -0
  710. package/src/shared/components/ThemeToggle.js +42 -0
  711. package/src/shared/components/Toggle.js +69 -0
  712. package/src/shared/components/Tooltip.js +25 -0
  713. package/src/shared/components/UsageStats.js +505 -0
  714. package/src/shared/components/index.js +46 -0
  715. package/src/shared/components/layouts/AuthLayout.js +29 -0
  716. package/src/shared/components/layouts/DashboardLayout.js +104 -0
  717. package/src/shared/components/layouts/index.js +4 -0
  718. package/src/shared/constants/cliTools.js +397 -0
  719. package/src/shared/constants/colors.js +77 -0
  720. package/src/shared/constants/config.js +99 -0
  721. package/src/shared/constants/coworkPlugins.js +75 -0
  722. package/src/shared/constants/index.js +4 -0
  723. package/src/shared/constants/locales.js +36 -0
  724. package/src/shared/constants/mitmToolHosts.js +12 -0
  725. package/src/shared/constants/models.js +38 -0
  726. package/src/shared/constants/pricing.js +303 -0
  727. package/src/shared/constants/providers.js +289 -0
  728. package/src/shared/constants/skills.js +78 -0
  729. package/src/shared/constants/ttsProviders.js +138 -0
  730. package/src/shared/hooks/index.js +2 -0
  731. package/src/shared/hooks/useCopyToClipboard.js +43 -0
  732. package/src/shared/hooks/useTheme.js +60 -0
  733. package/src/shared/services/bootstrap.js +12 -0
  734. package/src/shared/services/initializeApp.js +268 -0
  735. package/src/shared/utils/api.js +93 -0
  736. package/src/shared/utils/apiKey.js +98 -0
  737. package/src/shared/utils/clineAuth.js +37 -0
  738. package/src/shared/utils/cn.js +11 -0
  739. package/src/shared/utils/connectionStatus.js +162 -0
  740. package/src/shared/utils/index.js +40 -0
  741. package/src/shared/utils/machine.js +6 -0
  742. package/src/shared/utils/machineId.js +66 -0
  743. package/src/shared/utils/providerModelsFetcher.js +30 -0
  744. package/src/sse/handlers/chat.js +261 -0
  745. package/src/sse/handlers/embeddings.js +141 -0
  746. package/src/sse/handlers/fetch.js +213 -0
  747. package/src/sse/handlers/imageGeneration.js +142 -0
  748. package/src/sse/handlers/search.js +206 -0
  749. package/src/sse/handlers/stt.js +88 -0
  750. package/src/sse/handlers/tts.js +114 -0
  751. package/src/sse/services/auth.js +346 -0
  752. package/src/sse/services/codexGateway.js +215 -0
  753. package/src/sse/services/model.js +99 -0
  754. package/src/sse/services/tokenRefresh.js +319 -0
  755. package/src/sse/utils/logger.js +75 -0
  756. package/src/store/headerSearchStore.js +19 -0
  757. package/src/store/index.js +6 -0
  758. package/src/store/notificationStore.js +45 -0
  759. package/src/store/providerStore.js +55 -0
  760. package/src/store/settingsStore.js +51 -0
  761. package/src/store/themeStore.js +54 -0
  762. package/src/store/userStore.js +20 -0
  763. 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
+ [![npm](https://img.shields.io/npm/v/9router.svg)](https://www.npmjs.com/package/9router)
15
+ [![Downloads](https://img.shields.io/npm/dm/9router.svg)](https://www.npmjs.com/package/9router)
16
+ [![License](https://img.shields.io/npm/l/9router.svg)](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
+ [![Настройка 9Router + Claude Code](https://img.youtube.com/vi/raEyZPg5xE0/maxresdefault.jpg)](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
+ [![Contributors](https://contrib.rocks/image?repo=decolua/9router&max=100&columns=20&anon=1)](https://github.com/decolua/9router/graphs/contributors)
1272
+
1273
+ ---
1274
+
1275
+ ## 📊 Star Chart
1276
+
1277
+ [![Star Chart](https://starchart.cc/decolua/9router.svg?variant=adaptive)](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>