1. 从 Agent 失控到 Skills 落地:我踩过的坑与真实场景
Agent 这东西,用起来爽,调起来崩。我最早接触 Agent 是在一个自动化文档处理的场景里,当时信心满满地写了一大段agent.md规则,把“什么时候读哪个文件、什么时候调用哪个工具”写得清清楚楚。结果呢?Agent 该读文件的时候不读,该调工具的时候说“我没有这个工具”,最后输出一堆看起来合理但完全没法用的东西。那种感觉就像你给一个实习生写了 20 页 SOP,他看完之后问你“所以我要干嘛”。
后来我复盘了一下,问题的根子不在模型笨,而在于规则加载方式太粗暴。传统的rules或agent.md是在任务开始前一次性把所有规则塞进上下文,Agent 面对的是一个巨大的、静态的、没有优先级的规则池。它不知道哪条规则在当前任务里最重要,也不知道什么时候该去读更详细的说明。上下文被占满,注意力被稀释,执行自然就乱。
Skills 解决的正是这个问题。它把“能力”从“规则”里拆出来,变成一个一个独立的、可被按需加载的技能包。每个 Skill 有自己的元数据(name + description),Agent 启动时只加载这些轻量的“名片”,当用户请求匹配到某个 Skill 的描述时,才去读它的SKILL.md正文,需要执行脚本时再通过 bash 去调用。这种渐进式加载机制,让上下文始终保持在“够用且不浪费”的状态。
这篇文章要做的,不是再给你讲一遍 Skills 的概念,而是带你从零跑通一条完整的链路:写一个可复制的SKILL.md,配好统一 Key 和 Base URL,在 TRAE 里完成一次可复现的接入演示,最后把调用成功和常见报错的排查动作都过一遍。适合谁看?如果你正在用 TRAE、Cline、Claude Code 这类工具,想让 Agent 从“能聊天”变成“能干活”,那这篇就是给你写的。
我试过把同一个任务分别用纯 rules 和 Skills 跑一遍,差距非常明显。纯 rules 版本里,Agent 会在无关步骤上反复确认,工具调用成功率大概只有六成;换成 Skills 之后,同样的任务,工具调用成功率稳定在九成以上,而且执行路径清晰很多。这不是模型变了,是上下文的组织方式变了。
下面我会先讲清楚 Skills 和 Agent、MCP 的协作关系,然后直接进入可复制的配置环节。你不需要先理解所有原理,跟着步骤走,先把第一个 Skill 跑起来,再回头理解机制,效率会高很多。
2. TaoToken 统一 Key 前置准备:Base URL 与模型 ID 怎么配
在正式写SKILL.md之前,得先把接入层的事情搞定。Skills 本身是能力封装,但它最终还是要通过某个模型来驱动。如果你用的是 TRAE、Cline 或者 Claude Code 这类工具,模型接入的配置方式直接决定了后面 Skill 能不能被正确调用。
这里我用 TaoToken 的统一 Key 来做接入。为什么选它?因为它的 Base URL 和 Key 管理方式对多工具场景比较友好,一个 Key 可以在不同工具里复用,省得你每换一个 IDE 就重新配一遍。官网地址是https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=,API 地址是https://taotoken.net/api,注意 API 地址后面不加 UTM 参数。
先说你需要在哪些地方填什么。以 TRAE 为例,它的模型配置入口在设置里的“模型”或“AI 服务”板块。你需要填三个东西:Base URL、API Key、Model ID。Base URL 填https://taotoken.net/api,API Key 从 TaoToken 控制台的 API Keys 页面生成,Model ID 根据你实际要用的模型来填,比如claude-sonnet-4-20250514或者gpt-4o这类。
如果你用的是 Cline,配置方式类似,但它的配置文件是 JSON 格式的。在 Cline 的设置里找到 “API Provider”,选择 “OpenAI Compatible”,然后填入 Base URL 和 Key。Cline 的配置文件通常位于~/.cline/config.json或者项目根目录的.cline/config.json,你可以直接编辑这个文件来固化配置。
Claude Code 的配置稍微不一样,它用的是~/.claude/settings.json或者项目级的.claude/settings.json。你需要在这个文件里配置env字段,把ANTHROPIC_BASE_URL指向https://taotoken.net/api,ANTHROPIC_API_KEY填你的 TaoToken Key。注意 Claude Code 对 Base URL 的路径有要求,如果直接填https://taotoken.net/api不生效,可以试试https://taotoken.net/api/v1,具体以接入文档为准。
Codex 的配置在~/.codex/auth.json里,这个文件的结构是{"OPENAI_API_KEY": "你的Key"},同时你还需要在~/.codex/config.toml里设置base_url = "https://taotoken.net/api"。Codex 对 TOML 格式比较敏感,注意不要写错字段名。
这里有一个关键点:Base URL、Key、Model ID 这三件套必须同时正确,缺一个都会导致 401 或者 model not found。我见过太多人只填了 Key 没改 Base URL,然后报 401 以为是 Key 失效,其实是请求打到了默认的 OpenAI 地址,而那个地址根本不认识你的 TaoToken Key。
配置完成后,你可以先用一个最简单的 curl 请求验证一下:
curl https://taotoken.net/api/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer 你的TaoTokenKey" \ -d '{ "model": "claude-sonnet-4-20250514", "messages": [{"role": "user", "content": "说一句你好"}], "max_tokens": 50 }'如果返回了正常的 JSON 响应,说明接入层没问题。如果报 401,检查 Key 是否复制完整;如果报 model not found,检查 Model ID 是否拼写正确;如果报 connection refused,检查 Base URL 是否写成了https://taotoken.net/api而不是其他路径。
这一步做完,你就有了一条可用的模型通道。接下来才是 Skills 的主场。
3. 可复制 SKILL.md 模板与 TRAE 配置片段
现在进入核心环节:写一个能跑的SKILL.md,并在 TRAE 里把它加载进去。
先给一个最小可用的SKILL.md模板。这个模板我实测过,在 TRAE 里能正常被识别和触发。你新建一个文件夹,比如叫git-commit-helper,在里面创建SKILL.md,内容如下:
--- name: git-commit-helper description: 当用户需要提交 git commit 时使用此技能。根据当前暂存区的变更内容,生成符合 Conventional Commits 规范的提交信息,并执行提交。适用于需要规范化提交记录、自动生成 commit message 的场景。 --- # Git Commit Helper ## 角色 你是一个熟悉 Conventional Commits 规范的 git 提交助手。 ## 使用场景 当用户说“帮我提交代码”“生成 commit message”“提交暂存区变更”时,触发此技能。 ## 执行步骤 1. 运行 `git diff --cached --stat` 查看暂存区有哪些文件变更。 2. 运行 `git diff --cached` 查看具体变更内容。 3. 根据变更内容,判断提交类型(feat/fix/docs/style/refactor/test/chore)。 4. 生成格式为 `<type>(<scope>): <subject>` 的提交信息,subject 用中文描述,不超过 50 字。 5. 执行 `git commit -m "<生成的提交信息>"`。 6. 返回提交结果,包括 commit hash 和提交信息。 ## 注意事项 - 如果暂存区为空,提示用户先执行 `git add`。 - 不要自动执行 `git push`,只做本地提交。 - 如果变更涉及多个不相关的修改,建议用户拆分成多次提交。 ## 示例 输入:用户说“帮我提交” 输出: - 执行 `git diff --cached --stat`,发现 `src/api/user.js` 有变更 - 执行 `git diff --cached`,看到新增了一个 `getUserProfile` 函数 - 生成提交信息:`feat(user): 新增 getUserProfile 接口` - 执行 `git commit -m "feat(user): 新增 getUserProfile 接口"` - 返回:提交成功,commit hash 为 `a1b2c3d`这个模板的关键在于description字段。Agent 就是靠这个字段来判断“什么时候该用这个 Skill”。所以 description 要写得具体,包含触发场景和关键词,不要写“一个 git 工具”这种模糊描述。
写完之后,在 TRAE 里加载这个 Skill。TRAE 支持三种方式,我推荐用第二种:直接把文件夹放到项目的.trae/skills/目录下。具体操作是,在你的项目根目录创建.trae/skills/git-commit-helper/,把SKILL.md放进去。然后重启 TRAE 或者刷新 Agent,在设置里的“规则技能”板块就能看到这个 Skill 已经被加载了。
如果你用的是 TRAE 的设置面板创建方式,那就更简单:打开设置,找到“规则技能”,点击“创建”,把 name、description、主体内容分别填进去,确认即可。这种方式适合快速试验,但不利于版本管理,长期用还是推荐文件夹方式。
接下来是配置片段。如果你在 TRAE 里用的是 TaoToken 的模型,需要在 TRAE 的模型配置里填好三件套。TRAE 的配置文件通常在~/.trae/config.json或者项目级的.trae/config.json。一个可复制的 JSON 片段如下:
{ "model": { "provider": "openai-compatible", "baseUrl": "https://taotoken.net/api", "apiKey": "你的TaoTokenKey", "modelId": "claude-sonnet-4-20250514" }, "skills": { "directory": ".trae/skills", "autoLoad": true } }注意baseUrl填的是https://taotoken.net/api,不要加/v1,TRAE 会自动补全路径。modelId根据你实际用的模型填,如果你不确定,可以先填claude-sonnet-4-20250514,这是目前比较稳定的选择。
如果你用的是 Cline,它的 MCP 配置和 Skills 配置是分开的。Cline 的 Skills 目录默认在~/.cline/skills/,你也可以在项目里创建.cline/skills/。Cline 的模型配置在~/.cline/config.json,结构如下:
{ "apiProvider": "openai", "openAiBaseUrl": "https://taotoken.net/api", "openAiApiKey": "你的TaoTokenKey", "openAiModelId": "claude-sonnet-4-20250514" }Cline 对openAiBaseUrl的路径比较敏感,如果填https://taotoken.net/api报 404,可以试试https://taotoken.net/api/v1。这个取决于 Cline 版本,实测下来新版本用不带/v1的路径更稳。
配置完成后,在 TRAE 或 Cline 里新建一个对话,输入“帮我提交代码”,看看 Agent 是否会触发git-commit-helper这个 Skill。如果触发了,你会看到它先执行git diff --cached --stat,然后生成提交信息,最后执行 commit。整个过程不需要你手动指定用哪个 Skill,Agent 会根据 description 自动匹配。
这里有一个容易踩的坑:Skill 的 name 字段必须和文件夹名一致。比如文件夹叫git-commit-helper,SKILL.md里的name也必须是git-commit-helper,否则 TRAE 可能加载失败或者识别不到。这个细节官方文档里没写得很明显,但实测下来不一致就会出问题。
4. 验证请求与成功结果:从触发到执行的完整链路
配置写完了,接下来要验证它真的能跑通。验证分两步:先验证模型通道,再验证 Skill 触发。
模型通道的验证前面已经给过 curl 命令,这里再补一个 Python 版本的验证脚本,方便你在代码里集成:
import requests url = "https://taotoken.net/api/v1/chat/completions" headers = { "Content-Type": "application/json", "Authorization": "Bearer 你的TaoTokenKey" } data = { "model": "claude-sonnet-4-20250514", "messages": [ {"role": "user", "content": "回复一个 JSON,包含 status 和 message 两个字段,status 为 ok"} ], "max_tokens": 100 } response = requests.post(url, headers=headers, json=data) print(response.status_code) print(response.json())如果返回200并且 JSON 里有status: ok,说明模型通道没问题。如果返回401,检查 Key;如果返回404,检查 URL 路径;如果返回400,检查请求体格式。
模型通道验证通过后,进入 Skill 触发验证。在 TRAE 里新建对话,输入“帮我提交代码”。观察 Agent 的行为:
第一步,它应该先读取.trae/skills/git-commit-helper/SKILL.md的内容。你可以在 TRAE 的日志面板里看到这个读取动作。如果没看到,说明 Skill 没被加载,检查文件夹路径和name字段。
第二步,它应该执行git diff --cached --stat。如果暂存区有变更,会返回文件列表;如果暂存区为空,会提示你先git add。这一步是 Skill 里定义的执行步骤,Agent 应该严格按照SKILL.md里的步骤来。
第三步,它应该生成提交信息并执行git commit。成功的话,你会看到类似这样的输出:
[main a1b2c3d] feat(user): 新增 getUserProfile 接口 1 file changed, 15 insertions(+), 2 deletions(-)第四步,Agent 应该返回提交结果,包括 commit hash 和提交信息。如果它只生成了提交信息但没有执行 commit,说明 Skill 里的步骤定义不够明确,需要在SKILL.md里把“执行git commit”这一步写得更具体。
我实测下来,第一次触发 Skill 时,Agent 有时会“犹豫”一下,先问你“是否要提交”,而不是直接执行。这是因为SKILL.md里的 description 没有明确说“自动执行”。如果你希望它直接执行,可以在 description 里加上“自动执行提交,无需二次确认”。但如果你希望保留确认环节,那就保持现状。
验证成功后,你可以试着改一下SKILL.md里的步骤,比如把提交信息的语言从中文改成英文,然后重新触发,看看 Agent 是否按照新的步骤执行。这个过程能帮你理解 Skill 的动态加载机制:每次触发时,Agent 都会重新读取SKILL.md的最新内容,而不是用缓存。
还有一个验证技巧:在 TRAE 里同时加载多个 Skill,然后输入一个模糊的请求,比如“帮我处理一下代码”。观察 Agent 会选择哪个 Skill。如果它选了不相关的 Skill,说明那个 Skill 的 description 写得太宽泛,需要收窄触发条件。这个测试能帮你优化 Skill 的描述精度。
5. 常见报错排查:401、local proxy failed、reading choices、OAuth
这一节把我在接入过程中真实遇到过的报错和排查过程整理出来。你大概率会碰到其中至少一个。
401 Unauthorized。这是最常见的报错,原因通常有三个:Key 复制不完整、Key 已过期、Base URL 和 Key 不匹配。排查步骤:先用 curl 直接请求https://taotoken.net/api/v1/chat/completions,如果 curl 也报 401,那就是 Key 的问题;如果 curl 正常但 TRAE 报 401,那就是 TRAE 的配置里 Key 填错了。注意 TRAE 的配置文件里 Key 字段有时候会被截断,特别是 Key 比较长的时候,检查一下有没有换行或者空格。
local proxy failed。这个报错通常出现在 Cline 或 Claude Code 里,原因是工具尝试走本地代理但代理没启动。排查步骤:检查你的环境变量里有没有HTTP_PROXY或HTTPS_PROXY,如果有,先 unset 掉再试。另外检查工具的配置里有没有开启“使用本地代理”的选项,关掉它。如果关掉之后还报这个错,检查 Base URL 是否写成了http://而不是https://,有些工具对协议头敏感。
reading choices 报错。这个报错通常长这样:Cannot read properties of undefined (reading 'choices')。原因是 API 返回的 JSON 结构不符合预期,工具在解析response.choices[0]时发现choices是 undefined。排查步骤:先用 curl 看原始返回,如果返回的是{"error": {"message": "..."}}而不是标准的{"choices": [...]},说明请求被拒绝了。常见原因是 Model ID 填错了,或者请求体里缺少messages字段。检查 TRAE 或 Cline 的模型配置,确保 Model ID 和 TaoToken 支持的模型列表一致。
OAuth 相关报错。如果你在 Claude Code 里看到 OAuth 报错,比如OAuth token expired或OAuth flow failed,原因是 Claude Code 默认走 Anthropic 的 OAuth 认证,而不是 API Key 认证。解决方法是在~/.claude/settings.json里显式配置ANTHROPIC_API_KEY和ANTHROPIC_BASE_URL,并且把ANTHROPIC_AUTH_TOKEN设为空字符串,强制它走 API Key 模式。配置片段如下:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "你的TaoTokenKey", "ANTHROPIC_AUTH_TOKEN": "" } }改完之后重启 Claude Code,OAuth 报错应该就消失了。
Skill 不触发。这个不算报错,但比报错更让人头疼。Agent 就是不调用你写的 Skill,你也不知道为什么。排查步骤:第一,检查SKILL.md的description是否包含用户请求里的关键词。比如用户说“提交代码”,你的 description 里至少要包含“提交”“commit”这类词。第二,检查 Skill 文件夹是否在正确的目录下,TRAE 是.trae/skills/,Cline 是.cline/skills/。第三,检查name字段和文件夹名是否一致。第四,在 TRAE 的设置里确认 Skill 已经被加载,如果列表里没有,说明路径不对。
模型返回空内容。有时候 Agent 触发了 Skill,但返回的内容是空的。原因通常是max_tokens设得太小,或者模型在生成过程中被截断。检查 TRAE 或 Cline 的模型配置里有没有max_tokens限制,如果有,调大到 4096 或更高。另外检查SKILL.md里的步骤是否太长,导致模型在读取时超出了上下文限制。如果步骤确实很长,考虑拆分成多个 Skill。
git commit 失败。如果 Agent 执行了git commit但报错,常见原因是 git 用户信息没配置。在终端里执行git config user.name "你的名字"和git config user.email "你的邮箱",然后再试。另外如果暂存区为空,git commit也会失败,这个在SKILL.md的注意事项里已经写了,Agent 应该会提示你先git add。
把这些报错排查动作过一遍,你基本就能应对 90% 的接入问题了。剩下的 10% 通常是工具版本差异导致的,遇到时先看工具的日志面板,找到具体的错误码,再对照上面的排查思路。
6. 让 Skills 真正跑起来:从单点验证到工作流组合
单点验证通过之后,下一步是把多个 Skill 组合起来,形成一条完整的工作流。这才是 Skills 真正发挥价值的地方。
回到前面提到的 Spec Coding 场景。你可以创建三个角色型 Skill:requirement-analyst、system-architect、task-planner,再加一个工具型 Skillfeishu-doc-writer。每个 Skill 的SKILL.md里定义清楚输入、输出和执行步骤。然后在 TRAE 里按顺序触发:先让requirement-analyst分析需求,输出REQUIREMENT.md;再把REQUIREMENT.md作为输入,触发system-architect,输出DESIGN.md;接着触发task-planner,输出TASKS.md;最后让 Agent 根据TASKS.md执行编码。
这个流程的关键在于 Skill 之间的输入输出要能衔接。requirement-analyst的输出格式要固定,比如必须是 Markdown 格式,包含“需求概述”“用户故事”“边界条件”三个章节。system-architect的SKILL.md里要写明“读取REQUIREMENT.md文件”,这样 Agent 才知道去哪里找输入。
我实测下来,这种多 Skill 组合的工作流,比单个大而全的 Skill 稳定得多。因为每个 Skill 只做一件事,SKILL.md可以写得很具体,Agent 执行时不容易跑偏。而且当某个环节出问题时,你只需要改那一个 Skill,不用动整个流程。
如果你想让 Agent 自动调度这些 Skill,可以在项目根目录放一个AGENT.md,在里面写清楚工作流的顺序和触发条件。比如:
# 工作流调度 当用户提出新需求时,按以下顺序执行: 1. 触发 requirement-analyst,生成 REQUIREMENT.md 2. 触发 system-architect,读取 REQUIREMENT.md,生成 DESIGN.md 3. 触发 task-planner,读取 REQUIREMENT.md 和 DESIGN.md,生成 TASKS.md 4. 根据 TASKS.md 逐项执行编码任务这样 Agent 在收到新需求时,会自动按顺序触发各个 Skill,不需要你手动指定。
最后说一个实用技巧:把常用的 Skill 做成模板,放在一个公共目录里,比如~/.trae/skills-templates/。新项目开始时,直接把需要的 Skill 复制到项目的.trae/skills/目录下,改一下description里的项目特定关键词,就能快速复用。这样你积累的 Skill 越多,新项目的启动速度就越快。
Skills 这东西,概念听起来简单,但真正跑通需要把接入层、配置层、触发层都打通。我建议你先从本文的git-commit-helper开始,把它跑通,然后再尝试写第二个、第三个。每写一个 Skill,你对 Agent 的理解就会深一层。等你手里有五六个可复用的 Skill 时,你会发现 Agent 真的从“聊天机器人”变成了“能干活的人”。
如果你在接入过程中遇到问题,可以先去看 TaoToken 的接入文档,里面有针对不同工具的配置示例。API Key 在控制台的 API Keys 页面生成,模型对话功能可以在模型对话页面直接测试。长期做编码和 Agent 工作流的话,Coding Plan 会更划算一些。先把第一个 Skill 跑起来,剩下的就是迭代的事了。