- OpenClaw 工具不会被直接注入,但带有
bundleMcp: true的后端可以通过 loopback MCP 桥接接收 Gateway 网关工具。 - 支持它的 CLI 可使用 JSONL 流式传输。
- 支持会话,因此后续轮次能保持连贯。
- 如果 CLI 接受图片路径,图片会透传。
快速开始
内置 Anthropic 插件会注册默认的claude-cli 后端,因此只要已安装 Claude Code 并完成登录,无需额外配置即可使用:
main 是默认智能体 id;否则请换成你自己的智能体 id。
如果 Gateway 网关在 launchd/systemd 下运行且 PATH 很精简,请显式指向二进制文件:
agents.defaults.cliBackends 下引用该后端时,OpenClaw 会自动加载所属的内置插件。
将其用作回退
将 CLI 后端添加到你的回退列表中,让它只在主要模型失败时运行:agents.defaults.models 用作允许列表,也要把你的 CLI 后端模型包含进去。当主要提供商失败时(凭证、限速、超时),OpenClaw 会接着尝试 CLI 后端。
配置
所有 CLI 后端都位于agents.defaults.cliBackends 下,并按提供商 id 作为键(例如 claude-cli、my-cli)。提供商 id 会成为模型引用左侧:<provider>/<model>。
工作方式
- 通过提供商前缀(
claude-cli/...)选择后端。 - 使用相同的 OpenClaw 提示词和工作区上下文构建系统提示词。
- 使用会话 id(如果支持)执行 CLI,以保持历史一致。内置
claude-cli后端会为每个 OpenClaw 会话保持一个 Claude stdio 进程存活,并通过 stream-json stdin 发送后续轮次。 - 解析输出(JSON 或纯文本)并返回最终文本。
- 按后端持久化会话 id,让后续轮次复用同一个 CLI 会话。
Claude CLI 细节
内置claude-cli 后端优先使用 Claude Code 的原生 skill 解析器。当当前 skills 快照中至少有一个已选择且带物化路径的 skill 时,OpenClaw 会通过 --plugin-dir 传递一个临时 Claude Code 插件,并从附加的系统提示词中省略重复的 OpenClaw skills 目录。没有物化插件 skill 时,OpenClaw 会保留提示词目录作为回退。Skill 环境/API key 覆盖仍会应用到本次运行的子进程环境中。
Claude CLI 有自己的非交互式权限模式;OpenClaw 会将其映射到现有 exec 策略,而不是添加 Claude 专用配置。对于 OpenClaw 管理的 Claude 实时会话,生效的 exec 策略具有权威性:YOLO(tools.exec.security: "full" 和 tools.exec.ask: "off")会用 --permission-mode bypassPermissions 启动 Claude,而限制性策略会用 --permission-mode default 启动它。按智能体配置的 agents.list[].tools.exec 设置会覆盖该智能体的全局 tools.exec。原始后端参数仍可包含 --permission-mode,但实时 Claude 启动会将该标志规范化为匹配生效策略。
该后端还会将 OpenClaw /think 级别映射到 Claude Code 的原生 --effort 标志:minimal/low -> low,adaptive/medium -> medium,而 high/xhigh/max 会直接透传。其他 CLI 后端需要其所属插件声明等效的 argv 映射器后,/think 才会影响生成的 CLI。
在 OpenClaw 可以使用 claude-cli 之前,Claude Code 本身必须在同一主机上完成登录:
claude 二进制文件尚未在 PATH 上时,才设置 agents.defaults.cliBackends.claude-cli.command。
会话
- 如果 CLI 支持会话,请设置
sessionArg(例如--session-id),或者在 id 需要落入多个标志时设置sessionArgs(占位符{sessionId})。 - 如果 CLI 使用带有不同标志的 resume 子命令,请设置
resumeArgs(恢复时替代args),并可选择为非 JSON 恢复设置resumeOutput。 sessionMode:always:始终发送会话 id(如果未存储则使用新的 UUID)。existing:只有之前存储过会话 id 时才发送。none:从不发送会话 id。
claude-cli默认使用liveSession: "claude-stdio"、output: "jsonl"和input: "stdin",因此在实时 Claude 进程仍活跃时,后续轮次会复用该进程,包括省略传输字段的自定义配置。如果 Gateway 网关重启或空闲进程退出,OpenClaw 会从存储的 Claude 会话 id 恢复。恢复前会根据可读的项目 transcript 验证已存储的会话 id;缺少 transcript 会清除绑定(记录为reason=transcript-missing),而不是在--resume下静默启动新会话。- Claude 实时会话保留有界 JSONL 输出保护:默认每轮 8 MiB 和 20,000 行原始 JSONL。可按后端使用
agents.defaults.cliBackends.claude-cli.reliability.outputLimits.maxTurnRawChars和maxTurnLines提高限制;OpenClaw 会将这些设置钳制到 64 MiB 和 100,000 行。 - 已存储的 CLI 会话是提供商拥有的连续性。隐式每日会话重置不会截断它们;
/reset和显式session.reset策略仍会截断。 - 新的 CLI 会话通常只会从 OpenClaw 的压缩摘要加上压缩后尾部重新播种。要恢复压缩前失效的短会话,后端可以用
reseedFromRawTranscriptWhenUncompacted: true选择启用。原始 transcript 重新播种保持有界,并且仅限于安全失效场景,例如缺少 CLI transcript、孤立的工具使用尾部、消息策略/系统提示词/cwd/MCP 变更,或会话过期重试;凭证配置文件或凭证 epoch 变更绝不会重新播种原始 transcript 历史。
serialize: true 会让同一通道的运行保持有序(大多数 CLI 会在一个提供商通道上序列化)。当所选凭证身份变化时,OpenClaw 也会丢弃已存储的 CLI 会话复用,包括凭证配置文件 id、静态 API key、静态令牌,或 CLI 暴露 OAuth 账户身份时的 OAuth 账户身份变化;仅 OAuth access/refresh token 轮换不会截断会话。如果 CLI 没有稳定的 OAuth 账户 id,OpenClaw 会让该 CLI 自行强制其恢复权限。
来自 claude-cli 会话的回退前导上下文
当一次claude-cli 尝试失败并切换到 agents.defaults.model.fallbacks 中的非 CLI 候选项时,OpenClaw 会用从 Claude Code 本地 JSONL transcript(位于 ~/.claude/projects/ 下,按工作区作为键)中提取的上下文前导来播种下一次尝试。没有这个种子时,回退提供商会冷启动,因为 OpenClaw 自己的会话 transcript 对 claude-cli 运行来说是空的。
- 前导上下文优先使用最新的
/compact摘要或compact_boundary标记,然后在字符预算内追加最近的边界后轮次。边界前轮次会被丢弃,因为摘要已经表示了它们。 - 工具块会被合并成紧凑的
(tool call: name)和(tool result: …)提示,以保持提示词预算真实;过大的摘要会被截断并标记为(truncated)。 - 同提供商
claude-cli到claude-cli的回退依赖 Claude 自己的--resume,并跳过前导上下文。 - 该种子复用现有的 Claude 会话文件路径验证,因此无法读取任意路径。
图片
如果你的 CLI 接受图片路径,请设置imageArg:
imageArg,这些路径会作为 CLI 参数传递;如果没有设置,OpenClaw 会把文件路径追加到提示词中(路径注入),这适用于会从纯路径自动加载本地文件的 CLI。
输入和输出
output: "text"(默认)将 stdout 视为最终响应。output: "json"会尝试解析 JSON,并提取文本和会话 id。output: "jsonl"会解析 JSONL 流,并在存在时提取最终智能体消息和会话标识符。- 对于 Gemini CLI JSON 输出,当
usage缺失或为空时,OpenClaw 会从response读取回复文本,并从stats读取用量。内置 Gemini CLI 默认使用stream-json;旧的--output-format json覆盖仍会使用 JSON 解析器。
input: "arg"(默认)将提示词作为最后一个 CLI 参数传递。input: "stdin"通过 stdin 发送提示词。- 如果提示词很长且设置了
maxPromptArgChars,则改用 stdin。
插件拥有的默认值
CLI 后端默认值是插件表面的一部分:- 插件通过
api.registerCliBackend(...)注册它们。 - 后端
id会成为模型引用中的提供商前缀。 agents.defaults.cliBackends.<id>中的用户配置仍会覆盖插件默认值。- 后端特定的配置清理由可选的
normalizeConfig钩子继续由插件拥有。
claude-cli,Google 拥有 google-gemini-cli。OpenAI Codex 智能体运行通过 openai/* 使用 Codex app-server harness;OpenClaw 不再注册内置 codex-cli 后端。
内置 Anthropic 插件为 claude-cli 注册:
| 键 | 值 |
|---|---|
command | claude |
args | -p --output-format stream-json --include-partial-messages --verbose --setting-sources user --allowedTools mcp__openclaw__* --disallowedTools ScheduleWakeup,CronCreate,Bash(run_in_background:true),Monitor |
output | jsonl |
input | stdin |
modelArg | --model |
sessionArg | --session-id |
sessionMode | always |
imageArg | @ |
imagePathScope | workspace |
systemPromptFileArg | --append-system-prompt-file |
systemPromptMode | append |
google-gemini-cli:
| 键 | 值 |
|---|---|
command | gemini |
args | --skip-trust --approval-mode auto_edit --output-format stream-json --prompt {prompt} |
resumeArgs | 相同,并带有 --resume {sessionId} |
output / resumeOutput | jsonl |
jsonlDialect | gemini-stream-json |
imageArg | @ |
imagePathScope | workspace |
modelArg | --model |
sessionMode | existing |
sessionIdFields | ["session_id", "sessionId"] |
gemini 位于 PATH 上(brew install gemini-cli 或 npm install -g @google/gemini-cli)。
Gemini CLI 输出说明:
- 默认
stream-json解析器会读取助手message事件、工具事件、最终result用量以及致命 Gemini 错误事件。 - 如果你将 Gemini 参数覆盖为
--output-format json,OpenClaw 会把该后端规范化回output: "json",并从 JSONresponse字段读取回复文本。 - 当
usage缺失或为空时,用量会回退到stats;stats.cached会规范化为 OpenClawcacheRead,并且如果缺少stats.input,输入 token 会从stats.input_tokens - stats.cached推导。
command 路径)。
文本转换覆盖层
需要小型提示词/消息兼容性垫片的插件,可以声明双向文本转换,而无需替换提供商或 CLI 后端:input 会重写传递给 CLI 的系统提示词和用户提示词。output 会在 OpenClaw 处理自己的控制标记和渠道投递之前,重写流式助手文本和解析后的最终文本;对于由提供商支持的模型调用,它还会在流修复之后、工具执行之前,还原结构化工具调用参数中的字符串值。原始提供商 JSON 片段保持不变;消费者应使用结构化的 partial、end 或 result 载荷。
对于会发出提供商特定 JSONL 事件的 CLI,请在该后端的配置上设置 jsonlDialect:Claude Code 兼容流使用 claude-stream-json,Gemini CLI stream-json 事件使用 gemini-stream-json。
原生压缩所有权
某些 CLI 后端会运行一个自行压缩自身转录记录的智能体,因此 OpenClaw 不能对它们运行保障性摘要器,否则会与后端自身的压缩冲突,并可能导致该轮次硬失败。claude-cli 没有 harness 端点(Claude Code 会在内部压缩),因此它声明 ownsNativeCompaction: true,OpenClaw 的压缩路径会原样返回会话条目。Codex 等原生 harness 会话则继续路由到其 harness 压缩端点。
ownsNativeCompaction:它必须能够可靠地将自己的转录记录限制在上下文窗口附近,并持久化一个可恢复的会话(例如 --resume / --session-id),否则延迟会话可能会持续超出预算。
内置 MCP 覆盖层
CLI 后端不会直接接收 OpenClaw 工具调用,但后端可以通过bundleMcp: true 选择启用生成的 MCP 配置覆盖层。当前内置行为:
claude-cli:生成严格 MCP 配置文件。google-gemini-cli:生成 Gemini 系统设置文件。
- 启动一个 local loopback HTTP MCP 服务器,将 Gateway 网关工具暴露给 CLI 进程,并使用每会话 token(
OPENCLAW_MCP_TOKEN)进行认证; - 将工具访问范围限定到当前会话、账号和渠道上下文;
- 加载当前工作区启用的内置 MCP 服务器,并将其与任何现有后端 MCP 配置/设置形状合并;
- 使用所属插件提供的后端自有集成模式重写启动配置。
mcp.sessionIdleTtlMs 毫秒后回收(默认 10 分钟;设置为 0 可禁用)。身份验证探测、slug 生成和主动记忆召回等一次性嵌入式运行会在运行结束时请求清理,以免 stdio 子进程和 Streamable HTTP/SSE 流比本次运行存活更久。
重新播种历史上限
当新的 CLI 会话从先前的 OpenClaw 转录记录播种时(例如在session_expired 重试之后),渲染出的 <conversation_history> 块会被设定上限,以防重新播种提示词膨胀。默认值为 12,288 个字符(约 3,000 个 token)。
Claude CLI 后端会改为根据解析出的 Claude 上下文窗口缩放此上限:更大的上下文窗口会获得更大的先前历史切片,最高到固定上限;其他 CLI 后端保持保守默认值。此上限只控制重新播种提示词中的先前历史块,实时会话输出限制会在 reliability.outputLimits 下单独调优(参见 会话)。
限制
- 无直接 OpenClaw 工具调用:OpenClaw 不会将工具调用注入 CLI 后端协议。只有当后端选择启用
bundleMcp: true时,后端才会看到 Gateway 网关工具。 - 流式传输因后端而异:一些后端会流式传输 JSONL,另一些会缓冲到退出时。
- 结构化输出取决于 CLI 自身的 JSON 格式。
故障排查
| 症状 | 修复方式 |
|---|---|
| 找不到 CLI | 将 command 设置为完整路径。 |
| 模型名称错误 | 使用 modelAliases 将 provider/model 映射到 CLI 的模型 ID。 |
| 无会话连续性 | 确保已设置 sessionArg,并且 sessionMode 不是 none。 |
| 图片被忽略 | 设置 imageArg 并确认 CLI 支持文件路径。 |