如果你同时开着 Claude Code、Codex CLI 和 Cursor,大概率遇到过同一件事:这个工具的额度还剩一半,那个已经限速到没法用,而你手上明明还有别的账号和几张便宜的 API Key,只是懒得每次改配置。9Router 想解决的就是这个——在本机起一个 OpenAI 兼容的入口,所有 CLI 工具都指向它,由它决定这次请求走哪个上游。
先把定位说清楚,免得期待错位:9Router 是个人机器上的路由器,不是团队网关。它没有多用户、没有计费分账,数据存在本地一个 SQLite 文件里。要给一个团队分发访问权限、按人头算账,那是 Sub2API 或 LiteLLM 的活。
本文的操作在一台 Apple Silicon macOS 上跑过一遍,版本是 npm 上的 9router CLI 0.5.65。项目仓库 decolua/9router 用 MIT 协议开源,主体是 Next.js 写的,核对时约 2.7 万 star。
它到底怎么路由
图 1:官方称之为「智能三层切换」——先用完已经付过钱的订阅,再落到低价 API,最后才是免费额度。三层都要你自己先把账号连上,它不凭空变出额度。
除了路由,9Router 还做两件对日常使用影响更大的事。一是格式转换:CLI 工具说 OpenAI 方言,上游可能只认 Claude 或 Gemini 格式,转换在网关里完成,所以一个工具能接原本不支持的模型。二是 token 压缩(项目里叫 RTK):git diff、grep、ls 这类工具输出经常占掉三成以上的上下文预算,压缩后再发给模型。官方给的数字是省 20–40% 输入 token,这属于厂商口径,实际效果取决于你的工具调用有多密集。
安装:一条命令,外加一个立刻要改的东西
npm install -g 9router
9router需要 Node.js 18 以上。装完直接敲 9router 就会起服务并自动打开浏览器。几个常用参数:
9router --help
-p, --port <port> 端口,默认 20128
-H, --host <host> 监听地址,默认 0.0.0.0
-n, --no-browser 不自动开浏览器
-l, --log 打印服务端日志(默认隐藏)
-t, --tray 托盘后台模式
--skip-update 跳过自动更新检查`-H` 的默认值是 `0.0.0.0`,第一次跑建议显式改掉:
9router --port 20128 --host 127.0.0.1 --no-browser --log原因下面就说。启动日志里能看到它的存储实现,这个信息在排障时有用:
🚀 9router v0.5.65
Server: http://127.0.0.1:20128
[DB] better-sqlite3 unavailable: Cannot find module 'better-sqlite3'
[DB] Driver: node:sqlite | file: ~/.9router/db/data.sqlite
[DB][migrate] applied #1 initialbetter-sqlite3 是原生模块,装不上时会退回 Node 自带的 node:sqlite,功能不受影响。所有数据——账号凭据、API Key、用量记录——都在 ~/.9router/ 这一个目录里,想换位置就设 DATA_DIR 环境变量,想备份直接打包这个目录。
默认密码是 123456,这不是玩笑
第一次打开 http://127.0.0.1:20128,会跳到登录页:
图 2:全新安装的登录页。默认密码 123456 直接印在页面上,下面那行橙色小字自己也承认这是安全风险。
界面上那行提示写的是「远程登录时会要求你设置密码」——意思是本机访问不会强制你改。 而默认监听 0.0.0.0,同一个 Wi-Fi 下的任何人访问你的 20128 端口,输 123456 就能进后台,看到你所有已连账号的凭据和 API Key。
所以顺序应该是:先用 --host 127.0.0.1 起服务,登录后第一件事去 Settings 改密码,之后再考虑要不要放开监听。也可以在启动前用 INITIAL_PASSWORD 环境变量直接指定初始密码,跳过默认值这一步。
后台四页,各管什么
Endpoint & Key:下游要填的地址在这里
图 3:Endpoint & Key 页。左边那条 http://127.0.0.1:20128/v1 就是所有 CLI 工具要填的 Base URL;下面的 Default Key 是网关自己签发的,和上游账号无关。
两个开关值得注意。Require API key 打开后,没带有效 Key 的请求会被拒——只在本机自己用可以关掉,一旦通过 Tunnel 或 Tailscale 暴露出去就必须开。而 Tunnel 那一行旁边挂着的警告很实在:「激活 tunnel 前请先改掉默认后台密码」。把一个默认密码 123456 的后台通过公网隧道暴露出去,等于把所有账号凭据挂在外网。
装完还没连任何 provider 的时候,模型列表就已经不是空的:
curl -s http://127.0.0.1:20128/v1/models我这边数出来 624 个模型、70 个提供商前缀。这些是它内置的目录(模型名前缀就是提供商,比如 cc/ 是 Claude Code、cx/ 是 Codex、gh/ 是 GitHub Copilot、kr/ 是 Kiro),能不能真的调通取决于你连了哪些账号。
Providers:连账号的地方
图 4:Providers 页分三组。OAuth 组走浏览器授权,Free Tier 组多数不用注册,最下面还有四十来个填 API Key 的常规厂商。
三组的差别是接入方式:
- OAuth Providers:Claude Code、OpenAI Codex、GitHub Copilot、Cursor IDE 这类,点进去走一次浏览器授权,之后 token 自动刷新,不用手动重新登录。这一组接的是你自己已经付费的订阅。
- Free Tier Providers:OpenCode Free、Kiro AI、Gemini CLI、Vertex AI 试用额度等,有的连注册都不需要。
- API Key Providers:Anthropic、DeepSeek、Azure OpenAI、Groq、GLM、百度千帆之类,四十多家,填 Key 就能用。
最上面还有一栏 Custom Providers,可以手动添加任意 OpenAI 兼容或 Anthropic 兼容的端点。如果你已经有一个自建网关(比如上一节说的 LiteLLM),从这里接进来就行。
CLI Tools:帮你改配置文件
图 5:CLI Tools 页会扫描本机装了哪些工具,并显示是否已经指向 9Router。点进去可以让它直接改写对应的配置文件。
这页省事的地方在于不用自己找配置文件在哪。当然手动配也不难,几个常见工具的写法:
# Codex CLI
export OPENAI_BASE_URL="http://127.0.0.1:20128"
export OPENAI_API_KEY="你的-9router-key"// Cline / Continue / RooCode 之类:选 OpenAI Compatible,填
// Base URL: http://127.0.0.1:20128/v1
// API Key: 从 Endpoint & Key 页复制
// Model: cc/claude-opus-4-7 这类带前缀的名字,或者你建的组合名一个反复有人踩的坑:地址写 `127.0.0.1` 而不是 `localhost`。 部分工具在 macOS 上会把 localhost 解析到 IPv6 的 ::1,而服务只监听了 IPv4,表现就是「明明服务在跑却连不上」。
页面最下面还有一组 MITM Tools(Antigravity、GitHub Copilot、Kiro)。这类接入方式是在本机做中间人代理来拦截 IDE 的流量,需要信任一张本地证书。技术上可行,但它改变的是你整台机器的信任链,而且这些 IDE 的服务条款多半不欢迎这种做法——除非你清楚自己在做什么,否则这一组建议直接跳过,前面三类接入方式已经够用。
Combo:把降级链写成一个模型名
Combo & Vision Adapter 那页可以把多个模型编成一条有序链,然后当成一个模型名给下游用:
组合名:my-coding-stack
1. cc/claude-opus-4-6 (自己的订阅,优先用完)
2. glm/glm-4.7 (低价备份)
3. if/kimi-k2-thinking (免费兜底)下游只填 my-coding-stack,配额耗尽或报错时按顺序往下切。Quota Tracker 页会显示每个上游的剩余额度和重置倒计时(5 小时 / 每日 / 每周),这是整个产品里我觉得最实用的一页——它至少让你知道订阅里那些没用完就作废的额度还剩多少。
Docker 部署
想放在 NAS 或小服务器上常驻,官方镜像是 decolua/9router,支持 amd64 和 arm64:
docker run -d \
-p 127.0.0.1:20128:20128 \
-v "$HOME/.9router:/app/data" \
-e DATA_DIR=/app/data \
-e INITIAL_PASSWORD='换成你自己的强密码' \
--name 9router \
decolua/9router:latest`DATA_DIR=/app/data` 不能省,不然容器内的数据会落在别处,挂载点等于白挂,容器一删数据就没了。端口映射我加了 127.0.0.1: 前缀,理由和前面一样。升级就是 docker pull 之后重建容器,数据在挂载卷里不受影响。
需要走代理访问上游的话,HTTP_PROXY / HTTPS_PROXY / ALL_PROXY / NO_PROXY 都支持,大小写两种写法都认。
合规和风险:这一节请认真读
9Router 的仓库描述写着 "Unlimited FREE AI coding"、"never hit limits"。这类措辞很有煽动性,但把它当成实际承诺去用,风险是你在承担:
- 免费额度不是无限的。 第三层那些免费 provider 各有各的配额和条款,靠批量注册账号轮换来「不限量」,命中的是各家的滥用条款,后果是封号。
- 订阅账号的用途有边界。 把自己的 Claude Pro 或 Copilot 订阅接进本机路由自用,和把它变成多人共享的接口,是两件事。后者在多数厂商的协议里都不被允许。
- 同名仓库很多。 搜索结果里有一堆 fork,名字几乎一样。这类「白嫖模型」项目是投毒的高发区——你把 OAuth 凭据交给它,被换掉几行代码就能上传到别处。只从 [decolua/9router](https://github.com/decolua/9router) 或 npm 上的官方 `9router` 包安装,装之前顺手对一下发布者。
- 凭据全在本机明文可达。
~/.9router/db/data.sqlite里存着你所有连过的账号 token。这台机器的安全等级,等于你所有 AI 账号的安全等级。
一句话:把它当成"管好自己已有的几个账号"的工具,是合理的;当成"绕过限制"的工具,代价迟早会来。
谁适合用,谁可以跳过
适合:手上有两个以上 AI 编程订阅或 API Key、经常在 Claude Code / Codex / Cursor 之间来回切、想知道每个订阅还剩多少额度的个人开发者。配额可视化和一键切换这两件事,它做得比手动改环境变量顺手。
可以跳过:只用一个订阅、一个工具的人——多这一层只是多一个出问题的地方;需要给团队分发账号和算账的,看 Sub2API;需要写复杂路由策略、按团队做预算的,看 LiteLLM。
要有心理准备的:项目迭代极快,CHANGELOG 一天能写好几条,界面和菜单结构变动频繁——本文的截图对应 0.5.65,你装到的版本很可能已经不一样了。另外仓库里那个 9router-app 包是私有的,所以社区能做的代码审计是有限的,这一点在决定要不要把订阅凭据交给它之前值得掂量。
替代方案
- [LiteLLM](/articles/litellm-gateway-deployment-guide):配置即代码,路由策略和预算控制表达力更强,但没有 OAuth 连订阅这一套,也没有本机 CLI 工具的自动配置。
- [OpenRouter](/tools/openrouter):托管服务,一个 Key 调上百个模型,不用自己维护,代价是所有请求经过第三方。
- 手动切换环境变量:只有两个上游、切换频率不高的话,写两个 shell 别名就解决了,真的不需要装东西。
参考来源与核对方式
- decolua/9router 项目仓库 —— 功能说明、支持的 provider 列表、许可证与 star 数。
- 仓库 DOCKER.md —— 镜像名、端口、
DATA_DIR与数据目录结构。 - npm · 9router —— CLI 版本号与 Node 版本要求。
界面截图、启动日志和 /v1/models 的统计,来自 2026-09-04 在本机全新安装的那一次。版本号、provider 名单、模型数量和界面布局都是易变信息,尤其是免费额度那一层,供应商随时可能下线或改条款;文中所有涉及配额和价格的说法都请以你安装当天的界面为准。