news 2026/10/10 22:56:44

OpenClaw 中 Tool 与 Skill 完整异同解析:从 SKILL.md 到 Plugin 的配置验证

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
OpenClaw 中 Tool 与 Skill 完整异同解析:从 SKILL.md 到 Plugin 的配置验证

1. OpenClaw 里 Tool 和 Skill 到底差在哪:一次竞品价格采集踩坑复盘

刚接触 OpenClaw 智能体开发时,最容易混淆的两个概念就是 Tool(工具)和 Skill(技能)。我在做一个竞品价格自动采集任务时,最初以为只要写个 SKILL.md 就能让智能体自己上网抓数据,结果跑起来才发现:Skill 本身没有任何执行能力,它只是一份写给大模型的“作业指导书”,真正打开浏览器、读取文件、写入 Excel 的动作,全部由 Tool 完成。这个认知偏差让我白白调试了两个小时。

先把核心检索词说清楚:OpenClaw 是一个支持智能体编排的开发框架,Tool 是底层可执行的类型化函数,决定智能体“能不能做”;Skill 是带 YAML 头的 Markdown 提示词文档,注入系统 Prompt,决定智能体“怎么做、按什么规则做”。适合谁?适合正在用 OpenClaw 搭建自动化工作流、需要区分“写代码扩展能力”和“写提示词约束流程”的开发者。

一句话类比:Tool 是手和脚,Skill 是操作手册。没有手册,手脚也能动,但容易乱动;没有手脚,手册写得再漂亮也干不了活。下面我会从定义方式、调用链路、扩展机制三个维度拆解,并给出可复制的 SKILL.md 配置片段和 Tool 注册示例,配合调用日志验证两者在任务执行中的实际行为差异。

我试过的那个竞品采集任务,最终方案是:用内置的 web_search、browser、write_excel 三个 Tool 负责执行,再写一份 SKILL.md 约束调用顺序和异常处理。跑通之后日志清晰显示,Skill 只出现在系统 Prompt 注入阶段,Tool 才出现在实际函数调用阶段。这个区分对后续选型非常关键。

2. TaoToken 前置准备:OpenClaw 接入大模型与 API Key 配置

OpenClaw 的智能体决策依赖大模型,而 Skill 注入的系统 Prompt 最终要发给模型。所以第一步是把模型接入配好。这里我用 TaoToken 作为模型接入层,它提供统一的 API 入口,兼容常见的对话补全格式,OpenClaw 里配置 Base URL 和 Key 就能用。

先拿到 API Key。打开 https://taotoken.net/api-keys ,登录后创建一个新 Key,复制保存。注意 Key 只在创建时完整显示一次,丢了就重新建。

Base URL 填 https://taotoken.net/api ,这是不带 UTM 的纯 API 地址,OpenClaw 的模型配置里直接写这个。模型 ID 根据你订阅的套餐选,比如 claude-sonnet 系列或 gpt 系列,具体以控制台 https://taotoken.net/console 里显示的为准。

如果你还没决定用哪个模型,可以先到 https://taotoken.net/models 对话页面试一下,确认模型能正常响应再写进配置。长期跑编码类或 Agent 类任务的话,Coding Plan 更划算,地址是 https://taotoken.net/coding-plan 。

配置的时候有个坑要注意:OpenClaw 的模型配置文件里,Base URL 末尾不要多加斜杠,否则拼接路径会变成双斜杠导致 404。Key 放在环境变量里比硬编码安全,比如TAOTOKEN_API_KEY。下面第三节我会给出完整的 JSON 配置片段。

3. 可复制配置:SKILL.md 片段与 Tool 注册示例

这一节是核心,直接给可复制的配置。先看 OpenClaw 的模型接入配置,通常放在~/.openclaw/config.json或项目根目录的openclaw.config.json:

{ "model": { "provider": "openai-compatible", "baseUrl": "https://taotoken.net/api", "apiKey": "${TAOTOKEN_API_KEY}", "modelId": "claude-sonnet-4-20250514", "maxTokens": 8192, "temperature": 0.3 }, "agent": { "skillsDir": "./skills", "toolsDir": "./tools", "logLevel": "debug" } }

注意apiKey用${TAOTOKEN_API_KEY}引用环境变量,启动前export TAOTOKEN_API_KEY=你的Key。skillsDir和toolsDir分别指向 Skill 文档和 Tool 注册代码的目录。

接下来是 SKILL.md,放在./skills/price-collector/SKILL.md:

--- name: 竞品价格采集 description: 自动抓取电商竞品价格并导出 Excel version: 1.0.0 tools: - web_search - browser - write_excel - read_file --- 用户需要价格报表时,按以下步骤执行: 1. 使用 web_search 搜索竞品商品链接,关键词由用户提供; 2. 调用 browser 打开页面,提取售价、库存字段; 3. 对每个商品重复步骤 2,循环处理; 4. 汇总数据使用 write_excel 保存到桌面,文件名格式为 price_YYYYMMDD.xlsx; 5. 禁止频繁访问网站,每次请求间隔 3 秒; 6. 价格字段为空时跳过该商品,记录到 skipped 列表,不中断流程; 7. 全部完成后输出汇总:成功 N 条,跳过 M 条。

YAML 头里的tools字段是声明式引用,告诉 OpenClaw 这个 Skill 会用到哪些 Tool。正文部分是纯提示词,注入系统 Prompt,不含任何可执行代码。

然后是 Tool 注册示例。假设内置 Tool 不够用,要新增一个读取本地 CSV 的 Tool,在./tools/read_csv.js里写:

module.exports = { name: "read_csv", description: "读取本地 CSV 文件并返回行数组", parameters: { type: "object", properties: { path: { type: "string", description: "CSV 文件绝对路径" }, delimiter: { type: "string", default: "," } }, required: ["path"] }, async execute({ path, delimiter }) { const fs = require("fs"); const content = fs.readFileSync(path, "utf-8"); return content.split("\n").map(line => line.split(delimiter)); } };

这个文件通过toolsDir自动加载,框架启动时注册为全局 Tool。注册后,SKILL.md 的tools列表里就能引用read_csv。

如果你用的是 Claude Code 做开发,想接入 TaoToken 的模型,配置在~/.claude/settings.json:

{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "${TAOTOKEN_API_KEY}" } }

三件套记牢:Base URL 是https://taotoken.net/api,Key 从 API Keys 页面拿,Model ID 从控制台确认。Cline MCP 或 Codex 的 auth.json 同理,Base URL 和 Key 填对,Model ID 选对,就能跑。

4. 验证请求:调用日志看 Tool 与 Skill 的实际行为差异

配置写完,跑一次任务验证。启动 OpenClaw 时把日志级别设为 debug,观察两个阶段:系统 Prompt 注入阶段和函数调用阶段。

执行命令:

export TAOTOKEN_API_KEY=你的Key openclaw run --task "采集这三个竞品链接的价格:url1 url2 url3" --log-level debug

日志里会先出现 Skill 注入记录:

[DEBUG] Loading skill: 竞品价格采集 from ./skills/price-collector/SKILL.md [DEBUG] Injecting skill into system prompt (tokens: 312) [DEBUG] System prompt assembled, total tokens: 1847

注意这里只有文本注入,没有任何函数调用。Skill 的作用到此为止,它影响的是模型接下来怎么决策。

然后是 Tool 调用记录:

[DEBUG] Model requested tool: web_search, args: {"query": "竞品A 价格"} [DEBUG] Executing tool: web_search [DEBUG] Tool result: 3 links found [DEBUG] Model requested tool: browser, args: {"url": "https://..."} [DEBUG] Executing tool: browser [DEBUG] Tool result: price=299, stock=15 [DEBUG] Model requested tool: write_excel, args: {"path": "~/Desktop/price_20250514.xlsx"} [DEBUG] Tool result: file written, 3 rows

对比很清楚:Skill 只在开头出现一次,是静态文本;Tool 在任务执行过程中被反复调用,每次都有参数和返回值。Skill 决定了“先搜索再打开页面再写 Excel”这个顺序,Tool 负责真正执行每一步。

如果 Skill 里写了“间隔 3 秒”,日志里会看到模型在两次 browser 调用之间主动等待,这是 Skill 约束生效的表现。如果没写这条,模型可能连续快速调用,触发网站限流。

验证成功的标志:Excel 文件生成在桌面,内容包含三个商品的价格和库存,skipped 列表为空。如果某个商品价格为空,日志里会有skipped: url2的记录,流程不中断。

5. 本篇常见错排查:401、local proxy failed、reading choices、OAuth

跑不通的时候,对照这几个真实报错排查。

401 Unauthorized:Key 没配或配错。检查echo $TAOTOKEN_API_KEY是否有值,config.json 里${TAOTOKEN_API_KEY}拼写是否正确。如果 Key 刚创建,确认没有多余空格。重新到 https://taotoken.net/api-keys 生成一个再试。

local proxy failed / connection refused:Base URL 写错。确认是https://taotoken.net/api,末尾没有多余斜杠,没有写成https://taotoken.net/api/v1这种带路径的。OpenClaw 的 openai-compatible provider 会自动拼接/chat/completions,你只需要填到/api。

reading choices 报错 / Cannot read property 'choices' of undefined:模型返回格式不对,通常是 Model ID 写错了,或者模型不支持当前请求格式。到 https://taotoken.net/console 确认 Model ID 拼写,比如claude-sonnet-4-20250514不要写成claude-sonnet-4。换一个模型测试,比如先用对话页面 https://taotoken.net/models 确认能正常返回。

OAuth 相关报错 / authentication failed:如果你用的是 Claude Code 接入,检查~/.claude/settings.json里的ANTHROPIC_BASE_URL和ANTHROPIC_API_KEY。OAuth 报错通常是因为同时配了官方登录态和自定义 Base URL,冲突了。清掉官方登录缓存,只用 API Key 方式。

Skill 不生效:检查 SKILL.md 的 YAML 头格式,---必须独占一行,name和description必填。tools列表里的 Tool 名称必须和注册的name字段完全一致,大小写敏感。日志里搜Loading skill确认文件被加载。

Tool 注册失败:检查toolsDir路径是否正确,文件是否导出module.exports,name、description、parameters、execute四个字段是否齐全。日志里搜Registering tool确认。

排障时优先看 debug 日志的前 50 行,模型配置和 Skill 加载的问题都在那里暴露。接入文档在 https://taotoken.net/doc ,里面有完整的配置示例和错误码说明。

6. 选型建议与后续接入路径

回到选型问题。什么时候自定义 Tool?当你需要新增底层系统能力,比如操作数据库、控制硬件、调用私有 API、执行自定义终端指令,现有内置 Tool 覆盖不了,必须写代码扩展。什么时候写 Skill?当已有全部需要的 Tool,但模型调用逻辑混乱、步骤不标准,需要固定业务流程、增加约束、异常处理、输出规范,这时候写 SKILL.md 就够了,零代码。

Plugin 是打包载体,一个 Plugin 可以同时携带自定义 Tool 和配套 Skill,上传到 ClawHub 共享。所以扩展机制是三层:Tool 提供能力,Skill 提供流程,Plugin 提供分发。

如果你要长期跑编码类或 Agent 类任务,建议用 Coding Plan,地址 https://taotoken.net/coding-plan ,比按量计费稳定。接入文档在 https://taotoken.net/doc ,API Key 管理在 https://taotoken.net/api-keys ,模型验证在 https://taotoken.net/models 。先把模型接入跑通,再写 Skill 约束流程,最后按需开发 Tool,这个顺序最省调试时间。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/10 22:41:43

深入拆解ThreadLocal:线程隔离、弱引用、内存泄漏与OOM排查

并发编程系列写到这一篇,前面的内容基本都在围绕一个词打转:共享。锁、原子类、并发容器,本质上都是想让多个线程更安全、更高效地协作同一份数据。而ThreadLocal的思路是反着来的——既然共享这么容易出问题,那干脆每个线程各存一…

作者头像 李华
网站建设 2026/10/10 22:39:26

Django日用品商场系统开发实战:从库存并发到订单部署

搞日用品商场系统这种项目,最难的不是写代码,而是没想清楚边界就开始堆功能。我前前后后做过几个类似的电商项目,也带过不少新人,发现大家最常犯的错就是把“商场系统”当成“电商平台”来设计——又是推荐算法又是秒杀系统&#…

作者头像 李华
网站建设 2026/10/10 22:36:14

机场智能化系统建设提案:从总体架构到PPT汇报的完整方法论

简介:这是一份面向机场智能化规划人员、系统集成工程师及民航相关专业师生的专业课件,完整呈现机场智能化系统建设提案的PPT教案。资源包含1个pptx演示文件,大小约3.34MB,便于直接用于项目汇报、教学演示或方案宣讲。内容以AODB机…

作者头像 李华