コンテンツにスキップ

クイックスタート: A2A経由でリモートエージェントを利用する

ADKでサポートJava実験的

このクイックスタートでは、開発者にとって最も一般的な出発点である「リモートエージェントがあり、ADKエージェントでA2A経由でそれを使うにはどうすればよいですか?」について説明します。これは、さまざまなエージェントが連携して相互作用する必要がある複雑なマルチエージェントシステムを構築するうえで重要です。

概要

このサンプルは、Agent Development Kit(ADK)for Java の Agent2Agent(A2A) アーキテクチャを示し、複数のエージェントが協力して複雑なタスクを処理する方法を紹介します。

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

A2A Basic サンプルは次の要素で構成されています。

  • Root Agent (root_agent): 専門化されたサブエージェントにタスクを委任するメインオーケストレーター
  • Roll Agent (roll_agent): サイコロを振る処理を担当するローカルサブエージェント
  • Prime Agent (prime_agent): 数字が素数かどうかを確認するリモートA2Aエージェントで、別のA2Aサーバー上で実行されます

ADK Java SDKでエージェントを利用する

Java では、リクエストを手動で生成する代わりに、ADK が公式A2A SDK ClientRemoteA2AAgent エンティティの上に正確にラップして利用します。なお、Java SDK は現在 A2A Protocol 0.3 を使用しています。

1. サンプルコードを入手する

このクイックスタートに対応する Java ネイティブのサンプルは、adk-java ソースコードの contrib/samples/a2a_basic にあります。

a2a_basic サンプルを開いてください。

cd contrib/samples/a2a_basic

2. リモート Prime Agent サーバーを起動する

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 Protocol では、各エージェントがネットワーク上の他ノードに対して何を行うかを説明するエージェントカードを持つ必要があります。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 エージェントを公開する方法を学びましょう。