Plugin SDK reference
Thiết lập và cấu hình Plugin
Tham chiếu cho đóng gói plugin (siêu dữ liệu package.json), manifest (openclaw.plugin.json), mục thiết lập và schema cấu hình.
Siêu dữ liệu gói
package.json của bạn cần có trường openclaw để cho hệ thống plugin biết plugin của bạn cung cấp những gì:
Channel plugin
{ "name": "@myorg/openclaw-my-channel", "version": "1.0.0", "type": "module", "openclaw": { "extensions": ["./index.ts"], "setupEntry": "./setup-entry.ts", "channel": { "id": "my-channel", "label": "My Channel", "blurb": "Short description of the channel." } }}Provider plugin / ClawHub baseline
{ "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" } }}Các trường openclaw
extensionsstring[]Các tệp điểm vào (tương đối với gốc gói).
setupEntrystringMục chỉ dành cho thiết lập, gọn nhẹ (không bắt buộc).
channelobjectSiêu dữ liệu danh mục kênh cho các bề mặt thiết lập, bộ chọn, khởi động nhanh và trạng thái.
providersstring[]Mã định danh nhà cung cấp được plugin này đăng ký.
installobjectGợi ý cài đặt: npmSpec, localPath, defaultChoice, minHostVersion, expectedIntegrity, allowInvalidConfigRecovery.
startupobjectCờ hành vi khởi động.
openclaw.channel
openclaw.channel là siêu dữ liệu gói nhẹ cho việc phát hiện kênh và các bề mặt thiết lập trước khi thời gian chạy tải.
| Trường | Kiểu | Ý nghĩa |
|---|---|---|
id |
string |
Mã định danh kênh chuẩn. |
label |
string |
Nhãn kênh chính. |
selectionLabel |
string |
Nhãn bộ chọn/thiết lập khi cần khác với label. |
detailLabel |
string |
Nhãn chi tiết phụ cho danh mục kênh và bề mặt trạng thái phong phú hơn. |
docsPath |
string |
Đường dẫn tài liệu cho liên kết thiết lập và lựa chọn. |
docsLabel |
string |
Ghi đè nhãn dùng cho liên kết tài liệu khi cần khác với mã định danh kênh. |
blurb |
string |
Mô tả ngắn cho onboarding/danh mục. |
order |
number |
Thứ tự sắp xếp trong danh mục kênh. |
aliases |
string[] |
Bí danh tra cứu bổ sung cho lựa chọn kênh. |
preferOver |
string[] |
Mã định danh plugin/kênh có mức ưu tiên thấp hơn mà kênh này nên xếp trên. |
systemImage |
string |
Tên biểu tượng/hình ảnh hệ thống tùy chọn cho danh mục giao diện kênh. |
selectionDocsPrefix |
string |
Văn bản tiền tố trước liên kết tài liệu trong bề mặt lựa chọn. |
selectionDocsOmitLabel |
boolean |
Hiển thị trực tiếp đường dẫn tài liệu thay vì liên kết tài liệu có nhãn trong bản sao lựa chọn. |
selectionExtras |
string[] |
Các chuỗi ngắn bổ sung được thêm vào bản sao lựa chọn. |
markdownCapable |
boolean |
Đánh dấu kênh là hỗ trợ markdown cho các quyết định định dạng gửi đi. |
exposure |
object |
Điều khiển khả năng hiển thị kênh cho thiết lập, danh sách đã cấu hình và bề mặt tài liệu. |
quickstartAllowFrom |
boolean |
Đưa kênh này vào luồng thiết lập khởi động nhanh allowFrom tiêu chuẩn. |
forceAccountBinding |
boolean |
Yêu cầu liên kết tài khoản rõ ràng ngay cả khi chỉ tồn tại một tài khoản. |
preferSessionLookupForAnnounceTarget |
boolean |
Ưu tiên tra cứu phiên khi phân giải mục tiêu thông báo cho kênh này. |
Ví dụ:
{ "openclaw": { "channel": { "id": "my-channel", "label": "My Channel", "selectionLabel": "My Channel (self-hosted)", "detailLabel": "My Channel Bot", "docsPath": "/channels/my-channel", "docsLabel": "my-channel", "blurb": "Webhook-based self-hosted chat integration.", "order": 80, "aliases": ["mc"], "preferOver": ["my-channel-legacy"], "selectionDocsPrefix": "Guide:", "selectionExtras": ["Markdown"], "markdownCapable": true, "exposure": { "configured": true, "setup": true, "docs": true }, "quickstartAllowFrom": true } }}exposure hỗ trợ:
configured: đưa kênh vào các bề mặt liệt kê kiểu đã cấu hình/trạng tháisetup: đưa kênh vào các bộ chọn thiết lập/cấu hình tương tácdocs: đánh dấu kênh là hướng ra công chúng trong bề mặt tài liệu/điều hướng
openclaw.install
openclaw.install là siêu dữ liệu gói, không phải siêu dữ liệu manifest.
| Trường | Kiểu | Ý nghĩa |
|---|---|---|
clawhubSpec |
string |
Đặc tả ClawHub chuẩn cho cài đặt/cập nhật và các luồng onboarding cài đặt theo nhu cầu. |
npmSpec |
string |
Đặc tả npm chuẩn cho các luồng dự phòng cài đặt/cập nhật. |
localPath |
string |
Đường dẫn cài đặt phát triển cục bộ hoặc đi kèm. |
defaultChoice |
"clawhub" | "npm" | "local" |
Nguồn cài đặt ưu tiên khi có nhiều nguồn khả dụng. |
minHostVersion |
string |
Phiên bản OpenClaw được hỗ trợ tối thiểu ở dạng >=x.y.z hoặc >=x.y.z-prerelease. |
expectedIntegrity |
string |
Chuỗi toàn vẹn dist npm dự kiến, thường là sha512-..., cho các bản cài đặt được ghim. |
allowInvalidConfigRecovery |
boolean |
Cho phép các luồng cài đặt lại plugin đi kèm khôi phục từ những lỗi cấu hình cũ cụ thể. |
requiredPlatformPackages |
string[] |
Các bí danh npm theo nền tảng bắt buộc được xác minh trong quá trình cài đặt npm. |
Onboarding behavior
Onboarding tương tác cũng dùng openclaw.install cho các bề mặt cài đặt theo nhu cầu. Nếu plugin của bạn hiển thị các lựa chọn xác thực nhà cung cấp hoặc siêu dữ liệu thiết lập/danh mục kênh trước khi thời gian chạy tải, onboarding có thể hiển thị lựa chọn đó, nhắc chọn cài đặt từ ClawHub, npm hoặc cục bộ, cài đặt hoặc bật plugin, rồi tiếp tục luồng đã chọn. Các lựa chọn onboarding ClawHub dùng clawhubSpec và được ưu tiên khi có; lựa chọn npm yêu cầu siêu dữ liệu danh mục đáng tin cậy với npmSpec của registry; phiên bản chính xác và expectedIntegrity là các ghim npm tùy chọn. Nếu có expectedIntegrity, các luồng cài đặt/cập nhật sẽ thực thi nó cho npm. Giữ siêu dữ liệu "hiển thị gì" trong openclaw.plugin.json và siêu dữ liệu "cài đặt như thế nào" trong package.json.
minHostVersion enforcement
Nếu đặt minHostVersion, cả cài đặt và tải registry manifest không đi kèm đều thực thi trường này. Máy chủ cũ hơn bỏ qua plugin bên ngoài; chuỗi phiên bản không hợp lệ bị từ chối. Plugin nguồn đi kèm được giả định là cùng phiên bản với checkout máy chủ.
Pinned npm installs
Với các bản cài đặt npm được ghim, giữ phiên bản chính xác trong npmSpec và thêm tính toàn vẹn artifact dự kiến:
{ "openclaw": { "install": { "npmSpec": "@wecom/wecom-openclaw-plugin@1.2.3", "expectedIntegrity": "sha512-REPLACE_WITH_NPM_DIST_INTEGRITY", "defaultChoice": "npm" } }}allowInvalidConfigRecovery scope
allowInvalidConfigRecovery không phải là cơ chế bỏ qua chung cho cấu hình hỏng. Nó chỉ dành cho khôi phục plugin đi kèm trong phạm vi hẹp, để cài đặt lại/thiết lập có thể sửa các phần sót lại sau nâng cấp đã biết, như thiếu đường dẫn plugin đi kèm hoặc mục channels.<id> cũ cho cùng plugin đó. Nếu cấu hình hỏng vì lý do không liên quan, cài đặt vẫn đóng khi lỗi và yêu cầu người vận hành chạy openclaw doctor --fix.
Tải đầy đủ trì hoãn
Plugin kênh có thể chọn tải trì hoãn bằng:
{ "openclaw": { "extensions": ["./index.ts"], "setupEntry": "./setup-entry.ts", "startup": { "deferConfiguredChannelFullLoadUntilAfterListen": true } }}Khi bật, OpenClaw chỉ tải setupEntry trong giai đoạn khởi động trước khi lắng nghe, ngay cả với các kênh đã được cấu hình. Mục đầy đủ sẽ tải sau khi gateway bắt đầu lắng nghe.
Nếu mục thiết lập/đầy đủ của bạn đăng ký các phương thức RPC gateway, hãy giữ chúng trên một tiền tố dành riêng cho plugin. Các không gian tên quản trị lõi được dành riêng (config.*, exec.approvals.*, wizard.*, update.*) vẫn thuộc sở hữu lõi và luôn phân giải thành operator.admin.
Manifest plugin
Mọi plugin native phải kèm theo openclaw.plugin.json trong gốc gói. OpenClaw dùng tệp này để xác thực cấu hình mà không thực thi mã plugin.
{ "id": "my-plugin", "name": "My Plugin", "description": "Adds My Plugin capabilities to OpenClaw", "configSchema": { "type": "object", "additionalProperties": false, "properties": { "webhookSecret": { "type": "string", "description": "Webhook verification secret" } } }}Với plugin kênh, thêm kind và channels:
{ "id": "my-channel", "kind": "channel", "channels": ["my-channel"], "configSchema": { "type": "object", "additionalProperties": false, "properties": {} }}Ngay cả các Plugin không có cấu hình cũng phải phát hành kèm schema. Schema rỗng là hợp lệ:
{ "id": "my-plugin", "configSchema": { "type": "object", "additionalProperties": false }}Xem manifest Plugin để biết tham chiếu schema đầy đủ.
Xuất bản lên ClawHub
Đối với các gói Plugin, hãy dùng lệnh ClawHub dành riêng cho gói:
clawhub package publish your-org/your-plugin --dry-runclawhub package publish your-org/your-pluginMục nhập thiết lập
Tệp setup-entry.ts là lựa chọn thay thế nhẹ hơn cho index.ts mà OpenClaw tải khi chỉ cần các bề mặt thiết lập (onboarding, sửa cấu hình, kiểm tra kênh bị tắt).
// setup-entry.ts export default defineSetupPluginEntry(myChannelPlugin);Điều này tránh tải mã runtime nặng (thư viện mã hóa, đăng ký CLI, dịch vụ nền) trong các luồng thiết lập.
Các kênh workspace được đóng gói sẵn giữ export an toàn cho thiết lập trong các module sidecar có thể dùng defineBundledChannelSetupEntry(...) từ openclaw/plugin-sdk/channel-entry-contract thay vì defineSetupPluginEntry(...). Contract được đóng gói đó cũng hỗ trợ export runtime tùy chọn để wiring runtime ở thời điểm thiết lập có thể vẫn nhẹ và tường minh.
Khi OpenClaw dùng setupEntry thay vì mục nhập đầy đủ
- Kênh bị tắt nhưng cần các bề mặt thiết lập/onboarding.
- Kênh được bật nhưng chưa được cấu hình.
- Tải trì hoãn được bật (
deferConfiguredChannelFullLoadUntilAfterListen).
setupEntry phải đăng ký những gì
- Đối tượng Plugin kênh (qua
defineSetupPluginEntry). - Bất kỳ route HTTP nào cần trước khi Gateway lắng nghe.
- Bất kỳ phương thức Gateway nào cần trong quá trình khởi động.
Các phương thức Gateway khi khởi động đó vẫn nên tránh các namespace quản trị lõi được dành riêng như config.* hoặc update.*.
setupEntry KHÔNG nên bao gồm những gì
- Đăng ký CLI.
- Dịch vụ nền.
- Import runtime nặng (crypto, SDK).
- Các phương thức Gateway chỉ cần sau khi khởi động.
Import helper thiết lập phạm vi hẹp
Đối với các đường dẫn nóng chỉ dành cho thiết lập, hãy ưu tiên các điểm nối helper thiết lập phạm vi hẹp hơn thay vì umbrella plugin-sdk/setup rộng hơn khi bạn chỉ cần một phần của bề mặt thiết lập:
| Đường dẫn import | Dùng cho | Export chính |
|---|---|---|
plugin-sdk/setup-runtime |
helper runtime ở thời điểm thiết lập vẫn khả dụng trong setupEntry / khởi động kênh trì hoãn |
createSetupTranslator, createPatchedAccountSetupAdapter, createEnvPatchedAccountSetupAdapter, createSetupInputPresenceValidator, noteChannelLookupFailure, noteChannelLookupSummary, promptResolvedAllowFrom, splitSetupEntries, createAllowlistSetupWizardProxy, createDelegatedSetupWizardProxy |
plugin-sdk/setup-adapter-runtime |
alias tương thích đã ngừng khuyến nghị; dùng plugin-sdk/setup-runtime |
createEnvPatchedAccountSetupAdapter |
plugin-sdk/setup-tools |
helper CLI/cài đặt/lưu trữ/tài liệu cho thiết lập | formatCliCommand, detectBinary, extractArchive, resolveBrewExecutable, formatDocsLink, CONFIG_DIR |
Dùng điểm nối plugin-sdk/setup rộng hơn khi bạn muốn bộ công cụ thiết lập dùng chung đầy đủ, bao gồm các helper vá cấu hình như moveSingleAccountChannelSectionToDefaultAccount(...).
Dùng createSetupTranslator(...) cho nội dung wizard thiết lập cố định. Nó tuân theo
locale của wizard CLI (OPENCLAW_LOCALE, rồi đến các biến locale hệ thống) và fallback
về tiếng Anh. Giữ văn bản thiết lập dành riêng cho Plugin trong mã do Plugin sở hữu và chỉ dùng
khóa catalog dùng chung cho nhãn thiết lập phổ biến, văn bản trạng thái, và nội dung thiết lập
Plugin đóng gói chính thức.
Các adapter vá thiết lập vẫn an toàn cho đường dẫn nóng khi import. Việc tra cứu bề mặt contract thăng cấp tài khoản đơn được đóng gói của chúng là lazy, nên import plugin-sdk/setup-runtime không tải háo hức quá trình khám phá bề mặt contract được đóng gói trước khi adapter thực sự được dùng.
Thăng cấp tài khoản đơn do kênh sở hữu
Khi một kênh nâng cấp từ cấu hình cấp cao nhất một tài khoản sang channels.<id>.accounts.*, hành vi dùng chung mặc định là chuyển các giá trị phạm vi tài khoản được thăng cấp vào accounts.default.
Các kênh được đóng gói có thể thu hẹp hoặc ghi đè việc thăng cấp đó thông qua bề mặt contract thiết lập của chúng:
singleAccountKeysToMove: các khóa cấp cao nhất bổ sung nên được chuyển vào tài khoản được thăng cấpnamedAccountPromotionKeys: khi các tài khoản có tên đã tồn tại, chỉ các khóa này được chuyển vào tài khoản được thăng cấp; các khóa policy/delivery dùng chung vẫn ở root của kênhresolveSingleAccountPromotionTarget(...): chọn tài khoản hiện có nào nhận các giá trị được thăng cấp
Schema cấu hình
Cấu hình Plugin được xác thực dựa trên JSON Schema trong manifest của bạn. Người dùng cấu hình Plugin qua:
{ plugins: { entries: { "my-plugin": { config: { webhookSecret: "abc123", }, }, }, },}Plugin của bạn nhận cấu hình này dưới dạng api.pluginConfig trong quá trình đăng ký.
Đối với cấu hình dành riêng cho kênh, hãy dùng phần cấu hình kênh thay thế:
{ channels: { "my-channel": { token: "bot-token", allowFrom: ["user1", "user2"], }, },}Xây dựng schema cấu hình kênh
Dùng buildChannelConfigSchema để chuyển schema Zod thành wrapper ChannelConfigSchema được dùng bởi các artifact cấu hình do Plugin sở hữu:
const accountSchema = z.object({ token: z.string().optional(), allowFrom: z.array(z.string()).optional(), accounts: z.object({}).catchall(z.any()).optional(), defaultAccount: z.string().optional(),}); const configSchema = buildChannelConfigSchema(accountSchema);Nếu bạn đã viết contract dưới dạng JSON Schema hoặc TypeBox, hãy dùng helper trực tiếp để OpenClaw có thể bỏ qua chuyển đổi Zod sang JSON Schema trên các đường dẫn metadata:
const configSchema = buildJsonChannelConfigSchema( Type.Object({ token: Type.Optional(Type.String()), allowFrom: Type.Optional(Type.Array(Type.String())), }),);Đối với Plugin bên thứ ba, contract đường dẫn lạnh vẫn là manifest Plugin: phản chiếu JSON Schema đã tạo vào openclaw.plugin.json#channelConfigs để schema cấu hình, thiết lập, và bề mặt UI có thể kiểm tra channels.<id> mà không tải mã runtime.
Wizard thiết lập
Plugin kênh có thể cung cấp wizard thiết lập tương tác cho openclaw onboard. Wizard là một đối tượng ChannelSetupWizard trên ChannelPlugin:
const setupWizard: ChannelSetupWizard = { channel: "my-channel", status: { configuredLabel: "Connected", unconfiguredLabel: "Not configured", resolveConfigured: ({ cfg }) => Boolean((cfg.channels as any)?.["my-channel"]?.token), }, credentials: [ { inputKey: "token", providerHint: "my-channel", credentialLabel: "Bot token", preferredEnvVar: "MY_CHANNEL_BOT_TOKEN", envPrompt: "Use MY_CHANNEL_BOT_TOKEN from environment?", keepPrompt: "Keep current token?", inputPrompt: "Enter your bot token:", inspect: ({ cfg, accountId }) => { const token = (cfg.channels as any)?.["my-channel"]?.token; return { accountConfigured: Boolean(token), hasConfiguredValue: Boolean(token), }; }, }, ],};Kiểu ChannelSetupWizard hỗ trợ credentials, textInputs, dmPolicy, allowFrom, groupAccess, prepare, finalize, và nhiều hơn nữa. Xem các gói Plugin được đóng gói sẵn (ví dụ Plugin Discord src/channel.setup.ts) để biết ví dụ đầy đủ.
Prompt allowFrom dùng chung
Đối với prompt danh sách cho phép DM chỉ cần luồng chuẩn note -> prompt -> parse -> merge -> patch, hãy ưu tiên các helper thiết lập dùng chung từ openclaw/plugin-sdk/setup: createPromptParsedAllowFromForAccount(...), createTopLevelChannelParsedAllowFromPrompt(...), và createNestedChannelParsedAllowFromPrompt(...).
Trạng thái thiết lập kênh chuẩn
Đối với các khối trạng thái thiết lập kênh chỉ khác nhau theo nhãn, điểm số, và các dòng bổ sung tùy chọn, hãy ưu tiên createStandardChannelSetupStatus(...) từ openclaw/plugin-sdk/setup thay vì tự tạo cùng đối tượng status trong từng Plugin.
Bề mặt thiết lập kênh tùy chọn
Đối với các bề mặt thiết lập tùy chọn chỉ nên xuất hiện trong một số ngữ cảnh nhất định, hãy dùng createOptionalChannelSetupSurface từ openclaw/plugin-sdk/channel-setup:
import { createOptionalChannelSetupSurface } from "openclaw/plugin-sdk/channel-setup"; const setupSurface = createOptionalChannelSetupSurface({ channel: "my-channel", label: "My Channel", npmSpec: "@myorg/openclaw-my-channel", docsPath: "/channels/my-channel",});// Returns { setupAdapter, setupWizard }plugin-sdk/channel-setup cũng expose các builder cấp thấp hơn createOptionalChannelSetupAdapter(...) và createOptionalChannelSetupWizard(...) khi bạn chỉ cần một nửa của bề mặt cài đặt tùy chọn đó.
Adapter/wizard tùy chọn được tạo sẽ đóng kín khi ghi cấu hình thật. Chúng tái sử dụng một thông báo yêu cầu cài đặt trên validateInput, applyAccountConfig, và finalize, đồng thời thêm liên kết tài liệu khi docsPath được đặt.
Helper thiết lập dựa trên binary
Đối với UI thiết lập dựa trên binary, hãy ưu tiên các helper ủy quyền dùng chung thay vì sao chép cùng phần gắn kết binary/trạng thái vào mọi kênh:
createDetectedBinaryStatus(...)cho các khối trạng thái chỉ khác nhau về nhãn, gợi ý, điểm số và phát hiện binarycreateCliPathTextInput(...)cho các ô nhập văn bản dựa trên đường dẫncreateDelegatedSetupWizardStatusResolvers(...),createDelegatedPrepare(...),createDelegatedFinalize(...)vàcreateDelegatedResolveConfigured(...)khisetupEntrycần chuyển tiếp lười sang một wizard đầy đủ nặng hơncreateDelegatedTextInputShouldPrompt(...)khisetupEntrychỉ cần ủy quyền quyết địnhtextInputs[*].shouldPrompt
Xuất bản và cài đặt
Plugin bên ngoài: xuất bản lên ClawHub, rồi cài đặt:
npm
openclaw plugins install @myorg/openclaw-my-pluginCác đặc tả gói trần sẽ cài đặt từ npm trong giai đoạn chuyển đổi khi ra mắt.
ClawHub only
openclaw plugins install clawhub:@myorg/openclaw-my-pluginnpm package spec
Dùng npm khi một gói chưa chuyển sang ClawHub, hoặc khi bạn cần một đường dẫn cài đặt npm trực tiếp trong quá trình di chuyển:
openclaw plugins install npm:@myorg/openclaw-my-pluginPlugin trong repo: đặt dưới cây workspace Plugin được đóng gói kèm và chúng sẽ tự động được phát hiện trong quá trình build.
Người dùng có thể cài đặt:
openclaw plugins install <package-name>Siêu dữ liệu gói đóng kèm là tường minh, không được suy luận từ JavaScript đã build khi gateway khởi động. Các phụ thuộc runtime thuộc về gói Plugin sở hữu chúng; quá trình khởi động OpenClaw đã đóng gói không bao giờ sửa chữa hoặc phản chiếu phụ thuộc của Plugin.
Liên quan
- Xây dựng Plugin — hướng dẫn bắt đầu từng bước
- Tệp kê khai Plugin — tài liệu tham khảo đầy đủ về schema tệp kê khai
- Điểm vào SDK —
definePluginEntryvàdefineChannelPluginEntry