Microsoft Agent Framework 支持从 Microsoft Foundry 项目终结点进行直接模型推理,并支持 Foundry 代理服务中的服务管理代理。
入门
将所需的 NuGet 包添加到项目。
dotnet add package Azure.Identity
dotnet add package Microsoft.Agents.AI.Foundry --prerelease
两种代理类型
Microsoft Foundry 集成公开两种不同的使用模式:
| 类型 | 生成的类型 | 说明 | 何时使用 |
|---|---|---|---|
| 响应代理 | 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."));
警告
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."));
重要
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));
有关如何运行和与代理交互的详细信息,请参阅 代理入门教程。
工具箱
注释
Foundry 工具箱 .NET 文档即将推出。
Python的铸造厂
在 Python 中,所有特定于 Foundry 的客户端现在都位于 agent_framework.foundry 下。
-
agent-framework-foundry提供云 Foundry 连接器:FoundryChatClient、FoundryAgent、FoundryEmbeddingClient和FoundryMemoryProvider。 -
agent-framework-foundry-local提供用于本地模型执行的FoundryLocalClient。
重要
本页介绍 Microsoft Foundry 项目终结点、模型终结点和 Foundry 代理服务的当前Python客户端。 如果您有一个独立的 Azure OpenAI 资源终结点(https://<your-resource>.openai.azure.com),请参考 OpenAI 提供程序页上的 Python 指南。 如果要在本地运行受支持的模型,请参阅 Foundry Local 提供程序页。
Python中的 Foundry 聊天和代理模式
| 情景 | Python形状 | 何时使用 |
|---|---|---|
| 使用 Foundry 响应端点进行简单推理 | Agent(client=FoundryChatClient(...)) |
你的应用拥有代理定义、工具和聊天循环,并且你想要在 Foundry 项目中部署模型。 |
| Foundry 代理服务中的服务托管代理 | FoundryAgent(...) |
你想要连接到通过 Foundry Portal 或服务 API 创建并配置的 PromptAgent 或 HostedAgent。 |
安装
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"
为“Prompt Agents”使用 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 响应终结点。 |
| 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 项目中的已部署模型,并使用响应终结点。 当应用应拥有指令、工具和会话处理时,将其与标准 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 。 这个推荐的 Python API 适用于 Prompt Agents 和 HostedAgents。
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 代理
对于运行服务端会话的 HostedAgents(/agents/{name}/sessions),使用FoundryAgent 和allow_preview=True以参与预览“Responses 界面”,并传递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)
小窍门
有关完整示例,请参阅示例,包括自动解析最新版本。using_deployed_agent.py
警告
从当前 AzureAIClient 命名空间中删除了较旧的 Python AzureAIProjectAgentProvider、AzureAIAgentClient、AzureAIAgentsProvider、agent_framework.azure 和 Azure AI 嵌入兼容性图面。 对于当前Python代码,当应用拥有说明和工具时,请使用 FoundryChatClient,当代理定义位于 Foundry 中时使用 FoundryAgent,并为 Foundry 模型终结点嵌入使用 FoundryEmbeddingClient。
使用代理
FoundryChatClient 和 FoundryAgent 都与标准 Python Agent 体验(包括工具调用、会话和流式处理响应)集成。 在本地运行时,请使用单独的 Foundry 本地供应商页面。
工具箱
重要
工具箱 API 是实验性的。 未来版本中,图面可能会更改。
Foundry 工具箱是在 Microsoft Foundry 项目中配置的托管工具配置(代码解释器、文件搜索、图像生成、MCP、Web 搜索)的命名、版本控制的服务器端捆绑包。 工具箱允许在 Foundry 门户中管理工具配置一次,并在代理之间重复使用它。
代理框架仅涵盖 消耗 — 创建和更新工具箱版本是通过 Foundry 门户或原始 azure-ai-projects SDK (azure-ai-projects>=2.1.0) 完成的。
FoundryAgent vs FoundryChatClient
| 代理类型 | 工具箱行为 |
|---|---|
| FoundryAgent (托管) | 工具箱的附加操作在服务器端进行。 不需要客户端连接。 |
| FoundryChatClient (直接推理) | 提取工具箱并将其 get_toolbox() 传递为 tools=。 |
两种消耗模式
| Pattern | 说明 |
|---|---|
| 本地(托管的工具) | 工具配置在 Foundry 运行时上执行。 将工具箱直接作为 tools=. |
| MCP | 使用 MCPStreamableHTTPTool 对抗工具箱的 MCP 终结点。 适用于任何聊天客户端,而不仅仅是 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 会在两个请求中解析默认版本。 锁定特定版本以避免额外的往返:
toolbox = await client.get_toolbox("research_toolbox", version="v3")
注释
每个 get_toolbox() 调用都会命中网络 - 没有框架端缓存,因为默认版本可能会更改服务器端。 缓存是调用方拥有的。
隐式平展
无需编写 toolbox.tools。 框架可以自动识别normalize_toolsToolboxVersionObject并进行平整化处理。 所有这些都有效:
# 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 消耗路径
还可以将 MCPStreamableHTTPTool 指向工具箱的 MCP 终结点 URL,以便将工具箱用作 MCP 服务器。
MCP 终结点 URL 显示在 Foundry 门户上,或遵循以下格式:
https://<account>.services.ai.azure.com/api/projects/<project>/toolsets/<name>/mcp?api-version=v1
由于客户端直接连接到 Foundry 工具箱终结点,因此必须通过 Entra ID 持有者令牌进行身份验证,通过 header_provider:
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)
Limitations
- 工具箱中的 MCP 工具使用服务器端身份验证。 通过
project_connection_id(在 Foundry 项目中配置的 OAuth 连接)处理对上游 MCP 服务器的身份验证。 客户端永远不会保存上游服务器的持有者令牌。 - 将工具箱用作 MCP 服务器需要客户端身份验证。 指向
MCPStreamableHTTPTool工具箱的 MCP 终结点时,必须通过get_bearer_token_provider(credential, "https://ai.azure.com/.default")提供 Entra ID 承载令牌(例如,通过header_provider)。 - 同意流处理是运行时关注的问题。 如果工具箱 MCP 工具在
CONSENT_REQUIRED期间触发agent.run(),它会在运行时处理,而不是在提取工具箱时进行处理。
Samples
| Sample | 说明 |
|---|---|
| foundry_chat_client_with_toolbox.py | 基本工具箱获取、版本锁定、组合工具箱和筛选 |
| foundry_chat_client_with_toolbox_mcp.py | MCP 使用路径 MCPStreamableHTTPTool |
| foundry_toolbox_context_provider.py | 通过上下文管理器动态选择每轮工具 |