创建自定义技能教程

advanced
## 什么是技能 在 OpenClaw 中,技能(Skill)是一个包含 `SKILL.md` 文件的目录。SKILL.md 用 Markdown 编写,告诉智能体**这个技能能做什么**以及**怎么使用它**。 技能不是传统意义上的"插件"或"代码模块"——它更像是一份**操作手册**,智能体读取后就知道如何完成特定任务。 一个最简单的技能结构: ``` my-skill/ └── SKILL.md ``` 就这么简单。一个目录,一个 Markdown 文件。 ## 技能文件结构 ### 最小结构 ``` my-weather-skill/ └── SKILL.md ``` ### 完整结构 复杂技能可能包含额外文件: ``` my-complex-skill/ ├── SKILL.md # 技能说明(必须) ├── install.sh # 安装脚本(可选) ├── templates/ # 模板文件(可选) │ └── report.md └── config/ # 配置文件(可选) └── defaults.json ``` ## SKILL.md 文件格式 SKILL.md 由两部分组成:**YAML frontmatter**(元数据)和 **Markdown 正文**(说明内容)。 ### 必填字段 ```yaml --- name: my-weather-skill description: 查询全球天气预报,支持多城市、多天预测和天气预警 --- ``` | 字段 | 类型 | 说明 | |------|------|------| | `name` | string | 技能的唯一标识符,建议用小写字母和连字符 | | `description` | string | 技能的简短描述,一句话说明功能 | ### 可选字段 ```yaml --- name: my-weather-skill description: 查询全球天气预报 homepage: https://github.com/yourname/my-weather-skill user-invocable: true disable-model-invocation: false command-dispatch: false --- ``` | 字段 | 类型 | 默认值 | 说明 | |------|------|--------|------| | `homepage` | string | — | 技能主页 URL | | `user-invocable` | boolean | `true` | 用户是否可以直接调用此技能 | | `disable-model-invocation` | boolean | `false` | 是否禁止模型自动调用此技能 | | `command-dispatch` | boolean | `false` | 是否启用命令分发模式 | ### user-invocable vs disable-model-invocation 这两个字段控制技能的调用方式: | 组合 | 用户可调用 | 模型可自动调用 | 适用场景 | |------|-----------|---------------|----------| | 默认(都不设) | ✅ | ✅ | 通用技能 | | `user-invocable: false` | ❌ | ✅ | 仅供模型内部使用的辅助技能 | | `disable-model-invocation: true` | ✅ | ❌ | 用户手动触发的敏感操作 | | 两者都设 | ❌ | ❌ | 基本没用,等于禁用 | ## Metadata 门控 metadata 门控让技能声明运行前提条件,OpenClaw 会在加载技能时自动检查。 ### requires.bins — 依赖的命令行工具 ```yaml --- name: docker-manager description: 管理 Docker 容器 requires: bins: - docker - docker-compose --- ``` 如果用户系统上没有安装 `docker` 或 `docker-compose`,这个技能不会被加载。 ### requires.env — 依赖的环境变量 ```yaml --- name: openai-helper description: 使用 OpenAI API 的辅助技能 requires: env: - OPENAI_API_KEY --- ``` 如果 `OPENAI_API_KEY` 环境变量未设置,技能不会被加载。 ### requires.config — 依赖的配置项 ```yaml --- name: github-pr-reviewer description: 自动审查 GitHub PR requires: config: - github.token --- ``` ### primaryEnv — 主要环境变量 ```yaml --- name: weather-api description: 天气查询 primaryEnv: WEATHER_API_KEY --- ``` `primaryEnv` 是一个快捷方式,等同于 `requires.env` 中只有一个变量的情况。 ### os — 操作系统过滤 ```yaml --- name: macos-automation description: macOS 自动化操作 os: - darwin --- ``` 可选值:`darwin`(macOS)、`linux`、`win32`(Windows)。只在指定的操作系统上加载。 ## Markdown 说明编写最佳实践 SKILL.md 的正文部分是技能的核心——它告诉智能体如何使用这个技能。 ### 原则一:简洁明了 智能体不需要冗长的背景介绍。直接告诉它**做什么**和**怎么做**: ```markdown ## 使用方法 当用户询问天气时: 1. 使用 `web_search` 工具搜索 "{城市} 天气预报" 2. 提取温度、湿度、风力信息 3. 用简洁的格式回复用户 ``` ### 原则二:安全优先 明确告诉智能体什么**不能做**: ```markdown ## 安全规则 - 不要执行任何删除操作 - 不要修改系统配置文件 - 操作前必须确认用户意图 - 敏感信息不要输出到日志 ``` ### 原则三:使用 {baseDir} 引用技能路径 如果技能包含额外文件(模板、配置等),使用 `{baseDir}` 占位符引用技能目录: ```markdown ## 报告模板 使用 `{baseDir}/templates/report.md` 作为报告模板。 读取模板内容,替换其中的占位符后生成最终报告。 ``` `{baseDir}` 会在运行时被替换为技能的实际安装路径。 ### 原则四:提供示例对话 帮助智能体理解预期的交互方式: ```markdown ## 示例 用户:帮我查一下北京明天的天气 助手:北京明天(1月16日)天气预报: - 🌡 温度:-5°C ~ 3°C - 💨 风力:北风 3-4 级 - 🌤 天气:晴转多云 - 💧 湿度:35% 建议明天出门多穿点,注意防风。 ``` ### 原则五:声明工具依赖 如果技能需要使用特定工具,明确列出: ```markdown ## 依赖工具 此技能需要以下工具: - `web_search`:搜索天气信息 - `read`:读取模板文件 - `write`:保存天气报告 ``` ## 技能存放位置和优先级 OpenClaw 从多个位置加载技能,按优先级从高到低: | 优先级 | 位置 | 说明 | |--------|------|------| | 1(最高) | 工作区技能 | `~/.openclaw/workspace/skills/` | | 2 | 项目技能 | 当前项目目录下的 `skills/` | | 3 | 个人技能 | `~/.openclaw/skills/` | | 4 | 托管技能 | 通过 `clawhub install` 安装的技能 | | 5 | 内置技能 | OpenClaw 自带的技能 | | 6(最低) | extraDirs | 配置文件中指定的额外目录 | 如果多个位置存在同名技能,高优先级的会覆盖低优先级的。 ### 开发时推荐的存放位置 开发新技能时,建议放在工作区技能目录: ```bash mkdir -p ~/.openclaw/workspace/skills/my-new-skill nano ~/.openclaw/workspace/skills/my-new-skill/SKILL.md ``` 这样优先级最高,方便测试和迭代。 ## 本地测试 ### 快速测试 创建好 SKILL.md 后,直接用命令行测试: ```bash # 发送一条消息,看智能体是否正确使用了你的技能 openclaw agent --message "帮我查一下北京的天气" ``` ### 交互式测试 启动交互式会话进行更深入的测试: ```bash # 启动 TUI 交互界面 openclaw ``` 然后在对话中测试各种场景: - 正常使用场景 - 边界情况(如缺少参数) - 错误处理(如 API 不可用) ### 调试技巧 ```bash # 查看已加载的技能列表 clawhub list # 检查技能是否被正确加载 openclaw doctor # 查看技能加载日志 openclaw gateway logs | grep "skill" ``` 如果技能没有被加载,常见原因: 1. **SKILL.md 格式错误**:YAML frontmatter 语法不正确 2. **门控条件不满足**:缺少依赖的命令行工具或环境变量 3. **目录位置不对**:技能目录不在 OpenClaw 的搜索路径中 4. **同名冲突**:高优先级位置有同名技能覆盖了你的技能 ## 发布到 ClawHub 当技能开发完成并测试通过后,可以发布到 ClawHub 供其他用户使用。 ### 准备工作 1. 确保 SKILL.md 的 frontmatter 完整(name、description 必填) 2. 确保技能目录结构干净,没有临时文件 3. 注册 ClawHub 账号(如果还没有) ### 登录 ClawHub ```bash clawhub login ``` 按提示完成认证。 ### 发布技能 ```bash # 发布当前目录下的技能 clawhub sync --all # 发布指定目录的技能 clawhub sync ./my-weather-skill ``` ### 版本管理 每次发布会自动递增版本号。你也可以在 frontmatter 中手动指定版本: ```yaml --- name: my-weather-skill description: 查询天气预报 version: 1.2.0 --- ``` ### 发布后验证 ```bash # 搜索你发布的技能 clawhub search my-weather-skill # 在另一台机器上安装测试 clawhub install my-weather-skill ``` ## 安装器规范 如果你的技能依赖外部工具,可以在 SKILL.md 中声明安装器,OpenClaw 会在安装技能时自动安装依赖。 ### 支持的安装器类型 | 安装器 | 说明 | 示例 | |--------|------|------| | `brew` | Homebrew(macOS/Linux) | `brew: jq` | | `node` | npm 全局包 | `node: typescript` | | `go` | Go 工具 | `go: github.com/user/tool@latest` | | `uv` | Python 包(uv) | `uv: requests` | | `download` | 下载二进制文件 | 指定 URL 和目标路径 | ### 在 frontmatter 中声明 ```yaml --- name: data-processor description: 数据处理工具 installers: - type: node package: csv-parser - type: brew package: jq --- ``` ### download 安装器 对于需要下载二进制文件的情况: ```yaml --- name: special-tool description: 使用特殊工具 installers: - type: download url: https://github.com/user/tool/releases/latest/download/tool-linux-amd64 target: tool chmod: true --- ``` ## 完整示例:创建一个代码审查技能 下面是一个完整的技能示例,帮你把所有知识点串起来: ```yaml --- name: code-review-helper description: 辅助代码审查,检查常见问题并给出改进建议 homepage: https://github.com/yourname/code-review-helper version: 1.0.0 requires: bins: - git env: - GITHUB_TOKEN --- ``` ```markdown ## 功能说明 这个技能帮助你进行代码审查。当用户提供代码片段或 PR 链接时, 分析代码质量并给出改进建议。 ## 使用方法 ### 审查代码片段 当用户粘贴代码并要求审查时: 1. 分析代码结构和逻辑 2. 检查常见问题(命名规范、错误处理、性能) 3. 给出具体的改进建议和示例代码 ### 审查 GitHub PR 当用户提供 PR 链接时: 1. 使用 `exec` 工具运行 `git diff` 获取变更 2. 逐文件分析变更内容 3. 汇总审查意见 ## 审查维度 - **命名规范**:变量名、函数名是否清晰 - **错误处理**:是否有适当的 try-catch 和错误提示 - **性能**:是否有明显的性能问题(N+1 查询、不必要的循环) - **安全**:是否有 SQL 注入、XSS 等安全风险 - **可读性**:代码是否易于理解和维护 ## 输出格式 审查结果按严重程度分类: - 🔴 **严重**:必须修复的问题 - 🟡 **建议**:建议改进的地方 - 🟢 **优点**:做得好的地方(正面反馈) ## 安全规则 - 不要修改任何代码文件,只提供建议 - 不要执行代码中的命令 - 敏感信息(API Key、密码)发现后提醒用户,但不要输出完整内容 ``` ## 小结 创建 OpenClaw 技能的核心流程: 1. 创建目录和 SKILL.md 文件 2. 编写 frontmatter(name + description 必填) 3. 编写 Markdown 说明(简洁、安全、有示例) 4. 按需添加 metadata 门控和安装器 5. 本地测试(`openclaw agent --message "..."`) 6. 发布到 ClawHub(`clawhub sync --all`) 记住:技能的本质是一份**操作手册**,写得越清晰,智能体执行得越准确。 --- #创建OpenClaw技能 #SKILL.md #ClawHub发布 #开发者教程 #龙虾技能库