1. 为什么复杂代码库里的 Agent 总在返工
如果你同时用 Codex 和 Claude Code 写代码,大概率遇到过这种场景:新项目里它们像开了挂,一个下午能搭出完整页面;可一旦切到公司那套跑了七八年的老系统,Agent 就开始失忆、幻觉、重复造轮子,改完的代码还得你手动回滚。Dex Horthy 在「No Vibes Allowed」里把这个问题讲得很透——不是模型不会写,而是上下文一团乱。
他提到一个很扎心的数据:AI 让团队交付了更多代码,但相当一部分工作是在重做前一周交付的低质量内容,也就是 slop。根因在于 LLM 是无状态的,它每一步决策完全依赖当前对话里已有的内容。上下文里塞满了搜索记录、构建输出、错误尝试和 MCP 返回的大段 JSON,模型定位关键事实的难度就会飙升。Dex 的经验判断是,某些复杂任务上下文用到约 40% 时就开始边际收益递减,不是等窗口耗尽才变笨。
所以上下文工程的核心就一句话:优化输入的 token,让正确输出的概率更高。他给了四个维度——正确性、完整性、大小、轨迹。这四点不可能同时满足,正确又完整时上下文必然长,于是要有意压缩、用子代理隔离高消耗搜索、把工作流拆成 Research → Plan → Implement。
但这里有个工程落地问题:Codex 和 Claude Code 是两套配置体系,一个吃config.toml,一个吃settings.json。如果你两边各配一个 Key、各走一条通道,排查问题时根本分不清是上下文策略失效还是通道本身在抽风。我试过把两个工具统一到同一个 API 通道上,配置骨架其实不复杂,下面直接给可复制的版本。
2. TaoToken 前置:统一 Key 与通道准备
TaoToken 在这里扮演的角色是「统一入口」——你不需要为 Codex 和 Claude Code 分别维护不同的 Key 和 Base URL,而是让两个工具都指向同一个 API 通道。这样做的好处很直接:上下文工程的调试变量少了一个,出问题时你能确定是 prompt/压缩策略的问题,而不是某个工具偷偷走了另一条链路。
先做三件事:
第一,拿到 API Key。访问控制台创建,地址是https://taotoken.net/console,创建完在 API Keys 页面复制,格式通常是一串sk-开头的字符串。这个 Key 两个工具共用。
第二,确认 API 基地址。TaoToken 的 API 入口是https://taotoken.net/api,注意这里不加任何 UTM 参数,配置里写干净地址就行。
第三,想清楚你要走哪种接入方式。如果你只是想让两个 CLI 工具对话和补全走同一通道,用 API Key 直连即可;如果你要长期跑编码 Agent、做多轮 Research-Plan-Implement,建议看一下 Coding Plan,它对长上下文和连续调用更友好,入口在https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite。
注意:Key 只创建一次,两个工具共用同一个。不要为了「隔离」给每个工具建不同 Key,那样反而增加排查成本。
模型选择上,Codex 侧通常用gpt-5系列或你账号可用的编码模型,Claude Code 侧用claude-sonnet-4-5这类。具体可用模型以你控制台里列出的为准,不要照抄别人的模型名,账号权限不同会报 404。
3. 可复制配置:settings.json 与 config.toml 骨架
这一节是全文重点。两个工具的配置文件位置和字段名完全不同,我分别给骨架,你按自己的系统改路径。
3.1 Claude Code 的 settings.json
Claude Code 读取的配置一般在~/.claude/settings.json(macOS/Linux)或%USERPROFILE%\.claude\settings.json(Windows)。核心是让它的 Anthropic 兼容通道指向 TaoToken。
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_AUTH_TOKEN": "sk-你的TaoToken密钥", "ANTHROPIC_MODEL": "claude-sonnet-4-5", "ANTHROPIC_SMALL_FAST_MODEL": "claude-haiku-4-5" }, "permissions": { "allow": [ "Read", "Edit", "Bash(git status)", "Bash(git diff:*)" ] } }几个字段说明:ANTHROPIC_BASE_URL指向 TaoToken 的 API 根路径,不要带/v1后缀,Claude Code 会自己拼;ANTHROPIC_AUTH_TOKEN填你复制的 Key;ANTHROPIC_MODEL是主模型,ANTHROPIC_SMALL_FAST_MODEL用于后台小任务,比如生成 commit message,配一个便宜快速的能省不少 token。
permissions.allow这块和上下文工程直接相关。Dex 强调子代理和压缩,但如果你让 Agent 无限制地跑Bash,它会把大量命令输出灌进上下文。我建议初期只放行只读命令和 git 查看类,写操作和测试命令按需临时开。
3.2 Codex 的 config.toml
Codex CLI 的配置在~/.codex/config.toml。它用的是 TOML 格式,字段名和 Claude Code 不一样,别混用。
model = "gpt-5" model_provider = "taotoken" [model_providers.taotoken] name = "TaoToken" base_url = "https://taotoken.net/api" env_key = "TAOTOKEN_API_KEY" wire_api = "chat" [profiles.default] model = "gpt-5" model_provider = "taotoken" approval_policy = "on-request"这里env_key指定的是环境变量名,不是 Key 本身。你需要先在 shell 里导出:
export TAOTOKEN_API_KEY="sk-你的TaoToken密钥"Windows PowerShell 用:
$env:TAOTOKEN_API_KEY="sk-你的TaoToken密钥"wire_api = "chat"表示走 Chat Completions 兼容格式。如果你的账号和模型支持 Responses API,可以改成对应值,但先用chat跑通最稳。approval_policy = "on-request"让 Codex 在执行敏感操作前问你,避免它一口气跑一堆命令把上下文冲爆。
3.3 两个配置的对照
| 项目 | Claude Code | Codex |
|---|---|---|
| 配置文件 | ~/.claude/settings.json | ~/.codex/config.toml |
| 基地址字段 | ANTHROPIC_BASE_URL | base_url |
| Key 字段 | ANTHROPIC_AUTH_TOKEN | env_key(指向环境变量) |
| 模型字段 | ANTHROPIC_MODEL | model |
| 格式 | JSON | TOML |
配完之后,两个工具走的是同一个https://taotoken.net/api通道,Key 也是同一个。这样你在做上下文压缩实验时,变量就只剩 prompt 和压缩策略本身。
4. 验证请求:确认两个工具走同一通道
配置写完不能直接信,要验证。分两步:先验证 Key 和通道本身通,再验证两个工具各自能跑。
4.1 用 curl 验证通道
先确认 Key 有效、基地址可达。Claude Code 走的是 Anthropic 兼容格式,用下面这条:
curl -s https://taotoken.net/api/v1/messages \ -H "x-api-key: sk-你的TaoToken密钥" \ -H "anthropic-version: 2023-06-01" \ -H "content-type: application/json" \ -d '{ "model": "claude-sonnet-4-5", "max_tokens": 64, "messages": [ {"role": "user", "content": "只回复两个字:通了"} ] }'如果返回 JSON 里content数组有文本内容,说明通道和 Key 都没问题。如果返回 401,检查 Key 有没有复制全;返回 404,检查模型名是不是你账号可用的。
Codex 侧走 Chat Completions 格式,用这条:
curl -s https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer sk-你的TaoToken密钥" \ -H "content-type: application/json" \ -d '{ "model": "gpt-5", "max_tokens": 64, "messages": [ {"role": "user", "content": "只回复两个字:通了"} ] }'两条都返回正常内容,说明同一个 Key 在两种协议下都能用。
4.2 在工具里验证
Claude Code 里直接跑:
claude -p "用一句话说明当前工作目录是什么项目"-p是非交互模式,适合脚本化验证。如果它正常返回,说明settings.json生效了。
Codex 里跑:
codex exec "用一句话说明当前工作目录是什么项目"codex exec是非交互执行子命令。两个工具都能返回合理结果,就证明它们确实走了同一通道。
4.3 验证上下文工程是否生效
通道通了只是第一步。真正要验证的是 Dex 那套方法有没有落地。你可以做一个对照实验:给两个工具同一个复杂任务,比如「找出这个仓库里用户登录后 token 刷新的调用链,不要改代码,只输出关键文件和行号」。
观察两点:一是它有没有先搜索再回答,还是直接猜;二是它的输出是不是高密度的结论,而不是把整个文件内容贴回来。如果它把大段代码原样返回,说明你的上下文没有被有效压缩,这时候就该上子代理或手动压缩了。
5. 本篇常见错排查
配置和验证过程中,下面这几个坑我踩过,你大概率也会遇到。
401 或 invalid api key:最常见的是 Key 复制时带了空格或换行。另外 Codex 的env_key是指环境变量名,如果你把 Key 直接写进config.toml的env_key字段,它会当成变量名去找,自然找不到。正确做法是env_key = "TAOTOKEN_API_KEY",然后 shell 里导出真实 Key。
404 model not found:模型名写错,或者你的账号没有该模型权限。不要照抄网上的模型名,去控制台看可用列表。Claude Code 和 Codex 的模型名体系不同,别把claude-sonnet-4-5填到 Codex 的model字段里。
Claude Code 报 base_url 相关错误:检查ANTHROPIC_BASE_URL是不是多写了/v1。Claude Code 会自己在后面拼/v1/messages,你写https://taotoken.net/api就行,写成https://taotoken.net/api/v1会变成/api/v1/v1/messages。
Codex 一直卡在 approval:approval_policy设成了on-request或untrusted,而当前操作需要确认。交互模式下按提示确认即可;脚本里跑可以临时改成never,但生产环境不建议。
两个工具行为不一致:先确认它们真的走了同一通道。分别在两个工具里让它输出当前使用的模型名和 base url(如果工具支持),或者看请求日志。如果 Claude Code 走了 TaoToken 而 Codex 还在走默认通道,那就是config.toml没生效,检查文件路径和 TOML 语法。
上下文还是很快爆:这不是通道问题,是上下文策略问题。检查你是不是放行了太多Bash命令,或者装了太多 MCP 工具。Dex 说得很清楚,不能转化为有效决策的信息只是在消耗上下文预算。把 MCP 工具砍到只剩必要的,Bash 只放行只读命令。
提示:排查时优先用 curl 验证通道,再验证工具配置。通道不通,改工具配置是白费功夫。
6. 把统一通道接进你的上下文工程工作流
通道打通之后,Dex 那套方法论才真正可操作。你可以这样落地:
Research 阶段,让 Codex 或 Claude Code 在独立会话里做搜索和阅读,只输出一份研究文档,包含关键文件、行号、代码流和已确认事实。这一步会产生大量上下文,所以做完就压缩,不要带着搜索记录进入 Plan。
Plan 阶段,新开一个会话,把研究文档喂进去,让它列出准确步骤。这一步上下文应该很短,只有研究结论和计划本身。
Implement 阶段,再新开一个会话,带上研究结论和计划,聚焦代码修改。每个阶段切换都是一次有意压缩。
如果你要长期跑这套流程,尤其是多轮 Research-Plan-Implement 循环,建议用 Coding Plan,它对连续调用和长上下文的支持更稳,入口在https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite。只是想验证模型对话和通道是否正常,用模型对话页面就行:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=model_chat&utm_campaign=rewrite。接入文档在https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite,API Keys 管理在https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite。
最后说一个我自己的习惯:每次开新会话前,先问自己一句「这个会话里有哪些信息是下一个阶段不需要的」。想清楚再开,比开了之后靠压缩补救要省事得多。上下文工程不是配完 Key 就结束,它是一整套关于「什么时候该丢、什么时候该留」的判断。统一通道只是让你在做这些判断时,少一个干扰变量。