Skip to main content
Agent2Agent (A2A) 是 Google 用于实现对话式 AI 代理之间通信的协议。LangSmith 实现了 A2A 支持,允许您的代理通过标准化协议与其他兼容 A2A 的代理进行通信。 A2A 端点在 Agent Server 中可用,路径为 /a2a/{assistant_id}

支持的方法

Agent Server 支持以下 A2A RPC 方法:
  • message/send:向助手发送消息并接收完整响应
  • message/stream:发送消息并使用服务器发送事件 (SSE) 实时流式传输响应
  • tasks/get:检索先前创建的任务的状态和结果

代理卡发现

每个助手会自动公开一个 A2A 代理卡,描述其功能并提供其他代理连接所需的信息。您可以使用以下方式检索任何助手的代理卡:
代理卡包括助手的名称、描述、可用技能、支持的输入/输出模式以及用于通信的 A2A 端点 URL。

要求

要使用 A2A,请确保已安装以下依赖项:
  • langgraph-api >= 0.4.21
使用以下命令安装:

使用概述

要启用 A2A:
  • 升级以使用 langgraph-api>=0.4.21。
  • 使用基于消息的状态结构部署您的代理。
  • 使用端点与其他兼容 A2A 的代理连接。

创建兼容 A2A 的代理

此示例创建一个兼容 A2A 的代理,该代理使用 OpenAI 的 API 处理传入消息并维护对话状态。代理定义了一个基于消息的状态结构,并处理 A2A 协议的消息格式。 要兼容 A2A “text” 部分,代理的状态中必须有一个 messages 键。 A2A 协议使用两个标识符来维持对话连续性:
  • contextId:将消息分组到一个对话线程中(类似于会话 ID)
  • taskId:标识该对话中的每个单独请求
在第一条消息中,省略 contextIdtaskId - 代理将生成并返回它们。对于对话中的所有后续消息,请包含先前响应中的 contextIdtaskId 以维持线程连续性。 LangSmith 追踪: LangSmith 部署的 A2A 端点会自动将 A2A contextId 转换为 LangSmith 追踪的 thread_id,将对话中的所有消息分组到一个线程下。 例如:

代理间通信

一旦您的代理通过 langgraph dev 在本地运行或部署到生产环境,您就可以使用 A2A 协议促进它们之间的通信。 此示例演示了两个代理如何通过向彼此的 A2A 端点发送 JSON-RPC 消息进行通信。该脚本模拟了一个多轮对话,其中每个代理处理对方的响应并继续对话。
有关完整的工作示例,请参阅:

分布式追踪

当多个代理通过 A2A 通信时,LangSmith 可以将它们的所有追踪分组到一个线程中,为您提供整个多代理对话的统一视图。

contextId 如何映射到 thread_id

Agent Server A2A 端点会自动将 A2A contextId 转换为 LangSmith 追踪的 thread_id。这意味着对话中的每条消息,无论来自哪个参与代理,都会在 LangSmith 中分组到同一线程下,无需您进行任何额外配置。 流程如下:
  1. 在第一条消息中,客户端省略 contextId。服务器生成一个并在响应中返回。
  2. 客户端在所有后续消息中传递 contextId 以维持对话连续性。
  3. Agent Server 将 contextId 映射到 LangSmith 元数据中的 thread_id,因此所有轮次都出现在同一线程中。

跨多个代理的追踪

当来自不同框架的代理通过 A2A 通信时,您可以通过在所有代理间共享相同的 thread_id 来在 LangSmith 中统一它们的追踪。使用第一个代理返回的 contextId 作为所有后续请求的 thread_id 以下代码片段演示了关键概念。有关两个代理的完整可运行实现,请参阅 Google ADK + LangChain 示例
1. 构建消息:在后续轮次中,在 message 对象内包含 contextIdtaskId,以便服务器可以将它们与正在进行的对话关联起来。在第一条消息中省略它们,因为服务器会生成一个 contextId 并在响应中返回。 2. 在元数据中设置 thread_id:在 JSON-RPC 载荷的顶层 metadata 字段中传递 thread_id,而不是在 params 内部。 3. 在代理间共享 thread_id:在第一条消息之前生成一个随机的 thread_id。一旦服务器返回 contextId,就将其用作所有后续请求的 thread_id,这使 A2A 对话上下文和 LangSmith 线程保持同步。将相同的 thread_id 传递给每个代理,以便所有追踪都分组到一个线程中。

在非 LangGraph 代理中接收 thread_id

上一节涵盖了客户端——发送消息时传播 thread_id。如果您的某个代理不是基于 LangGraph 构建的,它还需要在接收端提取并附加 thread_id,以便其追踪落入同一个 LangSmith 线程。使用 langsmith.integrations.otel.configure() 设置自动追踪,并从传入的 A2A 请求元数据中提取 thread_id 以将追踪分组到同一线程中。
在此中间件之后,在 app 上注册您的代理路由。
在您的环境中设置 LANGSMITH_API_KEY 和可选的 LANGSMITH_PROJECT 以启用追踪。对话中的所有代理应使用相同的项目,以便它们的追踪可以一起查看。

在 LangSmith 中查看追踪

运行多代理对话后,打开 LangSmith UI 并导航到 Threads。所有参与代理的所有轮次将出现在一个线程下,由共享的 thread_id 标识。

禁用 A2A

要禁用 A2A 端点,请在您的 langgraph.json 配置文件中将 disable_a2a 设置为 true