ACP 测试和支持矩阵
ACP 是双向的。一个有用的互操作性测试必须在通知和嵌套请求到达时保持一个连接 打开;一系列断开的 JSON 行无法证明会话行为。
已验证的测试
adk-acp 套件通过内存传输将官方的 SDK Client 连接到 ADK-Rust SDK
Agent,并执行以下内容:
initialize
→ session/new
→ session/prompt
← session/update
← PromptResponse(end_turn)
→ session/close
→ session/list
→ session/resume
→ session/close
→ session/delete
单独的测试覆盖会话取消、JSON-RPC 请求取消与
恢复、事件映射、拒绝优先的权限菜单、不可见的选项 ID、
伪造选择、等待中的人工决策、精确调用仅允许一次行为、
MCP 配置验证,以及秘密信息脱敏的调试输出。第 2 阶段增加了
session/load 重放排序测试(重放后的 session/update 与
已存储事件的时间顺序一致)、多模态提示映射和拒绝
测试(接受图像和音频;拒绝未声明的内容)、服务器
权限桥接的批准/拒绝/取消测试(取消映射为拒绝,
并按 function-call id 关联),以及客户端一致性测试,证明
ToolCallUpdate 和 UsageUpdate 接口在不影响 agent
文本接口的情况下仍然可用。第 3 阶段增加了会话模式和配置选项测试
(set_mode / set_config_option 记录已声明的值并拒绝未知
值,而且选择会在 session/load 之间保持),session/fork
隔离测试(fork 的历史与源历史相同,且源保持
不变)、可用命令和会话信息激活测试(仅当 agent 声明命令或记录标题时发出更新),以及
能力准确性测试,断言声明的能力与已注册的处理程序和启用的内容映射完全一致——包括仅当存在 SessionControls 提供者时才声明模式和配置选项。
实时 MCP 生命周期门会启动一个真实的 stdio MCP 子进程,完成
握手,并通过 ACP 会话所使用的同一 McpToolset 发现其工具。
运行这些门禁
cargo test -p adk-acp --all-features
cargo test -p adk-agent --test tool_confirmation_tests
cargo test -p adk-tool --features mcp --test mcp_server_lifecycle_integration_tests test_tool_aggregation -- --ignored --exact
cargo test --manifest-path examples/acp_client_host/Cargo.toml
cargo check --manifest-path examples/acp_kiro/Cargo.toml
cargo check --manifest-path examples/acp_server/Cargo.toml
cargo test --manifest-path examples/acp_full_protocol/Cargo.toml
acp_full_protocol 门禁是可运行的第 2 阶段安全网:一个没有 API 密钥、
由 Runner 支持的 AcpServer,通过进程内
通道由官方 SDK 驱动,在没有子进程或模型
凭据的情况下验证完整的服务器方向第 2 阶段表面(嵌入式资源
以及图像/音频提示、权限桥接、session/load 重放排序,
以及 UsageUpdate / ToolCallUpdate 暴露)。
当前支持
| 区域 | 状态 | 备注 |
|---|---|---|
| 稳定的 wire 协议 v1 | 已实现 | 官方 Rust SDK 1.2;协议版本单独协商 |
| 本地 stdio 客户端传输 | 已实现 | 一次性、流式和持久会话 |
| 客户端权限 | 已实现 | 默认拒绝,语义匹配,不透明 ID,同步或异步策略 |
| 客户端文件系统回调 | 已实现 API | 读取和写入独立声明 |
| 客户端终端回调 | 已实现 API | 完整的 create/output/wait/kill/release trait |
| 客户端提供的 MCP | 已实现 | 需要 stdio;HTTP/SSE 受能力门控 |
| ADK-Rust ACP 服务器 | 已实现 | 新建、prompt、加载、更新、取消、关闭、列表、恢复、分叉、set_mode、set_config_option、删除 |
| 服务器会话加载 + 重放 | 已实现 | 重新激活一个已持久化的会话,并按时间顺序重放存储的事件;已公开 load_session |
| 服务器会话分叉 | 已实现 | 将历史记录和相关状态复制到新的会话 ID 中,同时保持源会话不变;已公开 fork |
| 服务器会话模式 + 配置选项 | 已实现 | 通过 SessionControls 进行提供方门控;set_mode / set_config_option 已校验,并在加载/恢复/分叉之间持久化;仅在声明时公开 |
| 服务端 available-commands + session-info | 已实现 | 在激活时发出,当代理声明命令或记录标题时;否则不发出 |
| 服务端 plan 更新 | 未启用 | Plan SessionUpdate 映射已存在,但在 ADK plan primitive 出现 plan 条目之前保持无效 |
| 服务端 session MCP | 已实现 | stdio,每个 session,受限的启动和清理 |
| 文本和资源链接提示 | 已实现 | 通过共享内容模块映射 |
| 多模态提示(图像、音频) | 已实现 | 映射到 Part::InlineData;声明了 image/audio;未声明的内容被拒绝 |
| 嵌入式资源提示 | 已实现 | 映射到 Part::EmbeddedResource;声明了 embedded_context |
| 服务器 ADK 工具审批到 ACP | 已实现 | ToolConfirmationRequest 桥接到 session/request_permission;allow → approve,deny/cancel → deny,按 function-call id 关联 |
| 客户端工具更新和使用一致性 | 已实现 | OutputChunk::ToolUpdate 和 OutputChunk::Usage 体现了 External_Agent 的 ToolCallUpdate/UsageUpdate;agent 文本不变 |
| 客户端富提示内容 | 已实现 | prompt_agent_content_with_policy 将非文本 ADK 内容作为匹配的 ACP 块传输 |
| 远程 ACP HTTP/WebSocket | 未公布 | 稳定实现是本地 stdio |
| 实验性协议特性 | 未公布 | 仅在实现和互操作性测试之后添加 |
手动编辑器测试
构建 examples/acp_server,然后配置一个 ACP 客户端,以绝对 manifest 路径和模型凭据启动该二进制文件。验证:
- 初始化响应报告协议版本 1;
- 新会话接受预期的绝对项目目录;
- 文本在最终响应之前以实时更新的形式出现;
- 读取工具在客户端中启动并显示完成;
- 取消会在不关闭连接的情况下结束该轮次;
- 后续提示在同一会话中成功;
- 当会话服务是持久化的时,关闭和恢复会保留历史记录。
不要将 echo | cargo run 用于此测试。每个管道都会启动一个不同的进程,无法保留连接或会话。
相关示例
acp_client_hostacp_kiroacp_serveracp_full_protocol— 无 API 密钥、由Runner支持的 Phase 2 服务端方向参考,带有端到端验证测试