第15章:智能体间通信(A2A)
个体AI智能体在解决复杂、多面的问题时往往面临限制,即便它们具备高级能力。为了克服这一限制,智能体间通信(A2A)使得不同框架构建的多样化AI智能体能够有效协作。这种协作包括无缝协调、任务委派和信息交换。
谷歌的A2A协议是一个开放标准,旨在促进这种通用通信。本章将探讨A2A、其实际应用以及在谷歌ADK中的实现。
智能体间通信模式概述
智能体2智能体(A2A)协议是一个开放标准,旨在实现不同AI智能体框架之间的通信和协作。它确保了互操作性,使得使用LangGraph、CrewAI或Google ADK等技术开发的AI智能体,无论其来源或框架差异,都能协同工作。
A2A得到了包括Atlassian、Box、LangChain、MongoDB、Salesforce、SAP和ServiceNow在内的多家技术公司和服务提供商的支持。微软计划将A2A集成到Azure AI Foundry和Copilot Studio中,展现了其对开放协议的承诺。此外,Auth0和SAP正在将A2A支持集成到他们的平台和智能体中。
作为一个开源协议,A2A欢迎社区贡献以促进其发展和广泛应用。
A2A核心概念
A2A协议提供了一种基于多个核心概念的智能体交互的规范化方法。对这些概念有深入理解对于开发或集成符合A2A规范的系统的人来说至关重要。A2A的基础支柱包括核心参与者、智能体卡片、智能体发现、通信和任务、交互机制以及安全,这些内容都将进行详细审查。
核心智能体: A2A涉及三个主要实体:
- 用户:发起对智能体协助的请求。
- A2A 客户端(客户端智能体):一个代表用户请求操作或信息的应用程序或人工智能智能体。
- A2A 服务器(远程智能体):一个提供 HTTP 端点以处理客户端请求并返回结果的 AI 智能体或系统。远程智能体作为一个“不透明”的系统运行,意味着客户端不需要了解其内部操作细节。
智能体卡片:智能体的数字身份由其智能体卡片定义,通常是一个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"
]
}
]
}
智能体发现: 这允许客户端查找描述可用A2A服务器功能的智能体卡片。为此过程存在几种策略:
- 已知的URI:智能体在其标准路径(例如,/.well-known/agent.json)上托管其智能体卡片。这种方法为公共或特定域的使用提供了广泛且通常自动化的可访问性。
- 精选注册库:这些提供了一个集中式目录,其中发布了智能体卡片,可以根据特定标准进行查询。这对于需要集中管理和访问控制的企业环境非常适用。
- 直接配置:智能体卡片信息嵌入或私密共享。此方法适用于紧密耦合或私密系统,其中动态发现不是关键。
无论选择哪种方法,确保智能体卡片端点安全都是非常重要的。这可以通过访问控制、相互TLS(mTLS)或网络限制来实现,尤其是如果卡片包含敏感(尽管不是机密)信息时。
通信与任务: 在A2A框架中,通信围绕异步任务进行组织,这些任务代表了长时间运行过程的基本工作单元。每个任务都被分配一个唯一的标识符,并经历一系列状态——如已提交、正在处理或已完成——这种设计支持复杂操作中的并行处理。智能体之间的通信通过消息进行。
本通信包含属性,这些属性是描述消息(如其优先级或创建时间)的关键值元数据,以及一个或多个部分,这些部分承载实际要传递的内容,例如纯文本、文件或结构化JSON数据。智能体在任务期间生成的可感知输出称为工件。与消息一样,工件也由一个或多个部分组成,并且可以在结果可用时增量式地流式传输。A2A框架内的所有通信都通过HTTP(S)使用JSON-RPC 2.0协议进行负载传输。为了在多次交互中保持连续性,使用服务器生成的contextId来分组相关任务并保留上下文。
交互机制:请求/响应(轮询)服务器端发送事件(SSE)。A2A提供多种交互方法,以满足各种人工智能应用需求,每种方法都有独特的机制:
- 同步请求/响应:适用于快速、立即的操作。在此模型中,客户端发送一个请求,并主动等待服务器处理该请求并返回一个完整的响应,在整个过程中只进行一次同步交换。
- 异步轮询:适用于处理时间较长的任务。客户端发送请求,服务器立即以“正在处理”状态和任务ID进行确认。然后客户端可以自由执行其他操作,并通过发送新的请求定期轮询服务器,以检查任务状态,直到任务被标记为“完成”或“失败”。
- 流式更新(服务器端事件 - SSE):适用于接收实时、增量结果。此方法从服务器到客户端建立了一个持久的单向连接。它允许远程智能体持续推送更新,例如状态变化或部分结果,而无需客户端进行多次请求。
- 推送通知(Webhooks):适用于长时间运行或资源密集型任务,在这种情况下,保持持续连接或频繁轮询是不高效的。客户端可以注册一个Webhook URL,当任务状态发生显著变化时(例如,任务完成时),服务器将异步通知(即“推送”)发送到该URL。
智能体卡片指定了智能体是否支持流式传输或推送通知功能。此外,A2A(Agent to Agent)是模态无关的,这意味着它不仅能够促进这些交互模式用于文本,还能用于其他数据类型,如音频和视频,从而实现丰富的多模态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)是系统架构中的一个关键组成部分,它使得智能体之间能够安全、无缝地交换数据。通过内置的多种机制,它确保了系统的健壮性和完整性。
-
互信传输层安全(TLS):通过建立加密和认证的连接,防止未授权访问和数据拦截,确保安全通信。
-
全面审计日志:所有智能体间的通信都被细致地记录,详细记录信息流、涉及的智能体和操作。这一审计轨迹对于责任追究、故障排除和安全分析至关重要。
-
智能体卡片声明:认证要求在智能体卡片中明确声明,该卡片是一种配置工件,概述了智能体的身份、能力和安全策略。这集中并简化了认证管理。
-
凭证处理:智能体通常使用安全的凭证,如OAuth 2.0令牌或API密钥,通过HTTP头部进行认证。这种方法可以防止凭证在URL或消息体中暴露,从而增强整体安全性。
A2A 与 MCP 对比
A2A是一种协议,它补充了Anthropic的模型上下文协议(MCP)(见图1)。虽然MCP侧重于为智能体及其与外部数据和工具的交互构建上下文,但A2A促进了智能体之间的协调和通信,使得任务委派和协作成为可能。

图1:A2A协议与MCP协议对比
A2A的目标是提高效率、降低集成成本,并在复杂、多智能体AI系统的开发中促进创新和互操作性。因此,深入理解A2A的核心组件和操作方法对于其有效设计、实施以及在构建协作和互操作的AI智能体系统中应用至关重要。
实际应用与用例
智能体之间的通信对于构建跨多个领域的复杂AI解决方案至关重要,它实现了模块化、可扩展性和增强智能。
- 多框架协作: A2A 的主要用例是使独立的 AI 智能体(无论其底层框架是 ADK、LangChain、CrewAI 等)能够进行通信和协作。这对于构建复杂的多元智能体系统至关重要,在该系统中,不同的智能体专门处理问题的不同方面。
- 自动化工作流程编排:在企业环境中,A2A可以通过使智能体能够委派和协调任务来简化复杂的工作流程。例如,一个智能体可能负责初步数据收集,然后委派给另一个智能体进行分析,最后委派给第三个智能体进行报告生成,所有这些通信都通过A2A协议进行。
- 动态信息检索: 智能体之间可以相互通信以检索和交换实时信息。主智能体可能会请求从专门的“数据抓取智能体”获取实时市场数据,然后该智能体使用外部API收集信息并将其发送回来。
动手代码示例
让我们来探讨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:
"""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的日历工具,使其能够与日历API交互并响应用户关于日历状态或修改的查询。智能体的说明会动态地融入当前日期以提供时间上下文。为了说明智能体的构建过程,让我们来分析GitHub上A2A示例中calendar_agent的一个关键部分。
以下代码展示了如何定义智能体及其特定的指令和工具。请注意,此处仅展示了解释此功能所需的代码;您可以通过此处访问完整文件:calendar_agent/main.py
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配置以进行身份验证。智能体的功能,包括“检查可用性”技能,在AgentCard中定义,同时也指定了智能体的网络地址。随后,创建了一个ADK智能体,配置了内存中的服务来管理工件、会话和内存。代码接着初始化了一个Starlette Web应用,集成了身份验证回调和A2A协议处理程序,并使用Uvicorn执行它,通过HTTP公开智能体。
以下示例说明了构建符合A2A规范的智能体的过程,从定义其功能到将其作为网络服务运行。通过使用智能体卡片和ADK(应用程序开发工具包),开发者可以创建可互操作的AI智能体,使其能够与谷歌日历等工具集成。这种实用方法展示了A2A在建立多智能体生态系统中的应用。
建议通过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智能体间通信模式
关键要点
关键要点:
谷歌A2A协议是一个开放、基于HTTP的标准,它促进了使用不同框架构建的智能体之间的通信和协作。
智能体卡片(AgentCard)作为智能体的数字标识符,允许其他智能体自动发现和理解其功能。
A2A提供了同步请求-响应交互(使用tasks/send)和流式更新(使用tasks/sendSubscribe),以满足不同的通信需求。
该协议支持多轮对话,包括一个input-required状态,允许智能体请求额外信息并在交互过程中保持上下文。
A2A鼓励采用模块化架构,其中专业智能体可以在不同的端口上独立运行,从而实现系统的可扩展性和分布式部署。工具如Trickle AI有助于可视化并跟踪A2A通信,这有助于开发者监控、调试和优化多智能体系统。
尽管A2A是一种用于管理不同智能体之间任务和工作流程的高级协议,但模型上下文协议(MCP)为大型语言模型(LLM)与外部资源交互提供了一个标准化的接口。
结论
智能体间通信(A2A)协议建立了一个至关重要的开放标准,以克服单个AI智能体固有的孤立性。通过提供一个基于HTTP的通用框架,它确保了不同平台(如Google ADK、LangGraph或CrewAI)构建的智能体之间能够实现无缝协作和互操作性。核心组件是智能体卡片,它作为数字身份,明确定义了智能体的能力,并允许其他智能体动态发现。该协议的灵活性支持各种交互模式,包括同步请求、异步轮询和实时流,满足广泛的应用需求。
这使创建模块化和可扩展的架构成为可能,其中专门的智能体可以组合起来协调复杂的自动化工作流程。安全性是一个基本方面,内置了如mTLS和明确的身份验证要求等机制来保护通信。虽然补充了其他标准如MCP,但A2A的独特焦点在于智能体之间的高层次协调和任务委派。来自主要技术公司的强力支持以及实际实现的可用性凸显了其日益增长的重要性。该协议为开发者构建更复杂、分布式和智能的多智能体系统铺平了道路。最终,A2A是培养创新和互操作协作AI生态系统的基石。