尽管单个 AI 智能体具备先进能力,但在处理复杂、多方面问题时仍然常常面临局限性。为了克服这一限制,智能体间通信(A2A)使得不同 AI 智能体(可能基于不同框架构建)能够进行有效协作。这种协作涉及无缝协调、任务委派和信息交换。
Google A2A 协议是一个旨在促进此类通用通信的开放标准。本章将探讨 A2A 的基本概念、实际应用以及在 Google ADK 中的具体实现。
Agent2Agent(A2A)协议是一个旨在实现不同 AI 智能体框架间通信与协作的开放标准。它确保了互操作性,允许使用 LangGraph、CrewAI 或 Google ADK 等技术开发的 AI 智能体协同工作,无论其来源或框架差异如何。
A2A 获得了众多技术公司和服务提供商的支持,包括 Atlassian、Box、LangChain、MongoDB、Salesforce、SAP 和 ServiceNow。Microsoft 计划将 A2A 集成到 Azure AI Foundry 和 Copilot Studio,这展示了其对开放协议的承诺。此外,Auth0 和 SAP 正在将 A2A 支持集成到其平台和智能体中。
作为开源协议,A2A 欢迎社区贡献,以促进其发展和广泛采用。
A2A 协议为智能体提供了结构化方法,建立在若干核心概念之上。深入理解这些概念对于任何开发或集成 A2A 兼容系统的开发者都至关重要。A2A 的基础支柱包括核心参与者、Agent 卡片、Agent 发现、通信和任务、交互机制及安全性,所有这些都将详细讨论。
核心参与者:A2A 涉及三个主要实体:
Agent 卡片:Agent 的数字身份由其智能体卡片定义,通常是 JSON 文件。此文件包含用于客户端交互和自动发现的关键信息,包括智能体身份、端点 URL 和版本。它还详细说明支持的功能(如流式传输或推送通知)、特定技能、默认输入/输出模式以及身份验证要求。以下是 WeatherBot 的智能体卡片示例:
{
"name": "WeatherBot",
"description": "Provides accurate weather forecasts and historical data.",
"url": "http://weather-service.example.com/a2a",
"version": "1.0.0",
"capabilities": {
"streaming": true,
"pushNotifications": false,
"stateTransitionHistory": true
},
"authentication": {
"schemes": [
"apiKey"
]
},
"defaultInputModes": [
"text"
],
"defaultOutputModes": [
"text"
],
"skills": [
{
"id": "get_current_weather",
"name": "Get Current Weather",
"description": "Retrieve real-time weather for any location.",
"inputModes": [
"text"
],
"outputModes": [
"text"
],
"examples": [
"What's the weather in Paris?",
"Current conditions in Tokyo"
],
"tags": [
"weather",
"current",
"real-time"
]
},
{
"id": "get_forecast",
"name": "Get Forecast",
"description": "Get 5-day weather predictions.",
"inputModes": [
"text"
],
"outputModes": [
"text"
],
"examples": [
"5-day forecast for New York",
"Will it rain in London this weekend?"
],
"tags": [
"weather",
"forecast",
"prediction"
]
}
]
}
Agent 发现:Agent 发现机制允许客户端找到描述可用 A2A 服务器能力的智能体卡片。此过程存在几种策略:
无论选择何种方法,保护智能体卡片端点都很重要。这可通过访问控制、双向 TLS(mTLS)或网络限制实现,特别是当卡片包含敏感(虽非秘密)信息时。
通信和任务:在 A2A 框架中,通信围绕异步任务结构化,这些任务代表长时间运行进程的基本工作单元。每个任务被分配唯一标识符,并通过一系列状态(如已提交、工作中或已完成)移动,此设计支持复杂操作中的并行处理。智能体间通信通过消息进行。
此通信包含属性(描述消息的键值元数据,如其优先级或创建时间)以及一个或多个部分(承载传递的实际内容,如纯文本、文件或结构化 JSON 数据)。Agent 在任务期间生成的有形输出称为工件。与消息类似,工件也由一个或多个部分组成,并可在结果可用时逐步流式传输。A2A 框架内所有通信都通过 HTTP(S) 进行,使用 JSON-RPC 2.0 协议作为有效载荷。为在多次交互中保持连续性,使用服务器生成的 contextId 来分组相关任务并保留上下文。
交互机制:A2A 提供多种交互方法以适应各种 AI 应用需求,每种方法都有独特机制:
Agent 卡片指定智能体是否支持流式传输或推送通知功能。此外,A2A 是模态无关的,意味着它不仅可以为文本促进这些交互模式,还可为音频和视频等其他数据类型促进,从而实现丰富的多模态 AI 应用。流式传输和推送通知功能均在智能体卡片中指定。
## 同步请求示例
{
"jsonrpc": "2.0",
"id": "1",
"method": "sendTask",
"params": {
"id": "task-001",
"sessionId": "session-001",
"message": {
"role": "user",
"parts": [
{
"type": "text",
"text": "What is the exchange rate from USD to EUR?"
}
]
},
"acceptedOutputModes": ["text/plain"],
"historyLength": 5
}
}
同步请求使用 sendTask 方法,其中客户端请求并期望对其查询的单个完整答案。相比之下,流式请求使用 sendTaskSubscribe 方法建立持久连接,允许智能体间发送多个增量更新或部分结果。
## 流式请求示例
{
"jsonrpc": "2.0",
"id": "2",
"method": "sendTaskSubscribe",
"params": {
"id": "task-002",
"sessionId": "session-001",
"message": {
"role": "user",
"parts": [
{
"type": "text",
"text": "What's the exchange rate for JPY to GBP today?"
}
]
},
"acceptedOutputModes": ["text/plain"],
"historyLength": 5
}
}
安全性:智能体间通信(A2A)是系统架构的关键组成部分,能够在智能体间实现安全、无缝的数据交换。它通过多个内置机制确保系统的稳健性和完整性。
A2A 是补充 Anthropic 模型上下文协议(MCP)的协议(见图 1)。MCP 专注于为智能体提供上下文及其与外部数据和工具的交互,而 A2A 则促进智能体间发现和通信,实现任务委派与协作。

图 1:A2A 和 MCP 协议比较
A2A 旨在提高效率、降低集成成本,并促进复杂多智能体系统开发中的创新和互操作性。因此,深入理解 A2A 的核心组件和操作方法对于在构建协作式、互操作的 AI 智能体系统时进行有效设计、实施和应用至关重要。
智能体间通信对于跨不同领域构建复杂 AI 解决方案不可或缺,实现了模块化、可扩展性和增强智能。
让我们检查 A2A 协议的实际应用。位于 https://github.com/google-a2a/a2a-samples/tree/main/samples 的仓库提供 Java、Go 和 Python 示例,说明各种智能体框架(如 LangGraph、CrewAI、Azure AI Foundry 和 AG2)如何使用 A2A 通信。此仓库中所有代码均在 Apache 2.0 许可证下发布。为进一步说明 A2A 核心概念,我们将审查代码摘录,重点是基于 ADK 的智能体和 Google 身份验证工具设置 A2A 服务器。查看 https://github.com/google-a2a/a2a-samples/blob/main/samples/python/agents/birthday_planner_adk/calendar_agent/adk_agent.py
import datetime
from google.adk.agents import LlmAgent # type: ignore[import-untyped]
from google.adk.tools.google_api_tool import CalendarToolset # type: ignore[import-untyped]
async def create_agent(client_id, client_secret) -> LlmAgent:
"""构造 ADK 智能体。"""
toolset = CalendarToolset(client_id=client_id, client_secret=client_secret)
return LlmAgent(
model='gemini-2.0-flash-001',
name='calendar_agent',
description="An agent that can help manage a user's calendar",
instruction=f"""
您是一个可以帮助管理用户日历的智能体。用户将请求有关其日历状态的信息或对其日历进行更改。
使用提供的工具与日历 API 交互。如果未指定,假定用户所需的日历是“primary”日历。
使用日历 API 工具时,请使用格式正确的 RFC3339 时间戳。今天是 {datetime.datetime.now()}。
""",
tools=await toolset.get_tools(),
)
此 Python 代码定义异步函数 create_agent,用于构造 ADK LlmAgent。它首先使用提供的客户端凭据初始化 CalendarToolset 以访问 Google Calendar API。随后创建 LlmAgent 实例,配置指定 Gemini 模型、描述性名称和管理用户日历的指令。智能体配备来自 CalendarToolset 的日历工具,使其能与 Calendar API 交互并响应有关日历状态或修改的用户查询。智能体指令动态合并当前日期以提供时间上下文。为说明如何构造智能体,让我们检查 GitHub 上 A2A 示例中 calendar_agent 的关键部分。
以下代码显示智能体使用其特定指令和工具定义。请注意,仅显示解释此功能所需代码;您可在此处访问完整文件:https://github.com/a2aproject/a2a-samples/blob/main/samples/python/agents/birthday_planner_adk/calendar_agent/main.py
def main(host: str, port: int):
# 验证是否设置了 API 密钥。
# 如果使用 Vertex AI API,则不需要。
if os.getenv('GOOGLE_GENAI_USE_VERTEXAI') != 'TRUE' and not os.getenv(
'GOOGLE_API_KEY'
):
raise ValueError(
'GOOGLE_API_KEY environment variable not set and '
'GOOGLE_GENAI_USE_VERTEXAI is not TRUE.'
)
skill = AgentSkill(
id='check_availability',
name='Check Availability',
description="Checks a user's availability for a time using their Google Calendar",
tags=['calendar'],
examples=['Am I free from 10am to 11am tomorrow?'],
)
agent_card = AgentCard(
name='Calendar Agent',
description="An agent that can manage a user's calendar",
url=f'http://{host}:{port}/',
version='1.0.0',
defaultInputModes=['text'],
defaultOutputModes=['text'],
capabilities=AgentCapabilities(streaming=True),
skills=[skill],
)
adk_agent = asyncio.run(create_agent(
client_id=os.getenv('GOOGLE_CLIENT_ID'),
client_secret=os.getenv('GOOGLE_CLIENT_SECRET'),
))
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)
async def handle_auth(request: Request) -> PlainTextResponse:
await agent_executor.on_auth_callback(
str(request.query_params.get('state')), str(request.url)
)
return PlainTextResponse('Authentication successful.')
request_handler = DefaultRequestHandler(
agent_executor=agent_executor, task_store=InMemoryTaskStore()
)
a2a_app = A2AStarletteApplication(
agent_card=agent_card, http_handler=request_handler
)
routes = a2a_app.routes()
routes.append(
Route(
path='/authenticate',
methods=['GET'],
endpoint=handle_auth,
)
)
app = Starlette(routes=routes)
uvicorn.run(app, host=host, port=port)
if __name__ == '__main__':
main()
此 Python 代码演示了设置符合 A2A 的“日历 Agent”,用于通过 Google Calendar 检查用户可用性。它涉及验证 API 密钥或 Vertex AI 配置以用于身份验证目的。智能体能力(包括“check_availability”技能)在 AgentCard 中定义,该卡片还指定智能体地址。随后创建 ADK 智能体,配置内存服务以管理工件、会话和内存。然后代码初始化 Starlette Web 应用程序,合并身份验证回调和 A2A 协议处理程序,并使用 Uvicorn 执行它以通过 HTTP 公开智能体。
这些示例说明了构建符合 A2A 的智能体的过程,从定义其能力到将其作为 Web 服务运行。通过利用智能体卡片和 ADK,开发人员可创建能与 Google Calendar 等工具集成的互操作 AI 智能体。此实用方法展示了 A2A 在建立多智能体生态系统的应用。
建议通过 https://www.trickle.so/blog/how-to-build-google-a2a-project 上的代码演示进一步探索 A2A。此链接提供的资源包括 Python 和 JavaScript 中的示例 A2A 客户端和服务器、多智能体 Web 应用程序、命令行界面以及各种智能体框架的示例实现。
问题背景: 单个 AI 智能体(特别是基于不同框架构建的智能体)在处理复杂、多方面问题时通常会遇到困难。主要挑战是缺乏允许它们有效通信协作的通用语言或协议。这种隔离阻止了创建复杂系统,其中多个专门智能体结合独特技能解决更大的任务。如果没有标准化方法,集成这些不同的智能体会非常耗时,并阻碍了更强大、更具凝聚力的 AI 解决方案的开发。
解决方案: 智能体间通信(A2A)协议为此问题提供了开放、标准化的解决方案。它是基于 HTTP 的协议,能够实现互操作性,允许不同 AI 智能体协调、委派任务和共享信息,无论其底层技术如何。核心组件是智能体卡片,它是描述智能体能力和通信端点的数字身份文件,促进了发现和交互。A2A 定义了各种交互机制,包括同步和异步通信,以支持不同的用例。通过为智能体协作创建标准,A2A 促进了构建复杂、多智能体系统的模块化和可扩展生态系统。
实践建议: 当您需要协调两个或多个 AI 智能体协作时使用此模式,特别是如果它们使用不同框架(如 Google ADK、LangGraph、CrewAI)构建。它非常适合构建复杂、模块化应用程序,其中专门智能体处理工作流的特定部分,例如将数据分析委派给一个智能体,将报告生成委派给另一个智能体。当智能体需要发现和使用其他智能体能力完成任务时,此模式也必不可少。
可视化摘要

图 2:A2A 智能体间通信模式
tasks/send)和流式更新(使用 tasks/sendSubscribe)以适应不同的通信需求。input-required 状态,允许智能体请求额外信息并在交互期间维护上下文。智能体间通信(A2A)协议建立了一个重要的开放标准,以克服单个 AI 智能体的固有隔离。通过提供通用的基于 HTTP 的框架,它确保了在不同平台上构建的智能体能够协作和互操作性,例如 Google ADK、LangGraph 或 CrewAI。核心组件是智能体卡片,它是智能体的数字身份,清楚定义了智能体的能力,使其他智能体能够动态发现和交互。其灵活性支持各种交互模式,包括同步请求、异步轮询和实时流式传输,满足广泛的应用需求。
这使得能够创建模块化和可扩展的架构,其中专门智能体组合以编排复杂的自动化工作流。安全性是基本方面,具有内置机制(如 mTLS 和明确身份验证要求)来保护通信。虽然补充了 MCP 等其他标准,但 A2A 的独特焦点是智能体间协调和任务委派。主要技术公司的强大支持以及实际实现的可用性突显了其日益增长的重要性。该协议为开发人员构建更复杂、分布式和智能的多智能体系统铺平了道路。最终,A2A 是促进创新和互操作的协作 AI 生态系统的基础支柱。