1. 为什么你的 codex 每次都要重新交代一遍规矩
用 codex 写代码,最让人抓狂的不是它不会写,而是它每次都像新来的实习生:你刚说完“别动 migrations 目录”,下一个 thread 它又去改了;你反复强调“改完先跑 pytest”,它还是直接给你一段 diff 就完事。问题不在模型笨,而在于你把长期规则塞进了每次的 prompt 里,而 prompt 是易失的。
我试过把同一套要求复制粘贴十几遍之后才想明白:codex 真正好用的姿势,是把它当成一个可配置的工程搭子,分四层来管。当前任务写进 prompt,长期规则沉淀到 AGENTS.md,重复流程封装成 skill,外部信息和并行验证交给 MCP 与 subagents。这篇就聚焦前三层,再叠一个统一的 Key/API 通道骨架,让你换项目时不用重配一遍。
具体要落地的东西有三样:一份可复制的 AGENTS.md、一个能跑的 skill、一份 config.toml 骨架。骨架里把模型通道指向 TaoToken 的统一入口,这样你在 codex、脚本、其他 CLI 工具之间共用一套 Key,不用每个工具单独维护一份配置。下面按“先讲清楚问题 → 再给配置 → 再验证 → 再排错”的顺序走,你可以直接抄。
2. 先把 TaoToken 的 Key 和通道准备好
codex 本身是个客户端,它需要一个能对话的模型通道。TaoToken 在这里扮演的角色就是统一入口:一个 Key、一个 base_url,codex 和你的脚本都指向它,省得每个工具配一遍。这一步只做两件事,拿 Key、记下地址。
打开官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,注册后在控制台里创建 API Key。控制台地址是 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,Key 列表在 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。创建时给它起个能认出来的名字,比如codex-dev,方便以后按项目吊销。
注意:Key 只在创建时完整显示一次,复制后立刻存进环境变量或密钥管理工具,别直接写进会提交到 git 的文件里。
API 的基础地址是https://taotoken.net/api,这个不带任何跟踪参数,配置里就填它。模型名以控制台里当前可用的为准,别照抄别人的旧列表。如果你只是想先验证通道通不通,可以先用模型对话页面 https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 发一条消息,确认 Key 有效再往 codex 里接。
把 Key 放进环境变量,这是后面所有配置能复用的前提:
export TAOTOKEN_API_KEY="sk-你的key"Windows PowerShell 用$env:TAOTOKEN_API_KEY="sk-你的key",想持久化就写进系统环境变量。这一步做完,config.toml 里就不用硬编码密钥了。
3. 可复制的 AGENTS.md 与 config.toml 骨架
3.1 AGENTS.md 放什么、不放什么
AGENTS.md 是仓库级的长期规则,codex 在项目里工作时会读它。判断标准很简单:如果这句话你每次都要说,就放 AGENTS.md;如果这是一套完整流程,做成 skill。它适合放仓库结构、运行方式、build/test/lint 命令、禁区、以及“什么算完成”的定义。
在项目根目录建AGENTS.md,下面这份可以直接改:
# AGENTS.md ## 项目结构 - src/ 业务代码 - tests/ 测试,改动必须同步 - migrations/ 数据库迁移,禁止手改 - scripts/ 确定性脚本,机械活放这里 ## 常用命令 - 安装依赖: make install - 跑测试: make test - 格式化: make fmt - 类型检查: make typecheck ## 硬性约束 - 不要修改 migrations/ 下的任何文件 - 不要引入新的第三方依赖,除非先说明理由 - 所有公开函数必须有类型标注 - 提交前必须通过 make fmt 和 make test ## 完成标准 - 改动后自行运行 make fmt、make test、make typecheck - 自查 diff,确认没有无关改动 - 输出一段简短说明:改了什么、为什么、怎么验证的这份文件的价值在于“始终生效”。你不再需要在每个 thread 开头重复“别改 migrations”,codex 进项目就会读到。规则要短、要可执行,别写成一篇架构文档,否则它抓不住重点。
3.2 config.toml 骨架:把通道指向 TaoToken
codex 的配置放在~/.codex/config.toml(Windows 是%USERPROFILE%\.codex\config.toml)。下面这份骨架把模型通道指向 TaoToken,Key 从环境变量读:
# ~/.codex/config.toml # 默认模型通道 model_provider = "taotoken" model = "你的模型名" [model_providers.taotoken] name = "TaoToken" base_url = "https://taotoken.net/api" env_key = "TAOTOKEN_API_KEY" wire_api = "chat" # 项目级规则文件,codex 会自动读取仓库根目录的 AGENTS.md # 这里显式声明,避免不同版本行为差异 project_doc = "AGENTS.md"几个参数说明一下。base_url填https://taotoken.net/api,不要带路径后缀。env_key指定从哪个环境变量读 Key,这样配置文件可以安全地提交或分享。wire_api按你所用客户端版本支持的协议填,常见是chat,如果报协议不匹配就换成对应值。model填控制台里确认可用的名字。
注意:不同版本的 codex 对配置字段命名可能有差异,如果启动时报未知字段,先看它提示的合法字段名,再对照调整,别硬套。
3.3 一个 skill 的目录结构
skill 用来封装“会反复出现的工作流”。存放位置优先放仓库里的.agents/skills/,这样团队和项目都能复用。一个 skill 一个窄任务,目录长这样:
.agents/ skills/ code-change-verification/ SKILL.md scripts/ verify.shSKILL.md里的 description 不是介绍文案,而是路由条件,要写清“做什么 + 什么时候触发”。内容如下:
--- name: code-change-verification description: 当代码改动完成后,运行格式化、lint、类型检查和测试,并汇总结果。适用于任何修改了 src/ 或 tests/ 的任务收尾阶段。 --- # 代码改动验证 ## 触发条件 - 用户要求“验证改动”或“跑一遍检查” - 一次代码修改完成,准备收尾 ## 步骤 1. 运行 scripts/verify.sh 2. 如果失败,定位到具体文件与行号 3. 修复后重新运行,直到全部通过 4. 输出:通过项、失败项、修复说明 ## 输出格式 - 检查项列表与结果 - 若有失败,给出最小修复建议配套的scripts/verify.sh把机械活固定下来,让脚本做确定性的事,模型只负责判断和解释:
#!/usr/bin/env bash set -e echo "== fmt ==" make fmt echo "== typecheck ==" make typecheck echo "== test ==" make test echo "全部检查通过"给它执行权限:chmod +x .agents/skills/code-change-verification/scripts/verify.sh。这样一套流程就被固化下来,下次不用再口述。
4. 验证一次 skill 调用与请求是否真的通了
配置写完不验证等于没写。分两步,先验证通道,再验证 skill。
4.1 验证 TaoToken 通道
先用一条最小请求确认 Key 和 base_url 没问题:
curl https://taotoken.net/api/chat/completions \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "你的模型名", "messages": [{"role": "user", "content": "只回复 ok"}] }'返回里能看到choices字段和内容,就说明通道通了。如果返回 401,是 Key 问题;返回 404,多半是 base_url 多写了路径;返回模型不存在,就是model名字和控制台对不上。
4.2 验证 skill 被正确加载
在项目里启动 codex,先看它有没有识别到 skill。显式调用最稳:直接输入$code-change-verification点名这个 skill。如果你的版本支持/skills,也可以用斜杠命令列出当前可用技能。隐式调用则依赖 description,你只要说“改完了,帮我验证一下”,它应该能路由过去。
调用后观察两件事:一是它有没有真的去执行scripts/verify.sh,二是输出里有没有按 SKILL.md 约定的格式给出通过项和失败项。如果它只是嘴上说“建议你跑测试”却没动手,说明 skill 没被触发,回到 description 检查触发条件写得够不够明确。
4.3 一次完整的改-测-审流程
把三层串起来跑一遍:在 codex 里提一个真实小改动,比如给某个函数补类型标注。它会读 AGENTS.md 知道要跑make fmt和make test,收尾时你点名 skill,它执行 verify.sh 并汇总。整个过程你只说了一次需求,规则和流程都来自配置。这就是“可复用骨架”的意义——换项目时复制 AGENTS.md 和.agents/skills/,改一下 config.toml 的模型名,就能接着用。
5. 本篇常见报错排查
5.1 401 Unauthorized
最常见。先确认环境变量在当前 shell 里真的存在:echo $TAOTOKEN_API_KEY。如果为空,说明 export 只在另一个终端生效,或者写进了没被加载的配置文件。config.toml 里的env_key名字要和实际环境变量名完全一致,大小写敏感。
5.2 404 或路径错误
多半是base_url写成了https://taotoken.net/api/chat/completions这种带完整路径的形式。配置里只填到https://taotoken.net/api,具体路径由客户端自己拼。多写一段就会 404。
5.3 模型不存在
model字段和控制台可用列表对不上。去控制台确认当前可用的模型名,别用记忆里的旧名字。换模型后重启 codex 让配置生效。
5.4 skill 不触发
先确认目录结构对不对:.agents/skills/<skill-name>/SKILL.md,层级不能错。再确认 description 里有没有写清触发条件,只写“代码验证”太模糊,要写“当代码改动完成后……适用于……”。最后确认你调用时用的名字和目录名一致。
5.5 AGENTS.md 没被读取
确认文件在仓库根目录,且 config.toml 里project_doc指向的文件名一致。如果你在子目录启动 codex,它可能从当前目录往上找,行为因版本而异,稳妥做法是在仓库根目录启动。
5.6 改了配置不生效
codex 通常在启动时读配置。改完 config.toml 或环境变量后,退出重进。环境变量改动尤其要注意,已经打开的终端不会自动刷新。
6. 把骨架沉淀下来,下次直接复用
这套东西跑顺之后,你会发现真正省时间的不是某个神 prompt,而是把重复的东西从对话里搬进了文件。AGENTS.md 管长期规则,skill 管重复流程,config.toml 管通道,三者各司其职。换项目时,把 AGENTS.md 和.agents/skills/一起复制过去,改一下 config.toml 里的模型名,通道继续用 TaoToken 的统一 Key,几分钟就能开工。
如果你还没配 Key,从 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 建一个;想先确认模型可用性,用模型对话页面 https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 发一条消息;接入细节和字段说明看文档 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。长期在 codex 里做编码和 Agent 任务的话,Coding Plan https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 更适合按用量规划。骨架搭好,剩下的就是让它替你干活。