ホストされるエージェントをデプロイする

この記事では、Azure Developer CLI (azd)、Python SDK、または REST API を使用して、コンテナー化されたエージェントを Foundry Agent Service にデプロイする方法について説明します。 記事の上部にあるセレクターを使用して、デプロイ方法を選択します。 独自のアプリケーションまたはサービスからエージェントのデプロイを直接管理する場合は、SDK または REST の方法を使用します。

初めてデプロイする場合、またはガイド付きチュートリアルが必要な場合は、「 クイック スタート: ホスト型エージェントの作成とデプロイ」を参照してください。 Azure Developer CLI (azd)VS Code 拡張機能は、ビルド、プッシュ、バージョン管理、RBAC 構成を自動的に処理します。

ヒント

Docker レスの内部ループが好きですか? また、ホストされたエージェントをソース コードから直接デプロイすることもできます。Pythonまたは.NET コードの.zipをアップロードし、プラットフォームがビルドしてホストします。

GitHub Copilotなどのコーディング エージェントを使用する場合、Microsoft Foundry Skill は、コンテナーのデプロイ フローの計画、azdコマンドの準備、SDK または REST の手順をプロジェクトに接続するのに役立ちます。

デプロイのライフサイクル

すべてのホステッド エージェントの展開は、次の順序に従います。

  1. ビルドとプッシュ - エージェント コードをコンテナー イメージにパッケージ化し、Azure Container Registryにプッシュします。
  2. エージェント バージョンを作成する - Foundry Agent Service にイメージを登録します。 プラットフォームはインフラストラクチャをプロビジョニングし、専用の Entra エージェント ID を作成します。
  3. ステータスをポーリングする - バージョンのステータスが active に達するまで待ちます。
  4. 呼び出し - エージェントの専用エンドポイントに要求を送信します。

前提 条件

必要なアクセス許可

ホストされたエージェントをデプロイするには、プロジェクト スコープのFoundry Project Managerロールが必要です。 このロールは、エージェントを作成および更新するためのデータ プレーンアクセス許可と、必要に応じてプラットフォームで作成されたエージェント ID のロール割り当てを作成する機能を付与します。 関連するアクセス許可の詳細な内訳については、 ホストされているエージェントのアクセス許可のリファレンスを参照してください

重要

Foundry RBAC ロールの名前が最近変更されました。 Foundry User, Foundry Owner, Foundry Account Owner、および Foundry Project Manager は、以前は、AZURE AI ユーザー、Azure AI 所有者、Azure AI アカウント所有者、および AZURE AI Project Manager という名前でした。 名前の変更がロールアウトされている間、以前の名前が表示される場合があります。ロール ID とコア アクセス許可は、名前の変更によって変更されません。

プラットフォームは、デプロイ時にホストされるエージェントごとに専用のMicrosoft Entra エージェント ID を作成します。 この ID は、実行中のコンテナーがモデルとツールを呼び出すために使用するサービス プリンシパルです。 マネージド ID を手動で構成する必要はありません。 エージェント ID は、既定でプロジェクト エンドポイントとセッション ストレージを介してモデル推論にアクセスできます。 外部リソース (独自のAzure Storageなど) の場合は、エージェントのMicrosoft Entra IDに RBAC ロールを手動で割り当てます。 詳細については、 既定以外のエージェント アクセスに関するページを参照してください。

azdまたは VS Code 拡張機能を使用する場合、ツールは、プロジェクトマネージド ID (イメージ プル) の Container Registry Repository Reader など、ほとんどの RBAC 割り当てを自動的に処理します。

詳細については、「 認証と承認」を参照してください。

重要

ホストされたエージェントのAzure Container Registryをプライベート ネットワークの背後 (パブリック ネットワーク アクセスが無効なプライベート エンドポイント) の背後に配置するためのサポートは、Foundry プロジェクトが作成された日時によって異なります。 2026 年 6 月 25 日以降に作成されたプロジェクトでは、プライベート レジストリがサポートされます。 その日付より前に作成されたプロジェクトでは、プラットフォームがイメージをプルできるように、レジストリにパブリック エンドポイント経由で到達できる必要があります。 既存のプロジェクトは影響を受けません。 ネットワーク制約の完全な一覧については、「 制限事項」を参照してください。

コンテナーの要件

ホストされるエージェント プラットフォームで実行するには、コンテナー イメージが次の要件を満たしている必要があります。

重要

ホスティング プラットフォームには、x86_64 (linux/amd64) コンテナー イメージが必要です。 Apple Silicon またはその他の ARM ベースのマシン上に構築する場合は、互換性のない ARM イメージが生成されないように、 docker build --platform linux/amd64 . を使用します。

プロトコル ライブラリ

ホストされるエージェントは、プロトコル ライブラリを介して Foundry ゲートウェイと通信します。 エージェントの対話パターンに一致するプロトコルを選択します。

プロトコル Python ライブラリ .NET ライブラリ エンドポイント 〜に最適です
応答 azure-ai-agentserver-responses Azure.AI.AgentServer.Responses /responses 会話型チャットボット、ストリーミング、プラットフォームで管理された履歴を含むマルチターン
呼び出し azure-ai-agentserver-invocations Azure.AI.AgentServer.Invocations /invocations Webhook レシーバー、非会話処理、カスタム非同期ワークフロー
呼び出し (WebSocket) azure-ai-agentserver-invocations Azure.AI.AgentServer.Invocations /invocations_ws 双方向ストリーミング: リアルタイム音声エージェント、対話型メディア

WebSocket プロトコルは、識別子invocations_wsを使用し、HTTP azure-ai-agentserver-invocations ルートと同じ/invocations パッケージに付属しているため、1 つのコンテナーで両方を処理できます。 永続的な全二重ストリーミングが必要な場合に使用します。たとえば、マイク PCM をエージェントに送信し、合成されたオーディオを受信します。 音声シナリオについては、 ホストされたエージェントを使用した音声エージェントの構築に関するページを参照してください。

エージェントの作成時protocols サービスの azure.ai.agent フィールド、SDK 呼び出し、または REST API 要求で複数のプロトコルを宣言し、必要なライブラリをインポートすることで、1 つのコンテナーで複数のプロトコルを同時に公開できます。 Microsoft Agent Framework、LangChain、カスタム コードのいずれであっても、既存のフレームワーク内でプロトコル ライブラリを使用します。

応答プロトコル ライブラリ

Responses プロトコルのPythonライブラリと.NET ライブラリは、Azure AI Responses API を実装します。 パッケージをインポートし、応答ハンドラーを実装します。 ライブラリは、ルーティング、サーバー送信イベント (SSE) によるストリーミング、バックグラウンド実行、キャンセル、キャッシュ、応答ライフサイクル管理を処理します。

ハンドラーを実装する

ハンドラーは、実装するコア抽象化です。 ライブラリは、受信要求ごとに呼び出し、返されたイベントを SSE 経由でクライアントに配信します。 Pythonでは、非同期関数を@app.response_handlerで装飾します。

from azure.ai.agentserver.responses import (
    CreateResponse,
    ResponseContext,
    ResponsesAgentServerHost,
    TextResponse,
)

app = ResponsesAgentServerHost()


@app.response_handler
async def handler(
    request: CreateResponse,
    context: ResponseContext,
    _cancellation_signal,
):
    user_input = await context.get_input_text() or ""
    return TextResponse(context, request, text=f"Echo: {user_input}")

イベントとライフサイクルの自動管理

ライブラリはイベント シーケンス (シーケンス番号、出力インデックス、コンテンツ インデックス、項目 ID) と完全な応答ライフサイクルを自動的に管理するため、この状態は自分で追跡しません。 ハンドラーによって生成される各イベントは、ホスト フレームワークによって管理される SSE イベントに 1 対 1 でマップされます。

ストリーミング モードとバックグラウンド モード

  • ストリーミング モード (既定): SSE イベントは、接続されているクライアントにリアルタイムで配信されます。
  • バックグラウンド モード: ハンドラーは、接続された SSE クライアントなしで完了まで実行されます。 イベントはバッファーに格納され、 GET /responses/{id}経由で再生できます。

応答のライフサイクル

ライブラリは、 created ->in_progress ->completed (または failed または cancelled) の完全な応答ライフサイクルを調整します。 ライブラリでは、取り消し、エラー処理、およびターミナル イベントの保証も自動的に管理されます。

スレッドセーフティ

ハンドラー インスタンスは要求ごとにスコープが設定されるため、要求ごとの状態は要求間でリークしません。 ライブラリは、同時実行要求を安全に処理します。

実行可能な例については、Python独自のサンプルを参照してください

ヘルスエンドポイント

プロトコル ライブラリは、プラットフォームの正常性チェック用の /readiness エンドポイントを自動的に公開します。 これを自分で実装する必要はありません。

ポート

コンテナーは、ポート 8088 のトラフィックをローカルで処理します。 運用環境では、Foundry ゲートウェイがルーティングを処理します。コンテナーでパブリック ポートを公開する必要はありません。

プラットフォームによって挿入された環境変数

ホストされるエージェント プラットフォームは、実行時に環境変数をコンテナーに自動的に挿入します。 コードは、envまたは SDK および REST 環境変数の設定で、azure.ai.agent サービスのazure.yaml マップで宣言せずに、これらの変数を読み取ることができます。 FOUNDRY_* プレフィックスは、プラットフォームで使用するために予約されています。

変数 目的
FOUNDRY_PROJECT_ENDPOINT Foundry プロジェクト エンドポイント URL
FOUNDRY_PROJECT_ARM_ID Foundry プロジェクトの ARM リソース ID
FOUNDRY_AGENT_NAME 実行中のエージェントの名前
FOUNDRY_AGENT_VERSION 実行中のエージェントのバージョン
FOUNDRY_AGENT_SESSION_ID 現在の要求のセッション ID (ホストされているコンテナーのみ)
APPLICATIONINSIGHTS_CONNECTION_STRING テレメトリ用の Application Insights 接続文字列

プラットフォームによって挿入された変数を azure.yaml で再宣言しないでください。これらは自動的に設定されます。

MODEL_DEPLOYMENT_NAMEやツールボックスの MCP エンドポイントなど、自分で宣言した変数は、envまたは SDK azure.ai.agent呼び出しのazure.yaml サービスのcreate_version マップに移動します。

重要

ホストされたエージェントを Foundry Agent Service にデプロイすると、プラットフォームによって Application Insights 接続文字列が環境変数としてエージェント コンテナーに自動的に挿入され、既定で OpenTelemetry トレースが有効になります。 分散トレース、要求、依存関係を表示するには、Azure ポータルでセットアップ中にプロビジョニングされた Application Insights リソースを開き、>トランザクション検索またはパフォーマンスの調査に移動します。 ライブ コンソール ログには azd ai agent monitor を使用します。 AppInsights が有効になっている場合、このプロジェクトはトレースをログに記録して、エージェントとのユーザー レベルの対話を監視および評価するのに役立ちます。 AppInsights でLog Analytics閲覧者ロールを持つProjectメンバーは、個人データや顧客コンテンツを含む可能性のあるトレース データを表示できます。 基になるLog Analytics テーブルが保護されている場合、メンバーは代わりに、そのトレース データを表示するために特権監視データ閲覧者ロールを必要とします。 収集されるトレース データと、このデータを表示して使用できるユーザーを確認します。 Azure Monitor App Insights の追加料金が適用される場合があります。 詳細については、こちらを参照してください

環境変数でのプロジェクト接続の参照

シークレット (API キー、トークン、エンドポイント) を azure.yaml またはイメージにハードコーディングする代わりに、サンドボックスの開始時に Foundry プロジェクト接続からシークレットをプルします。 環境変数として宣言する値は、コンテナーの開始前にプラットフォームが解決するプレースホルダー式にすることができます。

プレースホルダー構文

プレースホルダーには${{connections.<name>.<path>}}という形式があり、<name>は接続のリソース名 (ポータルの [管理>Project詳細>接続されたリソースに表示されます) であり、<path>は次のいずれかです。

Path 結果
credentials.<field> 接続のシークレット フィールド
target 接続の target プロパティ (エンドポイント URL など)
metadata.<field> 接続の metadata の下にあるフィールド

使用するフィールド名は、接続カテゴリによって異なります。

接続カテゴリ プレースホルダーのフィールド名
ApiKeyAppInsights 常に key--例: credentials.key
CustomKeys 接続の作成時に指定したキー名(例: credentials.github_token

まず、シークレットを保持する CustomKeys 接続をプロジェクトに作成します。 Microsoft Foundry で新しい接続を追加する を参照してください。 次に、envazure.ai.agent サービス内の azure.yaml マップからそれを参照します。

services:
  my-agent:
    host: azure.ai.agent
    env:
      MODEL_DEPLOYMENT_NAME: gpt-5-mini
      GITHUB_TOKEN: ${{connections.agent-secrets.credentials.github_token}}

サンドボックスの開始時に、Foundry はプレースホルダーを解決し、解決された値をプレーン環境変数として挿入します。 コードは、他の環境変数と同様に読み取ります。

import os
token = os.environ["GITHUB_TOKEN"]

エージェント バージョンの GET は、リテラル ${{...}} テキストを返します。解決されたシークレットは、管理 API を介してエコー バックされることはありません。

Considerations

  • バージョンをデプロイする前に、接続を作成します。 サンドボックスの開始時に接続または参照先フィールドが見つからない場合、プレースホルダーは解決せず、変数は空になります。
  • シークレットは書き込み専用です。 接続の GET は credentials: nullを返します。 接続を検査することではなく、実行中のコンテナー内から env var を読み取って解決を確認します。
  • フィールド名CustomKeysは自分で記録してください。 管理 API では、作成後にエコーバックされることはありません。 後で推測せずにプレースホルダーを作成できるように、エージェント ソースの横 (IaC テンプレートや azure.yaml と共に) に保持します。
  • Foundry は、基盤となるシークレットの名前を管理します。 接続を作成すると、Foundry は選択した名前の下のKey Vaultに値を格納します。既存のKey Vaultシークレットを名前で参照することはできません。 バッキング ストアとして独自のKey Vaultをアタッチするには、「Key Vault接続を設定するを参照してください。

エージェントをローカルでパッケージ化してテストする

Foundry にデプロイする前に、エージェントがプロトコル ライブラリを使用してローカルで動作することを検証します。 コンテナーは、運用環境と同じエンドポイントをローカルで処理します。

応答プロトコルをテストする

POST http://localhost:8088/responses
Content-Type: application/json

{
    "input": "Where is Seattle?",
    "stream": false
}

呼び出しプロトコルをテストする

POST http://localhost:8088/invocations
Content-Type: application/json

{
    "message": "Hello!"
}

Azure Developer CLI または VS Code を使用してデプロイする

Azure Developer CLI (azd) と Microsoft Foundry Toolkit for Visual Studio Codeは、コンテナーの構築、Azure Container Registryへのプッシュ、エージェント バージョンの作成、RBAC ロールの割り当てなど、デプロイ ライフサイクル全体を自動化します。 ガイド付き初めてのチュートリアルについては、「 クイック スタート: ホスト型エージェントの作成とデプロイ」を参照してください。

1 つのコマンドでデプロイする

エージェント プロジェクト ディレクトリから、インフラストラクチャをプロビジョニングし、1 つの手順でデプロイします。

azd up

azd upazd provisionを組み合わせて、Foundry プロジェクト、モデル デプロイ、コンテナー レジストリ、Application Insights、マネージド ID を azd deployと共に作成します。 初めてのデプロイ、またはインフラストラクチャとエージェントのコードの両方を変更する場合に使用します。

コードの変更のみをデプロイする

Azure リソースを既にプロビジョニングしていて、新しいエージェント バージョンをプッシュするだけで済む場合:

azd deploy

azd deploy中、CLI は次の処理を行います。

  1. ローカル Docker を必要としないため、Azure Container Registryでコンテナー イメージをリモートでビルドします。
  2. イメージをレジストリにプッシュします。
  3. Foundry Agent Service でホストされるエージェント バージョンを作成します。
  4. 専用のMicrosoft Entra エージェント ID を作成し、エージェントがモデルとツールにアクセスするために必要な RBAC ロールを割り当てます。

バージョンの管理

azd deploy は、エージェントの新しいバージョンを作成します。 CLI では以前のバージョンが保持され、最新バージョンは既定でアクティブになっています。

デプロイメントを確認する

azd ai agent show

出力には、エージェント名、バージョン、プロトコル、コンテナー リソース、環境変数、作成タイムスタンプが含まれます。 概要ビューには --output table を使用します。

イメージをローカルでビルドする

既定では、azdはAzure Container Registryでリモートでコンテナー イメージをビルドします。 イメージをローカルでビルドするには、remoteBuild: falseazure.yamlを設定します。 ローカル ビルドには Docker Desktop が必要です。

コンテンツの安全性ポリシーに対するプロンプトと応答を表示するには、 エージェントにコンテンツ セーフティ ガードレールを追加します

Python SDK を使用してデプロイする

エージェントのデプロイをコードから直接管理する場合は、SDK Python使用します。

その他の前提条件

  • Python 3.10 以降

  • Azure Container Registry のコンテナー イメージ

  • コンテナー レジストリのリポジトリ ライター または AcrPush 役割 (イメージをプッシュするための役割)

  • Azure AI Projects SDK バージョン 2.3.0 以降

    pip install "azure-ai-projects>=2.3.0"
    

コンテナー イメージをビルドしてプッシュする

  1. Docker イメージをビルドします。

    docker build --platform linux/amd64 -t myagent:v1 .
    

    Python および C# の Dockerfile のサンプルを参照してください。

  2. Azure Container Registryにプッシュする:

    az acr login --name myregistry
    docker tag myagent:v1 myregistry.azurecr.io/myagent:v1
    docker push myregistry.azurecr.io/myagent:v1
    

ヒント

再現可能なデプロイには、 :latest の代わりに一意のイメージ タグを使用します。

コンテナー レジストリのアクセス許可を構成する

プロジェクトのマネージド ID にプル イメージへのアクセス権を付与します。

  1. Azure ポータルで、Foundry プロジェクト リソースに移動します。

  2. Identity を選択し、システム割り当て済み の下にあるオブジェクト (プリンシパル) ID をコピーします。

  3. コンテナー レジストリのリポジトリ閲覧者ロールを、コンテナー レジストリのこの ID に割り当てます。 Azure Container Registryのロールとアクセス許可についてご参照ください。

ホストされるエージェントのバージョンを作成する

バージョンを作成すると、プラットフォームによってエージェントが自動的にプロビジョニングされます。 別の開始手順はありません。 プラットフォームによってコンテナー スナップショットが作成され、エージェントが要求を処理する準備が整います。

from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import (
    AgentEndpointProtocol,
    ContainerConfiguration,
    HostedAgentDefinition,
    ProtocolVersionRecord,
)
from azure.identity import DefaultAzureCredential

# Format: "https://resource_name.services.ai.azure.com/api/projects/project_name"
PROJECT_ENDPOINT = "your_project_endpoint"

# Create project client
credential = DefaultAzureCredential()
project = AIProjectClient(
    endpoint=PROJECT_ENDPOINT,
    credential=credential,
)

# Create a hosted agent version
agent = project.agents.create_version(
    agent_name="my-agent",
    definition=HostedAgentDefinition(
        protocol_versions=[
            ProtocolVersionRecord(protocol=AgentEndpointProtocol.RESPONSES, version="1.0.0")
        ],
        cpu="1",
        memory="2Gi",
        container_configuration=ContainerConfiguration(
            image="your-registry.azurecr.io/your-image:tag"
        ),
        environment_variables={
            "MODEL_DEPLOYMENT_NAME": "gpt-5-mini"
        },
    )
)

print(f"Agent created: {agent.name}, version: {agent.version}")

両方のプロトコルを公開するには、両方を protocol_versions渡します。

protocol_versions=[
    ProtocolVersionRecord(protocol=AgentEndpointProtocol.RESPONSES, version="1.0.0"),
    ProtocolVersionRecord(protocol=AgentEndpointProtocol.INVOCATIONS, version="1.0.0"),
    ProtocolVersionRecord(protocol=AgentEndpointProtocol.INVOCATIONS_WS, version="1.0.0"),
],

キー パラメーター:

パラメーター 説明
agent_name 一意の名前 (ハイフン付きの英数字、最大 63 文字)
container_configuration.image 完全な Azure Container Registry イメージのURLとタグ
cpu CPU の割り当て (たとえば、 "1")
memory メモリの割り当て (たとえば、 "2Gi")
protocol_versions コンテナーが公開するプロトコル (responsesinvocations、またはその両方)

セッション コンピューティングがアイドル状態になったときに設定するには、「 セッションのアイドル状態を管理する」を参照してください。

バージョンのステータスを確認する

バージョンを作成した後、エージェントを呼び出す前に状態が active されるまでポーリングします。 通常、プロビジョニングにはイメージ サイズに応じて 1 分未満かかります。

import time

# Poll until the agent version is active
while True:
    version_info = project.agents.get_version(
        agent_name="my-agent",
        agent_version=agent.version
    )
    status = version_info["status"]
    print(f"Status: {status}")

    if status == "active":
        print("Agent is ready!")
        break
    elif status == "failed":
        print(f"Provisioning failed: {version_info['error']}")
        break

    time.sleep(5)

バージョンの状態の値:

ステータス 説明
creating インフラストラクチャのプロビジョニングが進行中
active エージェントは要求を処理する準備ができています
failed プロビジョニングに失敗しました - error フィールドで詳細を確認する
deleting バージョンがクリーンアップされています
deleted バージョンが完全に削除されました

エージェントを呼び出す

バージョンが active 状態になったら、 get_openai_client を使用して、エージェントのエンドポイントにバインドされた OpenAI クライアントを作成します。

応答プロトコルについて

# Create an OpenAI client bound to the agent endpoint
openai_client = project.get_openai_client(agent_name="my-agent")

response = openai_client.responses.create(
    input="Hello! What can you do?",
)

print(response.output_text)

呼び出しプロトコルの場合は、呼び出しエンドポイントを直接呼び出します。

import requests

token = credential.get_token("https://ai.azure.com/.default").token
url = f"{PROJECT_ENDPOINT}/agents/my-agent/endpoint/protocols/invocations"

response = requests.post(url, headers={
    "Authorization": f"Bearer {token}",
    "Content-Type": "application/json",
}, params={"api-version": "v1"}, json={
    "message": "Process this task"
})

print(response.json())

詳細な例については、 ホストされるエージェントのサンプルを参照してください。

JavaScript/TypeScript SDK を使用してデプロイする

エージェントのデプロイをコードから直接管理する場合は、SDK Node.js 使用します。 SDK 呼び出し元は Node.jsで実行されますが、コンテナー イメージ自体は、応答または呼び出しプロトコル ライブラリを使用して構築されたPythonまたは.NETエージェント コードを実行します。Node.js ホストされたエージェント ランタイムはありません。

その他の前提条件

  • Node.js 22 以降

  • Azure Container Registry のコンテナー イメージ

  • コンテナー レジストリのリポジトリ ライター または AcrPush 役割 (イメージをプッシュするための役割)

  • @azure/ai-projectsパッケージと@azure/identity パッケージ

    npm install @azure/ai-projects @azure/identity
    

開始する前に、コンテナー イメージをビルドしてAzure Container Registryにプッシュし (Docker コマンドなど、Python タブを参照)、プロジェクトマネージド ID にレジストリの Container Registry Repository Reader ロールを付与します。

ホストされるエージェントのバージョンを作成する

バージョンを作成すると、プラットフォームによってエージェントが自動的にプロビジョニングされます。 別の開始手順はありません。 プラットフォームによってコンテナー スナップショットが作成され、エージェントが要求を処理する準備が整います。

import { AIProjectClient } from "@azure/ai-projects";
import { DefaultAzureCredential } from "@azure/identity";

// Format: "https://resource_name.services.ai.azure.com/api/projects/project_name"
const projectEndpoint =
  process.env["FOUNDRY_PROJECT_ENDPOINT"] || "your_project_endpoint";
const agentName = "my-agent";

const project = new AIProjectClient(
  projectEndpoint,
  new DefaultAzureCredential(),
);

// Create a hosted agent version
const agent = await project.agents.createVersion(agentName, {
  kind: "hosted",
  cpu: "1",
  memory: "2Gi",
  container_configuration: {
    image: "your-registry.azurecr.io/your-image:tag",
  },
  protocol_versions: [{ protocol: "responses", version: "1.0.0" }],
  environment_variables: { MODEL_DEPLOYMENT_NAME: "gpt-5-mini" },
});

console.log(`Agent created: ${agent.name}, version: ${agent.version}`);

両方のプロトコルを公開するには、両方を protocol_versions渡します。

protocol_versions: [
  { protocol: "responses", version: "1.0.0" },
  { protocol: "invocations", version: "1.0.0" },
  { protocol: "invocations_ws", version: "1.0.0" },
],

バージョンのステータスを確認する

バージョンを作成した後、エージェントを呼び出す前に状態が active されるまでポーリングします。 通常、プロビジョニングにはイメージ サイズに応じて 1 分未満かかります。

function sleep(ms: number) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

// Poll until the agent version is active
for (;;) {
  const versionInfo = await project.agents.getVersion(
    agentName,
    agent.version,
  );
  console.log(`Status: ${versionInfo.status}`);
  if (versionInfo.status === "active") {
    break;
  }
  if (versionInfo.status === "failed") {
    console.log(`Provisioning failed: ${versionInfo.error}`);
    break;
  }
  await sleep(5_000);
}

エージェント エンドポイントをルーティングして呼び出す

エージェント エンドポイントを作成したバージョンにルーティングし、OpenAI クライアントをエンドポイントにバインドします。

応答プロトコルについて

await project.agents.patchAgentObject(agentName, {
  agentEndpoint: {
    version_selector: {
      version_selection_rules: [
        {
          type: "FixedRatio",
          agent_version: agent.version,
          traffic_percentage: 100,
        },
      ],
    },
    protocol_configuration: { responses: {} },
  },
});

// Create an OpenAI client bound to the agent endpoint
const openAIClient = project.getOpenAIClient({
  azureConfig: { allowPreview: true, agentName },
});

const response = await openAIClient.responses.create({
  input: "Hello! What can you do?",
});
console.log(response.output_text);

呼び出しプロトコルの場合は、呼び出しエンドポイントを直接呼び出します。

const credential = new DefaultAzureCredential();
const token = await credential.getToken("https://ai.azure.com/.default");
if (!token) {
  throw new Error("Failed to acquire an access token.");
}
const url = `${projectEndpoint}/agents/my-agent/endpoint/protocols/invocations`;

const response = await fetch(`${url}?api-version=v1`, {
  method: "POST",
  headers: {
    Authorization: "Bearer " + token.token,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ message: "Process this task" }),
});
console.log(await response.json());

リファレンス: AIProjectClient

REST API を使用してデプロイする

HTTP ベースの直接デプロイやカスタム ツールとの統合に REST API を使用します。

開始する前に、コンテナー イメージをビルドしてAzure Container Registryにプッシュし、プロジェクトマネージド ID にレジストリの Container Registry Repository Reader ロールを付与します。

変数を設定する

BASE_URL="https://{account}.services.ai.azure.com/api/projects/{project}"
API_VERSION="v1"
TOKEN=$(az account get-access-token --resource https://ai.azure.com --query accessToken -o tsv)

エージェントを作成する

curl -X POST "$BASE_URL/agents?api-version=$API_VERSION" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "my-agent",
    "definition": {
      "kind": "hosted",
      "container_configuration": {
        "image": "myacr.azurecr.io/my-agent:v1"
      },
      "cpu": "1",
      "memory": "2Gi",
      "protocol_versions": [
        {"protocol": "responses", "version": "1.0.0"}
      ],
      "environment_variables": {
        "MODEL_DEPLOYMENT_NAME": "gpt-5-mini"
      }
    }
  }'

エージェントを作成すると、バージョン 1 も作成され、プロビジョニングがトリガーされます。

セッション コンピューティングがアイドル状態になったときに設定するには、「 セッションのアイドル状態を管理する」を参照してください。

コンテンツの安全性ポリシーに対するプロンプトと応答を画面に表示するには、rai_configdefinition オブジェクトを含めます。 ホストされるエージェントにコンテンツ セーフティ ガードレールを追加するを参照してください。

バージョンのステータスを確認する

statusactiveされるまで、バージョン エンドポイントをポーリングします。

while true; do
  STATUS=$(curl -s -X GET "$BASE_URL/agents/my-agent/versions/1?api-version=$API_VERSION" \
    -H "Authorization: Bearer $TOKEN" | jq -r '.status')
  echo "Status: $STATUS"
  [ "$STATUS" = "active" ] && echo "Ready!" && break
  [ "$STATUS" = "failed" ] && echo "Provisioning failed." && exit 1
  sleep 5
done

エージェントを呼び出す

エージェントの専用エンドポイントを使用して要求を送信します。 サーバー送信イベントを受信するように "stream": true を設定します。

応答プロトコル:

curl -X POST "$BASE_URL/agents/my-agent/endpoint/protocols/openai/responses?api-version=$API_VERSION" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "input": "Hello! What can you do?",
    "store": true
  }'

呼び出しプロトコル:

curl -X POST "$BASE_URL/agents/my-agent/endpoint/protocols/invocations?api-version=$API_VERSION" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "message": "Process this task"
  }'

新しいバージョンを作成する

新しいバージョンを作成して、更新されたコードまたは構成をデプロイします。

curl -X POST "$BASE_URL/agents/my-agent/versions?api-version=$API_VERSION" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "definition": {
      "kind": "hosted",
      "container_configuration": {
        "image": "myacr.azurecr.io/my-agent:v2"
      },
      "cpu": "1",
      "memory": "2Gi",
      "protocol_versions": [
        {"protocol": "responses", "version": "1.0.0"}
      ],
      "environment_variables": {
        "MODEL_DEPLOYMENT_NAME": "gpt-5-mini"
      }
    }
  }'

リソースのクリーンアップ

料金の発生を防ぐために、処理が完了したらリソースをクリーンアップします。 プラットフォームは、構成されたアイドル タイムアウト (既定では 15 分) 後にエージェント コンピューティングのプロビジョニングを解除するため、エージェントが要求を処理していない場合はコストは発生しません。

Azure Developer CLI のクリーンアップ

azd down

SDK のクリーンアップ

1 つのバージョンを削除します。

project.agents.delete_version(agent_name="my-agent", agent_version=agent.version)

または、エージェント全体とそのすべてのバージョンを削除します。 エージェントを呼び出した直後など、アクティブなセッションを連鎖削除するには、 force=True を使用します。エージェントを呼び出さないと、セッションがアクティブな間に競合エラーが発生して呼び出しが失敗します。

project.agents.delete(agent_name="my-agent", force=True)

SDK のクリーンアップ

1 つのバージョンを削除します。

await project.agents.deleteVersion("my-agent", agent.version);

または、エージェント全体とそのすべてのバージョンを削除します。

await project.agents.delete("my-agent", { force: true });

リファレンス: AIProjectClient

REST API のクリーンアップ

1 つのバージョンを削除します。

curl -X DELETE "$BASE_URL/agents/my-agent/versions/1?api-version=$API_VERSION" \
  -H "Authorization: Bearer $TOKEN"

または、エージェント全体を削除します。

curl -X DELETE "$BASE_URL/agents/my-agent?api-version=$API_VERSION" \
  -H "Authorization: Bearer $TOKEN"

警告

エージェントを削除すると、そのバージョンがすべて削除され、アクティブなセッションが終了します。 この操作を元に戻すことはできません。

トラブルシューティング

プロビジョニング エラーは、バージョン オブジェクトの error.code フィールドと error.message フィールドに表示されます。 作成後にバージョンの状態を確認して、問題を特定します。

エラー コード HTTP コード ソリューション
image_pull_failed 400 イメージ URI を確認します。 プロジェクトのマネージド ID に、ACR で Container Registry Repository Reader が割り当てられており、レジストリの azureADAuthenticationAsArmPolicy ポリシーの状態が enabled であることを確認してください。
SubscriptionIsNotRegistered 400 サブスクリプション プロバイダーを登録する
InvalidAcrPullCredentials 401 マネージド ID またはレジストリ RBAC を修正する
UnauthorizedAcrPull 403 正しい資格情報または ID を指定する
AcrImageNotFound 404 イメージ名/タグを修正するか、イメージを発行する
RegistryNotFound 400/404 レジストリ DNS またはネットワークの到達可能性を修正する

5xx エラーについては、Microsoftサポートにお問い合わせください。

RBAC の要件とアクセス許可のトラブルシューティングの詳細については、 ホストされるエージェントのアクセス許可のリファレンスを参照してください

次の手順