24a - 插件架构
本文是《AI Agent 实战手册》第 24 章第 1 节。 上一节:23d-安全与成本分析 | 下一节:24b-自定义Agent开发教程
概述
OpenClaw 的核心竞争力之一在于其高度可扩展的插件体系。平台通过 Skills(技能)和 Plugins(插件)两套互补的扩展机制,让开发者能够为 AI Agent 添加任意能力——从简单的自动化脚本到完整的消息平台集成。本节深入解析 OpenClaw 的插件架构,包括 Skills 与 Plugins 的生命周期、Hook 系统、事件模型和各类扩展点,帮助你理解如何在这个拥有 180K+ GitHub Stars 的开源平台上构建自己的扩展。
1. OpenClaw 插件/Skills 架构总览
架构图示
┌─────────────────────────────────────────────────────────────────┐
│ OpenClaw 整体架构 │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ WhatsApp │ │ Telegram │ │ Discord │ │ 自定义 │ │
│ │ Channel │ │ Channel │ │ Channel │ │ Channel │ │
│ └────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘ │
│ │ │ │ │ │
│ └──────────────┴──────┬───────┴──────────────┘ │
│ ▼ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Gateway 网关层 │ │
│ │ ┌─────────┐ ┌──────────┐ ┌─────────┐ ┌──────────┐ │ │
│ │ │ 路由 │ │ 会话管理 │ │ 事件队列 │ │ Webhook │ │ │
│ │ └─────────┘ └──────────┘ └─────────┘ └──────────┘ │ │
│ └──────────────────────┬───────────────────────────────────┘ │
│ ▼ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Agent 执行层 │ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │
│ │ │ 模型选择 │ │ 工具调用 │ │ 安全策略 │ │ │
│ │ └──────────┘ └──────────┘ └──────────┘ │ │
│ └──────────────────────┬───────────────────────────────────┘ │
│ ▼ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ 扩展层(Skills + Plugins) │ │
│ │ │ │
│ │ Skills(Markdown 驱动) Plugins(代码驱动) │ │
│ │ ┌────────────┐ ┌────────────┐ │ │
│ │ │ SKILL.md │ │ plugin.json│ │ │
│ │ │ + scripts/ │ │ + src/ │ │ │
│ │ └────────────┘ └────────────┘ │ │
│ └──────────────────────────────────────────────────────────┘ │
│ ▼ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ 存储层 │ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │
│ │ │ MEMORY.md│ │ 向量搜索 │ │ 文件系统 │ │ │
│ │ └──────────┘ └──────────┘ └──────────┘ │ │
│ └──────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘核心组件
OpenClaw 的扩展生态建立在四个核心组件之上:
| 组件 | 职责 | 技术实现 | 扩展方式 |
|---|---|---|---|
| Gateway | 消息平台连接管理、事件路由 | Node.js 长连接服务 | 添加 Channel 插件 |
| Agent | 意图理解与推理执行 | LLM API 调用 + 工具循环 | 切换模型、配置策略 |
| Skills | 特定功能实现(Markdown 驱动) | SKILL.md + 脚本 | 安装/开发新 Skill |
| Plugins | 深度功能扩展(代码驱动) | TypeScript 模块 + 清单文件 | 安装/开发新 Plugin |
Skills 与 Plugins 的区别
OpenClaw 提供两套互补的扩展机制,适用于不同复杂度的场景:
| 维度 | Skills(技能) | Plugins(插件) |
|---|---|---|
| 核心文件 | SKILL.md(Markdown + YAML frontmatter) | openclaw.plugin.json + TypeScript 代码 |
| 复杂度 | 低——纯 Markdown 指令即可 | 高——需要编写 TypeScript 模块 |
| 运行方式 | 注入 Agent 系统提示词,由 Agent 解释执行 | 在 Gateway 进程内直接运行代码 |
| 能力范围 | 工作流自动化、API 调用、脚本封装 | Channel 集成、RPC 方法、后台服务、CLI 命令 |
| 分发渠道 | ClawHub 市场 / 本地目录 | npm 包 / 本地目录 |
| 安全模型 | 受 Agent 沙箱和工具策略约束 | 以 Gateway 进程权限运行(需信任) |
| 适用场景 | 大多数自动化需求 | 需要底层系统访问的深度集成 |
选择建议:90% 的扩展需求用 Skills 即可满足。只有当你需要添加新的消息平台、注册 Gateway RPC 方法或运行后台服务时,才需要开发 Plugin。
2. 插件生命周期
Skills 生命周期:安装 → 加载 → 过滤 → 注入 → 执行
┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐
│ 安装 │───▶│ 加载 │───▶│ 过滤 │───▶│ 注入 │───▶│ 执行 │
│ Install │ │ Load │ │ Filter │ │ Inject │ │ Execute │
└─────────┘ └─────────┘ └─────────┘ └─────────┘ └─────────┘
│ │ │ │ │
▼ ▼ ▼ ▼ ▼
放入 skills/ 解析 YAML 检查 OS、 压缩为 XML Agent 根据
目录或从 frontmatter bins、env 列表注入到 指令调用工具
ClawHub 安装 和 Markdown 依赖是否满足 系统提示词 执行任务阶段详解:
-
安装(Install):将 Skill 目录放入以下三个位置之一(按优先级从高到低):
<workspace>/skills/— 工作区级别,最高优先级~/.openclaw/skills/— 用户级别,跨 Agent 共享- 内置 Skills — 随 OpenClaw 发行,最低优先级
-
加载(Load):Gateway 启动时扫描所有 Skills 目录,解析每个
SKILL.md的 YAML frontmatter 元数据(name、description、requires 等) -
过滤(Filter):运行时根据环境条件过滤不可用的 Skills:
- 操作系统兼容性检查
- 必需二进制文件(
requires.bins)是否存在 - 必需环境变量(
requires.env)是否设置
-
注入(Inject):将通过过滤的 Skills 压缩为 XML 列表,注入 Agent 的系统提示词。每个 Skill 的 Token 开销约为:
- 基础开销:195 字符(至少有 1 个 Skill 时)
- 每个 Skill:约 97 字符 + name/description/location 长度
- 粗略估算:每个 Skill 约消耗 24 tokens
-
执行(Execute):Agent 根据用户意图匹配合适的 Skill,按照 Markdown 指令调用工具(exec、read、write 等)完成任务
Plugins 生命周期:发现 → 加载 → 注册 → 运行 → 卸载
┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐
│ 发现 │───▶│ 加载 │───▶│ 注册 │───▶│ 运行 │───▶│ 卸载 │
│ Discover │ │ Load │ │ Register │ │ Run │ │ Unload │
└─────────┘ └─────────┘ └─────────┘ └─────────┘ └─────────┘
│ │ │ │ │
▼ ▼ ▼ ▼ ▼
按优先级扫描 通过 jiti 注册 RPC、 在 Gateway Gateway
配置路径、 动态加载 HTTP 路由、 进程内运行 关闭时清理
工作区、全局 TypeScript 工具、CLI 后台服务 资源Plugin 发现优先级(从高到低):
plugins.load.paths— 配置文件中显式指定的路径<workspace>/.openclaw/extensions/— 工作区扩展目录~/.openclaw/extensions/— 全局扩展目录- 内置扩展 — 随 OpenClaw 发行(默认禁用,需显式启用)
同一
id的插件如果在多个位置存在,高优先级的版本生效,低优先级的被忽略。
Plugin 能力注册:
一个 Plugin 可以注册以下任意组合的能力:
// openclaw.plugin.json 清单文件
{
"id": "my-plugin",
"name": "My OpenClaw Plugin",
"version": "1.0.0",
"description": "自定义插件示例"
}
// Plugin 可注册的能力类型:
// ✅ Gateway RPC 方法
// ✅ Gateway HTTP 处理器
// ✅ Agent 工具(tools)
// ✅ CLI 命令
// ✅ 后台服务(Background services)
// ✅ 配置验证
// ✅ Skills 目录(通过清单文件列出)
// ✅ 自动回复命令(无需调用 AI)Skill 文件结构详解
my-skill/
├── SKILL.md # 核心文件:YAML frontmatter + Markdown 指令
├── scripts/ # 可选:辅助脚本
│ ├── main.py
│ └── utils.sh
└── data/ # 可选:静态数据
└── templates.jsonSKILL.md 完整结构示例:
---
name: deploy-monitor
description: 监控部署状态并在异常时发送告警
emoji: 🚀
metadata:
openclaw:
requires:
bins: ["curl", "jq"] # 必需的命令行工具
env: ["DEPLOY_API_KEY"] # 必需的环境变量
config: ["monitor.url"] # 必需的配置项
primaryEnv: "DEPLOY_API_KEY"
install: "pip install requests" # 首次安装时执行
---
# Deploy Monitor
当用户需要检查部署状态或配置部署监控时使用此 Skill。
## 使用场景
- 检查最近一次部署的状态
- 配置部署失败告警
- 查看部署历史记录
## 操作指令
1. 运行 `curl -H "Authorization: $DEPLOY_API_KEY" $MONITOR_URL/status`
2. 解析 JSON 响应,提取 status、timestamp、version 字段
3. 如果 status 不是 "healthy",立即通知用户
## 示例对话
用户:"检查一下生产环境的部署状态"
Agent:[执行 curl 命令获取状态]
Agent:"生产环境当前状态:✅ 健康,版本 v2.3.1,上次部署于 10 分钟前"3. Hook 系统与事件模型
OpenClaw 采用事件驱动架构,所有的 Agent 行为都由输入事件触发。Hook 系统允许开发者在特定生命周期节点拦截和修改 Agent 行为。
事件类型
OpenClaw 的输入系统遵循”5+1”模型——五种标准输入加一种 Agent 间通信:
┌─────────────────────────────────────────────────────────┐
│ OpenClaw 事件输入模型 │
│ │
│ ┌───────────┐ ┌───────────┐ ┌───────────┐ │
│ │ 1. 消息 │ │ 2. 心跳 │ │ 3. Cron │ │
│ │ Messages │ │ Heartbeat │ │ 定时任务 │ │
│ │ │ │ (30min) │ │ (自定义) │ │
│ └─────┬─────┘ └─────┬─────┘ └─────┬─────┘ │
│ │ │ │ │
│ ┌─────┴──────────────┴──────────────┴─────┐ │
│ │ 事件队列 (Queue) │ │
│ └─────┬──────────────┬──────────────┬─────┘ │
│ │ │ │ │
│ ┌─────┴─────┐ ┌─────┴─────┐ ┌────┴──────┐ │
│ │ 4. Hooks │ │ 5.Webhook │ │ +1. A2A │ │
│ │ 内部事件 │ │ 外部触发 │ │ Agent间 │ │
│ │ │ │ │ │ 消息 │ │
│ └───────────┘ └───────────┘ └───────────┘ │
│ │
│ 所有输入 → 队列 → Agent Turn → 动作 → 持久化 → 循环 │
└─────────────────────────────────────────────────────────┘| 事件类型 | 触发方式 | 典型用途 | 示例 |
|---|---|---|---|
| Messages | 用户通过消息平台发送 | 对话交互 | WhatsApp/Telegram/Discord 消息 |
| Heartbeat | 定时器周期触发(默认 30 分钟) | 主动检查、状态汇报 | ”检查是否有新邮件” |
| Cron | 按 cron 表达式调度 | 定时任务 | 每天 9:00 执行邮件分类 |
| Hooks | 系统内部状态变化 | 生命周期管理 | Gateway 启动、Agent 任务开始/结束 |
| Webhook | 外部系统 HTTP 回调 | 第三方集成 | GitHub PR 事件、Stripe 支付通知 |
| Agent-to-Agent | Agent 间消息传递 | 多 Agent 协作 | 父 Agent 委派子任务 |
“活着”的错觉:OpenClaw Agent 看起来像是”主动”工作,实际上是 Heartbeat 和 Cron 事件在没有用户输入时持续触发 Agent Turn。这不是独立推理,而是精心设计的事件驱动调度。
Hook 注册与触发
Hook 是 OpenClaw 中拦截和修改 Agent 行为的核心机制。Hook 分为内置 Hook 和自定义 Hook:
内置 Hook 示例——soul-evil:
// openclaw.json 配置
{
"hooks": {
"internal": {
"enabled": true,
"entries": {
"soul-evil": {
"enabled": true,
"file": "SOUL_EVIL.md",
"chance": 0.1,
"purge": {
"at": "21:00",
"duration": "15m"
}
}
}
}
}
}这个内置 Hook 在 agent:bootstrap 事件触发时,可以按概率(chance: 0.1 = 10%)或在指定时间窗口(purge)内将 SOUL.md 替换为 SOUL_EVIL.md,实现动态人格切换。官方设计用途是上下文自适应人格(如”周一早晨模式”、“客服模式”),但也被安全研究者指出可被攻击者利用。
Hook 生命周期事件:
| 事件名 | 触发时机 | 典型用途 |
|---|---|---|
agent:bootstrap | Agent 初始化时 | 加载身份文件、设置上下文 |
agent:task:start | Agent 开始处理任务 | 记录日志、设置计时器 |
agent:task:end | Agent 完成任务 | 清理资源、发送通知 |
gateway:start | Gateway 服务启动 | 初始化连接、加载配置 |
user:stop | 用户发出停止指令 | 保存状态、优雅退出 |
user:reset | 用户重置 Agent | 清除会话、重新初始化 |
事件流图示
用户发送消息 外部 Webhook 定时器触发
│ │ │
▼ ▼ ▼
┌─────────────────────────────────────────────────────────────┐
│ Gateway 事件路由 │
│ │
│ 1. 识别事件类型(message / webhook / cron / heartbeat) │
│ 2. 确定目标 Agent 和会话(Session) │
│ 3. 将事件放入对应会话的队列 │
└──────────────────────────┬──────────────────────────────────┘
▼
┌──────────────────────────────────────────────────────────────┐
│ 会话队列(按序处理) │
│ │
│ ┌─────┐ ┌─────┐ ┌─────┐ │
│ │ Msg1│→ │ Msg2│→ │ Msg3│→ ... │
│ └─────┘ └─────┘ └─────┘ │
│ 同一会话内严格顺序执行,防止回复混乱 │
└──────────────────────────┬───────────────────────────────────┘
▼
┌──────────────────────────────────────────────────────────────┐
│ Agent Turn 执行 │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Hook: │───▶│ 构建上下文│───▶│ LLM 推理 │ │
│ │ bootstrap│ │ SOUL.md │ │ + 工具调用│ │
│ │ │ │ MEMORY.md│ │ │ │
│ └──────────┘ │ Skills │ └────┬─────┘ │
│ └──────────┘ │ │
│ ▼ │
│ ┌──────────────┐ │
│ │ 7 层工具策略 │ │
│ │ 权限检查 │ │
│ └──────┬───────┘ │
│ ▼ │
│ ┌──────────────┐ │
│ │ 执行工具/脚本 │ │
│ └──────┬───────┘ │
│ ▼ │
│ ┌──────────────┐ │
│ │ 持久化状态 │ │
│ │ 返回结果 │ │
│ └──────────────┘ │
└──────────────────────────────────────────────────────────────┘7 层工具策略栈
当 Agent 尝试调用工具时,请求会经过 7 层安全策略检查:
请求调用工具
│
▼
┌─ 1. Profile ──── 认证配置文件是否允许?
│ ▼
├─ 2. Provider ─── 模型提供商是否支持?
│ ▼
├─ 3. Global ───── 全局策略是否启用?
│ ▼
├─ 4. Agent ────── 该 Agent 是否有权限?
│ ▼
├─ 5. Group ────── 当前通道是否安全?(私聊 vs 公共频道)
│ ▼
├─ 6. Sandbox ──── 文件系统限制是否满足?
│ ▼
└─ 7. Subagent ─── 父 Agent 授予了哪些权限?
│
▼
允许 / 拒绝实际效果:你的 “DevOps” Agent 在私人终端会话中可以使用
kubectl,但在公共 Discord 频道中,Group 策略层会自动剥离该工具的访问权限。
4. 扩展点
工具扩展
OpenClaw 基于 Pi 框架的四个核心工具(Read、Write、Edit、Bash)构建,并在此基础上扩展了 20+ 额外工具:
| 工具类别 | 包含工具 | 说明 |
|---|---|---|
| 核心工具 | read, write, edit, bash | Pi 框架基础,经 OpenClaw 包装增强 |
| 浏览器 | browser, web_search | 网页浏览和搜索 |
| 消息 | message, sessions_spawn | 发送消息、生成子 Agent |
| 媒体 | image, canvas | 图像处理和画布操作 |
| 调度 | cron | 定时任务管理 |
| 记忆 | memory | 长期记忆读写 |
| 执行 | exec | 命令执行(带沙箱) |
通过 Plugin 添加自定义工具:
// src/my-tool.ts
import type { PluginApi } from '@openclaw/types';
export function register(api: PluginApi) {
api.registerTool({
name: 'stock-price',
description: '查询实时股票价格',
parameters: {
symbol: { type: 'string', description: '股票代码' }
},
execute: async ({ symbol }) => {
const price = await fetchStockPrice(symbol);
return { price, currency: 'USD', timestamp: Date.now() };
}
});
}消息平台扩展
OpenClaw 支持 12+ 消息平台,通过 Channel Plugin 可以添加新的通信渠道:
| 平台 | 集成方式 | 状态 |
|---|---|---|
| Baileys(Web 协议) | 内置 | |
| Telegram | Bot API | 内置 |
| Discord | Discord.js | 内置 |
| iMessage | AppleScript 桥接 | 内置 |
| Slack | Slack API | 内置 |
| Web UI | WebSocket | 内置 |
| Microsoft Teams | Plugin(@openclaw/msteams) | 官方插件 |
| Matrix | Plugin(@openclaw/matrix) | 官方插件 |
| Nostr | Plugin(@openclaw/nostr) | 官方插件 |
| Voice Call | Plugin(@openclaw/voice-call) | 官方插件 |
Channel Plugin 架构:
┌──────────────┐ ┌──────────────┐ ┌──────────┐
│ 你的应用 │◄──任意──▶│ Channel │◄──Plugin──▶│ Gateway │
│ / 服务 │ 协议 │ Plugin │ API │ │
└──────────────┘ └──────────────┘ └──────────┘Channel Plugin 在 Gateway 进程内运行,通过 Plugin API 注册自身、接收 Agent 消息并发送回复。与外部世界的通信协议(HTTP、WebSocket 等)由插件自行决定。
Channel 元数据声明:
{
"name": "@openclaw/nextcloud-talk",
"openclaw": {
"extensions": ["./index.ts"],
"channel": {
"name": "Nextcloud Talk",
"icon": "nextcloud",
"description": "通过 Nextcloud Talk 与 Agent 交互"
},
"install": {
"hint": "需要 Nextcloud 实例和 Talk 应用"
}
}
}存储扩展
OpenClaw 的记忆系统支持通过插件替换存储后端:
| 存储插件 | 说明 | 配置方式 |
|---|---|---|
| Memory (Core) | 内置记忆搜索(默认) | plugins.slots.memory 默认值 |
| Memory (LanceDB) | 长期记忆,自动召回/捕获 | plugins.slots.memory = "memory-lancedb" |
| 自定义 | 可开发自定义存储后端 | 实现 Memory Plugin 接口 |
OpenClaw 的状态持久化基于文件系统,核心文件包括:
SOUL.md— Agent 核心人格和沟通风格IDENTITY.md— Agent 的具体用途定义MEMORY.md— 长期事实和积累的知识HEARTBEAT.md— 定时主动行为配置
每次 Agent Turn 开始前,运行时会从文件系统读取这些文件构建上下文。这意味着三天前写入
MEMORY.md的项目约束,今天仍然会被 Agent 读取——这就是 OpenClaw 实现”持久记忆”的方式。
自定义命令
Plugin 可以注册两种类型的命令:
1. CLI 命令——扩展 openclaw 命令行工具:
api.registerCommand({
name: 'my-report',
description: '生成自定义报告',
action: async (args) => {
const report = await generateReport(args);
console.log(report);
}
});2. 自动回复命令——无需调用 AI 的快捷命令:
api.registerAutoReply({
command: '/status',
description: '快速查看系统状态',
handler: async () => {
return `系统运行正常 | 上线时间: ${getUptime()} | 活跃 Agent: ${getActiveAgents()}`;
}
});5. Skills 开发工具链
工具推荐表
| 工具 | 用途 | 价格 | 适用场景 |
|---|---|---|---|
| OpenClaw CLI | Skill 初始化、测试、验证、发布 | 免费(开源) | 所有 Skill 开发 |
| ClawHub | Skill 市场:发现、安装、发布 | 免费发布 | Skill 分发 |
| VS Code + Markdown 插件 | SKILL.md 编写和预览 | 免费 | Skill 编写 |
| Node.js 22+ | Plugin 开发运行时 | 免费 | Plugin 开发 |
| TypeScript | Plugin 类型安全开发 | 免费 | Plugin 开发 |
| Vitest | Plugin 单元测试 | 免费 | Plugin 测试 |
| jiti | TypeScript 动态加载(OpenClaw 内置) | 免费(开源) | Plugin 运行时 |
| Docker | 沙箱环境测试 | 免费(社区版) | 安全测试 |
| VirusTotal | 代码安全扫描(ClawHub 发布必需) | 免费(基础) / $0 起 | 安全审查 |
开发环境配置
Skill 开发(5 分钟上手):
# 1. 创建 Skill 目录
mkdir -p ~/.openclaw/skills/my-skill
cd ~/.openclaw/skills/my-skill
# 2. 创建 SKILL.md(核心文件)
cat > SKILL.md << 'EOF'
---
name: my-skill
description: 我的第一个自定义 Skill
metadata:
openclaw:
requires:
env: ["MY_API_KEY"]
---
# My Skill
当用户需要 [功能描述] 时使用此 Skill。
## 操作指令
1. [具体步骤]
2. [具体步骤]
## 示例
用户:"[示例输入]"
Agent:[示例输出]
EOF
# 3. 测试 Skill
openclaw skill test ./
openclaw skill validate ./Plugin 开发(20 分钟上手):
# 1. 初始化项目
mkdir my-openclaw-plugin && cd my-openclaw-plugin
npm init -y
npm install -D typescript vitest @types/node
# 2. 配置 TypeScript
npx tsc --init
# 修改 tsconfig.json: target=ES2022, module=ESNext
# 3. 创建插件清单
cat > openclaw.plugin.json << 'EOF'
{
"id": "my-plugin",
"name": "My Plugin",
"version": "1.0.0",
"description": "自定义 OpenClaw 插件"
}
EOF
# 4. 在 package.json 中声明入口
# "openclaw": { "extensions": ["./src/index.ts"] }
# 5. 编写插件代码
mkdir src && touch src/index.ts
# 6. 构建和测试
npm run build
vitest run实战案例:构建一个部署通知 Skill
以下是一个完整的 Skill 开发流程,实现”监听 GitHub Webhook → 解析部署事件 → 通过 Agent 发送通知”的功能。
需求分析
- 当 GitHub Actions 部署完成时,通过 Webhook 触发 Agent
- Agent 解析部署结果(成功/失败、版本号、耗时)
- 通过当前消息平台通知用户
实现步骤
步骤 1:创建 Skill 目录和核心文件
mkdir -p ~/.openclaw/skills/deploy-notify
cd ~/.openclaw/skills/deploy-notify步骤 2:编写 SKILL.md
---
name: deploy-notify
description: 解析 GitHub 部署 Webhook 并生成人类可读的部署报告
emoji: 🚀
metadata:
openclaw:
requires:
bins: ["jq"]
env: ["GITHUB_WEBHOOK_SECRET"]
---
# Deploy Notify
当收到 GitHub 部署相关的 Webhook 事件时使用此 Skill。
## 触发条件
- Webhook 来源为 GitHub
- 事件类型为 deployment_status 或 workflow_run
## 处理逻辑
1. 验证 Webhook 签名(使用 GITHUB_WEBHOOK_SECRET)
2. 解析 JSON payload,提取关键字段:
- 仓库名称
- 部署环境(production / staging)
- 状态(success / failure / pending)
- 触发者
- 提交 SHA 和消息
3. 生成格式化的部署报告
## 输出格式
🚀 **部署通知**
- 仓库:{repo}
- 环境:{environment}
- 状态:{status_emoji} {status}
- 版本:{sha_short}
- 触发者:{actor}
- 耗时:{duration}步骤 3:配置 Webhook 接收
在 openclaw.json 中配置 Webhook 端点:
{
"webhooks": {
"github-deploy": {
"path": "/webhook/github",
"secret": "${GITHUB_WEBHOOK_SECRET}",
"agent": "default",
"events": ["deployment_status", "workflow_run"]
}
}
}步骤 4:测试和验证
# 验证 Skill 结构
openclaw skill validate ./deploy-notify
# 本地测试(模拟 Webhook)
curl -X POST http://localhost:3000/webhook/github \
-H "Content-Type: application/json" \
-H "X-GitHub-Event: deployment_status" \
-d '{"deployment_status":{"state":"success"},"repository":{"full_name":"my/repo"}}'案例分析
这个案例展示了 OpenClaw Skill 开发的几个关键决策点:
- 选择 Skill 而非 Plugin:部署通知是一个典型的”指令驱动”场景,不需要底层系统访问,Skill 完全够用
- 利用 Webhook 输入:通过 Gateway 的 Webhook 能力接收外部事件,无需轮询
- 环境变量管理:敏感信息(Webhook Secret)通过
requires.env声明,确保运行前检查 - Markdown 指令的威力:整个逻辑用自然语言描述,Agent 自行决定如何执行
避坑指南
❌ 常见错误
-
启用过多 Skills 导致 Token 浪费
- 问题:每个 Skill 约消耗 24 tokens 的系统提示词空间。启用 100 个 Skill 就是 2,400 tokens 的固定开销,直接影响可用上下文窗口和 API 成本
- 正确做法:只启用当前需要的 Skills,使用工作区级别的
skills/目录按项目管理
-
盲目安装 ClawHub 社区 Skills
- 问题:2026 年 2 月,安全研究机构 Koi Security 在 ClawHub 的 2,857 个 Skills 中发现了 341 个恶意 Skills(占比 12%),其中 335 个属于代号”ClawHavoc”的攻击活动,主要针对 macOS 用户安装 Atomic Stealer 窃密木马。攻击者通过伪造的”前置依赖”安装脚本植入恶意代码
- 正确做法:安装前检查发布者信誉、查看源码、验证 VirusTotal 扫描结果;优先使用官方和已验证的 Skills
-
忽视 SOUL.md 的安全风险
- 问题:恶意 Skills 可以通过间接 Prompt 注入诱导 Agent 修改
SOUL.md和AGENTS.md,植入持久化后门。即使卸载恶意 Skill,被污染的身份文件仍会在后续会话中生效 - 正确做法:定期审查
SOUL.md和MEMORY.md的内容变更;使用版本控制跟踪这些文件;在沙箱模式下测试新 Skills
- 问题:恶意 Skills 可以通过间接 Prompt 注入诱导 Agent 修改
-
Plugin 权限过大
- 问题:Plugin 在 Gateway 进程内运行,拥有与 Gateway 相同的系统权限。一个有漏洞的 Plugin 可能导致整个系统被攻破
- 正确做法:只安装来自可信来源的 Plugin;审查 Plugin 源码;在隔离环境中先行测试
-
Skill 描述写得太模糊
- 问题:OpenClaw 根据 Skill 的
description字段决定何时激活该 Skill。描述不精确会导致 Skill 在不该激活时被调用,或在需要时被忽略 - 正确做法:在
description中明确列出触发关键词和使用场景,避免泛泛而谈
- 问题:OpenClaw 根据 Skill 的
✅ 最佳实践
- 遵循最小权限原则:Skill 的
requires只声明真正需要的依赖;Plugin 只注册必要的能力 - 工作区隔离:为不同项目使用不同的
<workspace>/skills/目录,避免 Skill 冲突 - 版本锁定:在生产环境中锁定 Skill 和 Plugin 版本,避免自动更新引入破坏性变更
- 先 Skill 后 Plugin:90% 的需求用 Skill 即可满足,只在确实需要底层访问时才开发 Plugin
- 安全审查流程:建立 Skill/Plugin 安装前的审查清单——检查源码、验证发布者、扫描恶意代码
- 监控 Token 消耗:定期检查已启用 Skills 的数量和 Token 开销,移除不再使用的 Skills
相关资源与延伸阅读
| 资源 | 类型 | 说明 |
|---|---|---|
| OpenClaw 官方文档 - Plugins | 官方文档 | Plugin 开发完整参考,包括清单格式、API 和示例 |
| OpenClaw 官方文档 - Skills | 官方文档 | Skills 系统完整文档,包括 SKILL.md 格式规范 |
| ClawHub 市场 | 社区市场 | 3,000+ Skills 的发现、安装和发布平台 |
| OpenClaw GitHub 仓库 | 源码 | 180K+ Stars,查看 src/plugins/ 和 extensions/ 目录了解内部实现 |
| AgentSkills 规范 | 开放标准 | Anthropic 发布的跨平台 Skill 格式标准,被 OpenClaw、Cursor 等采用 |
| DashBot - OpenClaw Dashboard Plugin | 开源项目 | 实时 AI Agent 仪表板的 Channel Plugin 参考实现 |
| OpenClaw Cheat Sheet 2026 | 速查表 | 完整的 OpenClaw CLI 命令参考,包括 Skill/Plugin 管理命令 |
| Koi Security - ClawHavoc 报告 | 安全研究 | 341 个恶意 ClawHub Skills 的详细分析报告 |
| OpenClaw 源码架构解析 (Moely) | 技术分析 | 深入解析 OpenClaw 框架的模块化设计和数据流 |
| Building a Channel Plugin for OpenClaw (Wemble) | 教程 | 从零构建 Channel Plugin 的完整步骤指南 |
参考来源
- OpenClaw 官方插件文档 (2026 年)
- Build Custom OpenClaw Skills in 20 Minutes (2026 年 2 月)
- OpenClaw (Clawdbot) Source Code Review: Framework Design Overview (2026 年 2 月)
- Exploring the OpenClaw Extension Ecosystem (2026 年 2 月)
- Build Your First OpenClaw Skill: Template, Permissions, and Testing (2026 年)
- OpenClaw: Architecture of a Local Agent (2026 年 2 月)
- OpenClaw Deep Dive: Architecture, Agent Loop, and What Makes It Tick (2026 年 2 月)
- Deep Dive OpenClaw (2026 年 2 月)
- OpenClaw Soul & Evil: Identity Files as Attack Surfaces (2026 年 2 月)
- Researchers Find 341 Malicious ClawHub Skills (2026 年 2 月)
- ClawHub Skills Marketplace Developer Guide 2026 (2026 年 2 月)
- Building a Channel Plugin for OpenClaw (2026 年 1 月)
- OpenClaw Custom Skill Creation Guide (2026 年 2 月)
- How OpenClaw Works: Event Triggers, Queues & Local States (2026 年 2 月)
- OpenClaw Security Crisis: Hundreds of Malicious Skills Found on ClawHub (2026 年 2 月)
📖 返回 总览与导航 | 上一节:23d-安全与成本分析 | 下一节:24b-自定义Agent开发教程