1. 规划在 ChatGPT 网页版,执行在 Codex:真正断在 Key 与 Base URL
很多开发者的工作流是:在 ChatGPT 网页版里把需求拆成任务树,复制一段计划,然后切到终端让 Codex 按计划改代码。计划本身没问题,一到执行就报401 Unauthorized、model not found或stream disconnected before completion。问题通常不是提示词,而是执行端没有拿到正确的 Key 和 Base URL。如果你准备把这条链路跑通,可以先去 TaoToken 官网(https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=codex_plan_execute)拿一个 Key,把 Base URL 统一成 https://taotoken.net/api。本文不讨论“把网页版变成大脑”的玄学,只给一份可复现对照表:ChatGPT 网页版负责规划,Codex 负责执行,TaoToken 负责在两者之间分 Key、分 Base URL、分 Token 消耗。
这条链路之所以容易断,是因为规划端和执行端天然是两套环境。网页版聊天窗口没有本地文件系统,看不到你的项目结构,也不能直接跑测试;Codex 有本地权限,能读文件、执行命令、提交 diff,但它需要明确的模型供应商配置。很多人把网页版里复制的计划直接丢给 Codex,却忘了 Codex 还在用默认供应商,或者把 Claude Code 的ANTHROPIC_*变量误塞进 Codex 的配置里。结果就是规划很漂亮,执行第一步就失败。
本文按“方案对照型开发者”的视角来写:Token 主要由 Codex 执行端消耗,规划端只产出结构化计划。你要做的第一件事不是调提示词,而是把执行端的 Key、Base URL、模型名三件事固定下来。下面从对照表开始,再给 Codex 的config.toml、Claude Code 的settings.json、CC Switch 三件套和排障清单。所有命令由你在本地终端执行,不涉及生产库直连,也不建议把 Key 写进仓库。
2. 对照表:ChatGPT 网页版规划 vs Codex 执行,职责与 Token 消耗怎么分
先看一张对照表。它的作用不是比较谁更强,而是明确“谁产出什么、谁消耗什么、谁负责什么配置”。很多 401 和 429 的根因,就是规划端和执行端混用了同一个 Key,或者执行端根本没绑定 TaoToken。
| 维度 | ChatGPT 网页版规划 | Codex 执行 | TaoToken 分配建议 |
|---|---|---|---|
| 主要职责 | 拆需求、定边界、写验收标准 | 读文件、改代码、跑命令、给 diff | 提供执行端 Key 与统一 Base URL |
| 输入 | 你的需求描述、项目背景 | plan.md、仓库文件、上下文 | 不参与网页版规划输入 |
| 输出 | 任务列表、约束、禁止项、回滚点 | 代码变更、命令输出、错误日志 | 不产出计划,只做模型调用通道 |
| 文件权限 | 无本地文件权限 | 有本地读写与执行权限 | 不直接接触本地文件 |
| Token 消耗 | 网页版侧消耗,通常不计入 TaoToken | Codex 每次请求消耗 TaoToken Token | 重点监控执行端用量 |
| Key 归属 | 网页版账号 | TaoToken 创建的codex-execKey | 建议单独建 Key,不与其他工具混用 |
| Base URL | 网页版自带 | https://taotoken.net/api | 配置到 Codex 的config.toml |
| 典型失败 | 计划太泛、缺少验收 | 401、404、model not found、流式中断 | 执行端 Key 未加载或模型名错误 |
| 可复现产物 | plan.md | 代码 diff、测试结果、执行日志 | Key 分配表、运行命令 |
这张表的核心结论有三条:
第一,规划端不要替执行端做配置决策。网页版可以写“用 Codex 执行”,但不要在计划里写“把ANTHROPIC_BASE_URL改成某某”。Codex 不吃ANTHROPIC_*,它吃的是config.toml里的model_provider和env_key。
第二,Token 由 Codex 执行端消耗。你在网页版里讨论多久,通常不会消耗 TaoToken 的 Token;真正烧 Token 的是 Codex 读取文件、携带上下文、反复试错、跑命令后继续对话的过程。所以 Key 分配要围绕执行端做隔离。
第三,规划与执行之间需要一个稳定契约:plan.md。网页版输出计划,Codex 读取计划,TaoToken 提供执行端模型通道。三者解耦后,排障会简单很多。
如果你还没有执行端 Key,可以先打开 TaoToken 官网(https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=codex_key_split)注册并进入控制台。注意不要在正文里找“万能 Key”,Key 必须自己创建并保存。
3. TaoToken 取 Key 与 Base URL:执行端三件套先固定
在配置 Codex 之前,先把执行端三件套固定下来:Key、Base URL、模型名。顺序不要反。很多人先装 Codex,再到处找 Key,最后把配置改乱。
第一步,进入 TaoToken 官网并登录。入口建议直接用带 UTM 的链接,方便后续排查来源:
https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=codex_exec_setup
第二步,进入 API Keys 页面创建 Key。建议命名为codex-exec,用途写“Codex 本地执行”。不要把同一个 Key 同时给 Codex、Claude Code 和网页对话使用,后面排障时你无法判断是谁在消耗。
创建入口:
https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=codex_exec_setup
第三步,记录 Base URL。工具配置里统一填:
https://taotoken.net/api注意这里不加 UTM 参数。UTM 只用于网页入口统计,不要写进config.toml或settings.json,否则可能出现路径拼接错误。
第四步,在本地 shell 里设置环境变量。Codex 的config.toml通过env_key读取变量,不要把 Key 硬编码进配置文件。macOS / Linux 可以这样:
export TAOTOKEN_API_KEY="YOUR_API_KEY" export TAOTOKEN_BASE_URL="https://taotoken.net/api"Windows PowerShell:
$env:TAOTOKEN_API_KEY="YOUR_API_KEY" $env:TAOTOKEN_BASE_URL="https://taotoken.net/api"如果你使用.env文件,不要提交到 Git。可以在.gitignore里加入:
.env .env.local *.key到这里,执行端三件套是:
| 项目 | 值 | 写在哪 |
|---|---|---|
| API Key | YOUR_API_KEY | 环境变量TAOTOKEN_API_KEY |
| Base URL | https://taotoken.net/api | ~/.codex/config.toml |
| 模型名 | 以控制台可用列表为准 | ~/.codex/config.toml的model |
模型名不要凭记忆写。先在 TaoToken 控制台或模型对话页确认当前 Key 可用的模型。模型名写错时,Codex 常见报错是model not found或400 Bad Request,而不是 401。
如果你还想在网页对话里做规划,可以另外创建一个plan-chatKey,并进入模型对话页:
https://taotoken.net/models/detail/chat?utm_source=taotoken_aicg_blog_end&utm_content=codex_exec_setup
但记住本文的主线:规划可以发生在网页版,Token 主要消耗在 Codex 执行端。执行端 Key 单独建,后续看用量才清楚。
4. Codex 执行端配置:config.toml 可复制示例与运行命令
Codex CLI 使用config.toml管理模型供应商,不是settings.json,也不是ANTHROPIC_*环境变量。配置文件通常位于:
~/.codex/config.toml如果目录不存在,先创建:
mkdir -p ~/.codex然后写入以下配置。下面是一个可复制的起点:
model = "gpt-5-codex" model_provider = "taotoken" [model_providers.taotoken] name = "TaoToken" base_url = "https://taotoken.net/api" env_key = "TAOTOKEN_API_KEY" wire_api = "responses"如果你的 Codex 版本或模型要求使用 chat 兼容接口,可以把wire_api改为:
wire_api = "chat"注意base_url就是https://taotoken.net/api,不要自行加/v1或/chat/completions。不同工具对路径拼接方式不同,多写一段路径经常导致 404。env_key写的是环境变量名,不是 Key 本身。你可以在 shell 里验证变量是否生效:
echo $TAOTOKEN_API_KEY如果输出为空,后面的 Codex 一定会 401。此时不要改模型,先解决环境变量加载问题。可以把 export 写进~/.zshrc或~/.bashrc,然后重新打开终端:
echo 'export TAOTOKEN_API_KEY="YOUR_API_KEY"' >> ~/.zshrc source ~/.zshrc配置完成后,先用一个最小交互命令验证通道:
codex --model gpt-5-codex "只回答 OK,不要改文件"如果返回OK,说明 Key、Base URL、模型名三者已经打通。接下来再让它读计划。建议把网页版产出的计划保存为plan.md,放在项目根目录。执行命令可以这样写:
codex --model gpt-5-codex "读取 plan.md,只执行 T1 和 T2,完成后输出修改文件列表和验证命令"如果你使用非交互模式,可以尝试:
codex exec --model gpt-5-codex --full-auto "读取 plan.md,执行 T1-T3,运行测试,并输出 diff 摘要"注意--full-auto会让 Codex 更自动地执行本地命令。建议先在干净分支或容器里试,不要直接在主分支上跑大范围重构。更稳妥的方式是让它先输出计划:
codex exec --model gpt-5-codex "读取 plan.md,不要修改文件,先列出你打算执行的任务和涉及文件"确认无误后,再执行:
codex exec --model gpt-5-codex "按上一步确认的任务执行 T1,修改后运行对应测试"这里再强调一次:Codex 的配置在config.toml,不要写成:
# 错误示例:Codex 不使用 ANTHROPIC_* 变量 ANTHROPIC_BASE_URL = "https://taotoken.net/api" ANTHROPIC_AUTH_TOKEN = "YOUR_API_KEY"这类配置属于 Claude Code,不属于 Codex。混用会导致变量读取失败或请求发到错误端点。第 6 节会给出 Claude Code 的正确写法。
如果你还没有创建codex-execKey,可以回到 TaoToken 控制台:
https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=codex_config_toml
创建后把YOUR_API_KEY替换成真实 Key,并只放在环境变量里。
5. 规划端提示词模板:让 ChatGPT 网页版输出 Codex 能吃的计划
执行端打通后,规划端要输出“Codex 能执行”的计划,而不是一段聊天总结。推荐你在 ChatGPT 网页版里使用下面的模板,产出的 Markdown 直接保存为plan.md。
# 执行计划:重构配置加载模块 ## 目标 将 config 解析逻辑从 main.py 拆到 config_loader.py,保持现有行为。 ## 约束 - 不新增第三方依赖。 - 保持公开函数签名不变。 - 所有新增函数必须有类型标注。 ## 任务 - [ ] T1:创建 config_loader.py,迁移 parse_config 函数。 - [ ] T2:在 main.py 中改为从 config_loader 导入。 - [ ] T3:补充 tests/test_config_loader.py,覆盖空文件、缺字段、正常配置。 - [ ] T4:运行 pytest,输出结果。 ## 涉及文件 - main.py - config_loader.py - tests/test_config_loader.py ## 验收标准 - pytest 全绿。 - main.py 中不再保留重复解析逻辑。 - 函数签名与迁移前一致。 ## 禁止项 - 不修改 CI 配置。 - 不升级依赖版本。 - 不删除现有测试。 ## 回滚点 - 执行前创建分支:refactor/config-loader - 若测试失败,回退到执行前 commit。这份模板的关键是“任务可勾选、文件明确、验收可执行、禁止项清楚”。不要把大段代码塞进计划里,网页版写代码越细,Codex 越容易偏离。让它执行本地文件证据,效果更稳。
规划端写完后,你可以把plan.md提交到分支,然后让 Codex 分步执行。典型工作流:
git checkout -b refactor/config-loader codex exec --model gpt-5-codex "读取 plan.md,执行 T1,不要动其他文件" git diff codex exec --model gpt-5-codex "读取 plan.md,执行 T2,运行相关测试" git diff codex exec --model gpt-5-codex "读取 plan.md,执行 T3 和 T4,输出测试摘要"每步都让 Codex 输出 diff 摘要,而不是一次性跑完。这样出问题时容易定位是规划问题还是执行问题。规划问题表现为任务描述含糊、验收标准缺失;执行问题表现为 401、404、模型不匹配、命令权限不足。
如果你希望把规划也放到 TaoToken 的模型对话里,可以另外使用一个plan-chatKey,不要复用codex-exec。入口:
https://taotoken.net/models/detail/chat?utm_source=taotoken_aicg_blog_end&utm_content=plan_template
6. Claude Code 与 CC Switch 三件套:不要串到 Codex 的配置
很多团队同时使用 Codex 和 Claude Code。两者配置方式不同,最容易犯的错是把 Claude Code 的ANTHROPIC_*写进 Codex,或者把 Codex 的config.toml塞给 Claude Code。这里分开写。
Claude Code 使用settings.json,常见位置:
~/.claude/settings.json一个可复制的配置片段如下:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_AUTH_TOKEN": "YOUR_API_KEY", "ANTHROPIC_MODEL": "claude-sonnet-4-5" } }注意ANTHROPIC_AUTH_TOKEN使用你的 TaoToken Key,ANTHROPIC_BASE_URL使用https://taotoken.net/api。模型名以控制台可用列表为准。Claude Code 文档入口:
https://taotoken.net/doc/ClaudeCodeAnthropic?utm_source=taotoken_aicg_blog_end&utm_content=cc_switch
CC Switch 三件套可以理解为切换供应商时要同步检查的三处:Provider、API Key、Model。三处必须指向同一套 TaoToken 配置,否则会出现“Key 是 A 家的,Base URL 是 B 家的,模型名是 C 家的”这种串台问题。
| 三件套 | Claude Code 对应项 | Codex 对应项 | 检查命令 |
|---|---|---|---|
| Provider | ANTHROPIC_BASE_URL | [model_providers.taotoken] | cat ~/.claude/settings.json |
| Key | ANTHROPIC_AUTH_TOKEN | env_key = "TAOTOKEN_API_KEY" | echo $TAOTOKEN_API_KEY |
| Model | ANTHROPIC_MODEL | model = "gpt-5-codex" | 控制台模型列表 |
使用 CC Switch 时,每次切换后建议做三步验证:
# 1. 检查 Claude Code 配置 cat ~/.claude/settings.json # 2. 检查 Codex 配置 cat ~/.codex/config.toml # 3. 检查环境变量是否为空 printenv TAOTOKEN_API_KEY如果 Claude Code 正常、Codex 报 401,优先怀疑 Codex 的env_key没有对应环境变量。如果 Codex 正常、Claude Code 报错,优先怀疑ANTHROPIC_AUTH_TOKEN没有更新。不要把两边的 Key 混用,建议在 TaoToken 控制台创建不同的 Key:
codex-exec:给 Codex 执行端。claude-code-review:给 Claude Code 审查端。plan-chat:给网页对话规划端。
创建入口:
https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=cc_switch
7. 排障清单:401、404、model not found、流式中断分别怎么查
执行端报错时,不要先改提示词。按下面顺序查,通常几分钟能定位。
| 现象 | 高概率根因 | 检查动作 | 修复方式 |
|---|---|---|---|
401 Unauthorized | Key 未加载或写错 | echo $TAOTOKEN_API_KEY | 重新 export,或检查env_key名称 |
404 Not Found | Base URL 多写路径 | 检查config.toml的base_url | 改为https://taotoken.net/api |
model not found | 模型名错误或未开通 | 查看 TaoToken 控制台模型列表 | 换成当前 Key 可用模型 |
stream disconnected | 网络超时、上下文过长 | 缩短任务、减少文件输入 | 拆分任务,重试单步 |
429 Too Many Requests | 并发过高或额度不足 | 查看控制台用量 | 降低并发,检查 Key 用量 |
| Codex 改了不该改的文件 | 计划约束不清 | 查看plan.md禁止项 | 增加“只允许修改”列表 |
| Claude Code 正常、Codex 失败 | 混用ANTHROPIC_* | 检查config.toml | Codex 只认 TOML 配置 |
| Codex 正常、Claude Code 失败 | settings.json未更新 | 检查ANTHROPIC_AUTH_TOKEN | 换成 Claude Code 专用 Key |
几个具体案例。
案例一:终端里echo $TAOTOKEN_API_KEY有值,但 Codex 还是 401。检查config.toml里写的是env_key = "TAOTOKEN_API_KEY",而不是env_key = "TAOTOKEN_API_KEY_VALUE"。env_key填的是变量名,不是变量值。
案例二:Base URL 写成https://taotoken.net/api/v1,Codex 报 404。按本文给的工具配置,Base URL 用https://taotoken.net/api。不要自己拼端点。
案例三:模型名从网页版复制过来,但 Codex 报model not found。网页版可用模型和 Codex 可用模型不一定完全同名。以 TaoToken 控制台或模型列表为准,不要凭记忆写。
案例四:Codex 执行到一半流式中断。先看是不是一次让它读了太多文件。把plan.md拆成 T1、T2、T3,每次只执行一个任务,并在命令里加上“只修改这些文件”。
案例五:团队里有人把 Key 提交到了 Git。立刻去 TaoToken 控制台删除该 Key,重新创建,并检查 Git 历史。不要把 Key 写进config.toml的env_key字段,也不要把.env提交。
排障时有一个原则:先验证最小请求。用 Codex 发一句“只回答 OK,不要改文件”。如果这都失败,问题一定在 Key、Base URL 或模型名,不在你的计划。最小请求通过后,再逐步增加任务复杂度。
8. 可复现产出:对照表、Key 分配说明、Codex 运行命令
把本文的可复现产出整理成三份文件,放到项目docs/ai-workflow/下,团队协作会清楚很多。
第一份:plan-vs-exec.md,规划与执行对照表。
# 规划与执行对照表 | 阶段 | 工具 | 输入 | 输出 | Token 消耗方 | | --- | --- | --- | --- | --- | | 规划 | ChatGPT 网页版 | 需求描述 | plan.md | 网页版侧 | | 执行 | Codex + TaoToken | plan.md | 代码 diff、测试结果 | TaoToken codex-exec Key | | 审查 | Claude Code + TaoToken | diff | 审查意见 | TaoToken claude-code-review Key | ## 约定 - 规划端不写具体代码,只写任务、文件、验收、禁止项。 - 执行端使用 config.toml,不使用 ANTHROPIC_*。 - 每个任务单独执行,单独看 diff。第二份:key-allocation.md,Key 分配说明。
# TaoToken Key 分配说明 | Key 名称 | 用途 | 绑定工具 | 环境变量 | 是否消耗 Token | | --- | --- | --- | --- | --- | | codex-exec | 本地代码执行 | Codex CLI | TAOTOKEN_API_KEY | 是 | | claude-code-review | 代码审查 | Claude Code | ANTHROPIC_AUTH_TOKEN | 是 | | plan-chat | 网页规划 | 模型对话 | 浏览器会话 | 视使用情况 | ## 规则 - 一个工具一个 Key,不交叉复用。 - Key 只放在环境变量或本地 settings,不进 Git。 - Base URL 统一为 https://taotoken.net/api。第三份:codex-runbook.md,Codex 运行命令。
# 1. 设置环境变量 export TAOTOKEN_API_KEY="YOUR_API_KEY" # 2. 验证最小请求 codex --model gpt-5-codex "只回答 OK,不要改文件" # 3. 读取计划,先不修改 codex exec --model gpt-5-codex "读取 plan.md,列出执行步骤和涉及文件,不要修改" # 4. 执行单个任务 codex exec --model gpt-5-codex "读取 plan.md,执行 T1,只修改 config_loader.py" # 5. 查看差异 git diff # 6. 执行测试任务 codex exec --model gpt-5-codex "读取 plan.md,执行 T4,运行 pytest 并输出摘要"~/.codex/config.toml最终形态:
model = "gpt-5-codex" model_provider = "taotoken" [model_providers.taotoken] name = "TaoToken" base_url = "https://taotoken.net/api" env_key = "TAOTOKEN_API_KEY" wire_api = "responses"如果你同时使用 Claude Code,~/.claude/settings.json最终形态:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_AUTH_TOKEN": "YOUR_API_KEY", "ANTHROPIC_MODEL": "claude-sonnet-4-5" } }这两份配置不要互相复制。Codex 用 TOML,Claude Code 用 JSON;Codex 读env_key,Claude Code 读ANTHROPIC_AUTH_TOKEN。CC Switch 三件套检查时,也要分别检查。
最后,把“规划”和“执行”拆成两个提交节奏:
- 网页版产出
plan.md,提交到分支。 - Codex 执行 T1,提交一次,运行测试。
- Codex 执行 T2,提交一次,运行测试。
- Claude Code 审查 diff,输出意见。
- 人工确认后合并。
这样即使某一步失败,你也能清楚看到是计划问题、配置问题还是代码问题。Token 消耗也集中在 Codex 执行端,便于在 TaoToken 控制台按 Key 查看用量。
如果你准备把这套流程落地,建议按下面路径操作:先在模型对话里整理规划模板,再选择 Coding Plan,然后创建专用 Key,最后对照 Claude Code 文档配置审查端。模型对话入口:
https://taotoken.net/models/detail/chat?utm_source=taotoken_aicg_blog_end&utm_content=workflow_cta
Coding Plan 入口:
https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=workflow_cta
创建 API Key 入口:
https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=workflow_cta
Claude Code 文档入口:
https://taotoken.net/doc/ClaudeCodeAnthropic?utm_source=taotoken_aicg_blog_end&utm_content=workflow_cta
回到最初的问题:ChatGPT 网页版负责规划,Codex 负责执行,TaoToken 负责把执行端的 Key、Base URL、模型名固定下来。真正需要分清楚的不是“哪个模型更聪明”,而是“哪个工具读哪份配置、哪个 Key 消耗哪部分 Token”。把config.toml和settings.json分开,把codex-exec、claude-code-review、plan-chat分开,把最小请求验证放在最前面,这条“网页规划 + 本地执行”的链路就能稳定跑起来。