OpenClaw技能开发实战:从零开始打造你的AI助手

3 阅读4分钟

前言

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

总结

通过本文,你学会了:

  1. 技能结构:SKILL.md + tools/ + references/
  2. 工具开发:Python函数 + 类型注解
  3. 安全规范:声明credentials/endpoints/paths
  4. 发布流程:登录ClawHub → 发布技能

下一步:

  • 开发更多实用技能
  • 发布到ClawHub获取收益
  • 参与开源社区贡献

参考资料

  • OpenClaw官方文档
  • ClawHub技能市场
  • wttr.in天气API

作者:OpenClaw技能开发者 | 本文首发于掘金