有关 Microsoft 托管的 Foundry 托管代理、自托管和通过 Durable Extension 实现的持久执行的比较,请参阅 托管代理框架应用程序。
在 ASP.NET Core 中托管
代理框架提供托管库,使你能够将 AI 代理集成到 ASP.NET Core 应用程序中。 这些库简化了通过各种协议注册、配置和公开代理的过程。
如 代理中所述, AIAgent 是 Agent Framework 中的基本代理抽象。 它定义了一个“LLM 包装器”,它处理用户输入、做出决策、调用工具,并执行其他工作来执行作并生成响应。 从 ASP.NET Core 应用程序公开 AI 代理并不简单。 托管库通过在依赖项注入容器中注册 AI 代理来解决此问题,使你能够在应用程序服务中解析和使用它们。 它们还允许你从同一容器管理代理依赖项,例如工具和会话存储。 代理可以与应用程序基础结构一起托管,与所使用的协议无关。 同样,工作流可以托管并利用应用程序的通用基础结构。
核心托管库
该 Microsoft.Agents.AI.Hosting 库是 ASP.NET Core 中托管 AI 代理的基础。 它提供用于 IHostApplicationBuilder 注册和配置 AI 代理和工作流的扩展。 在 ASP.NET Core 中, IHostApplicationBuilder 是表示托管应用程序和服务的生成器、管理配置、日志记录、生存期等的基本类型。
在配置代理或工作流之前,在依赖项注入容器中注册 IChatClient 。 在下面的示例中,它注册为名为 chat-model 的键控单例:
// endpoint is your Microsoft Foundry project endpoint
// deploymentName is 'gpt-4o-mini' for example
IChatClient chatClient = new AIProjectClient(
new Uri(endpoint),
new DefaultAzureCredential())
.GetProjectOpenAIClient()
.GetProjectResponsesClient()
.AsIChatClient(deploymentName);
builder.Services.AddSingleton(chatClient);
Warning
DefaultAzureCredential 对于开发来说很方便,但在生产中需要仔细考虑。 在生产环境中,请考虑使用特定凭据(例如), ManagedIdentityCredential以避免延迟问题、意外凭据探测以及回退机制的潜在安全风险。
AddAIAgent
使用依赖项注入注册 AI 代理:
var pirateAgent = builder.AddAIAgent(
"pirate",
instructions: "You are a pirate. Speak like a pirate",
description: "An agent that speaks like a pirate.",
chatClientServiceKey: "chat-model");
该方法 AddAIAgent() 返回一个 IHostedAgentBuilder,它提供用于配置代理的扩展方法。 例如,可以将工具添加到代理:
var pirateAgent = builder.AddAIAgent("pirate", instructions: "You are a pirate. Speak like a pirate")
.WithAITool(new MyTool()); // MyTool is a custom type derived from AITool
还可以配置会话存储(会话数据的存储):
var pirateAgent = builder.AddAIAgent("pirate", instructions: "You are a pirate. Speak like a pirate")
.WithInMemorySessionStore();
AddWorkflow
登记协调多个代理的工作流。 工作流本质上是一个“图形”,其中每个节点都是一个 AIAgent,代理相互通信。
在此示例中,两个代理按顺序工作。 用户输入首先被发送到 agent-1,然后生成响应并将其发送到 agent-2。 然后,工作流将输出最终响应。 还有一种方法 BuildConcurrent 可以创建并发代理工作流。
builder.AddAIAgent("agent-1", instructions: "you are agent 1!");
builder.AddAIAgent("agent-2", instructions: "you are agent 2!");
var workflow = builder.AddWorkflow("my-workflow", (sp, key) =>
{
var agent1 = sp.GetRequiredKeyedService<AIAgent>("agent-1");
var agent2 = sp.GetRequiredKeyedService<AIAgent>("agent-2");
return AgentWorkflowBuilder.BuildSequential(key, [agent1, agent2]);
});
将工作流作为 AI 智能体公开
若要将协议集成(如 A2A 或 OpenAI)与工作流配合使用,请将其转换为独立代理。 目前,工作流本身不提供类似的集成功能,因此需要执行此转换步骤:
var workflowAsAgent = builder
.AddWorkflow("science-workflow", (sp, key) => { ... })
.AddAsAIAgent(); // Now the workflow can be used as an agent
实现细节
托管库充当桥接外部通信协议和代理框架内部 AIAgent 实现的协议适配器。 使用托管集成库时,该库从依赖项注入中检索已注册的 AIAgent,并将其通过协议特定的中间件进行封装以翻译传入的请求和传出响应,然后调用 AIAgent 来处理请求。 此体系结构使代理实现与协议无关。
例如,将 ASP.NET Core 托管库与 A2A 协议适配器配合使用:
// Register the agent
var pirateAgent = builder.AddAIAgent("pirate",
instructions: "You are a pirate. Speak like a pirate",
description: "An agent that speaks like a pirate.");
// Expose via a protocol (e.g. A2A)
builder.Services.AddA2AServer();
var app = builder.Build();
app.MapA2AServer();
app.Run();
Microsoft Foundry 托管智能体是主要的托管承载选项。 完成 Foundry 托管代理的先决条件,包括Azure开发人员 CLI AI 代理扩展和Azure CLI登录。
该入门示例创建一个禁用了服务器端模型存储的智能体,并启动了一个 ResponsesHostServer:
from agent_framework import Agent
from agent_framework.foundry import FoundryChatClient, ResponsesHostServer
from azure.identity import DefaultAzureCredential
def main() -> None:
agent = Agent(
client=FoundryChatClient(
project_endpoint="https://your-account.services.ai.azure.com/api/projects/your-project",
model="gpt-6-luna",
credential=DefaultAzureCredential(),
),
instructions="You are a friendly assistant. Keep your answers brief.",
default_options={"store": False},
)
ResponsesHostServer(agent=agent, history_source="agent_server").run()
if __name__ == "__main__":
main()
替换硬编码的项目终结点和模型部署名称,然后从 Agent Framework 存储库根目录本地运行 PEP 723 示例:
uv run python/samples/01-get-started/07_hosting.py
若要部署完整的托管代理项目,请通过受维护的示例的 azure.yaml 对其进行初始化:
mkdir my-hosted-agent && cd my-hosted-agent
azd ai agent init -t https://github.com/microsoft-foundry/foundry-samples/blob/main/samples/python/hosted-agents/agent-framework/responses/01-basic/azure.yaml --src .
运行代理主机:
azd ai agent run
在另一个终端中,调用本地代理:
azd ai agent invoke --local "Hello!"
Tip
请参阅 完整的入门示例 和 完整的部署示例。 有关部署指南,请参阅 Foundry 托管代理。
使用 A2A 协议进行托管
Go 版本通过 a2aprovider 提供 A2A 托管功能,它将代理包装为与 Agent-to-Agent 协议兼容的 HTTP 处理程序。
注释
持久扩展托管当前不适用于 Go。 有关最新的 Go SDK 状态,请参阅 Agent Framework Go 存储库。
创建代理:
import (
"github.com/microsoft/agent-framework-go/agent"
"github.com/microsoft/agent-framework-go/provider/a2aprovider"
"github.com/microsoft/agent-framework-go/provider/foundryprovider"
"github.com/a2aproject/a2a-go/v2/a2a"
"github.com/a2aproject/a2a-go/v2/a2asrv"
)
a := foundryprovider.NewAgent(endpoint, token, foundryprovider.ModelDeployment(model), foundryprovider.AgentConfig{
Instructions: "You are a helpful assistant.",
Config: agent.Config{
},
})
通过 A2A 公开智能体:
url := "http://localhost:5000"
card := &a2a.AgentCard{
Name: "MyAgent",
Description: "A helpful assistant.",
Version: "1.0.0",
DefaultInputModes: []string{"text"},
DefaultOutputModes: []string{"text"},
Capabilities: a2a.AgentCapabilities{Streaming: false},
SupportedInterfaces: []*a2a.AgentInterface{
a2a.NewAgentInterface(url, a2a.TransportProtocolJSONRPC),
},
}
mux := http.NewServeMux()
requestHandler := a2asrv.NewHandler(
a2aprovider.NewExecutor(a, a2aprovider.ExecutorConfig{}),
a2asrv.WithExtendedAgentCard(card),
)
mux.Handle("/", a2asrv.NewJSONRPCHandler(requestHandler))
mux.Handle(a2asrv.WellKnownAgentCardPath, a2asrv.NewStaticAgentCardHandler(card))
log.Println("A2A server listening on :5000")
http.ListenAndServe(":5000", mux)
Tip
有关完整的可运行示例,请参阅 完整的 A2A 客户端-服务器示例 。
后续步骤
更深入:
- A2A 代理服务— 使用远程 A2A 代理
- A2A 托管 — 通过 A2A 对外提供 Agent Framework 代理
- Durable Extension — 用于托管 C# 和 Python 代理及工作流
- AG-UI 协议 - 基于 Web 的代理 UI
- 托管概述 - 选择 Foundry 托管代理、自承载或持久托管
- Foundry 托管代理 — 将 Agent Framework 代理部署到托管环境
- Foundry 托管代理示例 (Python) - 运行基本响应示例