ソース コードからホストされたエージェントをデプロイする

この記事では、コンテナー イメージをビルドしたりプッシュしたりせずに、foundry Agent Service に Hosted agent をPythonまたは.NETソース コードからデプロイする方法について説明します。 コードの .zip (および必要に応じて依存関係) をアップロードすると、Agent Service はそれを as-is 実行するか、クラウドで依存関係を構築します。

Tip

ほとんどのシナリオでは、Azure Developer CLI (azd) または Foundry Toolkit for VS Code を使用してデプロイします。 これらのツールは、ソースのパッケージ化、アップロード、 activeのポーリング、ロールベースのアクセス制御の自動構成を行います。 開始するには、「クイック スタート: 最初のホストされたエージェントをデプロイする」に従い、デプロイ方法の入力を求められたらコード (またはソース コード (ZIP アップロード)) を選択します。

独自のアプリケーションで Python SDK または .NET SDK から、またはカスタム ツール、言語に依存しない自動化、または既存の継続的デリバリー システムとの統合のために REST API 経由でソース コード エージェントをプログラムでデプロイする必要がある場合は、この記事の SDK と REST の手順を使用します。 この記事では、次のタスクを完了します。

  • 依存関係解決モードを選択し、ソースをパッケージ化します。
  • エージェントを作成し、エージェントが activeに到達するまで待ってから呼び出します。
  • デプロイされたエージェントのログを更新、バージョン管理、ダウンロード、ストリーム配信します。

ランタイム イメージを完全に制御する必要がある場合、または既に動作する Dockerfile がある場合は、コンテナー ベースのパスを使用します。 ホストされたエージェントをデプロイします。

GitHub Copilotなどのコーディング エージェントを使用してソース コードをパッケージ化してデプロイする場合、Microsoft Foundry Skill はプロジェクトを準備し、必要なazd、SDK、または REST の手順に従うのに役立ちます。

Prerequisites

  • Python 3.13 以降のpipを使用して、ソースをローカルにパッケージ化します。

  • azure-ai-projects バージョン 2.2.0 以降およびazure-identity パッケージ。

    pip install "azure-ai-projects>=2.2.0" azure-identity
    

サポートされているランタイム

エージェント定義の code_configuration.runtime フィールドには、次の値を指定できます。 zip に含まれるバイナリに対応するランタイムを選択します。Python の場合は Linux x86_64 ホイール、.NET の場合は TargetFramework 出力の dotnet publish を選択します。

Language ランタイム値
Python python_3_13python_3_14
.NET dotnet_10

言語バージョンのサポート ポリシー

エージェント サービス ランタイムには、 code_configuration.runtimeの値ごとにプラットフォームで構築されたコンテナー イメージが含まれています。 デプロイされたエージェントを完全にサポートし続けるために、Foundry はホストされるエージェント言語のサポートを、各言語のサポート終了に合わせて調整します。 サポートは、言語バージョンのコミュニティのサポート終了日に終了します。 Microsoft は、プラットフォームの制約(基盤となるベース イメージなど)により必要な場合、code_configuration.runtime 値を予定より早く廃止することがあります。

アップストリームのサポート終了スケジュールについては、以下を参照してください。

提供終了フェーズ

言語の有効期限が切れた後も、廃止されたランタイム値を使用するホストされたエージェントを作成、更新、実行できます。 ただし、これらのエージェントは、現在の code_configuration.runtime 値を設定して再デプロイすることによって、サポートされているランタイムにアップグレードするまで、サポート、新機能、またはセキュリティ パッチの対象になりません。

必要なアクセス許可

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

Important

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

エージェントは、ユーザー ID とは別のプラットフォーム割り当てマネージド ID として実行されます。 この ID は、既定でプロジェクト エンドポイントとセッション ストレージを介してモデル推論にアクセスできます。 外部リソース (独自のAzure Storageなど) の場合は、エージェントのMicrosoft Entra IDに RBAC ロールを手動で割り当てます。 詳細については、 既定以外のエージェント アクセスに関するページを参照してください。

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

ソースコードの展開は、すべて同じ手順で行われます: パッケージ化 - > 作成または更新 - >ポーリングactive - >呼び出し。 ソース コード パスは、エージェント定義で code_configuration を使用します。 イメージ ベースのパスでは、代わりに container_configuration が使用されます。 これら 2 つのオプションは、1 つのバージョンでは相互に排他的です。

ワークフローに合ったパスを選択します。 不明な場合は、Azure Developer CLI または VS Code から始めます。これは、ほとんどのお客様に推奨されるパスです。

経路 最適な用途 梱包
Azure Developer CLI または VS Code ほとんどのデプロイ(初回のデプロイや最速のインナーループを含む)。 ツールが ZIP ファイルを作成してアップロードしてくれます。
Python SDK Python アプリまたは自動化からのプログラムによるデプロイ。 zip をビルドします。SDK によってアップロードされます。
.NET SDK .NET アプリまたは自動化からのプログラムによるデプロイ。 SDK によってフォルダーが圧縮されます。
JavaScript/TypeScript SDK Node.js アプリまたは自動化からのプログラムによるデプロイ。 Pythonまたは.NETソースをデプロイします。ホストされるランタイム Node.js はありません。 zip をビルドします。SDK によってアップロードされます。
REST API カスタム ツール、言語に依存しない自動化、CD システム。 zip をビルドし、マルチパート要求を送信します。

依存関係の解決方法を選択する

開始する前に、 code_configuration.dependency_resolutionの値を選択します。 この選択は、zip に入れる内容に影響します。

価値 Behavior 次の場合に使用します。
remote_build エージェント サービスは、requirements.txt (Python) から依存関係をインストールするか、プロビジョニング中にプロジェクト ファイル (.NET) を復元します。 小さなアップロードと最も単純な内部ループが必要です。 初めてのユーザーに推奨されます。
bundled ZIP はそのまま実行されます。 ビルド済みの Linux 依存関係は、packages/ (Python) または dotnet publish の出力 (.NET) に含めます。 再現可能なビルドが必要です。依存関係がプライベートまたはホイールのみの場合、またはプロジェクトがサーバー側でクリーンに復元されない場合。

バンドル モードについては、ローカル ビルド コマンド の zip を手動でパッケージ 化するを参照してください。

プライベート仮想ネットワークのファイアウォール要件

プライベート仮想ネットワークを使用してプロジェクトをセキュリティで保護する場合は、デプロイする前に、次のエンドポイントへの送信接続を許可するようにネットワーク ポリシーを更新します。

すべてのソースコードのデプロイには、次の宛先へのアウトバウンド アクセスが必要です。

  • mcr.microsoft.com
  • *.login.microsoft.com

ネットワーク構成については、「 仮想ネットワークにホストされたエージェントをデプロイする」を参照してください。

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

Azure Developer CLI (azd) と Foundry Toolkit for VS Code は、ソース コードのデプロイ ライフサイクル全体を自動化します。ソースを zip にパッケージ化し、SHA-256 を計算し、アップロードし、activeをポーリングし、ロールベースのアクセス制御を構成します。 これらのツールは、ほとんどのお客様に推奨されるパスであり、最速の内部ループです。

詳細なチュートリアルについては、「 クイック スタート: 最初のホストされたエージェントをデプロイする」を参照してください。 クイック スタートでデプロイ方法を求められたら、[コード] (または [ソース コード (ZIP アップロード)]) を選択します。

ソース コードのデプロイを選択する

azd ai agent init対話形式で実行すると、ツールによって展開モードの選択が求められます。 コンテナー イメージを構築する代わりに、ZIP アップロードとしてソースからデプロイする コード を選択します。 コード展開は、Pythonおよび.NETホステッド エージェントの既定のモードです。 Foundry Toolkit for VS Code では、同じ方法でデプロイ方法の入力を求められます。

CI/CD パイプラインなど、非対話的にソース コードのデプロイを選択するには、 --deploy-mode code渡します。 このモードでは、--runtime--entry-pointが必要であり、--dep-resolution (既定値) またはremote_buildの省略可能なbundled値を受け取ります。

azd ai agent init --no-prompt --project-id "<project-resource-id>" \
  --deploy-mode code --runtime python_3_13 --entry-point main.py

初期化後、azdは、codeConfigurationazure.ai.agent サービスの azure.yaml フィールドにソース コードの展開設定を書き込みます。

services:
  my-agent:
    host: azure.ai.agent
    project: src/my-agent
    kind: hosted
    codeConfiguration:
      runtime: python_3_13
      entryPoint:
        - python
        - main.py
      dependencyResolution: remote_build

azd upを実行してプロビジョニングとデプロイを行います。 --deploy-mode containerは、代わりにコンテナー イメージをビルドまたは参照する場合にのみ使用します。

独自のアプリケーションからプログラムでデプロイする必要がある場合、または既存のツールと統合する必要がある場合は、次のセクションの SDK または REST パスを使用します。

ソース コードからのデプロイ

言語またはインターフェイスを選択します。 各タブは、エージェントの作成、 activeに達するまでポーリング、呼び出し、デプロイされたコードのダウンロードという同じライフサイクルを経ます。

Python SDK を使用して、独自のアプリケーションまたは自動化からソース コード エージェントをデプロイします。 zip を自分でビルドし、そのバイトと SHA-256 を SDK に渡します。これをアップロードして、REST API と同じ作成、ポーリング、呼び出し、およびダウンロード操作を公開します。 コード展開にはバージョン 2.2.0 以降 azure-ai-projects 必要です。

zip をビルドする

Python SDK は、ビルドした zip をアップロードします。 「zip を手動でパッケージ化する」で説明されているのと同じレイアウトと依存関係解決規則を使用します。 最小 remote_build ペイロードは、ルートに main.pyrequirements.txt を含むフラット zip です。

エージェントを作成する

import hashlib
from pathlib import Path

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

# Format: "https://<account>.services.ai.azure.com/api/projects/<project>"
PROJECT_ENDPOINT = "your_project_endpoint"
AGENT_NAME = "my-code-agent"
ZIP_PATH = Path("agent-code.zip")

code_zip_bytes = ZIP_PATH.read_bytes()
code_zip_sha256 = hashlib.sha256(code_zip_bytes).hexdigest()

credential = DefaultAzureCredential()
project = AIProjectClient(
    endpoint=PROJECT_ENDPOINT,
    credential=credential,
)

created = project.agents.create_version_from_code(
    agent_name=AGENT_NAME,
    definition=HostedAgentDefinition(
        cpu="1",
        memory="2Gi",
        code_configuration=CodeConfiguration(
            runtime="python_3_13",
            entry_point=["python", "main.py"],
            dependency_resolution="remote_build",
        ),
        protocol_versions=[
            ProtocolVersionRecord(protocol="responses", version="1.0.0")
        ],
        environment_variables={"AZURE_AI_MODEL_DEPLOYMENT_NAME": "gpt-5.4-mini"},
    ),
    code=(ZIP_PATH.name, code_zip_bytes, "application/zip"),
    code_zip_sha256=code_zip_sha256,
    description="Hello-world code agent",
)
print(f"Created version: {created.version}")

呼び出しプロトコルの場合は、 protocol_versions エントリを ProtocolVersionRecord(protocol="invocations", version="1.0.0") に設定します。 呼び出し (WebSocket) プロトコルには、 ProtocolVersionRecord(protocol="invocations_ws", version="1.0.0")を使用します。 bundled モードの場合は、dependency_resolution="bundled"設定し、事前構築済みの依存関係を zip に発送します。 詳細については、「 Linux 依存関係をローカルにビルドする」を参照してください。

アクティブな対象者向けのアンケート

import time

while True:
    version = project.agents.get_version(
        agent_name=AGENT_NAME, agent_version=created.version
    )
    status = version["status"]
    print(f"Status: {status}")
    if status == "active":
        break
    if status == "failed":
        raise RuntimeError(f"Provisioning failed: {version.get('error')}")
    time.sleep(5)

状態値の完全な一覧と、失敗した場合に オブジェクトを読み取る方法については、「errorを参照してください。

エージェントを呼び出す

バージョンが activeに達したら、OpenAI クライアントをエージェント エンドポイントにバインドして呼び出します。 この例では、Responses プロトコルを使用します。

openai_client = project.get_openai_client(agent_name=AGENT_NAME)

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

呼び出しプロトコルの場合は、「エージェントの呼び出し」に示すように、ベアラー トークンを使用して 呼び出しエンドポイントを直接呼び出します

デプロイされた zip をダウンロードする

zip をダウンロードし、その SHA-256 をアップロードした値と比較して、デプロイされた内容を正確に確認します。

import hashlib
from pathlib import Path

out_path = Path(f"{AGENT_NAME}-{created.version}.zip")
sha = hashlib.sha256()
with open(out_path, "wb") as f:
    for chunk in project.agents.download_code(
        agent_name=AGENT_NAME, agent_version=created.version
    ):
        f.write(chunk)
        sha.update(chunk)

print(f"Downloaded {out_path} (matches upload: {sha.hexdigest() == code_zip_sha256})")

実行可能な完全な例については、Python hosted-agent のサンプルを参照してください。

zip を手動でパッケージ化する

azdを使用する場合は、このセクションをスキップazd、zip をビルドします。 REST API を使用する場合、 バンドルされた 依存関係の解決に切り替える場合、またはアップロードコンテンツを完全に制御する必要がある場合は、読み取ります。

zip は ルートにフラットである必要があります。最上位のラッパー フォルダーはありません。

エージェントの言語のタブを選択します。

Python レイアウト (リモート ビルド モード)

サービスは、 requirements.txtからクラウドに依存関係をインストールします。

agent-code.zip
+-- main.py
+-- requirements.txt

Python レイアウト (バンドル モード)

事前構築済みの Linux 依存関係を packages/に出荷します。

agent-code.zip
+-- main.py                    # entry point
+-- requirements.txt
+-- packages/                  # extracted modules (not raw .whl files)
    +-- azure/identity/__init__.py
    +-- requests/__init__.py

Linux の依存関係をローカルにビルドする (バンドル、Python)

manylinux2014_x86_64 プラットフォームタグを使用すると、pip は Windows や macOS からでも Linux 用の wheel をダウンロードできます。

Bash

pip install -r requirements.txt \
    --target packages/ \
    --platform manylinux2014_x86_64 \
    --python-version 3.13 \
    --implementation cp \
    --only-binary=:all:

zip -r agent-code.zip main.py requirements.txt packages/

PowerShell/Windows cmd

pip install -r requirements.txt --target packages --platform manylinux2014_x86_64 --python-version 3.13 --implementation cp --only-binary=:all:

tar -a -c -f agent-code.zip main.py requirements.txt packages

--only-binary=:all: はホイールを強制します (ソース ビルドはありません)。 --python-versionは、エージェント定義のruntime値と一致する必要があります。

Warning

session_creation_failedまたはModuleNotFoundErrorの原因となる一般的なパッケージ化の間違い:

  • ソースをフォルダーにラップします (ルートにmy-agent/main.pyするのではなく、main.py)。
  • 抽出されたモジュールの代わりに、生の .whl ファイルを packages/ に含めます。
  • Linux ランタイムWindowsバイナリ (.pyd.dll) のバンドル。

制限

制限 価値
最大 zip サイズ (マルチパート アップロード) 250MB

サポートされている cpumemory の組み合わせについては、「 サンドボックスのサイズ」を参照してください。

Troubleshooting

症状: 考えられる原因 修正
401 Unauthorized 不足している、またはスコープが誤ったトークン --resource https://ai.azure.comを使用してトークンを取得します。
403 Forbidden 呼び出し元には、プロジェクトに対するロールベースのアクセス制御権限がありません プロジェクト スコープで、Foundry エージェント コンシューマー (呼び出し専用) または Foundry ユーザー (開発も行う場合) を付与します。
409 conflict 作成時 (Agent '<name>' already exists) エージェント名は既に存在します Update (POST /agents/{name}) を使用するか、新しい名前を選択します。
400 bad_request Create または Update での (CPU and Memory must be specified as a valid resource tier) cpu / memory は、サポートされているレベルの 1 つではありません cpumemoryサンドボックス サイズの有効なペアに設定します。
400 bad_request 呼び出し時の (Agent version is still being provisioned) 新しいバージョンは現在デプロイ中で、アクティブなバージョンへの切り替えが行われています statusまでバージョン activeをポーリングしてから、再試行します。
424 session_not_ready 呼び出し時 コンテナーは開始されましたが、タイムアウト中 /readiness HTTP 200 が返されませんでした :logstreamを使用してログをストリーミングし、準備プローブまたはスタートアップ エラーを修正し、再デプロイします。
409 conflict DELETE エージェントの場合 (Agent has active sessions) セッションを開いて削除をブロックする セッションがアイドル状態になるまで待つか、連鎖削除セッションに &force=true を追加します。
バージョンが creating で停止しています(>10 分、リモートビルド) サーバーのビルドが失敗したか、解決できませんでした requirements.txt dependency_resolution: bundledに切り替え、ローカルで事前構築します。
プライベート仮想ネットワークでのデプロイが失敗する 必要な送信エンドポイントがファイアウォールによってブロックされる プライベート仮想ネットワークのファイアウォール要件のエンドポイントを許可してから、再デプロイします。
バージョンは failed に切り替わります 不適切な zip レイアウト、構文エラー、または (remote_build) 復元/コンパイルエラー バージョンの error オブジェクトを最初に読み取ります。error.code はエラーを分類し、error.message には、基になる復元またはコンパイル エラー行 (Python の pip、.NET の NuGet) とトラブルシューティング リンクが含まれています。 フォルダー構造を確認 します。 コンテナーの起動後にのみ、 :logstream を使用します。
ModuleNotFoundError 実行時 packages/ が見つからないか、生の .whl ファイルが含まれているか、Windows バイナリが含まれている pip install --target packages/ --platform manylinux2014_x86_64 --only-binary=:all:を使用して再構築します。
409 AgentNotCodeBased ダウンロード時 エージェントはイメージ ベースです コンテナー ベースのデプロイ ドキュメントを使用します。

リソースをクリーンアップする

を使用してazdからプロジェクトをスキャフォールディングした場合は、プロジェクト ルートからazd downを実行して、プロビジョニングされた環境全体を削除します。

SDK または REST API でデプロイしたエージェントを削除するには、次の一致するパスを使用します。

# Delete one version
project.agents.delete_version(agent_name=AGENT_NAME, agent_version=created.version)

# Delete the agent and all its versions
project.agents.delete(agent_name=AGENT_NAME)

Warning

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

次のステップ