<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Microsoft Agent Framework | The .NET Blog</title><link>https://thedotnetblog.com/pl/tags/microsoft-agent-framework/</link><description>Articles, tutorials and insights from the .NET community.</description><generator>Hugo</generator><language>pl</language><managingEditor>@thedotnetblog (The .NET Blog)</managingEditor><webMaster>@thedotnetblog</webMaster><lastBuildDate>Tue, 05 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://thedotnetblog.com/pl/tags/microsoft-agent-framework/index.xml" rel="self" type="application/rss+xml"/><item><title>Microsoft Agent Framework Część 3: Od narzędzi do przepływów pracy — klocki zatrzaskują się na miejscu</title><link>https://thedotnetblog.com/pl/news/emiliano-montesdeoca/maf-building-blocks-part-3-agents-tools-workflows/</link><pubDate>Tue, 05 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/news/emiliano-montesdeoca/maf-building-blocks-part-3-agents-tools-workflows/</guid><description>Trzecia część serii Building Blocks for AI w .NET omawia Microsoft Agent Framework — od pojedynczych agentów z narzędziami po przepływy multiagentowe z pamięcią. Oto co naprawdę ważne.</description><content:encoded>&lt;p&gt;&lt;em&gt;Ten post został przetłumaczony automatycznie. Aby zobaczyć oryginalną wersję, &lt;a href="https://thedotnetblog.com/pl/news/emiliano-montesdeoca/maf-building-blocks-part-3-agents-tools-workflows/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Jeśli śledzisz serię Building Blocks for AI w .NET, wiesz: Część 1 dała nam &lt;code&gt;IChatClient&lt;/code&gt; (uniwersalny interfejs modelu), a Część 2 — &lt;code&gt;Microsoft.Extensions.VectorData&lt;/code&gt; (wyszukiwanie semantyczne i RAG). Oba są podstawowe i przydatne same w sobie. Ale tutaj wszystko zaczyna się łączyć.&lt;/p&gt;
&lt;p&gt;Część 3 dotyczy &lt;a href="https://github.com/microsoft/agent-framework"&gt;Microsoft Agent Framework&lt;/a&gt; — i szczerze, to właśnie ten kawałek czekałem, żeby zobaczyć w .NET. Wersja 1.0 wyszła w kwietniu. API jest stabilne. Czas budować prawdziwych agentów.&lt;/p&gt;
&lt;h2 id="czym-tak-naprawdę-jest-agent-vs-chatbot"&gt;Czym tak naprawdę jest agent (vs. chatbot)&lt;/h2&gt;
&lt;p&gt;Zanim wejdziemy w kod, wyjaśnijmy to rozróżnienie. Chatbot odbiera input, wywołuje model, zwraca output. Prosta pętla.&lt;/p&gt;
&lt;p&gt;Agent ma &lt;em&gt;autonomię&lt;/em&gt;. Może rozumować nad zadaniem, zdecydować, które narzędzia użyć, wywołać je, ocenić wyniki i zdecydować, co zrobić dalej — wszystko bez pisania eksplicitnej logiki krok po kroku dla każdego scenariusza. Dajesz mu narzędzia i instrukcje, a on sam zajmuje się orkiestracją.&lt;/p&gt;
&lt;p&gt;Pomyśl tak: &lt;code&gt;IChatClient&lt;/code&gt; to jak prowadzenie rozmowy. Agent to jak delegowanie listy zadań komuś.&lt;/p&gt;
&lt;h2 id="twój-pierwszy-agent-w-10-liniach"&gt;Twój pierwszy agent w 10 liniach&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dotnet add package Microsoft.Agents.AI
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;AIAgent&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;AzureOpenAIClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Uri&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;endpoint&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;DefaultAzureCredential&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetChatClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;deploymentName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AsAIAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;You are good at telling jokes.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Joker&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Tell me a joke about a pirate.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Metoda rozszerzająca &lt;code&gt;.AsAIAgent()&lt;/code&gt; jest mostem. Ten sam wzorzec co &lt;code&gt;.AsIChatClient()&lt;/code&gt; z MEAI — opakowuje SDK dostawcy w stabilną abstrakcję. Działa z Azure OpenAI, OpenAI, GitHub Models, Microsoft Foundry lub lokalnymi modelami.&lt;/p&gt;
&lt;p&gt;Streaming też działa:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunStreamingAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Tell me a joke about a pirate.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="dawanie-narzędzi-agentowi"&gt;Dawanie narzędzi agentowi&lt;/h2&gt;
&lt;p&gt;Tu agenci przestają być wyszukanymi chatbotami. Narzędzia to funkcje, które model może zdecydować się wywołać na podstawie tego, o co prosi użytkownik. Nie potrzebujesz logiki routingu — model sam to rozgryzie.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;[Description(&amp;#34;Get the weather for a given location.&amp;#34;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;GetWeather&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt; [Description(&amp;#34;The location to get the weather for.&amp;#34;)]&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;location&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;$&amp;#34;The weather in {location} is cloudy with a high of 15°C.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;AIAgent&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;chatClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AsAIAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;You are a helpful assistant&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;AIFunctionFactory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GetWeather&lt;/span&gt;&lt;span class="p"&gt;)]);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Dwie rzeczy do zanotowania. Po pierwsze, &lt;code&gt;AIFunctionFactory&lt;/code&gt; pochodzi z MEAI — ta sama fabryka narzędzi, której używałbyś z normalnym &lt;code&gt;IChatClient&lt;/code&gt;. Jeśli masz już zdefiniowane narzędzia dla scenariuszy czatowych, działają tu też.&lt;/p&gt;
&lt;p&gt;Po drugie, atrybuty &lt;code&gt;Description&lt;/code&gt; mają ogromne znaczenie. To dzięki nim model rozumie, co narzędzie robi i kiedy go użyć. Traktuj je jako dokumentację dla twojej AI, nie dla ludzi.&lt;/p&gt;
&lt;h2 id="sesje-rozmowy-które-naprawdę-pamiętają"&gt;Sesje: Rozmowy, które naprawdę pamiętają&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;AgentSession&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreateSessionAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Tell me a joke about a pirate.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;Now add some emojis and tell it in the voice of a pirate&amp;#39;s parrot.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Bez sesji każde wywołanie &lt;code&gt;RunAsync&lt;/code&gt; jest bezstanowe. Z sesją agent wie, o którym żarcie mówisz. &lt;code&gt;AgentSession&lt;/code&gt; zachowuje historię rozmowy między turami.&lt;/p&gt;
&lt;p&gt;Dla bezstanowych usług produkcyjnych sesje serializują się czysto:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;JsonElement&lt;/span&gt; &lt;span class="n"&gt;sessionState&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SerializeSessionAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// ... przechowaj gdzieś ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;restoredSession&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DeserializeSessionAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sessionState&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;What were we just talking about?&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;restoredSession&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To kluczowe, jeśli twój agent działa w środowisku serverless lub poziomo skalowanym.&lt;/p&gt;
&lt;h2 id="aicontextprovider-trwała-pamięć-między-sesjami"&gt;AIContextProvider: Trwała pamięć między sesjami&lt;/h2&gt;
&lt;p&gt;Sesje zachowują historię rozmowy &lt;em&gt;wewnątrz&lt;/em&gt; sesji. Ale co z wiedzą o użytkowniku między sesjami? &lt;code&gt;AIContextProvider&lt;/code&gt; to obsługuje.&lt;/p&gt;
&lt;p&gt;Ma dwa haki:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;ProvideAIContextAsync&lt;/code&gt;&lt;/strong&gt; — wykonuje się &lt;em&gt;przed&lt;/em&gt; każdą interakcją, wstrzykuje kontekst do agenta&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;StoreAIContextAsync&lt;/code&gt;&lt;/strong&gt; — wykonuje się &lt;em&gt;po&lt;/em&gt; każdej interakcji, pozwala na uczenie i utrwalanie&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wzorzec jest elegancki: możesz układać wiele dostawców w stos — jeden dla preferencji użytkownika, jeden dla ostatnich interakcji, jeden który odpytuje twój store VectorData o odpowiednie dokumenty. Ten ostatni to dokładnie wzorzec RAG z Części 2, teraz wykonywany automatycznie przy każdym wywołaniu agenta.&lt;/p&gt;
&lt;h2 id="przepływy-multiagentowe"&gt;Przepływy multiagentowe&lt;/h2&gt;
&lt;p&gt;Tutaj framework zasługuje na swoją nazwę. Zawiera oparty na grafach system przepływów pracy, gdzie egzekutory (agenci, funkcje, cokolwiek) łączą się przez krawędzie.&lt;/p&gt;
&lt;p&gt;Kilka natywnie obsługiwanych wzorców:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sekwencyjny&lt;/strong&gt;: Wyjście Agenta A zasila Agenta B&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Współbieżny (fan-out/fan-in)&lt;/strong&gt;: Dyspatchuje do wielu agentów równolegle, zbiera wyniki&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Warunkowe routowanie&lt;/strong&gt;: Kieruje pracę do różnych agentów w zależności od wyjścia&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pętle pisarz-krytyk&lt;/strong&gt;: Jeden agent pisze, drugi ocenia, pętla do zatwierdzenia&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pod-przepływy&lt;/strong&gt;: Hierarchiczne komponowanie przepływów&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Przykład pisarz-krytyk:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;WorkflowBuilder&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;writerAgent&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;builder&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddEdge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;writerAgent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;criticAgent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddEdge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;criticAgent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;writerAgent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsApproved&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithOutputFrom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;criticAgent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsApproved&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;workflow&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Czyste, czytelne, i routowanie oparte na warunkach oznacza, że logiki pętli nie piszesz sam.&lt;/p&gt;
&lt;h2 id="human-in-the-loop"&gt;Human-in-the-Loop&lt;/h2&gt;
&lt;p&gt;Nie wszystko powinno działać w pełni autonomicznie. Dla wrażliwych operacji — zapisów do bazy danych, transakcji finansowych, wysyłania komunikatów — chcesz, żeby człowiek zatwierdził przed wykonaniem przez agenta.&lt;/p&gt;
&lt;p&gt;Framework ma wbudowane wsparcie dla tego poprzez &lt;code&gt;FunctionApprovalRequestContent&lt;/code&gt; i &lt;code&gt;FunctionApprovalResponseContent&lt;/code&gt;. Agent proponuje wywołanie narzędzia, twój kod aplikacji przedstawia je użytkownikowi, a odpowiedź decyduje, czy wykonanie postępuje.&lt;/p&gt;
&lt;p&gt;To właściwy sposób myślenia o agentach w środowiskach korporacyjnych: nie w pełni autonomiczni, ale &lt;em&gt;autonomia z barierkami&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id="pełny-obraz"&gt;Pełny obraz&lt;/h2&gt;
&lt;p&gt;Jeśli cofniesz się o krok:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MEAI&lt;/strong&gt; daje ci uniwersalny interfejs do dowolnego modelu&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;VectorData&lt;/strong&gt; daje twoim agentom dostęp do wiedzy organizacji przez wyszukiwanie semantyczne&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agent Framework&lt;/strong&gt; orkiestruje wszystko — używa &lt;code&gt;IChatClient&lt;/code&gt; pod spodem, komponuje się z dostawcami kontekstu, koordynuje przez przepływy&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Każda część została zaprojektowana, by komponować się z innymi. Sprawdź &lt;a href="https://devblogs.microsoft.com/dotnet/microsoft-agent-framework-building-blocks-for-ai-part-3/"&gt;oryginalny post Jeremy&amp;rsquo;ego Liknessa&lt;/a&gt; i &lt;a href="https://github.com/microsoft/agent-framework/tree/main/dotnet"&gt;repozytorium GitHub Agent Framework&lt;/a&gt; dla pełnych przykładów.&lt;/p&gt;
&lt;h2 id="podsumowanie"&gt;Podsumowanie&lt;/h2&gt;
&lt;p&gt;Post Część 3 Microsoft Agent Framework zamyka pętlę serii Building Blocks. Dla deweloperów .NET chcących budować agentów AI — nie tylko chatboty, ale prawdziwych agentów używających narzędzi, pamiętających rzeczy i koordynujących — to jest twoja droga naprzód.&lt;/p&gt;
&lt;p&gt;Stabilny release 1.0 oznacza, że możesz budować na tym w produkcji. Jeśli czekałeś, żeby wskoczyć w tworzenie agentów w .NET, ten moment jest teraz.&lt;/p&gt;</content:encoded></item></channel></rss>