Codex 的 AGENTS.md 每次启动都会自动加载吗?用 TaoToken https://taotoken.net/?utm_source=taotoken_aicg_blog_end 创建一把 Key 之后,你才能让 Codex 亲口把当前生效的指令链念出来。很多人把全局、仓库、子目录三层规则写得很整齐,却始终不确定 Codex 是否真的按“全局 → 仓库 → 子目录”的顺序拼接,也不确定某个目录下的 AGENTS.override.md 有没有把同层的常规文件顶掉。更现实的问题是:验证这一步本身要花一次模型调用,通道不通时,codex --ask-for-approval never "Summarize the current instructions."只会甩给你一个报错,而不是指令摘要。所以合理的顺序是先把通道接通,再验证指令链,最后回控制台对一下这次验证调用到底花了多少。
1. 验证 AGENTS.md 分层加载前,先解决 Codex 的模型通道
1.1 你要验证的其实是三层文件有没有按顺序进上下文
Codex 在开始干活之前,会先构建一条“指令链”。全局层看的是 Codex 主目录,默认~/.codex,如果你设了CODEX_HOME,就换成那个目录;同一层里AGENTS.override.md存在且非空时,AGENTS.md在该层直接不读。项目层从 Git 根目录一路向下走到当前工作目录,路径上每一层目录最多只取一个说明文件,查找顺序是AGENTS.override.md→AGENTS.md→project_doc_fallback_filenames里配置的备用名。最后所有这些文件按“全局 → 仓库根 → 更深层目录 → 当前目录”的顺序,用空行拼接成一份完整提示。
拼接这件事直接决定了你的验证目标:假设当前工作目录是repo/services/payments/,那么~/.codex/那一层、repo/那一层、repo/services/那一层、repo/services/payments/那一层,凡是找到文件的都要进上下文,越靠近当前目录的排在越后面,在模型理解上主导权越强。你要验证的就是“这几层到底谁进来了、谁被顶掉了”,而不是简单地看“AGENTS.md 有没有生效”。
1.2 通道不通时,你分不清是文件没加载还是请求没出去
codex --ask-for-approval never "..."表面是一条命令,本质是一次标准模型调用。默认 provider 走官方通道,可能没登录、可能额度吃紧、可能请求直接失败。这时候命令返回的报错里不会告诉你 AGENTS.md 有没有被读到,因为根本没走到构建提示那一步。很多人误以为是文件放错目录,来回折腾AGENTS.override.md,其实问题出在通道上。
所以先换一条稳定通道再谈验证。打开 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content= 注册登录,进控制台创建 API Key,顺手在模型广场抄下要用的模型 ID。Key 创建后只显示一次,复制完先存到临时文件里,别急着关页面。这一步做完,后面的config.toml才有东西可填。
2. 在 ~/.codex/config.toml 里把 provider 指向 TaoToken
2.1 Key 和模型 ID 都从模型广场那页拿
去 TaoToken 注册之后,进控制台创建 Key,占位符写作YOUR_API_KEY。模型 ID 不要凭记忆写,必须以模型广场当时列表为准,页面上能直接看到可用模型和对应的 ID 字符串,复制粘贴最省事。如果你同时在跑多个工具,建议单独建一把 Key,命名带上用途,比如codex-agents-verify,后面看用量时一眼能认出是哪条链路在花钱。
2.2 config.toml 的最小可用写法
Codex 的 provider 配置写在~/.codex/config.toml。注意base_url填的是接口地址https://taotoken.net/api,末尾不要带/v1,更不要写成官网落地页地址——两者用途完全不同,官网地址是给人点的,接口地址是给工具请求的。
# ~/.codex/config.toml model = "YOUR_MODEL_ID" model_provider = "taotoken" project_doc_fallback_filenames = ["TEAM_GUIDE.md", ".agents.md"] project_doc_max_bytes = 65536 [model_providers.taotoken] name = "TaoToken" base_url = "https://taotoken.net/api" env_key = "TAOTOKEN_API_KEY" wire_api = "chat"保存后开一个新终端,让 Codex 重新读配置。改完不重启、不开新会话,指令链和 provider 都还是旧的那套,这是最常见的“改了没反应”。
2.3 用环境变量存 Key,别写进仓库
env_key指向哪个变量名,你就得 export 哪个变量名,两边必须完全一致:
export TAOTOKEN_API_KEY=YOUR_API_KEY # 想长期生效就写进 ~/.zshrc 或 ~/.bashrc如果你的项目在 CI、共享开发机或者自动化机器人里跑,注意~/.zshrc不一定被加载,这时宁可显式在启动脚本里 export,也不要指望默认环境。Key 一律不要提交进 Git,也不要写进仓库根目录的任何.md文件里——AGENTS.md 会被逐字拼进上下文,等于把密钥直接喂给模型。
3. 把三层 AGENTS 文件写成“能被验证出来”的样子
3.1 全局层:~/.codex/AGENTS.md 与 AGENTS.override.md 的取舍
全局层适合放长期稳定的个人偏好,比如包管理器选择、改完代码是否默认跑测试、要不要先征求确认。写得太具体会把某个仓库的流程污染到其他项目上。这里有个非常容易踩的点:如果~/.codex/AGENTS.override.md存在且非空,那么~/.codex/AGENTS.md在这一层就彻底不读了。所以临时性的全局覆盖规则放 override,长期默认偏好放 AGENTS.md,两者不要同时写内容。
# Global Codex Rules ## Working agreements - Prefer pnpm for JavaScript package management. - Run relevant tests after code changes. - Ask before adding new production dependencies. - Keep changes minimal and aligned with existing style.3.2 项目层:仓库根 AGENTS.md 加子目录 AGENTS.override.md
仓库根放本仓统一规范,子目录放局部强约束。关键区别在于:override 只顶掉“同一目录内”的 AGENTS.md,不同目录之间是叠加关系,不是二选一。所以services/payments/AGENTS.override.md生效时,仓库根的 AGENTS.md 依然在上下文里,只是排在更前面。
# Repository Instructions ## Setup - Use `pnpm install`. - Run `pnpm lint` before finalizing changes. ## Safety - Do not change CI, deployment, or secrets handling unless explicitly requested.# Payments Service Override ## Testing - Run `make test-payments` for any change in this directory. ## Safety - Never modify payment gateway credentials. - Ask before changing retry logic, timeouts, or idempotency behavior.3.3 备用文件名与 32 KiB 上限,都会影响验证结果
团队如果已经在用TEAM_GUIDE.md这类名字,可以靠project_doc_fallback_filenames让 Codex 认;但只有显式列在数组里的名字才生效,不在列表里的直接忽略。另外拼接时有总大小检查,默认上限是 32 KiB,写成project_doc_max_bytes = 65536可以放宽到 64 KiB,超过上限后面的说明就不再加了。这一条和用量直接相关:所有被加载的文件都会变成输入 token,每开一次会话都要重新付一遍,所以“按目录拆文件”通常比“把一个大文件塞到全局”更划算,也更符合分层设计。
4. 跑验证命令,让 Codex 自己汇报指令来源
4.1 先看摘要:Summarize the current instructions
codex --ask-for-approval never "Summarize the current instructions."预期是 Codex 把当前生效的规则概括出来,你能对照自己写的全局偏好、仓库规范,判断有没有全部进来。如果返回的摘要里完全看不到某一层的内容,先回第 3 节检查那一层是不是空文件、是不是被同目录 override 顶掉了。
4.2 再看逐层来源:--cd 到子目录列出加载文件
codex --cd services/payments --ask-for-approval never "List the instruction sources you loaded."期望的输出顺序是:先全局文件,再仓库根的 AGENTS.md,最后services/payments/AGENTS.override.md。顺序对了,说明“全局 → 仓库 → 子目录”的拼接逻辑符合预期;顺序不对或者少了某一层,就带着这份输出回到目录结构里逐层核对。
4.3 一次调用同时验证两条链路
这一步价值在于:命令能正常返回内容,说明 TaoToken 的 Key、base_url、模型 ID 三件事都填对了,模型通道是通的;返回的内容本身描述了指令来源,说明 AGENTS.md、AGENTS.override.md 的加载顺序也对。两条链路一次性验证完,不用再单独发一条测试消息。反过来说,如果这条命令报 401 或者模型不存在,你就不该继续怀疑 AGENTS.md,先把通道修好。
5. 指令没生效、加载了错规则、被截断时的排查顺序
5.1 明明写了新规则,跑起来还是旧行为
大概率是上层存在 override。检查两处:~/.codex/AGENTS.override.md是不是还在;要验证的那个目录里是不是存在一个 AGENTS.override.md 把同层 AGENTS.md 顶掉了。很多“莫名其妙的默认行为”,追下去都是某个更高层的覆盖文件在起作用。
5.2 文件完全没被读到
按这个顺序查:是不是在目标仓库里启动的 Codex;codex status显示的 workspace root 是不是你预期的仓库根;文件是不是空的——空文件会被直接跳过;目录层级有没有搞错,比如写在了services/而不是services/payments/。另外echo $CODEX_HOME也要看一眼,如果它指向另一个目录,Codex 读的就是那套 home 配置,你的~/.codex/AGENTS.md自然不生效。
5.3 请求层面的三个典型报错
| 现象 | 常见原因 | 处理方式 |
|---|---|---|
| 401 / 未授权 | env_key对应的变量没 export,或 Key 复制时多了空格 | 重新 exportTAOTOKEN_API_KEY=YOUR_API_KEY,开新终端 |
| 模型不存在 / 400 | 模型 ID 抄错 | 回模型广场核对当时列表里的 ID |
| 路径 404 一类错误 | base_url末尾多写了/v1 | 改成https://taotoken.net/api,末尾不带斜杠和版本号 |
想更彻底地审计,可以看~/.codex/log/codex-tui.log,或者启用会话日志后翻最近的session-*.jsonl,里面能看到这一轮到底拼了哪些说明文件。日志里缺哪一层,就去补哪一层。
6. 这次验证调用之后,去控制台对一下用量
6.1 用量视角的两个观察点
第一条验证命令跑完,回控制台从 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content= 进入用量页面,看这次调用的记录有没有出现:出现了说明通道和计费都正常,没出现就回到第 5.3 节查报错。第二个观察点是输入量级——把三层 AGENTS 文件都写满之后,每次会话的输入 token 会明显比空仓库高,这时候project_doc_max_bytes设成 32 KiB 还是 64 KiB,差距会直接体现在账单上。
6.2 长期跑 agent 该看什么
如果你打算让 Codex 常驻在几个仓库里跑,建议给验证用途单独一把 Key,用量和主开发 Key 分开看,异常增长时一眼能定位是哪条链路。规则文件也别一次写满,按目录拆到更接近工作目录的位置,既符合分层加载的设计,也能避免每次会话都背着几万字节的无关说明。
配完之后还有两件事值得顺手做:用同一把 Key 在 模型对话 里发一条消息,确认模型 ID 和接口地址没填反;如果 Codex 是主力工具,去 Coding Plan 看看套餐余量够不够你每天的验证频率。需要再加一把专用于验证的 Key,直接在 控制台 API Keys 创建。习惯用 Claude Code 打配合的,环境变量对照表在 接入文档 里,照着改一遍即可。