乐于分享
好东西不私藏

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

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

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 生产化:权限、安全、沙箱与长期运行治理

本站文章均为手工撰写未经允许谢绝转载:夜雨聆风 » OpenClaw 插件开发:Plugin、Hook、Skill 三层扩展怎么分工

猜你喜欢

  • 暂无文章