即使具备先进能力,单个智能体在处理复杂且多方面的问题时常常面临局限。为克服这一点,智能体间通信(A2A)使得可能由不同框架构建的多样化智能体能够高效协作。此类协作涉及无缝的协调、任务分配与信息交换。
Google 的 A2A 协议是一项开放标准,旨在促进这种通用通信。本章将探讨 A2A、其实际应用,以及其在 Google ADK 中的实现。
概览
Agent2Agent(A2A)协议是一项开放标准,旨在实现不同智能体框架之间的通信与协作。它确保互操作性,使使用 LangGraph、CrewAI 或 Google ADK 等技术开发的智能体能够不受来源或框架差异影响而协同工作。
A2A 得到了多家技术公司与服务提供商的支持,包括 Atlassian、Box、LangChain、MongoDB、Salesforce、SAP 与 ServiceNow。Microsoft 计划在 Azure AI Foundry 与 Copilot Studio 中集成 A2A,表明其对开放协议的承诺。此外,Auth0 与 SAP 也在将 A2A 支持集成至其平台与智能体。
作为开源协议,A2A 欢迎社区贡献,以推动其演进与广泛采用。
A2A 的核心概念
A2A 协议为智能体交互提供了结构化的方法,建立在若干核心概念之上。对于任何开发或集成符合 A2A 的系统的人来说,深入理解这些概念至关重要。A2A 的基础支柱包括核心参与方、Agent Card、智能体发现、通信与任务、交互机制以及安全性,下面将逐一详述。
核心参与方: A2A 涉及三类主要实体:
- 用户:发起对智能体协助的请求。
- A2A 客户端(Client Agent):代表用户请求操作或信息的应用程序或智能体。
- A2A 服务器(Remote Agent):提供 HTTP 端点以处理客户端请求并返回结果的智能体或系统。远程智能体作为一个“黑箱”系统运行,这意味着客户端无需了解其内部运行细节。
Agent Card: 智能体的数字身份由其 Agent Card 定义,通常是一个 JSON 文件。该文件包含用于客户端交互和自动发现的关键信息,包括智能体的身份、端点 URL 和版本。它还详细说明了受支持的能力,如流式传输或推送通知、特定技能、默认输入/输出模式以及认证要求。下面是一个 WeatherBot 的 Agent Card 示例。
{
"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"]
}
]
}
智能体发现: 它允许客户端查找描述可用 A2A 服务器能力的 Agent Card。该过程有多种策略:
- Well-Known URI:智能体将其 Agent Card 托管在标准化路径(例如 /.well-known/agent.json)。这种方式为公共或特定域的使用提供广泛且通常是自动化的可访问性。
- Curated Registries:这些提供一个集中式目录,用于发布 Agent Card,并可基于特定条件进行查询。非常适合需要集中管理和访问控制的企业环境。
- Direct Configuration:Agent Card 信息被内嵌或私下共享。该方法适用于紧密耦合或私有系统,其中动态发现并非关键。
无论选择哪种方法,保护 Agent Card 端点都很重要。尤其当卡片包含敏感(虽然非机密)信息时,可以通过访问控制、双向 TLS(mTLS)或网络限制来实现安全防护。
通信与任务: 在 A2A 框架中,通信围绕异步任务构建,异步任务代表长时间运行流程的基本工作单元。每个任务都会分配一个唯一标识符,并在一系列状态之间流转——例如 submitted、working 或 completed——这种设计支持在复杂操作中进行并行处理。智能体之间的通信通过 Message 进行。
这种通信包含 attributes,它们是描述消息的键值对元数据(如优先级或创建时间);以及一个或多个 parts,它们携带实际传递的内容,如纯文本、文件或结构化 JSON 数据。智能体在任务期间生成的有形输出称为 artifacts。与消息类似,artifacts 也由一个或多个 parts 组成,并可在结果可用时以增量方式流式传输。A2A 框架内的所有通信均通过 HTTP(S) 进行,使用 JSON-RPC 2.0 协议作为负载格式。为在多次交互中保持连续性,使用服务器生成的 contextId 将相关任务分组并保留上下文。
交互机制: 请求/响应(轮询)、服务器发送事件(SSE)。A2A 提供多种交互方式以满足各种 AI 应用需求,每种方式都有其独特机制:
- 同步请求/响应:用于快速、即时的操作。在此模型中,客户端发送请求并主动等待服务器处理该请求,并在一次同步交换中返回完整响应。
- 异步轮询:适用于处理时间较长的任务。客户端发送请求后,服务器会立即以“处理中”状态及任务 ID 进行确认。随后客户端可自由执行其他操作,并通过定期向服务器发送新请求轮询任务状态,直到其被标记为“已完成”或“失败”。
- 流式更新(Server-Sent Events - SSE):适合接收实时的增量结果。该方式在服务器与客户端之间建立持久的单向连接,使远程智能体无需客户端多次发起请求即可持续推送更新,如状态变化或部分结果。
- 推送通知(Webhooks):用于超长时间运行或资源密集型任务,在这些场景下维持常连接或频繁轮询效率低。客户端可注册一个 webhook URL,当任务状态发生重大变化(例如完成)时,服务器会向该地址发送异步通知(“推送”)。
Agent Card 指定某个智能体是否支持流式或推送通知能力。此外,A2A 与模态无关,意味着它不仅可用于文本,也可用于音频、视频等其他数据类型,从而支持丰富的多模态 AI 应用。流式和推送通知能力均在 Agent Card 中进行了指定。
{
"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)是系统架构的重要组成部分,能够在智能体之间实现安全且无缝的数据交换。它通过多种内置机制确保系统的稳健性与完整性。
- 双向传输层安全(TLS):建立加密且经过认证的连接,防止未授权访问与数据截获,确保通信安全。
- 全面审计日志:所有智能体间通信都会被精细记录,包含信息流、相关智能体与动作细节。该审计追踪对问责、故障排查与安全分析至关重要。
- Agent Card 声明:在作为配置工件的 Agent Card 中明确声明认证要求,该卡片概述了智能体的身份、能力与安全策略,从而实现认证管理的集中化与简化。
- 凭证处理:智能体通常使用安全凭证(如 OAuth 2.0 令牌或 API 密钥)进行认证,并通过 HTTP 头部传递。此方式可避免在 URL 或消息体中暴露凭证,提升整体安全性。
A2A 与 MCP 的对比
A2A 是一个与 Anthropic 的 Model Context Protocol(MCP)互补的协议(见图 1)。MCP 侧重于为智能体及其与外部数据与工具的交互构建上下文结构,而 A2A 则促进智能体之间的协作与通信,实现任务委派与协同。
图 1:A2A 与 MCP 协议对比
A2A 的目标是提升效率、降低集成成本,并在复杂的多智能体 AI 系统开发中促进创新与互操作性。因此,深入理解 A2A 的核心组件与运行方式,对于在构建协作且可互操作的 AI 智能体系统时进行有效的设计、实现与应用至关重要。
实际应用与使用场景
智能体间通信对于在各个领域构建复杂 AI 解决方案不可或缺,它能带来模块化、可扩展性与增强的智能能力。
- 多框架协作: A2A 的主要用例是使独立的 AI 智能体——无论其底层框架(如 ADK、LangChain、CrewAI)为何——都能相互通信与协作。这是构建复杂多智能体系统的基础,不同智能体可各司其职,专注解决问题的不同方面。
- 自动化工作流编排: 在企业场景中,A2A 可通过让智能体委派与协同任务来促成复杂工作流。例如,一个智能体可负责初始数据收集,然后将任务委派给另一智能体进行分析,最后再交给第三个智能体生成报告,三者均通过 A2A 协议进行通信。
- 动态信息检索: 智能体之间可以通信以检索与交换实时信息。一个主智能体可能向专门的“数据获取智能体”请求实时市场数据,后者再使用外部 API 获取信息并返回。
实战代码示例(ADK)
让我们来考察 A2A 协议的实际应用。仓库 github.com/google-a2a/… 提供了 Java、Go 和 Python 的示例,展示了诸如 LangGraph、CrewAI、Azure AI Foundry 和 AG2 等多种智能体框架如何使用 A2A 进行通信。该仓库中的所有代码均以 Apache 2.0 许可证发布。为进一步阐明 A2A 的核心概念,我们将回顾一些代码片段,重点介绍如何使用基于 ADK 的智能体和 Google 认证工具来搭建 A2A 服务器。请参阅 github.com/google-a2a/…
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:
"""Constructs the ADK agent."""
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"""
You are an agent that can help manage a user's calendar.
Users will request information about the state of their calendar
or to make changes to their calendar. Use the provided tools for interacting with the calendar API.
If not specified, assume the calendar the user wants is the 'primary' calendar.
When using the Calendar API tools, use well-formed RFC3339 timestamps.
Today is {datetime.datetime.now()}.
""",
tools=await toolset.get_tools(),
)
这段 Python 代码定义了一个异步函数 create_agent,用于构建一个 ADK 的 LlmAgent。它首先使用提供的客户端凭据初始化 CalendarToolset,以访问 Google Calendar API。随后创建一个 LlmAgent 实例,配置指定的 Gemini 模型、描述性名称以及用于管理用户日历的说明。该智能体配备了来自 CalendarToolset 的日历工具,使其能够与 Calendar API 交互,并响应关于日历状态或修改的用户查询。智能体的说明会动态加入当前日期以提供时间语境。为了展示智能体的构建方式,我们来查看 A2A 样例仓库中 calendar_agent 的关键部分。
下面的代码展示了如何使用特定的说明与工具来定义该智能体。请注意,这里仅展示了解释此功能所需的代码;你可在此处访问完整文件:github.com/a2aproject/…
def main(host: str, port: int):
# Verify an API key is set.
# Not required if using Vertex AI APIs.
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 的“日历智能体”,用于通过 Google Calendar 检查用户可用性。其过程涉及验证 API 密钥或 Vertex AI 配置以进行身份验证。智能体的能力(包括 “check_availability” 技能)在 AgentCard 中定义,同时也指定了智能体的网络地址。随后创建一个 ADK 智能体,并配置了用于管理制品、会话与记忆的内存服务。代码接着初始化一个 Starlette Web 应用,加入身份验证回调和 A2A 协议处理器,并通过 Uvicorn 运行,以 HTTP 方式对外暴露该智能体。
这些示例展示了从定义能力到将其作为 Web 服务运行,构建符合 A2A 的智能体的过程。借助 Agent Card 与 ADK,开发者可以创建能够与 Google Calendar 等工具集成的可互操作 AI 智能体。这一务实路径展示了 A2A 在构建多智能体生态系统中的应用。
建议通过 www.trickle.so/blog/how-to… 上的代码演示进一步探索 A2A。该链接提供的资源包括 Python 和 JavaScript 的示例 A2A 客户端与服务器、多智能体 Web 应用、命令行界面,以及针对多种智能体框架的示例实现。
回顾
是什么(What)
单个 AI 智能体,尤其是基于不同框架构建的智能体,往往难以独立应对复杂的多面问题。主要挑战在于缺乏一种能够让它们高效通信与协作的通用语言或协议。这种孤立状态阻碍了由多个专长智能体联合其独特技能来完成更大任务的复杂系统的创建。若没有标准化方法,将这些异构智能体集成既昂贵又耗时,并且会妨碍更强大、更加统一的 AI 解决方案的发展。
为什么(Why)
Inter-Agent Communication(A2A)协议为该问题提供了开放、标准化的解决方案。它是一个基于 HTTP 的协议,能够实现互操作性,使不同的 AI 智能体无论底层技术如何,都能无缝协调、委派任务并共享信息。其核心组件是 Agent Card,这是一份数字身份文件,用于描述智能体的能力、技能与通信端点,便于发现与交互。A2A 定义了多种交互机制,包括同步与异步通信,以支持多样化的用例。通过为智能体协作创建通用标准,A2A 构建了一个用于搭建复杂、多智能体 Agentic 系统的模块化、可扩展生态。
经验法则(Rule of Thumb)
当你需要编排两个或更多 AI 智能体之间的协作时,尤其是它们采用不同框架(例如 Google ADK、LangGraph、CrewAI)构建时,使用此模式。它非常适合构建复杂、模块化的应用,由专门化智能体分别处理工作流的特定部分,例如将数据分析委派给一个智能体、将报告生成交给另一个智能体。当某个智能体需要动态发现并调用其他智能体的能力以完成任务时,此模式也至关重要。
图示摘要
关键点
- Google A2A 协议是一个开放的、基于 HTTP 的标准,便于使用不同框架构建的 AI 智能体之间进行通信与协作。
- AgentCard 作为智能体的数字标识,使其他智能体能够自动发现并理解其能力。
- A2A 同时提供同步的请求-响应交互(使用
tasks/send)和流式更新(使用tasks/sendSubscribe),以满足不同的通信需求。 - 该协议支持多轮对话,包括
input-required状态,使智能体能够请求补充信息并在交互过程中保持上下文。 - A2A 鼓励模块化架构,让专门化智能体可在不同端口独立运行,从而实现系统的可扩展与分布式。
- 诸如 Trickle AI 等工具有助于可视化和跟踪 A2A 通信,从而帮助开发者监控、调试并优化多智能体系统。
- 尽管 A2A 是用于管理不同智能体之间任务与工作流的高层协议,Model Context Protocol(MCP)则为 LLMs 提供了与外部资源对接的标准化接口。
总结
Inter-Agent Communication(A2A)协议建立了一个关键的开放标准,以克服单个 AI 智能体固有的孤立性。通过提供通用的基于 HTTP 的框架,它确保了在不同平台(如 Google ADK、LangGraph 或 CrewAI)上构建的智能体之间实现无缝协作与互操作。其核心组件是 Agent Card,作为数字身份,清晰定义智能体的能力,并支持其他智能体的动态发现。该协议的灵活性支持多种交互模式,包括同步请求、异步轮询与实时流式传输,以满足广泛的应用需求。
这使得创建模块化且可扩展的架构成为可能,其中专用智能体可以组合起来编排复杂的自动化工作流。安全性是一个基本方面,内置了诸如 mTLS 和显式身份验证要求等机制来保护通信。在补充 MCP 等其他标准的同时,A2A 的独特关注点在于智能体之间的高层协调和任务委派。来自大型科技公司的强力支持以及实用实现的可用性凸显了其日益增长的重要性。该协议为开发者构建更复杂、分布式且智能的多智能体系统铺平了道路。归根结底,A2A 是促进协作式 AI 创新与互操作生态系统的基石。
参考资料
- Chen, B. (2025, April 22). How to Build Your First Google A2A Project: A Step-by-Step Tutorial. Trickle.so Blog. www.trickle.so/blog/how-to…
- Google A2A GitHub Repository. github.com/google-a2a/…
- Google Agent Development Kit (ADK) google.github.io/adk-docs/
- Getting Started with Agent-to-Agent (A2A) Protocol: codelabs.developers.google.com/intro-a2a-p…
- Google AgentDiscovery - a2a-protocol.org/latest/
- Communication between different AI frameworks such as LangGraph, CrewAI, and Google ADK www.trickle.so/blog/how-to…
- Designing Collaborative Multi-Agent Systems with the A2A Protocol www.oreilly.com/radar/desig…