ACP Agents
ACP agents(Agent Client Protocol (ACP))会话允许 OpenClaw 通过 ACP 后端插件运行外部编程工具(例如 Pi、Claude Code、Codex、OpenCode 和 Gemini CLI)。如果你用自然语言让 OpenClaw "用 Codex 运行这个"或"在线程中启动 Claude Code",OpenClaw 会将该请求路由到 ACP 运行时(而非原生子代理运行时)。
快速操作流程
当你需要一个实用的 /acp 操作手册时使用:
- 创建会话:
/acp spawn codex --mode persistent --thread auto
- 在绑定的线程中工作(或明确指定该会话的 key)。
- 检查运行时状态:
/acp status
- 按需调整运行时选项:
/acp model <模型>/acp permissions <策略>/acp timeout <秒数>
- 在不替换上下文的情况下微调活跃会话:
/acp steer tighten logging and continue
- 停止工作:
/acp cancel(取消当前轮次),或/acp close(关闭会话并移除绑定)
面向用户的快速入门
自然语言请求示例:
- "在此线程中启动一个持久化的 Codex 会话并保持专注。"
- "将此作为一次性 Claude Code ACP 会话运行并总结结果。"
- "使用 Gemini CLI 在线程中执行此任务,后续对话保持在同一线程中。"
OpenClaw 应执行的操作:
- 选择
runtime: "acp"。 - 解析请求的工具目标(
agentId,例如codex)。 - 如果请求了线程绑定且当前渠道支持,则将 ACP 会话绑定到线程。
- 将后续线程消息路由到同一 ACP 会话,直到取消聚焦/关闭/过期。
ACP 与子代理对比
当你需要外部工具运行时时使用 ACP。当你需要 OpenClaw 原生委托运行时使用子代理。
| 维度 | ACP 会话 | 子代理运行 |
|---|---|---|
| 运行时 | ACP 后端插件(例如 acpx) | OpenClaw 原生子代理运行时 |
| 会话 key | agent::acp:<key> | agent::subagent:<key> |
| 主要命令 | /acp ... | /subagents ... |
| 启动工具 | sessions_spawn(设置 runtime:"acp") | sessions_spawn(默认运行时) |
另见 子代理。
线程绑定会话(渠道无关)
当渠道适配器启用线程绑定时,ACP 会话可绑定到线程:
- OpenClaw 将线程绑定到目标 ACP 会话。
- 该线程中的后续消息路由到绑定的 ACP 会话。
- ACP 输出回传到同一线程。
- 取消聚焦/关闭/归档/空闲超时或最大存活时间到期后移除绑定。
线程绑定支持取决于具体适配器。如果当前渠道适配器不支持线程绑定,OpenClaw 会返回明确的不支持/不可用消息。
线程绑定 ACP 所需的功能标志:
acp.enabled=trueacp.dispatch.enabled默认开启(设置false以暂停 ACP 调度)- 渠道适配器 ACP 线程启动标志已启用(取决于适配器)
- Discord:
channels.discord.threadBindings.spawnAcpSessions=true
支持线程的渠道
- 任何公开会话/线程绑定能力的渠道适配器。
- 当前内置支持:Discord。
- 插件渠道可通过相同的绑定接口添加支持。
渠道特定设置
对于非临时性工作流,可在顶级 bindings[] 条目中配置持久化 ACP 绑定。
绑定模型
bindings[].type="acp"标记持久化 ACP 对话绑定。bindings[].match标识目标对话:- Discord 频道或线程:
match.channel="discord"+match.peer.id="<频道/线程ID>" - Telegram 论坛话题:
match.channel="telegram"+match.peer.id="<群组ID>:topic:<话题ID>"
- Discord 频道或线程:
bindings[].agentId是所属 OpenClaw 代理 ID。- 可选的 ACP 覆盖配置位于
bindings[].acp下:mode(persistent或oneshot)labelcwdbackend
每个代理的运行时默认值
使用 agents.list[].runtime 为每个代理定义一次 ACP 默认值:
agents.list[].runtime.type="acp"agents.list[].runtime.acp.agent(工具 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 会话 key。 - 临时运行时绑定(例如由线程聚焦流程创建的)在存在时仍然适用。
启动 ACP 会话(接口)
通过 sessions_spawn
使用 runtime: "acp" 从代理轮次或工具调用启动 ACP 会话。
{
"task": "Open the repo and summarize failing tests",
"runtime": "acp",
"agentId": "codex",
"thread": true,
"mode": "session"
}注意事项:
runtime默认为subagent,因此需要显式设置runtime: "acp"以使用 ACP 会话。- 如果省略
agentId,在配置了acp.defaultAgent时 OpenClaw 会使用该默认值。 mode: "session"需要thread: true来保持持久化绑定对话。
接口详细说明:
task(必需):发送到 ACP 会话的初始提示。runtime(ACP 必需):必须为"acp"。agentId(可选):ACP 目标工具 ID。如果已设置acp.defaultAgent则回退到该值。thread(可选,默认false):在支持的渠道中请求线程绑定流程。mode(可选):run(一次性)或session(持久化)。- 默认为
run - 如果
thread: true且未指定 mode,OpenClaw 可能根据运行时路径默认使用持久化行为 mode: "session"需要thread: true
- 默认为
cwd(可选):请求的运行时工作目录(由后端/运行时策略验证)。label(可选):面向操作者的标签,用于会话/横幅文本。streamTo(可选):"parent"将初始 ACP 运行进度摘要作为系统事件流回请求方会话。- 可用时,响应中包含
streamLogPath,指向会话作用域的 JSONL 日志(.acp-stream.jsonl),可通过 tail 查看完整中继历史。
- 可用时,响应中包含
沙箱兼容性
ACP 会话目前在宿主运行时上运行,而非 OpenClaw 沙箱内部。
当前限制:
- 如果请求方会话处于沙箱中,ACP 启动将被阻止。
- 错误信息:
Sandboxed sessions cannot spawn ACP sessions because runtime="acp" runs on the host. Use runtime="subagent" from sandboxed sessions.
- 错误信息:
sessions_spawn与runtime: "acp"不支持sandbox: "require"。- 错误信息:
sessions_spawn sandbox="require" is unsupported for runtime="acp" because ACP sessions run outside the sandbox. Use runtime="subagent" or sandbox="inherit".
- 错误信息:
当你需要沙箱强制执行时,请使用 runtime: "subagent"。
通过 /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 <路径>--label <标签>
参见 斜杠命令。
会话目标解析
大多数 /acp 操作接受可选的会话目标(session-key、session-id 或 session-label)。解析顺序:
- 显式目标参数(或
/acp steer使用--session)- 尝试 key
- 然后 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:<key> |
/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 <值>映射到运行时配置 keymodel。/acp permissions <值>映射到运行时配置 keyapproval_policy。/acp timeout <值>映射到运行时配置 keytimeout。/acp cwd <值>直接更新运行时 cwd 覆盖。/acp set <key> <值>是通用路径。- 特殊情况:
key=cwd使用 cwd 覆盖路径。
- 特殊情况:
/acp reset-options清除目标会话的所有运行时覆盖。
acpx 工具支持(当前)
当前 acpx 内置工具别名:
piclaudecodexopencodegeminikimi
当 OpenClaw 使用 acpx 后端时,除非你的 acpx 配置定义了自定义代理别名,否则优先使用这些值作为 agentId。直接使用 acpx CLI 也可以通过 --agent <名称> 目标化任意适配器,但这是 acpx CLI 的功能(不是正常的 OpenClaw agentId 路径)。
必需配置
核心 ACP 基线配置:
{
acp: {
enabled: true, // 可选。默认为 true;设为 false 以暂停 ACP 调度但保留 /acp 控制命令。
dispatch: { enabled: true },
backend: "acpx",
defaultAgent: "codex",
allowedAgents: ["pi", "claude", "codex", "opencode", "gemini", "kimi"],
maxConcurrentSessions: 8,
stream: {
coalesceIdleMs: 300,
maxChunkChars: 1200,
},
runtime: { ttlMinutes: 120 },
},
}线程绑定配置取决于渠道适配器。Discord 示例:
{
session: {
threadBindings: {
enabled: true,
idleHours: 24,
maxAgeHours: 0,
},
},
channels: {
discord: {
threadBindings: {
enabled: true,
spawnAcpSessions: true,
},
},
},
}如果线程绑定 ACP 启动无法工作,首先验证适配器功能标志:
- Discord:
channels.discord.threadBindings.spawnAcpSessions=true
参见 配置参考。
acpx 后端插件设置
安装并启用插件:
openclaw plugins install acpx
openclaw config set plugins.entries.acpx.enabled true开发期间本地工作区安装:
openclaw plugins install ./extensions/acpx然后验证后端健康状态:
/acp doctoracpx 命令和版本配置
默认情况下,acpx 插件(发布为 @openclaw/acpx)使用插件本地固定的二进制文件:
- 命令默认为
extensions/acpx/node_modules/.bin/acpx。 - 期望版本默认为扩展固定版本。
- 启动时立即将 ACP 后端注册为未就绪状态。
- 后台确保任务验证
acpx --version。 - 如果插件本地二进制文件缺失或版本不匹配,会运行:
npm install --omit=dev --no-save acpx@<固定版本>并重新验证。
你可以在插件配置中覆盖命令/版本:
{
"plugins": {
"entries": {
"acpx": {
"enabled": true,
"config": {
"command": "../acpx/dist/cli.js",
"expectedVersion": "any"
}
}
}
}
}注意事项:
command接受绝对路径、相对路径或命令名(acpx)。- 相对路径从 OpenClaw 工作区目录解析。
expectedVersion: "any"禁用严格版本匹配。- 当
command指向自定义二进制文件/路径时,插件本地自动安装被禁用。 - 后端健康检查运行时 OpenClaw 启动保持非阻塞。
参见 插件。
权限配置
ACP 会话以非交互方式运行 — 没有 TTY 来批准或拒绝文件写入和 shell 执行权限提示。acpx 插件提供两个配置 key 来控制权限处理方式:
permissionMode
控制工具代理可以在不提示的情况下执行哪些操作。
| 值 | 行为 |
|---|---|
approve-all | 自动批准所有文件写入和 shell 命令。 |
approve-reads | 仅自动批准读取操作;写入和执行需要提示。 |
deny-all | 拒绝所有权限提示。 |
nonInteractivePermissions
控制当需要显示权限提示但没有可用交互式 TTY 时的行为(ACP 会话始终如此)。
| 值 | 行为 |
|---|---|
fail | 以 AcpRuntimeError 中止会话。(默认) |
deny | 静默拒绝权限并继续(优雅降级)。 |
配置方式
通过插件配置设置:
openclaw config set plugins.entries.acpx.config.permissionMode approve-all
openclaw config set plugins.entries.acpx.config.nonInteractivePermissions fail更改这些值后重启网关。
重要: OpenClaw 当前默认为
permissionMode=approve-reads和nonInteractivePermissions=fail。在非交互式 ACP 会话中,任何触发权限提示的写入或执行都可能以AcpRuntimeError: Permission prompt unavailable in non-interactive mode失败。如果你需要限制权限,请将
nonInteractivePermissions设为deny,以便会话优雅降级而非崩溃。
故障排查
| 症状 | 可能原因 | 修复方法 |
|---|---|---|
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 <owner> can rebind this thread. | 另一用户拥有线程绑定。 | 以所有者身份重新绑定或使用其他线程。 |
Thread bindings are unavailable for <adapter>. | 适配器缺少线程绑定能力。 | 使用 --thread off 或移至支持的适配器/渠道。 |
Sandboxed sessions cannot spawn ACP sessions ... | ACP 运行时在宿主端;请求方会话处于沙箱中。 | 从沙箱会话中使用 runtime="subagent",或从非沙箱会话启动 ACP。 |
sessions_spawn sandbox="require" is unsupported for runtime="acp" ... | 对 ACP 运行时请求了 sandbox="require"。 | 使用 runtime="subagent" 实现必需的沙箱化,或从非沙箱会话中使用 sandbox="inherit" 与 ACP。 |
| 绑定会话缺少 ACP 元数据 | 陈旧/已删除的 ACP 会话元数据。 | 使用 /acp spawn 重新创建,然后重新绑定/聚焦线程。 |
AcpRuntimeError: Permission prompt unavailable in non-interactive mode | permissionMode 在非交互式 ACP 会话中阻止写入/执行。 | 设置 plugins.entries.acpx.config.permissionMode 为 approve-all 并重启网关。参见 权限配置。 |
| ACP 会话提前失败且输出很少 | 权限提示被 permissionMode/nonInteractivePermissions 阻止。 | 检查网关日志中的 AcpRuntimeError。要获取完全权限,设置 permissionMode=approve-all;要优雅降级,设置 nonInteractivePermissions=deny。 |
| ACP 会话在工作完成后无限期停滞 | 工具进程已完成但 ACP 会话未报告完成。 | 使用 `ps aux |
