打破孤岛:Google A2A 协议——构建下一代多智能体协作系统的基石

在 AI 智能体(AI Agents)飞速发展的今天,我们拥有了基于 LangGraph、CrewAI、Google ADK 等不同框架构建的强大智能体。然而,这些“超级大脑”往往各自为战,形成了新的技术孤岛。如何让基于不同技术栈的智能体像人类团队一样无缝协作?Google 推出的 Agent-to-Agent (A2A) 协议正是为了解决这一核心难题。本文将深入剖析 A2A 的核心概念、通信模式、安全机制,并通过实战代码展示如何构建一个可互操作的日历助手。


1. 引言:从“单兵作战”到“团队协同”

单个 AI 智能体,无论其底层模型(LLM)多么强大,在面对复杂、多维度的企业级任务时,往往显得力不从心。

试想一个场景:你需要规划一次商务差旅。这不仅涉及日程查询,还涉及机票预订酒店比价费用审批以及向团队发送通知

  • 如果使用单个智能体,它需要集成所有这些外部工具,导致上下文臃肿、维护困难。
  • 如果使用多个智能体,可能会出现这样的情况:HR 的审批智能体是用 LangChain 写的,差旅预订智能体是用 CrewAI 写的,而日程管理是 Google ADK 构建的。它们之间语言不通,无法直接交互。

Google A2A (Inter-Agent Communication) 协议的出现,就是为了统一这种“通天塔”般的混乱。作为一个开放标准,A2A 允许不同框架、不同来源的智能体通过标准化的 HTTP 协议进行发现、通信和任务委派,从而构建出模块化、可扩展的多智能体系统 (Multi-Agent Systems, MAS)

目前,包括 Microsoft、Salesforce、SAP、Atlassian 在内的科技巨头均已支持或计划集成 A2A,这预示着它极有可能成为未来 AI 互联的事实标准。


2. A2A 核心架构解析

要理解 A2A,首先需要理解支撑其运行的四大支柱:核心参与者智能体卡片发现机制以及通信模式

2.1 核心参与者 (Core Actors)

在 A2A 的世界里,角色定义非常清晰:

  1. 用户 (User):任务的发起者,人类或自动化触发器。
  2. A2A 客户端 (Client Agent):请求方。它代表用户向其他智能体发出指令。它不需要知道服务端的具体实现细节,只关心接口。
  3. A2A 服务器 (Remote Agent):服务方。这是一个提供 HTTP 端点的智能体,接收请求、处理任务并返回结果(Artifacts)。

这种架构实现了 “不透明性” (Opacity)——客户端无需知道服务端是用 Python 还是 Go 写的,也无需知道它是调用了 Gemini 还是 GPT,只要遵循 A2A 协议即可。

2.2 智能体卡片 (Agent Card):智能体的“数字身份证”

如果两个陌生人要合作,首先要交换名片。在 A2A 中,智能体卡片 (Agent Card) 就是这张名片。它通常是一个 JSON 文件,定义了智能体的身份、地址、能力和接口规范。

一个标准的智能体卡片包含以下关键信息:

  • 基本信息:名称、描述、版本、API 端点 URL。
  • 能力 (Capabilities):是否支持流式传输 (Streaming)、推送通知 (Webhooks) 等。
  • 认证方式:例如 API Key 或 OAuth。
  • 技能 (Skills):这是最核心的部分。它详细列出了智能体能做什么(如 get_weather, book_flight),以及输入输出的格式。

示例:WeatherBot 的智能体卡片

{
  "name": "WeatherBot",
  "description": "提供精准的天气预报服务。",
  "url": "http://weather-service.example.com/a2a",
  "version": "1.0.0",
  "capabilities": {
    "streaming": true,  // 支持流式输出
    "pushNotifications": false
  },
  "authentication": {
    "schemes": ["apiKey"]
  },
  "skills": [
    {
      "id": "get_current_weather",
      "name": "获取当前天气",
      "description": "查询任何地点的实时天气。",
      "inputModes": ["text"],
      "outputModes": ["text"],
      "examples": ["巴黎现在的天气怎么样?"]
    }
  ]
}

2.3 智能体发现 (Agent Discovery)

客户端如何找到服务端的智能体卡片?A2A 定义了三种策略:

  1. Well-Known URI:这是最通用的方式。智能体将卡片信息托管在固定路径 /.well-known/agent.json 文件下,便于自动化扫描和发现。
  2. 托管注册中心 (Curated Registries):企业内部的“应用商店”,集中管理所有可用智能体,适合需要严格权限控制的场景。
  3. 直接配置:点对点私有连接,直接交换卡片信息。

3. 通信与交互模式:让协作更灵活

A2A 不仅仅是简单的“问答”,它基于任务 (Task) 的概念,支持多种复杂的业务流程。

所有通信均基于 HTTP(S) 并使用 JSON-RPC 2.0 作为载体。消息体包含 attributes (元数据) 和 parts (实际内容,支持文本、文件、结构化数据)。

A2A 提供了三种交互机制,以适应不同时效性的需求:

3.1 同步请求/响应 (Synchronous)

  • 场景:查汇率、查天气、简单计算。
  • 流程:客户端发送 sendTask -> 服务器处理 -> 服务器立即返回完整结果。
  • 特点:阻塞式,速度快,适合短任务。

3.2 异步轮询 (Asynchronous Polling)

  • 场景:生成高清图片、分析大型数据集。
  • 流程
  1. 客户端发送请求。
  2. 服务器返回“处理中”及 Task ID。
  3. 客户端定期询问:“好了吗?”
  4. 服务器最终返回“已完成”及结果。

3.3 流式更新 (Streaming / SSE)

  • 场景:LLM 文本生成、实时日志、股票行情。
  • 流程:使用 sendTaskSubscribe 方法。建立持久连接,服务器端主动推送(Server-Sent Events)增量数据。
  • 优势:用户体验极佳,无需等待整个任务完成即可看到部分结果。

3.4 推送通知 (Webhooks)

  • 场景:耗时极长的任务(如训练模型、审批流程)。
  • 机制:客户端注册一个 URL,当任务完成时,服务器主动向该 URL 发送回调。避免了客户端频繁轮询造成的资源浪费。

4. 关键辨析:A2A vs. MCP

在 AI 协议领域,Anthropic 提出的 MCP (Model Context Protocol) 同样备受关注。很多开发者容易混淆二者。
在这里插入图片描述

简单来说:MCP 负责“脑与手”的连接,A2A 负责“人与人”的协作。

  • MCP (Model Context Protocol)

  • 定位:连接 LLM 与数据源/工具。

  • 作用:让模型能读取本地文件、连接数据库、使用计算器。

  • 层级:底层,关注上下文构建。

  • A2A (Inter-Agent Communication)

  • 定位:连接智能体与智能体。

  • 作用:任务委派、工作流编排、多方协商。

  • 层级:高层,关注系统间的协作。

协同效应:一个理想的架构是,单个智能体内部使用 MCP 连接数据库和工具,而该智能体对外通过 A2A 协议与其他智能体协作。


5. 安全性:企业级应用的前提

开放意味着风险,A2A 在设计之初就将安全性置于核心位置:

  1. 双向 TLS (mTLS):不仅仅是服务器有证书,客户端也需要验证,确保通信双方身份可信,防止中间人攻击。
  2. 身份验证:智能体卡片中明确声明支持的 Auth 协议(如 OAuth 2.0, API Key)。凭证严格通过 HTTP Header 传递,绝不出现在 URL 或日志中。
  3. 审计日志:所有 A2A 交互都会生成标准化的审计痕迹,记录谁(哪个智能体)在什么时间做了什么操作,满足企业合规需求。

6. 实战演练:构建一个 Google 日历智能体

纸上得来终觉浅。下面我们使用 Python 和 Google ADK (Agent Development Kit) 来构建一个符合 A2A 标准的日历智能体。

场景描述

我们创建一个 Calendar Agent,它能够:

  1. 对外暴露 A2A 接口。
  2. 接收自然语言指令(如“明天上午我有空吗?”)。
  3. 内部调用 Google Calendar API 查询数据。
  4. 返回结果。

步骤 1: 定义核心逻辑 (ADK Agent)

首先,我们需要创建一个基于 LLM 的智能体,并赋予它操作日历的工具。

import os
import datetime
import asyncio
from google.adk.agents import LlmAgent
from google.adk.tools.google_api_tool import CalendarToolset

async def create_agent(client_id, client_secret) -> LlmAgent:
    """构建 ADK 智能体核心逻辑"""
    
    # 1. 初始化工具集:连接 Google Calendar API
    toolset = CalendarToolset(client_id=client_id, client_secret=client_secret)
    
    # 2. 实例化智能体
    return LlmAgent(
        model='gemini-2.5', # 使用 Gemini 模型
        name='calendar_agent',
        description="帮助用户管理日程的智能助手",
        # 3. 系统指令:注入时间上下文非常重要
        instruction=f"""
        你是一个专门管理用户日历的智能体。
        用户会询问日程安排或要求修改日历。
        请使用提供的工具与 Calendar API 交互。
        今天是 {datetime.datetime.now()}。
        请使用 RFC3339 格式的时间戳。
        """,
        tools=await toolset.get_tools(), # 挂载工具
    )

步骤 2: 定义智能体卡片与 A2A 服务

接下来,我们将这个核心逻辑包装成一个 Web 服务,并生成智能体卡片。

from uvicorn import run
from starlette.applications import Starlette
from starlette.routing import Route
from starlette.responses import PlainTextResponse
from google.adk.a2a import AgentCard, AgentSkill, AgentCapabilities, A2AStarletteApplication
# ... 引入其他必要依赖 (Runner, Executor 等)

def main(host: 'localhost', port: 8000):
   # 环境变量检查 (省略...)

   # 1. 定义技能:这是卡片中展示给其他智能体看的部分
   skill = AgentSkill(
       id='check_availability',
       name='检查空闲状态',
       description="通过 Google Calendar 检查用户在特定时间段是否有空",
       tags=['calendar', 'productivity'],
       examples=['明天上午10点到11点我有空吗?'],
   )

   # 2. 创建智能体卡片
   agent_card = AgentCard(
       name='Calendar Agent',
       description="管理用户日历的智能代理",
       url=f'http://{host}:{port}/', # 自身的访问地址
       version='1.0.0',
       defaultInputModes=['text'],
       defaultOutputModes=['text'],
       capabilities=AgentCapabilities(streaming=True), # 支持流式输出
       skills=[skill],
   )

   # 3. 初始化 ADK 智能体
   adk_agent = asyncio.run(create_agent(
       client_id=os.getenv('GOOGLE_CLIENT_ID'),
       client_secret=os.getenv('GOOGLE_CLIENT_SECRET'),
   ))

   # 4. 配置 A2A 执行器 (连接 HTTP 请求与 LLM 逻辑)
   runner = Runner(
       app_name=agent_card.name,
       agent=adk_agent,
       # 使用内存存储会话和上下文 (生产环境应使用数据库)
       artifact_service=InMemoryArtifactService(),
       session_service=InMemorySessionService(),
       memory_service=InMemoryMemoryService(),
   )
   agent_executor = ADKAgentExecutor(runner, agent_card)

   # 5. 设置 A2A 应用
   request_handler = DefaultRequestHandler(
       agent_executor=agent_executor, task_store=InMemoryTaskStore()
   )
   
   # A2AStarletteApplication 会自动处理 /.well-known/agent.json 和 /tasks 等路由
   a2a_app = A2AStarletteApplication(
       agent_card=agent_card, http_handler=request_handler
   )

   # 6. 启动 Web 服务器
   app = Starlette(routes=a2a_app.routes())
   print(f"Calendar Agent running at http://{host}:{port}")
   run(app, host=host, port=port)

if __name__ == '__main__':
   main()

代码解析

  1. AgentSkill: 清晰地告诉外界“我能做什么”。当另一个智能体想要“检查空闲时间”时,它会通过语义匹配找到这个 Skill。
  2. A2AStarletteApplication: Google ADK 提供的封装类,它自动处理了复杂的 JSON-RPC 协议解析、Task 状态管理和 SSE 流式传输,让开发者只需关注业务逻辑。
  3. InMemoryService: 示例中使用了内存存储,但在真实生产环境中,你需要将其替换为 Redis 或 Postgres 来持久化会话状态。

7. 实际应用场景展望

A2A 的价值不仅在于代码实现,更在于它能解锁的业务场景:

  1. 企业工作流编排 (Workflow Orchestration)
  • 主控智能体 (Router) 接收“入职新员工”指令。
  • 它通过 A2A 调用 HR 智能体 (CrewAI 框架) 录入信息。
  • 随后调用 IT 智能体 (LangGraph 框架) 开通账号。
  • 最后调用 采购智能体 (ADK 框架) 下单笔记本电脑。
  • 全过程自动流转,状态透明。
  1. 动态信息检索 (Dynamic Retrieval)
  • 一个负责写研报的智能体,发现数据缺失。
  • 它自动搜索注册中心,发现了一个 Bloomberg 数据智能体
  • 它动态发起 A2A 请求获取最新股价,然后继续完成研报。

8. 总结

Google A2A 协议不仅是一项技术标准,更是一种思维方式的转变——从构建全能的“巨型智能体”,转向构建专注、模块化、可协作的“智能体生态”

通过标准化的 智能体卡片 和灵活的 通信协议,A2A 解决了异构框架互通的难题,降低了集成成本。对于开发者而言,掌握 A2A 意味着你可以利用社区中最优秀的专用智能体来拼装你的应用,而不是从零开始重复造轮子。

随着 AI 应用逐渐深入企业核心业务,A2A 所倡导的互操作性、安全性和模块化,必将成为构建下一代智能系统的关键要素。


参考资料

1.Chen, B. (2025, April 22). How to Build Your First Google A2A Project: A Step-by-Step Tutorial. Trickle.so Blog. https://www.trickle.so/blog/how-to-build-google-a2a-project
2.Google A2A GitHub Repository. https://github.com/google-a2a/A2A
3.Google Agent Development Kit (ADK) https://google.github.io/adk-docs/
4.Getting Started with Agent-to-Agent (A2A) Protocol: https://codelabs.developers.google.com/intro-a2a-purchasing-concierge#0
5.Google Agent Discovery - https://a2a-protocol.org/latest/
6.Communication between different AI frameworks such as LangGraph, CrewAI, and Google ADK https://www.trickle.so/blog/how-to-build-google-a2a-project
7.Designing Collaborative Multi-Agent Systems with the A2A Protocol https://www.oreilly.com/radar/designing-collaborative-multi-agent-systems-with-the-a2a-protocol/
8.Antonio Gulli 《Agentic Design Patterns》

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐