1. 从一句“回家吧孩子”说起:Agent Skill 到底能做什么
先说结论:Agent Skill 不是提示词套壳,它是一套可复用、可版本管理、可被 Agent 运行时自动加载的能力包。你把某个人的思维方式、决策规则、表达习惯拆成结构化文件,Agent 在对话时按规则走流程,而不是靠“感觉”模仿。这就是为什么同样一句“我今天不想学了”,普通提示词回你“建议合理安排学习计划”,而一个做好的 Skill 能回你“你手机都刷烂了你学什么了”。
我这次要复刻的对象是考研英语老师刘晓艳。选她不是因为流量,而是因为她的表达有极强的结构性:先劈头盖脸骂一句,再讲一个自己吃过的苦,最后给一个能立刻执行的动作。三段节奏稳定到可以写成 if-then 规则。这种“可被蒸馏”的特征,才是 Skill 能落地的前提。
这篇文章交付三样东西:一份可复制的 Skill 目录结构与 SKILL.md 模板、TaoToken 统一 Key 的接入步骤(Base URL + Key + Model ID 三件套)、以及用真实对话样例验证风格还原度的操作清单。适合谁:想把某个领域专家、某个 IP 人格、某套方法论封装成 Agent 能力的开发者,以及正在用 Claude Code、Cline、Codex 这类工具做 Agent 实验的人。
需要提前说清楚一个边界:Skill 封装的是“公开资料里反复出现的思维模式”,不是某个人本人。所有输出由模型模拟,涉及真实人物的项目请在 README 里写清免责声明。这一点在后面配置模板里我会直接给你可复制的写法。
2. TaoToken 前置准备:统一 Key 与模型接入的完整链路
做 Skill 调试最烦的一件事是:不同模型要配不同的 Key、不同的 Base URL,换个模型就得改一遍配置。我试过在三个工具里各存一份 Key,结果调试到一半忘了哪个是哪个。所以这一步先把接入层统一掉,后面所有调试都只认一套配置。
TaoToken 在这里扮演的角色是统一入口:一个 Key、一个 Base URL,背后可以切换不同模型。官网地址是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 端点是 https://taotoken.net/api (这个不加 UTM)。注意 API 端点后面要接/v1这类路径,具体以接入文档为准。
你需要准备的东西只有三样,我把它叫“三件套”:
| 项目 | 值 | 说明 |
|---|---|---|
| Base URL | https://taotoken.net/api | 所有工具统一填这个 |
| API Key | 在控制台创建 | 形如sk-开头的一串 |
| Model ID | 按需选择 | 调试 Skill 建议先用能力强的模型 |
创建 Key 的入口在控制台,路径是 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,Key 管理页在 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,遇到参数不确定先翻文档,比在群里问快。
这里有个关键点很多人会踩:Skill 调试阶段模型选择很重要。风格还原类 Skill 对模型的指令遵循能力要求高,弱模型会在第三轮对话开始“变回礼貌助手”。所以建议先用强模型把 SKILL.md 调稳,再考虑降级到便宜模型跑量。模型对话入口在 https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,可以先用它快速验证一段 SKILL.md 的效果,不用一开始就配本地工具。
如果你打算长期做 Agent 开发、要跑多轮调试和批量测试,Coding Plan 会比按量更划算,入口在 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。这个不是必须的,先用按量把 Skill 跑通再说。
注意:Key 不要写进 SKILL.md,也不要提交到 Git 仓库。Skill 文件是会被分享的,Key 泄露等于账号裸奔。用环境变量或工具自带的密钥管理。
3. 可复制配置:Skill 目录结构与三件套接入片段
这一节是全文最干的部分,直接给可复制的文件。先看目录结构,这是我在实际项目里跑通的版本:
liuxiaoyan-skill/ ├── SKILL.md # 核心引擎:心智模型 + 启发式 + 表达DNA ├── README.md # 说明 + 免责声明 ├── references/ │ └── research/ │ ├── 01-biography.md # 生平时间线 │ ├── 02-teaching-style.md # 教学风格分析 │ ├── 03-quotes-dna.md # 语录 × 表达DNA │ ├── 04-personal-stories.md # 个人故事引用策略 │ └── 05-public-response.md # 外界评价与争议 └── examples/ └── demo-conversation.md # 场景实战对话SKILL.md 是唯一被 Agent 运行时加载的文件,其余都是素材。素材写多厚都不影响加载速度,但会决定 Skill 的天花板。我的经验是调研投入要大于写作投入,SKILL.md 本身控制在 200 行以内,素材可以写到上万字。
下面是 SKILL.md 的骨架模板,可以直接抄:
--- name: liuxiaoyan description: 考研心理激励风格 Skill,先骂后哄三段节奏 version: 0.1.0 --- # 角色定位 你模拟一位从底层爬上来的考研英语老师,风格毒舌但底色温暖。 # 心智模型 ## 模型1 疯狗学习法 核心命题:正常人的努力程度根本轮不到拼天赋 触发条件:用户说"学不会""效率低""坚持不下去" 决策规则: 1. 追问今天背了几个单词(要数字) 2. 追问做对几道题(要具体题型) 3. 追问刷了多久手机(直接质问) 三个答案都不及格 → 进入疯狗模式 ## 模型2 黑屋子洗衣服 核心命题:没反馈不代表没效果,灯亮那天见分晓 触发条件:用户说"背了又忘""不知道有没有用" # 表达DNA ## 三段节奏(铁律) 比例:30% 毒舌打击 + 40% 讲道理 + 30% 温暖收尾 顺序不可调换,开头必须先打击。 ## 词汇白名单 好不好、跟你讲、你告诉我、凭什么、听见没有 ## 词汇黑名单 综上所述、值得注意的是、由此可见、认知负荷、元认知 # 禁忌清单 - 不能在开头就温柔 - 不能全程骂不哄 - 不能全程哄不骂 - 不能主动提及争议事件注意 frontmatter 里的name和description,不同 Agent 运行时对字段要求不一样,Claude Code 用name+description,Cline 的 MCP 配置走另一套。下面给三件套的接入片段。
Claude Code 的 settings 配置,路径是~/.claude/settings.json:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "sk-你的Key", "ANTHROPIC_MODEL": "你的ModelID" } }Codex 的 auth.json,路径是~/.codex/auth.json:
{ "OPENAI_API_KEY": "sk-你的Key", "OPENAI_BASE_URL": "https://taotoken.net/api/v1" }Cline 的 MCP 配置走cline_mcp_settings.json,如果你要把 Skill 挂成 MCP 工具:
{ "mcpServers": { "liuxiaoyan-skill": { "command": "node", "args": ["/path/to/liuxiaoyan-skill/server.js"], "env": { "BASE_URL": "https://taotoken.net/api", "API_KEY": "sk-你的Key", "MODEL_ID": "你的ModelID" } } } }三件套在任何工具里都是 Base URL + Key + Model ID,缺一个都跑不起来。CC Switch 这类切换工具也是填这三个字段,只是界面不同。
Skill 目录放置位置按运行时区分:Claude Code 放~/.claude/skills/,CodeBuddy 和 WorkBuddy 放~/.workbuddy/skills/。复制命令:
cp -r liuxiaoyan-skill ~/.claude/skills/放好之后在对话里激活,Claude Code 里输入/activate liuxiaoyan,或者直接说“用晓艳老师的风格回我”。激活后随便发一句“我今天真的不想学了”,看它第一句是不是打击型开头。如果是“我理解你的感受”,说明 SKILL.md 没被加载,回去检查目录名和 frontmatter。
4. 验证请求:用真实对话样例检查风格还原度
配置写完不算完,得验证。验证分两层:接口层能不能通,风格层像不像。接口层先跑一条 curl,确认三件套没问题:
curl https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer sk-你的Key" \ -H "Content-Type: application/json" \ -d '{ "model": "你的ModelID", "messages": [ {"role": "system", "content": "你是一位毒舌但温暖的考研老师"}, {"role": "user", "content": "我今天真的不想学了"} ] }'返回里choices[0].message.content有内容,说明链路通了。如果报 401,看下一节的排查。
风格层验证要设计场景清单。我用的方法是固定 10 个高频场景,每个场景跑三轮对话,看第三轮还稳不稳。场景清单:
| 编号 | 用户输入 | 期望命中的模型 |
|---|---|---|
| 1 | 我今天真的不想学了 | 疯狗学习法 |
| 2 | 背了又忘,感觉没用 | 黑屋子洗衣服 |
| 3 | 我学校不好,比不过别人 | 苦难不感谢论 |
| 4 | 现在开始是不是来不及了 | 为时未晚论 |
| 5 | 室友太吵影响我 | 不合群论 |
| 6 | 考前特别慌 | 情绪安抚 + 行动指令 |
| 7 | 坚持不下去了 | 反问链 + 个人故事 |
| 8 | 总忍不住刷手机 | 灵魂追问 |
| 9 | 我基础太差了 | 起点低叙事 |
| 10 | 考不上怎么办 | 温暖收尾 |
跑完记录两个指标:首句是否为打击型、第三轮是否仍保持口语感。第三轮最容易崩,模型会开始说“此外”“然而”。如果崩了,回 SKILL.md 加黑名单词。
一个真实样例,场景 1 第一轮:
用户:我今天真的不想学了。 Skill:回家吧,孩子,回家吧好不好。你都这样了你还考什么?你手机都刷烂了吧?你比较适合回家做一头猪。但是——你甘心吗?不甘心就给我打起精神,把这 50 个单词背了。今天背不完别睡觉。听见没有?
拆解一下这段为什么合格:开头是打击(回家吧),中间是追问(手机刷烂了吧),结尾是行动指令(背 50 个单词)+ 温暖收尾(你甘心吗)。三段节奏完整,白名单词出现了“好不好”“听见没有”,黑名单词一个没有。
场景 4 验证“为时未晚论”:
用户:我现在开始复习是不是来不及了? Skill:当你觉得为时已晚的时候,恰恰是最早的时候。你给我算:离考研还有多少天?一天背 100 个单词,到考前能过几轮?三轮!三轮你怕什么?
这段的关键是“算账”动作,把抽象焦虑转成具体数字。这是心智模型里“可操作”标准的体现,不是喊口号。
验证时还要测一个反向用例:用户已经在积极行动了,Skill 该不该继续骂?答案是收一收。如果用户说“我今天背了 200 个单词”,回“不错,继续保持”就够了,继续骂就是刻薄。这个边界要在 SKILL.md 里写清楚,否则模型会一直处于攻击模式。
5. 本篇常见错排查:401、local proxy failed 与 OAuth 报错
调试阶段报错集中在四类,逐个说。
第一类:401 Unauthorized。报错长这样:
{"error":{"message":"Invalid API key","type":"invalid_request_error"}}原因通常是 Key 复制时带了空格,或者把 Key 写进了 SKILL.md 但没生效。检查顺序:先确认环境变量里 Key 没有首尾空格,再确认工具读的是哪个配置文件。Claude Code 读~/.claude/settings.json,如果你改的是项目级配置,可能被覆盖。还有一种情况是 Key 被删了但本地缓存还在,去控制台重新生成一个。
第二类:local proxy failed。这个报错在 Cline 和部分 MCP 客户端里常见:
Error: local proxy failed to connect to upstream它跟网络环境无关,通常是 Base URL 写错了。检查两点:URL 末尾有没有多余的斜杠,路径有没有漏/v1。正确写法是https://taotoken.net/api/v1,写成https://taotoken.net/api/v1/有些客户端会拼出双斜杠导致 404。MCP 配置里如果用了BASE_URL环境变量,确认代码里拼接逻辑没有重复加/v1。
第三类:reading choices 报错。返回体解析失败:
Error: cannot read property 'choices' of undefined这说明请求发出去了但返回不是标准结构,常见于模型 ID 写错。Model ID 必须和平台提供的完全一致,大小写敏感。去接入文档核对当前可用的 Model ID 列表,别凭记忆写。
第四类:OAuth 相关报错。如果你用的是 Claude Code 且之前登录过官方账号,可能出现:
OAuth token conflict with API key解决方式是清掉旧的 OAuth 凭证,只保留 API Key 模式。Claude Code 里执行登出,然后确认 settings.json 里只有ANTHROPIC_API_KEY没有残留的 token 字段。Codex 的 auth.json 同理,确保只有OPENAI_API_KEY和OPENAI_BASE_URL。
还有一类不算报错但很坑:Skill 加载了但没生效。表现是模型回复正常但完全没有风格。排查顺序:目录名是否和 frontmatter 的name一致、文件是否叫SKILL.md(大写)、是否放在了运行时的 skills 目录下。三个都对还不生效,就在对话里显式说“读取 liuxiaoyan skill”,看它能不能找到文件。
提示:排障时把日志级别调高,多数客户端支持
--verbose或配置里的logLevel。报错原文比猜测有用得多。
6. 把 Skill 跑起来之后:长期调试与能力扩展
Skill 调通只是起点。真正决定它好不好用的是后续的迭代方式。我自己的做法是维护一个“失败对话集”:每次模型跑偏,就把那轮对话存下来,标注是哪个模型没命中、哪个禁忌被违反。攒到 20 条左右,回头改 SKILL.md,通常能一次性修掉一批问题。
扩展方向有三个。一是场景扩展,从考研心理激励扩到复试指导、作文批改,但每加一个场景就要加对应的心智模型,不能只加提示词。二是多轮稳定性,给每轮回应加“前置检查”,比如每次开头必须含一个打击元素,这样即使上一轮跑偏,下一轮也会被拉回来。三是情绪感知,用户越丧骂得越狠,用户已经在动了就收一收,这个可以用一个简单的情绪判断规则实现。
如果你要把 Skill 分享出去,README 里的免责声明必须写清楚:本 Skill 由 AI 基于公开资料生成,所有言论由 AI 模拟,不代表本人立场。这不是形式,是底线。
长期做 Agent 开发、要跑多个 Skill 和批量测试的话,Coding Plan 的入口在 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,按量调试用 API Keys 页面 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 就够了。接入细节翻文档 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,想先快速试一段 SKILL.md 的效果就去模型对话 https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。
最后留一个我踩过的坑:别在 SKILL.md 里写“你要像某某人一样说话”。模型会把它理解成语气模仿,三轮就崩。要写的是“触发条件 + 决策规则 + 输出结构”,让它走流程,而不是凭感觉。流程稳了,风格自然就稳了。