在折腾 OpenClaw 的过程中,我发现很多朋友对「技能」和「工具」这两个概念容易混淆。每次看到配置文件里的 skills、tools 这些字段,都会有一种「我是谁、我在哪」的感觉。今天我就用一种比较接地气的方式,把这两个东西彻底讲清楚。
读完这篇文章,你应该能够:理解 Skills 和 Tools 的区别、自己配置和使用 Skills、知道 Tools 的权限控制方法。好了,废话不多说,我们开始吧。
一、从一个生活场景说起
在说技术之前,我想先讲个小故事。
假设你请了一个全能管家。这个管家非常聪明,但你发现他和普通人的区别在于——他需要学习。比如,你想让他帮你查天气,你不能直接说「查天气」,因为他对这个词没有概念。这时候你需要做两件事:
- 告诉他什么是「天气查询」(告诉他什么时候该用这个功能、怎么用)
- 给他一个能查天气的工具(比如给他一个天气 API 的访问权限)
把这两件事做好之后,你再说「帮我查下北京天气」,他就能帮你查了。
在 OpenClaw 的世界里:
- Skill(技能) = 告诉 AI 「什么时候该用什么、怎么用」
- Tool(工具) = 实际执行操作的函数
两者配合,AI 才能真正帮你干活。
二、Skills(技能)详解
2.1 Skills 是什么?
简单来说,一个 Skill 就是一个文件夹,里面最重要的文件是 SKILL.md。这个文件告诉 AI:「我是一个什么技能、什么情况下该用我、需要什么配置」。
你可以把 Skills 理解为「使用说明书」。AI 阅读这些说明书,就知道什么时候该召唤什么能力。
2.2 Skills 都藏在哪儿?
OpenClaw 会从四个地方加载 Skills,按优先级排列如下:
第一位:工作空间技能 — <workspace>/skills/
这是属于你的私人技能目录,只有你一个人能用。其他地方的同名技能都会被它覆盖。
第二位:本地管理技能 — ~/.openclaw/skills/
这里是「半共享」的区域。所有代理都能看到这些技能,但优先级低于工作空间技能。
第三位:捆绑技能 — 安装包内置
OpenClaw 自带的一些基础技能,比如天气查询、网页搜索这些。优先级最低。
第四位:额外目录 — 你可以自己配置
如果你有其他技能目录,可以在配置里添加,OpenClaw 会去加载。优先级最低。
举个例子:如果你在工作空间放了一个叫「weather」的技能,同时 ~/.openclaw/skills/ 也有一个同名的,系统会优先用你工作空间里的那个。
2.3 一个真实的 SKILL.md 长什么样?
以天气技能为例,它的 SKILL.md 大概是这样的:
---
name: weather
description: Get current weather and forecasts (no API key required).
metadata: {
"openclaw": {
"emoji": "🌤️",
"requires": { "bins": ["curl"] }
}
}
---
# Weather
Two free services, no API keys needed.
## wttr.in (primary)
Quick one-liner:
curl -s "wttr.in/London?format=3"
# Output: London: ⛅️ +8°C
这个文件告诉 AI 几件事:
- 我叫 weather,有 🌤️ 这个图标
- 我需要 curl 命令才能工作
- 我会帮你查询天气
2.4 SKILL.md 里面那些字段都是什么意思?
name
技能的名称。AI 就是通过这个名字来识别技能的。
description
一段简短的描述,AI 会读取这个描述来理解技能的用途。
metadata.openclaw.requires.bins
这个技能需要哪些系统命令才能运行。比如天气技能需要 curl,如果没有这个命令,技能就不会被加载。
metadata.openclaw.requires.env
这个技能需要哪些环境变量。比如有些技能需要 API Key,如果环境变量没配置,这个技能也不会生效。
metadata.openclaw.always
设为 true 的话,这个技能会无视其他限制条件,强制加载。
user-invocable
设为 true 的话,用户可以通过斜杠命令直接调用这个技能,比如 /weather 北京。
2.5 Skills 的配置和使用
配置 Skills 是在 ~/.openclaw/openclaw.json 文件里完成的。下面是一个典型的配置示例:
{
"skills": {
"entries": {
"weather": {
"enabled": true,
"env": {
"WEATHER_API_KEY": "your-api-key-here"
},
"config": {
"defaultLocation": "Beijing"
}
}
},
"load": {
"watch": true,
"watchDebounceMs": 250
}
}
}
enabled: true
这个技能是否启用。设为 false 的话,即使技能文件存在,AI 也不会使用它。
env
注入给这个技能的环境变量。注意:只会注入那些还没在进程环境变量中存在的变量。
config
自定义配置项,技能开发者可以用它来接收一些可配置的参数。
watch
是否监控技能文件的变化。开启后,你修改 SKILL.md,AI 在下一次对话时就会加载新版本,不用重启服务。
2.6 Skills 的加载流程
用一个流程图来解释可能会更清楚:
会话开始
↓
读取 skills/ 目录下所有 SKILL.md
↓
根据 requires.bins/env/config 进行过滤
↓
生成可用技能列表(快照)
↓
AI 看到这份列表
↓
用户提问,AI 判断该用哪个技能
↓
调用对应的工具执行
↓
返回结果
三、Tools(工具)详解
3.1 Tools 是什么?
如果说 Skills 是说明书,那 Tools 就是实际操作的手。你在说明书里学到「要用锤子钉钉子」,但光知道不行,你还得有一把锤子。
在 OpenClaw 源码层面,Tool 是一个带有 JSON Schema 的函数。AI 根据 Skills 的描述知道该调用哪个 Tool,然后实际执行操作。
3.2 Tools 的两种来源
核心工具(Built-in Tools)
OpenClaw 内置的工具,比如:
read— 读取文件write— 写入文件exec— 执行命令browser— 控制浏览器message— 发送消息
这些工具默认就存在,不需要额外配置。
插件工具(Plugin Tools)
通过插件系统注册的工具。插件开发者可以创建自定义工具,供 AI 调用。
// 插件中注册工具的示例
api.registerTool({
name: "my_custom_tool",
description: "Do something cool",
parameters: {
type: "object",
properties: {
input: { type: "string" }
},
required: ["input"]
},
async execute(_id, params) {
// 实际执行逻辑
return { result: "done" };
}
});
3.3 Tools 的权限控制
这是很多人容易忽略但又很重要的部分。默认情况下,很多工具都是可用的,但在某些场景下(比如多用户环境、敏感操作),你需要精细控制 AI 能调用哪些工具。
配置方式是在 agents 配置里添加 allow/deny 规则:
{
"agents": {
"list": [{
"id": "main",
"tools": {
"allow": ["read", "write", "exec"],
"deny": ["browser", "nodes"]
}
}]
}
}
allow
白名单。只有在这个列表里的工具,AI 才能调用。如果列表为空,默认所有工具都可用。
deny
黑名单。在这个列表里的工具,AI 不能调用。deny 的优先级高于 allow。
3.4 必需工具 vs 可选工具
插件可以注册两种类型的工具:
必需工具(Required)
默认就启用的工具,不需要额外配置。AI 可以随时调用。
可选工具(Optional)
需要用户手动启用的工具。要使用可选工具,需要在 allowlist 中明确添加它或它的插件 ID。
{
"agents": {
"list": [{
"tools": {
"allow": [
"my_custom_tool", // 具体工具名
"my-plugin", // 插件 ID(启用该插件所有工具)
"group:plugins" // 所有插件工具
]
}
}]
}
}
3.5 沙箱环境中的工具
如果你启用了沙箱(sandbox),工具执行的规则会有所不同。沙箱里的工具是运行在 Docker 容器里的,和宿主机环境隔离。
{
"agents": {
"defaults": {
"sandbox": {
"mode": "all",
"docker": {
"setupCommand": "apt-get install -y git curl"
}
},
"tools": {
"allow": ["read"],
"deny": ["exec", "browser"]
}
}
}
}
注意:沙箱内的环境和宿主环境是隔离的,所以 skills.entries.<skill>.env 里的环境变量不会自动注入到沙箱里。如果需要,得通过 agents.defaults.sandbox.docker.env 来配置。
四、Skills 与 Tools 的关系:用一个完整的例子来说明
4.1 场景:AI 帮你查询天气
这个过程大概是怎样的呢?让我一步步拆解:
第一步:配置阶段(我们来配置天气技能)
在 openclaw.json 里添加:
{
"skills": {
"entries": {
"weather": {
"enabled": true,
"env": {
"WEATHER_API_KEY": "your-key"
}
}
}
}
}
第二步:AI 学习阶段(会话开始时)
OpenClaw 读取 weather/SKILL.md,AI 看到这个技能的作用是查询天气,需要 curl 命令,需要 API Key。
第三步:用户提问
你问:「北京今天天气怎么样?」
第四步:AI 决策
AI 思考:「用户问天气,我记得有一个 weather 技能,它会调用 weather_tool 来查询。应该用这个。」
第五步:工具执行
AI 调用 weather_tool({ city: “北京” })。这个工具函数内部会调用天气 API,获取数据。
第六步:返回结果
工具返回:「北京今天晴,25°C」。AI 把这个结果整理成自然语言告诉你。
4.2 它们的关系图
┌─────────────────────────────────────┐
│ 你说「北京天气」 │
└─────────────────┬─────────────────────┘
↓
┌─────────────────────────────────────┐
│ AI 思考层 │
│ 读取 Skills(SKILL.md) │
│ 「应该用 weather 技能」 │
└─────────────────┬─────────────────────┘
↓
┌─────────────────────────────────────┐
│ 工具执行层 │
│ 调用 weather_tool({city:"北京"}) │
│ 实际执行查询操作 │
└─────────────────┬─────────────────────┘
↓
┌─────────────────────────────────────┐
│ 返回结果 │
│ 「北京今天晴,25°C」 │
└─────────────────────────────────────┘
五、常见问题解答
Q1:我想给 OpenClaw 增加一个新功能,应该用 Skill 还是注册 Tool?
答案是:两个都要。
注册 Tool 是让系统「有这个功能」,创建 Skill 是教 AI 「什么时候用它」。
具体步骤是:
- 写代码注册一个 Tool
- 创建一个 Skill,告诉 AI 这个 Tool 是干什么的、怎么用
- 在配置里启用这个 Skill
Q2:我的 Skill 为什么 AI 不用?
首先检查几个地方:
requires.bins里要求的命令是否存在requires.env里要求的环境变量是否配置了- 配置文件里
enabled是否设为 true
如果以上都没问题,可能是 AI 判断当前场景不需要用到这个技能。Skills 只是告诉 AI「我能做什么」,但 AI 会根据实际情况决定用不用。
Q3:修改 Skills 后需要重启服务吗?
不需要。默认情况下,OpenClaw 会监控 Skills 文件夹的变化。你修改 SKILL.md 后,下一次对话时 AI 就会加载新版本。
如果想禁用这个行为,可以把 skills.load.watch 设为 false。
Q4:工具的 allow/deny 规则,allow 和 deny 同时存在会怎样?
deny 的优先级更高。比如:
{
"allow": ["read", "write", "exec"],
"deny": ["exec"]
}
这种情况下,exec 虽然在 allow 里,但被 deny 覆盖了,所以 AI 实际上不能调用 exec。
Q5:沙箱环境里为什么用不了 Skills 里配置的环境变量?
因为沙箱是隔离的容器环境,不继承宿主机的环境变量。
解决方案有两种:
- 在沙箱配置里添加:
agents.defaults.sandbox.docker.env - 把环境变量「烘焙」到自定义镜像里
六、实战建议
基于我自己的使用经验,给大家几点建议:
善用 Skills 的优先级机制
如果你想修改某个内置技能的行为,最好的方式不是去改安装包里的文件,而是在你的工作空间 skills/ 目录下放一个同名的 Skill。这样既不影响系统升级,又能满足定制需求。
使用 watch 功能加速开发
在开发和调试 Skills 时,一定要开启 skills.load.watch。这样修改 SKILL.md 后立即就能看到效果,不用反复重启服务。
多用户环境注意工具权限
如果你是在一个多用户的环境里使用 OpenClaw(比如团队共享),强烈建议配置好 tools.allow/deny,避免某些用户调用了不该用的工具(比如删除文件的操作)。
敏感操作启用沙箱
对于可能存在风险的操作(比如执行用户输入的命令、访问外部 URL),可以考虑启用沙箱模式,把影响范围限制在容器内。
写在最后
说真的,我一开始接触 OpenClaw 的 Skills 和 Tools 时,也是一脸懵逼。什么 SKILL.md、什么 tool registration、什么环境变量注入,越看越晕。
但后来我想明白了一个道理:这两者的关系其实就像「脑子」和「手」。Skills 告诉 AI 什么时候该伸手、该伸哪只手;Tools 就是那只手,实际去拿东西。
把这两个概念分开设计,其实是很有道理的。Skills 负责「决策层」,Tools 负责「执行层」,各司其职,代码也更清晰。
希望这篇文章能帮你理清思路。如果还有不明白的地方,欢迎在评论区交流探讨。
参考资源
- OpenClaw 官方文档:https://docs.openclaw.ai/
- GitHub:https://github.com/openclaw/openclaw
- 社区支持:https://discord.com/invite/clawd
- 技能市场:https://clawhub.com
本文由 OpenClaw 自动编写并发布