1. 为什么 Codex 用户需要 SPEC-KIT
如果你已经在用 Codex 写代码,大概率遇到过这种场景:让它加一个功能,它直接开始改文件,改完你发现接口命名不对、边界条件没处理、测试也没补。问题不在模型能力,而在于你给它的输入本身就是模糊的——一句话需求,换来的自然是一堆需要返工的代码。
SPEC-KIT 想解决的就是这件事。它把「规格」当成项目的源真理,代码只是规格的一种实现表达。整个流程被拆成几个明确阶段:先定治理原则(constitution),再写清楚要做什么(specify),然后定怎么做(plan),拆成可执行任务(tasks),最后才进入实现(implement)。每个阶段都有对应的 Markdown 产出物,放在.specify/目录里,成为可追踪、可回读的活文档。
这套东西适合谁?适合已经在用 Codex 做真实项目、但被「需求漂移」和「返工」折磨过的开发者。它不要求你换编辑器,也不要求你改变现有工作流,只是在你和 Codex 之间插入一层结构化的规格层。而 Codex 本身对这类 prompt 文件的支持方式比较特殊——它不像 Claude Code 那样能直接调用speckit.*命令,而是通过 mention 具体的.md文件来触发。这个差异后面会详细讲。
我试过把这套流程跑在一个评论模块的需求上,从 constitution 到 tasks 全部走完,再让 Codex 按 tasks 实现,返工率明显下降。下面把配置和验证过程完整拆开。
2. TaoToken 前置:统一 Key 与 API 通道
在配置 Codex 之前,先把模型接入层理清楚。Codex 需要调用大模型来完成规格生成和代码实现,而 TaoToken 在这里扮演的是统一 API 通道的角色——你不需要在多个模型供应商之间来回切换 Key,用一个统一 Key 就能走通对话、编码、Agent 等场景。
具体来说,TaoToken 提供的是兼容主流接口规范的 API 端点,Codex 的配置里只需要把 base URL 指向它,再把 Key 填进去即可。这样做的好处是:你的settings.json里不会散落多个供应商的凭证,后续换模型或加模型也只改一处。
需要提前准备的东西:
- 一个 TaoToken 账号,登录后进入控制台创建 API Key
- 确认你要用的模型名称(比如对话类、编码类)
- Codex 已安装并能正常读取配置文件
控制台入口在这里:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite
创建 Key 的页面:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite
API 端点本身不加 UTM,直接是https://taotoken.net/api。这个地址在下面的settings.json里会用到。
注意:Key 属于敏感凭证,不要提交到 Git 仓库。建议放在环境变量里,配置文件里用占位符引用。
3. 可复制的 settings.json 配置骨架
Codex 的配置通常放在用户目录下的.codex/里,核心文件是settings.json(部分版本叫config.json,以你本地实际为准)。下面这份骨架可以直接复制,把占位符替换成你自己的值。
{ "model_provider": "taotoken", "model": "your-coding-model-name", "providers": { "taotoken": { "base_url": "https://taotoken.net/api", "api_key": "${TAOTOKEN_API_KEY}", "wire_api": "chat" } }, "approval_policy": "on-request", "sandbox_mode": "workspace-write", "project_doc_max_bytes": 65536, "features": { "spec_kit": true } }几个关键字段说明:
| 字段 | 作用 | 建议值 |
|---|---|---|
model_provider | 指定走哪个 provider | taotoken |
base_url | API 通道地址 | https://taotoken.net/api |
api_key | 凭证引用 | 环境变量${TAOTOKEN_API_KEY} |
wire_api | 接口协议类型 | chat |
approval_policy | 命令执行审批策略 | on-request |
sandbox_mode | 沙箱写入范围 | workspace-write |
环境变量在 shell 里这样设置(以 bash 为例):
export TAOTOKEN_API_KEY="sk-你的实际Key"如果你用的是 zsh,把上面这行加到~/.zshrc里,然后source ~/.zshrc。Windows 下用系统环境变量面板添加即可。
配置写完后,Codex 启动时会读取这个文件。如果base_url或 Key 有问题,第一次请求就会报错,所以下一步的验证很关键。
4. 三步验证:加载、生成、回读
配置写完不代表能用,必须走一遍验证。下面三步是我实际跑通的顺序,每一步都有明确的成功标志。
4.1 第一步:配置加载检查
先确认 Codex 能正确读到你的配置。在项目根目录执行:
codex --version codex config show如果config show能打印出你写的model_provider和base_url,说明配置文件被正确加载。如果报「provider not found」或类似错误,多半是 JSON 格式问题——比如多了逗号、少了引号。可以用下面命令快速校验 JSON:
python -m json.tool ~/.codex/settings.json没有报错就说明格式合法。这一步的成功标志是:能看到taotoken这个 provider 出现在输出里。
4.2 第二步:一次规范生成请求
接下来让 Codex 用 SPEC-KIT 的 constitution prompt 生成一份治理文档。因为 Codex 不支持直接敲speckit.constitution,需要用 mention 文件的方式:
codex ".codex/prompts/speckit.constitution.md 为一个评论模块项目建立治理原则,包含代码风格、测试标准、架构约束"这条命令的意思是:把speckit.constitution.md这个 prompt 文件作为上下文,加上你的具体需求,一起发给模型。模型会按照 prompt 里定义的格式,输出一份 constitution 内容。
如果你还没初始化 SPEC-KIT 目录,先跑一次 init:
uvx --from git+https://github.com/github/spec-kit.git specify init comment-demo --ai codex --script sh初始化后目录结构大致是这样:
. ├── .codex │ └── prompts │ ├── speckit.constitution.md │ ├── speckit.specify.md │ ├── speckit.plan.md │ ├── speckit.tasks.md │ └── ... └── .specify ├── memory │ └── constitution.md ├── scripts │ └── bash └── templates成功标志:命令返回一段结构化的治理原则文本,包含项目原则、技术约定、文档约定三部分。
4.3 第三步:结果回读确认
生成完不算完,要把结果写回.specify/memory/constitution.md,然后让 Codex 读回来确认一致性:
codex "读取 .specify/memory/constitution.md,总结其中的测试覆盖率要求和 API 响应时间约束"如果 Codex 能准确说出「覆盖率 ≥ 80%」「响应时间 ≤ 300ms」这类具体数字,说明整个链路是通的:配置加载正常、API 通道正常、prompt 文件被正确识别、生成结果可回读。
这三步走完,你的 Codex + SPEC-KIT + TaoToken 组合就算跑通了。后面就可以按 specify → plan → tasks → implement 的顺序推进真实需求。
5. 本篇常见错排查
实际配置过程中,下面几个错误出现频率最高。
报错一:401 Unauthorized
说明 Key 没被正确读取。先确认环境变量是否生效:
echo $TAOTOKEN_API_KEY如果输出为空,说明 shell 没加载到。检查你写export的那个文件是否被 source 了。另外注意settings.json里用的是${TAOTOKEN_API_KEY}这种引用语法,有些 Codex 版本不支持变量展开,那就需要直接填 Key(但不建议提交到仓库)。
报错二:model not found
model字段填的模型名不在 TaoToken 支持的列表里。去控制台确认可用模型名称,注意大小写和连字符。编码类场景和对话类场景用的模型可能不同,按需选择。
报错三:speckit 命令无响应
Codex 里不能直接敲speckit.constitution,必须用 mention 文件路径的方式。确认.codex/prompts/目录下确实有那些.md文件。如果 init 时没选 codex,prompt 文件不会生成,需要重新 init 或手动补。
报错四:生成结果格式混乱
多半是 prompt 文件被截断了。检查project_doc_max_bytes是否够大,默认 65536 一般够用,但如果你的 constitution 模板特别长,可以调高。
报错五:sandbox 写入被拒
approval_policy设成never时,Codex 不会请求审批,但沙箱会阻止写入。改成on-request,或者在需要写文件时手动确认。
提示:排查时优先看 Codex 的日志输出,它会明确告诉你失败在哪一层——是配置读取、网络请求还是沙箱权限。
6. 接入文档与后续动作
配置跑通之后,建议把接入文档过一遍,确认你的wire_api类型和模型参数没有遗漏。文档入口:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite
如果你主要用 Codex 做长期编码和 Agent 任务,可以看下 Coding Plan 的说明,它针对持续性的编码场景做了通道优化:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite
想先验证模型对话是否正常,可以直接在模型对话页测试:https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model-chat&utm_campaign=rewrite
如果你用的是 Claude Code 而不是 Codex,接入方式略有不同,参考这个页面:https://taotoken.net/claude-code-anthropic?utm_source=taotoken_aicg_blog_end&utm_content=claudecode&utm_campaign=rewrite
最后说一个实际踩过的坑:SPEC-KIT 的 prompt 文件更新比较频繁,如果你从旧版本 init 的项目里直接复制.codex/prompts/到新项目,可能会出现模板变量不匹配的情况。稳妥做法是每次新项目都重新 init 一次,让 prompt 文件和当前版本对齐。这样 Codex 在 mention 这些文件时,生成的规格结构才不会跑偏。