Agent Client Protocol(ACP)是一个基于 JSON-RPC 的、用于与 agent 运行时对话的协议。dsh 随附一个自动化专用 ACP 服务器(packages/acp/acp),跑在 JSON-RPC stdio 上:编程式客户端创建全新的 harness agent、发送文本提示、收集已提交的 assistant 文本、按策略解析一次性权限请求,并取消工作。仓库内的主要客户端是 dsh-subagent-acp(见 子代理)。
| 包 | 角色 |
|---|---|
@deepseek-ai/dsh-acp | 基于 JSON-RPC stdio 的 ACP 服务器插件 |
@deepseek-ai/dsh-subagent-acp | ACP 支撑的子代理传输 |
这个包是什么(以及不是什么)
来自 packages/acp/acp/README.md:这个包是一个传输适配器,不是 UI 集成,也不是能力接缝。它不暴露编辑器导航、转录重放、命令、模式、配置选择器、elicitation、推理、计划、标题或工具呈现——交互式渲染与人类提问属于 Web host 与 client 模块。服务器的界面刻意保持小巧:只有自动化契约。
插件与配置
apply(ctx, config) 在 stdin/stdout 上打开一个 AgentSideConnection 并驱动 ctx.agents。stdout 保留给协议帧。
| 配置 | 默认 | 含义 |
|---|---|---|
provider | — | 每个创建 agent 的初始 provider 路由 |
model | — | 每个创建 agent 的初始模型 |
两个字段都是可选的,以便另一个 agent/请求监听者提供目标;可运行的 ACP 组合两者都需要。
协议契约
| 方法 | 行为 |
|---|---|
initialize | 协商支持的版本并宣告仅基线提示(无图片、音频或嵌入式上下文能力)。不宣告任何 session、editor、terminal、filesystem 或 MCP 能力。 |
authenticate | 空操作,因为服务器不宣告任何认证方法。 |
| (任务方法) | 每个任务全新 agent、文本提示进、已提交 assistant 文本出、一次性权限请求按策略解析、支持取消。 |
实现位于 packages/acp/acp/src/——index.ts(插件、连接循环、方法派发)、codec.ts(stdio 上的 JSON-RPC 帧编解码)与 invariant.ts(其不变量伴侣,遵循仓库的每包不变量约定)。
消费者:dsh-subagent-acp
ACP 服务器不是独立的产品界面;在 dsh 内部它是 acp 子代理传输的后端。当 agent 通过 ctx.subagents 以 ACP 传输 spawn 子代理时,dsh-subagent-acp 启动 ACP 服务器(子进程中通过 stdio 讲 ACP 的全新 harness agent)并通过它代理委派——给子代理一个隔离的进程边界,同时保持统一的子代理 API(传输矩阵见 子代理:spawn、fork、acp、codex/claude-code/dsh-sdk)。
可运行的示例
两个可运行示例演示服务端表面:
examples/acp-agent(acp-agent-example)——基于 JSON-RPC stdio 的 ACP 服务器组合:启动dsh-acpbundle、接受客户端会话、运行 agent 循环、把文本流回。packages/examples/acp-demo(@deepseek-ai/dsh-acp-demo)——树内演示插件:examples/acp-agent的cordis.yml把它接进服务器,提供展示服务器运行的 provider/model 配置。
关键源文件
| 仓库相对路径 | 提供什么 |
|---|---|
packages/acp/acp/src/index.ts | 插件、AgentSideConnection、方法派发 |
packages/acp/acp/src/codec.ts | JSON-RPC 帧编解码 |
packages/subagent/subagent-acp/src/ | ACP 子代理传输 |
examples/acp-agent/ | 服务端侧可运行示例 |
packages/examples/acp-demo/ | 示例所启动的演示插件 |