能力字段
声明插件拥有什么以及激活规划器何时应加载它的清单字段。属于 插件清单 参考的一部分;顶层字段参考 列出了所有字段。
contracts 参考¶
仅将 contracts 用于静态能力所有权元数据,OpenClaw 可以在不导入插件运行时的情况下读取这些元数据。
contracts.codeModeExecutors 声明由插件的 code-mode-executor-api 公共工件提供的受支持执行器。插件当前实现 quickjs;另一个可选执行器 node 由核心拥有。插件的安装 ID 与此执行器 ID 是分开的。选择 QuickJS 只会加载其已获准的所有者。当插件被全局禁用或允许列表指定其他插件时,已选择的捆绑执行器仍保持可用,从而保留其先前的核心运行时可用性。显式的所有者拒绝或禁用条目仍会阻止选择;外部执行器遵循完整的插件策略。该工件使用 openclaw/plugin-sdk/code-mode-executor-runtime 契约导出 codeModeExecutor。它不会注册模型工具,也不会替换主机工具授权。参见 Code Mode 执行器。
{
"contracts": {
"agentToolResultMiddleware": ["openclaw", "codex"],
"trustedToolPolicies": ["workflow-budget"],
"externalAuthProviders": ["acme-ai"],
"embeddingProviders": ["openai-compatible"],
"decisionProviders": ["example-decisions"],
"speechProviders": ["openai"],
"realtimeTranscriptionProviders": ["openai"],
"realtimeVoiceProviders": ["openai"],
"mediaUnderstandingProviders": ["openai"],
"imageGenerationProviders": ["openai"],
"videoGenerationProviders": ["qwen"],
"musicGenerationProviders": ["stability-audio"],
"documentExtractors": ["example-docs"],
"webContentExtractors": ["firecrawl"],
"webFetchProviders": ["firecrawl"],
"webSearchProviders": ["gemini"],
"workerProviders": ["example-worker"],
"storageProviders": ["example-storage"],
"usageProviders": ["acme-ai"],
"migrationProviders": ["hermes"],
"gatewayMethodDispatch": ["authenticated-request"],
"tools": ["firecrawl_search", "firecrawl_scrape"]
}
}
每个列表都是可选的。对于 speechProviders 和 realtimeVoiceProviders,请首先列出标准提供程序 ID,然后列出限定于该能力的任何别名:
| 字段 | 类型 | 含义 |
|---|---|---|
embeddedExtensionFactories |
string[] |
Codex app-server 扩展工厂 ID。codex-app-server 是唯一接受的 ID。 |
agentToolResultMiddleware |
string[] |
此插件可以为其注册工具结果中间件的运行时 ID。 |
trustedToolPolicies |
string[] |
已安装插件可以注册的插件本地受信工具前策略 ID。捆绑插件可以无需此字段注册策略。 |
externalAuthProviders |
string[] |
此插件拥有的外部身份验证配置文件钩子的提供程序 ID。 |
embeddingProviders |
string[] |
此插件拥有的通用嵌入提供程序 ID,用于可重用的向量嵌入用途,包括内存。 |
decisionProviders |
string[] |
通过 api.registerDecisionProvider 注册的类型化决策提供程序;通过 decisionModel 选择。 |
speechProviders |
string[] |
此插件拥有的语音提供程序 ID。 |
realtimeTranscriptionProviders |
string[] |
此插件拥有的实时转录提供程序 ID。 |
realtimeVoiceProviders |
string[] |
此插件拥有的实时语音提供程序 ID。 |
mediaUnderstandingProviders |
string[] |
此插件拥有的媒体理解提供程序 ID。 |
transcriptSourceProviders |
string[] |
此插件拥有的转录源提供程序 ID。 |
documentExtractors |
string[] |
此插件拥有的文档(例如 PDF)提取器提供程序 ID。 |
imageGenerationProviders |
string[] |
此插件拥有的图像生成提供程序 ID。 |
videoGenerationProviders |
string[] |
此插件拥有的视频生成提供程序 ID。 |
musicGenerationProviders |
string[] |
此插件拥有的音乐生成提供程序 ID。 |
webContentExtractors |
string[] |
此插件拥有的网页内容提取提供程序 ID。 |
webFetchProviders |
string[] |
此插件拥有的网页抓取提供程序 ID。 |
webSearchProviders |
string[] |
此插件拥有的网页搜索提供程序 ID。 |
workerProviders |
string[] |
此插件拥有的云工作器提供方 ID,用于预置和基于配置文件的租约生命周期。 |
storageProviders |
string[] |
通过 api.registerStorageProvider 注册的存储传输 ID;由命名的存储位置选择。 |
usageProviders |
string[] |
此插件拥有其 usage-auth 和 usage-snapshot 钩子的提供方 ID。 |
migrationProviders |
string[] |
此插件拥有、用于 openclaw migrate 的导入提供方 ID。 |
gatewayMethodDispatch |
string[] |
为通过进程内分发 Gateway 方法的已认证插件 HTTP 路由保留的授权项。 |
tools |
string[] |
此插件拥有的代理工具名称。 |
文档提取器可以随其文本和图像返回可选的完整性元数据。pages.processed 是实际处理的、以 1 为基数的页码的有界列表;pages.total 是文档页数;pages.selection 区分自动限制与显式请求;pages.truncated、textTruncated 和 imagesTruncated 报告已知的省略情况。maxPages 是数量上限;自动页面选择仍归提取器所有,而 pageNumbers 限制显式选择。当提取器无法确定这些事实时,请省略 metadata;不要在下游推断完整性。
contracts.embeddedExtensionFactories 保留用于捆绑的、仅限 Codex 应用服务器的扩展工厂。捆绑的工具结果转换应改为声明 contracts.agentToolResultMiddleware,并通过 api.registerAgentToolResultMiddleware(...) 注册。已安装插件只有在显式启用时,并且仅针对它们在 contracts.agentToolResultMiddleware 中声明的运行时,才可以使用同一中间件接缝。
需要主机信任的 pre-tool 策略层的已安装插件,必须在 contracts.trustedToolPolicies 中声明每个已注册的本地 ID,并被显式启用。捆绑插件保留现有的受信任策略路径,但已安装插件若包含未声明的策略 ID,将在注册前被拒绝。策略 ID 作用于注册该策略的插件,因此两个插件可以同时声明并注册 workflow-budget;但单个插件不能两次注册相同的本地 ID。
Runtime 的 api.registerTool(...) 注册必须与 contracts.tools 匹配。工具发现使用该列表仅加载能够拥有所请求工具的插件运行时。
实现 resolveExternalAuthProfiles 的提供方插件应声明 contracts.externalAuthProviders;未声明的 external-auth 钩子会被忽略。
实现 resolveUsageAuth 和 fetchUsageSnapshot 的提供方插件应在 contracts.usageProviders 中声明每个自动发现的提供方 ID。用量发现在加载运行时代码之前读取该契约,然后在仅加载已声明属主之后验证这两个钩子。
嵌入提供方必须为通过 api.registerEmbeddingProvider(...) 注册的每个适配器声明 contracts.embeddingProviders。这一通用契约同时服务于可复用的向量生成和记忆搜索。已退役的 contracts.memoryEmbeddingProviders 键不再被接受。
存储提供方必须为通过 api.registerStorageProvider(...) 注册的每个 ID 在 contracts.storageProviders 中声明。核心保留 filesystem。storage.locations 中的配置引用会通过此声明自动启用捆绑属主;显式禁用和拒绝规则仍然适用。外部提供方需要显式启用插件。请参阅 存储提供方契约。
工作器提供方必须为通过 api.registerWorkerProvider(...) 注册的每个 ID 在 contracts.workerProviders 中声明。注册要求提供 resolveAllocation、provision、inspect 和 destroy。分配解析器返回精确的操作清理句柄和显式的共享主机事实,而不会创建或准备机器;请参阅 工作器提供方契约。核心在调用 provision 之前持久化持久意图;提供方在外部分配之前验证其设置以及可选的每分发 machineClass 和 executionMode,并且对同一操作 ID 的重复调用必须采用相同的租约,且不更改所选模式。提供方可以实现异步的 listMachineOptions(profile) 以公开进程稳定的选择器元数据;当机器选择没有意义时,应省略该项。机器选项仅包含 id、label、可选的正整数 cpu 和 memoryGb,以及可选的 default。会话放置提供方声明一个封闭、唯一、按规范顺序排列的 supportedExecutionModes 元组:["worker-turn"]、["remote-exec"] 或 ["worker-turn", "remote-exec"]。空列表、重复项、未知值和非规范顺序都会被拒绝。worker-turn 需要节点租约;remote-exec 接受节点租约或 SSH 租约。省略表示不声明任何会话放置模式,同时仍提供直接生命周期操作。直接环境创建不提供会话执行模式;提供方使用其文档记录的默认值,即 Crabbox 的 worker-turn。提供方的有界预置超过核心的五分钟默认值时,可以实现 resolveProvisionTimeoutMs(profile),并将获取、提供方自身的设置和清理纳入返回的正毫秒预算中。可选的 resolveDestroyTimeoutMs(profile) 为请求的拆除和引导失败清理提供同等预算,包括在确认释放之前捕获快照。这两个钩子都必须返回平台定时器限制内的正安全整数;显式服务超时覆盖具有更高优先级。核心还会持久化已验证的设置快照,并将其与 leaseId 一起传递给 inspect({ leaseId, profile }) 和 destroy({ leaseId, profile }),包括在命名配置文件被更改或移除之后。销毁是幂等的;检查返回封闭的 active / dormant / destroyed / unknown 状态并集;SSH 私钥材料仅通过 SecretRef 引用。预置的 SSH 端点还必须包含来自可信预置输出的公钥 hostKey,其格式必须精确为 algorithm base64,不含主机名或注释,以便核心在连接前固定主机。它们可以包含最多 10 个有序且唯一的 fallbackPorts,不包括主 port;核心会持久化这些候选,并且仅在幂等探测、内容寻址传输、收据/锁保护的构件安装、收敛的托管工作树镜像以及隧道重连时在它们之间轮换。有歧义且无防护的状态命令会失败关闭,并且不会在候选之间重放。当 SSH 账户还拥有无关进程时,租约可以设置 sharedHost: true;核心随后在工作区协调期间避免冻结整个主机的进程。省略或设为 false 表示专用工作器主机。活动检查会重复报告该事实,以便核心为该字段存在之前已持久化的租约协调提供方拥有的隔离;隧道启动会等待第一次权威检查。可选的桌面元数据可声明最多八个唯一的封闭应用:browser(包含绝对 executablePath 和 1 到 65535 之间的 CDP 端口),或 terminal(包含绝对 executablePath)。核心会拒绝未知的应用 ID 和字段,并将验证后的元数据与现有桌面记录一起持久化。生成动态身份引用的提供方可以实现权威的 resolveSshIdentity({ leaseId, profile, keyRef });未实现该方法的提供方使用核心的通用密钥解析器。权威的 unknown 会隔离环境并进入规范拆除流程;它不会绕过在共享或未知主机上所需的精确工作器停止确认。
contracts.gatewayMethodDispatch 接受单个值,"authenticated-request"。它是针对已认证的原生插件 HTTP 路由和已注册的 RPC 处理器的 API 卫生门禁,这些处理器有意在进程内分发 Gateway 方法;它不是针对恶意原生插件的沙箱。分发会保留原始已认证客户端和配置文件,应用目标方法的作用域,并且从不创建合成调用者。仅将其用于经过严格审查的接口。RPC 处理器仍会通过普通 Gateway 准入;此契约不会添加任何暂停绕过。当 Gateway root-work 准入关闭时,授权路由只有在同时声明 auth: "gateway" 和路由特定的 gatewayRuntimeScopeSurface: "trusted-operator" 时才可保持可达;来自同一插件的普通同级路由仍位于准入边界之后。这使暂停状态和恢复保持可达,而不会向整个插件授予准入绕过。在分发之外保持解析和响应整形有界;实质性或变更性工作必须通过 Gateway 方法分发,该分发负责准入和作用域执行。
Worker 提供程序可以在其桌面端点可安全调整大小时设置 allowsDesktopResize: true,例如专用虚拟显示器。省略或 false 不会授予权限。端点可以使用 allowsResize: false 进一步限制此提供程序范围的权限,例如用于原生显示器。Core 会将此事实作为可选 canResize 携带在 SSH 和 node 传输的桌面观察结果中。这是请求调整大小的权限,而不是协商的 VNC 支持。查看器在请求调整大小之前还必须持有控制并完成身份验证。
决策模型参考¶
将 decisionModels 声明为 contracts.decisionProviders 所拥有的提供程序的静态选择器元数据。这些条目独立于对话式
modelCatalog 和 providers 元数据。发现读取清单,而不会
加载提供程序运行时或解析凭据。
{
"contracts": { "decisionProviders": ["example-decisions"] },
"decisionModels": [
{
"provider": "example-decisions",
"id": "fast",
"name": "Fast decisions",
"capabilities": {
"questionTypes": ["boolean", "choice", "score"],
"maxQuestions": 32,
"maxChoiceAlternatives": 64,
"maxScoreLevels": 16,
"maxInputTokens": 8192,
"inputTokenScope": "encoded-question",
"requiresBooleanCriteria": true,
"confidence": "provider-specific"
}
}
]
}
每个条目需要提供程序 ID、模型 ID 和显示名称。选择器使用
example-decisions/fast。已禁用的插件会从决策选择器中排除;
已保存的不可用选择仍会显示,供操作员修复。
capabilities 是可选静态元数据。它描述提供程序对
发现和引导的支持;它不能证明凭据或运行时已就绪,
其限制也不会提高 OpenClaw 的主机准入边界。
| 字段 | 必需 | 接受的值 | 省略语义 |
|---|---|---|---|
questionTypes |
是 | 非空数组,最多包含 boolean、choice 和 score 中的三个 |
当此字段缺失或无效时,整个 capabilities 对象会被省略;重复项会被移除。 |
maxQuestions |
否 | 正的安全整数 | 不声明提供程序特定的问题限制。 |
maxChoiceAlternatives |
否 | 正的安全整数 | 不声明提供程序特定的 Choice 备选限制。 |
maxScoreLevels |
否 | 正的安全整数 | 不声明提供程序特定的 Score 级别限制。 |
maxInputTokens |
否 | 正的安全整数 | 不声明提供程序特定的输入 Token 限制。 |
inputTokenScope |
否 | encoded-question 或 state-plus-each-criterion |
提供程序未声明如何计算 maxInputTokens。 |
requiresBooleanCriteria |
否 | 布尔值 | 不声明额外的 Boolean 标准需求。 |
confidence |
否 | provider-specific 或 none |
不声明置信度结果语义。 |
encoded-question 表示提供程序计算其编码请求,包括
提供程序添加的评分标准开销。state-plus-each-criterion 表示共享
状态与每次标准评估一起计算。provider-specific 置信度
是提供程序指标,而不是答案正确的校准概率;
none 声明提供程序不返回置信度。
格式错误的可选字段和未知字段会分别被忽略。
格式错误的 questionTypes 值会移除整个能力描述符,但不会
移除模型条目。重复的 provider/id 条目会保留第一个有效的
模型描述符。
工具元数据参考¶
toolMetadata 使用与生成提供程序元数据相同的 configSignals 和 authSignals 形状,以工具名称为键。contracts.tools 声明所有权。toolMetadata 声明低成本的可用性证据,以便 OpenClaw 可以避免仅为了让其工具工厂返回 null 而导入插件运行时。
{
"setup": {
"providers": [
{
"id": "example",
"envVars": ["EXAMPLE_API_KEY"]
}
]
},
"contracts": {
"tools": ["example_search"]
},
"toolMetadata": {
"example_search": {
"profiles": ["coding", "full"],
"authSignals": [
{
"provider": "example"
}
],
"configSignals": [
{
"rootPath": "plugins.entries.example.config",
"overlayPath": "search",
"required": ["apiKey"]
}
]
}
}
}
toolMetadata 条目还接受:
profiles:内置工具 profile,默认公开插件工具。有效值为minimal、coding、messaging和full。这些贡献会合并到相应 profile 的允许列表中;显式操作员允许列表和拒绝规则仍具有权威性。optional:将工具标记为插件激活时非必需。replaySafe:将工具执行标记为在不完整的模型轮次之后可安全重复。sideEffecting:将执行标记为可能更改持久或外部状态。
这些字段补充上述共享的 configSignals 和 authSignals 字段。
如果工具没有 toolMetadata,OpenClaw 会保留现有行为,并在工具契约匹配策略时加载所属插件。对于其工厂依赖身份验证/配置的热路径工具,插件作者应声明 toolMetadata,而不是让核心导入运行时进行询问。
激活参考¶
当插件可以低成本地声明哪些控制平面事件应将其包含在激活/加载计划中时,使用 activation。
此块是规划器元数据,而不是生命周期 API。它不会注册运行时行为,不会替代 register(...),也不保证插件代码已经执行。激活规划器使用这些字段在回退到现有清单所有权元数据(例如 providers、channels、commandAliases、setup.providers、contracts.tools 和 hooks)之前,缩小候选插件范围。
优先使用已经描述所有权的范围最窄的元数据。当 providers、channels、commandAliases、setup 描述符或 contracts 这些字段能够表达该关系时,使用它们。对于无法由这些所有权字段表示的额外规划器提示,使用 activation。对于 CLI 运行时别名(例如 claude-cli、my-cli 或 google-gemini-cli),使用顶层 cliBackends;activation.onAgentHarnesses 仅用于尚未拥有所有权字段的嵌入式代理 harness id。
每个插件都应有意设置 activation.onStartup。仅当插件必须在 Gateway 启动期间运行时,才将其设置为 true。当插件在启动时处于非活动状态,并且应仅由更窄的触发器加载时,将其设置为 false。省略 onStartup 不再隐式地在启动时加载插件;对于启动、通道、配置、代理 harness、内存或其他更窄的激活触发器,请使用显式激活元数据。
{
"activation": {
"onStartup": false,
"onProviders": ["openai"],
"onCommands": ["models"],
"onChannels": ["web"],
"onRoutes": ["gateway-webhook"],
"onConfigPaths": ["browser"],
"onCapabilities": ["provider", "tool"]
}
}
| 字段 | 是否必需 | 类型 | 含义 |
|---|---|---|---|
onStartup |
否 | boolean |
显式 Gateway 启动激活。每个插件都应设置此项。true 会在启动期间导入插件;false 会保持其启动惰性,除非另一个匹配的触发器要求加载。 |
onProviders |
否 | string[] |
应使此插件包含在激活/加载计划中的 provider id。 |
onAgentHarnesses |
否 | string[] |
应使此插件包含在激活/加载计划中的嵌入式代理 harness 运行时 id。对于 CLI 后端别名,请使用顶层 cliBackends。 |
onCommands |
否 | string[] |
应使此插件包含在激活/加载计划中的命令 id。 |
onChannels |
否 | string[] |
应使此插件包含在激活/加载计划中的通道 id。 |
onRoutes |
否 | string[] |
应使此插件包含在激活/加载计划中的路由类型。 |
onConfigPaths |
否 | string[] |
相对于根的配置路径;当路径存在且未被显式禁用时,应使此插件包含在启动/加载计划中。 |
onCapabilities |
否 | Array<"provider" \| "channel" \| "tool" \| "hook"> |
用于控制平面激活规划的宽泛能力提示。尽可能使用更窄的字段。 |
| 字段 | 是否必填 | 类型 | 含义 |
|---|---|---|---|
激活规划器的使用方:
- 网关启动规划使用
activation.onStartup进行显式启动导入。 - 命令触发的 CLI 规划会回退到旧版
commandAliases[].cliCommand或commandAliases[].name。 - Agent 运行时启动规划使用
activation.onAgentHarnesses处理嵌入式 harness,并使用顶层cliBackends[]处理 CLI 运行时别名。 - 通道触发的设置/通道规划在缺少显式通道激活元数据时,会回退到旧版
channels[]归属。 - 启动插件规划使用
activation.onConfigPaths处理非通道的根配置表面,例如捆绑浏览器插件的browser块。 - 提供者触发的设置/运行时规划在缺少显式提供者激活元数据时,会回退到旧版
providers[]和顶层cliBackends[]归属。
规划器诊断可以区分显式激活提示与清单归属回退。例如,activation-command-hint 表示 activation.onCommands 匹配,而 manifest-command-alias 表示规划器改用了 commandAliases 归属。这些原因标签用于宿主诊断和测试;插件作者应继续声明最能描述归属的元数据。加载流水线 参考文档是规划器收窄步骤和完整原因标签表的权威依据。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/openclaw