OpenClaw 自定义技能开发:打造专属 AI 助手

技能(Skill)是 OpenClaw 智能体的核心能力单元,定义了智能体如何处理特定类型的用户请求。通过开发自定义技能,你可以让智能体具备丰富的业务能力。

技能(Skill)概述

什么是技能?

技能是处理特定任务的代码模块,包括:

  • 意图识别:判断用户请求是否属于该技能
  • 参数提取:从用户消息中提取必要参数
  • 业务逻辑:执行具体的业务逻辑
  • 响应生成:生成回复消息

技能开发基础

1. 创建技能

# 使用 CLI 创建技能
openclaw create skill weather

# 手动创建
mkdir -p skills/weather
touch skills/weather/__init__.py
touch skills/weather/handler.py

2. 技能目录结构

skills/weather/
├── __init__.py          # 技能入口
├── handler.py           # 处理逻辑
├── config.yaml          # 技能配置
└── tests/               # 测试文件
    └── test_handler.py

编写技能处理逻辑

基础技能模板

from openclaw.core.skill import Skill, SkillContext, SkillResponse
from openclaw.utils.logger import get_logger

class WeatherSkill(Skill):
    """天气查询技能"""

    def __init__(self):
        super().__init__()
        self.logger = get_logger(__name__)

    async def can_handle(self, context: SkillContext) -> bool:
        """判断是否能处理该消息"""
        message = context.message.lower()
        keywords = ["天气", "气温", "天气预报"]
        return any(kw in message for kw in keywords)

    async def handle(self, context: SkillContext) -> SkillResponse:
        """处理消息"""
        try:
            # 提取城市名称
            city = self._extract_city(context.message)

            # 获取天气信息
            weather_data = await self._get_weather(city)

            # 生成回复
            response = self._format_response(weather_data)

            return SkillResponse(
                message=response,
                message_type="text"
            )

        except Exception as e:
            self.logger.error(f"处理天气查询失败: {e}")
            return SkillResponse(
                message="查询天气失败,请稍后再试",
                message_type="text"
            )

高级技能功能

1. 参数提取

使用 OpenClaw 内置的参数提取工具:

from openclaw.core.nlp import EntityExtractor

extractor = EntityExtractor()

def extract_city(self, message: str) -> str:
    """提取城市名称"""
    entities = extractor.extract(message)
    return entities.get("city", "北京")

2. 多轮对话

使用上下文管理实现多轮对话:

async def handle(self, context: SkillContext) -> SkillResponse:
    # 获取上下文
    session_data = await context.session.get("weather", {})

    if "city" not in session_data:
        # 第一轮:询问城市
        await context.session.set("weather", {"step": 1})
        return SkillResponse(
            message="请问您想查询哪个城市的天气?",
            message_type="text"
        )

技能最佳实践

1. 单一职责

每个技能只负责一个特定功能,保持简洁。

2. 错误处理

妥善处理异常,提供友好的错误提示。

3. 日志记录

记录关键操作和错误信息,便于调试。

下一步

掌握了技能开发后,在下一篇文章中,我们将学习如何使用工具插件,让智能体具备更强大的能力。

发表回复

后才能评论