9Router 安装与使用:把 Claude Code、Codex、Cursor 统一挂到一个本地路由上

2 查看9RouterClaude CodeAI编程模型路由OpenAI兼容

9Router 是跑在本机的 AI 编程路由器,把订阅、低价 API 和免费额度收进一个 OpenAI 兼容入口。本文记录 npm 一条命令装起来之后的完整过程:默认密码 123456 该怎么处理、Providers 和 CLI Tools 两页各管什么、Docker 与 DATA_DIR 怎么配,以及哪些功能不建议碰。

如果你同时开着 Claude Code、Codex CLI 和 Cursor,大概率遇到过同一件事:这个工具的额度还剩一半,那个已经限速到没法用,而你手上明明还有别的账号和几张便宜的 API Key,只是懒得每次改配置。9Router 想解决的就是这个——在本机起一个 OpenAI 兼容的入口,所有 CLI 工具都指向它,由它决定这次请求走哪个上游。

先把定位说清楚,免得期待错位:9Router 是个人机器上的路由器,不是团队网关。它没有多用户、没有计费分账,数据存在本地一个 SQLite 文件里。要给一个团队分发访问权限、按人头算账,那是 Sub2APILiteLLM 的活。

本文的操作在一台 Apple Silicon macOS 上跑过一遍,版本是 npm 上的 9router CLI 0.5.65。项目仓库 decolua/9router 用 MIT 协议开源,主体是 Next.js 写的,核对时约 2.7 万 star。

它到底怎么路由

http://127.0.0.1:20128/v1 配额耗尽 超出预算 Claude Code / Codex / Cursor / Cline 9Router 第 1 层:订阅账号Claude Code、Codex、Copilot 第 2 层:低价 APIGLM、MiniMax、DeepSeek… 第 3 层:免费额度OpenCode Free、Kiro、Vertex 试用 格式转换 OpenAI ↔ Claude ↔ GeminiOAuth token 自动刷新 · 配额倒计时

图 1:官方称之为「智能三层切换」——先用完已经付过钱的订阅,再落到低价 API,最后才是免费额度。三层都要你自己先把账号连上,它不凭空变出额度。

除了路由,9Router 还做两件对日常使用影响更大的事。一是格式转换:CLI 工具说 OpenAI 方言,上游可能只认 Claude 或 Gemini 格式,转换在网关里完成,所以一个工具能接原本不支持的模型。二是 token 压缩(项目里叫 RTK):git diffgrepls 这类工具输出经常占掉三成以上的上下文预算,压缩后再发给模型。官方给的数字是省 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 initial

better-sqlite3 是原生模块,装不上时会退回 Node 自带的 node:sqlite,功能不受影响。所有数据——账号凭据、API Key、用量记录——都在 ~/.9router/ 这一个目录里,想换位置就设 DATA_DIR 环境变量,想备份直接打包这个目录。

默认密码是 123456,这不是玩笑

第一次打开 http://127.0.0.1:20128,会跳到登录页:

9Router 登录页,页面中央是密码输入框和 Login 按钮,下方用小字写着 Default password is 123456,再下面是一行橙色警告文字提示未设置密码存在安全风险

9Router 登录页,页面中央是密码输入框和 Login 按钮,下方用小字写着 Default password is 123456,再下面是一行橙色警告文字提示未设置密码存在安全风险

图 2:全新安装的登录页。默认密码 123456 直接印在页面上,下面那行橙色小字自己也承认这是安全风险。

界面上那行提示写的是「远程登录时会要求你设置密码」——意思是本机访问不会强制你改。 而默认监听 0.0.0.0,同一个 Wi-Fi 下的任何人访问你的 20128 端口,输 123456 就能进后台,看到你所有已连账号的凭据和 API Key。

所以顺序应该是:先用 --host 127.0.0.1 起服务,登录后第一件事去 Settings 改密码,之后再考虑要不要放开监听。也可以在启动前用 INITIAL_PASSWORD 环境变量直接指定初始密码,跳过默认值这一步。

后台四页,各管什么

Endpoint & Key:下游要填的地址在这里

9Router 后台 Endpoint 页面,上方 API Endpoint 区块显示本地地址 http://127.0.0.1:20128/v1,旁边是 Tunnel 与 Tailscale 的 Enable 按钮和一条要求先改默认密码的警告,下方 API Keys 区块有 Require API key 开关和一把默认 Key

9Router 后台 Endpoint 页面,上方 API Endpoint 区块显示本地地址 http://127.0.0.1:20128/v1,旁边是 Tunnel 与 Tailscale 的 Enable 按钮和一条要求先改默认密码的警告,下方 API Keys 区块有 Require API key 开关和一把默认 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:连账号的地方

9Router 后台 Providers 页面,分为 Custom Providers、OAuth Providers、Free Tier Providers 三组,OAuth 组里排列着 Claude Code、Antigravity、OpenAI Codex、Qoder、GitHub Copilot、Cursor IDE 等卡片,多数显示 No connections

9Router 后台 Providers 页面,分为 Custom Providers、OAuth Providers、Free Tier Providers 三组,OAuth 组里排列着 Claude Code、Antigravity、OpenAI Codex、Qoder、GitHub Copilot、Cursor IDE 等卡片,多数显示 No connections

图 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:帮你改配置文件

9Router 后台 CLI Tools 页面,网格排列着 Claude Code、Open Claw、OpenAI Codex CLI/App、OpenCode、Cursor、Cline、Continue、Qwen Code 等工具卡片,各自标注 Connected、Not configured 或 Not installed,页面底部有一个 MITM Tools 分组

9Router 后台 CLI Tools 页面,网格排列着 Claude Code、Open Claw、OpenAI Codex CLI/App、OpenCode、Cursor、Cline、Continue、Qwen Code 等工具卡片,各自标注 Connected、Not configured 或 Not installed,页面底部有一个 MITM 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 别名就解决了,真的不需要装东西。

参考来源与核对方式

界面截图、启动日志和 /v1/models 的统计,来自 2026-09-04 在本机全新安装的那一次。版本号、provider 名单、模型数量和界面布局都是易变信息,尤其是免费额度那一层,供应商随时可能下线或改条款;文中所有涉及配额和价格的说法都请以你安装当天的界面为准。