Agent Skills 把「AI Agent 缺领域知识」变成了一个文件夹加一个 SKILL.md,但真在 Claude Code 与 OpenAI Codex CLI 之间来回切过一轮,你会发现 TaoToken 这类统一通道才是让技能真正可复用的底座:先到 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content= 创建一把统一 API Key,两个工具的 Base URL 都指向 https://taotoken.net/api,SKILL.md 一字不用改。原文说的痛点——agent 不知道内部 Harbor、不知道 SQL 要走 SSH tunnel——可以用 Skill 解决;而我实际遇到的痛点是另一个版本:SKILL.md 已经写好了,Claude Code 里能跑,换到 Codex 就变成「技能明明在眼前,模型却调不动」。这篇文章就把这段切换过程完整走一遍,重点放在配置、验证和排障上。
1. 从 Claude Code 切到 Codex,SKILL.md 没变,Key 全乱了
1.1 原文的 Harbor 401,在切换场景里变成模型调用 401
原文举了一个很具体的例子:agent 会写 Dockerfile,但不知道团队用内部 Harbor,push 的时候永远 401。把 Harbor 地址、镜像 tag 规范写进 SKILL.md 之后,Claude Code 能照着操作了。可一旦切到 OpenAI Codex CLI,同样一批文件就变得「半身不遂」:技能扫描阶段一切正常,SKILL.md 的 frontmatter 能被发现,但真正要执行的时候,模型请求发不出去。原因不在 Agent Skills 规范,而在两个工具默认读不同的 Key 体系。Claude Code 认 ANTHROPIC_AUTH_TOKEN,Codex 认自己的 provider 配置,官方 Key 又不能通用。结果就是同一个 SKILL.md,在这边能用,在那边得重新申请、重新配置,说好的「写一次,到处用」被卡在了通道这一环。
1.2 渐进式披露依赖一个前提:模型调用得通
原文详细讲了渐进式披露的三阶段:先扫描所有 SKILL.md 的 frontmatter,把 name 和 description 注入提示词;用户任务和 description 匹配时,再加载完整正文;执行阶段才按需读取 scripts、references 和 assets。这套设计能省 context,但它有一个隐含前提——agent 本身得能正常调用模型。如果 Key 不对、Base URL 不通,agent 连「判断任务是否匹配」这一步都做不了,后面的 loadSkill 自然无从谈起。所以在多工具场景下,通道配置的重要性不亚于技能内容本身。很多人在 Codex 里遇到「技能加载不出来」,第一反应是去检查 SKILL.md 格式,但真实原因往往是模型请求根本没发到正确的通道上。
1.3 先想清楚:是「技能不可用」,还是「模型通道不可用」
这里值得做一个明确区分。SKILL.md 的读取是本地文件操作,Claude Code 和 Codex 扫描技能目录都不需要密钥;密钥影响的是模型推理这一环。如果你在 Codex 里输入「列出你的 skills」,它能列出 commit-guide,说明发现阶段是好的;但当你让它按 commit-guide 检查提交信息时,它直接报连接错误或鉴权失败,那问题就出在模型通道。把这两件事分开,排障会快很多。TaoToken 负责把后者统一掉:Claude Code 用这把 Key,Codex 也用它,模型通道只认一套身份凭证。
2. 先去 TaoToken 官网拿 Key:注册、建 Key、抄模型 ID
2.1 注册并创建 YOUR_API_KEY
打开 TaoToken 注册账号并登录,进入控制台后找到 API Keys 页面,创建一把新 Key。创建成功后,页面会显示一长串字符,这就是后面配置文件里的 YOUR_API_KEY。这个值只在创建时完整展示一次,先复制到本地临时文件里,后文所有工具都用这一把。这一步对应原文里为 agent 准备运行环境的动作,只是这次把「为每个工具分别申请」换成了「一把 Key 管所有工具」。
2.2 官网地址和接口地址分开记
这里最容易混。人打开的落地页是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content= ,用来注册、创建 Key、看模型广场、对用量;而写进工具的 Base URL 是 https://taotoken.net/api ,末尾没有 /v1。两者用途不同,不要互相替换。把 https://taotoken.net/api 填进浏览器打开的并不是一个页面,把带 UTM 的官网链接填进配置文件,工具也没法发起模型请求。一个帮你管账号,一个帮你发请求,各司其职。
2.3 模型 ID 去哪抄
配置里还会用到模型 ID。回到 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content= 的模型广场,列表里展示的名称就是当前可用的模型 ID。不同时期可用的模型不一样,不要沿用网上教程里的某个固定旧 ID,也不要自己拼版本后缀,直接以当时列表为准。把选中的 ID 记下来,它对应本文后面出现的 YOUR_MODEL_ID。
3. Claude Code 侧配置:settings.json 里把 Base URL 指到 TaoToken
3.1 settings.json 的三个 env 变量
Claude Code 读取 Anthropic 系列环境变量。要让请求走 TaoToken,把下面内容合并到 ~/.claude/settings.json 的 env 节点,或放到项目级 .claude/settings.json:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_AUTH_TOKEN": "YOUR_API_KEY", "ANTHROPIC_MODEL": "YOUR_MODEL_ID" } }YOUR_API_KEY 是刚才创建的那串,YOUR_MODEL_ID 是从模型广场抄来的 ID。保存后完全退出并重新打开 Claude Code,再发起对话时,请求就会发往 https://taotoken.net/api,而不是 Anthropic 官方地址。注意:Base URL 末尾不要加 /v1,也不要把创建 Key 用的官网链接塞进这个字段。
3.2 用 commit-guide 技能验证 Claude Code 侧
技能目录按平台约定放置。以 Claude Code 为例,~/.claude/skills/ 下的每个子目录是一个技能,目录里必须有一个 SKILL.md。我写了一个很小的提交规范技能,专门用来验证流程:
--- name: commit-guide description: 团队 Git 提交规范检查。当用户需要写 commit message、检查提交格式或处理 pre-commit 失败时使用。 --- # 提交前检查 1. 分支名必须是 feat/{jira-id}-{slug} 或 fix/{jira-id}-{slug} 2. commit message 用 Conventional Commits 格式 3. 运行 scripts/check-commit.sh,输出非零则修正后重新提交#!/bin/bash message="$1" echo "$message" | grep -qE '^(feat|fix|docs|refactor)(\(.*\))?: ' || exit 1 exit 0目录结构就是:
~/.claude/skills/commit-guide/ ├── SKILL.md └── scripts/ └── check-commit.sh在 Claude Code 里说「帮我用规范格式写这条提交信息」,它会先看到 commit-guide 的 description,然后加载完整 SKILL.md,再按脚本去检查。这对应原文说的「先发现、后激活、再执行」。验证通过后再进入下一步,不要带着没跑通的配置去切 Codex。
3.3 确认 Claude Code 是否真的走了新通道
可以在对话里让模型确认当前连接的 API Base URL,也可以去 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content= 的控制台看用量记录。刚才那一次对话如果产生了请求,用量列表里就会出现一条记录,这比任何配置检查都直观。
4. Codex 侧配置:config.toml 换 Base URL,复用同一把 Key
4.1 Codex 不认 ANTHROPIC_*,它有自己的 provider 体系
Codex CLI 的配置文件是 ~/.codex/config.toml,模型来源用 model_provider 声明。Claude Code 里那三个 ANTHROPIC_* 变量对 Codex 无效,这也是切工具时要重配 Key 的根源。用 TaoToken 统一之后,Codex 侧只需要声明一个 provider,指向同一个地址、同一把 Key:
model = "YOUR_MODEL_ID" model_provider = "taotoken" [model_providers.taotoken] name = "TaoToken" base_url = "https://taotoken.net/api" env_key = "TAOTOKEN_API_KEY"然后在终端里导出环境变量:
export TAOTOKEN_API_KEY=YOUR_API_KEYYOUR_MODEL_ID 还是模型广场上那个 ID,YOUR_API_KEY 还是那一串。两个工具,同一个身份。
4.2 同一个 SKILL.md:只搬目录,不改内容
Claude Code 扫描 .claude/skills,Codex 也有自己的技能目录约定(具体路径以当时官方文档为准)。把整个 commit-guide 目录复制到 Codex 的 skills 目录即可,SKILL.md 一行都不用改。因为 Agent Skills 是通用规范,两个工具的加载逻辑一致:扫 frontmatter、匹配 description、按需加载正文。技能内容与模型通道解耦,通道由 TaoToken 统一,内容由 SKILL.md 承载,两者各管一段。
4.3 切换时的常见误操作
最容易出错的是把 Claude Code 用的 ANTHROPIC_BASE_URL 原样搬给 Codex,Codex 根本不读这个变量。另一个常见误操作是抄配置时在地址末尾加了 /v1,Codex 会按拼出来的错误路径发请求。Codex 侧只认 config.toml 里 base_url 这个字段,值写 https://taotoken.net/api,不带尾斜杠,不拼 /v1。如果 provider 名字、env_key 和 config.toml 里的引用不一致,启动时会报找不到环境变量,逐行对照上面的示例检查即可。
5. 验证渐进式披露在 Codex 里真的生效
5.1 从 Discovery 到 Execution 的三步验证
切到 Codex 后不要急着跑大任务,先做一个 10 秒的三步验证。第一步,让它列出当前可用的 skills,commit-guide 应该出现在列表里,这说明发现阶段正常。第二步,不提技能名,直接说「提交信息 feat(user): add login 符合规范吗」,如果它主动加载了 commit-guide 并开始引用 SKILL.md 里的检查规则,说明激活阶段正常。第三步,给它一个错误格式如「add login feature」,看它是否会按脚本逻辑拒绝,说明执行阶段正常。三阶段都通过,同一份 SKILL.md 就在 Codex 里按原文的渐进式披露流程完整跑起来了。
5.2 报错对照:先分清是哪一层的问题
如果验证没通过,按顺序排查。报鉴权失败,检查 TAOTOKEN_API_KEY 是否真的 export 了,值是不是控制台里创建的那串 YOUR_API_KEY,而不是教程里的示例占位符。报模型不存在或请求地址错误,多半是 config.toml 里 model 字段填了网上抄的旧 ID,或者 base_url 多写了 /v1,回到模型广场抄当前 ID,把地址改回 https://taotoken.net/api。如果技能列表里根本没有 commit-guide,那是目录放错位置,或 SKILL.md frontmatter 缺少 name 和 description,这跟模型通道无关。大多数「切工具后技能失效」的假象,最后都落在通道配置或目录位置这两个点上,而不是技能内容本身。
5.3 涉及数据库的 SKILL.md,保留执行边界
如果技能里写了一堆数据库查询规范,注意不要让 Codex 或 Claude Code 直连生产库执行诊断 SQL。正确流程是:agent 根据 SKILL.md 生成带 tenant_id 过滤的 SELECT 语句,你在本地 SQL*Plus 或数据库客户端里执行,把结果或报错贴回对话,agent 再对照规范修正。渐进式披露保证的是 agent 只加载当前需要的指令,不是把生产库权限直接交给模型。
6. 切换顺了,再谈 SKILL.md 沉淀和控制台对账
6.1 Skills 与 MCP 的配合,在统一通道下依然成立
原文的类比很直观:MCP 决定「有什么工具可用」,Skills 决定「怎么正确地用这些工具」。一个 SKILL.md 可以告诉 agent 某个数据库 MCP server 的工具要先传 tenant_id 过滤条件,或者查用户表前先关联 user_profile。这套组合在 Claude Code 和 Codex 里都成立。切换工具时,MCP server 各自配一遍是少不了的,但模型通道只要一把 Key 就够了。先解决通路,再编排工具,排查问题的顺序才顺。
6.2 对一下这次调用,再决定下一步
配置落定后,建议先用同一把 Key 去 模型对话 里发一条测试消息,确认模型 ID 和 Base URL 都没填错,顺便看这次调用有没有出现在控制台用量里。如果接下来要长期在 Claude Code 和 Codex 之间切换写代码,可以看看 Coding Plan 是否更适合你的使用强度;新 Key 统一在 控制台 API Keys 创建和管理,Claude Code 的环境变量对照见 接入文档。以后不管是 Claude Code 还是 Codex,先看这一把 Key 的用量记录,再看 SKILL.md 需要改哪里,问题边界就清楚多了。