Skip to content

TypeScript Strands Agent から A2A Agent への接続

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

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

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

  1. Strands Agent コンポーネント(任意のプロトコル)を持つ TypeScript プロジェクト
  2. --protocol=A2A および --auth=IAM で生成された Strands Agent コンポーネントを持つプロジェクト(ts#strands-agent または py#strands-agent のいずれか)
  3. 両方のコンポーネントが computeType: BedrockAgentCoreRuntime で作成されていること
  1. インストール Nx Console VSCode Plugin まだインストールしていない場合
  2. VSCodeでNxコンソールを開く
  3. クリック Generate (UI) "Common Nx Commands"セクションで
  4. 検索 @aws/nx-plugin - connection
  5. 必須パラメータを入力
    • クリック Generate

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

    パラメータ デフォルト 説明
    sourceProject 必須 string - ソース プロジェクト
    targetProject 必須 string - 接続先のターゲット プロジェクト
    sourceComponent string - 接続元のソース コンポーネント (コンポーネント名、ソース プロジェクト ルートからの相対パス、またはジェネレーター ID)。プロジェクトをソースとして明示的に選択するには '.' を使用します。
    targetComponent string - 接続先のターゲット コンポーネント (コンポーネント名、ターゲット プロジェクト ルートからの相対パス、またはジェネレーター ID)。プロジェクトをターゲットとして明示的に選択するには '.' を使用します。

    ジェネレーターは共有の agent-connection パッケージを作成し、エージェントコードを変更します:

    • Directorypackages/common/agent-connection
      • Directorysrc
        • Directoryapp
          • <target-agent-name>-client.ts 接続された A2A エージェント用の高レベルクライアント
        • Directorycore
          • agentcore-a2a-client.ts SigV4 認証を使用した低レベル AgentCore A2A クライアント
        • index.ts すべてのクライアントをエクスポート
      • project.json
      • tsconfig.json

    さらに、以下を実行します:

    • エージェントの agent.ts を変換して、リモート A2A エージェントを Strands tool として登録
    • エージェントの serve-local ターゲットを更新して、ターゲットエージェントの serve-local ターゲットに依存するように設定
    • 必要な依存関係をインストール

    接続された A2A エージェントの使用

    Section titled “接続された A2A エージェントの使用”

    ジェネレーターはエージェントの agent.ts を変換して、リモート A2A エージェントをツールとしてラップします:

    packages/example/src/my-agent/agent.ts
    import { Agent, tool } from '@strands-agents/sdk';
    import { RemoteAgentClient } from ':my-scope/agent-connection';
    import { z } from 'zod';
    export const getAgent = async (sessionId: string) => {
    const remoteAgent = await RemoteAgentClient.create(sessionId);
    const remoteAgentTool = tool({
    name: 'askRemoteAgent',
    description: 'Delegate a question to the remote RemoteAgent A2A agent and return its reply.',
    inputSchema: z.object({ prompt: z.string() }),
    callback: async ({ prompt }) => (await remoteAgent.invoke(prompt)).toString(),
    });
    return new Agent({
    systemPrompt: '...',
    tools: [remoteAgentTool],
    });
    };

    sessionId パラメータは呼び出し元から渡され、Bedrock AgentCore Observability の一貫性を確保します。

    内部的には、RemoteAgentClient.create(sessionId) は、AWS にデプロイされた場合は SigV4 署名する clientFactory で構成された Strands A2AAgent を返し、SERVE_LOCAL=true の場合はプレーンな http://localhost:<port>/ エンドポイントを返します。

    接続ジェネレーターを実行した後、ホストエージェントがリモート 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 コンストラクトによって Runtime Configurationagentcore 名前空間に自動的に登録されるため、ホストエージェントは実行時にそれを検出できます。

    ジェネレーターは、ホストエージェントの serve-local ターゲットを次のように構成します:

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

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

    Terminal window
    pnpm nx <agent-name>-serve-local <project-name>

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