Agent工坊

【Agent工坊】OpenClaw Plugin SDK 实战:30分钟打造你的第一个自定义Agent插件

OpenClaw v2026.6.11 正式稳定了插件系统——现在你可以用 50 行 TypeScript 给 AI Agent 装上自定义工具,不需要 fork 源码。

为什么你需要关注 OpenClaw 插件系统

OpenClaw 是目前增长最快的开源 AI Agent 框架,截至 2026 年 7 月已突破 25 万 GitHub Stars。它的核心竞争力之一是插件生态系统——允许开发者创建可复用的 Agent 能力模块,就像给手机装 App 一样给 AI Agent 装技能。

v2026.6.11 版本(2026年7月发布)对插件系统做了关键修复:
- 官方插件安装与修复openclaw plugin install 命令正式稳定
- 插件清单验证:安装前自动校验 openclaw.plugin.json 合法性
- 运行时隔离:插件崩溃不会拖垮整个 Agent 进程

对 AI 创业者来说,这意味着:

你可以把重复的运营流程(查竞品数据、监控关键词、自动发帖)封装成 OpenClaw 插件,让 Agent 7×24 小时自动执行。

核心概念:defineToolPlugin 是什么

OpenClaw SDK 提供了多条路径来创建插件,但对于 90% 的场景,defineToolPlugin 是最简单也最强大的入口。

// 导入 SDK
import { defineToolPlugin } from 'openclaw/plugin-sdk/tool-plugin';
import { Type } from '@sinclair/typebox';

export default defineToolPlugin({
  id: 'my-first-plugin',
  name: 'My First Plugin',
  description: 'A plugin that does something useful.',

  // 可选:插件配置项
  configSchema: Type.Object({
    apiKey: Type.Optional(Type.String({ description: 'API key.' })),
  }),

  // 定义工具
  tools: (tool) => [
    tool({
      name: 'hello',
      label: 'Say Hello',
      description: 'Greet someone by name.',
      parameters: Type.Object({
        name: Type.String({ description: 'Name to greet.' }),
      }),
      execute: async ({ name }, config) => {
        return `Hello, ${name}! Your API key is ${config.apiKey ? 'set' : 'not set'}.`;
      },
    }),
  ],
});

50 行代码,一个功能完整的 Agent 插件就写好了。

关键特性:
- TypeBox 自动生成 JSON Schema —— 无需手写参数校验
- execute 返回纯字符串,SDK 自动包装为标准 tool-result 格式
- 工具名、描述、参数全部静态声明,Agent 能自动理解何时调用

实战:构建「竞品监控」插件

下面我们做一个真正有用的插件——让 OpenClaw Agent 能自动查询 GitHub 仓库的最新 Release 信息。

Step 1:创建插件项目

mkdir openclaw-competitor-monitor
cd openclaw-competitor-monitor
npm init -y
npm install @sinclair/typebox

Step 2:创建 openclaw.plugin.json 清单

这是 OpenClaw 在加载代码前先读取的元数据文件:

{
  "id": "competitor-monitor",
  "configSchema": {
    "type": "object",
    "additionalProperties": false,
    "properties": {}
  }
}

⚠️ 注意configSchema 是必填字段,哪怕为空对象也要写。缺失会导致插件被标记为错误状态。

Step 3:写插件入口 src/index.ts

import { defineToolPlugin } from 'openclaw/plugin-sdk/tool-plugin';
import { Type } from '@sinclair/typebox';

export default defineToolPlugin({
  id: 'competitor-monitor',
  name: 'Competitor Monitor',
  description: 'Monitor competitor GitHub repos for new releases.',

  tools: (tool) => [
    // 工具1:获取最新 Release
    tool({
      name: 'check_latest_release',
      label: 'Check Latest Release',
      description: 'Get the latest release info from a GitHub repo.',
      parameters: Type.Object({
        owner: Type.String({ description: 'Repo owner (e.g. NousResearch)' }),
        repo: Type.String({ description: 'Repo name (e.g. hermes-agent)' }),
      }),
      execute: async ({ owner, repo }) => {
        const url = `https://api.github.com/repos/${owner}/${repo}/releases?per_page=1`;
        const resp = await fetch(url, {
          headers: { 'Accept': 'application/vnd.github+json' }
        });
        const data = await resp.json();
        if (!data.length) return `No releases found for ${owner}/${repo}.`;
        const latest = data[0];
        return [
          `📦 ${owner}/${repo}`,
          `🏷️ ${latest.tag_name}`,
          `📅 ${latest.published_at}`,
          `📝 ${latest.name || 'No title'}`,
          `🔗 ${latest.html_url}`,
        ].join('\n');
      },
    }),

    // 工具2:对比两个仓库的发布频率
    tool({
      name: 'compare_release_frequency',
      label: 'Compare Release Frequency',
      description: 'Compare how often two repos release updates.',
      parameters: Type.Object({
        owner1: Type.String({ description: 'First repo owner' }),
        repo1: Type.String({ description: 'First repo name' }),
        owner2: Type.String({ description: 'Second repo owner' }),
        repo2: Type.String({ description: 'Second repo name' }),
      }),
      execute: async ({ owner1, repo1, owner2, repo2 }) => {
        const fetchCount = async (owner: string, repo: string) => {
          const url = `https://api.github.com/repos/${owner}/${repo}/releases?per_page=100`;
          const resp = await fetch(url, {
            headers: { 'Accept': 'application/vnd.github+json' }
          });
          return (await resp.json()).length;
        };
        const [count1, count2] = await Promise.all([
          fetchCount(owner1, repo1),
          fetchCount(owner2, repo2),
        ]);
        return [
          `📊 最近100个Release对比:`,
          `• ${owner1}/${repo1}: ${count1} releases`,
          `• ${owner2}/${repo2}: ${count2} releases`,
          `🏆 ${count1 > count2 ? repo1 : repo2} 更新更频繁`,
        ].join('\n');
      },
    }),
  ],
});

Step 4:配置 package.json 入口

{
  "name": "openclaw-competitor-monitor",
  "version": "1.0.0",
  "openclaw": {
    "extensions": ["./src/index.ts"]
  }
}

Step 5:安装到 OpenClaw

# 全局安装
openclaw plugin install ./openclaw-competitor-monitor

# 验证安装
openclaw plugins list
# 输出应包含: competitor-monitor  Competitor Monitor  ✅

# 检查插件详情
openclaw plugins inspect competitor-monitor

安装成功后,Agent 对话中就能直接调用这两个工具了:

你: "帮我查一下 NousResearch/hermes-agent 和 openclaw/openclaw 谁最近更新更频繁"

Agent: [自动调用 compare_release_frequency 工具]
📊 最近100个Release对比:
• NousResearch/hermes-agent: 18 releases
• openclaw/openclaw: 43 releases
🏆 openclaw 更新更频繁

进阶:definePluginEntry 全能型插件

当你的插件需要不止是工具时(比如注册新的模型提供商、消息渠道),改用 definePluginEntry

import { definePluginEntry } from 'openclaw/plugin-sdk/plugin-entry';

export default definePluginEntry({
  id: 'my-advanced-plugin',
  name: 'Advanced Plugin',
  description: 'Multi-capability plugin.',

  register(api) {
    // 注册自定义工具
    api.registerTool({ /* ... */ });

    // 注册新的 LLM 提供商
    api.registerProvider({ /* ... */ });

    // 注册 Web 搜索提供商
    api.registerWebSearchProvider({ /* ... */ });

    // 注册生命周期钩子
    api.registerHook({ /* ... */ });
  },
});

api 对象提供 20+ 种注册方法,覆盖从模型推理到语音合成的全部能力。

对 AI 创业者的三大实战场景

场景1:自动化运营监控

插件功能:定时检查竞争对手的定价页/产品页变化
Agent 行为:发现变化 → 自动生成分析报告 → 推送到 Telegram
节省时间:从每周手动检查 2 小时 → 全自动 0 分钟

场景2:客户数据管道

插件功能:连接 Stripe API + 内部数据库
Agent 行为:用户说 "这个月收入多少" → Agent 调插件查 Stripe → 生成收入报表
节省时间:从登录后台拉数据 10 分钟 → 一句话 5 秒

场景3:内容发布流水线

插件功能:封装微信公众号草稿 API + 封面图生成
Agent 行为:给 Agent 一段长文 → 自动分段、配图、排版 → 提交草稿箱
节省时间:从 45 分钟手动排版 → 插件 3 分钟全自动

💡 OpenClaw 插件可以发布到 ClawHub 市场,如果你做的是一个通用插件(比如「Stripe 收入查询」),可以上架让其他 OpenClaw 用户安装,形成 SaaS 化的插件商业模式。

常见问题

Q: 插件支持 TypeScript 还是必须编译成 JS?
A: 两者都支持。开发时用 .ts 源码即可(extensions 字段),生产建议编译到 dist/ 并通过 runtimeExtensions 指向 JS 产物,避免运行时 TypeScript 编译开销。

Q: 插件能访问 OpenClaw 的内部状态吗?
A: 工具插件(defineToolPlugin)收到的是隔离的 config 对象,无法访问 Agent 内存或会话。如需深度集成,用 definePluginEntryapi.runtime 命名空间。

Q: 插件报错会怎样?
A: v2026.6.11 新增了插件隔离机制——工具执行报错不会崩溃 Agent,错误信息会以 tool-result 格式返回给 Agent,Agent 可以自我纠正或换方案。

Q: 如何调试插件?
A: openclaw plugins inspect <id> 查看插件形态(shape),openclaw plugins build 生成静态清单后提前校验工具签名。

行动建议

  1. 今天:克隆 OpenClaw 官方插件模板仓库,跑通 defineToolPlugin 的最小示例
  2. 本周:选一个你每天重复做的运营任务,用插件自动化(推荐从 GitHub API 或 RSS 监控开始)
  3. 本月:把插件发布到 ClawHub,让 25 万 OpenClaw 用户发现你的作品

本文基于 OpenClaw v2026.6.11 文档撰写。插件 SDK 快速迭代中,最新 API 参考 docs.openclaw.ai/plugins

AI创业 #OpenClaw #Agent插件 #一人公司 #自动化运营