快速开始
插件设置和配置
打包插件(package.json 元数据)、清单(openclaw.plugin.json)、设置入口和配置 schema 的参考。
包元数据
你的 package.json 需要一个 openclaw 字段,用来告诉插件系统你的插件提供了什么:
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",
"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 字段
extensionsstring[]入口点文件(相对于包根目录)。
setupEntrystring轻量的仅设置入口(可选)。
channelobject用于设置、选择器、快速开始和 Status 界面的渠道目录元数据。
providersstring[]此插件注册的提供商 ID。
installobject安装提示:npmSpec、localPath、defaultChoice、minHostVersion、expectedIntegrity、allowInvalidConfigRecovery。
startupobject启动行为标志。
openclaw.channel
openclaw.channel 是用于在运行时加载前进行渠道发现和设置界面的低成本包元数据。
| 字段 | 类型 | 含义 |
|---|---|---|
id |
string |
规范渠道 ID。 |
label |
string |
主渠道标签。 |
selectionLabel |
string |
当需要不同于 label 时使用的选择器/设置标签。 |
detailLabel |
string |
用于更丰富渠道目录和 Status 界面的次要详情标签。 |
docsPath |
string |
用于设置和选择链接的文档路径。 |
docsLabel |
string |
当需要不同于渠道 ID 时,用于文档链接的覆盖标签。 |
blurb |
string |
简短的新手引导/目录描述。 |
order |
number |
渠道目录中的排序顺序。 |
aliases |
string[] |
用于渠道选择的额外查找别名。 |
preferOver |
string[] |
此渠道应优先于的较低优先级插件/渠道 ID。 |
systemImage |
string |
用于渠道 UI 目录的可选图标/系统图像名称。 |
selectionDocsPrefix |
string |
选择界面中文档链接前的前缀文本。 |
selectionDocsOmitLabel |
boolean |
在选择文案中直接显示文档路径,而不是带标签的文档链接。 |
selectionExtras |
string[] |
追加到选择文案中的额外短字符串。 |
markdownCapable |
boolean |
将该渠道标记为支持 markdown,以用于出站格式化决策。 |
exposure |
object |
用于设置、已配置列表和文档界面的渠道可见性控制。 |
quickstartAllowFrom |
boolean |
让此渠道加入标准快速开始 allowFrom 设置流程。 |
forceAccountBinding |
boolean |
即使只存在一个账号,也要求显式绑定账号。 |
preferSessionLookupForAnnounceTarget |
boolean |
为此渠道解析公告目标时优先使用会话查找。 |
示例:
{
"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 支持:
configured:在已配置/Status 样式的列表界面中包含该渠道setup:在交互式设置/配置选择器中包含该渠道docs:在文档/导航界面中将该渠道标记为面向公众
openclaw.install
openclaw.install 是包元数据,不是清单元数据。
| 字段 | 类型 | 含义 |
|---|---|---|
clawhubSpec |
string |
用于安装/更新和新手引导按需安装流程的规范 ClawHub 规范。 |
npmSpec |
string |
用于安装/更新回退流程的规范 npm 规范。 |
localPath |
string |
本地开发或内置安装路径。 |
defaultChoice |
"clawhub" | "npm" | "local" |
当多个来源可用时的首选安装来源。 |
minHostVersion |
string |
支持的最低 OpenClaw 版本,格式为 >=x.y.z 或 >=x.y.z-prerelease。 |
expectedIntegrity |
string |
用于固定安装的预期 npm 分发完整性字符串,通常为 sha512-...。 |
allowInvalidConfigRecovery |
boolean |
允许内置插件重新安装流程从特定的陈旧配置失败中恢复。 |
Onboarding behavior
交互式新手引导也会将 openclaw.install 用于按需安装界面。如果你的插件在运行时加载前暴露提供商凭证选项或渠道设置/目录元数据,新手引导可以显示该选项,提示选择 ClawHub、npm 或本地安装,安装或启用插件,然后继续所选流程。ClawHub 新手引导选项使用 clawhubSpec,并在存在时优先使用;npm 选项需要带有注册表 npmSpec 的受信任目录元数据;精确版本和 expectedIntegrity 是可选的 npm 固定项。如果存在 expectedIntegrity,安装/更新流程会对 npm 强制执行它。将“要显示什么”的元数据放在 openclaw.plugin.json 中,将“如何安装它”的元数据放在 package.json 中。
minHostVersion enforcement
如果设置了 minHostVersion,安装和非内置清单注册表加载都会强制执行它。较旧的宿主会跳过外部插件;无效的版本字符串会被拒绝。内置源码插件被假定与宿主检出版本一致。
Pinned npm installs
对于固定的 npm 安装,请在 npmSpec 中保留精确版本,并添加预期的构件完整性:
{
"openclaw": {
"install": {
"npmSpec": "@wecom/[email protected]",
"expectedIntegrity": "sha512-REPLACE_WITH_NPM_DIST_INTEGRITY",
"defaultChoice": "npm"
}
}
}
allowInvalidConfigRecovery scope
allowInvalidConfigRecovery 不是针对损坏配置的通用绕过。它只用于狭窄的内置插件恢复场景,因此重新安装/设置可以修复已知升级遗留问题,例如缺失的内置插件路径,或同一插件的陈旧 channels.<id> 条目。如果配置因无关原因损坏,安装仍会安全失败,并提示操作员运行 openclaw doctor --fix。
延迟完整加载
渠道插件可以通过以下配置选择延迟加载:
{
"openclaw": {
"extensions": ["./index.ts"],
"setupEntry": "./setup-entry.ts",
"startup": {
"deferConfiguredChannelFullLoadUntilAfterListen": true
}
}
}
启用后,即使对于已配置的渠道,OpenClaw 在预监听启动阶段也只加载 setupEntry。完整入口会在 Gateway 网关开始监听后加载。
如果你的设置/完整入口注册 Gateway 网关 RPC 方法,请将它们放在插件专属前缀下。保留的核心管理命名空间(config.*、exec.approvals.*、wizard.*、update.*)仍归核心所有,并且始终解析到 operator.admin。
插件清单
每个原生插件都必须在包根目录附带 openclaw.plugin.json。OpenClaw 使用它在不执行插件代码的情况下验证配置。
{
"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"
}
}
}
}
对于渠道插件,添加 kind 和 channels:
{
"id": "my-channel",
"kind": "channel",
"channels": ["my-channel"],
"configSchema": {
"type": "object",
"additionalProperties": false,
"properties": {}
}
}
即使没有配置的插件也必须附带 schema。空 schema 是有效的:
{
"id": "my-plugin",
"configSchema": {
"type": "object",
"additionalProperties": false
}
}
完整 schema 参考见 插件清单。
ClawHub 发布
对于插件包,使用包专属的 ClawHub 命令:
clawhub package publish your-org/your-plugin --dry-run
clawhub package publish your-org/your-plugin
设置入口
setup-entry.ts 文件是 index.ts 的轻量替代方案,OpenClaw 仅需要设置表面(新手引导、配置修复、已禁用渠道检查)时会加载它。
// setup-entry.ts
export default defineSetupPluginEntry(myChannelPlugin);
这样可以避免在设置流程中加载较重的运行时代码(加密库、CLI 注册、后台服务)。
将设置安全导出保存在旁路模块中的内置工作区渠道,可以使用来自 openclaw/plugin-sdk/channel-entry-contract 的 defineBundledChannelSetupEntry(...),而不是 defineSetupPluginEntry(...)。该内置契约还支持可选的 runtime 导出,因此设置时的运行时接线可以保持轻量且显式。
OpenClaw 何时使用 setupEntry 而不是完整入口
- 渠道已禁用,但需要设置/新手引导表面。
- 渠道已启用,但尚未配置。
- 已启用延迟加载(
deferConfiguredChannelFullLoadUntilAfterListen)。
setupEntry 必须注册什么
- 渠道插件对象(通过
defineSetupPluginEntry)。 - Gateway 网关监听前所需的任何 HTTP 路由。
- 启动期间所需的任何 Gateway 网关方法。
这些启动 Gateway 网关方法仍应避免使用保留的核心管理命名空间,例如 config.* 或 update.*。
setupEntry 不应包含什么
- CLI 注册。
- 后台服务。
- 较重的运行时导入(加密、SDK)。
- 仅在启动后才需要的 Gateway 网关方法。
窄范围设置辅助导入
对于热路径的仅设置路径,如果你只需要设置表面的一部分,请优先使用窄范围设置辅助接缝,而不是更宽泛的 plugin-sdk/setup 总入口:
| 导入路径 | 用途 | 关键导出 |
|---|---|---|
plugin-sdk/setup-runtime |
在 setupEntry / 延迟渠道启动中保持可用的设置时运行时辅助工具 |
createPatchedAccountSetupAdapter, createEnvPatchedAccountSetupAdapter, createSetupInputPresenceValidator, noteChannelLookupFailure, noteChannelLookupSummary, promptResolvedAllowFrom, splitSetupEntries, createAllowlistSetupWizardProxy, createDelegatedSetupWizardProxy |
plugin-sdk/setup-adapter-runtime |
感知环境的账号设置适配器 | createEnvPatchedAccountSetupAdapter |
plugin-sdk/setup-tools |
设置/安装 CLI/归档/文档辅助工具 | formatCliCommand, detectBinary, extractArchive, resolveBrewExecutable, formatDocsLink, CONFIG_DIR |
当你想要完整的共享设置工具箱(包括 moveSingleAccountChannelSectionToDefaultAccount(...) 等配置补丁辅助工具)时,请使用更宽泛的 plugin-sdk/setup 接缝。
设置补丁适配器在导入时保持热路径安全。其内置单账号提升契约表面查找是惰性的,因此导入 plugin-sdk/setup-runtime 不会在适配器实际使用前急切加载内置契约表面发现。
渠道拥有的单账号提升
当某个渠道从单账号顶层配置升级到 channels.<id>.accounts.* 时,默认共享行为会将提升后的账号范围值移动到 accounts.default。
内置渠道可以通过它们的设置契约表面缩小或覆盖该提升:
singleAccountKeysToMove:应移动到提升账号中的额外顶层键namedAccountPromotionKeys:当具名账号已存在时,只有这些键会移动到提升账号中;共享策略/投递键保留在渠道根部resolveSingleAccountPromotionTarget(...):选择哪个现有账号接收提升值
配置架构
插件配置会根据你的清单中的 JSON Schema 进行验证。用户通过以下方式配置插件:
{
plugins: {
entries: {
"my-plugin": {
config: {
webhookSecret: "abc123",
},
},
},
},
}
你的插件会在注册期间以 api.pluginConfig 接收此配置。
对于渠道特定配置,请改用渠道配置部分:
{
channels: {
"my-channel": {
token: "bot-token",
allowFrom: ["user1", "user2"],
},
},
}
构建渠道配置架构
使用 buildChannelConfigSchema 将 Zod 架构转换为插件拥有的配置工件使用的 ChannelConfigSchema 包装器:
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);
如果你已经以 JSON Schema 或 TypeBox 编写契约,请使用直接辅助工具,这样 OpenClaw 就可以在元数据路径上跳过 Zod 到 JSON Schema 的转换:
const configSchema = buildJsonChannelConfigSchema(
Type.Object({
token: Type.Optional(Type.String()),
allowFrom: Type.Optional(Type.Array(Type.String())),
}),
);
对于第三方插件,冷路径契约仍然是插件清单:将生成的 JSON Schema 镜像到 openclaw.plugin.json#channelConfigs,这样配置架构、设置和 UI 表面无需加载运行时代码即可检查 channels.<id>。
设置向导
渠道插件可以为 openclaw onboard 提供交互式设置向导。该向导是 ChannelPlugin 上的 ChannelSetupWizard 对象:
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),
};
},
},
],
};
ChannelSetupWizard 类型支持 credentials、textInputs、dmPolicy、allowFrom、groupAccess、prepare、finalize 等。完整示例请参阅内置插件包(例如 Discord 插件的 src/channel.setup.ts)。
共享 allowFrom 提示
对于只需要标准 note -> prompt -> parse -> merge -> patch 流程的私信允许列表提示,请优先使用来自 openclaw/plugin-sdk/setup 的共享设置辅助工具:createPromptParsedAllowFromForAccount(...)、createTopLevelChannelParsedAllowFromPrompt(...) 和 createNestedChannelParsedAllowFromPrompt(...)。
标准渠道设置状态
对于仅因标签、分数和可选额外行而不同的渠道设置状态块,请优先使用来自 openclaw/plugin-sdk/setup 的 createStandardChannelSetupStatus(...),而不是在每个插件中手写相同的 status 对象。
可选渠道设置表面
对于只应在特定上下文中显示的可选设置表面,请使用来自 openclaw/plugin-sdk/channel-setup 的 createOptionalChannelSetupSurface:
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 还公开了更底层的 createOptionalChannelSetupAdapter(...) 和 createOptionalChannelSetupWizard(...) 构建器。
生成的可选适配器/向导会对真实配置写入采取失败关闭策略。它们在 validateInput、applyAccountConfig 和 finalize 中复用同一条需要安装的消息,并在设置了 docsPath 时追加文档链接。
二进制支持的设置辅助工具
对于二进制支持的设置 UI,请优先使用共享委托辅助工具,而不是将相同的二进制/状态粘合代码复制到每个渠道中:
createDetectedBinaryStatus(...)用于只因标签、提示、分数和二进制检测而变化的状态块createCliPathTextInput(...)用于路径支持的文本输入- 当
setupEntry需要惰性转发到较重的完整向导时,使用createDelegatedSetupWizardStatusResolvers(...)、createDelegatedPrepare(...)、createDelegatedFinalize(...)和createDelegatedResolveConfigured(...) - 当
setupEntry只需要委托textInputs[*].shouldPrompt决策时,使用createDelegatedTextInputShouldPrompt(...)
发布和安装
**外部插件:**发布到 ClawHub,然后安装:
npm
openclaw plugins install @myorg/openclaw-my-plugin
在启动切换期间,裸包规格会从 npm 安装。
仅 ClawHub
openclaw plugins install clawhub:@myorg/openclaw-my-plugin
npm 包规格
当某个包尚未迁移到 ClawHub,或你在迁移期间需要直接的 npm 安装路径时,请使用 npm:
openclaw plugins install npm:@myorg/openclaw-my-plugin
仓库内插件: 放在内置插件工作区树下,它们会在构建期间自动被发现。
用户可以安装:
openclaw plugins install <package-name>
内置包元数据是显式的,不会在 Gateway 网关启动时从已构建的 JavaScript 中推断。运行时依赖应放在拥有它们的插件包中;打包版 OpenClaw 启动时绝不会修复或镜像插件依赖。