在 AI Agent 浪潮中,OpenClaw 作为一个极具潜力的开源框架,凭借其灵活的架构和强大的扩展性,吸引了大量开发者。对于普通用户来说,OpenClaw 是一个好用的工具;但对于开发者来说,它的魅力在于那套精巧的 Skill(技能)插件系统

通过自定义 Skill,你可以让 AI 突破大模型的知识边界,直接操控你的本地硬件(如树莓派、智能家居)或调用企业内部的私有 API。今天,我们就来深度解析 OpenClaw 的插件规范,并动手用 TypeScript 编写一个专属 Skill。


一、 核心架构:什么是 OpenClaw 的 Skill?

在 OpenClaw 的语境下,一个 Skill 实质上是一个封装好的函数。它包含两个核心要素:

  1. 元数据声明(Manifest): 告诉 AI 这个技能叫什么、能做什么、需要哪些参数(遵循 JSON Schema 规范)。

  2. 执行逻辑(Logic): 当 AI 决定调用该技能时,实际运行的 TypeScript 代码。

OpenClaw 采用了模块化的设计,每一个 Skill 都是一个独立的目录,这使得插件的开发、共享和维护变得极其简单。


二、 环境准备

在开始编码前,请确保你的开发环境已就绪:

  • Node.js: 建议 v18+

  • TypeScript: 项目基础语言

  • OpenClaw 源码: 建议克隆项目到本地以便调试

    Bash

    git clone https://github.com/openclaw/openclaw.git
    cd openclaw
    npm install
    

三、 实战:开发一个“本地硬件控制器” Skill

假设我们要开发一个名为 local-system-control 的插件,用于控制本地设备的电源状态(模拟硬件交互)或获取私有服务器的状态。

1. 创建插件目录

src/skills(或项目指定的插件目录)下创建新文件夹:

Bash

mkdir -p src/skills/local-system-control
cd src/skills/local-system-control
2. 编写逻辑代码 (index.ts)

这是插件的心脏。我们需要定义一个类或函数来处理 AI 传进来的参数。

TypeScript

// src/skills/local-system-control/index.ts

import { SkillContext } from '../../types'; // 引入框架类型定义

interface ControlParams {
  action: 'reboot' | 'shutdown' | 'status';
  deviceId: string;
}

export const execute = async (params: ControlParams, context: SkillContext) => {
  const { action, deviceId } = params;

  // 模拟私有 API 或本地硬件交互
  console.log(`正在对设备 ${deviceId} 执行操作: ${action}`);

  try {
    // 示例:调用本地私有 API
    // const response = await fetch(`http://localhost:8080/api/device/${deviceId}/${action}`, { method: 'POST' });
    
    if (action === 'status') {
      return {
        success: true,
        data: { temperature: "42°C", CPU: "15%", status: "Running" },
        message: `设备 ${deviceId} 状态获取成功。`
      };
    }

    return {
      success: true,
      message: `已成功向设备 ${deviceId} 发送 ${action} 指令。`
    };
  } catch (error) {
    return {
      success: false,
      error: `操作失败: ${error.message}`
    };
  }
};
3. 配置元数据 (manifest.json)

这是让 AI “理解”你插件的关键。你需要用精确的语言描述参数的含义。

JSON

{
  "name": "local_system_manager",
  "description": "用于管理本地硬件设备,支持重启、关机和查看实时运行状态。",
  "parameters": {
    "type": "object",
    "properties": {
      "action": {
        "type": "string",
        "enum": ["reboot", "shutdown", "status"],
        "description": "需要执行的具体操作"
      },
      "deviceId": {
        "type": "string",
        "description": "本地设备的唯一标识符(如 IP 或设备 ID)"
      }
    },
    "required": ["action", "deviceId"]
  }
}

四、 深入技巧:实现私有 API 交互

在编写 Skill 时,你经常需要处理敏感信息(如 API Key)。OpenClaw 推荐的做法是:

  1. 环境变量管理:不要将 Key 硬编码在 index.ts 中,使用 process.env.PRIVATE_API_KEY

  2. 上下文透传:利用 SkillContext 获取当前用户的权限信息或全局配置。

  3. 流式输出:如果你的插件涉及长时间的任务,可以利用框架提供的回调机制实时返回进度。


五、 调试与部署

  1. 本地加载:在 OpenClaw 的配置文件(通常是 config.yaml.env)中,确保你的新 Skill 路径已被包含。

  2. 控制台测试:启动 OpenClaw,尝试对 AI 说:“帮我查一下 ID 为 Server-01 的本地服务器状态。”

  3. 观察 Payload:在控制台查看 AI 生成的 JSON 调用参数是否符合预期。如果 AI 传参错误,通常需要微调 manifest.json 中的 description


六、 结语:从使用者到贡献者

开发一个 Skill 只是第一步。当你实现了一个具有通用价值的插件(比如对接某款流行的智能家居协议,或者某个常用的生产力工具 API),不妨向 OpenClaw 官方仓库 提交一个 Pull Request

开源的本质在于流动。通过编写 Skill,你不仅让 AI 变得更强大,也在为整个 AI Agent 生态贡献属于你的那一砖一瓦。

快去动手写你的第一个 Skill 吧!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐