第 25 章
Agent Client Protocol
通过 ACP 协议将 Deep Agent 集成到代码编辑器和 IDE 中
让智能体从命令行走进你的开发环境通信无标准
你有没有想过,为什么 AI 编程助手只能在特定的工具里使用?
没有 ACP 的困境
- 每个 AI 编程工具都自建通信协议,无法互操作
- 在 Zed 里能用,换到 VS Code 就不行——编辑器绑定
- 自己写的 Agent 只能在终端跑,无法嵌入 IDE
- 每次集成新编辑器都要重写适配层——重复造轮子
- 编辑器无法向 Agent 提供项目上下文——信息割裂
ACP 的解法
- 标准化协议——一次接入,所有兼容编辑器都能用
- 编辑器自动提供项目上下文(工作区、文件结构)
- Agent 返回丰富的结构化更新(代码编辑、文件创建)
- 基于 stdio 通信,无需启动 HTTP 服务器
- 支持 Zed、JetBrains、VS Code 等主流编辑器
问题核心:ACP 解决的不是"Agent 能做什么",而是"Agent 和编辑器怎么对话"。有了标准协议,你构建的 Deep Agent 就不再是终端里的孤岛,而是能嵌入任何 IDE 的编程伙伴。
什么是 ACP
Agent Client Protocol——编码 Agent 与 IDE 之间的标准化通信协议
ACP 标准化了编码 Agent 与代码编辑器/IDE 之间的通信方式。借助 ACP,你可以在任何兼容的客户端中使用自定义 Deep Agent,使编辑器能够提供项目上下文并接收丰富的更新信息。
ACP 是什么
- Agent 与编辑器之间的通信协议
- 基于 stdio(标准输入/输出)传输
- 编辑器启动 Agent 进程,通过 stdin/stdout 通信
- Agent 向编辑器注册能力和斜杠命令
ACP 不是什么
- 不是 HTTP 服务器——无需端口和网络
- 不是 MCP(Model Context Protocol)——MCP 用于调用外部工具
- 不是 Agent 框架——它只是通信层
- 不是 替代 API 调用——它是连接层
ACP vs MCP:ACP 用于 Agent 与编辑器集成,MCP 用于 Agent 调用外部服务器托管的工具。如果你需要 Agent 连接数据库或调用远程 API,应该用 MCP。如果你需要 Agent 出现在编辑器里,用 ACP。
快速开始
三步走:安装 → 启动 → 连接编辑器
# 第一步:安装 ACP 集成包
$ npm install deepagents-acp
$ yarn add deepagents-acp
$ pnpm add deepagents-acp
// 第二步:编程方式启动 ACP 服务器
import { startServer } from "deepagents-acp";
await startServer({
agents: {
name: "coding-assistant", // Agent 名称,在编辑器中显示
description: "AI coding assistant with filesystem access", // Agent 描述
},
workspaceRoot: process.cwd(), // 工作区根目录,Agent 自动获取项目上下文
});
# 或者用 CLI 一行搞定(无需写代码)
$ npx deepagents-acp
发生了什么?
startServer以 stdio 模式启动 ACP 服务器- 从 stdin 读取请求,向 stdout 写入响应
- 编辑器作为 ACP 客户端启动并连接这个进程
- Agent 自动获得编辑器提供的项目上下文
CLI 的便捷之处
- 不需要写任何 TypeScript 代码
- 直接运行,编辑器配置指向这个命令即可
- 支持
--name、--skills、--debug等选项 - 零配置,开箱即用
最快路径:
npx deepagents-acp 一行命令启动服务器,然后在编辑器里配置指向这个命令。不需要写代码、不需要启动服务器、不需要端口。
支持的客户端
Deep Agent 可以在任何能运行 ACP Agent 服务器的地方工作
Zed 编辑器
原生支持 ACP,配置最简单。
- 在 settings.json 中添加 profile 配置
- 支持简单配置和自定义服务器脚本
- 打开 Agent 面板即可开始会话
推荐首选
JetBrains IDE
IntelliJ IDEA、PyCharm、WebStorm 等全系列支持。
- 通过 AI Assistant 面板连接
- 支持 ACP 注册表一键安装
- 完整的项目上下文集成
全系列支持
VS Code
通过社区扩展 vscode-acp 支持。
- 安装 vscode-acp 扩展
- 配置 Agent 命令路径
- 享受 VS Code 的完整编辑体验
社区扩展
Neovim
通过兼容 ACP 的插件支持。
- 灵活的插件生态
- 适合终端重度用户
- 可高度自定义集成方式
插件支持
ACP 注册表:Deep Agents 已在 ACP Agent Registry 中上架。支持注册表的客户端(如 Zed、JetBrains)可以一键安装,无需手动配置。
Zed 编辑器集成
三种配置方式——从零代码到完全自定义
// 方式一:零代码配置(最简单)——Zed settings.json
{
"agent": {
"profiles": {
"deepagents": {
"name": "DeepAgents", // 在编辑器 Agent 面板中显示的名称
"command": "npx", // 启动命令
"args": ["deepagents-acp"], // 启动参数
"env": {
"ANTHROPIC_API_KEY": "sk-ant-...", // Anthropic Claude 系列模型
// "DEEPSEEK_API_KEY": "sk-...", // DeepSeek V4 系列(需安装 @langchain/deepseek)
// "OPENAI_API_KEY": "sk-..." // OpenAI GPT 系列
}
}
}
}
}
// 方式二:带 CLI 选项——自定义 Agent 名称、技能和调试模式
{
"agent": {
"profiles": {
"deepagents": {
"name": "DeepAgents",
"command": "npx",
"args": [
"deepagents-acp",
"--name", "my-assistant", // 自定义 Agent 名称
"--skills", "./skills", // 加载技能目录
"--debug" // 启用调试日志(输出到 stderr)
],
"env": {
"DEEPSEEK_API_KEY": "sk-...", // DeepSeek V4 系列(需安装 @langchain/deepseek)
// "ANTHROPIC_API_KEY": "sk-ant-...", // 或使用 Anthropic
// "OPENAI_API_KEY": "sk-..." // 或使用 OpenAI
}
}
}
}
}
配置文件位置
- Linux:
~/.config/zed/settings.json - macOS:
~/Library/Application Support/Zed/settings.json
使用方式
- 配置完成后,打开 Zed 的 Agent 面板
- 选择你的 Deep Agent profile
- 开始对话,Agent 自动获取项目上下文
自定义服务器
需要更多控制?写一个 TypeScript 服务器脚本
// server.ts —— 自定义服务器脚本
import { startServer } from "deepagents-acp";
await startServer({
agents: {
name: "my-agent",
description: "My custom coding agent",
skills: ["./skills/"], // 加载技能目录
memory: ["./.deepagents/AGENTS.md"], // 加载记忆文件(长期上下文)
},
});
// Zed 配置指向自定义脚本——用 tsx 运行 TypeScript 服务器
{
"agent": {
"profiles": {
"my-agent": {
"name": "My Agent",
"command": "npx",
"args": ["tsx", "./server.ts"] // 使用 tsx 直接运行 TS 文件
}
}
}
}
什么时候需要自定义脚本?
- 需要加载自定义技能目录
- 需要指定记忆文件(AGENTS.md)
- 需要注册自定义工具
- 需要配置多 Agent或斜杠命令
- 需要启用Human-in-the-loop
什么时候不需要?
- 只是想快速在编辑器里试试 Deep Agent
- 不需要自定义技能或工具
- 使用默认配置就够了
直接用:npx deepagents-acp
CLI 参考
启动 ACP 服务器最快的方式——无需写代码
$ npx deepagents-acp [options]
| 选项 | 短选项 | 说明 |
|---|---|---|
--name <name> |
-n |
Agent 名称(默认:"deepagents") |
--description <desc> |
-d |
Agent 描述 |
--model <model> |
-m |
LLM 模型(默认:"claude-sonnet-4-5-20250929") |
--workspace <path> |
-w |
工作区根目录(默认:当前工作目录) |
--skills <paths> |
-s |
逗号分隔的 Skill 路径 |
--memory <paths> |
逗号分隔的 AGENTS.md 路径 | |
--debug |
启用调试日志输出到 stderr | |
--help |
-h |
显示帮助信息 |
--version |
-v |
显示版本号 |
环境变量
| 变量 | 说明 |
|---|---|
ANTHROPIC_API_KEY | Anthropic/Claude 模型 API 密钥(必填) |
OPENAI_API_KEY | OpenAI 模型 API 密钥 |
DEBUG | 设为 "true" 启用调试日志 |
WORKSPACE_ROOT | --workspace 的替代方式 |
常用命令组合
# 基础启动
$ npx deepagents-acp
# 指定名称和技能
$ npx deepagents-acp \
--name my-agent \
--skills ./skills
# 调试模式
$ DEBUG=true npx deepagents-acp \
--debug
编程 API 概览
两种方式:便捷函数 startServer 和完全控制 DeepAgentsServer
startServer(便捷)
一次调用即可创建并启动服务器。适合大多数场景。
import { startServer } from "deepagents-acp";
// startServer 一步完成创建 + 启动,适合大多数场景
const server = await startServer({
agents: {
name: "coding-assistant", // Agent 唯一标识
description: "AI coding assistant", // Agent 功能描述
},
workspaceRoot: process.cwd(), // 编辑器提供的项目根目录
});
DeepAgentsServer(完全控制)
如需完全控制服务器生命周期和配置,直接使用类。
import { DeepAgentsServer } from "deepagents-acp";
// DeepAgentsServer 允许完全控制服务器生命周期
const server = new DeepAgentsServer({
agents: [/* 多 Agent 配置数组 */],
serverName: "my-acp", // ACP 服务器名称,在编辑器中显示
serverVersion: "1.0.0", // 服务器版本号
workspaceRoot: process.cwd(), // 工作区根目录
debug: true, // 启用调试日志输出到 stderr
});
await server.start(); // 以 stdio 模式启动服务器
| 服务器选项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
agents | DeepAgentConfig | DeepAgentConfig[] | 必填 | Agent 配置 |
serverName | string | "deepagents-acp" | ACP 服务器名称 |
serverVersion | string | "0.0.1" | 服务器版本 |
workspaceRoot | string | process.cwd() | 工作区根目录 |
debug | boolean | false | 启用调试日志 |
Agent 配置
每个 Agent 的完整配置选项——从名称到中间件
| 选项 | 类型 | 说明 |
|---|---|---|
name |
string |
唯一的 Agent 名称(必填) |
description |
string |
Agent 描述 |
model |
string |
LLM 模型(默认:"claude-sonnet-4-5-20250929") |
tools |
StructuredTool[] |
自定义 LangChain 工具 |
systemPrompt |
string |
自定义系统提示词 |
middleware |
AgentMiddleware[] |
自定义中间件 |
backend |
AnyBackendProtocol |
文件系统后端 |
skills |
string[] |
Skill 源路径 |
memory |
string[] |
Memory 源路径(AGENTS.md) |
interruptOn |
Record<string, boolean | InterruptOnConfig> |
需要用户批准的工具(HITL) |
commands |
Array<{ name, description, input? }> |
自定义斜杠命令 |
核心字段只有两个:
name(必填)和 description。其余全是可选的。你只需要关心和你的场景相关的配置项,其余使用默认值。
多 Agent 支持
在单个服务器中暴露多个 Agent,客户端选择使用哪个
import { DeepAgentsServer } from "deepagents-acp";
const server = new DeepAgentsServer({
agents: [
{
name: "code-agent", // 通用编码助手
description: "General coding assistant",
model: "claude-sonnet-4-5-20250929",
skills: ["./skills/"], // 加载技能目录
memory: ["./.deepagents/AGENTS.md"], // 加载项目记忆
},
{
name: "reviewer", // 代码审查专家
description: "Code review specialist",
systemPrompt: "You are a code review expert...", // 自定义系统提示词
},
],
serverName: "my-deepagents-acp", // 服务器名称
serverVersion: "1.0.0",
workspaceRoot: process.cwd(),
debug: true,
});
await server.start();
工作原理
- ACP 客户端在创建会话时选择 Agent
- 每个 Agent 有独立的配置、工具和提示词
- 共享同一个 ACP 服务器进程
- 适合不同职责的 Agent 组合场景
注意事项
- 某些客户端(如 Zed)不提供 Agent 选择 UI
- 此时考虑为每个 Agent 运行独立的服务器实例
- 配置不同的
serverName以区分 - 在编辑器中配置多个 profile 对应不同 Agent
操作模式与斜杠命令
三种内置操作模式 + 自定义斜杠命令——用户输入 / 触发
deepagents-acp 支持三种内置操作模式:Agent Mode(完整自主 Agent,有文件访问)、Plan Mode(协作规划,不修改文件)、Ask Mode(问答模式,不修改文件),在支持的客户端中切换。你还可以为每个 Agent 定义自定义斜杠命令:
import { DeepAgentsServer } from "deepagents-acp";
const server = new DeepAgentsServer({
agents: {
name: "my-agent",
commands: [
// 简单命令:无需参数
{ name: "test", description: "Run the project's test suite" },
{ name: "lint", description: "Run linter and fix issues" },
// 带参数提示的命令:引导用户输入
{
name: "deploy",
description: "Deploy to staging",
input: { hint: "environment (staging or production)" }, // 输入提示
},
],
},
});
三种内置操作模式
- Agent Mode — 完整自主 Agent,有文件访问能力
- Plan Mode — 协作规划,不修改文件
- Ask Mode — 问答模式,不修改文件
注:/clear、/status 等是部分客户端提供的会话管理命令,并非 ACP 协议或 deepagents-acp 注册。
自定义命令的价值
- 将常用操作封装为快捷入口
- 用户不需要记住复杂提示词
- 输入
/即可看到所有可用命令 - 支持
input.hint引导用户输入参数 - 在编辑器的命令面板中自动注册
人在环路
使用 interruptOn 让 Agent 在执行敏感工具前等待用户批准
import { DeepAgentsServer } from "deepagents-acp";
const server = new DeepAgentsServer({
agents: {
name: "careful-agent",
// 配置需要在执行前暂停等待用户批准的工具
interruptOn: {
// execute:Shell 命令执行前暂停,用户可批准、编辑或拒绝
execute: { allowedDecisions: ["approve", "edit", "reject"] },
// write_file:写入文件前暂停,默认只允许批准或拒绝
write_file: true,
},
},
});
interruptOn 配置
execute: true— Shell 命令执行前暂停write_file: true— 写文件前暂停edit_file: true— 编辑文件前暂停allowedDecisions— 允许的审批决策类型
用户体验
- IDE 弹出提示,显示 Agent 要执行的操作
- 用户可以批准、拒绝或编辑操作
- 可选择在当前会话中记住该决定
- 审批后 Agent 自动继续工作
安全提示:在生产环境中,始终为高风险操作(写文件、执行命令)配置 interruptOn。这确保 Agent 不会在未经确认的情况下修改代码或执行破坏性操作。
自定义工具
用 LangChain tool 格式为 Agent 添加自定义能力
import { DeepAgentsServer } from "deepagents-acp";
import { tool } from "@langchain/core/tools";
import { z } from "zod";
// 使用 LangChain tool 函数 + Zod schema 定义自定义工具
const searchTool = tool(
async ({ query }) => {
return `Results for: ${query}`; // 工具的实际执行逻辑
},
{
name: "search", // 工具名称,Agent 调用时使用
description: "Search the codebase", // 工具描述,Agent 根据此判断何时调用
schema: z.object({ query: z.string() }), // 使用 Zod 定义参数类型
},
);
const deployTool = tool(
async ({ environment }) => {
return `Deployed to ${environment}`;
},
{
name: "deploy",
description: "Deploy the application",
schema: z.object({
environment: z.string().describe("staging or production"), // .describe() 为 Agent 提供参数说明
}),
},
);
const server = new DeepAgentsServer({
agents: {
name: "search-agent",
tools: [searchTool, deployTool], // 将自定义工具注册到 Agent
},
});
await server.start();
工具格式兼容性:ACP 使用 LangChain 的
tool 函数定义工具,配合 Zod schema 声明参数类型。这意味着你之前为 LangGraph Agent 写的工具可以直接复用。
后端与技能
自定义文件系统后端 + 加载技能和记忆文件
自定义后端
import { DeepAgentsServer } from "deepagents-acp";
import {
CompositeBackend,
FilesystemBackend,
StateBackend,
} from "deepagents";
const server = new DeepAgentsServer({
agents: {
name: "custom-agent",
// CompositeBackend 根据路径前缀路由到不同后端
backend: new CompositeBackend({
routes: [
{
prefix: "/workspace", // /workspace 路径走磁盘文件系统
backend: new FilesystemBackend({
rootDir: "./workspace", // 映射到本地目录
}),
},
{
prefix: "/", // 其余路径走内存状态后端
backend: new StateBackend(), // 适用于临时文件和状态数据
},
],
}),
},
});
Skill 和 Memory
import { startServer } from "deepagents-acp";
await startServer({
agents: {
name: "project-agent",
description:
"Agent with project-specific knowledge",
skills: [
"./skills/", // 项目级技能目录
"~/.deepagents/skills/", // 用户级技能目录
],
memory: [
"./.deepagents/AGENTS.md", // 项目级记忆文件
],
},
workspaceRoot: process.cwd(), // 设置工作区根目录
});
CompositeBackend 路由
根据路径前缀将请求路由到不同后端。/workspace 走磁盘,/ 走内存。灵活组合,按需分配。
Skills 加载
支持目录和文件路径,多个路径逗号分隔。加载后 Agent 自动获得技能中定义的工作流和领域知识。
Memory 持久化
AGENTS.md 文件作为 Agent 的长期记忆。跨会话保留项目知识、编码规范和历史决策。
完整示例
一个带有自定义工具、HITL 和技能的项目 Agent
import { DeepAgentsServer } from "deepagents-acp";
import { tool } from "@langchain/core/tools";
import { z } from "zod";
// 自定义工具:运行测试
const runTests = tool(
async ({ scope }) => {
return `Tests passed for ${scope}`;
},
{
name: "run_tests",
description: "Run project tests",
schema: z.object({
scope: z.string().describe("test scope, e.g. 'unit' or 'all'"),
}),
},
);
// 创建完整配置的 ACP 服务器——集成了自定义工具、技能、记忆和 HITL
const server = new DeepAgentsServer({
agents: {
name: "project-agent",
description: "Full-featured coding assistant",
tools: [runTests], // 自定义工具
skills: ["./skills/"], // 技能目录
memory: ["./.deepagents/AGENTS.md"], // 长期记忆文件
commands: [ // 自定义斜杠命令
{ name: "test", description: "Run tests" },
{ name: "review", description: "Review current changes" },
],
interruptOn: { // 人在环路:敏感操作需审批
write_file: true, // 写文件前暂停
execute: { allowedDecisions: ["approve", "reject"] }, // Shell 命令前暂停
},
},
serverName: "my-project-acp",
serverVersion: "1.0.0",
workspaceRoot: process.cwd(),
});
await server.start();
这个配置涵盖了 ACP 的核心能力:自定义工具、技能加载、长期记忆、斜杠命令、人在环路。根据你的实际需求,可以自由组合这些选项。
动手练习
将你之前创建的 Deep Agent 通过 ACP 集成到编辑器中
现在轮到你了。选择一个你喜欢的编辑器,完成以下任务:
任务 1:零代码启动
- 运行
npx deepagents-acp启动服务器 - 在 Zed 或 VS Code 中配置 Agent profile
- 在编辑器中启动对话,验证连接成功
- 观察 Agent 如何自动获取项目上下文
任务 2:自定义配置
- 创建一个
server.ts文件 - 配置至少一个自定义工具
- 添加
interruptOn保护写操作 - 注册一个自定义斜杠命令
任务 3:多 Agent 尝试
- 创建两个不同职责的 Agent
- 一个用于编码,一个用于审查
- 在编辑器中切换使用不同 Agent
提示:先用
--debug 选项启动服务器,可以在终端看到完整的通信日志,帮助理解 ACP 协议的工作方式。
常见问题
集成过程中遇到的典型问题及解决方案
连接失败
- 现象:编辑器提示"无法连接 Agent"
- 检查:
command路径是否正确 - 检查:
ANTHROPIC_API_KEY是否设置 - 解决:在终端手动运行命令,确认无报错
Agent 无响应
- 现象:发送消息后无回复
- 检查:API 密钥是否有效
- 检查:模型名称是否正确
- 解决:用
--debug查看完整日志
技能加载失败
- 现象:Agent 无法使用自定义技能
- 检查:
--skills路径是否存在 - 检查:路径是相对路径还是绝对路径
- 解决:使用
workspaceRoot的相对路径
HITL 不生效
- 现象:Agent 直接执行敏感操作,未暂停
- 检查:
interruptOn配置的工具名是否正确 - 检查:编辑器是否支持 HITL UI
- 解决:确认客户端支持审批交互
调试技巧:始终使用
--debug 启动开发环境中的服务器。日志输出到 stderr,不会干扰 stdio 通信。同时设置 DEBUG=true 环境变量可以获得更详细的日志。
本章回顾
到这里,你已经掌握了通过 ACP 集成 Deep Agent 的完整流程
你学到了什么
- ACP 是 Agent 与编辑器之间的标准化通信协议
npx deepagents-acp一行命令即可启动服务器- 支持 Zed、JetBrains、VS Code 等主流编辑器
- 编程 API:
startServer和DeepAgentsServer两种方式 - 可配置多 Agent、斜杠命令、HITL、自定义工具
- 支持自定义后端、技能加载和记忆持久化
后续章节预告
- Deep Agent Code — 终端编程 Agent 的使用
- Code 记忆与技能 — 在终端环境中的持久化
- Code 远程沙箱 — 在云端隔离执行
- Code 子 Agent — 终端环境中的任务委派
- Code 供应商配置 — 支持多种 LLM 供应商
核心结论:ACP 让 Deep Agent 从终端走进编辑器。一行命令启动,标准协议通信,主流编辑器支持。你构建的 Agent 不再是孤立的工具,而是嵌入开发环境的编程伙伴——这是从"能用"到"好用"的关键一步。
延伸阅读
继续本课程
- 下一章:Deep Agent Code 概览 — 终端编程 Agent 的使用
- 第 01 章:认识 Deep Agents — 回顾基础概念
官方文档
- ACP 协议官方文档 — 协议规范和概念
- ACP 客户端列表 — 支持的编辑器
- deepagents-acp npm 包 — 安装和 API
- ACP Agent Registry — 一键安装注册表
相关资源
- LangChain 文档索引 — 完整的文档导航
- Deep Agents 权限文档 — 文件访问与 HITL 配置
- GitHub 仓库 — 源码和示例
- ACP vs MCP 对比 — 理解两个协议的适用场景