A2A プロトコル ツール

Agent-to-Agent(A2A)プロトコルは、自律型 AI エージェントが異なるシステム間で通信し、タスクを調整できるようにするオープン メッセージング標準です。

CX Agent Studio の A2A プロトコル ツールを使用すると、エージェント アプリケーションで外部のリモート エージェントにタスクを委任したり、外部アプリケーションやオーケストレーターで標準化されたメッセージングを使用して CX Agent Studio エージェントを呼び出したりできます。

A2A の仕組み

CX Agent Studio の A2A プロトコルは、委任モデルを使用して動作します。

委任モデル

委任モデルでは、開始 CX Agent Studio エージェントがプライマリ オーケストレーターとして機能し、セッション全体の制御を保持します。

  • セッションの所有権: プライマリ エージェントがユーザーの会話セッションを維持します。専門的なサブタスクが必要な場合、プライマリ エージェントはリモート エージェントをツールとして呼び出します。
  • 制御フロー: リモート エージェントがリクエストを処理し、構造化されたレスポンス データを返します。制御はすぐにプライマリ エージェントに戻り、プライマリ エージェントはエンドユーザー向けに結果を要約または統合します。
  • コンテキストの転送: メインのエージェントは、委任されたタスクに必要なパラメータと会話コンテキストのみを送信します。

A2A 委任のシーケンス図

テキストベースのコミュニケーション

A2A プロトコルのエージェント間の通信はすべてテキストベースです。

  • エンドユーザーが音声チャネル(電話や WebRTC など)でプライマリ エージェントとやり取りする場合、音声はまずテキストに変換されます。
  • プライマリ エージェントは、テキスト文字起こしとパラメータを HTTP リクエスト ペイロードでリモート サブエージェントに送信します。
  • 未加工の音声ストリームとエンベディングは、A2A ネットワーク インターフェースを介して送信されません。

モダリティのサポート

A2A プロトコルのモダリティ(テキストと音声)のサポートは、通信の方向によって異なります。

  • リモート エージェントから CX Agent Studio: テキスト モダリティのみをサポートします。
  • CX Agent Studio からリモート エージェント: CX Agent Studio ではモダリティに依存しません。つまり、CX Agent Studio セッションでは音声やテキストなどのサポートされているモダリティを使用できますが、リモート エージェントはテキストのみを受信します。

課金

プライマリ セッションとリモート セッションの両方が CX Agent Studio にあり、同じプロジェクトにある場合は、1 つのセッションに対して課金されます。

それ以外の場合、複数のプロジェクトまたはサードパーティ システムにまたがるプライマリ セッションとリモート セッションに対して、2 つのセッションの料金が請求されます。

認証とアクセス制御

認証要件は、通信の方向とターゲット サービスによって異なります。

方向 ターゲットの宛先 認証メカニズム 必要な IAM ロール 説明
インバウンド(CX Agent Studio の外部) CX Agent Studio エージェント アプリケーション OAuth 2.0 アクセス トークン roles/ces.client 外部の呼び出し元が CX Agent Studio インバウンド エンドポイントを呼び出すために必要です。
アウトバウンド(CX Agent Studio から CX Agent Studio) 別のプロジェクトの CX Agent Studio エージェント サービス エージェント roles/ces.client ターゲット プロジェクトの呼び出し元プロジェクトのサービス エージェントに付与されます。
アウトバウンド(CX Agent Studio から Cloud Run) Cloud Run サービス サービス エージェントの ID トークン roles/run.invoker Cloud Run サービスで呼び出し元プロジェクトのサービス エージェントに付与されます。
アウトバウンド(CX Agent Studio から Vertex AI) Vertex AI Agent Engine サービス エージェントの OAuth roles/aiplatform.user ターゲット プロジェクトの呼び出し元プロジェクトのサービス エージェントに付与されます。
アウトバウンド(CX Agent Studio からサードパーティへ) 外部エンドポイント(ServiceNow や Salesforce など) API キーまたは OAuth Secret Manager を使用して管理される ツールの実行中に挿入された保存済みの認証情報。

サービス エージェント ID

CX Agent Studio からのアウトバウンド リクエストは、CX Agent Studio サービス エージェントを使用します。

service-PROJECT_NUMBER@gcp-sa-ces.iam.gserviceaccount.com

PROJECT_NUMBER は、使用する Google Cloud プロジェクト番号に置き換えます。

インバウンド認証

外部アプリケーション、カスタム エージェント、オーケストレーターが CX Agent Studio を呼び出す場合は、有効な Google 発行の OAuth 2.0 アクセス トークンを Authorization ヘッダーで渡す必要があります。

  • テスト: アクティブなアカウントの一時アクセス トークンを生成します。

    gcloud auth print-access-token
    
  • プログラム クライアント: アプリケーションのデフォルト認証情報(ADC)を使用します。

    gcloud auth application-default print-access-token
    
  • 本番環境: roles/ces.client(Customer Engagement Suite Client)ロールを持つ専用の Google サービス アカウントを使用します。

前提条件

A2A プロトコル ツールを構成する前に:

  1. プロジェクトで Gemini Enterprise for Customer Experience API(ces.googleapis.com)を有効にします。

    gcloud services enable ces.googleapis.com --project=PROJECT_ID
    
  2. 呼び出し元のプリンシパルまたはサービス アカウントに Customer Engagement Suite Client ロール(roles/ces.client)が付与されていることを確認します。

A2A プロトコル ツールを構成する

プライマリ エージェントを外部リモート エージェントに接続する手順は次のとおりです。

  1. CX Agent Studio コンソールを開きます。
  2. プロジェクトを選択して、エージェント アプリケーションを開きます。
  3. エージェント ビルダーで、[ツール] アイコンをクリックします。
  4. [+](追加)ボタンをクリックして、新しいツールを作成します。
  5. [A2A Protocol] ツールカードを選択します。
  6. UI フォームまたは JSON エディタを使用して、エージェント カードを構成します。
  7. [URL] フィールドに、リモート エージェントのベース エンドポイント URL(https://ces.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/apps/APP_ID や Cloud Run サービスの URL など)を入力します。URL に /message:send を追加しないでください。CX Agent Studio は実行時に /message:send を自動的に追加します。
  8. エンドポイントに適した認証タイプを選択します。
  9. [作成] をクリックします。

エージェント カードの例

次の JSON サンプルは、リモート天気エージェントのエージェント カードを定義しています。

{
  "name": "weather_agent",
  "description": "Agent capable of querying weather conditions and local time for given locations.",
  "version": "0.1.0",
  "supportedInterfaces": [
    {
      "url": "https://ces.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/apps/APP_ID",
      "protocolBinding": "HTTP+JSON",
      "protocolVersion": "1.0"
    }
  ],
  "skills": [
    {
      "id": "get_weather",
      "name": "get_weather",
      "description": "Retrieves weather conditions for a specified location.",
      "tags": [
        "weather",
        "forecast"
      ],
      "examples": [],
      "inputModes": [],
      "outputModes": []
    },
    {
      "id": "get_current_time",
      "name": "get_current_time",
      "description": "Retrieves current local time for a specified city or timezone.",
      "tags": [
        "time",
        "clock"
      ],
      "examples": [],
      "inputModes": [],
      "outputModes": []
    }
  ]
}

ルート案内を追加する

A2A ツールに委任するタイミングをプライマリ エージェントに指示します。次に例を示します。

If the user asks for weather information or local time, use {@TOOL: weather_agent}.
Pass the city or location specified by the user.
If the tool returns an error, inform the user that weather details are temporarily unavailable.

受信メッセージ

外部システムは、インバウンド A2A メッセージング エンドポイントを使用して、CX Agent Studio エージェント アプリケーションにメッセージを直接送信できます。

インバウンド エンドポイント URL

次のエンドポイントに HTTP POST リクエストを送信します。

https://ces.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/apps/APP_ID/message:send

次のように置き換えます。

  • PROJECT_ID: 実際の Google Cloud プロジェクト ID。
  • LOCATION: エージェント アプリケーションをホストするリージョン(us-central1 など)。
  • APP_ID: CX Agent Studio エージェント アプリケーションの固有識別子。

リクエスト ペイロードのスキーマ

インバウンド メッセージを送信するための JSON ペイロード構造:

{
  "message": {
    "messageId": "msg-MY_UNIQUE_MESSAGE_UUID",
    "role": "ROLE_USER",
    "content": [
      {
        "text": "Hello! I would like help checking my account balance."
      }
    ],
    "metadata": {
      "gecx_a2a_agent_context": "MY_SERIALIZED_AGENT_CONTEXT_STRING"
    }
  }
}

curl を使用したリクエストの例

curl を使用して、インバウンド メッセージングをテストできます。

curl -X POST \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
  -H "X-Goog-User-Project: PROJECT_ID" \
  -H "Content-Type: application/json" \
  -d '{
    "message": {
      "messageId": "msg-'"$(uuidgen)"'",
      "role": "ROLE_USER",
      "content": [
        {
          "text": "Hello!"
        }
      ]
    }
  }' \
  "https://ces.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/apps/APP_ID/message:send"

コンテキストと状態の管理

A2A プロトコルは、AgentContext メッセージを使用して、エージェント間の変数とセッションの状態を管理します。コンテキストは、gecx_a2a_agent_context キーを使用して SendMessageRequest のメタデータで渡されます。

変数のマッピング

タスクを委任するときに、プライマリ エージェントとリモート エージェント間で変数をマッピングできます。

  • アウトバウンド マッピング: RemoteAgentTool.input_variable_mapping は、リモート エージェントに送信される AgentContext.variables を計算します。
  • インバウンド マッピング: RemoteAgentTool.output_variable_mapping は、リモート エージェントが応答したときにプライマリ エージェントの変数を更新します。

インバウンド リクエスト(外部クライアントから CX Agent Studio)の場合、アプリケーションは gecx_a2a_agent_context メタデータを逆シリアル化し、AgentContext.variables を現在のセッションに直接書き込みます。更新された変数は、クライアントに応答するときに AgentContext.variables に書き戻されます。

セッションの終了

プライマリ エージェントは AgentContext.session_metadata.closed をモニタリングして、リモート セッションが終了するタイミングを判断します。

  • アウトバウンド リクエストでは、常に closed が false に設定されます。リモート エージェントのレスポンスで closed が true に設定されている場合、A2A 接続は終了します。
  • クライアントへのインバウンド レスポンスの場合、セッションが終了すると、CX Agent Studio アプリは closed を true に設定します。

ステートフル モード

CXAS アプリを使用したリモート セッションは常にステートフルです。プライマリ CXAS セッションとリモート CXAS セッションは同じセッション ID を共有し、リモート セッションはプライマリ エージェントとリモート エージェント間の会話履歴を保持します。

サードパーティ システムとのリモート セッションの場合、リモート セッションはデフォルトでステートレスになり、リモート エージェントはプライマリ エージェントからの各メッセージを新しいセッション(新しいコンテキスト ID)として受信します。

RemoteAgentTool.stateful_agent フィールドを有効にすると、リモート エージェントから返された最初のコンテキスト ID が自動的にキャッシュに保存され、再利用されます。

このキャッシュに保存されたコンテキスト ID は、リモート エージェントが AgentContext.session_metadata.closed == true で応答しない限り、セッションの残りの部分で使用されます。セッションが閉じると、キャッシュがリセットされ、次のツール呼び出しで新しいコンテキスト ID がキャッシュに保存されます。

リモート サブエージェントをデプロイする

Google Cloud サービスにカスタム リモート エージェントをデプロイして、CX Agent Studio のサブエージェントとして機能させることができます。

Cloud Run へのデプロイ

Agent Development Kit(ADK)で構築されたエージェントを Cloud Run でホストするには:

  1. エージェント プロジェクト ディレクトリに Dockerfile を作成します。

    FROM python:3.11-slim
    
    WORKDIR /app
    
    COPY pyproject.toml requirements.txt ./
    RUN pip install --no-cache-dir -r requirements.txt
    RUN pip install --no-cache-dir "google-adk[a2a]==1.32.0" "a2a-sdk[all]==0.3.26"
    
    COPY . .
    
    ENV PORT=8080
    ENV PYTHONUNBUFFERED=1
    
    EXPOSE 8080
    
    CMD ["python", "-m", "app.a2a_rest_server"]
    
  2. コンテナを Cloud Run にデプロイします。

    gcloud run deploy my-adk-agent \
      --project=PROJECT_ID \
      --region=us-central1 \
      --source=. \
      --memory=4Gi \
      --no-cpu-throttling
    
  3. 呼び出し元プロジェクトの CX Agent Studio サービス エージェントに、Cloud Run サービスに対する roles/run.invoker ロールを付与します。

  4. A2A プロトコル ツールを構成するの手順に沿って、Cloud Run サービスの URL を CX Agent Studio に関連付けます。

Vertex AI Agent Engine へのデプロイ

Vertex AI Agent Engine に ADK エージェントをデプロイするには:

  1. requirements.txt で依存関係を定義します。

    a2a-sdk==0.3.26
    google-adk[a2a]>=1.15.0,<2.0.0
    
  2. Vertex AI SDK を使用してエンジンをデプロイします。

    import os
    import sys
    from google.protobuf import json_format
    import vertexai
    from vertexai.agent_engines import _agent_engines
    
    sys.path.append("./")
    from app.agent_runtime_app import agent_runtime
    
    client = vertexai.Client(project="PROJECT_ID", location="us-central1")
    
    ops = agent_runtime.register_operations()
    class_methods_proto = _agent_engines._generate_class_methods_spec_or_raise(
        agent_engine=agent_runtime,
        operations=ops
    )
    class_methods_list = [
        json_format.MessageToDict(cm, preserving_proto_field_name=True)
        for cm in class_methods_proto
    ]
    
    agent_config = {
        "entrypoint_module": "app.agent_runtime_app",
        "entrypoint_object": "agent_runtime",
        "source_packages": ["app", "requirements.txt"],
        "requirements_file": "requirements.txt",
        "class_methods": class_methods_list,
        "agent_framework": "google-adk",
        "env_vars": {
            "GOOGLE_CLOUD_LOCATION": "us-central1",
        },
        "min_instances": 1,
        "max_instances": 10,
        "resource_limits": {"cpu": "4", "memory": "8Gi"},
    }
    
    engine = client.agent_engines.create(config=agent_config)
    print(f"Deployed Engine Resource Name: {engine.api_resource.name}")
    
  3. 呼び出し元プロジェクトの CX Agent Studio サービス エージェントに、ターゲット プロジェクトの roles/aiplatform.user ロールを付与します。

  4. A2A プロトコル ツールを構成するの手順に沿って、Agent Engine エンドポイントを CX Agent Studio に接続します。

サードパーティ エンドポイントに接続する

CX Agent Studio は、ServiceNow や Salesforce などの外部のサードパーティ エンドポイントにタスクを委任できます。

コンソールでツールを構成する場合:

  1. A2A プロトコル ツールを構成するの手順に沿って操作します。
  2. サードパーティ エンドポイントで必要な認証方法(API キーや OAuth など)を選択します。
  3. Secret Manager を使用して認証情報を安全に保存します。

A2A プロトコル ツールとツールとしてのエージェントの比較

CX Agent Studio には、マルチエージェント ワークフローを調整するための複数の方法が用意されています。

機能 ツールとしてのエージェント A2A プロトコル ツール
範囲 アプリケーション内(同じ CX Agent Studio アプリ内のエージェント)。 アプリケーション間(外部エージェント、リモート サービス、サードパーティ プラットフォーム)。
通信 インメモリ / 内部実行を直接行います。 A2A メッセージング標準を使用するネットワーク HTTP リクエスト。
ユースケース セッションをハンドオフせずに内部サブエージェントを再利用する。 Cloud Run、Vertex AI、または外部 API でカスタム ADK エージェントを呼び出す。
プロトコル プラットフォーム内部ツールの実行。 REST 経由の標準化された A2A JSON ペイロード。

LLM ツールの実行

内部的には、A2A プロトコル呼び出しは標準の LLM ツール呼び出しを介して動作します。

  1. A2A ツールがエージェントに割り当てられると、ツールの説明とスキル定義が関数宣言としてモデルに提供されます。
  2. モデルがサブタスクの委任を決定すると、関数呼び出しイベントが生成されます。
  3. CX Agent Studio ランタイムは、関数呼び出しをインターセプトし、パラメータを A2A HTTP リクエストに変換して、構成されたリモート エンドポイントに送信します。
  4. リモート エージェントから返されたレスポンスは、会話レスポンスの生成を続行するためにモデルに渡されます。

エージェントが呼び出し可能なツールとしてカプセル化される方法については、GitHub の ADK AgentTool の実装をご覧ください。