最近我在折腾终端里的 AI 编程工具时,干了一件挺有意思的事:把 OpenAI 的 Codex 直接集成进了 Claude Code 的会话里。这俩一个是 Anthropic 家的命令行编码智能体,一个是 OpenAI 家的编码智能体,按常理是竞争关系,但在实际使用中它们完全可以共存,而且协同干活的效果比单用任何一个都好。
Codex 的优势在云端解题、方案生成和全局性分析,Claude Code 的优势在对现有代码库的深度理解、长上下文编辑和终端内直接操作。真正常遇到的情况是:Claude 在一个问题上反复绕圈,怎么提示都出不来;或者 Codex 给出了整体思路,但落到当前项目的具体文件时又不够接地气。以前遇到这种情况只能开两个终端来回折腾,上下文全靠手动复制粘贴。现在把 Codex 作为插件接进 Claude Code,等于给 Claude Code 装上了第二颗大脑,同一个会话里随时可以叫另一个模型来“换脑子”。
这篇东西不是官方文档的翻译,是我自己从零到一折腾出来的实操记录,覆盖环境准备、插件配置、cc-switch 管理多供应商、高频报错排查,以及我踩过的几个坑。适合同时有多套 AI API 需求、想对比两家编码模型效果的人,也适合想通过 Claude Code 接入 DeepSeek、Qwen、GLM 等第三方模型的开发者。
1. 为什么要把 Codex 塞进 Claude Code
1.1 单模型的“思路死角”问题
用过一段时间 Claude Code 的人应该都有这种体验:它确实很强,但你会在某个具体任务上卡住——比如一个诡异的编译错误、一个边界条件极多的算法题,或者一段怎么重构都不对劲的历史代码。这时候你提示词换了一轮又一轮,结果还是一样。问题不在你的提问方式,而在于同一个模型在同一思路框架下,反复推导往往会收敛到同一个错误答案。
传统做法是什么?切换到另一个工具。但切工具的代价非常大:新的终端、新的上下文、重新描述一遍需求、把相关文件再贴一遍。遇到大型项目,这个成本高到让人不想切。
把 Codex 变成 Claude Code 的插件,解决的就是这个“切换成本”问题。你不用离开当前会话,不用重新描述项目背景,只需要让 Claude Code 把任务转交给 Codex 跑一轮,再把结果拿回来继续处理。上下文可以通过工程手段在工具间传递,而不是靠人肉复制粘贴。
1.2 插件化到底是怎么运作的
先说清楚一个常见误解:Codex 成为 Claude Code 插件,并不是 Anthropic 官方和 OpenAI 官方做了什么合作。它本质上是利用 Claude Code 的插件/工具扩展机制,把命令行里的 Codex CLI 变成当前会话可调用的一个子工具。
Codex CLI 提供了非交互式执行模式,核心命令长这样:
codex exec "给这个函数补全单元测试,覆盖边界条件"这条命令会启动一次非交互的 Codex 任务,跑完之后把结果直接输出到标准输出。Claude Code 的插件机制恰好可以封装并调用这种命令,拿到输出后交给当前会话的模型继续处理。换句话说,Codex 的“智力”通过命令行接口接入了 Claude 的处理流水线,两个模型各干各擅长的部分。
1.3 这种组合适合谁
- 同时拥有或准备购买 OpenAI、Anthropic 两套 API 的人,不用再纠结“二选一”。
- 团队希望统一终端入口、减少切换工具造成的上下文丢失的人。
- 想用 Claude Code 的交互体验,但某些场景下想改用其他模型跑一遍的人。
- 通过第三方兼容 API 接入 DeepSeek、Qwen、GLM 等模型的人,下面的章节会专门讲到。
我觉得最后一个场景的覆盖面其实最大。很多人订阅了某个编码工具的 CLI,但真正想用的是自己公司内部或者第三方服务商提供的模型接口。搞清楚 Codex 插件化背后的配置原理,这类需求基本就通了一半。
2. 动手前把环境和材料备齐
2.1 Node.js 版本与 npm 源
Claude Code 和 Codex CLI 都是 Node.js 生态的命令行工具,第一步先把 Node 环境搞定。我的建议是直接上 Node 20 LTS,低于 18 的版本基本不用考虑,官方依赖都跟不上了。
装完 Node 之后,先顺手升级 npm:
npm install -g npm@latest如果你在国内网络环境下安装经常超时,把 npm 源切到镜像源能省很多事:
npm config set registry https://registry.npmmirror.com这个操作只影响 npm 包下载速度,不涉及任何其他网络配置,放心用。
2.2 安装两个核心 CLI
Claude Code 的安装包名是@anthropic-ai/claude-code,Codex CLI 的安装包名是@openai/codex:
npm install -g @anthropic-ai/claude-code npm install -g @openai/codex装完先验证一下版本,确保两个命令都能正常执行:
claude --version codex --version如果提示找不到命令,多半是 npm 全局目录没进 PATH。可以执行npm prefix -g查看全局路径,然后把对应的bin目录加到 shell 配置里。
2.3 两套密钥的配置方式
Claude Code 默认读取ANTHROPIC_API_KEY环境变量,Codex CLI 支持两种认证:一种是读取OPENAI_API_KEY,另一种是用 ChatGPT 账号登录生成的本地凭证。插件化场景里,我建议两个都准备好:
macOS / Linux 下写到 shell 配置里:
export ANTHROPIC_API_KEY="sk-ant-你的密钥" export OPENAI_API_KEY="sk-你的密钥"Windows PowerShell 下用:
$env:ANTHROPIC_API_KEY="sk-ant-你的密钥" $env:OPENAI_API_KEY="sk-你的密钥"| 工具 | 环境变量 | 认证方式 | 失效场景 |
|---|---|---|---|
| Claude Code | ANTHROPIC_API_KEY | API Key | Key 过期、额度耗尽 |
| Codex CLI | OPENAI_API_KEY | API Key 或账号登录 | Key 过期、登录态失效 |
| 第三方模型 | OPENAI_BASE_URL + 对应 Key | 服务商 Key | 服务商接口变更 |
有一点需要注意:环境变量是全局的。如果你在系统环境里配了OPENAI_API_KEY,然后又通过 codex 的配置文件指到了第三方服务商,实际生效的是环境变量,容易造成“我明明改了配置怎么没生效”的困惑。排查这类问题的时候,先确认当前 shell 里有没有遗留的环境变量。
2.4 Codex 的登录态文件
如果你走的是 ChatGPT 账号登录而不是 API Key,Codex 会把凭证写到~/.codex/auth.json。这个文件在插件化场景里同样有效,因为无论谁调用 codex,最终读的都是同一套凭证。
日常使用中建议留意一下这个文件。有段时间我碰到“codex 无法加载组织设置”的报错,最后发现就是登录态过期导致认证接口返回异常,重新登录一下就恢复了。
3. 插件集成与多模型配置实操
3.1 最小可用的插件封装方式
不需要任何复杂的框架,Codex CLI 的exec子命令就足够支撑插件封装。我用的方式是在 Claude Code 里注册一个自定义工具,让 Claude 在需要时可以直接调用。
先写一个可执行脚本,路径我放在~/.claude/commands/codex-helper.sh:
#!/usr/bin/env bash set -euo pipefail INPUT="$1" MODEL="${CODEX_MODEL:-gpt-5-codex}" codex exec --model "$MODEL" "$INPUT"给它加执行权限:
chmod +x ~/.claude/commands/codex-helper.sh然后在 Claude Code 的设置里注册这个工具。Claude Code 的配置文件在~/.claude/settings.json,添加类似这样的片段:
{ "tools": { "codex_helper": { "command": ["bash", "-l", "-c", "~/.claude/commands/codex-helper.sh \"$@\"", "--"] } } }这样配置完之后,你在 Claude Code 会话里直接说“用 codex_helper 看一下这个问题”,它就会把剩余的任务描述传给脚本,脚本调起 Codex CLI,跑完的结果再回到 Claude 的上下文里。整个过程没离开当前会话。
我这个封装是极简版,真实环境里大家基本都会换成社区维护的插件包,原理都逃不开“调用 codex exec + 回传输出”。
3.2 用 cc-switch 管理多套供应商配置
cc-switch 是社区里比较常用的一套配置管理工具,解决的问题很实在:一会儿要用 DeepSeek,一会儿要用 Qwen,一会儿又要切回官方模型,每次手动改环境变量和配置文件太容易出错。cc-switch 把这些配置抽象成 profile,切换时自动改写 Claude Code / Codex 的配置。
以我实际用过的流程为例,大致是三步:
cc-switch add --name deepseek-v4 --base-url https://你的服务商地址 --token 你的密钥 cc-switch add --name qwen --base-url https://你的服务商地址 --token 你的密钥 cc-switch use deepseek-v4具体命令参数会随版本变化,但核心逻辑不变:它维护一份 profile 列表,use某个 profile 时,自动把对应的 base URL、token、模型名写进 Claude Code 和 Codex 的配置里。
这里有一个很关键的点:cc-switch 不仅能切换直连服务商的配置,还支持 local proxy 模式——也就是把请求先指向本地某个端口,由本地服务再转发到目标端点。这个模式虽然灵活,但也正是“cc switch local proxy failed while handling codex endpoint /responses”这类报错的来源,我在第 4 节专门讲。
3.3 接入 DeepSeek / Qwen / GLM 等第三方模型
如果你用 Claude Code 接入过 DeepSeek、Qwen、GLM 这类模型,应该已经对“OpenAI 兼容接口”这个概念不陌生。Codex CLI 同样支持通过配置把请求指向任意兼容 OpenAI 协议的端点。
Codex CLI 的全局配置文件在~/.codex/config.toml,社区里比较常见的做法是这样配置一个第三方模型供应商:
model = "gpt-5-codex" [model_providers.deepseek] name = "DeepSeek" base_url = "https://你的服务商接口地址" env_key = "DEEPSEEK_API_KEY" wire_api = "responses"我这里写的wire_api = "responses"是指 Codex 和供应商之间用 OpenAI 最新的 Responses API 协议通信。不是所有第三方服务商都完整支持这个协议,接入前先确认服务商有没有responses端点。如果只有旧的chat/completions端点,配置上就要做对应调整,否则就会出现“请求发过去了但格式对不上”的问题。
另一种更简单的做法是直接用环境变量覆盖:
export OPENAI_BASE_URL="https://你的服务商接口地址" export OPENAI_MODEL="deepseek-chat"但环境变量方式的问题在于它是全局的,切模型要反复改环境,所以我更推荐用 config.toml 里的 model_providers 管理,配合 cc-switch 切换 profile,体验会顺畅很多。
3.4 验证集成是否生效
配置完之后别急着干活,先做一个冒烟测试。在 Claude Code 会话里执行一个最简单的任务,比如“用 codex_helper 解释一下这个仓库的目录结构”,看它能不能正常调起 Codex、拿到输出并回到会话。
再直接在终端里验证 Codex 本身:
codex exec "用一句话说明 TCP 三次握手"如果这条命令正常输出,说明 Codex CLI 和认证都没问题;如果这一步都报错,那问题在 Codex 自身配置,跟插件无关,先排查再往下走。
4. 高频报错与排查实录
4.1 “cc switch local proxy failed while handling codex endpoint /responses”
这个报错我没少碰,基本都出在 cc-switch 的 local proxy 模式上。它想做的事情是:把 Codex 发往本地代理的请求,由代理转发到目标/responses端点。但实际跑的时候,代理进程没起来、端口写错、配置文件 JSON 格式不对,都会导致 Claude Code 收到这个 failed 错误。
排查顺序我建议这样:
- 先看本地代理进程是不是真的在监听。
lsof -i :端口号(macOS/Linux)或netstat -ano | findstr 端口号(Windows),确认端口有进程在听。 - 直接 curl 一下本地端点,看能不能通。比如
curl http://127.0.0.1:端口号,如果 curl 都失败,那说明代理服务本身没起来或地址配置错了。 - 检查 cc-switch 的 profile 配置,重点看 base_url 里的主机名是不是 localhost/127.0.0.1,端口号和后端代理进程监听的是否完全一致。
- 打开日志确认转发的目标地址是否正确。如果目标地址指向一个不可达的服务,也会表现为 local proxy failed。
这类问题九成是配置不一致造成的,不是工具本身有 bug。我自己的习惯是:能用直连就尽量用直连,只有明确需要本地网关统一鉴权时才开 local proxy,减少一层复杂度。
4.2 “codex 无法加载组织设置”
这个报错出现在账号登录模式下。Codex 通过 ChatGPT 账号登录后,会尝试读取账号所属的组织(organization)信息。个人账号一般没问题,但企业组织账号容易踩坑。
常见原因和对应解法:
| 现象 | 原因 | 处理方式 |
|---|---|---|
| 登录之后立刻报错 | 登录态未正确写入 | 执行codex logout后重新codex login |
| 配置里指定了不存在的组织 ID | 组织标识写错 | 检查配置中的组织 ID 与账号实际所属组织是否一致 |
| 一直转圈后报错 | 认证端点不可达 | 检查网络到认证服务的连通性,确认 DNS 解析正常 |
如果确定自己的账号没有问题,可以直接删掉~/.codex/auth.json重新登录,有时候旧凭证的缓存格式过期了,重新生成一次就好了。
4.3 “the 'gpt-5.6-sol' model is not supported when using codex with a...”
这个报错一眼就能看出来,配置里指定了不存在的模型名。实际使用中经常有人从其他地方复制一个模型名,或者在配置里手滑写错字符,Codex 启动时校验模型名失败就报了这个错误。
解决思路很明确:确认当前 Codex 版本真正支持的模型列表。你可以在终端里跑:
codex --help查看有没有列出可用的模型参数。也可以用codex exec --model 模型名 "测试"逐个验证,但更高效的做法是直接查当前版本对应的官方模型列表。注意模型名是精确匹配的,多一个后缀、少一个短线都会报 not supported。
我自己的教训是:改 config.toml 时把模型名和生产环境用的模型搞混了,排查了半天,最后发现就是名字写错。
4.4 Codex 登录不上 / API Key 无效
这类问题要区分是认证问题还是网络问题。
认证层面,先确认 API Key 是否正确、是否过期、账户是否有余额。再检查环境变量,有时候你配了OPENAI_API_KEY,但配置文件里也写了 token,环境变量的优先级更高,覆盖了配置文件里的值。
网络层面,如果请求发不出去、超时,先确认是否能正常访问目标 API 域名。用 curl 简单测一下:
curl -I https://api.openai.com能返回响应头说明网络通,如果长时间无响应,那问题在网络可达性,不是配置能解决的。这种情况先确认你的网络环境是否满足访问条件,然后再继续排查。
4.5 插件调用过程中输出被截断
这个坑很隐蔽。Codex 执行结果太长时,Claude Code 会话里的上下文会被截断,导致你只看到前半段结果,误以为 Codex 没跑完。
我的做法是把大任务拆小,一次只让 Codex 干一件相对独立的事,比如“先只生成方案,不要写代码”,拿到方案后再让 Claude Code 去落地。这样既避免了输出截断,也让两个模型各司其职、各干最擅长的事。
5. 我的实操体验与几个实用技巧
5.1 什么时候该把任务交给 Codex
用了一段时间“双引擎”模式之后,我摸索出一个简单的分工原则:算法题、架构方案、代码审查这三类任务,我更愿意交给 Codex,它的云端模型在全局分析和方案生成上确实有一手。而涉及当前代码库的具体改造、跨文件重构、长上下文维护,我更倾向于让 Claude Code 来做,它对项目上下文的把握更稳。
但这个分工不是绝对的。我实际用得最多的场景反而是“互相 review”:让 Claude Code 写一版实现,再让 Codex 从另一个角度审查,两个模型互相挑毛病。这个玩法很有意思,很多时候 Claude 自认为没有问题的代码,Codex 能指出潜在的边界条件问题;反过来也一样。
5.2 双引擎协作的提示词技巧
很多人问我在同一个会话里怎么让两个模型配合,我常用的提示模式是:
- 先用 Claude 的任务描述能力把需求拆成清晰的步骤。
- 再把其中一个步骤交给 codex_helper 执行,并明确告诉它“只输出结论,不要展开”。
- 最后让 Claude 基于 Codex 的输出继续推进。
这三步走下来,上下文不会乱,两个模型各干各的活,交接点清晰,输出也不容易跑偏。核心思路就是:给 Codex 的任务要边界清晰、指令明确,不要让它做“自由发挥”型的事。
5.3 配置文件的备份与整理
折腾插件和 cc-switch 的过程中,最重要的配置文件有这么几个:~/.claude/settings.json、~/.codex/config.toml、~/.codex/auth.json,还有 cc-switch 自己的配置目录。我强烈建议定期把前三个备份到安全的地方,因为一旦系统重装或者误操作,恢复配置会非常费劲。
另外,cc-switch 的 profile 列表也值得单独备份。我吃过一次亏,换电脑之后 profile 全部丢了,重新一个个配置浪费了不少时间。
还有一个安全提醒:API Key 不要提交到 git 仓库,也不要在截图里展示。现在很多 CI/CD 工具会自动扫描公开仓库里的密钥,一旦泄露,密钥被滥用是早晚的事。用第三方服务商的接口时,也要先看清楚对方的使用协议和合规要求,不同类型的模型和服务在用途上可能有差异,这些都是自己需要负责的部分。
5.4 一个小技巧:给 Codex 单独指定模型
如果你的第三方服务商提供多个模型,可以在调用 codex_helper 时单独指定模型,而不动全局配置:
CODEX_MODEL=deepseek-chat ~/.claude/commands/codex-helper.sh "给这段代码做性能分析"这个方式在需要临时对比不同模型效果的场景下特别方便,不用反复改 config.toml。
我个人在实际操作中最深的体会是:工具链折腾完之后,真正带来效率提升的不是“多了一个模型”,而是“不用再因为切换工具而丢失上下文”。当两个模型可以在同一个会话里互相接力、互相审查的时候,以前那种单模型一条路走到黑的挫败感基本消失了。如果你也在用 Claude Code,并且手里还有其他模型的 API 权限,不妨按这个思路把插件化配置起来,测试成本很低,但能打开的工作方式确实不太一样。