前言
OpenClaw的强大之处在于其技能系统。通过开发自定义技能,你可以让AI Agent具备任意能力。本文将带你从零开始,开发一个完整的OpenClaw技能。
什么是OpenClaw技能?
技能(Skill)是OpenClaw扩展能力的基本单元。每个技能包含:
| 组件 | 说明 |
|---|---|
| SKILL.md | 技能描述和使用说明 |
| tools/ | 可调用的工具函数 |
| references/ | 参考文档和示例 |
开发环境准备
1. 安装OpenClaw
npm install -g openclaw
2. 创建技能目录
mkdir -p ~/.openclaw/workspace/skills/my-first-skill
cd ~/.openclaw/workspace/skills/my-first-skill
3. 目录结构
my-first-skill/
├── SKILL.md # 必需:技能说明
├── tools/
│ └── my_tool.py # 工具实现
└── references/
└── example.md # 参考文档
开发第一个技能:天气查询
SKILL.md
# 天气查询技能
## 描述
查询指定城市的天气信息,支持当前天气和未来预报。
## 使用场景
- 用户询问天气
- 用户需要了解某地气温
- 用户计划出行需要天气预报
## 工具
- get_weather: 获取城市天气
- get_forecast: 获取未来天气预报
## 示例
用户:北京今天天气怎么样?
Agent:我来查一下北京的天气...
tools/weather.py
import requests
from typing import Optional
def get_weather(city: str) -> dict:
"""
获取指定城市的当前天气
Args:
city: 城市名称,如"北京"、"上海"
Returns:
包含天气信息的字典
"""
# 使用免费的天气API
url = f"https://wttr.in/{city}?format=j1"
response = requests.get(url, timeout=10)
if response.status_code != 200:
return {"error": "无法获取天气信息"}
data = response.json()
current = data["current_condition"][0]
return {
"city": city,
"temperature": current["temp_C"],
"feels_like": current["FeelsLikeC"],
"humidity": current["humidity"],
"description": current["weatherDesc"][0]["value"],
"wind_speed": current["windspeedKmph"]
}
def get_forecast(city: str, days: int = 3) -> list:
"""
获取未来天气预报
Args:
city: 城市名称
days: 预报天数(1-7)
Returns:
天气预报列表
"""
url = f"https://wttr.in/{city}?format=j1"
response = requests.get(url, timeout=10)
if response.status_code != 200:
return [{"error": "无法获取天气预报"}]
data = response.json()
forecast = []
for day in data["weather"][:days]:
forecast.append({
"date": day["date"],
"max_temp": day["maxtempC"],
"min_temp": day["mintempC"],
"avg_temp": day["avgtempC"],
"description": day["hourly"][4]["weatherDesc"][0]["value"]
})
return forecast
测试技能
# 进入OpenClaw交互模式
openclaw chat
# 测试天气查询
> 北京今天天气怎么样?
进阶:添加更多功能
1. 添加天气提醒
def check_weather_alert(city: str) -> Optional[str]:
"""检查是否有极端天气预警"""
weather = get_weather(city)
temp = int(weather["temperature"])
if temp > 35:
return f"⚠️ 高温预警:{city}当前温度{temp}°C,请注意防暑"
elif temp < -10:
return f"⚠️ 低温预警:{city}当前温度{temp}°C,请注意保暖"
return None
2. 添加穿衣建议
def get_clothing_advice(city: str) -> str:
"""根据天气给出穿衣建议"""
weather = get_weather(city)
temp = int(weather["temperature"])
if temp > 30:
return "炎热天气,建议穿短袖、短裤,注意防晒"
elif temp > 20:
return "温暖天气,T恤加薄外套即可"
elif temp > 10:
return "凉爽天气,建议穿长袖加外套"
elif temp > 0:
return "寒冷天气,需要穿厚外套或羽绒服"
else:
return "严寒天气,务必穿羽绒服、戴帽子和手套"
发布技能到ClawHub
1. 安全审查
确保SKILL.md包含必要声明:
## 安全声明
- credentials: 不需要API密钥
- endpoints: 使用公开API (wttr.in)
- paths: 无本地路径访问
- external_calls: wttr.in (天气API)
2. 登录ClawHub
npx clawhub login
3. 发布技能
npx clawhub publish ~/.openclaw/workspace/skills/weather-query
最佳实践
1. 错误处理
def safe_get_weather(city: str) -> dict:
"""带错误处理的天气查询"""
try:
return get_weather(city)
except requests.Timeout:
return {"error": "请求超时,请稍后重试"}
except requests.ConnectionError:
return {"error": "网络连接失败"}
except Exception as e:
return {"error": f"未知错误: {str(e)}"}
2. 缓存优化
from functools import lru_cache
from datetime import datetime, timedelta
@lru_cache(maxsize=100)
def get_weather_cached(city: str, date: str) -> dict:
"""带缓存的天气查询(按天缓存)"""
return get_weather(city)
def get_weather_with_cache(city: str) -> dict:
today = datetime.now().strftime("%Y-%m-%d")
return get_weather_cached(city, today)
3. 文档完善
在SKILL.md中添加详细的使用说明:
## 参数说明
| 参数 | 类型 | 必需 | 说明 |
|------|------|------|------|
| city | string | 是 | 城市名称 |
| days | int | 否 | 预报天数,默认3天 |
## 返回格式
```json
{
"city": "北京",
"temperature": "25",
"description": "晴"
}
常见问题
Q: 支持哪些城市? A: 支持全球主要城市,中文和英文城市名都可以。
## 调试技巧
### 1. 使用日志
```python
import logging
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)
def get_weather(city: str) -> dict:
logger.debug(f"查询城市天气: {city}")
# ...
2. 单元测试
# tests/test_weather.py
import pytest
from tools.weather import get_weather
def test_get_weather():
result = get_weather("北京")
assert "temperature" in result
assert "description" in result
总结
通过本文,你学会了:
- 技能结构:SKILL.md + tools/ + references/
- 工具开发:Python函数 + 类型注解
- 安全规范:声明credentials/endpoints/paths
- 发布流程:登录ClawHub → 发布技能
下一步:
- 开发更多实用技能
- 发布到ClawHub获取收益
- 参与开源社区贡献
参考资料
- OpenClaw官方文档
- ClawHub技能市场
- wttr.in天气API
作者:OpenClaw技能开发者 | 本文首发于掘金