Azure AI Projects Python SDK 2.1.0で何が変わる?実装・移行・自動化の実務ポイント

Azure AI Projects Python SDK 2.1.0 is released の実務上の結論は、Hosted Agents、Agent endpoint、評価自動化、DevOpsでの運用確認をしているチームほどアップデート価値が高いという点です。単純に Foundry Project のモデルへ問い合わせるだけなら急いで全面移行する必要はありませんが、Agent をコンテナ化して運用する、セッションやファイルをSDKから管理する、評価ジョブをCIに組み込む、といった用途では実装がかなり整理されます。

2026年4月20日に公開された Azure AI Projects SDK for Python 2.1.0 では、get_openai_client(agent_name=...)、.beta.agents のセッション操作、.beta.skills、.beta.toolboxes、評価入力向けTypedDict、トレーシング関連の変更が追加されています。特に Developers、platform engineers、DevOps teams は「新機能を試す」よりも、既存コードのどこを置き換えるべきか、どこはまだプレビューとして慎重に扱うべきかを見極めることが重要です。(GitHub)

目次

Azure AI Projects SDK for Python 2.1.0で何が変わったのか

Azure AI Projects SDK for Python は、Microsoft Foundry Project 内の Agents、評価、デプロイ、接続、データセット、インデックスなどを扱うためのPythonクライアントライブラリです。公式ドキュメントでは、このライブラリは Microsoft Foundry SDK の一部として説明されており、Python 3.9以降、Azureサブスクリプション、Foundry Project、FOUNDRY_PROJECT_ENDPOINT 形式のプロジェクトエンドポイントが前提になります。(Microsoft Learn)

今回の2.1.0は、派手な「新モデル対応」よりも、Agentを本番運用に近い形で扱うためのSDK整備が中心です。主な変更点を実装目線で整理すると、次のようになります。

変更点実務で楽になること主な対象
get_openai_client(agent_name=...)Agent endpoint向けのOpenAI互換クライアントを作りやすくなるAgent実装者、API開発者
.beta.agents のSession操作Hosted Agentsのセッション作成、取得、一覧、削除、ファイル操作をSDKで扱えるPlatform engineers、SRE
.beta.skillsSkillの作成、更新、取得、削除、パッケージ操作をSDK化できるAgent機能開発者
.beta.toolboxesTool定義をバージョン管理し、デフォルトバージョンを切り替えやすくなるDevOps、ガバナンス担当
評価入力向けTypedDict.evals.create() や .evals.runs.create() の入力をIDEや型チェックで検出しやすくなる評価基盤担当
トレーシング変更トレース有効時のコンテキスト伝播がデフォルト有効になるObservability担当

注意したいのは、.beta 配下の機能やHosted Agents関連の機能は、名前の通りプレビュー要素を含むことです。AIProjectClient のAPIリファレンスでも、.beta サブクライアントはプレビュー操作として扱われ、Hosted AgentやWorkflow Agentなどのプレビュー機能では allow_preview=True が関係します。(Microsoft Learn)

すぐ移行すべきチーム、様子を見るべきチーム

Azure AI Projects Python SDK 2.1.0は、全チームが即日で全面移行すべきリリースというより、Agent運用の深さによって優先度が変わるリリースです。

状況移行判断理由
Hosted Agentsを使っている、または検証中早めに検証する2.1.0以降がHosted Agents移行ドキュメントの前提になっているため
Agent endpointをOpenAI互換APIで呼びたい優先度高get_openai_client(agent_name=...) でエンドポイント切り替えが明確になる
セッション、セッション内ファイル、Agent endpointを自動化したい優先度高.beta.agents でSDKから管理できる範囲が増えた
評価ジョブをCI/CDに組み込みたい優先度中〜高TypedDictにより入力ミスを検出しやすくなる
単純なモデル呼び出しだけをしている優先度中破壊的変更の影響確認は必要だが、新機能の恩恵は限定的
厳格な監査・プライバシー要件がある検証必須トレースコンテキスト伝播のデフォルト有効化を確認する必要がある

MicrosoftのHosted Agents移行ガイドでは、Azure AI Projects SDK 2.1.0以降が前提として示され、プロトコルライブラリ、SDK呼び出し、ID/RBAC、Azure Developer CLI、再デプロイまで含めて更新する流れが説明されています。すでにHosted Agentsのプレビューを使っていたチームは、SDKだけを上げるのではなく、Agentのエントリポイント、agent.yaml、RBAC、CI/CDのデプロイ手順までまとめて確認した方が安全です。(Microsoft Learn)

セットアップとバージョン固定の基本

まずは検証環境で2.1.0を明示的に入れます。本番環境では、意図しないメジャーアップデートを避けるため、しばらくは上限を付けておくと運用しやすくなります。

python -m pip install --upgrade pip
pip install "azure-ai-projects==2.1.0" azure-identity openai python-dotenv
pip show azure-ai-projects

継続的に2.x系の更新を取り込みたい場合は、次のように制約します。

azure-ai-projects>=2.1.0,<3
azure-identity
openai
python-dotenv

環境変数は、2.1.0のサンプル更新に合わせて FOUNDRY_ プレフィックスに寄せると、公式サンプルとの差分が減ります。リリースノートでは、サンプル内の AZURE_AI_PROJECT_ENDPOINT が FOUNDRY_PROJECT_ENDPOINT、AZURE_AI_MODEL_DEPLOYMENT_NAME が FOUNDRY_MODEL_NAME、AZURE_AI_MODEL_AGENT_NAME が FOUNDRY_AGENT_NAME に変更されています。既存アプリで古い環境変数名を使い続けること自体は可能ですが、新旧が混在するとCI/CDで事故が起きやすくなります。(GitHub)

export FOUNDRY_PROJECT_ENDPOINT="https://<resource>.services.ai.azure.com/api/projects/<project>"
export FOUNDRY_MODEL_NAME="<model-deployment-name>"
export FOUNDRY_AGENT_NAME="<agent-name>"

get_openai_client(agent_name=...)でAgent endpoint呼び出しが分かりやすくなる

2.1.0で最も分かりやすい改善は、AIProjectClient.get_openai_client() に agent_name を渡せるようになったことです。通常はFoundry Project endpointに /openai/v1 を付けたbase URLが使われますが、agent_name を指定するとAgent endpoint向けのbase URLが使われます。Agent endpointはプレビュー機能のため、AIProjectClient 側で allow_preview=True が必要です。(Microsoft Learn)

プロジェクト上のモデルを呼び出す場合

モデル呼び出しだけなら、従来通り get_openai_client() を使えます。

import os
from azure.ai.projects import AIProjectClient
from azure.identity import DefaultAzureCredential

with (
    DefaultAzureCredential() as credential,
    AIProjectClient(
        endpoint=os.environ["FOUNDRY_PROJECT_ENDPOINT"],
        credential=credential,
    ) as project_client,
):
    with project_client.get_openai_client() as openai_client:
        response = openai_client.responses.create(
            model=os.environ["FOUNDRY_MODEL_NAME"],
            input="この問い合わせを3行で要約してください。",
        )

        print(response.output_text)

Agent endpointを呼び出す場合

Agent endpointを呼び出す場合は、allow_preview=True と agent_name を明示します。公式サンプルでも、Agent endpointに紐づくOpenAIクライアントを作成し、Responses APIを呼び出す流れが示されています。(GitHub)

import os
from azure.ai.projects import AIProjectClient
from azure.identity import DefaultAzureCredential

with (
    DefaultAzureCredential() as credential,
    AIProjectClient(
        endpoint=os.environ["FOUNDRY_PROJECT_ENDPOINT"],
        credential=credential,
        allow_preview=True,
    ) as project_client,
):
    openai_client = project_client.get_openai_client(
        agent_name=os.environ["FOUNDRY_AGENT_NAME"]
    )

    response = openai_client.responses.create(
        input="注文番号A-123の配送状況を確認してください。",
        extra_body={
            "agent_session_id": os.environ["FOUNDRY_AGENT_SESSION_ID"],
        },
    )

    print(response.output_text)

この変更で楽になるのは、アプリ側でAgent endpoint用のbase URLを組み立てる責任が減ることです。複数Agentを運用する場合も、agent_name を設定値として切り替えればよく、環境別の設定ファイルやCI/CDの変数管理が単純になります。

ただし、allow_preview=True を忘れると agent_name 指定時に例外が発生します。実装では、Agent endpointを使うクライアント生成箇所を1つの関数に集約し、プレビュー設定を漏らさないようにするのがおすすめです。

def create_project_client() -> AIProjectClient:
    return AIProjectClient(
        endpoint=os.environ["FOUNDRY_PROJECT_ENDPOINT"],
        credential=DefaultAzureCredential(),
        allow_preview=True,
    )

Hosted Agentsのセッション管理をSDKで扱える

2.1.0では、.beta.agents にHosted Agents向けのSession操作が追加されています。リリースノートでは、create_session()、delete_session()、delete_session_file()、download_session_file()、get_session()、get_session_files()、list_sessions()、upload_session_file() が追加されたと説明されています。(GitHub)

セッション操作は、長く動くAgentやユーザーごとの作業空間を扱うときに重要です。たとえば、以下のようなケースで効果があります。

  • ユーザー単位でAgentの作業状態を分離する
  • Agentの実行セッションに一時ファイルをアップロードする
  • セッション内で生成されたファイルをダウンロードする
  • テスト終了後にセッションを削除する
  • CIでAgentの起動、呼び出し、削除までを自動化する

最小構成では、Agentのバージョンを指定してセッションを作成します。公式サンプルでは、Hosted Agentのバージョンを作成した後、VersionRefIndicator と isolation_key を使ってセッションを作成しています。(GitHub)

import os
from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import VersionRefIndicator
from azure.identity import DefaultAzureCredential

agent_name = os.environ["FOUNDRY_AGENT_NAME"]
agent_version = os.environ["FOUNDRY_AGENT_VERSION"]

with (
    DefaultAzureCredential() as credential,
    AIProjectClient(
        endpoint=os.environ["FOUNDRY_PROJECT_ENDPOINT"],
        credential=credential,
        allow_preview=True,
    ) as project_client,
):
    session = project_client.beta.agents.create_session(
        agent_name=agent_name,
        isolation_key="tenant-001-user-123",
        version_indicator=VersionRefIndicator(agent_version=agent_version),
    )

    print(session.agent_session_id)

isolation_key は、セッションの所有や分離に関わる値です。実務では、メールアドレスや氏名などの個人情報をそのまま入れるより、テナントID、ユーザーID、ワークスペースIDなどを組み合わせた内部ID、またはハッシュ化した値を使う方が安全です。

セッション内ファイル操作でAgentの前処理・後処理を自動化できる

.beta.agents では、セッション内のサンドボックスにファイルをアップロードしたり、生成物をダウンロードしたりできます。APIリファレンスでは、upload_session_file() はbytesまたはローカルファイルパスを受け取り、セッション内の相対パスに保存できると説明されています。また、アップロード上限は50MBで、超過すると 413 Payload Too Large になります。(Microsoft Learn)

project_client.beta.agents.upload_session_file(
    agent_name=agent_name,
    session_id=session.agent_session_id,
    content_or_file_path="./input/customer_report.csv",
    path="input/customer_report.csv",
)

for chunk in project_client.beta.agents.download_session_file(
    agent_name=agent_name,
    agent_session_id=session.agent_session_id,
    path="output/result.json",
):
    with open("./output/result.json", "ab") as f:
        f.write(chunk)

失敗しやすいのは、Agent呼び出しのたびにセッションを作りっぱなしにする運用です。検証では問題になりにくいものの、CIや負荷試験では不要なセッションが残りやすくなります。テストコードでは try/finally で削除処理を入れておきましょう。

session = project_client.beta.agents.create_session(
    agent_name=agent_name,
    isolation_key="ci-smoke-test",
    version_indicator=VersionRefIndicator(agent_version=agent_version),
)

try:
    # Agent呼び出しやファイル操作
    pass
finally:
    project_client.beta.agents.delete_session(
        agent_name=agent_name,
        session_id=session.agent_session_id,
        isolation_key="ci-smoke-test",
    )

SkillsとToolboxesでAgent機能の再利用がしやすくなる

2.1.0では、.beta.skills と .beta.toolboxes も追加されています。ざっくり言えば、SkillsはAgentに与える振る舞いや専門能力の部品化、ToolboxesはAgentが使うツール定義の部品化とバージョン管理に向いています。(GitHub)

項目SkillsToolboxes
主な用途Agentの専門能力や指示を再利用するTool定義をまとめて管理する
代表操作create、create_from_package、update、download、deletecreate_version、update、list_versions、delete_version、delete
向いている例サポート回答、社内規約案内、製品説明MCP tool、承認ポリシー付きツール、複数バージョンの切り替え
運用上のポイントinstructionのレビューが重要デフォルトバージョンの切り替え確認が重要

Skillを作成・更新する

公式サンプルでは、project_client.beta.skills を使ってSkillを作成し、取得、更新、一覧、削除まで実行しています。(GitHub)

skills_client = project_client.beta.skills

created = skills_client.create(
    name="product_support_skill",
    description="製品サポート向けの回答スキル",
    instructions=(
        "あなたは製品サポート担当です。"
        "社内ポリシーと製品ガイドに基づいて、簡潔に回答してください。"
    ),
    metadata={
        "domain": "support",
        "status": "created",
    },
)

updated = skills_client.update(
    "product_support_skill",
    description="製品サポート向けの回答スキル v2",
    metadata={
        "domain": "support",
        "status": "updated",
    },
)

Skillは便利ですが、instructionsに業務ルールを詰め込みすぎると、レビューが難しくなります。実務では、Skill名、目的、対象ユーザー、禁止事項、参照すべきデータソースを明確にし、変更時はPull Requestでレビューできる形にしておくと安全です。

Toolboxをバージョン管理する

Toolboxesは、ツール定義をバージョン化して管理できる点が重要です。公式サンプルでは、MCP toolを含むToolboxを2バージョン作成し、default_version を切り替える処理が示されています。(GitHub)

from azure.ai.projects.models import MCPTool

toolbox_name = "toolbox_with_mcp_tool"

tools = [
    MCPTool(
        server_label="api_specs",
        server_url="https://gitmcp.io/Azure/azure-rest-api-specs",
        require_approval="always",
    )
]

created = project_client.beta.toolboxes.create_version(
    name=toolbox_name,
    description="MCPツールを含むToolbox",
    tools=tools,
)

project_client.beta.toolboxes.update(
    toolbox_name,
    default_version=created.version,
)

Toolboxの運用で大切なのは、作成と切り替えを分けて考えることです。新バージョンを作るだけなら既存Agentに影響しませんが、default_version を切り替えると実行時の動作が変わる可能性があります。DevOpsでは、次の順序にすると事故を減らせます。

手順確認内容
新しいToolbox versionを作成ツールURL、承認設定、metadataを確認
検証Agentで動作確認Agentが想定通りツールを呼ぶか確認
default_version を更新本番Agentに影響する範囲を確認
スモークテストを実行代表的な問い合わせ、失敗系、権限エラーを確認
古いバージョンを整理すぐ削除せず、ロールバック可能な期間を残す

評価自動化ではTypedDictの追加が効く

2.1.0では、get_openai_client() で取得したOpenAIクライアントの .evals.create() と .evals.runs.create() に対する型ヒントが強化されました。リリースノートでは、ModelSamplingConfigParam、AzureAIAgentTargetParam、AzureAIModelTargetParam、EvalCsvFileIdSource、EvalCsvRunDataSource、TracesPreviewEvalRunDataSource などのTypedDictクラスが追加されたと説明されています。(GitHub)

この改善は、評価ジョブを手作業で1回実行するチームよりも、CI/CDや定期ジョブで評価を回すチームに向いています。評価入力はネストした辞書になりやすく、キー名のtypoや型のズレが実行時まで見つからないことがあります。TypedDictを使うと、IDE、mypy、pyrightなどで早めに検出しやすくなります。

たとえば、サンプリング設定やCSVファイルIDの入力は、次のように型を付けて管理できます。

from azure.ai.projects.models import (
    EvalCsvFileIdSource,
    ModelSamplingConfigParam,
)

sampling: ModelSamplingConfigParam = {
    "max_completion_tokens": 800,
    "temperature": 0.0,
    "top_p": 1.0,
    "seed": 42,
}

csv_source: EvalCsvFileIdSource = {
    "type": "file_id",
    "id": uploaded_csv_file_id,
}

ModelSamplingConfigParam には max_completion_tokens、seed、temperature、top_p などの属性があり、EvalCsvFileIdSource はアップロード済みCSVファイルIDを表す id と type を持ちます。(Microsoft Learn)

実務では、評価入力を関数の中で直接組み立てるより、build_eval_config.py のような専用モジュールに分ける方が保守しやすくなります。CIでは、最低限以下をチェックすると効果的です。

python -m pip install mypy
mypy src/evaluations
python scripts/run_eval_smoke.py

トレーシングは「便利になったが、確認なしで有効化しない」

2.1.0のBreaking Changesとして、トレーシングが有効な場合にtrace context propagationがデフォルト有効になります。READMEでは、get_openai_client() で取得したOpenAIクライアント経由のHTTPリクエストに、W3C Trace Contextの traceparent と tracestate が注入され、クライアント側とサーバー側のスパンを同じ分散トレースに関連付けやすくなると説明されています。(GitHub)

これはObservabilityの観点では大きな改善です。Agentの遅延、ツール呼び出し、モデル呼び出し、評価結果をつなげて追いやすくなります。一方で、監査やプライバシー要件が厳しい環境では、トレースIDやbaggageの扱いを確認する必要があります。READMEでも、baggageにはユーザー識別子、セッション情報、認証情報、業務データ、個人情報が含まれる可能性があるため、baggage propagationはデフォルト無効で、必要な場合のみ有効化する設計だと説明されています。(GitHub)

トレースコンテキスト伝播を無効化したい場合は、環境変数またはinstrument時の引数で制御します。

export AZURE_TRACING_GEN_AI_ENABLE_TRACE_CONTEXT_PROPAGATION=false
AIProjectInstrumentor().instrument(
    enable_trace_context_propagation=False
)

運用で特に注意したいのは、設定変更のタイミングです。READMEでは、trace context propagationの設定変更は、変更後に get_openai_client() で取得したOpenAIクライアントに反映され、既に取得済みのクライアントには影響しないと説明されています。つまり、設定変更後はクライアントを作り直す必要があります。(GitHub)

移行時に失敗しやすいポイント

Azure AI Projects SDK for Python 2.1.0への移行では、コードそのものよりも、環境変数、プレビュー設定、トレーシング、Agent種別の取り違えでつまずきやすくなります。

失敗しやすいポイント起きる問題対策
allow_preview=True を忘れるagent_name 指定時に例外が出るAgent endpoint用クライアント生成を共通化する
古い環境変数名と新しいサンプル名が混在CI/CDで KeyError や設定漏れが起きるFOUNDRY_ 系へ寄せる、または互換マッピングを作る
Hosted Agents以外でSession APIを使うセッション操作が期待通り動かないSessionはHosted Agents向けと理解する
セッションを削除しない検証環境やCIで不要なリソースが残るtry/finally で削除する
Toolboxの新バージョン作成と切り替えを同時に行う本番Agentの動作が急に変わる作成、検証、default切り替えを分ける
トレース設定を確認しない監査上共有したくない情報が伝播する可能性propagation、baggage、content recordingを明示的に管理する
セッションファイルに大容量データを直接置く50MB超過で失敗する外部ストレージや分割アップロードを検討する

DevOpsでの移行チェックリスト

開発者個人のローカル検証で終わらせず、DevOpsチームは次の順序で移行すると安全です。

フェーズやること完了条件
依存関係確認azure-ai-projects を2.1.0に固定pip show azure-ai-projects で2.1.0を確認
環境変数整理FOUNDRY_PROJECT_ENDPOINT などに統一ローカル、CI、シークレットストアで同じ名前を使う
Client生成確認allow_preview=True が必要な箇所を特定Agent endpoint呼び出しで例外が出ない
Agent endpoint確認get_openai_client(agent_name=...) に置き換え手動base URL組み立てが残っていない
Session操作確認作成、取得、一覧、削除をテストテスト後にセッションが残らない
Skills/Toolboxes確認作成と更新を検証環境で実行バージョン切り替え前後の動作を確認
評価確認TypedDictで評価入力を整理型チェックとスモーク評価が通る
トレース確認propagation設定を確認監査・プライバシー方針と一致している

CIのスモークテストでは、すべてのAgent機能を網羅する必要はありません。最初は、SDK認証、プロジェクト接続、Agent endpoint呼び出し、セッション作成・削除だけを確認する軽いテストを用意すると、アップデート時の異常を早く検出できます。

import os
from azure.ai.projects import AIProjectClient
from azure.identity import DefaultAzureCredential

def main() -> None:
    with (
        DefaultAzureCredential() as credential,
        AIProjectClient(
            endpoint=os.environ["FOUNDRY_PROJECT_ENDPOINT"],
            credential=credential,
            allow_preview=True,
        ) as project_client,
    ):
        # プロジェクト接続の疎通確認
        deployments = list(project_client.deployments.list())
        print(f"deployments: {len(deployments)}")

        # Agent endpointの疎通確認
        openai_client = project_client.get_openai_client(
            agent_name=os.environ["FOUNDRY_AGENT_NAME"]
        )
        response = openai_client.responses.create(
            input="health check",
            extra_body={
                "agent_session_id": os.environ["FOUNDRY_AGENT_SESSION_ID"],
            },
        )
        print(response.output_text[:100])

if __name__ == "__main__":
    main()

このテストは本番ワークロードの品質を保証するものではありませんが、認証、エンドポイント、SDKバージョン、Agent endpointの基本的な破損を検出するには役立ちます。

2.1.0で開発・移行・自動化はどこが楽になるのか

Azure AI Projects Python SDK 2.1.0の価値は、個別のAPI追加よりも、Agent運用の境界がはっきりした点にあります。

開発者にとっては、get_openai_client(agent_name=...) によって、Foundry Project endpointとAgent endpointの使い分けがコード上で明確になります。Platform engineersにとっては、Hosted Agentsのセッションやファイル操作をSDKで扱えるため、検証・削除・障害調査の自動化がしやすくなります。DevOps teamsにとっては、SkillsやToolboxesをコードで作成・更新し、評価入力をTypedDictで管理し、トレーシング設定を明示できる点が大きな改善です。

一方で、プレビュー機能を含むため、いきなり本番コードへ広範囲に入れるのは避けた方が安全です。まずは検証環境で2.1.0に固定し、Agent endpoint、Session、Toolbox、評価、トレーシングの順にスモークテストを作成してください。既存コードを一気に書き換えるのではなく、クライアント生成、環境変数、Agent呼び出し、セッション管理、評価入力の5つに分けて移行すると、影響範囲を抑えながら2.1.0の恩恵を取り込めます。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次