什么是 ACP?

Zed 团队提出了一个新的协议 Agent Client Protocol 用于抽象编辑器与 AI 编程 Agents 之间的交互。

就像 LSP 协议抽象了编辑器与各种编程语言的补全、类型检查、错误提示等功能。通过一个编程语言无关的协议,让编辑器方只需要开发 LSP 客户端,就可以支持各种不同的编程语言(对接其 Language Server)。

ACP 也是同理,其目标是让编辑器开发一个 ACP 客户端,就可以对接不同的 AI Agents 实现(连接到 Agent 的 ACP 服务)。

ACP 官方文档: Introduction - Agent Client Protocol

功能职责划分

编辑器(或者叫 ACP 客户端)提供

ACP 在 Neovim 中的使用

Neovim 主要有两个插件支持 ACP:

  1. olimorris/codecompanion.nvim: ✨ AI Coding, Vim Style
  2. yetone/avante.nvim: Use your Neovim like using Cursor AI IDE!

我尝试使用了 codecompanion 插件,实现了通过 Chat buffer 调用 opencode、goose、codex 三种 agents 进行对话:

Chat buffer 与 Goose Agent 对话

遇到的问题

codecompanion 文档不够清晰

配置插件使用 ACP 时在官方文档翻来翻去没找到如何将 ACP 应用到 chat 中,最后在 github issue 中找到配置示例代码。

我的插件配置参考: https://github.com/gkzhb/dotfiles/blob/0dd1fe47d33cc1245f349ac263b69401fa71e059/.config/nvim/lua/plugins/tools/codecompanion.lua

opencode 调用工具及编辑文件时未展示工具调用参数

我只能看到 Agent 调用了某个工具,比如设置 todos,但是我看不到具体 todos 内容。

文件编辑也是,我知道 Agent 修改文件了,但是不知道修改了啥内容,只能看到文件名。

在 Zed 里接入 opencode 也做了尝试,也是没有编辑内容,说明是 opencode acp 兼容的问题。

codex 无法编辑文件

codex Agent 会提示没有编辑文件的工具,无法编辑文件,会反复尝试使用 shell 来编辑文件。

需要进一步排查。

ACP 的落地问题

ACP 抽象层次增加了复杂性

当前 Agent CLI 工具提供了很多能力,而且还会随着 AI 的探索不断快速迭代。

ACP 为了实现编辑器中的通用性,会抹平很多 Agent 提供的功能差异,因此 ACP 提供的功能会落后于 Agent CLI 能力发展。(功能比如 Agent 调用 subagent 完成任务)

在实际使用中,兼容 ACP 的 Agent 可能自带自己的各种工具,加上 ACP 编辑器方也提供工具给 Agent,交互会更复杂。

另外编辑器对 ACP 功能的支持程度与 Agent 对 ACP 功能的支持程度,也会影响用户的实际使用,且对用户认知更重了。

当前 ACP 不够完善,交互细节打磨不足

ACP 只考虑了编辑器工具和 Agent 的打通,在实际 AI 编程使用中,用户关注的是端到端的编程体验,在这个端到端流程中 ACP 增加了系统的复杂性。

比如用户需要切换 Agent 工具使用的模型或者使用 Agent 工具实现下的不同 Agent。 OK 这个功能设计了协议 Session Modes - Agent Client Protocol,甚至还提供了 slash commands

Agent 使用 ACP 工具时的效果问题

Agent CLI 工具的系统提示词都是针对性设计的,一般不会针对 ACP 的工具进行优化,导致用户使用时的效果会较差。

比如 Codex 有只读模式,此时 Agent 不会去进行文件编辑操作,存在提示词和工具冲突的情况。