一句话总结: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 的技能系统解决了三个核心问题:
- 上下文效率:技能的元数据(名称 + 描述)始终在上下文中(约 100 词),完整内容仅在触发时加载(<5000 词),避免上下文浪费
- 工作流复用:将重复性任务封装成确定性脚本,避免每次重新生成代码
- 领域专业化:将通用 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/ |
输出素材 | 不加载,直接使用 | 模板文件、品牌素材 |
技能触发机制
技能触发基于元数据中的 name 和 description 字段。系统在每轮对话前扫描所有技能元数据,匹配用户请求的语义。
触发条件设计模式:
# ✅ 好的描述:包含功能和触发场景
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.md、AGENTS.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/ 使用说明
## 错误处理
常见问题和解决方案
## 最佳实践
使用建议和注意事项
写作原则:
- 使用祈使句:"运行脚本"、"加载文档"、"验证结果"
- 提供代码示例:展示具体用法
- 包含错误处理:说明常见错误和解决方法
- 保持简洁:目标<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
打包脚本自动:
-
验证技能:
- YAML Frontmatter 格式
- 命名规范和目录结构
- 描述完整性
- 文件组织 -
创建包:
- 生成.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 词
策略:
- 核心流程在 SKILL.md:工作流、决策树、关键示例
- 详细文档在 references/:API 参考、schema、完整示例
- 代码在 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()
高级功能
- 表单填写:见 FORMS.md
- 修订跟踪:见 REDLINING.md
- 完整 API:见 REFERENCE.md
**模式 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 技能)
测试方法:
- 在 OpenClaw 中发送测试请求
- 观察技能是否正确触发
- 检查加载的内容是否准确
- 记录误触发和漏触发
性能优化
上下文优化
问题:技能加载过多内容导致上下文溢出
解决方案:
-
使用 references/ 分离详细内容
SKILL.md: 200 行(核心流程) references/api_docs.md: 500 行(详细 API) references/examples.md: 300 行(完整示例) -
提供 grep 搜索模式
```markdown
## 搜索参考文档
在 references/ 中快速查找:
```bash
# 查找认证相关
grep -r "认证|auth|token" references/
# 查找特定 API
grep -r "GET /users" references/
- 使用条件加载
markdown 仅在需要时加载: - 处理表单 → 加载 FORMS.md - 处理修订 → 加载 REDLINING.md - 其他情况 → 不加载
脚本优化
问题:脚本运行缓慢
解决方案:
- 使用高效库
```python
# ❌ 慢:逐页处理大 PDF
for page in pdf.pages:
process(page)
# ✅ 快:批量处理
process_batch(pdf.pages)
```
- 添加缓存
```python
from functools import lru_cache
@lru_cache(maxsize=100)
def get_api_schema(endpoint):
"""缓存 API schema 查询"""
return fetch_schema(endpoint)
```
- 异步处理
```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 流程技能)
技能定位:技术调研标准流程
设计亮点:
-
清晰的触发条件
```yaml
trigger_conditions:- 用户提到"调研"、"研究"、"分析技术"、"技术对比"
```
- 用户提到"调研"、"研究"、"分析技术"、"技术对比"
-
结构化工作流程
markdown ### 步骤 1: 明确调研主题和范围 ### 步骤 2: 多源搜索(DuckDuckGo→Brave→Tavily) ### 步骤 3: 资料整理和分类 ### 步骤 4: 生成结构化报告 ### 步骤 5: 更新知识库 -
降级机制
markdown ⚠️ Fallback 机制:如果搜索服务不可用,使用已有技术资料库 -
标准化输出
markdown 报告结构: - 技术概述 - 优缺点分析 - 应用场景 - 对比分析 - 结论和建议
可复用模式:SOP 类技能都应包含明确的步骤、验收标准、降级方案。
案例 2:cognitive-memory(复杂系统技能)
技能定位:多层记忆系统管理
设计亮点:
-
渐进式披露
SKILL.md: 快速设置和核心概念 references/architecture.md: 完整架构文档(1200+ 行) references/routing-prompt.md: LLM 分类器提示词 references/reflection-process.md: 反思流程哲学 -
表格化参数
markdown | 参数 | 默认值 | 说明 | |------|--------|------| | Core memory cap | 3,000 tokens | 始终在上下文 | | Decay λ | 0.03 | ~23 天半衰期 | | Archive threshold | 0.05 | 低于此值隐藏 | -
故障排查指南
```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 服务器开发指南
设计亮点:
-
分阶段工作流
markdown Phase 1: 深度研究和规划 Phase 2: 实现 Phase 3: 审查和优化 Phase 4: 创建评估 -
多语言支持
Python 实现 → 加载 references/python_mcp_server.md TypeScript 实现 → 加载 references/node_mcp_server.md -
外部文档获取
markdown 使用 WebFetch 加载: - MCP 协议:https://modelcontextprotocol.io/llms-full.txt - Python SDK: https://raw.githubusercontent.com/.../README.md -
质量检查清单
markdown - [ ] DRY 原则:工具间无重复代码 - [ ] 可组合性:共享逻辑提取为函数 - [ ] 一致性:相似操作返回相似格式 - [ ] 错误处理:所有外部调用有错误处理
可复用模式:工具集成技能应包含官方文档获取、多语言支持、质量检查。
案例 4:frontend-design(专项技能)
技能定位:前端界面设计
设计亮点:
-
设计思维优先
markdown 在编码前理解: - Purpose: 解决什么问题?谁使用? - Tone: 选择极端风格(极简、极繁、复古未来...) - Constraints: 技术要求 - Differentiation: 什么让人难忘? -
具体设计指南
markdown 关注: - Typography: 选择独特字体,避免 Inter/Roboto - Color: 主色 + 锐利点缀,避免 timid 配色 - Motion: 高影响力动画,非零散微交互 - Spatial: 非对称、重叠、对角线流 -
明确禁止项
markdown NEVER 使用: - 通用 AI 美学(Inter 字体、紫色渐变) - 可预测布局 - 缺乏上下文的模板化设计
可复用模式:创意类技能应强调设计原则、具体指南、避免事项。
案例 5:self-improvement(元技能)
技能定位:持续改进和知识沉淀
设计亮点:
-
快速参考表
markdown | 情况 | 行动 | |------|------| | 命令/操作失败 | 记录到 .learnings/ERRORS.md | | 用户纠正你 | 记录到 .learnings/LEARNINGS.md | | 用户想要缺失功能 | 记录到 .learnings/FEATURE_REQUESTS.md | -
提升机制
markdown 广泛适用的学习提升到: - 行为模式 → SOUL.md - 工作流改进 → AGENTS.md - 工具陷阱 → TOOLS.md -
工作区集成
~/.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 或未测试
- 缺少依赖库
- 环境变量未配置
解决方案:
- 重写 SKILL.md,使用更清晰的指令
- 添加脚本测试
- 在 SKILL.md 中添加依赖安装说明
- 提供环境变量配置示例
问题 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 中
解决方案:
- 移动详细内容到 references/
- 在 SKILL.md 中添加条件加载说明
- 使用脚本替代长代码示例
- 提供 grep 搜索模式
问题 4:跨技能冲突
症状:多个技能同时触发,行为不一致
排查步骤:
# 1. 列出所有技能
ls ~/.openclaw/skills/
# 2. 检查技能描述重叠
grep -r "description:" ~/.openclaw/skills/*/SKILL.md
# 3. 测试边界情况
# 发送模糊请求,观察哪个技能触发
常见原因:
- 技能描述重叠
- 触发条件太宽泛
- 技能职责不清晰
解决方案:
- 明确每个技能的职责边界
- 在 description 中添加排他性说明
- 使用优先级机制(如果支持)
- 合并重叠技能
调试技巧
技巧 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
总结与展望
关键要点回顾
-
技能系统架构
- 三层加载模型:元数据 → SKILL.md → 捆绑资源
- 触发基于 name + description,正文触发后才加载
- 跨技能协作通过共享工作区和记忆系统 -
开发流程
- 理解需求 → 初始化 → 编写 SKILL.md → 创建资源 → 测试 → 打包 → 迭代
- 使用 init_skill.py 和 package_skill.py 脚本
- 基于真实使用案例持续改进 -
最佳实践
- 命名清晰,描述包含触发场景
- SKILL.md <500 行,详细内容移 references/
- 脚本包含错误处理和测试
- 提供降级方案和故障排查指南 -
常见陷阱
- 描述太模糊导致不触发
- SKILL.md 过长导致上下文溢出
- 脚本未测试导致运行错误
- 技能职责重叠导致冲突
技能系统演进方向
基于我对 OpenClaw 技能系统的研究,未来可能出现以下改进:
- 技能市场:类似 npm 的技能分发平台,支持搜索、安装、更新
- 技能组合:声明式定义技能依赖和编排流程
- 性能监控:技能调用统计、错误率、响应时间
- A/B 测试:对比不同技能设计的效果
- 自动优化:基于使用数据自动调整触发条件和内容
个人建议
基于开发 10+ 个技能的经验,我的建议是:
从小开始:先创建简单技能(如单个脚本),熟悉流程后再开发复杂技能。
重视测试:每个脚本都要有测试用例,避免"在我的机器上能运行"的问题。
文档即代码:SKILL.md 和代码一样需要版本控制、审查、测试。
用户视角:站在用户角度思考"我会说什么来触发这个技能",而不是"这个技能应该做什么"。
持续迭代:技能不是一次性产品,基于实际使用持续改进。
下一步行动
如果你想开始开发 OpenClaw 技能:
- 阅读官方文档:
/usr/lib/node_modules/openclaw/docs/ - 分析现有技能:
~/.openclaw/skills/中的 47+ 个技能 - 创建第一个技能:从简单脚本开始,如文件处理工具
- 加入社区:分享技能,获取反馈,学习最佳实践
参考资料
官方文档
技能示例
- skill-creator - 元技能,技能创建指南
- tech-research-sop - SOP 流程示例
- cognitive-memory - 复杂系统示例
- mcp-builder - 工具集成示例
- frontend-design - 专项技能示例
- self-improvement - 元技能示例
相关项目
附录:技能开发检查清单
发布前自检
元数据:
- [ ] 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