快速开始
ACP 智能体
Agent Client Protocol (ACP) 会话 让 OpenClaw 能够通过 ACP 后端插件运行外部编码运行框架(例如 Pi、Claude Code、 Cursor、Copilot、Droid、OpenClaw ACP、OpenCode、Gemini CLI 以及其他 受支持的 ACPX 运行框架)。
每次 ACP 会话生成都会被跟踪为一个后台任务。
我应该看哪一页?
| 你想要… | 使用 | 备注 |
|---|---|---|
| 在当前对话中绑定或控制 Codex | /codex bind、/codex threads |
启用 codex 插件时使用原生 Codex 应用服务器路径;包括绑定聊天回复、图片转发、模型/快速模式/权限、停止和 Steer 控制。ACP 是显式回退 |
| 通过 OpenClaw 运行 Claude Code、Gemini CLI、显式 Codex ACP 或其他外部运行框架 | 本页 | 绑定聊天的会话、/acp spawn、sessions_spawn({ runtime: "acp" })、后台任务、运行时控制 |
| 将 OpenClaw Gateway 网关会话作为 ACP 服务器暴露给编辑器或客户端 | openclaw acp |
桥接模式。IDE/客户端通过 stdio/WebSocket 与 OpenClaw 进行 ACP 通信 |
| 复用本地 AI CLI 作为纯文本回退模型 | CLI 后端 | 不是 ACP。没有 OpenClaw 工具,没有 ACP 控制,也没有运行框架运行时 |
这能开箱即用吗?
可以,在安装官方 ACP 运行时插件之后:
openclaw plugins install @openclaw/acpxopenclaw config set plugins.entries.acpx.enabled true源码检出在执行 pnpm install 后可以使用本地 extensions/acpx 工作区插件。
运行 /acp doctor 进行就绪检查。
只有当 ACP 真正可用时,OpenClaw 才会向 Agent 告知 ACP 生成能力:
ACP 必须已启用,分发不得被禁用,当前会话不得被沙箱阻止,并且必须已加载
运行时后端。如果这些条件不满足,ACP 插件 Skills 和
sessions_spawn ACP 指引会保持隐藏,以免 Agent 建议一个不可用的后端。
首次运行注意事项
- 如果设置了
plugins.allow,它就是限制性的插件清单,并且必须包含acpx;否则已安装的 ACP 后端会被有意阻止,/acp doctor会报告缺失的 allowlist 条目。 - Codex ACP 适配器随
acpx插件一起预置,并在可行时本地启动。 - Codex ACP 使用隔离的
CODEX_HOME运行;OpenClaw 只会从主机 Codex 配置复制受信任的项目条目,并信任当前工作区,将凭证、通知和钩子留在主机配置中。 - 其他目标运行框架适配器在你首次使用时仍可能按需通过
npx获取。 - 供应商凭证仍必须存在于该运行框架的主机上。
- 如果主机没有 npm 或网络访问权限,首次运行的适配器获取会失败,直到缓存预热完成,或通过其他方式安装适配器。
运行时前置条件
ACP 会启动一个真实的外部运行框架进程。OpenClaw 负责路由、 后台任务状态、投递、绑定和策略;运行框架负责其提供商登录、 模型目录、文件系统行为和原生工具。
在归咎于 OpenClaw 之前,请确认:
/acp doctor报告后端已启用且健康。- 设置了
acp.allowedAgentsallowlist 时,目标 ID 被允许。 - 运行框架命令可以在 Gateway 网关主机上启动。
- 该运行框架存在提供商凭证(
claude、codex、gemini、opencode、droid等)。 - 所选模型存在于该运行框架中 - 模型 ID 不能跨运行框架移植。
- 请求的
cwd存在且可访问,或者省略cwd,让后端使用其默认值。 - 权限模式匹配工作内容。非交互式会话无法点击原生权限提示,因此写入/执行较重的编码运行通常需要一个可无头继续的 ACPX 权限配置。
默认情况下,OpenClaw 插件工具和内置 OpenClaw 工具不会暴露给 ACP 运行框架。只有当运行框架应直接调用这些工具时,才在 ACP Agents 设置中启用显式 MCP 桥接。
支持的运行框架目标
使用 acpx 后端时,请将这些运行框架 ID 用作 /acp spawn <id>
或 sessions_spawn({ runtime: "acp", agentId: "<id>" }) 目标:
| 运行框架 ID | 典型后端 | 备注 |
|---|---|---|
claude |
Claude Code ACP 适配器 | 需要主机上的 Claude Code 凭证。 |
codex |
Codex ACP 适配器 | 仅当原生 /codex 不可用或请求 ACP 时,作为显式 ACP 回退。 |
copilot |
GitHub Copilot ACP 适配器 | 需要 Copilot CLI/运行时凭证。 |
cursor |
Cursor CLI ACP (cursor-agent acp) |
如果本地安装暴露了不同的 ACP 入口点,请覆盖 acpx 命令。 |
droid |
Factory Droid CLI | 需要运行框架环境中的 Factory/Droid 凭证或 FACTORY_API_KEY。 |
gemini |
Gemini CLI ACP 适配器 | 需要 Gemini CLI 凭证或 API key 设置。 |
iflow |
iFlow CLI | 适配器可用性和模型控制取决于已安装的 CLI。 |
kilocode |
Kilo Code CLI | 适配器可用性和模型控制取决于已安装的 CLI。 |
kimi |
Kimi/Moonshot CLI | 需要主机上的 Kimi/Moonshot 凭证。 |
kiro |
Kiro CLI | 适配器可用性和模型控制取决于已安装的 CLI。 |
opencode |
OpenCode ACP 适配器 | 需要 OpenCode CLI/提供商凭证。 |
openclaw |
通过 openclaw acp 的 OpenClaw Gateway 网关桥接 |
让支持 ACP 的运行框架回连到 OpenClaw Gateway 网关会话。 |
pi |
Pi/嵌入式 OpenClaw 运行时 | 用于 OpenClaw 原生运行框架实验。 |
qwen |
Qwen Code / Qwen CLI | 需要主机上的 Qwen 兼容凭证。 |
自定义 acpx Agent 别名可以在 acpx 自身中配置,但 OpenClaw
策略在分发前仍会检查 acp.allowedAgents 以及任何
agents.list[].runtime.acp.agent 映射。
操作员运行手册
从聊天中使用快速 /acp 流程:
生成
/acp spawn claude --bind here、
/acp spawn gemini --mode persistent --thread auto,或显式
/acp spawn codex --bind here。
工作
在绑定的对话或线程中继续(或显式指定会话 键作为目标)。
检查状态
/acp status
调优
/acp model <provider/model>、
/acp permissions <profile>、
/acp timeout <seconds>。
Steer
不替换上下文:/acp steer tighten logging and continue。
停止
/acp cancel(当前轮次)或 /acp close(会话 + 绑定)。
生命周期详情
- 生成会创建或恢复 ACP 运行时会话,在 OpenClaw 会话存储中记录 ACP 元数据,并且当运行由父级拥有时可能创建后台任务。
- 父级拥有的 ACP 会话会被视为后台工作,即使运行时会话是持久的;完成和跨界面投递会通过父任务通知器进行,而不是像普通面向用户的聊天会话那样处理。
- 任务维护会关闭终止或孤立的父级拥有的一次性 ACP 会话。持久 ACP 会话会在仍存在活跃对话绑定时保留;没有活跃绑定的陈旧持久会话会被关闭,以免在所属任务完成或其任务记录消失后被静默恢复。
- 绑定的后续消息会直接发送到 ACP 会话,直到绑定被关闭、取消聚焦、重置或过期。
- Gateway 网关命令保持本地执行。
/acp ...、/status和/unfocus永远不会作为普通提示文本发送给绑定的 ACP 运行框架。 - 当后端支持取消时,
cancel会中止活跃轮次;它不会删除绑定或会话元数据。 close会从 OpenClaw 的角度结束 ACP 会话并移除绑定。如果运行框架支持恢复,它可能仍保留自己的上游历史。close后,acpx 插件会清理 OpenClaw 拥有的包装器和适配器进程树,并在 Gateway 网关启动期间回收陈旧的 OpenClaw 拥有的 ACPX 孤儿进程。- 空闲运行时 worker 在
acp.runtime.ttlMinutes后可被清理;存储的会话元数据仍可供/acp sessions使用。
原生 Codex 路由规则
在启用原生 Codex 插件时,以下自然语言触发器应路由到它:
- “将此 Discord 渠道绑定到 Codex。”
- “将此聊天附加到 Codex 线程
<id>。” - “显示 Codex 线程,然后绑定这一个。”
Native Codex 对话绑定是默认的聊天控制路径。
OpenClaw 动态工具仍通过 OpenClaw 执行,而
shell/apply-patch 等 Codex 原生工具在 Codex 内部执行。
对于 Codex 原生工具事件,OpenClaw 会注入按轮次生效的原生
hook 中继,使插件钩子可以阻止 before_tool_call、观察
after_tool_call,并通过 OpenClaw 审批路由 Codex PermissionRequest 事件。
Codex Stop 钩子会中继到
OpenClaw before_agent_finalize,插件可在此请求再进行一次
模型传递,然后 Codex 才最终确定答案。该中继刻意保持
保守:它不会变更 Codex 原生工具
参数,也不会重写 Codex 线程记录。只有在
你需要 ACP 运行时/会话模型时,才使用显式 ACP。嵌入式 Codex
支持边界记录在
Codex harness v1 支持契约中。
模型 / 提供商 / 运行时选择速查表
openai-codex/*- 由 Doctor 修复的旧版 Codex OAuth/订阅模型路由。openai/*- 用于 OpenAI agent 轮次的原生 Codex 应用服务器嵌入式运行时。/codex ...- 原生 Codex 对话控制。/acp ...或runtime: "acp"- 显式 ACP/acpx 控制。
ACP 路由自然语言触发条件
应路由到 ACP 运行时的触发条件:
- “将此作为一次性 Claude Code ACP 会话运行,并总结结果。”
- “为此任务在线程中使用 Gemini CLI,然后将后续跟进保留在同一个线程中。”
- “通过 ACP 在后台线程中运行 Codex。”
OpenClaw 选择 runtime: "acp",解析 harness agentId,
在支持时绑定到当前对话或线程,并
将后续跟进路由到该会话,直到关闭/过期。只有在 ACP/acpx 为显式指定,
或请求的操作无法使用原生 Codex
插件时,Codex 才会走这一路径。
对于 sessions_spawn,仅当 ACP
已启用、请求者未被沙箱隔离且已加载 ACP 运行时
后端时,才会公开 runtime: "acp"。acp.dispatch.enabled=false 会暂停自动
ACP 线程分发,但不会隐藏或阻止显式
sessions_spawn({ runtime: "acp" }) 调用。它面向 codex、
claude、droid、gemini 或 opencode 等 ACP harness id。不要传入来自
agents_list 的普通 OpenClaw 配置 agent id,除非该条目
已显式配置为 agents.list[].runtime.type="acp";
否则请使用默认 sub-agent 运行时。当 OpenClaw agent
配置为 runtime.type="acp" 时,OpenClaw 会使用
runtime.acp.agent 作为底层 harness id。
ACP 与 sub-agents
需要外部 harness 运行时时使用 ACP。当 codex
插件已启用时,使用原生 Codex
应用服务器进行 Codex 对话绑定/控制。需要 OpenClaw 原生
委派运行时使用 sub-agents。
| 区域 | ACP 会话 | Sub-agent 运行 |
|---|---|---|
| 运行时 | ACP 后端插件(例如 acpx) | OpenClaw 原生 sub-agent 运行时 |
| 会话键 | agent:<agentId>:acp:<uuid> |
agent:<agentId>:subagent:<uuid> |
| 主命令 | /acp ... |
/subagents ... |
| 生成工具 | 带 runtime:"acp" 的 sessions_spawn |
sessions_spawn(默认运行时) |
另请参阅 Sub-agents。
ACP 如何运行 Claude Code
对于通过 ACP 使用 Claude Code,其栈为:
- OpenClaw ACP 会话控制平面。
- 官方
@openclaw/acpx运行时插件。 - Claude ACP 适配器。
- Claude 侧运行时/会话机制。
ACP Claude 是一个带有 ACP 控制、会话恢复、 后台任务跟踪以及可选对话/线程绑定的 harness 会话。
CLI 后端是独立的纯文本本地回退运行时 - 请参阅 CLI 后端。
对操作者而言,实用规则是:
- 需要
/acp spawn、可绑定会话、运行时控制或持久 harness 工作? 使用 ACP。 - 需要通过原始 CLI 进行简单本地文本回退? 使用 CLI 后端。
绑定会话
心智模型
- 聊天界面 - 人们持续对话的位置(Discord 频道、Telegram 话题、iMessage 聊天)。
- ACP 会话 - OpenClaw 路由到的持久 Codex/Claude/Gemini 运行时状态。
- 子线程/话题 - 仅由
--thread ...创建的可选额外消息界面。 - 运行时工作区 - harness 运行所在的文件系统位置(
cwd、仓库检出、后端工作区)。独立于聊天界面。
当前对话绑定
/acp spawn <harness> --bind here 将当前对话固定到
生成的 ACP 会话 - 无子线程,同一聊天界面。OpenClaw 继续
负责传输、认证、安全和投递。该对话中的后续消息
会路由到同一个会话;/new 和 /reset 在原位重置
会话;/acp close 移除绑定。
示例:
/codex bind # native Codex bind, route future messages here/codex model gpt-5.4 # tune the bound native Codex thread/codex stop # control the active native Codex turn/acp spawn codex --bind here # explicit ACP fallback for Codex/acp spawn codex --thread auto # may create a child thread/topic and bind there/acp spawn codex --bind here --cwd /workspace/repo # same chat binding, Codex runs in /workspace/repo绑定规则和独占性
--bind here和--thread ...互斥。--bind here仅适用于声明支持当前对话绑定的渠道;否则 OpenClaw 会返回清晰的不支持消息。绑定会在 Gateway 网关重启后保留。- 在 Discord 上,
spawnSessions控制--thread auto|here的子线程创建 - 不控制--bind here。 - 如果在未指定
--cwd的情况下生成到另一个 ACP agent,OpenClaw 默认继承目标 agent 的工作区。缺失的继承路径(ENOENT/ENOTDIR)会回退到后端默认值;其他访问错误(例如EACCES)会作为生成错误显示。 - Gateway 网关管理命令在绑定对话中保持本地处理 - 即使普通后续文本会路由到绑定的 ACP 会话,
/acp ...命令仍由 OpenClaw 处理;只要该界面启用了命令处理,/status和/unfocus也会保持本地处理。
线程绑定会话
当渠道适配器启用线程绑定时:
- OpenClaw 将线程绑定到目标 ACP 会话。
- 该线程中的后续消息会路由到绑定的 ACP 会话。
- ACP 输出会投递回同一线程。
- Unfocus/关闭/归档/空闲超时或最大年龄过期会移除绑定。
/acp close、/acp cancel、/acp status、/status和/unfocus是 Gateway 网关命令,不是发给 ACP harness 的提示。
线程绑定 ACP 所需的功能标志:
acp.enabled=trueacp.dispatch.enabled默认开启(设置为false可暂停自动 ACP 线程分发;显式sessions_spawn({ runtime: "acp" })调用仍可工作)。- 已启用渠道适配器线程会话生成(默认:
true):- Discord:
channels.discord.threadBindings.spawnSessions=true - Telegram:
channels.telegram.threadBindings.spawnSessions=true
- Discord:
线程绑定支持因适配器而异。如果活动渠道 适配器不支持线程绑定,OpenClaw 会返回清晰的 不支持/不可用消息。
支持线程的渠道
- 任何公开会话/线程绑定能力的渠道适配器。
- 当前内置支持:Discord 线程/频道、Telegram 话题(群组/超级群组中的论坛话题和私信话题)。
- 插件渠道可以通过同一个绑定接口添加支持。
持久渠道绑定
对于非临时工作流,请在
顶层 bindings[] 条目中配置持久 ACP 绑定。
绑定模型
bindings[].type"acp"标记一个持久 ACP 对话绑定。
bindings[].matchobject标识目标对话。各渠道形状如下:
- Discord 频道/线程:
match.channel="discord"+match.peer.id="<channelOrThreadId>" - Slack 频道/私信:
match.channel="slack"+match.peer.id="<channelId|channel:<channelId>|#<channelId>|userId|user:<userId>|slack:<userId>|<@userId>>"。优先使用稳定的 Slack id;频道绑定也会匹配该频道线程内的回复。 - Telegram 论坛话题:
match.channel="telegram"+match.peer.id="<chatId>:topic:<topicId>" - iMessage 私信/群组:
match.channel="imessage"+match.peer.id="<handle|chat_id:*|chat_guid:*|chat_identifier:*>"。对于稳定的群组绑定,优先使用chat_id:*。
bindings[].agentIdstring所属 OpenClaw agent id。
bindings[].acp.mode"persistent" | "oneshot"可选 ACP 覆盖。
bindings[].acp.labelstring可选的面向操作者标签。
bindings[].acp.cwdstring可选的运行时工作目录。
bindings[].acp.backendstring可选的后端覆盖。
每个 agent 的运行时默认值
使用 agents.list[].runtime 为每个 agent 一次性定义 ACP 默认值:
agents.list[].runtime.type="acp"agents.list[].runtime.acp.agent(harness id,例如codex或claude)agents.list[].runtime.acp.backendagents.list[].runtime.acp.modeagents.list[].runtime.acp.cwd
ACP 绑定会话的覆盖优先级:
bindings[].acp.*agents.list[].runtime.acp.*- 全局 ACP 默认值(例如
acp.backend)
示例
{ agents: { list: [ { id: "codex", runtime: { type: "acp", acp: { agent: "codex", backend: "acpx", mode: "persistent", cwd: "/workspace/openclaw", }, }, }, { id: "claude", runtime: { type: "acp", acp: { agent: "claude", backend: "acpx", mode: "persistent" }, }, }, ], }, bindings: [ { type: "acp", agentId: "codex", match: { channel: "discord", accountId: "default", peer: { kind: "channel", id: "222222222222222222" }, }, acp: { label: "codex-main" }, }, { type: "acp", agentId: "claude", match: { channel: "telegram", accountId: "default", peer: { kind: "group", id: "-1001234567890:topic:42" }, }, acp: { cwd: "/workspace/repo-b" }, }, { type: "route", agentId: "main", match: { channel: "discord", accountId: "default" }, }, { type: "route", agentId: "main", match: { channel: "telegram", accountId: "default" }, }, ], channels: { discord: { guilds: { "111111111111111111": { channels: { "222222222222222222": { requireMention: false }, }, }, }, }, telegram: { groups: { "-1001234567890": { topics: { "42": { requireMention: false } }, }, }, }, },}行为
- OpenClaw 会在使用前确保配置的 ACP 会话存在。
- 该渠道或主题中的消息会路由到配置的 ACP 会话。
- 在绑定的对话中,
/new和/reset会就地重置同一个 ACP 会话键。 - 临时运行时绑定(例如由线程聚焦流程创建的绑定)在存在时仍会生效。
- 对于没有显式
cwd的跨智能体 ACP 生成,OpenClaw 会从智能体配置继承目标智能体工作区。 - 缺失的继承工作区路径会回退到后端默认 cwd;非缺失路径的访问失败会作为生成错误暴露。
启动 ACP 会话
启动 ACP 会话有两种方式:
From sessions_spawn
使用 runtime: "acp" 从智能体轮次或工具调用启动 ACP 会话。
{ "task": "Open the repo and summarize failing tests", "runtime": "acp", "agentId": "codex", "thread": true, "mode": "session"}From /acp command
使用 /acp spawn 从聊天中进行显式操作员控制。
/acp spawn codex --mode persistent --thread auto/acp spawn codex --mode oneshot --thread off/acp spawn codex --bind here/acp spawn codex --thread here关键标志:
--mode persistent|oneshot--bind here|off--thread auto|here|off--cwd <absolute-path>--label <name>
参见 斜杠命令。
sessions_spawn 参数
taskstringrequired发送给 ACP 会话的初始提示词。
runtime"acp"required对于 ACP 会话,必须是 "acp"。
agentIdstringACP 目标 harness id。如果已设置,则回退到 acp.defaultAgent。
threadbooleandefault: false在受支持的位置请求线程绑定流程。
mode"run" | "session"default: run"run" 是一次性模式;"session" 是持久模式。如果 thread: true 且省略
mode,OpenClaw 可能会按运行时路径默认使用持久行为。
mode: "session" 需要 thread: true。
cwdstring请求的运行时工作目录(由后端/运行时策略验证)。如果省略,ACP 生成会在已配置时继承目标智能体工作区;缺失的继承路径会回退到后端默认值,而真实访问错误会被返回。
labelstring会话/横幅文本中面向操作员的标签。
resumeSessionIdstring恢复现有 ACP 会话,而不是创建新会话。智能体会通过 session/load 重放其对话历史。需要 runtime: "acp"。
streamTo"parent""parent" 会把初始 ACP 运行进度摘要作为系统事件流式传回请求方会话。接受的响应包括
streamLogPath,它指向会话作用域的 JSONL 日志
(<sessionId>.acp-stream.jsonl),你可以 tail 它以查看完整中继历史。
runTimeoutSecondsnumber在 N 秒后中止 ACP 子轮次。0 会让该轮次走 Gateway 网关的无超时路径。相同的值会应用于 Gateway 网关运行和 ACP 运行时,因此停滞或配额耗尽的 harness 不会无限期占用父智能体通道。
modelstringACP 子会话的显式模型覆盖。Codex ACP 生成会在 session/new 之前,把
openai-codex/gpt-5.4 等 OpenClaw Codex 引用规范化为 Codex ACP 启动配置;openai-codex/gpt-5.4/high 等斜杠形式也会设置 Codex ACP 推理强度。其他 harness 必须声明 ACP models 并支持
session/set_model;否则 OpenClaw/acpx 会明确失败,而不是静默回退到目标智能体默认值。
thinkingstring显式思考/推理强度。对于 Codex ACP,minimal 映射到低强度,low/medium/high/xhigh 直接映射,off 会省略推理强度启动覆盖。
生成绑定和线程模式
--bind here|off
| 模式 | 行为 |
|---|---|
here |
就地绑定当前活动对话;如果没有活动对话则失败。 |
off |
不创建当前对话绑定。 |
注意:
--bind here是“让这个渠道或聊天由 Codex 支持”的最简单操作员路径。--bind here不会创建子线程。--bind here仅适用于暴露当前对话绑定支持的渠道。--bind和--thread不能在同一个/acp spawn调用中组合使用。
--thread auto|here|off
| 模式 | 行为 |
|---|---|
auto |
在活动线程中:绑定该线程。在线程外:在受支持时创建/绑定子线程。 |
here |
要求当前活动线程;如果不在线程中则失败。 |
off |
不绑定。会话以未绑定状态启动。 |
注意:
- 在非线程绑定界面上,默认行为实际上是
off。 - 线程绑定生成需要渠道策略支持:
- Discord:
channels.discord.threadBindings.spawnSessions=true - Telegram:
channels.telegram.threadBindings.spawnSessions=true
- Discord:
- 当你想固定当前对话而不创建子线程时,使用
--bind here。
交付模型
ACP 会话可以是交互式工作区,也可以是父级拥有的后台工作。交付路径取决于其形态。
Interactive ACP sessions
交互式会话用于在可见聊天界面上持续对话:
/acp spawn ... --bind here会将当前对话绑定到 ACP 会话。/acp spawn ... --thread ...会将渠道线程/主题绑定到 ACP 会话。- 持久配置的
bindings[].type="acp"会把匹配的对话路由到同一个 ACP 会话。
绑定对话中的后续消息会直接路由到 ACP 会话,ACP 输出会交付回同一个渠道/线程/主题。
OpenClaw 发送给 harness 的内容:
- 普通绑定后续消息会作为提示词文本发送,并且仅在 harness/后端支持时附带附件。
/acp管理命令和本地 Gateway 网关命令会在 ACP 分发前被拦截。- 运行时生成的完成事件会按目标具体化。OpenClaw 智能体会收到 OpenClaw 的内部运行时上下文信封;外部 ACP harness 会收到包含子结果和指令的普通提示词。原始
<<<BEGIN_OPENCLAW_INTERNAL_CONTEXT>>>信封绝不应发送给外部 harness,也不应作为 ACP 用户转录文本持久化。 - ACP 转录条目使用用户可见的触发文本或普通完成提示词。内部事件元数据会尽可能在 OpenClaw 中保持结构化,并且不会被当作用户创作的聊天内容。
Parent-owned one-shot ACP sessions
由另一个智能体运行生成的一次性 ACP 会话是后台子级,类似于子智能体:
- 父级通过
sessions_spawn({ runtime: "acp", mode: "run" })请求工作。 - 子级在自己的 ACP harness 会话中运行。
- 子轮次在原生子智能体生成使用的同一个后台通道上运行,因此缓慢的 ACP harness 不会阻塞无关的主会话工作。
- 完成结果会通过任务完成通知路径回报。OpenClaw 会先把内部完成元数据转换为普通 ACP 提示词,再发送给外部 harness,因此 harness 不会看到仅供 OpenClaw 使用的运行时上下文标记。
- 当面向用户的回复有用时,父级会用普通助手语气重写子结果。
不要把此路径视为父级和子级之间的对等聊天。子级已经有返回父级的完成渠道。
sessions_send and A2A delivery
sessions_send 可以在生成后以另一个会话为目标。对于普通对等会话,OpenClaw 会在注入消息后使用智能体到智能体(A2A)后续路径:
- 等待目标会话的回复。
- 可选地让请求方和目标交换有界数量的后续轮次。
- 要求目标生成一条通知消息。
- 将该通知交付到可见渠道或线程。
该 A2A 路径是对等发送的回退路径,用于发送方需要可见后续内容的情况。当无关会话可以看到并向 ACP 目标发送消息时,例如在宽松的
tools.sessions.visibility 设置下,它会保持启用。
只有当请求方是其自己父级拥有的一次性 ACP 子级的父级时,OpenClaw 才会跳过 A2A 后续流程。在这种情况下,在任务完成之上运行 A2A 可能会用子级结果唤醒父级,把父级的回复转发回子级,并创建父级/子级回声循环。对于这种拥有的子级情况,sessions_send 结果会报告
delivery.status="skipped",因为完成路径已经负责结果。
Resume an existing session
使用 resumeSessionId 继续之前的 ACP 会话,而不是重新开始。智能体会通过
session/load 重放其对话历史,因此会带着之前内容的完整上下文继续。
{ "task": "Continue where we left off - fix the remaining test failures", "runtime": "acp", "agentId": "codex", "resumeSessionId": "<previous-session-id>"}常见用例:
- 将 Codex 会话从你的笔记本电脑移交到手机,并告诉你的智能体从离开的位置继续。
- 继续你在 CLI 中以交互方式启动的编码会话,现在通过你的智能体以无头方式继续。
- 接续因 Gateway 网关重启或空闲超时而中断的工作。
注意:
resumeSessionId仅在runtime: "acp"时适用;默认子智能体运行时会忽略此仅限 ACP 的字段。streamTo仅在runtime: "acp"时适用;默认子智能体运行时会忽略此仅限 ACP 的字段。resumeSessionId是主机本地 ACP/harness 恢复 id,而不是 OpenClaw 渠道会话键;OpenClaw 在分发前仍会检查 ACP 生成策略和目标智能体策略,而加载该上游 id 的授权由 ACP 后端或 harness 拥有。resumeSessionId会恢复上游 ACP 对话历史;thread和mode仍会正常应用于你正在创建的新 OpenClaw 会话,因此mode: "session"仍需要thread: true。- 目标智能体必须支持
session/load(Codex 和 Claude Code 支持)。 - 如果找不到会话 id,生成会以明确错误失败,不会静默回退到新会话。
Post-deploy smoke test
Gateway 网关部署后,运行实时端到端检查,而不是信任单元测试:
- 验证目标主机上已部署的 Gateway 网关版本和提交。
- 打开一个到实时智能体的临时 ACPX bridge 会话。
- 要求该智能体调用
sessions_spawn,并使用runtime: "acp"、agentId: "codex"、mode: "run",任务为Reply with exactly LIVE-ACP-SPAWN-OK。 - 验证
accepted=yes、真实的childSessionKey,并且没有验证器错误。 - 清理临时 bridge 会话。
将门禁保持在 mode: "run",并跳过 streamTo: "parent" -
线程绑定的 mode: "session" 和流中继路径是单独的
更丰富集成验证流程。
沙箱兼容性
ACP 会话当前在主机运行时上运行,不在 OpenClaw 沙箱内运行。
当前限制:
- 如果请求方会话是沙箱隔离的,则 ACP 派生会同时阻止
sessions_spawn({ runtime: "acp" })和/acp spawn。 - 使用
runtime: "acp"的sessions_spawn不支持sandbox: "require"。
会话目标解析
大多数 /acp 操作接受可选的会话目标(session-key、
session-id 或 session-label)。
解析顺序:
- 显式目标参数(或
/acp steer的--session)- 尝试 key
- 然后尝试 UUID 形状的会话 id
- 然后尝试标签
- 当前线程绑定(如果此对话/线程已绑定到 ACP 会话)。
- 当前请求方会话回退。
当前对话绑定和线程绑定都会参与 步骤 2。
如果无法解析目标,OpenClaw 会返回清晰的错误
(Unable to resolve session target: ...)。
ACP 控制
| 命令 | 作用 | 示例 |
|---|---|---|
/acp spawn |
创建 ACP 会话;可选当前绑定或线程绑定。 | /acp spawn codex --bind here --cwd /repo |
/acp cancel |
取消目标会话的进行中轮次。 | /acp cancel agent:codex:acp:<uuid> |
/acp steer |
向运行中的会话发送 Steer 指令。 | /acp steer --session support inbox prioritize failing tests |
/acp close |
关闭会话并解除线程目标绑定。 | /acp close |
/acp status |
显示后端、模式、状态、运行时选项和能力。 | /acp status |
/acp set-mode |
设置目标会话的运行时模式。 | /acp set-mode plan |
/acp set |
写入通用运行时配置选项。 | /acp set model openai/gpt-5.4 |
/acp cwd |
设置运行时工作目录覆盖。 | /acp cwd /Users/user/Projects/repo |
/acp permissions |
设置审批策略配置文件。 | /acp permissions strict |
/acp timeout |
设置运行时超时时间(秒)。 | /acp timeout 120 |
/acp model |
设置运行时模型覆盖。 | /acp model anthropic/claude-opus-4-6 |
/acp reset-options |
移除会话运行时选项覆盖。 | /acp reset-options |
/acp sessions |
从存储中列出最近的 ACP 会话。 | /acp sessions |
/acp doctor |
后端健康状态、能力和可执行修复项。 | /acp doctor |
/acp install |
打印确定性的安装和启用步骤。 | /acp install |
/acp status 会显示生效的运行时选项,以及运行时级别和
后端级别的会话标识符。当后端缺少某项能力时,不受支持的控制错误会
清晰浮现。/acp sessions 会读取当前绑定会话或请求方会话的
存储;目标令牌(session-key、session-id 或 session-label)
会通过 Gateway 网关会话发现进行解析,包括自定义的每智能体 session.store
根目录。
运行时选项映射
/acp 提供便捷命令和通用设置器。等效
操作:
| 命令 | 映射到 | 备注 |
|---|---|---|
/acp model <id> |
运行时配置键 model |
对于 Codex ACP,OpenClaw 会将 openai-codex/<model> 规范化为适配器模型 id,并将斜杠推理后缀(例如 openai-codex/gpt-5.4/high)映射到 reasoning_effort。 |
/acp set thinking <level> |
规范选项 thinking |
OpenClaw 会在存在时发送后端声明的等效项,优先使用 thinking,然后是 effort、reasoning_effort 或 thought_level。对于 Codex ACP,适配器会将值映射到 reasoning_effort。 |
/acp permissions <profile> |
规范选项 permissionProfile |
OpenClaw 会在存在时发送后端声明的等效项,例如 approval_policy、permission_profile、permissions 或 permission_mode。 |
/acp timeout <seconds> |
规范选项 timeoutSeconds |
OpenClaw 会在存在时发送后端声明的等效项,例如 timeout 或 timeout_seconds。 |
/acp cwd <path> |
运行时 cwd 覆盖 | 直接更新。 |
/acp set <key> <value> |
通用 | key=cwd 使用 cwd 覆盖路径。 |
/acp reset-options |
清除所有运行时覆盖 | - |
acpx harness、插件设置和权限
有关 acpx harness 配置(Claude Code / Codex / Gemini CLI 别名)、plugin-tools 和 OpenClaw-tools MCP bridges,以及 ACP 权限模式,请参阅 ACP Agents 设置。
故障排除
| 症状 | 可能原因 | 修复方法 |
|---|---|---|
ACP runtime backend is not configured |
后端插件缺失、已禁用,或被 plugins.allow 阻止。 |
安装并启用后端插件;如果设置了该允许列表,请在 plugins.allow 中包含 acpx,然后运行 /acp doctor。 |
ACP is disabled by policy (acp.enabled=false) |
ACP 已全局禁用。 | 设置 acp.enabled=true。 |
ACP dispatch is disabled by policy (acp.dispatch.enabled=false) |
已禁用从普通线程消息自动调度。 | 设置 acp.dispatch.enabled=true 以恢复自动线程路由;显式 sessions_spawn({ runtime: "acp" }) 调用仍然可用。 |
ACP agent "<id>" is not allowed by policy |
智能体不在允许列表中。 | 使用允许的 agentId,或更新 acp.allowedAgents。 |
/acp doctor reports backend not ready right after startup |
后端插件缺失、已禁用、被允许/拒绝策略阻止,或其配置的可执行文件不可用。 | 安装/启用后端插件,重新运行 /acp doctor;如果仍然不健康,请检查后端安装或策略错误。 |
| Harness command not found | 适配器 CLI 未安装、外部插件缺失,或非 Codex 适配器的首次运行 npx 拉取失败。 |
运行 /acp doctor,在 Gateway 网关主机上安装/预热适配器,或显式配置 acpx 智能体命令。 |
| Model-not-found from the harness | 模型 ID 对另一个提供商/harness 有效,但对这个 ACP 目标无效。 | 使用该 harness 列出的模型,在 harness 中配置模型,或省略覆盖项。 |
| Vendor auth error from the harness | OpenClaw 健康,但目标 CLI/提供商未登录。 | 在 Gateway 网关主机环境中登录,或提供所需的提供商密钥。 |
Unable to resolve session target: ... |
键/ID/标签令牌错误。 | 运行 /acp sessions,复制确切的键/标签,然后重试。 |
--bind here requires running /acp spawn inside an active ... conversation |
在没有活动可绑定对话的情况下使用了 --bind here。 |
移动到目标聊天/渠道后重试,或使用未绑定的 spawn。 |
Conversation bindings are unavailable for <channel>. |
适配器缺少当前对话 ACP 绑定能力。 | 在支持的位置使用 /acp spawn ... --thread ...,配置顶层 bindings[],或移动到支持的渠道。 |
--thread here requires running /acp spawn inside an active ... thread |
在非线程上下文中使用了 --thread here。 |
移动到目标线程,或使用 --thread auto/off。 |
Only <user-id> can rebind this channel/conversation/thread. |
另一个用户拥有活动绑定目标。 | 以所有者身份重新绑定,或使用其他对话或线程。 |
Thread bindings are unavailable for <channel>. |
适配器缺少线程绑定能力。 | 使用 --thread off,或移动到支持的适配器/渠道。 |
Sandboxed sessions cannot spawn ACP sessions ... |
ACP 运行时位于主机侧;请求方会话已沙箱隔离。 | 从沙箱隔离会话中使用 runtime="subagent",或从非沙箱隔离会话运行 ACP spawn。 |
sessions_spawn sandbox="require" is unsupported for runtime="acp" ... |
为 ACP 运行时请求了 sandbox="require"。 |
对必需的沙箱隔离使用 runtime="subagent",或从非沙箱隔离会话使用带 sandbox="inherit" 的 ACP。 |
Cannot apply --model ... did not advertise model support |
目标 harness 未公开通用 ACP 模型切换。 | 使用声明支持 ACP models/session/set_model 的 harness,使用 Codex ACP 模型引用,或在 harness 有自己的启动标志时直接在其中配置模型。 |
| Missing ACP metadata for bound session | ACP 会话元数据陈旧/已删除。 | 使用 /acp spawn 重新创建,然后重新绑定/聚焦线程。 |
AcpRuntimeError: Permission prompt unavailable in non-interactive mode |
permissionMode 在非交互式 ACP 会话中阻止写入/执行。 |
将 plugins.entries.acpx.config.permissionMode 设置为 approve-all 并重启 Gateway 网关。参见权限配置。 |
| ACP session fails early with little output | 权限提示被 permissionMode/nonInteractivePermissions 阻止。 |
检查 Gateway 网关日志中的 AcpRuntimeError。要授予完整权限,请设置 permissionMode=approve-all;要优雅降级,请设置 nonInteractivePermissions=deny。 |
| ACP session stalls indefinitely after completing work | Harness 进程已结束,但 ACP 会话未报告完成。 | 更新 OpenClaw;当前 acpx 清理会在关闭和 Gateway 网关启动时回收 OpenClaw 拥有的陈旧包装器和适配器进程。 |
Harness sees <<<BEGIN_OPENCLAW_INTERNAL_CONTEXT>>> |
内部事件信封泄漏到了 ACP 边界之外。 | 更新 OpenClaw 并重新运行完成流程;外部 harness 应该只接收纯完成提示。 |