能力注册
OpenClawPluginApi 上的能力注册器,以及 worker 或 embedding 提供商必须满足的运行时契约。Plugin SDK overview 的一部分。
能力注册¶
| 方法 | 注册内容 |
|---|---|
api.registerProvider(...) |
文本推理(LLM) |
api.registerWorkerProvider(...) |
云 worker 生命周期租约 |
api.registerModelCatalogProvider(...) |
用于文本和媒体生成的模型目录行 |
api.registerAgentHarness(...) |
实验性 原生 agent 执行器(Codex、Copilot) |
api.registerCliBackend(...) |
本地 CLI 推理后端 |
api.registerChannel(...) |
消息通道 |
api.registerEmbeddingProvider(...) |
可复用的向量 embedding 提供商 |
api.registerSpeechProvider(...) |
文本转语音 / STT 合成 |
api.registerRealtimeTranscriptionProvider(...) |
流式实时转录 |
api.registerRealtimeVoiceProvider(...) |
全双工实时语音会话 |
api.registerMediaUnderstandingProvider(...) |
图像/音频/视频分析 |
api.registerTranscriptSourceProvider(...) |
实时或导入的会议转录源 |
api.registerImageGenerationProvider(...) |
图像生成 |
api.registerMusicGenerationProvider(...) |
音乐生成 |
api.registerVideoGenerationProvider(...) |
视频生成 |
api.registerWebFetchProvider(...) |
Web 抓取 / 爬取提供商 |
api.registerWebSearchProvider(...) |
Web 搜索 |
api.registerCompactionProvider(...) |
可插拔的转录压缩后端 |
与入站通道共享账户命名空间的转录源提供商,必须声明一个 accountOwnership 描述符,其中包含该通道 id 和一个规范账户解析器。随后,OpenClaw 会忽略同通道捕获中由模型选择的账户 id,绑定受信任的入站账户,并将其记录为会话所有者,用于后续生命周期操作。该解析器还会在 OpenClaw 启动或持久化实时捕获之前选择一个被省略的账户。它会验证已绑定的受信任账户,而不会将其重定向;当不存在唯一具备能力的账户时,返回可操作的类型化错误。已配置的自动启动必须提供非空的源账户,或使用该描述符解析出一个账户。OpenClaw 会在持久化启动或调用提供商之前,拒绝模糊或未解析的所有权。提供商别名仅作为查找名称,不得用于此声明。
Worker 提供商¶
Worker 提供商还必须将其 id 声明在 contracts.workerProviders 中。
可选的同步 resolveDisplayId(profile) 钩子为选择器展示提供一个非机密的后端显示 ID。返回值应为 1–64 个小写 ASCII 字母、数字或连字符,且以字母开头(例如,aws)。请从本地已验证的设置中派生它;不要为品牌展示而运行命令、读取凭据或发起网络调用。现有的 profile 目录会将其作为外观事实与提供商/设置快照一起缓存。缺失、无效或抛出异常的元数据会被省略,而不会隐藏 profile 或其机器选项。environments.list 会将其投影为可选的 providerDisplayId,而不会投影设置。路由 providerId、profile ID、权限和分配行为保持不变。Crabbox 使用其已验证的后端提供商,因此名为 production 的 profile 可以显示 AWS,而无需根据其名称猜测。
提供商可以实现 maintain({ profiles, signal, assertCurrent }),用于有界的清理,且必须在没有活动租约时继续执行。Gateway 会针对已启用、已配置的提供商,从其现有的周期性 worker 扫描中调用它,该调用独立于分配和协调等待。profiles 包含提供商当前已配置 profile 的克隆设置。在外部副作用之前立即调用 assertCurrent(),并在持久化变更之前、等待的工作完成后调用它;当调用结束、其配置或注册发生变化,或 Gateway 停止时,权限即结束。请遵守 signal,并且仅在拥有的命令停止后才结束。提供商的插件服务在代际替换期间也必须取消并排空维护。该钩子不得分配运行容量,也不得将维护视作用户需求;保留和清理策略仍由提供商负责。
核心在 provision(profile, operationId, options?) 之前持久化持久化意图。提供商在外部分配之前验证设置以及任何可选的 options.machineClass、options.os 和 options.executionMode,并在永久拒绝 profile 时抛出 WorkerProviderError。provision 必须为相同的 operation id 和所选执行模式采用相同的租约;重试不能静默更改模式。如果提供商拥有的设置在分配后失败且清理状态不确定,请抛出 WorkerProviderError.cleanupIndeterminate(leaseId, provisionError, cleanupError),以便核心持久化已知租约,并协调拆除,而不是重放 provision。如果提供商确认清理已完成,请抛出 WorkerProviderError.cleanupComplete(leaseId, provisionError)。核心完成本地拆除,包括节点注册退役,并将原始错误报告为 provider_failure。provisioning 意图变为终态。只有在证明该操作的分配已释放或权威缺失,并且其租约清理命令已结束后,才报告已确认的清理。单独保留的检查点、镜像退役和捕获恢复义务仍由提供商负责;此信号不会清除它们。普通错误会保留不确定的分配,以便使用相同的 operation ID 重放。提供商可以使用异步 listMachineOptions(profile) 暴露进程稳定的选择器元数据;当 profile 没有有意义的机器选项时,省略该钩子。机器选项包含 id、label、可选的 os、可选的正整数 cpu 和 memoryGb,以及可选的 default。没有 os 的选项适用于所有已宣告的操作系统。可选的异步 listOperatingSystems(profile) 钩子返回由提供商拥有的 { id, label, default?, disabledReason? } 选项。可选的 disabledReason 会使不可用的目标保持可见但不可选择,并提供修复提示(1–256 个字符,不含首尾空白)。提供商在分配之前仍会验证目标可用性;选择器元数据不会授权 provisioning。插件作者可以从 Awaited<ReturnType<NonNullable<WorkerProvider["listOperatingSystems"]>>>[number] 派生项类型,或声明一个本地结构类型;没有公开的 WorkerOperatingSystem 导出。核心将 OS id 视为不透明字符串;插件负责其含义和验证。environments.list 每个 profile 最多暴露 64 个机器选项和最多 8 个操作系统,当只有一个选项时省略操作系统列表。会话放置提供商以确定的规范顺序声明当前 supportedExecutionModes 的一个或两个值:["worker-turn"]、["remote-exec"] 或 ["worker-turn", "remote-exec"]。空列表、重复值、未知模式和非规范顺序都会被拒绝。worker-turn 需要节点租约;remote-exec 接受节点租约或现有 SSH 租约。省略表示不宣告任何放置模式,同时保留直接环境生命周期调用。没有会话的直接环境创建不提供执行模式,因此提供商保留其有意设置的默认配置;捆绑的 Crabbox 提供商默认为 worker-turn。如果提供商的 provisioning 可能合理地超过核心的五分钟默认值,可以从 resolveProvisionTimeoutMs(profile, options?) 返回一个正毫秒预算;该上限应包含获取、提供商拥有的设置和清理。resolveDestroyTimeoutMs(profile) 声明拆除的等效预算,包括确认释放之前的快照捕获或其他提供商拥有的工作。核心会将该预算用于请求的拆除和引导失败清理;显式服务超时覆盖优先。预算必须是平台定时器限制内的正安全整数。
核心会从持久化的环境记录中,将可选的 options.profileId 提供给 provision 和 prepareProvision。它用于标识已配置的 profile 以供显示,包括在该 profile 变更或移除后的重放;它不会更改分配身份,也不会替换冻结的设置快照。
一个可选的 options.signal 会取消当前的资源供给尝试。应将其转发到获取、项目准备、安装、就绪和注册等待,并在拒绝前结束活动命令;调用方可见的超时或中止并不能证明提供者子进程已退出或租约已释放。应将其与项目、运行时准备和注册信号组合,而不是用更窄的授权信号替换它。清理应保持在独立的、未取消的生命周期权限上。核心为确切操作记录销毁意图,并在规范拆除前解析其分配;无法及时取消的提供者仍保持所有权,直到其真实操作结束。网关关闭是不同的:仅注册关闭会为重启采用保留固定分配,而中止的资源供给信号表示显式取消。
提供者可以实现 prepareProvision(profile, operationId, options?),返回分配函数 () => Promise<WorkerLease>。准备阶段可以验证本地设置并读取配置,但不得分配、续期、修改资源、注册节点或调用项目准备。核心在准备期间将新环境保持为 requested,并在调用返回函数之前立即记录 provisioning。已准备的事实保留在该次调用中;不要在分配函数内重新读取配置。全新的准备失败无需提供者拆除。重放准备失败仍不确定,因为之前的调用可能已经分配。取消或超时丢弃已准备的函数。没有此钩子的提供者保留现有 provision 契约;实现它的提供者应将其直接 provision 入口点委托到相同的准备和分配流程。
对于提供者拥有的 SSH 身份解析,核心提供可选的 request.assertCurrent 回调。它检查当前租约和本地身份调用;初始化 SSH 的调用方也会将其绑定到其准备生命周期。核心拒绝迟到的身份结果,并在解析完成或调用方可见超时后关闭保留的回调。旧版解析器仍受支持,无需能力声明;它们可以在 await 之后、进一步副作用之前调用该回调,但核心无法阻止忽略它的解析器中的内部副作用。这不会改变资源供给、续期或清理权限。
每个 worker 提供者必须实现 resolveAllocation(profile, operationId),为确切操作返回 { leaseId: string; sharedHost: boolean }。核心传递冻结的设置快照,即使命名 profile 已更改或被移除。该句柄标识清理目标;它不能证明已创建机器或传输已就绪。解析不得分配、启动、续期、运行安装、读取安装密钥、注册节点或等待可用性。如果身份无法安全解析,则抛出异常。当在记录 provision 结果之前请求销毁时,核心使用现有拆除状态持久化此句柄并调用 destroy,而不重放 provision。destroy 仍必须证明释放或权威不存在。这两个调用在任何更早的提供者操作之后保持串行化,直到该操作实际结束,包括在调用方可见超时之后。
对于节点提供者,核心向 resolveProvisionTimeoutMs 和资源供给都提供可选的 options.nodeBootstrapTimeoutMs。这是核心拥有的每个运行时准备/注册阶段的最大值,包括 bootstrap 后的连接等待;为提供者可能运行的每个阶段保留一次。授权在分配之后到达,因此其大小不能确定初始外部截止时间。每个运行时或注册授权提供可选的 bootstrapTimeoutMs,即从其实际工件派生的命令窗口(下载两个归档时的合并字节数)。在保留的外部预算内,使用该窗口执行命令,并将诊断和清理分开。这些可选事实保留现有提供者源代码兼容性;它们承载计时策略,而非权限、过期或重试许可。
注册云节点的提供者设置 requiresNodeEnrollment: true,并在分配机器后调用 options.beginNodeEnrollment()。返回的 WorkerNodeEnrollment 提供 displayName、openclawVersion、可选的注册生命周期 signal、waitForDeviceId(),以及 mode: "connect"(带 setupCode 和 setupId)或 mode: "resume"(带绑定的 deviceId)。其必需的 nodeBootstrap 包含 Gateway 准备的运行时归档的 url、机密 bearer token、sha256、bytes、openclawVersion、enabledPluginIds 和可选的 tlsFingerprint。下载该确切归档,验证其大小和摘要,安装其目标平台依赖项,并在连接前在节点的隔离状态中启用列出的插件。不要仅基于匹配的版本替换全局或注册表包。将下载和注册凭据排除在命令参数、日志、npm 以及已启动节点的环境之外;当 signal 中止时取消工作。下载权限属于实时注册尝试,而非仅 URL 或摘要。连接后,在节点租约中返回来自 waitForDeviceId() 的设备身份。有关源代码构建、工件重用和代理要求,请参阅 Bundle installation。Bootstrap 安装不授权节点命令,也不替代调用策略。
捕获可重用项目镜像的提供者可以声明 supportsProjectPreparation(profile, machineClass?, os?)。可选的 placement 覆盖是字符串;machine-class 参数保留其现有位置,以便旧提供者保持兼容。在决定是否支持准备时使用这些覆盖。对于符合条件的 Git placement,核心在分配前持久化项目身份和固定基础提交,然后提供 options.project。在已分配机器上调用其 prepare({ runScript, upload }) 适配器;核心拥有有界 Git 传输、干净 checkout 验证和缓存布局,而提供者拥有命令和文件传输。遵守 project.signal,并在 await 的提供者工作周围调用 project.assertCurrent()。保留的回调在 provision 尝试关闭后拒绝。项目密钥的范围限定于 Gateway 和仓库,包括链接的 worktree。仅仓库来源还绑定仓库实例和当前共享读取身份;核心重新验证可见性和访问。公共来源无需 worker 凭据即可获取。私有来源使用 Gateway 拥有的已认证临时对象存储,并通过同一适配器仅传输已验证的 Git pack;提供者脚本和上传永远不会接收 GitHub 凭据。公共和私有来源具有不同的项目密钥,而不更改其持久化的来源字段。没有项目准备的提供者在注册后保留普通 checkout。会话编辑和 Git 凭据被排除在已准备的基础之外。
可选的 project.label 是显示元数据,不影响项目键。本地快照会保留从其 origin 远程解析出的规范化 host/owner/repo;当无法解析仓库标签时,则保留项目根目录的 basename;该标签在重放时会被保留。当 core 将项目传递给提供方时,仓库项目会从被接受的规范 URL 派生出相同的规范化标签。
能够在专用节点上保留已完成设置的提供方还应实现 resolvePreparationTarget(profile, machineClass?, os?),返回生效的机器类别和平台,并在已知时返回架构。core 在分配前对这些目标事实、设置配方、项目 commit 和当前运行时工件进行指纹计算。当存在 options.project.preparation 时,除现有传输方法外,还应使用 runScriptWithBudget(createScript, signal) 调用 prepare;在运行仓库代码前,将命令剩余的毫秒预算传递给渲染器。即使较旧的镜像具有相同的 commit 和运行时,也要尊重返回的 captureRequired: true,同时保留所选镜像代次的捕获权限。provision 返回的节点租约必须包含 sharedHost: false,以证明专用所有权;true 或省略该字段会在 prepared-workspace 注册前被拒绝。core 会在租约验证过程中保留所提供的布尔值。core 在注册后登记返回的 workspace 和 manifest 身份,然后将其一次性绑定到确切的会话。对于已注册的 provision 重试,调用 project.inspectPreparedWorkspace({ runScript }) 以恢复现有完成事实,而不进行传输、执行设置或捕获。缺失或已更改的完成状态会显式失败;它不能成为新的纯净基线。
core 将 options.nodeRuntimeIdentity 作为无需授权的预准备事实提供:node 归档的 SHA-256、执行模式,以及当项目准备保留该归档时的 worker 归档 SHA-256。在判断已捕获的运行时内容是否为当前状态时,应比较此身份;仅版本字符串是不够的。core 会将后续的运行时和注册描述符与这些预准备字节进行比较,如果身份发生变化,则关闭其授权。
参与 prepared-project 就绪容量的提供方实现 resolvePreparedIdleTimeoutMs(profile),从其现有空闲策略返回一个正的安全毫秒时长,或在不支持预留时返回 undefined。options.project.preparation 还携带 purpose("session" 或 "reserve")以及源 demandAtMs;重复分配必须保留两者。预留准备和补充不会创建新的需求。成功激活后,core 可以调用 notePreparedDemand({ leaseId, profile }, { preparationKey, demandAtMs })。只更新由该租约选择或生成的确切镜像代次;时间戳和匹配的摘要并不授权更改其他代次。此钩子仅记录元数据;它不得分配、捕获或续期 worker。即使就绪容量被禁用,仍会记录成功的前台需求。分配和 fork 时间戳不能确立成功的前台需求。在激活前,保持新捕获的前台镜像的需求未设置,同时保留其生产者的实际代次回执,直到确认源停止。
在捕获前,调用 options.prepareNodeRuntime() 以在不创建节点身份或注册代码的情况下获取工件访问权限。结果包括 nodeBootstrap、workerBundle 以及操作的取消 signal。worker 归档描述符提供 url、机密 token、sha256、bytes、可选的 tlsFingerprint,以及已安装 node 包内由 core 拥有的 packageRelativePath。在捕获前,下载并验证两个归档,安装运行时,并将压缩的 worker 归档发布到该确切包含位置。每个运行时包只保留一个已发布的 worker 归档,排除凭据和回执,并且永远不要将独立负载添加到精简运行时归档中。常规身份验证安装程序会验证预准备字节,并在注册后创建全新安装;原始归档不授予任何准入权限。在调用 beginNodeEnrollment() 之前完成捕获。开始注册、取消、替换或关闭都会撤销两个准备授权。结果不确定的原生捕获必须在注册能够向其源机器引入凭据之前确定或被显式恢复。在联系提供方之前,持久化原始的 cold/checkpoint 分配决策,保留 checkpoint 引用直到确认释放,并且在重放同一操作时永远不要切换镜像。
core 会将经过验证的 profile 设置与租约一起持久化,并将该快照提供给 destroy({ leaseId, profile })(必须幂等)和 inspect({ leaseId, profile })(返回 active、dormant、destroyed 或 unknown)。这使得提供方能够在 gateway 重启或命名 profile 移除后路由生命周期调用。SSH 端点使用 SecretRef 作为 keyRef,绝不内联密钥材料,并包含来自可信 provisioning 输出的 hostKey,其格式必须恰好为 algorithm base64,不包含主机名或注释。core 会固定 hostKey,并且绝不信任来自首次连接的密钥。提供方还可以返回最多 10 个有序且唯一的 fallbackPorts(1 到 65535 之间的整数端口,排除主 port);core 会验证并持久化这些已通告的候选项,用于幂等探测、内容寻址传输、回执/锁保护的工件安装、收敛的 managed-worktree 镜像以及隧道重连。模糊的无保护有状态命令会失败关闭,并且不会跨候选项重放。当 SSH 账户还拥有无关进程时,租约可以设置 sharedHost: true;core 随后会在 workspace 协调期间避免主机范围的进程冻结。对于普通租约,省略该字段会保留传统的专用主机行为;prepared-workspace 注册要求在 provision 结果中显式提供 sharedHost: false。活动检查会重复这一事实,以便 core 能够协调在字段存在之前持久化的租约的提供方拥有的隔离;隧道启动会等待该首次权威检查。铸造动态 keyRef 的提供方可以实现 resolveSshIdentity({ leaseId, profile, keyRef });当存在时,该解析器是权威的,而没有它的提供方使用已配置的通用 secret 解析器。
WorkerLease.desktop 是可选的,其形状为 { protocol: "rfb"; port: number; passwordFilePath?: string; username?: string; allowsResize?: boolean; apps?: WorkerDesktopApp[] };passwordFilePath 如果存在,必须是 worker 上的绝对路径(POSIX 或 Windows)。设置 allowsResize: false 会限制原生桌面进行提供方范围的虚拟显示调整大小。提供方从 provision 报告此预热时能力;它不能事后添加到活动租约上。拥有该租约的 SSH 或 node 载体在需要时会在 worker 上读取密码,并且绝不将其持久化到 Gateway 存储中。WorkerDesktopApp 是一个封闭联合类型:{ id: "browser"; executablePath: string; args?: string[]; cdpPort: number } 或 { id: "terminal"; executablePath: string; args?: string[] }。App id 必须唯一,可执行路径必须是绝对路径,浏览器 CDP 端口必须是 1 到 65535 之间的整数,并且列表最多接受八个条目。core 会拒绝未知的 id 和字段。可选的 args 由提供方固定,并随其被接受的启动器一起传输,绝不由查看器提供。它们在 node 上无 shell 运行;每个参数都不含 NUL 且限制为 4 KiB,最多 32 个参数,总计 8 KiB。Gateway 验证独立于 Gateway 操作系统接受 POSIX 和 Windows 绝对路径;node 验证其原生路径语法。可选的 username 标识租约拥有的 ARD 账户,其密码从 passwordFilePath 读取,并在 node 和 Gateway 之间保持临时状态。托管 ARD 账户身份验证需要 node 载体;凭据绝不进入浏览器。普通主机桌面保留其现有的由查看器提供的 ARD 凭据。
具有可续期租约的提供方还可以实现 renew(leaseId)。
inspect 必须在瞬时或不确定失败时抛出异常;仅在权威缺失时返回 unknown。core 会对环境设置围栏并调用规范拆除;共享或未知主机隔离仍需要确认确切的 worker 已停止。不得仅仅为了释放其逻辑租约而停止或取消配对共享主机。
通过 api.registerEmbeddingProvider(...) 注册的嵌入提供者还必须列在插件清单的 contracts.embeddingProviders 中。这是用于可复用向量生成的通用嵌入接口。记忆搜索消费此通用提供者接口。旧的记忆专用注册器和清单契约在 2026 年 8 月迁移窗口结束后被移除。
嵌入提供者可以使用来自 openclaw/plugin-sdk/embedding-provider-runtime-contract 的 EmbeddingProviderBatchRuntime 为其异步 batchEmbed(...) 能力进行类型标注。公共契约包含批次块和执行选项,不包含宿主缓存或身份元数据。除非运行时设置 sourceWideBatchEmbed: true,否则批次仍按文件划分。该选择加入项允许记忆宿主在一次 batchEmbed(...) 调用中提交来自多个脏记忆文件和已启用来源的块,直至达到宿主批次限制。上传 JSONL 请求文件的批次适配器必须在达到上传大小上限以及请求数量上限之前拆分提供者作业。提供者必须按 batch.chunks 的相同顺序为每个输入块返回一个嵌入;当提供者预期文件本地批次,或无法在更大的全来源作业中保持输入顺序时,应省略该标志。
决策模型(契约版本 1)¶
先从 决策模型 开始,了解模型选择、配置以及 Choice/Score/Boolean 评分标准示例。本节定义提供者和消费者 SDK 契约。
api.registerDecisionProvider({ id, contractVersion: 1, isReady, evaluate }) 注册一个可选的决策提供者,独立于对话模型提供者和智能体工具。在清单 contracts.decisionProviders 中声明该 ID;重复的 ID 会被拒绝。注册和可选的 isReady() 必须是本地的、同步的,并且不依赖网络。从 openclaw/plugin-sdk/decisions 导入类型。
消费者调用 api.runtime.decisions.evaluate(batch, { agentId?, purpose, rubricVersion, timeoutMs, signal })。状态和评分标准条目是有限 JSON。使用普通对象和数组;自定义原型、序列化钩子和 getter 在请求和响应边界都会被拒绝。Choice 保留所有提供的标签和概率;所选标签是提供者的决策,不一定等于最大的四舍五入概率。消费者选择使用该标签还是显式分布策略。有序分数是小数形式的估计零基位置,并带有索引对齐的概率;Boolean 答案携带 probabilityTrue。宿主对整个批次进行原子验证:精确的答案键、[0, 1] 内的有限概率、正分布质量,以及分数位于提交的评分标准内。报告的概率可能经过四舍五入,且不必精确加和为 1;分数不必等于该四舍五入分布的期望值。宿主保留这些值。需要归一化权重的消费者必须应用其自身的显式策略。提供者置信度是提供者特定的指标,而非校准后的正确性。结果包括模型、可选的 token 用量,以及本地评分标准和运行时生成的溯源。
将 agents.defaults.decisionModel 设置为显式的 provider/model 引用。未设置或为空表示关闭。agents.entries.<id>.decisionModel 覆盖全局默认值;空的智能体值会禁用该智能体的决策。没有自动的对话模型回退。选择会使提供者对受支持的消费者可用。消费者负责其功能激活和证据选择;仅配置提供者不会调度后台工作。发送到所选提供者的证据可能产生其正常用量费用。插件禁用优先;仅安装工具或凭据不会选择提供者。供应商适配器负责传输和模型特定转换;没有供应商是核心依赖。
ONNX 插件 提供本地分类器;TypeSafe AI 插件 提供托管的 Jev 和本地 System One 适配器,包括 Kev。这两个插件都需要单独安装、显式设置和角色选择。
从第三方插件调用¶
与 api.runtime.llm.complete 类似,api.runtime.decisions.evaluate 允许插件使用宿主配置的提供者,而无需处理其凭据。消费者不需要提供者的 SDK、API 密钥、SecretRef 或提供者注册。只有提供者插件注册 contracts.decisionProviders,并拥有其供应商传输和准备好的凭据输入。这并不会使对话模型凭据与决策提供者凭据可以互换。
操作员必须启用并配置提供者插件,并选择 agents.defaults.decisionModel(或智能体覆盖)。第三方插件负责其功能的激活、证据选择以及发送该证据的权限。仅拥有凭据不得激活后台收集或消费。
从运行中的插件工具、钩子或其他自有操作中进行调用,并携带其取消信号:
const outcome = await api.runtime.decisions.evaluate(
{
state: { message: "Can you help me with this?", directlyAddressed: true },
questions: {
respond: {
type: "boolean",
instructions: "Is this message asking the assistant to respond?",
criteria: {
true: "The message asks the assistant to respond",
false: "The message does not ask the assistant to respond",
},
},
},
},
{
agentId, // The agent that owns this operation; omit only for global-default selection.
purpose: "example-plugin.response-eligibility",
rubricVersion: "1",
timeoutMs: 1500,
signal,
},
);
ok 结果包含经过验证的答案、模型/用量,以及提供者/评分标准/运行时溯源。它是消费者决策的证据,而不是发送消息或执行其他效果的权限。unavailable 结果携带一个原因,供消费者使用其现有回退。不要捕获取消或权限关闭错误,并将其转化为回退工作。
提供方在其评估上下文中接收所选的 model 和可选的 agentId。并发的 agent/model 选择共享提供方健康状态,而不会相互退役。更改的选择会在返回前隔离受影响的请求。
消费者共享所选提供方由宿主拥有的并发、熔断和凭证刷新生命周期;每个插件不会创建自己的提供方客户端。不会向消费者返回任何凭证。无论调用方是内置还是第三方,提供方初始化和刷新都使用相同的 prepared-secret 路径。
宿主最多接纳四个请求,无队列,且最长 30 秒。消费者可以请求更短的截止时间,并选择自己的回退策略。三次不健康响应会打开一个 10 秒熔断;恢复时接纳一次试验。Retry-After 限制为一分钟。认证错误会锁定,直到 prepared-secret 或配置代际发生变化。宿主没有重试或健康探测。
调用方取消和已关闭的消费者权限会拒绝:不要启动回退。提供方退役时返回不可用,而存活消费者可以回退。提供方必须遵守组合的中止信号,并实际完成传输和正文清理;不配合的提供方仍由正常的失败排空恢复机制拥有并隔离。旧代际的结果不能更新新的健康状态。
清单能力凭证使用 configContracts.secretInputs 和编写的 SecretRefs。getPreparedPluginSecretInput(pluginId, path) 来自 openclaw/plugin-sdk/secret-input-runtime,只读取已准备且可用的快照;它从不解析冷引用,也不查询环境凭证。仅从插件实例的活动调用中调用它。该辅助函数不是持久凭证能力:静默或退役该确切实例会立即移除读取权限,即使已接纳的工作正在完成。提供方必须将缺失值视为不可用,并且不得在重新加载之间保留或重用先前值。使用 secrets.reload 刷新;能力失败不会保留旧密钥。
plugins.inspect 报告配置、凭证就绪状态、当前可调用性、最后成功、使用情况、延迟和有界的不可用计数。这些计数是实例本地诊断信息,不是持久审计记录或写入权限。
为了发现,在提供方清单中声明静态 decisionModels 条目,包含 provider、id 和 name。每个提供方必须由 contracts.decisionProviders 拥有。Control UI 的 Decision 选择器通过单独的 models.list.decisionModels 投影读取此元数据;不会运行提供方运行时或凭证探测来填充选择器。这些条目永远不会进入聊天、主、回退或实用模型目录。
可选的模型 capabilities 描述支持的问题类型、输入限制及其核算范围、布尔条件要求以及置信度语义。核心 decision_evaluate 工具使用这些相同的清单事实作为指导;提供方就绪状态不会改变其定义。有关有界的描述符字段,请参阅 清单参考。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/openclaw