Microsoft Foundry 代理服务

FoundryAgent将代理框架连接到由 Microsoft Foundry 代理服务管理的代理定义。 代理的模型、说明、托管工具和版本在 Foundry 中配置;应用程序连接到该定义并使用标准代理框架运行、流式处理和会话 API。

将此集成用于:

  • 提示代理,这些代理已命名和版本控制服务器端代理定义。
  • 托管代理,这是通过特定于代理的终结点访问的已部署代理应用程序。

有关应用程序拥有代理定义的直接模型推理,请参阅 Microsoft Foundry 模型提供程序。 若要将 Agent Framework 应用程序部署为托管代理,请参阅 Foundry 托管代理

安装软件包

dotnet add package Azure.AI.Projects --prerelease
dotnet add package Azure.Identity
dotnet add package Microsoft.Agents.AI.Foundry --prerelease

连接到提示代理

为 Foundry 项目创建一个AIProjectClient并包装AgentReference为 .FoundryAgent 当应用程序必须使用特定的提示代理定义时固定版本。

using Azure.AI.Projects;
using Azure.AI.Projects.Agents;
using Azure.Identity;
using Microsoft.Agents.AI.Foundry;

var projectClient = new AIProjectClient(
    new Uri(Environment.GetEnvironmentVariable("FOUNDRY_PROJECT_ENDPOINT")!),
    new DefaultAzureCredential());

FoundryAgent agent = projectClient.AsAIAgent(
    new AgentReference(
        Environment.GetEnvironmentVariable("FOUNDRY_AGENT_NAME")!,
        Environment.GetEnvironmentVariable("FOUNDRY_AGENT_VERSION")!));

Console.WriteLine(await agent.RunAsync("What can you help me with?"));

还可以检索 a ProjectsAgentRecord 以使用其最新版本或使用 ProjectsAgentVersion 显式检索的版本,然后将该对象 projectClient.AsAIAgent(...)传递给 。

检索最新的提示代理版本

当应用程序应按名称解析最新注册的版本时使用 AgentAdministrationClient

ProjectsAgentRecord agentRecord =
    await projectClient.AgentAdministrationClient.GetAgentAsync(
        Environment.GetEnvironmentVariable("FOUNDRY_AGENT_NAME")!);

FoundryAgent latestAgent = projectClient.AsAIAgent(agentRecord);
Console.WriteLine(await latestAgent.RunAsync("What can you help me with?"));

Important

A FoundryAgent 使用存储在 Foundry 定义的模型、说明和托管工具。 在 Foundry 中配置这些功能;客户端无法在运行时替换它们。

Warning

DefaultAzureCredential 便于开发。 在生产环境中,首选特定凭据,例如 ManagedIdentityCredential 避免意外的凭据探测。

连接到托管代理

托管代理公开特定于代理的 OpenAI 终结点。 从项目终结点生成终结点并注册代理名称,然后将其传递给 AIProjectClient.AsAIAgent(...)

Env.TraversePath().Load();

// Port the Hosted-* samples listen on when run locally with `dotnet run`.
const int LocalAgentPort = 8088;

// AZURE_AI_AGENT_NAME is the registered server-side agent name.
string agentName = Environment.GetEnvironmentVariable("AZURE_AI_AGENT_NAME")
    ?? throw new InvalidOperationException("AZURE_AI_AGENT_NAME is not set.");

// Pick the server to talk to. `--local` and `--remote` mirror the flag `azd ai agent invoke`
// exposes; with neither, ask at startup.
    ══════════════════════════════════════════════════════════
    """);
Console.ResetColor();
Console.WriteLine();

终结点的管理员控制版本选择器确定活动的托管代理版本。

安装软件包

pip install agent-framework-foundry

Configuration

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。 托管代理可以省略它。

连接到提示代理

提供项目终结点、代理名称和代理版本。 该服务提供存储的模型、说明和托管工具配置。

async def main() -> None:
    agent = FoundryAgent(
        project_endpoint="https://your-project.services.ai.azure.com",
        agent_name="my-prompt-agent",
        agent_version="1.0",
        credential=AzureCliCredential(),
    )

    result = await agent.run("What is the capital of France?")
    print(f"Agent: {result}")

    # Streaming
    print("Agent (streaming): ", end="", flush=True)
    async for chunk in agent.run("Tell me a fun fact.", stream=True):
        if chunk.text:
            print(chunk.text, end="", flush=True)
    print()

如果 Prompt Agent 声明了本地函数工具,请在构造FoundryAgent时传递匹配的可调用工具tools=,以便客户端可以在请求时执行它。 请参阅 提示代理发布和连接示例

连接到托管代理

托管代理不需要 agent_version。 使用项目终结点和已注册的代理名称进行连接。

async def main() -> None:
    # HostedAgents don't need agent_version
    agent = FoundryAgent(
        project_endpoint=os.getenv("FOUNDRY_PROJECT_ENDPOINT"),
        agent_name=os.getenv("FOUNDRY_AGENT_NAME"),
        credential=AzureCliCredential(),
    )

    result = await agent.run("Summarize the latest news about AI.")
    print(f"Agent: {result}")

什么有效,什么不起作用 FoundryAgent

FoundryAgent 连接到 Foundry 中已存在的代理定义。 存储的说明和工具配置是权威的,因此客户端行为不同于应用程序拥有 Agent(client=FoundryChatClient(...))的行为。

Tools

传递给 FoundryAgent(...) 的工具类型 Behavior
FunctionTool具有本地Python可调用 仅当 Foundry 代理上已存在匹配函数定义时才受支持。 当 Foundry 请求可调用它时,可调用项在应用程序进程中运行。
托管工具,包括 Web 搜索、代码解释器、文件搜索、MCP、图像生成和Microsoft Foundry 工具箱 在 Foundry 代理定义中配置这些配置。 传递客户端不会将它们添加到服务托管代理。

有关工具箱附件和直接 MCP 使用指南,请参阅Microsoft Foundry 工具箱

无法在构造时注册新的模型可见工具。 传递可调用的函数仅提供 Foundry 代理已声明的函数的本地实现。

上下文提供程序

上下文提供程序行为 可与 FoundryAgent 配合使用?
添加消息,例如检索的内存、RAG 代码段或用户配置文件信息 Yes. 注入的上下文随请求一起转发。
持久保存或观察对话 Yes. 提供程序在本地围绕请求和响应运行。
动态添加工具 否,除非已在 Foundry 代理定义上声明这些工具。

当应用程序需要动态工具选择、技能加载或运行时更改模型可见工具的任何行为时使用 Agent(client=FoundryChatClient(...))

运行选项

由于 Foundry 代理定义是事实来源,而不是传递 default_optionsagent.run(...) 遵循的每个选项。

选项 提示代理行为
model 已忽略。 该模型来自 Foundry 代理定义。
toolstool_choiceparallel_tool_calls 从请求中删除。 必须在 Foundry 代理定义中声明工具。
instructions 和系统或开发人员消息 已忽略。 存储的 Foundry 指令是权威的。
conversation_id 在适用的情况下使用并映射到 Foundry 代理会话。
extra_body 转发并合并到框架提供的代理引用。
采样参数、元数据、userstoreresponse_format 转发,但 Foundry 代理或模型配置可以替代或约束它们。

托管代理接收相同的客户端筛选,但部署的代理可以接受、忽略或重新解释任何转发选项。 验证针对特定托管代理的行为。

Tip

需要对指令、生成选项或工具进行按运行控制时使用 Agent(client=FoundryChatClient(...))

管理托管代理服务会话

使用服务端会话的托管代理需要预览响应图面:

当应用程序必须将其绑定到租户或用户时,显式创建服务会话,然后将其标识符包装为代理框架会话。

    queries = [
        "Hi!",
        "Your name is Javis. What can you do?",
        "What is your name?",
    ]
    for query in queries:
        print(f"\nUser: {query}")
        print("Agent: ", end="", flush=True)
        async for chunk in agent.run(query, session=session, stream=True):
            if chunk.text:
                print(chunk.text, end="", flush=True)
    print()


async def run_service_managed_session(
    *,
    agent: FoundryAgent,
    project_client: AIProjectClient,
    agent_name: str,
) -> None:
    """Let Foundry create the hosted-agent session, then delete it when finished."""
    session = AgentSession()
    print("\nService-managed hosted-agent session")
    print(f"Before first request: {session.state.get(FOUNDRY_HOSTED_AGENT_SESSION_ID_KEY)}")
    try:
        await run_conversation(agent, session)
        print(f"After conversation: {session.state.get(FOUNDRY_HOSTED_AGENT_SESSION_ID_KEY)}")
    finally:
        hosted_session_id = session.state.get(FOUNDRY_HOSTED_AGENT_SESSION_ID_KEY)
        if isinstance(hosted_session_id, str) and hosted_session_id:
            await project_client.agents.delete_session(agent_name, hosted_session_id)
            print(f"Deleted session: {hosted_session_id}")


async def run_user_managed_session(
    *,
    agent: FoundryAgent,
    project_client: AIProjectClient,
    agent_name: str,
    agent_version: str | None,
) -> None:
    """Create, attach, and delete a hosted-agent session explicitly."""
    resolved_agent_version = agent_version
    if resolved_agent_version is None:
        agent_details = await project_client.agents.get(agent_name)
        resolved_agent_version = agent_details.versions.latest.version

    hosted_session = await project_client.agents.create_session(
        agent_name,
        version_indicator=VersionRefIndicator(agent_version=resolved_agent_version),
    )
    session = AgentSession()
    session.state[FOUNDRY_HOSTED_AGENT_SESSION_ID_KEY] = hosted_session.agent_session_id

    print("\nUser-managed hosted-agent session")
    print(f"Created session: {hosted_session.agent_session_id}")
    try:
        await run_conversation(agent, session)
    finally:
        await project_client.agents.delete_session(agent_name, hosted_session.agent_session_id)
        print(f"Deleted session: {hosted_session.agent_session_id}")


async def main() -> None:
    credential = AzureCliCredential()
    project_endpoint = os.environ["FOUNDRY_PROJECT_ENDPOINT"]
    agent_name = os.environ["FOUNDRY_AGENT_NAME"]
    agent_version = os.getenv("FOUNDRY_AGENT_VERSION")

    project_client = AIProjectClient(

Tip

有关完整示例,请参阅示例。using_deployed_agent.py

设置自定义 HTTP 超时

FoundryAgent 默认情况下继承 OpenAI SDK 超时。 当多轮对话或网络条件需要不同的限制时,请传入 timeout= 秒。

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",
    credential=AzureCliCredential(),
    timeout=120.0,
)

超时应用于 HTTP 客户端的每个代理副本,不会影响共享相同的 AIProjectClient其他代理。

注释

FoundryAgent Prompt 和托管代理的集成目前不适用于 Agent Framework Go。 有关最新状态,请参阅 Agent Framework Go 存储库

运行、流式传输并继续对话

连接后,使用与其他代理框架代理相同的 API:

  • 使用 RunAsyncrun. 运行请求。
  • 使用 RunStreamingAsyncrun(..., stream=True). 流式传输更新。
  • 重复使用以 AgentSession 继续对话。
  • 当会话必须可见并保留在 Foundry 项目中时,请使用 Foundry 服务器端会话 API。

使 Foundry 代理名称、版本、终结点和会话标识符保持受信任的服务器端状态。 在恢复任何现有对话之前授权呼叫方。

后续步骤