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,1310 @@
1
+ Dưới đây là bản dịch tiếng Việt của tài liệu Markdown, giữ nguyên toàn bộ cú pháp và cấu trúc kỹ thuật.
2
+
3
+ <div align="center">
4
+ <img src="../images/9router.png?1" alt="Bảng điều khiển 9Router" width="800"/>
5
+
6
+ # 9Router - Free AI Router
7
+
8
+ **Không bao giờ ngừng code. Tự động định tuyến tới các mô hình AI MIỄN PHÍ & giá rẻ với cơ chế dự phòng thông minh.**
9
+
10
+ **Nhà cung cấp AI Miễn cho OpenClaw.**
11
+
12
+ <p align="center">
13
+ <img src="../public/providers/openclaw.png" alt="OpenClaw" width="80"/>
14
+ </p>
15
+
16
+ [![npm](https://img.shields.io/npm/v/9router.svg)](https://www.npmjs.com/package/9router)
17
+ [![Downloads](https://img.shields.io/npm/dm/9router.svg)](https://www.npmjs.com/package/9router)
18
+ [![License](https://img.shields.io/npm/l/9router.svg)](https://github.com/decolua/9router/blob/main/LICENSE)
19
+
20
+ [🚀 Bắt đầu nhanh](#-quick-start) • [💡 Tính năng](#-key-features) • [📖 Cài đặt](#-setup-guide) • [🌐 Website](https://9router.com)
21
+ </div>
22
+
23
+ ---
24
+
25
+ ## 🤔 Tại sao chọn 9Router?
26
+
27
+ **Ngừng lãng phí tiền bạc và gặp phải giới hạn:**
28
+
29
+ - ❌ Hạn mức gói đăng ký hết hạn mỗi tháng mà không dùng hết
30
+ - ❌ Giới hạn tốc độ (rate limit) ngăn bạn giữaừng khi code
31
+ - ❌ Các API đắt đỏ ($20-50/tháng cho mỗi nhà cung cấp)
32
+ - ❌ Phải chuyển đổi thủ công giữa các nhà cung cấp
33
+
34
+ **9Router giải quyết vấn đề này:**
35
+
36
+ - ✅ **Tối đa hóa gói đăng ký** - Theo dõi hạn mức, sử dụng từng bit trước khi reset
37
+ - ✅ **Tự động dự phòng** - Gói đăng ký → Giá rẻ → Miễn phí, thời gian chết bằng không
38
+ - ✅ **Đa tài khoản** - Vòng tròn (round-robin) các tài khoản của mỗi nhà cung cấp
39
+ - ✅ **Phổ quát** - Hoạt động với Claude Code, Codex, Gemini CLI, Cursor, Cline, bất kỳ công cụ CLI nào
40
+
41
+ ---
42
+
43
+ ## 🔄 Cách thức hoạt động
44
+
45
+ ```
46
+ ┌─────────────┐
47
+ │ Your CLI │ (Claude Code, Codex, Gemini CLI, OpenClaw, Cursor, Cline...)
48
+ │ Tool │
49
+ └──────┬──────┘
50
+ │ http://localhost:20128/v1
51
+
52
+ ┌────────────────────────────────────────┐
53
+ │ 9Router (Smart Router) │
54
+ │ • Format translation (OpenAI ↔ Claude) │
55
+ │ • Quota tracking │
56
+ │ • Auto token refresh │
57
+ └──────┬──────────────────────────────────┘
58
+
59
+ ├─→ [Tier 1: SUBSCRIPTION] Claude Code, Codex, Gemini CLI
60
+ │ ↓ quota exhausted
61
+ ├─→ [Tier 2: CHEAP] GLM ($0.6/1M), MiniMax ($0.2/1M)
62
+ │ budget limit
63
+ └─→ [Tier 3: FREE] iFlow, Qwen, Kiro (unlimited)
64
+
65
+ Result: Never stop coding, minimal cost
66
+ ```
67
+
68
+ ---
69
+
70
+ ## ⚡ Bắt đầu nhanh
71
+
72
+ **1. Cài đặt toàn cục:**
73
+
74
+ ```bash
75
+ npm install -g 9router
76
+ 9router
77
+ ```
78
+
79
+ 🎉 Bảng điều khiển mở tại `http://localhost:20128`
80
+
81
+ **2. Kết nối nhà cung cấp MIỄN PHÍ (không cần đăng ký):**
82
+
83
+ Bảng điều khiển → Providers -> Kết nối **ude Code** hoặc **Antigravity** -> Đăng nhập OAuth -> Xong!
84
+
85
+ **3. Sử dụng trong công cụ CLI của bạn:**
86
+
87
+ ```
88
+ Cài đặt Claude Code/Codex/Gemini CLI/OpenClaw/Cursor/Cline:
89
+ Endpoint: http://localhost:20128/v1
90
+ API Key: [sao chép từ bảng điều khiển]
91
+ Model: if/kimi-k2-thinking
92
+ ```
93
+
94
+ **Xong rồi!** Bắt đầu code với các mô hình AI MIỄN PHÍ.
95
+
96
+ **Phương án khác: chạy từ nguồn (k lưu trữ này):**
97
+
98
+ Gói kho lưu trữ này là riêng tư (`9router-app`), vì vậy việc thực thi nguồn/Docker là đường dẫn phát triển cục bộ dự kiến.
99
+
100
+ ```bash
101
+ cp .env.example .env
102
+ npm install
103
+ PORT=20128 NEXT_PUBLIC_BASE_URL=http://localhost:20128 npm run dev
104
+ ```
105
+
106
+ Chế độ Production:
107
+
108
+ ```bash
109
+ npm run build
110
+ PORT=20128 HOSTNAME=0.0.0.0 NEXT_PUBLIC_BASE_URL=http://localhost:20128 npm run start
111
+ ```
112
+
113
+ URL mặc định:
114
+ - Bảng điều khiển: `http://localhost:20128/dashboard`
115
+ - API tương thích OpenAI: `http://localhost:20128/v1`
116
+
117
+ ---
118
+
119
+ ## 🎥 Hướng dẫn Video
120
+
121
+ <div align="center">
122
+
123
+ ### 📺 Hướng dẫn thiết lập hoàn chỉnh - 9Router + Claude Code MIỄN PHÍ
124
+
125
+ [![Thiết lập 9Router + Claude Code](https://img.youtube.com/vi/raEyZPg5xE0/maxresdefault.jpg)](https://www.youtube.com/watch?v=raEyZPg5xE0)
126
+
127
+ **🎬 Xem hướng dẫn từng đầy đủ:**
128
+ - ✅ Cài đặt & thiết lập 9Router
129
+ - ✅ Cấu hình Claude Sonnet 4.5 MIỄN PHÍ
130
+ - ✅ Tích hợp Claude Code
131
+ - ✅ Thử nghiệm code trực tiếp
132
+
133
+ **⏱️ Thời lượng:** 20 phút | **👥 Bởi:** Cộng đồng Nhà phát triển
134
+
135
+ [▶️ Xem trên YouTube](https://www.youtube.com/watch?v=o3qYCyjrFYg)
136
+
137
+ </div>
138
+
139
+ ---
140
+
141
+ ## 🛠️ Các công cụ CLI được hỗ trợ
142
+
143
+ 9Router hoạt động liền mạch với tất cả các công cụ code AI chính:
144
+
145
+ <div align="center">
146
+ <table>
147
+ <tr>
148
+ <td align="center" width="120">
149
+ <img src="../public/providers/claude.png" width="60" alt="Claude Code"/><br/>
150
+ <b>Claude-Code</b>
151
+ </td>
152
+ <td align="center" width="120">
153
+ <img src="../public/providers/openclaw.png" width="60" alt="OpenClaw"/><br/>
154
+ <b>OpenClaw</b>
155
+ </td>
156
+ <td align="center" width="120">
157
+ <img src="../public/providers/codex.png" width="60" alt="Codex"/><br/>
158
+ <b>Codex</b>
159
+ </td>
160
+ <td align="center" width="120">
161
+ <img src="../public/providers/opencode.png" width="60" alt="OpenCode"/><br/>
162
+ <b>OpenCode</b>
163
+ </td>
164
+ <td align="center" width="120">
165
+ <img src="../public/providers/cursor.png" width="60" alt="Cursor"/><br/>
166
+ <b>Cursor</b>
167
+ </td>
168
+ <td align="center" width="120">
169
+ <img src="../public/providers/antigravity.png" width="60" alt="Antigravity"/><br/>
170
+ <b>Antigravity</b>
171
+ </td>
172
+ </tr>
173
+ <tr>
174
+ <td align="center" width="120">
175
+ <img src="../public/providers/cline.png" width="60" alt="Cline"/><br/>
176
+ <b>Cline</b>
177
+ </td>
178
+ <td align="center" width="120">
179
+ <img src="../public/providers/continue.png" width="60" alt="Continue"/><br/>
180
+ <b>Continue</b>
181
+ </td>
182
+ <td align="center" width="120">
183
+ <img src="../public/providers/droid.png" width="60" alt="Droid"/><br/>
184
+ <b>Droid</b>
185
+ </td>
186
+ <td align="center" width="120">
187
+ <img src="../public/providers/roo.png" width="60" alt="Roo"/><br/>
188
+ <b>Roo</b>
189
+ </td>
190
+ <td align="center" width="120">
191
+ <img src="../public/providers/copilot.png" width="60" alt="Copilot"/><br/>
192
+ <b>Copilot</b>
193
+ </td>
194
+ <td align="center" width="120">
195
+ <img src="../public/providers/kilocode.png" width="60" alt="Kilo Code"/><br/>
196
+ <b>Kilo Code</b>
197
+ </td>
198
+ </tr>
199
+ </table>
200
+ </div>
201
+
202
+ ---
203
+
204
+ ## Các nhà cung cấp được hỗ trợ
205
+
206
+ ### 🔐 Các nhà cung cấp OAuth
207
+
208
+ <div align="center">
209
+ <table>
210
+ <tr>
211
+ <td align="center" width="120">
212
+ <img src="../public/providers/claude.png" width="60" alt="Claude Code"/><br/>
213
+ <b>Claude-Code</b>
214
+ </td>
215
+ <td align="center" width="120">
216
+ <img src="../public/providers/antigravity.png" width="60" alt="Antigravity"/><br/>
217
+ <b>Antigravity</b>
218
+ </td>
219
+ <td align="center" width="120">
220
+ <img src="../public/providers/codex.png" width="60" alt="Codex"/><br/>
221
+ <b>Codex</b>
222
+ </td>
223
+ <td align="center" width="120">
224
+ <img src="../public/providers/github.png" width="60" alt="GitHub"/><br/>
225
+ <b>GitHub</b>
226
+ </td>
227
+ <td align="center" width="120">
228
+ <img src="../public/providers/cursor.png" width="60" alt="Cursor"/><br/>
229
+ <b>Cursor</b>
230
+ </td>
231
+ </tr>
232
+ </table>
233
+ </div>
234
+
235
+ ### 🆓 Các nhà cung cấp Miễn phí
236
+
237
+ <div align="center">
238
+ <table>
239
+ <tr>
240
+ <td align="center" width="150">
241
+ <img src="../public/providers/iflow.png" width="70" alt="iFlow"/><br/>
242
+ <b>iFlow AI</b><br/>
243
+ <sub>8+ mô hình • Không giới hạn</sub>
244
+ </td>
245
+ <td align="center" width="150">
246
+ <img src="../public/providers/qwen.png" width="70" alt="Qwen"/><br/>
247
+ <b>Qwen Code</b><br/>
248
+ <sub>3+ mô hình • Không giới hạn</sub>
249
+ </td>
250
+ <td align="center" width="150">
251
+ <img src="../public/providers/gemini-cli.png" width="70" alt="Gemini CLI"/><br/>
252
+ <b>Gemini CLI</b><br/>
253
+ <sub>180K/tháng MIỄN PHÍ</sub>
254
+ </td>
255
+ <td align="center" width="150">
256
+ <img src="../public/providers/kiro.png" width="70" alt="Kiro"/><br/>
257
+ <b>Kiro AI</b><br/>
258
+ <sub>Claude • Không giới hạn</sub>
259
+ </td>
260
+ </tr>
261
+ </table>
262
+ </div>
263
+
264
+ ### 🔑 Các nhà cung cấp API Key (40+)
265
+
266
+ <div align="center">
267
+ <table>
268
+ <tr>
269
+ <td align="center" width="100">
270
+ <img src="../public/providers/openrouter.png" width="50" alt="OpenRouter"/><br/>
271
+ <sub>OpenRouter</sub>
272
+ </td>
273
+ <td align="center" width="100">
274
+ <img src="../public/providers/glm.png" width="50" alt="GLM"/><br/>
275
+ <sub>GLM</sub>
276
+ </td>
277
+ <td align="center" width="100">
278
+ <img src="../public/providers/kimi.png" width="50" alt="Kimi"/><br/>
279
+ <sub>Kimi</sub>
280
+ </td>
281
+ <td align="center" width="100">
282
+ <img src="../public/providers/minimax.png" width="50" alt="MiniMax"/><br/>
283
+ <sub>MiniMax</sub>
284
+ </td>
285
+ <td align="center" width="100">
286
+ <img src="../public/providers/openai.png" width="50" alt="OpenAI"/><br/>
287
+ <sub>OpenAI</sub>
288
+ </td>
289
+ <td align="center" width="100">
290
+ <img src="../public/providers/anthropic.png" width="50" alt="Anthropic"/><br/>
291
+ <sub>Anthropic</sub>
292
+ </td>
293
+ </tr>
294
+ <tr>
295
+ <td align="center" width="100">
296
+ <img src="../public/providers/gemini.png" width="50" alt="Gemini"/><br/>
297
+ <sub>Gemini</sub>
298
+ </td>
299
+ <td align="center" width="100">
300
+ <img src="../public/providers/deepseek.png" width="50" alt="DeepSeek"/><br/>
301
+ <sub>DeepSeek</sub>
302
+ </td>
303
+ <td align="center" width="100">
304
+ <img src="../public/providers/groq.png" width="50" alt="Groq"/><br/>
305
+ <sub>Groq</sub>
306
+ </td>
307
+ <td align="center" width="100">
308
+ <img src="../public/providers/xai.png" width="50" alt="xAI"/><br/>
309
+ <sub>xAI</sub>
310
+ </td>
311
+ <td align="center" width="100">
312
+ <img src="../public/providers/mistral.png" width="50" alt="Mistral"/><br/>
313
+ <sub>Mistral</sub>
314
+ </td>
315
+ <td align="center" width="100">
316
+ <img src="../public/providers/perplexity.png" width="50" alt="Perplexity"/><br/>
317
+ <sub>Perplexity</sub>
318
+ </td>
319
+ </tr>
320
+ <tr>
321
+ <td align="center" width="100">
322
+ <img src="../public/providers/together.png" width="50" alt="Together"/><br/>
323
+ <sub>Together AI</sub>
324
+ </td>
325
+ <td align="center" width="100">
326
+ <img src="../public/providers/fireworks.png" width="50" alt="Fireworks"/><br/>
327
+ <sub>Fireworks</sub>
328
+ </td>
329
+ <td align="center" width="100">
330
+ <img src="../public/providers/cerebras.png" width="50" alt="Cerebras"/><br/>
331
+ <sub>Cerebras</sub>
332
+ </td>
333
+ <td align="center" width="100">
334
+ <img src="../public/providers/cohere.png" width="50" alt="Cohere"/><br/>
335
+ <sub>Cohere</sub>
336
+ </td>
337
+ <td align="center" width="100">
338
+ <img src="../public/providers/nvidia.png" width="50" alt="NVIDIA"/><br/>
339
+ <sub>NVIDIA</sub>
340
+ </td>
341
+ <td align="center" width="100">
342
+ <img src="../public/providers/siliconflow.png" width="50" alt="SiliconFlow"/><br/>
343
+ <sub>SiliconFlow</sub>
344
+ </td>
345
+ </tr>
346
+ </table>
347
+ <p><i>...và hơn 20 nhà cung cấp khác bao gồm Nebius, Chutes, Hyperbolic và các endpoint tương thích OpenAI/Anthropic tùy chỉnh</i></p>
348
+ </div>
349
+
350
+ ---
351
+
352
+ ## 💡 Các tính năng chính
353
+
354
+ | Tính năng | Công dụng | Tại sao nó trọng |
355
+ |---------|--------------|----------------|
356
+ | 🎯 **Smart 3-Tier Fallback** | Tự động định tuyến: Gói đăng ký → Giá rẻ → Miễn phí | Không bao giờ ngừng code, thời gian chết bằng không |
357
+ | 📊 **Theo dõi hạn mức thời gian thực** | Đếm token trực tiếp + đếm ngược reset | Tối đa hóa giá trị gói đăng ký |
358
+ | 🔄 **Dịch chuyển định dạng** | OpenAI ↔ Claude ↔ Gemini liền mạch | Hoạt động với mọi công cụ CLI |
359
+ | 👥 **Hỗ trợ Đa tài khoản** | Nhiều tài khoản cho mỗi nhà cung cấp | Cân bằng tải + dự phòng |
360
+ | 🔄 **Tự động làm mới Token** | Token OAuth tự động làm mới | Không cần đăng nhập lại thủ công |
361
+ | 🎨 **Combo tùy chỉnh** | Tạo tổ hợp mô hình không giới hạn | Điều chỉnh dự phòng theo nhu cầu |
362
+ | 📝 **Ghi log Request** | Chế độ gỡ lỗi với log request/response đầy đủ | Dễ dàng khắc phục sự cố |
363
+ | 💾 **Đồng bộ đám mây** | Đồng bộ cấu hình giữa các thiết bị | Cài đặt giống nhau ở mọi nơi |
364
+ | 📊 **Phân tích sử dụng** | Theo dõi token, chi phí, xu hướng theo thời gian | Tối ưu hóa chi tiêu |
365
+ | 🌐 **Triển khai ở bất cứ đâu** | Localhost, VPS, Docker, Cloudflare Workers | Tùy chọn triển khai linh hoạt |
366
+
367
+ <details>
368
+ <summary><b>📖 Chi tiết tính năng</b></summary>
369
+
370
+ ### 🎯 Smart 3-Tier Fallback
371
+
372
+ Tạo combo với tính năng phòng tự động:
373
+
374
+ ```
375
+ Combo: "my-coding-stack"
376
+ 1. cc/claude-opus-4-6 (gói đăng ký của bạn)
377
+ 2. glm/glm-4.7 (backup giá rẻ, $0.6/1M)
378
+ 3. if/kimi-k2-thinking (dự phòng miễn phí)
379
+
380
+ → Tự động chuyển đổi khi hết hạn mức hoặc xảy ra lỗi
381
+ ```
382
+
383
+ ### 📊 Theo dõi hạn mức thời gian thực
384
+
385
+ - Mức tiêu thụ token cho mỗi nhà cung cấp
386
+ - Đếm ngược reset (5 giờ, hàng ngày, hàng tuần)
387
+ - Ước tính chi phí cho các tầng trả phí
388
+ - Báo cáo chi tiêu hàng tháng
389
+
390
+ ### 🔄 Dịch chuyển định dạng
391
+
392
+ Dịch chuyển liền mạch giữa các định dạng:
393
+ - **OpenAI** ↔ **Claude** ↔ **Gemini** ↔ **OpenAI Responses**
394
+ - Công cụ CLI của bạn gửi định dạng OpenAI → 9Router dịch chuyển → Nhà cung cấp nhận định dạng gốc
395
+ - Hoạt động với mọi công cụ hỗ trợ endpoint OpenAI tùy chỉnh
396
+
397
+ ### 👥 Hỗ trợ Đa tài khoản
398
+
399
+ - Thêm nhiều tài khoản cho mỗi nhà cung cấp
400
+ - Định tuyến vòng tròn (round-robin) hoặc dựa trên ưu tiên tự động
401
+ - Dự phòng sang tài khoản tiếp theo khi một tài khoản chạm hạn mức
402
+
403
+ ### 🔄 Tự động làm mới Token
404
+
405
+ - Token OAuth tự động làm mới trước khi hết hạn
406
+ - Không cần xác thực lại thủ công
407
+ - Trải nghiệm liền mạch trên mọi nhà cung cấp
408
+
409
+ ### 🎨 Combo tùy chỉnh
410
+
411
+ - Tạo tổ hợp mô hình không hạn
412
+ - Kết hợp các tầng gói đăng ký, giá rẻ và miễn phí
413
+ - Đặt tên combo để dễ truy cập
414
+ - Chia sẻ combo giữa các thiết bị với Đồng bộ đám mây
415
+
416
+ ### 📝 Ghi log Request
417
+
418
+ - Bật chế độ gỡ lỗi để xem log request/response đầy đủ
419
+ - Theo dõi các lệnh gọi API, tiêu đề và payload
420
+ - Khắc phục sự cố tích hợp
421
+ - Xuất log để phân tích
422
+
423
+ ### 💾 Đồng bộ đám mây
424
+
425
+ - Đồng bộ nhà cung cấp, combo và c đặt giữa các thiết bị
426
+ - Tự động đồng bộ nền
427
+ - Lưu trữ được mã hóa an toàn
428
+ - Truy cập cài đặt của bạn từ bất cứ đâu
429
+
430
+ #### Ghi chú Runtime Đám mây
431
+
432
+ - Ưu tiên biến đám mây phía máy chủ trong môi trường production:
433
+ - `BASE_URL` (URL callback nội bộ được sử dụng bởi bộ lập lịch đồng bộ)
434
+ - `CLOUD_URL` (cơ sở endpoint đồng bộ đám mây)
435
+ - `NEXT_PUBLIC_BASE_URL` và `NEXT_PUBLIC_CLOUD_URL` vẫn được hỗ trợ để thích/UI, nhưng runtime máy chủ hiện ưu tiên `BASE_URL`/`CLOUD_URL`.
436
+ - Các yêu cầu đồng bộ đám mây hiện sử dụng thời gian chờ + hành vi fail-fast để tránh treo UI khi DNS/mạng đám mây không khả dụng.
437
+
438
+ ### 📊 Phân tích sử dụng
439
+
440
+ - Theo dõi mức sử dụng token theo nhà cung cấp và mô hình
441
+ - Ước tính chi phí và xu hướng chi tiêu
442
+ - Báo cáo và thông tin chi tiết hàng tháng
443
+ - Tối ưu hóa chi tiêu AI của bạn
444
+
445
+ > **💡AN TRỌNG - Hiểu về Chi phí trên Bảng điều khiển:**
446
+ >
447
+ > "Chi phí" hiển thị trong Phân tích sử dụng là **chỉ để theo dõi và so sánh**.
448
+ > Bản thân 9Router **không bao giờ thu phí** bạn bất cứ thứ gì. Bạn chỉ trả tiền trực tiếp cho các nhà cung cấp (nếu sử dụng dịch vụ trả phí).
449
+ >
450
+ > **Ví dụ:** Nếu bảng điều khiển của bạn hiển thị "tổng chi phí $290" trong khi sử dụng các mô hìnhFlow, điều này đại diện cho
451
+ > số tiền bạn sẽ phải trả nếu sử dụng API trả phí trực tiếp. Chi phí thực tế của bạn = **$0** (iFlow miễn phí không giới hạn).
452
+ >
453
+ > Hãy coi nó như một "trình theo dõi tiết kiệm" cho thấy bạn đang tiết kiệm được bao nhiêu bằng cách sử dụng các mô hình miễn phí hoặc
454
+ > định tuyến qua 9Router!
455
+
456
+ ### 🌐 Triển khai ở bất cứ đâu
457
+
458
+ - 💻 **Localhost** - Mặc định, hoạt động ngoại tuyến
459
+ ☁️ **VPS/Cloud** - Chia sẻ giữa các thiết bị
460
+ - 🐳 **Docker** - Triển khai bằng một lệnh
461
+ - 🚀 **Cloudflare Workers** - Mạng edge toàn cầu
462
+
463
+ </details>
464
+
465
+ ---
466
+
467
+ ## 💰 Tổng quan về giá
468
+
469
+ | Hạng mục | Nhà cung cấp | Chi phí | Reset Hạn mức | Tốt nhất cho |
470
+ |------|----------|------|-------------|----------|
471
+ | **💳 GÓI ĐĂNG KÝ** | Claude Code (Pro) | $20/tháng | 5h + hàng tuần | Đã đăng ký rồi |
472
+ | | Codex (Plus/Pro) | $20-200/tháng | 5h + hàng tuần | Người dùng OpenAI |
473
+ | | Gemini CLI | **MIỄN PHÍ** | 180K/tháng + 1K/ngày | Tất cả mọi người! |
474
+ | | GitHub Copilot | $10-19/tháng | Hàng tháng | Người dùng GitHub |
475
+ | **💰 GIÁ RẺ** | GLM-4.7 | $0.6/1M | 10AM hàng ngày | Backup ngân sách |
476
+ | | MiniMax M21 | $0.2/1M | 5 giờ luân phiên | Lựa chọn rẻ nhất |
477
+ | | Kimi K2 | $9/tháng cố định | 10M token/tháng | Chi phí dự đoán được |
478
+ | **🆓 MIỄN PHÍ** | iFlow | $0 | Không giới hạn | 8 mô hình miễn phí |
479
+ | | Qwen | $0 | Không giới hạn | 3 mô hình miễn phí |
480
+ | | Kiro | $0 | Không giới hạn | Claude miễn phí |
481
+
482
+ **💡 Mẹo Chuyên nghiệp:** Bắt với combo Gemini CLI (180K miễn phí/tháng) + iFlow (không giới hạn miễn phí) = chi phí $0!
483
+
484
+ ---
485
+
486
+ ### 📊 Hiểu về Chi phí & Thanh toán của 9Router
487
+
488
+ **Thực tế Thanh toán 9Router:**
489
+
490
+ ✅ **Phần mềm 9Router = MIỄN PHÍ mãi mãi** (mã nguồn mở, không bao giờ thu phí)
491
+ ✅ **"Chi phí" trên bảng điều khiển = Chỉ để Hiển thị/Theo dõi** (không phải hóa đơn thực tế)
492
+ **Bạn trả tiền trực tiếp cho nhà cung cấp** (gói đăng ký hoặc phí API)
493
+ ✅ **Nhà cung cấp MIỄN PHÍ vẫn MIỄN PHÍ** (iFlow, Kiro, Qwen = $0 không giới hạn)
494
+ ❌ **9Router không bao giờ gửi hóa đơn** hoặc tính phí thẻ của bạn
495
+
496
+ **Cách Hoạt động của Hiển thị Chi phí:**
497
+
498
+ Bảng điều khiển hiển thị **chi phí ước tính** như thể bạn đang sử dụng API trả phí trực tiếp. Đây **không phải là thanh toán** - đó là công cụ so sánh để cho thấy mức tiết kiệm của bạn.
499
+
500
+ **Kịch bản Ví dụ:**
501
+ ```
502
+ Hiển thị trên Bảng điều khiển:
503
+ • Tổng số Request: 1,662
504
+ • Tổng số Token: 47M
505
+ • Chi phí Hiển thị: $290
506
+
507
+ Kiểm tra Thực tế:
508
+ • Nhà cung cấp: iFlow (MIỄN PHÍ không giới hạn)
509
+ • Thanh toán Thực tế: $0.00
510
+ • Ý nghĩa của $290: Số tiền bạn TIẾT KIỆM được bằng cách sử dụng mô hình miễn phí!
511
+ ```
512
+
513
+ **Quy tắc Thanh toán:**
514
+ - **Nhà cung cấp gói đăng ký** (Claude Code, Codex): Trả tiền trực tiếp cho họ qua website của họ
515
+ - **Nhà cung cấp giá rẻ** (GLM, MiniMax): Trả tiền trực tiếp cho họ, 9Router chỉ định tuyến
516
+ - **Nhà cung cấp MIỄN PHÍ** (iFlow, Kiro, Qwen): Thực sự miễn phí mãi mãi, không có phí ẩn
517
+ - **9**: Không bao giờ thu phí bất cứ thứ gì, ever
518
+
519
+ ---
520
+
521
+ ## 🎯 Trường hợp sử dụng
522
+
523
+ ### Trường hợp 1: "Tôi có gói đăng ký Claude Pro"
524
+
525
+ **Vấn đề:** Hạn mức hết hạn không dùng, giới hạn tốc độ khi code nặng
526
+
527
+ **Giải pháp:**
528
+ ```
529
+ Combo: "maximize-claude"
530
+ 1. cc/claude-opus-4-6 (sử dụng đầy đủ gói đăng ký)
531
+ 2. glm/glm-4.7 (backup giá rẻ khi hết hạn mức 3. if/kimi-k2-thinking (dự phòng khẩn cấp miễn phí)
532
+
533
+ Chi phí hàng tháng: $20 (gói đăng ký) + ~$5 (backup) = $25 tổng cộng
534
+ so với $20 + chạm giới hạn = sự thất vọng
535
+ ```
536
+
537
+ ### Trường hợp 2: "Tôi muốn chi phí bằng không"
538
+
539
+ **Vấn đề:** Không đủ khả năng trả gói đăng ký, cần code AI đáng tin cậy
540
+
541
+ **Giải pháp:**
542
+ ```
543
+ Combo: "free-forever"
544
+ 1. gc/gini-3-flash (180K miễn phí/tháng)
545
+ 2. if/kimi-k2-thinking (không giới hạn miễn phí)
546
+ 3. qw/qwen3-coder-plus (không giới hạn miễn phí)
547
+
548
+ Chi phí hàng tháng: $0
549
+ Chất lượng: Các mô hình sẵn sàng cho production
550
+ ```
551
+
552
+ ### Trường hợp 3: "Tôi cần code 24/7, không gián đoạn"
553
+
554
+ **Vấn đề:** Deadline, không thể để thời gian chết
555
+
556
+ **Giải pháp:**
557
+ ```
558
+ Combo: "always-on"
559
+ 1. cc/claude-opus-4-6 (chất lượng tốt nhất)
560
+ 2. cx/gpt-5.2-codex (gói đăng ký thứ hai)
561
+ 3. glm/glm-4.7 (giá rẻ, reset hàng ngày)
562
+ 4. minimax/MiniMax-M2.1 (rẻ nhất, reset 5h)
563
+ 5. if/kimi-k2-thinking (miễn phí không giới hạn)
564
+
565
+ Kết quả: 5 lớp dự phòng = thời gian chết bằng không
566
+ Chi phí tháng: $20-200 (gói đăng ký) + $10-20 (backup)
567
+ ```
568
+
569
+ ### Trường hợp 4: "Tôi muốn AI MIỄN PHÍ trong OpenClaw"
570
+
571
+ **Vấn đề:** Cần trợ lý AI trong các ứng dụng nhắn tin (WhatsApp, Telegram, Slack...), hoàn toàn miễn phí
572
+
573
+ **Giải pháp:**
574
+ ```
575
+ Combo: "openclaw-free"
576
+ 1. if/glm-4.7 (không giới hạn miễn phí)
577
+ 2. if/minimax-m2.1 (không giới hạn phí)
578
+ 3. if/kimi-k2-thinking (không giới hạn miễn phí)
579
+
580
+ Chi phí hàng tháng: $0
581
+ Truy cập qua: WhatsApp, Telegram, Slack, Discord, iMessage, Signal...
582
+ ```
583
+
584
+ ---
585
+
586
+ ## ❓ Các câu hỏi thường gặp
587
+
588
+ <details>
589
+ <summary><b>📊 Tại sao bảng điều khiển của tôi hiển thị chi phí cao?</b></summary>
590
+
591
+ Bảng điều khiển theo dõi mức sử dụng token của bạn và hiển thị **chi phí ước tính** như thể bạn đang sử dụng API trả phí trực tiếp. Đâykhông phải là thanh toán thực tế** - đó là tài liệu tham khảo để cho thấy bạn đang tiết kiệm được bao nhiêu bằng cách sử dụng các mô hình miễn phí hoặc gói đăng ký hiện có thông qua 9Router.
592
+
593
+ **Ví dụ:**
594
+ - **Bảng điều khiển hiển thị:** "Tổng chi phí $290"
595
+ - **Thực tế:** Bạn đang sử dụng iFlow (MIỄN PHÍ không giới hạn)
596
+ - **Chi phí thực tế của bạn:** **$0.00**
597
+ - **Ý nghĩa của $290:** Số bạn **tiết kiệm** được bằng cách sử dụng các mô hình miễn phí thay vì API trả phí!
598
+
599
+ Màn hình chi phí là một "trình theo dõi tiết kiệm" để giúp bạn hiểu các mẫu sử dụng và cơ hội tối ưu hóa.
600
+
601
+ </details>
602
+
603
+ <details>
604
+ <summary><b>💳 Tôi có bị 9Router tính phí không?</b></summary>
605
+
606
+ **Không.** 9Router là phần mềm miễn phí, mã nguồn mở chạy trên máy tính của chính bạn. Nó không bao giờ tính phí bạn bất cứ thứ gì.
607
+
608
+ **Bạn chỉ trả tiền:**
609
+ - ✅ **Nhà cung cấp gói đăng ký** (Claude Code $20/tháng, Codex $20-200/tháng) → Trả tiền trực tiếp cho họ trên website của họ
610
+ - ✅ **Nhà cung cấp giá rẻ** (GLM, MiniMax) → Trả tiền trực tiếp cho họ, 9Router chỉ định tuyến yêu cầu của bạn
611
+ - ❌ **Bản thân 9Router** → **Không bao giờ tính phí bất cứ thứ gì, ever**
612
+
613
+ 9Router là một proxy/router cục bộ. Nó không cóẻ tín dụng của bạn, không thể gửi hóa đơn và không có hệ thống thanh toán. Đó là phần mềm hoàn toàn miễn phí.
614
+
615
+ </details>
616
+
617
+ <details>
618
+ <summary><b>🆓 Các nhà cung cấp MIỄN PHÍ có thực sự không giới hạn không?</b></summary>
619
+
620
+ **Có!** Các nhà cung cấp được đánh dấu là MIỄN PHÍ (iFlow, Kiro, Qwen) thực sự không giới hạn với **không có phí ẩn**.
621
+
622
+ Đây là các dịch vụ miễn phí được cung cấp bởi các công ty tương ứng:
623
+ - **iFlow**: Truy cập miễn phí không giới hạn vào hơn 8 mô hình qua OAuth
624
+ - **Kiro**: Các mô hình Claude miễn phí không giới hạn qua AWS Builder ID
625
+ - **Qwen**: Truy cập miễn phí không giới hạn vào các mô hình Qwen qua xác thực thiết bị
626
+
627
+ 9Router chỉ định tuyến yêu cầu của bạn đến họ - không có "cạm bẫy" hay thanh toán trong tương lai. Đó là các dịch vụ thực sự miễn phí, và 9Router giúp chúng dễ sử dụng với hỗ trợ dự phòng.
628
+
629
+ **Lưu ý:** số nhà cung cấp gói đăng ký (Antigravity, GitHub Copilot) có thể có các khoảng thời gian dùng thử miễn phí có thể trở thành trả phí sau này, nhưng điều này sẽ được các nhà cung cấp đó thông báo rõ ràng, không phải 9Router.
630
+
631
+ </details>
632
+
633
+ <details>
634
+ <summary><b>💰 Làm thế nào để giảm thiểu chi phí AI thực tế của tôi?</b></summary>
635
+
636
+ **Chiến lược Ưu tiên Miễn phí:**
637
+
638
+ 1. **Bắt đầu với combo 100% miễn phí:**
639
+ ```
640
+ 1. gc/gemini-3-flash (180K/tháng miễn phí từ Google)
641
+ 2. if/kimi-k2-thinking (không giới hạn miễn phí từ iFlow)
642
+ 3. qw/qwen3-coder-plus (không giới hạn miễn phí từ Qwen)
643
+ ```
644
+ **Chi phí: $0/tháng**
645
+
646
+ 2. **Thêm backup giá rẻ** chỉ khi bạn cần:
647
+ ```
648
+ 4. glm/glm-4.7 ($0.6/1M token)
649
+ ```
650
+ **Chi phí bổ sung:** Chỉ trả tiền cho những gì bạn sự sử dụng
651
+
652
+ 3. **Sử dụng nhà cung cấp gói đăng ký cuối cùng:**
653
+ - Chỉ khi bạn đã có chúng
654
+ - 9Router giúp tối đa hóa giá trị của chúng thông qua theo dõi hạn mức
655
+
656
+ **Kết quả:** Hầu hết người dùng có thể hoạt động ở mức $0/tháng chỉ sử dụng các tầng miễn phí!
657
+
658
+ </details>
659
+
660
+ <details>
661
+ <summary><b>📈 Điều gì xảy ra nếu mức sử dụng của tôi đột ngột tăng vọt?</b></summary>
662
+
663
+ Cơ chế dự phòng thông minh của 9Router ngăn chặn các khoản phí bất ngờ:
664
+
665
+ **Kịch bản:** Bạn đang trong giai đoạn code nước rút và vượt qua các hạn mức
666
+
667
+ **Không có 9Router:**
668
+ - ❌ Chạm giới hạn tốc độ → Công việc dừng lại → Thất vọng
669
+ - ❌ Hoặc: Vô tình tích lũy hóa đơn API khổng lồ
670
+
671
+ **Có 9Router:**
672
+ - ✅ Gói đăng ký chạm giới hạn → Tự động dự phòng sang tầng giá rẻ
673
+ - ✅ Tầng giá rẻ trở nên đắt đỏ → Tự động dự phòng sang tầng miễn phí
674
+ - ✅ Không bao giờ ngừng code → Chi phí dự đoán được
675
+
676
+ **Bạn nắm quyền kiểm soát:** Đặt giới hạn chi tiêu cho mỗi nhà cung cấp trong bảng điều khiển, và 9Router sẽ tuân thủ chúng.
677
+
678
+ </details>
679
+
680
+ ---
681
+
682
+ ## 📖 Hướng dẫn thiết lập
683
+
684
+ <details>
685
+ <summary><b>🔐 Các nhà cung cấp Gói đăng ký (Tối đa hóa Giá trị)</b></summary>
686
+
687
+ ### Claude Code (Pro/Max)
688
+
689
+ ```bash
690
+ Bảng điều khiển → Providers → Kết nối Claude Code
691
+ → Đăng nhập OAuth → Tự động làm mới token
692
+ → Theo dõi hạn mức 5 giờ + hàng tuần
693
+
694
+ Các mô hình:
695
+ cc/claude-opus-4-6
696
+ cc/claude-sonnet-4-5-20250929
697
+ cc/claude-haiku-4-5-20251001
698
+ ```
699
+
700
+ **Mẹo Chuyên nghiệp:** Sử dụng Opus cho các tác vụ phức tạp, Sonnet cho tốc độ. 9Router theo dõi hạn mức cho mỗi mô hình!
701
+
702
+ ### OpenAI Codex (Plus/Pro)
703
+
704
+ ```bash
705
+ Bảng điều khiển → Providers → Kết nối Codex
706
+ → Đăng nhập OAuth (cổng 1455)
707
+ → Reset 5 giờ + hàng tuần
708
+
709
+ Các mô hình:
710
+ cx/gpt-5.2-codex
711
+ cx/gpt-5.1-codex-max
712
+ ```
713
+
714
+ ### Gemini CLI (MIỄN PHÍ 180K/tháng!)
715
+
716
+ ```bash
717
+ Bảng điều khiển → Providers → Kết nối Gemini CLI
718
+ → Google OAuth
719
+ → 180K hoàn thành/tháng + 1K/ngày
720
+
721
+ Các hình:
722
+ gc/gemini-3-flash-preview
723
+ gc/gemini-2.5-pro
724
+ ```
725
+
726
+ **Giá trị tốt nhất:** Tầng miễn phí khổng lồ! Sử dụng cái này trước các tầng trả phí.
727
+
728
+ ### GitHub Copilot
729
+
730
+ ```bash
731
+ Bảng điều khiển → Providers → Kết nối GitHub
732
+ → OAuth qua GitHub
733
+ → Reset hàng tháng (ngày 1 của tháng)
734
+
735
+ Các mô hình:
736
+ gh/gpt-5
737
+ gh/claude-4.5-sonnet
738
+ gh/gemini-3-pro
739
+ `
740
+
741
+ </details>
742
+
743
+ <details>
744
+ <summary><b>💰 Các nhà cung cấp Giá rẻ (Backup)</b></summary>
745
+
746
+ ### GLM-4.7 (Reset hàng ngày, $0.6/1M)
747
+
748
+ 1. Đăng ký: [Zhipu AI](https://open.bigmodel.cn/)
749
+ 2. Lấy API key từ Coding Plan
750
+ 3. Bảng điều khiển → Thêm API Key:
751
+ - Nhà cung cấp: `glm`
752
+ - API Key: `your-key`
753
+
754
+ **Sử dụng:** `glm/glm-4.7`
755
+
756
+ **Mẹo Ch nghiệp:** Coding Plan cung cấp hạn mức gấp 3 lần với chi phí 1/7! Reset hàng ngày lúc 10:00 AM.
757
+
758
+ ### MiniMax M2.1 (Reset 5h, $0.20/1M)
759
+
760
+ 1. Đăng ký: [MiniMax](https://www.minimax.io/)
761
+ 2. Lấy API key
762
+ 3. Bảng điều khiển → Thêm API Key
763
+
764
+ **Sử dụng:** `minimax/MiniMax-M2.1`
765
+
766
+ **Mẹo Chuyên nghiệp:** Lựa chọn rẻ nhất cho ngữ cảnh dài (1M)!
767
+
768
+ ### Kimi K2 ($9/tháng cố định)
769
+
770
+ 1. Đăng ký: [Moonshot AI](https://platform.moonshot.ai/)
771
+ 2. Lấy API key
772
+ 3. Bảng điều khiển → Thêm API Key
773
+
774
+ **Sử dụng:** `kimi/kimi-latest`
775
+
776
+ **Mẹo Chuyên nghiệp:** Cố định $9/tháng cho 10M token = chi phí thực tế $0.90/1M!
777
+
778
+ </details>
779
+
780
+ <details>
781
+ <summary><b>🆓 Các nhà cung cấp MIỄN PHÍ (Dự phòng Khẩn cấpb></summary>
782
+
783
+ ### iFlow (8 mô hình MIỄN PHÍ)
784
+
785
+ ```bash
786
+ Bảng điều khiển → Kết nối iFlow
787
+ → Đăng nhập OAuth iFlow
788
+ → Sử dụng không giới hạn
789
+
790
+ Các mô hình:
791
+ if/kimi-k2-thinking
792
+ if/qwen3-coder-plus
793
+ if/glm-4.7
794
+ if/minimax-m2
795
+ if/deepseek-r1
796
+ ```
797
+
798
+ ### Qwen (3 mô hình MIỄN PHÍ)
799
+
800
+ ```bash
801
+ Bảng điều khiển → Kết nối Qwen
802
+ Ủy quyền mã thiết bị
803
+ → Sử dụng không giới hạn
804
+
805
+ Các mô hình:
806
+ qw/qwen3-coder-plus
807
+ qw/qwen3-coder-flash
808
+ ```
809
+
810
+ ### Kiro (Claude MIỄN PHÍ)
811
+
812
+ ```bash
813
+ Bảng điều khiển → Kết nối Kiro
814
+ → AWS Builder ID hoặc Google/GitHub
815
+ → Sử dụng không giới hạn
816
+
817
+ Các mô hình:
818
+ kr/claude-sonnet-4.5
819
+ kr/claude-haiku-4.5
820
+ ```
821
+
822
+ </details>
823
+
824
+ <details>
825
+ <summary><b>🎨 Tạo Combo</b></summary>
826
+
827
+ ### Ví dụ 1: Tối đa hóa Gói đăng ký → Backup Giá rẻ
828
+
829
+ ```
830
+ Bảng điều khiển → Combos → Tạo Mới
831
+
832
+ Tên: premium-coding
833
+ Các mô hình:
834
+ 1. cc/claude-opus-4-6 (Gói đăng ký chính)
835
+ 2. glm/glm-4.7 (Backup giá rẻ, $0.6/1M)
836
+ 3. minimax/MiniMax-M2.1 (Dự phòng rẻ nhất, $0.20/M)
837
+
838
+ Sử dụng trong CLI: premium-coding
839
+
840
+ Ví dụ chi phí hàng tháng (100M token):
841
+ 80M qua Claude (gói đăng ký): $0 thêm
842
+ 15M qua GLM: $9
843
+ 5M qua MiniMax: $1
844
+ Tổng: $10 + gói đăng ký của bạn
845
+ ```
846
+
847
+ ### Ví dụ 2: Chỉ Miễn phí (Chi phí bằng không)
848
+
849
+ ```
850
+ Tên: free-combo
851
+ Các mô hình:
852
+ 1. gc/gemini-3-flash-preview (180K miễn phíáng)
853
+ 2. if/kimi-k2-thinking (không giới hạn)
854
+ 3. qw/qwen3-coder-plus (không giới hạn)
855
+
856
+ Chi phí: $0 mãi mãi!
857
+ ```
858
+
859
+ </details>
860
+
861
+ <details>
862
+ <summary><b>🔧 Tích hợp CLI</b></summary>
863
+
864
+ ### Cursor IDE
865
+
866
+ ```
867
+ Settings → Models → Advanced:
868
+ OpenAI API Base URL: http://localhost:20128/v1
869
+ OpenAI API Key: [từ bảng điều khiển 9router]
870
+ Model: cc/claude-opus-4-6
871
+ ``Hoặc sử dụng combo: `premium-coding`
872
+
873
+ ### Claude Code
874
+
875
+ Chỉnh sửa `~/.claude/config.json`:
876
+
877
+ ```json
878
+ {
879
+ "anthropic_api_base": "http://localhost:20128/v1",
880
+ "anthropic_api_key": "your-9router-api-key"
881
+ }
882
+ ```
883
+
884
+ ### Codex CLI
885
+
886
+ ```bash
887
+ export OPENAI_BASE_URL="http://localhost:20128"
888
+ export OPENAI_API_KEY="your-9router-api-key"
889
+
890
+ codex "prompt của bạn"
891
+ ```
892
+
893
+ ### OpenClaw
894
+
895
+ **Phương án 1 — B điều khiển (khuyên dùng):**
896
+
897
+ ```
898
+ Bảng điều khiển → CLI Tools → OpenClaw → Chọn Mô hình → Áp dụng
899
+ ```
900
+
901
+ **Phương án 2 — Thủ công:** Chỉnh sửa `~/.openclaw/openclaw.json`:
902
+
903
+ ```json
904
+ {
905
+ "agents": {
906
+ "defaults": {
907
+ "model": {
908
+ "primary": "9router/if/glm-4.7"
909
+ }
910
+ }
911
+ },
912
+ "models": {
913
+ "providers": {
914
+ "9router": {
915
+ "baseUrl": "://127.0.0.1:20128/v1",
916
+ "apiKey": "sk_9router",
917
+ "api": "openai-completions",
918
+ "models": [
919
+ {
920
+ "id": "if/glm-4.7",
921
+ "name": "glm-4.7"
922
+ }
923
+ ]
924
+ }
925
+ }
926
+ }
927
+ }
928
+ ```
929
+
930
+ > **Lưu ý:** OpenClaw chỉ hoạt động với 9Router cục bộ. Sử dụng `127.0.0.1` thay vì `localhost` để tránh các vấn đề phân giải6.
931
+
932
+ ### Cline / Continue / RooCode
933
+
934
+ ```
935
+ Provider: OpenAI Compatible
936
+ Base URL: http://localhost:20128/v1
937
+ API Key: [từ bảng điều khiển]
938
+ Model: cc/claude-opus-4-6
939
+ ```
940
+
941
+ </details>
942
+
943
+ <details>
944
+ <summary><b>🚀 Triển khai</b></summary>
945
+
946
+ ### Triển khai VPS
947
+
948
+ ```bash
949
+ # Clone và cài đặt
950
+ git clone https://github.com/decolua/9router.git
951
+ cd 9router
952
+ npm install
953
+ npm run build
954
+
955
+ # Cấu hình
956
+ export JWT="your-secure-secret-change-this"
957
+ export INITIAL_PASSWORD="your-password"
958
+ export DATA_DIR="/var/lib/9router"
959
+ export PORT="20128"
960
+ export HOSTNAME="0.0.0.0"
961
+ export NODE_ENV="production"
962
+ export NEXT_PUBLIC_BASE_URL="http://localhost:20128"
963
+ export NEXT_PUBLIC_CLOUD_URL="https://9router.com"
964
+ export API_KEY_SECRET="endpoint-proxy-api-key-secret"
965
+ export MACHINE_ID_SALT="endpoint-proxy-salt"
966
+
967
+ # Khởi động
968
+ npm run start
969
+
970
+ # Hoặc sử dụng PM2
971
+ npm install -g pm2
972
+ pm2 start --name 9router -- start
973
+ pm2 save
974
+ pm2 startup
975
+ ```
976
+
977
+ ### Docker
978
+
979
+ ```bash
980
+ # Build image (từ gốc kho lưu trữ)
981
+ docker build -t 9router .
982
+
983
+ # Chạy container (lệnh được sử dụng trong thiết lập hiện tại)
984
+ docker run -d \
985
+ --name 9router \
986
+ -p 20128:20128 \
987
+ --env-file /root/dev/9router/.env \
988
+ -v 9router-data:/app/data \
989
+ -v 9router-usage:/root/.9router \
990
+ 9router
991
+ ```
992
+
993
+ Lệnh di động (nếu bạn đã ở gốc kho lưu trữ):
994
+
995
+ ```bash
996
+ docker run -d \
997
+ --name 9router \
998
+ -p 20128:20128 \
999
+ --env-file ./.env \
1000
+ -v 9router-data:/app/data \
1001
+ -v 9router-usage:/root/.9router \
1002
+ 9router
1003
+ ```
1004
+
1005
+ Mặc định container:
1006
+ - `PORT=20128`
1007
+ - `HOSTNAME=0.0.0.0`
1008
+
1009
+ Các lệnh hữu ích:
1010
+
1011
+ ```bash
1012
+ docker logs -f 9router
1013
+ restart 9router
1014
+ docker stop 9router && docker rm 9router
1015
+ ```
1016
+
1017
+ ### Biến môi trường
1018
+
1019
+ | Biến | Mặc định | Mô tả |
1020
+ |----------|---------|-------------|
1021
+ | `JWT_SECRET` | Tự động sinh (`~/.9router/jwt-secret`) | Bí mật ký JWT cho cookie xác thực bảng điều khiển (đặt để chia sẻ giữa nhiều instance) |
1022
+ | `INITIAL_PASSWORD` | `123456` | Mật khẩu đăng nhập đầu tiên khi không có hash đã lưu tồn tại |
1023
+ | `DATA_DIR` | `~/.9router` |ị trí cơ sở dữ liệu ứng dụng chính (`db.json`) |
1024
+ | `PORT` | framework default | Cổng dịch vụ (`20128` trong các ví dụ) |
1025
+ | `HOSTNAME` | framework default | Bind host (Docker mặc định là `0.0.0.0`) |
1026
+ | `NODE_ENV` | runtime default | Đặt `production` để triển khai |
1027
+ | `BASE_URL` | `http://localhost:20128` | URL cơ sở nội bộ phía máy chủ được sử dụng bởi các tác vụ đồng bộ đám mây |
1028
+ | `CLOUD_URL` | `https://9router.com` | URL cơ sở endpoint đồng bộ đám mây phía máy chủ |
1029
+ | `NEXT_PUBLIC_BASE_URL` | `http://localhost:3000` | URL cơ sở tương thích ngược/công khai (ưu tiên `BASE_URL` cho runtime máy chủ) |
1030
+ | `NEXT_PUBLIC_CLOUD_URL` | `https://9router.com` | URL đám mây tương thích ngược/công khai (ưu tiên `CLOUD_URL` cho runtime máy chủ) |
1031
+ | `API_KEY_SECRET` | `endpoint-proxy-api-key-secret` | B mật HMAC cho các API key được tạo |
1032
+ | `MACHINE_ID_SALT` | `endpoint-proxy-salt` | Salt cho việc băm ID máy ổn định |
1033
+ | `ENABLE_REQUEST_LOGS` | `false` | Bật log request/response dưới `logs/` |
1034
+ | `AUTH_COOKIE_SECURE` | `false` | Buộc cookie xác thực `Secure` (đặt `true` phía reverse proxy HTTPS) |
1035
+ | `REQUIRE_API_KEY` | `false` | Thực thi Bearer API key trên các route `/v1/*` (khuyên dùng cho triển khai xúc internet) |
1036
+ | `HTTP_PROXY`, `HTTPS_PROXY`, `ALL_PROXY`, `NO_PROXY` | empty | Proxy gửi đi tùy chọn cho các lệnh gọi nhà cung cấp upstream |
1037
+
1038
+ Ghi chú:
1039
+ - Các biến proxy chữ thường cũng được hỗ trợ: `http_proxy`, `https_proxy`, `all_proxy`, `no_proxy`.
1040
+ - `.env` không được nướng vào image Docker (`.dockerignore`); tiêm cấu hình runtime với `--env-file` hoặc `-e`.
1041
+ - Trên Windows, `APPDATA` có thể được sử dụng cho việc phân giải đường dẫn lưuữ cục bộ.
1042
+ - `INSTANCE_NAME` xuất hiện trong các tài liệu/mẫu env cũ hơn, nhưng hiện không được sử dụng trong runtime.
1043
+
1044
+ ### Tệp Runtime và Lưu trữ
1045
+
1046
+ - Trạng thái ứng dụng chính: `${DATA_DIR}/db.json` (nhà cung cấp, combo, alias, key, cài đặt), được quản lý bởi `src/lib/localDb.js`.
1047
+ - Lịch sử sử dụng và log: `~/.9router/usage.json` và `~/.9router/log.txt`, được quản lý bởi `src/lib/usageDb.js`.
1048
+ - request/translator tùy chọn: `<repo>/logs/...` khi `ENABLE_REQUEST_LOGS=true`.
1049
+ - Lưu trữ sử dụng hiện tại tuân theo logic đường dẫn `~/.9router` và độc lập với `DATA_DIR`.
1050
+
1051
+ </details>
1052
+
1053
+ ---
1054
+
1055
+ ## 📊 Các mô hình có sẵn
1056
+
1057
+ <details>
1058
+ <summary><b>Xem tất cả các mô hình có sẵn</b></summary>
1059
+
1060
+ **Claude Code (`cc/`)** - Pro/Max:
1061
+ - `cc/claude-opus-4-6`
1062
+ - `cc/claude-sonnet-4-5-2025029`
1063
+ - `cc/claude-haiku-4-5-20251001`
1064
+
1065
+ **Codex (`cx/`)** - Plus/Pro:
1066
+ - `cx/gpt-5.2-codex`
1067
+ - `cx/gpt-5.1-codex-max`
1068
+
1069
+ **Gemini CLI (`gc/`)** - MIỄN PHÍ:
1070
+ - `gc/gemini-3-flash-preview`
1071
+ - `gc/gemini-2.5-pro`
1072
+
1073
+ **GitHub Copilot (`gh/`)**:
1074
+ - `gh/gpt-5`
1075
+ - `gh/claude-.5-sonnet`
1076
+
1077
+ **GLM (`glm/`)** - $0.6/1M:
1078
+ - `glm/glm-4.7`
1079
+
1080
+ **MiniMax (`minimax/`)** - $0.2/1M:
1081
+ - `minimax/MiniMax-M2.1`
1082
+
1083
+ **iFlow (`if/`)** - MIỄN PHÍ:
1084
+ - `if/kimi-k2-thinking`
1085
+ - `if/qwen3-coder-plus`
1086
+ - `if/deepseek-r1`
1087
+
1088
+ **Qwen (`qw/`)** - MIỄN PHÍ:
1089
+ - `qw/q3-coder-plus`
1090
+ - `qw/qwen3-coder-flash`
1091
+
1092
+ **Kiro (`kr/`)** - MIỄN PHÍ:
1093
+ - `kr/claude-sonnet-4.5`
1094
+ - `kr/claude-haiku-4.5`
1095
+
1096
+ </details>
1097
+
1098
+ ---
1099
+
1100
+ ## 🐛 Khắc phục sự cố
1101
+
1102
+ **"Language model did not provide messages"**
1103
+ - Hết hạn mức nhà cung cấp → Kiểm tra trình theo dõi hạn mức bảng điều khiển
1104
+ - Giải pháp: Sử dụng dự phòng combo hoặc chuyển sang tầng rẻ hơn
1105
+
1106
+ **Gi hạn tốc độ (Rate limiting)**
1107
+ - Hết hạn mức gói đăng ký → Dự phòng sang GLM/MiniMax
1108
+ - Thêm combo: `cc/claude-opus-4-6 → glm/glm-4.7 → if/kimi-k2-thinking`
1109
+
1110
+ **Token OAuth hết hạn**
1111
+ - Tự động làm mới bởi 9Router
1112
+ - Nếu sự cố vẫn tiếp diễn: Bảng điều khiển → Nhà cung cấp → Kết nối lại
1113
+
1114
+ **Chi phí cao**
1115
+ - Kiểm tra thống kê sử dụng trong Bảng điều khiển
1116
+ - Chuyển mô hình chính sang GLM/MiniMax
1117
+ - Sử dụng tầng miễn phí (Gemini CLI, iFlow) cho các tác vụ không quan trọng
1118
+
1119
+ **Bảng điều khiển mở sai cổng**
1120
+ - Đặt `PORT=20128` và `NEXT_PUBLIC_BASE_URL=http://localhost:20128`
1121
+
1122
+ **Lỗi đồng bộ đám mây**
1123
+ - Xác minh `BASE_URL` trỏ đến phiên bản đang chạy của bạn (ví dụ: `http://localhost:20128`)
1124
+ - Xác minh `CLOUD_URL` trỏ đến endpoint đám mây dự kiến của bạn (ví dụ: `https://9router.com`)
1125
+ - Giữ các giá trị `NEXT_PUBLIC_*` phù hợp với giá trị phía máy chủ khi có thể.
1126
+
1127
+ **Endpoint đám mây `stream=false` trả về 500 (`Unexpected token 'd'...`)**
1128
+ - Triệu chứng thường xuất hiện trên endpoint đám mây công khai (`https://9router.com/v1`) cho các lệnh gọi không phát trực tiếp (non-streaming).
1129
+ - Nguyên nhân gốc rễ: upstream trả về payload SSE (`data: ...`) trong khi client mong đợi JSON.
1130
+ -ải pháp thay thế: sử dụng `stream=true` cho các lệnh gọi trực tiếp đến đám mây.
1131
+ - Runtime 9Router cục bộ bao gồm dự phòng SSE→JSON cho các lệnh gọi không phát trực tiếp khi upstream trả về `text/event-stream`.
1132
+
1133
+ **Đám mây báo đã kết nối, nhưng yêu cầu vẫn thất bại với `Invalid API key`**
1134
+ - Tạo một key mới từ bảng điều khiển cục bộ (`/api/keys`) và chạy đồng bộ đám mây (`Enable Cloud` sau đó `Sync Now`).
1135
+ - Các key cũ/chưa đồng bộ vẫn có thể trả về `401` trên đám mây ngay cả khi endpoint cục bộ hoạt động.
1136
+
1137
+ **Đăng nhập lần đầu không hoạt động**
1138
+ - Kiểm tra `INITIAL_PASSWORD` trong `.env`
1139
+ - Nếu chưa đặt, mật khẩu dự phòng là `123456`
1140
+
1141
+ **Không có log request dưới `logs/`**
1142
+ - Đặt `ENABLE_REQUEST_LOGS=true`
1143
+
1144
+ ---
1145
+
1146
+ ## 🛠️ Tech Stack
1147
+
1148
+ - **Runtime**: Node.js 20+
1149
+ - **Framework**: Next.js 16
1150
+ - **UI**: React 19 + Tailwind 4
1151
+ - **Database**: LowDB (dựa trên tệp JSON)
1152
+ - **Streaming**: Server-Sent Events (SSE)
1153
+ - **Auth**: OAuth 2.0 (PKCE) + JWT + API Keys
1154
+
1155
+ ---
1156
+
1157
+ ## 📝 Tài liệu tham khảo API
1158
+
1159
+ ### Chat Completions
1160
+
1161
+ ```bash
1162
+ POST http://localhost:20128/v1/chat/completions
1163
+ Authorization: Bearer your-api-key
1164
+ Content-Type: application/json
1165
+
1166
+ {
1167
+ "model": "cc/claude-opus-4-6",
1168
+ "messages": [
1169
+ {"role":user", "content": "Viết một hàm để..."}
1170
+ ],
1171
+ "stream": true
1172
+ }
1173
+ ```
1174
+
1175
+ ### Liệt kê Mô hình
1176
+
1177
+ ```bash
1178
+ GET http://localhost:20128/v1/models
1179
+ Authorization: Bearer your-api-key
1180
+
1181
+ → Trả về tất cả các mô hình + combo ở định dạng OpenAI
1182
+ ```
1183
+
1184
+ ### Các Endpoint Tương thích
1185
+
1186
+ - `POST /v1/chat/completions`
1187
+ - `POST /v1/messages`
1188
+ - `POST /v1/responses`
1189
+ - `GET /v1/models`
1190
+ - `POST /v1/messages/count_tokens`
1191
+ - `GET /v1beta/models`
1192
+ - `POST /v1beta/models/{...path}` (Gemini-style `generateContent`)
1193
+ - `POST /v1/api/chat` (đường dẫn chuyển đổi kiểu Ollama)
1194
+
1195
+ ### Kịch bản Xác thực Đám mây
1196
+
1197
+ Đã thêm các kịch bản kiểm tra dưới `tester/security/`:
1198
+
1199
+ - `tester/security/test-docker-hardening.sh`
1200
+ - Build image Docker và xác thực các kiểm tra hardening (`/api/cloud/auth` auth guard, `REQUIRE_API_KEY`, hành vi cookie xác thực bảo).
1201
+ - `tester/security/test-cloud-openai-compatible.sh`
1202
+ - Gửi một yêu cầu tương thích OpenAI trực tiếp đến endpoint đám mây (`https://9router.com/v1/chat/completions`) với mô hình/key được cung cấp.
1203
+ - `tester/security/test-cloud-sync-and-call.sh`
1204
+ - Quy trình end-to-end: tạo key cục bộ -> bật/đồng bộ đám mây -> gọi endpoint đám mây với thử lại.
1205
+ - Bao gồm kiểm tra dự phòng với `stream=true` để phân biệt lỗi xác thực với các vấn đề phân tích phát trực tiếp.
1206
+
1207
+ Ghi chú bảo mật cho các kịch bản kiểm tra đám mây:
1208
+
1209
+ - Không bao giờ hardcode các API key thực trong kịch bản/commit.
1210
+ - Chỉ cung cấp key qua các biến môi trường:
1211
+ - `API_KEY`, `CLOUD_API_KEY`, hoặc `OPENAI_API_KEY` (được hỗ trợ bởi `test-cloud-openai-compatible.sh`)
1212
+ - Ví dụ:
1213
+
1214
+ ```bash
1215
+ OPENAI_API_KEY="your-cloud-key" bash tester/security/test-cloud-openai-compatible.sh
1216
+ ```
1217
+
1218
+ Hành vi dự kiến từ việc xác thực gần đây:
1219
+
1220
+ - cục bộ (`http://127.0.0.1:20128/v1/chat/completions`): hoạt động với `stream=false` và `stream=true`.
1221
+ - Runtime Docker (cùng đường dẫn API được expose bởi container): các kiểm tra hardening đạt, cloud auth guard hoạt động, chế độ API key nghiêm ngặt hoạt động khi được bật.
1222
+ - Endpoint đám mây công khai (`https://9router.com/v1/chat/completions`):
1223
+ - `stream=true`: dự kiến thành công (trả về các khối SSE).
1224
+ - `stream=false`: có thể thất bại với `500` + lỗi phân tích (`Unexpected token 'd'`) khi upstream trả về nội dung SSE cho đường dẫn client không phát trực tiếp.
1225
+
1226
+ ### API Quản lý và Bảng điều khiển
1227
+
1228
+ - Xác thực/cài đặt: `/api/auth/login`, `/api/auth/logout`, `/api/settings`, `/api/settings/require-login`
1229
+ - Quản lý nhà cung cấp: `/api/providers`, `/api/providers/[id]`, `/api/providers/[id]/test`, `/api/providers/[id]/models`, `/api/providers/validate`, `/api/provider-n*`
1230
+ - Luồng OAuth: `/api/oauth/[provider]/[action]` (+ các import cụ thể theo nhà cung cấp như Cursor/Kiro)
1231
+ - Cấu hình định tuyến: `/api/models/alias`, `/api/combos*`, `/api/keys*`, `/api/pricing`
1232
+ - Sử dụng/log: `/api/usage/history`, `/api/usage/logs`, `/api/usage/request-logs`, `/api/usage/[connectionId]`
1233
+ - Đồng bộ đám mây: `/api/sync/cloud`, `/api/sync/initialize`, `/api/cloud/*`
1234
+ -ợ giúp CLI: `/api/cli-tools/claude-settings`, `/api/cli-tools/codex-settings`, `/api/cli-tools/droid-settings`, `/api/cli-tools/openclaw-settings`
1235
+
1236
+ ### Hành vi Xác thực
1237
+
1238
+ - Các route Bảng điều khiển (`/dashboard/*`) sử dụng bảo vệ cookie `auth_token`.
1239
+ - Đăng nhập sử dụng hash mật khẩu đã lưu khi có mặt; nếu không, nó dự phòng vào `INITIAL_PASSWORD`.
1240
+ - `requireLogin` có thể được chuyển đổi qua `/api/settings/require-login`.
1241
+
1242
+ ### Xử lý Yêu cầu (C cao)
1243
+
1244
+ 1. Client gửi yêu cầu đến `/v1/*`.
1245
+ 2. Trình xử lý route gọi `handleChat` (`src/sse/handlers/chat.js`).
1246
+ 3. Mô hình được giải quyết (nhà cung cấp/mô hình trực tiếp hoặc giải quyết alias/combo).
1247
+ 4. Thông tin xác thực được chọn từ DB cục bộ với bộ lọc khả dụng tài khoản.
1248
+ 5. `handleChatCore` (`open-sse/handlers/chatCore.js`) phát hiện định dạng và dịch chuyển yêu cầu.
1249
+ 6. Trình thực thi nhà cung cấp gửi cầu upstream.
1250
+ 7. Luồng được dịch chuyển lại thành định dạng client khi cần.
1251
+ 8. Sử dụng/log được ghi lại (`src/lib/usageDb.js`).
1252
+ 9. Dự phòng áp dụng trên lỗi nhà cung cấp/tài khoản/mô hình theo quy tắc combo.
1253
+
1254
+ Tài liệu tham khảo kiến trúc đầy đủ: [`docs/ARCHITECTURE.md`](../docs/ARCHITECTURE.md)
1255
+
1256
+ ---
1257
+
1258
+ ## 📧 Hỗ trợ
1259
+
1260
+ - **Website**: [9router.com](https://9router.com)
1261
+ - **GitHub**: [github.com/decolua/9](https://github.com/decolua/9router)
1262
+ - **Issues**: [github.com/decolua/9router/issues](https://github.com/decolua/9router/issues)
1263
+
1264
+ ---
1265
+
1266
+ ## 👥 Người đóng góp
1267
+
1268
+ Cảm ơn tất cả những người đã đóng góp giúp 9Router tốt hơn!
1269
+
1270
+ [![Contributors](https://contrib.rocks/image?repo=decolua/9router&max=100&columns=20&anon=1)](https://github.com/decolua/9router/graphs/contributors)
1271
+
1272
+ ---
1273
+
1274
+ ## 📊 Star Chart
1275
+
1276
+ [![ Chart](https://starchart.cc/decolua/9router.svg?variant=adaptive)](https://starchart.cc/decolua/9router)
1277
+
1278
+ ### Cách Đóng góp
1279
+
1280
+ 1. Fork kho lưu trữ
1281
+ 2. Tạo nhánh tính năng của bạn (`git checkout -b feature/amazing-feature`)
1282
+ 3. Commit các thay đổi của bạn (`git commit -m 'Add amazing feature'`)
1283
+ 4. Push lên nhánh (`git push origin feature/amazing-feature`)
1284
+ 5. Mở một Pull Request
1285
+
1286
+ Xem [Pull Requests](https://github.com/decolua/9router/pulls) để biết hướng dẫn chi tiết.
1287
+
1288
+ ---
1289
+
1290
+ ## 🔀 Forks
1291
+
1292
+ **[OmniRoute](https://github.com/diegosouzapw/OmniRoute)** — Một fork TypeScript đầy đủ tính năng của 9Router. Thêm 36+ nhà cung cấp, tự động dự phòng 4 tầng, API đa phương thức (hình ảnh, embedding, âm thanh, TTS), circuit breaker, bộ nhớ đệm ngữ nghĩa, đánh giá LLM và bảng điều khiển được tinh chỉnh. 368+ bài kiểm tra đơn vị. Có sẵn qua npm và.
1293
+
1294
+ ---
1295
+
1296
+ ## 🙏 Lời cảm ơn
1297
+
1298
+ Cảm ơn đặc biệt đến **CLIProxyAPI** - bản triển khai Go gốc đã truyền cảm hứng cho bản chuyển đổi JavaScript này.
1299
+
1300
+ ---
1301
+
1302
+ ## 📄 Giấy phép
1303
+
1304
+ Giấy phép MIT - xem [LICENSE](../LICENSE) để biết chi tiết.
1305
+
1306
+ ---
1307
+
1308
+ <div align="center">
1309
+ <sub>Được xây dựng với ❤️ cho các nhà phát triển code 24/7</sub>
1310
+ </div>