ACP 智能体交付模型
交付模型¶
ACP 会话既可以是交互式工作区,也可以是父级拥有的后台工作。投递路径取决于其形态。
交互式 ACP 会话
交互式会话旨在在可见的聊天界面上持续对话:
/acp spawn ... --bind here将当前对话绑定到 ACP 会话。/acp spawn ... --thread ...将频道话题/主题绑定到 ACP 会话。- 持久配置的
bindings[].type="acp"将匹配的对话路由至同一个 ACP 会话。
绑定对话中的后续消息会直接路由到 ACP 会话,ACP 的输出也会投递回同一个频道/话题/主题。
当 ACP agent 在一次已投递的轮次中请求结构化输入时,OpenClaw 会把受支持的表单字段作为临时的 Gateway 问题以最多三个为一组呈现。单选和多选字段最多支持四个选项。URL 请求会显示字面上的 HTTP(S) URL,并带有明确的“继续”和“拒绝”选项;OpenClaw 不会抓取或打开该 URL。显式标记为机密的字段使用带警告的临时文本回复提示,并且绝不会存储在 Gateway 问题记录中。格式错误或不支持的请求会产生可见的说明并被拒绝,而不是返回空答案。
OpenClaw 发送给 harness 的内容:
- 常规绑定后续消息会作为提示文本发送,且仅在 harness/后端支持时才附带附件。
/acp管理命令和本地 Gateway 命令会在 ACP 分发之前被拦截。- 运行时生成的完成事件按目标具体化。OpenClaw agent 会获得 OpenClaw 的内部运行时上下文封装;外部 ACP harness 会获得带有子任务结果和指令的普通提示。原始的
<<<BEGIN_OPENCLAW_INTERNAL_CONTEXT>>>封装绝不应发送给外部 harness,也不应持久化为 ACP 用户转录文本。 - ACP 转录条目使用用户可见的触发文本或普通的完成提示。内部事件元数据在可能的情况下保持为 OpenClaw 中的结构化数据,并且不会被当作用户撰写的聊天内容。
父级拥有的一次性 ACP 会话
由另一个 agent 运行生成的一次性 ACP 会话是后台子任务,类似于子代理:
- 父级通过
sessions_spawn({ runtime: "acp", mode: "run" })请求工作。 - 子任务在它自己的 ACP harness 会话中运行。
- 子任务的轮次在原生子代理生成所使用的同一后台通道上运行,因此缓慢的 ACP harness 不会阻塞无关的主会话工作。
- 完成情况通过任务完成公告路径回报。OpenClaw 在发送给外部 harness 之前,会将内部完成元数据转换为普通的 ACP 提示,因此 harness 不会看到 OpenClaw 专属的运行时上下文标记。
- 当需要面向用户的回复时,父级会以正常的助手语气重写子任务的结果。
不要将此路径视为父级与子任务之间的对等聊天。子任务已经有返回父级的完成通道。
sessions_send 与 A2A 投递
sessions_send 可以在生成后以另一个会话为目标。对于普通的对等会话,OpenClaw 在注入消息后使用代理到代理(A2A)的后续路径:
- 等待目标会话的回复。
- 可选地让请求者和目标交换有限数量的后续轮次。
- 要求目标生成一条公告消息。
- 将该公告投递到可见的频道或话题。
该 A2A 路径是发送者需要可见后续回复的对等发送回退方案。当不相关的会话可以看到并向 ACP 目标发送消息时,它仍然保持启用,例如在宽松的 tools.sessions.visibility 设置下。
仅当请求者是它自己拥有的、父级拥有的一次性 ACP 子任务的父级时,OpenClaw 才会跳过 A2A 后续。在这种情况下,在任务完成之上运行 A2A 可能会用子任务的结果唤醒父级,将父级的回复转发回子任务,从而形成父/子回环。已接受的 sessions_send 结果会分别报告目标受理情况和公告投递情况:targetDisposition 为 queued 或 steered,而 delivery.status 为 pending 或 skipped。对于这种拥有的子任务情况,delivery.status="skipped",因为完成路径已经负责交付结果。
恢复已有会话
使用 resumeSessionId 来继续之前的 ACP 会话,而不是重新开始。agent 通过 session/load 重放其对话历史,从而在充分的上下文中接续之前的内容。
{
"task": "Continue where we left off - fix the remaining test failures",
"runtime": "acp",
"agentId": "codex",
"resumeSessionId": "<previous-session-id>"
}
常见用例:
- 将 Codex 会话从笔记本电脑移交到手机——告诉你的 agent 从上次停下的地方继续。
- 继续你在 CLI 中交互式开始的编码会话,现在通过 agent 以无头模式进行。
- 接续因 gateway 重启或空闲超时而中断的工作。
注意:
resumeSessionId仅在runtime: "acp"时适用;默认的子代理运行时会忽略这个仅 ACP 的字段。streamTo仅在runtime: "acp"时适用;默认的子代理运行时会忽略这个仅 ACP 的字段。resumeSessionId是主机本地的 ACP/harness 恢复 ID,不是 OpenClaw 频道会话密钥;OpenClaw 仍会在分发前检查 ACP 生成策略和目标 agent 策略,而 ACP 后端或 harness 拥有加载该上游 ID 的授权。resumeSessionId会恢复上游 ACP 对话历史;thread和mode仍然正常应用于你正在创建的新 OpenClaw 会话,因此mode: "session"仍然要求thread: true。- 目标 agent 必须支持
session/load(Codex 和 Claude Code 都支持)。 - 如果找不到该会话 ID,生成操作会以清晰的错误失败——不会静默回退到新会话。
部署后冒烟测试
网关部署后,请运行一次真实的端到端检查,而不是仅依赖单元测试:
- 在目标主机上验证已部署的网关版本和提交。
- 打开一个临时 ACPX 桥接会话,连接到实时代理。
- 要求该代理调用
sessions_spawn,参数为runtime: "acp"、agentId: "codex"、mode: "run",任务为Reply with exactly LIVE-ACP-SPAWN-OK。 - 验证
accepted=yes、真实的childSessionKey,且没有验证器错误。 - 清理临时桥接会话。
保持对 mode: "run" 的门槛,并跳过 streamTo: "parent" -
线程绑定的 mode: "session" 和流中继路径是另外更完整的集成验证。
沙箱兼容性¶
ACP 会话当前运行在主机运行时上,不在 OpenClaw 沙箱内。
Warning
安全边界:
- 外部 harness 可以根据其自身 CLI 权限和所选
cwd进行读写。 - OpenClaw 的沙箱策略不会包裹 ACP harness 执行。
- OpenClaw 仍会强制执行 ACP 功能门槛、允许的代理、会话所有权、通道绑定和 Gateway 投递策略。
- 对于需要沙箱强制执行的 OpenClaw 原生工作,请使用
runtime: "subagent"。
当前限制:
- 如果请求方会话处于沙箱中,则
sessions_spawn({ runtime: "acp" })和/acp spawn的 ACP 派生均会被阻止。 sessions_spawn使用runtime: "acp"时不支持sandbox: "require"。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/openclaw