1. 为什么你的 Agent 总是“会调工具但干不好活”
很多人第一次接触 OpenClaw Skill,会下意识把它当成插件:装上就多一个按钮,点一下就能跑。实际用下来你会发现,插件思维解决的是“有没有这个能力”,而 Skill 解决的是“这件事到底该怎么做”。这两个问题完全不是一回事。
我举个最常见的场景。你给 Agent 配了 exec 工具,它能跑命令;配了 browser 工具,它能开网页。可当你让它“把测试环境部署一下”,它可能上来就git pull,然后直接重启服务,中间不备份、不检查端口、不验证健康状态。工具它都会用,但顺序全错。这时候你缺的不是工具,是一份操作手册。
OpenClaw Skill 就是这份操作手册。它用 SKILL.md 定义“遇到某类任务时按什么步骤做、先检查什么、调用哪些工具、结果怎么交付”。OpenClaw 不会把每个 Skill 的全文都塞进系统提示词,而是先扫描可用 Skill,把名称、描述、路径放进提示词,等模型判断任务匹配时,再按需读取对应的 SKILL.md。这样设计的好处很现实:你装 30 个 Skill 也不会把上下文窗口挤爆。
这篇聚焦落地路径:怎么用 SKILL.md 定义能力、怎么通过 CLI 加载、怎么驱动 Agent 执行并验证结果。我会给出可复制的 SKILL.md 模板和目录结构,演示 CLI 调用与结果验证,帮你快速跑通一个自定义 Skill。适合已经用过 OpenClaw、想让 Agent 从“能调用工具”进化到“稳定完成某类任务”的人。如果你还没配好模型接入,可以先用 TaoToken 的模型对话快速验证 Agent 行为,再回来做 Skill 扩展。
2. OpenClaw Skill 前置准备:目录结构、加载优先级与 CLI 环境
在写第一个 SKILL.md 之前,得先搞清楚 OpenClaw 从哪里加载 Skill。这一步没弄明白,后面会出现“文件明明在,Agent 却说没有这个 Skill”的经典问题。
OpenClaw 会从多个位置扫描 Skill,优先级从高到低大致是:<workspace>/skills、<workspace>/.agents/skills、~/.agents/skills、~/.openclaw/skills、安装包自带的 bundled skills,最后是配置里的skills.load.extraDirs。同名 Skill 在多个位置存在时,优先级高的会覆盖低的。这个设计允许你做三件事:项目级定制(某个 workspace 放专用 Skill)、个人级复用(自己机器上一套通用 Skill)、系统级兜底(OpenClaw 自带默认能力说明)。
一个 Skill 就是一个目录,最核心的文件是SKILL.md。目录结构可以很简单:
my-workspace/ └── skills/ └── seo-report/ ├── SKILL.md ├── references/ │ └── checklist.md └── scripts/ └── fetch_page.shSKILL.md里用 YAML frontmatter 写技能名称、描述、要求、环境条件,正文写具体操作流程。references/和scripts/是可选的,用来放详细资料和辅助脚本,模型需要时才会去读。
CLI 环境方面,确认openclaw命令可用:
openclaw --version openclaw skills list如果openclaw不在 PATH 里,检查安装方式,或者用绝对路径调用。skills list能列出当前扫描到的所有 Skill,这是你后续排查的第一入口。
这里有个关键认知:文件存在不等于 Agent 能用。一个 Skill 可能因为环境变量缺失、二进制不存在、插件未启用、allowlist 限制、当前 agent 不匹配而不可用。所以排查时不要只看文件夹,要看eligible。openclaw skills list --eligible显示的才是当前 Agent 真正符合条件、能出现在提示词里的 Skill。
如果你打算让 Agent 在 Skill 里调用模型做内容生成或分析,建议先把模型接入配好。TaoToken 提供兼容的 API 接入,Base URL 用https://taotoken.net/api,在 console 里创建 API Key 后填进配置即可。这样 Skill 里涉及模型调用的步骤才能跑通。具体接入文档在 doc 页面有完整说明,API Key 在 api-keys 页面管理。
3. 可复制配置:SKILL.md 模板与 settings 片段
这一节是核心。我给出一个可直接复制的 SKILL.md 模板,再配一份 settings 片段,让你把 Skill 真正挂到 Agent 上。
先看 SKILL.md 模板。这个例子做的是“网页 SEO 报告”,触发条件清晰、步骤短、输出格式固定:
--- name: seo-report description: Generate a structured SEO analysis report from a webpage or keyword list. Use when the user asks for SEO analysis, content gap analysis, keyword planning, or page optimization advice. version: 1.0.0 requires: tools: - browser - exec env: - TAOTOKEN_API_KEY --- # SEO Report Skill Use this skill when the user asks for SEO analysis, content gap analysis, keyword planning, or page optimization advice. ## Workflow 1. Confirm the target page URL or keyword list with the user. 2. Fetch or inspect the content using the browser tool. 3. Extract title, headings, links, metadata, and visible content. 4. Identify SEO risks and opportunities. 5. Produce a report with prioritized recommendations. ## Output Return a report with these sections: - Summary - Issues - Recommendations - Next actions ## Failure Handling - If the page cannot be fetched, report the HTTP status and stop. - If content is empty, ask the user to confirm the URL. - Do not guess keyword volumes without a data source.frontmatter 里的name和description最关键。description要写清楚“什么时候用”,因为模型就是靠它判断任务是否匹配。requires声明依赖的工具和环境变量,OpenClaw 会据此判断这个 Skill 是否 eligible。
接下来是 settings 片段。OpenClaw 的配置通常放在 workspace 的配置文件里,路径和字段名以你本地版本为准。下面是一个可参考的 JSON 片段,用于声明额外 Skill 目录和模型接入:
{ "skills": { "load": { "extraDirs": [ "./skills", "./.agents/skills" ] } }, "models": { "providers": { "taotoken": { "baseUrl": "https://taotoken.net/api", "apiKeyEnv": "TAOTOKEN_API_KEY", "models": { "default": "claude-sonnet-4-5" } } } } }如果你用的是 TOML 风格配置,等价写法:
[skills.load] extraDirs = ["./skills", "./.agents/skills"] [models.providers.taotoken] baseUrl = "https://taotoken.net/api" apiKeyEnv = "TAOTOKEN_API_KEY" [models.providers.taotoken.models] default = "claude-sonnet-4-5"三件套要记牢:Base URL + Key + Model ID。Base URL 是https://taotoken.net/api,Key 通过环境变量注入,Model ID 填你实际要用的模型。这三样缺一个,Skill 里涉及模型调用的步骤就会失败。
配置写完后,把 Skill 目录放到<workspace>/skills/seo-report/,然后跑:
openclaw skills check openclaw skills list --eligiblecheck会告诉你格式是否正常、是否可见;list --eligible会告诉你当前 Agent 能不能用。两个都通过,才算真正挂上。
4. 验证请求:CLI 调用与成功结果确认
配置挂上后,别急着上复杂任务。先用一个小任务验证 Agent 是否真的读取了 SKILL.md 并按流程执行。
第一步,确认 Skill 可见:
openclaw skills list --eligible输出里应该能看到seo-report。如果看不到,回到上一节检查 frontmatter 和 requires。
第二步,看详细信息:
openclaw skills info seo-report这个命令会显示 Skill 的路径、来源、依赖状态。重点看requires里的工具和环境变量是否都满足。
第三步,让 Agent 执行一个小任务。在对话里输入:
使用 seo-report skill 分析 https://example.com 这个页面,输出报告。观察 Agent 的行为。如果 Skill 生效,它应该先确认目标 URL,然后用 browser 工具抓取页面,提取 title、headings、links,最后按 Summary / Issues / Recommendations / Next actions 四段输出。如果它直接写了一段泛泛的建议,说明 Skill 没被读取,或者 description 没匹配上。
第四步,验证模型调用是否走通。如果 Skill 里涉及模型分析,检查环境变量:
echo $TAOTOKEN_API_KEY有值说明注入成功。再跑一个最小请求验证 API 连通性:
curl -s https://taotoken.net/api/v1/models \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" | head -c 500返回模型列表就说明 Base URL 和 Key 都对。如果返回 401,检查 Key 是否过期或拼写错误。
第五步,观察 Agent 是否按 Skill 的输出格式交付。这是最容易被忽略的验证点。Skill 的价值不只是“做了”,而是“按固定结构做”。如果输出缺了 Next actions 这一段,说明模型没完全遵循 SKILL.md,需要把 Output 部分写得更明确,比如加上“必须包含以下四个小节,缺一不可”。
实测下来,一个 Skill 从挂上到稳定执行,通常要改 2 到 3 轮。第一轮改 description 让触发更准,第二轮改 workflow 让步骤更具体,第三轮改 output 让格式更固定。别指望一次写对。
5. 本篇常见错排查:401、local proxy failed、reading choices、OAuth
这一节对照真实报错,逐个排查。这些错误我在配置过程中基本都踩过。
401 Unauthorized。最常见。原因通常是 API Key 没注入、Key 过期、或者 Base URL 写错。检查顺序:先echo $TAOTOKEN_API_KEY确认环境变量有值,再确认配置里baseUrl是https://taotoken.net/api,最后确认 Key 是在 api-keys 页面创建的、还有效。如果用的是 settings 里的apiKeyEnv,确认变量名和实际环境变量名完全一致,大小写敏感。
local proxy failed。这个报错通常出现在 Agent 尝试通过本地代理访问模型时。检查配置里有没有残留的代理设置,或者环境变量里有没有HTTP_PROXY/HTTPS_PROXY指向一个不可用的地址。把无关的代理配置清掉,让请求直连 Base URL。另外确认网络能正常访问taotoken.net。
reading choices 相关报错。这类错误一般出现在模型返回格式不符合预期时,比如 Skill 里要求模型输出 JSON,但模型返回了自然语言。排查方向:检查 SKILL.md 的 Output 部分是否明确要求了格式;如果要求 JSON,在 prompt 里加一句“只返回 JSON,不要额外解释”;确认 Model ID 填的是支持结构化输出的模型。
OAuth 相关报错。如果你用的是 Claude Code 或类似需要 OAuth 的客户端,报错通常和 token 刷新有关。检查 OAuth 配置里的回调地址、client id、client secret 是否和实际一致。如果是 Codex 的auth.json,确认文件路径和字段名正确。这类问题建议直接看接入文档里的对应章节,比盲猜快。
排查通用思路:先看openclaw skills check和openclaw skills list --eligible,确认 Skill 本身没问题;再看环境变量和配置,确认接入没问题;最后看 Agent 实际行为,确认 Skill 被读取。三层逐层排除,比一上来就改 SKILL.md 高效得多。
6. 从 Skill 到稳定 Agent:下一步怎么走
跑通一个自定义 Skill 之后,你会发现真正的价值不在“多了一个技能”,而在“把一套可复用工作方法固化下来”。工具提供能力,Skill 提供方法。工具回答“能做什么”,Skill 回答“应该怎么做”。工具越多,模型越容易乱选;Skill 的作用就是把某类任务的正确操作路径固定住。
接下来你可以做几件事。第一,把常做的任务逐个拆成 Skill,每个 Skill 只解决一类问题,步骤短而具体,输出格式固定。第二,用openclaw skills list --eligible定期检查,清理描述相似、互相干扰的 Skill,宁愿少而准,不要多而乱。第三,注意安全边界:Skill 是行为指导,不是硬限制。真正的权限控制仍然要靠 tool policy、审批、沙箱、allowlist。设计 Skill 时想清楚它会不会引导 Agent 调用危险工具,该用什么策略限制。
如果你想让 Agent 长期跑编码或 Agent 类任务,可以考虑 Coding Plan,把模型调用和 Skill 执行稳定下来。需要验证模型行为时,用模型对话快速试;需要管理 Key 时,去 api-keys 页面;接入细节看 doc。把 Skill 和接入配好,你的 OpenClaw 才算真正从“能调用工具”走到“稳定完成某类任务”。