OpenClaw插件开发入门:为Qwen3-32B镜像编写天气查询技能

1. 为什么需要自定义技能?

去年冬天,我经常需要同时查看多个城市的天气来规划差旅行程。每次手动打开天气网站、输入城市名、对比数据的过程让我不胜其烦。直到我发现OpenClaw可以通过自定义技能实现自动化查询,才彻底解决了这个痛点。

开发自定义技能的本质,是教会AI如何将自然语言指令转化为具体操作。比如当我说"查询北京明天天气"时,OpenClaw需要:

  1. 理解这是天气查询请求
  2. 提取城市和日期参数
  3. 调用天气API获取数据
  4. 以人类可读的格式返回结果

本文将带你从零开发一个适配Qwen3-32B模型的天气查询技能。选择这个场景是因为:

  • 需求明确:天气查询是高频实用功能
  • 接口稳定:多数天气API提供长期免费套餐
  • 复杂度适中:涵盖参数解析、API调用、结果格式化等核心开发环节

2. 开发环境准备

2.1 基础工具链

我的开发环境是macOS + VS Code,你需要准备:

  • Node.js 18+(OpenClaw运行依赖)
  • 已部署的Qwen3-32B镜像(本地或云端)
  • 可用的天气API(如和风天气、OpenWeatherMap)
# 验证Node环境
node -v
npm -v

# 安装OpenClaw CLI
npm install -g openclaw@latest

2.2 技能开发模板

OpenClaw提供了官方技能模板库,我们先克隆基础模板:

git clone https://github.com/openclaw/skill-template.git weather-skill
cd weather-skill
npm install

目录结构说明:

.
├── package.json    # 技能元数据
├── src
│   ├── index.ts    # 技能入口文件
│   └── types.ts    # 类型定义
├── test            # 测试用例
└── openclaw.json   # 技能配置文件

3. 编写天气查询逻辑

3.1 定义技能元数据

修改package.json中的关键字段:

{
  "name": "@yourname/weather-skill",
  "version": "0.1.0",
  "description": "天气预报查询技能 for Qwen3-32B",
  "openclaw": {
    "skillType": "api-connector",
    "supportedModels": ["qwen3-32b"]
  }
}

3.2 实现核心查询功能

在src/index.ts中,我们实现天气查询的核心逻辑:

import axios from 'axios';

// 天气API配置
const WEATHER_API_KEY = process.env.WEATHER_API_KEY;
const BASE_URL = 'https://api.openweathermap.org/data/2.5/weather';

interface WeatherParams {
  city: string;
  date?: string; // 可选日期参数
}

export async function getWeather(params: WeatherParams) {
  try {
    const response = await axios.get(BASE_URL, {
      params: {
        q: params.city,
        appid: WEATHER_API_KEY,
        units: 'metric',
        lang: 'zh_cn'
      }
    });
    
    return formatWeatherData(response.data);
  } catch (error) {
    console.error('天气查询失败:', error);
    return '无法获取天气信息,请检查城市名称或稍后重试';
  }
}

function formatWeatherData(data: any) {
  return `当前${data.name}天气:
  🌡️ 温度:${data.main.temp}°C(体感${data.main.feels_like}°C)
  💧 湿度:${data.main.humidity}%
  🌬️ 风速:${data.wind.speed}m/s
  ${data.weather[0].description}`;
}

3.3 注册技能指令

在openclaw.json中定义自然语言指令映射:

{
  "commands": [
    {
      "name": "weather",
      "description": "查询指定城市天气",
      "parameters": {
        "city": {
          "type": "string",
          "required": true,
          "description": "城市名称"
        },
        "date": {
          "type": "string",
          "required": false,
          "description": "日期(如'明天')"
        }
      },
      "handler": "getWeather"
    }
  ]
}

4. 本地测试与调试

4.1 模拟请求测试

创建test/test-request.json模拟用户请求:

{
  "command": "weather",
  "parameters": {
    "city": "北京",
    "date": "明天"
  }
}

运行测试命令:

openclaw skill test ./test/test-request.json

4.2 集成Qwen3-32B测试

确保你的Qwen3-32B镜像已运行,然后在OpenClaw配置中添加模型端点:

{
  "models": {
    "providers": {
      "local-qwen": {
        "baseUrl": "http://localhost:8080",
        "api": "openai-completions",
        "models": ["qwen3-32b"]
      }
    }
  }
}

通过OpenClaw CLI发送测试请求:

openclaw ask "查询北京明天天气" --model qwen3-32b

5. 部署与使用

5.1 打包发布技能

npm run build
clawhub publish

5.2 用户安装方式

终端用户可以通过以下方式安装你的技能:

clawhub install @yourname/weather-skill

或在OpenClaw对话窗口输入:

安装 @yourname/weather-skill 技能

5.3 环境变量配置

用户需要设置天气API密钥:

export WEATHER_API_KEY=你的API密钥
openclaw gateway restart

6. 开发经验与优化建议

在实际开发中,我遇到了几个典型问题及解决方案:

  1. 时区处理:天气API返回的时间戳需要转换为本地时区显示

    new Date(data.dt * 1000).toLocaleString('zh-CN')
    
  2. 多日预报:扩展技能支持3-5天预报

    function getForecast(city: string, days: number) {
      // 调用预报API
    }
    
  3. 错误恢复:当API不可用时提供缓存数据

    import { cache } from 'openclaw-sdk';
    
    const cachedWeather = cache.get(`weather:${city}`);
    if (cachedWeather) return cachedWeather;
    

建议进一步优化的方向:

  • 增加空气质量指数(AQI)查询
  • 支持语音播报天气功能
  • 添加天气预警通知能力

开发自定义技能最有趣的部分,是看着几句简单的自然语言指令转化为实实在在的自动化操作。当测试时第一次看到Qwen3-32B准确返回格式化天气数据的那一刻,那种"教会AI新技能"的成就感,正是OpenClaw最吸引我的地方。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐