1. 先搞清楚 GPT-5.4 退役到底影响谁:Codex 迁移范围自查
GPT-5.4 退役这件事,最容易被误读成"所有 GPT-5.4 调用都要停"。我先把边界划清楚,因为后面所有配置动作都建立在这个判断上。
官方 Codex 模型文档给出的信息可以拆成几条:GPT-5.4 与 GPT-5.4 mini 会在 2026-08-31 从使用 ChatGPT 登录的 Codex中退役;官方映射是 gpt-5.4 → gpt-5.6-terra、gpt-5.4-mini → gpt-5.6-luna;而 OpenAI API 以及使用自有 API Key 认证的 Codex,不受这次退役影响。
注意最后一句。它意味着你第一步不是改配置,而是确认自己的认证方式。同样是 Codex CLI,用 ChatGPT 账号登录和用 API Key 认证,命运完全不同。
你可以这样快速判断:
- 打开 Codex,运行
/status,看它显示的是 ChatGPT 登录态还是 API Key。 - 翻你的
~/.codex/config.toml,如果里面写了model = "gpt-5.4"且认证走 ChatGPT,那就在退役范围内。 - 如果你的应用是直接
client.responses.create(model="gpt-5.4")这种 API 调用,那这次 Codex 公告不直接约束你,但要单独查 API 模型目录和弃用清单。
哪些工作流必须在 8 月 31 日前完成迁移验证:ChatGPT 登录的 Codex CLI/IDE/桌面端、工作区默认配置里写死 gpt-5.4 或 gpt-5.4-mini 的、保存的模型设置与自定义 Agent、定时任务或codex exec --model里写死旧模型的、依赖 ChatGPT 登录态选旧模型的团队脚本。
哪些不能机械迁移:直接调 OpenAI API 的生产应用、自有 API Key 认证的 Codex、第三方 Provider 或 Azure 等独立生命周期的部署、只在历史报告里出现旧模型名的静态材料。
我见过最常见的坑,就是有人看到"退役"两个字,直接全仓sed -i 's/gpt-5.4/gpt-5.6-terra/g',结果把历史回归基线、文档示例、成本看板标签全改了,追溯性直接崩掉。正确做法是先盘点、再分类、最后只改运行时生效的引用。
盘点命令可以这样跑,注意不要打印任何真实凭据:
rg -n --hidden \ --glob '!.git' \ --glob '!node_modules' \ --glob '!dist' \ 'gpt-5\.4|gpt-5\.4-mini' .跑完你会得到一张引用清单,然后按"是否运行时生效 / 是否应迁移"两列分类。运行时生效的才动,历史记录保留。
这一步做完,你才真正知道自己要迁移多少东西。很多人跳过这步直接改配置,最后发现漏了 CI 里的定时任务,或者漏了某个 Agent 的托管配置,上线当天才炸。
2. TaoToken 前置准备:统一 Key 与 API 通道
迁移过程中最烦的不是改模型名,而是认证方式散落各处。Codex 用一套登录态,你的脚本用一套 Key,CI 又用一套环境变量,改起来容易漏。
我的做法是先把 API 通道统一到一个入口,这样迁移时只需要改模型名,不用同时动认证。TaoToken 在这里的作用就是提供统一的 Key 和 API 通道,让你在 Codex、脚本、CI 之间用同一套凭据。
先拿到 Key。访问 https://taotoken.net/api-keys 创建,注意这个页面是 deep link,创建后 Key 只显示一次,复制存好。
然后确认你要用的 Base URL。TaoToken 的 API 入口是:
https://taotoken.net/api注意这里不加任何 UTM 参数,就是干净的 API 地址。文档在 https://taotoken.net/doc 可以查到当前支持的模型名和参数格式。
为什么迁移前要先做这步?因为如果你把认证和模型名耦合在一起改,出问题时你分不清是 Key 失效还是模型名写错。分开之后,排障路径清晰:先确认 Key 能通,再确认模型名对。
具体操作顺序:
- 在 https://taotoken.net/api-keys 创建 Key,存到密码管理器。
- 把 Key 写进环境变量,不要硬编码进代码。比如
export TAOTOKEN_API_KEY="sk-..."。 - 确认 Base URL 是
https://taotoken.net/api。 - 用一条最小请求验证 Key 有效,再开始改 Codex 配置。
这里有个细节:Codex 的配置文件和普通 API 调用的环境变量是两套东西。Codex 读~/.codex/config.toml,你的脚本读环境变量。统一 Key 的意思是这两处用同一个 Key 值,但写法不同。
如果你还想在迁移期间对比不同模型的表现,可以用 https://taotoken.net/models 这个对话入口手动试几个 prompt,感受一下 gpt-5.6-terra 和旧模型的输出差异,再决定要不要全量切。
前置准备做完,你应该有:一个可用的 Key、确认过的 Base URL、以及一份盘点好的模型引用清单。接下来才是改配置。
3. 可复制配置骨架:config.toml 与 settings.json
这一节给你可以直接抄的配置骨架。分两块:Codex 的config.toml,以及通用 API 应用的settings.json。
先说 Codex。旧基线配置长这样,先保留别删:
# 旧默认:保留用于对照,不立即删除 model = "gpt-5.4" model_reasoning_effort = "medium" sandbox_mode = "workspace-write" approval_policy = "on-request"候选配置,把模型名换成官方映射:
# 候选默认:日常任务先评估平衡层级 model = "gpt-5.6-terra" model_reasoning_effort = "medium" sandbox_mode = "workspace-write" approval_policy = "on-request"如果旧配置是gpt-5.4-mini,候选就换成gpt-5.6-luna。注意model_reasoning_effort先保持和旧配置一致,不要一上来就调低,否则你分不清质量变化是模型导致的还是推理强度导致的。
如果你要通过 TaoToken 走统一通道,Codex 侧需要指定 Base URL 和 Key。配置里加上:
# 统一 API 通道 model_provider = "taotoken" [model_providers.taotoken] name = "TaoToken" base_url = "https://taotoken.net/api" env_key = "TAOTOKEN_API_KEY"这里env_key指向环境变量名,不是 Key 本身。Key 放在环境变量里,配置文件可以安全提交。
再说通用 API 应用的settings.json。很多工具用这个格式存配置:
{ "api": { "base_url": "https://taotoken.net/api", "api_key_env": "TAOTOKEN_API_KEY", "default_model": "gpt-5.6-terra", "fallback_model": "gpt-5.6-luna", "timeout_seconds": 60 }, "migration": { "legacy_model": "gpt-5.4", "candidate_model": "gpt-5.6-terra", "shadow_enabled": true } }这个骨架的关键是shadow_enabled。迁移期间你希望新旧模型并行跑,而不是直接切。legacy_model和candidate_model分开写,方便对比。
如果你用 Cline 或类似带 MCP 的工具,配置里要写全三件套:Base URL、Key、Model ID。缺一个就连不上。Base URL 是https://taotoken.net/api,Key 从环境变量读,Model ID 写gpt-5.6-terra。
如果你用 Codex 的auth.json方式认证,结构大致是:
{ "api_key": "从环境变量注入,不要硬编码", "base_url": "https://taotoken.net/api" }同样,实际 Key 不要写进文件,用环境变量注入。
配置改完,先别急着跑全量。下一步是验证一条请求能通。
4. 验证请求:跑通一次迁移后的调用
配置写完,最怕的是"看起来对但跑不通"。这一节给你一条最小验证路径。
先验证 Key 和 Base URL 能通。用 curl 发一条最小请求:
curl https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "gpt-5.6-terra", "messages": [{"role": "user", "content": "reply with ok"}], "max_tokens": 10 }'预期返回一个 JSON,choices[0].message.content里有内容。如果返回 401,说明 Key 有问题;如果返回模型不存在,说明模型名写错或该模型在你的账户下不可见。
然后验证 Codex 侧。在 Codex 里运行/status,确认它显示的模型是gpt-5.6-terra,认证方式是你配置的通道。再跑一个真实任务:
# 记录当前提交,保证可复现 git rev-parse HEAD # 跑项目标准测试 npm test # 检查工作树 git status --short预期得到一份可重复的基线。如果旧基线本身就不稳定,迁移对比没有意义,先修基线。
接着做同任务双跑。保持同一提交、同一提示、同一工具、同一权限、同一超时、同一验收,分别用旧模型和新模型跑一遍。建议用独立工作树保存结果,不要让两次运行写同一目录。
验证代码与工具:
# 聚焦测试验证直接目标 npm test -- target.test.ts # 全量测试验证相邻行为 npm test # 类型检查验证接口契约 npm run typecheck # 检查补丁格式 git diff --check预期输出形态是四项都 passed。这是预期,不是宣称已经在你的项目跑过。
最后记录非功能指标:首次有效修改时间、总运行时间、工具调用次数、重试次数、输入输出用量、人工返工时间、高风险审查问题数、失败恢复表现。不要只记"是否通过",迁移是端到端行为变化。
跑完这一轮,你手里应该有一份新旧对比报告。如果新模型在关键任务上不达标,先别切,分析失败样本。
5. 常见报错排查:401、local proxy failed、reading choices
迁移期间会撞到几类典型报错。这一节按现象、根因、处理来拆。
401 Unauthorized。根因通常是 Key 没注入、Key 过期、或者环境变量名和配置里写的不一致。处理:先echo $TAOTOKEN_API_KEY确认变量有值,再确认配置文件里env_key写的是同一个名字。注意不要在终端里直接打印完整 Key。
local proxy failed / connection refused。根因是 Base URL 写错,或者本地网络到 API 入口不通。处理:确认 Base URL 是https://taotoken.net/api,不要多加路径或斜杠。用 curl 直接打这个地址,排除是工具配置问题还是网络问题。
reading choices 报错 / 返回结构解析失败。根因通常是模型返回了非预期结构,或者你用的 SDK 版本和响应格式不匹配。处理:先把原始响应打出来看,不要直接.choices[0]。确认模型名正确,确认max_tokens没设太小导致截断。
OAuth 相关报错。如果你之前用 ChatGPT 登录态,切到 API Key 后可能残留 OAuth 缓存。处理:清掉旧的认证缓存,重新走 Key 认证。Codex 的认证状态在~/.codex/下,检查有没有残留的旧凭据文件。
模型不存在 / model not found。根因是模型名拼错,或者该模型在你的账户下不可见。处理:对照 https://taotoken.net/doc 确认当前可用模型名,注意gpt-5.6-terra和gpt-5.6-luna不要写混。
CI 与本地结果不同。根因是环境、权限或基线不同。处理:固定版本、提交、变量与工具,把 CI 的环境变量和本地对齐。
回滚后仍异常。根因是缓存、会话或配置覆盖。处理:检查最终生效的配置和会话状态,确认没有多层配置互相覆盖。
排查表可以这样对照:
| 现象 | 根因 | 处理 |
|---|---|---|
| 401 | Key 未注入或名字不一致 | 确认环境变量与配置一致 |
| local proxy failed | Base URL 错误 | 用 curl 直连确认 |
| reading choices | 响应结构不匹配 | 打印原始响应 |
| OAuth 报错 | 旧登录态残留 | 清理认证缓存 |
| 模型不存在 | 模型名错误 | 对照文档确认 |
| CI 与本地不同 | 环境不一致 | 固定版本与变量 |
排障时优先用 curl 打最小请求,把工具层和网络层分开,能省很多时间。
6. 迁移后的持续验证与统一通道收尾
迁移不是改完配置就结束。8 月 31 日之后,你还需要一套持续验证机制,因为模型映射、入口差异和兼容性还会变。
我的做法是保留一份回归样本集,包含:一个日常 Bug 修复、一个跨模块任务、一个工具调用任务、一个长上下文任务、一个结构化输出任务、一个失败后继续迭代任务、一个安全边界检查、一个批量窄任务。每次模型或配置变动,跑一遍这套样本,对比机器检查和人工评分。
差异评分器可以这样写:
from dataclasses import dataclass @dataclass class EvalResult: checks_passed: bool review_score: int rework_minutes: int latency_seconds: float def can_promote(result: EvalResult) -> bool: if not result.checks_passed: return False if result.review_score < 4: return False return result.rework_minutes <= 10阈值按团队风险设,这里只是示意。关键是机器检查和人工评分都要过,才允许晋级。
CI 用双轨而不是直接覆盖:
jobs: baseline: model: gpt-5.4 required: true candidate: model: gpt-5.6-terra required: false compare: needs: [baseline, candidate] action: "生成迁移差异报告,不自动切换生产"这段是流程示意,不是可直接执行的 GitHub Actions 语法,真实 CI 用项目已有的安全封装。
统一通道这块,迁移完成后你应该做到:Codex、脚本、CI 用同一个 Key 和同一个 Base URL,模型名集中在一处配置,改的时候只改一个地方。这样下次再有模型退役,你的迁移成本会低很多。
如果你还在评估要不要长期用统一通道,可以看 https://taotoken.net/coding-plan 了解长期编码场景的配置方式。如果只是先验证模型表现,用 https://taotoken.net/models 手动试几条 prompt 就够了。
最后提醒一句:官方推荐新模型不等于你的系统已验证可迁移。金融、医疗、法律、安全类系统要额外加领域专家复核、灰度流量、在线监控和快速回滚。迁移通过的标准不是"配置改完了",而是"关键任务在新模型上可复现地达标,且能回滚"。
把盘点、基线、双跑、验证、回滚这五步走完,你的 Codex 迁移才算真正稳了。