Codex 通过 CPA 接入任意模型:把 AI 编程助手接到自己的聚合中转层
最近一段时间,AI 编程工具越来越卷。
Cursor、Claude Code、Codex、Copilot、Cline、Roo Code,各家都在往 Agent 化方向走。
但真正玩得多的人都会遇到同一个问题:
模型很好,但官方通道贵、地区限制多、账号风控多、模型切换麻烦。
所以很多人都会自己搭建一个聚合中转服务,比如:
- NewAPI
- OneAPI
- LiteLLM
- CPA / CLIProxyAPI
- 自写 OpenAI-compatible Gateway
其中 CPA 用户不少,因为它本身就是面向 CLI / Agent / 编程助手这类场景做的代理层,尤其适合把不同模型统一伪装成 OpenAI-compatible 接口。
这篇文章讲一个实用方案:
让 Codex 通过 CPA 接入任意模型。
最终效果是:
Codex
↓
CPA / CLIProxyAPI
↓
任意模型
- GPT
- Gemini
- NVIDIA
- Mimo
- DeepSeek
- Qwen
- Claude-compatible
- 其他 OpenAI-compatible 模型
Codex 侧只需要认一个模型名,比如:
flash
底层真实模型可以随时在 CPA 里切换。
一、为什么不让 Codex 直接接模型?
理论上 Codex 可以直接接 OpenAI API。
但实际使用中会有几个问题。
1. 模型来源越来越复杂
现在很多人不是只用一家模型,而是同时用:
- 官方 OpenAI
- Gemini
- DeepSeek
- NVIDIA
- 国内模型平台
- 免费中转
- 月套餐中转
- 自建 NewAPI
- 备用网关
如果每个工具都单独配置一次模型,后期维护会非常乱。
2. Codex 使用的是 Responses API
新的 Codex 不只是传统的:
/v1/chat/completions
很多场景会走:
/v1/responses
甚至还涉及:
- streaming
- websocket
- tool call
- reasoning
- developer role
- response item id
- compact / context management
普通中转站如果只支持 Chat Completions,直接接 Codex 可能会报:
404 /v1/responses
unsupported wire_api
malformed SSE
tool call failed
CPA / CLIProxyAPI 最近版本已经在持续补 Codex 和 OpenAI Responses 兼容,所以更适合做这一层。
3. 应用层不应该绑定真实模型名
如果 Codex 直接配置:
gemma4
mimo-v2.5-pro
gpt-5.5
deepseek-v4-pro
那么以后模型不可用、涨价、跑路、风控时,你还要改 Codex 配置。
更好的方式是:
Codex 只认 flash
CPA 决定 flash 背后到底是谁
这样底层随便换,Codex 不用动。
二、推荐架构
推荐架构如下:
Codex
↓
CPA / CLIProxyAPI
↓
统一模型别名
- flash
- free
- think
↓
真实模型供应商
- Gemini
- NVIDIA
- GPT
- Mimo
- DeepSeek
- NewAPI
- 其他中转
举个例子:
flash → 当前主力模型
free → 白嫖/低成本模型
think → 高推理/复杂任务模型
Codex 里只切:
flash / free / think
至于它们背后具体是 Gemini、Mimo 还是 GPT,不关 Codex 的事。
三、前置条件
你需要准备好:
- 一套已经部署好的 CPA / CLIProxyAPI
- CPA 对外暴露 OpenAI-compatible 地址,比如:
https://your-cpa-domain.com/v1
- CPA 里已经配置好模型别名,比如:
flash
free
think
- 一个 CPA API Key,例如:
sk-xxxxxxxx
- 本地安装 Codex
四、确认 CPA 版本
如果你要接 Codex,建议 CPA / CLIProxyAPI 版本尽量新。
因为最近版本里对 Codex / Responses 做了不少兼容,例如:
- OpenAI Responses request 转换
- Responses stream 修复
- Responses WebSocket 修复
- Codex client models 支持
- Codex context length stream error 修复
- developer role 转换
- tool call responses 修复
建议至少使用较新的 7.x 版本,最好直接上最新版。
尤其是如果后端接 Gemini,较新版本对:
OpenAI Responses developer role → Gemini
有更好的兼容。
五、Windows 下配置 Codex
Codex 的用户级配置目录默认是:
%USERPROFILE%/.codex
注意:
不要把配置写到项目目录里的 .codex/config.toml。
有些版本会忽略项目级配置里的 model_provider / model_providers。
应该写用户级配置:
C:/Users/你的用户名/.codex/config.toml
六、创建配置文件
在 Windows 里可以直接打开资源管理器,进入:
C:/Users/你的用户名/.codex
如果没有 .codex 文件夹,就手动新建。
然后新建文件:
config.toml
内容如下:
model = "flash"
model_provider = "cpa"
[model_providers.cpa]
name = "CPA"
base_url = "https://your-cpa-domain.com/v1"
wire_api = "responses"
env_key = "CPA_API_KEY"
说明:
model = "flash"
表示 Codex 默认使用 CPA 里的 flash 模型别名。
model_provider = "cpa"
表示默认 provider 使用自定义的 cpa。
base_url = "https://your-cpa-domain.com/v1"
这里填写你的 CPA 地址。
wire_api = "responses"
Codex 走 OpenAI Responses API。
env_key = "CPA_API_KEY"
这里不是填真实密钥,而是填环境变量名字。
七、配置 API Key
很多人容易在这里踩坑。
错误写法:
env_key = "sk-xxxxxxxx"
这是错的。
env_key 不是 API Key 本身,而是环境变量名。
正确写法:
env_key = "CPA_API_KEY"
然后在 Windows 用户环境变量里新增:
CPA_API_KEY = sk-xxxxxxxx
八、Windows 图形界面设置环境变量
如果不想用命令行,可以这样设置。
- 按
Win + R - 输入:
sysdm.cpl
- 打开后选择 高级
- 点击 环境变量
- 在上半部分 用户变量 里点击 新建
- 填入:
变量名:CPA_API_KEY
变量值:你的 CPA API Key
- 保存
- 关闭 Codex
- 重新打开 Codex
注意:
已经打开的终端或 Codex 不会自动读取新环境变量。
必须重新打开。
九、测试连接
配置完成后,打开 Codex,输入一句简单测试:
只回复:CPA 连接正常
如果能正常回复,说明链路打通了:
Codex → CPA → 模型
如果你在 CPA 后台能看到请求日志,就更稳。
十、快速切换模型
假设 CPA 对外提供两个模型:
flash
free
你可以用几种方式切换。
方式一:启动时指定模型
codex --model flash
或:
codex --model free
这是最简单的方式。
方式二:配置 profiles
编辑:
%USERPROFILE%/.codex/config.toml
加入:
[profiles.flash]
model = "flash"
model_provider = "cpa"
[profiles.free]
model = "free"
model_provider = "cpa"
之后启动:
codex --profile flash
或:
codex --profile free
适合经常切模型的人。
方式三:Codex UI 里手动输入模型名
如果 Codex UI 底部有模型选择框,可以尝试直接输入:
flash
或:
free
如果 CPA 的 /v1/models 返回了这些模型,Codex 有机会识别。
十一、推理强度不是模型切换
Codex 界面里可能会看到:
极低
低
中
高
超高
这是 reasoning effort,也就是推理强度,不是模型名。
可以理解为:
同一个模型下,思考深度不同
如果底层模型不支持 reasoning,CPA 可能会忽略或转换这个参数。
真正切模型还是:
flash / free / think
十二、是否还需要魔法?
如果 Codex 已经通过 CPA 调模型,那么模型请求链路是:
Codex → 你的 CPA → 后端模型
这部分通常不需要魔法。
但如果你之前用 ChatGPT 账号登录过 Codex,它启动时可能还会访问:
chatgpt.com
openai.com
api.openai.com
用于登录状态、账号校验、订阅检查等。
如果不想依赖官方登录链路,可以在配置里尝试加入:
forced_login_method = "api"
例如:
model = "flash"
model_provider = "cpa"
forced_login_method = "api"
[model_providers.cpa]
name = "CPA"
base_url = "https://your-cpa-domain.com/v1"
wire_api = "responses"
env_key = "CPA_API_KEY"
如果仍然卡官方登录,可以备份后处理:
%USERPROFILE%/.codex/auth.json
但不建议直接删除,先改名备份。
十三、常见错误排查
1. Missing environment variable
如果报:
Missing environment variable: `sk-xxxx`
说明你把真实 key 写进了 env_key。
错误:
env_key = "sk-xxxx"
正确:
env_key = "CPA_API_KEY"
然后把真实 key 写入 Windows 用户环境变量。
2. 401 Unauthorized
可能原因:
- 环境变量没生效
- API Key 写错
- CPA 不认这个 Key
- Codex 仍然使用旧 auth
- Windows 没重启终端
处理:
- 重新打开 Codex
- 检查用户环境变量
- 确认 CPA 后台 Key 有效
- 必要时重启 Windows
3. 404 /v1/responses
可能原因:
- CPA 版本太旧
- CPA 没开启 Responses 路由
base_url写错- 反代没有转发
/v1/responses
处理:
- 升级 CPA
- 检查反向代理
- 确认地址是:
https://your-cpa-domain.com/v1
而不是多写或少写 /v1。
4. model not found
可能原因:
- CPA 没有
flash这个模型别名 - Codex 传了别的模型名
- CPA 模型列表没有暴露该模型
处理:
- 在 CPA 中添加模型别名
- 确认
/v1/models能看到flash - Codex 配置里统一写
flash
5. stream / tool call 报错
可能原因:
- CPA 版本旧
- 后端模型不支持 Codex 需要的 tool call / responses 格式
- WebSocket / SSE 转换不兼容
处理:
- 升级 CPA 到新版本
- 优先使用更适合 coding agent 的模型
- 先关闭复杂工具调用,做最小测试
十四、推荐模型别名设计
我建议别名不要绑定厂商名,而是按用途设计。
例如:
flash → 默认主力,速度和能力平衡
free → 白嫖/低成本模型
think → 高推理/复杂任务
code → 专门代码模型
long → 长上下文模型
这样应用层更稳定。
比如:
Codex 使用 flash
普通聊天使用 free
复杂架构使用 think
长文档分析使用 long
底层真实模型可以随时换:
flash = gemma4
flash = gpt-5.5
flash = mimo-v2.5-pro
flash = gemini
Codex 不需要知道。
十五、完整示例配置
最终推荐配置如下。
model = "flash"
model_provider = "cpa"
forced_login_method = "api"
[model_providers.cpa]
name = "CPA"
base_url = "https://your-cpa-domain.com/v1"
wire_api = "responses"
env_key = "CPA_API_KEY"
[profiles.flash]
model = "flash"
model_provider = "cpa"
[profiles.free]
model = "free"
model_provider = "cpa"
[profiles.think]
model = "think"
model_provider = "cpa"
Windows 用户环境变量:
CPA_API_KEY = sk-xxxxxxxx
启动:
codex --profile flash
或者:
codex --profile free
十六、最终效果
配置完成后,你得到的是一个非常灵活的架构:
Codex
↓
flash / free / think
↓
CPA
↓
任意模型供应商
以后你想换模型,只需要在 CPA 后台改:
flash → 新模型
Codex 侧不用动。
这就是聚合中转最大的价值:
应用层只认稳定别名,模型层随时换供应商。
结语
现在玩 AI 编程助手,直接绑官方模型已经不是最优解。
更合理的方式是:
Codex / Claude Code / Cursor / QwenPaw
↓
自己的 CPA / NewAPI / Gateway
↓
多模型、多供应商、多 key 池
这样你可以同时获得:
- 更低成本
- 更强容灾
- 更灵活模型切换
- 更统一的 Key 管理
- 更好的可观测性
- 更少的工具侧配置成本
一句话:
Codex 不需要知道你用的是哪个模型,它只需要知道
flash。至于flash背后是谁,让 CPA 决定。