在官方 ChatGPT App 与自建网关之间切换 Codex:一套可回退的 macOS 方案
让 Codex 在官方 ChatGPT OAuth 与自建 OpenAI 兼容网关之间可验证、可回退地切换。
工程笔记 · 2026-07-24 · 约 6 分钟阅读 · 标签:OpenAI Compatible、Codex、ChatGPT、macOS
OpenAI 的 Codex CLI 和 ChatGPT macOS App 中的 Codex 功能会读取用户目录下的配置。只要自建网关兼容 OpenAI Responses API,就可以让 Codex 的代码任务经自定义接口运行;需要官方能力时,再切回 ChatGPT OAuth。
这篇文章记录一套可回退的全局切换方案,同时解释它与隔离 CODEX_HOME 启动方式的区别。
提醒:这不是修改 ChatGPT 普通聊天模型。它影响的是读取
~/.codex的 Codex 运行时。自定义 OpenAI 兼容网关通常只适合文本和代码任务,不能保证承载官方 App 内置的浏览器、Computer Use、文档、图片等专有插件。
Codex 读取哪些文件
默认 Codex Home 为:
~/.codex
两个关键文件是:
~/.codex/config.toml
~/.codex/auth.json
config.toml 保存模型、Provider、Base URL、Responses API 类型等配置;auth.json 保存官方 OAuth 或 API Key 鉴权状态。
因此,全局切换的本质就是:成对切换配置和鉴权。
为什么不能只改 Base URL
如果只把 base_url 改成自建网关,但 auth.json 仍是 chatgpt OAuth,Codex 可能继续尝试官方登录逻辑。反过来,如果只写 API Key、不指定自定义 Provider,也不会自动使用自建接口。
可靠切换需要同时处理:
官方模式:官方 config + ChatGPT OAuth auth
网关模式:自定义 config + API Key auth
切换前先验证网关
Codex 默认依赖 /v1/responses,所以不能只测试 /v1/chat/completions。
模型列表
curl https://gateway.example.com/v1/models \
-H "Authorization: Bearer $API_KEY"
Responses API
curl https://gateway.example.com/v1/responses \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model":"gpt-5.6-sol",
"input":"Reply exactly: RESPONSES_OK",
"max_output_tokens":20
}'
至少确认:
- HTTP 200;
- 状态为 completed;
- 返回内容正确;
- 模型没有被静默替换。
自定义 Provider 配置
网关模式的 config.toml 可以写成:
model = "gpt-5.6-sol"
model_provider = "my-gateway"
model_reasoning_effort = "high"
disable_response_storage = true
network_access = "enabled"
[model_providers.my-gateway]
name = "My OpenAI-Compatible Gateway"
base_url = "https://gateway.example.com/v1"
wire_api = "responses"
requires_openai_auth = true
request_max_retries = 3
stream_max_retries = 3
stream_idle_timeout_ms = 300000
API Key 不应写进 TOML。切换脚本把它写进权限为 600 的 auth.json:
{
"auth_mode": "apikey",
"OPENAI_API_KEY": "<API_KEY>"
}
为什么要备份官方 OAuth
官方 ChatGPT 登录包含可刷新 Token 和账户信息。切换自建接口前必须完整备份:
~/.codex/profiles/official.config.toml
~/.codex/profiles/official.auth.json
文件权限应限制为当前用户:
chmod 600 ~/.codex/profiles/*
不要把这些文件提交到 Git,也不要把内容发到聊天记录、Issue 或截图里。
全局切换器
可以制作一个简单命令:
codex-switch official
codex-switch sub2api
codex-switch status
它分别执行:
official
- 恢复官方
config.toml; - 恢复 ChatGPT OAuth
auth.json; - 保持文件权限为
600。
sub2api
- 写入自定义 Provider 配置;
- 从受保护的环境文件读取 API Key;
- 生成 API Key 模式的
auth.json; - 不在终端输出 Key。
status
只输出:
current=official-chatgpt
或:
current=sub2api model="gpt-5.6-sol"
不显示任何凭据。
全局切换与隔离启动的区别
这两个方案不要混淆。
全局切换
修改 ~/.codex/config.toml 和 auth.json
特点:
- 终端 Codex 会改变;
- ChatGPT App 中读取同一 Codex Home 的运行时也会改变;
- 切换后建议新建会话;
- App 已经打开时,最好完全退出并重开。
隔离启动
CODEX_HOME=~/.codex-gateway codex
特点:
- 只影响这个终端进程;
- 不覆盖官方 OAuth;
- 不改变已打开的 ChatGPT App;
- 适合同时保留多个 Provider。
我的实际使用方式是:日常 CLI 优先隔离启动;需要让 App 的 Codex 走网关时,才执行全局切换。
自定义网关模式下应禁用的插件
官方 App 的部分能力依赖 OpenAI 专用服务,不是标准 Responses API 的一部分。例如:
- Browser / Chrome;
- Computer Use;
- Documents;
- PDF;
- Spreadsheets;
- Presentations;
- 图像相关工具。
自定义配置中应显式禁用这些插件,避免 Codex 发出网关无法理解的工具调用:
[plugins."browser@openai-bundled"]
enabled = false
[plugins."computer-use@openai-bundled"]
enabled = false
[plugins."documents@openai-primary-runtime"]
enabled = false
切回官方配置后再恢复它们。
真实验收
配置完成后必须运行一次 Codex,而不是只查看文件:
codex exec --skip-git-repo-check \
'Reply with exactly: CODEX_GATEWAY_OK'
启动信息应明确显示:
model: gpt-5.6-sol
provider: my-gateway
并最终返回:
CODEX_GATEWAY_OK
还应测试切回官方:
codex-switch official
codex-switch status
确认 OAuth 文件完整恢复。
常见问题
1. Missing environment variable
TOML 中配置了 env_key,但官方 App 不是从你的交互式 shell 启动,无法继承该环境变量。
解决方案:全局切换时正确生成 auth.json,不要依赖 shell 临时 export。
2. 终端成功,App 不生效
通常是 App 仍在使用旧进程中的配置。完全退出 App,重新打开并新建 Codex 会话。
3. /chat/completions 正常,Codex 仍失败
大概率是 /responses 不兼容。Codex Provider 应设置:
wire_api = "responses"
同时真实测试 /v1/responses。
4. 官方插件报错
自建网关只能处理标准文本/工具协议,不能等价替代 OpenAI 专有后端。自定义模式下禁用不支持的官方插件。
小结
要让 Codex 在官方 ChatGPT 与自建网关之间可靠切换,需要同时满足四个条件:
- 网关真实支持 Responses API;
- 模型名与上游保持透明;
config.toml和auth.json成对切换;- 官方 OAuth 有安全备份并能一键恢复。
不要用覆盖官方文件却没有备份的脚本,也不要把 API Key 硬编码进配置。把全局切换和隔离启动分清楚,就能同时保留官方体验与自建路由的灵活性。