ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

【干货】Claude Agent Skills架构解析——无需编程的技能注入与上下文改写技术!

【干货】Claude Agent Skills架构解析——无需编程的技能注入与上下文改写技术! 1. Claude Agent Skills 到底是什么从“提示模板”到上下文改写很多人第一次听到 Claude Agent Skills会下意识把它和函数调用、插件系统、MCP 工具混在一起。我一开始也这么以为直到把 skill-creator 这个技能文件夹拆开看了一遍才发现它根本不是“执行代码”那套逻辑。用一句话概括Claude Agent Skills 是一套基于提示的元工具架构通过把领域专属指令注入对话上下文让 Claude 换一套“大脑配置”去处理任务全程不需要你写一行可执行程序。它适合谁适合那些想让 Agent 在特定场景下更专业、但又不想去啃函数签名和 SDK 的开发者。比如你想让 Claude 按公司惯用格式写内部公告或者按固定流程做代码审查传统做法是写一堆系统提示词越堆越长还容易互相打架。Skills 的思路是把这些提示拆成独立文件夹按需加载用到哪个注入哪个。核心检索词先摆清楚Claude Agent Skills、技能注入、上下文改写、SKILL.md、元工具。这几个词贯穿全文你记住它们后面看配置就不会迷路。先做个术语对照这是最容易搞混的地方术语含义Skill 工具首字母大写出现在工具数组里的唯一元工具负责加载所有技能skills小写单个技能如 pdf、skill-creator、internal-comms本质是一段待注入的提示模板调用流程可以这样理解用户发消息 → Claude 收到三件套用户消息、普通工具列表、Skill 元工具→ Skill 工具的描述字段里拼好了所有可用技能的“目录” → Claude 用原生语义理解把用户意图和技能描述做匹配 → 命中后调用 Skill 工具并传入技能名 → 系统加载对应 SKILL.md → 展开为详细指令 → 作为新用户消息注入对话上下文 → 同时可能切换允许的工具和模型版本 → 继续对话。注意这里的关键差异传统工具是“执行并返回结果”Skills 是“让 Claude 准备好解决问题”。它不跑 Python、不跑 JavaScript、不启 HTTP 服务决策完全发生在 transformer 的前向传播里而不是应用代码的 if-else 里。没有算法级技能路由没有嵌入、分类器、正则或关键词匹配是否调用、调用哪一个全由 Claude 自己读描述后推理决定。这也是为什么它叫“上下文改写”——技能被触发的那一刻对话上下文里多了一段原本不存在的详细指令Claude 后续的思考路径就被这段指令重新塑形了。你不需要改模型权重也不需要写胶水代码改的是上下文效果却像换了个专门调过的模型。理解了这一层后面的目录结构和配置片段就都是水到渠成的事。下面我按“先搭环境、再写文件、再验证、再排错”的顺序走一遍你可以直接跟着复现。2. TaoToken 前置准备把 Base URL、Key、Model ID 三件套配齐在动手写 SKILL.md 之前得先有一个能稳定调用 Claude 的入口。我实测下来用 TaoToken 做接入层比较省心它的 API 地址是 https://taotoken.net/api兼容 Anthropic 的请求结构Skills 相关的字段能原样透传不用额外做适配。这一步的目标很简单拿到三件套——Base URL、API Key、Model ID。任何接入问题九成都能归到这三样里某一样配错了。先注册并登录进控制台。控制台地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 在里面能看到你的账户信息和用量。然后去 API Keys 页面创建一个 Key地址是 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。创建时给它起个能认出来的名字比如 claude-skills-dev方便后面区分环境。Key 只在创建时完整显示一次复制下来存到安全的地方别直接写进会提交到 Git 的文件里。Model ID 这块Skills 对模型版本有要求建议用较新的 Claude 模型。具体可用的模型名在文档里能查到接入文档地址是 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。如果你只是想先验证模型通不通可以打开模型对话页面 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 发一句话试试能正常回就说明 Key 和网络没问题。三件套整理成一张表配的时候对着填配置项值说明Base URLhttps://taotoken.net/api不带 UTM请求用API Key控制台创建形如 sk- 开头只显示一次Model ID按文档选建议较新 Claude 模型如果你用的是 Claude Code 这类命令行工具通常需要设置环境变量。以类 Unix 系统为例可以这样导出export ANTHROPIC_BASE_URLhttps://taotoken.net/api export ANTHROPIC_API_KEY你的Key export ANTHROPIC_MODEL你的ModelIDWindows PowerShell 下换成$env:ANTHROPIC_BASE_URLhttps://taotoken.net/api $env:ANTHROPIC_API_KEY你的Key $env:ANTHROPIC_MODEL你的ModelID这里有个坑要提前说Base URL 结尾不要多加斜杠也不要写成 /api/多数客户端会自己拼路径多一个斜杠就可能 404。另外 Key 不要带引号以外的空格复制时容易带上换行。配好之后先别急着写技能用一条最小请求确认链路通。下面这段 curl 可以直接跑curl https://taotoken.net/api/v1/messages \ -H x-api-key: 你的Key \ -H anthropic-version: 2023-06-01 \ -H content-type: application/json \ -d { model: 你的ModelID, max_tokens: 64, messages: [{role: user, content: 回复 ok 两个字母}] }返回里能看到 content 数组和正常的 stop_reason就说明前置准备完成了。如果这里就报错先别往下走去第 5 节对照报错排查。3. 可复制配置SKILL.md 目录结构与 frontmatter 片段现在进入正题。一个 Skill 就是一个文件夹核心是 SKILL.md 这个 Markdown 文件文件名区分大小写别写成 skill.md。文件夹里还可以带可选的捆绑文件放在 /scripts、/references、/assets 三个目录下可以是 Python 脚本、Shell 脚本、字体定义、模板等。先看目录结构这是 skill-creator 的简化版你可以照着建.claude/skills/ └── skill-creator/ ├── SKILL.md ├── LICENSE.txt └── scripts/ ├── init_skill.py └── package_skill.pySkills 的发现来源有多个Claude Code 会扫描用户设置目录~/.config/claude/skills/、项目设置目录.claude/skills/、插件提供的技能以及内置技能汇总成可用技能列表。项目级技能放在 .claude/skills/ 下跟着仓库走团队协作时最方便。SKILL.md 分两部分frontmatter 和正文内容。frontmatter 用 YAML 写配置技能如何被发现和使用正文是 Claude 调用技能时实际收到的提示。frontmatter 片段以 skill-creator 为例--- name: skill-creator description: Guide for creating effective skills. This skill should be used when users want to create a new skill (or update an existing skill) that extends Claudes capabilities with specialized knowledge, workflows, or tool integrations. license: Complete terms in LICENSE.txt ---name 是技能标识调用时传的就是它。description 最关键Claude 就是靠读这段描述来判断要不要触发这个技能所以要写清楚“什么时候用”而不只是“这是什么”。license 可选指向许可证文件。正文部分就是注入到上下文里的指令。推荐的结构是先给核心指令再给工作流程最后给边界和示例。减少对外部文件的引用能内联就内联因为每次调用都要重新读。一个“读取-处理-写入”模式的完整 SKILL.md 示例--- name: report-formatter description: 当用户需要把原始数据整理成结构化报告时使用。适用于格式转换、数据清理和报告生成场景。 allowed-tools: Read, Write --- ## Processing Workflow 1. Read input file using Read tool 2. Parse content according to format 3. Transform data following specifications 4. Write output using Write tool 5. Report completion with summary ## Output Format - 标题用一级标题 - 每个数据段用二级标题 - 结尾附一行统计摘要注意 allowed-tools 这个字段它控制技能激活后 Claude 能用哪些工具。写法有讲究比如只允许跑某个脚本allowed-tools: Bash(python {baseDir}/scripts/*:*), Read, Write{baseDir} 是技能目录的占位符运行时会被替换成实际路径。这样写既给了脚本执行权限又限制了范围不会让 Claude 拿到一个无限制的 Bash。再给一个“搜索-分析-报告”模式的片段适合代码库分析--- name: code-auditor description: 当用户想审查代码库中的安全模式或代码规范时使用。 allowed-tools: Grep, Read --- ## Analysis Process 1. Use Grep to find relevant code patterns 2. Read each matched file 3. Analyze for vulnerabilities 4. Generate structured report如果你用的是 Claude Code配置通常落在 settings 文件里。项目级的 .claude/settings.json 可以这样写把技能目录和模型参数一起固定下来{ skills: { directories: [.claude/skills] }, env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: 你的Key, ANTHROPIC_MODEL: 你的ModelID } }这里三件套又出现了一次Base URL、Key、Model ID。只要用到 Claude Code、Cline MCP 或 Codex 的 auth.json这三样就必须齐全缺一个都会在启动时报错。Codex 的 auth.json 结构类似把对应字段填进去即可。写完文件后检查两件事SKILL.md 的 frontmatter 是不是以 --- 开头和结尾YAML 缩进有没有用空格而不是 Tab。这两个地方出错技能会静默加载失败Claude 根本看不到它。4. 验证请求与成功结果确认技能真的被注入文件写好了不代表技能生效。得验证两件事技能有没有被扫描到以及触发后上下文有没有被改写。第一步确认技能列表。在 Claude Code 里可以问它当前有哪些可用技能或者直接看启动日志。如果技能没出现在列表里多半是目录位置不对或 frontmatter 格式有问题。第二步发一条能命中 description 的请求。比如你建了 report-formatter就发“把这份数据整理成报告”。观察 Claude 的响应里有没有出现技能名以及它是否按你写的 workflow 走。第三步看请求结构。Skills 被触发时系统会加载 SKILL.md、展开为详细指令、作为新用户消息注入对话上下文。你可以在调试模式下抓请求体会看到 messages 数组里多了一条注入的指令内容。这就是“上下文改写”的直接证据。一个成功的响应特征是这样的Claude 先调用了 Skill 工具参数里带着技能名然后后续回复明显遵循了 SKILL.md 里定义的步骤和输出格式。如果它只是泛泛回答没按你的 workflow 走说明 description 没匹配上或者技能压根没加载。用 curl 模拟一次带技能上下文的请求可以这样构造curl https://taotoken.net/api/v1/messages \ -H x-api-key: 你的Key \ -H anthropic-version: 2023-06-01 \ -H content-type: application/json \ -d { model: 你的ModelID, max_tokens: 512, messages: [ {role: user, content: 把这段数据整理成报告a1,b2,c3} ] }如果技能已挂载返回里能看到 Claude 决定调用 Skill 工具的过程。注意Skills 的注入是发生在服务端的客户端请求体里不一定直接看到注入内容但响应行为会体现出来。验证通过的标志我总结成三条技能出现在可用列表里、触发请求后 Claude 按 workflow 执行、输出格式符合 SKILL.md 定义。三条都满足说明技能注入链路是通的。如果只满足第一条后两条不满足问题通常在 description 的措辞上。Claude 是靠语义匹配的description 写得太抽象它就匹配不上具体意图。改法是把“什么时候用”写具体比如把“用于报告”改成“当用户需要把原始数据整理成结构化报告时使用”。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth这一节按真实报错来对。你大概率会碰到下面几个我一个个说清楚原因和解法。401 Unauthorized。这是最常见的。原因基本是 Key 不对或没带上。检查三处Key 有没有复制完整、请求头字段名对不对Anthropic 风格是 x-api-key不是 Authorization: Bearer、Key 有没有过期或被删。如果你在 Claude Code 里遇到 401先确认环境变量 ANTHROPIC_API_KEY 有没有生效可以 echo 一下看值对不对。还有一种情况是 Base URL 配错了请求打到了别的地址Key 自然不认。local proxy failed。这个报错通常出现在客户端配置了本地代理但代理没起来或者代理地址写错。注意这里说的是客户端自身的网络配置问题不是让你去搞什么网络工具。解法是检查客户端的代理设置如果不需要代理就关掉让请求直连 https://taotoken.net/api。环境变量里如果有 HTTP_PROXY、HTTPS_PROXY先 unset 掉再试。reading choices 相关报错。这类错误一般出现在响应解析阶段客户端期望的返回结构和实际拿到的不一致。常见原因是 Base URL 路径拼错比如把 /api 写成了 /api/v1 又叠加了客户端自己的 /v1变成 /api/v1/v1/messages。解法是 Base URL 只写到 https://taotoken.net/api让客户端自己拼后面的路径。另外检查 Model ID 是不是写错了模型名不对有时也会返回非预期结构。OAuth 相关报错。如果你用的是 Claude Code 的 OAuth 登录流程报错通常和 token 刷新有关。但如果你走的是 API Key 方式就不该触发 OAuth。检查配置里是不是同时存在 OAuth 凭据和 API Key两者冲突时会报错。解法是明确用 API Key 方式清掉 OAuth 相关的缓存文件重新用 Key 认证。把常见错和排查动作整理成表方便对照报错常见原因排查动作401Key 缺失/错误/过期检查 x-api-key 头和 Key 值local proxy failed客户端代理配置问题关闭代理或 unset 代理环境变量reading choicesBase URL 路径拼接错误Base URL 只写到 /apiOAuth认证方式冲突清 OAuth 缓存改用 API Key还有一个不报错但很烦的问题技能加载了但从不触发。这几乎都是 description 的问题。Claude 的匹配是纯语义的description 要写“用户想做什么时用这个技能”而不是“这个技能是什么”。把意图写进去命中率会明显提升。排错时如果拿不准先去接入文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 对照请求结构再去 API Keys 页面 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 确认 Key 状态。这两步能解决大部分接入层问题。6. 长期编码与 Agent 场景把 Skills 用成可复用的能力单元单次验证通过只是开始。真正有价值的是把 Skills 沉淀成团队可复用的能力单元。我自己的做法是每个技能一个文件夹跟着项目走放在 .claude/skills/ 下提交到仓库。这样新同事拉下代码就自带一套技能不用口头传“我们公司公告要怎么写”。技能设计上有几个经验。第一一个技能只干一件事description 写清楚触发条件别搞大杂烩。第二正文里的 workflow 步骤要具体到工具名和参数Claude 照着做就行。第三allowed-tools 按最小权限给能只给 Read 就别给 Bash。第四脚本放 /scripts 下用 {baseDir} 引用别写死绝对路径。如果你要长期跑编码类 Agent 任务比如自动审查、批量重构、按规范生成代码可以考虑用 Coding Plan 这类方案地址是 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。它适合需要持续调用、对额度有预期的场景比单次按量更可控。Claude Code 相关的接入细节可以参考 https://taotoken.net/claude-code-anthropic?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 里面有针对命令行工具的配置说明。如果你更习惯在对话里调试技能模型对话页面 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 可以快速试 description 的措辞改一版发一句看能不能命中比反复改文件快。最后说个我踩过的坑技能文件夹名和 frontmatter 里的 name 最好保持一致。虽然系统靠 name 识别但文件夹名不一致时排查起来会多绕一圈。还有SKILL.md 里的正文别写太长注入上下文是占 token 的把最关键的指令放前面细节放后面Claude 的注意力也是有预算的。把技能当成“可版本化的提示资产”来管理你的 Agent 就会越用越顺手而不是每次从零写系统提示。这套机制不写代码但改的是上下文效果实打实。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进