Building plugins

Xây dựng các Plugin

Plugin mở rộng OpenClaw mà không thay đổi phần lõi. Một Plugin có thể thêm kênh nhắn tin, nhà cung cấp mô hình, backend CLI cục bộ, công cụ agent, hook, nhà cung cấp phương tiện, hoặc một năng lực khác do Plugin sở hữu.

Bạn không cần thêm Plugin bên ngoài vào kho lưu trữ OpenClaw. Hãy phát hành gói lên ClawHub và người dùng cài đặt bằng:

bash
openclaw plugins install clawhub:<package-name>

Thông số gói trần vẫn cài đặt từ npm trong giai đoạn chuyển đổi ra mắt. Dùng tiền tố clawhub: khi bạn muốn phân giải qua ClawHub.

Yêu cầu

  • Dùng Node 22.19+, Node 23.11+, hoặc Node 24+ và một trình quản lý gói như npm hoặc pnpm.
  • Quen thuộc với các mô-đun TypeScript ESM.
  • Với công việc trên Plugin đóng gói sẵn trong repo, hãy clone kho lưu trữ và chạy pnpm install. Phát triển Plugin từ source checkout chỉ dùng pnpm vì OpenClaw tải các Plugin đóng gói sẵn từ các gói workspace extensions/*.

Chọn hình dạng Plugin

Khởi động nhanh

Xây dựng một Plugin công cụ tối thiểu bằng cách đăng ký một công cụ agent bắt buộc. Đây là hình dạng Plugin hữu ích ngắn nhất và thể hiện gói, manifest, điểm vào, và bằng chứng cục bộ.

  • Create package metadata

    package.json
    {"name": "@myorg/openclaw-my-plugin","version": "1.0.0","type": "module","dependencies": {"typebox": "1.1.39"},"peerDependencies": {"openclaw": ">=2026.3.24-beta.2"},"openclaw": {"extensions": ["./index.ts"],"compat": {"pluginApi": ">=2026.3.24-beta.2","minGatewayVersion": "2026.3.24-beta.2"},"build": {"openclawVersion": "2026.3.24-beta.2","pluginSdkVersion": "2026.3.24-beta.2"}}}
    openclaw.plugin.json
    {"id": "my-plugin","name": "My Plugin","description": "Adds a custom tool to OpenClaw","contracts": {"tools": ["my_tool"]},"activation": {"onStartup": true},"configSchema": {"type": "object","additionalProperties": false}}

    Plugin bên ngoài đã phát hành nên trỏ các mục nhập runtime tới các tệp JavaScript đã build. Xem điểm vào SDK để biết đầy đủ hợp đồng điểm vào.

    Mỗi Plugin cần một manifest, ngay cả khi không có cấu hình. Công cụ runtime phải xuất hiện trong contracts.tools để OpenClaw có thể phát hiện quyền sở hữu mà không cần tải sớm mọi runtime Plugin. Đặt activation.onStartup có chủ đích. Ví dụ này khởi động khi Gateway khởi động.

    Các bề mặt Plugin được host tin cậy cũng được kiểm soát bằng manifest và yêu cầu bật rõ ràng đối với Plugin đã cài đặt. Nếu một Plugin đã cài đặt đăng ký api.registerAgentToolResultMiddleware(...), hãy khai báo từng runtime đích trong contracts.agentToolResultMiddleware. Nếu nó đăng ký api.registerTrustedToolPolicy(...), hãy khai báo từng policy id trong contracts.trustedToolPolicies. Các khai báo này giữ cho việc kiểm tra lúc cài đặt và đăng ký runtime đồng bộ với nhau.

    Với mọi trường manifest, xem manifest Plugin.

  • Register the tool

    index.ts
    import { Type } from "typebox";import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry"; export default definePluginEntry({  id: "my-plugin",  name: "My Plugin",  description: "Adds a custom tool to OpenClaw",  register(api) {    api.registerTool({      name: "my_tool",      description: "Echo one input value",      parameters: Type.Object({ input: Type.String() }),      async execute(_id, params) {        return {          content: [{ type: "text", text: `Got: ${params.input}` }],        };      },    });  },});

    Dùng definePluginEntry cho các Plugin không phải kênh. Plugin kênh dùng defineChannelPluginEntry.

  • Test the runtime

    Với một Plugin đã cài đặt hoặc Plugin bên ngoài, hãy kiểm tra runtime đã tải:

    bash
    openclaw plugins inspect my-plugin --runtime --json

    Nếu Plugin đăng ký một lệnh CLI, hãy chạy cả lệnh đó. Ví dụ, một lệnh demo nên có bằng chứng thực thi như openclaw demo-plugin ping.

    Với một Plugin đóng gói sẵn trong kho lưu trữ này, OpenClaw phát hiện các gói Plugin từ source checkout trong workspace extensions/*. Chạy bài kiểm thử nhắm mục tiêu gần nhất:

    bash
    pnpm test -- extensions/my-plugin/pnpm check
  • Test the package install

    Trước khi phát hành một Plugin sẵn sàng đóng gói, hãy kiểm thử đúng hình dạng cài đặt mà người dùng sẽ nhận được. Trước tiên thêm bước build, trỏ các mục nhập runtime như openclaw.extensions tới JavaScript đã build như ./dist/index.js, và đảm bảo npm pack bao gồm đầu ra dist/ đó. Mục nhập mã nguồn TypeScript chỉ dành cho source checkout và đường dẫn phát triển cục bộ.

    Sau đó đóng gói Plugin và cài đặt tarball bằng npm-pack::

    bash
    npm pack --pack-destination /tmpopenclaw plugins install npm-pack:/tmp/<plugin-package>.tgz --forceopenclaw plugins inspect my-plugin --runtime --json

    npm-pack: dùng dự án npm do OpenClaw quản lý cho từng Plugin, nên nó phát hiện các lỗi phụ thuộc runtime mà kiểm thử source checkout có thể che giấu. Nó chứng minh hình dạng gói và phụ thuộc, không phải độ tin cậy chính thức liên kết với catalog. Các import runtime phải nằm trong dependencies hoặc optionalDependencies; các phụ thuộc chỉ để trong devDependencies sẽ không được cài đặt cho dự án runtime được quản lý.

    Không dùng cài đặt archive/path thô làm bằng chứng cuối cùng cho hành vi Plugin chính thức hoặc đặc quyền. Mã nguồn thô hữu ích cho gỡ lỗi cục bộ, nhưng chúng không chứng minh cùng đường dẫn phụ thuộc như cài đặt npm hoặc ClawHub. Nếu Plugin của bạn dựa vào trạng thái Plugin chính thức đáng tin cậy, hãy thêm bằng chứng thứ hai thông qua một cài đặt chính thức dựa trên catalog hoặc một đường dẫn gói đã phát hành có ghi nhận độ tin cậy chính thức. Xem phân giải phụ thuộc Plugin để biết chi tiết về install-root và quyền sở hữu phụ thuộc.

  • Publish

    Xác thực gói trước khi phát hành:

    bash
    clawhub package publish your-org/your-plugin --dry-runclawhub package publish your-org/your-plugin

    Các đoạn mẫu ClawHub chuẩn nằm trong docs/snippets/plugin-publish/.

  • Install

    Cài đặt gói đã phát hành thông qua ClawHub:

    bash
    openclaw plugins install clawhub:your-org/your-plugin
  • Đăng ký công cụ

    Công cụ có thể là bắt buộc hoặc tùy chọn. Công cụ bắt buộc luôn khả dụng khi Plugin được bật. Công cụ tùy chọn yêu cầu người dùng chọn tham gia.

    typescript
    register(api) {  api.registerTool(    {      name: "workflow_tool",      description: "Run a workflow",      parameters: Type.Object({ pipeline: Type.String() }),      async execute(_id, params) {        return { content: [{ type: "text", text: params.pipeline }] };      },    },    { optional: true },  );}

    Mọi công cụ được đăng ký bằng api.registerTool(...) cũng phải được khai báo trong manifest Plugin:

    json
    {  "contracts": {    "tools": ["workflow_tool"]  },  "toolMetadata": {    "workflow_tool": {      "optional": true    }  }}

    Người dùng chọn tham gia bằng tools.allow:

    json5
    {  tools: { allow: ["workflow_tool"] }, // or ["my-plugin"] for all tools from one plugin}

    Công cụ tùy chọn kiểm soát việc một công cụ có được hiển thị cho mô hình hay không. Dùng yêu cầu quyền Plugin khi một công cụ hoặc hook nên yêu cầu phê duyệt sau khi mô hình chọn nó và trước khi hành động chạy.

    Dùng công cụ tùy chọn cho tác dụng phụ, binary ít phổ biến, hoặc năng lực không nên được hiển thị theo mặc định. Tên công cụ không được xung đột với công cụ lõi; xung đột sẽ bị bỏ qua và được báo cáo trong chẩn đoán Plugin. Các đăng ký không đúng định dạng, bao gồm bộ mô tả công cụ không có parameters, sẽ bị bỏ qua và được báo cáo theo cùng cách. Công cụ đã đăng ký là các hàm có kiểu mà mô hình có thể gọi sau khi vượt qua kiểm tra chính sách và allowlist.

    Factory công cụ nhận một đối tượng ngữ cảnh do runtime cung cấp. Dùng ctx.activeModel khi một công cụ cần ghi log, hiển thị, hoặc thích ứng với mô hình đang hoạt động cho lượt hiện tại. Đối tượng có thể bao gồm provider, modelId, và modelRef. Hãy xem nó là metadata runtime mang tính thông tin, không phải ranh giới bảo mật chống lại operator cục bộ, mã Plugin đã cài đặt, hoặc runtime OpenClaw đã sửa đổi. Công cụ cục bộ nhạy cảm vẫn nên yêu cầu chọn tham gia rõ ràng từ Plugin hoặc operator và fail closed khi metadata active-model bị thiếu hoặc không phù hợp.

    Manifest khai báo quyền sở hữu và phát hiện; khi thực thi vẫn gọi phần triển khai công cụ đã đăng ký trực tiếp. Giữ toolMetadata.<tool>.optional: true đồng bộ với api.registerTool(..., { optional: true }) để OpenClaw có thể tránh tải runtime Plugin đó cho đến khi công cụ được đưa vào allowlist rõ ràng.

    Quy ước import

    Import từ các subpath SDK tập trung:

    typescript
      

    Không import từ root barrel đã ngừng khuyến nghị:

    typescript
     

    Trong gói Plugin của bạn, dùng các tệp barrel cục bộ như api.tsruntime-api.ts cho import nội bộ. Không import chính Plugin của bạn thông qua đường dẫn SDK. Helper chuyên biệt cho nhà cung cấp nên ở lại trong gói nhà cung cấp trừ khi đường nối thực sự có tính tổng quát.

    Các phương thức RPC Gateway tùy chỉnh là một điểm vào nâng cao. Giữ chúng trên một tiền tố riêng cho Plugin; các namespace quản trị lõi như config.*, exec.approvals.*, operator.admin.*, wizard.*, và update.* vẫn được dành riêng và phân giải tới operator.admin. Cầu nối openclaw/plugin-sdk/gateway-method-runtime được dành riêng cho các route HTTP của Plugin khai báo contracts.gatewayMethodDispatch: ["authenticated-request"].

    Để xem đầy đủ bản đồ import, xem tổng quan Plugin SDK.

    Danh sách kiểm tra trước khi gửi

    OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s package.json có metadata openclaw chính xác OPENCLAW_DOCS_MARKER:calloutClose:

    OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s Manifest openclaw.plugin.json hiện diện và hợp lệ OPENCLAW_DOCS_MARKER:calloutClose:

    OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s Điểm vào dùng defineChannelPluginEntry hoặc definePluginEntry OPENCLAW_DOCS_MARKER:calloutClose:

    OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s Mọi import dùng đường dẫn plugin-sdk/<subpath> tập trung OPENCLAW_DOCS_MARKER:calloutClose:

    Was this useful?
    On this page

    On this page