第15章:智能体间通信 (A2A) Inter-Agent Communication (A2A)

单个 AI 智能体即使具备高级能力,在处理复杂多面的问题时往往会面临局限性。为了解决这一问题,智能体间通信 (A2A) 使得不同的 AI 智能体能够有效协作。这种协作涉及无缝的协调、任务分配以及信息交换。

Google 的 A2A 协议是一种开放标准,旨在促进这种通用通信。本章将探讨 A2A 的实际应用及其在 Google ADK 中的实现。

智能体间通信模式概述

Agent2Agent (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 客户端(客户端智能体):代表用户请求操作或信息的应用程序或 AI 智能体。
  • A2A 服务器(远程智能体):提供 HTTP 端点以处理客户端请求并返回结果的 AI 智能体或系统。远程智能体作为一个“黑箱”系统运行,意味着客户端无需了解其内部操作细节。

智能体卡片: 智能体的数字身份由其智能体卡片定义,通常为一个 JSON 文件。该文件包含与客户端交互和自动发现的关键信息,包括智能体的身份、端点 URL 和版本。它还详细说明了支持的功能,例如流式传输或推送通知、特定技能、默认输入/输出模式以及身份验证要求。以下是一个 WeatherBot 的智能体卡片示例。

{
  "name": "WeatherBot",
  "description": "提供准确的天气预报和历史数据。",
  "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": "获取当前天气",
      "description": "检索任意位置的实时天气信息。",
      "inputModes": [
        "text"
      ],
      "outputModes": [
        "text"
      ],
      "examples": [
        "巴黎的天气怎么样?",
        "东京的当前天气状况"
      ],
      "tags": [
        "天气",
        "当前",
        "实时"
      ]
    },
    {
      "id": "get_forecast",
      "name": "获取天气预报",
      "description": "获取未来5天的天气预测。",
      "inputModes": [
        "text"
      ],
      "outputModes": [
        "text"
      ],
      "examples": [
        "纽约未来5天的天气预报",
        "伦敦本周末会下雨吗?"
      ],
      "tags": [
        "天气",
        "预报",
        "预测"
      ]
    }
  ]
}

Agent发现

Agent发现允许客户端找到Agent卡片,这些卡片描述了可用的A2A服务器的能力。以下是几种实现方式:

  • 标准化URI:Agent将其Agent卡片托管在标准化路径(例如 /.well-known/agent.json)。这种方法适用于公共或特定领域的广泛、通常是自动化的访问。
  • 策划注册表:提供一个集中式目录,Agent卡片可以在其中发布,并根据特定条件进行查询。这种方法非常适合需要集中管理和访问控制的企业环境。
  • 直接配置:Agent卡片信息被嵌入或私下共享。这种方法适用于紧密耦合或私有系统,在这些系统中动态发现并不重要。

无论选择哪种方法,都需要确保Agent卡片端点的安全性。这可以通过访问控制、双向TLS(mTLS)或网络限制来实现,特别是在卡片包含敏感(但非机密)信息的情况下。

通信与任务

在A2A框架中,通信围绕异步任务进行组织,这些任务代表了长时间运行过程的基本工作单元。每个任务都会被分配一个唯一标识符,并经历一系列状态转换,例如提交、处理中或已完成。这种设计支持复杂操作中的并行处理。Agent之间的通信通过消息(Message)进行。

消息包含属性,这些属性是描述消息的键值元数据(例如优先级或创建时间),以及一个或多个部分,这些部分承载实际传递的内容,例如纯文本、文件或结构化的JSON数据。Agent在任务期间生成的具体输出被称为工件(artifacts)。与消息一样,工件也由一个或多个部分组成,并且可以在结果可用时逐步流式传输。在A2A框架中,所有通信均通过HTTP(S)进行,并使用JSON-RPC 2.0协议作为数据载体。为了在多次交互中保持连续性,使用服务器生成的contextId来分组相关任务并保持上下文。

交互机制

请求/响应(轮询)

服务器推送事件(SSE)

A2A提供了多种交互方法,以满足各种AI应用的需求,每种方法都有其独特的机制:

  • 同步请求/响应:适用于快速、即时的操作。在此模型中,客户端发送请求并主动等待服务器处理请求,在单次同步交互中返回完整的响应。
  • 异步轮询:适用于需要较长时间处理的任务。客户端发送请求后,服务器立即以“处理中”状态和任务 ID 进行确认。随后,客户端可以执行其他操作,并通过发送新的请求定期轮询服务器以检查任务状态,直到任务被标记为“完成”或“失败”。
  • 流式更新(服务器发送事件 - SSE):适用于接收实时、增量结果的场景。此方法建立从服务器到客户端的持久单向连接,允许远程智能体持续推送更新,例如状态变化或部分结果,而无需客户端多次发送请求。
  • 推送通知(Webhooks):专为运行时间较长或资源密集型任务设计,在这种情况下,保持持续连接或频繁轮询效率较低。客户端可以注册一个 webhook URL,当任务状态发生显著变化(例如完成时),服务器会向该 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": "美元兑欧元的汇率是多少?"
        }
      ]
    },
    "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": "今天日元兑英镑的汇率是多少?"
        }
      ]
    },
    "acceptedOutputModes": ["text/plain"],
    "historyLength": 5
  }
}

安全性

智能体间通信(A2A):智能体间通信(A2A)是系统架构的重要组成部分,能够在智能体之间实现安全且无缝的数据交换。通过多种内置机制确保系统的稳健性和完整性。

  • 双向传输层安全协议(TLS): 建立加密和认证连接,防止未经授权的访问和数据拦截,确保通信安全。
  • 全面的审计日志: 所有智能体间通信均被详细记录,包括信息流、相关智能体和操作。这些审计记录对于责任追踪、故障排查和安全分析至关重要。
  • Agent Card 声明: 认证要求在 Agent Card 中明确声明。Agent Card 是一个配置工件,用于描述智能体的身份、功能和安全策略,从而集中简化认证管理。

凭证处理

智能体通常使用安全凭证进行身份验证,例如通过 HTTP 头传递的 OAuth 2.0 令牌或 API 密钥。这种方法可以防止凭证暴露在 URL 或消息体中,从而增强整体安全性。

A2A 与 MCP

A2A 是一种协议,用于补充 Anthropic 的模型上下文协议(MCP)(见图 1)。MCP 侧重于为智能体及其与外部数据和工具的交互结构化上下文,而 A2A 则促进智能体之间的协调和通信,使任务委派和协作成为可能。

图 1:A2A 和 MCP 协议比较

图 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:
    """构建 ADK 智能体。"""
    toolset = CalendarToolset(client_id=client_id, client_secret=client_secret)
    return LlmAgent(
        model='gemini-2.0-flash-001',
        name='calendar_agent',
        description="一个可以帮助管理用户日历的智能体",
        instruction=f"""
你是一个可以帮助管理用户日历的智能体。
用户会请求有关其日历状态的信息或要求对其日历进行更改。
使用提供的工具与日历 API 交互。
如果未指定,请假设用户想要操作的是“主”日历。
在使用日历 API 工具时,请使用格式良好的 RFC3339 时间戳。
今天是 {datetime.datetime.now()}。
        """,
        tools=await toolset.get_tools(),
    )

此 Python 代码定义了一个异步函数 create_agent,用于构建 ADK 的 LlmAgent。它首先使用提供的客户端凭据初始化 CalendarToolset,以访问 Google Calendar API。随后,创建一个 LlmAgent 实例,并配置指定的 Gemini 模型、描述性名称以及用于管理用户日历的说明。智能体配备了来自 CalendarToolset 的日历工具,能够与 Calendar API 交互并响应用户关于日历状态或修改的查询。智能体的说明动态地结合了当前日期以提供时间上下文。以下代码展示了如何定义智能体及其具体说明和工具。请注意,仅展示了用于解释此功能的代码部分;完整文件可通过以下链接访问:https://github.com/a2aproject/a2a-samples/blob/main/samples/python/agents/birthdayplanneradk/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 环境变量,且 GOOGLE_GENAI_USE_VERTEXAI 不是 TRUE。'
        )

    skill = AgentSkill(
        id='check_availability',
        name='检查可用性',
        description="使用用户的 Google 日历检查用户在某个时间段的可用性",
        tags=['calendar'],
        examples=['我明天上午10点到11点有空吗?'],
    )

    agent_card = AgentCard(
        name='日历智能体',
        description="一个可以管理用户日历的智能体",
        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('认证成功。')

    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公开智能体。

这些示例展示了构建符合A2A协议的智能体的过程,从定义其功能到将其作为Web服务运行。通过使用Agent Card和ADK,开发者可以创建能够与Google Calendar等工具集成的互操作AI智能体。这种实用方法展示了A2A在建立多智能体生态系统中的应用。

建议通过代码演示进一步探索A2A协议:https://www.trickle.so/blog/how-to-build-google-a2a-project。该链接提供的资源包括Python和JavaScript中的A2A客户端和服务器示例、多智能体Web应用程序、命令行接口以及各种智能体框架的示例实现。


概览

定义(What)

单个AI智能体,尤其是基于不同框架构建的智能体,通常难以独自解决复杂的多方面问题。主要挑战在于缺乏一种通用语言或协议,使它们能够有效地沟通和协作。这种孤立状态阻碍了创建多个专业智能体结合其独特技能以解决更大任务的复杂系统。没有标准化的方法,集成这些不同的智能体代价高昂、耗时,并阻碍了更强大、统一的AI解决方案的开发。

设计意图(Why)

智能体间通信(A2A)协议为此问题提供了一个开放的标准化解决方案。它是一种基于HTTP的协议,能够实现互操作性,使不同的AI智能体能够无缝地协调、委派任务和共享信息,而不受其底层技术的限制。核心组件是Agent Card,一个描述智能体功能、技能和通信端点的数字身份文件,便于发现和交互。A2A定义了多种交互机制,包括同步和异步通信,以支持多样化的使用场景。通过为智能体协作创建通用标准,A2A促进了构建复杂、多智能体系统的模块化和可扩展性。

使用原则(Rule of Thumb)

当需要协调两个或多个AI智能体之间的协作时,尤其是它们基于不同框架(如Google ADK、LangGraph、CrewAI)构建时,可以使用此模式。该模式非常适合构建复杂的模块化应用程序,其中专业智能体处理工作流的特定部分,例如将数据分析委派给一个智能体,将报告生成委派给另一个智能体。当智能体需要动态发现并利用其他智能体的功能来完成任务时,此模式也至关重要。


图解 (Visual Summary)

图2:A2A智能体间通信模式

图2:A2A智能体间通信模式


关键要点

  • A2A协议通过标准化的通信方式解决了AI智能体之间的孤立问题。
  • Agent Card是A2A协议的核心,提供智能体的功能、技能和通信端点信息。
  • A2A支持同步和异步通信,适用于多样化的使用场景。
  • 通过A2A协议,开发者可以创建模块化、可扩展的多智能体系统。
  • A2A协议特别适合需要跨框架协作的复杂应用程序。

  • Google A2A 协议是一种开放的基于 HTTP 的标准,用于促进使用不同框架构建的 AI 智能体之间的通信与协作。

  • AgentCard 作为智能体的数字标识符,使其他智能体能够自动发现并理解其能力。
  • A2A 提供同步请求-响应交互(使用 tasks/send)和流式更新(使用 tasks/sendSubscribe),以满足不同的通信需求。
  • 该协议支持多轮对话,包括 input-required 状态,允许智能体请求额外信息并在交互过程中保持上下文。
  • A2A 鼓励模块化架构,专用智能体可以在不同端口上独立运行,从而实现系统的可扩展性和分布式架构。
  • 工具如 Trickle AI 有助于可视化和跟踪 A2A 通信,帮助开发者监控、调试和优化多智能体系统。
  • 尽管 A2A 是一个用于管理不同智能体之间任务和工作流的高级协议,模型上下文协议(MCP)则为大型语言模型(LLM)与外部资源交互提供了标准化接口。

结论

智能体间通信(A2A)协议确立了一个重要的开放标准,以克服单个 AI 智能体固有的孤立性。通过提供一个通用的基于 HTTP 的框架,它确保了在不同平台(如 Google ADK、LangGraph 或 CrewAI)上构建的智能体之间的无缝协作和互操作性。其核心组件是 Agent Card,作为数字身份,明确定义智能体的能力,并支持其他智能体动态发现。该协议的灵活性支持各种交互模式,包括同步请求、异步轮询和实时流式通信,以满足广泛的应用需求。

这使得创建模块化和可扩展的架构成为可能,专用智能体可以组合起来编排复杂的自动化工作流。安全性是其基本方面,内置了 mTLS 和显式认证要求等机制以保护通信。虽然 A2A 补充了 MCP 等其他标准,但其独特的重点在于智能体之间的高级协调和任务分配。主要技术公司的强力支持以及实际实现的可用性突显了其日益重要性。该协议为开发者构建更复杂、分布式和智能的多智能体系统铺平了道路。最终,A2A 是促进创新和互操作性协作 AI 生态系统的基础支柱。

参考文献

  1. 陈博. (2025年4月22日). 如何构建您的第一个 Google A2A 项目:分步教程. Trickle.so 博客. https://www.trickle.so/blog/how-to-build-google-a2a-project
  2. Google A2A GitHub 仓库. https://github.com/google-a2a/A2A
  3. Google Agent Development Kit (ADK). https://google.github.io/adk-docs/
  4. 入门 Agent-to-Agent (A2A) 协议: https://codelabs.developers.google.com/intro-a2a-purchasing-concierge#0
  5. Google AgentDiscovery - https://a2a-protocol.org/latest/
  6. 不同 AI 框架之间的通信,例如 LangGraph、CrewAI 和 Google ADK https://www.trickle.so/blog/how-to-build-google-a2a-project
  7. 使用 A2A 协议设计协作多智能体系统 https://www.oreilly.com/radar/designing-collaborative-multi-agent-systems-with-the-a2a-protocol/

results matching ""

    No results matching ""