重要
この記事でマークされている項目 (プレビュー) は、現在パブリック プレビュー段階です。 このプレビューはサービス レベル アグリーメントなしで提供されており、運用環境のワークロードにはお勧めしません。 特定の機能がサポートされていないか、機能が制限されている可能性があります。 詳細については、「Microsoft Azure プレビューの使用条件を参照してください。
Foundry Agent Service エージェントを Agent2Agent (A2A) エンドポイントとして公開して、他のエージェントが A2A プロトコルを介して検出して呼び出すことができるようにすることができます。 着信 A2A が有効になっている場合、Foundry はエージェントのエージェント カードを発行し、外部の呼び出し元からの受信 A2A 要求を受け入れます。
Foundry Agent Service では、A2A プロトコル バージョン 1.0 と バージョン 0.3 がサポートされています。 新しい統合はバージョン 1.0 をターゲットにする必要があります。 クライアントがバージョンを選択する方法の詳細については、 A2A プロトコルのバージョンを参照してください。
サポートされているエージェントの種類
着信 A2A には応答プロトコルが必要です。 サポートされるエージェントの種類は次のとおりです。
- プロンプト エージェント- 既定で応答プロトコルをサポートします。 すべてのプロンプト エージェントを A2A エンドポイントとして公開できます。
- ホステッド エージェント— 受信 A2A は、応答プロトコルを処理するようにホストされたエージェントが構築されている場合にのみサポートします。 ホストされるエージェントが応答プロトコルを実装していない場合、それに対して受信 A2A を有効にすることはできません。
ヒント
この記事では、他のエージェントが呼び出すことができる A2A エンドポイントとしてエージェントを 公開 する方法について説明します。 エージェントがリモート A2A エンドポイントを 呼び出す には、「Foundry Agent Service から A2A エージェント エンドポイントに接続する」を参照してください。
前提 条件
アクティブな Foundry プロジェクトを含むAzure サブスクリプション。
応答プロトコル (プロンプト エージェントまたはそれをサポートするために構築されたホスト型エージェント) を使用する Foundry Agent Service にデプロイされたエージェント。
必要な Azure ロール: Foundry プロジェクト上の Foundry User 以上。
重要
Foundry RBAC ロールの名前が最近変更されました。 Foundry User, Foundry Owner, Foundry Account Owner、および Foundry Project Manager は、以前は、AZURE AI ユーザー、Azure AI 所有者、Azure AI アカウント所有者、および AZURE AI Project Manager という名前でした。 名前の変更がロールアウトされている間、以前の名前が表示される場合があります。ロール ID とコア アクセス許可は、名前の変更によって変更されません。
着信 A2A を有効にする
着信 A2A を有効にするには、エージェントの機能を説明する エージェント カード と、エージェント エンドポイントで有効になっている A2A プロトコルの 2 つのものが必要です。 両方を 1 回の PATCH 呼び出しで設定できます。 この機能は Foundry ポータルではまだ使用できません。REST API または Python SDK を使用してください。
Foundry ポータルでは、受信 A2A の有効化はまだ構成できません。 REST API または Python SDK を使用します。
A2A プロトコルのバージョン
Foundry は、両方の A2A プロトコル バージョンを同じベース パス (…/endpoint/protocols/a2a) で提供します。 通話エージェントは、次の 3 つの方法のいずれかでバージョンを選択します。
-
エージェント カード検出 (推奨) - バージョン固有のエージェント カードをフェッチします。 Foundry は、
…/agentCard/v1.0で v1.0 カードを発行し、v0.3 カードを…/agentCard/v0.3に発行します。 各カードはそのprotocolVersionを宣言します。ほとんどの A2A クライアント SDK では、そのフィールドを使用して、後続の要求に対してバージョンが自動的にネゴシエートされます。 -
HTTP ヘッダー - 要求に
A2A-Version: 1.0(またはA2A-Version: 0.3) を設定します。 -
クエリ文字列 - 要求 URL に
?a2a-version=1.0(または?a2a-version=0.3) を追加します。
重要
要求で A2A-Version ヘッダーまたは a2a-version クエリ文字列を使用してバージョンが指定されていない場合、Foundry は A2A 仕様に従って、既定で A2A v0.3 を提供します。 v1.0 を使用するには、ヘッダーを設定するか、クエリ文字列を設定するか、SDK が v1.0 を自動的にネゴシエートするようにクライアントで v1.0 エージェント カードをフェッチします。
次の表は、サポートされているバージョンをまとめたものです。
| バージョン | 地位 | 推奨対象 |
|---|---|---|
| 1.0 | サポートされています | 新しい統合 |
| 0.3 | サポートされています | v0.3 を既にターゲットとする既存の統合 |
エージェント カードを確認する
着信 A2A を有効にすると、エージェントは、呼び出し元エージェントが使用する次の URL を公開します。
A2A 基本パス- エージェントとの A2A プロトコル対話のルート URL:
https://{account}.services.ai.azure.com/api/projects/{project}/agents/{agent}/endpoint/protocols/a2aエージェント カード URL (v1.0、推奨)— エージェントの v1.0 カードを取得するために呼び出し元エージェントが使用する検出エンドポイント:
https://{account}.services.ai.azure.com/api/projects/{project}/agents/{agent}/endpoint/protocols/a2a/agentCard/v1.0エージェント カード URL (v0.3):v0.3 カードの検出エンドポイント。 A2A v0.3 を対象とするクライアントには、次の URL を使用します。
https://{account}.services.ai.azure.com/api/projects/{project}/agents/{agent}/endpoint/protocols/a2a/agentCard/v0.3
エージェント カードを 1 回作成し (前に示した agent_card PATCH 本文で)、Foundry は同じコンテンツを v1.0 と v0.3 の両方のカード図形に投影します。
重要
すべての A2A URL には、Microsoft Entra ID認証が必要です。 エージェント カードへの匿名アクセスはサポートされていません。 呼び出し元エージェントは、 Foundry プロジェクトの Foundry ユーザー ロールを持つ有効なトークンを提示する必要があります。
エージェント カードが正しく構成されていることを確認するには、v1.0 カードを直接フェッチします。
curl -X GET "$BASE_URL/agents/$AGENT_NAME/endpoint/protocols/a2a/agentCard/v1.0" \
-H "Authorization: Bearer $TOKEN"
応答には、構成した説明とスキルを含むエージェント カードが含まれています。 フィールドが目的の機能と一致していることを確認し、カードの protocolVersion フィールドが要求したバージョン パスと一致することを確認します。
受信要求の認証を構成する
受信 A2A 要求には、Microsoft Entra ID認証が必要です。 キーベースの認証と認証されていないアクセスはサポートされていません。 呼び出し元エージェントは有効なMicrosoft Entra トークンを提示する必要があり、そのトークンの背後にある ID には、エージェントをホストする Foundry プロジェクトの Foundry エージェント コンシューマー ロール (またはそれ以上) が必要です。
次の 2 つの認証パターンがサポートされています。
エンド ユーザーの代理 (OBO)
呼び出し元エージェントは、エンド ユーザーの ID を通過します。 エージェントは実際のユーザーを表すトークンを受け取るので、アクションをそのユーザーのアクセス許可にスコープ設定できます。 このパターンは、エージェントがユーザーごとのアクセス制御を適用する必要がある場合に適しています。
サービス ID (エージェント ID、サービス プリンシパル、またはマネージド ID)
呼び出し元エージェントは、プラットフォーム割り当てエージェント ID、サービス プリンシパル、またはマネージド ID のいずれか、独自の ID を使用して認証します。 エージェントには、個々のユーザーではなく、呼び出し元サービスの ID が表示されます。 このパターンは、個々のユーザー コンテキストが必要ないバックエンド エージェント間ワークフローに適しています。
呼び出し元 ID にアクセス権を付与するには、エージェントをホストする Foundry プロジェクトに Foundry エージェント コンシューマー ロールを割り当てます。 このロールは、エージェント エンドポイントと対話するための最小特権アクセスを提供します。 ロールの割り当ての詳細については、 Foundry ポータルのロールベースのアクセス制御を参照してください。
サポートされている A2A トランスポート
トランスポートのサポートは、A2A プロトコルのバージョンによって異なります。
| トランスポート | v0.3 | v1.0 |
|---|---|---|
| HTTP + JSON | ✔️ | ❌ |
| JSONRPC | ✔️ | ✔️ |
| gRPC | ❌ | ❌ |
A2A v1.0 は、Foundry の受信エンドポイント上の JSONRPC 専用です。 HTTP+ JSON を必要とするクライアントは、v0.3 を使用するか、v1.0 の JSONRPC に切り替える必要があります。
Python A2A SDK を使用して Foundry A2A エージェントに接続する
次の例は、オープン ソースの Python A2A SDK を使用して、着信 A2A が有効になっている Foundry エージェントに接続する方法を示しています。 SDK はエージェント カードから protocolVersion フィールドを読み取り、後続の要求に対応するプロトコル バージョンをネゴシエートするため、 agentCard/v1.0 でリゾルバーをポイントすると、クライアントは A2A v1.0 をエンド ツー エンドで使用します。
Foundry エージェント カードは認証を必要とし、カスタム パス (既定のagentCard/v1.0ではなく.well-known/agent-card.json) を使用するため、ベアラー トークンを使用して httpx クライアントを構成し、カスタム エージェント カードのパスをリゾルバーに渡します。
必要なパッケージをインストールします。
pip install a2a-sdk==1.0.2 azure-identity==1.25.3 httpx==0.28.1
import asyncio
import httpx
from azure.identity import DefaultAzureCredential
from a2a.client import A2ACardResolver, ClientConfig, create_client
from a2a.helpers import new_text_message
from a2a.types.a2a_pb2 import (
Role,
SendMessageRequest,
)
# Your Foundry agent's A2A base path
A2A_BASE_URL = (
"https://{account}.services.ai.azure.com/api/projects"
"/{project}/agents/{agent}/endpoint/protocols/a2a"
)
# Agent card path, relative to the A2A base URL.
AGENT_CARD_PATH = "agentCard/v1.0"
async def main():
# Get a Microsoft Entra token
credential = DefaultAzureCredential()
token = credential.get_token("https://ai.azure.com/.default").token
async with httpx.AsyncClient(
headers={"Authorization": f"Bearer {token}"},
timeout=httpx.Timeout(120.0),
) as httpx_client:
# Resolve the agent card from the custom path
resolver = A2ACardResolver(
httpx_client=httpx_client,
base_url=A2A_BASE_URL,
agent_card_path=AGENT_CARD_PATH,
)
agent_card = await resolver.get_agent_card()
# Create a non-streaming A2A client
config = ClientConfig(
streaming=False,
httpx_client=httpx_client,
)
client = await create_client(
agent=agent_card, client_config=config
)
# Send a message to the Foundry agent
message = new_text_message(
"Hello, what can you do?", role=Role.ROLE_USER
)
request = SendMessageRequest(message=message)
async for response in client.send_message(request):
print(response)
await client.close()
if __name__ == "__main__":
asyncio.run(main())
{account}、{project}、および{agent}を Foundry リソース名、プロジェクト名、およびエージェント名に置き換えます。 リゾルバーは、相対 AGENT_CARD_PATH を A2A_BASE_URLに追加することで、エージェント カードの完全な URL を構築します。
別の Foundry エージェントから接続する
A2A ツールを使用して、別の Foundry エージェントから Foundry A2A エージェントを呼び出すことができます。 このセクションでは、完全なセットアップについて説明します。ターゲット エージェントへの接続を作成してから、その接続を使用する呼び出し元エージェントを作成します。
手順 1: ターゲット エージェントへの A2A 接続を作成する
接続には、ターゲット エージェントの A2A エンドポイント URL と認証の詳細が格納されます。 Foundry エージェント ターゲットの場合は、エージェント カードのパスを設定しないでください。 Foundry は既定のエージェント カード パスを自動的に解決し、A2A プロトコル バージョンをネゴシエートします。
変数を設定します。
SUBSCRIPTION_ID="your-subscription-id"
RESOURCE_GROUP="your-resource-group"
FOUNDRY_ACCOUNT="your-foundry-account"
PROJECT_NAME="your-project"
CONNECTION_NAME="my-a2a-target"
TARGET_A2A_URL="https://{account}.services.ai.azure.com/api/projects/{project}/agents/{agent}/endpoint/protocols/a2a"
TOKEN=$(az account get-access-token \
--scope https://management.azure.com/.default \
--query accessToken -o tsv)
接続を作成します。
curl --request PUT \
--url "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.CognitiveServices/accounts/$FOUNDRY_ACCOUNT/projects/$PROJECT_NAME/connections/$CONNECTION_NAME?api-version=2025-04-01-preview" \
--header "Authorization: Bearer $TOKEN" \
--header "Content-Type: application/json" \
--data '{
"properties": {
"authType": "AgenticIdentityToken",
"category": "RemoteA2A",
"target": "'"$TARGET_A2A_URL"'",
"audience": "https://ai.azure.com",
"Credentials": {},
"metadata": {}
}
}'
その他の認証オプション (キーベース、OAuth、マネージド ID) については、「 REST API を使用して A2A 接続を作成する」を参照してください。
手順 2: A2A ツールを使用して呼び出し元エージェントを作成する
接続が存在したら、 A2APreviewTool を使用してターゲット エージェントを呼び出すエージェントを作成します。
from azure.identity import DefaultAzureCredential
from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import (
PromptAgentDefinition,
A2APreviewTool,
)
PROJECT_ENDPOINT = "your_project_endpoint"
A2A_CONNECTION_NAME = "my-a2a-target"
AGENT_NAME = "my-calling-agent"
project = AIProjectClient(
endpoint=PROJECT_ENDPOINT,
credential=DefaultAzureCredential(),
)
openai = project.get_openai_client()
a2a_connection = project.connections.get(A2A_CONNECTION_NAME)
tool = A2APreviewTool(
project_connection_id=a2a_connection.id,
)
agent = project.agents.create_version(
agent_name=AGENT_NAME,
definition=PromptAgentDefinition(
model="gpt-4.1-mini",
instructions=(
"You are a helpful assistant. Use the A2A tool "
"to delegate tasks to the target agent."
),
tools=[tool],
),
)
# Send a message and stream the response
stream_response = openai.responses.create(
stream=True,
input="Ask the target agent what it can do.",
extra_body={
"agent_reference": {
"name": agent.name,
"type": "agent_reference",
}
},
)
for event in stream_response:
if event.type == "response.output_text.delta":
print(event.delta, end="")
elif event.type == "response.completed":
print(f"\n\nCompleted: {event.response.output_text}")
# Clean up
project.agents.delete_version(
agent_name=agent.name, agent_version=agent.version
)
その他の言語の例 (C#、JavaScript、Java、REST) については、「 Foundry Agent Service から A2A エージェント エンドポイントに接続するを参照してください。
制限
- A2A プロトコル バージョン 1.0 および 0.3 がサポートされています。 その他のバージョンはサポートされていません。
- A2A v1.0 では、JSONRPC トランスポートのみがサポートされます。 v1.0 では、HTTP+JSON と gRPC はサポートされていません。 サポートされている A2A トランスポートを参照してください。
- テキスト モダリティのみがサポートされています。 ファイル データとその他の非テキスト モダリティはサポートされていません。
- ストリーミング応答 (サーバー送信イベント) はサポートされていません。
- 着信 A2A には応答プロトコルが必要です。 応答プロトコルを使用しないエージェントは、A2A エンドポイントとして公開できません。
- この機能はプレビュー段階であり、運用環境のワークロードには推奨されません。