用 cc-router 接入 Codex CLI 与 Codex Desktop:一个 Token 调度多家模型订阅

Codex CLI 和 Codex Desktop 默认走 OpenAI 官方账号,但我手里同时有 Claude、DeepSeek、Kimi、GLM 这些订阅,想在 Codex 客户端里直接选用它们 —— 一家一家配 base URL 和 API key 又烦又乱。把 cc-router 当本地代理,再用 cc-switch 作为 Codex 的多供应商切换器,就能把所有上游订阅聚合成三个虚拟槽位(opus/sonnet/haiku),在 Codex 里用一个 token 调度全部。整条链路六步就能跑通,本文按截图一步步走。

项目地址: GitHub - finch-xu/cc-router下载客户端官方 Codex 集成文档

cc-switch: Codex 客户端的多供应商切换器,安装入口见上方官方 Codex 集成文档页

工作架构

1
2
3
4
5
6
7
Codex CLI / Codex Desktop      cc-switch              cc-router (本地)             上游 Provider
┌──────────────────────┐ ┌──────────────┐ ┌──────────────────┐ ┌────────────┐
│ 发起对话 │───▶│ 供应商切换 │──────▶│ :23456 网关 │────────▶│ Claude │
│ 选择虚拟模型 │ │ (cc-router/ │ │ + 虚拟模型路由 │ │ DeepSeek │
│ │ │ OpenAI/...) │ │ + 请求日志 │ │ Kimi / GLM │
└──────────────────────┘ └──────────────┘ └──────────────────┘ │ ... │
└────────────┘

这条链路里两层职责分得很清:

  • cc-switch 负责”我现在让 Codex 走哪个供应商” —— 在 OpenAI 官方账号、cc-router、其他自定义 OpenAI 兼容端点之间一键切换,配置写入 ~/.codex/config.toml
  • cc-router 负责”我这条请求最终落到哪家上游” —— 接受 Codex 通过 cc-switch 转过来的 HTTP 请求,按虚拟模型槽位(opus/sonnet/haiku)路由到具体厂商,并处理限流降级

也就是说:在 cc-switch 这一步告诉 Codex “请求发到 cc-router 的本地端口”,在 cc-router 这一步告诉它”opus 槽位用 DeepSeek、sonnet 槽位用 Kimi”,二者合在一起就把整个调度链拉通了。

前置准备

  • cc-router 已安装并至少绑定一个虚拟模型(opus / sonnet / haiku 任选其一)。还没装的看 入门文档 或本博客 cc-router 系列前几篇
  • cc-switch 已安装。下载入口见 官方 Codex 集成文档
  • Codex CLI 或 Codex Desktop 至少装好一个,二者配置共享同一份 ~/.codex/config.toml
  • 从 cc-router 设置页提前复制好 API Key(后面要粘进 cc-switch)

步骤一:打开 cc-switch,切到 Codex 供应商

cc-switch 同时管 Claude 和 Codex 两套供应商,第一步先把界面切到 Codex 那一侧。点顶部工具栏的 Codex 图标(GPT 标志),下方面板会切换到当前已配置的 Codex 供应商列表 —— 一般这里会有 OpenAI 官方账号(如果之前登录过)。

打开 cc-switch 并切到 Codex 供应商


步骤二:新增一个自定义 Codex 供应商

cc-router 不在 cc-switch 内置厂商列表里,需要走”自定义配置”入口手动添加。

点右上角的 橙色 + 号 按钮 → 保持在「Codex 供应商」标签页 → 选左上角第一个蓝色 tile 「自定义配置」

新增自定义 Codex 供应商


步骤三:填写 cc-router 的接口信息

这一步是全文最关键的一步,填错任何一项都会导致后面 Codex 报 404 或 401。

字段
供应商名称 cc-router(可任意命名,建议保持识别度)
API Key 从 cc-router → 设置页复制的 token
API 请求地址 http://127.0.0.1:23456/v1(本机) 或 http://<内网IP>:23456/v1(局域网)
模型名称 gpt-5.5gpt-5.4gpt-5.4-mini 任选一个先填进去,后面还能切

API 请求地址末尾必须带 /v1 cc-switch 默认按相对路径在末尾拼接 /responses,如果你填成 http://127.0.0.1:23456(缺 /v1),实际请求路径会变成 /responses,cc-router 找不到这个路由直接返回 404。这是初次接入最容易踩的坑。

模型名映射到 cc-router 的虚拟槽位如下:

cc-switch 中填写 对应 cc-router 虚拟槽位 适用场景
gpt-5.5 model-opus 规划、长上下文推理、复杂代码任务
gpt-5.4 model-sonnet 日常主力写代码
gpt-5.4-mini model-haiku 工具调用、轻量任务、subagent 高频小请求

模型名用的是 OpenAI 风格的别名,而不是 Anthropic 的 claude-opus-4-7 —— 因为 Codex 那边只认 OpenAI 协议的模型名,cc-router 在网关层做了别名映射。

填完点保存。

填写 cc-router 接口信息


步骤四:在 Codex CLI 里验证

cc-switch 保存后会立刻把配置写进 ~/.codex/config.toml,CLI 这边再启动就能读到新供应商。

打开终端跑 codex 进入 CLI,先确认顶部状态栏里的 模型名是刚才填的 gpt-5.5 / gpt-5.4 / gpt-5.4-mini 之一,而不是 OpenAI 官方的 gpt-5o5 这类原始模型名。然后发一条测试消息,比如「你好,请简单介绍下自己,并告诉我你是什么模型」。

正常情况下应该几秒钟内开始流式返回内容,下面这张截图就是 CLI 跑通时的状态。

Codex CLI 测试成功

如果模型回的是 OpenAI 风格的自我介绍,那说明请求其实没走到 cc-router,而是落到了 OpenAI 官方 —— 这种情况回 cc-switch 检查当前激活的供应商是不是「cc-router」那一项。


步骤五:在 Codex Desktop 里验证

Codex Desktop 和 CLI 共享同一份 ~/.codex/config.toml,但有一个坑要注意。

如果你之前登录过 OpenAI 账号,Codex Desktop 进程内会缓存旧的供应商配置,cc-switch 的改动不会立刻生效。 解决办法:完全退出 Codex Desktop(macOS 上 Cmd+Q,不是只关闭窗口),重新打开。

重启后在对话窗口的模型选择器里点开,应该能看到刚才在 cc-switch 里配置的模型名(gpt-5.5 / gpt-5.4 / gpt-5.4-mini),选一个,发条测试消息,成功的样子如下图。

Codex Desktop 测试成功


步骤六:回到 cc-router 看请求日志

闭环验证:回到 cc-router 主界面,切到 请求日志 页面,能看到刚才从 Codex CLI / Codex Desktop 发的那两条请求 —— 每条记录会显示:

  • 客户端字段Codex CLICodex Desktop(说明 cc-router 正确识别了请求来源)
  • 请求模型:你在 cc-switch 里填的 gpt-5.5 / gpt-5.4 / gpt-5.4-mini
  • 路由到的虚拟槽位model-opus / model-sonnet / model-haiku
  • 真实上游:DeepSeek / Kimi / GLM / Claude 之类(取决于你给虚拟槽位绑了哪家)
  • 耗时与 token 数

cc-router 请求日志

看到日志里出现刚发的请求,整条链路就跑通了 —— Codex 客户端 → cc-switch 选 cc-router → cc-router 按槽位路由 → 真实上游 provider。


请求链路时序

发完一条消息后整条链路是这样跑的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Codex CLI/Desktop          cc-switch          cc-router :23456            上游 provider
│ │ │ │
│ 启动时读 config.toml │ │ │
├─────────────────────────▶│ │ │
│ 拿到 base_url = http:// │ │ │
│ 127.0.0.1:23456/v1 │ │ │
│ │ │
│ POST /v1/responses │ │
│ Bearer <api-key> │ │
│ model: gpt-5.4 │ │
├──────────────────────────────────────────────▶│ │
│ │ 解析模型名 → sonnet 槽位 │
│ │ 选 provider (权重/健康度) │
│ │ 翻译成上游协议 │
│ ├─────────────────────────▶│
│ │ │
│ │◀──── stream chunks ──────│
│◀────────────── stream chunks ─────────────────│ │
│ │ 写日志:客户端/模型/耗时 │

如果某家 provider 返回 429 或 5xx,cc-router 会自动在同一槽位内 fallback 到下一家,对 Codex 端透明。


排错速查

报错信息 / 现象 原因 解决办法
connection refused cc-router 没启动 / 端口被改 打开 cc-router 设置页,确认”实际监听端口”是 23456,必要时改回来或同步到 cc-switch
404 Not Found API 请求地址少了 /v1 cc-switch 里改成 http://127.0.0.1:23456/v1
401 Unauthorized token 不对或已轮换 回 cc-router 设置页重新复制 API Key,粘回 cc-switch
model_not_found 模型名拼错或填了 Anthropic 短名 gpt-5.5 / gpt-5.4 / gpt-5.4-mini 这类 OpenAI 别名,不要填 opus / sonnet
Codex Desktop 还在用旧账号 配置未生效 完全退出 Codex Desktop(不是关闭窗口)再重开
局域网另一台机器连不上 防火墙 / 路由问题 在 cc-router 主机用 curl http://127.0.0.1:23456/v1/models 测本机,再从远端用 curl http://<IP>:23456/v1/models 测网络,分段定位
cc-router 日志里没记录请求 请求根本没走到 cc-router 检查 cc-switch 里当前激活的供应商是不是 cc-router(OpenAI 官方账号没切走的话请求是直接发到 OpenAI 的)

安全提醒

  • API Key 等同于你所有上游 provider 的访问权 —— 泄漏意味着别人能消耗你 Claude、DeepSeek、Kimi 等所有厂商的额度,请勿截图、勿提交到 git、勿粘到聊天群
  • ~/.codex/config.toml 里 API Key 是明文存储 —— 用云盘同步或备份系统时注意排除这个文件,或单独加密
  • 局域网开放需谨慎 —— :23456 默认只监听 127.0.0.1,跨机器使用前确认你处在受信任的局域网;公网暴露请配反向代理 + IP 白名单 + 鉴权

参考链接