首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >OpenClaw 插件开发:Plugin、Hook、Skill 三层扩展怎么分工

OpenClaw 插件开发:Plugin、Hook、Skill 三层扩展怎么分工

作者头像
阿特拉斯
发布2026-06-15 17:33:55
发布2026-06-15 17:33:55
1210
举报

AI 推荐

适合读者:准备把 OpenClaw 从使用阶段推进到扩展阶段的开发者。

预计阅读:6 分钟

你将看到:

•Skill、Hook、Plugin 是三层不同粒度的扩展方式,不该混写。

•Plugin 负责注册工具、方法、服务和路由,Hook 负责挂接生命周期。

•最小插件骨架先跑通,再谈更复杂的能力注入。

头图,适合正文开头和封面横图裁切。
头图,适合正文开头和封面横图裁切。
核心示意图,帮助读者快速抓住本篇结构。
核心示意图,帮助读者快速抓住本篇结构。

真正开始自己扩 OpenClaw 时,很多人碰到的第一个坑,不是不会写代码,而是:

我到底该写 Skill,还是写 Hook,还是直接上 Plugin?

这是 OpenClaw 最容易混的三个扩展面。因为它们看起来都在“扩能力”,但真正负责的层完全不同。

这一篇的目标不是让你一上来做复杂插件,而是先帮你把判断顺序理清:

什么时候只需要 Skill,什么时候插 Hook 就够了,什么时候必须把能力真正注册进 Gateway。

一、先定本篇起点和完成标志

你的起点状态

1. 你已经理解 Skill 和 Hook 大致分别做什么

2. 你开始希望把某个能力真正接入 OpenClaw 运行时

3. 你不想一上来就写大而重的系统级扩展

本篇完成标志

到最后,你至少应该做到:

1. 能判断一个需求该落到 Skill、Hook 还是 Plugin

2. 知道一个最小 Plugin 至少包含什么

3. 能先注册出一个真的可调用的 tool,而不是只写一个插件空壳

二、先给结论:Skill、Hook、Plugin 分别解决什么问题

1. Skill

适合:

• 告诉 Agent 什么时候该做某类事

• 给出能力边界、使用条件、操作步骤

• 组织现有工具和工作流

它更像“能力说明书 + 调用策略”。

2. Hook

适合:

• 在 Agent 生命周期某个节点插入逻辑

• 修改 prompt 构建过程

• 做运行前后的小型控制和策略调整

它更像“运行时拦截点”。

3. Plugin

适合:

• 注册真正的新能力

• 暴露 Gateway RPC

• 注册 HTTP route

• 注册 agent tool

• 注册 CLI command

• 注册 background service

• 给系统提供新的 channel 或 provider

它更像“把代码真正装进 Gateway 里”。

所以最简单的判断是:

• 只是教 Agent 怎么做事,用 Skill

• 只是修改运行时流程,用 Hook

• 需要把新功能注册进系统,用 Plugin

三、第一版 Plugin 不要做大,先注册一个最小 tool

如果你是第一次写 Plugin,最容易成功的路径不是先做 channel,也不是先接一堆服务,而是先注册一个 agent tool。

这是因为它能最快帮你验证三件事:

1. 插件有没有被系统发现

2. 代码有没有正确加载

3. Agent 能不能真的调用你注册的能力

换句话说,第一版 Plugin 的目标不是“做出完整产品”,而是:

先注册出一个真的能被 Agent 调到的 tool。

四、Plugin 的最小形态不是一个 TS 文件,而是 Manifest + Module

官方 Plugin Manifest 文档给的规则非常明确:

每个插件都必须带一个:

openclaw.plugin.json

而且至少要有两个关键字段:

id

configSchema

一个最小 manifest 长这样:

{

"id": "voice-call",

"configSchema": {

"type": "object",

"additionalProperties": false,

"properties": {}

}

}

这里最关键的一点不是 JSON 长什么样,而是官方设计意图:

OpenClaw 会先通过 manifest 做发现与配置校验,而不是先执行你的插件代码。

这意味着 Plugin 不是“先跑起来再说”,而是先成为一个可验证、可发现的系统单元。

五、一个最小插件骨架,应该先从 Tool 开始

官方 Plugin Agent Tools 文档给的最小例子是:

import { Type } from "@sinclair/typebox";

export default function (api) {

api.registerTool({

name: "my_tool",

description: "Do a thing",

parameters: Type.Object({

input: Type.String(),

}),

async execute(_id, params) {

return { content: [{ type: "text", text: params.input }] };

},

});

}

这个最小例子背后的关键点有三个:

1. Tool 是 JSON-schema function,不是随便一个 JS 函数

2. 参数结构要显式声明

3. 返回结果也要符合 Agent 工具结果格式

所以第一次写 Plugin,最好的目标不是“做大”,而是“先把注册链路打通”。

六、Plugin 真正能注册什么

官方 Plugins 文档列得很完整,一个插件可以注册:

• Gateway RPC methods

• Gateway HTTP routes

• Agent tools

• CLI commands

• Background services

• Context engines

• Optional config validation

• Skills 目录

• Auto-reply commands

这串列表本身已经说明了 Plugin 的定位:

它不是某个点状功能,而是系统级扩展容器。

所以当你需要的能力开始越过“提示词组织”,进入“系统表面注册”,就应该考虑 Plugin 了。

七、如果工具有副作用,优先做 optional tool

官方文档专门强调了 optional tool:

api.registerTool(toolDef, { optional: true });

而且明确说明:

optional tools 不会自动启用,用户必须显式加到 allowlist。

这条规则非常适合下面这些能力:

• 会改外部系统状态

• 依赖额外二进制或凭据

• 容易误触发

同时,它也和 OpenClaw 的 tool policy 完整接起来了:

tools.allow

agents.list[].tools.allow

group:plugins

• 插件 id 级别启用

所以对插件作者来说,一个很成熟的习惯是:

默认把有副作用的工具做成 optional。

八、Plugin 不只是 Tool,还能真正接入运行时生命周期

如果你只把 Plugin 理解成“提供几个工具”,那还是太窄了。

官方 Plugins 文档里,api.on(...) 明确提供了生命周期 hook 能力,例如:

api.on(

"before_prompt_build",

(event, ctx) => {

return {

prependSystemContext: "Follow company style guide.",

};

},

{ priority: 10 },

);

而且文档还把几个关键 hook 区分得很清楚:

before_model_resolve

before_prompt_build

before_agent_start(legacy compatibility)

这说明一件事:

Hook 是运行时切点,Plugin 是承载这些切点的代码扩展容器之一。

九、真正系统级的 Plugin,还会碰到 RPC、CLI、HTTP Route 和 Service

这是 Skill 和单纯 Hook 都替代不了的地方。

官方文档给了非常直接的例子:

1. Gateway RPC method

api.registerGatewayMethod("myplugin.status", ({ respond }) => {

respond(true, { ok: true });

});

2. CLI command

api.registerCli(

({ program }) => {

program.command("mycmd").action(() => {

console.log("Hello");

});

},

{ commands: ["mycmd"] },

);

3. HTTP route

官方也明确建议用:

api.registerHttpRoute(...)

而且 route 必须显式声明 authgateway 还是 plugin

4. Background service

api.registerService({

id: "my-service",

start: () => api.logger.info("ready"),

stop: () => api.logger.info("bye"),

});

当你开始需要这些能力时,说明你已经不在“怎么组织提示词”的层,而是在扩 OpenClaw 的系统表面。

十、给扩展阶段的最小判断标准

如果你现在还在犹豫到底该用哪一层,可以用这组判断:

1. 只是想告诉 Agent 何时做事,用 Skill

2. 只是想在运行某个节点插一段逻辑,用 Hook

3. 需要新增 tool / route / RPC / CLI / service,用 Plugin

只要按这个顺序判断,绝大多数扩展都不会走偏。

十一、这一篇之后,你该建立什么认知

到这里,你应该把 Plugin 理解成:

它不是“大号 Skill”,也不是“随便放点代码的目录”,而是 OpenClaw 的系统级扩展容器。

把这三层分清以后,你写的每一行扩展代码,才是在给系统加能力,而不是给提示词继续堆复杂度。

下一篇,我们收束到最终落地问题:如何把 OpenClaw 安全、稳定、长期地跑起来。

参考链接

• Plugins: https://docs.openclaw.ai/tools/plugin

• Skills: https://docs.openclaw.ai/tools/skills

• Agent Loop: https://docs.openclaw.ai/concepts/agent-loop


这一篇属于 OpenClaw 系列的「深入」阶段。

上一篇:OpenClaw 自动化:Cron、Webhooks、Gmail Hooks 怎么把 Gateway 变成事件中枢

下一篇:OpenClaw 生产化:权限、安全、沙箱与长期运行治理

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-03-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 超级AI技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、先定本篇起点和完成标志
    • 你的起点状态
    • 本篇完成标志
  • 二、先给结论:Skill、Hook、Plugin 分别解决什么问题
    • 1. Skill
    • 2. Hook
    • 3. Plugin
  • 三、第一版 Plugin 不要做大,先注册一个最小 tool
  • 四、Plugin 的最小形态不是一个 TS 文件,而是 Manifest + Module
  • 五、一个最小插件骨架,应该先从 Tool 开始
  • 六、Plugin 真正能注册什么
  • 七、如果工具有副作用,优先做 optional tool
  • 八、Plugin 不只是 Tool,还能真正接入运行时生命周期
  • 九、真正系统级的 Plugin,还会碰到 RPC、CLI、HTTP Route 和 Service
    • 1. Gateway RPC method
    • 2. CLI command
    • 3. HTTP route
    • 4. Background service
  • 十、给扩展阶段的最小判断标准
  • 十一、这一篇之后,你该建立什么认知
  • 参考链接
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档