ACP 协议
Agent Client Protocol——编辑器↔agent 的"LSP 时刻";CC/Codex 均无原生实现,靠 Zed 维护的适配器入网
ACP 协议
结论
ACP(Agent Client Protocol,agentclientprotocol.com)是 Zed 于 2025-08 发起、与 Google Gemini CLI 团队合作首发的编辑器↔agent 标准,定位是 agent 时代的 LSP:JSON-RPC 2.0 over stdio(远程 HTTP/WebSocket 在路上),三阶段消息流(initialize → session/new|load → prompt turn),权限、文件系统、终端全部以"client 方法"反向委托给编辑器 [一手文档]。生态已成型:30+ agent、Zed/JetBrains 原生支持、Neovim/Emacs/VS Code/Obsidian/Jupyter 等数十个 client。关键事实是:CC 与 Codex 都没有原生 ACP 实现——CC 经 zed-industries/claude-code-acp(包装 Claude Agent SDK),Codex 经 zed-industries/codex-acp(codex-rs 全仓 grep 无 acp 依赖,其第一方 IDE 协议是私有的 app-server)[一手源码]。对 Yoda 这类 workspace 产品,ACP 是"实现一个 client、接入整个 agent 生态"的最高杠杆标准。
研究问题
- 协议的消息模型:方法、通知、会话生命周期、权限与终端委托如何设计?
- 谁原生实现、谁靠适配器?适配器由谁维护、可靠性如何?
- codex-rs 里到底有没有 acp?它的 app-server 与 ACP 是什么关系?
- Yoda 做 ACP client 的成本与收益?
协议结构(agentclientprotocol.com,2026-06-11 访问)
[一手文档]
- 传输与编码:JSON-RPC 2.0;本地 agent 走 stdio,"Full support for remote agents is a work in progress"(HTTP/WebSocket)。内容表示"re-uses the JSON representations used in MCP where possible"——content block 与 MCP 对齐,降低双栈成本。
- 三阶段流程:
- 初始化:
initialize(版本与能力协商)→ 可选authenticate; - 会话建立:
session/new新建,或session/load(可选能力)恢复; - Prompt turn:client 发
session/prompt,agent 以session/update通知流式回传(消息块、tool call、mode 变化),以 stop reason 结束;session/cancel通知可中断。
- 初始化:
- Agent 侧方法:基线
initialize/authenticate/session/new/session/prompt;可选session/load、session/set_mode、logout。 - Client 侧方法(编辑器要实现的):基线
session/request_permission(工具执行授权,UI 决策点);可选文件系统fs/read_text_file、fs/write_text_file(让 agent 看到编辑器中未保存的 buffer);终端族terminal/create|output|wait_for_exit|kill|release(终端归编辑器所有,agent 借用)。 - 硬性约定:所有路径必须绝对路径;行号 1-based;属性 camelCase(判别字段 snake_case);错误遵循 JSON-RPC 标准 code/message。
设计上的两个聪明点:权限是 client 方法而非 agent 配置——授权 UI 与策略完全归编辑器,agent 只管发起请求;fs/terminal 反向委托——agent 不直接碰磁盘和 PTY,workspace 产品因此天然获得审计点和"脏 buffer 一致性"。
生态现状(2026-06-11)
- Agent 端(30+):Gemini CLI(首发原生)、Claude Agent(适配器)、Codex(适配器)、Goose、Cline、GitHub Copilot(public preview)、Cursor、OpenCode、OpenHands、Qwen Code、Kimi CLI、JetBrains Junie、Mistral Vibe、Factory Droid 等 [一手文档:agentclientprotocol.com/get-started/agents]。Zed 内部统计最常用三个:Zed Agent、Claude Agent、Codex [一手文档:zed.dev/acp]。
- Client 端:Zed(原生)、JetBrains(2025-10 宣布原生 AI Assistant 支持)、Neovim(CodeCompanion/avante 等多插件)、Emacs(agent-shell.el)、VS Code(扩展)、Obsidian、Unity、Jupyter/marimo、以及 Slack/Telegram/微信/飞书等消息桥 [一手文档:agentclientprotocol.com/get-started/clients]。
- 许可:Apache License,治理在 Zed(未进任何基金会——与 MCP/AGENTS.md 不同)。
各 Agent 设计与实现
Claude Code
CC 本体(CLI/扩展)不暴露 ACP。接入路径是 zed-industries/claude-code-acp(npm @zed-industries/claude-code-acp,GitHub 现更名方向为 claude-agent-acp):它包装 Claude Agent SDK,把 SDK 的会话/工具/权限事件翻译为 ACP JSON-RPC [一手文档:zed.dev/blog/claude-code-via-acp]。要点:
- 适配器由 Zed 维护、Apache 开源,"freely available for any editor that's adopted ACP";Anthropic 未接手 [推断:仓库归属 zed-industries]。
- 因为走 Agent SDK 而非爬 CLI 输出,hooks/MCP/权限模式等 CC 能力大体可透传;但 CC 的 TUI 专属功能(如
/命令面板交互)不在协议面内。 - 社区另有独立实现
Xuanwo/acp-claude-code,佐证适配层需求真实存在。 - CC 官方文档(本地镜像全文 grep)无任何 ACP 字样 [一手源码:claude-code-docs/docs/ 检索零命中]——Anthropic 官方对 ACP 的态度是沉默。
Codex CLI
- codex-rs 无 ACP:对
acp/agentclientprotocol全仓检索(*.rs / *.toml / *.md)零命中 [一手源码]。 - 第一方 IDE 面是 app-server:
codex-rs/app-server、app-server-protocol(含jsonrpc_lite.rs、experimental_api.rs、schema 导出)构成 Codex 自己的 JSON-RPC 协议,供 VS Code 扩展等官方前端使用 [一手源码]。功能上与 ACP 同构(会话、审批、流式事件),但消息面私有。 - ACP 接入靠
zed-industries/codex-acp(Rust,按架构/OS 发布二进制);Zed 社区还出现过"围绕 codex app-server 构建的实验性适配器"(Codex ACP CAS,zed discussion #52749)——说明桥接点既可以在 SDK 层也可以在 app-server 层 [一手文档]。
两家的共同模式:头部 agent 厂商不主动实现 ACP,由最大受益方(编辑器厂商 Zed)出钱出人维护适配器。这决定了适配器的能力上限永远滞后于 agent 本体的新特性。
差异矩阵
| 维度 | Claude Code | Codex CLI |
|---|---|---|
| 原生 ACP server | 无 | 无(全仓无 acp 依赖) |
| 官方机器可读接口 | Claude Agent SDK(TS/Python) | app-server(私有 JSON-RPC) |
| ACP 适配器 | zed-industries/claude-code-acp(npm,包 SDK) | zed-industries/codex-acp(Rust 二进制) |
| 适配器维护方 | Zed(Apache) | Zed(Apache) |
| 适配层桥接点 | Agent SDK 事件流 | codex 核心/app-server |
| 厂商对 ACP 公开表态 | 文档零提及 | 文档零提及 |
| 在 Zed 中的地位 | 最常用外部 agent 之一 | 最常用外部 agent 之一 |
最小复现
# 1. codex-rs 无 ACP(源码级)
grep -ril "agentclientprotocol" codex/codex-rs/ --include="*.rs" --include="*.toml"
# →(空)
ls codex/codex-rs/app-server-protocol/src/
# → experimental_api.rs export.rs jsonrpc_lite.rs lib.rs protocol ...
# 2. CC 文档无 ACP
grep -rli "agent client protocol" claude-code-docs/docs/ ; echo "exit=$?"
# → exit=1(零命中)
# 3. 行为级:手撕 ACP 握手(需 npm 网络)
npx @zed-industries/claude-code-acp <<'EOF'
{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":1,"clientCapabilities":{"fs":{"readTextFile":true,"writeTextFile":true}}}}
EOF
# 预期:返回 agentCapabilities(含 promptCapabilities)的 initialize 响应(第 3 步在本机未实际执行,标 [推断],方法名与握手字段以官方 schema 为准。)
Harness 接入建议(Yoda 实践)
- Yoda 应实现 ACP client,而非 N 个私有集成。一次投入换来 Gemini CLI(原生)、CC、Codex、Goose、Copilot 等全生态;JetBrains 原生跟进证明协议成熟度足以支撑商业产品。
- 实现优先级:基线(initialize / session/new / session/prompt / session/update 渲染 / session/request_permission)→ fs 委托(脏 buffer 一致性是 workspace 产品的差异化卖点)→ terminal 委托(把 agent 命令执行收进 Yoda 的终端面板,获得审计与回放)→ session/load 与 set_mode。
- 权限即产品:
session/request_permission是 Yoda 策略引擎的天然挂载点——allowlist、一次性放行、会话级模式都在 client 侧实现,对所有 agent 统一生效。 - 对冲适配器滞后风险:CC/Codex 的新能力先出现在 SDK/app-server,后到适配器。Yoda 架构上应保留"原生通道"逃生门:runtime 抽象层之下,CC 可直连 Agent SDK、Codex 可直连 app-server,UI 事件模型统一对齐 ACP 的 session/update 语义,保证两条通道可互换。
- 迁移路径:现有私有 spawn 集成 → 先把内部事件总线改成 ACP update/permission 语义(纯重构,不换传输)→ 切换传输为 ACP stdio 子进程 → 删私有解析代码。远程 agent 场景等 ACP remote 转正再上。
失效条件
- Anthropic 或 OpenAI 官方接管/内置 ACP(CC changelog 或 codex-rs 出现 acp crate)——"适配器模式"结论失效,Yoda 逃生门设计可简化
- ACP remote(HTTP/WebSocket)正式发布——本章"stdio 为主"的传输描述与 Yoda 远程架构建议需更新
- zed-industries 适配器仓库停止维护或更名完成(claude-code-acp → claude-agent-acp)——引用与依赖坐标需更新
- ACP 捐入基金会(AAIF 或 LF)——治理风险评估(单一厂商主导)需重写
- Codex app-server 协议公开标准化并提供稳定承诺——"私有协议"定性失效
参考资料
(访问日期均为 2026-06-11)
- ACP 介绍:https://agentclientprotocol.com/overview/introduction [一手文档]
- 协议总览(方法/流程/约定):https://agentclientprotocol.com/protocol/overview [一手文档]
- Agent 列表:https://agentclientprotocol.com/get-started/agents ;Client 列表:https://agentclientprotocol.com/get-started/clients [一手文档]
- Zed ACP 主页(起源、Apache、生态统计):https://zed.dev/acp [一手文档]
- Claude Code via ACP(适配器原理):https://zed.dev/blog/claude-code-via-acp ;Gemini CLI 首发:https://zed.dev/blog/bring-your-own-agent-to-zed ;Codex 上线:https://zed.dev/blog/codex-is-live-in-zed
- 适配器仓库:https://github.com/zed-industries/claude-code-acp (npm
@zed-industries/claude-code-acp)、https://github.com/zed-industries/codex-acp 、社区实现 https://github.com/Xuanwo/acp-claude-code - app-server 桥接讨论(Codex ACP CAS):https://github.com/zed-industries/zed/discussions/52749
- 本地源码:
codex/codex-rs/app-server-protocol/src/(私有 JSON-RPC 面)、codex-rs 全仓 acp 检索零命中、claude-code-docs/docs/ACP 检索零命中 [一手源码]