ACP 代理
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 <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"。 - 解析請求的目標工具(
agentId,例如codex)。 - 如果要求綁定討論串,且目前的頻道支援,就將 ACP 工作階段綁定到該討論串。
- 後續在該討論串中的訊息會持續導向同一個 ACP 工作階段,直到解除焦點 / 關閉 / 過期為止。
ACP 與子代理的差異
需要外部工具執行環境時用 ACP;需要 OpenClaw 原生委派執行時用子代理。
| 面向 | ACP 工作階段 | 子代理執行 |
|---|---|---|
| 執行環境 | ACP 後端外掛(例如 acpx) | OpenClaw 原生子代理執行環境 |
| 工作階段 key | agent:<agentId>:acp:<uuid> | agent:<agentId>:subagent:<uuid> |
| 主要指令 | /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 - Telegram:
channels.telegram.threadBindings.spawnAcpSessions=true
- Discord:
支援討論串的頻道
- 任何公開工作階段 / 討論串綁定功能的頻道轉接器。
- 目前內建支援:
- Discord 討論串 / 頻道
- Telegram 主題(群組 / 超級群組中的論壇主題,以及私訊主題)
- 外掛頻道可透過相同的綁定介面新增支援。
頻道專屬設定
對於非臨時性的工作流程,可在頂層 bindings[] 設定持久性 ACP 綁定。
綁定模型
bindings[].type="acp"標記為持久性 ACP 對話綁定。bindings[].match用來辨識目標對話:- Discord 頻道或討論串:
match.channel="discord"+match.peer.id="<channelOrThreadId>" - Telegram 論壇主題:
match.channel="telegram"+match.peer.id="<chatId>:topic:<topicId>"
- 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,因此 ACP 工作階段必須明確設定runtime: "acp"。- 省略
agentId時,OpenClaw 會使用已設定的acp.defaultAgent。 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(選填):操作人員可見的標籤,用於工作階段 / 橫幅文字。resumeSessionId(選填):恢復既有 ACP 工作階段而非建立新的。代理會透過session/load重播對話紀錄。需搭配runtime: "acp"。streamTo(選填):"parent"會將 ACP 初始執行進度摘要以系統事件串流回請求端工作階段。- 可用時,回應會包含
streamLogPath,指向以工作階段為範圍的 JSONL 日誌(<sessionId>.acp-stream.jsonl),可透過 tail 查看完整的轉發紀錄。
- 可用時,回應會包含
恢復既有工作階段
使用 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"—— 若搭配子代理執行環境使用會回傳錯誤。resumeSessionId會還原上游 ACP 對話紀錄;thread和mode仍照常套用到你正在建立的新 OpenClaw 工作階段,因此mode: "session"仍需搭配thread: true。- 目標代理必須支援
session/load(Codex 和 Claude Code 都有支援)。 - 若找不到該工作階段 ID,啟動會明確報錯 —— 不會靜默降級為新工作階段。
操作驗證測試
在 Gateway 部署後想快速確認 ACP 啟動功能是否端對端正常運作(而不只是通過單元測試)時使用。
建議步驟:
- 確認目標主機上部署的 Gateway 版本 / commit。
- 確認部署的原始碼包含
src/gateway/sessions-patch.ts中的 ACP 血統驗收邏輯(subagent:* or acp:* sessions)。 - 對即時代理(例如
jpclawhq上的razor(main))開啟一個臨時 ACPX 橋接工作階段。 - 請該代理呼叫
sessions_spawn,參數如下:runtime: "acp"agentId: "codex"mode: "run"- task:
Reply with exactly LIVE-ACP-SPAWN-OK
- 確認代理回報:
accepted=yes- 真實的
childSessionKey - 無驗證錯誤
- 清理臨時 ACPX 橋接工作階段。
給即時代理的提示範例:
Use the sessions_spawn tool now with runtime: "acp", agentId: "codex", and mode: "run".
Set the task to: "Reply with exactly LIVE-ACP-SPAWN-OK".
Then report only: accepted=<yes/no>; childSessionKey=<value or none>; error=<exact text or none>.
注意事項:
- 除非刻意測試討論串綁定的持續性 ACP 工作階段,否則此驗證測試請使用
mode: "run"。 - 基本驗證不需要
streamTo: "parent"。該路徑依賴請求端 / 工作階段的能力,屬於獨立的整合檢查。 - 將討論串綁定的
mode: "session"測試視為第二階段、更完整的整合測試,從真實的 Discord 討論串或 Telegram 主題進行。
沙箱相容性
ACP 工作階段目前執行在主機的執行環境上,而非 OpenClaw 沙箱內部。
目前的限制:
- 如果請求端工作階段已沙箱化,ACP 啟動會被阻擋,包括
sessions_spawn({ runtime: "acp" })和/acp spawn。- 錯誤訊息:
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 <absolute-path>--label <name>
請參閱 斜線指令。
工作階段目標解析
大多數 /acp 操作接受一個可選的工作階段目標(session-key、session-id 或 session-label)。
解析順序:
- 明確的目標參數(或
/acp steer的--session)- 先嘗試 key
- 再嘗試 UUID 格式的 session id
- 最後嘗試 label
- 目前討論串綁定(如果目前的對話 / 討論串已綁定到 ACP 工作階段)
- 以目前請求端的工作階段作為後備
如果沒有任何目標能解析,OpenClaw 會回傳明確的錯誤訊息(Unable to resolve session target: ...)。
啟動討論串模式
/acp spawn 支援 --thread auto|here|off。
| 模式 | 行為 |
|---|---|
auto | 在活躍的討論串中:綁定該討論串。不在討論串中:在支援的環境下建立並綁定子討論串。 |
here | 要求必須在活躍的討論串中;若不在則失敗。 |
off | 不進行綁定。工作階段以未綁定狀態啟動。 |
注意事項:
- 在不支援討論串綁定的介面上,預設行為等同於
off。 - 討論串綁定啟動需要頻道策略支援:
- Discord:
channels.discord.threadBindings.spawnAcpSessions=true - Telegram:
channels.telegram.threadBindings.spawnAcpSessions=true
- Discord:
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 sessions 會讀取目前綁定或請求端工作階段的儲存區。接受 session-key、session-id 或 session-label 的指令會透過 Gateway 工作階段探索來解析目標,包括每個代理自訂的 session.store 根目錄。
執行選項對應關係
/acp 提供便捷指令和通用設定器。
等效操作:
/acp model <id>對應執行設定 keymodel。/acp permissions <profile>對應執行設定 keyapproval_policy。/acp timeout <seconds>對應執行設定 keytimeout。/acp cwd <path>直接更新執行 cwd 覆寫。/acp set <key> <value>是通用路徑。- 特殊情況:
key=cwd使用 cwd 覆寫路徑。
- 特殊情況:
/acp reset-options清除目標工作階段的所有執行覆寫。
acpx 工具支援(目前)
目前 acpx 內建的工具別名:
piclaudecodexopencodegeminikimi
當 OpenClaw 使用 acpx 後端時,除非你的 acpx 設定中定義了自訂代理別名,否則建議使用這些值作為 agentId。
透過 acpx CLI 也可以用 --agent <command> 直接指定任意轉接器,但那是 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 doctor
acpx 指令與版本設定
預設情況下,acpx 外掛(以 @openclaw/acpx 發布)使用外掛本地固定的二進位檔:
- 指令預設為
extensions/acpx/node_modules/.bin/acpx。 - 預期版本預設為擴充套件的固定版本。
- 啟動時立即將 ACP 後端註冊為未就緒狀態。
- 背景確認任務會驗證
acpx --version。 - 如果外掛本地的二進位檔遺失或版本不符,會執行:
npm install --omit=dev --no-save acpx@<pinned>然後重新驗證。
可以在外掛設定中覆寫指令 / 版本:
{
"plugins": {
"entries": {
"acpx": {
"enabled": true,
"config": {
"command": "../acpx/dist/cli.js",
"expectedVersion": "any"
}
}
}
}
}
注意事項:
command接受絕對路徑、相對路徑或指令名稱(acpx)。- 相對路徑從 OpenClaw 工作區目錄解析。
expectedVersion: "any"停用嚴格版本比對。- 當
command指向自訂二進位檔 / 路徑時,外掛本地的自動安裝會停用。 - 後端健康檢查執行期間,OpenClaw 的啟動不會被阻塞。
請參閱 外掛。
權限設定
ACP 工作階段以非互動方式執行 —— 沒有 TTY 可以核准或拒絕檔案寫入和 shell 執行的權限提示。acpx 外掛提供兩個設定值來控制權限的處理方式:
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
更改這些值後需重新啟動 Gateway。
重要: 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 <user-id> can rebind this thread. | 另一個使用者擁有討論串綁定。 | 以擁有者身份重新綁定,或使用不同的討論串。 |
Thread bindings are unavailable for <channel>. | 轉接器缺少討論串綁定功能。 | 使用 --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",或從非沙箱化工作階段使用 ACP 搭配 sandbox="inherit"。 |
| 綁定工作階段缺少 ACP 元資料 | ACP 工作階段元資料過期 / 已刪除。 | 用 /acp spawn 重新建立,然後重新綁定 / 聚焦討論串。 |
AcpRuntimeError: Permission prompt unavailable in non-interactive mode | permissionMode 阻擋了非互動式 ACP 工作階段中的寫入 / 執行。 | 將 plugins.entries.acpx.config.permissionMode 設為 approve-all 並重新啟動 Gateway。請參閱權限設定。 |
| ACP 工作階段提前結束且輸出很少 | 權限提示被 permissionMode/nonInteractivePermissions 阻擋。 | 檢查 Gateway 日誌中的 AcpRuntimeError。需要完整權限時設定 permissionMode=approve-all;需要優雅降級時設定 nonInteractivePermissions=deny。 |
| ACP 工作階段在完成工作後無限期停滯 | 工具程序已結束但 ACP 工作階段未回報完成。 | 用 ps aux | grep acpx 監控;手動終止殘留的程序。 |