用 ACP 把 DeepSeek Harness 接进 Zed

Agent Client Protocol 三步走:选对路线、接上服务器,然后在 Zed 的 Agent 面板里开工。

最近更新: 2026-09-29

ACP(Agent Client Protocol)是编辑器和编码代理之间的对话协议:一端拉起代理进程、发送提示词,另一端把消息、思考、工具卡片和权限请求用 JSON-RPC 流式推回来。Zed 的 Agent 面板原生就说这门语言,而协议是开放的,所以 dsh 代理完全可以坐在那块面板的另一头。

老实的路线有两条。官方的 `@deepseek-ai/dsh-acp` 包定位就是 automation-only——给脚本、测试跑批和进程外子代理用;而编辑器里的完整交互体验,要靠社区的 editor-facing 服务器投射进 Zed。这篇教程两条都走一遍,然后把交互路线真正接进 Zed。

太长不看

  • ▸ACP 连的是「编辑器 ⇄ 代理」,MCP 连的是「代理 ⇄ 工具」,两个大概率都要——先看下面的 ACP vs MCP 一节。
  • ▸官方 dsh ACP 服务器(`dsh --profile acp`)只做自动化:没有计划卡片、没有会话标题、没有终端视图——这是有意为之。
  • ▸想在 Zed 里用,装社区的 `deepseekharness-acp-interactive` npm 包——本教程接的就是它。
  • ▸总共三步:全局安装、跑一次 `dsh-acp-interactive --setup`、在 Zed 的 settings.json 里注册到 `agent_servers`。

两条路线,各三步

第一部分 — 选路线

  1. 1

    先想清楚你要 ACP 干什么

    如果驱动 dsh 的是程序——CI 任务、测试跑批、另一个 harness——官方服务器就是对的工具:标准 ACP v1、会话能跨重启持久化、一条连接可以跑多个会话、还没有鉴权步骤。如果是人想从 Zed 的 Agent 面板里用 dsh,那要的是社区的交互式服务器——官方那台故意不做计划、标题、待办和终端视图。

  2. 2

    路线 A:官方 automation-only 服务器

    仓库检出里,ACP 服务器在 `packages/acp`,对应插件 `@deepseek-ai/dsh-acp`。通过组合配置给每个会话指定 provider 和模型,再用 acp profile 启动——stdout 只跑 JSON-RPC 协议帧。客户端可以创建、列出、恢复和关闭会话,挂载 stdio 或 HTTP 的 MCP 服务器,切换模型与推理力度,并应答权限请求。要从另一个 harness 里以进程外子代理的方式拉起同一台服务器,官方客户端是 `@deepseek-ai/dsh-subagent-acp`。

    $pnpm dsh --profile acp
    - name: '@deepseek-ai/dsh-acp'
      config:
        provider: deepseek-official
        model: deepseek-v4-pro
  3. 3

    路线 B:装交互式服务器

    dsh-acp-interactive(社区项目,MIT 协议,与 DeepSeek 和 Zed 无隶属关系)把已发布的 `@deepseek-ai/dsh-*` 包组合进一份面向编辑器的 profile,于是 Zed 能看到消息、思考、工具卡片、权限请求、计划、会话标题和用量。全局安装后跑一次 `--setup`:它会把 `DEEPSEEK_API_KEY` 写进 harness 的凭据存储,全程不回显。跳过 `--setup` 也行——没存 key 的新会话会给出一个 Configure DeepSeek API key 操作,走的是同一条流程。

    $npm install --global deepseekharness-acp-interactive
    $dsh-acp-interactive --setup

第二部分 — 接进 Zed

  1. 4

    在 Zed 的 settings.json 里注册

    打开命令面板(Ctrl+Shift+P / Cmd+Shift+P),执行 `zed: open settings`,把服务器加到 `agent_servers` 下。Windows 上 `command` 要填 `where.exe dsh-acp-interactive` 输出的绝对路径(用正斜杠或双反斜杠);macOS 和 Linux 用 `which dsh-acp-interactive` 的输出。保存文件。

    {
      "agent_servers": {
        "dsh-acp-interactive": {
          "type": "custom",
          "command": "dsh-acp-interactive",
          "args": []
        }
      }
    }
  2. 5

    从 Agent 面板开一条会话

    用 Ctrl+? / Cmd+? 打开 Zed 的 Agent 面板,在下拉框里选 dsh-acp-interactive,发第一条提示词。工具调用跑在 dsh 沙箱里:read-only 预设下的写操作会以 ACP 权限请求的形式回来,给你 Allow once / Reject 两个选项,批准后的编辑会渲染成工具卡片。`/` 面板列出组合插件注册的人类命令,composer 里还有权限预设和推理力度选择器——它们都是 ACP 的会话配置项。

  3. 6

    不止 Zed:其他客户端与适配器

    任何说 ACP v1 的客户端都能接这些服务器。下面的目录里收录了 Paseo 和 BitFun 的适配器、一份朴素的 ACP 服务器实现,还有 Martty——一个本身就是 ACP 客户端的 TUI。dsh-acp-interactive 的会话以 JSONL 落在你 `.dsh` 主目录的 `acp-sessions` 下、按工作目录分片,编辑器外的会话照样可审计。流式粒度因客户端而异——两个已知的糙点看 FAQ。

ACP vs MCP:两个协议各管什么

这两个缩写分立在代理的两侧,而 dsh 两边都说。

ACP — 编辑器 ⇄ 代理

Agent Client Protocol(agentclientprotocol.com)标准化的是「客户端如何托管一个编码代理」:创建和恢复会话、发送提示词、流式接收消息、思考、工具调用和计划,协商权限,并暴露模型与推理力度选择器。Zed 的 Agent 面板是最有代表性的客户端。

MCP — 代理 ⇄ 工具

Model Context Protocol 标准化的是「代理如何够到工具」:一台 MCP 服务器对外暴露工具、资源和提示词——地图、搜索、数据库——供模型调用。dsh 按会话挂载 MCP 服务器;字段对照和 mcpServers 配置块在我们的 MCP 配置教程里。

它们是叠加关系不是竞争关系——一个 ACP 会话可以挂 MCP 服务器,所以把 Zed 接进 ACP 并不会取代你的 MCP 配置。 在 dsh 里配置 MCP 服务器

dsh ACP 适配器目录

以下服务器都在 2026-09-29 逐一核实过真实存在;星数为当日快照。第一行就是本教程装进 Zed 的那个。

项目星数适合
ClickPM/dsh-acp-interactive★99上文接进 Zed 的编辑器侧服务器——消息、思考、工具卡片、计划、标题、用量;以 ACP v1 为基线
openma-ai/Martty★78本身就是 ACP 客户端的统一 harness TUI——不开编辑器也能在终端里开会话
openma-ai/deepseek-harness-acp★36Martty 团队出品的朴素 dsh ACP 服务器实现(dsh-acp)
Pheobe-Southwood/dsh-acp-paseo★11Paseo 集成包——自动发现的模型目录、plan/execute 模式、原生 dsh 斜杠命令
bobleer/dsh-acp-for-bitfun★10BitFun ⇄ dsh 适配器,接 BitFun 编辑器一侧
grunmin/dsh-acp-enhanced★7Zed 桥接插件,带块级流式、用量遥测、模型与推理力度切换和权限预设——插件方式安装

以上均为社区维护项目,与 DeepSeek 无隶属或背书关系;官方 npm 包保持 automation-only。执行前请到各仓库 README 核对安装命令。

ACP 接入常见问题

服务器跑起来之后,最常被问到的几个。

dsh 里的 ACP 和 MCP 有什么区别?

方向不同。ACP(Agent Client Protocol)把客户端——Zed 的 Agent 面板、TUI、脚本——连到 dsh 代理:会话、提示词、流式回复、权限请求都在这条线上。MCP(Model Context Protocol)则把 dsh 代理向外连到地图、搜索、数据库这类工具。一个 ACP 会话可以挂 MCP 服务器,两个协议是叠起来的,不是二选一。

有官方的 dsh ACP 服务器吗?

有——就是仓库 `packages/acp` 里的 `@deepseek-ai/dsh-acp`,用 `dsh --profile acp` 启动;它在 npm 上的描述写得很直白:基于 JSON-RPC stdio 的 automation-only ACP 服务器。会话、模型选择、MCP 挂载、提示词、权限请求它都管,但有意不做 dsh 的展示层——计划、标题、待办、终端视图和表单交互都被排除在外。

用官方服务器时,Zed 里为什么看不到计划或待办卡片?

这是设计决定不是缺陷:官方设计笔记明确把 ACP 定位成 automation-only 协议,协议层会直接省略或拒绝不支持的接口。要完整的编辑器体验——计划卡片、会话标题、用量——请用社区交互式服务器,比如 dsh-acp-interactive,它把这些 dsh 更新投射成了 ACP 的内容。

为什么回复一整块蹦出来,没有打字机效果?

这是已知的粒度问题,0.1.7-rc.2 时代的 #8244 讨论帖报告过:agent_message_chunk 更新可能一次性携带整条消息,轮次结束前 Zed 的打字机效果无事可做。交互式服务器通过投射更细粒度的会话事件来缓解;别默认你的客户端一定在流式输出,先看适配器的兼容性说明。

为什么模型的思考过程出现在了回复正文里?

这就是 #8235:dsh-acp 给同一条助手回复的思考块和消息块发了同一个 messageId,按 messageId 分组收包的客户端就会把两段拼在一起。Paseo 对接 @deepseek-ai/dsh-acp 0.2.0-rc.1 和 0.1.7-rc.2 时都能复现。上游修复前,用把两条流分开投射的交互式服务器可以绕开。

Zed 之外的编辑器能用吗?

只要客户端说 ACP v1 就行:协议本身不挑客户端,Paseo 和 BitFun 各有适配器,终端有 Martty,社区网关也对着 VS Code 的 ACP 支持在做。差别在每个客户端的投射能力——流式、计划、权限这些表面各自渲染到什么程度——所以请以适配器的兼容性矩阵为准。

相关教程

这套配置周边的协议与预设。

DSH Plugins 是独立的 DeepSeek Harness 插件市场,与 DeepSeek 官方无关,也不代表官方背书。第三方插件未经安全审计,安装前请审查源码。

每周获取最新的 DeepSeek Harness 插件,绝不滥发。