1. 从一次上下文爆炸说起:Agent Skills 要解决的真实问题
如果你正在做 Agent 工程,大概率遇到过这种场景:为了让智能体能处理报销、查 ECS 实例、生成周报、审代码,你把所有规则、API 文档、模板、示例全塞进系统提示词。刚开始还能跑,功能一多,上下文窗口被撑到几万 token,模型开始"忘事"——前面写的约束后面就不遵守了,同一个任务两次输出格式还不一样。
这不是模型变笨了,而是你把"能力"和"知识"混在一起喂给它了。Agent Skills 就是冲着这个痛点来的:它是一种轻量级开放格式,用一个包含SKILL.md的文件夹,把领域知识、工作流、执行逻辑封装成可复用、可版本化、可组合的能力模块。智能体只在任务匹配时才加载对应 Skill,无关指令不占用上下文。
一句话概括它适合谁:如果你在写重复性 Prompt、维护一堆互相打架的系统指令、或者想让团队共享同一套 Agent 工作流,Agent Skills 值得你花时间吃透。本文聚焦工程化落地——SKILL.md字段规范、目录职责划分、渐进式加载与渐进式披露机制,并给出可复制的模板、目录结构和加载顺序验证步骤。文中涉及模型调用的部分,我用 TaoToken 统一 Key 通道来演示,方便你把 Skill 跑起来验证效果。
核心检索词先摆出来:Agent Skills 是什么、SKILL.md 怎么写、渐进式加载怎么降低上下文开销、目录职责怎么划分。下面按"问题 → 前置 → 配置 → 验证 → 排障 → 接入"的顺序展开,你可以直接跳到需要的章节。
2. TaoToken 统一 Key 前置准备:让 Skill 调用有稳定出口
在拆SKILL.md之前,先把调用通道准备好。原因很实际:Skill 的验证阶段需要真实发起模型请求,看它是否按description匹配、是否按SKILL.md的分步指令执行。如果每次换模型都要改一堆环境变量,验证过程会很痛苦。TaoToken 提供统一 Key 和 API 通道,把模型出口收敛成一个 Base URL,Skill 工程里只维护一份配置即可。
先明确三件套,这是后面所有配置的基础:
| 配置项 | 值 | 说明 |
|---|---|---|
| Base URL | https://taotoken.net/api | 统一 API 入口,不加 UTM |
| API Key | 在控制台创建 | 形如sk-...,只存环境变量 |
| Model ID | 按需选择 | 如claude-sonnet-4-5、gpt-4o等,以控制台模型列表为准 |
获取 Key 的路径:访问官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,注册后进入控制台,在 API Keys 页面创建。控制台地址是 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite ,API Keys 管理页是 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 。创建后立刻复制,页面刷新就不再完整显示。
把 Key 写进环境变量,别硬编码进SKILL.md或脚本:
# Linux / macOS,写入 ~/.bashrc 或 ~/.zshrc export TAOTOKEN_API_KEY="sk-你的key" export TAOTOKEN_BASE_URL="https://taotoken.net/api"# Windows PowerShell,写入用户环境变量 [Environment]::SetEnvironmentVariable("TAOTOKEN_API_KEY","sk-你的key","User") [Environment]::SetEnvironmentVariable("TAOTOKEN_BASE_URL","https://taotoken.net/api","User")这里有个容易踩的坑:SKILL.md的compatibility字段里可以声明环境要求,但不要把 Key 写进去。SKILL.md是要进 Git 仓库、要被智能体读取的,写 Key 等于泄露。正确做法是在compatibility里写"需要环境变量TAOTOKEN_API_KEY",实际值由运行环境注入。
如果你用的是 Claude Code 这类工具,它的配置走settings.json;如果用 Codex,走auth.json。无论哪种,Base URL 都填https://taotoken.net/api,Key 填环境变量引用。这样 Skill 里的脚本调用模型时,只需要读环境变量,不关心具体是哪家模型。
前置准备做完,你应该有:一个可用的 API Key、两个环境变量、一个明确的 Base URL。接下来进入SKILL.md的规范拆解。
3. SKILL.md 规范与目录职责:可复制的模板与配置
这一节是全文技术核心。SKILL.md是每个 Skill 唯一必选文件,由 YAML 前置元数据(frontmatter)和 Markdown 正文两部分组成。先看一个可直接复制的完整模板,再逐字段拆。
3.1 可复制的 SKILL.md 模板
--- name: ecs-query description: Query and export ECS instance lists by region and status. Use when users ask about running instances, instance status codes, or need to export instance inventory to CSV. license: Apache-2.0 compatibility: Requires python3 and TAOTOKEN_API_KEY environment variable. Network access to https://taotoken.net/api required. metadata: author: platform-team version: "1.2" allowed-tools: read_file write_file run_script --- # ECS Instance Query ## When to use this skill Use when the user asks to list ECS instances, filter by region or status, interpret instance status codes, or export an instance inventory. ## Core workflow 1. Confirm query scope: region, status filter, output format. 2. Run `scripts/query-instances.py` with the confirmed parameters. 3. Map raw status codes using `references/instance-status-codes.md`. 4. Format output following `templates/inventory-report.md`. 5. If export requested, run `scripts/export-csv.py`. ## Edge cases - Empty result set: report "no instances matched" instead of an empty table. - Unknown status code: fall back to raw code and flag it for review. - Region not specified: default to all regions and state the assumption.这个模板里,name和description是必填,其余可选。下面把关键字段和目录职责讲透。
3.2 name 与 description 的硬规则
name的约束很严格,写错会导致 Skill 无法被识别:
- 1–64 个字符
- 仅小写字母、数字、连字符(
a-z、0-9、-) - 不能以
-开头或结尾 - 不能有连续连字符
-- - 必须与父目录名称一致
有效示例:pdf-processing、data-analysis、code-review。无效示例:PDF-Processing(大写)、-pdf(连字符开头)、pdf--processing(连续连字符)。
description是渐进式加载第一阶段的唯一依据,直接决定 Skill 会不会被激活。规则是 1–1024 字符,不能为空。写法上要具体说明"做什么"和"何时用",并埋入触发关键词。对比一下:
# 差的写法:空泛,模型无法判断何时匹配 description: A helpful skill for data. # 好的写法:功能 + 场景 + 关键词 description: Query and export ECS instance lists by region and status. Use when users ask about running instances, instance status codes, or need to export instance inventory to CSV.3.3 目录职责速查
一个生产级 Skill 的完整结构如下,各目录职责分离是渐进式披露能生效的前提:
ecs-query/ ├── SKILL.md # 必需:入口,元数据 + 执行指令 ├── scripts/ # 可选:确定性可执行代码 │ ├── query-instances.py │ ├── export-csv.py │ └── requirements.txt ├── references/ # 可选:按需读取的参考资料 │ └── instance-status-codes.md ├── templates/ # 可选:输出模板 │ └── inventory-report.md ├── assets/ # 可选:静态资源,不加载进上下文 │ └── logo.png └── workflows/ # 可选:社区实践,非官方强制 └── approval-flow.yaml| 目录 | 职责 | 典型内容 | 加载方式 |
|---|---|---|---|
SKILL.md | 入口 + 核心流程 | 触发条件、分步指令、边界规则 | Skill 激活时加载 |
scripts/ | 确定性操作 | 解析、转换、校验、排序脚本 | 按需执行 |
references/ | 参考资料 | API 文档、政策条款、决策表 | 按需读入上下文 |
templates/ | 输出模板 | 报告、邮件、表单模板 | 按需加载 |
assets/ | 静态资源 | 图片、字体、品牌素材 | 用于输出,不进上下文 |
workflows/ | 工作流定义 | 多步骤流程 YAML/JSON | 按需加载 |
关键判断原则:需要语义判断、价值判断、风格判断的交给模型;不需要这些判断的稳定动作交给scripts/。比如解析 JSON、格式转换、去重排序,这些让模型临场发挥既慢又不稳,写成脚本更可靠。
3.4 渐进式披露的四个阶段
这是 Agent Skills 最核心的设计。智能体不会一次性加载所有 Skill 的完整内容,而是分阶段按需加载:
| 阶段 | 加载内容 | Token 消耗 | 触发时机 |
|---|---|---|---|
| 宣告 Discovery | 仅name+description | ~100 tokens | 每次运行开始时 |
| 加载 Load | 完整SKILL.md正文 | < 5,000 tokens | 任务匹配时 |
| 资源 Read | references/等文档 | 按需 | 需要补充信息时 |
| 运行 Run | scripts/中的代码 | 按需 | 需要执行确定性操作时 |
这个机制的价值在于:假设你有 20 个 Skill,宣告阶段只花约 2000 token 就能让模型知道"有哪些能力可用";只有真正匹配的那个才加载完整正文。相比把所有 Skill 全文塞进系统提示词,上下文开销能降一个数量级。
3.5 用 settings.json 固化调用配置
Skill 里的脚本要调用模型时,配置统一走环境变量或工具配置文件。以 Claude Code 的settings.json为例,路径通常是~/.claude/settings.json:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "sk-你的key", "ANTHROPIC_MODEL": "claude-sonnet-4-5" } }如果你用 Codex,配置在~/.codex/auth.json,Base URL 同样填https://taotoken.net/api,Key 填你的 TaoToken Key,Model ID 按控制台列表选。三件套(Base URL + Key + Model ID)必须齐全,缺一个就会在验证阶段报错。
配置写完,先别急着跑 Skill,用下一节的验证步骤确认通道是通的。
4. 验证请求与加载顺序:确认 Skill 真的按预期工作
配置写完不等于能用。这一节给两段可执行的验证:先验证 API 通道,再验证 Skill 的渐进式加载顺序。
4.1 验证 API 通道
用 curl 发一个最小请求,确认 Base URL 和 Key 有效:
curl -s https://taotoken.net/api/v1/messages \ -H "Content-Type: application/json" \ -H "x-api-key: $TAOTOKEN_API_KEY" \ -H "anthropic-version: 2023-06-01" \ -d '{ "model": "claude-sonnet-4-5", "max_tokens": 64, "messages": [{"role": "user", "content": "reply with OK only"}] }'预期返回里能看到content数组,文本是OK。如果返回 401,说明 Key 无效或没读到环境变量;如果返回连接错误,检查 Base URL 是否写成了带路径的完整地址。
4.2 验证 Skill 的加载顺序
渐进式加载是否生效,可以通过观察"模型在什么阶段看到了什么"来验证。写一个最小 Skill,在SKILL.md里放一个只有加载后才知道的标记:
--- name: load-probe description: Probe skill for verifying progressive loading order. Use when user asks to run the load probe test. --- # Load Probe ## Core workflow 1. Reply with the exact string: PROBE_LOADED_7F3A 2. Do not explain, just output the string.把目录放到 Skill 根目录下(如.codebuddy/skills/load-probe/),然后分两步测试:
第一步,问一个不匹配的问题,比如"今天天气怎么样"。观察模型是否知道load-probe存在(它应该能说出有这个 Skill),但不应该输出PROBE_LOADED_7F3A——因为正文没加载。
第二步,问一个匹配的问题:"run the load probe test"。此时description命中,完整SKILL.md被加载,模型应该输出PROBE_LOADED_7F3A。
如果第一步就输出了标记,说明你的实现把全文一次性加载了,渐进式披露没生效;如果第二步没输出,说明description匹配失败或 Skill 目录没被扫描到。
4.3 验证 scripts/ 按需执行
再验证脚本阶段。在scripts/放一个打印时间戳的脚本:
# scripts/probe.py import datetime print("SCRIPT_RAN_AT", datetime.datetime.now().isoformat())在SKILL.md的 workflow 里加一步"运行scripts/probe.py并报告输出"。测试时观察:只有走到这一步,脚本才被执行,输出里才出现SCRIPT_RAN_AT。这验证了"运行阶段按需触发"。
4.4 用表格记录验证结果
把每次验证的结果记下来,方便回归:
| 验证项 | 预期 | 实际 | 结论 |
|---|---|---|---|
| API 通道 | 返回 OK | 返回 OK | 通过 |
| 宣告阶段 | 知道 Skill 存在,不输出标记 | 符合 | 通过 |
| 加载阶段 | 输出PROBE_LOADED_7F3A | 符合 | 通过 |
| 运行阶段 | 出现SCRIPT_RAN_AT | 符合 | 通过 |
四步都通过,说明你的 Skill 工程在加载机制上是正确的。接下来处理常见报错。
5. 常见报错排查:401、local proxy failed、reading choices、OAuth
验证阶段最容易卡在几个固定报错上。这一节按真实错误信息对照排查。
5.1 401 Unauthorized
最常见。原因通常是三类:Key 没读到、Key 写错、Key 被硬编码后失效。
# 先确认环境变量真的存在 echo $TAOTOKEN_API_KEY # 输出应为 sk- 开头,若为空说明没 export 成功如果环境变量正常但还报 401,检查请求头字段名。Anthropic 风格用x-api-key,OpenAI 风格用Authorization: Bearer。用错字段名会直接 401。另外确认 Base URL 是https://taotoken.net/api,不要多加/v1之外的路径。
5.2 local proxy failed
这个报错通常出现在工具配置了本地代理端口,但代理没启动或端口不对。排查顺序:
先看配置文件里有没有proxy、http_proxy、base_url指向127.0.0.1:xxxx的项。如果有,把它改成https://taotoken.net/api,去掉本地代理依赖。然后检查环境变量里有没有残留的HTTP_PROXY/HTTPS_PROXY:
env | grep -i proxy # 若有输出,unset 掉再重试 unset HTTP_PROXY HTTPS_PROXY5.3 reading 'choices' 报错
典型信息是Cannot read properties of undefined (reading 'choices')。这几乎总是响应结构不符合预期导致的——请求打到了非预期端点,返回的不是标准 chat completions 结构。
排查:确认请求 URL 是https://taotoken.net/api/v1/chat/completions(OpenAI 风格)或https://taotoken.net/api/v1/messages(Anthropic 风格),两者响应结构不同,客户端解析逻辑要对应。如果混用,就会出现读不到choices的情况。
5.4 OAuth 相关报错
如果你用 Claude Code 或 Codex 这类带 OAuth 登录的工具,报错可能来自登录态失效。处理方式:先确认工具配置里用的是 API Key 模式而非 OAuth 模式。在settings.json或auth.json里,确保填的是ANTHROPIC_API_KEY/OPENAI_API_KEY字段,而不是依赖浏览器登录的 token。
三件套再强调一次:Base URL + Key + Model ID。任何一项缺失或写错,都会在上述报错里体现。排查时按这个顺序核对,能覆盖绝大多数问题。
5.5 Skill 不被激活
如果 API 通道没问题,但 Skill 就是不触发,检查description是否包含用户提问的关键词。渐进式加载第一阶段只靠description匹配,写得太抽象就会漏匹配。把用户可能说的原话关键词补进去,比如"报销""实例列表""导出 CSV"。
6. 把 Skill 工程接上统一通道:下一步怎么做
到这里,SKILL.md规范、目录职责、渐进式加载机制、验证步骤和排障都过了一遍。剩下的就是把它接到你的实际工程里。
如果你要长期跑编码类 Agent、维护多个 Skill 协同工作,建议用 Coding Plan 把调用额度固定下来,地址是 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite 。它适合需要稳定模型出口、频繁验证 Skill 加载行为的场景。
如果你只是想先验证某个模型在 Skill 里的表现,用模型对话页面直接试,地址是 https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model-chat&utm_campaign=rewrite 。把SKILL.md正文贴进去,看模型是否按分步指令执行,比改代码快。
接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite ,里面有各语言 SDK 的 Base URL 配置示例。API Keys 管理在 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite ,需要新建或轮换 Key 时来这里。
最后给一个实操建议:先把本文的load-probe最小 Skill 跑通,确认宣告、加载、运行三个阶段的行为符合预期,再把你现有的 Prompt 按"流程 / 材料 / 脚本"三类拆进SKILL.md、references/、scripts/。拆的时候记住那条判断原则——需要语义判断的交给模型,不需要的交给脚本。这样你的 Agent 才会从"每次重新理解 Prompt"变成"按设计好的路径稳定执行"。