先把结论放在前面:Codex 完全可以不依赖官方默认模型,把请求转发到 DeepSeek、通义千问这类国产大模型上,而且实际操作只需要改一个配置文件。我过去一周把主力模型从 OpenAI 默认模型切到了 DeepSeek 和通义,用来做日常写码、改 bug、补测试,省下来的费用不是百分比,而是数量级。这篇文章不打算讲太多理论概念,重点讲怎么落地:从选模型、改 config.toml、跑通第一个任务,到处理那串很多人都会撞上的 “local proxy failed while handling codex endpoint /responses” 报错,一次性说清楚。适合手里已经有国产模型 API Key、但不想再为 Codex 的默认计费掏钱的朋友,也适合刚装好 Codex 还不知道怎么配第三方供应商的新手。
1. 为什么要把 Codex 接到国产模型上
1.1 先搞清楚 Codex 到底是什么
Codex 是 OpenAI 出的一个终端 AI 编程代理,不是传统的代码补全插件。它的工作方式是这样的:你给它一个任务描述,它自己读项目文件、定位相关代码、做修改、跑测试,甚至执行命令行工具,整个流程像一个远程程序员在帮你干活。使用体验上,它比 Copilot 这类“你写一行我补一行”的工具更接近“你把需求说清楚,我自己看代码自己改”,属于 Agent 形态的编程工具。
Codex 本身只是一个外壳,真正干活的是它背后调用的模型。官方版本默认绑定 OpenAI 自家的模型,问题是这套计费逻辑对国内开发者很不友好:充值麻烦、按美元计费、单次 Agent 会话如果任务复杂,跑下来消耗的 token 量相当惊人。我自己之前跑一个稍大的重构任务,一个下午烧掉的额度折合人民币够吃两顿饭。很多人因此直接把 Codex 卸了,其实挺可惜的。
Codex 的架构里有个很关键的设计:模型供应商是可以替换的。只要对方提供 OpenAI 兼容的 API,Codex 就能把请求发过去。国内主流模型厂商基本上都做了 OpenAI 兼容层,所以“Codex 配国产模型”不是魔改,而是官方支持的用法,只是知道的人不多。
1.2 国产模型怎么选:五家主流供应商横评
既然要换,选哪家就是个现实问题。我按实际用下来的体验,把市面上能通过 OpenAI 兼容接口接进 Codex 的国产模型分成几类,直接给你参照。
| 供应商 | 推荐模型 | API Base URL | 适合场景 | 主要注意点 |
|---|---|---|---|---|
| DeepSeek | deepseek-chat / deepseek-reasoner | https://api.deepseek.com/v1 | 日常写码、代码理解、重构建议 | 便宜,性价比之王;reasoner 适合复杂推理但慢 |
| 阿里云百炼 | qwen-plus / qwen3-coder | https://dashscope.aliyuncs.com/compatible-mode/v1 | 中长上下文任务、中文场景 | 上下文窗口大,工具调用稳定 |
| 智谱 | glm-4-plus / glm-4-flash | https://open.bigmodel.cn/api/paas/v4/ | 轻量任务、快速原型 | flash 免费档位适合测试,复杂任务不够稳 |
| Moonshot Kimi | moonshot-v1-32k / 128k | https://api.moonshot.cn/v1 | 长文档分析、大仓库理解 | 上下文大,但写代码细节有时不如 DeepSeek |
| 火山方舟豆包 | doubao-seed 系列 | https://ark.cn-beijing.volces.com/api/v3 | 需要走火山生态的用户 | 需要创建推理接入点,配置稍繁琐 |
选型的核心逻辑不是“谁便宜选谁”,而是看两点:第一,模型必须支持工具调用(function calling),因为 Codex 要靠这个能力来读取本地文件、执行命令;第二,上下文窗口要够大,Codex 一次任务会把多个文件的内容塞进上下文,只有 4K、8K 上下文的模型基本没法用。
从我的实测来看,DeepSeek 目前是综合体验最稳的。deepseek-chat 的代码能力放在国产模型里是第一梯队,价格又低到可以忽略计费焦虑。如果你主要做中文项目、写业务代码,直接闭眼选它。阿里 qwen-plus 我也用过一段时间,优势是上下文给得大方,遇到那种“把整个模块给我读一遍再改”的大活不容易截断。Kimi 的长上下文更强,但写码场景的响应速度和修改准确度比 DeepSeek 略逊。
1.3 接入前必须想清楚的三件事
第一,你要接受一个现实:换模型后,Codex 的能力下限取决于模型本身,而不是 Codex 这个工具。Codex 的调度框架很强,但模型如果指令遵循能力一般,它可能改错文件或者理解偏需求。所以别指望“Codex + 廉价模型 = 免费版官方 Codex”,合理预期是“80% 的日常场景能覆盖,复杂架构设计还得回到强模型”。
第二,要分清聊天补全协议和 Responses 协议的区别,这是绝大多数报错的根源,后面专门讲。简单说就是 Codex 默认说话的方式,很多国产模型还没完全接住。
第三,API Key 别乱填、别写进配置文件。我在后面会给你一套安全的注入方式,理论上 Key 泄露的损失可比省下的模型费大多了。
2. 接入前的关键认知:OpenAI 兼容 API 与两种请求协议
2.1 /v1/responses 与 /v1/chat/completions 有什么区别
很多人在对接时卡住,报错信息五花八门,什么 “404 Not Found”、“local proxy failed while handling codex endpoint /responses”,本质都是同一个问题:Codex 发出的请求路径,目标模型服务的接口不认。
OpenAI 目前有两套 API 协议。老的叫 Chat Completions,路径是/v1/chat/completions,几乎所有兼容 OpenAI 接口的第三方厂商都实现了这个。新的叫 Responses API,路径是/v1/responses,它是 OpenAI 为了 Agent 场景重新设计的一套接口,把多轮对话、工具调用、推理过程都合并到一个更统一的响应结构里。Codex 作为 OpenAI 亲儿子,新版默认走的是/v1/responses。
问题就在这:国内模型厂商的兼容层,绝大多数只实现了老的/v1/chat/completions,Responses API 要么没做,要么做得不完整。你拿 Codex 默认配置去请求国产模型,请求到了/v1/responses,对方根本不知道这是什么,自然报错。打个比方,你用普通话跟只会方言的人打电话,电话打通了,但对面听不懂你在说什么——不是网络问题,是语言不通。解决办法不是去找信号更好的地方,而是让 Codex 改成说对方听得懂的话,也就是把请求协议从 responses 切回 chat completions。Codex 在自定义供应商配置里提供了一个字段叫wire_api,设成"chat"就是告诉 Codex:“跟这个供应商说话的时候,请用老协议。”
2.2 config.toml 到底配什么:Codex 自定义供应商的完整字段解读
Codex 的配置文件在~/.codex/config.toml,自定义模型供应商的语法如下:
model = "deepseek-chat" model_provider = "deepseek" [model_providers.deepseek] name = "DeepSeek" base_url = "https://api.deepseek.com/v1" env_key = "DEEPSEEK_API_KEY" wire_api = "chat"逐行给你说人话。model是默认模型名,model_provider指向下面定义的那套供应商配置。[model_providers.deepseek]的表头定义了这个供应商的名字,你可以叫它任意名字,只要和model_provider对上就行。base_url是 API 的根地址,一定要包含/v1之类的路径前缀,不同厂商的路径规则我后面列个对照表。env_key告诉 Codex “去哪个环境变量里找 API Key”,这样配置文件里就不会出现明文密钥。wire_api是前面说的协议开关,填"chat"走老协议,不填默认走 Responses 协议,国产模型基本都得填 chat。
除了这几个基础字段,高阶玩法里还可以往 provider 里加超时控制和重试次数:
[model_providers.deepseek] name = "DeepSeek" base_url = "https://api.deepseek.com/v1" env_key = "DEEPSEEK_API_KEY" wire_api = "chat" timeout = 120 request_max_retries = 3timeout设大一点很重要,国产模型在推理复杂问题时响应时间可能比较长,默认超时时间容易误杀慢请求。这几行配置就是从“能跑”到“跑得稳”的差距。
2.3 API Key 的注入姿势:不把密钥写死在配置里
接第三方 API 就必须用自己的 Key。常见错误是直接把 Key 填到config.toml里,我见过有教程真这么写,这是把密钥往火坑里推。配置文件可能被同步到网盘、上传到 GitHub、或者被截图发群里,一旦泄露,对方能拿着你的 Key 无限刷费。
正确姿势是用环境变量。以 DeepSeek 为例,在终端里执行:
export DEEPSEEK_API_KEY="sk-你的key"然后在config.toml里通过env_key = "DEEPSEEK_API_KEY"引用。Codex 启动时会自动从环境变量里取值发请求,配置文件和日志里都不会出现 Key。如果同时配了好几家供应商,每家设不同的环境变量名,互不干扰。这里有个小细节有坑:官方 provider 默认读的是OPENAI_API_KEY,但自定义 provider 用自定义名字就行,不需要去污染全局的 OpenAI 变量。你要是在同一个终端里既有官方 Key 又有第三方 Key,建议按厂商拆开,免得切换 model_provider 时 Key 串了。
3. 实战:五步把 Codex 接到 DeepSeek
3.1 第一步:装好 Codex CLI 并确认版本
如果你已经装了 Codex,可以跳过这步。没装的话,最省事的方式是通过 npm 全局安装:
npm install -g @openai/codexmacOS 上也可以用 Homebrew:
brew install codexWindows 用户建议装 WSL2,然后在 Linux 环境里跑 npm 安装,体验会顺畅很多。装完执行codex --version确认版本号正常。注意 Codex 版本迭代很快,新版本对自定义供应商的支持比旧版完善,如果版本过老,建议先升级再排查兼容问题。
首次运行codex会引导登录,这一步很多人会卡住。如果你绑定的是第三方供应商,不需要登录官方账号去拿授权,直接配好下面的 config.toml,然后按终端提示选择跳过登录流程即可。不同版本界面文字略有差异,但核心逻辑一样:它能用自定义 provider 就不强求官方登录态。
3.2 第二步:拿到 API Key 和接口地址
去 DeepSeek 开放平台注册并创建 API Key,创建成功后平台会给你一串以sk-开头的字符串。同时你需要记下这份配置:
- API Base URL:
https://api.deepseek.com/v1 - Chat 模型名:
deepseek-chat - Reasoner 模型名:
deepseek-reasoner
把 Key 写入环境变量。我用的是 zsh,所以编辑~/.zshrc加入一行:
export DEEPSEEK_API_KEY="sk-xxxxxx"然后source ~/.zshrc让配置生效。用 bash 的朋友对应改~/.bashrc,道理一样。
3.3 第三步:改写 config.toml(完整配置样板)
现在打开~/.codex/config.toml,把我上面给过的配置整段写入。我直接贴一份我当前在用的完整版本,你复制改改就能用:
model = "deepseek-chat" model_provider = "deepseek" [model_providers.deepseek] name = "DeepSeek" base_url = "https://api.deepseek.com/v1" env_key = "DEEPSEEK_API_KEY" wire_api = "chat" timeout = 120 request_max_retries = 3写完保存。这里有个细节:如果你之前已经配置过官方登录账号,config.toml 里可能还有别的配置块,别删掉那些内容,只需要把最顶层的model和model_provider指到 DeepSeek 即可。Codex 的优先级是:命令行参数里的--model选项 > 配置文件里的model字段。想临时切换模型,可以在运行时用codex --model deepseek-chat,不用改文件。
3.4 第四步:先跑一个最小对话验证
配置完不要直接上复杂任务,先用最简单的方式确认链路通了。在项目目录下执行:
codex exec "简单介绍一下这个项目,不超过50字"如果配置正确,Codex 会读取当前项目文件并调用 DeepSeek 生成回答。正常返回说明整条链路已经打通。如果看到401或authentication相关报错,多半是环境变量没生效,重新检查echo $DEEPSEEK_API_KEY能不能打印出 Key。
链路通了之后,再试一个有实际操作的任务,比如让 Codex 帮你加个函数、修一个明确的 bug。我第一次跑通后直接让它帮我重构一个模块,DeepSeek 的表现超出预期,代码风格和修改逻辑都比较靠谱。需要留意的是第一轮任务可能比较慢,因为模型要先把项目结构读一遍,几百行的上下文都在走输入 token,别因为响应慢就以为卡死了。
3.5 第五步:把推理模型也接进去
DeepSeek 除了便宜的deepseek-chat,还有个推理模型deepseek-reasoner。它的推理过程会显式生成思考链,适合处理算法题、逻辑推理、复杂 bug 定位。使用方式同样在 config.toml 里加一套供应商配置,或者直接运行时指定:
codex exec --model deepseek-reasoner "分析这段代码为什么内存泄漏,给出修复方案"实际用下来,reasoner 的模式明显更“较真”,它会先分析各种可能原因再动手改,但响应时间也更长、token 消耗更大。建议把 chat 设为默认,reasoner 留给疑难杂症,这样既控制成本又不耽误深度排查。
跑通之后我再补一句:如果 ceres 因为未知原因没有按预期调用工具,可以打开调试日志看细节。命令行加--debug参数会输出完整请求日志,能清楚看到 Codex 发了什么协议、走到了哪个 URL、目标模型返回了什么。这是排查一切对接问题的第一把钥匙。
4. 一表通用:通义千问 / 智谱 / Kimi / 豆包的接入参数
4.1 各家 API 参数对照表
一个人手里往往不止一家模型 API。我经常根据任务类型换着用,所以把主流国产模型的接入参数整理了一份对照表。直接照着填 config.toml 就行:
| 供应商 | Base URL | Chat 模型名 | 上下文 | 备注 |
|---|---|---|---|---|
| DeepSeek | https://api.deepseek.com/v1 | deepseek-chat | 64K | 性价比首选 |
| 阿里云百炼 | https://dashscope.aliyuncs.com/compatible-mode/v1 | qwen-plus/qwen3-coder | 128K+ | 上下文大户,长任务友好 |
| 智谱 | https://open.bigmodel.cn/api/paas/v4/ | glm-4-plus | 128K | 有免费档测试额度 |
| Moonshot Kimi | https://api.moonshot.cn/v1 | moonshot-v1-32k | 32K/128K | 长文本分析强 |
| 火山方舟豆包 | https://ark.cn-beijing.volces.com/api/v3 | 需填推理接入点 ID | 视接入点而定 | 要先创建接入点 |
4.2 不同模型的接入注意点
阿里云百炼稍微特殊一点。它的 OpenAI 兼容地址用的是 DashScope 的 compatible-mode 路径,模型名也比较多样化。如果你想要一个专门写代码的模型,可以试qwen3-coder;如果只是通用对话和轻量修改,qwen-plus就够。百炼平台还支持把 Key 配在环境变量里,官方推荐变量名是DASHSCOPE_API_KEY,但你在 Codex 里可以自定义成任何名字,通过env_key指过去就行。
智谱要注意,它的兼容地址路径是/api/paas/v4/,末尾带斜杠,别漏了。glm-4-plus是付费模型,但智谱也有免费档的glm-4-flash,适合先跑通流程再升级。免费档的稳定性一般,做简单任务还好,长时间跑 Agent 任务建议还是用付费型号。
Kimi 那边需要注意模型名的上下文版本。moonshot-v1-32k和moonshot-v1-128k是两套不一样的东西,上下文上限差 4 倍。Codex 会把项目文件都塞进上下文,如果你要处理大仓库,直接选 128K 版本,别为了省那点钱选 32K,最后截断了还得重跑,浪费时间。
豆包(火山方舟)是最繁琐的。它不是直接填模型名,而是要在控制台创建一个“推理接入点”,会生成一个endpoint-xxx的 ID,你得把这个 ID 填到模型名位置。如果你是火山生态的重度用户,可以折腾;否则我建议先用前三家,体验差距不大但省心很多。
5. 用 CC Switch 做多模型切换:别再手改配置了
5.1 CC Switch 是干什么的,和 Codex 怎么配合
CC Switch 是一个开源的 API 供应商管理工具,最初是给桌面端聊天客户端做“一键切换模型厂商”用的。它的思路很简单:你在界面上把多家厂商的 API Key 全部填进去,然后启动一个本地代理服务,所有请求发到一个固定的本地地址,由 CC Switch 根据你的选择转发到真实厂商。
这个思路放到 Codex 上正好合适。原本的痛点是:每次想换模型,都要打开~/.codex/config.toml改 model_provider、改 base_url、改 env_key,来回折腾。有了 CC Switch 之后,Codex 的 config.toml 里只需要指向本地代理地址,你在 CC Switch 界面上点一下切换按钮,就完成了厂商切换,Codex 那边完全不用动。
实际价值还体现在团队协作场景:多个开发者共享一套 Codex 配置,但每个人手里有不同的 API Key,CC Switch 里各自填自己的 Key 就行,config.toml 可以保持一致。这在多人协作时能省掉很多沟通成本。
5.2 配置步骤:半小时搭一个多模型入口
第一步,安装 CC Switch。它在 GitHub 上发布了各平台的安装包,macOS 和 Windows 都有现成的,下载安装即可。
第二步,在 CC Switch 里添加供应商。进入设置,添加一个 DeepSeek 供应商,名字随意,填上你的 API Key 和官方 API 地址https://api.deepseek.com/v1。再添加一个阿里云百炼供应商,填https://dashscope.aliyuncs.com/compatible-mode/v1以及对应的 Key。
第三步,启用 CC Switch 的本地服务模式。正常情况下它会在127.0.0.1某个端口上开一个本地 API 服务,端口号会在界面上显示,比如http://127.0.0.1:15600/v1。这个地址就是给 Codex 用的。
第四步,修改 Codex 的 config.toml,把 base_url 指向本地代理:
model = "deepseek-chat" model_provider = "local-proxy" [model_providers.local-proxy] name = "CC Switch Local" base_url = "http://127.0.0.1:15600/v1" env_key = "DEEPSEEK_API_KEY" wire_api = "chat"注意这里env_key其实就是个占位性质的东西,因为本地代理不校验 Key 是否真实,真正的 Key 校验在 CC Switch 转发时发生。你可以填任意非空环境变量名,或者干脆在 CC Switch 里配置成不需要 Key。但wire_api = "chat"这一段不能省,原因在下一节。
第五步,验证。在 CC Switch 界面切到 DeepSeek,然后在终端跑一个codex exec小任务,确认能正常返回。再把界面切到阿里百炼,同样的任务再来一次,确认切换生效。到这一步,你就有了一个图形化切换的多模型 Codex 环境。
5.3 高频报错实录:local proxy failed while handling codex endpoint /responses
这串报错我是在配置过程中真实撞上的,完整信息类似 “cc switch local proxy failed while handling codex endpoint /responses. provide...”。第一次看到这个错的人大概率以为本地代理挂了,或者网络不通,但真相不在那一层。
拆解这串报错:local proxy failed说的是本地代理在处理请求时遇到了上游错误;while handling codex endpoint /responses是关键词,说明 Codex 发出的请求打到了/responses这个路径。结合前面讲的协议知识,你就明白了:Codex 在用 Responses 协议请求本地代理,CC Switch 把这个请求转发给上游厂商时,上游厂商不支持/responses接口,于是返回来一个错误,CC Switch 只能原样抛给 Codex。
换句话说,这是协议不匹配,和网络、代理本身都没关系。解决方案是把 Codex 侧请求强制改成/chat/completions,也就是 config.toml 里那个wire_api = "chat"字段。加上之后,Codex 发给本地代理的就是/chat/completions,本地代理再转发给上游,路径完全匹配,问题消失。
我把这个排查过程单独拎出来写,是因为它是“Codex + 第三方模型 + 本地代理”场景下最高频的坑。以后再看到任何包含 “endpoint /responses” 的报错,第一反应不应该是我网络怎么了,而应该是我协议是不是没对齐。
6. 实战中的坑与排查清单
6.1 高频报错速查表
| 报错特征 | 真正的坑 | 解决办法 |
|---|---|---|
404/endpoint /responses not found | 请求协议不被上游支持 | 在 provider 配置里加wire_api = "chat" |
401 authentication failed | API Key 没注入或填错 | 检查环境变量名、Key 前缀、是否多空格 |
model_not_found | 模型名写错,或没创建推理接入点 | 对照厂商文档逐字核对模型名 |
timeout/request timed out | 模型推理慢,默认超时不够 | 调大timeout,比如 120 秒 |
context length exceeded | 项目文件太多,超出模型上下文 | 换更大上下文模型,或拆分任务让 Codex 局部读取 |
local proxy failed while handling ... | 协议不匹配,常见于本地代理场景 | 确认 Codex 端wire_api = "chat",并确认代理正常转发 |
6.2 三个小技巧帮你省钱又省心
第一个技巧,给推理模型单独设置更小的model_reasoning_effort。现在很多推理模型支持调节思考强度,Codex 的 provider 配置里也能指定推理强度级别。当你只是让 Codex 做个简单排列、改个变量名时,没必要让模型深度思考半天,把强度调低一档,token 消耗和响应时间都能降下来。具体字段名在不同版本里略有差异,可以在配置里查一下model_reasoning_effort相关说明。
第二个技巧,注意查看每次任务的 token 消耗。Codex 默认不会主动汇报 token 数,但通过调试日志能拿到。在命令后面加--debug跑一次,日志里会有 token usage 记录。了解每个任务大概吃多少 token,你才能判断当前模型的选择是否合理。我实测过一个标准功能开发任务,大致为:一个中大型项目中新增一个模块,整个 Agent 会话约消耗 200 万输入 token 和 20 万输出 token。这个量级不是 ChatGPT 聊几句能比的,所以模型单价哪怕差几块钱,折算到单次任务都是很大的差距。
第三个技巧,为复杂任务拆分 prompt。Codex 在 Agent 模式下一次会尽量理解全局,但项目特别大时,它会把大量上下文塞给模型,既花钱又容易出现理解偏差。这时候你可以明确告诉它“不要扫描整个仓库,只看 src/foo 目录相关文件”,或者“先读 README 和 package.json,不要打开其他文件”。通过 prompt 控制 Codex 的扫描范围,是降低 token 消耗最直接的方式,效果比换模型还明显。
6.3 一周实测:成本差了一个数量级
我连续一周主力用 DeepSeek 跑 Codex,任务内容包括给一个 Node 项目加接口、修测试、重构两个模块、写几段 SQL 脚本。每天大概跑 3 到 4 个小时的 Agent 会话。最后统计一周的账单,全部模型的 API 费用折算人民币总共不到三十块钱。同样的任务量如果跑官方默认模型,按美元计费,我只能说至少是几十倍以上的差距,而且还不一定更聪明。
这不是说 DeepSeek 能完全平替官方模型。复杂架构设计、跨系统的深层推理,官方模型确实更强。但日常“改代码、写测试、查 bug”这些占了编程工作 80% 的场景,DeepSeek 的完成度已经足够好。把主力日常切到国产模型,把真正高难度的任务留下用强模型,这才是性价比最高的使用姿势。
我个人的体会是,Codex 接国产模型这件事最难的不是安装也不是写配置,而是搞清楚协议层发生了什么。以后再遇到各种怪异的报错,先问自己三个问题:请求走到了哪个 URL、用的什么协议、目标厂商支持什么协议。把这条主线抓住,剩下的事都是查表填参数而已。最后再分享一个小技巧:多套配置可以用CODEX_HOME环境变量指向不同目录,一个目录放日常便宜模型,一个目录放强推理模型,想用哪套就切哪套,比反复编辑一个文件省心得多。