ACP 代理
代理客户端协议(ACP) 会话�?OpenClaw 可以通过 ACP 后端插件运行外部编码 harness(例�?Pi、Claude Code、Codex、OpenCode �?Gemini CLI)�?
如果你用自然语言请求 OpenClaw ”�?Codex 中运行这�?�?在线程中启动 Claude Code”,OpenClaw 应该将该请求路由�?ACP 运行时(而不是原生子代理运行时)�?
快速操作流�?
当你想要一个实用的 /acp 运行手册时使用:
- 创建会话�?
/acp spawn codex --mode persistent --thread auto
- 在绑定的线程中工作(或显式指定该会话密钥)�?
- 检查运行时状态:
/acp status
- 根据需要调整运行时选项�?
/acp model <provider/model>/acp permissions <profile>/acp timeout <seconds>
- 推动活跃会话而不替换上下文:
/acp steer tighten logging and continue
- 停止工作�?
/acp cancel(停止当前轮次),或/acp close(关闭会�?+ 移除绑定�?
人类快速入�?
自然请求的示例:
- “在这里的线程中启动一个持久的 Codex 会话并保持专注�?
- “作为一次�?Claude Code ACP 会话运行这个并总结结果�?
- “为此任务使用 Gemini CLI 在线程中运行,然后在同一线程中保持后续对话�?
OpenClaw 应该做的�?
- 选择
runtime: "acp"�? - 解析请求�?harness 目标(例�?
agentId�?codex)�? - 如果请求线程绑定且当前频道支持,�?ACP 会话绑定到该线程�?
- 将后续线程消息路由到同一�?ACP 会话,直到取消聚�?关闭/过期�?
ACP 与子代理
当你想要外部 harness 运行时使�?ACP。当你想�?OpenClaw 原生委托运行时使用子代理�?
| 区域 | ACP 会话 | 子代理运�? |
|---|---|---|
| 运行�? | ACP 后端插件(例�?acpx�? | OpenClaw 原生子代理运行时 |
| 会话密钥 | agent:<agentId>:acp:<uuid> | agent:<agentId>:subagent:<uuid> |
| 主要命令 | /acp ... | /subagents ... |
| 生成工具 | sessions_spawn 运行时设�?"acp" | sessions_spawn(默认运行时�? |
另见子代理�?
线程绑定会话(频道无关)
当频道适配器启用了线程绑定时,ACP 会话可以绑定到线程:
- OpenClaw 将线程绑定到目标 ACP 会话�?
- 该线程中的后续消息路由到绑定�?ACP 会话�?
- ACP 输出传回同一线程�?
- 取消聚焦/关闭/归档/TTL 过期移除绑定�?
线程绑定支持因适配器而异。如果当前频道适配器不支持线程绑定,OpenClaw 返回清晰的不支持/不可用消息�?
线程绑定 ACP 所需的功能标志:
acp.enabled=trueacp.dispatch.enabled=true- 频道适配�?ACP 线程生成标志启用(因适配器而异�?
- Discord:
channels.discord.threadBindings.spawnAcpSessions=true
- Discord:
支持线程的频�?
- 任何公开会话/线程绑定功能的频道适配器�?
- 当前内置支持:Discord�?
- 插件频道可以通过相同的绑定接口添加支持�?
启动 ACP 会话(接口)
�?sessions_spawn
使用 runtime: "acp" 从代理轮次或工具调用启动 ACP 会话�?
{
"task": "Open the repo and summarize failing tests",
"runtime": "acp",
"agentId": "codex",
"thread": true,
"mode": "session"
}
注意�?
runtime默认�?subagent,所以对 ACP 会话要显式设�?runtime: "acp"�?- 如果省略
agentId,OpenClaw 在配置时使用acp.defaultAgent�? mode: "session"需�?thread: true来保持持久的绑定对话�?
接口详情�?
task(必需):发送到 ACP 会话的初始提示�?runtime(ACP 必需):必须�?"acp"�?agentId(可选):ACP 目标 harness id。如已设置,回退�?acp.defaultAgent�?thread(可选,默认�?false):在支持的地方请求线程绑定流程�?mode(可选):run(一次性)�?session(持久)�?- 默认�?
run - 如果
thread: true且模式省略,OpenClaw 可能会根据运行时路径默认为持久行�? mode: "session"需�?thread: true
- 默认�?
cwd(可选):请求的运行时工作目录(由后�?运行时策略验证)�?label(可选):面向操作员的标签,用于会话/横幅文本�?
�?/acp 命令
需要时使用 /acp spawn 进行显式的操作员控制�?
/acp spawn codex --mode persistent --thread auto
/acp spawn codex --mode oneshot --thread off
/acp spawn codex --thread here
关键标志�?
--mode persistent|oneshot--thread auto|here|off--cwd <absolute-path>--label <name>
见斜杠命令�?
会话目标解析
大多�?/acp 操作接受可选的会话目标(session-key、session-id �?session-label)�?
解析顺序�?
- 显式目标参数(或
/acp steer�?--session�?- 尝试密钥
- 然后 UUID 形状的会�?id
- 然后标签
- 当前线程绑定(如果此对话/线程绑定�?ACP 会话�?
- 当前请求者会话回退
如果没有目标解析,OpenClaw 返回清晰错误(Unable to resolve session target: ...)�?
生成线程模式
/acp spawn 支持 --thread auto|here|off�?
| 模式 | 行为 |
|---|---|
auto | 在活跃线程中:绑定该线程。在线程外:在支持时创建/绑定子线程�? |
here | 需要当前活跃线程;如果不在线程中则失败�? |
off | 无绑定。会话无绑定启动�? |
注意�?
- 在非线程绑定界面,默认行为实际上等同�?
off�? - 线程绑定生成需要频道策略支持(对于 Discord:
channels.discord.threadBindings.spawnAcpSessions=true)�?
ACP 控制
可用命令系列�?
/acp spawn/acp cancel/acp steer/acp close/acp status/acp set-mode/acp set/acp cwd/acp permissions/acp timeout/acp model/acp reset-options/acp sessions/acp doctor/acp install
/acp status 显示有效的运行时选项,以及(当可用时)运行时级和后端级会话标识符�?
某些控制依赖于后端能力。如果后端不支持某控制,OpenClaw 返回清晰的不支持控制错误�?
ACP 命令手册
| 命令 | 功能 | 示例 |
|---|---|---|
/acp spawn | 创建 ACP 会话;可选线程绑定�? | /acp spawn codex --mode persistent --thread auto --cwd /repo |
/acp cancel | 取消目标会话的进行中轮次�? | /acp cancel agent:codex:acp:<uuid> |
/acp 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.2 |
/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-5 |
/acp reset-options | 移除会话运行时选项覆盖�? | /acp reset-options |
/acp sessions | 列出存储中的最�?ACP 会话�? | /acp sessions |
/acp doctor | 后端健康、能力、可操作的修复�? | /acp doctor |
/acp install | 打印确定的安装和启用步骤�? | /acp install |
运行时选项映射
/acp 有便捷命令和通用设置器�?
等效操作�?
/acp model <id>映射到运行时配置�?model�?/acp permissions <profile>映射到运行时配置�?approval_policy�?/acp timeout <seconds>映射到运行时配置�?timeout�?/acp cwd <path>直接更新运行�?cwd 覆盖�?/acp set <key <value>>是通用路径�?- 特殊案例:
key=cwd使用 cwd 覆盖路径�?
- 特殊案例:
/acp reset-options清除目标会话的所有运行时覆盖�?
acpx harness 支持(当前)
当前 acpx 内置 harness 别名�?
piclaudecodexopencodegemini
�?OpenClaw 使用 acpx 后端时,优先使用这些 agentId 值,除非你的 acpx 配置定义了自定义代理别名�?
直接 acpx CLI 使用也可以通过 --agent <command> 定位任意适配器,但那个原始的逃生舱是 acpx CLI 功能(不是正常的 OpenClaw agentId 路径)�?
所需配置
核心 ACP 基线�?
{
acp: {
enabled: true,
dispatch: { enabled: true },
backend: "acpx",
defaultAgent: "codex",
allowedAgents: ["pi", "claude", "codex", "opencode", "gemini"],
maxConcurrentSessions: 8,
stream: {
coalesceIdleMs: 300,
maxChunkChars: 1200,
},
runtime: {
ttlMinutes: 120,
},
},
}
线程绑定配置因频道适配器而异。Discord 示例�?
{
session: {
threadBindings: {
enabled: true,
ttlHours: 24,
},
},
channels: {
discord: {
threadBindings: {
enabled: true,
spawnAcpSessions: true,
},
},
},
}
如果线程绑定 ACP 生成不起作用,首先验证适配器功能标志:
- Discord:
channels.discord.threadBindings.spawnAcpSessions=true
见配置参考�?
acpx 后端的插件设�?
安装并启用插件:
openclaw plugins install @openclaw/acpx
openclaw config set plugins.entries.acpx.enabled true
开发期间本地工作区安装�?
openclaw plugins install ./extensions/acpx
然后验证后端健康�?
/acp doctor
固定�?acpx 安装策略(当前行为)
@openclaw/acpx 现在执行严格的插件本地固定模型:
- 扩展�?
extensions/acpx/package.json中固定精确的 acpx 依赖�? - 运行时命令固定到插件本地二进制文件(
extensions/acpx/node_modules/.bin/acpx),而不是全局PATH�? - 插件配置不暴�?
command�?commandArgs,因此阻止运行时命令漂移�? - 启动时立即将 ACP 后端注册为未就绪�?
- 后台确保作业验证
acpx --version与固定版本�? - 如果缺失/不匹配,它运行插件本地安装(
npm install --omit=dev --no-save acpx@<pinned>)并在健康前重新验证�?
注意�?
- OpenClaw 启动保持非阻塞,同时 acpx 确保运行�?
- 如果网络/安装失败,后端保持不可用,
/acp doctor报告可操作的修复�?
见插件�?
故障排除
| 症状 | 可能原因 | 修复 |
|---|---|---|
ACP runtime backend is not configured | 后端插件缺失或禁用�? | 安装并启用后端插件,然后运行 /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�? |
ACP agent "<id>" is not allowed by policy | 代理不在白名单中�? | 使用允许�?agentId 或更�?acp.allowedAgents�? |
Unable to resolve session target: ... | 错误�?key/id/label 令牌�? | 运行 /acp sessions,复制精确的 key/label,然后重试�? |
--thread here requires running /acp spawn inside an active ... thread | --thread here 在线程上下文外使用�? | 移动到目标线程或使用 --thread auto/off�? |
Only <user-id> can rebind this thread. | 另一个用户拥有线程绑定�? | 作为所有者重新绑定或使用不同的线程�? |
Thread bindings are unavailable for <channel>. | 适配器缺乏线程绑定能力�? | 使用 --thread off 或移动到支持的适配�?频道�? |
| Missing ACP metadata for bound session | 陈旧/删除�?ACP 会话元数据�? | �?/acp spawn 重新创建,然后重新绑�?聚焦线程�? |