關於 Microsoft 管理的 Foundry Hosted Agents、自行託管,以及使用 Durable Extension 的持久執行之比較,請參見 Hosting Agent Framework 應用程式。
ASP.NET Core 託管
代理框架提供託管函式庫,讓你能將 AI 代理整合進 ASP.NET 核心應用程式。 這些函式庫簡化了透過各種協定註冊、設定及暴露代理程式的過程。
如 Agents 所述, 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,該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]);
});
以 AIAgent 形式公開工作流程
若要將協定整合(如 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 受託 Agent 是主要的受控託管選項。 完成 Foundry Hosted Agents 的前置條件,包括 Azure Developer CLI AI 代理擴充功能及 Azure CLI 登入。
入門範例會建立一個已停用伺服器端模型儲存體的 Agent,並啟動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 Hosted Agents。
使用 A2A 協定進行託管
Go 版本透過 a2aprovider 提供 A2A 託管功能,將代理封裝為與 Agent-to-Agent 通訊協定相容的 HTTP 處理常式。
備註
目前 Go 還沒有 Durable Extension 主機。 欲了解最新的 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 協定 — 基於網頁的代理使用者介面
- 主機總覽 — 選擇 Foundry 託管代理、自家託管或耐用主機
- Foundry Hosted Agents — 將 Agent Framework 代理部署至受管理的託管環境
- Foundry Hosted Agents 範例(Python)— 執行基本的回應範例