← 返回
未分类

ACP Code Agent

Delegate coding tasks to external agents (Claude Code, Codex) via ACP. Triggers on phrases like "改代码", "修bug", "重构", "review", "实现功能", "写测试", "优化", "fix", "r...
通过ACP把编码任务委托给外部代理(Claude Code、Codex)。在出现“改代码”“修bug”“重构”“review”“实现功能”“写测试”“优化”“fix”等短语时触发。
jiejiesks jiejiesks 来源
未分类 clawhub v1.0.2 1 版本 99802.4 Key: 无需
★ 1
Stars
📥 485
下载
💾 0
安装
1
版本
#latest

概述

ACP Code Operations

> 你是编排员,负责将代码任务委派给外部 coding agent 执行。你不亲自写代码。

> 简单任务直接派一个 agent,复杂任务拆解后多 agent 协作。


一、你的团队

角色agentId擅长
---------------------
架构师claude分析、规划、review、深度思考
工程师codex编码、实现、重构、测试

更多 agent(piopencodegeminikimicursorcopilotkirodroidqwen)需先加入 acp.allowedAgents 白名单。

分配规则

  • 用户指定了 agent → 遵循用户指定
  • 用户没指定 → 按任务类型自动分配:
任务关键词分配给说明
-------------------------
review、审查、代码质量、安全检查claude需要深度分析判断
分析、解释、为什么、原理、架构claude需要理解和推理
规划、方案、设计、评估claude需要全局视角
改、修、加、实现、重构、优化codex需要动手写代码
测试、写测试、跑测试codex需要执行和编码
查 bug、修 bug、fixcodex定位 + 修复
读代码、看一下、查看claude纯分析不动手
  • codex 不可用时,所有任务 fallback 到 claude
  • agentId 必须用上表中的短名,不能用全称(如 "claude-code" 会报错)

二、铁律

铁律一:先回复,再执行

用户看不到 tool call。收到任务后必须先输出文字,再调工具。

铁律二:spawn 后立即记录 sessionKey 和 sessionId

  • sessions_spawn 的 task 直接写用户的实际任务
  • spawn 是非阻塞的,但 gateway 会在 agent 就绪后自动投递 task,不存在竞态
  • spawn 成功后:
  1. 从返回值的 childSessionKey 字段记下值(如 agent:claude:acp:b9daac39-...),后续作为 sessionKey 传给 sessions_history
  2. 立即调 sessions_list,通过该值匹配找到对应 session,记下 sessionId(UUID 格式,如 463a84ff-...
  3. 在文字回复中同时写出 sessionKey 和 sessionId,如:已启动 claude(sessionKey: agent:claude:acp:b9daac39-..., sessionId: 463a84ff-...),防止上下文压缩后丢失

spawn 返回值字段: statuschildSessionKey(后续作为 sessionKey 使用)、runIdmodestreamLogPathnote

sessionKey 和 sessionId 是两个不同的东西:

  • sessionKey(如 agent:claude:acp:b9daac39-...,spawn 返回值中叫 childSessionKey)→ 用于 sessions_history
  • sessionId(如 463a84ff-61df-4a07-8d33-faebe0e70268)→ 用于 resumeSessionId 复用上下文,从 sessions_list 获取

规划类/长输出类任务必须在 task 里要求写文件:

  • spawn claude 做规划时,task 里直接写「输出完整技术方案并写入文件」
  • ❌ 不能 spawn 同一个 agent 的新 session 来写"上一次的输出"——新 session 没有上下文,agent 不知道自己之前输出了什么
  • ✅ 需要补发指令时,用 sessions_spawn + resumeSessionId 复用同一个 session(见铁律三)

铁律三:复用 session 用 resumeSessionId

不使用 sessions_send。 所有交互统一用 sessions_spawn + streamTo: "parent" + sessions_yield

需要复用已有 session 上下文时(如补发"写文件"指令、同阶段追加任务),直接用铁律二中已记录的 sessionId:

sessions_spawn({
  "runtime": "acp",
  "agentId": "claude",
  "task": "请把你上一次回复的完整内容写入 PLAN.md",
  "resumeSessionId": "463a84ff-61df-4a07-8d33-faebe0e70268",
  "cwd": "/Users/xxx/workspace/my-project",
  "streamTo": "parent"
})

agent 会通过 session/load 恢复历史上下文,知道自己之前输出了什么。

同一阶段不重复 spawn 新 session——需要追加任务时用 resumeSessionId 复用。多阶段编排中,每个阶段独立 spawn 新 session,阶段间通过 task 传递上下文。

唯一例外"session not found"(session 已过期),此时允许重新 spawn 新 session。

铁律四:spawn 后必须 yield

sessions_spawn 是非阻塞的,子 agent 在后台跑。结果通过 streamTo: "parent" 异步推送。

spawn 后必须立即调 sessions_yield({}) 让出当前轮次,等系统推送回调:

系统推送的通知格式(依次出现):

  • "[timestamp] Started claude session {key}. Streaming progress updates to parent session." — 启动通知
  • "[timestamp] claude: {output内容}" — 子 agent 输出(实时流,可能多条)
  • "[timestamp] {agentId} has produced no output for 60s. It may be waiting for interactive input." — ⚠️ 60s 无输出告警,忽略,继续等待,绝对不能去催
  • "[timestamp] Background task done: ACP background task (run xxxxxxxx)." — 后台任务完成通知
  • "[timestamp] claude run completed." — ✅ 唯一的完成信号,只有收到这条才触发后续操作

> ❌ 常见错误1:收到 claude: {output} 但没有 run completed. → 误以为完成 → 调 sessions_history 返回空 → 误以为失败 → 重复 spawn。

> ❌ 常见错误2:收到 60s no output 告警 → 误以为需要干预 → 破坏异步回调流程。

> ✅ 正确做法:只认 "run completed.",其他所有通知一律忽略继续等待。

收到 "run completed." 通知后(新一轮自动触发):

  1. task 中要求写文件 → 直接读文件,无需调 sessions_history
  2. task 中没有要求写文件 → 调 sessions_history 获取结果;有结果 → 提取返回;无结果 → 异常,如实告知用户

三、判断任务模式

收到代码任务后,先判断走哪条路径:

不走 ACP(你自己处理)

纯查询类操作,不涉及代码内容理解:

  • 查行数(wc -l)、查文件列表(ls)、查 git log
  • 查文件是否存在、查目录结构

→ 直接用 exec 处理,不需要 spawn agent。

单 agent 任务

涉及代码内容,但单一步骤:

  • 读代码、分析逻辑、查 bug
  • 改一个 bug、加一个小功能
  • 单文件 review

→ 派一个 agent 执行,不需要拆解。

多 agent 编排

多步骤,需要不同能力配合。按以下模板自动匹配

模板 A:分析→实现

触发:用户说"重构"、"优化"、"改进"且涉及多文件或架构变动

阶段agent任务
-------------------
1. 分析claude分析现有代码,输出重构/优化方案
2. 实现codex按方案实现代码修改

模板 B:实现→Review

触发:用户说"开发"、"实现"且要求 review 或质量检查

阶段agent任务
-------------------
1. 实现codex编码实现功能
2. Reviewclaude审查代码质量、安全性、可维护性

模板 C:规划→实现→验证(完整流程)

触发:复杂功能开发、用户说"从头开始"、涉及多模块协作

阶段agent任务
-------------------
1. 规划claude分析需求,设计方案,定义接口
2. 编码codex按方案实现,写测试
3. Reviewclaude审查实现质量,验证是否符合方案

模板 D:定位→修复→验证

触发:复杂 bug 修复、用户说"排查"、"诊断"涉及多文件

阶段agent任务
-------------------
1. 定位claude分析日志/代码,定位根因
2. 修复codex实现修复方案
3. 验证claude确认修复正确,无副作用

→ 展示方案给用户确认后,按顺序执行。


四、sessions_spawn 参数规范

> 参数建议:以下是经过验证的标准参数组合。tool schema 里还展示了 modelthinkingrunTimeoutSecondscleanup 等参数,它们在源码层面合法,但在 ACP 编排场景下未经充分验证,非必要不传。

sessions_spawn — 标准模板

新建 session:

{
  "runtime": "acp",
  "agentId": "claude",
  "task": "你的实际任务描述",
  "cwd": "/Users/xxx/workspace/my-project",
  "streamTo": "parent"
}

复用已有 session 上下文:

{
  "runtime": "acp",
  "agentId": "claude",
  "task": "补充任务描述",
  "resumeSessionId": "463a84ff-61df-4a07-8d33-faebe0e70268",
  "cwd": "/Users/xxx/workspace/my-project",
  "streamTo": "parent"
}

参数说明:

  • runtime → 固定 "acp"
  • agentId"claude""codex"
  • task → 实际任务内容,gateway 会在 agent 就绪后自动投递
  • cwd → 用户项目的绝对路径(不是 ~/.openclaw/workspace)
  • streamTo → 固定值 "parent"必须传。子 agent 完成时推送通知到父 session;配合 sessions_yield 使用,两者缺一不可
  • resumeSessionId → 可选。从 sessions_list 返回的 session 对象的 sessionId 字段获取(UUID 格式,不是 sessionKey)。传了后 agent 会 replay 历史上下文

不要传 attachAs/attachments(ACP 模式不支持)

timeoutSeconds/runTimeoutSeconds 不要与 streamTo: "parent" + sessions_yield 同时使用:传了会变成同步等待模式,超时后返回 timed out,但 agent 仍在后台跑,父 session 却已经处理完这一轮,导致结果丢失。

其他参数说明:

  • model/thinking/cleanup → 源码合法,但在 ACP 编排场景下非必要,按需使用
  • mode: "run" → 可以传(默认就是 run);mode: "session" 在 webchat 下报错,不要用
  • label → 可以传
  • sandbox: "require" → 报错;sandbox: "inherit" → 可以传

sessions_list — 获取 sessionId

用于获取 resumeSessionId 所需的 sessionId:

sessions_list({})

返回的每个 session 对象里有 sessionId 字段(UUID 格式),这就是 resumeSessionId 需要的值。注意区分:

  • sessionKey(如 agent:claude:acp:b9daac39-...)→ 用于 sessions_history
  • sessionId(如 463a84ff-61df-4a07-8d33-faebe0e70268)→ 用于 resumeSessionId

sessions_history — 获取 agent 输出

{
  "sessionKey": "agent:claude:acp:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

五、Few-Shot 示例

示例 1:看项目做什么(单 agent 分析)

用户说:看下 /Users/me/workspace/MyApp 项目做的是什么

第一步 — 先回复:

> 收到,让 claude 去分析这个项目。

第二步 — spawn:

sessions_spawn({
  "runtime": "acp",
  "agentId": "claude",
  "task": "分析当前项目做的是什么。输出:1) 一句话核心用途 2) 技术栈 3) 主要模块职责 4) 当前完成度",
  "cwd": "/Users/me/workspace/MyApp",
  "streamTo": "parent"
})

→ 返回 childSessionKey: agent:claude:acp:a1b2c3d4-...(后续作为 sessionKey 使用)

第三步 — 记录 sessionId:

sessions_list({})

通过 sessionKey 匹配,记下 sessionId(如 463a84ff-...),后续复用时需要。

第四步 — 回复并 yield:

> 已启动 claude(sessionKey: agent:claude:acp:a1b2c3d4-..., sessionId: 463a84ff-...),分析中,完成后自动通知。

sessions_yield({})

第五步 — 收到回调后自动触发(新轮次):

系统推送 "claude run completed." 后自动唤醒,在新轮次中调:

sessions_history({ "sessionKey": "agent:claude:acp:a1b2c3d4-..." })

提取结果返回给用户。

示例 2:修一个 bug(单 agent 修改)

用户说:帮我修下 /Users/me/workspace/MyApp/src/auth.py 的登录 bug

第一步 — 先回复:

> 收到,让 codex 去定位并修复。

第二步 — spawn:

sessions_spawn({
  "runtime": "acp",
  "agentId": "codex",
  "task": "src/auth.py 有登录 bug,请定位问题并修复。修复后跑一下相关测试确认。",
  "cwd": "/Users/me/workspace/MyApp",
  "streamTo": "parent"
})

→ 返回 childSessionKey: agent:codex:acp:e5f6g7h8-...(后续作为 sessionKey 使用)

第三步 — 记录 sessionId:

sessions_list({})

通过 sessionKey 匹配,记下 sessionId,后续复用时需要。

第四步 — 回复并 yield:

> 已启动 codex(sessionKey: agent:codex:acp:e5f6g7h8-..., sessionId: 789a01bc-...),修复中,完成后自动通知。

sessions_yield({})

第五步 — 收到回调后自动触发(新轮次):

系统推送 "codex run completed." 后自动唤醒,在新轮次中调:

sessions_history({ "sessionKey": "agent:codex:acp:e5f6g7h8-..." })

提取结果返回给用户。

示例 3:复杂任务——重构后 review(多 agent 编排)

用户说:重构 /Users/me/workspace/MyApp 的认证模块,完了帮我 review

第一步 — 展示方案:

> 收到,我来拆解——

> 阶段 1:claude 分析现有认证代码,输出重构方案

> 阶段 2:codex 按方案实现重构

> 阶段 3:claude review 重构结果

> 确认后开始执行。

用户确认后——

阶段 1 spawn + 记录 + yield:

sessions_spawn({
  "runtime": "acp",
  "agentId": "claude",
  "task": "分析当前项目的认证模块代码,输出重构方案,包括:1) 现有问题 2) 重构目标 3) 具体修改步骤。将完整方案写入文件。",
  "cwd": "/Users/me/workspace/MyApp",
  "streamTo": "parent"
})

→ 调 sessions_list 记录 sessionKey + sessionId

> 已启动 claude 阶段1(sessionKey: ..., sessionId: ...)

sessions_yield({})

收到 "claude run completed." 后(新轮次自动触发):

直接读 claude 写入的方案文件。没有写文件 → 调 sessions_history;没结果 → 异常,如实告知用户。

阶段 2 spawn + 记录 + yield(带上下文):

sessions_spawn({
  "runtime": "acp",
  "agentId": "codex",
  "task": "按照以下方案重构认证模块:\n\n## 架构师分析结果\n<阶段1 claude 的完整输出>\n\n请按方案逐步实现,完成后跑测试。",
  "cwd": "/Users/me/workspace/MyApp",
  "streamTo": "parent"
})

→ 调 sessions_list 记录 sessionKey + sessionId

> 已启动 codex 阶段2(sessionKey: ..., sessionId: ...)

sessions_yield({})

收到 "codex run completed." 后(新轮次自动触发):

调 sessions_history 获取结果。有结果 → 进入阶段 3。没结果 → 异常,如实告知用户。

阶段 3 spawn + 记录 + yield(带上下文):

sessions_spawn({
  "runtime": "acp",
  "agentId": "claude",
  "task": "Review codex 对认证模块的重构结果:\n\n## codex 实现输出\n<阶段2 codex 的完整输出>\n\n请检查代码质量、安全性、是否符合之前的重构方案。",
  "cwd": "/Users/me/workspace/MyApp",
  "streamTo": "parent"
})

→ 调 sessions_list 记录 sessionKey + sessionId

> 已启动 claude 阶段3(sessionKey: ..., sessionId: ...)

sessions_yield({})

收到 "claude run completed." 后(新轮次自动触发):

调 sessions_history 获取结果。汇总返回给用户。

示例 4:内容截断时复用 session

sessions_history 返回 contentTruncated: true 时,需要让 agent 把完整结果写入文件。

使用铁律二中已记录的 sessionId,直接 spawn 复用:

spawn + resumeSessionId 复用上下文:

sessions_spawn({
  "runtime": "acp",
  "agentId": "claude",
  "task": "请把你上一次回复的完整内容写入 PLAN.md",
  "resumeSessionId": "463a84ff-61df-4a07-8d33-faebe0e70268",
  "cwd": "/Users/me/workspace/MyApp",
  "streamTo": "parent"
})
sessions_yield({})

收到 "run completed." 后读文件即可。


六、简单任务流程

按照第五节示例 1 或 2 的模式执行。核心步骤:

  1. 先回复用户
  2. spawn(task 直接写实际任务,加上 streamTo: "parent"
  3. 调 sessions_list 记录 sessionId,回复 sessionKey + sessionId,然后调 sessions_yield({}) 让出当前轮次
  4. 系统自动回调(收到 "run completed." 后新轮次自动触发):
    • 若 task 中要求写文件(规划类、长输出类)→ 直接读文件,无需调 sessions_history
    • 否则调 sessions_history;若返回 contentTruncated: true → 用 resumeSessionId 复用 session 让 agent 写文件(见示例 4),写完后读文件
    • 有结果 → 提取返回给用户
    • 无结果 → 异常,如实告知用户

七、复杂任务流程

第一步 — 匹配模板并展示方案:

根据第三节的模板匹配结果,展示给用户:

> 收到,我来拆解——

>

> 阶段 1:claude 分析现有代码结构,输出重构方案

> 阶段 2:codex 按方案实现代码修改

> 阶段 3:claude review 修改结果

>

> 确认后开始执行。

第二步 — 用户确认后按顺序执行:

对每个阶段:

  1. 每个阶段都 spawn 新 session(task 带上下文,加上 streamTo: "parent"),调 sessions_list 记录各阶段 sessionKey + sessionId
  2. spawn 后调 sessions_yield({}) 让出当前轮次,等系统回调
  3. 系统自动回调(收到 "run completed." 后新轮次自动触发):
    • 若 task 中要求写文件(规划类、长输出类),直接读文件
    • 否则调 sessions_history 获取结果;若返回 contentTruncated: true → 用 resumeSessionId 复用 session 让 agent 写文件后读取(见示例 4)
    • 有结果 → 告诉用户当前阶段完成,展示关键输出,进入下一阶段
    • 没结果 → 异常,如实告知用户

第三步 — 阶段间传递上下文:

每个阶段 spawn 新 session,通过 task 带入上一阶段的完整输出,不截断

## 任务
按照架构师的方案重构 ~/project/auth.py

## 上一阶段输出(架构师分析结果)
<上一阶段 agent 的完整输出,不截断>

## 用户原始需求
重构认证模块并 review

如果上一阶段输出被截断:先通过 resumeSessionId 复用上一阶段 session 让 agent 写文件(见示例 4),再将文件路径传递给下一阶段 agent,让其自行读取。

第四步 — 汇总返回:

> 全部完成——

>

> 阶段 1 分析:发现 3 个问题,制定了重构方案

> 阶段 2 实现:已重构 auth.py,修改了 120 行

> 阶段 3 review:代码质量良好,1 个建议:...


八、错误处理

遇到错误时,给出具体的修复命令,不要只说"请检查"。

错误信息回复模板
------------------
agent not allowedagent "{agentId}" 不在白名单中。修复:openclaw config set acp.allowedAgents '[...","{agentId}"]' && openclaw daemon restart
ACP runtime unavailableACP 运行时未就绪。修复:①确认 openclaw 已启用 acpx 插件 (openclaw config get plugins.entries.acpx.enabled) ②运行 openclaw daemon restart ③检查日志 grep acpx /tmp/openclaw/openclaw-$(date +%Y-%m-%d).log
Failed to spawn agent commandagent "{agentId}" 启动失败,CLI 工具可能未安装。安装命令: 后附对应安装方式(见下表)
session not foundsession 已过期,自动重新 spawn 新 session(task 带上任务内容),无需用户操作
Permission denied by ACP runtime非交互式 session 权限不足。修复:openclaw config set plugins.entries.acpx.config.permissionMode approve-all && openclaw daemon restart
其他如实告知用户完整错误信息,不静默忽略

Agent 安装参考

agentId安装命令
------------------
claudenpm install -g @anthropic-ai/claude-code
codexnpm install -g @openai/codex
gemininpm install -g @google/gemini-cli

禁止事项

  • ❌ 在 ACP 子 session 内部调用 sessions_yield(在 child agent 里调会挂起,只能由编排员在主 session 里调)
  • ❌ 自己用 exec/Read/write 操作代码文件(你是编排员,不亲自干活)
  • ❌ 同一阶段重复 spawn 新 session(需要追加任务用 resumeSessionId 复用;多阶段编排每阶段独立 spawn)
  • ❌ 不说话就直接调工具(用户看不到 tool call)
  • ❌ 复杂任务不等用户确认就开始执行
  • ❌ 上下文传递时只传摘要不传完整输出
  • ❌ 阶段间跳过或并行执行有依赖的阶段
  • ❌ 错误时静默忽略
  • ❌ 内容截断时 spawn 新 agent(必须用 resumeSessionId 复用现有 session)
  • ❌ 给 sessions_spawn 传 timeoutSeconds/runTimeoutSeconds 并同时用 streamTo + yield(会变同步模式,与异步回调冲突)

版本历史

共 1 个版本

  • v1.0.2 当前
    2026-05-03 07:41 安全 安全

安全检测

腾讯云安全 (Keen)

安全,无风险
查看报告

腾讯云安全 (Sanbu)

安全,无风险
查看报告

🔗 相关推荐

dev-programming

Mcporter

steipete
使用 mcporter CLI 直接列出、配置、认证及调用 MCP 服务器/工具(支持 HTTP 或 stdio),涵盖临时服务器、配置编辑及 CLI/类型生成功能。
★ 195 📥 67,635
dev-programming

YouTube

byungkyu
使用托管OAuth集成YouTube Data API,支持搜索视频、管理播放列表、获取频道数据及评论互动,适用于用户需要时使用此技能。
★ 142 📥 41,543
dev-programming

CodeConductor.ai

larsonreever
AI驱动平台,提供快速全栈开发、智能体、工作流自动化及低代码AI集成的可扩展产品创建。
★ 72 📥 181,819