如果上游服务提供了标准的 HTTP 模型 API,请改为编写一个 提供方插件。如果上游运行时拥有完整的 agent 会话、工具事件、压缩或后台任务状态,请使用一个 agent harness。
插件负责什么
一个 CLI 后端插件有三个契约:
清单是发现元数据:它不会执行 CLI,也不会注册运行时行为。运行时行为从插件入口调用
api.registerCliBackend(...) 时开始。
最小后端插件
1
创建包元数据
package.json
./src/index.ts,请添加 openclaw.runtimeExtensions,指向构建后的 JavaScript 同级文件。参见 入口点。2
声明后端所有权
openclaw.plugin.json
cliBackends 是运行时所有权列表;当模型选择或 agentRuntime.id 提及 acme-cli 时,它会让 OpenClaw 自动加载该插件。setup.cliBackends 是仅基于描述符的 setup 接口。若模型发现、引导流程或状态需要在不加载插件运行时的情况下识别该后端,请添加它。仅当这些静态描述符已足够用于 setup 时,才使用 requiresRuntime: false。3
注册后端
index.ts
cliBackends 条目匹配。注册的适配器是权威的插件代码;OpenClaw 配置选择后端,但不会重写其命令契约。配置结构
CliBackendConfig 描述 OpenClaw 应如何启动和解析 CLI。上面的完整示例有意涵盖了随附的
google-gemini-cli 适配器所使用的相同命令、恢复、JSONL、
模型别名、会话、图像和看门狗字段:
优先选择与 CLI 匹配的最小静态配置。仅为真正属于后端的行为添加插件回调。
高级后端钩子
CliBackendPlugin 还可以定义:
保持这些钩子的提供方所有权。不要在核心中为 CLI 添加特定分支,若某个后端钩子可以表达该行为。
liveSessionRequirement 声明 CLI 必须在其初始化记录中公布的一项确切能力,之后
OpenClaw 才会信任流式输出。它还提供首个已知兼容版本、版本探测参数以及设置和 Doctor
使用的更新命令。运行时支持仍基于能力,因此兼容的回移版本或包装器不会仅仅因为版本
字符串而被拒绝。
prepareExecution(ctx) 会接收 ctx.contextTokenBudget,即为本次运行选择的有效令牌
上限。拥有原生压缩机制的后端可以将该预算映射到其特定于 CLI 的启动契约中。
runtimeArtifact 由插件负责。它仅在实时推理轮次创建或重新验证已验证的设置权限时
使用;正常的 CLI 运行不需要它。没有此声明的后端无法创建已验证的 CLI 设置权限。
bundled-package-tree 声明会指定确切的 package.json 所有者,并要求包入口点就是
该命令。OpenClaw 会对有界的完整已安装包树进行哈希处理,包括嵌套依赖;对于重定向
符号链接、位于声明包之外的启动器、所需的外部依赖声明、超大目录树以及未知脚本,
会采取失败关闭策略。仅当该目录树包含完整的推理实现时才声明此项;可选的工具集成
并不能使外部实现图变得安全。
如果同一个后端还提供了自包含的原生可执行文件,请在 nativeExecutableNames 中列出
其规范基名。其他原生命令仍未经过验证。
ctx.executionMode 在正常轮次中为 "agent",在临时的 /btw 调用中为 "side-question"。当 CLI 需要不同的一次性标志时使用它,例如为 BTW 禁用原生工具、会话持久化或恢复行为。如果某个后端通常具有 nativeToolMode: "always-on",但其 side-question argv 能可靠地禁用这些工具,也请设置 sideQuestionToolMode: "disabled";否则当 BTW 需要无工具 CLI 运行时,OpenClaw 会失败关闭。
仅当后端能够为单次运行禁用每一个后端原生工具时,才设置
nativeToolMode: "selectable"。受限运行会收到一个规范契约:ctx.toolAvailability.native
是确切的后端原生工具列表,而 ctx.toolAvailability.openClaw 是确切的 OpenClaw
工具名称列表。宿主会独立地将生成的 MCP 配置和授权限制为该 OpenClaw 列表;插件不得
在核心中对其进行转换,也不得添加传输前缀。
声明后端如何强制执行该契约:
toolAvailabilityEnforcement: "execution-args"要求提供resolveExecutionArgs。该钩子必须替换冲突的工具标志,禁用可在选定工具之外执行的 自定义入口,并为全新运行和恢复运行返回强制执行契约的 argv。toolAvailabilityEnforcement: "prepare-execution"要求提供prepareExecution。该钩子必须为每次运行暂存精确的策略,并返回toolAvailabilityEnforced: true;缺少确认时会采取失败关闭策略,且 OpenClaw 会在 启动前清理暂存资源。
toolsAllow)会在构建此契约之前由 OpenClaw 进行规范化和分组
展开。原生工具会被禁用,而没有完整声明式强制执行路径的后端会在执行前失败。
针对 v2026.7.2-beta.1 至 v2026.7.2-beta.3 构建的插件仍可读取已弃用的
ctx.toolAvailability.mcp 传输名称投影;当可选择的后端实现了
resolveExecutionArgs 时,也可以省略 toolAvailabilityEnforcement。OpenClaw 会根据
插件包所需的 openclaw.build.openclawVersion 元数据识别这一已发布的 beta 路径,并在
2026.8.x 系列中保留该兼容性。新插件和更新后的插件应使用规范的
ctx.toolAvailability.openClaw 名称,并明确声明
toolAvailabilityEnforcement: "execution-args";beta 兼容路径计划在该窗口结束后移除。
parseJsonlEvent:提供方特定的 JSONL 流
当后端输出的逐行 JSON 不符合内置的 Claude、Codex 或 Gemini 方言时,设置
parseJsonlEvent。该钩子接收一行原始内容以及解析后的后端 id 和配置,并返回一个
规范化事件、多个事件,或返回 null 以让内置解析器尝试处理该行。
支持的事件包括增量助手文本、增量思考、原生工具启动/结果显示、会话 id 以及终止结果。
终止结果可以包含最终文本、用量、错误和后继会话 id。任一事件形式报告的会话 id 都会
参与恢复会话和分叉持久化。
工具事件描述的是后端已经执行的工作。OpenClaw 会渲染并汇总这些事件,但不会将其视为
宿主工具执行、可信诊断、回环关联或消息传递证据。
ownsNativeCompaction:选择退出 OpenClaw 压缩
如果你的后端运行的代理会压缩它自己的对话记录,请设置 ownsNativeCompaction: true,这样 OpenClaw 的保护性摘要器就绝不会对其会话运行——CLI 的压缩生命周期会返回一个 no-op,当前轮次继续执行。claude-cli 声明了它,因为 Claude Code 会在内部压缩,而且没有 harness 端点。像 Codex 这样的原生 harness 会话则继续路由到它们各自的 harness 压缩端点。
只有在以下所有条件都满足时才声明它,否则一个延后且超出预算的会话可能会继续超预算或变得陈旧(OpenClaw 将不再对其进行挽救):
- 后端在接近其窗口上限时能够可靠地压缩或限制自己的对话记录;
- 它会持久化一个可恢复的会话,以便压缩后的状态能跨轮次保留(例如
--resume/--session-id); - 它不是一个原生 harness 压缩会话——与
agentHarnessId匹配的会话会改为路由到 harness 端点。
MCP 工具桥接
CLI 后端默认不会接收 OpenClaw 工具。如果 CLI 可以消费 MCP 配置,请显式启用:
只有在 CLI 确实能够消费时才启用桥接。如果 CLI 有
其自身内置的工具层且无法禁用,请设置
nativeToolMode: "always-on",这样当调用方要求不使用原生
工具时,OpenClaw 就可以安全失败。如果它可以在每次运行时禁用所有原生工具,请使用 "selectable" 并配合上面的
resolveExecutionArgs 契约。
选择后端
用户通过后端的模型引用前缀选择独立后端。声明了规范modelProvider 的后端,也可以通过该提供商模型的 agentRuntime.id 进行选择。适配器机制仍保留在插件中:
PATH 中;需要使用不同路径或 argv 的部署应更改或封装插件注册。
验证
对于打包插件,请围绕 builder 和 setup 注册添加一个有针对性的测试,然后运行该插件的目标测试任务:清单
package.json 包含 openclaw.extensions 以及已发布软件包的构建运行时条目openclaw.plugin.json 声明了 cliBackends 和有意设置的 activation.onStartup当设置/模型发现需要在后端冷启动时感知该后端,
setup.cliBackends 已存在api.registerCliBackend(...) 使用与清单相同的后端 ID后端模型前缀或以模型为作用域的
agentRuntime.id 会选择该注册项会话、系统提示词、图像和输出解析器设置与实际 CLI 契约一致
有针对性的测试以及至少一次实时 CLI 冒烟测试证明了后端路径