ccswitch 说切了,ccx 却没动?怎么给 Codex 国产模型切换造一座桥?
为什么 ccswitch 切换后流量却没动?
很多用户在 Codex 中配置国产模型时,会遇到这样一个“诡异”现象:用 ccswitch 把模型切到 deepseek、qwen 等国产模型后,ccx 的请求流量却仍然指向原来的默认通道。表面上看 ccswitch 已经更新了 model 字段,但实际上 ccx 的路由优先级纹丝不动。
究其原因,ccswitch 修改的是 Codex 配置文件里的 model 字段,而 ccx 路由判断的是各通道的 priority 数值。两者不在同一个维度,导致“切模型”与“改路由”之间产生了断层。
造一座桥:CCX-Bridge 的设计思路
既然无法改动 ccswitch(Electron 桌面应用,源码封闭),也无法让 ccx 自动根据模型名选通道(ccx 按 priority 路由),最干净的方案就是在中间搭一座“翻译器”——CCX-Bridge。
核心流程
ccswitch 切换模型
↓
config.toml 的 model 字段变化
↓
CCX-Bridge 检测到变化(fsnotify + 3秒轮询)
↓
匹配模型名 → 找到对应的 ccx 通道索引
↓
调用 ccx API: PUT /api/responses/channels/{index}
↓
目标通道 priority=1,其余 priority=2
↓
ccx 把新请求路由到正确的上游
ccx 的隐藏 API
ccx 没有公开文档,以下接口是通过 Web UI 逆向和试错得到的:
- GET /api/responses/channels:列出所有通道及状态
- PUT /api/responses/channels/{i}:修改通道属性(priority 等)
- GET /api/health:网关健康检查
- GET /api/conversations:会话列表和路由状态
PUT 请求后立即生效,无需重启 ccx。
模型名到通道的映射
ccx 通道名称通常带随机后缀(如 deepseek-v3-abc123),需要手动或通过正则把“模型名”映射到“通道索引”。CCX-Bridge 提供一个简易的 JSON 配置表:
{
"deepseek": 0,
"qwen": 1,
"yi": 2
}
实际部署与使用
- 下载 CCX-Bridge 二进制(Windows/macOS/Linux 均支持)。
- 在同目录新建
bridge.json,填入上述映射表。 - 启动 CCX-Bridge,它会常驻后台监听
~/.codex/config.toml。 - 通过 ccswitch 正常切换模型即可,Bridge 会自动同步 ccx 路由。
常见问题排查
| 现象 | 可能原因 | 解决办法 |
|---|---|---|
| ccswitch 已切,ccx 仍走旧通道 | Bridge 未启动或映射表错误 | 检查 Bridge 日志,确认通道索引正确 |
| ccx 返回 500 | 并发/限流配置过高 | 把 maxConcurrent 设为 1,qps 设为 0.5 |
| Bridge 检测不到文件变化 | 权限或路径问题 | 以管理员/root 运行,或检查文件路径 |
总结
通过 CCX-Bridge 这座“桥”,我们把 ccswitch 的模型切换动作,翻译成了 ccx 能理解的通道优先级调整,真正实现了“一键切模型,流量自动走国产”。