"有一种架构叫做插件,它让AI学会了变形。今天它可以是客服,明天它可以是程序员,后天它可以是诗人。"
OpenClaw插件架构(OpenClaw Plugin Architecture)是OpenClaw框架的扩展机制,允许开发者通过插件来增强Agent的能力,而无需修改核心代码。
插件就像游戏里的装备系统。你的Agent是一个基础角色,插件就是各种装备:武器、盔甲、魔法书...
装上"代码分析"插件,你的Agent就能写代码;装上"图片生成"插件,你的Agent就能画画;装上"语音合成"插件,你的Agent就能说话。就像周星驰在《功夫》里,学会了如来神掌就无敌了。
| 类型 | 功能 | 示例 |
|---|---|---|
| Tool插件 | 扩展工具能力 | 文件操作、API调用 |
| Model插件 | 接入新模型 | 本地模型、私有模型 |
| Channel插件 | 扩展通信渠道 | 微信、钉钉、Slack |
| Storage插件 | 扩展存储能力 | S3、Redis、数据库 |
| Auth插件 | 扩展认证方式 | SSO、OAuth、LDAP |
┌─────────────────────────────────────────┐
│ OpenClaw Core │
├─────────────────────────────────────────┤
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ Plugin │ │ Hook │ │ Event │ │
│ │ Manager │ │ System │ │ Bus │ │
│ └────┬────┘ └────┬────┘ └────┬────┘ │
│ │ │ │ │
│ ┌────┴────────────┴────────────┴────┐ │
│ │ Plugin Registry │ │
│ └──────────────────────────────────┘ │
├─────────────────────────────────────────┤
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ Tool │ │ Model │ │ Channel │ │
│ │ Plugin │ │ Plugin │ │ Plugin │ │
│ └─────────┘ └─────────┘ └─────────┘ │
└─────────────────────────────────────────┘
钩子(Hooks)允许插件在特定时机执行代码:
// OpenClaw钩子类型
const hooks = {
// Agent生命周期钩子
'agent:before_init': 'Agent初始化前',
'agent:after_init': 'Agent初始化后',
'agent:before_execute': '任务执行前',
'agent:after_execute': '任务执行后',
// 工具调用钩子
'tool:before_call': '工具调用前',
'tool:after_call': '工具调用后',
'tool:on_error': '工具调用错误',
// 模型调用钩子
'model:before_request': '模型请求前',
'model:after_response': '模型响应后',
// 会话钩子
'session:create': '会话创建',
'session:destroy': '会话销毁',
'session:message': '收到消息'
}
一个完整的OpenClaw插件示例:
// my-plugin/index.js
module.exports = {
// 插件元数据
meta: {
name: 'my-awesome-plugin',
version: '1.0.0',
description: '一个示例插件',
author: 'miaoquai',
dependencies: []
},
// 插件初始化
async initialize(context) {
console.log('插件初始化...')
this.context = context
// 注册工具
context.registerTool({
name: 'my_tool',
description: '我的自定义工具',
parameters: {
input: { type: 'string', required: true }
},
handler: async (params) => {
return { result: `处理: ${params.input}` }
}
})
// 注册钩子
context.registerHook('agent:before_execute', async (task) => {
console.log('任务即将执行:', task.name)
// 可以修改任务或阻止执行
return task
})
},
// 插件清理
async destroy() {
console.log('插件卸载...')
// 清理资源
},
// 插件配置
config: {
apiKey: { type: 'string', required: false },
maxRetries: { type: 'number', default: 3 }
}
}
// openclaw.config.js
module.exports = {
plugins: [
// 内置插件
'@openclaw/plugin-browser',
'@openclaw/plugin-feishu',
// 第三方插件
{
name: 'my-awesome-plugin',
enabled: true,
config: {
apiKey: process.env.MY_PLUGIN_API_KEY,
maxRetries: 5
}
},
// 本地插件
{
path: './plugins/my-local-plugin',
enabled: true
}
]
}
ClawHub提供了丰富的插件生态:
# 安装插件
openclaw plugin install @openclaw/plugin-browser
# 查看已安装插件
openclaw plugin list
# 启用/禁用插件
openclaw plugin enable my-plugin
openclaw plugin disable my-plugin
# 卸载插件
openclaw plugin uninstall my-plugin
开发插件时,遵循单一职责原则。一个插件只做一件事,但把它做好。就像周星驰的电影,每个配角都有自己的特色,但都服务于主线剧情。