Microsoft Foundry

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。 将ProjectsAgentVersionProjectsAgentRecordAgentReference传递给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 连接器: FoundryChatClientFoundryAgentFoundryEmbeddingClientFoundryMemoryProvider
  • 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

FoundryChatClientFoundryAgent 使用项目终结点。 FoundryEmbeddingClient 使用单独的模型终结点。

选择正确的Python客户端

情景 首选客户端 备注
Azure OpenAI 资源 OpenAIChatCompletionClient / OpenAIChatClient 使用 OpenAI 提供者页面
Microsoft Foundry 项目推断 Agent(client=FoundryChatClient(...)) 使用 Foundry 响应终结点。
Microsoft Foundry 服务托管代理 FoundryAgent 建议用于即时代理和 HostedAgents。
Microsoft Foundry 模型与端点嵌入 FoundryEmbeddingClient 使用 FOUNDRY_MODELS_ENDPOINTFOUNDRY_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),使用FoundryAgentallow_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 AzureAIProjectAgentProviderAzureAIAgentClientAzureAIAgentsProvideragent_framework.azure 和 Azure AI 嵌入兼容性图面。 对于当前Python代码,当应用拥有说明和工具时,请使用 FoundryChatClient,当代理定义位于 Foundry 中时使用 FoundryAgent,并为 Foundry 模型终结点嵌入使用 FoundryEmbeddingClient

使用代理

FoundryChatClientFoundryAgent 都与标准 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是一个TypeAliasLiteral["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 通过上下文管理器动态选择每轮工具

后续步骤