形態(tài))
目錄1. 應(yīng)用托管型 AgentApplication-owned Agent可用的模型提供商不同 Model Provider 面向 Microsoft Agent Framework 提供的能力.NET SDK 和 Endpoint2. 自定義實(shí)現(xiàn)型 AgentCustom Agent引用 Abstractions 包自定義 AIAgent3. 遠(yuǎn)程托管型 AgentRemote / Managed AgentMicrosoft FoundryGitHub CopilotCopilot StudioAnthropic ClaudeA2A總結(jié)在使用 Microsoft Agent Framework 時(shí)會(huì)接觸到不同類型的 Agent。它們的創(chuàng)建方式、運(yùn)行位置以及管理方式都有所不同。按照微軟官方文檔的劃分可以主要從下面三類來理解應(yīng)用托管型 AgentApplication-owned Agent自定義實(shí)現(xiàn)型 AgentCustom Agent遠(yuǎn)程托管型 AgentRemote / Managed Agent今天我們來解剖一下這三種 Agent 的類型。1. 應(yīng)用托管型 AgentApplication-owned Agent我們首先來介紹第一種。微軟官方的命名是 Model providersApplication-owned Agent 這個(gè)名字是我根據(jù) Agent 的職責(zé)劃分命名的一個(gè)名字你可以理解為他們兩者是等同的。與此同時(shí)這也是我們用得最多的一種形態(tài)。微軟官方在 Model Providers 文檔中是這樣描述這種職責(zé)關(guān)系的模型提供商為 Agent 提供推理客戶端。你的應(yīng)用負(fù)責(zé) Agent 定義、Instructions、Tools、Middleware 和 Session Policy而 Model Provider 負(fù)責(zé)模型推理以及 Provider 托管的相關(guān)能力。簡單來說Agent Runtime 運(yùn)行在自己的應(yīng)用中Agent 的定義和執(zhí)行流程由應(yīng)用控制Model Provider 主要負(fù)責(zé)提供模型推理能力。在 Agent Framework 中ChatClientAgent就是這種開發(fā)方式中非常重要的一個(gè) Agent 實(shí)現(xiàn)。它的基本結(jié)構(gòu)是ChatClientAgent使用IChatClient與底層模型推理服務(wù)進(jìn)行交互。因此Agent 和 Model Provider 實(shí)際上是兩個(gè)不同的概念ChatClientAgent負(fù)責(zé) Agent 的執(zhí)行與運(yùn)行管理Model Provider負(fù)責(zé)提供模型推理客戶端以及 Provider 托管的相關(guān)能力。那么問題來了ChatClientAgent可以使用哪些模型服務(wù)這里并不僅僅只有 Azure。Agent Framework 的ChatClientAgent建立在Microsoft.Extensions.AI.IChatClient抽象之上。任何能夠提供Microsoft.Extensions.AI.IChatClient實(shí)現(xiàn)的推理服務(wù)都可以作為ChatClientAgent的后端模型服務(wù)??捎玫哪P吞峁┥滩煌?Model Provider 面向 Microsoft Agent Framework 提供的能力不同 Model Provider 面向 Agent Framework 暴露或提供的能力并不完全相同。除了基本的模型推理能力之外一些 Provider 還可以提供 Function Tools、 Structured Outputs、Code Interpreter、File Search、MCP Tools、 Background Responses 等能力。.NET SDK 和 Endpoint針對(duì)不同的 AI 服務(wù)或模型服務(wù)Agent Framework 在 .NET 中需要使用 對(duì)應(yīng)的 Client SDK、NuGet Package 以及 Endpoint。到這里第一種 Agent 的開發(fā)方式基本就清楚了……2. 自定義實(shí)現(xiàn)型 AgentCustom Agent大多數(shù)情況下我們可以直接使用 Agent Framework 已經(jīng)提供的ChatClientAgent。但是如果ChatClientAgent的執(zhí)行機(jī)制無法滿足業(yè)務(wù)需求需要自己控制 Agent 的核心執(zhí)行邏輯Agent Framework 還提供了更底層的擴(kuò)展方式直接繼承AIAgent實(shí)現(xiàn)自己的 Agent。Microsoft Agent Framework 支持通過繼承AIAgent類并實(shí)現(xiàn)所需的方法來構(gòu)建 Custom Agent。這里需要注意Custom Agent 并不是和 Application-owned Agent 完全獨(dú)立的另一套運(yùn)行模式。Custom Agent 本質(zhì)上仍然可以運(yùn)行在自己的應(yīng)用中只不過 Agent 的核心執(zhí)行邏輯由開發(fā)者自己實(shí)現(xiàn)。簡單來說當(dāng)現(xiàn)成的ChatClientAgent無法滿足業(yè)務(wù)場景需要自己控制 Session、消息處理、執(zhí)行流程或響應(yīng)生成邏輯時(shí)可以考慮實(shí)現(xiàn) Custom Agent。引用 Abstractions 包自定義 Agent 需要引用dotnet add package Microsoft.Agents.AI.Abstractions自定義 AIAgentCustom Agent 的核心是繼承 AIAgent并實(shí)現(xiàn)必要的 Session 管理和 Agent 執(zhí)行方法。Session 可以基于 InMemoryAgentSession 實(shí)現(xiàn)但并不限定只能使用這一種 Session。下面先通過一個(gè)簡單骨架看看 AIAgent 的主要擴(kuò)展點(diǎn)internal sealedclassMyAgent : AIAgent{ // 1. 創(chuàng)建 Session protected override ValueTaskAgentSession CreateSessionCoreAsync( CancellationToken cancellationToken default) { thrownew NotImplementedException(); } // 2. Session 序列化 protected override ValueTaskJsonElement SerializeSessionCoreAsync( AgentSession session, JsonSerializerOptions? jsonSerializerOptions null, CancellationToken cancellationToken default) { thrownew NotImplementedException(); } // 3. Session 反序列化 protected override ValueTaskAgentSession DeserializeSessionCoreAsync( JsonElement serializedState, JsonSerializerOptions? jsonSerializerOptions null, CancellationToken cancellationToken default) { thrownew NotImplementedException(); } // 4. Agent 非流式執(zhí)行 protected override TaskAgentResponse RunCoreAsync( IEnumerableChatMessage messages, AgentSession? session null, AgentRunOptions? options null, CancellationToken cancellationToken default) { thrownew NotImplementedException(); } // 5. Agent 流式執(zhí)行 protected override async IAsyncEnumerableAgentResponseUpdate RunCoreStreamingAsync( IEnumerableChatMessage messages, AgentSession? session null, AgentRunOptions? options null, [EnumeratorCancellation] CancellationToken cancellationToken default) { thrownew NotImplementedException();#pragma warning disable CS0162 yieldbreak;#pragma warning restore CS0162 }}從這個(gè)骨架可以看到自定義 AIAgent 主要需要處理兩部分內(nèi)容。第一部分是 Session 管理CreateSessionCoreAsyncSerializeSessionCoreAsyncDeserializeSessionCoreAsync第二部分是 Agent 執(zhí)行RunCoreAsyncRunCoreStreamingAsync實(shí)際上Agent Framework 自帶的 ChatClientAgent 本身也是 AIAgent 的一個(gè)具體實(shí)現(xiàn)。Microsoft 已經(jīng)在其中實(shí)現(xiàn)了 Session 管理、非流式執(zhí)行、流式執(zhí)行以及與 IChatClient 交互等邏輯。因此大多數(shù)常規(guī)的模型 Agent 場景直接使用 ChatClientAgent 即可3. 遠(yuǎn)程托管型 AgentRemote / Managed Agent前面兩種方式主要討論的是 Agent Framework 應(yīng)用側(cè)的 Agent 實(shí)現(xiàn)。除此之外Agent Framework 還可以接入已經(jīng)運(yùn)行在遠(yuǎn)程服務(wù)中的 Agent。微軟將這一類集成歸到 Agent Services。Agent Services 提供的是遠(yuǎn)程或托管的 Agent Runtime而不僅僅是模型推理能力。遠(yuǎn)程服務(wù)可以負(fù)責(zé) Agent Definition、Hosted Tools、Permissions、Session 或 Execution Lifecycle這也是遠(yuǎn)程托管型 AgentRemote / Managed Agent和 應(yīng)用托管型 AgentApplication-owned Agent 一個(gè)很重要的區(qū)別應(yīng)用托管型 AgentApplication-owned Agent 主要為應(yīng)用側(cè) Agent 提供模型推理客戶端 遠(yuǎn)程托管型 AgentRemote / Managed Agent則提供遠(yuǎn)程或托管的 Agent RuntimeMicrosoft FoundryMicrosoft Agent Framework 提供了對(duì) Microsoft Foundry Agent Service 的集成。應(yīng)用可以通過 Agent Framework 接入運(yùn)行在 Microsoft Foundry 中的 Prompt Agent 或 Hosted Agent。Agent 的定義、版本、Hosted Tools、Conversation 以及服務(wù)端執(zhí)行可以由 Microsoft Foundry 負(fù)責(zé)。GitHub CopilotAgent Framework 可以接入 GitHub Copilot 的 Coding Agent Runtime。Agent Runtime、Session、權(quán)限以及 Shell、File、URL 等內(nèi)置能力和 MCP 連接由 GitHub Copilot 側(cè)負(fù)責(zé)Agent Framework 則通過統(tǒng)一接口與這個(gè)遠(yuǎn)程 Agent Runtime 進(jìn)行交互。目前該集成支持 C#、Python 和 Go。Copilot StudioAgent Framework 可以接入已經(jīng)發(fā)布到 Copilot Studio 中的 Agent。Agent 的 Topics、Knowledge、Actions、Plugins 以及遠(yuǎn)程執(zhí)行由 Copilot Studio 負(fù)責(zé)應(yīng)用通過 Agent Framework 與這個(gè)遠(yuǎn)程 Agent 進(jìn)行交互。目前該集成支持 C# 和 Python。Anthropic ClaudeAgent Framework 可以接入由 Claude Agent SDK 提供的 Agent Runtime。Agent Runtime、Session、權(quán)限、內(nèi)置 Tools 和 MCP 連接由 Claude Agent SDK 側(cè)負(fù)責(zé)。目前 Agent Framework 的這項(xiàng) Agent Service 集成支持 Python。A2AAgent Framework 還可以通過 A2A 接入符合 A2A 規(guī)范的遠(yuǎn)程 Agent。遠(yuǎn)程 Agent 負(fù)責(zé)自己的 Agent Definition、Tools、Session、Task 和 ExecutionAgent Framework 通過 A2A 與其進(jìn)行交互。目前該集成支持 C#、Python 和 Go??偨Y(jié)理解 Microsoft Agent Framework 中的 Agent可以先抓住一個(gè)關(guān)鍵問題Agent Runtime 到底運(yùn)行在哪里誰負(fù)責(zé) Agent 的執(zhí)行如果 Agent 運(yùn)行在自己的應(yīng)用中通??梢灾苯邮褂?ChatClientAgent通過 IChatClient 接入不同的 Model Provider。如果現(xiàn)成的 ChatClientAgent 無法滿足需求需要自己控制 Session、執(zhí)行流程或響應(yīng)生成邏輯可以繼承 AIAgent 實(shí)現(xiàn) Custom Agent。如果 Agent 已經(jīng)運(yùn)行在 Microsoft Foundry、GitHub Copilot、Copilot Studio、Claude Agent SDK 或其他支持的遠(yuǎn)程環(huán)境中則可以通過 Agent Framework 的 Agent Services 集成進(jìn)行調(diào)用。把 Agent 本身、Model Provider 和 Agent Service 這三個(gè)概念分開之后Microsoft Agent Framework 的整體結(jié)構(gòu)就比較容易理解了。引入地址