跳到主要内容

Skills 技能系统

Skills 是 OpenClaw 的核心能力扩展机制。技能本质上是一份指导文档,教会 Agent 如何完成特定任务。本章介绍技能的概念、安装方法以及如何创建自定义技能。

什么是 Skill?

Skill 是一个包含 SKILL.md 文件的目录。SKILL.md 是一个带有 YAML frontmatter 的 Markdown 文件,包含对 Agent 的指导说明。技能不是可执行代码,而是告诉 Agent"在什么情况下应该做什么"的文档。

为什么是文档而非代码?

OpenClaw 的设计哲学是让 AI 模型理解指令,而不是硬编码行为。技能文件会被注入到 Agent 的系统提示词中,模型根据这些指导来决定如何使用工具完成任务。这种方式的优势:

  • 灵活性:模型可以根据上下文调整行为
  • 可读性:技能内容一目了然,便于理解和修改
  • 跨平台:不依赖特定编程语言或运行时

技能的作用

一个典型的技能告诉 Agent:

  • 什么情况下应该使用这个技能
  • 应该调用哪些工具
  • 如何处理输入和输出
  • 有哪些限制和注意事项

技能加载位置

OpenClaw 从多个位置加载技能,按优先级从高到低:

位置优先级作用范围
<workspace>/skills/最高当前 Agent 专属
~/.openclaw/skills/中等所有 Agent 共享
Bundled(随安装附带)最低全局内置
skills.load.extraDirs最低自定义共享目录

当存在同名技能时,优先级高的会覆盖优先级低的。

安装技能

使用 ClawHub 搜索

ClawHub 是 OpenClaw 的官方技能市场,收录了大量社区贡献的技能。

# 搜索关键词相关技能
openclaw skills search weather

# 搜索特定功能的技能
openclaw skills search "calendar"

# 查看搜索结果限制
openclaw skills search "browser" --limit 10

安装技能

# 从 ClawHub 安装技能
openclaw skills install skill-name

# 安装特定版本
openclaw skills install skill-name --version 1.2.0

# 强制覆盖已存在的技能
openclaw skills install skill-name --force

安装后,技能会被放到当前工作空间的 skills/ 目录下。

管理已安装技能

# 列出已安装技能
openclaw skills list

# 查看技能详情
openclaw skills info skill-name

# 检查技能就绪状态
openclaw skills check

# 只显示就绪的技能
openclaw skills list --eligible

# 更新单个技能
openclaw skills update skill-name

# 更新所有已安装技能
openclaw skills update --all

更新到特定版本

# 更新到指定版本
openclaw skills update skill-name --version 1.3.0

SKILL.md 文件格式

每个技能的核心是 SKILL.md 文件,包含 YAML frontmatter(元数据)和 Markdown 正文(指令内容)。

基本结构

---
name: my-skill
description: 一句话描述技能的用途,Agent 用它判断何时使用此技能
metadata:
openclaw:
os:
- darwin
- linux
requires:
bins:
- git
config:
- agents.defaults.workspace
---

# 技能名称

这里写详细的技能说明,告诉 Agent 如何完成任务。

## 使用场景

描述什么情况下应该使用这个技能。

## 操作步骤

1. 第一步做什么
2. 第二步做什么
3. ...

## 注意事项

- 重要限制
- 需要确认的操作
- 错误处理方式

Frontmatter 字段说明

字段必填说明
name技能唯一标识符,使用 snake_case 格式
description一行描述,Agent 用它判断何时激活此技能
metadata.openclaw.os操作系统过滤,如 ["darwin", "linux"]
metadata.openclaw.requires.bins需要的二进制文件(必须在 PATH 中)
metadata.openclaw.requires.anyBins需要的二进制文件(至少一个存在)
metadata.openclaw.requires.env需要的环境变量(或通过配置提供)
metadata.openclaw.requires.config需要的配置项路径
metadata.openclaw.always设为 true 时始终加载,跳过其他过滤条件
metadata.openclaw.emojimacOS Skills UI 中显示的图标
metadata.openclaw.homepage技能主页 URL,显示在 Skills UI
metadata.openclaw.primaryEnvskills.entries.<name>.apiKey 关联的环境变量名
metadata.openclaw.skillKey配置中使用的键名(默认使用 name)
metadata.openclaw.install安装器配置数组(brew/node/go/uv/download)
homepage技能主页 URL(顶层字段,等同于 metadata.openclaw.homepage)
user-invocabletrue/false(默认 true),是否暴露为用户斜杠命令
disable-model-invocationtrue/false(默认 false),是否从模型提示词中排除
command-dispatch设为 tool 时,斜杠命令直接派发到工具
command-toolcommand-dispatch: tool 时调用的工具名
command-arg-mode参数模式,默认 raw(原始参数传递给工具)

重要提示

  • Frontmatter 只支持单行键值对
  • metadata 必须是单行 JSON 对象
  • 在指令中使用 {baseDir} 引用技能目录路径

description 的重要性

description 字段非常关键,Agent 根据它来判断是否应该使用这个技能。描述应该:

  • 简洁明确,一行说完
  • 包含关键词,方便匹配
  • 说明触发条件

好的描述示例

description: 当用户询问天气、气温、降雨情况时使用此技能

不好的描述示例

description: 天气技能  # 太模糊,Agent 不知道何时使用

创建自定义技能

当官方技能无法满足需求时,可以创建自定义技能。

创建技能目录

# 在工作空间创建技能目录
mkdir -p ~/.openclaw/workspace/skills/my-skill

编写 SKILL.md

创建 ~/.openclaw/workspace/skills/my-skill/SKILL.md

---
name: daily-standup
description: 当用户需要生成日报、站会总结或工作汇报时使用此技能
---

# 每日站报生成器

这个技能帮助用户生成每日工作总结。

## 触发条件

用户请求以下内容时激活:
- 生成日报
- 准备站会内容
- 总结今天的工作
- 汇报工作进展

## 工作流程

1. **收集信息**
- 使用 `exec` 工具执行 `git log --since="today"` 查看今天的提交
- 读取项目中的 TODO.md 或任务文件
- 查看 MEMORY.md 中的日程安排

2. **整理内容**
- 按项目分类整理已完成的工作
- 列出进行中的任务
- 标记遇到的问题和阻塞

3. **生成报告**
使用以下格式:

## 今日完成
- [任务1描述]
- [任务2描述]

## 进行中
- [任务描述] - 当前状态

## 明日计划
- [计划任务]

## 问题与阻塞
- [问题描述]

## 注意事项

- 不要编造内容,只报告有据可查的工作
- 如果无法获取 git 信息,询问用户
- 敏感项目名称需要脱敏处理

工具定义(可选)

Skills 可以定义自定义工具 Schema,让 Agent 知道有哪些可用的工具及其参数。工具定义放在 frontmatter 的 tools 字段中。

内置工具 vs 自定义工具

OpenClaw 已经内置了丰富的工具:

工具类别工具名称说明
文件操作read, write, edit, glob, grep文件读写和搜索
命令执行exec执行 Shell 命令
浏览器browser_* 系列浏览器自动化
记忆memory_search, memory_get记忆检索
网络fetchHTTP 请求

大多数情况下,Skills 只需告诉 Agent 何时以及如何使用这些内置工具,而不需要定义新工具。

定义自定义工具

如果需要定义新工具,在 frontmatter 中添加 tools 字段:

---
name: my-api-tool
description: 调用自定义 API 的工具
tools:
- name: call_my_api
description: 调用我的自定义 API
parameters:
type: object
properties:
endpoint:
type: string
description: API 端点路径
method:
type: string
enum: [GET, POST, PUT, DELETE]
default: GET
data:
type: object
description: 请求体数据
required: [endpoint]
---

工具 Schema 遵循 JSON Schema 格式,与 OpenAI/Anthropic 的工具定义格式兼容。

工具实现

定义工具 Schema 只是第一步,还需要有实际的工具实现。有两种方式:

  1. 插件方式:开发插件提供工具实现,Skills 作为文档指导 Agent 使用
  2. 内置工具包装:Skill 指导 Agent 使用内置工具完成特定任务

对于大多数场景,第二种方式更简单

---
name: git-operations
description: 执行 Git 操作,如提交、分支、合并等
---

# Git 操作技能

## 可用工具

使用内置的 `exec` 工具执行 Git 命令。

## 常用操作

### 提交更改
使用命令:`git add -A && git commit -m "message"`

### 创建分支
使用命令:`git checkout -b branch-name`

### 查看状态
使用命令:`git status`

斜杠命令配置

Skills 可以配置为用户可调用的斜杠命令,让用户直接通过命令触发特定功能。

基本配置

---
name: daily-report
description: 生成每日工作报告
user-invocable: true
---

# 每日报告

执行此命令时,生成包含以下内容的工作报告:
- 今日完成的任务
- 进行中的工作
- 明日计划

用户可以通过 /daily-report 直接调用此技能。

直接派发到工具

配置 command-dispatch: tool 可以让斜杠命令绕过模型,直接调用工具:

---
name: system-status
description: 查看系统状态
user-invocable: true
command-dispatch: tool
command-tool: exec
---

此技能直接调用 exec 工具执行预定义命令。

调用时工具会收到以下参数:

{
"command": "<用户输入的参数>",
"commandName": "system-status",
"skillName": "system-status"
}

参数传递

command-arg-mode 控制参数如何传递:

模式说明
raw(默认)原始参数字符串直接传递给工具

禁用模型调用

如果技能只供用户调用,不需要模型自动触发:

---
name: admin-command
description: 管理员专用命令
user-invocable: true
disable-model-invocation: true
---

这样技能不会出现在模型的可用技能列表中,只能通过斜杠命令调用。

测试技能

# 重启 Gateway 或开始新会话
# 然后测试技能是否生效
openclaw agent --message "帮我生成今天的站报"

安装器配置

Skills 可以定义安装器,让 macOS Skills UI 能够自动安装所需的依赖。

安装器类型

类型说明适用场景
brewHomebrew 包管理器macOS 系统工具
nodenpm 包Node.js 工具和库
goGo 包Go 编写的工具
uvPython 包(uv)Python 工具
download直接下载二进制预编译的可执行文件

配置示例

---
name: my-skill
description: 需要外部工具的技能
metadata:
openclaw:
install:
# Homebrew 安装
- type: brew
package: my-tool

# Node.js 安装
- type: node
package: my-cli-tool

# Go 安装
- type: go
package: github.com/user/my-tool@latest

# Python 安装
- type: uv
package: my-python-tool

# 直接下载
- type: download
url: https://github.com/user/tool/releases/download/v1.0/tool-linux-amd64
archive: tar.gz
targetDir: ~/.openclaw/tools/my-skill
-
os: ["darwin", "linux"]
---

安装器选择逻辑

当配置多个安装器时,Gateway 会按优先级选择:

  1. 如果系统有 brew,优先使用 brew 安装
  2. 否则选择第一个可用的安装器

Node 包管理器配置

可以通过配置指定 Node 包管理器:

{
"skills": {
"install": {
"nodeManager": "pnpm"
}
}
}

可选值:npm(默认)、pnpmyarnbun

Go 安装自动处理

如果 go 不在 PATH 中但系统有 brew,Gateway 会先通过 Homebrew 安装 Go,并设置 GOBIN

安全注意事项

第三方技能风险

将第三方技能视为不可信代码

  • 安装前仔细阅读 SKILL.md 内容
  • 了解技能会调用哪些工具
  • 注意是否有执行任意命令的风险

安全建议

  1. 使用沙箱:对不可信输入和危险工具启用沙箱
{
"agents": {
"defaults": {
"sandbox": {
"mode": "non-main"
}
}
}
}
  1. 限制工具:按需限制 Agent 可用的工具
{
"tools": {
"deny": ["exec", "browser"]
}
}
  1. 审批策略:设置技能安装审批
{
"skills": {
"installPolicy": "approve"
}
}

敏感信息处理

不要在 Skills 中硬编码敏感信息:

# 错误示例 ❌
API Key: sk-xxxxx
密码: mypassword

# 正确示例 ✓
使用环境变量 MY_API_KEY
通过 skills.entries.my-skill.apiKey 配置

使用配置注入 API Key:

{
"skills": {
"entries": {
"my-skill": {
"apiKey": "${MY_API_KEY}"
}
}
}
}

环境注入安全

skills.entries.*.envskills.entries.*.apiKey 注入的环境变量作用于 Agent 运行时,而非沙箱内部。保持敏感信息远离提示词和日志。

路径安全

工作空间技能发现只接受:

  • 技能根目录
  • SKILL.md 文件的实际路径在配置的根目录内

这防止了通过符号链接访问预期之外的文件。

危险代码扫描

Gateway 在安装技能依赖时会运行内置的危险代码扫描器:

  • critical 级别发现默认阻止安装
  • suspicious 级别仅警告

注意:openclaw skills install <slug> 直接下载 ClawHub 技能文件夹,不使用此扫描流程。

技能最佳实践

单一职责

一个技能只做一件事。不要创建"万能技能",而是针对特定任务创建专门的技能。

推荐daily-standupcode-reviewmeeting-notes

不推荐work-helper(太宽泛)

清晰的触发条件

description 和文档开头的触发条件要清晰,让 Agent 准确判断何时使用。

---
description: 当用户明确要求发送邮件或提到"发邮件"、"send email"时使用
---

## 触发条件

只在以下情况使用此技能:
- 用户明确说"发送邮件"
- 用户要求"通知某人"
- 用户要求"发消息到邮箱"

不要在以下情况使用:
- 用户只是在讨论邮件
- 用户问"怎么发邮件"(这是咨询,不是执行)

明确的工具使用

告诉 Agent 使用哪些工具,以及如何使用:

## 可用工具

此技能使用以下工具:

- `exec`:执行 shell 命令
- `read`:读取文件内容
- `write`:写入文件

### 命令示例

查看今日 git 提交:
```bash
git log --since="midnight" --oneline --author="$(git config user.name)"

读取任务文件:

read ~/tasks.md

### 安全考虑

如果技能涉及敏感操作,必须明确警告:

```markdown
## 安全警告

此技能会执行以下敏感操作:
- 发送邮件(不可撤销)
- 提交代码到远程仓库

### 必须确认

在执行以下操作前,必须向用户确认:
- 发送邮件
- 推送代码
- 删除文件

提供示例

给 Agent 提供具体示例,帮助它理解预期输出:

## 输出示例

成功生成日报后,输出格式如下:

📅 2026-04-03 工作日报

完成事项

  • 完成用户认证模块重构
  • 修复 #123 号 bug

进行中

  • API 文档编写(进度 60%)

明日计划

  • 完成文档编写
  • 开始集成测试

技能目录结构

一个完整的技能目录可能包含:

my-skill/
├── SKILL.md # 必需:技能说明文件
├── templates/ # 可选:模板文件
│ └── report.md
├── examples/ # 可选:示例文件
│ └── sample.json
└── README.md # 可选:人类阅读的说明

只有 SKILL.md 是必需的,其他文件可以按需添加。如果技能需要读取模板或示例,可以在 SKILL.md 中说明如何访问这些文件。

ClawHub CLI

除了使用 openclaw skills 命令,还可以使用独立的 clawhub CLI 进行更高级的操作。

安装 ClawHub CLI

# 使用 npm 安装
npm install -g clawhub

# 或使用 bun 安装
bun install -g clawhub

认证登录

# 浏览器登录
clawhub login

# 使用 token 登录
clawhub login --token YOUR_TOKEN

# 查看当前登录状态
clawhub whoami

# 登出
clawhub logout

发布技能

# 发布技能到 ClawHub
clawhub skill publish ./my-skill \
--slug my-skill \
--name "My Skill" \
--version 1.0.0 \
--tags "productivity,automation" \
--changelog "Initial release"

# 同步多个技能
clawhub sync

# 干运行(预览发布内容)
clawhub skill publish ./my-skill --dry-run

管理已发布技能

# 删除技能
clawhub delete my-skill --yes

# 恢复已删除的技能
clawhub undelete my-skill --yes

技能与插件的关系

概念说明包含内容
Skill指导文档SKILL.md + 可选资源文件
Plugin扩展包可以包含工具、技能、配置等

技能是轻量级的,只需要一个 Markdown 文件。插件是更完整的扩展,可以包含:

  • 自定义工具(实际的代码实现)
  • 技能文档
  • 配置模板
  • 依赖声明

如果你想添加新的工具能力,需要开发插件。如果只是教 Agent 更好地使用现有工具,创建技能就足够了。

常见问题

技能没有被触发

可能原因

  1. description 不够清晰,Agent 无法判断何时使用
  2. 技能文件位置不正确
  3. 会话需要重启才能加载新技能

解决方法

# 确认技能位置
ls ~/.openclaw/workspace/skills/

# 检查 SKILL.md 格式
cat ~/.openclaw/workspace/skills/my-skill/SKILL.md

# 开始新会话测试
openclaw agent --message "测试触发技能的关键词"

技能冲突

多个技能的 description 重叠时,Agent 可能难以选择。

解决方法:确保每个技能的 description 有明确区分,避免模糊描述。

技能安装失败

# 检查网络连接
openclaw skills search test

# 使用强制覆盖
openclaw skills install skill-name --force

# 手动下载并安装
# 从 ClawHub 网站下载 zip 文件,解压到 skills/ 目录

下一步