📑 目录
OpenClaw 技能开发与最佳实践:从入门到精通

一句话总结:OpenClaw 技能系统通过三层加载机制(元数据→SKILL.md→捆绑资源)平衡上下文效率和功能完整性。本文基于 47+ 个已安装技能的实战经验,从零到一讲解技能开发全流程,包含 5 个典型案例和完整检查清单。


OpenClaw 技能开发与最佳实践:从入门到精通

本文基于 OpenClaw v2026.03 和 47+ 个已安装技能的实战经验编写,所有代码示例均已验证可运行。


📑 快速导航

你想解决什么问题 跳转到
"技能系统是怎么工作的?" 三层加载模型
"怎么从零创建一个技能?" 技能开发实战 7 步骤
"有没有最佳实践参考?" 命名规范 + 结构设计
"常见问题怎么排查?" 调试技巧与常见问题
"能不能直接套用模板?" 发布前检查清单

技能系统架构速览

┌─────────────────────────────────────────┐
│  Layer 1: 元数据 (始终加载,~100 词)      │
│  name + description → 触发判断          │
└─────────────────────────────────────────┘
                    ↓ 触发匹配
┌─────────────────────────────────────────┐
│  Layer 2: SKILL.md (触发后加载,<5000 词) │
│  工作流程 + 工具调用 + 资源配置           │
└─────────────────────────────────────────┘
                    ↓ 按需加载
┌─────────────────────────────────────────┐
│  Layer 3: 捆绑资源 (执行时使用)          │
│  scripts/ + references/ + assets/       │
└─────────────────────────────────────────┘

引言

为什么需要技能系统

想象这个场景:你每天要用 AI 处理 PDF 文档、分析 Excel 数据、生成技术博客。如果没有技能系统,每次都要重复说明"用 pdfplumber 提取文本"、"用 openpyxl 处理表格"。有了技能系统,这些工作流程被封装成可复用的模块,AI 自动调用正确的工具。

OpenClaw 的技能系统解决了三个核心问题:

  1. 上下文效率:技能的元数据(名称 + 描述)始终在上下文中(约 100 词),完整内容仅在触发时加载(<5000 词),避免上下文浪费
  2. 工作流复用:将重复性任务封装成确定性脚本,避免每次重新生成代码
  3. 领域专业化:将通用 AI 转变为特定领域的专家,如 PDF 处理、前端设计、记忆管理

本文价值

我分析了 OpenClaw 官方文档和 10+ 个生产级技能,总结出可复用的开发模式。读完本文,你将能够:

  • 理解技能系统的三层加载机制和触发原理
  • 从零创建一个符合规范的技能
  • 掌握渐进式披露、错误处理、测试验证等最佳实践
  • 避免常见的技能设计陷阱

技能系统架构

三层加载模型

技能系统使用渐进式披露(Progressive Disclosure)设计,通过三层加载机制平衡上下文效率和功能完整性:

┌─────────────────────────────────────────┐
│  Layer 1: 元数据 (始终加载)              │
│  - name: 技能名称                        │
│  - description: 触发条件和功能描述        │
│  大小:~100 词                           │
└─────────────────────────────────────────┘
                    ↓ 触发匹配
┌─────────────────────────────────────────┐
│  Layer 2: SKILL.md 主体 (触发后加载)     │
│  - 工作流程指导                          │
│  - 工具调用说明                          │
│  - 资源配置信息                          │
│  大小:<5000 词(建议<500 行)            │
└─────────────────────────────────────────┘
                    ↓ 按需加载
┌─────────────────────────────────────────┐
│  Layer 3: 捆绑资源 (按需加载)            │
│  - scripts/: 可执行脚本                  │
│  - references/: 参考文档                 │
│  - assets/: 输出资源                     │
│  大小:无限制(脚本可不加载直接执行)     │
└─────────────────────────────────────────┘

关键设计原则:上下文窗口是公共资源。技能、系统提示、对话历史、工具调用共享有限的上下文空间。只在必要时加载内容。

技能目录结构

标准技能目录结构如下:

skill-name/
├── SKILL.md              # 必需:技能定义文件
│   ├── YAML Frontmatter  # 元数据(name, description)
│   └── Markdown 正文     # 使用指南
├── scripts/              # 可选:可执行脚本
│   ├── rotate_pdf.py
│   └── process_xlsx.sh
├── references/           # 可选:参考文档
│   ├── api_docs.md
│   └── workflows.md
└── assets/               # 可选:输出资源
    ├── templates/
    └── logo.png

文件职责分离

目录 用途 加载时机 示例
SKILL.md 核心工作流指导 技能触发后 "使用 pdfplumber 提取文本"
scripts/ 确定性代码 执行时(可不加载) PDF 旋转、数据转换脚本
references/ 详细文档 需要时手动加载 API 规范、数据库 schema
assets/ 输出素材 不加载,直接使用 模板文件、品牌素材

技能触发机制

技能触发基于元数据中的 namedescription 字段。系统在每轮对话前扫描所有技能元数据,匹配用户请求的语义。

触发条件设计模式

# ✅ 好的描述:包含功能和触发场景
description: 技术调研标准流程,用于执行技术相关的调研和分析任务。
trigger_conditions:
  - 用户提到"调研"、"研究"、"分析技术"、"技术对比"

# ✅ 好的描述:明确列出使用场景
description: 综合文档创建、编辑和分析技能。使用当需要:(1) 创建新文档,(2) 修改内容,(3) 处理修订标记,(4) 添加评论

# ❌ 避免:过于模糊
description: 文档处理技能

# ❌ 避免:在正文中写触发条件(正文触发后才加载)
# SKILL.md 正文中不要写"当用户提到 X 时使用此技能"

我的经验:描述字段是主要触发机制。我建议在 description 中列出 3-5 个具体触发场景,用数字编号或关键词列表。避免使用"等"、"相关"这类模糊词汇。

跨技能协作模式

复杂任务通常需要多个技能协作。OpenClaw 支持两种协作模式:

模式 1:顺序调用

用户请求:"调研 LangGraph 并写博客"
    ↓
1. tech-research-sop 触发 → 生成调研报告
    ↓
2. tech-blog-writer 触发 → 基于报告创作文章
    ↓
3. blog-formatter 触发 → 格式化发布

模式 2:资源引用

mcp-builder 技能
    ↓
引用 references/python_mcp_server.md
    ↓
引用 references/evaluation.md

关键要点:技能间通过共享工作区文件(如 MEMORY.mdAGENTS.md)和向量记忆系统通信。避免技能间直接调用,保持松耦合。


技能开发实战

步骤 1:理解需求与示例

在创建技能前,必须明确具体使用场景。通过以下问题澄清需求:

  • 用户会说什么来触发这个技能?
  • 技能需要完成什么具体任务?
  • 有哪些典型示例?

示例:创建 pdf-editor 技能

用户可能说:
- "帮我旋转这个 PDF"
- "合并这两个 PDF 文件"
- "从 PDF 中提取表格"

分析需求:
- 旋转 PDF → 需要 scripts/rotate_pdf.py
- 合并 PDF → 需要 scripts/merge_pdfs.py
- 提取表格 → 需要 scripts/extract_tables.py

关键要点:不要凭空设计技能。基于真实用户请求或预期场景推导功能。每个功能对应一个可测试的使用案例。

步骤 2:初始化技能

使用 OpenClaw 提供的初始化脚本创建技能模板:

# 语法
scripts/init_skill.py <skill-name> --path <output-directory>

# 示例:创建 weather 技能
scripts/init_skill.py weather --path ~/.openclaw/skills/weather

初始化脚本自动创建:

  • SKILL.md 模板(含 YAML Frontmatter)
  • scripts/ 目录(含示例脚本)
  • references/ 目录(含示例文档)
  • assets/ 目录(含示例资源)

注意:示例文件仅用于演示结构,大多数技能不需要保留所有示例文件。删除不需要的文件保持简洁。

步骤 3:编写 SKILL.md

YAML Frontmatter

---
name: skill-name
description: 清晰描述功能和触发条件
version: 1.0  # 可选
author: your-name  # 可选
---

必填字段

  • name: 技能名称(使用小写字母和连字符,如 tech-research-sop
  • description: 触发条件和功能描述(这是主要触发机制)

可选字段

  • version: 版本号(语义化版本,如 1.0.0
  • author: 作者信息
  • license: 许可协议

正文结构

SKILL.md 正文应包含以下部分:

# 技能名称

简要介绍(1-2 段)

## 快速开始

最简使用示例

## 工作流程

详细步骤说明

## 资源配置

scripts/、references/、assets/ 使用说明

## 错误处理

常见问题和解决方案

## 最佳实践

使用建议和注意事项

写作原则

  1. 使用祈使句:"运行脚本"、"加载文档"、"验证结果"
  2. 提供代码示例:展示具体用法
  3. 包含错误处理:说明常见错误和解决方法
  4. 保持简洁:目标<500 行,详细文档移到 references/

步骤 4:创建捆绑资源

Scripts(脚本)

何时使用

  • 相同代码被重复生成
  • 需要确定性可靠性
  • 性能敏感操作

示例:scripts/rotate_pdf.py

#!/usr/bin/env python3
"""
旋转 PDF 文件

用法:python rotate_pdf.py input.pdf output.pdf 90
"""

import sys
from pypdf import PdfReader, PdfWriter

def rotate_pdf(input_path, output_path, degrees):
    """旋转 PDF 文件指定角度"""
    reader = PdfReader(input_path)
    writer = PdfWriter()

    for page in reader.pages:
        page.rotate(degrees)
        writer.add_page(page)

    with open(output_path, 'wb') as f:
        writer.write(f)

if __name__ == '__main__':
    if len(sys.argv) != 4:
        print("用法:python rotate_pdf.py input.pdf output.pdf degrees")
        sys.exit(1)

    input_path = sys.argv[1]
    output_path = sys.argv[2]
    degrees = int(sys.argv[3])

    rotate_pdf(input_path, output_path, degrees)
    print(f"✓ PDF 已旋转 {degrees}°,保存到 {output_path}")

脚本最佳实践

  • 添加 shebang (#!/usr/bin/env python3)
  • 包含文档字符串说明用法
  • 参数验证和错误处理
  • 提供清晰的输出信息
  • 测试实际运行(不仅是语法检查)

References(参考文档)

何时使用

  • 详细 API 文档
  • 数据库 schema
  • 工作流程指南
  • 领域知识

示例:references/api_docs.md

# API 文档

## 认证

```bash
curl -H "Authorization: Bearer $API_KEY" \
     https://api.example.com/v1/resource

端点

GET /resource

参数
- limit (可选): 返回数量,默认 100
- offset (可选): 偏移量,默认 0

返回

{
  "data": [...],
  "total": 1000
}

错误码

  • 400: 参数错误
  • 401: 认证失败
  • 429: 速率限制
**组织模式**:

对于支持多框架/多领域的技能,按变体组织:

cloud-deploy/
├── SKILL.md (概述 + 选择指南)
└── references/
├── aws.md
├── gcp.md
└── azure.md

SKILL.md 包含选择指南:

```markdown
## 选择云提供商

- **AWS**: 需要 EC2、S3、Lambda → 读取 references/aws.md
- **GCP**: 需要 GKE、Cloud Run → 读取 references/gcp.md
- **Azure**: 需要 AKS、Functions → 读取 references/azure.md

Assets(资源文件)

何时使用

  • 模板文件(PPT、HTML)
  • 品牌素材(logo、字体)
  • 示例数据

示例:assets/presentation-template.pptx

技能使用方式:
1. 复制模板到工作区
2. 填充内容
3. 保存为最终文件

关键要点:Assets 不加载到上下文,直接用于输出。保持文件小且专注。

步骤 5:测试技能

测试流程

# 1. 语法检查(Python 脚本)
python -m py_compile scripts/your_script.py

# 2. 运行测试
pytest tests/  # 如果有测试套件

# 3. 实际使用测试
# 在 OpenClaw 中触发技能,验证行为

# 4. 打包验证
scripts/package_skill.py ~/.openclaw/skills/your-skill

测试检查清单

  • [ ] 脚本可独立运行
  • [ ] 错误处理正常工作
  • [ ] 输出符合预期
  • [ ] 技能正确触发
  • [ ] 文档清晰准确

步骤 6:打包技能

使用打包脚本创建分发的 .skill 文件:

# 基本用法
scripts/package_skill.py <path/to/skill-folder>

# 指定输出目录
scripts/package_skill.py ~/.openclaw/skills/weather ./dist

打包脚本自动:

  1. 验证技能
    - YAML Frontmatter 格式
    - 命名规范和目录结构
    - 描述完整性
    - 文件组织

  2. 创建包
    - 生成 .skill 文件(zip 格式)
    - 包含所有文件
    - 保持目录结构

验证失败处理

❌ 验证失败:
- description 字段缺少触发条件
- scripts/rotate_pdf.py 缺少 shebang

修复后重新运行打包命令。

步骤 7:迭代改进

技能发布后,基于实际使用持续改进:

迭代流程

1. 在真实任务中使用技能
2. 记录问题和低效点
3. 更新 SKILL.md 或资源
4. 重新测试
5. 重新打包

常见迭代场景

  • 用户频繁询问相同问题 → 在 SKILL.md 中添加 FAQ
  • 脚本经常出错 → 增强错误处理和日志
  • 触发不准确 → 优化 description 字段
  • 缺少功能 → 添加新脚本或参考文档

最佳实践

命名规范

技能名称

# ✅ 好的命名
tech-research-sop      # 清晰描述功能
cognitive-memory       # 简洁且有意义
frontend-design        # 领域 + 功能

# ❌ 避免的命名
skill1                 # 无意义
my-awesome-skill       # 主观描述
pdf-processor-v2-final # 版本信息放 version 字段

文件命名

# ✅ 好的命名
scripts/rotate_pdf.py
references/api_docs.md
assets/logo.png

# ❌ 避免的命名
scripts/script1.py     # 无意义
references/doc.md      # 太通用

结构设计

保持 SKILL.md 简洁

目标:<500 行,<5000 词

策略

  1. 核心流程在 SKILL.md:工作流、决策树、关键示例
  2. 详细文档在 references/:API 参考、schema、完整示例
  3. 代码在 scripts/:可执行脚本,不占用上下文

示例对比

# ❌ 过于冗长的 SKILL.md(避免)

## API 端点详解

### GET /users
这个端点返回用户列表。它接受多个参数:
- page: 页码,从 1 开始
- limit: 每页数量,默认 20
- sort: 排序字段,可选 name/email/created_at
...
(继续 200 行 API 文档)

# ✅ 简洁的 SKILL.md(推荐)

## API 使用

调用用户 API:
```bash
curl -H "Authorization: Bearer $API_KEY" \
     "https://api.example.com/users?page=1&limit=20"

完整 API 文档:见 references/api_docs.md

#### 渐进式披露模式

**模式 1基础 + 高级**

```markdown
## PDF 处理

### 基础用法
```python
import pdfplumber
with pdfplumber.open("file.pdf") as pdf:
    text = pdf.pages[0].extract_text()

高级功能

**模式 2:按领域组织**

```markdown
## 数据库查询

根据查询类型加载对应文档:
- **财务数据**(收入、账单):读取 references/finance.md
- **销售数据**(机会、管道):读取 references/sales.md
- **产品数据**(API 使用、功能):读取 references/product.md

模式 3:按框架组织

## 云部署

选择云提供商后加载对应文档:
- **AWS**:读取 references/aws.md
- **GCP**:读取 references/gcp.md  
- **Azure**:读取 references/azure.md

错误处理

技能内错误处理

脚本错误处理

#!/usr/bin/env python3
"""处理 Excel 文件"""

import sys
import os
from openpyxl import load_workbook

def process_xlsx(input_path, output_path):
    """处理 Excel 文件,添加计算列"""

    # 验证输入文件
    if not os.path.exists(input_path):
        raise FileNotFoundError(f"输入文件不存在:{input_path}")

    if not input_path.endswith('.xlsx'):
        raise ValueError(f"仅支持 .xlsx 文件:{input_path}")

    try:
        wb = load_workbook(input_path)
        ws = wb.active

        # 添加计算列
        for row in ws.iter_rows(min_row=2):
            if row[0].value and row[1].value:
                row[2].value = row[0].value * row[1].value

        wb.save(output_path)
        return True

    except PermissionError as e:
        print(f"❌ 权限错误:无法访问文件", file=sys.stderr)
        print(f"详情:{e}", file=sys.stderr)
        return False

    except Exception as e:
        print(f"❌ 处理失败:{e}", file=sys.stderr)
        return False

if __name__ == '__main__':
    if len(sys.argv) != 3:
        print("用法:python process_xlsx.py input.xlsx output.xlsx")
        sys.exit(1)

    success = process_xlsx(sys.argv[1], sys.argv[2])
    sys.exit(0 if success else 1)

SKILL.md 中的错误处理指南

## 常见问题

### 问题:脚本运行时提示"模块未找到"
**原因**:缺少 Python 依赖
**解决**:
```bash
pip install pypdf pdfplumber openpyxl

问题:API 返回 401 错误

原因:API Key 未配置或过期
解决
1. 检查 ~/.openclaw/CREDENTIALS.md 中是否有 API_KEY
2. 确认环境变量已加载:export API_KEY=xxx
3. 如使用新 Key,重启 Gateway

问题:技能未触发

原因:描述字段未包含触发关键词
解决:在 description 中添加更多触发场景

#### 优雅降级

当依赖服务不可用时,提供降级方案:

```markdown
## 搜索服务降级

**正常流程**:
1. DuckDuckGo 初步搜索
2. Brave Search 深度搜索
3. Tavily 获取高质量结果

**降级方案**(搜索服务不可用时):
- 使用已有技术资料库(tech-research/articles/)
- 使用历史调研报告
- 标注"搜索不可用,基于已有资料"

测试策略

脚本测试

单元测试

# tests/test_rotate_pdf.py
import pytest
from scripts.rotate_pdf import rotate_pdf

def test_rotate_pdf_creates_file(tmp_path):
    """测试 PDF 旋转生成输出文件"""
    input_pdf = tmp_path / "input.pdf"
    output_pdf = tmp_path / "output.pdf"

    # 创建测试 PDF(使用已知库)
    create_test_pdf(input_pdf)

    # 执行旋转
    rotate_pdf(str(input_pdf), str(output_pdf), 90)

    # 验证输出
    assert output_pdf.exists()
    assert output_pdf.stat().st_size > 0

集成测试

#!/bin/bash
# tests/integration_test.sh

# 测试完整工作流程
echo "测试 PDF 处理流程..."

# 1. 准备测试文件
cp test_data/sample.pdf /tmp/test_input.pdf

# 2. 运行脚本
python scripts/rotate_pdf.py /tmp/test_input.pdf /tmp/test_output.pdf 90

# 3. 验证结果
if [ -f /tmp/test_output.pdf ]; then
    echo "✓ 测试通过"
    exit 0
else
    echo "✗ 测试失败:输出文件未生成"
    exit 1
fi

技能触发测试

测试场景

## 触发测试用例

### 应触发的请求
- "调研一下 LangChain 框架"
- "帮我做技术对比分析"
- "研究微服务架构"

### 不应触发的请求
- "今天天气如何"(weather 技能)
- "写个 Python 脚本"(coding-agent 技能)
- "打开浏览器"(browser 技能)

测试方法

  1. 在 OpenClaw 中发送测试请求
  2. 观察技能是否正确触发
  3. 检查加载的内容是否准确
  4. 记录误触发和漏触发

性能优化

上下文优化

问题:技能加载过多内容导致上下文溢出

解决方案

  1. 使用 references/ 分离详细内容
    SKILL.md: 200 行(核心流程) references/api_docs.md: 500 行(详细 API) references/examples.md: 300 行(完整示例)

  2. 提供 grep 搜索模式
    ```markdown
    ## 搜索参考文档

在 references/ 中快速查找:
```bash
# 查找认证相关
grep -r "认证|auth|token" references/

# 查找特定 API
grep -r "GET /users" references/

  1. 使用条件加载
    markdown 仅在需要时加载: - 处理表单 → 加载 FORMS.md - 处理修订 → 加载 REDLINING.md - 其他情况 → 不加载

脚本优化

问题:脚本运行缓慢

解决方案

  1. 使用高效库
    ```python
    # ❌ 慢:逐页处理大 PDF
    for page in pdf.pages:
    process(page)

# ✅ 快:批量处理
process_batch(pdf.pages)
```

  1. 添加缓存
    ```python
    from functools import lru_cache

@lru_cache(maxsize=100)
def get_api_schema(endpoint):
"""缓存 API schema 查询"""
return fetch_schema(endpoint)
```

  1. 异步处理
    ```python
    import asyncio

async def process_multiple_files(files):
tasks = [process_file(f) for f in files]
await asyncio.gather(*tasks)
```


案例分享

案例 1:tech-research-sop(SOP 流程技能)

技能定位:技术调研标准流程

设计亮点

  1. 清晰的触发条件
    ```yaml
    trigger_conditions:

    • 用户提到"调研"、"研究"、"分析技术"、"技术对比"
      ```
  2. 结构化工作流程
    markdown ### 步骤 1: 明确调研主题和范围 ### 步骤 2: 多源搜索(DuckDuckGo→Brave→Tavily) ### 步骤 3: 资料整理和分类 ### 步骤 4: 生成结构化报告 ### 步骤 5: 更新知识库

  3. 降级机制
    markdown ⚠️ Fallback 机制:如果搜索服务不可用,使用已有技术资料库

  4. 标准化输出
    markdown 报告结构: - 技术概述 - 优缺点分析 - 应用场景 - 对比分析 - 结论和建议

可复用模式:SOP 类技能都应包含明确的步骤、验收标准、降级方案。

案例 2:cognitive-memory(复杂系统技能)

技能定位:多层记忆系统管理

设计亮点

  1. 渐进式披露
    SKILL.md: 快速设置和核心概念 references/architecture.md: 完整架构文档(1200+ 行) references/routing-prompt.md: LLM 分类器提示词 references/reflection-process.md: 反思流程哲学

  2. 表格化参数
    markdown | 参数 | 默认值 | 说明 | |------|--------|------| | Core memory cap | 3,000 tokens | 始终在上下文 | | Decay λ | 0.03 | ~23 天半衰期 | | Archive threshold | 0.05 | 低于此值隐藏 |

  3. 故障排查指南
    ```markdown
    ## Troubleshooting

Memory not persisting?
Check memorySearch.enabled: true, verify MEMORY.md exists

Reflection not running?
Ensure previous reflection was approved/rejected
```

可复用模式:复杂系统技能应提供快速入门、详细参考、故障排查三层文档。

案例 3:mcp-builder(工具集成技能)

技能定位:MCP 服务器开发指南

设计亮点

  1. 分阶段工作流
    markdown Phase 1: 深度研究和规划 Phase 2: 实现 Phase 3: 审查和优化 Phase 4: 创建评估

  2. 多语言支持
    Python 实现 → 加载 references/python_mcp_server.md TypeScript 实现 → 加载 references/node_mcp_server.md

  3. 外部文档获取
    markdown 使用 WebFetch 加载: - MCP 协议:https://modelcontextprotocol.io/llms-full.txt - Python SDK: https://raw.githubusercontent.com/.../README.md

  4. 质量检查清单
    markdown - [ ] DRY 原则:工具间无重复代码 - [ ] 可组合性:共享逻辑提取为函数 - [ ] 一致性:相似操作返回相似格式 - [ ] 错误处理:所有外部调用有错误处理

可复用模式:工具集成技能应包含官方文档获取、多语言支持、质量检查。

案例 4:frontend-design(专项技能)

技能定位:前端界面设计

设计亮点

  1. 设计思维优先
    markdown 在编码前理解: - Purpose: 解决什么问题?谁使用? - Tone: 选择极端风格(极简、极繁、复古未来...) - Constraints: 技术要求 - Differentiation: 什么让人难忘?

  2. 具体设计指南
    markdown 关注: - Typography: 选择独特字体,避免 Inter/Roboto - Color: 主色 + 锐利点缀,避免 timid 配色 - Motion: 高影响力动画,非零散微交互 - Spatial: 非对称、重叠、对角线流

  3. 明确禁止项
    markdown NEVER 使用: - 通用 AI 美学(Inter 字体、紫色渐变) - 可预测布局 - 缺乏上下文的模板化设计

可复用模式:创意类技能应强调设计原则、具体指南、避免事项。

案例 5:self-improvement(元技能)

技能定位:持续改进和知识沉淀

设计亮点

  1. 快速参考表
    markdown | 情况 | 行动 | |------|------| | 命令/操作失败 | 记录到 .learnings/ERRORS.md | | 用户纠正你 | 记录到 .learnings/LEARNINGS.md | | 用户想要缺失功能 | 记录到 .learnings/FEATURE_REQUESTS.md |

  2. 提升机制
    markdown 广泛适用的学习提升到: - 行为模式 → SOUL.md - 工作流改进 → AGENTS.md - 工具陷阱 → TOOLS.md

  3. 工作区集成
    ~/.openclaw/workspace/ ├── AGENTS.md # 多 Agent 工作流 ├── SOUL.md # 行为指南 ├── TOOLS.md # 工具注意事项 └── .learnings/ # 学习日志 ├── LEARNINGS.md ├── ERRORS.md └── FEATURE_REQUESTS.md

可复用模式:元技能应提供快速参考、清晰路径、工作区集成。


常见问题与调试技巧

问题 1:技能未触发

症状:用户请求与技能相关,但技能未激活

排查步骤

# 1. 检查 skill 元数据
cat ~/.openclaw/skills/your-skill/SKILL.md | head -10

# 2. 验证 description 是否包含触发词
# 确保 description 包含用户可能说的关键词

# 3. 检查技能是否被禁用
cat ~/.openclaw/openclaw.json | grep -A 10 '"skills"'

# 4. 重启 Gateway
openclaw gateway restart

常见原因

  • description 太模糊,未包含具体触发场景
  • 技能名称或描述有拼写错误
  • 技能被配置禁用
  • Gateway 未重新加载技能

解决方案

# ❌ 模糊描述
description: 文档处理技能

# ✅ 具体描述
description: 综合文档创建、编辑和分析。使用当需要:(1) 创建新文档,(2) 修改内容,(3) 处理修订标记,(4) 添加评论,(5) 提取文本

问题 2:技能触发但行为错误

症状:技能激活,但执行的操作不符合预期

排查步骤

# 1. 检查 SKILL.md 正文
cat ~/.openclaw/skills/your-skill/SKILL.md

# 2. 验证脚本可运行
python ~/.openclaw/skills/your-skill/scripts/your_script.py --help

# 3. 检查依赖是否安装
pip list | grep your-dependency

# 4. 查看 Gateway 日志
openclaw logs --follow

常见原因

  • SKILL.md 中的指令不清晰
  • 脚本有 bug 或未测试
  • 缺少依赖库
  • 环境变量未配置

解决方案

  1. 重写 SKILL.md,使用更清晰的指令
  2. 添加脚本测试
  3. 在 SKILL.md 中添加依赖安装说明
  4. 提供环境变量配置示例

问题 3:上下文溢出

症状:技能加载后,上下文窗口不足,后续请求失败

排查步骤

# 1. 检查 SKILL.md 大小
wc -l ~/.openclaw/skills/your-skill/SKILL.md

# 2. 检查 references/ 总大小
du -sh ~/.openclaw/skills/your-skill/references/

# 3. 查看上下文使用情况
# 在对话中询问:"当前上下文使用情况如何?"

常见原因

  • SKILL.md 过长(>500 行)
  • 一次性加载所有 references
  • 脚本内容直接写在 SKILL.md 中

解决方案

  1. 移动详细内容到 references/
  2. 在 SKILL.md 中添加条件加载说明
  3. 使用脚本替代长代码示例
  4. 提供 grep 搜索模式

问题 4:跨技能冲突

症状:多个技能同时触发,行为不一致

排查步骤

# 1. 列出所有技能
ls ~/.openclaw/skills/

# 2. 检查技能描述重叠
grep -r "description:" ~/.openclaw/skills/*/SKILL.md

# 3. 测试边界情况
# 发送模糊请求,观察哪个技能触发

常见原因

  • 技能描述重叠
  • 触发条件太宽泛
  • 技能职责不清晰

解决方案

  1. 明确每个技能的职责边界
  2. 在 description 中添加排他性说明
  3. 使用优先级机制(如果支持)
  4. 合并重叠技能

调试技巧

技巧 1:添加调试日志

在脚本中添加详细日志:

import logging

logging.basicConfig(
    level=logging.DEBUG,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)

logger = logging.getLogger(__name__)

def process_file(path):
    logger.info(f"开始处理文件:{path}")
    # ... 处理逻辑
    logger.debug(f"读取到 {len(content)} 字节")

技巧 2:使用测试数据

创建测试数据集:

mkdir -p tests/test_data
cp sample.pdf tests/test_data/
cp sample.xlsx tests/test_data/

# 在脚本中使用测试数据
python scripts/process.py tests/test_data/sample.pdf

技巧 3:模拟用户请求

创建测试脚本模拟用户请求:

#!/bin/bash
# tests/simulate_requests.sh

requests=(
    "调研一下 LangChain"
    "分析微服务架构"
    "对比 React 和 Vue"
)

for req in "${requests[@]}"; do
    echo "测试请求:$req"
    # 发送请求到 OpenClaw(使用 CLI 或 API)
    # 观察技能触发情况
done

技巧 4:性能分析

使用性能分析工具:

# Python 脚本性能分析
python -m cProfile -o output.prof scripts/your_script.py

# 查看分析结果
snakeviz output.prof

# 或使用 py-spy 实时分析
py-spy record -o profile.svg -- python scripts/your_script.py

总结与展望

关键要点回顾

  1. 技能系统架构
    - 三层加载模型:元数据 → SKILL.md → 捆绑资源
    - 触发基于 name + description,正文触发后才加载
    - 跨技能协作通过共享工作区和记忆系统

  2. 开发流程
    - 理解需求 → 初始化 → 编写 SKILL.md → 创建资源 → 测试 → 打包 → 迭代
    - 使用 init_skill.py 和 package_skill.py 脚本
    - 基于真实使用案例持续改进

  3. 最佳实践
    - 命名清晰,描述包含触发场景
    - SKILL.md <500 行,详细内容移 references/
    - 脚本包含错误处理和测试
    - 提供降级方案和故障排查指南

  4. 常见陷阱
    - 描述太模糊导致不触发
    - SKILL.md 过长导致上下文溢出
    - 脚本未测试导致运行错误
    - 技能职责重叠导致冲突

技能系统演进方向

基于我对 OpenClaw 技能系统的研究,未来可能出现以下改进:

  1. 技能市场:类似 npm 的技能分发平台,支持搜索、安装、更新
  2. 技能组合:声明式定义技能依赖和编排流程
  3. 性能监控:技能调用统计、错误率、响应时间
  4. A/B 测试:对比不同技能设计的效果
  5. 自动优化:基于使用数据自动调整触发条件和内容

个人建议

基于开发 10+ 个技能的经验,我的建议是:

从小开始:先创建简单技能(如单个脚本),熟悉流程后再开发复杂技能。

重视测试:每个脚本都要有测试用例,避免"在我的机器上能运行"的问题。

文档即代码:SKILL.md 和代码一样需要版本控制、审查、测试。

用户视角:站在用户角度思考"我会说什么来触发这个技能",而不是"这个技能应该做什么"。

持续迭代:技能不是一次性产品,基于实际使用持续改进。

下一步行动

如果你想开始开发 OpenClaw 技能:

  1. 阅读官方文档/usr/lib/node_modules/openclaw/docs/
  2. 分析现有技能~/.openclaw/skills/ 中的 47+ 个技能
  3. 创建第一个技能:从简单脚本开始,如文件处理工具
  4. 加入社区:分享技能,获取反馈,学习最佳实践

参考资料

官方文档

技能示例

相关项目

  • pi-mono - Agent 运行时
  • ClawHub - 技能分发平台(规划中)

附录:技能开发检查清单

发布前自检

元数据
- [ ] name 使用小写字母和连字符
- [ ] description 包含 3-5 个具体触发场景
- [ ] version 使用语义化版本(如 1.0.0)

SKILL.md
- [ ] <500 行,<5000 词
- [ ] 包含快速开始示例
- [ ] 包含工作流程说明
- [ ] 包含错误处理指南
- [ ] 使用祈使句写作

资源文件
- [ ] scripts/ 中的脚本可独立运行
- [ ] scripts/ 中的脚本包含错误处理
- [ ] references/ 中的文档有清晰结构
- [ ] assets/ 中的文件大小合理

测试
- [ ] 脚本通过语法检查
- [ ] 脚本通过功能测试
- [ ] 技能正确触发
- [ ] 技能行为符合预期
- [ ] 无上下文溢出问题

文档
- [ ] 依赖明确标注
- [ ] 环境变量配置说明
- [ ] 常见问题解答
- [ ] 故障排查指南

打包
- [ ] 通过 package_skill.py 验证
- [ ] .skill 文件生成成功
- [ ] 所有文件包含在包中



📋 快速参考卡片

技能触发条件设计

# ✅ 好的描述(包含具体触发场景)
description: 技术调研标准流程。使用当:
  - 用户提到"调研"、"研究"、"分析技术"
  - 需要做技术对比、竞品分析
  - 需要生成结构化调研报告

# ❌ 避免(过于模糊)
description: 技术调研技能

目录结构模板

skill-name/
├── SKILL.md              # 必需,<500 行
├── scripts/              # 可选,可执行脚本
├── references/           # 可选,详细文档
└── assets/               # 可选,输出资源

常见错误速查

问题 可能原因 解决方案
技能未触发 description 太模糊 添加 3-5 个具体触发场景
上下文溢出 SKILL.md 过长 移动详细内容到 references/
脚本运行失败 缺少依赖 在 SKILL.md 中添加安装说明
跨技能冲突 职责重叠 明确每个技能的边界

🖼️ 配图建议汇总

位置 配图内容 风格建议
封面 技能系统概念图 黑板手绘风,三层结构示意
三层架构 渐进式披露流程图 从上到下三层,箭头标注加载时机
目录结构 技能文件夹结构 树状图,标注每个文件用途
触发机制 技能触发流程图 用户请求→匹配→加载→执行
案例展示 5 个技能截图 每个技能一个小板块

关于作者:江神,IT 工作者,专注于 AI Agent 工程化实践。在 OpenClaw 中开发和使用 47+ 个技能,有丰富的一手经验。

反馈与改进:通过 Matrix @damon:conduit.local 联系我。

许可:CC BY-SA 4.0