A2A vs ACP 协议对比分析

本文档对比分析 A2A (Agent-to-Agent Protocol) 和 ACP (Agent Client Protocol) 两个协议的核心差异、设计理念和适用场景。

执行摘要

维度 A2A ACP
核心定位 Agent 与 Agent 之间的互操作协议 IDE/编辑器与 AI Coding Agent 之间的通信协议
一句话概括 "Agent 间的 HTTP" — 分布式 Agent 互操作标准 "AI Agent 的 LSP" — IDE 与编码 Agent 的通信标准
设计目标 跨组织、跨厂商的 Agent 互联互通 编辑器内嵌 AI 编码助手的标准化接口
通信关系 对等通信 (Agent ↔ Agent) 主从通信 (Client/IDE → Agent 子进程)
网络模型 分布式网络通信,支持远程调用 本地进程间通信 (stdio)
关系 互补而非竞争 — 可在同一系统中共存使用

一、Schema 定义方式对比

A2A

  • 规范源: Protobuf (specification/a2a.proto)
  • 衍生格式: 从 Proto 自动生成 JSON Schema (非规范文档)
  • 序列化: ProtoJSON (枚举值使用 SCREAMING_SNAKE_CASE)
  • 优势: 类型安全、跨语言支持、自动代码生成

ACP

  • 规范源: JSON Schema (schema/schema.json, ~140KB)
  • 衍生格式: 从 JSON Schema 生成 Rust 类型定义
  • 序列化: 标准 JSON
  • 方法索引: meta.json 提供方法名映射表
  • 优势: Web 生态友好、易于手写和调试

二、传输层 (Transport Layer)

A2A — 多协议、网络分布式

传输方式 说明
JSON-RPC 2.0 over HTTP(S) 主要协议绑定
gRPC 完整 gRPC 服务定义
HTTP+JSON/REST RESTful 端点映射
流式传输 Server-Sent Events (SSE)
推送通知 Webhook (支持离线场景)
服务发现 /.well-known/agent-card.json

传输示例 (JSON-RPC):

{
  "jsonrpc": "2.0",
  "id": "req-001",
  "method": "SendMessage",
  "params": {
    "message": {
      "role": "ROLE_USER",
      "parts": [{"text": "Hello"}]
    }
  }
}

ACP — 本地进程通信

传输方式 说明
stdio Client 启动 Agent 子进程,通过 stdin/stdout 通信
消息格式 换行分隔的 JSON-RPC 消息
流式传输 JSON-RPC Notification 流
推送通知 无需 (进程内实时通知)
服务发现 无需 (Client 直接启动 Agent)

传输示例:

{"jsonrpc":"2.0","method":"initialize","params":{...},"id":1}\n
{"jsonrpc":"2.0","method":"session/update","params":{...}}\n

关键差异: A2A 设计用于跨网络、跨组织的 Agent 通信;ACP 设计用于编辑器与本地 Agent 进程的紧密集成。


三、核心数据模型对比

3.1 Agent 描述

A2A: AgentCard — 完整的自描述清单

message AgentCard {
  string name = 1;
  string description = 2;
  string version = 5;
  repeated AgentInterface supported_interfaces = 19;  // 网络接口
  AgentProvider provider = 4;
  AgentCapabilities capabilities = 7;
  repeated AgentSkill skills = 12;                    // 技能声明
  map<string, SecurityScheme> security_schemes = 8;   // 安全方案
  repeated SecurityRequirement security_requirements = 13;
  string icon_url = 18;
}

特点: - 包含完整的网络接口信息 (URL + 协议绑定) - 详细的技能声明 (带 tags、examples) - 企业级安全配置 (OAuth2, OIDC, mTLS) - Provider 信息和图标

ACP: AgentInfo + 能力协商

{
  "name": "MyAgent",
  "version": "1.0.0",
  "agentCapabilities": {
    "loadSession": true,
    "promptCapabilities": {
      "image": true,
      "audio": true,
      "embeddedContext": true
    },
    "mcpCapabilities": {...}
  },
  "authMethods": [
    {"id": "github", "name": "GitHub OAuth"}
  ]
}

特点: - 轻量级 (无需网络接口信息) - 双向能力协商 (类似 LSP) - 简化的认证方式 - 专注于编码能力声明


3.2 任务/会话模型

A2A: Task — 不可变的任务单元

message Task {
  string id = 1;
  string context_id = 2;          // 关联多个任务
  TaskStatus status = 3;
  repeated Artifact artifacts = 4; // 命名的输出物
  repeated Message history = 5;    // 完整对话历史
  google.protobuf.Struct metadata = 6;
}

状态机 (8 个状态):

SUBMITTED → WORKING → {
  COMPLETED (终态)
  FAILED (终态)
  CANCELED (终态)
  REJECTED (终态)
  INPUT_REQUIRED (中断态)
  AUTH_REQUIRED (中断态)
}

特点: - 任务不可变性: Terminal 状态后不可重启 - 任务引用: 通过 reference_task_ids 实现任务链 - 上下文分组: context_id 关联相关任务 - Artifact: 命名的结构化输出

ACP: Session + PromptTurn — 持久会话

{
  "sessionId": "session-123",
  "cwd": "/path/to/project",
  "modes": ["ask", "code", "architect"]
}

PromptTurn 生命周期:

session/prompt →
  session/update (plan) →
  session/update (agent_message_chunk) →
  session/update (tool_call) →
  [session/request_permission] →
  session/update (tool_call_update: completed) →
session/prompt response (stopReason)

停止原因 (5 种): - end_turn — 正常结束 - max_tokens — 达到 token 上限 - max_turn_requests — 达到请求上限 - refusal — 拒绝执行 - cancelled — 用户取消

特点: - 会话持久化: 可 load/resume - 多模式: ask/code/architect 等 - 配置化: 可动态调整 session config - 无独立 Artifact: 输出通过 tool_call 体现


3.3 消息与内容

A2A: Message + Part

message Message {
  string message_id = 1;
  Role role = 4;  // ROLE_USER / ROLE_AGENT
  repeated Part parts = 5;
  repeated string reference_task_ids = 8;
}

message Part {
  oneof content {
    string text = 1;
    bytes raw = 2;
    string url = 3;
    google.protobuf.Value data = 4;  // 任意 JSON
  }
  string media_type = 7;
  string filename = 6;
}

ACP: ContentBlock

{
  "type": "text",
  "text": "Hello"
}
// 或
{
  "type": "image",
  "data": "base64...",
  "mimeType": "image/png"
}
// 或
{
  "type": "resource",
  "uri": "file:///path/to/file",
  "text": "content",
  "mimeType": "text/plain"
}

支持类型: - Text — 纯文本/Markdown - Image — Base64 图片 (需 image 能力) - Audio — Base64 音频 (需 audio 能力) - ResourceLink — 资源引用 - Resource — 嵌入式资源 (需 embeddedContext 能力)

关键差异: A2A 的 Part.data 支持任意 JSON 结构化数据;ACP 专注于编辑器场景的内容类型。


3.4 工具调用 — 核心设计差异

A2A: 无工具调用概念

A2A 刻意保持 Agent 内部实现的不透明性 (Opacity): - Agent 内部如何使用工具是实现细节 - 对外仅暴露 Task 状态和 Artifact - 工具调用不出现在协议层面

设计理念: Agent 作为黑盒,Client 只关心"任务完成了吗",不关心"用了什么工具"。

ACP: 工具调用为一等公民

{
  "type": "tool_call",
  "toolCall": {
    "toolCallId": "call-001",
    "title": "Read file: main.py",
    "kind": "read",
    "status": "in_progress",
    "content": [
      {
        "type": "text",
        "text": "Reading file..."
      }
    ],
    "locations": [
      {
        "path": "/path/to/main.py",
        "range": {"start": {"line": 0, "character": 0}, "end": {...}}
      }
    ]
  }
}

工具元数据: - kind: read / edit / delete / move / search / execute / think / fetch / other - status: pending → in_progress → completed / failed - content: 工具输出 (text / diff / terminal) - locations: 影响的文件位置

权限控制:

{
  "method": "session/request_permission",
  "params": {
    "sessionId": "session-123",
    "permission": {
      "type": "fs_write",
      "path": "/path/to/file.txt"
    }
  }
}

设计理念: IDE 需要完全掌控 Agent 的每一步操作,以便展示、审核、回滚。

为什么如此不同?

场景 A2A ACP
跨组织 Agent 协作 ✅ 不暴露内部工具,保护商业机密 ❌ 不适用
IDE 内编码助手 ❌ 缺少细粒度控制 ✅ 每步可见、可控、可审核

四、实时更新机制

A2A: StreamResponse (SSE)

Content-Type: text/event-stream

data: {"task":{"id":"task-1","status":"TASK_STATE_WORKING"}}

data: {"message":{"parts":[{"text":"Processing..."}]}}

data: {"task":{"id":"task-1","status":"TASK_STATE_COMPLETED","artifacts":[...]}}

推送通知 (Webhook):

{
  "url": "https://client.example.com/webhook",
  "token": "secret-token",
  "authentication": {
    "type": "JWT",
    "signingKey": "..."
  }
}

特点: - 支持长时间离线场景 - 适合异步、分布式任务 - Push 通知支持加密签名、防重放攻击

ACP: SessionUpdate (JSON-RPC Notification)

{"jsonrpc":"2.0","method":"session/update","params":{"type":"plan","plan":{...}}}\n
{"jsonrpc":"2.0","method":"session/update","params":{"type":"agent_message_chunk","text":"Let me"}}\n
{"jsonrpc":"2.0","method":"session/update","params":{"type":"tool_call","toolCall":{...}}}\n
{"jsonrpc":"2.0","method":"session/update","params":{"type":"tool_call_update","toolCallId":"call-1","status":"completed"}}\n

SessionUpdate 类型 (10+ 种): - plan — 执行计划 - agent_message_chunk — Agent 消息流 - agent_thought_chunk — Agent 内部思考 - tool_call — 新工具调用 - tool_call_update — 工具进度更新 - current_mode_update — 模式切换 - config_option_update — 配置变更 - available_commands_update — 可用命令

特点: - 实时、细粒度更新 - 暴露 Agent 思考过程 (agent_thought_chunk) - 支持 Diff 展示 (ToolCallContent.diff)


五、安全与认证

A2A — 企业级安全

支持的认证方式:

  1. OAuth2 protobuf message OAuth2SecurityScheme { repeated string flows = 2; // authorization_code, client_credentials, device_code string metadata_url = 3; // RFC 8414 bool pkce_required = 4; }

  2. OpenID Connect protobuf message OpenIDConnectSecurityScheme { string discovery_url = 2; }

  3. API Key protobuf message APIKeySecurityScheme { string location = 2; // query, header, cookie string name = 3; }

  4. HTTP Auth protobuf message HTTPAuthSecurityScheme { string scheme = 2; // Bearer, Basic string bearer_format = 3; }

  5. Mutual TLS (mTLS)

认证流程:

1. Client 获取 AgentCard (/.well-known/agent-card.json)
2. 解析 security_schemes 和 security_requirements
3. Out-of-band 获取凭证 (OAuth 流程、API Key 分发等)
4. HTTP Header 传输: Authorization: Bearer <TOKEN>
5. Server 验证每个请求

企业安全特性: - TLS 1.2+ 强制 (生产环境) - 审计日志 (Audit Logging) - 数据合规 (GDPR, CCPA, HIPAA) - 分布式追踪 (OpenTelemetry) - Push 通知安全 (JWT 签名、HMAC、防重放)

ACP — 简化认证

{
  "authMethods": [
    {
      "id": "github-oauth",
      "name": "GitHub OAuth",
      "description": "Authenticate via GitHub"
    }
  ]
}

认证流程:

1. Agent 在 initialize 响应中声明 authMethods
2. Client 调用 authenticate(methodId)
3. 完成认证

权限模型:

{
  "method": "session/request_permission",
  "params": {
    "permission": {
      "type": "fs_write",
      "path": "/absolute/path/to/file.txt"
    }
  }
}

安全约束: - 文件路径必须为绝对路径 - Client 完全控制资源访问 - 操作级权限请求

关键差异: A2A 面向零信任网络环境,需要完整的企业级安全;ACP 在可信本地环境中运行,侧重操作级权限控制。


六、能力协商 (Capability Negotiation)

A2A — 单向声明

message AgentCapabilities {
  bool streaming = 1;
  bool push_notifications = 2;
  repeated string extensions = 3;
}
  • Agent 在 AgentCard 中静态声明能力
  • Client 读取并适配
  • 无双向协商过程

ACP — 双向协商 (类似 LSP)

Client 发送:

{
  "method": "initialize",
  "params": {
    "protocolVersion": "1.0",
    "clientCapabilities": {
      "fs": {
        "readTextFile": true,
        "writeTextFile": true
      },
      "terminal": true
    }
  }
}

Agent 响应:

{
  "result": {
    "protocolVersion": "1.0",
    "agentCapabilities": {
      "loadSession": true,
      "promptCapabilities": {
        "image": true,
        "audio": false,
        "embeddedContext": true
      },
      "mcpCapabilities": {
        "http": true,
        "sse": true
      }
    }
  }
}

优势: - 版本协商 (避免不兼容) - 双方都知道对方能力 - 动态特性启用/禁用


七、扩展性机制

A2A

扩展标识: URI

message AgentCapabilities {
  repeated string extensions = 3;  // e.g., "https://example.com/a2a/extensions/voice"
}

激活扩展:

A2A-Extensions: https://example.com/a2a/extensions/voice, https://example.com/a2a/extensions/vision

扩展类型: - Data-only: 新增 metadata 字段 - Profile: 预定义能力组合 - RPC: 新增 RPC 方法 - State Machine: 新增 Task 状态

ACP

自定义方法: _ 前缀

{
  "method": "_custom/my_feature",
  "params": {...}
}

元数据: _meta 字段

{
  "sessionId": "session-123",
  "_meta": {
    "customField": "value"
  }
}

MCP 集成: 原生支持

{
  "mcpServers": {
    "server1": {
      "type": "stdio",
      "command": "node",
      "args": ["server.js"]
    }
  }
}

八、独有特性对比

仅 A2A 支持

特性 说明
Agent 发现 /.well-known/agent-card.json 标准
Artifact 命名的结构化输出物
Push Notification Webhook 推送 (离线场景)
多租户支持 /{tenant}/... 路径参数
AgentCard 签名 可信 Agent 验证
gRPC 原生支持 完整 gRPC 服务定义
AgentSkill 带 examples 和 tags 的技能声明
任务引用 reference_task_ids 实现任务链
企业级安全 OAuth2, OIDC, mTLS, 审计日志

仅 ACP 支持

特性 说明
文件系统操作 fs/read_text_file, fs/write_text_file
终端集成 terminal/execute, 实时输出
Agent Plan 多步执行计划展示
Session Modes ask / architect / code 等模式
Session Config 动态配置选项
权限请求 session/request_permission 细粒度授权
Agent Thought 内部思考过程暴露
Diff 展示 ToolCallContent.diff 代码变更对比
MCP 集成 原生支持 MCP Server (stdio/HTTP/SSE)
Session 持久化 session/load, session/resume

九、适用场景对比

A2A 适用场景

多 Agent 编排

研究 Agent → 数据收集 Agent → 分析 Agent → 报告生成 Agent

跨平台 Agent 协作

Slack Agent ← → Jira Agent ← → GitHub Agent

企业级 Agent 网络

                 认证网关
                    ↓
        ┌──────────┼──────────┐
        ↓          ↓          ↓
    HR Agent   IT Agent   财务 Agent

Agent Marketplace

开发者发布 Agent → AgentCard 注册 → 用户发现和调用

长时间异步任务

Client 提交任务 → 断开连接 → Agent 处理 (数小时) → Webhook 通知完成

ACP 适用场景

IDE 内 AI 编码助手

VS Code / Cursor / JetBrains + AI Agent (本地或远程)

代码生成/重构

用户: "将这个函数重构为 async/await"
Agent: [tool_call: read] → [tool_call: edit] → [展示 diff]

多模态代码理解

用户: [上传截图] "实现这个 UI"
Agent: [image 能力] → 生成代码

交互式调试

Agent: [terminal/execute: pytest]
Agent: [tool_call: edit 修复 bug]
Agent: [terminal/execute: pytest] ✅

Session 持久化

早上: 开始重构任务 (session-1)
下午: 切换到 bug 修复 (session-2)
第二天: 恢复重构任务 (session/load: session-1)

十、协同使用示例

A2A 和 ACP 不是竞争关系,而是互补关系。以下是协同使用场景:

场景: 企业级 AI 开发平台

┌─────────────────────────────────────────────────────┐
│                   VS Code (IDE)                     │
│  ┌───────────────────────────────────────────────┐  │
│  │   ACP Client                                  │  │
│  │      ↕ (stdio)                                │  │
│  │   Local Coding Agent (ACP Agent)              │  │
│  │      ↓                                        │  │
│  │   [需要调用远程 Agent]                         │  │
│  │      ↓                                        │  │
│  │   A2A Client (内嵌)                           │  │
│  └───────┼──────────────────────────────────────┘  │
│          │                                          │
└──────────┼──────────────────────────────────────────┘
           │ (HTTPS + JSON-RPC)
           ↓
┌──────────────────────────────────────────────────────┐
│              企业 Agent 网关 (A2A)                    │
│  ┌────────────┐  ┌────────────┐  ┌────────────┐     │
│  │ Code Review│  │ Security   │  │ Test Gen   │     │
│  │   Agent    │  │   Agent    │  │   Agent    │     │
│  └────────────┘  └────────────┘  └────────────┘     │
└──────────────────────────────────────────────────────┘

流程: 1. 开发者在 VS Code 中发起请求 2. ACP: IDE → Local Coding Agent 3. Coding Agent 判断需要调用远程 Security Agent 4. A2A: Coding Agent → 企业 Agent 网关 → Security Agent 5. A2A: Security Agent 返回分析结果 6. ACP: Coding Agent → IDE (展示结果和 tool_calls)


十一、设计哲学差异

维度 A2A ACP
透明度 不透明 (Opaque) — Agent 内部是黑盒 透明 (Transparent) — Agent 每步可见
信任模型 零信任 — 跨组织网络通信 可信环境 — 本地进程或受控网络
控制权 Agent 主导 — 自主决策和执行 Client 主导 — IDE 控制每步操作
协议复杂度 中等 (聚焦消息和任务) 高 (深度集成 IDE 功能)
版本演进 Protobuf 向后兼容 JSON Schema + 版本协商
可观测性 Task 状态 + Artifact 完整 tool_call trace

十二、总结

关键要点

  1. 不同的问题域
  2. A2A 解决: "Agent 如何与其他 Agent 通信"
  3. ACP 解决: "IDE 如何驱动一个 AI Agent"

  4. 互补而非竞争

  5. 一个完整的 AI 开发环境可以同时使用两者
  6. A2A 管 Agent 间通信,ACP 管 Agent 与 IDE 通信

  7. 设计权衡

  8. A2A: 标准化、互操作性、企业级安全
  9. ACP: IDE 深度集成、细粒度控制、实时反馈

选型建议

选择 A2A 当: - 需要跨组织 Agent 协作 - 构建 Agent Marketplace - 处理长时间异步任务 - 需要企业级安全和审计

选择 ACP 当: - 构建 IDE 内 AI 编码助手 - 需要展示 Agent 每步操作 - 需要用户权限审批 - 需要 Session 持久化和模式切换

同时使用当: - 构建企业级 AI 开发平台 - IDE 内 Agent 需要调用远程专业 Agent - 需要本地快速反馈 + 云端强大能力


附录: 快速对照表

特性 A2A ACP
Schema Protobuf JSON Schema
传输 HTTP(S)/gRPC stdio
网络模型 分布式 本地进程
服务发现
工具调用 ❌ (不透明) ✅ (一等公民)
文件操作
终端集成
权限请求
Session 持久化
Artifact
Push Notification
OAuth2/OIDC
mTLS
Agent Plan
Diff 展示
MCP 集成
多租户
gRPC

文档版本: 1.0
最后更新: 2026-02-09
贡献: 欢迎通过 PR 补充和修正


或许您还需要下面的文章:

关于我

Github: @phodal     微博:@phodal     知乎:@phodal    

微信公众号(Phodal)

围观我的Github Idea墙, 也许,你会遇到心仪的项目

QQ技术交流群: 321689806