Skip to content

Plugins 插件系统详解

前置知识:本章节面向具备 TypeScript/Node.js 基础、了解模块化系统和事件驱动编程的开发者。 目标读者:希望开发自定义插件扩展 OpenClaw 功能的开发者。 维护状态:本文档基于 OpenClaw v2026.4+ 源码分析。


1. 插件系统架构

1.1 插件在架构中的位置

1.2 核心文件

文件职责
plugins/registry.ts插件注册表
plugins/runtime.ts插件运行时
plugins/loader.ts插件加载器
plugins/bundle-*.ts捆绑插件
plugins/discovery.ts插件发现

2. 插件类型

2.1 插件类型体系

2.2 各类型说明

类型说明示例
Channel通讯平台接入飞书、微信、Telegram
Tool功能扩展exec、browser
Memory记忆存储sqlite-vec、embedding
ProviderAI 模型OpenAI、Anthropic
Hook生命周期拦截自定义钩子

3. 插件注册机制

3.1 插件发现流程

3.2 插件配置

json5
{
  plugins: {
    // 启用/禁用插件
    enabled: ["channel:feishu", "tool:exec"],
    
    // 插件配置
    configs: {
      "channel:feishu": {
        // 通道特定配置
      }
    }
  }
}

4. Channel 插件详解

4.1 通道插件结构

4.2 内置通道

通道源码位置
飞书extensions/openclaw-channel-feishu/
微信extensions/openclaw-channel-wechat/
Telegramextensions/openclaw-channel-telegram/
WhatsAppextensions/openclaw-channel-whatsapp/
Discordextensions/openclaw-channel-discord/

4.3 通道配置示例

json5
{
  channels: {
    feishu: {
      enabled: true,
      connectionMode: "websocket",
      accounts: {
        default: {
          appId: "cli_xxx",
          appSecret: "xxx"
        }
      }
    }
  }
}

5. 插件生命周期

5.1 生命周期状态机

5.2 生命周期钩子

钩子时机用途
onStart启动时初始化连接
onMessage收到消息处理消息
onStop关闭时清理资源
onConfigChange配置变更重新初始化

6. 插件安全

6.1 安全机制

6.2 安全扫描项

  • 敏感权限检查
  • 恶意代码检测
  • 依赖安全审计
  • 签名验证

7. 插件市场 (ClaWHub)

7.1 ClaWHub 功能

7.2 使用 ClaWHub

bash
# 搜索插件
openclaw plugins search <keyword>

# 安装插件
openclaw plugins install <plugin-name>

# 更新插件
openclaw plugins update

# 卸载插件
openclaw plugins uninstall <plugin-name>

8. 开发自定义插件

8.1 插件项目结构

my-plugin/
├── package.json
├── manifest.json5       # 插件清单
├── channel-entry.ts    # 通道入口 (Channel 插件)
└── src/
    └── index.ts        # 主要逻辑

8.2 manifest.json5 示例

json5
{
  id: "my-plugin",
  name: "My Plugin",
  version: "1.0.0",
  description: "插件描述",
  
  // 插件类型
  capabilities: ["channel", "tool"],
  
  // 入口文件
  entry: "./channel-entry.ts",
  
  // 权限需求
  permissions: ["exec", "file:read"]
}

8.3 插件入口示例

typescript
import type { ChannelPlugin } from 'openclaw';

export const myChannelPlugin: ChannelPlugin = {
  id: 'my-channel',
  name: 'My Channel',
  
  async onStart(runtime) {
    // 初始化连接
    await connectToService();
  },
  
  async onMessage(event) {
    // 处理消息
    return { type: 'text', content: 'response' };
  },
  
  async onStop() {
    // 清理资源
    await disconnect();
  }
};

9. 调试与排错

9.1 常见问题

问题原因解决方案
插件无法加载依赖缺失运行 npm install
通道无法连接凭据错误检查配置文件
插件冲突版本不兼容禁用冲突插件

9.2 调试命令

bash
# 列出已安装插件
openclaw plugins list

# 查看插件状态
openclaw plugins status <plugin-id>

# 启用/禁用插件
openclaw plugins enable <plugin-id>
openclaw plugins disable <plugin-id>

# 查看插件日志
openclaw gateway --verbose | grep <plugin-id>

10. 延伸阅读