Skip to content

Python Agent から A2A Agent への接続

connection ジェネレーターは、Python Agent をリモートの A2A エージェント(TypeScript または Python)に接続し、エージェントが別のエージェントをツールとして委譲できるようにします。

このジェネレーターは、エージェントがリモート A2A エージェントを検出して呼び出すために必要なすべての配線を設定します。これは AWS へのデプロイ時(Bedrock AgentCore 経由)とローカル実行時の両方で機能します。

このジェネレーターを使用する前に、以下を確認してください:

  1. Python Agent コンポーネント(Strands または LangChain)を含む Python プロジェクト
  2. --protocol=a2a および --auth=iam で生成された Agent コンポーネントを含むプロジェクト(ts#agent または py#agent
  3. 両方のコンポーネントが infra: agentcore で作成されていること
Terminal window
pnpm nx g @aws/nx-plugin:connection
変更されるファイルを確認するためにドライランを実行することもできます
Terminal window
pnpm nx g @aws/nx-plugin:connection --dry-run

ソースとしてホストエージェントプロジェクトを選択し、ターゲットとして A2A エージェントプロジェクトを選択します。プロジェクトに複数のコンポーネントが含まれている場合は、sourceComponent および targetComponent オプションを指定して明確にしてください。

パラメータデフォルト説明
sourceProject 必須string-ソース プロジェクト
targetProject 必須string-接続先のターゲット プロジェクト
sourceComponent string-接続元のソース コンポーネント (コンポーネント名、ソース プロジェクト ルートからの相対パス、またはジェネレーター ID)。プロジェクトをソースとして明示的に選択するには '.' を使用します。
targetComponent string-接続先のターゲット コンポーネント (コンポーネント名、ターゲット プロジェクト ルートからの相対パス、またはジェネレーター ID)。プロジェクトをターゲットとして明示的に選択するには '.' を使用します。
preferInstallDependencies booleantrueジェネレーター実行後に依存関係のインストールを優先するかどうか。複数のジェネレーターをバッチ処理する際にインストールを延期する場合はfalseに設定します(後続のジェネレーターがNxプロジェクトグラフを計算できるよう、必要に応じてインストールは実行されます)。最後に一度だけインストールします。

ジェネレーターは、packages/common/agent_connection/ に共有の agent_connection Python プロジェクトを作成します(まだ存在しない場合)。接続ごとのクライアントモジュールは、この共有プロジェクトに生成されます:

  • Directorypackages/common/agent_connection
    • Directory<scope>_agent_connection
      • __init__.py 接続ごとのクライアントを再エクスポート
      • Directorycore
        • agentcore_endpoints.py フレームワークに依存しない ARN/URL 解決
        • agentcore_a2a_client_config.py フレームワークに依存しない A2A クライアント設定(署名済み ClientConfig
        • agentcore_a2a_client_<framework>.py エージェントのフレームワーク用の設定をラップする A2A クライアント
        • Directoryauth/ フレームワークに依存しない SigV4 / セッション転送 httpx.Auth
      • Directoryapp
        • <target_agent_name>_client_<framework>.py 各 A2A エージェント用の接続ごとの A2A クライアント

クライアントのサフィックスは、エージェントのフレームワーク(_strands または _langchain)に一致します。両方とも同じフレームワークに依存しない署名済み ClientConfig をラップします:Strands クライアントは Strands A2AAgent をラップし、LangChain クライアントは a2a SDK を直接駆動します。

さらに、ジェネレーターは以下を行います:

  • エージェントの agent.py を変換して、@tool を使用してリモート A2A エージェントをツールとして登録
  • agent_connection プロジェクトをエージェントプロジェクトのワークスペース依存関係として追加
  • エージェントの dev ターゲットを更新して、ターゲットエージェントの dev ターゲットに依存するように設定

ジェネレーターは、エージェントの agent.py を変換して、リモート A2A エージェントをツールとしてラップします。リモートエージェントは @tool で装飾されたデリゲートで登録されます。デコレーターのインポートとエージェントコンストラクターはフレームワークによって異なります:

packages/my-project/my_module/agent/agent.py
from contextlib import contextmanager
from strands import Agent, tool
from my_scope_agent_connection import RemoteAgentClientStrands
@contextmanager
def get_agent():
remote_agent = RemoteAgentClientStrands.create()
@tool
def ask_remote_agent(prompt: str) -> str:
"""Delegate a question to the remote RemoteAgent A2A agent and return its reply."""
return str(remote_agent(prompt))
yield Agent(
system_prompt="...",
tools=[ask_remote_agent],
)

両方のクライアントは直接呼び出し可能で、リモートエージェントの応答を返します。また、AWS にデプロイされた場合は SigV4 でリクエストに署名し、LOCAL_DEV=true の場合はプレーンな http://localhost:<port>/ エンドポイントを使用する httpx.AsyncClient をラップします。Strands クライアントは Strands A2AAgent をラップし、LangChain クライアントは a2a SDK を直接駆動します。

AgentCore セッション ID は、フレームワークに関係なく X-Amzn-Bedrock-AgentCore-Runtime-Session-Id ヘッダーを介してリモートエージェントに自動的に伝播されます:エージェントサーバーは受信リクエストのセッションを非同期コンテキストにバインドし、接続クライアントの署名済み httpx.Auth がすべての送信呼び出しにスタンプします。これにより、Bedrock AgentCore Observability の一貫性が保証されます。

接続ジェネレーターを実行した後、ホストエージェントにリモートA2Aエージェントを呼び出す権限を付与する必要があります。

packages/infra/src/stacks/application-stack.ts
const remoteAgent = new RemoteAgent(this, 'RemoteAgent');
const myAgent = new MyAgent(this, 'MyAgent');
// Grant the host agent permission to invoke the remote A2A agent
remoteAgent.grantInvokeAccess(myAgent);

A2AエージェントのgrantInvokeAccessは、bedrock-agentcore:InvokeAgentRuntimebedrock-agentcore:GetAgentCardの両方を設定します。A2Aクライアントは、エージェントカードを取得してメッセージを送信するために両方が必要です。

リモートエージェントのAgentCoreランタイムARNは、生成されたCDKコンストラクトによってランタイム設定agentcore名前空間に自動的に登録されるため、ホストエージェントは実行時にそれを検出できます。

ジェネレーターは、ホストエージェントの dev ターゲットを次のように設定します:

  1. 接続された A2A エージェントを自動的に起動
  2. LOCAL_DEV=true を設定して、生成されたクライアントが AgentCore の代わりに http://localhost:<port>/ に直接接続するようにする

エージェントをローカルで実行するには:

Terminal window
pnpm nx <agent-name>-dev <project-name>

これにより、ホストエージェントとすべての接続された A2A エージェントが起動し、ホストエージェントは割り当てられたローカルポートでプレーン HTTP を介してリモートエージェントを呼び出します。