第 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 与 MCP 协议层对比

快速开始

三步走:安装 → 启动 → 连接编辑器

# 第一步:安装 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 一行命令启动服务器,然后在编辑器里配置指向这个命令。不需要写代码、不需要启动服务器、不需要端口。
图:ACP 服务器 stdio 通信时序

支持的客户端

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_KEYAnthropic/Claude 模型 API 密钥(必填)
OPENAI_API_KEYOpenAI 模型 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 模式启动服务器
服务器选项类型默认值说明
agentsDeepAgentConfig | DeepAgentConfig[]必填Agent 配置
serverNamestring"deepagents-acp"ACP 服务器名称
serverVersionstring"0.0.1"服务器版本
workspaceRootstringprocess.cwd()工作区根目录
debugbooleanfalse启用调试日志

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
图:单进程多 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 不再是孤立的工具,而是嵌入开发环境的编程伙伴——这是从"能用"到"好用"的关键一步。

延伸阅读

继续本课程

官方文档

相关资源