<?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>The .NET Blog</title><link>https://thedotnetblog.com/pl/</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>Sat, 25 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://thedotnetblog.com/pl/index.xml" rel="self" type="application/rss+xml"/><item><title>.NET 10 Jest Dostarczany z Ubuntu 26.04 LTS — Co Nowego</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/dotnet-ubuntu-2604-resolute-raccoon-net10/</link><pubDate>Sat, 25 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/dotnet-ubuntu-2604-resolute-raccoon-net10/</guid><description>Ubuntu 26.04 LTS (Resolute Raccoon) wyszedł z .NET 10 jako toolchain pierwszej klasy. Native AOT, kontenery chiseled, Linux 7.0.</description><content:encoded>&lt;p&gt;&lt;em&gt;Ten post został automatycznie przetłumaczony. Aby zobaczyć oryginalną wersję, &lt;a href="https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/dotnet-ubuntu-2604-resolute-raccoon-net10/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;To dzień Ubuntu LTS. &lt;a href="https://canonical.com/blog/canonical-releases-ubuntu-26-04-lts-resolute-raccoon"&gt;Ubuntu 26.04 (Resolute Raccoon)&lt;/a&gt; wyszedł dziś z &lt;a href="https://devblogs.microsoft.com/dotnet/whats-new-for-dotnet-in-ubuntu-2604/"&gt;.NET 10&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="zainstaluj-net-10-dwoma-poleceniami"&gt;Zainstaluj .NET 10 dwoma poleceniami&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;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install dotnet-sdk-10.0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="kontenery-zaktualizuj--noble-do--resolute"&gt;Kontenery: zaktualizuj &lt;code&gt;-noble&lt;/code&gt; do &lt;code&gt;-resolute&lt;/code&gt;&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;sed -i &lt;span class="s2"&gt;&amp;#34;s/noble/resolute/g&amp;#34;&lt;/span&gt; Dockerfile
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="native-aot-uruchomienie-w-3ms-binarny-plik-14mb"&gt;Native AOT: uruchomienie w 3ms, binarny plik 1,4MB&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;apt install -y dotnet-sdk-aot-10.0 clang
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dotnet publish app.cs
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# natywny plik binarny 1,4MB, uruchomienie w 3ms&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Dla cloud-native workloadów, gdzie czas zimnego startu ma znaczenie — Functions, kontenery, serverless — prawdziwa zmiana gry.&lt;/p&gt;
&lt;h2 id="potrzebujesz-net-8-lub-9"&gt;Potrzebujesz .NET 8 lub 9?&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;apt install -y software-properties-common
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;add-apt-repository ppa:dotnet/backports
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt install -y dotnet-sdk-8.0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="https://devblogs.microsoft.com/dotnet/whats-new-for-dotnet-in-ubuntu-2604/"&gt;Pełny post&lt;/a&gt; zawiera więcej szczegółów.&lt;/p&gt;</content:encoded></item><item><title>Azure MCP Server jest Teraz .mcpb — Instaluj bez Żadnego Runtime</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/azure-mcp-server-mcpb-no-runtime-install/</link><pubDate>Sat, 25 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/azure-mcp-server-mcpb-no-runtime-install/</guid><description>Azure MCP Server jest teraz dostępny jako MCP Bundle (.mcpb) — pobierz, przeciągnij do Claude Desktop i gotowe. Bez Node.js, Python czy .NET.</description><content:encoded>&lt;p&gt;&lt;em&gt;Ten post został automatycznie przetłumaczony. Aby zobaczyć oryginalną wersję, &lt;a href="https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/azure-mcp-server-mcpb-no-runtime-install/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Wiesz, co było irytujące w konfiguracji serwerów MCP? Potrzebowałeś runtime. Node.js dla wersji npm, Python dla pip/uvx, .NET SDK dla wariantu dotnet.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://devblogs.microsoft.com/azure-sdk/azure-mcp-server-mcpb-support/"&gt;Azure MCP Server właśnie to zmienił&lt;/a&gt;. Jest teraz dostępny jako &lt;code&gt;.mcpb&lt;/code&gt; — MCP Bundle — a konfiguracja to przeciągnij i upuść.&lt;/p&gt;
&lt;h2 id="czym-jest-mcp-bundle"&gt;Czym jest MCP Bundle?&lt;/h2&gt;
&lt;p&gt;Pomyśl o tym jak o rozszerzeniu VS Code (&lt;code&gt;.vsix&lt;/code&gt;) lub rozszerzeniu przeglądarki (&lt;code&gt;.crx&lt;/code&gt;), ale dla serwerów MCP. Plik &lt;code&gt;.mcpb&lt;/code&gt; to samodzielne archiwum ZIP zawierające binarny plik serwera i wszystkie jego zależności.&lt;/p&gt;
&lt;h2 id="jak-zainstalować"&gt;Jak zainstalować&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;1. Pobierz bundle dla swojej platformy&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Przejdź na &lt;a href="https://github.com/microsoft/mcp/releases?q=Azure.Mcp.Server"&gt;stronę GitHub Releases&lt;/a&gt; i pobierz plik &lt;code&gt;.mcpb&lt;/code&gt; dla swojego OS i architektury.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Zainstaluj w Claude Desktop&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Najłatwiej: przeciągnij plik &lt;code&gt;.mcpb&lt;/code&gt; do okna Claude Desktop na stronie ustawień Rozszerzeń (&lt;code&gt;☰ → Plik → Ustawienia → Rozszerzenia&lt;/code&gt;). Przejrzyj szczegóły serwera, kliknij Zainstaluj, potwierdź.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Uwierzytelnij się w Azure&lt;/strong&gt;&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;az login
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="na-początek"&gt;Na początek&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pobieranie&lt;/strong&gt;: &lt;a href="https://github.com/microsoft/mcp/releases?q=Azure.Mcp.Server-"&gt;GitHub Releases&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Repozytorium&lt;/strong&gt;: &lt;a href="https://aka.ms/azmcp"&gt;aka.ms/azmcp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dokumentacja&lt;/strong&gt;: &lt;a href="https://aka.ms/azmcp/docs"&gt;aka.ms/azmcp/docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sprawdź &lt;a href="https://devblogs.microsoft.com/azure-sdk/azure-mcp-server-mcpb-support/"&gt;pełny post&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>CodeAct w Agent Framework: Jak zmniejszyć opóźnienie agenta o połowę</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/codeact-agent-framework-hyperlight-50-percent-faster/</link><pubDate>Sat, 25 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/codeact-agent-framework-hyperlight-50-percent-faster/</guid><description>CodeAct kompresuje wieloetapowe łańcuchy narzędzi do jednego izolowanego bloku kodu — zmniejszając opóźnienie o 52% i zużycie tokenów o 64%.</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/posts/emiliano-montesdeoca/codeact-agent-framework-hyperlight-50-percent-faster/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;W każdym projekcie agentów przychodzi moment, gdy patrzysz na ślad i myślisz: „Dlaczego to tak długo trwa?&amp;quot; Model działa dobrze. Narzędzia działają. Ale jest siedem rund komunikacji, żeby uzyskać wynik, który można obliczyć za jednym razem.&lt;/p&gt;
&lt;p&gt;To właśnie problem, który rozwiązuje CodeAct — a &lt;a href="https://devblogs.microsoft.com/agent-framework/codeact-with-hyperlight/"&gt;zespół Agent Framework właśnie wydał wsparcie alfa&lt;/a&gt; przez nowy pakiet &lt;code&gt;agent-framework-hyperlight&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="czym-jest-codeact"&gt;Czym jest CodeAct?&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://arxiv.org/abs/2402.01030"&gt;Wzorzec CodeAct&lt;/a&gt; jest elegancko prosty: zamiast dawać modelowi listę narzędzi do wywoływania jedno po drugim, dajesz mu jedno narzędzie &lt;code&gt;execute_code&lt;/code&gt; i pozwalasz wyrazić &lt;em&gt;cały plan&lt;/em&gt; jako krótki program w Pythonie.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Podejście&lt;/th&gt;
&lt;th&gt;Czas&lt;/th&gt;
&lt;th&gt;Tokeny&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Tradycyjne&lt;/td&gt;
&lt;td&gt;27,81s&lt;/td&gt;
&lt;td&gt;6 890&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CodeAct&lt;/td&gt;
&lt;td&gt;13,23s&lt;/td&gt;
&lt;td&gt;2 489&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Poprawa&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;52,4%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;63,9%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="bezpieczeństwo-mikro-vm-hyperlight"&gt;Bezpieczeństwo: Mikro-VM Hyperlight&lt;/h2&gt;
&lt;p&gt;Pakiet &lt;code&gt;agent-framework-hyperlight&lt;/code&gt; używa mikro-VM &lt;a href="https://github.com/hyperlight-dev/hyperlight"&gt;Hyperlight&lt;/a&gt;. Każde wywołanie &lt;code&gt;execute_code&lt;/code&gt; otrzymuje własną, świeżo utworzoną mikro-VM. Uruchomienie mierzone jest w milisekundach. Izolacja jest praktycznie bezpłatna.&lt;/p&gt;
&lt;p&gt;Twoje narzędzia nadal działają na hoście. Kod kleju wygenerowany przez model działa w piaskownicy. To właściwy podział.&lt;/p&gt;
&lt;h2 id="minimalna-konfiguracja"&gt;Minimalna konfiguracja&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;agent_framework&lt;/span&gt; &lt;span class="kn"&gt;import&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;tool&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;agent_framework_hyperlight&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;HyperlightCodeActProvider&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;codeact&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;HyperlightCodeActProvider&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="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;get_weather&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;approval_mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;never_require&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Agent&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;client&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;client&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="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;CodeActAgent&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;instructions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&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;context_providers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;codeact&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="kiedy-używać-codeact-a-kiedy-nie"&gt;Kiedy używać CodeAct (a kiedy nie)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Używaj CodeAct, gdy:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Zadanie łączy wiele małych wywołań narzędzi (wyszukiwania, łączenia, obliczenia)&lt;/li&gt;
&lt;li&gt;Ważne są opóźnienie i koszt tokenów&lt;/li&gt;
&lt;li&gt;Potrzebujesz silnej izolacji dla kodu generowanego przez model&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Zostań przy tradycyjnym wywołaniu narzędzi, gdy:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Agent robi tylko jedno lub dwa wywołania na turę&lt;/li&gt;
&lt;li&gt;Każde wywołanie ma skutki uboczne wymagające indywidualnego zatwierdzenia&lt;/li&gt;
&lt;li&gt;Opisy narzędzi są skąpe lub niejednoznaczne&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="wypróbuj-teraz"&gt;Wypróbuj teraz&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;pip install agent-framework-hyperlight --pre
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Przeczytaj &lt;a href="https://devblogs.microsoft.com/agent-framework/codeact-with-hyperlight/"&gt;pełny post na blogu Agent Framework&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Gdzie Twój Agent Pamięta Rzeczy? Praktyczny Przewodnik po Przechowywaniu Historii Czatu</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/chat-history-storage-patterns-agent-framework/</link><pubDate>Sat, 25 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/chat-history-storage-patterns-agent-framework/</guid><description>Zarządzane przez usługę czy klienta? Liniowe czy z rozgałęzieniami? Decyzja architektoniczna, która decyduje o tym, co naprawdę może robić Twój agent AI — z przykładami kodu w C# i Python.</description><content:encoded>&lt;p&gt;&lt;em&gt;Ten post został automatycznie przetłumaczony. Aby zobaczyć oryginalną wersję, &lt;a href="https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/chat-history-storage-patterns-agent-framework/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Budując agenta AI, większość energii poświęcasz na model, narzędzia i prompty. Pytanie &lt;em&gt;gdzie żyje historia rozmowy&lt;/em&gt; wydaje się szczegółem implementacyjnym — ale jest jedną z najważniejszych decyzji architektonicznych, jakie podejmiesz.&lt;/p&gt;
&lt;p&gt;Decyduje o tym, czy użytkownicy mogą rozgałęziać rozmowy, cofać odpowiedzi, wznawiać sesje po restarcie oraz czy Twoje dane kiedykolwiek opuszczają Twoją infrastrukturę. &lt;a href="https://devblogs.microsoft.com/agent-framework/chat-history-storage-patterns-in-microsoft-agent-framework/"&gt;Zespół Agent Framework opublikował szczegółową analizę&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="dwa-podstawowe-wzorce"&gt;Dwa podstawowe wzorce&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Zarządzane przez usługę&lt;/strong&gt;: usługa AI przechowuje stan rozmowy. Twoja aplikacja trzyma referencję, a usługa automatycznie dołącza odpowiednią historię do każdego żądania.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Zarządzane przez klienta&lt;/strong&gt;: Twoja aplikacja utrzymuje pełną historię i wysyła odpowiednie wiadomości z każdym żądaniem. Usługa jest bezstanowa. Kontrolujesz wszystko.&lt;/p&gt;
&lt;h2 id="jak-agent-framework-to-abstrahuje"&gt;Jak Agent Framework to abstrahuje&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 class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;first&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;Mam na imię Alice.&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 class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;second&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;Jak mam na imię?&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create_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="n"&gt;first&lt;/span&gt; &lt;span class="o"&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="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Mam na imię Alice.&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="o"&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="n"&gt;second&lt;/span&gt; &lt;span class="o"&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="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Jak mam na imię?&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="o"&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="szybki-przegląd-dostawców"&gt;Szybki przegląd dostawców&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dostawca&lt;/th&gt;
&lt;th&gt;Przechowywanie&lt;/th&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Kompaktowanie&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;OpenAI/Azure Chat Completions&lt;/td&gt;
&lt;td&gt;Klient&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;Ty&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Foundry Agent Service&lt;/td&gt;
&lt;td&gt;Usługa&lt;/td&gt;
&lt;td&gt;Liniowy&lt;/td&gt;
&lt;td&gt;Usługa&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Responses API (domyślnie)&lt;/td&gt;
&lt;td&gt;Usługa&lt;/td&gt;
&lt;td&gt;Rozgałęziający&lt;/td&gt;
&lt;td&gt;Usługa&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Anthropic Claude, Ollama&lt;/td&gt;
&lt;td&gt;Klient&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;Ty&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="jak-wybrać"&gt;Jak wybrać&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Potrzebujesz rozgałęzień lub „cofnij&amp;quot;?&lt;/strong&gt; → Responses API zarządzane przez usługę&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Potrzebujesz suwerenności danych?&lt;/strong&gt; → Zarządzane przez klienta z backendem DB&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prosty chatbot?&lt;/strong&gt; → Liniowe zarządzane przez usługę wystarczy&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Przeczytaj &lt;a href="https://devblogs.microsoft.com/agent-framework/chat-history-storage-patterns-in-microsoft-agent-framework/"&gt;pełny post&lt;/a&gt; po kompletne drzewo decyzyjne.&lt;/p&gt;</content:encoded></item><item><title>GPT-5.5 Jest Tutaj i Trafia do Azure Foundry — Co Muszą Wiedzieć Deweloperzy .NET</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/gpt-55-foundry-ga-what-dotnet-developers-need-to-know/</link><pubDate>Sat, 25 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/gpt-55-foundry-ga-what-dotnet-developers-need-to-know/</guid><description>GPT-5.5 jest ogólnie dostępny w Microsoft Foundry. Ewolucja od GPT-5 do 5.5, co naprawdę się poprawiło i jak zacząć używać go w swoich agentach już dziś.</description><content:encoded>&lt;p&gt;&lt;em&gt;Ten post został automatycznie przetłumaczony. Aby zobaczyć oryginalną wersję, &lt;a href="https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/gpt-55-foundry-ga-what-dotnet-developers-need-to-know/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Microsoft właśnie ogłosił, że &lt;a href="https://azure.microsoft.com/en-us/blog/openais-gpt-5-5-in-microsoft-foundry-frontier-intelligence-on-an-enterprise-ready-platform/"&gt;GPT-5.5 jest ogólnie dostępny w Microsoft Foundry&lt;/a&gt;. Jeśli budujesz agentów na Azure, to jest aktualizacja, na którą czekałeś.&lt;/p&gt;
&lt;h2 id="ewolucja-gpt-5"&gt;Ewolucja GPT-5&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GPT-5&lt;/strong&gt;: połączył rozumowanie i szybkość w jednym systemie&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPT-5.4&lt;/strong&gt;: silniejsze rozumowanie wieloetapowe, wczesne możliwości agentyczne dla enterprise&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPT-5.5&lt;/strong&gt;: głębsze rozumowanie w długim kontekście, bardziej niezawodne wykonanie agentyczne, lepsza wydajność tokenów&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="co-naprawdę-się-zmieniło"&gt;Co naprawdę się zmieniło&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Ulepszone kodowanie agentyczne&lt;/strong&gt;: GPT-5.5 utrzymuje kontekst w dużych bazach kodu, diagnozuje awarie architektoniczne i przewiduje wymagania testowe. Model rozumuje, na &lt;em&gt;co jeszcze&lt;/em&gt; wpływa poprawka, zanim zadziała.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Wydajność tokenów&lt;/strong&gt;: Wyższa jakość danych wyjściowych przy mniejszej liczbie tokenów i mniej prób. Bezpośrednio obniżone koszty i opóźnienia w produkcji.&lt;/p&gt;
&lt;h2 id="cennik"&gt;Cennik&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Wejście ($/M tokenów)&lt;/th&gt;
&lt;th&gt;Pamięć podręczna&lt;/th&gt;
&lt;th&gt;Wyjście ($/M tokenów)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.5&lt;/td&gt;
&lt;td&gt;$5,00&lt;/td&gt;
&lt;td&gt;$0,50&lt;/td&gt;
&lt;td&gt;$30,00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.5 Pro&lt;/td&gt;
&lt;td&gt;$30,00&lt;/td&gt;
&lt;td&gt;$3,00&lt;/td&gt;
&lt;td&gt;$180,00&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="dlaczego-foundry-jest-ważny"&gt;Dlaczego Foundry jest ważny&lt;/h2&gt;
&lt;p&gt;Foundry Agent Service umożliwia definiowanie agentów w YAML lub połączenie ich z Microsoft Agent Framework, GitHub Copilot SDK, LangGraph lub OpenAI Agents SDK — i uruchamianie ich jako izolowanych hostowanych agentów z trwałym systemem plików, tożsamością Microsoft Entra i cenami scale-to-zero.&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;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;aiProjectClient&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 class="s"&gt;&amp;#34;gpt-5.5&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&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;Jesteś pomocnym asystentem.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&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;MójAgent&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;Sprawdź &lt;a href="https://azure.microsoft.com/en-us/blog/openais-gpt-5-5-in-microsoft-foundry-frontier-intelligence-on-an-enterprise-ready-platform/"&gt;pełne ogłoszenie&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>VS Code 1.118: Copilot CLI Dostaje Nazwy Sesji, Odznaki Modelu i TypeScript 7.0 Nightly</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/vscode-1-118-copilot-cli-session-names-model-badge/</link><pubDate>Sat, 25 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/vscode-1-118-copilot-cli-session-names-model-badge/</guid><description>Visual Studio Code 1.118 to skoncentrowane wydanie skupione na ulepszeniach Copilot CLI — nazwy sesji, odznaki modelu, automatyczny wybór modelu i opt-in do TypeScript 7.0 Nightly.</description><content:encoded>&lt;p&gt;&lt;em&gt;Ten post został przetłumaczony automatycznie. Aby zobaczyć wersję oryginalną, &lt;a href="https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/vscode-1-118-copilot-cli-session-names-model-badge/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://code.visualstudio.com/updates/v1_118"&gt;Visual Studio Code 1.118&lt;/a&gt; to mniejsze, skoncentrowane wydanie — głównie usprawnienia Copilot CLI.&lt;/p&gt;
&lt;h2 id="copilot-cli-sesje-mają-prawdziwe-nazwy"&gt;Copilot CLI: sesje mają prawdziwe nazwy&lt;/h2&gt;
&lt;p&gt;API tytułów sesji SDK Copilot CLI jest teraz używane jako źródło prawdy dla nazw sesji. Zamiast automatycznie generowanych etykiet, sesje wyświetlają prawdziwą nazwę z SDK.&lt;/p&gt;
&lt;h2 id="szybsze-przełączanie-sesji"&gt;Szybsze przełączanie sesji&lt;/h2&gt;
&lt;p&gt;Aplikacja Agents ma teraz przypisane &lt;code&gt;Ctrl+1&lt;/code&gt;, &lt;code&gt;Ctrl+2&lt;/code&gt; itp. do szybkiego przełączania między sesjami.&lt;/p&gt;
&lt;h2 id="odznaki-modelu-w-czacie"&gt;Odznaki modelu w czacie&lt;/h2&gt;
&lt;p&gt;Odpowiedzi Copilot CLI w panelu czatu pokazują teraz odznakę modelu — na pierwszy rzut oka widać, który model obsłużył każde żądanie.&lt;/p&gt;
&lt;h2 id="automatyczny-wybór-modelu-w-copilot-cli"&gt;Automatyczny wybór modelu w Copilot CLI&lt;/h2&gt;
&lt;p&gt;Funkcja automatycznego wyboru modelu działa teraz również w agencie Copilot CLI.&lt;/p&gt;
&lt;h2 id="opt-in-do-typescript-70-nightly"&gt;Opt-in do TypeScript 7.0 Nightly&lt;/h2&gt;
&lt;p&gt;Możesz teraz wybrać testowanie TypeScript 7.0 nightly bezpośrednio z ustawień VS Code. TypeScript 7.0 to znaczące wydanie (&lt;a href="https://devblogs.microsoft.com/typescript/announcing-typescript-7-0-beta/"&gt;beta wyszła kilka dni temu&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Zobacz &lt;a href="https://code.visualstudio.com/updates/v1_118"&gt;pełne informacje o wydaniu&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Foundry Toolboxes: Jeden endpoint dla wszystkich narzędzi agentów AI</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/foundry-toolboxes-curate-manage-tools-ai-agents/</link><pubDate>Thu, 23 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/foundry-toolboxes-curate-manage-tools-ai-agents/</guid><description>Microsoft Foundry uruchomił Toolboxes w publicznym podglądzie — sposób na zarządzanie narzędziami agentów AI i ich udostępnianie przez jeden endpoint zgodny z MCP.</description><content:encoded>&lt;p&gt;&lt;em&gt;Ten artykuł został przetłumaczony automatycznie. Aby zobaczyć oryginalną wersję, &lt;a href="https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/foundry-toolboxes-curate-manage-tools-ai-agents/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Jest problem, który wydaje się błahy — dopóki się na niego nie natrafi. Organizacja buduje wiele agentów AI, każdy wymaga narzędzi, a każdy zespół konfiguruje je od zera. Ta sama integracja wyszukiwania, ta sama konfiguracja Azure AI Search, to samo połączenie z serwerem GitHub MCP — ale w innym repozytorium, przez inny zespół, z innymi danymi uwierzytelniającymi i bez wspólnego zarządzania.&lt;/p&gt;
&lt;p&gt;Microsoft Foundry właśnie uruchomił &lt;a href="https://devblogs.microsoft.com/foundry/introducing-toolboxes-in-foundry/"&gt;Toolboxes&lt;/a&gt; w publicznym podglądzie — bezpośrednia odpowiedź na ten problem.&lt;/p&gt;
&lt;h2 id="czym-jest-toolbox"&gt;Czym jest Toolbox?&lt;/h2&gt;
&lt;p&gt;Toolbox to nazwany, wielokrotnie używalny zestaw narzędzi, który definiuje się raz w Foundry i udostępnia przez jeden endpoint zgodny z MCP. Każde środowisko uruchomieniowe agenta obsługujące MCP może je konsumować — bez uzależnienia od Foundry Agents.&lt;/p&gt;
&lt;p&gt;Obietnica jest prosta: &lt;strong&gt;build once, consume anywhere&lt;/strong&gt;. Zdefiniuj narzędzia, skonfiguruj uwierzytelnianie centralnie (OAuth passthrough, tożsamość zarządzana Entra), opublikuj endpoint. Każdy agent potrzebujący tych narzędzi łączy się raz i dostaje je wszystkie.&lt;/p&gt;
&lt;h2 id="cztery-filary-dwa-dostępne-dziś"&gt;Cztery filary (dwa dostępne dziś)&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Filar&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;th&gt;Co robi&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Discover&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Wkrótce&lt;/td&gt;
&lt;td&gt;Znajdowanie zatwierdzonych narzędzi bez ręcznego szukania&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Build&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dostępny&lt;/td&gt;
&lt;td&gt;Grupowanie narzędzi w wielokrotnie używalny bundle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Consume&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dostępny&lt;/td&gt;
&lt;td&gt;Jeden endpoint MCP udostępnia wszystkie narzędzia&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Govern&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Wkrótce&lt;/td&gt;
&lt;td&gt;Centralne uwierzytelnianie + obserwowalność wszystkich wywołań&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="przykład-praktyczny"&gt;Przykład praktyczny&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;azure.identity&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;DefaultAzureCredential&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;azure.ai.projects&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AIProjectClient&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;os&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;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AIProjectClient&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;endpoint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;FOUNDRY_PROJECT_ENDPOINT&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;credential&lt;/span&gt;&lt;span class="o"&gt;=&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&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;toolbox_version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;beta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;toolboxes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create_toolbox_version&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;toolbox_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;customer-feedback-triaging-toolbox&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;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Przeszukaj dokumentację i odpowiedz na issues GitHub.&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="o"&gt;=&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="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;web_search&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Szukaj publicznej dokumentacji&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 class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;azure_ai_search&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;index_name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;internal-docs&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 class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;mcp_server&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;server_url&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://your-github-mcp-server.com&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="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Po opublikowaniu Foundry udostępnia ujednolicony endpoint. Jedno połączenie — wszystkie narzędzia.&lt;/p&gt;
&lt;h2 id="brak-uzależnienia-od-foundry-agents"&gt;Brak uzależnienia od Foundry Agents&lt;/h2&gt;
&lt;p&gt;Toolboxes są &lt;strong&gt;tworzone i zarządzane&lt;/strong&gt; w Foundry, ale powierzchnią konsumpcji jest otwarty protokół MCP. Można ich używać z niestandardowych agentów (Microsoft Agent Framework, LangGraph), GitHub Copilot i innych środowisk IDE zgodnych z MCP.&lt;/p&gt;
&lt;h2 id="dlaczego-to-ważne-teraz"&gt;Dlaczego to ważne teraz&lt;/h2&gt;
&lt;p&gt;Fala wielu agentów dociera do produkcji. Każdy nowy agent to nowa powierzchnia zduplikowanej konfiguracji, przestarzałych danych uwierzytelniających i niespójnego zachowania. Podstawa Build + Consume wystarczy, by zacząć centralizować. Gdy pojawi się filar Govern, będzie dostępna w pełni obserwowalna, centralnie kontrolowana warstwa narzędzi dla całej floty agentów.&lt;/p&gt;
&lt;h2 id="podsumowanie"&gt;Podsumowanie&lt;/h2&gt;
&lt;p&gt;To jeszcze wczesny etap — publiczny podgląd, Python SDK na początku, Discover i Govern jeszcze przed nami. Ale model jest solidny, a natywny design MCP oznacza, że działa z narzędziami, które już się buduje. Szczegóły w &lt;a href="https://devblogs.microsoft.com/foundry/introducing-toolboxes-in-foundry/"&gt;oficjalnym ogłoszeniu&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Hooki azd w Python, TypeScript i .NET: koniec ze skryptami shell</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/azd-hooks-python-javascript-typescript-dotnet/</link><pubDate>Thu, 23 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/azd-hooks-python-javascript-typescript-dotnet/</guid><description>Azure Developer CLI obsługuje teraz hooki w Python, JavaScript, TypeScript i .NET. Koniec z przełączaniem się na Bash tylko po to, żeby uruchomić skrypt migracji.</description><content:encoded>&lt;p&gt;&lt;em&gt;Ten artykuł został przetłumaczony automatycznie. Aby zobaczyć oryginalną wersję, &lt;a href="https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/azd-hooks-python-javascript-typescript-dotnet/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Jeśli kiedykolwiek miałeś projekt w całości napisany w .NET i mimo to musiałeś pisać skrypty Bash dla hooków azd — znasz ten ból. Po co przełączać się na składnię shell w kroku pre-provisioning, skoro reszta projektu to C#?&lt;/p&gt;
&lt;p&gt;Ta frustracja ma teraz oficjalne rozwiązanie. Azure Developer CLI &lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-multi-language-hooks/"&gt;właśnie wprowadził obsługę wielu języków dla hooków&lt;/a&gt;, i jest dokładnie tak dobre, jak brzmi.&lt;/p&gt;
&lt;h2 id="czym-są-hooki"&gt;Czym są hooki&lt;/h2&gt;
&lt;p&gt;Hooki to skrypty wykonywane w kluczowych punktach cyklu życia &lt;code&gt;azd&lt;/code&gt; — przed provisioningiem, po deploymencie i nie tylko. Definiuje się je w &lt;code&gt;azure.yaml&lt;/code&gt; i pozwalają na wstrzyknięcie własnej logiki bez modyfikowania CLI.&lt;/p&gt;
&lt;p&gt;Wcześniej obsługiwane były tylko Bash i PowerShell. Teraz można używać &lt;strong&gt;Pythona, JavaScript, TypeScript lub .NET&lt;/strong&gt; — resztą zajmuje się &lt;code&gt;azd&lt;/code&gt; automatycznie.&lt;/p&gt;
&lt;h2 id="jak-działa-wykrywanie"&gt;Jak działa wykrywanie&lt;/h2&gt;
&lt;p&gt;Wystarczy wskazać hook na plik, a &lt;code&gt;azd&lt;/code&gt; wywnioskuje język z rozszerzenia:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;hooks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;preprovision&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;./hooks/setup.py&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;postdeploy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;./hooks/seed.ts&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;postprovision&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;./hooks/migrate.cs&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Bez dodatkowej konfiguracji. Jeśli rozszerzenie jest niejednoznaczne, można jawnie podać &lt;code&gt;kind: python&lt;/code&gt; (lub odpowiedni język).&lt;/p&gt;
&lt;h2 id="ważne-szczegóły-według-języka"&gt;Ważne szczegóły według języka&lt;/h2&gt;
&lt;h3 id="python"&gt;Python&lt;/h3&gt;
&lt;p&gt;Umieść &lt;code&gt;requirements.txt&lt;/code&gt; lub &lt;code&gt;pyproject.toml&lt;/code&gt; obok skryptu (lub w dowolnym katalogu nadrzędnym). &lt;code&gt;azd&lt;/code&gt; automatycznie tworzy środowisko wirtualne, instaluje zależności i uruchamia skrypt.&lt;/p&gt;
&lt;h3 id="javascript-i-typescript"&gt;JavaScript i TypeScript&lt;/h3&gt;
&lt;p&gt;Ten sam wzorzec — &lt;code&gt;package.json&lt;/code&gt; blisko skryptu, a &lt;code&gt;azd&lt;/code&gt; najpierw wykona &lt;code&gt;npm install&lt;/code&gt;. Dla TypeScript używa &lt;code&gt;npx tsx&lt;/code&gt; bez etapu kompilacji i bez &lt;code&gt;tsconfig.json&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="net"&gt;.NET&lt;/h3&gt;
&lt;p&gt;Dwa dostępne tryby:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tryb projektu&lt;/strong&gt;: jeśli obok skryptu jest &lt;code&gt;.csproj&lt;/code&gt;, &lt;code&gt;azd&lt;/code&gt; automatycznie uruchamia &lt;code&gt;dotnet restore&lt;/code&gt; i &lt;code&gt;dotnet build&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tryb single-file&lt;/strong&gt;: na .NET 10+ samodzielne pliki &lt;code&gt;.cs&lt;/code&gt; uruchamiają się bezpośrednio przez &lt;code&gt;dotnet run script.cs&lt;/code&gt;. Plik projektu nie jest wymagany.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="konfiguracja-dla-konkretnego-executora"&gt;Konfiguracja dla konkretnego executora&lt;/h2&gt;
&lt;p&gt;Każdy język obsługuje opcjonalny blok &lt;code&gt;config&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;hooks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;preprovision&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;./hooks/setup.ts&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;packageManager&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;pnpm&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;postprovision&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;./hooks/migrate.cs&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;configuration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Release&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;framework&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;net10.0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="dlaczego-to-ważne-dla-programistów-net"&gt;Dlaczego to ważne dla programistów .NET&lt;/h2&gt;
&lt;p&gt;Hooki były ostatnim miejscem w projekcie opartym na azd, które wymuszało zmianę języka. Teraz cały pipeline deploymentu — od kodu aplikacji po hooki cyklu życia — może żyć w jednym języku. Można ponownie wykorzystywać istniejące narzędzia .NET w hookach, referencować współdzielone biblioteki i porzucić utrzymywanie skryptów shell.&lt;/p&gt;
&lt;h2 id="podsumowanie"&gt;Podsumowanie&lt;/h2&gt;
&lt;p&gt;Jedna z tych zmian, które wydają się drobne, ale naprawdę redukują codzienne tarcia w pracy z azd. Obsługa wielu języków dla hooków jest dostępna teraz — pełna dokumentacja w &lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-multi-language-hooks/"&gt;oficjalnym poście&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Windows App Dev CLI v0.3: F5 z terminala i UI Automation dla agentów</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/windows-app-dev-cli-v03-run-ui-automation/</link><pubDate>Thu, 23 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/windows-app-dev-cli-v03-run-ui-automation/</guid><description>Windows App Development CLI v0.3 przynosi winapp run do uruchamiania i debugowania z terminala, winapp ui do automatyzacji interfejsu oraz nowy pakiet NuGet umożliwiający działanie dotnet run z zapakowanymi aplikacjami.</description><content:encoded>&lt;p&gt;&lt;em&gt;Ten artykuł został przetłumaczony automatycznie. Aby zobaczyć oryginał, &lt;a href="https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/windows-app-dev-cli-v03-run-ui-automation/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Doświadczenie F5 w Visual Studio jest świetne. Ale otwieranie VS tylko po to, żeby uruchomić i debugować zapakowaną aplikację Windows — czy to w potoku CI, zautomatyzowanym workflowie, czy gdy agent AI wykonuje testy — to zbędny narzut.&lt;/p&gt;
&lt;p&gt;Windows App Development CLI v0.3 właśnie &lt;a href="https://devblogs.microsoft.com/ifdef-windows/windows-app-development-cli-v0-3-new-run-and-ui-commands-plus-dotnet-run-support-for-packaged-apps/"&gt;wyszło&lt;/a&gt; i rozwiązuje ten problem bezpośrednio dzięki dwóm głównym funkcjom: &lt;code&gt;winapp run&lt;/code&gt; i &lt;code&gt;winapp ui&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="winapp-run-f5-z-dowolnego-miejsca"&gt;winapp run: F5 z dowolnego miejsca&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;winapp run&lt;/code&gt; przyjmuje folder niezapakowanej aplikacji i manifest, wykonując wszystko, co VS robi przy uruchamianiu debugowania: rejestruje luźny pakiet, uruchamia aplikację i zachowuje &lt;code&gt;LocalState&lt;/code&gt; między ponownymi deploymentami.&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;# Zbuduj aplikację, a następnie uruchom ją jako zapakowaną aplikację&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;winapp run ./bin/Debug
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Działa dla WinUI, WPF, WinForms, Console, Avalonia i innych. Tryby są zaprojektowane zarówno dla deweloperów, jak i zautomatyzowanych workflowów:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--detach&lt;/code&gt;&lt;/strong&gt;: Uruchamia i natychmiast zwraca kontrolę do terminala. Idealny dla CI.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--unregister-on-exit&lt;/code&gt;&lt;/strong&gt;: Usuwa zarejestrowany pakiet przy zamknięciu aplikacji.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--debug-output&lt;/code&gt;&lt;/strong&gt;: Przechwytuje komunikaty &lt;code&gt;OutputDebugString&lt;/code&gt; i wyjątki w czasie rzeczywistym.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="nowy-pakiet-nuget-dotnet-run-dla-zapakowanych-aplikacji"&gt;Nowy pakiet NuGet: dotnet run dla zapakowanych aplikacji&lt;/h2&gt;
&lt;p&gt;Dla deweloperów .NET jest nowy pakiet NuGet: &lt;code&gt;Microsoft.Windows.SDK.BuildTools.WinApp&lt;/code&gt;. Po instalacji &lt;code&gt;dotnet run&lt;/code&gt; obsługuje cały inner loop: budowanie, przygotowanie pakietu loose-layout, rejestrację w Windows i uruchomienie — wszystko w jednym kroku.&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;winapp init
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# lub&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dotnet add package Microsoft.Windows.SDK.BuildTools.WinApp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="winapp-ui-ui-automation-z-wiersza-poleceń"&gt;winapp ui: UI Automation z wiersza poleceń&lt;/h2&gt;
&lt;p&gt;To funkcja otwierająca scenariusze agentyczne. &lt;code&gt;winapp ui&lt;/code&gt; zapewnia pełny dostęp UI Automation do dowolnej działającej aplikacji Windows — WPF, WinForms, Win32, Electron, WinUI3 — bezpośrednio z terminala.&lt;/p&gt;
&lt;p&gt;Co można robić:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Wylistować wszystkie okna najwyższego poziomu&lt;/li&gt;
&lt;li&gt;Nawigować po pełnym drzewie UI Automation dowolnego okna&lt;/li&gt;
&lt;li&gt;Wyszukiwać elementy po nazwie, typie lub ID automatyzacji&lt;/li&gt;
&lt;li&gt;Klikać, wywoływać i ustawiać wartości&lt;/li&gt;
&lt;li&gt;Robić zrzuty ekranu&lt;/li&gt;
&lt;li&gt;Czekać na pojawienie się elementów — idealne do synchronizacji testów&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Połączenie &lt;code&gt;winapp ui&lt;/code&gt; z &lt;code&gt;winapp run&lt;/code&gt; daje kompletny workflow build → uruchomienie → weryfikacja z terminala. Agent może uruchomić aplikację, sprawdzić stan UI, programowo z nią interagować i zwalidować wynik.&lt;/p&gt;
&lt;h2 id="inne-nowości"&gt;Inne nowości&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;winapp unregister&lt;/code&gt;&lt;/strong&gt;: Usuwa sideloadowany pakiet po zakończeniu pracy.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;winapp manifest add-alias&lt;/code&gt;&lt;/strong&gt;: Dodaje alias do uruchamiania aplikacji po nazwie z terminala.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Uzupełnianie tabulatorem&lt;/strong&gt;: Jedno polecenie do skonfigurowania uzupełniania w PowerShell.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="jak-zdobyć"&gt;Jak zdobyć&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;winget install Microsoft.WinAppCli
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# lub&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install -g @microsoft/winappcli
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;CLI jest w publicznym podglądzie. Pełna dokumentacja dostępna w &lt;a href="https://github.com/microsoft/WinAppCli"&gt;repozytorium GitHub&lt;/a&gt;, a wszystkie szczegóły w &lt;a href="https://devblogs.microsoft.com/ifdef-windows/windows-app-development-cli-v0-3-new-run-and-ui-commands-plus-dotnet-run-support-for-packaged-apps/"&gt;oryginalnym ogłoszeniu&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>azd + GitHub Copilot: Konfiguracja projektu z AI i inteligentne rozwiązywanie błędów</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/azd-copilot-integration-ai-setup-troubleshooting/</link><pubDate>Tue, 21 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/azd-copilot-integration-ai-setup-troubleshooting/</guid><description>Azure Developer CLI integruje się teraz z GitHub Copilot, żeby wygenerować infrastrukturę projektu i naprawiać błędy wdrożeń — bez wychodzenia z terminala.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ten artykuł został przetłumaczony automatycznie. Oryginalną wersję angielską znajdziesz &lt;a href="https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/azd-copilot-integration-ai-setup-troubleshooting/"&gt;tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Znasz ten moment, gdy chcesz wdrożyć istniejącą aplikację na Azure i patrzysz na pusty &lt;code&gt;azure.yaml&lt;/code&gt;, próbując przypomnieć sobie, czy Twoje Express API powinno używać Container Apps czy App Service? Ten moment właśnie stał się znacznie krótszy.&lt;/p&gt;
&lt;p&gt;Azure Developer CLI (&lt;code&gt;azd&lt;/code&gt;) integruje się teraz z GitHub Copilot na dwa konkretne sposoby: scaffolding projektu wspomagany przez AI podczas &lt;code&gt;azd init&lt;/code&gt; oraz inteligentne rozwiązywanie błędów gdy wdrożenia kończą się niepowodzeniem. Obie funkcje działają całkowicie w terminalu.&lt;/p&gt;
&lt;h2 id="konfiguracja-z-copilotem-podczas-azd-init"&gt;Konfiguracja z Copilotem podczas azd init&lt;/h2&gt;
&lt;p&gt;Po uruchomieniu &lt;code&gt;azd init&lt;/code&gt; pojawia się opcja &amp;ldquo;Set up with GitHub Copilot (Preview)&amp;rdquo;. Wybierz ją, a Copilot przeanalizuje Twój codebase i wygeneruje &lt;code&gt;azure.yaml&lt;/code&gt;, szablony infrastruktury oraz moduły Bicep — na podstawie Twojego rzeczywistego kodu.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;azd init
# Wybierz: &amp;#34;Set up with GitHub Copilot (Preview)&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Wymagania:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;azd 1.23.11 lub nowszy&lt;/strong&gt; — sprawdź przez &lt;code&gt;azd version&lt;/code&gt; lub zaktualizuj przez &lt;code&gt;azd update&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Aktywna subskrypcja GitHub Copilot&lt;/strong&gt; (Individual, Business lub Enterprise)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub CLI (&lt;code&gt;gh&lt;/code&gt;)&lt;/strong&gt; — &lt;code&gt;azd&lt;/code&gt; poprosi o logowanie jeśli potrzeba&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To co uważam za naprawdę użyteczne: działa w obu kierunkach. Budujesz od zera? Copilot pomaga skonfigurować właściwe usługi Azure od początku. Masz istniejącą aplikację do wdrożenia? Wskaż Copilotem na nią — konfiguracja zostanie wygenerowana bez konieczności restrukturyzacji kodu.&lt;/p&gt;
&lt;h3 id="co-faktycznie-robi"&gt;Co faktycznie robi&lt;/h3&gt;
&lt;p&gt;Powiedzmy, że masz Node.js Express API z zależnością od PostgreSQL. Zamiast ręcznie wybierać między Container Apps a App Service, a potem pisać Bicep od zera, Copilot wykrywa Twój stack i generuje:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;azure.yaml&lt;/code&gt; z właściwymi ustawieniami &lt;code&gt;language&lt;/code&gt;, &lt;code&gt;host&lt;/code&gt; i &lt;code&gt;build&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Moduł Bicep dla Azure Container Apps&lt;/li&gt;
&lt;li&gt;Moduł Bicep dla Azure Database for PostgreSQL&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Przed jakąkolwiek zmianą przeprowadzane są wstępne sprawdzenia — weryfikuje czystość katalogu roboczego git, pyta z wyprzedzeniem o zgodę na narzędzia serwera MCP. Nic nie dzieje się bez Twojej wiedzy.&lt;/p&gt;
&lt;h2 id="rozwiązywanie-błędów-z-copilotem"&gt;Rozwiązywanie błędów z Copilotem&lt;/h2&gt;
&lt;p&gt;Błędy wdrożenia są nieuniknione. Brakujące parametry, problemy z uprawnieniami, dostępność SKU — a komunikat o błędzie rzadko mówi to, co naprawdę musisz wiedzieć: &lt;em&gt;jak to naprawić&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Bez Copilota pętla wygląda tak: skopiuj błąd → szukaj w dokumentacji → czytaj trzy niepowiązane odpowiedzi na Stack Overflow → uruchom kilka poleceń &lt;code&gt;az&lt;/code&gt; CLI → spróbuj ponownie. Z Copilotem w &lt;code&gt;azd&lt;/code&gt; ta pętla znika. Gdy jakiekolwiek polecenie &lt;code&gt;azd&lt;/code&gt; kończy się błędem, natychmiast oferuje cztery opcje:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Explain&lt;/strong&gt; — wyjaśnienie w zrozumiałym języku, co poszło nie tak&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Guidance&lt;/strong&gt; — instrukcje krok po kroku jak naprawić problem&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Diagnose and Guide&lt;/strong&gt; — pełna analiza + Copilot stosuje poprawkę (za Twoją zgodą) + opcjonalne ponowienie&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Skip&lt;/strong&gt; — samodzielna obsługa&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Kluczowa kwestia: Copilot ma już kontekst Twojego projektu, nieudanego polecenia i szczegółów błędu. Jego sugestie są specyficzne dla &lt;em&gt;Twojej sytuacji&lt;/em&gt;.&lt;/p&gt;
&lt;h3 id="ustawianie-domyślnego-zachowania"&gt;Ustawianie domyślnego zachowania&lt;/h3&gt;
&lt;p&gt;Jeśli zawsze wybierasz tę samą opcję, pomiń interaktywny monit:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;azd config set copilot.errorHandling.category troubleshoot
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Wartości: &lt;code&gt;explain&lt;/code&gt;, &lt;code&gt;guidance&lt;/code&gt;, &lt;code&gt;troubleshoot&lt;/code&gt;, &lt;code&gt;fix&lt;/code&gt;, &lt;code&gt;skip&lt;/code&gt;. Możesz też włączyć automatyczną naprawę i ponowienie:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;azd config set copilot.errorHandling.fix allow
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Powrót do trybu interaktywnego w dowolnym momencie:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;azd config unset copilot.errorHandling.category
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="podsumowanie"&gt;Podsumowanie&lt;/h2&gt;
&lt;p&gt;Uruchom &lt;code&gt;azd update&lt;/code&gt; po najnowszą wersję i wypróbuj &lt;code&gt;azd init&lt;/code&gt; w swoim następnym projekcie.&lt;/p&gt;
&lt;p&gt;Przeczytaj &lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-copilot-integration/"&gt;oryginalny komunikat tutaj&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Pisanie natywnych dodatków Node.js w C# z .NET Native AOT</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/nodejs-addons-csharp-native-aot/</link><pubDate>Tue, 21 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/nodejs-addons-csharp-native-aot/</guid><description>Zespół C# Dev Kit zastąpił dodatki Node.js w C++ przez .NET Native AOT — wynik jest czystszy, bezpieczniejszy i wymaga tylko .NET SDK.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ten artykuł został przetłumaczony automatycznie. Oryginalną angielską wersję znajdziesz &lt;a href="https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/nodejs-addons-csharp-native-aot/"&gt;tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Oto scenariusz, który uwielbiam: zespół pracujący nad narzędziami .NET miał natywne dodatki Node.js napisane w C++ i kompilowane przez &lt;code&gt;node-gyp&lt;/code&gt;. Działało. Ale wymagało zainstalowania Pythona na każdej maszynie dewelopera — starej wersji Pythona, nawiasem mówiąc — tylko po to, by skompilować pakiet, którego nikt w zespole nigdy nie dotykał bezpośrednio.&lt;/p&gt;
&lt;p&gt;Więc zadali bardzo rozsądne pytanie: mamy już zainstalowany .NET SDK, po co w ogóle piszemy C++?&lt;/p&gt;
&lt;p&gt;Odpowiedzią był Native AOT, a wynik jest naprawdę elegancki. Drew Noakes z zespołu C# Dev Kit opisał, jak to zrobili, i uważam, że warto to zrozumieć nawet jeśli nie budujesz rozszerzeń VS Code.&lt;/p&gt;
&lt;h2 id="podstawowy-pomysł"&gt;Podstawowy pomysł&lt;/h2&gt;
&lt;p&gt;Natywny dodatek Node.js to biblioteka współdzielona (&lt;code&gt;.dll&lt;/code&gt; na Windows, &lt;code&gt;.so&lt;/code&gt; na Linux, &lt;code&gt;.dylib&lt;/code&gt; na macOS), którą Node.js może załadować w czasie wykonywania. Interfejs nazywa się &lt;a href="https://nodejs.org/api/n-api.html"&gt;N-API&lt;/a&gt; — stabilne, zgodne z ABI API języka C. N-API nie obchodzi, w jakim języku wyprodukowano bibliotekę, tylko żeby eksportowała właściwe symbole.&lt;/p&gt;
&lt;p&gt;.NET Native AOT może dokładnie to zrobić. Kompiluje kod C# z wyprzedzeniem do natywnej biblioteki współdzielonej z dowolnymi punktami wejścia.&lt;/p&gt;
&lt;h2 id="konfiguracja-projektu"&gt;Konfiguracja projektu&lt;/h2&gt;
&lt;p&gt;Plik projektu jest minimalny:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;Project&lt;/span&gt; &lt;span class="na"&gt;Sdk=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Microsoft.NET.Sdk&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;PropertyGroup&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;TargetFramework&amp;gt;&lt;/span&gt;net10.0&lt;span class="nt"&gt;&amp;lt;/TargetFramework&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;PublishAot&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/PublishAot&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;AllowUnsafeBlocks&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/AllowUnsafeBlocks&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/PropertyGroup&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/Project&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;PublishAot&lt;/code&gt; mówi SDK, by przy &lt;code&gt;dotnet publish&lt;/code&gt; wygenerował bibliotekę współdzieloną.&lt;/p&gt;
&lt;h2 id="eksportowanie-punktu-wejścia"&gt;Eksportowanie punktu wejścia&lt;/h2&gt;
&lt;p&gt;Node.js oczekuje, że biblioteka wyeksportuje &lt;code&gt;napi_register_module_v1&lt;/code&gt;. W C# robi to &lt;code&gt;[UnmanagedCallersOnly]&lt;/code&gt;:&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;[UnmanagedCallersOnly(
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt; EntryPoint = &amp;#34;napi_register_module_v1&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt; CallConvs = [typeof(CallConvCdecl)]&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="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="n"&gt;nint&lt;/span&gt; &lt;span class="n"&gt;Init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nint&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nint&lt;/span&gt; &lt;span class="n"&gt;exports&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;Initialize&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;RegisterFunction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exports&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;readStringValue&amp;#34;&lt;/span&gt;&lt;span class="n"&gt;u8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;ReadStringValue&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;return&lt;/span&gt; &lt;span class="n"&gt;exports&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;p&gt;Sufiks &lt;code&gt;u8&lt;/code&gt; tworzy &lt;code&gt;ReadOnlySpan&amp;lt;byte&amp;gt;&lt;/code&gt; z literałem łańcucha UTF-8, przekazywanym bezpośrednio do N-API bez żadnej alokacji kodowania.&lt;/p&gt;
&lt;h2 id="rozwiązywanie-n-api-względem-procesu-hosta"&gt;Rozwiązywanie N-API względem procesu hosta&lt;/h2&gt;
&lt;p&gt;Funkcje N-API są eksportowane przez sam &lt;code&gt;node.exe&lt;/code&gt;, nie przez osobną bibliotekę. Zamiast linkować do czegoś, rozwiązujesz je względem działającego procesu przy starcie:&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;NativeLibrary&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SetDllImportResolver&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;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Reflection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Assembly&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetExecutingAssembly&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;ResolveDllImport&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;Z tym deklaracje P/Invoke działają 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="na"&gt;[LibraryImport(&amp;#34;node&amp;#34;, EntryPoint = &amp;#34;napi_create_string_utf8&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;internal&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;partial&lt;/span&gt; &lt;span class="n"&gt;Status&lt;/span&gt; &lt;span class="n"&gt;CreateStringUtf8&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;nint&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ReadOnlySpan&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nuint&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;out&lt;/span&gt; &lt;span class="n"&gt;nint&lt;/span&gt; &lt;span class="n"&gt;result&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;h2 id="wywołanie-z-typescript"&gt;Wywołanie z TypeScript&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;dotnet publish&lt;/code&gt; produkuje natywną bibliotekę dla twojej platformy. Zmieniasz jej nazwę na &lt;code&gt;.node&lt;/code&gt; i używasz ze standardowym &lt;code&gt;require()&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;registry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kr"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;./native/win32-x64/RegistryAddon.node&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kr"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;RegistryAddon&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="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sdkPath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;registry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;readStringValue&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="s1"&gt;&amp;#39;SOFTWARE\\dotnet\\Setup\\InstalledVersions\\x64\\sdk&amp;#39;&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="s1"&gt;&amp;#39;InstallLocation&amp;#39;&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;p&gt;Tyle. TypeScript do C#, bez Pythona, bez C++.&lt;/p&gt;
&lt;h2 id="podsumowanie"&gt;Podsumowanie&lt;/h2&gt;
&lt;p&gt;Zespół C# Dev Kit zastąpił narzut Python/C++ czystym kodem C#, który każdy w zespole już umie pisać i debugować. Wzorzec nie jest skomplikowany po tym, jak się go zobaczy, i jest świetnym przykładem Native AOT rozwiązującego realny problem.&lt;/p&gt;
&lt;p&gt;Przeczytaj &lt;a href="https://devblogs.microsoft.com/dotnet/writing-nodejs-addons-with-dotnet-native-aot/"&gt;oryginalny wpis na blogu .NET&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>VS Code 1.117: Agenty dostają własne gałęzie Git i jestem za tym wszystkimi czterema</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/vscode-1-117-agents-autopilot-worktrees/</link><pubDate>Sun, 19 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/vscode-1-117-agents-autopilot-worktrees/</guid><description>VS Code 1.117 dostarcza izolację worktree dla sesji agentów, trwały tryb Autopilot i wsparcie dla subagentów. Agentyczny przepływ pracy kodowania właśnie stał się znacznie bardziej realny.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ten post został automatycznie przetłumaczony. Aby przejść do oryginału, &lt;a href="https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/vscode-1-117-agents-autopilot-worktrees/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Linia między &amp;ldquo;asystentem AI&amp;rdquo; a &amp;ldquo;kolegą AI&amp;rdquo; nieustannie się zaciera. VS Code 1.117 właśnie wyszedł i &lt;a href="https://code.visualstudio.com/updates/v1_117"&gt;pełne notatki wydania&lt;/a&gt; są pełne treści, ale historia jest tu jasna: agenty stają się pierwszoklasowymi obywatelami w twoim przepływie pracy deweloperskiej.&lt;/p&gt;
&lt;p&gt;Oto co naprawdę ważne.&lt;/p&gt;
&lt;h2 id="tryb-autopilot-wreszcie-pamięta-twoje-preferencje"&gt;Tryb Autopilot wreszcie pamięta twoje preferencje&lt;/h2&gt;
&lt;p&gt;Wcześniej musiałeś ponownie włączać Autopilot przy każdej nowej sesji. Irytujące. Teraz twój tryb uprawnień utrzymuje się między sesjami i możesz skonfigurować domyślny.&lt;/p&gt;
&lt;p&gt;Host Agenta obsługuje trzy konfiguracje sesji:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Domyślny&lt;/strong&gt; — narzędzia proszą o potwierdzenie przed uruchomieniem&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pomiń&lt;/strong&gt; — automatycznie zatwierdza wszystko&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Autopilot&lt;/strong&gt; — pełna autonomia, odpowiada na własne pytania i kontynuuje&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Jeśli szkieletujesz nowy projekt .NET z migracjami, Docker i CI — ustaw go na Autopilot raz i zapomnij o tym. Ta preferencja zostaje.&lt;/p&gt;
&lt;h2 id="izolacja-worktree-i-git-dla-sesji-agentów"&gt;Izolacja worktree i git dla sesji agentów&lt;/h2&gt;
&lt;p&gt;To jest ta duża. Sesje agentów obsługują teraz pełną izolację worktree i git. To oznacza, że gdy agent pracuje nad zadaniem, dostaje własną gałąź i katalog roboczy. Twoja gałąź główna pozostaje nienaruszona.&lt;/p&gt;
&lt;p&gt;Co więcej — Copilot CLI generuje znaczące nazwy gałęzi dla tych sesji worktree. Koniec z &lt;code&gt;agent-session-abc123&lt;/code&gt;. Dostajesz coś, co faktycznie opisuje co agent robi.&lt;/p&gt;
&lt;p&gt;Dla programistów .NET pracujących na wielu gałęziach funkcji lub naprawiających błędy, gdy długie zadanie szkieletowania działa, to zmiana zasad gry. Możesz mieć agenta budującego kontrolery API w jednym worktree, podczas gdy ty debugujesz warstwę usługową w innym. Żadnych konfliktów. Żadnego stashowania. Żadnego bałaganu.&lt;/p&gt;
&lt;h2 id="subagenty-i-zespoły-agentów"&gt;Subagenty i zespoły agentów&lt;/h2&gt;
&lt;p&gt;Protokół Hosta Agenta obsługuje teraz subagenty. Agent może uruchamiać inne agenty do obsługi części zadania. Pomyśl o tym jak o delegowaniu — twój główny agent koordynuje, a wyspecjalizowane agenty obsługują kawałki.&lt;/p&gt;
&lt;p&gt;To wczesne, ale potencjał dla przepływów pracy .NET jest oczywisty. Wyobraź sobie jednego agenta obsługującego twoje migracje EF Core podczas gdy inny konfiguruje testy integracyjne. Jeszcze tam nie jesteśmy w pełni, ale wsparcie protokołu lądujące teraz oznacza, że narzędzia pojawią się szybko.&lt;/p&gt;
&lt;h2 id="wyjście-terminala-automatycznie-włączone-gdy-agenty-wysyłają-dane-wejściowe"&gt;Wyjście terminala automatycznie włączone gdy agenty wysyłają dane wejściowe&lt;/h2&gt;
&lt;p&gt;Małe, ale znaczące. Gdy agent wysyła dane wejściowe do terminala, wyjście terminala jest teraz automatycznie dołączane do kontekstu. Wcześniej agent musiał wykonać dodatkową turę tylko by zobaczyć co się stało.&lt;/p&gt;
&lt;p&gt;Jeśli kiedykolwiek obserwowałeś agenta uruchamiającego &lt;code&gt;dotnet build&lt;/code&gt;, niepowodzenie i następnie kolejny przebieg tylko by zobaczyć błąd — to tarcie zniknęło. Widzi wyjście natychmiast i reaguje.&lt;/p&gt;
&lt;h2 id="samooaktualizacja-aplikacji-agents-na-macos"&gt;Samooaktualizacja aplikacji Agents na macOS&lt;/h2&gt;
&lt;p&gt;Samodzielna aplikacja Agents na macOS teraz się samooaktualizuje. Koniec z ręcznym pobieraniem nowych wersji. Po prostu pozostaje aktualna.&lt;/p&gt;
&lt;h2 id="mniejsze-rzeczy-warte-wiedzy"&gt;Mniejsze rzeczy warte wiedzy&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Podglądy package.json&lt;/strong&gt; teraz pokazują zarówno zainstalowaną wersję jak i ostatnio dostępną. Przydatne jeśli zarządzasz narzędziami npm obok projektów .NET.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Obrazy w komentarzach JSDoc&lt;/strong&gt; renderują się poprawnie w podglądach i uzupełnieniach.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sesje Copilot CLI&lt;/strong&gt; teraz wskazują czy zostały utworzone przez VS Code czy zewnętrznie — przydatne gdy przeskakujesz między terminalami.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Copilot CLI, Claude Code i Gemini CLI&lt;/strong&gt; są rozpoznawane jako typy powłoki. Edytor wie co uruchamiasz.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="wnioski"&gt;Wnioski&lt;/h2&gt;
&lt;p&gt;VS Code 1.117 nie jest efektownym zrzutem funkcji. To infrastruktura. Izolacja worktree, trwałe uprawnienia, protokoły subagentów — to są cegiełki dla przepływu pracy, gdzie agenty obsługują prawdziwe, równoległe zadania bez nadepnięcia na twój kod.&lt;/p&gt;
&lt;p&gt;Jeśli budujesz z .NET i jeszcze nie zanurzyłeś się w agentyczny przepływ pracy, szczerze, teraz jest czas, by zacząć.&lt;/p&gt;</content:encoded></item><item><title>RFT Foundry Stał Się Tańszy i Mądrzejszy — Oto Co Się Zmieniło</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/foundry-fine-tuning-april-2026-rft-graders/</link><pubDate>Sat, 18 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/foundry-fine-tuning-april-2026-rft-graders/</guid><description>Microsoft Foundry wysłał w tym miesiącu trzy aktualizacje RFT: globalne szkolenie dla o4-mini, nowe oceniające modele GPT-4.1 i przewodnik po najlepszych praktykach.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ten post został automatycznie przetłumaczony. Aby przejść do oryginału, &lt;a href="https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/foundry-fine-tuning-april-2026-rft-graders/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Jeśli tworzysz aplikacje .NET opierające się na dostrojonych modelach, aktualizacje Foundry z tego miesiąca są warte uwagi.&lt;/p&gt;
&lt;p&gt;Pełne szczegóły są w &lt;a href="https://devblogs.microsoft.com/foundry/whats-new-in-foundry-finetune-april-2026/"&gt;oficjalnym ogłoszeniu&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="globalne-szkolenie-dla-o4-mini"&gt;Globalne szkolenie dla o4-mini&lt;/h2&gt;
&lt;p&gt;o4-mini to model do intensywnego rozumowania i obciążeń agentycznych. Możesz teraz uruchamiać zadania dostrajania z 13+ regionów Azure z niższymi stawkami trenowania.&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="s2"&gt;&amp;#34;trainingType&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;globalstandard&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="nowe-oceniające-modele-rodzina-gpt-41"&gt;Nowe oceniające modele: rodzina GPT-4.1&lt;/h2&gt;
&lt;p&gt;Trzy nowe opcje: GPT-4.1, GPT-4.1-mini i GPT-4.1-nano.&lt;/p&gt;
&lt;p&gt;Strategia poziomowania:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GPT-4.1-nano&lt;/strong&gt; do wstępnych iteracji. Niski koszt, szybka pętla informacji zwrotnych.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPT-4.1-mini&lt;/strong&gt; gdy rubrum oceniania jest stabilne.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPT-4.1&lt;/strong&gt; do produkcyjnego oceniania.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="pułapka-formatu-danych-rft"&gt;Pułapka formatu danych RFT&lt;/h2&gt;
&lt;p&gt;Format danych RFT różni się od SFT. Ostatnia wiadomość w każdym wierszu musi mieć rolę User lub Developer — nie Assistant.&lt;/p&gt;
&lt;h2 id="dlaczego-to-ważne-dla-programistów-net"&gt;Dlaczego to ważne dla programistów .NET&lt;/h2&gt;
&lt;p&gt;Tańsze szkolenie oznacza, że możesz bardziej agresywnie iterować. Przewodnik po najlepszych praktykach na &lt;a href="https://github.com/microsoft-foundry/fine-tuning/blob/main/Demos/Agentic_RFT_PrivatePreview/RFT_Best_Practice.md"&gt;GitHub&lt;/a&gt; zaoszczędzi ci czasu debugowania.&lt;/p&gt;</content:encoded></item><item><title>Twoje Eksperymenty AI na Azure Palą Pieniądze — Oto Jak To Naprawić</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/cloud-cost-optimization-ai-workloads-azure/</link><pubDate>Sat, 18 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/cloud-cost-optimization-ai-workloads-azure/</guid><description>Obciążenia AI na Azure mogą szybko stać się drogie. Porozmawiajmy o tym, co naprawdę działa w zakresie kontroli kosztów bez spowalniania rozwoju.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ten post został automatycznie przetłumaczony. Aby przejść do oryginału, &lt;a href="https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/cloud-cost-optimization-ai-workloads-azure/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Jeśli teraz budujesz aplikacje oparte na AI na Azure, pewnie już to zauważyłeś: twój rachunek w chmurze wygląda inaczej. Nie tylko wyższy — dziwniejszy. Skokowy. Trudny do przewidzenia.&lt;/p&gt;
&lt;p&gt;Microsoft opublikował świetny artykuł o &lt;a href="https://azure.microsoft.com/en-us/blog/cloud-cost-optimization-principles-that-still-matter/"&gt;zasadach optymalizacji kosztów w chmurze, które wciąż mają znaczenie&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="dlaczego-obciążenia-ai-są-inne"&gt;Dlaczego obciążenia AI są inne&lt;/h2&gt;
&lt;p&gt;Tradycyjne obciążenia .NET są stosunkowo przewidywalne. Obciążenia AI? Ani trochę. Testujesz wiele modeli, uruchamiasz infrastrukturę GPU, robisz wywołania API Azure OpenAI, gdzie zużycie tokenów drastycznie się waha.&lt;/p&gt;
&lt;h2 id="zarządzanie-vs-optymalizacja--znaj-różnicę"&gt;Zarządzanie vs. optymalizacja — znaj różnicę&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Zarządzanie&lt;/strong&gt;: śledzenie i raportowanie.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Optymalizacja&lt;/strong&gt;: faktyczne podejmowanie decyzji. Czy naprawdę potrzebujesz tego poziomu S3? Czy ta instancja siedzi bezczynnie w weekendy?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="co-naprawdę-działa"&gt;Co naprawdę działa&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Taguj zasoby&lt;/strong&gt; — jeśli nie wiesz, który projekt je twój budżet, nie możesz nic optymalizować&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ustaw bariery przed eksperymentami&lt;/strong&gt; — używaj Azure Policy do ograniczania drogich jednostek SKU&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stale dopasowuj rozmiary&lt;/strong&gt; — sprawdzaj rekomendacje Azure Advisor&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Myśl o cyklu życia&lt;/strong&gt; — zasoby dev powinny być wyłączane&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mierz wartość, nie tylko koszt&lt;/strong&gt; — droższy model dający znacznie lepsze wyniki może być właściwym wyborem&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title>Docker Sandbox Pozwala Agentom Copilot Refaktoryzować Kod Bez Ryzyka dla Twojej Maszyny</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/copilot-docker-sandbox-agentic-refactoring/</link><pubDate>Fri, 17 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/copilot-docker-sandbox-agentic-refactoring/</guid><description>Docker Sandbox daje agentom GitHub Copilot bezpieczne mikroVM do szalonych refaktoryzacji — bez monitów o uprawnienia, bez ryzyka dla hosta. Oto dlaczego to zmienia wszystko dla dużoskalowej modernizacji .NET.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ten post został automatycznie przetłumaczony. Aby przejść do oryginału, &lt;a href="https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/copilot-docker-sandbox-agentic-refactoring/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Jeśli używałeś trybu agenta Copilota do czegoś poza małymi edytami, znasz ten ból. Każdy zapis pliku, każde polecenie terminala — kolejny monit o uprawnienia.&lt;/p&gt;
&lt;p&gt;Zespół Azure właśnie opublikował post o &lt;a href="https://devblogs.microsoft.com/all-things-azure/best-of-both-worlds-for-agentic-refactoring-github-copilot-microvms-via-docker-sandbox/"&gt;Docker Sandbox dla agentów GitHub Copilot&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="co-docker-sandbox-faktycznie-daje"&gt;Co Docker Sandbox faktycznie daje&lt;/h2&gt;
&lt;p&gt;Podstawowy pomysł jest prosty: uruchom lekkie mikroVM z pełnym środowiskiem Linux, zsynchronizuj workspace, i pozwól agentowi Copilota działać swobodnie wewnątrz.&lt;/p&gt;
&lt;p&gt;To więcej niż &amp;ldquo;uruchamiaj rzeczy w kontenerze&amp;rdquo;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Dwukierunkowa synchronizacja workspace&lt;/strong&gt; z zachowaniem ścieżek absolutnych&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prywatny demon Docker&lt;/strong&gt; działający w mikroVM&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Filtrujące proxy HTTP/HTTPS&lt;/strong&gt; kontrolujące dostęp sieciowy&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tryb YOLO&lt;/strong&gt; — agent działa bez monitów o uprawnienia&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="dlaczego-deweloperzy-net-powinni-to-wziąć-pod-uwagę"&gt;Dlaczego deweloperzy .NET powinni to wziąć pod uwagę&lt;/h2&gt;
&lt;p&gt;Dzięki Docker Sandbox możesz wskazać agenta Copilota na projekt, pozwolić mu swobodnie refaktoryzować wewnątrz mikroVM, uruchomić &lt;code&gt;dotnet build&lt;/code&gt; i &lt;code&gt;dotnet test&lt;/code&gt;, i akceptować tylko zmiany, które faktycznie działają.&lt;/p&gt;
&lt;p&gt;Post opisuje uruchamianie &lt;strong&gt;floty równoległych agentów&lt;/strong&gt; — każdy we własnym sandboxie — pracujących nad różnymi projektami jednocześnie.&lt;/p&gt;
&lt;h2 id="wniosek"&gt;Wniosek&lt;/h2&gt;
&lt;p&gt;Docker Sandbox rozwiązuje fundamentalne napięcie w agentic coding: agenty potrzebują wolności, żeby być użyteczne, ale wolność na Twojej maszynie hosta jest niebezpieczna. MicroVM dają ci obie.&lt;/p&gt;</content:encoded></item><item><title>Przestań Pilnować Terminala: Tryb Odłączony Aspire Zmienia Przepływ Pracy</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/aspire-detached-mode-free-your-terminal/</link><pubDate>Fri, 17 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/aspire-detached-mode-free-your-terminal/</guid><description>Aspire 13.2 pozwala uruchomić AppHost w tle i odzyskać terminal. W połączeniu z nowymi poleceniami CLI i obsługą agentów, to większa sprawa niż się wydaje.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ten post został automatycznie przetłumaczony. Aby przejść do oryginału, &lt;a href="https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/aspire-detached-mode-free-your-terminal/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Za każdym razem gdy uruchamiasz Aspire AppHost, twój terminal znika. Zablokowany. Zajęty do Ctrl+C. Chcesz uruchomić szybkie polecenie? Nowa karta. Sprawdzić logi? Kolejna karta. To małe tarcie szybko się kumuluje.&lt;/p&gt;
&lt;p&gt;Aspire 13.2 to naprawia. James Newton-King &lt;a href="https://devblogs.microsoft.com/aspire/aspire-detached-mode-and-process-management/"&gt;opisał wszystkie szczegóły&lt;/a&gt;, i szczerze, to jedna z tych funkcji, która natychmiast zmienia sposób pracy.&lt;/p&gt;
&lt;h2 id="tryb-odłączony-jedno-polecenie-terminal-wraca"&gt;Tryb odłączony: jedno polecenie, terminal wraca&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;aspire start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To skrót dla &lt;code&gt;aspire run --detach&lt;/code&gt;. Twój AppHost uruchamia się w tle i natychmiast odzyskujesz terminal.&lt;/p&gt;
&lt;h2 id="zarządzanie-tym-co-działa"&gt;Zarządzanie tym, co działa&lt;/h2&gt;
&lt;p&gt;Uruchamianie w tle jest przydatne tylko wtedy, gdy możesz faktycznie zarządzać tym, co jest uruchomione. Aspire 13.2 dostarcza pełny zestaw poleceń CLI:&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;# Lista wszystkich działających AppHostów&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire ps
&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;# Sprawdź stan konkretnego AppHosta&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire describe
&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;# Strumieniuj logi z działającego AppHosta&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire logs
&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;# Zatrzymaj konkretny AppHost&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire stop
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="połącz-z-trybem-izolowanym"&gt;Połącz z trybem izolowanym&lt;/h2&gt;
&lt;p&gt;Tryb odłączony naturalnie łączy się z trybem izolowanym:&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;aspire start --isolated
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire start --isolated
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Każda instancja otrzymuje losowe porty, oddzielne sekrety i własny cykl życia.&lt;/p&gt;
&lt;h2 id="dlaczego-to-jest-ogromne-dla-agentów-kodowania"&gt;Dlaczego to jest ogromne dla agentów kodowania&lt;/h2&gt;
&lt;p&gt;Agent kodujący w twoim terminalu może teraz:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Uruchomić aplikację z &lt;code&gt;aspire start&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Zapytać o jej stan za pomocą &lt;code&gt;aspire describe&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Sprawdzić logi &lt;code&gt;aspire logs&lt;/code&gt; w celu diagnozy problemów&lt;/li&gt;
&lt;li&gt;Zatrzymać ją &lt;code&gt;aspire stop&lt;/code&gt; po zakończeniu&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Uruchomienie &lt;code&gt;aspire agent init&lt;/code&gt; konfiguruje plik umiejętności Aspire, który uczy agentów tych poleceń.&lt;/p&gt;
&lt;h2 id="podsumowanie"&gt;Podsumowanie&lt;/h2&gt;
&lt;p&gt;Tryb odłączony to ulepszenie przepływu pracy ukryte jako prosta flaga. Przeczytaj &lt;a href="https://devblogs.microsoft.com/aspire/aspire-detached-mode-and-process-management/"&gt;pełny post&lt;/a&gt; i pobierz Aspire 13.2 z &lt;code&gt;aspire update --self&lt;/code&gt;.&lt;/p&gt;</content:encoded></item><item><title>Grupowanie Pinezek W Końcu Trafia do .NET MAUI Maps — Jedna Właściwość, Zero Bólu</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/maui-maps-pin-clustering-finally/</link><pubDate>Thu, 16 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/maui-maps-pin-clustering-finally/</guid><description>.NET MAUI 11 Preview 3 dodaje natywne grupowanie pinezek do kontrolki Map. Jedna właściwość, oddzielne grupy klastrów i obsługa dotknięcia — wszystko wbudowane.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ten post został automatycznie przetłumaczony. Aby przejść do oryginału, &lt;a href="https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/maui-maps-pin-clustering-finally/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Znasz ten moment, gdy ładujesz mapę ze stu pinezkami i całość zamienia się w nieczytelną masę? To było doświadczenie .NET MAUI Maps — do teraz.&lt;/p&gt;
&lt;p&gt;David Ortinau &lt;a href="https://devblogs.microsoft.com/dotnet/pin-clustering-in-dotnet-maui-maps/"&gt;właśnie ogłosił&lt;/a&gt;, że .NET MAUI 11 Preview 3 dostarcza grupowanie pinezek po wyjęciu z pudełka.&lt;/p&gt;
&lt;h2 id="jedna-właściwość-do-rządzenia-wszystkimi"&gt;Jedna właściwość do rządzenia wszystkimi&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;maps:Map&lt;/span&gt; &lt;span class="na"&gt;IsClusteringEnabled=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;True&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Tyle. Pobliskie pinezki są grupowane w klastry z odznaką liczby.&lt;/p&gt;
&lt;h2 id="niezależne-grupy-klastrów"&gt;Niezależne grupy klastrów&lt;/h2&gt;
&lt;p&gt;Właściwość &lt;code&gt;ClusteringIdentifier&lt;/code&gt; pozwala oddzielić pinezki na niezależne grupy:&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;map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Pins&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Add&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;Pin&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;Label&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Pike Place Coffee&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;Location&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;Location&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;47.6097&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="m"&gt;122.3331&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;ClusteringIdentifier&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;coffee&amp;#34;&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="obsługa-dotknięcia-klastra"&gt;Obsługa dotknięcia klastra&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;map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ClusterClicked&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;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="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;names&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;\n&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Pins&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Label&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;await&lt;/span&gt; &lt;span class="n"&gt;DisplayAlert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$&amp;#34;Cluster ({e.Pins.Count} pins)&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;OK&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="zacznij"&gt;Zacznij&lt;/h2&gt;
&lt;p&gt;Zainstaluj &lt;a href="https://dotnet.microsoft.com/download/dotnet/11.0"&gt;.NET 11 Preview 3&lt;/a&gt; i zaktualizuj obciążenie .NET MAUI. &lt;a href="https://github.com/dotnet/maui-samples/tree/main/10.0/UserInterface/Views/Map/MapDemo/WorkingWithMaps"&gt;Przykład Maps&lt;/a&gt; zawiera nową stronę Clustering.&lt;/p&gt;</content:encoded></item><item><title>Narzędzia Azure MCP Są Teraz Wbudowane w Visual Studio 2022 — Żadnego Rozszerzenia</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/azure-mcp-tools-built-into-visual-studio-2022/</link><pubDate>Thu, 16 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/azure-mcp-tools-built-into-visual-studio-2022/</guid><description>Narzędzia Azure MCP są dostarczane jako część obciążenia deweloperskiego Azure w Visual Studio 2022. Ponad 230 narzędzi, 45 usług Azure, zero rozszerzeń do zainstalowania.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ten post został automatycznie przetłumaczony. Aby przejść do oryginału, &lt;a href="https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/azure-mcp-tools-built-into-visual-studio-2022/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Jeśli korzystałeś z narzędzi Azure MCP w Visual Studio przez oddzielne rozszerzenie, znasz procedurę — zainstaluj VSIX, zrestartuj, miej nadzieję, że nie popsuje, zarządzaj niezgodnościami wersji. To tarcie zniknęło.&lt;/p&gt;
&lt;p&gt;Yun Jung Choi &lt;a href="https://devblogs.microsoft.com/visualstudio/azure-mcp-tools-now-ship-built-into-visual-studio-2022-no-extension-required/"&gt;ogłosiła&lt;/a&gt;, że narzędzia Azure MCP są teraz dostarczane bezpośrednio jako część obciążenia deweloperskiego Azure w Visual Studio 2022. Żadnego rozszerzenia. Żadnego VSIX.&lt;/p&gt;
&lt;h2 id="co-to-faktycznie-oznacza"&gt;Co to faktycznie oznacza&lt;/h2&gt;
&lt;p&gt;Ponad 230 narzędzi w 45 usługach Azure — dostępnych bezpośrednio z okna czatu. Wylistuj swoje konta pamięci masowej, wdróż aplikację ASP.NET Core, diagnostykuj problemy App Service — wszystko bez otwierania karty przeglądarki.&lt;/p&gt;
&lt;h2 id="jak-włączyć"&gt;Jak włączyć&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Zaktualizuj do Visual Studio 2022 &lt;strong&gt;17.14.30&lt;/strong&gt; lub nowszego&lt;/li&gt;
&lt;li&gt;Upewnij się, że obciążenie &lt;strong&gt;Azure development&lt;/strong&gt; jest zainstalowane&lt;/li&gt;
&lt;li&gt;Otwórz GitHub Copilot Chat&lt;/li&gt;
&lt;li&gt;Kliknij przycisk &lt;strong&gt;Wybierz narzędzia&lt;/strong&gt; (ikona dwóch kluczy)&lt;/li&gt;
&lt;li&gt;Włącz &lt;strong&gt;Azure MCP Server&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Pozostaje włączone między sesjami.&lt;/p&gt;
&lt;h2 id="zastrzeżenie"&gt;Zastrzeżenie&lt;/h2&gt;
&lt;p&gt;Narzędzia są domyślnie wyłączone — musisz je włączyć. Dla .NET deweloperów korzystających z Visual Studio oznacza to jeszcze mniej powodów do przełączania kontekstu do portalu Azure.&lt;/p&gt;</content:encoded></item><item><title>.NET Kwiecień 2026 Serwisowanie — Poprawki Bezpieczeństwa, Które Powinieneś Zastosować Dziś</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/dotnet-april-2026-servicing-security-patches/</link><pubDate>Wed, 15 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/dotnet-april-2026-servicing-security-patches/</guid><description>Wydanie serwisowe z kwietnia 2026 roku łata 6 CVE w .NET 10, .NET 9, .NET 8 i .NET Framework — w tym dwie luki zdalnego wykonania kodu.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ten post został automatycznie przetłumaczony. Aby przejść do oryginału, &lt;a href="https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/dotnet-april-2026-servicing-security-patches/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://devblogs.microsoft.com/dotnet/dotnet-and-dotnet-framework-april-2026-servicing-updates/"&gt;Aktualizacje serwisowe z kwietnia 2026&lt;/a&gt; dla .NET i .NET Framework są dostępne, i ta zawiera poprawki bezpieczeństwa, które będziesz chciał zastosować wkrótce. Sześć CVE załatanych, w tym dwie luki zdalnego wykonania kodu (RCE).&lt;/p&gt;
&lt;h2 id="co-zostało-załatane"&gt;Co zostało załatane&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;CVE&lt;/th&gt;
&lt;th&gt;Typ&lt;/th&gt;
&lt;th&gt;Dotyczy&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CVE-2026-26171&lt;/td&gt;
&lt;td&gt;Obejście funkcji bezpieczeństwa&lt;/td&gt;
&lt;td&gt;.NET 10, 9, 8 + .NET Framework&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVE-2026-32178&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Zdalne wykonanie kodu&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;.NET 10, 9, 8 + .NET Framework&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVE-2026-33116&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Zdalne wykonanie kodu&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;.NET 10, 9, 8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVE-2026-32203&lt;/td&gt;
&lt;td&gt;Odmowa usługi&lt;/td&gt;
&lt;td&gt;.NET 10, 9, 8 + .NET Framework&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVE-2026-23666&lt;/td&gt;
&lt;td&gt;Odmowa usługi&lt;/td&gt;
&lt;td&gt;.NET Framework 3.0–4.8.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVE-2026-32226&lt;/td&gt;
&lt;td&gt;Odmowa usługi&lt;/td&gt;
&lt;td&gt;.NET Framework 2.0–4.8.1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="zaktualizowane-wersje"&gt;Zaktualizowane wersje&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;.NET 10&lt;/strong&gt;: 10.0.6&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;.NET 9&lt;/strong&gt;: 9.0.15&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;.NET 8&lt;/strong&gt;: 8.0.26&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="co-zrobić"&gt;Co zrobić&lt;/h2&gt;
&lt;p&gt;Zaktualizuj swoje projekty i pipeline&amp;rsquo;y CI/CD do najnowszych wersji. Dwie luki RCE to nie jest coś, co się odkłada.&lt;/p&gt;</content:encoded></item><item><title>Aktualizacja Azure DevOps Server Kwiecień 2026 — Poprawka PR i Aktualizacje Bezpieczeństwa</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/azure-devops-server-april-2026-patch/</link><pubDate>Wed, 15 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/azure-devops-server-april-2026-patch/</guid><description>Azure DevOps Server otrzymuje Patch 3 z naprawą błędów ukończenia PR, ulepszoną walidacją wylogowania i przywróconymi połączeniami PAT GitHub Enterprise Server.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ten post został automatycznie przetłumaczony. Aby przejść do oryginału, &lt;a href="https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/azure-devops-server-april-2026-patch/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Szybka informacja dla zespołów uruchamiających samodzielnie hostowany Azure DevOps Server: Microsoft wydał &lt;a href="https://devblogs.microsoft.com/devops/april-patches-for-azure-devops-server/"&gt;Patch 3 na kwiecień 2026&lt;/a&gt; z trzema celowanymi poprawkami.&lt;/p&gt;
&lt;h2 id="co-zostało-naprawione"&gt;Co zostało naprawione&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Błędy ukończenia pull requestów&lt;/strong&gt; — wyjątek null reference podczas auto-ukończenia elementu roboczego mógł powodować niepowodzenia scalania PR&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Walidacja przekierowania przy wylogowaniu&lt;/strong&gt; — ulepszona walidacja podczas wylogowywania zapobiegająca potencjalnym złośliwym przekierowaniom&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Połączenia PAT GitHub Enterprise Server&lt;/strong&gt; — tworzenie połączeń Personal Access Token zostało przywrócone&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="jak-zaktualizować"&gt;Jak zaktualizować&lt;/h2&gt;
&lt;p&gt;Pobierz &lt;a href="https://aka.ms/devopsserverpatch3"&gt;Patch 3&lt;/a&gt; i uruchom instalator. Aby zweryfikować zastosowanie łatki:&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;&amp;lt;patch-installer&amp;gt;.exe CheckInstall
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Microsoft zdecydowanie zaleca stosowanie najnowszej łatki dla bezpieczeństwa i niezawodności.&lt;/p&gt;</content:encoded></item><item><title>Aspire 13.2 Dostaje MongoDB EF Core i Azure Data Lake — Dwie Integracje Warte Wypróbowania</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/aspire-132-mongodb-efcore-data-lake/</link><pubDate>Wed, 15 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/aspire-132-mongodb-efcore-data-lake/</guid><description>Aspire 13.2 dodaje integracje MongoDB Entity Framework Core i Azure Data Lake Storage z automatycznymi health checks i service discovery. Oto jak wyglądają w praktyce.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ten post został automatycznie przetłumaczony. Aby przejść do oryginału, &lt;a href="https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/aspire-132-mongodb-efcore-data-lake/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Aspire 13.2 właśnie wylądował z dwiema nowymi integracjami bazodanowymi, które są warte uwagi: MongoDB Entity Framework Core i Azure Data Lake Storage.&lt;/p&gt;
&lt;h2 id="mongodb-spotyka-ef-core-w-aspire"&gt;MongoDB spotyka EF Core w Aspire&lt;/h2&gt;
&lt;p&gt;To ta, z której jestem najbardziej podekscytowany. Aspire obsługiwał MongoDB przez chwilę, ale zawsze był to surowy sterownik — bez EF Core, bez DbContext, bez zapytań LINQ. Teraz otrzymujesz pełne doświadczenie EF Core z MongoDB, wraz z automatycznymi health checks i service discovery Aspire.&lt;/p&gt;
&lt;p&gt;Konfiguracja w AppHost:&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="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;mongodb&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;AddMongoDB&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;mongodb&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 class="n"&gt;WithDataVolume&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;WithLifetime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ContainerLifetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Persistent&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="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;apiService&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;AddProject&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Projects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ApiService&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;api&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 class="n"&gt;WithReference&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mongodb&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;W projekcie klienckim:&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;dotnet add package Aspire.MongoDB.EntityFrameworkCore
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Zarejestruj DbContext:&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;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddMongoDbContext&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;MyDbContext&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;mongodb&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;mydb&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;Integracja obsługuje connection pooling, ślady OpenTelemetry i health checks za kulisami.&lt;/p&gt;
&lt;h2 id="azure-data-lake-storage-dołącza-do-zabawy"&gt;Azure Data Lake Storage dołącza do zabawy&lt;/h2&gt;
&lt;p&gt;W AppHost:&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="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;storage&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;AddAzureStorage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;azure-storage&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="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;dataLake&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;storage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddDataLake&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;data-lake&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="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;fileSystem&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;storage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddDataLakeFileSystem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;data-lake-file-system&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="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;analyticsService&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;AddProject&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Projects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AnalyticsService&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;analytics&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 class="n"&gt;WithReference&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataLake&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;WithReference&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fileSystem&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;W projekcie klienckim:&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;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddAzureDataLakeServiceClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;data-lake&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;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddAzureDataLakeFileSystemClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;data-lake-file-system&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;Żadnego ręcznego zarządzania ciągami połączeń, żadnego polowania na poświadczenia.&lt;/p&gt;
&lt;h2 id="podsumowanie"&gt;Podsumowanie&lt;/h2&gt;
&lt;p&gt;Aspire 13.2 to wydanie przyrostowe, ale integracje MongoDB EF Core i Data Lake wypełniają rzeczywiste luki. &lt;a href="https://get.aspire.dev"&gt;Zaktualizuj do 13.2&lt;/a&gt; i wypróbuj je.&lt;/p&gt;</content:encoded></item><item><title>azd update — Jedno Polecenie do Wszystkich Menedżerów Pakietów</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/azd-update-universal-upgrade-command/</link><pubDate>Wed, 15 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/azd-update-universal-upgrade-command/</guid><description>Azure Developer CLI ma teraz uniwersalne polecenie aktualizacji, które działa niezależnie od metody instalacji — winget, Homebrew, Chocolatey lub skrypt instalacyjny.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ten post został automatycznie przetłumaczony. Aby przejść do oryginału, &lt;a href="https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/azd-update-universal-upgrade-command/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Znasz ten komunikat &amp;ldquo;Dostępna jest nowa wersja azd&amp;rdquo;, który pojawia się co kilka tygodni? Ten, który odrzucasz, bo nie pamiętasz, czy zainstalowałeś &lt;code&gt;azd&lt;/code&gt; przez winget, Homebrew czy ten skrypt curl z sześciu miesięcy temu? To jest w końcu naprawione.&lt;/p&gt;
&lt;p&gt;Microsoft właśnie dostarczył &lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-update/"&gt;&lt;code&gt;azd update&lt;/code&gt;&lt;/a&gt; — pojedyncze polecenie, które aktualizuje Azure Developer CLI do najnowszej wersji niezależnie od tego, jak go pierwotnie zainstalowałeś.&lt;/p&gt;
&lt;h2 id="jak-to-działa"&gt;Jak to działa&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;azd update
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To wszystko. Dla wczesnego dostępu do nowych funkcji:&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;azd update --channel daily
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;azd update --channel stable
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Polecenie wykrywa Twoją aktualną metodę instalacji i używa odpowiedniego mechanizmu aktualizacji.&lt;/p&gt;
&lt;h2 id="mały-haczyk"&gt;Mały haczyk&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;azd update&lt;/code&gt; jest dostarczany od wersji 1.23.x. Jeśli jesteś na starszej wersji, będziesz musiał wykonać jedną ostatnią ręczną aktualizację. Potem &lt;code&gt;azd update&lt;/code&gt; zajmuje się wszystkim.&lt;/p&gt;
&lt;h2 id="dlaczego-to-ważne"&gt;Dlaczego to ważne&lt;/h2&gt;
&lt;p&gt;To małe ulepszenie jakości życia, ale dla tych z nas, którzy używają &lt;code&gt;azd&lt;/code&gt; na co dzień do wdrażania agentów AI i aplikacji Aspire do Azure, bycie na bieżąco ma znaczenie.&lt;/p&gt;
&lt;p&gt;Przeczytaj &lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-update/"&gt;pełne ogłoszenie&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Azure Smart Tier jest GA — Automatyczna Optymalizacja Kosztów Blob Storage Bez Reguł Cyklu Życia</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/azure-smart-tier-blob-storage-ga/</link><pubDate>Wed, 15 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/azure-smart-tier-blob-storage-ga/</guid><description>Inteligentna warstwa Azure Blob Storage jest teraz ogólnie dostępna, automatycznie przenosząc obiekty między warstwami hot, cool i cold na podstawie rzeczywistych wzorców dostępu.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ten post został automatycznie przetłumaczony. Aby przejść do oryginału, &lt;a href="https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/azure-smart-tier-blob-storage-ga/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Jeśli kiedykolwiek spędziłeś czas na dostosowywaniu polityk cyklu życia Azure Blob Storage i obserwowałeś ich rozpadanie się, gdy wzorce dostępu się zmieniły, to jest coś dla Ciebie. Microsoft właśnie ogłosił &lt;a href="https://azure.microsoft.com/en-us/blog/optimize-object-storage-costs-automatically-with-smart-tier-now-generally-available/"&gt;ogólną dostępność inteligentnej warstwy&lt;/a&gt; dla Azure Blob i Data Lake Storage.&lt;/p&gt;
&lt;h2 id="co-inteligentna-warstwa-faktycznie-robi"&gt;Co inteligentna warstwa faktycznie robi&lt;/h2&gt;
&lt;p&gt;Inteligentna warstwa ciągle ocenia czas ostatniego dostępu do każdego obiektu. Często dostępne dane pozostają w hot, nieaktywne dane przechodzą do cool po 30 dniach, następnie do cold po kolejnych 60 dniach. Gdy dane są ponownie dostępne, są natychmiast promowane z powrotem do hot.&lt;/p&gt;
&lt;p&gt;Podczas podglądu Microsoft poinformował, że &lt;strong&gt;ponad 50% pojemności zarządzanej przez inteligentną warstwę automatycznie przesunęło się do chłodniejszych warstw&lt;/strong&gt;.&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;Scenariusze praktyczne:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Telemetria i logi aplikacji&lt;/strong&gt; — gorące podczas debugowania, rzadko dostępne po kilku tygodniach&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pipeline&amp;rsquo;y danych i wyniki ETL&lt;/strong&gt; — intensywnie dostępne podczas przetwarzania, potem głównie zimne&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Treści generowane przez użytkowników&lt;/strong&gt; — nowe przesłania są gorące, starsze treści stopniowo się schładzają&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="konfiguracja"&gt;Konfiguracja&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Nowe konta&lt;/strong&gt;: Wybierz inteligentną warstwę jako domyślną warstwę dostępu podczas tworzenia konta&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Istniejące konta&lt;/strong&gt;: Zmień domyślną warstwę dostępu do blobów na inteligentną&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Obiekty mniejsze niż 128 KiB pozostają w hot i nie ponoszą opłaty monitoringowej.&lt;/p&gt;</content:encoded></item><item><title>Gdzie Hostować Agenty AI na Azure? Praktyczny Przewodnik po Decyzjach</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/azure-ai-agent-hosting-options-guide/</link><pubDate>Wed, 15 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/azure-ai-agent-hosting-options-guide/</guid><description>Azure oferuje sześć sposobów hostowania agentów AI — od surowych kontenerów po w pełni zarządzane Foundry Hosted Agents. Oto jak wybrać odpowiedni dla swojego obciążenia .NET.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ten post został automatycznie przetłumaczony. Aby przejść do oryginału, &lt;a href="https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/azure-ai-agent-hosting-options-guide/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Jeśli teraz budujesz agenty AI z .NET, pewnie zauważyłeś: jest &lt;em&gt;wiele&lt;/em&gt; sposobów na hostowanie ich na Azure. Container Apps, AKS, Functions, App Service, Foundry Agents, Foundry Hosted Agents.&lt;/p&gt;
&lt;p&gt;Microsoft opublikował &lt;a href="https://devblogs.microsoft.com/all-things-azure/hostedagent/"&gt;kompleksowy przewodnik po hostowaniu agentów Azure AI&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="sześć-opcji-na-pierwszy-rzut-oka"&gt;Sześć opcji na pierwszy rzut oka&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Opcja&lt;/th&gt;
&lt;th&gt;Najlepsza dla&lt;/th&gt;
&lt;th&gt;Zarządzasz&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Container Apps&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Pełna kontrola kontenera bez K8s&lt;/td&gt;
&lt;td&gt;Obserwowalność, stan, cykl życia&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AKS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Enterprise compliance, multi-cluster&lt;/td&gt;
&lt;td&gt;Wszystkim&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Azure Functions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sterowane zdarzeniami, krótkotrwałe zadania&lt;/td&gt;
&lt;td&gt;Prawie niczym&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;App Service&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Prosty agent HTTP&lt;/td&gt;
&lt;td&gt;Wdrożeniem, skalowaniem&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Foundry Agents&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Agenty bez kodu&lt;/td&gt;
&lt;td&gt;Prawie niczym&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Foundry Hosted Agents&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Agenty z własnym frameworkiem&lt;/td&gt;
&lt;td&gt;Tylko kodem agenta&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="foundry-hosted-agents--słodkie-miejsce-dla-deweloperów-agentów-net"&gt;Foundry Hosted Agents — słodkie miejsce dla deweloperów agentów .NET&lt;/h2&gt;
&lt;p&gt;Wdrożenie jest naprawdę proste:&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;azd ext install azure.ai.agents
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;azd ai agent init
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;azd up
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To pojedyncze &lt;code&gt;azd up&lt;/code&gt; buduje kontener, wypycha go do ACR, provisionuje projekt Foundry i uruchamia agenta.&lt;/p&gt;
&lt;h2 id="mój-framework-decyzyjny"&gt;Mój framework decyzyjny&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Potrzebujesz zero infrastruktury?&lt;/strong&gt; → Foundry Agents&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Masz własny kod agenta ale chcesz zarządzanego hostingu?&lt;/strong&gt; → Foundry Hosted Agents&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sterowane zdarzeniami, krótkotrwałe zadania?&lt;/strong&gt; → Azure Functions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Maksymalna kontrola kontenera?&lt;/strong&gt; → Container Apps&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ścisła zgodność i multi-cluster?&lt;/strong&gt; → AKS&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="podsumowanie"&gt;Podsumowanie&lt;/h2&gt;
&lt;p&gt;Dla większości deweloperów .NET budujących z Semantic Kernel lub Microsoft Agent Framework, Hosted Agents to prawdopodobnie właściwy punkt startowy. Sprawdź &lt;a href="https://devblogs.microsoft.com/all-things-azure/hostedagent/"&gt;pełny przewodnik Microsoftu&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Umiejętności agentów w .NET stały się naprawdę elastyczne</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/agent-skills-dotnet-three-authoring-patterns/</link><pubDate>Tue, 14 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/agent-skills-dotnet-three-authoring-patterns/</guid><description>Microsoft Agent Framework obsługuje teraz trzy sposoby tworzenia umiejętności — na podstawie plików, klas i kodu inline — wszystkie komponowane przez jeden dostawca. Oto dlaczego to ważne i jak używać każdego z nich.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ten post został automatycznie przetłumaczony. Aby przejść do oryginału, &lt;a href="https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/agent-skills-dotnet-three-authoring-patterns/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Jeśli budujesz agenty z Microsoft Agent Framework, znasz schemat: definiujesz umiejętności, podłączasz je do dostawcy i pozwalasz agentowi zdecydować, którą wywołać. Co nowego to &lt;em&gt;sposób&lt;/em&gt; tworzenia tych umiejętności — a skok elastyczności jest znaczący.&lt;/p&gt;
&lt;p&gt;Najnowsza aktualizacja wprowadza trzy odmienne wzorce tworzenia umiejętności agentów: &lt;strong&gt;oparty na plikach&lt;/strong&gt;, &lt;strong&gt;oparty na klasach&lt;/strong&gt; i &lt;strong&gt;zdefiniowany w kodzie inline&lt;/strong&gt;. Wszystkie trzy podłączają się do jednego &lt;code&gt;AgentSkillsProviderBuilder&lt;/code&gt;, co oznacza, że możesz je mieszać i dopasowywać bez żadnej logiki routingu ani specjalnego kodu spinającego. Przeprowadzę cię przez każdy z nich i kiedy po który sięgać.&lt;/p&gt;
&lt;h2 id="umiejętności-oparte-na-plikach-punkt-startowy"&gt;Umiejętności oparte na plikach: punkt startowy&lt;/h2&gt;
&lt;p&gt;Umiejętności oparte na plikach to dokładnie to, na co wskazuje nazwa — katalog na dysku z plikiem &lt;code&gt;SKILL.md&lt;/code&gt;, opcjonalnymi skryptami i dokumentami referencyjnymi. Pomyśl o tym jako o najprostszym sposobie na danie agentowi nowych możliwości:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;skills/
└── onboarding-guide/
├── SKILL.md
├── scripts/
│ └── check-provisioning.py
└── references/
└── onboarding-checklist.md
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Metadane w &lt;code&gt;SKILL.md&lt;/code&gt; deklarują nazwę i opis umiejętności, a sekcja instrukcji mówi agentowi, jak używać skryptów i referencji:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&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;name: onboarding-guide
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;description: &amp;gt;-
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Walk new hires through their first-week setup checklist.
&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## Instructions
&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="k"&gt;1.&lt;/span&gt; Ask for the employee&amp;#39;s name and start date.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;2.&lt;/span&gt; Run &lt;span class="sb"&gt;`scripts/check-provisioning.py`&lt;/span&gt; to verify accounts.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;3.&lt;/span&gt; Walk through &lt;span class="sb"&gt;`references/onboarding-checklist.md`&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;4.&lt;/span&gt; Follow up on incomplete items.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Następnie podłączasz to za pomocą &lt;code&gt;SubprocessScriptRunner.RunAsync&lt;/code&gt; do wykonania skryptów:&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="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;skillsProvider&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;AgentSkillsProvider&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;Path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Combine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AppContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BaseDirectory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;skills&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;SubprocessScriptRunner&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&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="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 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 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;GetResponsesClient&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 class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ChatClientAgentOptions&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;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;HRAgent&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;ChatOptions&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="p"&gt;{&lt;/span&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 HR 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;AIContextProviders&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;skillsProvider&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;model&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Agent automatycznie wykrywa umiejętność i wywołuje skrypt sprawdzania uprawnień, gdy jest to potrzebne. Czyste i proste.&lt;/p&gt;
&lt;h2 id="umiejętności-oparte-na-klasach-dostarcz-przez-nuget"&gt;Umiejętności oparte na klasach: dostarcz przez NuGet&lt;/h2&gt;
&lt;p&gt;Tu robi się interesująco dla zespołów. Umiejętności oparte na klasach dziedziczą z &lt;code&gt;AgentClassSkill&amp;lt;T&amp;gt;&lt;/code&gt; i używają atrybutów takich jak &lt;code&gt;[AgentSkillResource]&lt;/code&gt; i &lt;code&gt;[AgentSkillScript]&lt;/code&gt;, dzięki czemu framework odkrywa wszystko przez refleksję:&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="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;sealed&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BenefitsEnrollmentSkill&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;AgentClassSkill&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;BenefitsEnrollmentSkill&lt;/span&gt;&lt;span class="p"&gt;&amp;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="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;override&lt;/span&gt; &lt;span class="n"&gt;AgentSkillFrontmatter&lt;/span&gt; &lt;span class="n"&gt;Frontmatter&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;benefits-enrollment&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="s"&gt;&amp;#34;Enroll an employee in health, dental, or vision plans.&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="kd"&gt;protected&lt;/span&gt; &lt;span class="kd"&gt;override&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Instructions&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="m"&gt;1.&lt;/span&gt; &lt;span class="n"&gt;Read&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;available&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;plans&lt;/span&gt; &lt;span class="n"&gt;resource&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="m"&gt;2.&lt;/span&gt; &lt;span class="n"&gt;Confirm&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;plan&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;employee&lt;/span&gt; &lt;span class="n"&gt;wants&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="m"&gt;3.&lt;/span&gt; &lt;span class="n"&gt;Use&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;enroll&lt;/span&gt; &lt;span class="n"&gt;script&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;complete&lt;/span&gt; &lt;span class="n"&gt;enrollment&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;&amp;#34;&amp;#34;;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&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; [AgentSkillResource(&amp;#34;available-plans&amp;#34;)]&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;Plan options with monthly pricing.&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;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;AvailablePlans&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;##&lt;/span&gt; &lt;span class="n"&gt;Available&lt;/span&gt; &lt;span class="n"&gt;Plans&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;2026&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;Health&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Basic&lt;/span&gt; &lt;span class="n"&gt;HMO&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;month&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;Premium&lt;/span&gt; &lt;span class="n"&gt;PPO&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="m"&gt;45&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;month&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;Dental&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Standard&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;month&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;Enhanced&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="m"&gt;25&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;month&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;Vision&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Basic&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="m"&gt;8&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;month&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;&amp;#34;&amp;#34;;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&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; [AgentSkillScript(&amp;#34;enroll&amp;#34;)]&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;Enrolls employee in the specified benefit plan.&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;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Enroll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;employeeId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;planCode&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="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;success&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;HrClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;EnrollInPlan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;employeeId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;planCode&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;return&lt;/span&gt; &lt;span class="n"&gt;JsonSerializer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Serialize&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;success&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;employeeId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;planCode&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="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Piękno polega na tym, że zespół może spakować to jako pakiet NuGet. Dodajesz go do projektu, wrzucasz do buildera i działa obok umiejętności opartych na plikach bez żadnej koordynacji:&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="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;skillsProvider&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;AgentSkillsProviderBuilder&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;UseFileSkill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Combine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AppContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BaseDirectory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;skills&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 class="n"&gt;UseSkill&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;BenefitsEnrollmentSkill&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;UseFileScriptRunner&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SubprocessScriptRunner&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="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;Obie umiejętności pojawiają się w prompcie systemowym agenta. Agent decyduje, którą użyć na podstawie rozmowy — bez kodu routingu.&lt;/p&gt;
&lt;h2 id="umiejętności-inline-szybki-pomost"&gt;Umiejętności inline: szybki pomost&lt;/h2&gt;
&lt;p&gt;Znasz ten moment, gdy inny zespół buduje dokładnie tę umiejętność, której potrzebujesz, ale nie wyda jej przez sprint? &lt;code&gt;AgentInlineSkill&lt;/code&gt; to twój pomost:&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="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;timeOffSkill&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;AgentInlineSkill&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;time-off-balance&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;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Calculate remaining vacation and sick days.&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;instructions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="m"&gt;1.&lt;/span&gt; &lt;span class="n"&gt;Ask&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;employee&lt;/span&gt; &lt;span class="n"&gt;ID&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;not&lt;/span&gt; &lt;span class="n"&gt;provided&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="m"&gt;2.&lt;/span&gt; &lt;span class="n"&gt;Use&lt;/span&gt; &lt;span class="n"&gt;calculate&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;balance&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;remaining&lt;/span&gt; &lt;span class="n"&gt;balance&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="m"&gt;3.&lt;/span&gt; &lt;span class="n"&gt;Present&lt;/span&gt; &lt;span class="n"&gt;used&lt;/span&gt; &lt;span class="n"&gt;and&lt;/span&gt; &lt;span class="n"&gt;remaining&lt;/span&gt; &lt;span class="n"&gt;days&lt;/span&gt; &lt;span class="n"&gt;clearly&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;&amp;#34;&amp;#34;)
&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;AddScript&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;calculate-balance&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;employeeId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;leaveType&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;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="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;totalDays&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;HrDatabase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetAnnualAllowance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;employeeId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;leaveType&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;int&lt;/span&gt; &lt;span class="n"&gt;daysUsed&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;HrDatabase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetDaysUsed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;employeeId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;leaveType&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;int&lt;/span&gt; &lt;span class="n"&gt;remaining&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;totalDays&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;daysUsed&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;return&lt;/span&gt; &lt;span class="n"&gt;JsonSerializer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Serialize&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;employeeId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;leaveType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;totalDays&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;daysUsed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;remaining&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;p&gt;Dodajesz ją do buildera tak samo jak pozostałe:&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="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;skillsProvider&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;AgentSkillsProviderBuilder&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;UseFileSkill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Combine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AppContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BaseDirectory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;skills&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 class="n"&gt;UseSkill&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;BenefitsEnrollmentSkill&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;UseSkill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;timeOffSkill&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;UseFileScriptRunner&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SubprocessScriptRunner&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="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;Gdy pakiet NuGet w końcu się pojawi, wymieniasz umiejętność inline na opartą na klasach. Agent nie zna różnicy.&lt;/p&gt;
&lt;p&gt;Ale umiejętności inline nie są tylko dla pomostów. Są też właściwym wyborem, gdy musisz dynamicznie generować umiejętności w czasie działania — pomyśl jedna umiejętność na jednostkę biznesową ładowaną z konfiguracji — albo gdy skrypt musi zamykać się na lokalnym stanie, który nie należy do kontenera DI.&lt;/p&gt;
&lt;h2 id="zatwierdzanie-skryptów-człowiek-w-pętli"&gt;Zatwierdzanie skryptów: człowiek w pętli&lt;/h2&gt;
&lt;p&gt;Dla nas, programistów .NET, budujących agenty produkcyjne, to jest część, która naprawdę odblokowuje rozmowy o wdrożeniu. Niektóre skrypty mają realne konsekwencje — rejestrowanie kogoś w świadczeniach, zapytania do infrastruktury produkcyjnej. Włącz &lt;code&gt;UseScriptApproval&lt;/code&gt; i agent wstrzymuje się przed wykonaniem jakiegokolwiek skryptu:&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="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;skillsProvider&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;AgentSkillsProviderBuilder&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;UseFileSkill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Combine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AppContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BaseDirectory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;skills&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 class="n"&gt;UseSkill&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;BenefitsEnrollmentSkill&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;UseSkill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;timeOffSkill&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;UseFileScriptRunner&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SubprocessScriptRunner&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="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UseScriptApproval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&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;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;Gdy agent chce uruchomić skrypt, zamiast tego zwraca żądanie zatwierdzenia. Twoja aplikacja zbiera decyzję — zatwierdź lub odrzuć — i agent kontynuuje odpowiednio. W regulowanych środowiskach to jest różnica między &amp;ldquo;możemy to wdrożyć&amp;rdquo; a &amp;ldquo;dział prawny mówi nie&amp;rdquo;.&lt;/p&gt;
&lt;h2 id="dlaczego-ta-kombinacja-ma-znaczenie"&gt;Dlaczego ta kombinacja ma znaczenie&lt;/h2&gt;
&lt;p&gt;Prawdziwa moc nie leży w żadnym pojedynczym wzorcu tworzenia — to w kompozycji. Możesz:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Zacząć mało&lt;/strong&gt; z umiejętnością opartą na plikach, iterować instrukcje i dostarczyć bez pisania C#&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dostarczać umiejętności wielokrotnego użytku&lt;/strong&gt; jako pakiety NuGet, które inne zespoły mogą dodać jedną linijką&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pomost luk&lt;/strong&gt; z umiejętnościami inline, gdy potrzebujesz czegoś &lt;em&gt;teraz&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Filtrować współdzielone katalogi umiejętności&lt;/strong&gt; za pomocą predykatów, by agent ładował tylko to, co powinien&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dodawać nadzór ludzki&lt;/strong&gt; dla skryptów dotykających systemów produkcyjnych&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wszystko to komponuje się przez &lt;code&gt;AgentSkillsProviderBuilder&lt;/code&gt;. Żadnego specjalnego routingu, żadnej logiki warunkowej, żadnych sprawdzeń typów umiejętności.&lt;/p&gt;
&lt;h2 id="podsumowanie"&gt;Podsumowanie&lt;/h2&gt;
&lt;p&gt;Umiejętności agentów w .NET mają teraz naprawdę elastyczny model tworzenia. Czy jesteś samotnym programistą szkicującym prototyp z umiejętnościami opartymi na plikach, czy zespołem enterprise dostarczającym spakowane możliwości przez NuGet — wzorce się dopasowują. A mechanizm zatwierdzania skryptów sprawia, że jest gotowe do produkcji dla środowisk, gdzie potrzebujesz tego ludzkiego punktu kontrolnego.&lt;/p&gt;
&lt;p&gt;Sprawdź &lt;a href="https://devblogs.microsoft.com/agent-framework/agent-skills-in-net-three-ways-to-author-one-provider-to-run-them/"&gt;oryginalne ogłoszenie&lt;/a&gt; po pełny przewodnik, &lt;a href="https://learn.microsoft.com/en-us/agent-framework/agents/skills"&gt;dokumentację Agent Skills&lt;/a&gt; na Microsoft Learn i &lt;a href="https://github.com/microsoft/agent-framework/tree/main/dotnet/samples/02-agents/AgentSkills"&gt;przykłady .NET na GitHub&lt;/a&gt;, by zacząć pracę.&lt;/p&gt;</content:encoded></item><item><title>Azure MCP Server 2.0 Właśnie Wylądował — Samodzielnie Hostowana Agentic Cloud Automation Jest Tutaj</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/azure-mcp-server-2-self-hosted-agentic-cloud/</link><pubDate>Sat, 11 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/azure-mcp-server-2-self-hosted-agentic-cloud/</guid><description>Azure MCP Server 2.0 osiąga stabilność z samodzielnie hostowanymi zdalnymi wdrożeniami, 276 narzędziami w 57 usługach Azure i zabezpieczeniami klasy enterprise.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ten post został automatycznie przetłumaczony. Aby przejść do oryginału, &lt;a href="https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/azure-mcp-server-2-self-hosted-agentic-cloud/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Jeśli ostatnio budowałeś cokolwiek z MCP i Azure, pewnie wiesz, że lokalne doświadczenie działa dobrze. Ale gdy musisz udostępnić tę konfigurację całemu zespołowi? Tam rzeczy się komplikowały.&lt;/p&gt;
&lt;p&gt;Już nie. Azure MCP Server &lt;a href="https://devblogs.microsoft.com/azure-sdk/announcing-azure-mcp-server-2-0-stable-release/"&gt;osiągnął stabilną wersję 2.0&lt;/a&gt;, a główna funkcja to dokładnie to, o co prosiły zespoły enterprise: &lt;strong&gt;obsługa samodzielnie hostowanego zdalnego serwera MCP&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="co-to-jest-azure-mcp-server"&gt;Co to jest Azure MCP Server?&lt;/h2&gt;
&lt;p&gt;Azure MCP Server implementuje specyfikację &lt;a href="https://modelcontextprotocol.io/docs/getting-started/intro"&gt;Model Context Protocol&lt;/a&gt; i ujawnia możliwości Azure jako ustrukturyzowane, odkrywalne narzędzia. Liczby mówią same za siebie: &lt;strong&gt;276 narzędzi MCP w 57 usługach Azure&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="wielka-sprawa-samodzielnie-hostowane-zdalne-wdrożenia"&gt;Wielka sprawa: samodzielnie hostowane zdalne wdrożenia&lt;/h2&gt;
&lt;p&gt;W prawdziwym scenariuszu zespołowym potrzebujesz:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Wspólny dostęp dla deweloperów i wewnętrznych systemów agentów&lt;/li&gt;
&lt;li&gt;Scentralizowana konfiguracja&lt;/li&gt;
&lt;li&gt;Granice sieci i polityk enterprise&lt;/li&gt;
&lt;li&gt;Integracja z pipeline&amp;rsquo;ami CI/CD&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Azure MCP Server 2.0 rozwiązuje to wszystko. Do autoryzacji masz dwie opcje:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Managed Identity&lt;/strong&gt; — przy pracy z &lt;a href="https://aka.ms/azmcp/self-host/foundry"&gt;Microsoft Foundry&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Przepływ On-Behalf-Of (OBO)&lt;/strong&gt; — delegacja OpenID Connect z rzeczywistymi uprawnieniami użytkownika&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="wzmocnienie-bezpieczeństwa"&gt;Wzmocnienie bezpieczeństwa&lt;/h2&gt;
&lt;p&gt;Wersja 2.0 dodaje silniejszą walidację punktów końcowych, ochronę przed wzorcami injection i ściślejsze kontrole izolacji.&lt;/p&gt;
&lt;h2 id="pierwsze-kroki"&gt;Pierwsze kroki&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://aka.ms/azmcp"&gt;GitHub Repo&lt;/a&gt;&lt;/strong&gt; — kod źródłowy, dokumenty&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://aka.ms/azmcp/download/docker"&gt;Docker Image&lt;/a&gt;&lt;/strong&gt; — wdrożenie w kontenerze&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://aka.ms/azmcp/download/vscode"&gt;Rozszerzenie VS Code&lt;/a&gt;&lt;/strong&gt; — integracja IDE&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://aka.ms/azmcp/self-host"&gt;Przewodnik self-hosting&lt;/a&gt;&lt;/strong&gt; — flagowa funkcja 2.0&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title>.NET Aspire 13.2 Chce Być Najlepszym Przyjacielem Twojego Agenta AI</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/aspire-agentic-development-build-run-observe/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/aspire-agentic-development-build-run-observe/</guid><description>Aspire 13.2 stawia wszystko na agentic development — ustrukturyzowane wyjście CLI, izolowane uruchomienia, środowiska samoleczące i pełne dane OpenTelemetry, żeby agenci AI mogli faktycznie budować, uruchamiać i obserwować twoje aplikacje.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ten post został automatycznie przetłumaczony. Aby przejść do oryginału, &lt;a href="https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/aspire-agentic-development-build-run-observe/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Znasz ten moment, kiedy twój agent kodowania AI pisze świetny kod, ekscytujesz się, a potem wszystko się sypie, kiedy próbuje to &lt;em&gt;uruchomić&lt;/em&gt;? Konflikty portów, phantom processes, złe zmienne środowiskowe — nagle agent spala tokeny na rozwiązywanie problemów ze startem zamiast budować funkcje.&lt;/p&gt;
&lt;p&gt;Zespół Aspire opublikował &lt;a href="https://devblogs.microsoft.com/aspire/agentic-dev-aspirations/"&gt;bardzo przemyślany post&lt;/a&gt; dokładnie o tym problemie, a ich odpowiedź jest przekonująca: Aspire 13.2 jest zaprojektowany nie tylko dla ludzi, ale dla agentów AI.&lt;/p&gt;
&lt;h2 id="aspire-jako-infrastruktura-agentów"&gt;Aspire jako infrastruktura agentów&lt;/h2&gt;
&lt;p&gt;Oto co Aspire 13.2 wnosi do stołu agentic development:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cały stos w typowanym kodzie.&lt;/strong&gt; AppHost definiuje pełną topologię — w kompilowanym TypeScript lub C#:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createBuilder&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;./.modules/aspire.js&amp;#39;&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="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;createBuilder&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="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;postgres&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addPostgres&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;pg&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;addDatabase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;catalog&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="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cache&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addRedis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;cache&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="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;api&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&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="nx"&gt;addNodeApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;api&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;./api&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;src/index.ts&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 class="nx"&gt;withHttpEndpoint&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;PORT&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 class="nx"&gt;withReference&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;postgres&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="nx"&gt;withReference&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cache&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="k"&gt;await&lt;/span&gt; &lt;span class="nx"&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="nx"&gt;addViteApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;frontend&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;./frontend&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 class="nx"&gt;withReference&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;api&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="nx"&gt;waitFor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;api&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="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;build&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;run&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;&lt;strong&gt;Jedno polecenie do wszystkiego.&lt;/strong&gt; Zamiast żonglowania &lt;code&gt;docker compose up&lt;/code&gt;, &lt;code&gt;npm run dev&lt;/code&gt; i skryptami startowymi bazy danych — wszystko to po prostu &lt;code&gt;aspire start&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Izolowany tryb dla równoległych agentów.&lt;/strong&gt; Z &lt;code&gt;--isolated&lt;/code&gt;, każde uruchomienie Aspire dostaje własne losowe porty i oddzielne sekrety użytkownika.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Oczy agenta przez telemetrię.&lt;/strong&gt; CLI Aspire eksponuje pełne dane OpenTelemetry podczas developmentu — ślady, metryki, ustrukturyzowane logi.&lt;/p&gt;
&lt;h2 id="analogia-do-kul-w-kręglach"&gt;Analogia do kul w kręglach&lt;/h2&gt;
&lt;p&gt;Zespół Aspire używa świetnej analogii: pomyśl o Aspire jak o odbojnikach toru do kręgli dla agentów AI. Jeśli agent nie jest doskonały (a nie będzie), odbojniki nie pozwolą mu rzucać na rynsztok.&lt;/p&gt;
&lt;h2 id="podsumowanie"&gt;Podsumowanie&lt;/h2&gt;
&lt;p&gt;Aspire 13.2 to nie tylko framework dla aplikacji rozproszonych — staje się niezbędną infrastrukturą agentów. Przeczytaj &lt;a href="https://devblogs.microsoft.com/aspire/agentic-dev-aspirations/"&gt;pełny post&lt;/a&gt; od zespołu Aspire.&lt;/p&gt;</content:encoded></item><item><title>Agentic Platform Engineering Staje Się Rzeczywistością — Git-APE Pokazuje Jak</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/agentic-platform-engineering-git-ape/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/agentic-platform-engineering-git-ape/</guid><description>Projekt Git-APE Microsoftu wdraża agentic platform engineering w praktyce — używając agentów GitHub Copilot i Azure MCP do zamiany żądań w języku naturalnym na zwalidowaną infrastrukturę chmurową.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ten post został automatycznie przetłumaczony. Aby przejść do oryginału, &lt;a href="https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/agentic-platform-engineering-git-ape/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Platform engineering to jeden z tych terminów, które świetnie brzmią na konferencjach, ale zazwyczaj oznaczają &amp;ldquo;zbudowaliśmy portal wewnętrzny i wrapper Terraform.&amp;rdquo; Prawdziwa obietnica — self-service infrastruktura, która jest bezpieczna, zarządzana i szybka — zawsze była o kilka kroków za daleko.&lt;/p&gt;
&lt;p&gt;Zespół Azure właśnie opublikował &lt;a href="https://devblogs.microsoft.com/all-things-azure/putting-agentic-platform-engineering-to-the-test/"&gt;Part 2 swojej serii agentic platform engineering&lt;/a&gt;. Nazywają to &lt;strong&gt;Git-APE&lt;/strong&gt; — projekt open-source, który używa agentów GitHub Copilot i serwerów Azure MCP do zamiany żądań w języku naturalnym na zwalidowaną, wdrożoną infrastrukturę.&lt;/p&gt;
&lt;h2 id="co-faktycznie-robi-git-ape"&gt;Co faktycznie robi Git-APE&lt;/h2&gt;
&lt;p&gt;Podstawowy pomysł: zamiast uczyć się modułów Terraform, deweloperzy rozmawiają z agentem Copilot. Agent interpretuje intencje, generuje Infrastructure-as-Code, waliduje wobec zasad i wdraża — wszystko w VS Code.&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;git clone https://github.com/Azure/git-ape
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; git-ape
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Otwórz obszar roboczy w VS Code, a pliki konfiguracji agenta są automatycznie odkrywane przez GitHub Copilot:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;@git-ape deploy a function app with storage in West Europe
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Czyszczenie jest równie proste:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;@git-ape destroy my-resource-group
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="dlaczego-to-ważne"&gt;Dlaczego to ważne&lt;/h2&gt;
&lt;p&gt;Dla tych z nas budujących na Azure, przesuwa to rozmowę z &amp;ldquo;jak zbudować portal&amp;rdquo; na &amp;ldquo;jak opisać nasze guardrails jako API.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Jako deweloper .NET: Azure MCP Server i agenty GitHub Copilot działają z dowolnym obciążeniem Azure — Twoje ASP.NET Core API, .NET Aspire — wszystko może być celem agentic deployment flow.&lt;/p&gt;
&lt;h2 id="podsumowanie"&gt;Podsumowanie&lt;/h2&gt;
&lt;p&gt;Git-APE to wczesne, ale konkretne spojrzenie na agentic platform engineering w praktyce. Sklonuj &lt;a href="https://github.com/Azure/git-ape"&gt;repozytorium&lt;/a&gt; i przeczytaj &lt;a href="https://devblogs.microsoft.com/all-things-azure/putting-agentic-platform-engineering-to-the-test/"&gt;pełny post&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Aplikacje MCP Dostają Fluent API — Buduj Bogate UI Narzędzi AI w .NET w Trzech Krokach</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/mcp-fluent-api-azure-functions-dotnet/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/mcp-fluent-api-azure-functions-dotnet/</guid><description>Nowe płynne API konfiguracji dla aplikacji MCP na Azure Functions pozwala zamienić dowolne narzędzie MCP .NET w pełną aplikację z widokami, uprawnieniami i politykami CSP.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ten post został automatycznie przetłumaczony. Aby przejść do oryginału, &lt;a href="https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/mcp-fluent-api-azure-functions-dotnet/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Narzędzia MCP świetnie nadają się do dawania agentom AI możliwości. Ale co jeśli Twoje narzędzie musi coś pokazać użytkownikowi?&lt;/p&gt;
&lt;p&gt;Lilian Kasem z zespołu Azure SDK &lt;a href="https://devblogs.microsoft.com/azure-sdk/mcp-as-easy-as-1-2-3-introducing-the-fluent-api-for-mcp-apps/"&gt;przedstawiła nowe płynne API konfiguracji&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="płynne-api-w-trzech-krokach"&gt;Płynne API w trzech krokach&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Krok 1: Zdefiniuj swoją funkcję:&lt;/strong&gt;&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;[Function(nameof(HelloApp))]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;HelloApp&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; [McpToolTrigger(&amp;#34;HelloApp&amp;#34;, &amp;#34;A simple MCP App that says hello.&amp;#34;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ToolInvocationContext&lt;/span&gt; &lt;span class="n"&gt;context&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="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Hello from app&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Krok 2: Promuj ją do aplikacji MCP:&lt;/strong&gt;&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;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ConfigureMcpTool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;HelloApp&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 class="n"&gt;AsMcpApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;app&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;WithView&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;assets/hello-app.html&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 class="n"&gt;WithTitle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Hello App&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 class="n"&gt;WithPermissions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;McpAppPermissions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ClipboardWrite&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;McpAppPermissions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ClipboardRead&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;WithCsp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;csp&lt;/span&gt; &lt;span class="p"&gt;=&amp;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;csp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AllowBaseUri&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://www.microsoft.com&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 class="n"&gt;ConnectTo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://www.microsoft.com&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Krok 3: Dodaj swój widok HTML.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Dodaj pakiet:&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;dotnet add package Microsoft.Azure.Functions.Worker.Extensions.Mcp --version 1.5.0-preview.1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Przeczytaj &lt;a href="https://devblogs.microsoft.com/azure-sdk/mcp-as-easy-as-1-2-3-introducing-the-fluent-api-for-mcp-apps/"&gt;pełny post&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Microsoft Foundry Marzec 2026 — GPT-5.4, Agent Service GA i Odświeżenie SDK, Które Zmienia Wszystko</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/microsoft-foundry-march-2026-whats-new/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/microsoft-foundry-march-2026-whats-new/</guid><description>Aktualizacja Foundry z marca 2026 jest ogromna: Agent Service osiąga GA, GPT-5.4 przynosi niezawodne rozumowanie, SDK azure-ai-projects stabilizuje się we wszystkich językach.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ten post został automatycznie przetłumaczony. Aby przejść do oryginału, &lt;a href="https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/microsoft-foundry-march-2026-whats-new/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Miesięczne posty &amp;ldquo;Co nowego w Microsoft Foundry&amp;rdquo; to zazwyczaj mieszanka drobnych ulepszeń. &lt;a href="https://devblogs.microsoft.com/foundry/whats-new-in-microsoft-foundry-mar-2026/"&gt;Edycja z marca 2026&lt;/a&gt;? To prawie same główne funkcje.&lt;/p&gt;
&lt;h2 id="foundry-agent-service-jest-gotowy-do-produkcji"&gt;Foundry Agent Service jest gotowy do produkcji&lt;/h2&gt;
&lt;p&gt;Środowisko uruchomieniowe agentów nowej generacji jest ogólnie dostępne — zbudowane na OpenAI Responses API, kompatybilne przewodowo z agentami OpenAI.&lt;/p&gt;
&lt;p&gt;Kluczowe dodatki: kompleksowe prywatne sieci, rozszerzenie auth MCP, podgląd Voice Live i hosted agents w 6 nowych regionach.&lt;/p&gt;
&lt;h2 id="gpt-54--niezawodność-ponad-surową-inteligencję"&gt;GPT-5.4 — niezawodność ponad surową inteligencję&lt;/h2&gt;
&lt;p&gt;GPT-5.4 nie chodzi o bycie mądrzejszym. Chodzi o bycie bardziej niezawodnym.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Cena (za M tokenów)&lt;/th&gt;
&lt;th&gt;Najlepszy dla&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.4 (≤272K)&lt;/td&gt;
&lt;td&gt;$2.50 / $15 output&lt;/td&gt;
&lt;td&gt;Agenty produkcyjne&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.4 Pro&lt;/td&gt;
&lt;td&gt;$30 / $180 output&lt;/td&gt;
&lt;td&gt;Głęboka analiza&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.4 Mini&lt;/td&gt;
&lt;td&gt;Opłacalny&lt;/td&gt;
&lt;td&gt;Klasyfikacja, ekstrakcja&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="sdk-jest-w-końcu-stabilny"&gt;SDK jest w końcu stabilny&lt;/h2&gt;
&lt;p&gt;SDK &lt;code&gt;azure-ai-projects&lt;/code&gt; opublikował stabilne wersje we wszystkich językach — w tym .NET 2.0.0.&lt;/p&gt;
&lt;h2 id="fireworks-ai-przynosi-otwarte-modele-na-azure"&gt;Fireworks AI przynosi otwarte modele na Azure&lt;/h2&gt;
&lt;p&gt;DeepSeek V3.2, gpt-oss-120b, Kimi K2.5 przy uruchomieniu.&lt;/p&gt;
&lt;p&gt;Przeczytaj &lt;a href="https://devblogs.microsoft.com/foundry/whats-new-in-microsoft-foundry-mar-2026/"&gt;pełne podsumowanie&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Ocena Modernizacji GitHub Copilot To Najlepsze Narzędzie Migracji, Którego Jeszcze Nie Używasz</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/dotnet-modernization-assessment-github-copilot/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/dotnet-modernization-assessment-github-copilot/</guid><description>Rozszerzenie modernizacji GitHub Copilot nie tylko sugeruje zmiany kodu — produkuje pełną ocenę migracji z wykonalnymi problemami, porównaniami celów Azure i współpracującym przepływem pracy.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ten post został automatycznie przetłumaczony. Aby przejść do oryginału, &lt;a href="https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/dotnet-modernization-assessment-github-copilot/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Migrowanie starszej aplikacji .NET Framework do nowoczesnego .NET to jedno z tych zadań, które wszyscy wiedzą, że powinni wykonać, ale nikt nie chce zaczynać.&lt;/p&gt;
&lt;p&gt;Jeffrey Fritz właśnie opublikował &lt;a href="https://devblogs.microsoft.com/dotnet/your-migrations-source-of-truth-the-modernization-assessment/"&gt;dogłębną analizę oceny modernizacji GitHub Copilot&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="to-nie-jest-tylko-silnik-sugestii-kodu"&gt;To nie jest tylko silnik sugestii kodu&lt;/h2&gt;
&lt;p&gt;Rozszerzenie VS Code podąża za modelem &lt;strong&gt;Oceń → Planuj → Wykonaj&lt;/strong&gt;. Faza oceny analizuje całą bazę kodu i produkuje ustrukturyzowany dokument, który wszystko przechwytuje.&lt;/p&gt;
&lt;p&gt;Ocena jest przechowywana pod &lt;code&gt;.github/modernize/assessment/&lt;/code&gt;. Każde uruchomienie produkuje niezależny raport.&lt;/p&gt;
&lt;h2 id="dwa-sposoby-na-start"&gt;Dwa sposoby na start&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Zalecana ocena&lt;/strong&gt; — szybka ścieżka. Wybierz z kuratorowanych domenach (Java/.NET Upgrade, Cloud Readiness, Security).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Niestandardowa ocena&lt;/strong&gt; — ścieżka ukierunkowana. Skonfiguruj dokładnie co analizować: docelowe obliczenia (App Service, AKS, Container Apps), docelowy system operacyjny, analiza konteneryzacji.&lt;/p&gt;
&lt;h2 id="podział-problemów-jest-wykonalny"&gt;Podział problemów jest wykonalny&lt;/h2&gt;
&lt;p&gt;Każdy problem ma poziom krytyczności:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Obowiązkowy&lt;/strong&gt; — musi być naprawiony lub migracja się nie powiedzie&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Potencjalny&lt;/strong&gt; — może wpłynąć na migrację, wymaga ludzkiego osądu&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Opcjonalny&lt;/strong&gt; — zalecane ulepszenia, nie blokuje migracji&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="moje-zdanie"&gt;Moje zdanie&lt;/h2&gt;
&lt;p&gt;Jeśli masz starsze aplikacje .NET Framework, to jest &lt;em&gt;najlepsze&lt;/em&gt; narzędzie do rozpoczęcia. Sam dokument oceny jest wart poświęconego czasu.&lt;/p&gt;
&lt;p&gt;Przeczytaj &lt;a href="https://devblogs.microsoft.com/dotnet/your-migrations-source-of-truth-the-modernization-assessment/"&gt;pełny przewodnik&lt;/a&gt; i pobierz &lt;a href="https://aka.ms/ghcp-appmod/vscode-ext"&gt;rozszerzenie VS Code&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Połącz Swoje Serwery MCP na Azure Functions z Agentami Foundry — Oto Jak</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/foundry-agents-mcp-servers-azure-functions/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/foundry-agents-mcp-servers-azure-functions/</guid><description>Zbuduj swój serwer MCP raz, wdróż go na Azure Functions i połącz z agentami Microsoft Foundry z właściwym uwierzytelnianiem.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ten post został automatycznie przetłumaczony. Aby przejść do oryginału, &lt;a href="https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/foundry-agents-mcp-servers-azure-functions/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Jest jedna rzecz, którą kocham w ekosystemie MCP: budujesz swój serwer raz i działa wszędzie.&lt;/p&gt;
&lt;p&gt;Lily Ma z Azure SDK team &lt;a href="https://devblogs.microsoft.com/azure-sdk/give-your-foundry-agent-custom-tools-with-mcp-servers-on-azure-functions/"&gt;opublikowała praktyczny przewodnik&lt;/a&gt; dotyczący łączenia serwerów MCP wdrożonych na Azure Functions z agentami Microsoft Foundry.&lt;/p&gt;
&lt;h2 id="dlaczego-ta-kombinacja-ma-sens"&gt;Dlaczego ta kombinacja ma sens&lt;/h2&gt;
&lt;p&gt;Azure Functions daje ci skalowalną infrastrukturę, wbudowane uwierzytelnianie i bezserwerowe rozliczenia. Microsoft Foundry daje ci agentów AI, którzy mogą rozumować i działać. Połączenie obu oznacza, że twoje narzędzia stają się możliwościami agentów AI.&lt;/p&gt;
&lt;h2 id="opcje-uwierzytelniania"&gt;Opcje uwierzytelniania&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metoda&lt;/th&gt;
&lt;th&gt;Przypadek użycia&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Key-based&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Programowanie lub serwery bez Entra auth&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Microsoft Entra&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Produkcja z zarządzanymi tożsamościami&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OAuth identity passthrough&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Produkcja z kontekstem użytkownika&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Nieuwierzytelnione&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dev/testowanie lub dane publiczne&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="konfiguracja"&gt;Konfiguracja&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Wdróż serwer MCP na Azure Functions&lt;/strong&gt; — próbki dla &lt;a href="https://github.com/Azure-Samples/remote-mcp-functions-dotnet"&gt;.NET&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Włącz wbudowane uwierzytelnianie MCP&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pobierz URL endpoint&lt;/strong&gt; — &lt;code&gt;https://&amp;lt;FUNCTION_APP_NAME&amp;gt;.azurewebsites.net/runtime/webhooks/mcp&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dodaj serwer MCP jako narzędzie w Foundry&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Przeczytaj &lt;a href="https://devblogs.microsoft.com/azure-sdk/give-your-foundry-agent-custom-tools-with-mcp-servers-on-azure-functions/"&gt;pełny przewodnik&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>SQL MCP Server — Właściwy Sposób na Danie Agentom AI Dostępu do Bazy Danych</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/sql-mcp-server-data-api-builder/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/sql-mcp-server-data-api-builder/</guid><description>SQL MCP Server z Data API builder daje agentom AI bezpieczny, deterministyczny dostęp do bazy danych bez ujawniania schematów lub polegania na NL2SQL.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ten post został automatycznie przetłumaczony. Aby przejść do oryginału, &lt;a href="https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/sql-mcp-server-data-api-builder/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Będąc szczerym: większość dostępnych dziś serwerów MCP dla baz danych jest przerażająca. Biorą zapytanie w języku naturalnym, generują SQL w locie i uruchamiają go na twoich danych produkcyjnych.&lt;/p&gt;
&lt;p&gt;Zespół Azure SQL właśnie &lt;a href="https://devblogs.microsoft.com/azure-sql/introducing-sql-mcp-server/"&gt;przedstawił SQL MCP Server&lt;/a&gt;, i przyjmuje fundamentalnie inne podejście.&lt;/p&gt;
&lt;h2 id="dlaczego-nie-nl2sql"&gt;Dlaczego nie NL2SQL?&lt;/h2&gt;
&lt;p&gt;Modele nie są deterministyczne. SQL MCP Server używa podejścia &lt;strong&gt;NL2DAB&lt;/strong&gt;. Agent pracuje z warstwą abstrakcji encji Data API builder, aby deterministycznie produkować dokładne T-SQL.&lt;/p&gt;
&lt;h2 id="siedem-narzędzi-nie-siedemset"&gt;Siedem narzędzi, nie siedemset&lt;/h2&gt;
&lt;p&gt;SQL MCP Server udostępnia dokładnie siedem narzędzi DML:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;describe_entities&lt;/code&gt; — odkryj dostępne encje&lt;/li&gt;
&lt;li&gt;&lt;code&gt;create_record&lt;/code&gt; — wstawiaj wiersze&lt;/li&gt;
&lt;li&gt;&lt;code&gt;read_records&lt;/code&gt; — zapytuj tabele i widoki&lt;/li&gt;
&lt;li&gt;&lt;code&gt;update_record&lt;/code&gt; — modyfikuj wiersze&lt;/li&gt;
&lt;li&gt;&lt;code&gt;delete_record&lt;/code&gt; — usuń wiersze&lt;/li&gt;
&lt;li&gt;&lt;code&gt;execute_entity&lt;/code&gt; — uruchamiaj procedury składowane&lt;/li&gt;
&lt;li&gt;&lt;code&gt;aggregate_records&lt;/code&gt; — zapytania agregujące&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="pierwsze-kroki-w-trzech-poleceniach"&gt;Pierwsze kroki w trzech poleceniach&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;dab init --database-type mssql --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;dab add Customers --source dbo.Customers --permissions &lt;span class="s2"&gt;&amp;#34;anonymous:*&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;dab start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="historia-bezpieczeństwa-jest-solidna"&gt;Historia bezpieczeństwa jest solidna&lt;/h2&gt;
&lt;p&gt;RBAC na każdej warstwie, integracja Azure Key Vault, Microsoft Entra + niestandardowy OAuth.&lt;/p&gt;
&lt;p&gt;Sprawdź &lt;a href="https://devblogs.microsoft.com/azure-sql/introducing-sql-mcp-server/"&gt;pełny post&lt;/a&gt; i &lt;a href="https://aka.ms/sql/mcp"&gt;dokumentację&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>To ustawienie Visual Studio dla pływających okien, o którym nie wiedziałeś (a powinieneś)</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/visual-studio-floating-windows-powertoys/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/visual-studio-floating-windows-powertoys/</guid><description>Ukryte ustawienie Visual Studio daje ci pełną kontrolę nad pływającymi oknami — niezależne wpisy na pasku zadań, prawidłowe zachowanie na wielu monitorach i idealna integracja z FancyZones. Jedna lista rozwijana zmienia wszystko.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ten post został automatycznie przetłumaczony. Aby przejść do oryginału, &lt;a href="https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/visual-studio-floating-windows-powertoys/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Jeśli używasz wielu monitorów z Visual Studio (a szczerze, kto tego nie robi w dzisiejszych czasach), prawdopodobnie doświadczyłeś irytacji: pływające okna narzędziowe znikają po zminimalizowaniu głównego IDE, zawsze pozostają na wierzchu wszystkiego innego i nie pojawiają się jako oddzielne przyciski na pasku zadań. To działa w niektórych przepływach pracy, ale przy konfiguracji wielomonitorowej jest frustrujące.&lt;/p&gt;
&lt;p&gt;Mads Kristensen z zespołu Visual Studio &lt;a href="https://devblogs.microsoft.com/visualstudio/take-full-control-of-your-floating-windows-in-visual-studio/"&gt;podzielił się mało znanum ustawieniem&lt;/a&gt;, które całkowicie zmienia sposób zachowania pływających okien. Jedna lista rozwijana. To wszystko.&lt;/p&gt;
&lt;h2 id="ustawienie"&gt;Ustawienie&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Narzędzia &amp;gt; Opcje &amp;gt; Środowisko &amp;gt; Okna &amp;gt; Pływające okna&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Lista rozwijana &amp;ldquo;Te pływające okna należą do głównego okna&amp;rdquo; ma trzy opcje:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Żadne&lt;/strong&gt; — pełna niezależność. Każde pływające okno dostaje własny wpis na pasku zadań i zachowuje się jak normalne okno Windows.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Okna narzędziowe&lt;/strong&gt; (domyślne) — dokumenty pływają swobodnie, okna narzędziowe pozostają powiązane z IDE.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dokumenty i okna narzędziowe&lt;/strong&gt; — klasyczne zachowanie Visual Studio, wszystko powiązane z głównym oknem.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="dlaczego-żadne-to-właściwy-wybór-przy-konfiguracji-wielomonitorowej"&gt;Dlaczego &amp;ldquo;Żadne&amp;rdquo; to właściwy wybór przy konfiguracji wielomonitorowej&lt;/h2&gt;
&lt;p&gt;Ustaw na &lt;strong&gt;Żadne&lt;/strong&gt; i nagle wszystkie twoje pływające okna narzędziowe i dokumenty zachowują się jak prawdziwe aplikacje Windows. Pojawiają się na pasku zadań, pozostają widoczne po zminimalizowaniu głównego okna Visual Studio i przestają wymuszać się na pierwszym planie.&lt;/p&gt;
&lt;p&gt;Połącz to z &lt;strong&gt;PowerToys FancyZones&lt;/strong&gt; i to jest zmiana zasad gry. Twórz niestandardowe układy na swoich monitorach, przyciągaj Eksploratora rozwiązań do jednej strefy, debugger do innej i pliki kodu gdzie chcesz. Wszystko pozostaje na swoim miejscu, wszystko jest niezależnie dostępne, a przestrzeń robocza wydaje się zorganizowana zamiast chaotyczna.&lt;/p&gt;
&lt;h2 id="szybkie-rekomendacje"&gt;Szybkie rekomendacje&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Użytkownicy wielomonitorowi&lt;/strong&gt;: Ustaw na &lt;strong&gt;Żadne&lt;/strong&gt;, połącz z FancyZones&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Okazjonalni użytkownicy pływających okien&lt;/strong&gt;: &lt;strong&gt;Okna narzędziowe&lt;/strong&gt; (domyślne) to solidny kompromis&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tradycyjny przepływ pracy&lt;/strong&gt;: &lt;strong&gt;Dokumenty i okna narzędziowe&lt;/strong&gt; zachowuje wszystko klasycznie&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wskazówka: &lt;strong&gt;Ctrl + dwukliknięcie&lt;/strong&gt; na pasku tytułu dowolnego okna narzędziowego, by natychmiast pływać lub zadokować. Po zmianie ustawienia nie jest wymagane ponowne uruchomienie.&lt;/p&gt;
&lt;h2 id="podsumowanie"&gt;Podsumowanie&lt;/h2&gt;
&lt;p&gt;To jedno z tych ustawień &amp;ldquo;nie mogę uwierzyć, że o tym nie wiedziałem&amp;rdquo;. Jeśli kiedykolwiek pływające okna w Visual Studio cię irytowały, idź i zmień to teraz.&lt;/p&gt;
&lt;p&gt;Przeczytaj &lt;a href="https://devblogs.microsoft.com/visualstudio/take-full-control-of-your-floating-windows-in-visual-studio/"&gt;pełny post&lt;/a&gt; po szczegóły i zrzuty ekranu.&lt;/p&gt;</content:encoded></item><item><title>Tryb Izolowany Aspire Rozwiązuje Problem Konfliktów Portów w Równoległym Programowaniu</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/aspire-isolated-mode-parallel-instances/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/aspire-isolated-mode-parallel-instances/</guid><description>Aspire 13.2 wprowadza tryb --isolated: losowe porty, oddzielne sekrety i zero kolizji przy uruchamianiu wielu instancji tego samego AppHosta. Idealne dla agentów AI, worktrees i równoległych przepływów pracy.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ten post został automatycznie przetłumaczony. Aby przejść do oryginału, &lt;a href="https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/aspire-isolated-mode-parallel-instances/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Jeśli próbowałeś uruchomić dwie instancje tego samego projektu jednocześnie, znasz ten ból. Port 8080 jest już zajęty.&lt;/p&gt;
&lt;p&gt;Aspire 13.2 naprawia to jedną flagą. James Newton-King &lt;a href="https://devblogs.microsoft.com/aspire/aspire-isolated-mode-parallel-development/"&gt;opisał pełne szczegóły&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="rozwiązanie---isolated"&gt;Rozwiązanie: &lt;code&gt;--isolated&lt;/code&gt;&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;aspire run --isolated
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Każde uruchomienie dostaje:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Losowe porty&lt;/strong&gt; — brak kolizji między instancjami&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Izolowane sekrety użytkownika&lt;/strong&gt; — ciągi połączeń i klucze API zostają oddzielne dla każdej instancji&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="prawdziwe-scenariusze-gdzie-to-błyszczy"&gt;Prawdziwe scenariusze gdzie to błyszczy&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Wiele checkoutów:&lt;/strong&gt;&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;# Terminal 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/projects/my-app-feature
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire run --isolated
&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;# Terminal 2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/projects/my-app-bugfix
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire run --isolated
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Oba działają bez konfliktów.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Agenty w tle w VS Code.&lt;/strong&gt; Gdy agent w tle Copilot Chat tworzy git worktree, tryb izolowany zapewnia, że obie instancje po prostu działają.&lt;/p&gt;
&lt;h2 id="jak-to-działa-pod-maską"&gt;Jak to działa pod maską&lt;/h2&gt;
&lt;p&gt;Gdy przekażesz &lt;code&gt;--isolated&lt;/code&gt;, CLI generuje unikalny identyfikator instancji dla uruchomienia, który napędza randomizację portów i izolację sekretów.&lt;/p&gt;
&lt;h2 id="podsumowanie"&gt;Podsumowanie&lt;/h2&gt;
&lt;p&gt;Tryb izolowany to mała funkcja, która rozwiązuje prawdziwy, coraz bardziej powszechny problem. Zdobądź 13.2 z &lt;code&gt;aspire update --self&lt;/code&gt;.&lt;/p&gt;</content:encoded></item><item><title>Tworzenie interfejsów użytkownika dla multi-agentowych systemów w czasie rzeczywistym — bez efektu czarnej skrzynki</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/ag-ui-real-time-multi-agent-ui-maf/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/ag-ui-real-time-multi-agent-ui-maf/</guid><description>AG-UI i Microsoft Agent Framework łączą siły, by zapewnić multi-agentowym przepływom pracy właściwy frontend — ze streamingiem w czasie rzeczywistym, zatwierdzeniami przez człowieka i pełną widocznością działań agentów.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ten post został automatycznie przetłumaczony. Aby przejść do oryginału, &lt;a href="https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/ag-ui-real-time-multi-agent-ui-maf/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Oto rzecz o systemach wieloagentowych: w demonstracjach wyglądają niesamowicie. Trzy agenty przekazują sobie pracę, rozwiązują problemy, podejmują decyzje. Potem próbujesz pokazać to prawdziwym użytkownikom i&amp;hellip; cisza. Kręcący się wskaźnik. Nikt nie wie, który agent co robi ani dlaczego system jest wstrzymany. To nie jest produkt — to problem zaufania.&lt;/p&gt;
&lt;p&gt;Zespół Microsoft Agent Framework właśnie opublikował &lt;a href="https://devblogs.microsoft.com/agent-framework/ag-ui-multi-agent-workflow-demo/"&gt;świetny przewodnik&lt;/a&gt; dotyczący łączenia przepływów pracy MAF z &lt;a href="https://github.com/ag-ui-protocol/ag-ui"&gt;AG-UI&lt;/a&gt; — otwartym protokołem do strumieniowania zdarzeń wykonania agentów do frontendu przez Server-Sent Events. I szczerze? To jest właśnie ten most, którego nam brakowało.&lt;/p&gt;
&lt;h2 id="dlaczego-to-ważne-dla-programistów-net"&gt;Dlaczego to ważne dla programistów .NET&lt;/h2&gt;
&lt;p&gt;Jeśli budujesz aplikacje oparte na AI, prawdopodobnie trafiłeś już na tę ścianę. Twoja orkiestracja backendowa działa świetnie — agenty przekazują sobie zadania, narzędzia się uruchamiają, decyzje są podejmowane. Ale frontend nie ma pojęcia, co dzieje się za kulisami. AG-UI rozwiązuje to, definiując standardowy protokół do strumieniowania zdarzeń agentów (takich jak &lt;code&gt;RUN_STARTED&lt;/code&gt;, &lt;code&gt;STEP_STARTED&lt;/code&gt;, &lt;code&gt;TOOL_CALL_*&lt;/code&gt;, &lt;code&gt;TEXT_MESSAGE_*&lt;/code&gt;) bezpośrednio do warstwy interfejsu przez SSE.&lt;/p&gt;
&lt;p&gt;Demonstracja, którą zbudowali, to przepływ pracy obsługi klienta z trzema agentami: agent triaży kierujący żądaniami, agent zwrotów obsługujący pieniądze i agent zamówień zarządzający wymianami. Każdy agent ma własne narzędzia, a topologia przekazywania jest jawnie zdefiniowana — żadnego &amp;ldquo;wyczuj to z kontekstu prompta&amp;rdquo;.&lt;/p&gt;
&lt;h2 id="topologia-przekazywania-to-prawdziwa-gwiazda"&gt;Topologia przekazywania to prawdziwa gwiazda&lt;/h2&gt;
&lt;p&gt;Zwróciło moją uwagę to, jak &lt;code&gt;HandoffBuilder&lt;/code&gt; pozwala zadeklarować skierowany graf routingu między agentami:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;builder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;HandoffBuilder&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="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;ag_ui_handoff_workflow_demo&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;participants&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;triage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;refund&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;order&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;termination_condition&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;termination_condition&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&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;builder&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_handoff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;triage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;refund&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Refunds, damaged-item claims...&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="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_handoff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;triage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Replacement, exchange...&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="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_handoff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;refund&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Replacement logistics needed after refund.&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="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_handoff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;triage&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;After replacement/shipping tasks complete.&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Każde &lt;code&gt;add_handoff&lt;/code&gt; tworzy skierowaną krawędź z opisem w języku naturalnym. Framework generuje narzędzia przekazywania dla każdego agenta na podstawie tej topologii. Decyzje dotyczące routingu są zakorzenione w strukturze orkiestracji, a nie w tym, na co ma ochotę LLM. To ogromna rzecz dla niezawodności produkcji.&lt;/p&gt;
&lt;h2 id="człowiek-w-pętli-który-naprawdę-działa"&gt;Człowiek w pętli, który naprawdę działa&lt;/h2&gt;
&lt;p&gt;Demonstracja prezentuje dwa wzorce przerwań, które są potrzebne w każdej prawdziwej aplikacji agentowej:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Przerwania zatwierdzania narzędzi&lt;/strong&gt; — gdy agent wywołuje narzędzie oznaczone jako &lt;code&gt;approval_mode=&amp;quot;always_require&amp;quot;&lt;/code&gt;, przepływ pracy wstrzymuje się i emituje zdarzenie. Frontend renderuje modal zatwierdzenia z nazwą narzędzia i argumentami. Żadnych pętli ponownych prób — tylko czysty przepływ wstrzymaj-zatwierdź-wznów.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Przerwania żądania informacji&lt;/strong&gt; — gdy agent potrzebuje więcej kontekstu od użytkownika (jak numer zamówienia), wstrzymuje się i pyta. Frontend wyświetla pytanie, użytkownik odpowiada, a wykonanie wznawia się dokładnie tam, gdzie się zatrzymało.&lt;/p&gt;
&lt;p&gt;Oba wzorce są strumieniowane jako standardowe zdarzenia AG-UI, więc frontend nie potrzebuje niestandardowej logiki dla każdego agenta — po prostu renderuje to, co przychodzi przez połączenie SSE.&lt;/p&gt;
&lt;h2 id="podłączenie-jest-zaskakująco-proste"&gt;Podłączenie jest zaskakująco proste&lt;/h2&gt;
&lt;p&gt;Integracja między MAF a AG-UI to jedno wywołanie funkcji:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;agent_framework.ag_ui&lt;/span&gt; &lt;span class="kn"&gt;import&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;AgentFrameworkWorkflow&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;add_agent_framework_fastapi_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="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;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;FastAPI&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;demo_workflow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AgentFrameworkWorkflow&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;workflow_factory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;_thread_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;create_handoff_workflow&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="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;ag_ui_handoff_workflow_demo&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;add_agent_framework_fastapi_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="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;demo_workflow&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/handoff_demo&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;workflow_factory&lt;/code&gt; tworzy nowy przepływ pracy dla każdego wątku, więc każda rozmowa otrzymuje izolowany stan. Endpoint automatycznie obsługuje całe &amp;ldquo;hydrauliczne&amp;rdquo; SSE. Jeśli już używasz FastAPI (lub możesz dodać go jako lekką warstwę), to właściwie zerowe tarcie.&lt;/p&gt;
&lt;h2 id="moje-zdanie"&gt;Moje zdanie&lt;/h2&gt;
&lt;p&gt;Dla nas, programistów .NET, natychmiastowe pytanie brzmi: &amp;ldquo;Czy mogę to zrobić w C#?&amp;rdquo; Agent Framework jest dostępny zarówno dla .NET, jak i Python, a protokół AG-UI jest niezależny od języka (to po prostu SSE). Więc choć ta konkretna demonstracja używa Python i FastAPI, wzorzec przekłada się bezpośrednio. Możesz podpiąć minimalne API ASP.NET Core z endpointami SSE zgodnie z tym samym schematem zdarzeń AG-UI.&lt;/p&gt;
&lt;p&gt;Ważniejszy wniosek: interfejsy użytkownika dla wielu agentów stają się pierwszoklasowym zagadnieniem, a nie przemyśleniem. Jeśli budujesz cokolwiek, gdzie agenty wchodzą w interakcje z ludźmi — obsługa klienta, przepływy zatwierdzeń, przetwarzanie dokumentów — ta kombinacja orkiestracji MAF i przejrzystości AG-UI to wzorzec do naśladowania.&lt;/p&gt;
&lt;h2 id="podsumowanie"&gt;Podsumowanie&lt;/h2&gt;
&lt;p&gt;AG-UI + Microsoft Agent Framework zapewnia to, co najlepsze z obu światów: solidną orkiestrację wieloagentową na backendzie i widoczność w czasie rzeczywistym na frontendzie. Koniec z interakcjami agentów jako czarną skrzynką.&lt;/p&gt;
&lt;p&gt;Sprawdź &lt;a href="https://devblogs.microsoft.com/agent-framework/ag-ui-multi-agent-workflow-demo/"&gt;pełny przewodnik&lt;/a&gt; i &lt;a href="https://github.com/ag-ui-protocol/ag-ui"&gt;repozytorium protokołu AG-UI&lt;/a&gt;, by zagłębić się w temat.&lt;/p&gt;</content:encoded></item><item><title>VS Code 1.116 — aplikacja Agents otrzymuje nawigację klawiaturową i uzupełnienia kontekstu pliku</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/vscode-1-116-agents-app-updates/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/vscode-1-116-agents-app-updates/</guid><description>VS Code 1.116 skupia się na dopracowaniu aplikacji Agents — dedykowane skróty klawiaturowe, ulepszenia dostępności, uzupełnienia kontekstu pliku i rozpoznawanie linków @import CSS.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ten post został automatycznie przetłumaczony. Aby przejść do oryginału, &lt;a href="https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/vscode-1-116-agents-app-updates/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;VS Code 1.116 to wydanie z kwietnia 2026, i choć jest lżejsze niż niektóre ostatnie aktualizacje, zmiany są skoncentrowane i znaczące — szczególnie jeśli codziennie używasz aplikacji Agents.&lt;/p&gt;
&lt;p&gt;Oto co wylądowało, na podstawie &lt;a href="https://code.visualstudio.com/updates/v1_116"&gt;oficjalnych notatek wydania&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="ulepszenia-aplikacji-agents"&gt;Ulepszenia aplikacji Agents&lt;/h2&gt;
&lt;p&gt;Aplikacja Agents nadal dojrzewa z dopracowaniem użyteczności, które robi realną różnicę w codziennych przepływach pracy:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dedykowane skróty klawiaturowe&lt;/strong&gt; — możesz teraz skupić widok Changes, drzewo plików w Changes i widok Chat Customizations za pomocą dedykowanych poleceń i skrótów klawiaturowych. Jeśli klikałeś po aplikacji Agents, by nawigować, to przynosi pełne przepływy pracy oparte na klawiaturze.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dialog pomocy dostępności&lt;/strong&gt; — naciśnięcie &lt;code&gt;Alt+F1&lt;/code&gt; w polu wejściowym czatu teraz otwiera dialog pomocy dostępności pokazujący dostępne polecenia i skróty klawiaturowe. Użytkownicy czytników ekranu mogą też kontrolować szczegółowość ogłoszeń. Dobra dostępność przynosi korzyści wszystkim.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Uzupełnienia kontekstu pliku&lt;/strong&gt; — wpisz &lt;code&gt;#&lt;/code&gt; w czacie aplikacji Agents, by wywołać uzupełnienia kontekstu pliku ograniczone do twojego bieżącego obszaru roboczego. To jedno z tych małych ulepszeń komfortu pracy, które przyspiesza każdą interakcję — nie trzeba już wpisywać pełnych ścieżek pliku przy odwoływaniu się do kodu.&lt;/p&gt;
&lt;h2 id="rozpoznawanie-linków-import-css"&gt;Rozpoznawanie linków &lt;code&gt;@import&lt;/code&gt; CSS&lt;/h2&gt;
&lt;p&gt;Miłe dla programistów frontend: VS Code teraz rozpoznaje odwołania CSS &lt;code&gt;@import&lt;/code&gt; używające ścieżek node_modules. Możesz &lt;code&gt;Ctrl+kliknąć&lt;/code&gt; przez importy jak &lt;code&gt;@import &amp;quot;some-module/style.css&amp;quot;&lt;/code&gt; przy używaniu bundlerów. Mała rzecz, ale eliminuje punkt tarcia w przepływach pracy CSS.&lt;/p&gt;
&lt;h2 id="podsumowanie"&gt;Podsumowanie&lt;/h2&gt;
&lt;p&gt;VS Code 1.116 dotyczy dopracowania — sprawia, że aplikacja Agents jest bardziej nawigowalna, bardziej dostępna i bardziej przyjazna dla klawiatury. Jeśli spędzasz znaczny czas w aplikacji Agents (a podejrzewam, że wielu z nas tak), te zmiany sumują się.&lt;/p&gt;
&lt;p&gt;Sprawdź &lt;a href="https://code.visualstudio.com/updates/v1_116"&gt;pełne notatki wydania&lt;/a&gt; po kompletną listę.&lt;/p&gt;</content:encoded></item><item><title>VS Code 1.115 — powiadomienia terminala w tle, tryb agenta przez SSH i więcej</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/vscode-1-115-agent-improvements/</link><pubDate>Mon, 06 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/vscode-1-115-agent-improvements/</guid><description>VS Code 1.115 przynosi powiadomienia terminala w tle dla agentów, zdalne hostowanie agentów przez SSH, wklejanie plików do terminali i śledzenie edycji uwzględniające sesje. Oto co ważne dla programistów .NET.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ten post został automatycznie przetłumaczony. Aby przejść do oryginału, &lt;a href="https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/vscode-1-115-agent-improvements/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;VS Code 1.115 właśnie &lt;a href="https://code.visualstudio.com/updates/v1_115"&gt;wyszedł&lt;/a&gt; i choć jest to lżejsze wydanie pod względem nagłówkowych funkcji, ulepszenia związane z agentami są naprawdę przydatne, jeśli codziennie pracujesz z asystentami AI.&lt;/p&gt;
&lt;p&gt;Pozwól, że wyróżnię to, co naprawdę warto wiedzieć.&lt;/p&gt;
&lt;h2 id="terminale-w-tle-informują-agentów"&gt;Terminale w tle informują agentów&lt;/h2&gt;
&lt;p&gt;To jest wyróżniająca się funkcja. Terminale w tle teraz automatycznie powiadamiają agentów o zakończeniu poleceń, w tym o kodzie wyjścia i wyjściu terminala. Monity wejściowe w terminalach w tle są również wykrywane i udostępniane użytkownikowi.&lt;/p&gt;
&lt;p&gt;Dlaczego to ważne? Jeśli używałeś trybu agenta Copilot do uruchamiania poleceń kompilacji lub zestawów testów w tle, znasz ból &amp;ldquo;czy to już skończyło?&amp;rdquo; — terminale w tle były praktycznie na zasadzie &amp;ldquo;odpal i zapomnij&amp;rdquo;. Teraz agent dostaje powiadomienie, gdy twoje &lt;code&gt;dotnet build&lt;/code&gt; lub &lt;code&gt;dotnet test&lt;/code&gt; zakończy się, widzi wyjście i może odpowiednio zareagować. To mała zmiana, która sprawia, że przepływy pracy oparte na agentach są znacznie bardziej niezawodne.&lt;/p&gt;
&lt;p&gt;Jest też nowe narzędzie &lt;code&gt;send_to_terminal&lt;/code&gt;, które pozwala agentom wysyłać polecenia do terminali w tle z potwierdzeniem użytkownika, naprawiając problem gdzie &lt;code&gt;run_in_terminal&lt;/code&gt; z limitem czasu przenosiło terminale do tła i czyniło je tylko do odczytu.&lt;/p&gt;
&lt;h2 id="zdalne-hostowanie-agentów-przez-ssh"&gt;Zdalne hostowanie agentów przez SSH&lt;/h2&gt;
&lt;p&gt;VS Code obsługuje teraz połączenie ze zdalnymi maszynami przez SSH, automatycznie instalując CLI i uruchamiając go w trybie hosta agenta. Oznacza to, że twoje sesje agenta AI mogą bezpośrednio celować w zdalne środowiska — przydatne dla programistów .NET, którzy kompilują i testują na serwerach Linux lub maszynach wirtualnych w chmurze.&lt;/p&gt;
&lt;h2 id="śledzenie-edycji-w-sesjach-agenta"&gt;Śledzenie edycji w sesjach agenta&lt;/h2&gt;
&lt;p&gt;Edycje plików dokonane podczas sesji agenta są teraz śledzone i przywracane, z diff, cofnij/ponów i przywróceniem stanu. Jeśli agent wprowadza zmiany do twojego kodu i coś pójdzie nie tak, możesz zobaczyć dokładnie co się zmieniło i to cofnąć. Spokój ducha przy pozwalaniu agentom modyfikować twoją bazę kodu.&lt;/p&gt;
&lt;h2 id="świadomość-kart-przeglądarki-i-inne-ulepszenia"&gt;Świadomość kart przeglądarki i inne ulepszenia&lt;/h2&gt;
&lt;p&gt;Kilka kolejnych ulepszeń komfortu pracy:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Śledzenie kart przeglądarki&lt;/strong&gt; — czat może teraz śledzić i linkować do kart przeglądarki otwartych podczas sesji, by agenty mogły odwoływać się do stron internetowych, na które patrzysz&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Wklejanie plików do terminala&lt;/strong&gt; — wklej pliki (w tym obrazy) do terminala przez Ctrl+V, przeciągnij i upuść lub kliknij prawym przyciskiem&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pokrycie testów w minimapie&lt;/strong&gt; — wskaźniki pokrycia testów są teraz widoczne w minimapie dla szybkiego przeglądu wizualnego&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Szczypanie do powiększenia na Mac&lt;/strong&gt; — zintegrowana przeglądarka obsługuje gesty szczypania do powiększenia&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Uprawnienia Copilot w sesjach&lt;/strong&gt; — pasek stanu pokazuje informacje o użyciu w widoku Sesji&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Favicon w Przejdź do pliku&lt;/strong&gt; — otwarte strony internetowe pokazują favicon na liście szybkiego wyboru&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="podsumowanie"&gt;Podsumowanie&lt;/h2&gt;
&lt;p&gt;VS Code 1.115 to wydanie przyrostowe, ale ulepszenia agentów — powiadomienia terminala w tle, zdalne hostowanie agentów przez SSH i śledzenie edycji — składają się na zauważalnie płynniejsze doświadczenie przy programowaniu wspomaganym przez AI. Jeśli używasz trybu agenta Copilot dla projektów .NET, to właśnie takie poprawki komfortu pracy redukują codzienne tarcie.&lt;/p&gt;
&lt;p&gt;Sprawdź &lt;a href="https://code.visualstudio.com/updates/v1_115"&gt;pełne notatki wydania&lt;/a&gt; po każdy szczegół.&lt;/p&gt;</content:encoded></item><item><title>C# 15 Dostaje Typy Unii — I Są Dokładnie Tym, O Co Prosiliśmy</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/csharp-15-union-types-exhaustive-matching/</link><pubDate>Sun, 05 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/csharp-15-union-types-exhaustive-matching/</guid><description>C# 15 wprowadza słowo kluczowe `union` — dyskryminowane unie egzekwowane przez kompilator z wyczerpującym dopasowaniem wzorców. Oto jak wyglądają, dlaczego mają znaczenie i jak je wypróbować.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ten post został automatycznie przetłumaczony. Aby przejść do oryginału, &lt;a href="https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/csharp-15-union-types-exhaustive-matching/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Na to czekałem. C# 15 wprowadza słowo kluczowe &lt;code&gt;union&lt;/code&gt; — właściwe dyskryminowane unie z wyczerpującym dopasowaniem wzorców egzekwowanym przez kompilator.&lt;/p&gt;
&lt;p&gt;Bill Wagner &lt;a href="https://devblogs.microsoft.com/dotnet/csharp-15-union-types/"&gt;opublikował głębokie omówienie&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="problem-rozwiązywany-przez-unie"&gt;Problem rozwiązywany przez unie&lt;/h2&gt;
&lt;p&gt;Przed C# 15, zwracanie &amp;ldquo;jednego z kilku możliwych typów&amp;rdquo; było zawsze kompromisem. Nigdy nie dostawałeś tego, czego naprawdę chcesz: zamkniętego zbioru typów, gdzie kompilator gwarantuje, że obsłużyłeś każdy przypadek.&lt;/p&gt;
&lt;h2 id="składnia-jest-pięknie-prosta"&gt;Składnia jest pięknie prosta&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="kd"&gt;public&lt;/span&gt; &lt;span class="k"&gt;record&lt;/span&gt; &lt;span class="nc"&gt;class&lt;/span&gt; &lt;span class="n"&gt;Cat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Name&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="kd"&gt;public&lt;/span&gt; &lt;span class="k"&gt;record&lt;/span&gt; &lt;span class="nc"&gt;class&lt;/span&gt; &lt;span class="n"&gt;Dog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Name&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="kd"&gt;public&lt;/span&gt; &lt;span class="k"&gt;record&lt;/span&gt; &lt;span class="nc"&gt;class&lt;/span&gt; &lt;span class="n"&gt;Bird&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Name&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="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;union&lt;/span&gt; &lt;span class="n"&gt;Pet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Cat&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Dog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Bird&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;A oto magia — kompilator egzekwuje wyczerpujące dopasowanie:&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="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pet&lt;/span&gt; &lt;span class="k"&gt;switch&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;Dog&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&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;Cat&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&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;Bird&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&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;p&gt;Nie potrzeba &lt;code&gt;_&lt;/code&gt;. Jeśli później dodasz czwarty typ do unii, każde wyrażenie switch, które go nie obsługuje, generuje ostrzeżenie.&lt;/p&gt;
&lt;h2 id="zastosowanie-praktyczne"&gt;Zastosowanie praktyczne&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="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;union&lt;/span&gt; &lt;span class="n"&gt;ApiResult&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ApiError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ValidationFailure&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;Teraz każdy konsument jest zmuszony obsłużyć sukces, błąd i niepowodzenie walidacji.&lt;/p&gt;
&lt;h2 id="wypróbuj-już-dziś"&gt;Wypróbuj już dziś&lt;/h2&gt;
&lt;p&gt;Typy unii są dostępne w .NET 11 Preview 2. Sprawdź &lt;a href="https://learn.microsoft.com/dotnet/csharp/language-reference/builtin-types/union"&gt;pełną dokumentację&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Aspire 13.2 Dostarcza CLI do Dokumentacji — i Twój Agent AI Też Może Go Używać</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/aspire-docs-cli-ai-skills/</link><pubDate>Sat, 04 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/aspire-docs-cli-ai-skills/</guid><description>.NET Aspire 13.2 dodaje aspire docs — CLI do wyszukiwania, przeglądania i czytania oficjalnej dokumentacji bez opuszczania terminala. Działa też jako narzędzie dla agentów AI.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ten post został automatycznie przetłumaczony. Aby przejść do oryginału, &lt;a href="https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/aspire-docs-cli-ai-skills/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Znasz ten moment, kiedy siedzisz głęboko w Aspire AppHost, łączysz integracje i musisz sprawdzić dokładnie, jakich parametrów oczekuje integracja Redis? Alt-tab do przeglądarki, szukasz na aspire.dev. Kontekst utracony.&lt;/p&gt;
&lt;p&gt;Aspire 13.2 właśnie &lt;a href="https://devblogs.microsoft.com/aspire/aspire-docs-in-your-terminal/"&gt;dostarczył rozwiązanie&lt;/a&gt;. CLI &lt;code&gt;aspire docs&lt;/code&gt; pozwala wyszukiwać, przeglądać i czytać oficjalną dokumentację Aspire bezpośrednio z terminala.&lt;/p&gt;
&lt;h2 id="trzy-polecenia-zero-kart-przeglądarki"&gt;Trzy polecenia, zero kart przeglądarki&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;&lt;span class="c1"&gt;# Lista wszystkich dokumentów&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire docs list
&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;# Szukaj tematu&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire docs search &lt;span class="s2"&gt;&amp;#34;redis&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;# Przeczytaj pełną stronę&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire docs get redis-integration
&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;# Tylko jedna sekcja&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire docs get redis-integration --section &lt;span class="s2"&gt;&amp;#34;Add Redis resource&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="kąt-agentów-ai"&gt;Kąt agentów AI&lt;/h2&gt;
&lt;p&gt;To samo sprawia, że jest to interesujące dla deweloperów budujących z narzędziami AI. Te same polecenia &lt;code&gt;aspire docs&lt;/code&gt; działają jako narzędzia dla agentów AI.&lt;/p&gt;
&lt;p&gt;Zamiast halucynować Aspire API na podstawie przestarzałych danych treningowych, agent może wywołać &lt;code&gt;aspire docs search &amp;quot;postgres&amp;quot;&lt;/code&gt;, znaleźć oficjalne dokumenty integracji i przeczytać właściwą stronę.&lt;/p&gt;
&lt;h2 id="podsumowanie"&gt;Podsumowanie&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;aspire docs&lt;/code&gt; to mała funkcja, która czysto rozwiązuje prawdziwy problem. Zobacz &lt;a href="https://davidpine.dev/posts/aspire-docs-mcp-tools/"&gt;deep dive Davida Pine&amp;rsquo;a&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Microsoft Agent Framework osiąga wersję 1.0 — co naprawdę ważne dla programistów .NET</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/agent-framework-1-0-production-ready/</link><pubDate>Fri, 03 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/agent-framework-1-0-production-ready/</guid><description>Microsoft Agent Framework 1.0 jest gotowy do produkcji ze stabilnym API, orkiestracją wieloagentową i łącznikami dla każdego głównego dostawcy AI. Oto co musisz wiedzieć jako programista .NET.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ten post został automatycznie przetłumaczony. Aby przejść do oryginału, &lt;a href="https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/agent-framework-1-0-production-ready/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Jeśli śledzisz historię Agent Framework od wczesnych dni Semantic Kernel i AutoGen, ta wiadomość jest znacząca. Microsoft Agent Framework właśnie &lt;a href="https://devblogs.microsoft.com/agent-framework/microsoft-agent-framework-version-1-0/"&gt;osiągnął wersję 1.0&lt;/a&gt; — gotowy do produkcji, stabilne API, zobowiązanie do długoterminowego wsparcia. Jest dostępny zarówno dla .NET, jak i Python i naprawdę gotowy na prawdziwe obciążenia.&lt;/p&gt;
&lt;p&gt;Pominę hałas ogłoszenia i skupię się na tym, co ważne, jeśli budujesz aplikacje oparte na AI w .NET.&lt;/p&gt;
&lt;h2 id="krótka-wersja"&gt;Krótka wersja&lt;/h2&gt;
&lt;p&gt;Agent Framework 1.0 łączy to, co kiedyś było Semantic Kernel i AutoGen, w jeden otwarty SDK. Jedna abstrakcja agenta. Jeden silnik orkiestracji. Wielu dostawców AI. Jeśli skakałeś między Semantic Kernel dla wzorców enterprise i AutoGen dla przepływów pracy wieloagentowych klasy badawczej, możesz przestać. To jest teraz jeden SDK.&lt;/p&gt;
&lt;h2 id="pierwsze-kroki-są-niemal-wstydliwie-proste"&gt;Pierwsze kroki są niemal wstydliwie proste&lt;/h2&gt;
&lt;p&gt;Oto działający agent w .NET:&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="c1"&gt;// dotnet add package Microsoft.Agents.AI.OpenAI --prerelease&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.Agents.AI&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;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.Agents.AI.Foundry&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;using&lt;/span&gt; &lt;span class="nn"&gt;Azure.Identity&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="kt"&gt;var&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;AIProjectClient&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 class="s"&gt;&amp;#34;https://your-project.services.ai.azure.com&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 class="n"&gt;GetResponsesClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;gpt-5.3&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 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;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;HaikuBot&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;instructions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;You are an upbeat assistant that writes beautifully.&amp;#34;&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&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;Write a haiku about shipping 1.0.&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;To wszystko. Kilka linii i masz agenta AI działającego przeciwko Azure Foundry. Odpowiednik w Python jest równie zwięzły. Dodawaj narzędzia funkcji, rozmowy wieloturowe i streaming w miarę potrzeb — powierzchnia API skaluje się bez dziwactw.&lt;/p&gt;
&lt;h2 id="orkiestracja-wieloagentowa--to-jest-prawdziwa-sprawa"&gt;Orkiestracja wieloagentowa — to jest prawdziwa sprawa&lt;/h2&gt;
&lt;p&gt;Pojedynczy agent jest w porządku dla demonstracji, ale scenariusze produkcyjne zazwyczaj wymagają koordynacji. Agent Framework 1.0 dostarcza przetestowane w boju wzorce orkiestracji prosto z Microsoft Research i AutoGen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sekwencyjne&lt;/strong&gt; — agenty przetwarzają po kolei (autor → recenzent → redaktor)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Współbieżne&lt;/strong&gt; — rozgałęź do wielu agentów równolegle, zbierz wyniki&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Przekazywanie&lt;/strong&gt; — jeden agent deleguje do innego na podstawie intencji&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Czat grupowy&lt;/strong&gt; — wielu agentów dyskutuje i dochodzi do rozwiązania&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Magentic-One&lt;/strong&gt; — wzorzec wieloagentowy klasy badawczej z MSR&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wszystkie wspierają streaming, punkty kontrolne, zatwierdzenia przez człowieka w pętli oraz wstrzymanie/wznowienie. Część dotycząca punktów kontrolnych jest kluczowa — długo działające przepływy pracy przeżywają ponowne uruchomienie procesu. Dla nas, programistów .NET, którzy budowali trwałe przepływy pracy z Azure Functions, to brzmi znajomo.&lt;/p&gt;
&lt;h2 id="funkcje-które-mają-największe-znaczenie"&gt;Funkcje, które mają największe znaczenie&lt;/h2&gt;
&lt;p&gt;Oto moja lista tego, co warto znać:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Haki middleware.&lt;/strong&gt; Wiesz, jak ASP.NET Core ma potoki middleware? Ten sam koncept, ale dla wykonania agenta. Przechwytuj każdy etap — dodawaj bezpieczeństwo treści, logowanie, zasady zgodności — bez dotykania promptów agenta. To właśnie sprawia, że agenty są gotowe na środowisko enterprise.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Podłączalna pamięć.&lt;/strong&gt; Historia rozmów, trwały stan klucz-wartość, wyszukiwanie wektorowe. Wybierz backend: Foundry Agent Service, Mem0, Redis, Neo4j lub własny. Pamięć to właśnie to, co zmienia bezstanowe wywołanie LLM w agenta, który naprawdę zapamiętuje kontekst.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Deklaratywne agenty YAML.&lt;/strong&gt; Zdefiniuj instrukcje, narzędzia, pamięć i topologię orkiestracji agenta w wersjonowanych plikach YAML. Ładuj i uruchamiaj jednym wywołaniem API. To zmienia zasady gry dla zespołów, które chcą iterować zachowanie agentów bez ponownego wdrażania kodu.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Wsparcie A2A i MCP.&lt;/strong&gt; MCP (Model Context Protocol) pozwala agentom dynamicznie odkrywać i wywoływać zewnętrzne narzędzia. A2A (protokół Agent-to-Agent) umożliwia współpracę między różnymi środowiskami uruchomieniowymi — twoje agenty .NET mogą koordynować z agentami działającymi w innych frameworkach. Wsparcie A2A 1.0 pojawi się wkrótce.&lt;/p&gt;
&lt;h2 id="funkcje-podglądowe-warte-obserwowania"&gt;Funkcje podglądowe warte obserwowania&lt;/h2&gt;
&lt;p&gt;Niektóre funkcje zostały dostarczone jako podgląd w 1.0 — działające, ale API może się ewoluować:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DevUI&lt;/strong&gt; — lokalny debugger w przeglądarce do wizualizacji wykonania agenta, przepływów wiadomości i wywołań narzędzi w czasie rzeczywistym. Pomyśl Application Insights, ale dla rozumowania agenta.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub Copilot SDK i Claude Code SDK&lt;/strong&gt; — używaj Copilot lub Claude jako narzędzia agenta bezpośrednio z kodu orkiestracji. Skomponuj agenta zdolnego do kodowania obok innych agentów w tym samym przepływie pracy.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agent Harness&lt;/strong&gt; — konfigurowalne lokalne środowisko uruchomieniowe dające agentom dostęp do powłoki, systemu plików i pętli wiadomości. Pomyśl agenty kodujące i wzorce automatyzacji.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Skills&lt;/strong&gt; — pakiety wielokrotnego użytku z możliwościami domeny, które od razu dają agentom ustrukturyzowane umiejętności.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="migracja-z-semantic-kernel-lub-autogen"&gt;Migracja z Semantic Kernel lub AutoGen&lt;/h2&gt;
&lt;p&gt;Jeśli masz istniejący kod Semantic Kernel lub AutoGen, dostępne są dedykowane asystenty migracji, które analizują kod i generują plany migracji krok po kroku. &lt;a href="https://learn.microsoft.com/en-us/agent-framework/migration-guide/from-semantic-kernel"&gt;Przewodnik migracji z Semantic Kernel&lt;/a&gt; i &lt;a href="https://learn.microsoft.com/en-us/agent-framework/migration-guide/from-autogen"&gt;przewodnik migracji z AutoGen&lt;/a&gt; prowadzą przez wszystko.&lt;/p&gt;
&lt;p&gt;Jeśli korzystałeś z pakietów RC, uaktualnienie do 1.0 to tylko zmiana wersji.&lt;/p&gt;
&lt;h2 id="podsumowanie"&gt;Podsumowanie&lt;/h2&gt;
&lt;p&gt;Agent Framework 1.0 to kamień milowy produkcji, na który czekały zespoły enterprise. Stabilne API, wsparcie dla wielu dostawców, wzorce orkiestracji działające w skali i ścieżki migracji zarówno z Semantic Kernel, jak i AutoGen.&lt;/p&gt;
&lt;p&gt;Framework jest &lt;a href="https://github.com/microsoft/agent-framework"&gt;w pełni open source na GitHub&lt;/a&gt;, a możesz zacząć już dziś z &lt;code&gt;dotnet add package Microsoft.Agents.AI&lt;/code&gt;. Sprawdź &lt;a href="https://learn.microsoft.com/en-us/agent-framework/get-started/"&gt;przewodnik szybkiego startu&lt;/a&gt; i &lt;a href="https://github.com/microsoft/agent-framework"&gt;przykłady&lt;/a&gt;, by zabrać się do pracy.&lt;/p&gt;
&lt;p&gt;Jeśli czekałeś na sygnał &amp;ldquo;bezpieczne do użycia w produkcji&amp;rdquo; — to jest właśnie ten moment.&lt;/p&gt;</content:encoded></item><item><title>Aktualizacja Visual Studio z marca pozwala budować własne agenty Copilot — a narzędzie find_symbol to poważna sprawa</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/visual-studio-march-2026-custom-copilot-agents/</link><pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/visual-studio-march-2026-custom-copilot-agents/</guid><description>Aktualizacja Visual Studio z marca 2026 dostarcza własne agenty Copilot, wielokrotnego użytku umiejętności agentów, świadome języka narzędzie find_symbol i profilowanie wspomagane przez Copilot z Test Explorer. Oto co ważne.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ten post został automatycznie przetłumaczony. Aby przejść do oryginału, &lt;a href="https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/visual-studio-march-2026-custom-copilot-agents/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Visual Studio właśnie otrzymało swoją najważniejszą aktualizację Copilot do tej pory. Mark Downie &lt;a href="https://devblogs.microsoft.com/visualstudio/visual-studio-march-update-build-your-own-custom-agents/"&gt;ogłosił wydanie marcowe&lt;/a&gt;, a nagłówek to własne agenty — ale szczerze, narzędzie &lt;code&gt;find_symbol&lt;/code&gt; zakopane głębiej może być funkcją, która najbardziej zmieni twój przepływ pracy.&lt;/p&gt;
&lt;p&gt;Pozwól, że rozbiję to, co tu faktycznie jest.&lt;/p&gt;
&lt;h2 id="własne-agenty-copilot-w-twoim-repozytorium"&gt;Własne agenty Copilot w twoim repozytorium&lt;/h2&gt;
&lt;p&gt;Chcesz, by Copilot przestrzegał standardów kodowania twojego zespołu, uruchamiał twój potok kompilacji lub odpytywał wewnętrzną dokumentację? Teraz możesz zbudować dokładnie to.&lt;/p&gt;
&lt;p&gt;Własne agenty są definiowane jako pliki &lt;code&gt;.agent.md&lt;/code&gt;, które wrzucasz do &lt;code&gt;.github/agents/&lt;/code&gt; w swoim repozytorium. Każdy agent ma pełny dostęp do świadomości przestrzeni roboczej, zrozumienia kodu, narzędzi, preferowanego modelu i połączeń MCP z zewnętrznymi usługami. Pojawiają się w selektorze agentów obok wbudowanych.&lt;/p&gt;
&lt;p&gt;To ten sam wzorzec, który VS Code wspierał — i wspaniale zobaczyć, że Visual Studio nadrabia. Dla zespołów, które już zbudowały agenty dla VS Code, twoje pliki &lt;code&gt;.agent.md&lt;/code&gt; powinny działać w obu IDE (choć nazwy narzędzi mogą się różnić, więc testuj).&lt;/p&gt;
&lt;p&gt;Repozytorium &lt;a href="https://github.com/github/awesome-copilot"&gt;awesome-copilot&lt;/a&gt; ma konfiguracje agentów dostarczane przez społeczność, których możesz użyć jako punktów startowych.&lt;/p&gt;
&lt;h2 id="umiejętności-agentów-wielokrotnego-użytku-pakiety-instrukcji"&gt;Umiejętności agentów: wielokrotnego użytku pakiety instrukcji&lt;/h2&gt;
&lt;p&gt;Umiejętności są automatycznie wykrywane z &lt;code&gt;.github/skills/&lt;/code&gt; w twoim repozytorium lub &lt;code&gt;~/.copilot/skills/&lt;/code&gt; w twoim profilu. Każda umiejętność to plik &lt;code&gt;SKILL.md&lt;/code&gt; zgodny ze &lt;a href="https://agentskills.io/specification"&gt;specyfikacją Agent Skills&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Pomyśl o umiejętnościach jak o modułowej wiedzy specjalistycznej, którą możesz mieszać i dopasowywać. Możesz mieć umiejętność dla konwencji API, inną dla wzorców testowania i jeszcze inną dla przepływu wdrożenia. Gdy umiejętność jest aktywowana, pojawia się w czacie, abyś wiedział, że jest stosowana.&lt;/p&gt;
&lt;p&gt;Jeśli używasz umiejętności w VS Code, działają one tak samo w Visual Studio teraz.&lt;/p&gt;
&lt;h2 id="find_symbol-nawigacja-z-wiedzą-o-języku-dla-agentów"&gt;find_symbol: nawigacja z wiedzą o języku dla agentów&lt;/h2&gt;
&lt;p&gt;Tu robi się naprawdę interesująco. Nowe narzędzie &lt;code&gt;find_symbol&lt;/code&gt; daje trybowi agenta Copilot faktyczną nawigację po symbolach zasilaną przez usługi językowe. Zamiast przeszukiwać kod jak tekst, agent może:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Znaleźć wszystkie odwołania do symbolu w twoim projekcie&lt;/li&gt;
&lt;li&gt;Uzyskać informacje o typach, deklaracje i metadane zakresu&lt;/li&gt;
&lt;li&gt;Nawigować po miejscach wywołania z pełną świadomością językową&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Co to oznacza w praktyce: gdy pytasz Copilot o refaktoryzację metody lub aktualizację sygnatury parametru w miejscach wywołania, może faktycznie zobaczyć strukturę twojego kodu. Koniec z sytuacjami &amp;ldquo;agent zmienił metodę, ale pominął trzy miejsca wywołania&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Obsługiwane języki to C#, C++, Razor, TypeScript i wszystko z obsługiwanym rozszerzeniem LSP. Dla programistów .NET to ogromna poprawa — bazy kodu C# z głębokimi hierarchiami typów i interfejsami ogromnie korzystają z nawigacji świadomej symboli.&lt;/p&gt;
&lt;h2 id="profilowanie-testów-z-copilot"&gt;Profilowanie testów z Copilot&lt;/h2&gt;
&lt;p&gt;W menu kontekstowym Test Explorer jest teraz polecenie &lt;strong&gt;Profiluj z Copilot&lt;/strong&gt;. Wybierz test, kliknij profiluj, a Agent Profilowania automatycznie go uruchamia i analizuje wydajność — łącząc dane użycia CPU i instrumentacji, by dostarczyć praktycznych spostrzeżeń.&lt;/p&gt;
&lt;p&gt;Koniec z ręcznym konfigurowaniem sesji profilera, uruchamianiem testu, eksportowaniem wyników i próbą odczytania wykresu płomieni. Agent robi analizę i mówi ci, co jest wolne i dlaczego. Aktualnie tylko dla .NET, co ma sens, biorąc pod uwagę głęboką integrację diagnostyki .NET w Visual Studio.&lt;/p&gt;
&lt;h2 id="wskazówki-dotyczące-wydajności-podczas-debugowania-na-żywo"&gt;Wskazówki dotyczące wydajności podczas debugowania na żywo&lt;/h2&gt;
&lt;p&gt;Optymalizacja wydajności dzieje się teraz podczas debugowania, a nie po. Gdy przechodzisz przez kod, Visual Studio wyświetla czas wykonania i sygnały wydajności inline. Widzisz wolną linię? Kliknij Wskazówkę Wydajności i poproś Copilot o sugestie optymalizacji zaraz tam.&lt;/p&gt;
&lt;p&gt;Agent Profilowania automatycznie przechwytuje dane czasu działania — czas, użycie CPU, zachowanie pamięci — a Copilot używa ich do wskazania gorących miejsc. Dzięki temu praca z wydajnością jest częścią twojego przepływu debugowania, a nie osobnym zadaniem, które ciągle odkładasz.&lt;/p&gt;
&lt;h2 id="naprawianie-luk-bezpieczeństwa-nuget-z-eksploratora-rozwiązań"&gt;Naprawianie luk bezpieczeństwa NuGet z Eksploratora rozwiązań&lt;/h2&gt;
&lt;p&gt;Gdy zostanie wykryta luka w pakiecie NuGet, zobaczysz teraz powiadomienie z linkiem &lt;strong&gt;Napraw z GitHub Copilot&lt;/strong&gt; bezpośrednio w Eksploratorze rozwiązań. Kliknij i Copilot analizuje lukę, rekomenduje odpowiednie aktualizacje pakietów i je implementuje.&lt;/p&gt;
&lt;p&gt;Dla zespołów, które mają problem z utrzymywaniem aktualnych zależności (a to właściwie wszyscy), usuwa to tarcie &amp;ldquo;wiem, że jest luka, ale wypracowanie właściwej ścieżki aktualizacji to projekt sam w sobie.&amp;rdquo;&lt;/p&gt;
&lt;h2 id="podsumowanie"&gt;Podsumowanie&lt;/h2&gt;
&lt;p&gt;Własne agenty i umiejętności to nagłówek, ale &lt;code&gt;find_symbol&lt;/code&gt; to ukryty hit — fundamentalnie zmienia dokładność Copilot przy refaktoryzacji kodu .NET. W połączeniu z integracją profilowania na żywo i naprawianiem luk bezpieczeństwa, ta aktualizacja sprawia, że funkcje AI Visual Studio wydają się naprawdę praktyczne, a nie tylko gotowe do demonstracji.&lt;/p&gt;
&lt;p&gt;Pobierz &lt;a href="https://visualstudio.microsoft.com/downloads/"&gt;Visual Studio 2026 Insiders&lt;/a&gt;, by wypróbować wszystko.&lt;/p&gt;</content:encoded></item><item><title>azd Pozwala Teraz Uruchamiać i Debugować Agenty AI Lokalnie — Co Zmieniło Się w Marcu 2026</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/azd-march-2026-local-ai-agent-debugging/</link><pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/azd-march-2026-local-ai-agent-debugging/</guid><description>Azure Developer CLI wypuścił siedem wydań w marcu 2026. Najważniejsze: lokalna pętla uruchamiania i debugowania dla agentów AI, integracja GitHub Copilot w konfiguracji projektu i obsługa Container App Jobs.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ten post został automatycznie przetłumaczony. Aby przejść do oryginału, &lt;a href="https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/azd-march-2026-local-ai-agent-debugging/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Siedem wydań w jednym miesiącu. To co zespół Azure Developer CLI (&lt;code&gt;azd&lt;/code&gt;) wypchnął w marcu 2026, a główna funkcja to ta, na którą czekałem: &lt;strong&gt;lokalna pętla uruchamiania i debugowania dla agentów AI&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="uruchamiaj-i-debuguj-agenty-ai-bez-wdrażania"&gt;Uruchamiaj i debuguj agenty AI bez wdrażania&lt;/h2&gt;
&lt;p&gt;To jest ta duża. Nowe rozszerzenie &lt;code&gt;azure.ai.agents&lt;/code&gt; dodaje zestaw poleceń:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;azd ai agent run&lt;/code&gt; — uruchamia agenta lokalnie&lt;/li&gt;
&lt;li&gt;&lt;code&gt;azd ai agent invoke&lt;/code&gt; — wysyła do niego wiadomości (lokalnie lub wdrożone)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;azd ai agent show&lt;/code&gt; — wyświetla status kontenera i zdrowie&lt;/li&gt;
&lt;li&gt;&lt;code&gt;azd ai agent monitor&lt;/code&gt; — strumieniuje logi kontenera w czasie rzeczywistym&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wcześniej testowanie agenta AI oznaczało wdrożenie do Microsoft Foundry za każdym razem. Teraz możesz iterować lokalnie.&lt;/p&gt;
&lt;h2 id="github-copilot-szkieletuje-twój-projekt-azd"&gt;GitHub Copilot szkieletuje Twój projekt azd&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;azd init&lt;/code&gt; oferuje teraz opcję &amp;ldquo;Set up with GitHub Copilot (Preview)&amp;rdquo;. Agent Copilot tworzy szkielet konfiguracji dla Twojej struktury projektu.&lt;/p&gt;
&lt;h2 id="container-app-jobs-i-ulepszenia-wdrażania"&gt;Container App Jobs i ulepszenia wdrażania&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Container App Jobs&lt;/strong&gt;: &lt;code&gt;azd&lt;/code&gt; teraz wdraża &lt;code&gt;Microsoft.App/jobs&lt;/code&gt; przez istniejącą konfigurację &lt;code&gt;host: containerapp&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Konfigurowalne limity czasu wdrażania&lt;/strong&gt;: Nowa flaga &lt;code&gt;--timeout&lt;/code&gt; na &lt;code&gt;azd deploy&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Automatyczny fallback do lokalnego buildu&lt;/strong&gt;: Gdy zdalny build ACR zawiedzie&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lokalna walidacja preflightowa&lt;/strong&gt;: Parametry Bicep są walidowane lokalnie przed wdrożeniem&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="podsumowanie"&gt;Podsumowanie&lt;/h2&gt;
&lt;p&gt;Lokalna pętla debugowania agentów AI to gwiazda tego wydania. Sprawdź &lt;a href="https://devblogs.microsoft.com/azure-sdk/azure-developer-cli-azd-march-2026/"&gt;pełne notatki wydania&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Azure DevOps W Końcu Naprawia UX Edytora Markdown, na Który Wszyscy Narzekali</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/azure-devops-markdown-editor-work-items/</link><pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/azure-devops-markdown-editor-work-items/</guid><description>Edytor Markdown Azure DevOps dla elementów roboczych zyskuje wyraźniejsze rozróżnienie między trybem podglądu a trybem edycji. To mała zmiana, która naprawia naprawdę irytujący problem w przepływie pracy.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ten post został automatycznie przetłumaczony. Aby przejść do oryginału, &lt;a href="https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/azure-devops-markdown-editor-work-items/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Jeśli używasz Azure Boards, pewnie już to przeżyłeś: czytasz opis elementu roboczego, może przeglądasz kryteria akceptacji, i przypadkowo klikasz dwa razy. Bum — jesteś w trybie edycji. Nie chciałeś niczego edytować. Po prostu czytałeś.&lt;/p&gt;
&lt;p&gt;Dan Hellem &lt;a href="https://devblogs.microsoft.com/devops/improving-the-markdown-editor-for-work-items/"&gt;ogłosił poprawkę&lt;/a&gt;, i to jedna z tych zmian, która brzmi banalnie, ale faktycznie usuwa prawdziwe tarcie z codziennego przepływu pracy.&lt;/p&gt;
&lt;h2 id="co-się-zmieniło"&gt;Co się zmieniło&lt;/h2&gt;
&lt;p&gt;Edytor Markdown dla pól tekstowych elementów roboczych otwiera się teraz domyślnie w &lt;strong&gt;trybie podglądu&lt;/strong&gt;. Możesz czytać i wchodzić w interakcje z treścią — śledzić linki, przeglądać formatowanie — bez obaw o przypadkowe wejście w tryb edycji.&lt;/p&gt;
&lt;p&gt;Kiedy faktycznie chcesz edytować, klikasz ikonę edycji na górze pola. Kiedy skończyłeś, explicite wychodzisz z powrotem do trybu podglądu.&lt;/p&gt;
&lt;h2 id="dlaczego-to-ważne-bardziej-niż-brzmi"&gt;Dlaczego to ważne bardziej niż brzmi&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://developercommunity.visualstudio.com/t/Markdown-editor-for-work-item-multi-line/10935496"&gt;Wątek opinii społeczności&lt;/a&gt; na ten temat był długi. Zachowanie podwójnego kliknięcia-do-edycji zostało wprowadzone z edytorem Markdown w lipcu 2025, a skargi zaczęły się niemal natychmiast.&lt;/p&gt;
&lt;p&gt;Nowe domyślne zachowanie respektuje najbardziej powszechny wzorzec interakcji: czytasz elementy robocze znacznie częściej niż je edytujesz.&lt;/p&gt;
&lt;h2 id="status-wdrożenia"&gt;Status wdrożenia&lt;/h2&gt;
&lt;p&gt;To jest już wdrażane dla podzbioru klientów i rozszerzy się na wszystkich w ciągu najbliższych dwóch do trzech tygodni.&lt;/p&gt;</content:encoded></item><item><title>Bookmark Studio Wprowadza Nawigację Opartą na Slotach i Udostępnianie do Zakładek Visual Studio</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/bookmark-studio-visual-studio-extension/</link><pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/bookmark-studio-visual-studio-extension/</guid><description>Nowe rozszerzenie Bookmark Studio Madsa Kristensena dodaje do zakładek Visual Studio nawigację po slotach za pomocą klawiatury, menedżer zakładek, kolory, etykiety i możliwości eksportu/udostępniania.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ten post został automatycznie przetłumaczony. Aby przejść do oryginału, &lt;a href="https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/bookmark-studio-visual-studio-extension/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Zakładki w Visual Studio zawsze były&amp;hellip; w porządku. Ustawiasz jedną, przechodzisz do następnej, zapominasz która jest która.&lt;/p&gt;
&lt;p&gt;Mads Kristensen właśnie &lt;a href="https://devblogs.microsoft.com/visualstudio/bookmark-studio-evolving-bookmarks-in-visual-studio/"&gt;wydał Bookmark Studio&lt;/a&gt;, eksperymentalne rozszerzenie wypełniające luki, na które pewnie natknąłeś się regularnie używając zakładek.&lt;/p&gt;
&lt;h2 id="nawigacja-oparta-na-slotach"&gt;Nawigacja oparta na slotach&lt;/h2&gt;
&lt;p&gt;Główna nowość: zakładki można teraz przypisywać do slotów 1–9 i bezpośrednio do nich skakać za pomocą &lt;code&gt;Alt+Shift+1&lt;/code&gt; do &lt;code&gt;Alt+Shift+9&lt;/code&gt;. To zmienia zakładki z &amp;ldquo;mam gdzieś jakieś zakładki&amp;rdquo; na &amp;ldquo;Slot 3 to mój kontroler API, Slot 5 to warstwa serwisów, Slot 7 to testy.&amp;rdquo;&lt;/p&gt;
&lt;h2 id="menedżer-zakładek"&gt;Menedżer zakładek&lt;/h2&gt;
&lt;p&gt;Nowe okno narzędziowe pokazuje wszystkie zakładki w jednym miejscu z filtrowaniem po nazwie, pliku, lokalizacji, kolorze lub slocie.&lt;/p&gt;
&lt;h2 id="organizacja-z-etykietami-kolorami-i-folderami"&gt;Organizacja z etykietami, kolorami i folderami&lt;/h2&gt;
&lt;p&gt;Zakładki mogą opcjonalnie mieć etykiety i kolory oraz być grupowane w foldery. Wszystkie metadane są przechowywane per solucja.&lt;/p&gt;
&lt;h2 id="eksport-i-udostępnianie"&gt;Eksport i udostępnianie&lt;/h2&gt;
&lt;p&gt;Bookmark Studio pozwala eksportować zakładki jako zwykły tekst, Markdown lub CSV:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dołączanie ścieżek zakładek do opisów pull requestów&lt;/li&gt;
&lt;li&gt;Udostępnianie śladów dochodzenia współpracownikom&lt;/li&gt;
&lt;li&gt;Przenoszenie zestawów zakładek między repozytoriami&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pobierz ze &lt;a href="https://marketplace.visualstudio.com/items?itemName=MadsKristensen.BookmarkStudio"&gt;sklepu Visual Studio Marketplace&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Dashboard Aspire 13.2 Właśnie Dostał Telemetry API — i To Zmienia Wszystko</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/aspire-132-dashboard-export-telemetry/</link><pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/aspire-132-dashboard-export-telemetry/</guid><description>.NET Aspire 13.2 dostarcza mądrzejszy eksport telemetrii, programowalny API dla śladów i logów oraz ulepszenia wizualizacji GenAI. Oto dlaczego ma to znaczenie dla twojego przepływu debugowania.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ten post został automatycznie przetłumaczony. Aby przejść do oryginału, &lt;a href="https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/aspire-132-dashboard-export-telemetry/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Jeśli budujesz rozproszone aplikacje z .NET Aspire, wiesz już, że dashboard jest najlepszą częścią całego doświadczenia. Aspire 13.2 znacznie go poprawił.&lt;/p&gt;
&lt;h2 id="eksportowanie-telemetrii-jak-normalna-osoba"&gt;Eksportowanie telemetrii jak normalna osoba&lt;/h2&gt;
&lt;p&gt;Aspire 13.2 dodaje odpowiedni dialog &lt;strong&gt;Zarządzaj logami i telemetrią&lt;/strong&gt;, gdzie możesz:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Wyczyścić całą telemetrię&lt;/li&gt;
&lt;li&gt;Wyeksportować wybraną telemetrię do pliku ZIP w standardowym formacie OTLP/JSON&lt;/li&gt;
&lt;li&gt;Zaimportować ten ZIP do dowolnego dashboardu Aspire później&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ta ostatnia część to kluczowa funkcja. Reprodukujesz błąd, eksportujesz telemetrię, dołączasz do elementu pracy, a twój kolega może zaimportować go do własnego dashboardu.&lt;/p&gt;
&lt;h2 id="telemetry-api-to-prawdziwy-przełom"&gt;Telemetry API to prawdziwy przełom&lt;/h2&gt;
&lt;p&gt;Dashboard udostępnia teraz HTTP API pod &lt;code&gt;/api/telemetry&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GET /api/telemetry/resources&lt;/code&gt; — lista zasobów z telemetrią&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /api/telemetry/spans&lt;/code&gt; — zapytania o spany z filtrami&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /api/telemetry/logs&lt;/code&gt; — zapytania o logi z filtrami&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /api/telemetry/traces&lt;/code&gt; — lista śladów&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To zasila nowe polecenia CLI &lt;code&gt;aspire agent mcp&lt;/code&gt; i &lt;code&gt;aspire otel&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="telemetria-genai-staje-się-praktyczna"&gt;Telemetria GenAI staje się praktyczna&lt;/h2&gt;
&lt;p&gt;VS Code Copilot chat i Copilot CLI obsługują konfigurowanie &lt;code&gt;OTEL_EXPORTER_OTLP_ENDPOINT&lt;/code&gt; — wskaż je na dashboard Aspire i możesz obserwować, jak twoje agenty AI myślą w czasie rzeczywistym.&lt;/p&gt;
&lt;h2 id="podsumowanie"&gt;Podsumowanie&lt;/h2&gt;
&lt;p&gt;Aspire 13.2 zamienia dashboard z &amp;ldquo;ładnego UI do debugowania&amp;rdquo; w &amp;ldquo;programowalną platformę obserwowalności&amp;rdquo;. Sprawdź &lt;a href="https://aspire.dev"&gt;aspire.dev&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>KubeCon Europe 2026: Na Czym Powinni Naprawdę Zależeć Deweloperom .NET</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/kubecon-2026-aks-updates-dotnet-developers/</link><pubDate>Sun, 29 Mar 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/kubecon-2026-aks-updates-dotnet-developers/</guid><description>Microsoft zrzucił ścianę ogłoszeń Kubernetes na KubeCon Europe 2026. Oto przefiltrowana wersja — tylko aktualizacje AKS i cloud-native, które mają znaczenie.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ten post został automatycznie przetłumaczony. Aby przejść do oryginału, &lt;a href="https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/kubecon-2026-aks-updates-dotnet-developers/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Znasz to uczucie, gdy spada ogromny post z ogłoszeniami i przewijasz go myśląc &amp;ldquo;fajne, ale co to dla mnie znaczy&amp;rdquo;?&lt;/p&gt;
&lt;p&gt;Microsoft właśnie opublikował &lt;a href="https://opensource.microsoft.com/blog/2026/03/24/whats-new-with-microsoft-in-open-source-and-kubernetes-at-kubecon-cloudnativecon-europe-2026/"&gt;swoje pełne podsumowanie KubeCon Europe 2026&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="mtls-bez-podatku-service-mesh"&gt;mTLS bez podatku service mesh&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://aka.ms/aks/application-network"&gt;Azure Kubernetes Application Network&lt;/a&gt; daje ci wzajemne TLS, autoryzację świadomą aplikacji i telemetrię ruchu — bez wdrażania pełnej siatki z sidecarami. Twoje API ASP.NET Core rozmawiające z robotnikami w tle — wszystko zaszyfrowane na poziomie sieci, bez żadnych zmian kodu aplikacji.&lt;/p&gt;
&lt;h2 id="obserwowalność-gpu"&gt;Obserwowalność GPU&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://aka.ms/aks/managed-gpu-metrics"&gt;AKS teraz ujawnia metryki GPU natywnie&lt;/a&gt; do zarządzanego Prometheus i Grafana. Bez niestandardowych eksporterów.&lt;/p&gt;
&lt;h2 id="wieloklasterowa-sieć"&gt;Wieloklasterowa sieć&lt;/h2&gt;
&lt;p&gt;Azure Kubernetes Fleet Manager dostarcza teraz &lt;a href="https://aka.ms/kubernetes-fleet/networking/cross-cluster"&gt;sieciowanie między klastrami&lt;/a&gt; przez zarządzaną siatkę Cilium — unified connectivity, globalny rejestr usług.&lt;/p&gt;
&lt;h2 id="bezpieczniejsze-ulepszenia"&gt;Bezpieczniejsze ulepszenia&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Ulepszenia niebiesko-zielone&lt;/strong&gt; tworzą równoległy pool węzłów. &lt;strong&gt;Wycofanie puli agentów&lt;/strong&gt; pozwala ci cofnąć się do poprzedniej wersji.&lt;/p&gt;
&lt;h2 id="gdzie-zacząć"&gt;Gdzie zacząć&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Obserwowalność najpierw&lt;/strong&gt; — włącz metryki GPU i logi przepływu sieci&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Wypróbuj ulepszenia niebiesko-zielone&lt;/strong&gt; — przetestuj przepływ pracy wycofywania&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pilot sieci świadomej tożsamości&lt;/strong&gt; — włącz mTLS dla jednej ścieżki usługi&lt;/li&gt;
&lt;/ol&gt;</content:encoded></item><item><title>SQL MCP Server, Copilot w SSMS i centrum baz danych z agentami AI: co naprawdę ważne z SQLCon 2026</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/agentic-ai-microsoft-databases-what-matters/</link><pubDate>Sat, 28 Mar 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/agentic-ai-microsoft-databases-what-matters/</guid><description>Microsoft zaprezentował stos ogłoszeń dotyczących baz danych na SQLCon 2026. Oto rzeczy, które naprawdę mają znaczenie, jeśli budujesz aplikacje oparte na AI na Azure SQL.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ten post został automatycznie przetłumaczony. Aby przejść do oryginału, &lt;a href="https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/agentic-ai-microsoft-databases-what-matters/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Microsoft właśnie zainaugurował &lt;a href="https://www.microsoft.com/en-us/sql-server/blog/2026/03/18/advancing-agentic-ai-with-microsoft-databases-across-a-unified-data-estate/"&gt;SQLCon 2026 razem z FabCon w Atlancie&lt;/a&gt; i jest wiele do omówienia. Oryginalne ogłoszenie obejmuje wszystko od planów oszczędnościowych po funkcje zgodności dla przedsiębiorstw. Pominę slajdy z cenami dla enterprise i skupię się na kawałkach, które mają znaczenie, jeśli jesteś programistą budującym na Azure SQL i AI.&lt;/p&gt;
&lt;h2 id="sql-mcp-server-jest-w-publicznym-podglądzie"&gt;SQL MCP Server jest w publicznym podglądzie&lt;/h2&gt;
&lt;p&gt;To jest dla mnie nagłówek. Azure SQL Database Hyperscale ma teraz &lt;strong&gt;SQL MCP Server&lt;/strong&gt; w publicznym podglądzie, który pozwala bezpiecznie połączyć dane SQL z agentami AI i Copilotami za pomocą &lt;a href="https://modelcontextprotocol.io/"&gt;Model Context Protocol&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Jeśli śledziłeś falę MCP — a szczerze, trudno ją przeoczyć — to jest poważna sprawa. Zamiast budować niestandardowe potoki danych, by dostarczać kontekst z bazy danych do agentów AI, masz standardowy protokół do bezpośredniego eksponowania danych SQL. Twoje agenty mogą odpytywać, analizować i działać na żywych danych bazy danych.&lt;/p&gt;
&lt;p&gt;Dla tych z nas budujących agenty AI z Semantic Kernel lub Microsoft Agent Framework, otwiera to czystą ścieżkę integracji. Agent musi sprawdzić stan magazynu? Wyszukać rekord klienta? Zweryfikować zamówienie? MCP daje mu ustrukturyzowany sposób na zrobienie tego bez pisania niestandardowego kodu pobierania danych dla każdego scenariusza.&lt;/p&gt;
&lt;h2 id="github-copilot-w-ssms-22-jest-teraz-ogólnie-dostępny"&gt;GitHub Copilot w SSMS 22 jest teraz ogólnie dostępny&lt;/h2&gt;
&lt;p&gt;Jeśli spędzasz czas w SQL Server Management Studio — a bądźmy szczerzy, większość z nas nadal to robi — GitHub Copilot jest teraz ogólnie dostępny w SSMS 22. To samo doświadczenie Copilot, którego już używasz w VS Code i Visual Studio, ale dla T-SQL.&lt;/p&gt;
&lt;p&gt;Praktyczna wartość jest prosta: pomoc oparta na czacie do pisania zapytań, refaktoryzacji procedur składowanych, rozwiązywania problemów z wydajnością i obsługi zadań administracyjnych. Nic rewolucyjnego w koncepcji, ale mając to bezpośrednio w SSMS, nie musisz przełączać kontekstu do innego edytora tylko po to, by uzyskać pomoc AI przy pracy z bazą danych.&lt;/p&gt;
&lt;h2 id="indeksy-wektorowe-otrzymały-poważną-aktualizację"&gt;Indeksy wektorowe otrzymały poważną aktualizację&lt;/h2&gt;
&lt;p&gt;Azure SQL Database ma teraz szybsze i bardziej wydajne indeksy wektorowe z pełnym wsparciem wstawiania, aktualizacji i usuwania. To oznacza, że dane wektorowe pozostają aktualne w czasie rzeczywistym — bez wsadowego ponownego indeksowania.&lt;/p&gt;
&lt;p&gt;Co nowego:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Kwantyzacja&lt;/strong&gt; dla mniejszych rozmiarów indeksów bez zbytniej utraty dokładności&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Filtrowanie iteracyjne&lt;/strong&gt; dla precyzyjniejszych wyników&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ściślejsza integracja z optymalizatorem zapytań&lt;/strong&gt; dla przewidywalnej wydajności&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Jeśli robisz generowanie wspomagane pobieraniem (RAG) z Azure SQL jako magazynem wektorów, te ulepszenia są bezpośrednio przydatne. Możesz trzymać wektory obok danych relacyjnych w tej samej bazie danych, co znacznie upraszcza architekturę w porównaniu do osobnej bazy wektorowej.&lt;/p&gt;
&lt;p&gt;Te same ulepszenia wektorów są również dostępne w SQL database w Fabric, ponieważ oba działają na tym samym silniku SQL.&lt;/p&gt;
&lt;h2 id="database-hub-w-fabric-zarządzanie-agentyczne"&gt;Database Hub w Fabric: zarządzanie agentyczne&lt;/h2&gt;
&lt;p&gt;Ten jest bardziej perspektywiczny, ale interesujący. Microsoft ogłosił &lt;strong&gt;Database Hub w Microsoft Fabric&lt;/strong&gt; (wczesny dostęp), który daje jeden widok na Azure SQL, Cosmos DB, PostgreSQL, MySQL i SQL Server przez Arc.&lt;/p&gt;
&lt;p&gt;Interesujący kąt nie polega tylko na ujednoliconym widoku — to agentyczne podejście do zarządzania. Agenty AI ciągłe monitorują twoją infrastrukturę baz danych, wyświetlają zmiany, wyjaśniają dlaczego mają znaczenie i sugerują co zrobić dalej. To model z człowiekiem w pętli, gdzie agent wykonuje ciężką pracę, a ty podejmujesz decyzje.&lt;/p&gt;
&lt;p&gt;Dla zespołów zarządzających więcej niż garścią baz danych, może to naprawdę zmniejszyć operacyjny szum. Zamiast skakać między portalami i ręcznie sprawdzać metryki, agent przynosi sygnał do ciebie.&lt;/p&gt;
&lt;h2 id="co-to-oznacza-dla-programistów-net"&gt;Co to oznacza dla programistów .NET&lt;/h2&gt;
&lt;p&gt;Wątek łączący wszystkie te ogłoszenia jest jasny: Microsoft wbudowuje agenty AI w każdą warstwę stosu baz danych. Nie jako gadżet, ale jako praktyczną warstwę narzędziową.&lt;/p&gt;
&lt;p&gt;Jeśli budujesz aplikacje .NET wspierane przez Azure SQL, oto co bym faktycznie zrobił:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Wypróbuj SQL MCP Server&lt;/strong&gt; jeśli budujesz agenty AI. To najczystszy sposób, by dać agentom dostęp do bazy danych bez niestandardowej hydrauliki.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Włącz Copilot w SSMS&lt;/strong&gt; jeśli jeszcze tego nie zrobiłeś — bezpłatne zwiększenie produktywności przy codziennej pracy z SQL.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Przyjrzyj się indeksom wektorowym&lt;/strong&gt; jeśli robisz RAG i obecnie używasz osobnego magazynu wektorów. Konsolidacja do Azure SQL oznacza jedną usługę mniej do zarządzania.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="podsumowanie"&gt;Podsumowanie&lt;/h2&gt;
&lt;p&gt;Pełne ogłoszenie ma więcej — plany oszczędnościowe, asystentów migracji, funkcje zgodności — ale historia dla programistów jest w MCP Server, ulepszeniach wektorowych i agentycznej warstwie zarządzania. To są kawałki, które zmieniają sposób budowania, a nie tylko budżetowania.&lt;/p&gt;
&lt;p&gt;Sprawdź &lt;a href="https://www.microsoft.com/en-us/sql-server/blog/2026/03/18/advancing-agentic-ai-with-microsoft-databases-across-a-unified-data-estate/"&gt;pełne ogłoszenie od Shireesha Thoty&lt;/a&gt; po pełny obraz i &lt;a href="https://aka.ms/database-hub"&gt;zarejestruj się na wczesny dostęp do Database Hub&lt;/a&gt; jeśli chcesz wypróbować nowe doświadczenie zarządzania.&lt;/p&gt;</content:encoded></item><item><title>Azure DevOps MCP Server Trafia do Microsoft Foundry: Co To Oznacza dla Twoich Agentów AI</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/azure-devops-mcp-server-microsoft-foundry/</link><pubDate>Thu, 26 Mar 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/azure-devops-mcp-server-microsoft-foundry/</guid><description>Azure DevOps MCP Server jest teraz dostępny w Microsoft Foundry. Połącz swoje agenty AI bezpośrednio z przepływami pracy DevOps — elementy robocze, repozytoria, potoki — za pomocą kilku kliknięć.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ten post został automatycznie przetłumaczony. Aby przejść do oryginału, &lt;a href="https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/azure-devops-mcp-server-microsoft-foundry/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;MCP (Model Context Protocol) ma swój moment. Jeśli śledzisz ekosystem agentów AI, pewnie zauważyłeś, że serwery MCP pojawiają się wszędzie — dając agentom możliwość interakcji z zewnętrznymi narzędziami i usługami przez standaryzowany protokół.&lt;/p&gt;
&lt;p&gt;Teraz &lt;a href="https://devblogs.microsoft.com/devops/remote-mcp-server-preview-in-microsoft-foundry/"&gt;Azure DevOps MCP Server jest dostępny w Microsoft Foundry&lt;/a&gt;, i jest to jedna z tych integracji, która skłania do myślenia o praktycznych możliwościach.&lt;/p&gt;
&lt;h2 id="co-się-faktycznie-dzieje"&gt;Co się faktycznie dzieje&lt;/h2&gt;
&lt;p&gt;Microsoft już wydał Azure DevOps MCP Server jako &lt;a href="https://devblogs.microsoft.com/devops/azure-devops-remote-mcp-server-public-preview"&gt;publiczny podgląd&lt;/a&gt;. Co nowego, to integracja z Foundry. Możesz teraz dodawać Azure DevOps MCP Server do swoich agentów Foundry bezpośrednio z katalogu narzędzi.&lt;/p&gt;
&lt;h2 id="konfiguracja"&gt;Konfiguracja&lt;/h2&gt;
&lt;p&gt;Konfiguracja jest zaskakująco prosta:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;W swoim agencie Foundry przejdź do &lt;strong&gt;Dodaj narzędzia&lt;/strong&gt; &amp;gt; &lt;strong&gt;Katalog&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Wyszukaj &amp;ldquo;Azure DevOps&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Wybierz Azure DevOps MCP Server (podgląd) i kliknij &lt;strong&gt;Utwórz&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Podaj nazwę swojej organizacji i połącz&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="kontrolowanie-dostępu-agenta"&gt;Kontrolowanie dostępu agenta&lt;/h2&gt;
&lt;p&gt;Możesz określić, które narzędzia są dostępne dla Twojego agenta. Jeśli chcesz, żeby tylko czytał elementy robocze, ale nie dotykał potoków, możesz to skonfigurować. Zasada najmniejszego przywileju, zastosowana do agentów AI.&lt;/p&gt;
&lt;h2 id="dlaczego-to-interesujące-dla-zespołów-net"&gt;Dlaczego to interesujące dla zespołów .NET&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Asystenci planowania sprintów&lt;/strong&gt; — agenty, które mogą pobierać elementy robocze i sugerować pojemność sprintu&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Boty code review&lt;/strong&gt; — agenty rozumiejące kontekst PR&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reagowanie na incydenty&lt;/strong&gt; — agenty tworzące elementy robocze i korelujące błędy&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Wdrażanie deweloperów&lt;/strong&gt; — &amp;ldquo;Co powinienem teraz zrobić?&amp;rdquo; z realną odpowiedzią&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="podsumowanie"&gt;Podsumowanie&lt;/h2&gt;
&lt;p&gt;Sprawdź &lt;a href="https://devblogs.microsoft.com/devops/remote-mcp-server-preview-in-microsoft-foundry/"&gt;pełne ogłoszenie&lt;/a&gt; po szczegóły.&lt;/p&gt;</content:encoded></item><item><title>Foundry Agent Service jest GA: Co Naprawdę Ważne dla Budowniczych Agentów .NET</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/foundry-agent-service-ga-what-matters/</link><pubDate>Thu, 26 Mar 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/foundry-agent-service-ga-what-matters/</guid><description>Usługa Foundry Agent firmy Microsoft właśnie osiągnęła GA z prywatną siecią, Voice Live, ocenami produkcyjnymi i otwartym środowiskiem uruchomieniowym wielu modeli.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ten post został automatycznie przetłumaczony. Aby przejść do oryginału, &lt;a href="https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/foundry-agent-service-ga-what-matters/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Bądźmy szczerzy — budowanie prototypu agenta AI to łatwa część. Trudna część to wszystko potem.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://devblogs.microsoft.com/foundry/foundry-agent-service-ga/"&gt;Foundry Agent Service właśnie osiągnął GA&lt;/a&gt;, a to wydanie jest skupione na tej luce &amp;ldquo;wszystko potem&amp;rdquo;.&lt;/p&gt;
&lt;h2 id="zbudowany-na-responses-api"&gt;Zbudowany na Responses API&lt;/h2&gt;
&lt;p&gt;Nowej generacji Foundry Agent Service jest zbudowany na OpenAI Responses API. Architektura jest celowo otwarta — nie jesteś przywiązany do jednego dostawcy modeli.&lt;/p&gt;
&lt;h2 id="prywatna-sieć-blokada-enterprise-usunięta"&gt;Prywatna sieć: blokada enterprise usunięta&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Brak publicznego wyjścia&lt;/strong&gt; — ruch agenta nigdy nie dotyka publicznego internetu&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Iniekcja kontenera/podsieci&lt;/strong&gt; do Twojej sieci&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Łączność narzędzi&lt;/strong&gt; — serwery MCP, Azure AI Search działają przez prywatne ścieżki&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="uwierzytelnianie-mcp"&gt;Uwierzytelnianie MCP&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metoda auth&lt;/th&gt;
&lt;th&gt;Kiedy używać&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Key-based&lt;/td&gt;
&lt;td&gt;Prosty wspólny dostęp&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entra Agent Identity&lt;/td&gt;
&lt;td&gt;Service-to-service&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entra Managed Identity&lt;/td&gt;
&lt;td&gt;Izolacja per-projekt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OAuth Identity Passthrough&lt;/td&gt;
&lt;td&gt;Delegowany dostęp użytkownika&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="voice-live"&gt;Voice Live&lt;/h2&gt;
&lt;p&gt;Voice Live składa STT, LLM i TTS w jedno zarządzane API.&lt;/p&gt;
&lt;h2 id="oceny"&gt;Oceny&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Wbudowane ewaluatory&lt;/strong&gt; — spójność, trafność, uziemienie&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Niestandardowe ewaluatory&lt;/strong&gt; — Twoja własna logika biznesowa&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ciągła ocena&lt;/strong&gt; — próbkowanie żywego ruchu produkcyjnego&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Sprawdź &lt;a href="https://learn.microsoft.com/azure/foundry/quickstarts/get-started-code"&gt;przewodnik quickstart&lt;/a&gt; i &lt;a href="https://devblogs.microsoft.com/foundry/foundry-agent-service-ga/"&gt;ogłoszenie GA&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Od Laptopa do Produkcji: Wdrażanie Agentów AI do Microsoft Foundry Dwoma Poleceniami</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/deploy-ai-agents-foundry-azd-two-commands/</link><pubDate>Thu, 26 Mar 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/deploy-ai-agents-foundry-azd-two-commands/</guid><description>Azure Developer CLI ma teraz polecenia 'azd ai agent', które przenoszą Twojego agenta AI z lokalnego dev do żywego endpoint Foundry w minuty.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ten post został automatycznie przetłumaczony. Aby przejść do oryginału, &lt;a href="https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/deploy-ai-agents-foundry-azd-two-commands/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Znasz tę lukę między &amp;ldquo;działa na mojej maszynie&amp;rdquo; a &amp;ldquo;jest wdrożone i obsługuje ruch&amp;rdquo;? Dla agentów AI ta luka była boleśnie szeroka.&lt;/p&gt;
&lt;p&gt;Azure Developer CLI właśnie uczyniło to &lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-ai-agent-end-to-end/"&gt;sprawą dwóch poleceń&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="nowy-workflow-azd-ai-agent"&gt;Nowy workflow &lt;code&gt;azd ai agent&lt;/code&gt;&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;azd ai agent init
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;azd up
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To wszystko. &lt;code&gt;azd ai agent init&lt;/code&gt; tworzy scaffolding infrastruktury-jako-kod w Twoim repozytorium, a &lt;code&gt;azd up&lt;/code&gt; provisionuje wszystko na Azure i publikuje Twojego agenta.&lt;/p&gt;
&lt;h2 id="co-się-dzieje-pod-maską"&gt;Co się dzieje pod maską&lt;/h2&gt;
&lt;p&gt;Polecenie &lt;code&gt;init&lt;/code&gt; generuje prawdziwe, inspekowalne szablony Bicep w Twoim repo — Foundry Resource, Foundry Project, konfiguracja wdrożenia modelu, zarządzana tożsamość z RBAC.&lt;/p&gt;
&lt;h2 id="dev-inner-loop"&gt;Dev inner loop&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;azd ai agent run &lt;span class="c1"&gt;# uruchom agenta lokalnie&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;azd ai agent invoke &lt;span class="c1"&gt;# wyślij testowe prompty&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;azd ai agent monitor --follow &lt;span class="c1"&gt;# streamuj logi w czasie rzeczywistym&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="pełny-zestaw-poleceń"&gt;Pełny zestaw poleceń&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Polecenie&lt;/th&gt;
&lt;th&gt;Co robi&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;azd ai agent init&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Scaffold projektu agenta Foundry z IaC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;azd up&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Provisionuj zasoby i wdrożyj agenta&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;azd ai agent invoke&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Wyślij prompty do zdalnego lub lokalnego agenta&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;azd ai agent run&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Uruchom agenta lokalnie&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;azd ai agent monitor&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Streamuj logi w czasie rzeczywistym&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;azd down&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Wyczyść wszystkie zasoby Azure&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Sprawdź &lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-ai-agent-end-to-end/"&gt;pełny przewodnik&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Odpowiedzi w Tle w Microsoft Agent Framework: Koniec z Lękiem Przed Timeoutem</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/background-responses-agent-framework-long-running-tasks/</link><pubDate>Thu, 26 Mar 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/background-responses-agent-framework-long-running-tasks/</guid><description>Microsoft Agent Framework umożliwia teraz odciążanie długotrwałych zadań AI za pomocą tokenów kontynuacji. Oto jak działają odpowiedzi w tle i dlaczego mają znaczenie dla Twoich agentów .NET.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ten post został automatycznie przetłumaczony. Aby przejść do oryginału, &lt;a href="https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/background-responses-agent-framework-long-running-tasks/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Jeśli budowałeś cokolwiek z modelami rozumowania jak o3 lub GPT-5.2, znasz ten ból. Twój agent zaczyna przetwarzać złożone zadanie, klient czeka, a gdzieś między &amp;ldquo;to jest w porządku&amp;rdquo; a &amp;ldquo;czy to się zawiesiło?&amp;rdquo; połączenie przekracza czas.&lt;/p&gt;
&lt;p&gt;Microsoft Agent Framework właśnie dostarczył &lt;a href="https://devblogs.microsoft.com/agent-framework/handling-long-running-operations-with-background-responses/"&gt;odpowiedzi w tle&lt;/a&gt; — i szczerze mówiąc, to jedna z tych funkcji, która powinna istnieć od pierwszego dnia.&lt;/p&gt;
&lt;h2 id="problem-z-blokującymi-wywołaniami"&gt;Problem z blokującymi wywołaniami&lt;/h2&gt;
&lt;p&gt;W tradycyjnym wzorcu żądanie-odpowiedź klient blokuje się do momentu zakończenia przez agenta. Odpowiedzi w tle odwracają to do góry nogami.&lt;/p&gt;
&lt;h2 id="jak-działają-tokeny-kontynuacji"&gt;Jak działają tokeny kontynuacji&lt;/h2&gt;
&lt;p&gt;Zamiast blokować, uruchamiasz zadanie agenta i otrzymujesz z powrotem &lt;strong&gt;token kontynuacji&lt;/strong&gt;. Pomyśl o tym jak o numerku w garderob. Przepływ jest prosty:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Wyślij żądanie z &lt;code&gt;AllowBackgroundResponses = true&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Jeśli agent obsługuje przetwarzanie w tle, otrzymujesz token kontynuacji&lt;/li&gt;
&lt;li&gt;Odpytuj według harmonogramu, aż token wróci jako &lt;code&gt;null&lt;/code&gt;&lt;/li&gt;
&lt;/ol&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;AgentRunOptions&lt;/span&gt; &lt;span class="n"&gt;options&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&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;AllowBackgroundResponses&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&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&gt;&lt;/span&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 class="n"&gt;AgentResponse&lt;/span&gt; &lt;span class="n"&gt;response&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;Write a detailed market analysis for the Q4 product launch.&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 class="n"&gt;options&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="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ContinuationToken&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="n"&gt;not&lt;/span&gt; &lt;span class="kc"&gt;null&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="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TimeSpan&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FromSeconds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;2&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;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ContinuationToken&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ContinuationToken&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;response&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="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;options&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&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="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Text&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;h2 id="kiedy-faktycznie-tego-używać"&gt;Kiedy faktycznie tego używać&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Złożone zadania rozumowania&lt;/strong&gt; — wieloetapowe analizy, głębokie badania&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Długa generacja treści&lt;/strong&gt; — szczegółowe raporty, wieloczęściowe dokumenty&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nierezualne sieci&lt;/strong&gt; — klienci mobilni, wdrożenia brzegowe&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Asynchroniczne wzorce UX&lt;/strong&gt; — prześlij zadanie, zrób coś innego, wróć po wyniki&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sprawdź &lt;a href="https://devblogs.microsoft.com/agent-framework/handling-long-running-operations-with-background-responses/"&gt;pełną dokumentację&lt;/a&gt; po kompletny opis API.&lt;/p&gt;</content:encoded></item><item><title>VS Code 1.112: co programiści .NET powinni naprawdę wiedzieć</title><link>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/vscode-1-112-dotnet-developers/</link><pubDate>Thu, 26 Mar 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/vscode-1-112-dotnet-developers/</guid><description>VS Code 1.112 właśnie wyszedł i jest pełen ulepszeń agentów, zintegrowanego debuggera przeglądarki, piaskownicy MCP i wsparcia dla monorepo. Oto co naprawdę ważne dla programistów .NET.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ten post został automatycznie przetłumaczony. Aby przejść do oryginału, &lt;a href="https://thedotnetblog.com/pl/posts/emiliano-montesdeoca/vscode-1-112-dotnet-developers/"&gt;kliknij tutaj&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;VS Code 1.112 właśnie wylądował i szczerze? Ten uderza inaczej, jeśli spędzasz dni w krainie .NET. Jest wiele w &lt;a href="https://code.visualstudio.com/updates/v1_112"&gt;oficjalnych notatkach wydania&lt;/a&gt;, ale pozwól, że oszczędzę ci przewijania i skupię się na tym, co naprawdę ważne dla nas.&lt;/p&gt;
&lt;h2 id="copilot-cli-stał-się-znacznie-bardziej-użyteczny"&gt;Copilot CLI stał się znacznie bardziej użyteczny&lt;/h2&gt;
&lt;p&gt;Główny temat tego wydania to &lt;strong&gt;autonomia agentów&lt;/strong&gt; — danie Copilot więcej przestrzeni do działania bez nadzorowania każdego kroku.&lt;/p&gt;
&lt;h3 id="kierowanie-wiadomościami-i-kolejkowanie"&gt;Kierowanie wiadomościami i kolejkowanie&lt;/h3&gt;
&lt;p&gt;Znasz ten moment, gdy Copilot CLI jest w połowie zadania i zdajesz sobie sprawę, że zapomniałeś czegoś wspomnieć? Wcześniej musiałeś czekać. Teraz możesz po prostu wysyłać wiadomości, gdy żądanie jest jeszcze w toku — albo by sterować bieżącą odpowiedzią, albo kolejkować kolejne instrukcje.&lt;/p&gt;
&lt;p&gt;To ogromne dla dłuższych zadań szkieletowania &lt;code&gt;dotnet&lt;/code&gt;, gdzie obserwujesz Copilot konfigurujący projekt i myślisz &amp;ldquo;och, poczekaj, potrzebuję też MassTransit tam&amp;rdquo;.&lt;/p&gt;
&lt;h3 id="poziomy-uprawnień"&gt;Poziomy uprawnień&lt;/h3&gt;
&lt;p&gt;To jest to, na czym mi najbardziej zależy. Sesje Copilot CLI obsługują teraz trzy poziomy uprawnień:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Domyślne uprawnienia&lt;/strong&gt; — zwykły przepływ, gdzie narzędzia proszą o potwierdzenie przed uruchomieniem&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pomiń zatwierdzenia&lt;/strong&gt; — automatycznie zatwierdza wszystko i ponawia przy błędach&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Autopilot&lt;/strong&gt; — pełna autonomia: zatwierdza narzędzia, odpowiada na własne pytania i kontynuuje aż do zakończenia zadania&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Jeśli robisz coś jak szkieletowanie nowego API ASP.NET Core z Entity Framework, migracjami i konfiguracją Docker — tryb Autopilot oznacza, że opisujesz co chcesz i idziesz po kawę. Samo to rozgryzie.&lt;/p&gt;
&lt;p&gt;Możesz włączyć Autopilot z ustawieniem &lt;code&gt;chat.autopilot.enabled&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="podgląd-zmian-przed-delegowaniem"&gt;Podgląd zmian przed delegowaniem&lt;/h3&gt;
&lt;p&gt;Gdy delegujesz zadanie do Copilot CLI, tworzy on worktree. Wcześniej, jeśli miałeś niezatwierdzone zmiany, musiałeś sprawdzić Kontrolę źródła, by zobaczyć co zostanie dotknięte. Teraz widok Chat pokazuje oczekujące zmiany tam, zanim zdecydujesz czy je skopiować, przenieść czy zignorować.&lt;/p&gt;
&lt;p&gt;Mała rzecz, ale oszczędza ten moment &amp;ldquo;poczekaj, co miałem w stanie staging?&amp;rdquo;&lt;/p&gt;
&lt;h2 id="debuguj-aplikacje-webowe-bez-wychodzenia-z-vs-code"&gt;Debuguj aplikacje webowe bez wychodzenia z VS Code&lt;/h2&gt;
&lt;p&gt;Zintegrowana przeglądarka obsługuje teraz &lt;strong&gt;pełne debugowanie&lt;/strong&gt;. Możesz ustawiać punkty przerwania, przechodzić przez kod i inspekcjonować zmienne — wszystko wewnątrz VS Code. Koniec z przełączaniem się do Edge DevTools.&lt;/p&gt;
&lt;p&gt;Jest nowy typ debugowania &lt;code&gt;editor-browser&lt;/code&gt;, a jeśli masz już istniejące konfiguracje uruchamiania &lt;code&gt;msedge&lt;/code&gt; lub &lt;code&gt;chrome&lt;/code&gt;, migracja jest tak prosta jak zmiana pola &lt;code&gt;type&lt;/code&gt; w &lt;code&gt;launch.json&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&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="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;editor-browser&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="nt"&gt;&amp;#34;request&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;launch&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="nt"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Debug Blazor App&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="nt"&gt;&amp;#34;url&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://localhost:5001&amp;#34;&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;p&gt;Dla programistów Blazor to zmiana zasad gry. Już uruchamiasz &lt;code&gt;dotnet watch&lt;/code&gt; w terminalu — teraz debugowanie też pozostaje w tym samym oknie.&lt;/p&gt;
&lt;p&gt;Przeglądarka otrzymała też niezależne poziomy powiększenia (wreszcie), właściwe menu kontekstowe prawym przyciskiem i powiększenie jest zapamiętywane dla każdej witryny.&lt;/p&gt;
&lt;h2 id="piaskownica-serwerów-mcp"&gt;Piaskownica serwerów MCP&lt;/h2&gt;
&lt;p&gt;Ta kwestia ma większe znaczenie niż mogłoby się wydawać. Jeśli używasz serwerów MCP — może skonfigurowałeś własny dla zasobów Azure lub zapytań do bazy danych — działały one z tymi samymi uprawnieniami co twój proces VS Code. To oznacza pełny dostęp do systemu plików, sieci, wszystkiego.&lt;/p&gt;
&lt;p&gt;Teraz możesz je piaskownicować. W twoim &lt;code&gt;mcp.json&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&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="nt"&gt;&amp;#34;servers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&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="nt"&gt;&amp;#34;my-azure-tools&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&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="nt"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;node&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="nt"&gt;&amp;#34;args&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;./mcp-server.js&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="nt"&gt;&amp;#34;sandboxEnabled&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&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="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;p&gt;Gdy piaskownicowany serwer potrzebuje dostępu do czegoś, czego nie ma, VS Code prosi o przyznanie uprawnień. Znacznie lepsze niż podejście &amp;ldquo;mam nadzieję, że nikt nic dziwnego nie zrobi&amp;rdquo;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Uwaga:&lt;/strong&gt; Piaskownicowanie jest dostępne na macOS i Linux. Wsparcie dla Windows jest w planach — zdalne scenariusze jak WSL jednak działają.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="odkrywanie-dostosowań-monorepo"&gt;Odkrywanie dostosowań monorepo&lt;/h2&gt;
&lt;p&gt;Jeśli pracujesz w monorepo (a szczerze, wiele rozwiązań enterprise .NET kończy się jako jedno), to rozwiązuje realny problem.&lt;/p&gt;
&lt;p&gt;Wcześniej, jeśli otwierałeś podfolder repozytorium, VS Code nie znajdował &lt;code&gt;copilot-instructions.md&lt;/code&gt;, &lt;code&gt;AGENTS.md&lt;/code&gt; ani własnych umiejętności siedzących w katalogu głównym repozytorium. Teraz z ustawieniem &lt;code&gt;chat.useCustomizationsInParentRepositories&lt;/code&gt; chodzi w górę do korzenia &lt;code&gt;.git&lt;/code&gt; i odkrywa wszystko.&lt;/p&gt;
&lt;p&gt;To oznacza, że twój zespół może współdzielić instrukcje agenta, pliki promptów i własne narzędzia we wszystkich projektach w monorepo bez konieczności otwierania przez wszystkich folderu głównego.&lt;/p&gt;
&lt;h2 id="troubleshoot-do-debugowania-agentów"&gt;/troubleshoot do debugowania agentów&lt;/h2&gt;
&lt;p&gt;Kiedyś konfigurowałeś własne instrukcje lub umiejętności i zastanawiałeś się, dlaczego nie są wykrywane? Nowa umiejętność &lt;code&gt;/troubleshoot&lt;/code&gt; czyta logi debugowania agenta i mówi ci co się stało — które narzędzia były użyte lub pominięte, dlaczego instrukcje się nie załadowały i co powoduje wolne odpowiedzi.&lt;/p&gt;
&lt;p&gt;Włącz ją z:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&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="nt"&gt;&amp;#34;github.copilot.chat.agentDebugLog.enabled&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&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="nt"&gt;&amp;#34;github.copilot.chat.agentDebugLog.fileLogging.enabled&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&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;p&gt;Następnie po prostu wpisz &lt;code&gt;/troubleshoot dlaczego moja własna umiejętność się nie ładuje?&lt;/code&gt; w czacie.&lt;/p&gt;
&lt;p&gt;Możesz też teraz eksportować i importować te logi debugowania, co jest świetne do dzielenia się z zespołem, gdy coś nie działa zgodnie z oczekiwaniami.&lt;/p&gt;
&lt;h2 id="wsparcie-dla-obrazów-i-plików-binarnych"&gt;Wsparcie dla obrazów i plików binarnych&lt;/h2&gt;
&lt;p&gt;Agenty mogą teraz czytać pliki obrazów z dysku i pliki binarne natywnie. Pliki binarne są prezentowane w formacie hexdump, a wyjścia obrazów (jak zrzuty ekranu z zintegrowanej przeglądarki) pojawiają się w widoku karuzeli.&lt;/p&gt;
&lt;p&gt;Dla programistów .NET, pomyśl: wklej zrzut ekranu błędu interfejsu do czatu i pozwól agentowi zrozumieć, co jest nie tak, lub każ mu przeanalizować wyjście renderowania komponentu Blazor.&lt;/p&gt;
&lt;h2 id="automatyczne-odwołania-do-symboli"&gt;Automatyczne odwołania do symboli&lt;/h2&gt;
&lt;p&gt;Małe ulepszenie komfortu pracy: gdy kopiujesz nazwę symbolu (klasy, metody itp.) i wklejasz ją do czatu, VS Code teraz automatycznie konwertuje ją na odwołanie &lt;code&gt;#sym:Nazwa&lt;/code&gt;. Daje to agentowi pełny kontekst dotyczący tego symbolu bez konieczności ręcznego dodawania go.&lt;/p&gt;
&lt;p&gt;Jeśli chcesz zwykłego tekstu zamiast, użyj &lt;code&gt;Ctrl+Shift+V&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="wtyczki-można-teraz-włączaćwyłączać"&gt;Wtyczki można teraz włączać/wyłączać&lt;/h2&gt;
&lt;p&gt;Wcześniej wyłączenie serwera MCP lub wtyczki oznaczało jej odinstalowanie. Teraz możesz je przełączać — globalnie i dla każdego obszaru roboczego. Kliknij prawym przyciskiem w widoku Extensions lub Customizations i gotowe.&lt;/p&gt;
&lt;p&gt;Wtyczki z npm i pypi mogą też teraz się automatycznie aktualizować, choć poproszą o zatwierdzenie najpierw, ponieważ aktualizacje oznaczają uruchomienie nowego kodu na twoim komputerze.&lt;/p&gt;
&lt;h2 id="podsumowanie"&gt;Podsumowanie&lt;/h2&gt;
&lt;p&gt;VS Code 1.112 wyraźnie mocno napiera na doświadczenie agentów — większa autonomia, lepsze debugowanie, ściślejsze bezpieczeństwo. Dla programistów .NET, zintegrowane debugowanie przeglądarki i ulepszenia Copilot CLI to wyróżniające się funkcje.&lt;/p&gt;
&lt;p&gt;Jeśli jeszcze nie próbowałeś pełnej sesji Copilot CLI w trybie Autopilot dla projektu .NET, to wydanie jest dobrym momentem na start. Pamiętaj tylko, by ustawić uprawnienia i pozwolić mu działać.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://code.visualstudio.com/updates/v1_112"&gt;Pobierz VS Code 1.112&lt;/a&gt; lub zaktualizuj z poziomu VS Code przez &lt;strong&gt;Pomoc &amp;gt; Sprawdź dostępność aktualizacji&lt;/strong&gt;.&lt;/p&gt;</content:encoded></item><item><title>Emiliano Montesdeoca</title><link>https://thedotnetblog.com/pl/authors/emiliano-montesdeoca/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thedotnetblog.com/pl/authors/emiliano-montesdeoca/</guid><description/><content:encoded/></item></channel></rss>