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 关联),以及客户端一致性测试,证明 ToolCallUpdateUsageUpdate 接口在不影响 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::ToolUpdateOutputChunk::Usage 体现了 External_Agent 的 ToolCallUpdate/UsageUpdate;agent 文本不变
客户端富提示内容已实现prompt_agent_content_with_policy 将非文本 ADK 内容作为匹配的 ACP 块传输
远程 ACP HTTP/WebSocket未公布稳定实现是本地 stdio
实验性协议特性未公布仅在实现和互操作性测试之后添加

手动编辑器测试

构建 examples/acp_server,然后配置一个 ACP 客户端,以绝对 manifest 路径和模型凭据启动该二进制文件。验证:

  1. 初始化响应报告协议版本 1;
  2. 新会话接受预期的绝对项目目录;
  3. 文本在最终响应之前以实时更新的形式出现;
  4. 读取工具在客户端中启动并显示完成;
  5. 取消会在不关闭连接的情况下结束该轮次;
  6. 后续提示在同一会话中成功;
  7. 当会话服务是持久化的时,关闭和恢复会保留历史记录。

不要将 echo | cargo run 用于此测试。每个管道都会启动一个不同的进程,无法保留连接或会话。