Microsoft Agent Framework では、Microsoft Foundry プロジェクト エンドポイントからの直接モデル推論と、Foundry Agent Service のサービスマネージド エージェントの両方がサポートされます。
はじめに
必要な NuGet パッケージをプロジェクトに追加します。
dotnet add package Azure.Identity
dotnet add package Microsoft.Agents.AI.Foundry --prerelease
2 種類のエージェント
Microsoft Foundry 統合では、次の 2 つの異なる使用パターンが公開されています。
| タイプ | 生成された型 | 説明 | 次の場合に使用します。 |
|---|---|---|---|
| 応答エージェント | ChatClientAgent |
アプリは、 AIProjectClient.AsAIAgent(...)を介して実行時にモデル、命令、ツールをプログラムで提供します。 サーバー側エージェント リソースは作成されません。 |
エージェント定義を所有しており、シンプルで柔軟なセットアップが必要です。 これは、ほとんどのサンプルで使用されるパターンです。 |
| Foundry エージェント (バージョニング済み) | FoundryAgent |
サーバー管理 — エージェント定義は、Foundry ポータルを使用するか、 AIProjectClient.AgentAdministrationClientを使用してプログラムによって作成およびバージョン管理されます。
ProjectsAgentVersionまたはProjectsAgentRecordまたはAgentReferenceをAIProjectClient.AsAIAgent(...)に渡します。 |
サービス API を使用して Foundry ポータルで管理される厳密なバージョン管理されたエージェント定義が必要です |
応答エージェント (直接推論)
AsAIAgentのAIProjectClientをモデルと命令と共に直接使用します。 これは、ほとんどのシナリオで推奨される開始点です。
using Azure.AI.Projects;
using Azure.Identity;
using Microsoft.Agents.AI;
AIAgent agent = new AIProjectClient(
new Uri("<your-foundry-project-endpoint>"),
new DefaultAzureCredential())
.AsAIAgent(
model: "gpt-4o-mini",
name: "Joker",
instructions: "You are good at telling jokes.");
Console.WriteLine(await agent.RunAsync("Tell me a joke about a pirate."));
Warnung
DefaultAzureCredential は開発には便利ですが、運用環境では慎重に考慮する必要があります。 運用環境では、待機時間の問題、意図しない資格情報のプローブ、フォールバック メカニズムによる潜在的なセキュリティ リスクを回避するために、特定の資格情報 ( ManagedIdentityCredential など) を使用することを検討してください。
このパスはコード優先であり、サーバーマネージド エージェント リソースは作成しません。
Foundry エージェント (バージョン付き)
AI Projects SDK のネイティブ AIProjectClient.AgentAdministrationClient API を使用して、バージョン管理されたエージェント リソースを取得し、 AsAIAgentでラップします。 エージェントは Foundry ポータルで直接作成および構成することも、 AIProjectClient.AgentAdministrationClientを使用してプログラムで構成することもできます。
using Azure.AI.Projects;
using Azure.AI.Projects.Agents;
using Azure.Identity;
using Microsoft.Agents.AI;
using Microsoft.Agents.AI.Foundry;
var aiProjectClient = new AIProjectClient(
new Uri("<your-foundry-project-endpoint>"),
new DefaultAzureCredential());
// Retrieve an existing agent by name (uses the latest version automatically)
ProjectsAgentRecord jokerRecord = await aiProjectClient.AgentAdministrationClient.GetAgentAsync("Joker");
FoundryAgent agent = aiProjectClient.AsAIAgent(jokerRecord);
Console.WriteLine(await agent.RunAsync("Tell me a joke about a pirate."));
Important
Foundry Agents のツールと命令は、作成されたツールや命令に厳密であり、実行時にツールや命令を変更することはサポートされていません。
エージェントの使用
ChatClientAgent (応答) とFoundryAgent (バージョン管理) の両方が標準AIAgent インスタンスであり、セッション、ツール、ミドルウェア、ストリーミングを含むすべての標準操作をサポートします。
AgentSession session = await agent.CreateSessionAsync();
Console.WriteLine(await agent.RunAsync("Tell me a joke.", session));
Console.WriteLine(await agent.RunAsync("Now make it funnier.", session));
エージェントを実行して操作する方法の詳細については、 エージェントの概要に関するチュートリアルを参照してください。
ツールボックス
Note
Foundry Toolbox .NET ドキュメントは近日公開予定です。
Pythonのファウンドリー
Pythonでは、Foundry 固有のすべてのクライアントが agent_framework.foundry の下に住むようになりました。
-
agent-framework-foundryは、cloud Foundry コネクタ (FoundryChatClient、FoundryAgent、FoundryEmbeddingClient、FoundryMemoryProvider) を提供します。 -
agent-framework-foundry-localは、ローカル モデルの実行にFoundryLocalClientを提供します。
Important
このページでは、Microsoft Foundry プロジェクト エンドポイント、モデル エンドポイント、および Foundry Agent Service の現在のPython クライアントについて説明します。 スタンドアロン Azure OpenAI リソース エンドポイント (https://<your-resource>.openai.azure.com) がある場合は、OpenAI プロバイダー ページのPythonガイダンスを使用します。 サポートされているモデルをローカルで実行する場合は、 Foundry Local プロバイダーのページを参照してください。
PythonにおけるFoundryチャットおよびエージェントのパターン
| シナリオ | Python図形 | 次の場合に使用します。 |
|---|---|---|
| Foundry Responses エンドポイントを使用したプレーン推論 | Agent(client=FoundryChatClient(...)) |
アプリはエージェント定義、ツール、会話ループを所有しており、Foundry プロジェクトにモデルをデプロイする必要があります。 |
| Foundry エージェント サービスにおけるサービス管理エージェント | FoundryAgent(...) |
Foundry ポータルまたはサービス API で作成および構成された PromptAgent または HostedAgent に接続する必要があります。 |
Installation
pip install agent-framework-foundry
pip install azure-identity
同じ agent-framework-foundry パッケージには、Foundry モデルとエンドポイントの埋め込みの FoundryEmbeddingClient も含まれています。
コンフィギュレーション
FoundryChatClient
FOUNDRY_PROJECT_ENDPOINT="https://<your-project>.services.ai.azure.com"
FOUNDRY_MODEL="gpt-4o-mini"
FoundryAgent
FOUNDRY_PROJECT_ENDPOINT="https://<your-project>.services.ai.azure.com"
FOUNDRY_AGENT_NAME="my-agent"
FOUNDRY_AGENT_VERSION="1.0"
プロンプト エージェントの FOUNDRY_AGENT_VERSION を使用します。 ホストエージェントでは、これを省略できます。
FoundryEmbeddingClient
FOUNDRY_MODELS_ENDPOINT="https://<apim-instance>.azure-api.net/<foundry-instance>/models"
FOUNDRY_MODELS_API_KEY="<api-key>"
FOUNDRY_EMBEDDING_MODEL="text-embedding-3-small"
FOUNDRY_IMAGE_EMBEDDING_MODEL="Cohere-embed-v3-english" # optional
FoundryChatClient と FoundryAgent はプロジェクトエンドポイントを使用します。
FoundryEmbeddingClient では、個別のモデル エンドポイントが使用されます。
適切なPythonクライアントを選択する
| シナリオ | 優先クライアント | メモ |
|---|---|---|
| Azure OpenAI リソース | OpenAIChatCompletionClient / OpenAIChatClient |
OpenAI プロバイダー ページを使用します。 |
| Microsoft Foundry プロジェクト推論 | Agent(client=FoundryChatClient(...)) |
Foundry Responses エンドポイントを使用します。 |
| MicrosoftのFoundryサービス管理エージェント | FoundryAgent |
プロンプト エージェントと HostedAgents に推奨されます。 |
| Microsoft Foundry モデル- エンドポイント埋め込み | FoundryEmbeddingClient |
FOUNDRY_MODELS_ENDPOINTとFOUNDRY_EMBEDDING_MODEL / FOUNDRY_IMAGE_EMBEDDING_MODELを使用します。 |
| Foundry ローカル ランタイム | Agent(client=FoundryLocalClient(...)) |
Foundry Local を参照してください。 |
を使用してエージェントを作成する FoundryChatClient
FoundryChatClient は Foundry プロジェクト内のデプロイ済みモデルに接続し、Responses エンドポイントを使用します。 アプリが命令、ツール、セッション処理を所有する必要がある場合は、標準の Agent とペアリングします。
from agent_framework import Agent
from agent_framework.foundry import FoundryChatClient
from azure.identity import AzureCliCredential
agent = Agent(
client=FoundryChatClient(
project_endpoint="https://your-project.services.ai.azure.com",
model="gpt-4o-mini",
credential=AzureCliCredential(),
),
name="FoundryWeatherAgent",
instructions="You are a helpful assistant.",
)
FoundryChatClient は、直接推論用の Foundry 優先のPython パスであり、ツール、構造化出力、ストリーミングをサポートします。
を使用して埋め込みを作成する FoundryEmbeddingClient
Foundry モデル エンドポイントからテキストまたは画像を埋め込む場合は、 FoundryEmbeddingClient を使用します。
from agent_framework.foundry import FoundryEmbeddingClient
async with FoundryEmbeddingClient() as client:
result = await client.get_embeddings(["hello from Agent Framework"])
print(result[0].dimensions)
サービスマネージド エージェントにFoundryAgentを使用して接続する
エージェント定義が Foundry に存在する場合は、 FoundryAgent を使用します。 これは、プロンプト エージェントと HostedAgents に推奨されるPython API です。
from agent_framework.foundry import FoundryAgent
from azure.identity import AzureCliCredential
agent = FoundryAgent(
project_endpoint="https://your-project.services.ai.azure.com",
agent_name="my-prompt-agent",
agent_version="1.0",
credential=AzureCliCredential(),
)
HostedAgent の場合は、 agent_version を省略し、代わりにホストされるエージェント名を使用します。
デプロイされた (ホストされている) Foundry エージェントへの接続
サービス側セッション (/agents/{name}/sessions) を実行する HostedAgent の場合は、 FoundryAgent と allow_preview=True を使用してプレビュー応答画面にオプトインし、 version="v2"渡します。
from agent_framework.foundry import FoundryAgent
from azure.identity import AzureCliCredential
agent = FoundryAgent(
agent_name="my-hosted-agent",
credential=AzureCliCredential(),
allow_preview=True,
version="v2",
)
基になるサービス セッションを自分で管理する必要がある場合 (たとえば、セッションを特定のテナントまたはユーザーにバインドする場合)、プレビュー AIProjectClient API を使用してセッションを作成し、 agent.get_session(...)でラップします。
from azure.ai.projects.aio import AIProjectClient
from azure.ai.projects.models import VersionRefIndicator
service_session = await project_client.beta.agents.create_session(
agent_name="my-hosted-agent",
isolation_key="user-123",
version_indicator=VersionRefIndicator(agent_version="1.0"),
)
session = agent.get_session(service_session.agent_session_id)
response = await agent.run("Hello!", session=session)
Tip
最新バージョンの自動解決など、完全な例については、 using_deployed_agent.py サンプル を参照してください。
Warnung
以前の Python AzureAIClient、AzureAIProjectAgentProvider、AzureAIAgentClient、AzureAIAgentsProvider、および Azure AI 埋め込み互換性サーフェスは、現在の agent_framework.azure 名前空間から削除されました。 現在のPython コードでは、アプリが命令とツールを所有する場合は FoundryChatClient、エージェント定義が Foundry にある場合は FoundryAgent、Foundry モデル-エンドポイント埋め込みの場合は FoundryEmbeddingClient を使用します。
エージェントの使用
FoundryChatClient と FoundryAgent はどちらも、ツールの呼び出し、セッション、ストリーミング応答など、標準の Python Agent エクスペリエンスと統合されます。 ローカル ランタイムの場合は、個別の Foundry ローカル プロバイダー ページを使用します。
ツールボックス
Important
ツールボックス API は試験段階です。 将来のリリースでは、サーフェスが変更される可能性があります。
Foundry ツールボックスは、Microsoft Foundry プロジェクトで構成された、ホストされているツール構成 (コード インタープリター、ファイル検索、イメージ生成、MCP、Web 検索) の名前付きバージョン管理されたサーバー側バンドルです。 ツールボックスを使用すると、Foundry ポータルでツール構成を 1 回管理し、エージェント間で再利用できます。
Agent Framework は 消費 のみを対象とします。ツールボックスのバージョンの作成と更新は、Foundry ポータルまたは生の azure-ai-projects SDK (azure-ai-projects>=2.1.0) を使用して行われます。
FoundryAgent と FoundryChatClient
| エージェントの種類 | ツールボックスの動作 |
|---|---|
| FoundryAgent (ホステッド) | ツールボックスの添付ファイルはサーバー側で行われます。 クライアント側の配線は必要ありません。 |
| FoundryChatClient (直接推論) |
get_toolbox()を使用してツールボックスをフェッチし、tools=として渡します。 |
2 つの消費パターン
| Pattern | 説明 |
|---|---|
| ネイティブ (ホステッド ツール) | ツール構成は Foundry ランタイムで実行されます。 ツールボックスを tools=として直接渡します。 |
| MCP | ツールボックスの MCP エンドポイントに対して MCPStreamableHTTPTool を使用します。
FoundryChatClientだけでなく、任意のチャット クライアントで動作します。 |
ツールボックスを取得する
FoundryChatClient.get_toolbox()を使用してツールボックスを取得します。
from agent_framework import Agent
from agent_framework.foundry import FoundryChatClient
from azure.identity.aio import AzureCliCredential
async with AzureCliCredential() as credential:
client = FoundryChatClient(credential=credential)
toolbox = await client.get_toolbox("research_toolbox")
async with Agent(client=client, name="ResearchAgent", tools=toolbox) as agent:
result = await agent.run("Summarize recent findings.")
print(result.text)
versionを省略すると、get_toolboxは 2 つの要求で既定のバージョンを解決します。 余分なラウンド トリップを回避するために、特定のバージョンをピン留めします。
toolbox = await client.get_toolbox("research_toolbox", version="v3")
Note
各 get_toolbox() 呼び出しがネットワークにヒットします。既定のバージョンではサーバー側が変更される可能性があるため、フレームワーク側のキャッシュはありません。 キャッシュは呼び出し元所有です。
暗黙的なフラット化
toolbox.toolsを記述する必要はありません。 フレームワークの normalize_tools は ToolboxVersionObject を認識し、自動的にフラット化します。 これらの作業はすべて次のとおりです。
# Single toolbox
agent = Agent(client=client, tools=toolbox)
# Toolbox in a list
agent = Agent(client=client, tools=[toolbox])
# Mix local function tools with a toolbox
agent = Agent(client=client, tools=[get_internal_metrics, toolbox])
# Combine multiple toolboxes
agent = Agent(client=client, tools=[toolbox_a, toolbox_b])
フィルタリングツール select_toolbox_tools
ツールボックスに複数のツールがバンドルされているが、エージェントにサブセットのみが必要な場合は、 select_toolbox_tools を使用してフェッチ後にセットを絞り込みます。 これにより、不要なツール定義がモデルに送信されるのを回避できます。これにより、トークンの使用量が減り、公開する予定のないツールがモデルによって呼び出されるのを防ぐことができます。
from agent_framework.foundry import select_toolbox_tools, get_toolbox_tool_name
# Filter by tool name
tools = select_toolbox_tools(toolbox, include_names=["web_search", "code_interpreter"])
# Filter by tool type
tools = select_toolbox_tools(toolbox, include_types=["mcp", "web_search"])
# Filter with a custom predicate
tools = select_toolbox_tools(toolbox, predicate=lambda t: "search" in (get_toolbox_tool_name(t) or ""))
ヘルパー関数 get_toolbox_tool_name(tool) と get_toolbox_tool_type(tool) は、それぞれツール エントリの選択名と生の種類を返します。
FoundryHostedToolTypeはTypeAlias (Literal["code_interpreter", "file_search", "image_generation", "mcp", "web_search"] | str)として、include_types / exclude_typesでIDEによるガイド付き補完を行います。
MCP 消費経路
ツールボックスの MCP エンドポイント URL で MCPStreamableHTTPTool をポイントすることで、ツールボックスを MCP サーバーとして使用することもできます。
MCP エンドポイント URL は Foundry ポータルに表示されるか、次の形式に従います。
https://<account>.services.ai.azure.com/api/projects/<project>/toolsets/<name>/mcp?api-version=v1
クライアントは Foundry ツールボックス エンドポイントに直接接続するため、 header_providerを介して Entra ID ベアラー トークンを使用して認証する必要があります。
from azure.identity.aio import DefaultAzureCredential
from azure.identity.aio import get_bearer_token_provider
from agent_framework import Agent, MCPStreamableHTTPTool
credential = DefaultAzureCredential()
token_provider = get_bearer_token_provider(credential, "https://ai.azure.com/.default")
mcp_tool = MCPStreamableHTTPTool(
name="research_mcp",
url="https://<your-toolbox-mcp-endpoint>",
header_provider=lambda: {"Authorization": f"Bearer {token_provider()}"},
)
async with Agent(client=client, name="MCPAgent", tools=[mcp_tool]) as agent:
result = await agent.run("Search for recent papers on LLM agents.")
print(result.text)
制限事項
- ツールボックス内の MCP ツールでは、サーバー側認証が使用されます。 アップストリーム MCP サーバーへの認証は、
project_connection_id(Foundry プロジェクトで構成された OAuth 接続) を介して処理されます。 クライアントはアップストリーム サーバーのベアラー トークンを保持しません。 - ツールボックスを MCP サーバーとして使用するには、クライアント側の認証が必要です。 ツールボックスの MCP エンドポイントに
MCPStreamableHTTPToolを指す場合、get_bearer_token_provider(credential, "https://ai.azure.com/.default")を通じて (例えば、header_provider経由で) Entra ID ベアラー トークンを指定する必要があります。 - 同意フローの処理はランタイムの問題です。 ツールボックス MCP ツールが
CONSENT_REQUIRED中にagent.run()をトリガーした場合、ツールボックスのフェッチ中ではなく実行時に処理されます。
サンプル
| Sample | 説明 |
|---|---|
| foundry_chat_client_with_toolbox.py | 基本的なツールボックス フェッチ、バージョンのピン留め、ツールボックスの組み合わせ、フィルター処理 |
| foundry_chat_client_with_toolbox_mcp.py | MCP 消費経路 MCPStreamableHTTPTool |
| foundry_toolbox_context_provider.py | コンテキスト プロバイダーを使用したターンごとの動的ツールの選択 |