A2A 协议入门:智能体之间怎么对话

过去一年多,MCP(Model Context Protocol)基本统一了「Agent 接工具」的姿势:数据库、浏览器、内部 API,都可以封装成 MCP Server 挂给模型,本站此前的《从零写一个 MCP Server》《一篇读懂 Function Calling》讲的都是这条线。但 MCP 解决的是 Agent ↔ 工具;当两个 Agent 要对话时——比如一家厂商用 LangGraph 写的客服 Agent,要把任务转交给另一家厂商基于 CrewAI 的物流 Agent——双方互不知道对方存在,更不知道对方会什么,MCP 帮不上忙。补上这一环的,是 Agent2Agent 协议(A2A)。

为什么跨厂商 Agent 互操作需要一个开放协议

想象一下没有 A2A 的世界,Agent 之间协作只有三条路,都不好走:

  • 点对点集成:每对接一个外部 Agent 就写一套定制适配。N 家厂商互相对接,复杂度是 O(N²),而且每换一版内部实现就得重写适配层。
  • 把对方 Agent 包成工具:表面上看 Function Calling 就够了,但工具调用是「一次进、一次出」的同步函数语义,撑不起多轮协商、长时任务和人类介入——官方文档的原话是,把智能体包成工具会限制其能力,A2A 让智能体「以智能体的方式」协作,无需包装。
  • 交换内部实现:把提示词、记忆、工具清单开放给对方?商业上不可行。

所以 A2A 的设计目标有三条底线:跨异构框架(不管对方是 LangGraph、CrewAI 还是 Google ADK 写的);不透明执行(Opaque Execution,智能体不暴露内部逻辑、记忆与专有工具,只声明「我能做什么、干到哪一步」);运行时能力发现(不靠人事先牵线,Agent 自己能查到「网上存在一个能帮我订机票的 Agent」)。

沿革与现状:从 Google 项目到 Linux Foundation

时间线如下(关键日期均已对照一手来源):

  • 2025-04-09:Google 在 Cloud Next '25 发布 A2A,官方公告列出 50+ 合作伙伴,包括 Atlassian、Box、Cohere、Intuit、LangChain、MongoDB、PayPal、Salesforce、SAP、ServiceNow、UKG、Workday,以及 Accenture、BCG、麦肯锡等一众咨询集成商。
  • 2025-06:Google 把协议捐给 Linux Foundation,走中立开源治理;AWS、Cisco、Microsoft、Salesforce、SAP 等均表态参与。
  • 2025-07-30:规范 v0.3.0,能力发现地址从 agent.json 改为 agent-card.json,并加入 Agent Card 签名。
  • 2025-12-09:Linux Foundation 宣布成立 Agentic AI Foundation(AAIF),创始项目为 Anthropic 的 MCP、Block 的 goose 与 OpenAI 的 AGENTS.md(注意:A2A 此时并未入库)。
  • 2026-03-12:规范 v1.0.0 发布,这是一次大版本重构:应用层与传输映射分离、新增支持分页过滤的 tasks/list、统一推送配置结构、现代化 OAuth 2.0 流程(移除 implicit/password,加入 device code 与 PKCE)、gRPC 多租户。
  • 2026-05:补丁版 v1.0.1。
  • 2026-08:官方宣布 A2A 正式加入 AAIF,与 MCP 同门治理。

截至 2026-10-07,A2A 最新规范版本为 1.0(仓库最新发布 v1.0.1),由 Linux Foundation 旗下 AAIF 治理;GitHub 主仓库约 26k star,官方 SDK 覆盖 Python、Go、JavaScript、Java、.NET、Rust 六种语言。

核心概念:把规范读薄

Agent Card:智能体的「名片」

每个 A2A 服务端在约定地址 /.well-known/agent-card.json 暴露一份自描述 JSON,内容包括:名称、描述、版本、能力声明(capabilities:是否支持流式、推送通知、扩展)、安全方案(securitySchemes)与安全要求、默认输入/输出模态、skills 技能列表(每条含 id、name、description、tags、examples),以及 supportedInterfaces——声明支持哪种协议绑定和服务地址,第一条为首选。调用方拿到名片,就知道该往哪个地址、用什么方式、以什么身份发任务。v0.3.0 起还支持用 JWS 给卡片签名防篡改;另有「认证扩展卡」机制:公开名片之外,完成认证后可下发信息更全的第二张卡。

Task:带状态机的「工单」

A2A 的交互以 Task 为中心。客户端发消息后,服务端创建 Task 并在生命周期中流转状态:

submitted(已受理)
   └─> working(处理中)──> completed(完成,终态)
              │───────> failed(失败,终态)
              │───────> canceled(取消,终态)
              ├───────> input-required(中断:等调用方补充输入)
              ├───────> auth-required(中断:等认证)
              └───────> rejected(拒绝接单,终态)

两个细节值得注意:多轮对话靠 contextId 串联上下文;input-required 让 Agent 可以「干一半、问一句、再接着干」——这正是把工具调用的无状态函数语义撑不起来的长流程,做成了协议原生能力。

Message、Part 与 Artifact

  • Message:一次发言,role 为 user 或 agent,核心是 parts 数组,用 messageId 标识、可引用历史任务(referenceTaskIds)。
  • Part:内容的最小单元,四选一——text(文本)、raw(base64 字节)、url(链接)、data(任意 JSON 结构),携带 mediaType,所以协议天然不限于文本,图像、音频、结构化数据都能走。
  • Artifact:任务的产物,同样由 parts 组成,可以边干边流式产出(TaskArtifactUpdateEvent),一个任务可以产出多个。

流式与长任务:三种绑定 + SSE + 推送

传输上 A2A 分三层:最底层的消息原型用 Protocol Buffer 定义(规范的唯一来源),其上是与传输无关的抽象操作层,最下面是三种官方等价绑定——JSON-RPC 2.0、gRPC、HTTP+JSON/REST,内容类型为 application/a2a+json,客户端任选其一。

短任务用 message/send 一问一答;长任务用 message/stream 走 SSE(Server-Sent Events)持续接收状态与产物更新。如果双方根本无法保持长连接(移动端、离线批处理),A2A 提供 push notification:调用方给任务挂一个 webhook(PushNotificationConfig,含认证信息),服务端在状态变化时向 webhook POST 结果——语义是 at-least-once,客户端必须幂等处理并回 2xx;推送配置持续生效到任务完结。

一次典型的协作时序如下:

sequenceDiagram
    participant C as 客户端 Agent
    participant S as 远程 Agent
    C->>S: GET /.well-known/agent-card.json
    S-->>C: Agent Card(能力/接口/安全方案)
    C->>S: message/stream(新建 Task)
    S-->>C: Task 状态:working
    S-->>C: input-required(等补充出发日期)
    C->>S: message(同 contextId,补齐参数)
    S-->>C: TaskArtifactUpdateEvent(流式产物)
    S-->>C: Task 状态:completed
    Note over C,S: 长连接不可用时改走 webhook 推送

与 MCP 的关系:互补,不是竞争

官方的定位很直接:「MCP 连接智能体与工具、数据;A2A 跨越的是智能体之间的边界」。逐项对比:

维度 MCP A2A
解决的问题 Agent ↔ 工具 / 数据 / 资源 Agent ↔ Agent
对端形态 接口明确的工具函数、资源 不透明的对等智能体(黑盒)
交互粒度 单次工具调用,通常无状态 完整任务,可多轮、长时、可中断
状态模型 调用本身无状态 Task 有完整生命周期状态机
暴露程度 工具 schema 是显式契约 内部提示词、记忆、工具全部隐藏
典型信任边界 同一主体内,Agent 与自己的工具 跨组织、跨厂商的主体间协作

实践中两者常叠着用:A2A 负责把任务委派给另一个 Agent,接活的 Agent 内部照旧用 MCP 调自己的工具。选型上不必二选一——一个 Agent 完全可以同时是 MCP 客户端和 A2A 服务端。

最小示例:一张 Agent Card 长什么样

下面是按官方规范字段整理的最小 Agent Card(结构对应官方 Python 教程中的 AgentCard 定义):

{
  "name": "travel-planner",
  "description": "根据目的地、日期与预算规划行程,输出逐日安排",
  "version": "1.0.0",
  "supportedInterfaces": [
    {
      "protocolBinding": "JSONRPC",
      "url": "https://travel.example.com/a2a",
      "protocolVersion": "1.0"
    }
  ],
  "capabilities": {
    "streaming": true,
    "pushNotifications": true
  },
  "defaultInputModes": ["text/plain"],
  "defaultOutputModes": ["text/plain", "application/json"],
  "skills": [
    {
      "id": "plan_trip",
      "name": "行程规划",
      "description": "输入目的地、天数与预算,输出逐日行程 JSON",
      "tags": ["travel", "planning"],
      "examples": ["帮我规划东京五日游,预算一万五"]
    }
  ]
}

调用方的动作序列:拉取 /.well-known/agent-card.json → 校验能力与安全方案是否匹配 → 向首选接口发送 message/stream 新建任务 → 收到 input-required 时补充输入 → 持续接收 artifact 流 → 等到 completed 终态收取最终产物。整个过程里,调用方只知道「它会规划行程」,不知道也不需要知道它内部用了什么模型、什么工具——这就是不透明执行带来的解耦。

边界与冷思考

采用度:声势与落地之间有落差。 50+ 厂商站台、Linux Foundation 背书、六语言 SDK 都是真的;但 2026 年 3 月也有从业者(Credal)直言「好像没人在谈 A2A 了」,理由是它宣传的多数优势(状态管理、长任务、发现)可以绕 MCP 变通实现,而引入第二套协议带来的兼容矩阵与运维成本是实打实的。所谓「已在大量企业生产落地」的说法目前缺乏可交叉验证的统计,本文不予采信。截至 2026-10-07 更稳妥的判断是:标准与基础设施已就绪(v1.0 + 六语言 SDK),规模化跨厂商互操作案例仍处早期。

与 Function Calling 直连方案的取舍。 如果两端 Agent 都在自己系统内,直接 Function Calling 或内部 RPC 更省事——协议是给「跨组织、跨框架、互为黑盒」的场景准备的。反过来,一旦对方是外部主体,自研点对点集成的维护成本和安全暴露面就会反噬。所以选型的真正问题是「要不要标准化这条边界」,而不是「哪个方案更先进」。

生态还缺什么。 公网层面的大规模发现机制(谁来做可信的 Agent 目录)、跨主体身份与授权的成熟范式(卡片签名、认证扩展卡都刚起步)、以及协作背后的商务层(计费、SLA、责任界定)都还没有公认答案。v1.0 落地的版本协商(A2A-Version 头,版本号只到 Major.Minor)与卡片签名,正是朝「信任」方向补的第一批课。协议解决了「怎么对话」;「敢跟谁对话、怎么收费」还留给生态。

参考资料

  1. A2A Protocol 规范(v1.0)
  2. What is A2A? — 官方概念文档
  3. a2aproject/A2A — GitHub 仓库与 Releases
  4. Google Cloud Blog:Announcing the Agent2Agent Protocol (A2A),2025-04-09
  5. Linux Foundation:Agentic AI Foundation 成立公告,2025-12-09
  6. Credal:What happened to A2A Protocol?,2026-03
← 返回资讯列表

读者留言

COMMENTS 暂无
仅本站原创文章开放留言 · 请勿留下手机号、邮箱等个人信息

还没有留言,来说第一句?