<?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>AI Agents | The .NET Blog</title><link>https://thedotnetblog.com/pl/tags/ai-agents/</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/ai-agents/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><item><title>SQL MCP Server na Azure App Service — bez kontenerów</title><link>https://thedotnetblog.com/pl/news/emiliano-montesdeoca/sql-mcp-server-azure-app-service-no-containers/</link><pubDate>Tue, 05 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/news/emiliano-montesdeoca/sql-mcp-server-azure-app-service-no-containers/</guid><description>SQL MCP Server może teraz działać na Azure App Service bez Dockera ani Kubernetes. Co to oznacza dla deweloperów .NET budujących agentów AI komunikujących się z bazami SQL.</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/sql-mcp-server-azure-app-service-no-containers/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Szczerze mówiąc: za każdym razem, gdy w tutorialu widzę „wymaga kontenera&amp;quot;, coś we mnie wzdycha. Kontenery są świetne — dopóki twój zespół nie ma strategii kontenerowej, a funkcja, która wydawała się prosta, nagle blokuje się na nieoczekiwanej złożoności orkiestracji, której nikt nie zaplanował.&lt;/p&gt;
&lt;p&gt;Dlatego to przykuło moją uwagę. SQL MCP Server może teraz działać na Azure App Service — bez Dockera, bez Kubernetes, tylko z tym samym plikiem konfiguracyjnym Data API Builder (DAB), który eksponuje twoją bazę danych SQL przez MCP, REST i GraphQL.&lt;/p&gt;
&lt;h2 id="czym-jest-sql-mcp-server"&gt;Czym jest SQL MCP Server?&lt;/h2&gt;
&lt;p&gt;Krótkie wprowadzenie, jeśli jeszcze nie kojarzysz. SQL MCP Server siedzi pomiędzy twoim agentem AI a bazą danych SQL. Zamiast dawać agentowi bezpośredni dostęp do bazy (kiepski pomysł), eksponuje twoje tabele i widoki jako warstwę abstrakcji — encje z zdefiniowanymi uprawnieniami.&lt;/p&gt;
&lt;p&gt;Zbudowany na &lt;a href="https://learn.microsoft.com/pl-pl/azure/data-api-builder/"&gt;Data API Builder&lt;/a&gt;, co oznacza, że jeden plik konfiguracyjny zarządza MCP &lt;em&gt;i&lt;/em&gt; REST &lt;em&gt;i&lt;/em&gt; GraphQL jednocześnie. Agent komunikuje się z endpointem MCP. Tradycyjna aplikacja komunikuje się z REST lub GraphQL. Ta sama konfiguracja, to samo środowisko uruchomieniowe, różne powierzchnie.&lt;/p&gt;
&lt;p&gt;To naprawdę przydatne — nie musisz utrzymywać dwóch oddzielnych warstw API.&lt;/p&gt;
&lt;h2 id="problem-z-kontenerami-i-rozwiązanie"&gt;Problem z kontenerami (i rozwiązanie)&lt;/h2&gt;
&lt;p&gt;Pierwotny model wdrożenia SQL MCP Server używał kontenerów. Działa dobrze w wielu zespołach — ale nie we wszystkich. Wiele zespołów .NET standardyzuje na Azure App Service lub maszynach wirtualnych. Wymaganie środowiska uruchomieniowego kontenerów tylko po to, żeby wyeksponować endpoint SQL, dodaje tarcia, o które nikt nie prosił.&lt;/p&gt;
&lt;p&gt;Nowy przewodnik pokazuje, jak całkowicie pominąć kontener. Wszystko działa przez polecenie &lt;code&gt;dab start&lt;/code&gt;, hostowane na App Service jako standardowy proces webowy .NET 8.&lt;/p&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;&lt;span class="c1"&gt;# Zainstaluj Data API Builder&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dotnet tool install microsoft.dataapibuilder --prerelease -g
&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="c1"&gt;# Zainicjuj konfigurację&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dab init --database-type mssql --host-mode Development --connection-string &lt;span class="s2"&gt;&amp;#34;@env(&amp;#39;SQL_CONNECTION_STRING&amp;#39;)&amp;#34;&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="c1"&gt;# Dodaj encję&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dab add products --source dbo.products --permissions &lt;span class="s2"&gt;&amp;#34;authenticated:*&amp;#34;&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="c1"&gt;# Skonfiguruj dostawcę uwierzytelniania App Service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dab configure --runtime.host.authentication.provider AppService
&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="c1"&gt;# Uruchom serwer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dab start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;W tym momencie masz MCP pod &lt;code&gt;/mcp&lt;/code&gt;, REST i GraphQL z tego samego procesu — i nic nie działa w kontenerze.&lt;/p&gt;
&lt;h2 id="uwierzytelnianie-bez-wspólnych-kluczy-api"&gt;Uwierzytelnianie bez wspólnych kluczy API&lt;/h2&gt;
&lt;p&gt;To jest ta część, którą cenię najbardziej. Wdrażając na App Service, konfigurujesz Microsoft Entra ID jako dostawcę uwierzytelniania. Żadnych wspólnych sekretów w plikach konfiguracyjnych, żadnych kluczy API do rotacji.&lt;/p&gt;
&lt;p&gt;Ciąg połączenia pozostaje w zmiennych środowiskowych App Service (nie w &lt;code&gt;dab-config.json&lt;/code&gt;), a endpoint MCP jest chroniony uwierzytelnianiem platformy. Jeśli twoje obciążenia Azure są już zintegrowane z Entra ID, to naturalnie pasuje.&lt;/p&gt;
&lt;p&gt;Do lokalnego developmentu przełącz się na tryb &lt;code&gt;Simulator&lt;/code&gt; i transport STDIO. Wróć do trybu &lt;code&gt;AppService&lt;/code&gt; przed wdrożeniem. Czysto i jednoznacznie.&lt;/p&gt;
&lt;h2 id="wdrożenie-na-app-service"&gt;Wdrożenie na App Service&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;az appservice plan create &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --name &amp;lt;plan-name&amp;gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --resource-group &amp;lt;resource-group&amp;gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --sku B1 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --is-linux
&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;az webapp create &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --name &amp;lt;app-name&amp;gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --resource-group &amp;lt;resource-group&amp;gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --plan &amp;lt;plan-name&amp;gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --runtime &lt;span class="s2"&gt;&amp;#34;DOTNETCORE:8.0&amp;#34;&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;az webapp config &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --name &amp;lt;app-name&amp;gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --resource-group &amp;lt;resource-group&amp;gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --startup-file &lt;span class="s2"&gt;&amp;#34;dab start&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Następnie wdróż swój projekt DAB metodą wdrożenia kodu, której twój zespół już używa. Kluczowy szczegół: to wdrożenie &lt;strong&gt;kodu&lt;/strong&gt;, nie kontenera.&lt;/p&gt;
&lt;h2 id="dlaczego-to-ważne-dla-deweloperów-net"&gt;Dlaczego to ważne dla deweloperów .NET&lt;/h2&gt;
&lt;p&gt;Jeśli budujesz agentów AI w .NET, prędzej czy później agent będzie musiał komunikować się z bazą danych. SQL MCP Server daje ci ustrukturyzowany sposób, żeby to zrobić — bez eksponowania surowych ciągów połączenia.&lt;/p&gt;
&lt;p&gt;Sprawdź pełny przewodnik w &lt;a href="https://devblogs.microsoft.com/azure-sql/sql-mcp-server-app-service/"&gt;oryginalnym poście&lt;/a&gt; i &lt;a href="https://github.com/Azure-Samples/SQL-MCP-NoContainer"&gt;przykładowym repozytorium na GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="podsumowanie"&gt;Podsumowanie&lt;/h2&gt;
&lt;p&gt;SQL MCP Server na App Service to praktyczny wybór dla zespołów .NET, które chcą dać agentom ustrukturyzowany dostęp do danych SQL bez strategii kontenerowej. Wypróbuj — twoi agenci docenią czysty interfejs API.&lt;/p&gt;</content:encoded></item><item><title>Aktualizacja Visual Studio z kwietnia: integracja Cloud Agent dla przepływów pracy .NET</title><link>https://thedotnetblog.com/pl/news/emiliano-montesdeoca/visual-studio-april-update-cloud-agent-integration/</link><pubDate>Mon, 04 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/news/emiliano-montesdeoca/visual-studio-april-update-cloud-agent-integration/</guid><description>Szczegółowy przegląd aktualizacji Visual Studio z kwietnia i tego, co integracja Cloud Agent zmienia w przepływach pracy .NET.</description><content:encoded>&lt;p&gt;&lt;em&gt;Ten post został automatycznie przetłumaczony. Oryginalna wersja dostępna jest &lt;a href="https://thedotnetblog.com/pl/news/emiliano-montesdeoca/visual-studio-april-update-cloud-agent-integration/"&gt;tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://devblogs.microsoft.com/visualstudio/visual-studio-april-update-cloud-agent-integration/"&gt;Visual Studio April Update: Cloud Agent Integration for .NET Workflows&lt;/a&gt; zasługuje na bliższe przyjrzenie się, jeśli budujesz lub obsługujesz systemy .NET w dużej skali.&lt;/p&gt;
&lt;p&gt;Z mojej perspektywy ważne jest nie tyle główna funkcja, ile to, jak szybko zespół może zamienić ją w bezpieczniejszy, powtarzalny przepływ pracy inżynieryjnej.&lt;/p&gt;
&lt;h2 id="dlaczego-ma-to-znaczenie-dla-zespołów-net"&gt;Dlaczego ma to znaczenie dla zespołów .NET&lt;/h2&gt;
&lt;p&gt;Większość zespołów balansuje między szybkością dostarczania, spójnością platformy a zarządzaniem. Ta aktualizacja jest przydatna, ponieważ daje bardziej konkretną ścieżkę poprawy jednego z tych ograniczeń bez przepisywania wszystkiego od nowa.&lt;/p&gt;
&lt;h2 id="praktyczne-kolejne-kroki"&gt;Praktyczne kolejne kroki&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Zwaliduj funkcję w małym pilocie .NET z danymi zbliżonymi do produkcyjnych.&lt;/li&gt;
&lt;li&gt;Dodaj wyraźne punkty kontrolne wycofania i obserwowalności przed szerszym wdrożeniem.&lt;/li&gt;
&lt;li&gt;Zapisz wzorzec implementacji w swoich wewnętrznych szablonach, aby inne zespoły mogły go ponownie wykorzystać.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="źródło"&gt;Źródło&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Oryginalny artykuł: &lt;a href="https://devblogs.microsoft.com/visualstudio/visual-studio-april-update-cloud-agent-integration/"&gt;https://devblogs.microsoft.com/visualstudio/visual-studio-april-update-cloud-agent-integration/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title>Zarządzanie wywołaniami narzędzi MCP w .NET z Agent Governance Toolkit</title><link>https://thedotnetblog.com/pl/news/emiliano-montesdeoca/governing-mcp-tool-calls-dotnet/</link><pubDate>Mon, 04 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/news/emiliano-montesdeoca/governing-mcp-tool-calls-dotnet/</guid><description>Jak wprowadzić zarządzanie, kontrole zasad i bezpieczniejsze wykonanie narzędzi dla agentów .NET opartych na MCP.</description><content:encoded>&lt;p&gt;&lt;em&gt;Ten post został automatycznie przetłumaczony. Oryginalna wersja dostępna jest &lt;a href="https://thedotnetblog.com/pl/news/emiliano-montesdeoca/governing-mcp-tool-calls-dotnet/"&gt;tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://devblogs.microsoft.com/dotnet/governing-mcp-tool-calls-in-dotnet-with-the-agent-governance-toolkit/"&gt;Governing MCP Tool Calls in .NET with the Agent Governance Toolkit&lt;/a&gt; zasługuje na bliższe przyjrzenie się, jeśli budujesz lub obsługujesz systemy .NET w dużej skali.&lt;/p&gt;
&lt;p&gt;Z mojej perspektywy ważne jest nie tyle główna funkcja, ile to, jak szybko zespół może zamienić ją w bezpieczniejszy, powtarzalny przepływ pracy inżynieryjnej.&lt;/p&gt;
&lt;h2 id="dlaczego-ma-to-znaczenie-dla-zespołów-net"&gt;Dlaczego ma to znaczenie dla zespołów .NET&lt;/h2&gt;
&lt;p&gt;Większość zespołów balansuje między szybkością dostarczania, spójnością platformy a zarządzaniem. Ta aktualizacja jest przydatna, ponieważ daje bardziej konkretną ścieżkę poprawy jednego z tych ograniczeń bez przepisywania wszystkiego od nowa.&lt;/p&gt;
&lt;h2 id="praktyczne-kolejne-kroki"&gt;Praktyczne kolejne kroki&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Zwaliduj funkcję w małym pilocie .NET z danymi zbliżonymi do produkcyjnych.&lt;/li&gt;
&lt;li&gt;Dodaj wyraźne punkty kontrolne wycofania i obserwowalności przed szerszym wdrożeniem.&lt;/li&gt;
&lt;li&gt;Zapisz wzorzec implementacji w swoich wewnętrznych szablonach, aby inne zespoły mogły go ponownie wykorzystać.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="źródło"&gt;Źródło&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Oryginalny artykuł: &lt;a href="https://devblogs.microsoft.com/dotnet/governing-mcp-tool-calls-in-dotnet-with-the-agent-governance-toolkit/"&gt;https://devblogs.microsoft.com/dotnet/governing-mcp-tool-calls-in-dotnet-with-the-agent-governance-toolkit/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item></channel></rss>