AIエージェントの通信にA2Aプロトコルを使用する

執筆者

Vanna Winland

AI Advocate & Technology Writer

A2A(Agent2Agent)プロトコルは、AIエージェント、クライアント、ツール間の構造化された通信を可能にするオープン標準です。このチュートリアルでは、チャット・クライアントがユーザーのクエリーを処理し、それをA2A準拠のサーバー上で実行されているAIエージェントに送信するエージェント・システムを構築できます。

ほとんどのエージェント型AIアプリケーションは、コンポーネント間のカスタム通信を実装しているため(ChatDevのChatChainなど)、異なるアプリケーション間で同じエージェントを再利用したり、外部ツールを統合したりすることが困難です。標準化の欠如により、相互運用性が妨げられ、より広範なエージェント・エコシステムの開発が制限されます。

A2Aは、HTTP、JSON-RPC 2.0、およびサーバー送信イベント(SSE)上に構築された標準化されたプロトコルを通じて、エージェント・ロジックから通信レイヤーを分離することで、この制限を解消します。この分離により、エージェントはカスタム統合コードなしで他のエージェントと連携し、クライアントの要求に応え、外部ツールにアクセスできるようになります。

A2Aは、チームがクライアント・コードを壊すことなく、AIシステムを段階的に進化させられる分散型アーキテクチャーをサポートしています。チームは、複雑なワークフロー全体で一貫したインターフェースを維持しながら、ツールの更新、モデルの交換、またはエージェントの動作の変更を行うことができます。

エージェントは、JSON-RPC形式で構造化されたメッセージで情報を交換します。このメッセージには、エージェントのをやり取りを明確かつ一貫性のあるものにするメタデータが含まれています。各A2Aサーバーは、エージェントの機能を構造化されたJSONデータとして記述する、既知のエンドポイント(.well-known/agent-card.json)でAgentCardを公開します。したがって、クライアントは、APIのドキュメンテーションが利用可能なエンドポイントを説明するのと同様に、エージェントが実行できることを動的に発見できるようになります。

A2Aエージェント・システムの構築と実行の手順に従って、次の実践的な体験を積んでください。

  • BeeAI:AIエージェントを構築するためのオープンソースのエージェント・フレームワーク。
  • A2Aプロトコル:エージェントの相互運用性のための標準化された通信プロトコル。
  • Ollama:大規模言語モデル(LLM)をローカルで実行するためのツール。
  • エージェント・ツール:ウェブ検索(DuckDuckGo)、気象データ(OpenMeteo)、Wikipediaへのアクセス(WikipediaTool)、推論(ThinkTool)などの特殊機能。

:ACP(エージェント通信プロトコル)を使用したことがある場合は、類似点を認識できるはずです。ACPは、元々IBMのBeeAIによって開発されましたが、Linux Foundationの下でGoogle A2Aと提携しました。現在のBeeAIはA2Aアダプター(A2AServerA2AAgent)を使用するようになったため、A2Aに準拠した通信を提供します。A2Aはまた、MCP(モデル・コンテキスト・プロトコル)と連携して、エージェントがデータ・ソースやツールとやり取りできるようにし、相互運用可能なエージェント・エコシステムを作成しています。

A2Aチャット・システムの仕組み

このプロジェクトでは、A2Aによってクライアント・インターフェースとエージェント・ロジックを明確に分離する方法を示します。

ワークフローは次の順序で進行します。

  1. ユーザー・インプット:クライアントは、端末インターフェースを通じてユーザー・インプットを取得します。
  2. A2Aリクエスト:クライアントはインプットをJSON-RPCメッセージ・ペイロードとして形式化し、エージェント・サーバーに送信します。
  3. エージェントの処理:サーバはリクエストを転送し、RequirementAgent タスクを分析し、必要に応じて適切なツールを実行します。
  4. A2A応答:サーバーはエージェントの応答をJSON-RPC形式の構造化されたデータとして返し、結果が生成されるとリアルタイムでストリーミングされます。
  5. 表示:クライアントは応答テキストを抽出し、端末に表示します。

このワークフローは、チャットボット、タスク・オートメーション・システム、カスタマー・サポート・エージェント、ツール・オーケストレーション機能を備えたリサーチ・アシスタントなど、構造化されたクライアントとエージェントの通信を必要とするユースケースに適用できる再利用可能なパターンを示しています。

A2Aエージェント

このプロジェクトでは、複数のツール機能を備えた単一のAIエージェントを使用しています。より複雑なシステムでは、それぞれが特定のドメインまたはタスクに焦点を当てた複数の専門エージェントをデプロイできます。

RequirementAgent(BeeAI):ユーザーの要求に基づいて複数のツールを動的に選択および調整する宣言型エージェント。これは次の用途に使用されます。

  • ThinkTool 推論および論理処理
  • DuckDuckGoSearchTool ウェブ検索
  • OpenMeteoTool 気象データ
  • WikipediaTool 情報検索

A2Aサーバー

A2Aサーバー(beeai-a2a-server/beeai_chat_server.py )は、HTTP APIを通じてエージェント機能を公開します。サーバーは、次の3つの主要な役割を担います。

  1. LLMの初期化:Ollamaを通じてローカル言語モデルをロードします。
llm = ChatModel.from_name(os.environ.get(“BEEAI_MODEL”, “ollama:granite3.3:8b”))

 

2. エージェントのセットアップ:エージェントのライフサイクルを処理するためのツールとメモリを備えたRequirementAgentを作成します。

    agent = RequirementAgent(
        llm=llm,
        tools=[ThinkTool(), DuckDuckGoSearchTool(), OpenMeteoTool(), WikipediaTool()],
        memory=UnconstrainedMemory(),
        description=”An agent that can search the web, check the weather, and think through problems step-by-step.”,

 

3. サーバーの構成:A2A準拠のHTTPエンドポイントを介してエージェントを公開します。

A2AServer(
    config=A2AServerConfig(port=int(os.environ.get(“A2A_PORT”, 9999))),
    memory_manager=LRUMemoryManager(maxsize=100)
).register(agent).serve()

 

サーバーは、エージェントの機能を記述し、エージェント構成の検証に役立つAgentCardを/.well-known/agent-card.jsonで自動的に公開します。

A2Aクライアント

A2Aクライアント(beeai-a2a-client/beeai_chat_client.py )は、非同期メッセージ処理のためのA2A SDKとPythonのasyncioライブラリーを使用してユーザー・インターフェースを提供し、サーバーとの通信を処理します。

接続のセットアップ:A2Aクライアント・アダプターを作成します。

agent = A2AAgent(
    url=os.environ.get(“BEEAI_AGENT_URL”, “http://127.0.0.1:9999”),
    memory=UnconstrainedMemory()
)

url パラメーターは、A2A準拠サーバーのエンドポイントを指定します(デフォルト:http://127.0.0.1:9999 )。そのmemory パラメーターは、会話履歴をローカルに保管するため、クライアントとのやり取り中にコンテキストを維持し、長期にわたるタスクをサポートできるようになります。

メッセージの交換:非同期プロンプトを送信し、応答を処理します。

for prompt in reader:
    response = await agent.run(prompt)
    # Extract and display response text

A2AAgent JSON-RPC通信の詳細を抽象化するクライアント側のアダプターです。これは自律的なエージェントではありません。ユーザー・インプットをA2A準拠のメッセージに変換し、サーバーの応答を処理するだけで、シームレスなデータ交換とオブザーバビリティーを実現します。

このプロジェクトを実行するための前提条件

システム要件

このプロジェクトを実行するためのシステム要件は次のとおりです。

  • オペレーティング・システム:macOS、Linux、Windows
  • メモリ(RAM):8 GB以上(推奨:ローカルLLMを実行する場合は16 GB以上)
  • ディスク容量:5 GB以上の空き容量(推奨:Python環境およびローカル・モデルに対応する場合は10 GB以上)
  • Pythonのバージョン:3.11以降

ツールとプロバイダーの要件

開始する前に、このプロジェクトに必要なツールの概要を説明します。

  • BeeAI:AIエージェントを構築するためのオープンソースのエージェント開発キット。BeeAIは、Ollama(このチュートリアルで使用)、OpenAI、Anthropicを含む複数のLLMプロバイダーに対応しています。
  • Ollama:AIエージェントを稼働させるためにローカルLLMを実行します。
  • A2Aプロトコル:BeeAIフレームワークに統合され、クライアントとサーバー間の構造化された通信を可能にします。
  • 端末またはIDE:Visual Studio Codeのような端末またはIDE(複数の端末の管理やログの表示のために推奨されます)。
  • Pythonの仮想環境:クライアントとサーバーの依存関係を分離します。

LLMプロバイダーの要件

このプロジェクトでは、AIエージェントのモデル・プロバイダーとしてOllamaを使用します。Ollamaをセットアップするには、次の手順に従います。

  1. Ollamaをダウンロードしてインストールします。
    - Ollamaにアクセスし、お使いのオペレーティング・システム用のアプリケーションをインストールします。
  2. Ollamaサーバーを起動します。
    - 端末を開いて実行します。
    ollama serve
  3. デフォルト・モデルを取得します(約5 GBのディスク容量が必要)。

    ollama pull granite3.3:8b

注:Ollamaと互換性のあるモデルを使用する場合は、BEEAI_MODEL 環境変数を設定します。使用可能なモデルとそのサイズについては、Ollamaモデル・ライブラリーを確認してください。

手順

ステップ1. GitHubリポジトリをクローンする

このプロジェクトを実行するには、https://github.com/IBM/ibmdotcom-tutorials.gitをHTTPS URLとして使用して、GitHubリポジトリーをクローンします。リポジトリーをクローンする詳細な手順については、GitHubのドキュメンテーションを参照してください。

このチュートリアルは、リポジトリーのプロジェクト・ディレクトリー内にあります。

端末内で、このチュートリアルのディレクトリーに移動します。

cd docs/tutorials/projects/a2a_tutorial

ステップ2. 開発環境をセットアップする

このプロジェクトでは、サーバー用とクライアント用の2つの別々のPythonスクリプトを同時に実行する必要があります。2つの端末ウィンドウまたはタブを開く必要があります。

現在の端末を開いたまま、2つ目の端末を開いて、両方が正しいプロジェクト・ディレクトリー(a2a_tutorial ルート・ディレクトリー)に移動することを確認します。

IDEを使用している場合

Visual Studio CodeのようなIDEを使用している場合は、Split Terminal機能を使用して複数の端末を並行して管理できます。

それ以外の場合は、2つのスタンドアロン端末ウィンドウを開き、それぞれをプロジェクト・ディレクトリーに移動します。

ステップ3. 仮想環境を作成・アクティブ化する

仮想環境は、依存関係を分離して維持するのに役立ちます。サーバーとクライアントの依存関係を分離するには、コンポーネントごとに仮想環境を作成します。

サーバー用:

ディレクトリーにbeeai-a2a-server 移動する:

cd beeai-a2a-server

Python 3.11で仮想環境を作成する:

python3.11 -m venv venv

仮想環境をアクティブ化する:

source venv/bin/activate

Windowsユーザーへの注意:仮想環境をアクティブ化するには、venv\Scripts\activateを使用してください。

クライアント用:

ディレクトリーにbeeai-a2a-client 移動する:

cd beeai-a2a-client

仮想環境を作成してアクティブ化する:

python3.11 -m venv venv
source venv/bin/activate

ステップ4. 依存関係をインストールする

各端末でこのコードを実行して、各コンポーネントに必要な依存関係をインストールする:

pip install -r requirements.txt

端末内で実行して、pip freeze その環境の依存関係が最新であることを確認できます。

ステップ5. A2Aエージェント・サーバーを起動する

1つ目の端末でA2Aエージェント・サーバーを起動します。

python beeai_chat_server.py

次のように表示されます。

INFO:     Started server process [88159]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:9999 (Press CTRL+C to quit)

これで、サーバーはクライアント・アプリケーションからの受信要求をリッスンし、エージェント間の通信をサポートする準備が整いました。

ステップ6. A2Aクライアントを起動する

もう一方の端末でA2Aクライアントを起動します。

python beeai_chat_client.py

これにより、インプットを求められます。

Type your message (Ctrl+C to exit):
You:

ステップ7. エージェントと対話する

クライアント端末にメッセージを入力して、押します。Enter エージェントはクエリーを処理し、次のように応答します。

You: What is the capital of France?
Agent 🤖 : The capital of France is Paris.

サーバー端末には、プッシュ通知との通信を示すA2Aプロトコル・ログが表示されます。

INFO:     127.0.0.1:49292 - “GET /.well-known/agent-card.json HTTP/1.1” 200 OK
INFO:     127.0.0.1:49294 - “POST / HTTP/1.1” 200 OK

1つ目の要求では、エージェントの機能を記述したAgentCardを取得します。2つ目の要求では、次のようにメッセージが送信され、TextPart (A2Aメッセージ内のテキスト・コンテンツの単位)と応答を受信します。

:LLMからのアウトプットは確率的なものであり、同じインプットであっても、ワークフローを実行するたびに変化する可能性があります。

さまざまなクエリの試行

さまざまなタイプのクエリーを試して、エージェントの多様なツールをテストします。

  • ウェブ検索:「人工知能に関する最新のニュースを検索する」
  • 気象データ:「東京の天気は?」
  • Wikipedia:「量子コンピューティングについて教えてください」
  • 推論:「空が青い3つの理由は?」

AgentCardの表示

ブラウザでhttps://0.0.0.0:9999/.well-known/agent-card.jsonにアクセスして、RequirementAgent のAgentCardです。

{
    “capabilities”: {
        “streaming”: true
    },
    “defaultInputModes”: [
        “text”
    ],
    “defaultOutputModes”: [
        “text”
    ],
    “description”: “An agent that can search the web, check the weather, and think through problems step-by-step.”,
    “name”: “RequirementAgent”,
    “preferredTransport”: “JSONRPC”,
    “protocolVersion”: “0.3.0”,
    “skills”: [
        {
            “description”: “An agent that can search the web, check the weather, and think through problems step-by-step.”,
            “id”: “RequirementAgent”,
            “name”: “RequirementAgent”,
            “tags”: []
        }
    ],
    “url”: “http://localhost:9999”,
    “version”: “1.0.0”
}

このJSONドキュメントでは、次の内容について説明しています。

  • エージェントの名前(RequirementAgent)とその機能の概要
  • 対応している通信プロトコルとメッセージ形式
  • 要件や制約

このAgentCardを使用すると、A2A準拠のクライアントは、エージェントの実装の詳細を事前に知らなくても、エージェントを発見してやり取りすることができます。

まとめ

このチュートリアルでは、クライアントとエージェントの通信用の構造化されたインターフェースを公開するA2A準拠サーバーを使用してチャット・システムを構築しました。Agent2Agentプロトコルは、メッセージング・レイヤーを内部ロジックから分離することで、チームがクライアント・コードを変更せずにエージェント機能の更新、モデルの交換、ツール構成の変更を行うことができます。この柔軟性は、インプットが必要なタスクの調整、タスクのステータスの追跡、各オペレーションを個別の作業単位で扱う場合に特に役立ちます。

A2Aは、準拠するコンポーネントが理解できる共通のメッセージ形式を定義することで機能し、自律的なエージェントが他のエージェントと連携できるようにします。プロトコル仕様では、メッセージがJSON-RPC形式でどのように構造化され、メタデータで強化されて、相互作用全体の一貫性と明確さが確保されるかを定義します。

このチュートリアルは、A2Aサンプル・リポジトリーで提供される基本的な例に基づいています。元の実装の詳細については、リポジトリー内のreadmeファイルを参照してください。このファイルには、A2A準拠のシステムを構築するための詳細なコンテキストと事例が含まれています。

実際のデプロイメントの場合、A2Aサーバーは認証メカニズムを実装してエージェントのエンドポイントを保護し、サーバー送信イベントをストリーミング応答に使用し、運用ワークフローに対応できるように拡張します。このワークフローに沿って、コマンド・ライン・クライアントが標準化されたプロトコルを通じてAIエージェントとやり取りし、エージェントが複数のツールを調整し、状況に応じた応答を提供できるようにする方法を確認しました。このアプローチは、保守可能でスケーラブル、かつ柔軟性に優れたAIシステムを実現するA2Aの力を実証しています。

システムのシャットダウン

システムのテストが終了したら、次の手順に従って、実行中のすべてのコンポーネントを完全にシャットダウンします。

実行中の各サーバーの停止

各端末のウィンドウで、Ctrl+Cを押して実行中のプロセスを停止します。

次のようなアウトプットが表示されます。

INFO:     Shutting down
INFO:     Finished server process

シャットダウン中にサーバーがハングアップする場合

サーバーが応答しなくなったり、シャットダウン時にフリーズする場合は、強制的に停止することができます。

プロセスID(PID)を確認する:

ps aux | grep python

停止しようとしているプロセスのPIDを特定します。

プロセスを終了する:

kill -9 <PID>

必要に応じて、サーバーごとにこのプロセスを繰り返します。

これで、A2A準拠のチャット・システムの実行に成功しました。

関連ソリューション
ビジネス向けAIエージェント

生成AIを使用してワークフローとプロセスを自動化する強力なAIアシスタントとエージェントを構築、デプロイ、管理しましょう。

    watsonx Orchestrateの詳細はこちら
    IBM AIエージェント・ソリューション

    信頼できるAIソリューションでビジネスの未来を構築します。

    AIエージェント・ソリューションの詳細はこちら
    IBM®コンサルティング AIサービス

    IBMコンサルティングAIサービスは、企業がAIをトランスフォーメーションに活用する方法を再考するのに役立ちます。

    人工知能サービスの詳細はこちら
    次のステップ

    事前構築済みのアプリケーションとスキルをカスタマイズする場合でも、AIスタジオを使用してカスタム・エージェント・サービスを構築し、デプロイする場合でも、IBM watsonxプラットフォームが対応します。

    watsonx Orchestrateの詳細はこちら watsonx.aiの詳細はこちら