Skip to content

快速入门:通过 A2A 使用远程智能体

Supported in ADKJavaExperimental

本快速入门涵盖了任何开发者最常见的起点:“有一个远程智能体,我如何让我的 ADK 智能体通过 A2A 使用它?”。这对于构建复杂的、需要不同智能体协同和交互的多智能体系统至关重要。

概览

本示例演示了 Java 版智能体开发工具包 (ADK) 中的 Agent2Agent (A2A) 架构,展示了多个智能体如何协同工作来处理复杂任务。

┌─────────────────┐    ┌─────────────────┐    ┌────────────────────────┐
│   Root Agent    │───▶│   Roll Agent    │    │   Remote Prime Agent   │
│   (Local)       │    │   (Local)       │    │   (localhost:8001)     │
│                 │───▶│                 │◀───│                        │
└─────────────────┘    └─────────────────┘    └────────────────────────┘

A2A 基础示例包含:

  • Root Agent (root_agent):主编排器,负责将任务委托给专门的子智能体。
  • Roll Agent (roll_agent):一个本地子智能体,负责处理掷骰子操作。
  • Prime Agent (prime_agent):一个远程 A2A 智能体,用于检查数字是否为素数,该智能体运行在独立的 A2A 服务器上。

使用 ADK Java SDK 消费你的智能体

在 Java 中,ADK 不依赖于手动生成请求,而是依赖包装在 RemoteA2AAgent 实体之上的官方 A2A SDK Client(客户端)。请注意,Java SDK 目前使用的是 A2A Protocol 0.3。

1. 获取示例代码

与此 Java 快速入门工作流匹配的本地示例可以在 adk-java 源代码的 contrib/samples/a2a_basic 目录下找到。

你可以导航到 a2a_basic 示例

cd contrib/samples/a2a_basic

2. 启动远程 Prime 智能体服务器

为了展示你的 ADK 智能体如何通过 A2A 使用远程智能体,你首先需要运行一个远程智能体服务器。虽然你可以用任何语言编写自定义 A2A 服务器,但 ADK 提供了 a2a_server 示例,它会启动一个在 :9090 端口上托管智能体的 Quarkus 服务。

# 在 adk-java 根目录下,启动预配置在 9090 端口上的 Quarkus 远程服务
./mvnw -f contrib/samples/a2a_server/pom.xml quarkus:dev

一旦成功运行,该智能体将可以通过本地 HTTP 端点访问。

3. 寻找远程智能体所需的智能体卡片

A2A 协议要求每个智能体都有一个智能体卡片(Agent Card),用于向网络上的其他节点描述其功能。在 A2A 服务器中,智能体卡片在启动时动态生成并进行静态托管。

对于 ADK Java Web 服务,通常可以使用相对于其基准 URL 的 .well-known/agent-card.json 标准端点格式动态访问智能体卡片。

4. 运行主(消费端)智能体

在另一个终端中,你可以运行客户端智能体:

./mvnw -f contrib/samples/a2a_basic/pom.xml exec:java -Dexec.args="http://localhost:9090"

工作原理

主智能体通过所需的 A2A JSON-RPC 传输包装器来使用远程智能体(在我们的示例中为 prime_agent)。如下所示,它会查询目标主机的 AgentCard,并将其注册到官方 A2A Client 内部。

A2aConsumerSnippet.java
String primeAgentBaseUrl = "http://localhost:9090";
String agentCardUrl = primeAgentBaseUrl + "/.well-known/agent-card.json";

// 1. Resolve the public AgentCard from the remote agent's .well-known endpoint
AgentCard publicAgentCard = new A2ACardResolver(
    new JdkA2AHttpClient(), 
    primeAgentBaseUrl, 
    agentCardUrl
).getAgentCard();

// 2. Build the official A2A SDK Client using the resolved card and transport
Client a2aClient = Client.builder(publicAgentCard)
    .withTransport(JSONRPCTransport.class, new JSONRPCTransportConfig())
    .clientConfig(
        new ClientConfig.Builder()
            .setStreaming(publicAgentCard.capabilities().streaming())
            .build()
    )
    .build();

// 3. Wrap it in the ADK's RemoteA2AAgent natively
BaseAgent remotePrimeAgent = RemoteA2AAgent.builder()
    .name(publicAgentCard.name())
    .a2aClient(a2aClient)
    .agentCard(publicAgentCard)
    .build();

然后,你可以将远程智能体实例自然地传递给你的智能体构建器,它表现得就像另一个标准的 ADK 子智能体。ADK 会在内部接管所有的网络传输转换逻辑。

A2aConsumerSnippet.java
BaseAgent rootAgent = LlmAgent.builder()
    .name("root_agent")
    .model("gemini-2.5-flash")
    .instruction("You are a helpful assistant that can check prime numbers by delegating to prime_agent.")
    .subAgents(remotePrimeAgent)
    .build();

下一步

现在你已经创建了一个通过 A2A 服务器使用远程智能体的智能体,下一步是学习如何公开你自己的 Java 智能体。