快速开始
构建 CLI 后端插件
CLI 后端插件让 OpenClaw 将本地 AI CLI 作为文本推理后端调用。该后端会在模型引用中显示为提供商前缀:
acme-cli/acme-large
当上游集成已经暴露为本地命令、CLI 拥有本地登录状态,或当 API 提供商不可用时 CLI 可作为有用的后备方案时,请使用 CLI 后端。
插件负责什么
CLI 后端插件有三个契约:
| 契约 | 文件 | 用途 |
|---|---|---|
| 包入口 | package.json |
将 OpenClaw 指向插件运行时模块 |
| 清单所有权 | openclaw.plugin.json |
在运行时加载之前声明后端 id |
| 运行时注册 | index.ts |
使用命令默认值调用 api.registerCliBackend(...) |
清单是设备发现元数据。它不会执行 CLI,也不会注册运行时行为。运行时行为会在插件入口调用 api.registerCliBackend(...) 时开始。
最小后端插件
创建包元数据
{
"name": "@acme/openclaw-acme-cli",
"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"
}
},
"dependencies": {
"openclaw": "^2026.3.24"
},
"devDependencies": {
"typescript": "^5.9.0"
}
}
已发布的包必须随附构建后的 JavaScript 运行时文件。如果你的源入口是 ./src/index.ts,请添加指向构建后 JavaScript 对等文件的 openclaw.runtimeExtensions。参见入口点。
声明后端所有权
{
"id": "acme-cli",
"name": "Acme CLI",
"description": "Run Acme's local AI CLI through OpenClaw",
"cliBackends": ["acme-cli"],
"setup": {
"cliBackends": ["acme-cli"],
"requiresRuntime": false
},
"activation": {
"onStartup": false
},
"configSchema": {
"type": "object",
"additionalProperties": false
}
}
cliBackends 是运行时所有权列表。当配置或模型选择提到 acme-cli/... 时,它会让 OpenClaw 自动加载插件。
setup.cliBackends 是描述符优先的设置表面。当模型设备发现、新手引导或 Status 应在不加载插件运行时的情况下识别该后端时,请添加它。只有当这些静态描述符足以用于设置时,才使用 requiresRuntime: false。
注册后端
import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
import {
CLI_FRESH_WATCHDOG_DEFAULTS,
CLI_RESUME_WATCHDOG_DEFAULTS,
type CliBackendPlugin,
} from "openclaw/plugin-sdk/cli-backend";
function buildAcmeCliBackend(): CliBackendPlugin {
return {
id: "acme-cli",
liveTest: {
defaultModelRef: "acme-cli/acme-large",
defaultImageProbe: false,
defaultMcpProbe: false,
docker: {
npmPackage: "@acme/acme-cli",
binaryName: "acme",
},
},
config: {
command: "acme",
args: ["chat", "--json"],
output: "json",
input: "stdin",
modelArg: "--model",
sessionArg: "--session",
sessionMode: "existing",
sessionIdFields: ["session_id", "conversation_id"],
systemPromptFileArg: "--system-file",
systemPromptWhen: "first",
imageArg: "--image",
imageMode: "repeat",
reliability: {
watchdog: {
fresh: { ...CLI_FRESH_WATCHDOG_DEFAULTS },
resume: { ...CLI_RESUME_WATCHDOG_DEFAULTS },
},
},
serialize: true,
},
};
}
export default definePluginEntry({
id: "acme-cli",
name: "Acme CLI",
description: "Run Acme's local AI CLI through OpenClaw",
register(api) {
api.registerCliBackend(buildAcmeCliBackend());
},
});
后端 id 必须与清单中的 cliBackends 条目匹配。已注册的 config 只是默认值;运行时会将 agents.defaults.cliBackends.acme-cli 下的用户配置合并覆盖它。
配置形状
CliBackendConfig 描述 OpenClaw 应如何启动并解析 CLI:
| 字段 | 用途 |
|---|---|
command |
二进制名称或绝对命令路径 |
args |
全新运行的基础 argv |
resumeArgs |
恢复会话的替代 argv;支持 {sessionId} |
output / resumeOutput |
解析器:json、jsonl 或 text |
input |
提示词传输方式:arg 或 stdin |
modelArg |
模型 id 前使用的标志 |
modelAliases |
将 OpenClaw 模型 id 映射到 CLI 原生 id |
sessionArg / sessionArgs |
如何传递会话 id |
sessionMode |
always、existing 或 none |
sessionIdFields |
OpenClaw 从 CLI 输出读取的 JSON 字段 |
systemPromptArg / systemPromptFileArg |
系统提示词传输方式 |
systemPromptWhen |
first、always 或 never |
imageArg / imageMode |
图片路径支持 |
serialize |
保持同一后端的运行有序 |
reliability.watchdog |
无输出超时调优 |
优先使用与 CLI 匹配的最小静态配置。只有当行为确实属于该后端时,才添加插件回调。
高级后端钩子
CliBackendPlugin 还可以定义:
| 钩子 | 用途 |
|---|---|
normalizeConfig(config, context) |
合并后重写旧版用户配置 |
resolveExecutionArgs(ctx) |
添加请求作用域标志,例如思考力度 |
prepareExecution(ctx) |
启动前创建临时凭证或配置桥接 |
transformSystemPrompt(ctx) |
应用最终的 CLI 特定系统提示词转换 |
textTransforms |
双向提示词/输出替换 |
defaultAuthProfileId |
优先使用特定的 OpenClaw 凭证配置 |
authEpochMode |
决定凭证变更如何使已存储的 CLI 会话失效 |
nativeToolMode |
声明 CLI 是否有始终启用的原生工具 |
bundleMcp / bundleMcpMode |
选择加入 OpenClaw 的 loopback MCP 工具桥接 |
让这些钩子保持由提供商拥有。当后端钩子可以表达该行为时,不要向核心添加 CLI 特定分支。
MCP 工具桥接
CLI 后端默认不会收到 OpenClaw 工具。如果 CLI 可以使用 MCP 配置,请显式选择加入:
return {
id: "acme-cli",
bundleMcp: true,
bundleMcpMode: "codex-config-overrides",
config: {
command: "acme",
args: ["chat", "--json"],
output: "json",
},
};
支持的桥接模式包括:
| 模式 | 用途 |
|---|---|
claude-config-file |
接受 MCP 配置文件的 CLI |
codex-config-overrides |
接受 argv 上配置覆盖的 CLI |
gemini-system-settings |
从系统设置目录读取 MCP 设置的 CLI |
只有当 CLI 实际能够使用该桥接时才启用它。如果 CLI 有自己的内置工具层且无法禁用,请设置 nativeToolMode: "always-on",这样当调用方要求没有原生工具时,OpenClaw 可以失败关闭。
用户配置
用户可以覆盖任何后端默认值:
{
agents: {
defaults: {
cliBackends: {
"acme-cli": {
command: "/opt/acme/bin/acme",
args: ["chat", "--json", "--profile", "work"],
modelAliases: {
large: "acme-large-2026",
},
},
},
model: {
primary: "openai/gpt-5.5",
fallbacks: ["acme-cli/large"],
},
},
},
}
记录用户可能需要的最小覆盖项。通常只有当二进制不在 PATH 中时才需要 command。
验证
对于内置插件,请围绕构建器和设置注册添加聚焦测试,然后运行该插件的目标测试通道:
pnpm test extensions/acme-cli
对于本地或已安装插件,请验证设备发现和一次真实模型运行:
openclaw plugins inspect acme-cli --runtime --json
openclaw agent --message "reply exactly: backend ok" --model acme-cli/acme-large
如果后端支持图片或 MCP,请添加一个实时冒烟测试,用真实 CLI 证明这些路径。不要依赖静态检查来验证提示词、图片、MCP 或会话恢复行为。
检查清单
OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s
package.json 具有 openclaw.extensions,并且已发布包具有构建后的运行时入口
OPENCLAW_DOCS_MARKER:calloutClose:
OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s
openclaw.plugin.json 声明 cliBackends 和有意设置的 activation.onStartup
OPENCLAW_DOCS_MARKER:calloutClose:
OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s
当设置/模型设备发现应在冷状态看到后端时,存在 setup.cliBackends
OPENCLAW_DOCS_MARKER:calloutClose:
OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s
api.registerCliBackend(...) 使用与清单相同的后端 id
OPENCLAW_DOCS_MARKER:calloutClose:
OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s
agents.defaults.cliBackends.<id> 下的用户覆盖仍然优先
OPENCLAW_DOCS_MARKER:calloutClose: