什么是 OpenClaw Skill?
OpenClaw Skill(技能)是扩展 AI 能力的核心机制。每个技能是一个独立模块,包含:
- SKILL.md – 技能说明文档,告诉 AI 如何使用这个技能
- scripts/ – 可执行脚本,实现具体功能
- config/ – 配置文件(可选)
- data/ – 数据存储(可选)
通过技能系统,OpenClaw 可以无限扩展:邮件管理、日历同步、文件操作、网络搜索、浏览器控制……一切皆可技能化。
技能目录结构
标准技能目录结构:
skills/
└── my-skill/
├── SKILL.md # 必需:技能说明
├── scripts/
│ ├── main.py # 主脚本
│ └── utils.py # 辅助脚本
├── config/
│ └── settings.json # 配置文件
└── data/
└── cache.json # 数据缓存
SKILL.md 编写指南
SKILL.md 是技能的核心,告诉 AI 这个技能做什么、怎么用。标准格式:
# 技能名称
## 简介
一句话描述这个技能的作用。
## 触发条件
什么情况下应该使用这个技能?
- 关键词匹配
- 用户意图识别
- 特定场景
## 使用方法
详细的调用步骤和参数说明。
## 示例
提供具体使用示例,帮助 AI 理解。
## 注意事项
使用限制、安全考虑等。
实际示例:天气查询技能
# 天气查询技能
## 简介
查询指定城市的实时天气和未来预报。
## 触发条件
- 用户询问天气相关问题时
- 用户提到"天气"、"气温"、"下雨"等关键词
- 用户计划外出需要了解天气时
## 使用方法
调用脚本:
python scripts/weather.py --city "城市名" --days 预报天数
参数说明:
- city: 城市名称,支持中文
- days: 预报天数,1-7,默认 1
## 示例
用户:"北京今天天气怎么样?"
执行:python scripts/weather.py --city "北京" --days 1
用户:"上海未来三天天气"
执行:python scripts/weather.py --city "上海" --days 3
## 注意事项
- 需要配置 API Key(OpenWeatherMap)
- 支持国内城市中文查询
- 请求频率限制:每分钟 60 次
脚本开发实践
技能脚本推荐使用 Python,易于编写和维护。示例:待办事项管理技能
# scripts/todo.py
import json
import argparse
from datetime import datetime
from pathlib import Path
DATA_FILE = Path(__file__).parent.parent / "data" / "todos.json"
def load_todos():
"""加载待办列表"""
if DATA_FILE.exists():
return json.loads(DATA_FILE.read_text())
return []
def save_todos(todos):
"""保存待办列表"""
DATA_FILE.parent.mkdir(exist_ok=True)
DATA_FILE.write_text(json.dumps(todos, ensure_ascii=False, indent=2))
def add_todo(title, priority="normal", due=None):
"""添加待办"""
todos = load_todos()
todo = {
"id": len(todos) + 1,
"title": title,
"priority": priority,
"due": due,
"done": False,
"created": datetime.now().isoformat()
}
todos.append(todo)
save_todos(todos)
print(f"已添加待办:{title}")
def list_todos(show_done=False):
"""列出待办"""
todos = load_todos()
for todo in todos:
if not show_done and todo["done"]:
continue
status = "✓" if todo["done"] else "○"
print(f"{status} [{todo['id']}] {todo['title']}")
def complete_todo(todo_id):
"""完成待办"""
todos = load_todos()
for todo in todos:
if todo["id"] == todo_id:
todo["done"] = True
save_todos(todos)
print(f"已完成:{todo['title']}")
return
print("未找到该待办")
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("action", choices=["add", "list", "done"])
parser.add_argument("--title", help="待办标题")
parser.add_argument("--priority", default="normal")
parser.add_argument("--due", help="截止日期")
parser.add_argument("--id", type=int, help="待办ID")
args = parser.parse_args()
if args.action == "add":
add_todo(args.title, args.priority, args.due)
elif args.action == "list":
list_todos()
elif args.action == "done":
complete_todo(args.id)
技能配置管理
技能可以有自己的配置文件,存储 API Key、偏好设置等:
// config/settings.json
{
"api_key": "your_api_key_here",
"default_city": "北京",
"units": "metric",
"language": "zh-CN"
}
脚本中读取配置:
import json
from pathlib import Path
config_file = Path(__file__).parent.parent / "config" / "settings.json"
config = json.loads(config_file.read_text())
api_key = config["api_key"]
default_city = config["default_city"]
技能注册到 OpenClaw
开发完成后,在 OpenClaw 配置中注册技能:
// config.json
{
"skills": {
"directories": [
"~/.openclaw/skills",
"./skills"
],
"enabled": [
"weather",
"todo",
"email",
"calendar"
]
}
}
技能调试技巧
- 独立测试 – 先单独运行脚本,确保功能正常
- 日志记录 – 添加详细日志,方便排查问题
- 错误处理 – 捕获异常,返回友好错误信息
- 参数验证 – 检查参数合法性,避免异常
日志示例
import logging
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s',
filename='skill.log'
)
logger = logging.getLogger(__name__)
try:
result = api_call()
logger.info(f"API 调用成功:{result}")
except Exception as e:
logger.error(f"API 调用失败:{e}")
print(f"操作失败:{e}")
技能最佳实践
- 单一职责 – 每个技能专注一个领域
- 清晰文档 – SKILL.md 写清楚使用方法
- 安全优先 – 敏感操作需要用户确认
- 优雅降级 – API 不可用时提供备选方案
- 性能优化 – 缓存数据,减少 API 调用
总结
技能系统是 OpenClaw 的灵魂。通过编写 SKILL.md 和脚本,你可以无限扩展 AI 能力。从简单的待办管理到复杂的系统集成,一切皆可技能化。
下一步:选择一个你需要的场景,动手开发第一个技能吧!
