openclaw/docs/zh-CN/tools/skills.md

285 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

---
read_when:
- 添加或修改技能
- 更改技能门控或加载规则
summary: 技能:托管型与工作区型、门控规则,以及配置/环境变量连接
title: 技能
x-i18n:
generated_at: "2026-02-01T21:43:46Z"
model: claude-opus-4-5
provider: pi
source_hash: 54685da5885600b367ccdad6342497199fcb168ce33f8cdc00391d993f3bab7e
source_path: tools/skills.md
workflow: 15
---
# 技能OpenClaw
OpenClaw 使用与 **[AgentSkills](https://agentskills.io) 兼容**的技能文件夹来教智能体如何使用工具。每个技能是一个目录,包含带有 YAML frontmatter 和说明的 `SKILL.md` 文件。OpenClaw 加载**内置技能**以及可选的本地覆盖,并在加载时根据环境、配置和二进制文件是否存在进行过滤。
## 位置和优先级
技能从**三个**位置加载:
1. **内置技能**随安装包一起分发npm 包或 OpenClaw.app
2. **托管/本地技能**`~/.openclaw/skills`
3. **工作区技能**`<workspace>/skills`
如果技能名称冲突,优先级为:
`<workspace>/skills`(最高)→ `~/.openclaw/skills` → 内置技能(最低)
此外,你可以通过 `~/.openclaw/openclaw.json` 中的 `skills.load.extraDirs` 配置额外的技能文件夹(最低优先级)。
## 按智能体与共享技能
在**多智能体**设置中,每个智能体拥有自己的工作区。这意味着:
- **按智能体技能**位于该智能体专属的 `<workspace>/skills` 中。
- **共享技能**位于 `~/.openclaw/skills`(托管/本地),对同一机器上的**所有智能体**可见。
- **共享文件夹**也可以通过 `skills.load.extraDirs`(最低优先级)添加,如果你希望多个智能体使用同一套技能包。
如果同一技能名称存在于多个位置,适用通常的优先级规则:工作区优先,然后是托管/本地,最后是内置。
## 插件 + 技能
插件可以通过在 `openclaw.plugin.json` 中列出 `skills` 目录(相对于插件根目录的路径)来附带自己的技能。插件技能在插件启用时加载,并参与正常的技能优先级规则。你可以通过插件配置项上的 `metadata.openclaw.requires.config` 进行门控。参见[插件](/plugin)了解发现/配置,参见[工具](/tools)了解这些技能教授的工具功能。
## ClawHub安装 + 同步)
ClawHub 是 OpenClaw 的公共技能注册中心。浏览地址:[clawhub.com](https://clawhub.com)。使用它来发现、安装、更新和备份技能。完整指南:[ClawHub](/tools/clawhub)。
常用流程:
- 将技能安装到你的工作区:
- `clawhub install <skill-slug>`
- 更新所有已安装的技能:
- `clawhub update --all`
- 同步(扫描 + 发布更新):
- `clawhub sync --all`
默认情况下,`clawhub` 安装到当前工作目录下的 `./skills`(或回退到已配置的 OpenClaw 工作区。OpenClaw 在下次会话时将其作为 `<workspace>/skills` 加载。
## 安全说明
- 将第三方技能视为**不可信代码**。启用前请先阅读其内容。
- 对于不可信输入和高风险工具,优先使用沙箱运行。参见[沙箱](/gateway/sandboxing)。
- `skills.entries.*.env``skills.entries.*.apiKey` 会将密钥注入该智能体轮次的**宿主**进程中(而非沙箱)。请勿将密钥暴露在提示词和日志中。
- 更广泛的威胁模型和检查清单,请参见[安全](/gateway/security)。
## 格式AgentSkills + Pi 兼容)
`SKILL.md` 必须至少包含:
```markdown
---
name: nano-banana-pro
description: Generate or edit images via Gemini 3 Pro Image
---
```
说明:
- 我们遵循 AgentSkills 规范的布局/意图。
- 内嵌智能体使用的解析器仅支持**单行** frontmatter 键。
- `metadata` 应为**单行 JSON 对象**。
- 在说明中使用 `{baseDir}` 引用技能文件夹路径。
- 可选的 frontmatter 键:
- `homepage` — 在 macOS 技能 UI 中显示为"网站"的 URL也支持通过 `metadata.openclaw.homepage` 设置)。
- `user-invocable``true|false`(默认:`true`)。为 `true` 时,技能作为用户斜杠命令暴露。
- `disable-model-invocation``true|false`(默认:`false`)。为 `true` 时,技能从模型提示词中排除(仍可通过用户调用使用)。
- `command-dispatch``tool`(可选)。设为 `tool` 时,斜杠命令绕过模型直接分派到工具。
- `command-tool` — 当设置了 `command-dispatch: tool` 时要调用的工具名称。
- `command-arg-mode``raw`(默认)。用于工具分派时,将原始参数字符串转发给工具(不进行核心解析)。
工具调用参数为:
`{ command: "<raw args>", commandName: "<slash command>", skillName: "<skill name>" }`
## 门控(加载时过滤)
OpenClaw 使用 `metadata`(单行 JSON**在加载时过滤技能**
```markdown
---
name: nano-banana-pro
description: Generate or edit images via Gemini 3 Pro Image
metadata:
{
"openclaw":
{
"requires": { "bins": ["uv"], "env": ["GEMINI_API_KEY"], "config": ["browser.enabled"] },
"primaryEnv": "GEMINI_API_KEY",
},
}
---
```
`metadata.openclaw` 下的字段:
- `always: true` — 始终包含该技能(跳过其他门控)。
- `emoji` — macOS 技能 UI 使用的可选表情符号。
- `homepage` — macOS 技能 UI 中显示为"网站"的可选 URL。
- `os` — 可选的平台列表(`darwin`、`linux`、`win32`)。如果设置,技能仅在这些操作系统上可用。
- `requires.bins` — 列表;每个都必须存在于 `PATH` 中。
- `requires.anyBins` — 列表;至少一个必须存在于 `PATH` 中。
- `requires.env` — 列表;环境变量必须存在**或**在配置中提供。
- `requires.config``openclaw.json` 路径列表,必须为真值。
- `primaryEnv` — 与 `skills.entries.<name>.apiKey` 关联的环境变量名。
- `install` — macOS 技能 UI 使用的可选安装器规格数组brew/node/go/uv/download
关于沙箱的说明:
- `requires.bins` 在技能加载时在**宿主**上检查。
- 如果智能体在沙箱中运行,二进制文件也必须存在于**容器内部**。
通过 `agents.defaults.sandbox.docker.setupCommand`(或自定义镜像)安装它。
`setupCommand` 在容器创建后运行一次。
包安装还需要网络出站权限、可写的根文件系统以及沙箱中的 root 用户。
示例:`summarize` 技能(`skills/summarize/SKILL.md`)需要 `summarize` CLI 存在于沙箱容器中才能在其中运行。
安装器示例:
```markdown
---
name: gemini
description: Use Gemini CLI for coding assistance and Google search lookups.
metadata:
{
"openclaw":
{
"emoji": "♊️",
"requires": { "bins": ["gemini"] },
"install":
[
{
"id": "brew",
"kind": "brew",
"formula": "gemini-cli",
"bins": ["gemini"],
"label": "Install Gemini CLI (brew)",
},
],
},
}
---
```
说明:
- 如果列出了多个安装器Gateway 会选择**单个**首选选项(有 brew 时选 brew否则选 node
- 如果所有安装器都是 `download`OpenClaw 会列出每个条目,以便你查看可用的产物。
- 安装器规格可包含 `os: ["darwin"|"linux"|"win32"]` 以按平台过滤选项。
- Node 安装遵循 `openclaw.json` 中的 `skills.install.nodeManager`默认npm选项npm/pnpm/yarn/bun
这仅影响**技能安装**Gateway 运行时仍应使用 Node不建议将 Bun 用于 WhatsApp/Telegram
- Go 安装:如果缺少 `go` 但有 `brew`Gateway 会先通过 Homebrew 安装 Go并尽可能将 `GOBIN` 设置为 Homebrew 的 `bin`
- Download 安装:`url`(必需)、`archive``tar.gz` | `tar.bz2` | `zip`)、`extract`(默认:检测到归档时自动)、`stripComponents`、`targetDir`(默认:`~/.openclaw/tools/<skillKey>`)。
如果没有 `metadata.openclaw`,技能始终可用(除非在配置中禁用,或被 `skills.allowBundled` 对内置技能进行了限制)。
## 配置覆盖(`~/.openclaw/openclaw.json`
内置/托管技能可以切换启用状态并提供环境变量值:
```json5
{
skills: {
entries: {
"nano-banana-pro": {
enabled: true,
apiKey: "GEMINI_KEY_HERE",
env: {
GEMINI_API_KEY: "GEMINI_KEY_HERE",
},
config: {
endpoint: "https://example.invalid",
model: "nano-pro",
},
},
peekaboo: { enabled: true },
sag: { enabled: false },
},
},
}
```
注意如果技能名称包含连字符请给键加引号JSON5 允许带引号的键)。
配置键默认匹配**技能名称**。如果技能定义了 `metadata.openclaw.skillKey`,请在 `skills.entries` 下使用该键。
规则:
- `enabled: false` 禁用技能,即使它是内置/已安装的。
- `env`:仅在进程中该变量**尚未设置**时注入。
- `apiKey`:为声明了 `metadata.openclaw.primaryEnv` 的技能提供的便捷方式。
- `config`:用于自定义按技能字段的可选容器;自定义键必须放在此处。
- `allowBundled`:仅针对**内置**技能的可选允许列表。如果设置,只有列表中的内置技能才可用(托管/工作区技能不受影响)。
## 环境注入(按智能体运行)
当智能体运行开始时OpenClaw
1. 读取技能元数据。
2.`skills.entries.<key>.env``skills.entries.<key>.apiKey` 应用到 `process.env`
3. 使用**符合条件**的技能构建系统提示词。
4. 运行结束后恢复原始环境。
这是**限定在智能体运行范围内**的,而非全局 shell 环境。
## 会话快照(性能)
OpenClaw 在**会话开始时**对符合条件的技能进行快照,并在同一会话的后续轮次中复用该列表。对技能或配置的更改在下一个新会话中生效。
技能也可以在会话中途刷新,当技能监视器启用时或当新的符合条件的远程节点出现时(见下文)。可以将其理解为**热重载**:刷新后的列表会在下一个智能体轮次中被使用。
## 远程 macOS 节点Linux Gateway
如果 Gateway 运行在 Linux 上,但有一个**macOS 节点**已连接且**允许 `system.run`**(执行审批安全级别未设为 `deny`OpenClaw 可以在该节点上存在所需二进制文件时,将仅限 macOS 的技能视为可用。智能体应通过 `nodes` 工具(通常是 `nodes.run`)执行这些技能。
这依赖于节点报告其命令支持情况以及通过 `system.run` 进行的二进制探测。如果 macOS 节点之后离线,技能仍然可见;在节点重新连接之前,调用可能会失败。
## 技能监视器(自动刷新)
默认情况下OpenClaw 监视技能文件夹,并在 `SKILL.md` 文件更改时更新技能快照。在 `skills.load` 下配置:
```json5
{
skills: {
load: {
watch: true,
watchDebounceMs: 250,
},
},
}
```
## Token 影响(技能列表)
当有符合条件的技能时OpenClaw 会将一个紧凑的 XML 可用技能列表注入系统提示词(通过 `pi-coding-agent` 中的 `formatSkillsForPrompt`)。开销是确定性的:
- **基础开销(仅在有 ≥1 个技能时):**195 个字符。
- **每个技能:**97 个字符 + XML 转义后的 `<name>`、`<description>` 和 `<location>` 值的长度。
公式(字符数):
```
total = 195 + Σ (97 + len(name_escaped) + len(description_escaped) + len(location_escaped))
```
说明:
- XML 转义会将 `& < > " '` 展开为实体(`&amp;`、`&lt;` 等),增加长度。
- Token 数量因模型分词器而异。粗略的 OpenAI 风格估算约为 ~4 字符/token因此**97 字符 ≈ 24 个 token**(每个技能),加上你实际的字段长度。
## 托管技能生命周期
OpenClaw 将一组基线技能作为**内置技能**随安装包npm 包或 OpenClaw.app一起分发。`~/.openclaw/skills` 用于本地覆盖(例如,在不更改内置副本的情况下固定/修补某个技能)。工作区技能由用户拥有,在名称冲突时覆盖两者。
## 配置参考
参见[技能配置](/tools/skills-config)了解完整的配置模式。
## 想要更多技能?
浏览 https://clawhub.com。
---