<?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/de/</link><description>Articles, tutorials and insights from the .NET community.</description><generator>Hugo</generator><language>de</language><managingEditor>@thedotnetblog (The .NET Blog)</managingEditor><webMaster>@thedotnetblog</webMaster><lastBuildDate>Mon, 14 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://thedotnetblog.com/de/index.xml" rel="self" type="application/rss+xml"/><item><title>NDC Oslo 2026</title><link>https://thedotnetblog.com/de/events/ndc-oslo-2026/</link><pubDate>Mon, 14 Sep 2026 00:00:00 +0000</pubDate><guid>https://thedotnetblog.com/de/events/ndc-oslo-2026/</guid><description>Eine der größten Entwicklerkonferenzen Europas — 5 Tage mit Workshops, Sessions und Networking im Oslo Spektrum mit über 150 Speakern und 160 Sessions.</description><content:encoded>&lt;p&gt;&lt;strong&gt;NDC Oslo 2026&lt;/strong&gt; findet vom &lt;strong&gt;14. bis 18. September 2026&lt;/strong&gt; im &lt;strong&gt;Oslo Spektrum&lt;/strong&gt; in Oslo, Norwegen statt.&lt;/p&gt;
&lt;p&gt;NDC Oslo ist eine der größten und angesehensten Entwicklerkonferenzen Europas, die alles abdeckt — von .NET und Cloud über Sicherheit, Architektur und KI bis darüber hinaus. Die Ausgabe 2026 befindet sich derzeit in der Buchungsphase, mit einem massiven Programm im Aufbau.&lt;/p&gt;
&lt;h2 id="in-zahlen"&gt;In Zahlen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;160 Sessions&lt;/strong&gt; (in Buchung)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;150 Speaker&lt;/strong&gt; (in Buchung)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;15 Workshops&lt;/strong&gt; (in Buchung)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;5 Tage&lt;/strong&gt; — Workshops + Konferenz&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="bestätigte-speaker"&gt;Bestätigte Speaker&lt;/h2&gt;
&lt;p&gt;Die Speaker-Liste wird aufgebaut, mit bestätigten Namen wie:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Nick Chapsas&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Maddy Montaquila&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Troy Hunt&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kevlin Henney&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Venkat Subramaniam&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Jeff Fritz&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Philippe De Ryck&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nhlanhla Lucky Nkosi&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Aleksander Stensby&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="tickets"&gt;Tickets&lt;/h2&gt;
&lt;p&gt;Early-Bird-Tickets sind verfügbar — das Early-Bird-Angebot endet am &lt;strong&gt;22. Mai 2026&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Der CFP (Call for Papers) ist ebenfalls offen.&lt;/p&gt;
&lt;h2 id="weitere-ndc-events-2026"&gt;Weitere NDC-Events 2026&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;NDC Sydney — 22.–24. April 2026&lt;/li&gt;
&lt;li&gt;NDC Toronto — 5.–8. Mai 2026&lt;/li&gt;
&lt;li&gt;NDC Copenhagen — 1.–4. Juni 2026&lt;/li&gt;
&lt;li&gt;NDC AI — 8.–10. Juni 2026&lt;/li&gt;
&lt;li&gt;NDC TechTown — 21.–24. September 2026&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="links"&gt;Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ndcoslo.com/"&gt;Event-Website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ndcoslo.com/tickets"&gt;Tickets&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ndcoslo.com/call-for-papers"&gt;Call for Papers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ndcoslo.com/speakers"&gt;Speaker&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title>.NET Day Switzerland 2026</title><link>https://thedotnetblog.com/de/events/dotnet-day-switzerland-2026/</link><pubDate>Tue, 25 Aug 2026 00:00:00 +0000</pubDate><guid>https://thedotnetblog.com/de/events/dotnet-day-switzerland-2026/</guid><description>Eine gemeinnützige Community-Konferenz für .NET-Entwickler, Architekten und Experten — zu .NET, C#, ASP.NET Core, Azure und mehr — in Zürich.</description><content:encoded>&lt;p&gt;&lt;strong&gt;.NET Day Switzerland 2026&lt;/strong&gt; findet am &lt;strong&gt;25. August 2026&lt;/strong&gt; im &lt;strong&gt;Arena Cinemas Sihlcity&lt;/strong&gt; (Kalanderplatz 8, 8045 Zürich) statt.&lt;/p&gt;
&lt;p&gt;Dies ist eine unabhängige, gemeinnützige Community-Konferenz für Entwickler, Architekten und Experten zu .NET, C#, ASP.NET Core, Azure und dem gesamten Microsoft-Entwicklungsökosystem. Alle Speaker und Helfer arbeiten ehrenamtlich, und Überschüsse aus dem Ticketverkauf gehen an wohltätige Zwecke oder die Schweizer .NET-Community.&lt;/p&gt;
&lt;h2 id="das-erwartet-dich"&gt;Das erwartet dich&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Hochwertige Sessions von internationalen Fachexperten&lt;/li&gt;
&lt;li&gt;Networking mit anderen Teilnehmern&lt;/li&gt;
&lt;li&gt;Essen, Snacks und Getränke in den Pausen, beim Mittagessen und beim Apéro&lt;/li&gt;
&lt;li&gt;Karrieremöglichkeiten durch Sponsor-Interaktionen&lt;/li&gt;
&lt;li&gt;Direkte Gespräche mit Speakern in den Pausen&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="tickets"&gt;Tickets&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Kategorie&lt;/th&gt;
&lt;th&gt;Preis&lt;/th&gt;
&lt;th&gt;Verfügbarkeit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Very Early Bird (1.–30. Apr)&lt;/td&gt;
&lt;td&gt;299 CHF&lt;/td&gt;
&lt;td&gt;Max. 100 Tickets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Early Bird&lt;/td&gt;
&lt;td&gt;399 CHF&lt;/td&gt;
&lt;td&gt;Max. 100 Tickets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Regular&lt;/td&gt;
&lt;td&gt;449 CHF&lt;/td&gt;
&lt;td&gt;Bis ausverkauft&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Speaker und Programm sind noch nicht bekannt — der Call for Speakers ist auf &lt;a href="https://sessionize.com/net-day-switzerland-2026/"&gt;Sessionize&lt;/a&gt; offen.&lt;/p&gt;
&lt;h2 id="organisatoren"&gt;Organisatoren&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/FabianGosebrink"&gt;Fabian Gosebrink&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/manumeyer1"&gt;Manuel Meyer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/gassmannt"&gt;Thomas Gassmann&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="links"&gt;Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dotnetday.ch/"&gt;Event-Website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://eepurl.com/dDoFEn"&gt;Newsletter-Anmeldung&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title>SDD Conference 2026</title><link>https://thedotnetblog.com/de/events/sdd-conference-2026/</link><pubDate>Mon, 11 May 2026 00:00:00 +0000</pubDate><guid>https://thedotnetblog.com/de/events/sdd-conference-2026/</guid><description>Eine 5-tägige Software-Entwicklungskonferenz im Barbican Centre in London mit 78 Sessions und 14 Workshops zu Architektur, .NET, KI, Azure, DevOps und mehr.</description><content:encoded>&lt;p&gt;&lt;strong&gt;SDD 2026&lt;/strong&gt; findet vom &lt;strong&gt;11. bis 15. Mai 2026&lt;/strong&gt; im &lt;strong&gt;Barbican Centre in London&lt;/strong&gt; statt. Die 3-tägige Kernkonferenz läuft von Dienstag bis Donnerstag, mit optionalen Ganztags-Workshops am Montag und Freitag.&lt;/p&gt;
&lt;p&gt;Mit &lt;strong&gt;78 Sessions&lt;/strong&gt; und &lt;strong&gt;14 Workshops&lt;/strong&gt; ist dies eine der umfangreichsten Entwicklerkonferenzen in Europa.&lt;/p&gt;
&lt;h2 id="themen"&gt;Themen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Architektonisches Denken&lt;/li&gt;
&lt;li&gt;Funktionaler Code in C# 13&lt;/li&gt;
&lt;li&gt;Serverless-Design&lt;/li&gt;
&lt;li&gt;Semantische KI&lt;/li&gt;
&lt;li&gt;Azure Kubernetes Services&lt;/li&gt;
&lt;li&gt;Lean DevOps Strategien&lt;/li&gt;
&lt;li&gt;The Model Context Protocol (MCP)&lt;/li&gt;
&lt;li&gt;Agentische KI in .NET&lt;/li&gt;
&lt;li&gt;Refactoring des Monolithen&lt;/li&gt;
&lt;li&gt;Schneller programmieren mit LLMs&lt;/li&gt;
&lt;li&gt;Kryptographie in einer Post-Quanten-Welt&lt;/li&gt;
&lt;li&gt;Local-First-Entwicklung&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="speaker"&gt;Speaker&lt;/h2&gt;
&lt;p&gt;Weltklasse-Lineup mit &lt;strong&gt;Kevlin Henney&lt;/strong&gt;, &lt;strong&gt;Neal Ford&lt;/strong&gt;, &lt;strong&gt;Sander Hoogendoorn&lt;/strong&gt;, &lt;strong&gt;Andrew Clymer&lt;/strong&gt;, &lt;strong&gt;Jacqui Read&lt;/strong&gt;, &lt;strong&gt;Christian Weyer&lt;/strong&gt;, &lt;strong&gt;Jeff Prosise&lt;/strong&gt;, &lt;strong&gt;Jules May&lt;/strong&gt;, &lt;strong&gt;Oliver Sturm&lt;/strong&gt; und &lt;strong&gt;Raju Gandhi&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="tickets-und-infos"&gt;Tickets und Infos&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://sddconf.com/"&gt;Event-Website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sddvault.s3.amazonaws.com/assets/SDD_2026_schedule.pdf"&gt;Vollständige Agenda PDF&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sddconf.com/register"&gt;Registrierungsoptionen&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;98 % der SDD 2025-Teilnehmer bewerteten das Gesamterlebnis als gut, sehr gut oder exzellent.&lt;/p&gt;</content:encoded></item><item><title>Azure DevOps MCP Server April Update: WIQL-Abfragen, PAT-Auth und experimentelle MCP Apps</title><link>https://thedotnetblog.com/de/posts/emiliano-montesdeoca/azure-devops-mcp-server-april-2026-wiql-pat-apps/</link><pubDate>Mon, 27 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/de/posts/emiliano-montesdeoca/azure-devops-mcp-server-april-2026-wiql-pat-apps/</guid><description>Der Azure DevOps MCP Server erhält WIQL-gestützte Work-Item-Abfragen, Personal Access Token Authentifizierung, MCP-Annotationen und ein experimentelles MCP Apps Feature.</description><content:encoded>&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Zur Originalversion &lt;a href="https://thedotnetblog.com/posts/emiliano-montesdeoca/azure-devops-mcp-server-april-2026-wiql-pat-apps/"&gt;hier klicken&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Der Azure DevOps MCP Server verbessert sich kontinuierlich. Das April-Update von Dan Hellem deckt beide Server ab.&lt;/p&gt;
&lt;h2 id="wiql-abfrageunterstützung"&gt;WIQL-Abfrageunterstützung&lt;/h2&gt;
&lt;p&gt;Das neue &lt;code&gt;wit_query_by_wiql&lt;/code&gt;-Tool ermöglicht Work Item Query Language Abfragen direkt aus deinem MCP-Client.&lt;/p&gt;
&lt;h2 id="personal-access-tokens"&gt;Personal Access Tokens&lt;/h2&gt;
&lt;p&gt;PAT-Authentifizierung am lokalen Server — wichtig für Integrationsszenarien ohne interaktive Authentifizierung.&lt;/p&gt;
&lt;h2 id="mcp-annotationen"&gt;MCP-Annotationen&lt;/h2&gt;
&lt;p&gt;Metadaten-Tags für Read-only-, Destructive- und Open-World-Tools — grundlegend für Agent-Zuverlässigkeit.&lt;/p&gt;
&lt;h2 id="wiki-tool-konsolidierung"&gt;Wiki-Tool-Konsolidierung&lt;/h2&gt;
&lt;p&gt;5 separate Wiki-Tools → 2 fähigere Tools. Weniger Tools = bessere LLM-Performance.&lt;/p&gt;
&lt;h2 id="experimentell-mcp-apps"&gt;Experimentell: MCP Apps&lt;/h2&gt;
&lt;p&gt;Paketierte Workflows innerhalb der MCP-Server-Umgebung. Die Richtung stimmt.&lt;/p&gt;
&lt;p&gt;Originalpost von Dan Hellem: &lt;a href="https://devblogs.microsoft.com/devops/azure-devops-mcp-server-april-update/"&gt;Azure DevOps MCP Server April Update&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>SQL Server 2025 als Agent-Ready Datenbank: Sicherheit, Backup und MCP in einer Engine</title><link>https://thedotnetblog.com/de/posts/emiliano-montesdeoca/sql-server-2025-agent-ready-security-mcp/</link><pubDate>Sun, 26 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/de/posts/emiliano-montesdeoca/sql-server-2025-agent-ready-security-mcp/</guid><description>Der letzte Teil der Polyglot Tax Serie tackles die harten Produktionsprobleme: vereinheitlichte Row-Level Security über relationale, JSON-, Graph- und Vektordaten, plus MCP-Integration.</description><content:encoded>&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Zur Originalversion &lt;a href="https://thedotnetblog.com/posts/emiliano-montesdeoca/sql-server-2025-agent-ready-security-mcp/"&gt;hier klicken&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Ich habe die Polyglot Tax Serie von Aditya Badramraju mit großem Interesse verfolgt. Teile 1-3 lieferten den Beweis für SQL Server 2025 als echte Multi-Modell-Datenbank. Teil 4 schließt die Serie mit den Teilen, die wirklich bestimmen, ob du dieser Architektur in Produktion vertrauen würdest.&lt;/p&gt;
&lt;h2 id="ein-sicherheitsmodell-für-alle-datenmodelle"&gt;Ein Sicherheitsmodell für alle Datenmodelle&lt;/h2&gt;
&lt;p&gt;Eine Row-Level Security Policy, die alle Datenmodelle abdeckt — relationale Tabellen, JSON-Events, Graph-Edges, Vektoren. Eine Policy, ein Audit, ein Nachweis.&lt;/p&gt;
&lt;h2 id="einheitliches-backup--atomare-wiederherstellung"&gt;Einheitliches Backup = Atomare Wiederherstellung&lt;/h2&gt;
&lt;p&gt;In einem polyglottes Stack bedeutet Point-in-Time Recovery fünf koordinierte Restore-Operationen und die Hoffnung, dass die Timestamps übereinstimmen. Mit einer Datenbank ist die Wiederherstellung per Definition atomar.&lt;/p&gt;
&lt;h2 id="mcp-integration-agenten-ohne-hand-codierten-middleware"&gt;MCP-Integration: Agenten Ohne Hand-codierten Middleware&lt;/h2&gt;
&lt;p&gt;SQL Server 2025 unterstützt den SQL MCP Server direkt. Agenten rufen Tools auf, die Engine erzwingt Tenant-Isolierung und Column-Masking automatisch.&lt;/p&gt;
&lt;h2 id="fazit"&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Für .NET-Entwickler, die agenten-first Anwendungen auf Azure SQL bauen, verdient diese Architektur ernsthafte Überlegung. Originalpost von Aditya Badramraju: &lt;a href="https://devblogs.microsoft.com/azure-sql/the-polyglot-tax-part-4/"&gt;The Polyglot Tax – Part 4&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>.NET 10 wird mit Ubuntu 26.04 LTS ausgeliefert — Was Neu Ist</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/dotnet-ubuntu-2604-resolute-raccoon-net10/</guid><description>Ubuntu 26.04 LTS (Resolute Raccoon) ist mit .NET 10 als erstklassiger Toolchain erschienen. Native AOT, Chiseled Container, Linux 7.0 — hier ist, was du wissen musst.</description><content:encoded>&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Zur Originalversion &lt;a href="https://thedotnetblog.com/de/posts/emiliano-montesdeoca/dotnet-ubuntu-2604-resolute-raccoon-net10/"&gt;hier klicken&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Es ist Ubuntu-LTS-Tag. &lt;a href="https://canonical.com/blog/canonical-releases-ubuntu-26-04-lts-resolute-raccoon"&gt;Ubuntu 26.04 (Resolute Raccoon)&lt;/a&gt; ist heute erschienen und liefert wie jede Ubuntu-LTS die neueste .NET-LTS aus — in diesem Fall &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;p&gt;LTS auf LTS — fünf Jahre Support für das OS, passend zum eigenen Langzeit-Support-Fenster von .NET 10.&lt;/p&gt;
&lt;h2 id="net-10-in-zwei-befehlen-installieren"&gt;.NET 10 in zwei Befehlen installieren&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;p&gt;.NET ist einer der &lt;a href="https://ubuntu.com/toolchains"&gt;offiziell unterstützten Toolchains auf Ubuntu&lt;/a&gt; — kein Drittanbieter-Add-on.&lt;/p&gt;
&lt;h2 id="container--noble-zu--resolute-aktualisieren"&gt;Container: &lt;code&gt;-noble&lt;/code&gt; zu &lt;code&gt;-resolute&lt;/code&gt; aktualisieren&lt;/h2&gt;
&lt;p&gt;Die Migration ist einzeilig:&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;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;p&gt;Alle bestehenden Image-Varianten — einschließlich &lt;a href="https://devblogs.microsoft.com/dotnet/announcing-dotnet-chiseled-containers/"&gt;Chiseled&lt;/a&gt; — sind verfügbar.&lt;/p&gt;
&lt;h2 id="native-aot-3ms-start-14mb-binary"&gt;Native AOT: 3ms Start, 1,4MB Binary&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;# artifacts/app/app — 1,4MB natives Binary&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# real 0m0.003s&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Für cloud-native Workloads, bei denen Kaltstart-Zeit wichtig ist — Functions, Container, Serverless — ein echter Gamechanger.&lt;/p&gt;
&lt;h2 id="benötigst-du-net-8-oder-9"&gt;Benötigst du .NET 8 oder 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;Der &lt;a href="https://devblogs.microsoft.com/dotnet/whats-new-for-dotnet-in-ubuntu-2604/"&gt;vollständige Beitrag&lt;/a&gt; enthält weitere Details zu cgroup v2, Post-Quanten-Kryptografie und Linux 7.0.&lt;/p&gt;</content:encoded></item><item><title>Azure SDK April 2026: AI Foundry 2.0 und Was .NET-Entwickler Wissen Sollten</title><link>https://thedotnetblog.com/de/posts/emiliano-montesdeoca/azure-sdk-april-2026-ai-foundry-2-stable/</link><pubDate>Sat, 25 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/de/posts/emiliano-montesdeoca/azure-sdk-april-2026-ai-foundry-2-stable/</guid><description>Das Azure SDK April 2026 Release bringt Azure.AI.Projects 2.0.0 stable mit bedeutenden Breaking Changes, kritische Cosmos DB Sicherheitsfixes und neue Provisioning-Bibliotheken für .NET.</description><content:encoded>&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Zur Originalversion &lt;a href="https://thedotnetblog.com/posts/emiliano-montesdeoca/azure-sdk-april-2026-ai-foundry-2-stable/"&gt;hier klicken&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Das April SDK-Release hat einiges, das Beachtung verdient — besonders wenn du mit AI Foundry, Cosmos DB in Java oder Infrastructure Provisioning aus .NET-Code arbeitest.&lt;/p&gt;
&lt;h2 id="azureaiprojects-200--breaking-changes-die-sinn-machen"&gt;Azure.AI.Projects 2.0.0 — Breaking Changes, die Sinn machen&lt;/h2&gt;
&lt;p&gt;Das &lt;code&gt;Azure.AI.Projects&lt;/code&gt; NuGet-Paket erreicht stabile 2.0.0 mit significanten Änderungen: Namespace-Splits für Evaluations und Memory, umbenannte Typen und konsistente &lt;code&gt;Is*&lt;/code&gt;-Konvention für Booleans.&lt;/p&gt;
&lt;h2 id="cosmos-db-java-kritischer-sicherheitsfix-rce"&gt;Cosmos DB Java: Kritischer Sicherheitsfix (RCE)&lt;/h2&gt;
&lt;p&gt;Der Java Cosmos DB Library 4.79.0 enthält einen kritischen Fix für eine &lt;strong&gt;Remote Code Execution Schwachstelle (CWE-502)&lt;/strong&gt;. Sofort updaten.&lt;/p&gt;
&lt;h2 id="neue-provisioning-bibliotheken-für-net"&gt;Neue Provisioning-Bibliotheken für .NET&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.nuget.org/packages/Azure.Provisioning.Network/1.0.0"&gt;Azure.Provisioning.Network 1.0.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nuget.org/packages/Azure.Provisioning.PrivateDns/1.0.0"&gt;Azure.Provisioning.PrivateDns 1.0.0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="fazit"&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Das Highlight für .NET-Entwickler diesen Monat: &lt;code&gt;Azure.AI.Projects 2.0.0&lt;/code&gt; ist stabil. Originalpost: &lt;a href="https://devblogs.microsoft.com/azure-sdk/azure-sdk-release-april-2026/"&gt;Azure SDK Release (April 2026)&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>CodeAct im Agent Framework: Wie du die Latenz deines Agenten halbierst</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/codeact-agent-framework-hyperlight-50-percent-faster/</guid><description>CodeAct fasst mehrstufige Tool-Chains in einem einzigen sandboxed Code-Block zusammen — 52% weniger Latenz und 64% weniger Token-Verbrauch. Was das für deine Agenten bedeutet und wann du es einsetzen solltest.</description><content:encoded>&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Zur Originalversion &lt;a href="https://thedotnetblog.com/de/posts/emiliano-montesdeoca/codeact-agent-framework-hyperlight-50-percent-faster/"&gt;hier klicken&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Es gibt diesen Moment in jedem Agenten-Projekt, wo man auf den Trace schaut und denkt: „Warum dauert das so lange?&amp;quot; Das Modell ist gut. Die Tools funktionieren. Aber es gibt sieben Round Trips für ein Ergebnis, das man in einem Schritt berechnen könnte.&lt;/p&gt;
&lt;p&gt;Genau dieses Problem löst CodeAct — und das &lt;a href="https://devblogs.microsoft.com/agent-framework/codeact-with-hyperlight/"&gt;Agent Framework Team hat soeben Alpha-Unterstützung dafür veröffentlicht&lt;/a&gt; mit dem neuen Paket &lt;code&gt;agent-framework-hyperlight&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="was-ist-codeact"&gt;Was ist CodeAct?&lt;/h2&gt;
&lt;p&gt;Das &lt;a href="https://arxiv.org/abs/2402.01030"&gt;CodeAct-Muster&lt;/a&gt; ist elegant einfach: Statt dem Modell eine Liste von Tools zu geben und sie einzeln aufrufen zu lassen, gibst du ihm ein einziges &lt;code&gt;execute_code&lt;/code&gt;-Tool und lässt es den &lt;em&gt;gesamten Plan&lt;/em&gt; als kurzes Python-Programm ausdrücken. Der Agent schreibt den Code einmal, die Sandbox führt ihn aus, und du erhältst ein einziges konsolidiertes Ergebnis zurück.&lt;/p&gt;
&lt;p&gt;Ein Fünf-Schritte-Plan, der früher fünf Modell-Turns benötigte, wird zu einem einzigen &lt;code&gt;execute_code&lt;/code&gt;-Turn mit einem Python-Script, das deine Tools über &lt;code&gt;call_tool(...)&lt;/code&gt; aufruft.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Verdrahtung&lt;/th&gt;
&lt;th&gt;Zeit&lt;/th&gt;
&lt;th&gt;Tokens&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Traditionell&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;Verbesserung&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="die-sicherheitskomponente-hyperlight-micro-vms"&gt;Die Sicherheitskomponente: Hyperlight Micro-VMs&lt;/h2&gt;
&lt;p&gt;Das Paket &lt;code&gt;agent-framework-hyperlight&lt;/code&gt; verwendet &lt;a href="https://github.com/hyperlight-dev/hyperlight"&gt;Hyperlight&lt;/a&gt; Micro-VMs. Jeder &lt;code&gt;execute_code&lt;/code&gt;-Aufruf erhält eine eigene frisch erstellte Micro-VM — mit eigenem Speicher, ohne Zugriff auf das Host-Dateisystem außer dem, was du explizit mountest. Der Start wird in Millisekunden gemessen. Die Isolierung ist im Grunde kostenlos.&lt;/p&gt;
&lt;p&gt;Deine Tools laufen weiterhin auf dem Host. Der modellgenerierte &lt;em&gt;Klebecode&lt;/em&gt; läuft in der Sandbox. Das ist die richtige Aufteilung.&lt;/p&gt;
&lt;h2 id="einrichtung"&gt;Einrichtung&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="nd"&gt;@tool&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_weather&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;city&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;str&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="s2"&gt;&amp;#34;&amp;#34;&amp;#34;Return the current weather for a city.&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="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;city&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;city&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;temperature_c&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;21.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;conditions&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;partly cloudy&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;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="wann-codeact-verwenden-und-wann-nicht"&gt;Wann CodeAct verwenden (und wann nicht)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;CodeAct verwenden, wenn:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Die Aufgabe viele kleine Tool-Aufrufe verkettet (Lookups, Joins, Berechnungen)&lt;/li&gt;
&lt;li&gt;Latenz und Token-Kosten wichtig sind&lt;/li&gt;
&lt;li&gt;Du starke Isolierung für modellgenerierten Code willst&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Beim traditionellen Tool-Calling bleiben, wenn:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Der Agent nur ein oder zwei Tool-Aufrufe pro Turn macht&lt;/li&gt;
&lt;li&gt;Jeder Aufruf Nebeneffekte hat, die einzeln genehmigt werden sollen&lt;/li&gt;
&lt;li&gt;Tool-Beschreibungen spärlich oder mehrdeutig sind&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="jetzt-ausprobieren"&gt;Jetzt ausprobieren&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;Den vollständigen Beitrag findest du im &lt;a href="https://devblogs.microsoft.com/agent-framework/codeact-with-hyperlight/"&gt;Agent Framework Blog&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Der Azure MCP Server ist jetzt ein .mcpb — Ohne Runtime Installieren</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/azure-mcp-server-mcpb-no-runtime-install/</guid><description>Der Azure MCP Server ist jetzt als MCP Bundle (.mcpb) verfügbar — herunterladen, in Claude Desktop ziehen, fertig. Kein Node.js, Python oder .NET Runtime erforderlich.</description><content:encoded>&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Zur Originalversion &lt;a href="https://thedotnetblog.com/de/posts/emiliano-montesdeoca/azure-mcp-server-mcpb-no-runtime-install/"&gt;hier klicken&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Weißt du, was an der Einrichtung von MCP-Servern lästig war? Du brauchtest eine Runtime. Node.js für die npm-Version, Python für pip/uvx, .NET SDK für die dotnet-Variante.&lt;/p&gt;
&lt;p&gt;Der &lt;a href="https://devblogs.microsoft.com/azure-sdk/azure-mcp-server-mcpb-support/"&gt;Azure MCP Server hat das gerade geändert&lt;/a&gt;. Er ist jetzt als &lt;code&gt;.mcpb&lt;/code&gt; — ein MCP Bundle — verfügbar, und die Einrichtung ist Drag-and-Drop.&lt;/p&gt;
&lt;h2 id="was-ist-ein-mcp-bundle"&gt;Was ist ein MCP Bundle?&lt;/h2&gt;
&lt;p&gt;Denk daran wie an eine VS Code-Erweiterung (&lt;code&gt;.vsix&lt;/code&gt;) oder eine Browser-Erweiterung (&lt;code&gt;.crx&lt;/code&gt;), aber für MCP-Server. Eine &lt;code&gt;.mcpb&lt;/code&gt;-Datei ist ein eigenständiges ZIP-Archiv mit dem Server-Binary und allen Abhängigkeiten.&lt;/p&gt;
&lt;h2 id="installation"&gt;Installation&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;1. Bundle für deine Plattform herunterladen&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Gehe auf die &lt;a href="https://github.com/microsoft/mcp/releases?q=Azure.Mcp.Server"&gt;GitHub Releases-Seite&lt;/a&gt; und lade die &lt;code&gt;.mcpb&lt;/code&gt;-Datei für dein OS und deine Architektur herunter. Stelle sicher, dass du die richtige wählst — &lt;code&gt;osx-arm64&lt;/code&gt; für Apple Silicon, &lt;code&gt;win-x64&lt;/code&gt; für Windows, usw.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. In Claude Desktop installieren&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Am einfachsten: Ziehe die &lt;code&gt;.mcpb&lt;/code&gt;-Datei in das Claude Desktop-Fenster während du auf der Erweiterungsseite bist (&lt;code&gt;☰ → Datei → Einstellungen → Erweiterungen&lt;/code&gt;). Serverdetails überprüfen, Installieren klicken, bestätigen. Fertig.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Bei Azure authentifizieren&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;p&gt;Das war&amp;rsquo;s. Der Azure MCP Server nutzt deine vorhandenen Azure-Anmeldeinformationen.&lt;/p&gt;
&lt;h2 id="was-du-damit-machen-kannst"&gt;Was du damit machen kannst&lt;/h2&gt;
&lt;p&gt;Über 100 Azure-Service-Tools direkt von deinem KI-Client:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cosmos DB, Storage, Key Vault, App Service, Foundry abfragen und verwalten&lt;/li&gt;
&lt;li&gt;&lt;code&gt;az&lt;/code&gt; CLI-Befehle für beliebige Aufgaben generieren&lt;/li&gt;
&lt;li&gt;Bicep- und Terraform-Vorlagen erstellen&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="erste-schritte"&gt;Erste Schritte&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Download&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;Repository&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;Docs&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;Siehe den &lt;a href="https://devblogs.microsoft.com/azure-sdk/azure-mcp-server-mcpb-support/"&gt;vollständigen Beitrag&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>GPT-5.5 ist da und kommt zu Azure Foundry — Was .NET-Entwickler Wissen Müssen</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/gpt-55-foundry-ga-what-dotnet-developers-need-to-know/</guid><description>GPT-5.5 ist allgemein verfügbar in Microsoft Foundry. Die Progression von GPT-5 zu 5.5, was sich wirklich verbessert hat und wie du heute damit anfängst.</description><content:encoded>&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Zur Originalversion &lt;a href="https://thedotnetblog.com/de/posts/emiliano-montesdeoca/gpt-55-foundry-ga-what-dotnet-developers-need-to-know/"&gt;hier klicken&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Microsoft hat gerade bekannt gegeben, dass &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 allgemein in Microsoft Foundry verfügbar ist&lt;/a&gt;. Wenn du Agenten auf Azure aufgebaut hast, ist das das Update, auf das du gewartet hast.&lt;/p&gt;
&lt;h2 id="die-gpt-5-progression"&gt;Die GPT-5-Progression&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GPT-5&lt;/strong&gt;: vereinte Reasoning und Geschwindigkeit in einem einzigen System&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPT-5.4&lt;/strong&gt;: stärkeres Multi-Step-Reasoning, frühe agentische Fähigkeiten für Unternehmen&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPT-5.5&lt;/strong&gt;: tieferes Langkontext-Reasoning, zuverlässigere agentische Ausführung, bessere Token-Effizienz&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="was-sich-wirklich-geändert-hat"&gt;Was sich wirklich geändert hat&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Verbessertes agentisches Coding&lt;/strong&gt;: GPT-5.5 hält Kontext über große Codebasen hinweg, diagnostiziert Architekturfehler und antizipiert Testanforderungen. Das Modell überlegt, &lt;em&gt;was sonst noch&lt;/em&gt; eine Korrektur beeinflusst.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Token-Effizienz&lt;/strong&gt;: Höherwertigere Ausgaben mit weniger Tokens und weniger Wiederholungen. Direkt niedrigere Kosten und Latenz für Produktions-Deployments.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Langkontext-Analyse&lt;/strong&gt;: Verarbeitet umfangreiche Dokumente und Multi-Session-Historien ohne den Faden zu verlieren.&lt;/p&gt;
&lt;h2 id="preise"&gt;Preise&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Modell&lt;/th&gt;
&lt;th&gt;Eingabe ($/M Tokens)&lt;/th&gt;
&lt;th&gt;Gecachte Eingabe&lt;/th&gt;
&lt;th&gt;Ausgabe ($/M Tokens)&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="warum-foundry-wichtig-ist"&gt;Warum Foundry wichtig ist&lt;/h2&gt;
&lt;p&gt;Foundry Agent Service ermöglicht es, Agenten in YAML zu definieren oder sie mit Microsoft Agent Framework, GitHub Copilot SDK, LangGraph oder OpenAI Agents SDK zu verbinden — und sie als isolierte gehostete Agenten mit persistentem Dateisystem, eigener Microsoft Entra-Identität und Scale-to-zero-Preisen auszuführen.&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;Du bist ein hilfreicher Assistent.&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;MeinAgent&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;Sieh dir die &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;vollständige Ankündigung&lt;/a&gt; für alle Details an.&lt;/p&gt;</content:encoded></item><item><title>VS Code 1.118: Copilot CLI bekommt Sitzungsnamen, Modell-Badges und TypeScript 7.0 Nightly</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/vscode-1-118-copilot-cli-session-names-model-badge/</guid><description>Visual Studio Code 1.118 ist ein fokussiertes Release mit Copilot CLI-Verbesserungen — Sitzungsbenennung, Modell-Badges, automatische Modellauswahl und TypeScript 7.0 Nightly Opt-in.</description><content:encoded>&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Zur Originalversion &lt;a href="https://thedotnetblog.com/de/posts/emiliano-montesdeoca/vscode-1-118-copilot-cli-session-names-model-badge/"&gt;hier klicken&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; ist ein kleineres, fokussiertes Release — hauptsächlich Copilot CLI-Verfeinerungen — aber ein paar Dinge sind es wert, notiert zu werden.&lt;/p&gt;
&lt;h2 id="copilot-cli-sitzungen-bekommen-echte-namen"&gt;Copilot CLI: Sitzungen bekommen echte Namen&lt;/h2&gt;
&lt;p&gt;Die Sitzungstitel-APIs des Copilot CLI SDK werden jetzt als Quelle der Wahrheit für Sitzungsnamen verwendet. Statt automatisch generierter Labels zeigen Sitzungen jetzt den echten Namen aus dem SDK.&lt;/p&gt;
&lt;h2 id="schneller-zwischen-sitzungen-wechseln"&gt;Schneller zwischen Sitzungen wechseln&lt;/h2&gt;
&lt;p&gt;Die Agents-App hat jetzt &lt;code&gt;Ctrl+1&lt;/code&gt;, &lt;code&gt;Ctrl+2&lt;/code&gt;, usw. für den schnellen Wechsel zwischen Sitzungen belegt. Für Entwickler, die mehrere Copilot CLI-Sitzungen parallel betreiben, spart das viele Mausklicks.&lt;/p&gt;
&lt;h2 id="modell-badges-im-chat"&gt;Modell-Badges im Chat&lt;/h2&gt;
&lt;p&gt;Copilot CLI-Antworten im Chat-Panel zeigen jetzt ein Modell-Badge — auf einen Blick erkennbar, welches Modell jede Anfrage bearbeitet hat.&lt;/p&gt;
&lt;h2 id="automatische-modellauswahl-in-copilot-cli"&gt;Automatische Modellauswahl in Copilot CLI&lt;/h2&gt;
&lt;p&gt;Die automatische Modellauswahl — zuvor in anderen Teilen von Copilot verfügbar — funktioniert jetzt auch im Copilot CLI-Agenten.&lt;/p&gt;
&lt;h2 id="typescript-70-nightly-opt-in"&gt;TypeScript 7.0 Nightly Opt-in&lt;/h2&gt;
&lt;p&gt;Du kannst jetzt direkt über die VS Code-Einstellungen die TypeScript 7.0 Nightlies testen. TypeScript 7.0 ist ein bedeutendes Release (die &lt;a href="https://devblogs.microsoft.com/typescript/announcing-typescript-7-0-beta/"&gt;Beta erschien vor einigen Tagen&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Sieh dir die &lt;a href="https://code.visualstudio.com/updates/v1_118"&gt;vollständigen Release-Notes&lt;/a&gt; an.&lt;/p&gt;</content:encoded></item><item><title>Wo Erinnert sich dein Agent an Dinge? Ein Praxisleitfaden zur Chat-Verlauf-Speicherung</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/chat-history-storage-patterns-agent-framework/</guid><description>Service-managed oder client-managed? Linear oder verzweigend? Die Architekturentscheidung, die bestimmt, was dein KI-Agent wirklich tun kann — mit Code-Beispielen in C# und Python.</description><content:encoded>&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Zur Originalversion &lt;a href="https://thedotnetblog.com/de/posts/emiliano-montesdeoca/chat-history-storage-patterns-agent-framework/"&gt;hier klicken&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Beim Aufbau eines KI-Agenten investierst du die meiste Energie in Modell, Tools und Prompts. Die Frage, &lt;em&gt;wo der Gesprächsverlauf lebt&lt;/em&gt;, scheint ein Implementierungsdetail — ist aber eine der wichtigsten Architekturentscheidungen, die du treffen wirst.&lt;/p&gt;
&lt;p&gt;Sie bestimmt, ob Nutzer Gespräche verzweigen, Antworten rückgängig machen, Sitzungen nach einem Neustart fortsetzen können und ob deine Daten deine Infrastruktur jemals verlassen.&lt;/p&gt;
&lt;h2 id="zwei-grundlegende-muster"&gt;Zwei grundlegende Muster&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Service-managed&lt;/strong&gt;: Der KI-Dienst speichert den Gesprächszustand. Deine App hält eine Referenz und der Dienst fügt automatisch den relevanten Verlauf in jede Anfrage ein.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Client-managed&lt;/strong&gt;: Deine App verwaltet den vollständigen Verlauf und sendet relevante Nachrichten mit jeder Anfrage. Der Dienst ist zustandslos. Du kontrollierst alles.&lt;/p&gt;
&lt;h2 id="wie-agent-framework-das-abstrahiert"&gt;Wie Agent Framework das abstrahiert&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="c1"&gt;// C# — funktioniert gleich, unabhängig vom Provider&lt;/span&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="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;Mein Name ist 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;Wie ist mein Name?&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="c1"&gt;# Python&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="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;Mein Name ist 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;Wie ist mein Name?&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="provider-schnellreferenz"&gt;Provider-Schnellreferenz&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Speicherort&lt;/th&gt;
&lt;th&gt;Modell&lt;/th&gt;
&lt;th&gt;Komprimierung&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;Client&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;Du&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Foundry Agent Service&lt;/td&gt;
&lt;td&gt;Service&lt;/td&gt;
&lt;td&gt;Linear&lt;/td&gt;
&lt;td&gt;Service&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Responses API (Standard)&lt;/td&gt;
&lt;td&gt;Service&lt;/td&gt;
&lt;td&gt;Verzweigend&lt;/td&gt;
&lt;td&gt;Service&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Anthropic Claude, Ollama&lt;/td&gt;
&lt;td&gt;Client&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;Du&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="wie-du-die-wahl-triffst"&gt;Wie du die Wahl triffst&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Brauchst du Verzweigung oder „Rückgängig&amp;quot;?&lt;/strong&gt; → Responses API service-managed&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Brauchst du vollständige Datensouveränität?&lt;/strong&gt; → Client-managed mit datenbankgestütztem Provider&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ist es ein einfacher Chatbot?&lt;/strong&gt; → Service-managed linear reicht&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Brauchst du Portabilität zwischen Providern?&lt;/strong&gt; → Client-managed bietet Portabilität&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Lies den &lt;a href="https://devblogs.microsoft.com/agent-framework/chat-history-storage-patterns-in-microsoft-agent-framework/"&gt;vollständigen Beitrag&lt;/a&gt; für den vollständigen Entscheidungsbaum.&lt;/p&gt;</content:encoded></item><item><title>Aspire 13.2: Bun-Support, bessere Container und weniger Debug-Reibung</title><link>https://thedotnetblog.com/de/posts/emiliano-montesdeoca/aspire-132-bun-container-enhancements/</link><pubDate>Fri, 24 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/de/posts/emiliano-montesdeoca/aspire-132-bun-container-enhancements/</guid><description>Aspire 13.2 fügt erstklassige Bun-Unterstützung für Vite-Apps hinzu, behebt Yarn-Zuverlässigkeit und liefert Container-Verbesserungen, die das lokale Dev-Verhalten vorhersehbarer machen.</description><content:encoded>&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Zur Originalversion &lt;a href="https://thedotnetblog.com/posts/emiliano-montesdeoca/aspire-132-bun-container-enhancements/"&gt;hier klicken&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Wenn du .NET-Backends mit JavaScript-Frontends in Aspire baust, ist 13.2 das Update, das deinen Alltag leise besser macht. Keine neuen Paradigmen. Nur solide Verbesserungen an Dingen, die leicht nervig waren.&lt;/p&gt;
&lt;h2 id="bun-ist-jetzt-erstklassig"&gt;Bun ist jetzt erstklassig&lt;/h2&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="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;withBun&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;Wenn dein Team Bun bereits verwendet, zwingt Aspire dich nicht mehr gegen den Strom zu schwimmen.&lt;/p&gt;
&lt;h2 id="yarn-wurde-zuverlässiger"&gt;Yarn wurde zuverlässiger&lt;/h2&gt;
&lt;p&gt;Yarn-Nutzer bekommen etwas mindestens genauso Wichtiges: weniger mysteriöse Fehler bei &lt;code&gt;withYarn()&lt;/code&gt; mit &lt;code&gt;addViteApp()&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="container-verbesserungen"&gt;Container-Verbesserungen&lt;/h2&gt;
&lt;h3 id="explizite-pull-policy"&gt;Explizite Pull Policy&lt;/h3&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;worker&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;addContainer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;worker&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;myorg/worker:latest&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;withImagePullPolicy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ImagePullPolicy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Never&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;Perfekt für Workflows, wo du lokal Images baust und Compose genau dieses verwenden soll.&lt;/p&gt;
&lt;h3 id="postgresql-18-funktioniert-korrekt"&gt;PostgreSQL 18+ funktioniert korrekt&lt;/h3&gt;
&lt;p&gt;PostgreSQL 18 änderte sein internes Verzeichnislayout, was das Volume-Mapping still brach. 13.2 behebt das.&lt;/p&gt;
&lt;h2 id="debugging-verbesserungen"&gt;Debugging-Verbesserungen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;DebuggerDisplayAttribute&lt;/code&gt; auf Core-Typen — nützliche Werte statt tiefer Objektbäume&lt;/li&gt;
&lt;li&gt;Bessere Fehlermeldungen für &lt;code&gt;WaitFor&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;BeforeResourceStartedEvent&lt;/code&gt; feuert zum richtigen Zeitpunkt&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="fazit"&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Aspire 13.2 ist ein fokussiertes Qualitäts-Release. Originalpost von David Pine: &lt;a href="https://devblogs.microsoft.com/aspire/aspire-bun-support-and-container-enhancements/"&gt;Aspire 13.2: Bun Support and Container Enhancements&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>68 Minuten täglich damit verbracht, Code neu zu erklären? Es gibt eine Lösung</title><link>https://thedotnetblog.com/de/posts/emiliano-montesdeoca/auto-memory-stop-re-explaining-code-to-copilot/</link><pubDate>Thu, 23 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/de/posts/emiliano-montesdeoca/auto-memory-stop-re-explaining-code-to-copilot/</guid><description>Context Rot ist real — dein KI-Agent verliert nach 30 Runden den Faden, und du zahlst stündlich die Kompaktierungssteuer. auto-memory gibt GitHub Copilot CLI chirurgische Erinnerungsfähigkeit ohne tausende Tokens zu verbrennen.</description><content:encoded>&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Zur Originalversion &lt;a href="https://thedotnetblog.com/posts/emiliano-montesdeoca/auto-memory-stop-re-explaining-code-to-copilot/"&gt;hier klicken&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Kennst du den Moment, wenn deine Copilot-Sitzung &lt;code&gt;/compact&lt;/code&gt; trifft und der Agent komplett vergisst, woran du gearbeitet hast? Die nächsten fünf Minuten verbringst du damit, die Dateistruktur, den fehlschlagenden Test und die drei Ansätze, die du bereits versucht hast, neu zu erklären. Dann passiert es wieder. Und wieder.&lt;/p&gt;
&lt;p&gt;Desi Villanueva hat es gemessen: &lt;strong&gt;68 Minuten pro Tag&lt;/strong&gt; — nur für Neuorientierung. Kein Code schreiben. Keine PRs reviewen. Nur die KI über Dinge auf den neuesten Stand bringen, die sie bereits wusste.&lt;/p&gt;
&lt;p&gt;Es stellt sich heraus, dass es dafür einen konkreten Grund gibt — und eine konkrete Lösung.&lt;/p&gt;
&lt;h2 id="die-kontextfenster-lüge"&gt;Die Kontextfenster-Lüge&lt;/h2&gt;
&lt;p&gt;Dein Agent kommt mit einer großen Zahl auf der Verpackung. 200K Tokens. Klingt riesig. In der Praxis ist es eine Obergrenze, keine Garantie.&lt;/p&gt;
&lt;p&gt;Hier ist die tatsächliche Rechnung:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;200K Gesamtkontext&lt;/li&gt;
&lt;li&gt;Minus ~65K für MCP-Tools beim Start (~33%)&lt;/li&gt;
&lt;li&gt;Minus ~10K für Instruktionsdateien wie &lt;code&gt;AGENTS.md&lt;/code&gt; oder &lt;code&gt;copilot-instructions.md&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Das hinterlässt dir etwa &lt;strong&gt;125K bevor du ein einziges Wort schreibst&lt;/strong&gt;. Und es wird schlimmer — LLMs degradieren nicht graceful wenn der Kontext voll wird. Sie stoßen an eine Wand bei etwa 60% Auslastung. Das Modell verliert Dinge, die vor 30 Runden erwähnt wurden, widerspricht früheren Antworten und halluziniert Dateinamen, die es vor 10 Minuten noch selbstsicher angegeben hatte.&lt;/p&gt;
&lt;p&gt;Effektives Limit: &lt;strong&gt;45K Tokens&lt;/strong&gt; bevor die Qualität degradiert. Das sind vielleicht 20-30 Runden aktiver Konversation bevor der Agent anfängt abzudriften.&lt;/p&gt;
&lt;h2 id="die-kompaktierungssteuer"&gt;Die Kompaktierungssteuer&lt;/h2&gt;
&lt;p&gt;Jedes &lt;code&gt;/compact&lt;/code&gt; kostet dich deinen Flow-Zustand. Du bist tief in einer Debugging-Sitzung. Gemeinsamer Kontext über 30 Minuten aufgebaut. Der Agent kennt die Dateistruktur, den fehlschlagenden Test, die Hypothese. Dann kommt die Warnung.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ignorieren → Agent wird progressiv dümmer&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/compact&lt;/code&gt; ausführen → Agent hat eine 2-Absatz-Zusammenfassung einer 30-minütigen Untersuchung&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So oder so verlierst du. So oder so erzählst du dein eigenes Projekt einem neuen Mitarbeiter am ersten Tag nach.&lt;/p&gt;
&lt;p&gt;Das Grausame: &lt;strong&gt;Die Erinnerung existiert bereits.&lt;/strong&gt; Copilot CLI schreibt jede Sitzung in eine lokale SQLite-Datenbank bei &lt;code&gt;~/.copilot/session-store.db&lt;/code&gt;. Der Agent kann sie nur nicht lesen.&lt;/p&gt;
&lt;h2 id="auto-memory-eine-recall-schicht-kein-gedächtnissystem"&gt;auto-memory: Eine Recall-Schicht, Kein Gedächtnissystem&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 auto-memory
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;~1.900 Zeilen Python. Null Abhängigkeiten. In 30 Sekunden installiert.&lt;/p&gt;
&lt;p&gt;Anstatt den Kontext mit Grep-Ergebnissen zu fluten, gibst du dem Agenten chirurgischen Zugriff auf das, was wirklich wichtig ist — &lt;strong&gt;50 Tokens statt 10.000&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="fazit"&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Context Rot ist eine reale architektonische Einschränkung. auto-memory umgeht sie, indem es deinem Agenten einen günstigen, präzisen Recall-Mechanismus gibt. Wenn du ernsthaftes KI-unterstütztes Entwickeln mit GitHub Copilot CLI machst, ist die 30-Sekunden-Installation es wert.&lt;/p&gt;
&lt;p&gt;Schau es dir an: &lt;a href="https://github.com/dezgit2025/auto-memory"&gt;auto-memory auf GitHub&lt;/a&gt;. Original-Post von Desi Villanueva: &lt;a href="https://devblogs.microsoft.com/all-things-azure/i-wasted-68-minutes-a-day-re-explaining-my-code-then-i-built-auto-memory/"&gt;I Wasted 68 Minutes a Day&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>azd-Hooks in Python, TypeScript und .NET: Schluss mit Shell-Skripten</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/azd-hooks-python-javascript-typescript-dotnet/</guid><description>Die Azure Developer CLI unterstützt jetzt Hooks in Python, JavaScript, TypeScript und .NET. Kein Kontextwechsel zu Bash mehr nur für ein Migrations-Skript.</description><content:encoded>&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Für die Originalversion &lt;a href="https://thedotnetblog.com/de/posts/emiliano-montesdeoca/azd-hooks-python-javascript-typescript-dotnet/"&gt;hier klicken&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Wer schon einmal ein vollständig in .NET geschriebenes Projekt hatte und trotzdem Bash-Skripte für azd-Hooks schreiben musste, kennt den Schmerz. Warum in Shell-Syntax wechseln für einen Pre-Provisioning-Schritt, wenn der Rest des Projekts C# ist?&lt;/p&gt;
&lt;p&gt;Diese Frustration hat jetzt eine offizielle Lösung. Die Azure Developer CLI hat &lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-multi-language-hooks/"&gt;Multi-Sprachen-Unterstützung für Hooks eingeführt&lt;/a&gt;, und es ist genauso gut wie es klingt.&lt;/p&gt;
&lt;h2 id="was-sind-hooks"&gt;Was sind Hooks?&lt;/h2&gt;
&lt;p&gt;Hooks sind Skripte, die an wichtigen Punkten im &lt;code&gt;azd&lt;/code&gt;-Lebenszyklus ausgeführt werden — vor dem Provisioning, nach dem Deployment und mehr. Sie werden in &lt;code&gt;azure.yaml&lt;/code&gt; definiert und ermöglichen die Injektion von benutzerdefinierter Logik ohne Änderungen an der CLI.&lt;/p&gt;
&lt;p&gt;Bisher wurden nur Bash und PowerShell unterstützt. Jetzt kann man &lt;strong&gt;Python, JavaScript, TypeScript oder .NET&lt;/strong&gt; verwenden — und &lt;code&gt;azd&lt;/code&gt; erledigt den Rest automatisch.&lt;/p&gt;
&lt;h2 id="wie-die-erkennung-funktioniert"&gt;Wie die Erkennung funktioniert&lt;/h2&gt;
&lt;p&gt;Man verweist den Hook auf eine Datei, und &lt;code&gt;azd&lt;/code&gt; leitet die Sprache aus der Dateiendung ab:&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;Keine zusätzliche Konfiguration. Bei mehrdeutigen Endungen kann man &lt;code&gt;kind: python&lt;/code&gt; (oder die entsprechende Sprache) explizit angeben.&lt;/p&gt;
&lt;h2 id="sprachspezifische-details"&gt;Sprachspezifische Details&lt;/h2&gt;
&lt;h3 id="python"&gt;Python&lt;/h3&gt;
&lt;p&gt;Eine &lt;code&gt;requirements.txt&lt;/code&gt; oder &lt;code&gt;pyproject.toml&lt;/code&gt; neben dem Skript ablegen (oder in einem übergeordneten Verzeichnis). &lt;code&gt;azd&lt;/code&gt; erstellt automatisch eine virtuelle Umgebung, installiert Abhängigkeiten und führt das Skript aus.&lt;/p&gt;
&lt;h3 id="javascript-und-typescript"&gt;JavaScript und TypeScript&lt;/h3&gt;
&lt;p&gt;Dasselbe Muster — eine &lt;code&gt;package.json&lt;/code&gt; in der Nähe des Skripts, und &lt;code&gt;azd&lt;/code&gt; führt zuerst &lt;code&gt;npm install&lt;/code&gt; aus. Für TypeScript wird &lt;code&gt;npx tsx&lt;/code&gt; verwendet, ohne Kompilierungsschritt und ohne &lt;code&gt;tsconfig.json&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="net"&gt;.NET&lt;/h3&gt;
&lt;p&gt;Zwei Modi verfügbar:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Projektmodus&lt;/strong&gt;: Liegt eine &lt;code&gt;.csproj&lt;/code&gt; neben dem Skript, führt &lt;code&gt;azd&lt;/code&gt; automatisch &lt;code&gt;dotnet restore&lt;/code&gt; und &lt;code&gt;dotnet build&lt;/code&gt; aus.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Single-File-Modus&lt;/strong&gt;: Ab .NET 10+ können eigenständige &lt;code&gt;.cs&lt;/code&gt;-Dateien direkt via &lt;code&gt;dotnet run script.cs&lt;/code&gt; ausgeführt werden. Kein Projektdatei erforderlich.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="executor-spezifische-konfiguration"&gt;Executor-spezifische Konfiguration&lt;/h2&gt;
&lt;p&gt;Jede Sprache unterstützt einen optionalen &lt;code&gt;config&lt;/code&gt;-Block:&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="warum-das-für-net-entwickler-wichtig-ist"&gt;Warum das für .NET-Entwickler wichtig ist&lt;/h2&gt;
&lt;p&gt;Hooks waren der letzte Ort in einem azd-basierten Projekt, der einen Sprachwechsel erzwang. Jetzt kann die gesamte Deployment-Pipeline — App-Code, Infrastrukturskripte und Lifecycle-Hooks — in einer einzigen Sprache leben. Bestehende .NET-Utilities lassen sich in Hooks wiederverwenden, gemeinsame Bibliotheken referenzieren, und Shell-Skript-Pflege entfällt.&lt;/p&gt;
&lt;h2 id="fazit"&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Einer dieser Änderungen, die klein klingen, aber täglich Reibung aus dem azd-Workflow nehmen. Multi-Sprachen-Hook-Unterstützung ist jetzt verfügbar — alle Details im &lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-multi-language-hooks/"&gt;offiziellen Post&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Foundry Toolboxes: Ein einziger Endpunkt für alle Agent-Tools</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/foundry-toolboxes-curate-manage-tools-ai-agents/</guid><description>Microsoft Foundry hat Toolboxes in der Public Preview veröffentlicht — eine Möglichkeit, KI-Agent-Tools über einen einzigen MCP-kompatiblen Endpunkt zu kuratieren, zu verwalten und bereitzustellen.</description><content:encoded>&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Für die Originalversion &lt;a href="https://thedotnetblog.com/de/posts/emiliano-montesdeoca/foundry-toolboxes-curate-manage-tools-ai-agents/"&gt;hier klicken&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Hier ist ein Problem, das banal klingt, bis man es selbst erlebt: Die Organisation baut mehrere KI-Agenten, jeder braucht Tools, und jedes Team verkabelt sie von Grund auf neu. Dieselbe Web-Search-Integration, dieselbe Azure AI Search-Konfiguration, dieselbe GitHub-MCP-Server-Verbindung — aber in einem anderen Repository, von einem anderen Team, mit anderen Credentials und ohne gemeinsame Governance.&lt;/p&gt;
&lt;p&gt;Microsoft Foundry hat soeben &lt;a href="https://devblogs.microsoft.com/foundry/introducing-toolboxes-in-foundry/"&gt;Toolboxes&lt;/a&gt; in der Public Preview veröffentlicht — eine direkte Antwort auf dieses Problem.&lt;/p&gt;
&lt;h2 id="was-ist-eine-toolbox"&gt;Was ist eine Toolbox?&lt;/h2&gt;
&lt;p&gt;Eine Toolbox ist ein benanntes, wiederverwendbares Tool-Bundle, das man einmal in Foundry definiert und über einen einzigen MCP-kompatiblen Endpunkt bereitstellt. Jede Agent-Runtime, die MCP spricht, kann sie konsumieren — kein Lock-in bei Foundry Agents.&lt;/p&gt;
&lt;p&gt;Das Versprechen ist einfach: &lt;strong&gt;build once, consume anywhere&lt;/strong&gt;. Tools definieren, Authentifizierung zentral konfigurieren (OAuth passthrough, Entra Managed Identity), Endpunkt veröffentlichen. Jeder Agent, der diese Tools braucht, verbindet sich einmal und bekommt sie alle.&lt;/p&gt;
&lt;h2 id="die-vier-säulen-zwei-davon-heute-verfügbar"&gt;Die vier Säulen (zwei davon heute verfügbar)&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Säule&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;th&gt;Was sie tut&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;Demnächst&lt;/td&gt;
&lt;td&gt;Genehmigte Tools finden ohne manuelle Suche&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;Heute verfügbar&lt;/td&gt;
&lt;td&gt;Tools in ein wiederverwendbares Bundle kuratieren&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;Heute verfügbar&lt;/td&gt;
&lt;td&gt;Ein MCP-Endpunkt stellt alle Tools bereit&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;Demnächst&lt;/td&gt;
&lt;td&gt;Zentrale Auth + Observability für alle Tool-Calls&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="praktisches-beispiel"&gt;Praktisches Beispiel&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;Dokumentation durchsuchen und auf GitHub-Issues reagieren.&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;Öffentliche Dokumentation suchen&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;Nach der Veröffentlichung liefert Foundry einen einheitlichen Endpunkt. Eine Verbindung, alle Tools.&lt;/p&gt;
&lt;h2 id="kein-lock-in-bei-foundry-agents"&gt;Kein Lock-in bei Foundry Agents&lt;/h2&gt;
&lt;p&gt;Toolboxes werden in Foundry &lt;strong&gt;erstellt und verwaltet&lt;/strong&gt;, aber die Konsumfläche ist das offene MCP-Protokoll. Sie können von Custom Agents mit Microsoft Agent Framework oder LangGraph, GitHub Copilot und anderen MCP-fähigen IDEs sowie jeder anderen MCP-Runtime genutzt werden.&lt;/p&gt;
&lt;h2 id="warum-das-jetzt-wichtig-ist"&gt;Warum das jetzt wichtig ist&lt;/h2&gt;
&lt;p&gt;Die Multi-Agenten-Welle kommt in der Produktion an. Jeder neue Agent ist eine neue Fläche für duplizierte Konfiguration, veraltete Credentials und inkonsistentes Verhalten. Die Build + Consume-Grundlage reicht aus, um mit der Zentralisierung zu beginnen. Wenn die Govern-Säule kommt, hat man eine vollständig beobachtbare, zentral gesteuerte Tool-Schicht für die gesamte Agent-Flotte.&lt;/p&gt;
&lt;h2 id="fazit"&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Das ist noch früh — Public Preview, Python SDK zuerst, mit Discover und Govern noch ausstehend. Aber das Modell ist solide und das MCP-native Design bedeutet, dass es mit den Tools funktioniert, die man bereits aufbaut. Details im &lt;a href="https://devblogs.microsoft.com/foundry/introducing-toolboxes-in-foundry/"&gt;offiziellen Announcement&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Windows App Dev CLI v0.3: F5 aus dem Terminal und UI-Automatisierung für Agenten</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/windows-app-dev-cli-v03-run-ui-automation/</guid><description>Windows App Development CLI v0.3 bringt winapp run für Terminal-basierte Debug-Starts, winapp ui für UI-Automatisierung und ein neues NuGet-Paket, das dotnet run mit gepackten Apps funktioniert.</description><content:encoded>&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Für die Originalversion &lt;a href="https://thedotnetblog.com/de/posts/emiliano-montesdeoca/windows-app-dev-cli-v03-run-ui-automation/"&gt;hier klicken&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Die F5-Erfahrung von Visual Studio ist großartig. Aber VS nur zum Starten und Debuggen einer gepackten Windows-App öffnen zu müssen, ist zu viel — egal ob man in einer CI-Pipeline ist, einen automatisierten Workflow ausführt oder ein KI-Agent die Tests durchführt.&lt;/p&gt;
&lt;p&gt;Windows App Development CLI v0.3 wurde &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;veröffentlicht&lt;/a&gt; und adressiert das direkt mit zwei Hauptfunktionen: &lt;code&gt;winapp run&lt;/code&gt; und &lt;code&gt;winapp ui&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="winapp-run-f5-von-überall"&gt;winapp run: F5 von überall&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;winapp run&lt;/code&gt; nimmt einen ungepackten App-Ordner und ein Manifest und erledigt alles, was VS beim Debug-Start tut: registriert ein Loose-Paket, startet die App und bewahrt den &lt;code&gt;LocalState&lt;/code&gt; zwischen Re-Deploys.&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;# App bauen, dann als gepackte App starten&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;Funktioniert für WinUI, WPF, WinForms, Console, Avalonia und mehr. Die Modi sind für Entwickler und automatisierte Workflows ausgelegt:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--detach&lt;/code&gt;&lt;/strong&gt;: Startet und gibt die Kontrolle sofort an das Terminal zurück. Ideal für CI.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--unregister-on-exit&lt;/code&gt;&lt;/strong&gt;: Räumt das registrierte Paket beim App-Schließen auf.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--debug-output&lt;/code&gt;&lt;/strong&gt;: Erfasst &lt;code&gt;OutputDebugString&lt;/code&gt;-Meldungen und Ausnahmen in Echtzeit. Mit &lt;code&gt;--symbols&lt;/code&gt; werden PDBs vom Microsoft Symbol Server geladen.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="neues-nuget-paket-dotnet-run-für-gepackte-apps"&gt;Neues NuGet-Paket: dotnet run für gepackte Apps&lt;/h2&gt;
&lt;p&gt;Für .NET-Entwickler gibt es ein neues NuGet-Paket: &lt;code&gt;Microsoft.Windows.SDK.BuildTools.WinApp&lt;/code&gt;. Nach der Installation handhabt &lt;code&gt;dotnet run&lt;/code&gt; den gesamten Inner Loop: Build, Loose-Layout-Paket vorbereiten, bei Windows registrieren und starten — alles in einem Schritt.&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;# winapp init erledigt die Einrichtung&lt;/span&gt;
&lt;/span&gt;&lt;/span&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;# Oder direkt installieren&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;p&gt;Funktioniert mit WinUI, WPF, WinForms, Console, Avalonia. Keine manuellen Schritte, nur &lt;code&gt;dotnet run&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="winapp-ui-ui-automatisierung-aus-der-kommandozeile"&gt;winapp ui: UI-Automatisierung aus der Kommandozeile&lt;/h2&gt;
&lt;p&gt;Das ist der Feature, der agentische Szenarien ermöglicht. &lt;code&gt;winapp ui&lt;/code&gt; bietet vollständigen UI-Automatisierungszugriff auf jede laufende Windows-App — WPF, WinForms, Win32, Electron, WinUI3 — direkt aus dem Terminal.&lt;/p&gt;
&lt;p&gt;Was möglich ist:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Alle Fenster der obersten Ebene auflisten&lt;/li&gt;
&lt;li&gt;Den vollständigen UI-Automatisierungsbaum eines Fensters traversieren&lt;/li&gt;
&lt;li&gt;Elemente nach Name, Typ oder Automatisierungs-ID suchen&lt;/li&gt;
&lt;li&gt;Klicken, aufrufen und Werte setzen&lt;/li&gt;
&lt;li&gt;Screenshots aufnehmen&lt;/li&gt;
&lt;li&gt;Auf das Erscheinen von Elementen warten — ideal für Testsynchronisierung&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;winapp ui&lt;/code&gt; und &lt;code&gt;winapp run&lt;/code&gt; kombiniert ergeben einen vollständigen Build → Start → Verifikation-Workflow aus dem Terminal. Ein Agent kann die App ausführen, den UI-Zustand prüfen, programmatisch interagieren und das Ergebnis validieren.&lt;/p&gt;
&lt;h2 id="weitere-neuerungen"&gt;Weitere Neuerungen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;winapp unregister&lt;/code&gt;&lt;/strong&gt;: Entfernt ein sidegeladenes Dev-Paket nach dem Test.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;winapp manifest add-alias&lt;/code&gt;&lt;/strong&gt;: Fügt einen &lt;code&gt;uap5:AppExecutionAlias&lt;/code&gt; hinzu, damit die App per Name aus dem Terminal gestartet werden kann.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tab-Vervollständigung&lt;/strong&gt;: Ein Befehl für die vollständige PowerShell-Vervollständigung.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Package.appxmanifest&lt;/code&gt; als Standard&lt;/strong&gt;: &lt;code&gt;winapp init&lt;/code&gt; erzeugt jetzt &lt;code&gt;Package.appxmanifest&lt;/code&gt; (VS-Konvention) statt &lt;code&gt;appxmanifest.xml&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="installation"&gt;Installation&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;# oder&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;Die CLI ist in Public Preview. Das &lt;a href="https://github.com/microsoft/WinAppCli"&gt;GitHub-Repository&lt;/a&gt; enthält vollständige Dokumentation, und die &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;ursprüngliche Ankündigung&lt;/a&gt; hat alle Details.&lt;/p&gt;</content:encoded></item><item><title>Jetzt patchen: .NET 10.0.7 OOB Sicherheitsupdate für ASP.NET Core Data Protection</title><link>https://thedotnetblog.com/de/posts/emiliano-montesdeoca/dotnet-10-0-7-oob-security-patch-data-protection/</link><pubDate>Wed, 22 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/de/posts/emiliano-montesdeoca/dotnet-10-0-7-oob-security-patch-data-protection/</guid><description>.NET 10.0.7 ist ein Out-of-Band Release, das eine Sicherheitslücke in Microsoft.AspNetCore.DataProtection behebt — der Encryptor berechnete HMAC über falsche Bytes, was zu Privilege Escalation führen konnte.</description><content:encoded>&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Zur Originalversion &lt;a href="https://thedotnetblog.com/posts/emiliano-montesdeoca/dotnet-10-0-7-oob-security-patch-data-protection/"&gt;hier klicken&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Dieses Update ist nicht optional. Wenn deine Anwendung &lt;code&gt;Microsoft.AspNetCore.DataProtection&lt;/code&gt; verwendet, musst du auf 10.0.7 aktualisieren.&lt;/p&gt;
&lt;h2 id="was-passiert-ist"&gt;Was Passiert Ist&lt;/h2&gt;
&lt;p&gt;Nach dem Patch Tuesday Release &lt;code&gt;.NET 10.0.6&lt;/code&gt; berichteten einige Benutzer von Entschlüsselungsfehlern. Während der Untersuchung entdeckte das Team die Sicherheitslücke &lt;strong&gt;CVE-2026-40372&lt;/strong&gt;: Der HMAC-Validierungs-Tag wurde über die &lt;strong&gt;falschen Bytes&lt;/strong&gt; berechnet, was zu Privilege Escalation führen konnte.&lt;/p&gt;
&lt;h2 id="wie-beheben"&gt;Wie Beheben&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dotnet add package Microsoft.AspNetCore.DataProtection --version 10.0.7
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Dann &lt;strong&gt;neu bauen und deployen&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Originalankündigung von Rahul Bhandari: &lt;a href="https://devblogs.microsoft.com/dotnet/dotnet-10-0-7-oob-security-update/"&gt;.NET 10.0.7 Out-of-Band Security Update&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>azd + GitHub Copilot: KI-gestütztes Projekt-Setup und intelligente Fehlerbehandlung</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/azd-copilot-integration-ai-setup-troubleshooting/</guid><description>Die Azure Developer CLI integriert sich jetzt mit GitHub Copilot, um dein Projekt zu scaffolden und Deployment-Fehler zu beheben — alles ohne das Terminal zu verlassen.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Die englische Originalversion findest du &lt;a href="https://thedotnetblog.com/de/posts/emiliano-montesdeoca/azd-copilot-integration-ai-setup-troubleshooting/"&gt;hier&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Du kennst diesen Moment, wenn du eine bestehende App in Azure deployen möchtest und plötzlich auf eine leere &lt;code&gt;azure.yaml&lt;/code&gt; starrst und versuchst zu erinnern, ob deine Express-API Container Apps oder App Service verwenden sollte? Genau dieser Moment wird jetzt deutlich kürzer.&lt;/p&gt;
&lt;p&gt;Die Azure Developer CLI (&lt;code&gt;azd&lt;/code&gt;) integriert sich jetzt mit GitHub Copilot auf zwei sinnvolle Arten: KI-gestütztes Projekt-Scaffolding während &lt;code&gt;azd init&lt;/code&gt; und intelligente Fehlerbehebung, wenn Deployments schiefgehen. Beide Funktionen bleiben vollständig im Terminal — genau dort, wo ich sie haben möchte.&lt;/p&gt;
&lt;h2 id="setup-mit-copilot-während-azd-init"&gt;Setup mit Copilot während azd init&lt;/h2&gt;
&lt;p&gt;Wenn du &lt;code&gt;azd init&lt;/code&gt; ausführst, gibt es jetzt die Option &amp;ldquo;Set up with GitHub Copilot (Preview)&amp;rdquo;. Wähle sie aus, und Copilot analysiert deine Codebasis, um die &lt;code&gt;azure.yaml&lt;/code&gt;, Infrastruktur-Templates und Bicep-Module zu generieren — basierend auf deinem tatsächlichen Code.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;azd init
# Wähle: &amp;#34;Set up with GitHub Copilot (Preview)&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Voraussetzungen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;azd 1.23.11 oder neuer&lt;/strong&gt; — prüfe mit &lt;code&gt;azd version&lt;/code&gt; oder aktualisiere mit &lt;code&gt;azd update&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Aktives GitHub Copilot-Abonnement&lt;/strong&gt; (Individual, Business oder 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; fragt bei Bedarf nach dem Login&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Was ich dabei wirklich nützlich finde: Es funktioniert in beide Richtungen. Baust du von Grund auf neu? Copilot hilft dir, von Anfang an die richtigen Azure-Services einzurichten. Hast du eine bestehende App, die du schon länger deployen wolltest? Zeig Copilot auf sie, und er generiert die Konfiguration, ohne dass du irgendetwas umstrukturieren musst.&lt;/p&gt;
&lt;h3 id="was-es-wirklich-macht"&gt;Was es wirklich macht&lt;/h3&gt;
&lt;p&gt;Angenommen, du hast eine Node.js Express-API mit PostgreSQL-Abhängigkeit. Statt manuell zwischen Container Apps und App Service zu entscheiden und dann Bicep von Grund auf zu schreiben, erkennt Copilot deinen Stack und generiert:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Eine &lt;code&gt;azure.yaml&lt;/code&gt; mit den richtigen &lt;code&gt;language&lt;/code&gt;-, &lt;code&gt;host&lt;/code&gt;- und &lt;code&gt;build&lt;/code&gt;-Einstellungen&lt;/li&gt;
&lt;li&gt;Ein Bicep-Modul für Azure Container Apps&lt;/li&gt;
&lt;li&gt;Ein Bicep-Modul für Azure Database for PostgreSQL&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vor jeder Änderung werden Vorab-Prüfungen durchgeführt — das Git-Arbeitsverzeichnis wird auf Sauberkeit geprüft, und MCP-Server-Tool-Zustimmung wird im Voraus eingeholt. Nichts passiert, ohne dass du genau weißt, was sich ändert.&lt;/p&gt;
&lt;h2 id="copilot-gestützte-fehlerbehebung"&gt;Copilot-gestützte Fehlerbehebung&lt;/h2&gt;
&lt;p&gt;Deployment-Fehler sind unvermeidlich. Fehlende Parameter, Berechtigungsprobleme, SKU-Verfügbarkeitsprobleme — und die Fehlermeldung sagt dir selten das eine, was du wirklich wissen musst: &lt;em&gt;wie du es behebst&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Ohne Copilot sieht die Schleife so aus: Fehler kopieren → Docs durchsuchen → drei irrelevante Stack-Overflow-Antworten lesen → einige &lt;code&gt;az&lt;/code&gt;-CLI-Befehle ausführen → nochmal versuchen und hoffen. Mit Copilot, der in &lt;code&gt;azd&lt;/code&gt; integriert ist, kollabiert diese Schleife. Wenn ein &lt;code&gt;azd&lt;/code&gt;-Befehl fehlschlägt, bietet er sofort vier Optionen an:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Explain&lt;/strong&gt; — Klartextbeschreibung, was schiefgelaufen ist&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Guidance&lt;/strong&gt; — Schritt-für-Schritt-Anweisungen zur Behebung&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Diagnose and Guide&lt;/strong&gt; — vollständige Analyse + Copilot wendet die Lösung an (mit deiner Genehmigung) + optionaler Retry&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Skip&lt;/strong&gt; — selbst lösen&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Das Entscheidende: Copilot hat bereits Kontext über dein Projekt, den fehlgeschlagenen Befehl und die Fehlerausgabe. Seine Vorschläge sind spezifisch für &lt;em&gt;deine Situation&lt;/em&gt;, keine generischen Docs.&lt;/p&gt;
&lt;h3 id="typische-fehler-bei-denen-das-glänzt"&gt;Typische Fehler, bei denen das glänzt&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Ressourcenanbieter nicht registriert:&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ERROR: deployment failed: MissingSubscriptionRegistration:
The subscription is not registered to use namespace &amp;#39;Microsoft.App&amp;#39;.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Das trifft jeden bei einem ersten Deployment in einem neuen Abonnement. Copilot kann den Provider registrieren und das Deployment automatisch neu starten.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SKU nicht verfügbar:&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ERROR: deployment failed: SkuNotAvailable:
The requested VM size &amp;#39;Standard_D2s_v3&amp;#39; is not available in location &amp;#39;westus&amp;#39;.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Copilot erklärt, welche VM-Größe oder Region blockiert ist, und schlägt verfügbare Alternativen vor.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Speicherkontoname bereits vergeben:&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ERROR: deployment failed: StorageAccountAlreadyTaken:
The storage account named &amp;#39;myappstorage&amp;#39; is already taken.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Globale Eindeutigkeit erwischt jeden mindestens einmal. Copilot schlägt vor, deinen Umgebungsnamen oder ein zufälliges Suffix zu deinen Bicep-Parametern hinzuzufügen.&lt;/p&gt;
&lt;h3 id="standardverhalten-konfigurieren"&gt;Standardverhalten konfigurieren&lt;/h3&gt;
&lt;p&gt;Wenn du immer die gleiche Option willst, überspringe den interaktiven Prompt:&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;Werte: &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;. Du kannst auch Auto-Fix und Retry aktivieren:&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;Zurück zum interaktiven Modus jederzeit:&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="fazit"&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Das ist genau die Art von Copilot-Integration, die echten Mehrwert bringt. Probiere es aus, indem du &lt;code&gt;azd update&lt;/code&gt; für die neueste Version ausführst, und verwende dann &lt;code&gt;azd init&lt;/code&gt; für dein nächstes Projekt.&lt;/p&gt;
&lt;p&gt;Den &lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-copilot-integration/"&gt;originalen Ankündigungsbeitrag findest du hier&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Node.js Native Addons in C# mit .NET Native AOT schreiben</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/nodejs-addons-csharp-native-aot/</guid><description>Das C# Dev Kit-Team ersetzte C++ Node.js-Addons durch .NET Native AOT — das Ergebnis ist sauberer, sicherer und benötigt nur das .NET SDK.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Die englische Originalversion findest du &lt;a href="https://thedotnetblog.com/de/posts/emiliano-montesdeoca/nodejs-addons-csharp-native-aot/"&gt;hier&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Dieses Szenario gefällt mir: Ein Team, das an .NET-Tooling arbeitet, hatte native Node.js-Addons, die in C++ geschrieben und über &lt;code&gt;node-gyp&lt;/code&gt; kompiliert wurden. Es funktionierte. Aber es erforderte Python auf jeder Entwicklermaschine — eine alte Python-Version wohlgemerkt — nur um ein Paket zu bauen, das niemand im Team direkt anfassen würde.&lt;/p&gt;
&lt;p&gt;Also stellten sie eine sehr vernünftige Frage: Wir haben das .NET SDK bereits installiert, warum schreiben wir überhaupt C++?&lt;/p&gt;
&lt;p&gt;Die Antwort war Native AOT, und das Ergebnis ist wirklich elegant. Drew Noakes vom C# Dev Kit-Team hat dokumentiert, wie sie es gemacht haben, und ich denke, es lohnt sich, das zu verstehen — auch wenn du keine VS Code-Extensions baust.&lt;/p&gt;
&lt;h2 id="die-grundidee"&gt;Die Grundidee&lt;/h2&gt;
&lt;p&gt;Ein nativer Node.js-Addon ist eine Shared Library (&lt;code&gt;.dll&lt;/code&gt; unter Windows, &lt;code&gt;.so&lt;/code&gt; unter Linux, &lt;code&gt;.dylib&lt;/code&gt; unter macOS), die Node.js zur Laufzeit laden kann. Die Schnittstelle heißt &lt;a href="https://nodejs.org/api/n-api.html"&gt;N-API&lt;/a&gt; — eine stabile, ABI-kompatible C-API. N-API kümmert sich nicht darum, welche Sprache die Library produziert hat, nur dass sie die richtigen Symbole exportiert.&lt;/p&gt;
&lt;p&gt;.NET Native AOT kann genau das produzieren. Es kompiliert C#-Code ahead-of-time in eine native Shared Library mit beliebigen Einstiegspunkten. Das ist der ganze Trick.&lt;/p&gt;
&lt;h2 id="projekt-setup"&gt;Projekt-Setup&lt;/h2&gt;
&lt;p&gt;Die Projektdatei ist minimal:&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; weist das SDK an, bei &lt;code&gt;dotnet publish&lt;/code&gt; eine Shared Library zu produzieren. &lt;code&gt;AllowUnsafeBlocks&lt;/code&gt; wird für das N-API-Interop mit Funktionszeigern und Fixed Buffers benötigt.&lt;/p&gt;
&lt;h2 id="den-einstiegspunkt-exportieren"&gt;Den Einstiegspunkt exportieren&lt;/h2&gt;
&lt;p&gt;Node.js erwartet, dass deine Library &lt;code&gt;napi_register_module_v1&lt;/code&gt; exportiert. In C# macht &lt;code&gt;[UnmanagedCallersOnly]&lt;/code&gt; genau das:&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;static&lt;/span&gt; &lt;span class="kd"&gt;unsafe&lt;/span&gt; &lt;span class="kd"&gt;partial&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;RegistryAddon&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="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;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;Ein paar Dinge, die erwähnenswert sind: &lt;code&gt;nint&lt;/code&gt; ist ein nativer Integer — das verwaltete Äquivalent von &lt;code&gt;intptr_t&lt;/code&gt;. Das &lt;code&gt;u8&lt;/code&gt;-Suffix produziert einen &lt;code&gt;ReadOnlySpan&amp;lt;byte&amp;gt;&lt;/code&gt; mit einem UTF-8-String-Literal, direkt an N-API übergeben ohne jede Encoding-Allokation. Und &lt;code&gt;[UnmanagedCallersOnly]&lt;/code&gt; exportiert die Methode mit genau dem Einstiegspunkt-Namen, den Node.js sucht.&lt;/p&gt;
&lt;h2 id="n-api-gegen-den-host-prozess-auflösen"&gt;N-API gegen den Host-Prozess auflösen&lt;/h2&gt;
&lt;p&gt;N-API-Funktionen werden von &lt;code&gt;node.exe&lt;/code&gt; selbst exportiert, nicht von einer separaten Library. Statt gegen etwas zu linken, werden sie beim Start gegen den laufenden Prozess aufgelöst:&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;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&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="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;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;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;static&lt;/span&gt; &lt;span class="n"&gt;nint&lt;/span&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;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;libraryName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Assembly&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;DllImportSearchPath&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;searchPath&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;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;libraryName&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="n"&gt;not&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;node&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="m"&gt;0&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;NativeLibrary&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetMainProgramHandle&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;Damit funktionieren P/Invoke-Deklarationen sauber mit &lt;code&gt;[LibraryImport]&lt;/code&gt; und quellegenerierten Marshalling.&lt;/p&gt;
&lt;h2 id="eine-echte-exportierte-funktion"&gt;Eine echte exportierte Funktion&lt;/h2&gt;
&lt;p&gt;Hier ist der Registry-Reader, den sie gebaut haben:&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(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;private&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;ReadStringValue&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;info&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;try&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;var&lt;/span&gt; &lt;span class="n"&gt;keyPath&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GetStringArg&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;info&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&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;valueName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GetStringArg&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;info&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1&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;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;keyPath&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="p"&gt;||&lt;/span&gt; &lt;span class="n"&gt;valueName&lt;/span&gt; &lt;span class="k"&gt;is&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="n"&gt;ThrowError&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="s"&gt;&amp;#34;Expected two string arguments: keyPath, valueName&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="k"&gt;return&lt;/span&gt; &lt;span class="m"&gt;0&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="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;var&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Registry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CurrentUser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;OpenSubKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;keyPath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;writable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&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;return&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="n"&gt;GetValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;valueName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="k"&gt;value&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;CreateString&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="k"&gt;value&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;GetUndefined&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&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;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Exception&lt;/span&gt; &lt;span class="n"&gt;ex&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;ThrowError&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="s"&gt;$&amp;#34;Registry read failed: {ex.Message}&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="k"&gt;return&lt;/span&gt; &lt;span class="m"&gt;0&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;Wichtiger Hinweis zum &lt;code&gt;try/catch&lt;/code&gt;: Eine unbehandelte Exception in einer &lt;code&gt;[UnmanagedCallersOnly]&lt;/code&gt;-Methode stürzt den Host-Prozess ab. Immer abfangen und via &lt;code&gt;ThrowError&lt;/code&gt; an JavaScript weiterleiten.&lt;/p&gt;
&lt;h2 id="von-typescript-aufrufen"&gt;Von TypeScript aufrufen&lt;/h2&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 class="s1"&gt;&amp;#39;InstallLocation&amp;#39;&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;TypeScript → C#, kein Python, kein C++.&lt;/p&gt;
&lt;h2 id="was-sie-gewonnen-haben"&gt;Was sie gewonnen haben&lt;/h2&gt;
&lt;p&gt;Der sofortige Gewinn war die Contributor-Experience: keine bestimmte Python-Version mehr nötig, &lt;code&gt;yarn install&lt;/code&gt; funktioniert mit Node.js und dem .NET SDK. CI-Pipelines wurden ebenfalls einfacher. Die Performance war vergleichbar mit der C++-Implementierung.&lt;/p&gt;
&lt;h2 id="fazit"&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Das C# Dev Kit-Team ersetzte Python/C++-Overhead durch sauberen C#-Code, den jeder im Team schon kann. Den vollständigen Walkthrough mit allen String-Marshalling-Helfern findest du im &lt;a href="https://devblogs.microsoft.com/dotnet/writing-nodejs-addons-with-dotnet-native-aot/"&gt;Originalartikel auf dem .NET-Blog&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>VS Code 1.117: Agents Bekommen Eigene Git-Branches und Ich Bin Voll Dabei</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/vscode-1-117-agents-autopilot-worktrees/</guid><description>VS Code 1.117 bringt Worktree-Isolation für Agent-Sessions, persistenten Autopilot-Modus und Subagent-Support. Der agentische Coding-Workflow wird jetzt richtig real.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Die Originalversion finden Sie &lt;a href="https://thedotnetblog.com/de/posts/emiliano-montesdeoca/vscode-1-117-agents-autopilot-worktrees/"&gt;hier&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Die Grenze zwischen „KI-Assistent&amp;quot; und „KI-Teamkollege&amp;quot; wird immer dünner. VS Code 1.117 ist gerade erschienen und die &lt;a href="https://code.visualstudio.com/updates/v1_117"&gt;vollständigen Release Notes&lt;/a&gt; sind vollgepackt, aber die Geschichte ist klar: Agents werden zu erstklassigen Bürgern in deinem Entwicklungs-Workflow.&lt;/p&gt;
&lt;p&gt;Hier ist, was wirklich zählt.&lt;/p&gt;
&lt;h2 id="autopilot-modus-merkt-sich-endlich-deine-einstellung"&gt;Autopilot-Modus merkt sich endlich deine Einstellung&lt;/h2&gt;
&lt;p&gt;Bisher musstest du Autopilot bei jeder neuen Session neu aktivieren. Nervig. Jetzt bleibt dein Berechtigungsmodus über Sessions hinweg bestehen, und du kannst den Standard konfigurieren.&lt;/p&gt;
&lt;p&gt;Der Agent Host unterstützt drei Session-Konfigurationen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Default&lt;/strong&gt; — Tools fragen vor der Ausführung nach Bestätigung&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bypass&lt;/strong&gt; — genehmigt alles automatisch&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Autopilot&lt;/strong&gt; — vollständig autonom, beantwortet eigene Fragen und macht weiter&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wenn du ein neues .NET-Projekt mit Migrationen, Docker und CI aufbaust — stell es einmal auf Autopilot und vergiss es. Diese Einstellung bleibt.&lt;/p&gt;
&lt;h2 id="worktree--und-git-isolation-für-agent-sessions"&gt;Worktree- und Git-Isolation für Agent-Sessions&lt;/h2&gt;
&lt;p&gt;Das ist der große Wurf. Agent-Sessions unterstützen jetzt volle Worktree- und Git-Isolation. Das bedeutet: Wenn ein Agent an einer Aufgabe arbeitet, bekommt er seinen eigenen Branch und sein eigenes Arbeitsverzeichnis. Dein Hauptbranch bleibt unangetastet.&lt;/p&gt;
&lt;p&gt;Noch besser — Copilot CLI generiert aussagekräftige Branch-Namen für diese Worktree-Sessions. Kein &lt;code&gt;agent-session-abc123&lt;/code&gt; mehr. Du bekommst etwas, das tatsächlich beschreibt, was der Agent tut.&lt;/p&gt;
&lt;p&gt;Für .NET-Entwickler, die mehrere Feature-Branches verwalten oder Bugs fixen, während eine lange Scaffolding-Aufgabe läuft, ist das ein Game Changer. Du kannst einen Agent deine API-Controller in einem Worktree aufbauen lassen, während du ein Problem in der Service-Schicht in einem anderen debuggst. Keine Konflikte. Kein Stashing. Kein Chaos.&lt;/p&gt;
&lt;h2 id="subagents-und-agent-teams"&gt;Subagents und Agent-Teams&lt;/h2&gt;
&lt;p&gt;Das Agent Host Protocol unterstützt jetzt Subagents. Ein Agent kann andere Agents starten, um Teile einer Aufgabe zu übernehmen. Stell dir das als Delegieren vor — dein Haupt-Agent koordiniert, und spezialisierte Agents kümmern sich um die einzelnen Teile.&lt;/p&gt;
&lt;p&gt;Das ist noch früh, aber das Potenzial für .NET-Workflows ist offensichtlich. Stell dir vor, ein Agent kümmert sich um deine EF Core-Migrationen, während ein anderer deine Integrationstests einrichtet. Wir sind noch nicht ganz da, aber dass der Protokoll-Support jetzt landet, bedeutet, dass die Tools schnell folgen werden.&lt;/p&gt;
&lt;h2 id="terminal-output-wird-automatisch-mitgeliefert-wenn-agents-input-senden"&gt;Terminal-Output wird automatisch mitgeliefert, wenn Agents Input senden&lt;/h2&gt;
&lt;p&gt;Klein aber bedeutsam. Wenn ein Agent Input an das Terminal sendet, wird der Terminal-Output jetzt automatisch in den Kontext einbezogen. Vorher musste der Agent eine extra Runde drehen, nur um zu lesen, was passiert ist.&lt;/p&gt;
&lt;p&gt;Wenn du jemals einem Agent zugesehen hast, wie er &lt;code&gt;dotnet build&lt;/code&gt; ausführt, scheitert und dann noch einen Roundtrip braucht, nur um den Fehler zu sehen — diese Reibung ist weg. Er sieht den Output sofort und reagiert.&lt;/p&gt;
&lt;h2 id="die-agents-app-auf-macos-aktualisiert-sich-selbst"&gt;Die Agents-App auf macOS aktualisiert sich selbst&lt;/h2&gt;
&lt;p&gt;Die eigenständige Agents-App auf macOS aktualisiert sich jetzt selbst. Kein manuelles Herunterladen neuer Versionen mehr. Sie bleibt einfach aktuell.&lt;/p&gt;
&lt;h2 id="die-kleineren-dinge-die-es-wert-sind-zu-wissen"&gt;Die kleineren Dinge, die es wert sind zu wissen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;package.json-Hovers&lt;/strong&gt; zeigen jetzt sowohl die installierte Version als auch die neueste verfügbare. Nützlich, wenn du npm-Tooling neben deinen .NET-Projekten verwaltest.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bilder in JSDoc-Kommentaren&lt;/strong&gt; werden in Hovers und Completions korrekt gerendert.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Copilot CLI-Sessions&lt;/strong&gt; zeigen jetzt an, ob sie von VS Code oder extern erstellt wurden — praktisch, wenn du zwischen Terminals springst.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Copilot CLI, Claude Code und Gemini CLI&lt;/strong&gt; werden als Shell-Typen erkannt. Der Editor weiß, was du ausführst.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="das-fazit"&gt;Das Fazit&lt;/h2&gt;
&lt;p&gt;VS Code 1.117 ist kein auffälliger Feature-Dump. Es ist Infrastruktur. Worktree-Isolation, persistente Berechtigungen, Subagent-Protokolle — das sind die Bausteine für einen Workflow, in dem Agents echte, parallele Aufgaben erledigen, ohne deinen Code zu beeinträchtigen.&lt;/p&gt;
&lt;p&gt;Wenn du mit .NET baust und dich noch nicht auf den agentischen Workflow eingelassen hast, ehrlich gesagt, jetzt ist der richtige Zeitpunkt.&lt;/p&gt;</content:encoded></item><item><title>Deine KI-Experimente auf Azure verbrennen Geld — So behebst du das</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/cloud-cost-optimization-ai-workloads-azure/</guid><description>KI-Workloads auf Azure können schnell teuer werden. Lass uns darüber reden, was wirklich funktioniert, um die Kosten unter Kontrolle zu halten, ohne deine Entwicklung auszubremsen.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Die Originalversion finden Sie &lt;a href="https://thedotnetblog.com/de/posts/emiliano-montesdeoca/cloud-cost-optimization-ai-workloads-azure/"&gt;hier&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Wenn du gerade KI-gestützte Apps auf Azure baust, ist dir wahrscheinlich etwas aufgefallen: Deine Cloud-Rechnung sieht anders aus als früher. Nicht nur höher — seltsamer. Sprunghaft. Schwer vorhersagbar.&lt;/p&gt;
&lt;p&gt;Microsoft hat gerade einen großartigen Beitrag über &lt;a href="https://azure.microsoft.com/en-us/blog/cloud-cost-optimization-principles-that-still-matter/"&gt;Cloud-Kostenoptimierungsprinzipien, die immer noch wichtig sind&lt;/a&gt; veröffentlicht, und ehrlich gesagt könnte das Timing nicht besser sein. Denn KI-Workloads haben die Spielregeln bei den Kosten verändert.&lt;/p&gt;
&lt;h2 id="warum-ki-workloads-anders-zuschlagen"&gt;Warum KI-Workloads anders zuschlagen&lt;/h2&gt;
&lt;p&gt;Hier ist die Sache. Traditionelle .NET-Workloads sind relativ vorhersagbar. Du kennst deinen App-Service-Tier, du kennst deine SQL-DTUs, du kannst die monatlichen Ausgaben ziemlich genau abschätzen. KI-Workloads? Nicht so sehr.&lt;/p&gt;
&lt;p&gt;Du testest mehrere Modelle, um zu sehen, welches passt. Du fährst GPU-gestützte Infrastruktur für Fine-Tuning hoch. Du machst API-Aufrufe an Azure OpenAI, bei denen der Token-Verbrauch je nach Prompt-Länge und Benutzerverhalten stark variiert. Jedes Experiment kostet echtes Geld, und du führst vielleicht Dutzende durch, bevor du den richtigen Ansatz findest.&lt;/p&gt;
&lt;p&gt;Diese Unvorhersehbarkeit macht Kostenoptimierung kritisch — nicht als Nachgedanke, sondern von Tag eins an.&lt;/p&gt;
&lt;h2 id="management-vs-optimierung--kenne-den-unterschied"&gt;Management vs. Optimierung — kenne den Unterschied&lt;/h2&gt;
&lt;p&gt;Eine Unterscheidung aus dem Artikel, die Entwickler meiner Meinung nach übersehen: Es gibt einen Unterschied zwischen Kosten-&lt;em&gt;Management&lt;/em&gt; und Kosten-&lt;em&gt;Optimierung&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Management bedeutet Tracking und Reporting. Du richtest Budgets in Azure Cost Management ein, bekommst Benachrichtigungen, siehst Dashboards. Das ist die Grundlage.&lt;/p&gt;
&lt;p&gt;Optimierung ist da, wo du tatsächlich Entscheidungen triffst. Brauchst du wirklich diesen S3-Tier, oder würde S1 deine Last bewältigen? Steht diese Always-on-Compute-Instanz am Wochenende untätig herum? Könntest du Spot-Instanzen für deine Trainingsjobs verwenden?&lt;/p&gt;
&lt;p&gt;Als .NET-Entwickler neigen wir dazu, uns auf den Code zu konzentrieren und die Infrastrukturentscheidungen dem „Ops-Team&amp;quot; zu überlassen. Aber wenn du auf Azure deployst, sind diese Entscheidungen auch deine Entscheidungen.&lt;/p&gt;
&lt;h2 id="was-wirklich-funktioniert"&gt;Was wirklich funktioniert&lt;/h2&gt;
&lt;p&gt;Basierend auf dem Artikel und meiner eigenen Erfahrung — das macht den Unterschied:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Wisse, was du ausgibst und wofür.&lt;/strong&gt; Tagge deine Ressourcen. Im Ernst. Wenn du nicht erkennen kannst, welches Projekt oder Experiment dein Budget auffrisst, kannst du nichts optimieren. Azure Cost Management mit ordentlichem Tagging ist dein bester Freund.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Setze Leitplanken, bevor du experimentierst.&lt;/strong&gt; Nutze Azure Policy, um teure SKUs in Dev/Test-Umgebungen einzuschränken. Setze Ausgabenlimits für deine Azure-OpenAI-Deployments. Warte nicht, bis die Rechnung kommt, um festzustellen, dass jemand ein GPU-Cluster über das Wochenende laufen gelassen hat.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dimensioniere kontinuierlich richtig.&lt;/strong&gt; Die VM, die du beim Prototyping ausgewählt hast? Die ist wahrscheinlich falsch für die Produktion. Azure Advisor gibt dir Empfehlungen — schau sie dir tatsächlich an. Überprüfe monatlich, nicht jährlich.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Denke an den Lebenszyklus.&lt;/strong&gt; Entwicklungsressourcen sollten heruntergefahren werden. Testumgebungen müssen nicht 24/7 laufen. Nutze Auto-Shutdown-Richtlinien. Für KI-Workloads im Speziellen solltest du Serverless-Optionen in Betracht ziehen, bei denen du pro Ausführung zahlst, statt Compute warmzuhalten.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Miss den Wert, nicht nur die Kosten.&lt;/strong&gt; Das vergisst man leicht. Ein Modell, das mehr kostet, aber deutlich bessere Ergebnisse liefert, könnte die richtige Wahl sein. Das Ziel ist nicht, am wenigsten auszugeben — sondern klug auszugeben.&lt;/p&gt;
&lt;h2 id="das-fazit"&gt;Das Fazit&lt;/h2&gt;
&lt;p&gt;Cloud-Kostenoptimierung ist kein einmaliges Aufräumen. Es ist eine Gewohnheit. Und da KI-Workloads die Ausgaben unvorhersehbarer machen als je zuvor, erspart dir der frühe Aufbau dieser Gewohnheit schmerzhafte Überraschungen später.&lt;/p&gt;
&lt;p&gt;Wenn du ein .NET-Entwickler bist, der auf Azure baut, fang an, deine Cloud-Rechnung wie deinen Code zu behandeln — überprüfe sie regelmäßig, refaktoriere, wenn es unordentlich wird, und deploye nie, ohne zu verstehen, was es dich kosten wird.&lt;/p&gt;</content:encoded></item><item><title>Foundrys RFT ist jetzt günstiger und intelligenter — Das hat sich geändert</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/foundry-fine-tuning-april-2026-rft-graders/</guid><description>Microsoft Foundry hat diesen Monat drei RFT-Updates veröffentlicht: globales Training für o4-mini, neue GPT-4.1 Model-Grader und einen Best-Practices-Leitfaden, der euch Stunden beim Debugging spart.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Die Originalversion finden Sie &lt;a href="https://thedotnetblog.com/de/posts/emiliano-montesdeoca/foundry-fine-tuning-april-2026-rft-graders/"&gt;hier&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Wenn ihr .NET-Apps entwickelt, die auf fine-getunte Modelle angewiesen sind, solltet ihr die Foundry-Updates dieses Monats im Auge behalten. Reinforcement Fine-Tuning ist jetzt zugänglicher und deutlich günstiger geworden.&lt;/p&gt;
&lt;p&gt;Die vollständigen Details findet ihr in der &lt;a href="https://devblogs.microsoft.com/foundry/whats-new-in-foundry-finetune-april-2026/"&gt;offiziellen Ankündigung&lt;/a&gt;, aber hier ist die praktische Zusammenfassung.&lt;/p&gt;
&lt;h2 id="globales-training-für-o4-mini"&gt;Globales Training für o4-mini&lt;/h2&gt;
&lt;p&gt;o4-mini ist das Go-to-Modell für reasoning-intensive und agentenbasierte Workloads. Die große Neuigkeit: Ihr könnt jetzt Fine-Tuning-Jobs aus über 13 Azure-Regionen starten, mit niedrigeren Pro-Token-Trainingskosten im Vergleich zum Standard-Training. Gleiche Infrastruktur, gleiche Qualität, größere Reichweite.&lt;/p&gt;
&lt;p&gt;Wenn euer Team über verschiedene Regionen verteilt ist, ist das relevant. Ihr seid nicht mehr auf eine Handvoll Regionen zum Trainieren beschränkt.&lt;/p&gt;
&lt;p&gt;Hier ist der REST-API-Aufruf, um einen globalen Trainingsjob zu starten:&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;curl -X POST &lt;span class="s2"&gt;&amp;#34;https://&amp;lt;your-resource&amp;gt;.openai.azure.com/openai/fine_tuning/jobs?api-version=2025-04-01-preview&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -H &lt;span class="s2"&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -H &lt;span class="s2"&gt;&amp;#34;api-key: &lt;/span&gt;&lt;span class="nv"&gt;$AZURE_OPENAI_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -d &lt;span class="s1"&gt;&amp;#39;{
&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;#34;model&amp;#34;: &amp;#34;o4-mini&amp;#34;,
&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;#34;training_file&amp;#34;: &amp;#34;&amp;lt;your-training-file-id&amp;gt;&amp;#34;,
&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;#34;method&amp;#34;: {
&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;#34;type&amp;#34;: &amp;#34;reinforcement&amp;#34;,
&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;#34;reinforcement&amp;#34;: {
&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;#34;grader&amp;#34;: {
&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;#34;type&amp;#34;: &amp;#34;string_check&amp;#34;,
&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;#34;name&amp;#34;: &amp;#34;answer-check&amp;#34;,
&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;#34;input&amp;#34;: &amp;#34;{{sample.output_text}}&amp;#34;,
&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;#34;reference&amp;#34;: &amp;#34;{{item.reference_answer}}&amp;#34;,
&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;#34;operation&amp;#34;: &amp;#34;eq&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&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; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&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;#34;hyperparameters&amp;#34;: {
&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;#34;n_epochs&amp;#34;: 2,
&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;#34;compute_multiplier&amp;#34;: 1.0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&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;#34;trainingType&amp;#34;: &amp;#34;globalstandard&amp;#34;
&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;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Dieses &lt;code&gt;trainingType: globalstandard&lt;/code&gt;-Flag ist der entscheidende Unterschied.&lt;/p&gt;
&lt;h2 id="neue-model-grader-gpt-41-familie"&gt;Neue Model-Grader: GPT-4.1-Familie&lt;/h2&gt;
&lt;p&gt;Grader definieren das Belohnungssignal, gegen das euer Modell optimiert. Bisher waren modellbasierte Grader auf eine kleinere Auswahl von Modellen beschränkt. Jetzt habt ihr drei neue Optionen: GPT-4.1, GPT-4.1-mini und GPT-4.1-nano.&lt;/p&gt;
&lt;p&gt;Wann solltet ihr Model-Grader statt deterministischer Grader verwenden? Wenn eure Aufgabenausgabe offen ist, wenn ihr partielle Bewertung über mehrere Dimensionen braucht, oder wenn ihr agentenbasierte Workflows baut, bei denen die Korrektheit von Tool-Aufrufen vom semantischen Kontext abhängt.&lt;/p&gt;
&lt;p&gt;Die Sache ist — die Tier-Strategie ist praktisch:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GPT-4.1-nano&lt;/strong&gt; für erste Iterationen. Niedrige Kosten, schnelle Feedback-Schleifen.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPT-4.1-mini&lt;/strong&gt; sobald eure Bewertungsrubrik stabil ist und ihr höhere Genauigkeit braucht.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPT-4.1&lt;/strong&gt; für Produktionsbewertung oder komplexe Rubriken, bei denen jede Bewertungsentscheidung zählt.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ihr könnt sogar Grader-Typen in einem einzigen RFT-Job mischen. Verwendet String-Match für die &amp;ldquo;richtige Antwort&amp;rdquo;-Dimension und einen Model-Grader zur Bewertung der Reasoning-Qualität. Diese Flexibilität ist ehrlich gesagt das, was es für echte Workloads nützlich macht.&lt;/p&gt;
&lt;h2 id="die-stolperfalle-beim-rft-datenformat"&gt;Die Stolperfalle beim RFT-Datenformat&lt;/h2&gt;
&lt;p&gt;Hierüber stolpern viele. Das RFT-Datenformat unterscheidet sich von SFT. Die letzte Nachricht in jeder Zeile muss eine User- oder Developer-Rolle haben — nicht Assistant. Die erwartete Antwort kommt in einen Top-Level-Schlüssel wie &lt;code&gt;reference_answer&lt;/code&gt;, auf den der Grader direkt verweist.&lt;/p&gt;
&lt;p&gt;Wenn ihr bisher Supervised Fine-Tuning gemacht habt und auf RFT umsteigen wollt, müsst ihr eure Trainingsdaten umstrukturieren. Überspringt diesen Schritt nicht, sonst schlagen eure Jobs stillschweigend fehl.&lt;/p&gt;
&lt;h2 id="warum-das-für-net-entwickler-wichtig-ist"&gt;Warum das für .NET-Entwickler wichtig ist&lt;/h2&gt;
&lt;p&gt;Wenn ihr fine-getunte Modelle aus euren .NET-Apps über das Azure OpenAI SDK aufruft, bedeutet günstigeres Training, dass ihr aggressiver iterieren könnt. Die Model-Grader-Optionen bedeuten, dass ihr für nuancierte Aufgaben fine-tunen könnt — nicht nur für Exact-Match-Szenarien. Und der Best-Practices-Leitfaden auf &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; wird euch echte Debugging-Zeit sparen.&lt;/p&gt;
&lt;p&gt;Fangt klein an. Zehn bis hundert Samples. Einfacher Grader. Validiert den Loop. Dann skaliert.&lt;/p&gt;</content:encoded></item><item><title>Global Azure Spain 2026</title><link>https://thedotnetblog.com/de/events/global-azure-spain-2026/</link><pubDate>Sat, 18 Apr 2026 00:00:00 +0000</pubDate><guid>https://thedotnetblog.com/de/events/global-azure-spain-2026/</guid><description>Das größte Azure-Community-Event in Spanien — ein ganzer Tag mit Sessions zu Azure, KI, Daten, Sicherheit und Cloud-nativer Entwicklung mit 38 Speakern auf 3 Tracks.</description><content:encoded>&lt;p&gt;Global Azure Spain 2026 findet am &lt;strong&gt;18. April 2026&lt;/strong&gt; im &lt;strong&gt;Kinépolis Diversia&lt;/strong&gt; in Alcobendas, Madrid statt. Es ist das größte Community-Azure-Event in Spanien, mit 38 Speakern auf 3 parallelen Tracks zu KI-Agenten, Azure-Netzwerken, Cosmos DB, Fabric, IoT, Sicherheit und vielem mehr.&lt;/p&gt;
&lt;p&gt;Das Event läuft von &lt;strong&gt;08:30 bis 18:30&lt;/strong&gt; und beinhaltet Keynote, Kaffeepausen, Mittagessen und eine Abschluss-Q&amp;amp;A-Session.&lt;/p&gt;
&lt;h2 id="highlights-der-agenda"&gt;Highlights der Agenda&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Domando Agentes de IA&lt;/strong&gt;: Governance, Tools und APIs mit Azure AI Foundry und Azure API Management&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Construyendo agentes con LibreChat en Azure&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How Can I Steal Your Data with Azure Private Endpoints&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stop Building APIs. Forge Agents with Azure&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agentic DevOps Meets IoT: Real-Time Systems with Fabric and GitHub Copilot&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;El regreso de los tamagotchis!&lt;/strong&gt;: Multi-Agenten-Systeme in Aktion&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Foundry Control Plane como plataforma de Agentes global&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rompiendo el perímetro: Zero Trust aplicado en Azure&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="tickets"&gt;Tickets&lt;/h2&gt;
&lt;p&gt;Die Anmeldung erfolgt als symbolische Spende — der gesamte Ticketpreis geht direkt an &lt;strong&gt;Plan International&lt;/strong&gt; für Kinderrechte und Gleichstellung weltweit. Begrenzte Kapazität, also sicher dir rechtzeitig einen Platz.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.eventbrite.es/e/entradas-global-azure-spain-2026-en-madrid-1981594189564"&gt;Tickets auf Eventbrite&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://globalazure.es/"&gt;Event-Website&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="azure-tour-2026"&gt;Azure Tour 2026&lt;/h2&gt;
&lt;p&gt;Neben Madrid umfasst die Global Azure Tour 2026 auch Stationen in &lt;strong&gt;Zaragoza&lt;/strong&gt;, &lt;strong&gt;Teneriffa&lt;/strong&gt; und &lt;strong&gt;Sevilla&lt;/strong&gt;.&lt;/p&gt;</content:encoded></item><item><title>Docker Sandbox lässt Copilot-Agenten euren Code refactoren — ohne Risiko für eure Maschine</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/copilot-docker-sandbox-agentic-refactoring/</guid><description>Docker Sandbox gibt GitHub Copilot-Agenten eine sichere MicroVM zum freien Refactoring — keine Berechtigungsabfragen, kein Risiko für euren Host. Hier erfahrt ihr, warum das alles verändert für großangelegte .NET-Modernisierung.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Die Originalversion finden Sie &lt;a href="https://thedotnetblog.com/de/posts/emiliano-montesdeoca/copilot-docker-sandbox-agentic-refactoring/"&gt;hier&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Wer Copilots Agent-Modus für mehr als kleine Änderungen genutzt hat, kennt den Schmerz. Jeder Dateischreibvorgang, jeder Terminal-Befehl — wieder eine Berechtigungsabfrage. Jetzt stellt euch das mal bei 50 Projekten vor. Macht keinen Spaß.&lt;/p&gt;
&lt;p&gt;Das Azure-Team hat gerade einen Beitrag über &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 für GitHub Copilot-Agenten&lt;/a&gt; veröffentlicht, und ehrlich gesagt ist das eine der praktischsten Verbesserungen für agentisches Tooling, die ich gesehen habe. Es nutzt MicroVMs, um Copilot eine vollständig isolierte Umgebung zu geben, in der er frei arbeiten kann — Pakete installieren, Builds ausführen, Tests laufen lassen — ohne euer Host-System zu berühren.&lt;/p&gt;
&lt;h2 id="was-docker-sandbox-tatsächlich-bietet"&gt;Was Docker Sandbox tatsächlich bietet&lt;/h2&gt;
&lt;p&gt;Die Kernidee ist simpel: Eine leichtgewichtige MicroVM mit einer vollständigen Linux-Umgebung hochfahren, euren Workspace hineinsynchronisieren und den Copilot-Agenten frei darin arbeiten lassen. Wenn er fertig ist, werden die Änderungen zurücksynchronisiert.&lt;/p&gt;
&lt;p&gt;Das macht es zu mehr als nur &amp;ldquo;Sachen in einem Container ausführen&amp;rdquo;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Bidirektionale Workspace-Synchronisation&lt;/strong&gt;, die absolute Pfade beibehält. Eure Projektstruktur sieht innerhalb der Sandbox identisch aus. Keine pfadbedingten Build-Fehler.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Privater Docker-Daemon&lt;/strong&gt; innerhalb der MicroVM. Der Agent kann Container bauen und ausführen, ohne jemals den Docker-Socket eures Hosts zu mounten. Das ist ein großer Sicherheitsgewinn.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTTP/HTTPS-Filterproxys&lt;/strong&gt;, die kontrollieren, was der Agent im Netzwerk erreichen kann. Ihr entscheidet, welche Registries und Endpoints erlaubt sind. Supply-Chain-Angriffe durch ein fragwürdiges &lt;code&gt;npm install&lt;/code&gt; in der Sandbox? Geblockt.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;YOLO-Modus&lt;/strong&gt; — ja, so nennen sie das wirklich. Der Agent läuft ohne Berechtigungsabfragen, weil er buchstäblich euren Host nicht beschädigen kann. Jede destruktive Aktion ist eingedämmt.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="warum-net-entwickler-aufhorchen-sollten"&gt;Warum .NET-Entwickler aufhorchen sollten&lt;/h2&gt;
&lt;p&gt;Denkt an die Modernisierungsarbeit, vor der so viele Teams gerade stehen. Ihr habt eine .NET-Framework-Solution mit 30 Projekten und müsst auf .NET 9 umsteigen. Das sind hunderte Dateiänderungen — Projektdateien, Namespace-Updates, API-Ersetzungen, NuGet-Migrationen.&lt;/p&gt;
&lt;p&gt;Mit Docker Sandbox könnt ihr einen Copilot-Agenten auf ein Projekt ansetzen, ihn innerhalb der MicroVM frei refactoren lassen, &lt;code&gt;dotnet build&lt;/code&gt; und &lt;code&gt;dotnet test&lt;/code&gt; zur Validierung ausführen und nur die Änderungen übernehmen, die tatsächlich funktionieren. Kein Risiko, dass er versehentlich eure lokale Entwicklungsumgebung zerschießt, während er experimentiert.&lt;/p&gt;
&lt;p&gt;Der Beitrag beschreibt auch den Einsatz einer &lt;strong&gt;Flotte paralleler Agenten&lt;/strong&gt; — jeder in seiner eigenen Sandbox — die gleichzeitig verschiedene Projekte bearbeiten. Für große .NET-Solutions oder Microservice-Architekturen ist das eine massive Zeitersparnis. Ein Agent pro Service, alle isoliert laufend, alle unabhängig validiert.&lt;/p&gt;
&lt;h2 id="der-sicherheitsaspekt-zählt"&gt;Der Sicherheitsaspekt zählt&lt;/h2&gt;
&lt;p&gt;Hier ist der Punkt, den die meisten übersehen: Wenn ihr einem KI-Agenten erlaubt, beliebige Befehle auszuführen, vertraut ihr ihm eure gesamte Maschine an. Docker Sandbox dreht dieses Modell um. Der Agent bekommt volle Autonomie in einer Wegwerfumgebung. Der Netzwerk-Proxy stellt sicher, dass er nur von genehmigten Quellen ziehen kann. Euer Host-Dateisystem, Docker-Daemon und eure Credentials bleiben unangetastet.&lt;/p&gt;
&lt;p&gt;Für Teams mit Compliance-Anforderungen — und das sind die meisten .NET-Unternehmen — ist das der Unterschied zwischen &amp;ldquo;Wir können agentische KI nicht nutzen&amp;rdquo; und &amp;ldquo;Wir können sie sicher einsetzen.&amp;rdquo;&lt;/p&gt;
&lt;h2 id="fazit"&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Docker Sandbox löst die fundamentale Spannung des agentischen Programmierens: Agenten brauchen Freiheit, um nützlich zu sein, aber Freiheit auf eurer Host-Maschine ist gefährlich. MicroVMs geben euch beides. Wenn ihr großangelegtes .NET-Refactoring oder eine Modernisierung plant, lohnt es sich, das jetzt einzurichten. Die Kombination aus Copilots Code-Intelligenz mit einer sicheren Ausführungsumgebung ist genau das, worauf Produktionsteams gewartet haben.&lt;/p&gt;</content:encoded></item><item><title>Hör auf, dein Terminal zu babysitzen: Aspires Detached Mode verändert den Workflow</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/aspire-detached-mode-free-your-terminal/</guid><description>Aspire 13.2 lässt dich deinen AppHost im Hintergrund ausführen und gibt dir dein Terminal zurück. Kombiniert mit neuen CLI-Befehlen und Agent-Unterstützung ist das wichtiger als es klingt.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Die Originalversion finden Sie &lt;a href="https://thedotnetblog.com/de/posts/emiliano-montesdeoca/aspire-detached-mode-free-your-terminal/"&gt;hier&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Jedes Mal, wenn du einen Aspire AppHost startest, ist dein Terminal weg. Gesperrt. Belegt, bis du Ctrl+C drückst. Musst du schnell einen Befehl ausführen? Öffne einen neuen Tab. Willst du Logs prüfen? Noch ein Tab. Es ist eine kleine Reibung, die sich schnell summiert.&lt;/p&gt;
&lt;p&gt;Aspire 13.2 behebt das. James Newton-King hat &lt;a href="https://devblogs.microsoft.com/aspire/aspire-detached-mode-and-process-management/"&gt;alle Details aufgeschrieben&lt;/a&gt;, und ehrlich gesagt ist das eines dieser Features, das sofort verändert, wie man arbeitet.&lt;/p&gt;
&lt;h2 id="detached-mode-ein-befehl-terminal-zurück"&gt;Detached Mode: ein Befehl, Terminal zurück&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;Das ist die Kurzform für &lt;code&gt;aspire run --detach&lt;/code&gt;. Dein AppHost startet im Hintergrund und du bekommst dein Terminal sofort zurück. Keine Extra-Tabs. Kein Terminal-Multiplexer. Einfach dein Prompt, bereit loszulegen.&lt;/p&gt;
&lt;h2 id="laufende-prozesse-verwalten"&gt;Laufende Prozesse verwalten&lt;/h2&gt;
&lt;p&gt;Die Sache ist — im Hintergrund laufen lassen ist nur nützlich, wenn man auch verwalten kann, was da draußen läuft. Aspire 13.2 liefert einen vollständigen Satz an CLI-Befehlen genau dafür:&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;# List all running AppHosts&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;# Inspect the state of a specific AppHost&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;# Stream logs from a running AppHost&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;# Stop a specific 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;p&gt;Das macht die Aspire CLI zu einem echten Prozessmanager. Du kannst mehrere AppHosts starten, ihren Status prüfen, ihre Logs verfolgen und sie herunterfahren — alles aus einer einzigen Terminal-Sitzung.&lt;/p&gt;
&lt;h2 id="kombiniere-es-mit-dem-isolierten-modus"&gt;Kombiniere es mit dem isolierten Modus&lt;/h2&gt;
&lt;p&gt;Der Detached Mode passt natürlich zum isolierten Modus. Willst du zwei Instanzen desselben Projekts im Hintergrund ohne Port-Konflikte laufen lassen?&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;Jede bekommt zufällige Ports, separate Secrets und ihren eigenen Lebenszyklus. Verwende &lt;code&gt;aspire ps&lt;/code&gt;, um beide zu sehen, &lt;code&gt;aspire stop&lt;/code&gt;, um den zu beenden, den du nicht mehr brauchst.&lt;/p&gt;
&lt;h2 id="warum-das-für-coding-agents-riesig-ist"&gt;Warum das für Coding-Agents riesig ist&lt;/h2&gt;
&lt;p&gt;Hier wird es richtig interessant. Ein Coding-Agent, der in deinem Terminal arbeitet, kann jetzt:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Die App mit &lt;code&gt;aspire start&lt;/code&gt; starten&lt;/li&gt;
&lt;li&gt;Ihren Zustand mit &lt;code&gt;aspire describe&lt;/code&gt; abfragen&lt;/li&gt;
&lt;li&gt;Logs mit &lt;code&gt;aspire logs&lt;/code&gt; prüfen, um Probleme zu diagnostizieren&lt;/li&gt;
&lt;li&gt;Sie mit &lt;code&gt;aspire stop&lt;/code&gt; beenden, wenn er fertig ist&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Alles ohne die Terminal-Sitzung zu verlieren. Vor dem Detached Mode hätte sich ein Agent, der deinen AppHost ausführt, aus seinem eigenen Terminal ausgesperrt. Jetzt kann er starten, beobachten, iterieren und aufräumen — genau so, wie man es von einem autonomen Agenten erwartet.&lt;/p&gt;
&lt;p&gt;Das Aspire-Team hat hier bewusst investiert. &lt;code&gt;aspire agent init&lt;/code&gt; richtet eine Aspire-Skill-Datei ein, die Agents diese Befehle beibringt. So können Tools wie Copilots Coding-Agent deine Aspire-Workloads direkt verwalten.&lt;/p&gt;
&lt;h2 id="fazit"&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Der Detached Mode ist ein Workflow-Upgrade, das sich als einfaches Flag tarnt. Du hörst auf, zwischen Terminals zu wechseln, Agents blockieren sich nicht mehr selbst, und die neuen CLI-Befehle geben dir echte Sichtbarkeit über das, was läuft. Es ist praktisch, es ist sauber, und es macht den täglichen Entwicklungszyklus spürbar flüssiger.&lt;/p&gt;
&lt;p&gt;Lies den &lt;a href="https://devblogs.microsoft.com/aspire/aspire-detached-mode-and-process-management/"&gt;vollständigen Beitrag&lt;/a&gt; für alle Details und hole dir Aspire 13.2 mit &lt;code&gt;aspire update --self&lt;/code&gt;.&lt;/p&gt;</content:encoded></item><item><title>Azure MCP Tools sind jetzt in Visual Studio 2022 integriert — Keine Erweiterung erforderlich</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/azure-mcp-tools-built-into-visual-studio-2022/</guid><description>Azure MCP Tools werden als Teil der Azure-Entwicklungsworkload in Visual Studio 2022 ausgeliefert. Über 230 Tools, 45 Azure-Dienste, keine Erweiterungen zu installieren.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Für die Originalversion &lt;a href="https://thedotnetblog.com/de/posts/emiliano-montesdeoca/azure-mcp-tools-built-into-visual-studio-2022/"&gt;hier klicken&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Wenn du die Azure MCP Tools in Visual Studio über die separate Erweiterung benutzt hast, kennst du das Spiel — VSIX installieren, neustarten, hoffen dass nichts kaputtgeht, Versionskonflikte managen. Diese Reibung ist vorbei.&lt;/p&gt;
&lt;p&gt;Yun Jung Choi hat &lt;a href="https://devblogs.microsoft.com/visualstudio/azure-mcp-tools-now-ship-built-into-visual-studio-2022-no-extension-required/"&gt;angekündigt&lt;/a&gt;, dass Azure MCP Tools jetzt direkt als Teil der Azure-Entwicklungsworkload in Visual Studio 2022 ausgeliefert werden. Keine Erweiterung. Kein VSIX. Kein Neustart-Tanz.&lt;/p&gt;
&lt;h2 id="was-das-konkret-bedeutet"&gt;Was das konkret bedeutet&lt;/h2&gt;
&lt;p&gt;Ab Visual Studio 2022 Version 17.14.30 ist der Azure MCP Server in der Azure-Entwicklungsworkload enthalten. Wenn du diese Workload bereits installiert hast, musst du ihn nur in GitHub Copilot Chat aktivieren und fertig.&lt;/p&gt;
&lt;p&gt;Über 230 Tools für 45 Azure-Dienste — direkt aus dem Chat-Fenster zugänglich. Storage Accounts auflisten, eine ASP.NET Core App deployen, App Service Probleme diagnostizieren, Log Analytics abfragen — alles ohne einen Browser-Tab zu öffnen.&lt;/p&gt;
&lt;h2 id="warum-das-wichtiger-ist-als-es-klingt"&gt;Warum das wichtiger ist als es klingt&lt;/h2&gt;
&lt;p&gt;Die Sache mit Entwickler-Tooling ist: Jeder zusätzliche Schritt ist Reibung, und Reibung tötet die Akzeptanz. MCP als separate Erweiterung bedeutete Versionskonflikte, Installationsfehler und eine weitere Sache, die aktuell gehalten werden musste. Die Integration in die Workload bedeutet:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ein einziger Update-Pfad&lt;/strong&gt; über den Visual Studio Installer&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kein Versionsabweichung&lt;/strong&gt; zwischen der Erweiterung und der IDE&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Immer aktuell&lt;/strong&gt; — der MCP Server wird mit den regulären VS-Releases aktualisiert&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Für Teams, die auf Azure standardisieren, ist das ein großer Gewinn. Du installierst die Workload einmal, aktivierst die Tools, und sie sind in jeder Sitzung verfügbar.&lt;/p&gt;
&lt;h2 id="was-du-damit-machen-kannst"&gt;Was du damit machen kannst&lt;/h2&gt;
&lt;p&gt;Die Tools decken den gesamten Entwicklungslebenszyklus über Copilot Chat ab:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Lernen&lt;/strong&gt; — frage nach Azure-Diensten, Best Practices, Architekturmustern&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Entwerfen &amp;amp; Entwickeln&lt;/strong&gt; — erhalte Service-Empfehlungen, konfiguriere App-Code&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deployen&lt;/strong&gt; — provisioniere Ressourcen und deploye direkt aus der IDE&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fehlerbehebung&lt;/strong&gt; — frage Logs ab, prüfe den Ressourcenzustand, diagnostiziere Produktionsprobleme&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ein schnelles Beispiel — tippe das in Copilot Chat:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;List my storage accounts in my current subscription.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Copilot ruft die Azure MCP Tools im Hintergrund auf, fragt deine Subscriptions ab und liefert eine formatierte Liste mit Namen, Standorten und SKUs. Kein Portal nötig.&lt;/p&gt;
&lt;h2 id="so-aktivierst-du-es"&gt;So aktivierst du es&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Update auf Visual Studio 2022 &lt;strong&gt;17.14.30&lt;/strong&gt; oder höher&lt;/li&gt;
&lt;li&gt;Stelle sicher, dass die &lt;strong&gt;Azure development&lt;/strong&gt; Workload installiert ist&lt;/li&gt;
&lt;li&gt;Öffne GitHub Copilot Chat&lt;/li&gt;
&lt;li&gt;Klicke auf den &lt;strong&gt;Select tools&lt;/strong&gt; Button (das Schraubenschlüssel-Symbol)&lt;/li&gt;
&lt;li&gt;Schalte &lt;strong&gt;Azure MCP Server&lt;/strong&gt; ein&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Das war&amp;rsquo;s. Es bleibt über Sitzungen hinweg aktiviert.&lt;/p&gt;
&lt;h2 id="ein-hinweis"&gt;Ein Hinweis&lt;/h2&gt;
&lt;p&gt;Die Tools sind standardmäßig deaktiviert — du musst sie manuell einschalten. Und VS 2026-spezifische Tools sind in VS 2022 nicht verfügbar. Die Verfügbarkeit der Tools hängt auch von deinen Azure-Subscription-Berechtigungen ab, genau wie im Portal.&lt;/p&gt;
&lt;h2 id="das-große-bild"&gt;Das große Bild&lt;/h2&gt;
&lt;p&gt;Das ist Teil eines klaren Trends: MCP wird zum Standard, um Cloud-Tools in Entwickler-IDEs verfügbar zu machen. Wir haben bereits das &lt;a href="https://devblogs.microsoft.com/azure-sdk/announcing-azure-mcp-server-2-0-stable-release/"&gt;stabile Release von Azure MCP Server 2.0&lt;/a&gt; und MCP-Integrationen in VS Code und anderen Editoren gesehen. Die Integration in Visual Studios Workload-System ist die natürliche Weiterentwicklung.&lt;/p&gt;
&lt;p&gt;Für uns .NET-Entwickler, die in Visual Studio leben, entfällt damit ein weiterer Grund, zum Azure Portal zu wechseln. Und ehrlich gesagt, je weniger Tab-Wechsel, desto besser.&lt;/p&gt;</content:encoded></item><item><title>Pin-Clustering landet endlich in .NET MAUI Maps — Eine Property, null Aufwand</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/maui-maps-pin-clustering-finally/</guid><description>.NET MAUI 11 Preview 3 bringt natives Pin-Clustering für das Map-Control. Eine Property, separate Clustering-Gruppen und Tap-Handling — alles eingebaut.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Die Originalversion findest du &lt;a href="https://thedotnetblog.com/de/posts/emiliano-montesdeoca/maui-maps-pin-clustering-finally/"&gt;hier&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Kennst du den Moment, wenn du eine Karte mit hundert Pins lädst und das Ganze zu einem unlesbaren Klumpen wird? Ja, so war die .NET MAUI Maps-Erfahrung bisher. Damit ist jetzt Schluss.&lt;/p&gt;
&lt;p&gt;David Ortinau &lt;a href="https://devblogs.microsoft.com/dotnet/pin-clustering-in-dotnet-maui-maps/"&gt;hat gerade angekündigt&lt;/a&gt;, dass .NET MAUI 11 Preview 3 Pin-Clustering auf Android und iOS/Mac Catalyst out of the box mitliefert. Und das Beste — es ist lächerlich einfach zu aktivieren.&lt;/p&gt;
&lt;h2 id="eine-property-sie-alle-zu-beherrschen"&gt;Eine Property, sie alle zu beherrschen&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;Das war&amp;rsquo;s. Benachbarte Pins werden in Clustern mit einem Zähler-Badge gruppiert. Reinzoomen — sie expandieren. Rauszoomen — sie kollabieren. Genau das Verhalten, das Nutzer von jeder modernen Karte erwarten — und jetzt bekommst du es mit einer einzigen Property.&lt;/p&gt;
&lt;h2 id="unabhängige-clustering-gruppen"&gt;Unabhängige Clustering-Gruppen&lt;/h2&gt;
&lt;p&gt;Hier wird es interessant. Nicht alle Pins sollten zusammen geclustert werden. Cafés und Parks sind verschiedene Dinge, und deine Karte sollte das wissen.&lt;/p&gt;
&lt;p&gt;Die &lt;code&gt;ClusteringIdentifier&lt;/code&gt;-Property ermöglicht es dir, Pins in unabhängige Gruppen zu trennen:&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;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;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;Occidental Square&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.6064&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.3325&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;parks&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;Pins mit demselben Identifier clustern zusammen. Verschiedene Identifier bilden unabhängige Cluster, selbst wenn sie geografisch nah beieinander liegen. Kein Identifier? Standardgruppe. Sauber und vorhersehbar.&lt;/p&gt;
&lt;h2 id="cluster-taps-verarbeiten"&gt;Cluster-Taps verarbeiten&lt;/h2&gt;
&lt;p&gt;Wenn ein Nutzer auf einen Cluster tippt, bekommst du ein &lt;code&gt;ClusterClicked&lt;/code&gt;-Event mit allem, was du brauchst:&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;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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;names&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;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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Suppress default zoom-to-cluster behavior:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// e.Handled = 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;Die Event-Args liefern dir &lt;code&gt;Pins&lt;/code&gt; (die Pins im Cluster), &lt;code&gt;Location&lt;/code&gt; (das geografische Zentrum) und &lt;code&gt;Handled&lt;/code&gt; (auf &lt;code&gt;true&lt;/code&gt; setzen, wenn du den Standard-Zoom überschreiben willst). Einfach, praktisch, genau was man erwartet.&lt;/p&gt;
&lt;h2 id="plattform-details-die-man-kennen-sollte"&gt;Plattform-Details, die man kennen sollte&lt;/h2&gt;
&lt;p&gt;Auf Android verwendet das Clustering einen eigenen Grid-basierten Algorithmus, der bei Zoom-Änderungen neu berechnet — keine externen Abhängigkeiten. Auf iOS und Mac Catalyst wird die native &lt;code&gt;MKClusterAnnotation&lt;/code&gt;-Unterstützung von MapKit genutzt, was flüssige, plattformnative Animationen bedeutet.&lt;/p&gt;
&lt;p&gt;Das ist einer dieser Fälle, in denen das MAUI-Team die richtige Entscheidung getroffen hat — auf die Plattform setzen, wo es Sinn ergibt.&lt;/p&gt;
&lt;h2 id="warum-das-wichtig-ist"&gt;Warum das wichtig ist&lt;/h2&gt;
&lt;p&gt;Pin-Clustering war eines der meistgewünschten Features in .NET MAUI (&lt;a href="https://github.com/dotnet/maui/issues/11811"&gt;Issue #11811&lt;/a&gt;), und das aus gutem Grund. Jede App, die Standorte auf einer Karte zeigt — Lieferverfolgung, Filialfinder, Immobilien — braucht das. Vorher musstest du es selbst bauen oder eine Drittanbieter-Bibliothek einbinden. Jetzt ist es eingebaut.&lt;/p&gt;
&lt;p&gt;Für uns .NET-Entwickler, die plattformübergreifende mobile Apps bauen, ist das genau die Art von Quality-of-Life-Verbesserung, die MAUI zu einer wirklich praktischen Wahl für kartenintensive Szenarien macht.&lt;/p&gt;
&lt;h2 id="loslegen"&gt;Loslegen&lt;/h2&gt;
&lt;p&gt;Installiere &lt;a href="https://dotnet.microsoft.com/download/dotnet/11.0"&gt;.NET 11 Preview 3&lt;/a&gt; und aktualisiere den .NET MAUI Workload. Das &lt;a href="https://github.com/dotnet/maui-samples/tree/main/10.0/UserInterface/Views/Map/MapDemo/WorkingWithMaps"&gt;Maps-Sample&lt;/a&gt; enthält eine neue Clustering-Seite, mit der du sofort loslegen kannst.&lt;/p&gt;
&lt;p&gt;Bau etwas damit — und lass deine Karten endlich atmen.&lt;/p&gt;</content:encoded></item><item><title>.NET April 2026 Servicing — Sicherheitspatches, die du heute einspielen solltest</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/dotnet-april-2026-servicing-security-patches/</guid><description>Das Servicing-Release vom April 2026 behebt 6 CVEs in .NET 10, .NET 9, .NET 8 und .NET Framework — darunter zwei Schwachstellen für Remotecodeausführung.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Für die Originalversion &lt;a href="https://thedotnetblog.com/de/posts/emiliano-montesdeoca/dotnet-april-2026-servicing-security-patches/"&gt;klicke hier&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Die &lt;a href="https://devblogs.microsoft.com/dotnet/dotnet-and-dotnet-framework-april-2026-servicing-updates/"&gt;Servicing-Updates vom April 2026&lt;/a&gt; für .NET und .NET Framework sind da, und dieses Mal sind Sicherheitsfixes dabei, die ihr zeitnah einspielen solltet. Sechs CVEs wurden gepatcht, darunter zwei Schwachstellen für Remotecodeausführung (RCE).&lt;/p&gt;
&lt;h2 id="was-wurde-gepatcht"&gt;Was wurde gepatcht&lt;/h2&gt;
&lt;p&gt;Hier die Kurzübersicht:&lt;/p&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;Betrifft&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;Umgehung von Sicherheitsfunktionen&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;Remotecodeausführung&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;Remotecodeausführung&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;Denial of Service&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;Denial of Service&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;Denial of Service&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;p&gt;Die beiden RCE-CVEs (CVE-2026-32178 und CVE-2026-33116) betreffen die breiteste Palette an .NET-Versionen und sollten Priorität haben.&lt;/p&gt;
&lt;h2 id="aktualisierte-versionen"&gt;Aktualisierte Versionen&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;p&gt;Alle sind über die üblichen Kanäle verfügbar — &lt;a href="https://dotnet.microsoft.com/download/dotnet/10.0"&gt;dotnet.microsoft.com&lt;/a&gt;, Container-Images auf MCR und Linux-Paketmanager.&lt;/p&gt;
&lt;h2 id="was-zu-tun-ist"&gt;Was zu tun ist&lt;/h2&gt;
&lt;p&gt;Aktualisiert eure Projekte und CI/CD-Pipelines auf die neuesten Patch-Versionen. Wenn ihr Container nutzt, zieht die neuesten Images. Wenn ihr .NET Framework einsetzt, prüft die &lt;a href="https://learn.microsoft.com/dotnet/framework/release-notes/release-notes"&gt;.NET Framework Release Notes&lt;/a&gt; für die entsprechenden Patches.&lt;/p&gt;
&lt;p&gt;Für alle, die .NET 10 in Produktion betreiben (es ist das aktuelle Release), ist 10.0.6 ein Pflicht-Update. Gleiches gilt für .NET 9.0.15 und .NET 8.0.26, falls ihr auf diesen LTS-Versionen seid. Zwei RCE-Schwachstellen sind nichts, was man aufschiebt.&lt;/p&gt;</content:encoded></item><item><title>Aspire 13.2 bringt MongoDB EF Core und Azure Data Lake — Zwei Integrationen, die einen Blick wert sind</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/aspire-132-mongodb-efcore-data-lake/</guid><description>Aspire 13.2 fügt MongoDB Entity Framework Core und Azure Data Lake Storage Integrationen mit konfiguationsfreien Health Checks und Service Discovery hinzu. So sehen sie in der Praxis aus.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Für die Originalversion &lt;a href="https://thedotnetblog.com/de/posts/emiliano-montesdeoca/aspire-132-mongodb-efcore-data-lake/"&gt;klicke hier&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Aspire 13.2 ist gerade erschienen mit &lt;a href="https://devblogs.microsoft.com/aspire/aspire-new-database-integrations/"&gt;zwei neuen Datenbank-Integrationen&lt;/a&gt;, die eure Aufmerksamkeit verdienen: MongoDB Entity Framework Core und Azure Data Lake Storage. Wenn ihr EF Core mit MongoDB in einer Aspire-App nutzen wolltet, oder Data-Lake-Workloads mit ordentlichem Service Discovery anbinden müsst, liefert dieses Release beides.&lt;/p&gt;
&lt;h2 id="mongodb-trifft-ef-core-in-aspire"&gt;MongoDB trifft EF Core in Aspire&lt;/h2&gt;
&lt;p&gt;Das ist die Integration, auf die ich mich am meisten freue. Aspire hat MongoDB schon länger unterstützt, aber es war immer der rohe Treiber — kein EF Core, kein &lt;code&gt;DbContext&lt;/code&gt;, keine LINQ-Abfragen gegen eure Dokumente. Jetzt bekommt ihr die volle EF-Core-Erfahrung mit MongoDB, plus Aspires automatische Health Checks und Service Discovery.&lt;/p&gt;
&lt;p&gt;Die Einrichtung folgt dem typischen Aspire-Muster. Im 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;Dann fügt ihr in eurem konsumierenden Projekt die EF Core Integration hinzu:&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;Und registriert euren &lt;code&gt;DbContext&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="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;Ab da ist es Standard-EF-Core. Definiert eure Entities, nutzt euren &lt;code&gt;DbContext&lt;/code&gt; wie mit jedem anderen Provider. Die Integration übernimmt Connection Pooling, OpenTelemetry-Traces und Health Checks im Hintergrund.&lt;/p&gt;
&lt;p&gt;Für .NET-Entwickler, die MongoDB mit dem rohen Treiber genutzt und Connection Strings manuell verdrahtet haben, ist das ein schönes Upgrade. Ihr bekommt die volle EF-Core-Abstraktion, ohne Aspires Service Discovery zu verlieren.&lt;/p&gt;
&lt;h2 id="azure-data-lake-storage-ist-mit-dabei"&gt;Azure Data Lake Storage ist mit dabei&lt;/h2&gt;
&lt;p&gt;Die zweite große Neuerung ist eine &lt;a href="https://aspire.dev/integrations/cloud/azure/azure-storage-datalake/"&gt;Azure Data Lake Storage (ADLS) Integration&lt;/a&gt;. Wenn ihr Datenpipelines, ETL-Prozesse oder Analyseplattformen baut, könnt ihr Data-Lake-Ressourcen jetzt genauso anbinden wie jede andere Aspire-Abhängigkeit.&lt;/p&gt;
&lt;p&gt;Im 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;Im konsumierenden Projekt:&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;Keine manuelle Connection-String-Verwaltung, keine Credential-Suche. Aspire provisioniert Ressourcen und injiziert sie. Für diejenigen von uns, die cloud-native .NET-Apps bauen, die sowohl operative Daten als auch Analyse-Workloads berühren, fühlt sich der Data Lake damit wie ein erstklassiger Bürger im Aspire-Modell an.&lt;/p&gt;
&lt;h2 id="die-kleinen-verbesserungen-die-zählen"&gt;Die kleinen Verbesserungen, die zählen&lt;/h2&gt;
&lt;p&gt;Neben den Hauptfeatures gibt es ein paar Verbesserungen, die erwähnenswert sind:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MongoDB Connection String Fix&lt;/strong&gt; — der Schrägstrich vor dem Datenbanknamen wird jetzt korrekt behandelt. Falls ihr einen Workaround dafür hattet, könnt ihr ihn entfernen&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SQL Server Exports&lt;/strong&gt; — &lt;code&gt;Aspire.Hosting.SqlServer&lt;/code&gt; exportiert jetzt zusätzliche Serverkonfigurationsoptionen für feingranulare Kontrolle&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Emulator-Updates&lt;/strong&gt; — ServiceBus Emulator 2.0.0, App Configuration Emulator 1.0.2, und der Preview-Emulator von CosmosDB enthält jetzt einen Readiness Check&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Azure Managed Redis&lt;/strong&gt; — nutzt jetzt standardmäßig &lt;code&gt;rediss://&lt;/code&gt; (Redis Secure), sodass Verbindungen von Haus aus verschlüsselt sind&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Der letzte Punkt ist subtil, aber wichtig — verschlüsseltes Redis als Standard bedeutet eine Sache weniger, die man in Produktion konfigurieren muss.&lt;/p&gt;
&lt;h2 id="fazit"&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Aspire 13.2 ist ein inkrementelles Release, aber die MongoDB EF Core und Data Lake Integrationen füllen echte Lücken. Wenn ihr auf ordentlichen EF-Core-Support mit MongoDB in Aspire gewartet habt, oder Data Lake als erstklassige Abhängigkeit braucht, &lt;a href="https://get.aspire.dev"&gt;upgradet auf 13.2&lt;/a&gt; und probiert es aus. Der &lt;code&gt;aspire add&lt;/code&gt; Befehl erstellt alles, was ihr braucht.&lt;/p&gt;
&lt;p&gt;Lest die &lt;a href="https://aspire.dev/whats-new/aspire-13-2/#-integrations-updates"&gt;vollständigen Release Notes&lt;/a&gt; für mehr Details und schaut euch die &lt;a href="https://aspire.dev/integrations/gallery/"&gt;Integrationsgalerie&lt;/a&gt; für die komplette Liste an.&lt;/p&gt;</content:encoded></item><item><title>azd update — Ein Befehl für alle deine Paketmanager</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/azd-update-universal-upgrade-command/</guid><description>Die Azure Developer CLI hat jetzt einen universellen Update-Befehl, der unabhängig von der Installationsmethode funktioniert — winget, Homebrew, Chocolatey oder Installationsskript.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Für die Originalversion &lt;a href="https://thedotnetblog.com/de/posts/emiliano-montesdeoca/azd-update-universal-upgrade-command/"&gt;klicke hier&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Kennst du diese Meldung „Eine neue Version von azd ist verfügbar&amp;quot;, die alle paar Wochen auftaucht? Die, die du wegklickst, weil du dich nicht mehr erinnerst, ob du &lt;code&gt;azd&lt;/code&gt; über winget, Homebrew oder dieses curl-Skript installiert hast, das du vor sechs Monaten ausgeführt hast? Ja, das ist jetzt endlich gelöst.&lt;/p&gt;
&lt;p&gt;Microsoft hat &lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-update/"&gt;&lt;code&gt;azd update&lt;/code&gt;&lt;/a&gt; veröffentlicht — ein einziger Befehl, der die Azure Developer CLI auf die neueste Version aktualisiert, unabhängig davon, wie du sie ursprünglich installiert hast. Windows, macOS, Linux — egal. Ein Befehl.&lt;/p&gt;
&lt;h2 id="so-funktionierts"&gt;So funktioniert&amp;rsquo;s&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;Das war&amp;rsquo;s. Wenn du frühen Zugang zu neuen Features möchtest, kannst du auf den täglichen Insiders-Build wechseln:&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;Der Befehl erkennt deine aktuelle Installationsmethode und nutzt im Hintergrund den passenden Update-Mechanismus. Kein „Moment, habe ich auf diesem Rechner winget oder choco benutzt?&amp;quot; mehr.&lt;/p&gt;
&lt;h2 id="der-kleine-haken"&gt;Der kleine Haken&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;azd update&lt;/code&gt; ist ab Version 1.23.x verfügbar. Wenn du eine ältere Version hast, musst du ein letztes manuelles Update mit deiner ursprünglichen Installationsmethode durchführen. Danach übernimmt &lt;code&gt;azd update&lt;/code&gt; alles Weitere.&lt;/p&gt;
&lt;p&gt;Prüfe deine aktuelle Version mit &lt;code&gt;azd version&lt;/code&gt;. Falls du eine Neuinstallation brauchst, hilft dir die &lt;a href="https://learn.microsoft.com/azure/developer/azure-developer-cli/install-azd"&gt;Installationsdokumentation&lt;/a&gt; weiter.&lt;/p&gt;
&lt;h2 id="warum-das-wichtig-ist"&gt;Warum das wichtig ist&lt;/h2&gt;
&lt;p&gt;Es ist eine kleine Verbesserung der Lebensqualität, aber für diejenigen von uns, die &lt;code&gt;azd&lt;/code&gt; täglich zum Deployen von KI-Agenten und Aspire-Apps auf Azure nutzen, bedeutet auf dem neuesten Stand zu sein weniger „dieser Bug war schon in der letzten Version behoben&amp;quot;-Momente. Eine Sache weniger, über die man nachdenken muss.&lt;/p&gt;
&lt;p&gt;Lies die &lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-update/"&gt;vollständige Ankündigung&lt;/a&gt; und Jon Gallants &lt;a href="https://blog.jongallant.com/2026/04/azd-update"&gt;tiefergehende Analyse&lt;/a&gt; für mehr Kontext.&lt;/p&gt;</content:encoded></item><item><title>Azure DevOps Server April 2026 Patch — Fix für PR-Abschluss und Sicherheitsupdates</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/azure-devops-server-april-2026-patch/</guid><description>Azure DevOps Server erhält Patch 3 mit einem Fix für fehlgeschlagene PR-Abschlüsse, verbesserter Abmeldevalidierung und wiederhergestellten GitHub Enterprise Server PAT-Verbindungen.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Für die Originalversion &lt;a href="https://thedotnetblog.com/de/posts/emiliano-montesdeoca/azure-devops-server-april-2026-patch/"&gt;klicke hier&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Kurzer Hinweis für Teams, die selbst gehosteten Azure DevOps Server betreiben: Microsoft hat &lt;a href="https://devblogs.microsoft.com/devops/april-patches-for-azure-devops-server/"&gt;Patch 3 für April 2026&lt;/a&gt; mit drei gezielten Fixes veröffentlicht.&lt;/p&gt;
&lt;h2 id="was-behoben-wurde"&gt;Was behoben wurde&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fehlgeschlagene Pull-Request-Abschlüsse&lt;/strong&gt; — eine Null-Referenz-Ausnahme beim automatischen Abschluss von Work Items konnte dazu führen, dass PR-Merges fehlschlugen. Wenn du auf zufällige Fehler beim PR-Abschluss gestoßen bist, ist das wahrscheinlich die Ursache&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Validierung der Abmelde-Weiterleitung&lt;/strong&gt; — verbesserte Validierung beim Abmelden, um potenziell bösartige Weiterleitungen zu verhindern. Das ist ein Sicherheitsfix, den man zeitnah anwenden sollte&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub Enterprise Server PAT-Verbindungen&lt;/strong&gt; — das Erstellen von Personal-Access-Token-Verbindungen zu GitHub Enterprise Server war defekt, jetzt funktioniert es wieder&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="so-aktualisierst-du"&gt;So aktualisierst du&lt;/h2&gt;
&lt;p&gt;Lade &lt;a href="https://aka.ms/devopsserverpatch3"&gt;Patch 3&lt;/a&gt; herunter und starte den Installer. Um zu überprüfen, ob der Patch angewendet wurde:&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;Wenn du Azure DevOps Server on-premises betreibst, empfiehlt Microsoft dringend, immer auf dem neuesten Patch zu bleiben — sowohl für Sicherheit als auch Zuverlässigkeit. Schau dir die &lt;a href="https://learn.microsoft.com/azure/devops/server/release-notes/azuredevopsserver?view=azure-devops#azure-devops-server-patch-3-release-date-april-14-2026"&gt;Release Notes&lt;/a&gt; für alle Details an.&lt;/p&gt;</content:encoded></item><item><title>Azure Smart Tier ist GA — Automatische Kostenoptimierung für Blob Storage ohne Lifecycle-Regeln</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/azure-smart-tier-blob-storage-ga/</guid><description>Azure Blob Storage Smart Tier ist jetzt allgemein verfügbar und verschiebt Objekte automatisch zwischen Hot-, Cool- und Cold-Tiers basierend auf tatsächlichen Zugriffsmustern — ganz ohne Lifecycle-Regeln.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Für die Originalversion &lt;a href="https://thedotnetblog.com/de/posts/emiliano-montesdeoca/azure-smart-tier-blob-storage-ga/"&gt;klicke hier&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Wenn du jemals Zeit damit verbracht hast, Azure Blob Storage Lifecycle-Richtlinien zu optimieren und dann zugesehen hast, wie sie auseinanderfallen, sobald sich die Zugriffsmuster geändert haben, ist das hier für dich. Microsoft hat gerade die &lt;a href="https://azure.microsoft.com/en-us/blog/optimize-object-storage-costs-automatically-with-smart-tier-now-generally-available/"&gt;allgemeine Verfügbarkeit von Smart Tier&lt;/a&gt; für Azure Blob und Data Lake Storage angekündigt — eine vollständig verwaltete Tiering-Funktion, die Objekte automatisch zwischen Hot-, Cool- und Cold-Tiers basierend auf der tatsächlichen Nutzung verschiebt.&lt;/p&gt;
&lt;h2 id="was-smart-tier-tatsächlich-macht"&gt;Was Smart Tier tatsächlich macht&lt;/h2&gt;
&lt;p&gt;Das Konzept ist einfach: Smart Tier wertet kontinuierlich die letzte Zugriffszeit jedes Objekts in deinem Speicherkonto aus. Häufig abgerufene Daten bleiben in Hot, inaktive Daten werden nach 30 Tagen nach Cool verschoben und nach weiteren 60 Tagen nach Cold. Wenn auf die Daten erneut zugegriffen wird, werden sie sofort wieder auf Hot hochgestuft. Der Zyklus beginnt von vorne.&lt;/p&gt;
&lt;p&gt;Keine Lifecycle-Regeln zu konfigurieren. Keine Vorhersagen von Zugriffsmustern. Kein manuelles Tuning.&lt;/p&gt;
&lt;p&gt;Während der Preview berichtete Microsoft, dass &lt;strong&gt;über 50% der von Smart Tier verwalteten Kapazität automatisch in kühlere Tiers verschoben wurde&lt;/strong&gt; — basierend auf tatsächlichen Zugriffsmustern. Das ist eine deutliche Kostenreduzierung für große Speicherkonten.&lt;/p&gt;
&lt;h2 id="warum-das-für-net-entwickler-wichtig-ist"&gt;Warum das für .NET-Entwickler wichtig ist&lt;/h2&gt;
&lt;p&gt;Wenn du Anwendungen baust, die Logs, Telemetrie, Analysedaten oder irgendeine Art von wachsendem Datenbestand erzeugen — und mal ehrlich, wer tut das nicht? — summieren sich die Speicherkosten schnell. Der traditionelle Ansatz war, Lifecycle-Management-Richtlinien zu schreiben, sie zu testen und dann neu anzupassen, wenn sich die Zugriffsmuster deiner App geändert haben. Smart Tier eliminiert diesen gesamten Workflow.&lt;/p&gt;
&lt;p&gt;Einige praktische Szenarien, in denen das hilft:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Anwendungstelemetrie und Logs&lt;/strong&gt; — Hot beim Debuggen, nach ein paar Wochen kaum noch abgerufen&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Datenpipelines und ETL-Ausgaben&lt;/strong&gt; — während der Verarbeitung stark genutzt, danach meistens Cold&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Benutzergenerierte Inhalte&lt;/strong&gt; — aktuelle Uploads sind Hot, ältere Inhalte kühlen allmählich ab&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Backup- und Archivdaten&lt;/strong&gt; — gelegentlich für Compliance abgerufen, meistens inaktiv&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="einrichtung"&gt;Einrichtung&lt;/h2&gt;
&lt;p&gt;Smart Tier zu aktivieren ist eine einmalige Konfiguration:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Neue Konten&lt;/strong&gt;: Wähle Smart Tier als Standard-Zugangstier während der Erstellung des Speicherkontos (zonale Redundanz erforderlich)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bestehende Konten&lt;/strong&gt;: Wechsle den Blob-Zugangstier von deiner aktuellen Standardeinstellung zu Smart Tier&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Objekte kleiner als 128 KiB bleiben in Hot und verursachen keine Überwachungsgebühr. Für alles andere zahlst du die Standard-Kapazitätstarife für Hot/Cool/Cold — ohne Tier-Übergangsgebühren, ohne Gebühren für vorzeitige Löschung und ohne Datenabrufkosten. Eine monatliche Überwachungsgebühr pro Objekt deckt die Orchestrierung ab.&lt;/p&gt;
&lt;h2 id="der-kompromiss-den-du-kennen-solltest"&gt;Der Kompromiss, den du kennen solltest&lt;/h2&gt;
&lt;p&gt;Die Tiering-Regeln von Smart Tier sind statisch (30 Tage → Cool, 90 Tage → Cold). Wenn du benutzerdefinierte Schwellenwerte brauchst — zum Beispiel nach 7 Tagen für eine bestimmte Workload nach Cool verschieben — sind Lifecycle-Regeln weiterhin der richtige Weg. Und mische nicht beides: Vermeide es, Lifecycle-Regeln auf von Smart Tier verwaltete Objekte anzuwenden, da sie in Konflikt geraten können.&lt;/p&gt;
&lt;h2 id="fazit"&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Das ist nicht revolutionär, aber es löst ein echtes operatives Problem. Wenn du wachsende Blob-Storage-Konten verwaltest und es leid bist, Lifecycle-Richtlinien zu pflegen, &lt;a href="https://learn.microsoft.com/en-us/azure/storage/blobs/access-tiers-smart"&gt;aktiviere Smart Tier&lt;/a&gt; und lass Azure sich darum kümmern. Es ist heute in fast allen zonalen Public-Cloud-Regionen verfügbar.&lt;/p&gt;</content:encoded></item><item><title>Wo solltest du deine KI-Agenten auf Azure hosten? Ein praktischer Entscheidungsleitfaden</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/azure-ai-agent-hosting-options-guide/</guid><description>Azure bietet sechs Möglichkeiten, KI-Agenten zu hosten — von rohen Containern bis hin zu vollständig verwalteten Foundry Hosted Agents. So wählst du die richtige für deine .NET-Workload.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Für die Originalversion &lt;a href="https://thedotnetblog.com/de/posts/emiliano-montesdeoca/azure-ai-agent-hosting-options-guide/"&gt;klicke hier&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Wenn du gerade KI-Agenten mit .NET baust, hast du wahrscheinlich etwas bemerkt: Es gibt &lt;em&gt;viele&lt;/em&gt; Möglichkeiten, sie auf Azure zu hosten. Container Apps, AKS, Functions, App Service, Foundry Agents, Foundry Hosted Agents — und alle klingen vernünftig, bis du tatsächlich einen auswählen musst. Microsoft hat gerade einen &lt;a href="https://devblogs.microsoft.com/all-things-azure/hostedagent/"&gt;umfassenden Leitfaden zum Azure KI-Agenten-Hosting&lt;/a&gt; veröffentlicht, der das klärt, und ich möchte ihn aus der praktischen Perspektive eines .NET-Entwicklers aufschlüsseln.&lt;/p&gt;
&lt;h2 id="die-sechs-optionen-auf-einen-blick"&gt;Die sechs Optionen auf einen Blick&lt;/h2&gt;
&lt;p&gt;So würde ich die Landschaft zusammenfassen:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Option&lt;/th&gt;
&lt;th&gt;Am besten für&lt;/th&gt;
&lt;th&gt;Du verwaltest&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;Volle Container-Kontrolle ohne K8s-Komplexität&lt;/td&gt;
&lt;td&gt;Observability, State, Lifecycle&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, Custom Networking&lt;/td&gt;
&lt;td&gt;Alles (das ist der Punkt)&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;Event-getriebene, kurzlebige Agenten-Tasks&lt;/td&gt;
&lt;td&gt;Kaum etwas — echtes Serverless&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;Einfache HTTP-Agenten, vorhersehbarer Traffic&lt;/td&gt;
&lt;td&gt;Deployment, Scaling-Config&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;Code-optionale Agenten über Portal/SDK&lt;/td&gt;
&lt;td&gt;Fast nichts&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;Custom-Framework-Agenten mit verwalteter Infra&lt;/td&gt;
&lt;td&gt;Nur dein Agenten-Code&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Die ersten vier sind General-Purpose Compute — du &lt;em&gt;kannst&lt;/em&gt; Agenten darauf ausführen, aber sie wurden nicht dafür entwickelt. Die letzten zwei sind agenten-nativ: Sie verstehen Konversationen, Tool-Aufrufe und Agenten-Lifecycles als First-Class-Konzepte.&lt;/p&gt;
&lt;h2 id="foundry-hosted-agents--der-sweet-spot-für-net-agenten-entwickler"&gt;Foundry Hosted Agents — der Sweet Spot für .NET-Agenten-Entwickler&lt;/h2&gt;
&lt;p&gt;Das hat meine Aufmerksamkeit geweckt. Foundry Hosted Agents sitzen genau in der Mitte: Du bekommst die Flexibilität, deinen eigenen Code auszuführen (Semantic Kernel, Agent Framework, LangGraph — was auch immer), aber die Plattform kümmert sich um Infrastruktur, Observability und Konversationsmanagement.&lt;/p&gt;
&lt;p&gt;Das Schlüsselstück ist der &lt;strong&gt;Hosting Adapter&lt;/strong&gt; — eine dünne Abstraktionsschicht, die dein Agenten-Framework mit der Foundry-Plattform verbindet. Für Microsoft Agent Framework sieht das so aus:&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;azure.ai.agentserver.agentframework&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;from_agent_framework&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;ChatAgent&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;chat_client&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;AzureAIAgentClient&lt;/span&gt;&lt;span class="p"&gt;(&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="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;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_local_time&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="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;__main__&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;from_agent_framework&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;)&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Das ist deine gesamte Hosting-Geschichte. Der Adapter übernimmt Protokollübersetzung, Streaming über Server-Sent Events, Konversationsverlauf und OpenTelemetry-Tracing — alles automatisch. Keine Custom Middleware, kein manuelles Plumbing.&lt;/p&gt;
&lt;h2 id="deployment-ist-wirklich-einfach"&gt;Deployment ist wirklich einfach&lt;/h2&gt;
&lt;p&gt;Ich habe vorher Agenten auf Container Apps deployed und es funktioniert, aber man schreibt am Ende viel Glue-Code für State Management und Observability. Mit Hosted Agents und &lt;code&gt;azd&lt;/code&gt; sieht das Deployment so aus:&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;# KI-Agenten-Extension installieren&lt;/span&gt;
&lt;/span&gt;&lt;/span&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;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Von einer Vorlage initialisieren&lt;/span&gt;
&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;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Bauen, pushen, deployen — fertig&lt;/span&gt;
&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;Dieses einzelne &lt;code&gt;azd up&lt;/code&gt; baut deinen Container, pusht ihn zu ACR, provisioniert das Foundry-Projekt, deployed Model-Endpoints und startet deinen Agenten. Fünf Schritte in einem Befehl zusammengefasst.&lt;/p&gt;
&lt;h2 id="integriertes-konversationsmanagement"&gt;Integriertes Konversationsmanagement&lt;/h2&gt;
&lt;p&gt;Das ist der Teil, der in der Produktion am meisten Zeit spart. Anstatt deinen eigenen Konversations-State-Store zu bauen, handhaben Hosted Agents das nativ:&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="c1"&gt;# Eine persistente Konversation erstellen&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;conversation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;openai_client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conversations&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&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="c1"&gt;# Erste Runde&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;response1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;openai_client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;responses&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&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;conversation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;conversation&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&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;extra_body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;agent_reference&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;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;MyAgent&amp;#34;&lt;/span&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;agent_reference&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="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Remember: my favorite number is 42.&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="c1"&gt;# Zweite Runde — Kontext bleibt erhalten&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;response2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;openai_client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;responses&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&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;conversation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;conversation&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&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;extra_body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;agent_reference&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;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;MyAgent&amp;#34;&lt;/span&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;agent_reference&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="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Multiply my favorite number by 10.&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;Kein Redis. Kein Cosmos DB Session Store. Keine Custom Middleware für Nachrichtenserialisierung. Die Plattform kümmert sich einfach darum.&lt;/p&gt;
&lt;h2 id="mein-entscheidungsframework"&gt;Mein Entscheidungsframework&lt;/h2&gt;
&lt;p&gt;Nachdem ich alle sechs Optionen durchgegangen bin, hier mein schnelles mentales Modell:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Brauchst du null Infrastruktur?&lt;/strong&gt; → Foundry Agents (Portal/SDK, keine Container)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hast du Custom-Agenten-Code, willst aber verwaltetes Hosting?&lt;/strong&gt; → Foundry Hosted Agents&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Brauchst du event-getriebene, kurzlebige Agenten-Tasks?&lt;/strong&gt; → Azure Functions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Brauchst du maximale Container-Kontrolle ohne K8s?&lt;/strong&gt; → Container Apps&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Brauchst du strikte Compliance und Multi-Cluster?&lt;/strong&gt; → AKS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hast du einen einfachen HTTP-Agenten mit vorhersehbarem Traffic?&lt;/strong&gt; → App Service&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Für die meisten .NET-Entwickler, die mit Semantic Kernel oder Microsoft Agent Framework bauen, sind Hosted Agents wahrscheinlich der richtige Startpunkt. Du bekommst Scale-to-Zero, integriertes OpenTelemetry, Konversationsmanagement und Framework-Flexibilität — ohne Kubernetes zu verwalten oder deinen eigenen Observability-Stack aufzubauen.&lt;/p&gt;
&lt;h2 id="zum-abschluss"&gt;Zum Abschluss&lt;/h2&gt;
&lt;p&gt;Die Agenten-Hosting-Landschaft auf Azure reift schnell. Wenn du heute ein neues KI-Agenten-Projekt startest, würde ich Foundry Hosted Agents ernsthaft in Betracht ziehen, bevor du aus Gewohnheit zu Container Apps oder AKS greifst. Die verwaltete Infrastruktur spart echte Zeit, und das Hosting-Adapter-Pattern lässt dich deine Framework-Wahl behalten.&lt;/p&gt;
&lt;p&gt;Schau dir den &lt;a href="https://devblogs.microsoft.com/all-things-azure/hostedagent/"&gt;vollständigen Leitfaden von Microsoft&lt;/a&gt; und das &lt;a href="https://github.com/microsoft-foundry/foundry-samples/tree/main/samples/python/hosted-agents"&gt;Foundry Samples Repo&lt;/a&gt; für funktionierende Beispiele an.&lt;/p&gt;</content:encoded></item><item><title>Agent Skills in .NET sind jetzt richtig flexibel</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/agent-skills-dotnet-three-authoring-patterns/</guid><description>Das Microsoft Agent Framework unterstützt jetzt drei Wege Skills zu erstellen — Dateien, Klassen und Inline-Code — alle über einen einzigen Provider zusammengesetzt. Hier erfahrt ihr warum das wichtig ist und wie ihr jeden Ansatz nutzt.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Für die Originalversion &lt;a href="https://thedotnetblog.com/de/posts/emiliano-montesdeoca/agent-skills-dotnet-three-authoring-patterns/"&gt;hier klicken&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Wenn ihr Agenten mit dem Microsoft Agent Framework baut, kennt ihr den Ablauf: Skills definieren, in einen Provider einbinden und den Agenten entscheiden lassen, welchen er aufruft. Neu ist &lt;em&gt;wie&lt;/em&gt; ihr diese Skills erstellt — und der Flexibilitätssprung ist erheblich.&lt;/p&gt;
&lt;p&gt;Das neueste Update führt drei verschiedene Authoring-Patterns für Agent Skills ein: &lt;strong&gt;dateibasiert&lt;/strong&gt;, &lt;strong&gt;klassenbasiert&lt;/strong&gt; und &lt;strong&gt;inline-codedefiniert&lt;/strong&gt;. Alle drei werden über einen einzigen &lt;code&gt;AgentSkillsProviderBuilder&lt;/code&gt; verbunden, sodass ihr sie ohne Routing-Logik oder speziellen Glue-Code mischen könnt. Ich zeige euch jedes Pattern und wann ihr es einsetzen solltet.&lt;/p&gt;
&lt;h2 id="dateibasierte-skills-der-einstiegspunkt"&gt;Dateibasierte Skills: der Einstiegspunkt&lt;/h2&gt;
&lt;p&gt;Dateibasierte Skills sind genau das, wonach sie klingen — ein Verzeichnis auf der Festplatte mit einer &lt;code&gt;SKILL.md&lt;/code&gt;-Datei, optionalen Scripts und Referenzdokumenten. Die einfachste Art, eurem Agenten neue Fähigkeiten zu geben:&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;Das &lt;code&gt;SKILL.md&lt;/code&gt;-Frontmatter deklariert den Skill-Namen und die Beschreibung, und der Instruktionsabschnitt sagt dem Agenten, wie er Scripts und Referenzen nutzen soll:&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;Dann verbindet ihr es mit &lt;code&gt;SubprocessScriptRunner.RunAsync&lt;/code&gt; für die Script-Ausführung:&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;Der Agent entdeckt den Skill automatisch und ruft das Provisioning-Script auf, wenn er den Kontostatus prüfen muss. Sauber und einfach.&lt;/p&gt;
&lt;h2 id="klassenbasierte-skills-per-nuget-ausliefern"&gt;Klassenbasierte Skills: per NuGet ausliefern&lt;/h2&gt;
&lt;p&gt;Hier wird es für Teams interessant. Klassenbasierte Skills leiten von &lt;code&gt;AgentClassSkill&amp;lt;T&amp;gt;&lt;/code&gt; ab und verwenden Attribute wie &lt;code&gt;[AgentSkillResource]&lt;/code&gt; und &lt;code&gt;[AgentSkillScript]&lt;/code&gt;, damit das Framework alles per Reflection entdeckt:&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;Das Schöne daran: Ein Team kann das als NuGet-Paket verpacken. Ihr fügt es eurem Projekt hinzu, steckt es in den Builder und es funktioniert neben euren dateibasierten Skills ohne Koordination:&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;Beide Skills erscheinen im System-Prompt des Agenten. Der Agent entscheidet basierend auf dem Gespräch, welchen er nutzt — kein Routing-Code nötig.&lt;/p&gt;
&lt;h2 id="inline-skills-die-schnelle-brücke"&gt;Inline Skills: die schnelle Brücke&lt;/h2&gt;
&lt;p&gt;Kennt ihr das, wenn ein anderes Team genau den Skill baut, den ihr braucht, aber erst im nächsten Sprint fertig wird? &lt;code&gt;AgentInlineSkill&lt;/code&gt; ist eure Brücke:&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;Fügt ihn genauso wie die anderen zum Builder hinzu:&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;Wenn das NuGet-Paket irgendwann erscheint, tauscht ihr den Inline-Skill gegen die klassenbasierte Version aus. Der Agent merkt den Unterschied nicht.&lt;/p&gt;
&lt;p&gt;Inline Skills sind aber nicht nur für Brücken. Sie sind auch die richtige Wahl, wenn ihr Skills dynamisch zur Laufzeit generieren müsst — denkt an einen Skill pro Geschäftsbereich aus einer Konfiguration geladen — oder wenn ein Script lokalen State erfassen muss, der nicht in einen DI-Container gehört.&lt;/p&gt;
&lt;h2 id="script-genehmigung-mensch-in-der-schleife"&gt;Script-Genehmigung: Mensch in der Schleife&lt;/h2&gt;
&lt;p&gt;Für uns .NET-Entwickler, die Produktionsagenten bauen, ist das der Teil, der Deployment-Gespräche wirklich freischaltet. Manche Scripts haben echte Konsequenzen — jemanden in Benefits einschreiben, Produktionsinfrastruktur abfragen. Aktiviert &lt;code&gt;UseScriptApproval&lt;/code&gt; und der Agent pausiert vor jeder Script-Ausführung:&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;Wenn der Agent ein Script ausführen will, gibt er stattdessen eine Genehmigungsanfrage zurück. Eure App sammelt die Entscheidung — genehmigen oder ablehnen — und der Agent fährt entsprechend fort. In regulierten Umgebungen ist das der Unterschied zwischen &amp;ldquo;wir können das deployen&amp;rdquo; und &amp;ldquo;die Rechtsabteilung sagt nein.&amp;rdquo;&lt;/p&gt;
&lt;h2 id="warum-diese-kombination-wichtig-ist"&gt;Warum diese Kombination wichtig ist&lt;/h2&gt;
&lt;p&gt;Die echte Stärke liegt nicht in einem einzelnen Authoring-Pattern — sondern in der Komposition. Ihr könnt:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Klein anfangen&lt;/strong&gt; mit einem dateibasierten Skill, die Instruktionen iterieren und ohne C# veröffentlichen&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Wiederverwendbare Skills&lt;/strong&gt; als NuGet-Pakete ausliefern, die andere Teams mit einer Zeile hinzufügen können&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lücken überbrücken&lt;/strong&gt; mit Inline Skills, wenn ihr etwas &lt;em&gt;jetzt&lt;/em&gt; braucht&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gemeinsame Skill-Verzeichnisse filtern&lt;/strong&gt; mit Predicates, damit euer Agent nur das lädt, was er soll&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Menschliche Aufsicht hinzufügen&lt;/strong&gt; für Scripts, die Produktionssysteme berühren&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All das wird über &lt;code&gt;AgentSkillsProviderBuilder&lt;/code&gt; zusammengesetzt. Kein spezielles Routing, keine bedingte Logik, keine Skill-Typ-Prüfungen.&lt;/p&gt;
&lt;h2 id="zum-abschluss"&gt;Zum Abschluss&lt;/h2&gt;
&lt;p&gt;Agent Skills in .NET haben jetzt ein wirklich flexibles Authoring-Modell. Ob ihr ein Solo-Entwickler seid, der mit dateibasierten Skills einen Prototyp skizziert, oder ein Enterprise-Team, das verpackte Fähigkeiten per NuGet ausliefert — die Patterns passen. Und der Script-Genehmigungsmechanismus macht es produktionsreif für Umgebungen, in denen ihr diesen menschlichen Checkpoint braucht.&lt;/p&gt;
&lt;p&gt;Schaut euch die &lt;a href="https://devblogs.microsoft.com/agent-framework/agent-skills-in-net-three-ways-to-author-one-provider-to-run-them/"&gt;Original-Ankündigung&lt;/a&gt; an, die &lt;a href="https://learn.microsoft.com/en-us/agent-framework/agents/skills"&gt;Agent Skills Dokumentation&lt;/a&gt; auf Microsoft Learn und die &lt;a href="https://github.com/microsoft/agent-framework/tree/main/dotnet/samples/02-agents/AgentSkills"&gt;.NET-Beispiele auf GitHub&lt;/a&gt; zum Loslegen.&lt;/p&gt;</content:encoded></item><item><title>Azure MCP Server 2.0 ist da — Self-Hosted Agentic Cloud Automation ist Realität</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/azure-mcp-server-2-self-hosted-agentic-cloud/</guid><description>Azure MCP Server 2.0 wird stabil mit Self-Hosted Remote Deployments, 276 Tools über 57 Azure-Dienste und Enterprise-Grade-Sicherheit — hier ist das, was für .NET-Entwickler zählt, die Agentic Workflows aufbauen.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Für die Originalversion &lt;a href="https://thedotnetblog.com/de/posts/emiliano-montesdeoca/azure-mcp-server-2-self-hosted-agentic-cloud/"&gt;klicke hier&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Falls du in letzter Zeit mit MCP und Azure etwas aufgebaut hast, weißt du wahrscheinlich schon, dass die lokale Erfahrung gut funktioniert. MCP-Server einstöpseln, deinen KI-Agenten mit Azure-Ressourcen kommunizieren lassen, weitermachen. Aber sobald du diese Einrichtung teamübergreifend teilen musst? Da wird es kompliziert.&lt;/p&gt;
&lt;p&gt;Nicht mehr. Azure MCP Server &lt;a href="https://devblogs.microsoft.com/azure-sdk/announcing-azure-mcp-server-2-0-stable-release/"&gt;hat gerade 2.0 Stable erreicht&lt;/a&gt;, und die Hauptfunktion ist genau das, wofür Enterprise-Teams gefragt haben: &lt;strong&gt;Self-Hosted Remote MCP Server Support&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="was-ist-azure-mcp-server"&gt;Was ist Azure MCP Server?&lt;/h2&gt;
&lt;p&gt;Kleine Auffrischung. Azure MCP Server implementiert die &lt;a href="https://modelcontextprotocol.io/docs/getting-started/intro"&gt;Model Context Protocol&lt;/a&gt;-Spezifikation und macht Azure-Funktionen als strukturierte, auffindbare Tools verfügbar, die KI-Agenten aufrufen können. Denk daran als standardisierte Brücke zwischen deinem Agenten und Azure — Bereitstellung, Deployment, Monitoring, Diagnostik, alles über eine einheitliche Schnittstelle.&lt;/p&gt;
&lt;p&gt;Die Zahlen sprechen für sich: &lt;strong&gt;276 MCP Tools über 57 Azure-Dienste&lt;/strong&gt;. Das ist umfangreiche Unterstützung.&lt;/p&gt;
&lt;h2 id="das-wichtigste-self-hosted-remote-deployments"&gt;Das Wichtigste: Self-Hosted Remote Deployments&lt;/h2&gt;
&lt;p&gt;Hier ist die Sache. MCP lokal auf deiner Maschine zu betreiben ist okay für Entwicklung und Experimente. Aber in einem echten Team-Szenario brauchst du:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gemeinsamer Zugriff für Entwickler und interne Agent-Systeme&lt;/li&gt;
&lt;li&gt;Zentralisierte Konfiguration (Mandantenkontext, Abonnement-Standards, Telemetrie)&lt;/li&gt;
&lt;li&gt;Enterprise-Netzwerk- und Richtliniengrenzen&lt;/li&gt;
&lt;li&gt;Integration in CI/CD-Pipelines&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Azure MCP Server 2.0 adressiert das alles. Du kannst es als zentral verwalteten internen Service mit HTTP-basiertem Transport, ordentlicher Authentifizierung und konsistenter Governance bereitstellen.&lt;/p&gt;
&lt;p&gt;Für die Authentifizierung hast du zwei solide Optionen:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Managed Identity&lt;/strong&gt; — wenn neben &lt;a href="https://aka.ms/azmcp/self-host/foundry"&gt;Microsoft Foundry&lt;/a&gt; betrieben&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;On-Behalf-Of (OBO) Flow&lt;/strong&gt; — OpenID Connect Delegation, die Azure APIs mit dem Kontext des angemeldeten Benutzers aufruft&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Dieser OBO-Flow ist besonders interessant für uns .NET-Entwickler. Das bedeutet, dass deine Agentic Workflows mit den eigentlichen Berechtigungen des Benutzers arbeiten können, nicht mit einem überberechtigten Service-Account. Principle of Least Privilege, gleich eingebaut.&lt;/p&gt;
&lt;h2 id="security-hardening"&gt;Security Hardening&lt;/h2&gt;
&lt;p&gt;Das ist nicht nur ein Feature-Release — es ist auch eines für Sicherheit. Das 2.0-Release fügt hinzu:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Stärkere Endpoint-Validierung&lt;/li&gt;
&lt;li&gt;Schutz gegen Injection-Muster in Query-orientierten Tools&lt;/li&gt;
&lt;li&gt;Strengere Isolationskontrollen für Dev-Umgebungen&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Falls du MCP als gemeinsamen Service bereitstellen willst, zählen diese Schutzmaßnahmen. Eine Menge.&lt;/p&gt;
&lt;h2 id="wo-kannst-du-es-verwenden"&gt;Wo kannst du es verwenden?&lt;/h2&gt;
&lt;p&gt;Die Client-Kompatibilität ist breit. Azure MCP Server 2.0 funktioniert mit:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;IDEs&lt;/strong&gt;: VS Code, Visual Studio, IntelliJ, Eclipse, Cursor&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CLI Agents&lt;/strong&gt;: GitHub Copilot CLI, Claude Code&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Standalone&lt;/strong&gt;: lokaler Server für einfache Setups&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Self-Hosted Remote&lt;/strong&gt;: der neue Star von 2.0&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Zusätzlich gibt es Sovereign Cloud Support für Azure US Government und Azure von 21Vianet betrieben, was für regulierte Deployments entscheidend ist.&lt;/p&gt;
&lt;h2 id="warum-das-für-net-entwickler-wichtig-ist"&gt;Warum das für .NET-Entwickler wichtig ist&lt;/h2&gt;
&lt;p&gt;Falls du Agentic Anwendungen mit .NET aufbaust — ob das Semantic Kernel, Microsoft Agent Framework oder deine eigene Orchestrierung ist — gibt dir Azure MCP Server 2.0 eine produktionsreife Möglichkeit, deinen Agenten mit Azure-Infrastruktur zu interagieren. Keine benutzerdefinierten REST-Wrapper. Keine Service-spezifischen Integrationsmuster. Einfach MCP.&lt;/p&gt;
&lt;p&gt;Kombiniert mit der &lt;a href="https://devblogs.microsoft.com/azure-sdk/mcp-as-easy-as-1-2-3-introducing-the-fluent-api-for-mcp-apps/"&gt;Fluent API für MCP Apps&lt;/a&gt;, die vor ein paar Tagen kam, reift das .NET MCP-Ökosystem schnell.&lt;/p&gt;
&lt;h2 id="erste-schritte"&gt;Erste Schritte&lt;/h2&gt;
&lt;p&gt;Wähle deinen Weg:&lt;/p&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; — Quellcode, Docs, alles&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; — containerisiertes Deployment&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://aka.ms/azmcp/download/vscode"&gt;VS Code Extension&lt;/a&gt;&lt;/strong&gt; — IDE-Integration&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://aka.ms/azmcp/self-host"&gt;Self-Hosting Guide&lt;/a&gt;&lt;/strong&gt; — das Flaggschiff-Feature von 2.0&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="zusammenfassung"&gt;Zusammenfassung&lt;/h2&gt;
&lt;p&gt;Azure MCP Server 2.0 ist genau die Art von Infrastruktur-Upgrade, das in einer Demo nicht glamourös aussieht, aber in der Praxis alles verändert. Self-Hosted Remote MCP mit ordnungsgemäßer Authentifizierung, Security Hardening und Sovereign Cloud Support bedeutet, dass MCP bereit für echte Teams ist, die echte Agentic Workflows auf Azure aufbauen. Falls du auf das „Enterprise-Ready&amp;quot;-Signal gewartet hast — das ist es.&lt;/p&gt;</content:encoded></item><item><title>.NET Aspire 13.2 Will der Beste Freund Deines KI-Agenten Sein</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/aspire-agentic-development-build-run-observe/</guid><description>Aspire 13.2 setzt voll auf agentische Entwicklung — strukturierte CLI-Ausgabe, isolierte Ausführungen, selbstheilende Umgebungen und vollständige OpenTelemetry-Daten, damit deine KI-Agenten deine Apps tatsächlich bauen, ausführen und beobachten können.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Die Originalversion finden Sie &lt;a href="https://thedotnetblog.com/de/posts/emiliano-montesdeoca/aspire-agentic-development-build-run-observe/"&gt;hier&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Kennst du den Moment, wenn dein KI-Agent soliden Code schreibt, du begeistert bist, und dann alles zusammenbricht, wenn er versucht, das Ding tatsächlich &lt;em&gt;auszuführen&lt;/em&gt;? Port-Konflikte, Geister-Prozesse, falsche Umgebungsvariablen — plötzlich verbrennt dein Agent Tokens beim Troubleshooting von Startproblemen statt Features zu bauen.&lt;/p&gt;
&lt;p&gt;Das Aspire-Team hat gerade einen &lt;a href="https://devblogs.microsoft.com/aspire/agentic-dev-aspirations/"&gt;wirklich durchdachten Post&lt;/a&gt; über genau dieses Problem veröffentlicht, und ihre Antwort ist überzeugend: Aspire 13.2 ist nicht nur für Menschen konzipiert, sondern auch für KI-Agenten.&lt;/p&gt;
&lt;h2 id="das-problem-ist-real"&gt;Das Problem ist real&lt;/h2&gt;
&lt;p&gt;KI-Agenten sind unglaublich gut im Code schreiben. Aber eine funktionierende Full-Stack-App zu liefern, erfordert viel mehr als nur Dateien zu generieren. Du musst Services in der richtigen Reihenfolge starten, Ports verwalten, Umgebungsvariablen setzen, Datenbanken verbinden und Feedback bekommen, wenn etwas kaputt geht. Im Moment handhaben die meisten Agenten all das durch Trial-and-Error — Befehle ausführen, Fehlerausgaben lesen, es nochmal versuchen.&lt;/p&gt;
&lt;p&gt;Wir packen Markdown-Anleitungen, Custom Skills und Prompts drauf, um sie zu leiten, aber die sind unvorhersehbar, können nicht kompiliert werden und kosten Tokens allein zum Parsen. Das Aspire-Team hat den Kern erkannt: Agenten brauchen &lt;strong&gt;Compiler und strukturierte APIs&lt;/strong&gt;, nicht mehr Markdown.&lt;/p&gt;
&lt;h2 id="aspire-als-agenten-infrastruktur"&gt;Aspire als Agenten-Infrastruktur&lt;/h2&gt;
&lt;p&gt;Das bringt Aspire 13.2 für die agentische Entwicklung mit:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dein gesamter Stack in typisiertem Code.&lt;/strong&gt; Der AppHost definiert deine komplette Topologie — API, Frontend, Datenbank, Cache — in kompilierbarem TypeScript oder 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;Ein Agent kann das lesen, um die App-Topologie zu verstehen, Ressourcen hinzuzufügen, Verbindungen zu verkabeln und &lt;em&gt;zum Verifizieren zu kompilieren&lt;/em&gt;. Der Compiler sagt ihm sofort, wenn etwas falsch ist. Kein Raten, kein Trial-and-Error mit Konfigurationsdateien.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ein Befehl um sie alle zu starten.&lt;/strong&gt; Statt dass Agenten &lt;code&gt;docker compose up&lt;/code&gt;, &lt;code&gt;npm run dev&lt;/code&gt; und Datenbank-Startskripte jonglieren, ist alles einfach &lt;code&gt;aspire start&lt;/code&gt;. Alle Ressourcen starten in der richtigen Reihenfolge, auf den richtigen Ports, mit der richtigen Konfiguration. Langlebige Prozesse blockieren den Agenten auch nicht — Aspire verwaltet sie.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Isolierter Modus für parallele Agenten.&lt;/strong&gt; Mit &lt;code&gt;--isolated&lt;/code&gt; bekommt jeder Aspire-Lauf eigene zufällige Ports und separate User Secrets. Mehrere Agenten arbeiten über Git Worktrees hinweg? Sie kollidieren nicht. Das ist riesig für Tools wie VS Codes Background-Agenten, die parallele Umgebungen aufspannen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Agenten-Augen durch Telemetrie.&lt;/strong&gt; Hier wird es richtig mächtig. Die Aspire CLI stellt während der Entwicklung volle OpenTelemetry-Daten bereit — Traces, Metriken, strukturierte Logs. Dein Agent liest nicht einfach Konsolenausgaben und hofft das Beste. Er kann eine fehlgeschlagene Anfrage über Services hinweg tracen, langsame Endpunkte profilen und genau identifizieren, wo Dinge kaputtgehen. Das ist Observability auf Produktionsniveau in der Entwicklungsschleife.&lt;/p&gt;
&lt;h2 id="die-bowlingbahn-bumper-analogie"&gt;Die Bowlingbahn-Bumper-Analogie&lt;/h2&gt;
&lt;p&gt;Das Aspire-Team nutzt eine großartige Analogie: Denk an Aspire als Bowlingbahn-Bumper für KI-Agenten. Wenn der Agent nicht perfekt ist (und das wird er nicht sein), verhindern die Bumper, dass er Rinnenschüsse wirft. Die Stack-Definition verhindert Fehlkonfiguration, der Compiler fängt Fehler, die CLI übernimmt das Prozessmanagement, und die Telemetrie liefert die Feedback-Schleife.&lt;/p&gt;
&lt;p&gt;Kombiniere das mit etwas wie Playwright CLI, und dein Agent kann deine App tatsächlich &lt;em&gt;benutzen&lt;/em&gt; — durch Flows klicken, das DOM prüfen, kaputte Dinge in der Telemetrie sehen, den Code fixen, neustarten und erneut testen. Bauen, ausführen, beobachten, fixen. Das ist die autonome Entwicklungsschleife, die wir verfolgt haben.&lt;/p&gt;
&lt;h2 id="erste-schritte"&gt;Erste Schritte&lt;/h2&gt;
&lt;p&gt;Neu bei Aspire? Installiere die CLI von &lt;a href="https://get.aspire.dev"&gt;get.aspire.dev&lt;/a&gt; und folge dem &lt;a href="https://aspire.dev/get-started/first-app"&gt;Getting-Started-Guide&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Nutzt du Aspire bereits? Führe &lt;code&gt;aspire update --self&lt;/code&gt; aus, um Version 13.2 zu bekommen, und zeige dann deinem Lieblings-Coding-Agenten dein Repo. Du wirst überrascht sein, wie viel weiter er mit Aspires Leitplanken kommt.&lt;/p&gt;
&lt;h2 id="zusammenfassung"&gt;Zusammenfassung&lt;/h2&gt;
&lt;p&gt;Aspire 13.2 ist nicht mehr nur ein Framework für verteilte Apps — es wird zur essentiellen Agenten-Infrastruktur. Strukturierte Stack-Definitionen, Ein-Befehl-Start, isolierte parallele Ausführungen und Echtzeit-Telemetrie geben KI-Agenten genau das, was sie brauchen, um vom Code-Schreiben zum App-Liefern zu kommen.&lt;/p&gt;
&lt;p&gt;Lies den &lt;a href="https://devblogs.microsoft.com/aspire/agentic-dev-aspirations/"&gt;vollständigen Post&lt;/a&gt; vom Aspire-Team für alle Details und Demo-Videos.&lt;/p&gt;</content:encoded></item><item><title>Agentisches Platform Engineering Wird Realität — Git-APE Zeigt Wie</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/agentic-platform-engineering-git-ape/</guid><description>Microsofts Git-APE-Projekt setzt agentisches Platform Engineering in die Praxis um — mit GitHub Copilot Agents und Azure MCP, um natürlichsprachliche Anfragen in validierte Cloud-Infrastruktur umzuwandeln.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Die Originalversion finden Sie &lt;a href="https://thedotnetblog.com/de/posts/emiliano-montesdeoca/agentic-platform-engineering-git-ape/"&gt;hier&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Platform Engineering war einer dieser Begriffe, die auf Konferenzen toll klingen, aber normalerweise bedeuten: „Wir haben ein internes Portal und einen Terraform-Wrapper gebaut.&amp;quot; Das eigentliche Versprechen — Self-Service-Infrastruktur, die wirklich sicher, kontrolliert und schnell ist — war immer noch ein paar Schritte entfernt.&lt;/p&gt;
&lt;p&gt;Das Azure-Team hat gerade &lt;a href="https://devblogs.microsoft.com/all-things-azure/putting-agentic-platform-engineering-to-the-test/"&gt;Teil 2 ihrer Serie über agentisches Platform Engineering&lt;/a&gt; veröffentlicht, und in diesem Teil geht es um die praktische Umsetzung. Sie nennen es &lt;strong&gt;Git-APE&lt;/strong&gt; (ja, das Akronym ist beabsichtigt), und es ist ein Open-Source-Projekt, das GitHub Copilot Agents plus Azure MCP Server nutzt, um natürlichsprachliche Anfragen in validierte, deployed Infrastruktur umzuwandeln.&lt;/p&gt;
&lt;h2 id="was-git-ape-tatsächlich-macht"&gt;Was Git-APE tatsächlich macht&lt;/h2&gt;
&lt;p&gt;Die Kernidee: Anstatt dass Entwickler Terraform-Module lernen, durch Portal-UIs navigieren oder Tickets beim Platform-Team einreichen, sprechen sie mit einem Copilot-Agenten. Der Agent interpretiert die Absicht, generiert Infrastructure-as-Code, validiert sie gegen Richtlinien und deployt — alles innerhalb von VS Code.&lt;/p&gt;
&lt;p&gt;Hier ist das Setup:&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;Öffne den Workspace in VS Code, und die Agent-Konfigurationsdateien werden automatisch von GitHub Copilot erkannt. Du interagierst direkt mit dem Agenten:&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;Der Agent nutzt Azure MCP Server unter der Haube, um mit Azure-Diensten zu interagieren. Die MCP-Konfiguration in den VS Code-Einstellungen aktiviert spezifische Fähigkeiten:&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;azureMcp.serverMode&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;namespace&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;azureMcp.enabledServices&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="s2"&gt;&amp;#34;deploy&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;bestpractices&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;group&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="s2"&gt;&amp;#34;subscription&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;functionapp&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;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="s2"&gt;&amp;#34;sql&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;monitor&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 class="nt"&gt;&amp;#34;azureMcp.readOnly&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&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="warum-das-wichtig-ist"&gt;Warum das wichtig ist&lt;/h2&gt;
&lt;p&gt;Für diejenigen von uns, die auf Azure bauen, verschiebt dies die Platform-Engineering-Diskussion von „wie bauen wir ein Portal&amp;quot; zu „wie beschreiben wir unsere Leitplanken als APIs.&amp;quot; Wenn die Schnittstelle deiner Plattform ein KI-Agent ist, wird die Qualität deiner Einschränkungen und Richtlinien zum Produkt.&lt;/p&gt;
&lt;p&gt;Der Blog von Teil 1 legte die Theorie dar: gut beschriebene APIs, Kontrollschemata und explizite Leitplanken machen Plattformen agent-ready. Teil 2 beweist, dass es funktioniert, indem tatsächliche Werkzeuge ausgeliefert werden. Der Agent generiert nicht blind Ressourcen — er validiert gegen Best Practices, respektiert Namenskonventionen und wendet die Richtlinien deiner Organisation an.&lt;/p&gt;
&lt;p&gt;Das Aufräumen ist genauso einfach:&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="meine-einschätzung"&gt;Meine Einschätzung&lt;/h2&gt;
&lt;p&gt;Ich bin ehrlich — hier geht es mehr um das Muster als um das spezifische Tool. Git-APE selbst ist eine Demo/Referenzarchitektur. Aber die zugrundeliegende Idee — Agenten als Interface zu deiner Plattform, MCP als Protokoll, GitHub Copilot als Host — ist die Richtung, in die sich die Enterprise-Developer-Experience bewegt.&lt;/p&gt;
&lt;p&gt;Wenn du ein Platform-Team bist, das darüber nachdenkt, wie man interne Werkzeuge agent-freundlich macht, gibt es keinen besseren Startpunkt. Und wenn du ein .NET-Entwickler bist, der sich fragt, wie das mit deiner Welt zusammenhängt: Der Azure MCP Server und GitHub Copilot Agents funktionieren mit jedem Azure-Workload. Deine ASP.NET Core API, dein .NET Aspire Stack, deine containerisierten Microservices — all das kann Ziel eines agentischen Deployment-Flows sein.&lt;/p&gt;
&lt;h2 id="zusammenfassung"&gt;Zusammenfassung&lt;/h2&gt;
&lt;p&gt;Git-APE ist ein früher, aber konkreter Blick auf agentisches Platform Engineering in der Praxis. Klone das &lt;a href="https://github.com/Azure/git-ape"&gt;Repo&lt;/a&gt;, probiere die Demo aus und fange an darüber nachzudenken, wie die APIs und Richtlinien deiner Plattform aussehen müssten, damit ein Agent sie sicher nutzen kann.&lt;/p&gt;
&lt;p&gt;Lies den &lt;a href="https://devblogs.microsoft.com/all-things-azure/putting-agentic-platform-engineering-to-the-test/"&gt;vollständigen Post&lt;/a&gt; für den Walkthrough und Video-Demos.&lt;/p&gt;</content:encoded></item><item><title>Aspires Isolierter Modus Behebt den Port-Konflikt-Albtraum für Parallele Entwicklung</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/aspire-isolated-mode-parallel-instances/</guid><description>Aspire 13.2 führt den --isolated Modus ein: zufällige Ports, getrennte Secrets und null Kollisionen beim gleichzeitigen Ausführen mehrerer Instanzen desselben AppHosts. Perfekt für KI-Agenten, Worktrees und parallele Workflows.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Die Originalversion finden Sie &lt;a href="https://thedotnetblog.com/de/posts/emiliano-montesdeoca/aspire-isolated-mode-parallel-instances/"&gt;hier&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Wenn du jemals versucht hast, zwei Instanzen desselben Projekts gleichzeitig zu starten, kennst du den Schmerz. Port 8080 wird bereits verwendet. Port 17370 ist belegt. Etwas killen, neustarten, Umgebungsvariablen jonglieren — ein echter Produktivitätskiller.&lt;/p&gt;
&lt;p&gt;Dieses Problem wird schlimmer, nicht besser. KI-Agenten erstellen Git Worktrees um unabhängig zu arbeiten. Hintergrund-Agenten starten separate Umgebungen. Entwickler checken dasselbe Repo zweimal für Feature-Branches aus. Jedes dieser Szenarien läuft gegen dieselbe Wand: Zwei Instanzen derselben App kämpfen um dieselben Ports.&lt;/p&gt;
&lt;p&gt;Aspire 13.2 behebt das mit einem einzigen Flag. James Newton-King vom Aspire-Team hat &lt;a href="https://devblogs.microsoft.com/aspire/aspire-isolated-mode-parallel-development/"&gt;alle Details aufgeschrieben&lt;/a&gt;, und es ist eines dieser „warum hatten wir das nicht schon früher&amp;quot;-Features.&lt;/p&gt;
&lt;h2 id="die-lösung---isolated"&gt;Die Lösung: &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;Das war&amp;rsquo;s. Jeder Lauf bekommt:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Zufällige Ports&lt;/strong&gt; — keine Kollisionen mehr zwischen Instanzen&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Isolierte User Secrets&lt;/strong&gt; — Connection Strings und API Keys bleiben pro Instanz getrennt&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Keine manuelle Port-Neuzuweisung. Kein Umgebungsvariablen-Jonglieren. Jeder Lauf bekommt automatisch eine frische, kollisionsfreie Umgebung.&lt;/p&gt;
&lt;h2 id="reale-szenarien-in-denen-das-glänzt"&gt;Reale Szenarien, in denen das glänzt&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Mehrere Checkouts.&lt;/strong&gt; Du hast einen Feature-Branch in einem Verzeichnis und einen Bugfix in einem anderen:&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;Beide laufen ohne Konflikte. Das Dashboard zeigt, was wo läuft.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hintergrund-Agenten in VS Code.&lt;/strong&gt; Wenn der Hintergrund-Agent von Copilot Chat einen Git Worktree erstellt um unabhängig an deinem Code zu arbeiten, muss er möglicherweise deinen Aspire AppHost starten. Ohne &lt;code&gt;--isolated&lt;/code&gt; ist das ein Port-Konflikt mit deinem primären Worktree. Mit ihm funktionieren einfach beide Instanzen.&lt;/p&gt;
&lt;p&gt;Der Aspire-Skill, der mit &lt;code&gt;aspire agent init&lt;/code&gt; mitkommt, weist Agenten automatisch an, &lt;code&gt;--isolated&lt;/code&gt; zu verwenden, wenn sie in Worktrees arbeiten. So sollte Copilots Hintergrund-Agent das von Haus aus richtig handhaben.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Integrationstests parallel zur Entwicklung.&lt;/strong&gt; Tests gegen einen laufenden AppHost ausführen während du weiter Features baust? Der isolierte Modus gibt jedem Kontext eigene Ports und Konfiguration.&lt;/p&gt;
&lt;h2 id="wie-es-unter-der-haube-funktioniert"&gt;Wie es unter der Haube funktioniert&lt;/h2&gt;
&lt;p&gt;Wenn du &lt;code&gt;--isolated&lt;/code&gt; übergibst, generiert die CLI eine eindeutige Instanz-ID für den Lauf. Das treibt zwei Verhaltensweisen:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Port-Randomisierung&lt;/strong&gt; — statt sich an vorhersagbare Ports aus deiner AppHost-Konfiguration zu binden, wählt der isolierte Modus zufällige verfügbare Ports für alles — das Dashboard, Service-Endpoints, alles. Service Discovery passt sich automatisch an, sodass sich Services gegenseitig finden, unabhängig davon, auf welchen Ports sie landen.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Secret-Isolation&lt;/strong&gt; — jeder isolierte Lauf bekommt seinen eigenen User-Secrets-Speicher, der durch die Instanz-ID identifiziert wird. Connection Strings und API Keys eines Laufs lecken nicht in einen anderen.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Dein Code braucht keine Änderungen. Aspires Service Discovery löst Endpoints zur Laufzeit auf, sodass alles korrekt verbunden wird, unabhängig von der Port-Zuweisung.&lt;/p&gt;
&lt;h2 id="wann-man-es-verwenden-sollte"&gt;Wann man es verwenden sollte&lt;/h2&gt;
&lt;p&gt;Verwende &lt;code&gt;--isolated&lt;/code&gt;, wenn du mehrere Instanzen desselben AppHosts gleichzeitig betreibst — sei es für parallele Entwicklung, automatisierte Tests, KI-Agenten oder Git Worktrees. Für Einzelinstanz-Entwicklung, bei der du vorhersagbare Ports bevorzugst, funktioniert das reguläre &lt;code&gt;aspire run&lt;/code&gt; weiterhin bestens.&lt;/p&gt;
&lt;h2 id="zusammenfassung"&gt;Zusammenfassung&lt;/h2&gt;
&lt;p&gt;Der isolierte Modus ist ein kleines Feature, das ein reales, zunehmend häufiges Problem löst. Da KI-gestützte Entwicklung uns in Richtung mehr paralleler Workflows drängt — mehrere Agenten, mehrere Worktrees, mehrere Kontexte — ist die Fähigkeit, einfach eine weitere Instanz hochzufahren ohne um Ports zu kämpfen, essentiell.&lt;/p&gt;
&lt;p&gt;Lies den &lt;a href="https://devblogs.microsoft.com/aspire/aspire-isolated-mode-parallel-development/"&gt;vollständigen Post&lt;/a&gt; für alle technischen Details und probiere es aus mit &lt;code&gt;aspire update --self&lt;/code&gt; um Version 13.2 zu bekommen.&lt;/p&gt;</content:encoded></item><item><title>Die Visual Studio Floating-Windows-Einstellung, die Du Nicht Kanntest (Aber Kennen Solltest)</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/visual-studio-floating-windows-powertoys/</guid><description>Eine versteckte Visual Studio-Einstellung gibt dir volle Kontrolle über schwebende Fenster — unabhängige Taskleisten-Einträge, richtiges Multi-Monitor-Verhalten und perfekte FancyZones-Integration. Ein Dropdown ändert alles.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Die Originalversion finden Sie &lt;a href="https://thedotnetblog.com/de/posts/emiliano-montesdeoca/visual-studio-floating-windows-powertoys/"&gt;hier&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Wenn ihr mehrere Monitore mit Visual Studio verwendet (und ehrlich gesagt, wer macht das heutzutage nicht?), habt ihr wahrscheinlich schon die Frustration erlebt: Schwebende Toolfenster verschwinden, wenn ihr das Haupt-IDE minimiert, sie bleiben immer über allem anderen, und sie tauchen nicht als separate Taskleisten-Buttons auf. Das funktioniert für manche Workflows, aber für Multi-Monitor-Setups ist es nervig.&lt;/p&gt;
&lt;p&gt;Mads Kristensen vom Visual Studio Team &lt;a href="https://devblogs.microsoft.com/visualstudio/take-full-control-of-your-floating-windows-in-visual-studio/"&gt;teilte eine kaum bekannte Einstellung&lt;/a&gt;, die komplett verändert, wie sich schwebende Fenster verhalten. Ein Dropdown. Das war&amp;rsquo;s.&lt;/p&gt;
&lt;h2 id="die-einstellung"&gt;Die Einstellung&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Tools &amp;gt; Options &amp;gt; Environment &amp;gt; Windows &amp;gt; Floating Windows&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Das Dropdown &amp;ldquo;These floating windows are owned by the main window&amp;rdquo; hat drei Optionen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;None&lt;/strong&gt; — volle Unabhängigkeit. Jedes schwebende Fenster bekommt seinen eigenen Taskleisten-Eintrag und verhält sich wie ein normales Windows-Fenster.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tool Windows&lt;/strong&gt; (Standard) — Dokumente schweben frei, Toolfenster bleiben an die IDE gebunden.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Documents and Tool Windows&lt;/strong&gt; — klassisches Visual Studio-Verhalten, alles an das Hauptfenster gebunden.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="warum-none-der-richtige-weg-für-multi-monitor-setups-ist"&gt;Warum &amp;ldquo;None&amp;rdquo; der richtige Weg für Multi-Monitor-Setups ist&lt;/h2&gt;
&lt;p&gt;Stellt es auf &lt;strong&gt;None&lt;/strong&gt; und plötzlich verhalten sich alle eure schwebenden Tool- und Dokumentfenster wie echte Windows-Anwendungen. Sie erscheinen in der Taskleiste, bleiben sichtbar wenn ihr das Visual Studio-Hauptfenster minimiert, und hören auf, sich vor alles andere zu drängen.&lt;/p&gt;
&lt;p&gt;Kombiniert das mit &lt;strong&gt;PowerToys FancyZones&lt;/strong&gt; und es ist ein Game Changer. Erstellt benutzerdefinierte Layouts über eure Monitore, dockt euren Solution Explorer in eine Zone, Debugger in eine andere, und Code-Dateien wohin ihr wollt. Alles bleibt an Ort und Stelle, alles ist unabhängig erreichbar, und euer Arbeitsplatz fühlt sich organisiert an statt chaotisch.&lt;/p&gt;
&lt;h2 id="schnelle-empfehlungen"&gt;Schnelle Empfehlungen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Multi-Monitor-Poweruser&lt;/strong&gt;: Auf &lt;strong&gt;None&lt;/strong&gt; setzen, mit FancyZones kombinieren&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gelegentliche Floater&lt;/strong&gt;: &lt;strong&gt;Tool Windows&lt;/strong&gt; (Standard) ist ein guter Mittelweg&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Traditioneller Workflow&lt;/strong&gt;: &lt;strong&gt;Documents and Tool Windows&lt;/strong&gt; hält alles klassisch&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Profi-Tipp: &lt;strong&gt;Ctrl + Doppelklick&lt;/strong&gt; auf die Titelleiste eines beliebigen Toolfensters, um es sofort zu lösen oder anzudocken. Kein Neustart nötig nach dem Ändern der Einstellung.&lt;/p&gt;
&lt;h2 id="fazit"&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Es ist eine dieser &amp;ldquo;Ich kann nicht glauben, dass ich das nicht wusste&amp;rdquo;-Einstellungen. Wenn euch schwebende Fenster in Visual Studio jemals genervt haben, geht das jetzt sofort ändern.&lt;/p&gt;
&lt;p&gt;Lest den &lt;a href="https://devblogs.microsoft.com/visualstudio/take-full-control-of-your-floating-windows-in-visual-studio/"&gt;vollständigen Post&lt;/a&gt; für Details und Screenshots.&lt;/p&gt;</content:encoded></item><item><title>Echtzeit-Multi-Agent-UIs Bauen, Die Sich Nicht Wie eine Black Box Anfühlen</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/ag-ui-real-time-multi-agent-ui-maf/</guid><description>AG-UI und Microsoft Agent Framework verbünden sich, um Multi-Agent-Workflows ein richtiges Frontend zu geben — mit Echtzeit-Streaming, menschlichen Freigaben und voller Transparenz darüber, was eure Agenten tun.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Die Originalversion finden Sie &lt;a href="https://thedotnetblog.com/de/posts/emiliano-montesdeoca/ag-ui-real-time-multi-agent-ui-maf/"&gt;hier&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Hier ist das Ding mit Multi-Agent-Systemen: Sie sehen in Demos unglaublich aus. Drei Agenten, die Arbeit weiterreichen, Probleme lösen, Entscheidungen treffen. Dann versuchst du es echten Benutzern zu zeigen und&amp;hellip; Stille. Ein drehender Ladeindikator. Keine Ahnung, welcher Agent was macht oder warum das System pausiert ist. Das ist kein Produkt — das ist ein Vertrauensproblem.&lt;/p&gt;
&lt;p&gt;Das Microsoft Agent Framework Team hat gerade einen &lt;a href="https://devblogs.microsoft.com/agent-framework/ag-ui-multi-agent-workflow-demo/"&gt;fantastischen Walkthrough&lt;/a&gt; veröffentlicht, wie man MAF-Workflows mit &lt;a href="https://github.com/ag-ui-protocol/ag-ui"&gt;AG-UI&lt;/a&gt; kombiniert — einem offenen Protokoll zum Streamen von Agent-Ausführungsereignissen an ein Frontend über Server-Sent Events. Und ehrlich gesagt? Das ist genau die Brücke, die uns gefehlt hat.&lt;/p&gt;
&lt;h2 id="warum-das-für-net-entwickler-wichtig-ist"&gt;Warum das für .NET-Entwickler wichtig ist&lt;/h2&gt;
&lt;p&gt;Wenn du KI-gestützte Apps baust, bist du wahrscheinlich schon an diese Wand gestoßen. Deine Backend-Orchestrierung funktioniert super — Agenten übergeben aneinander, Tools feuern, Entscheidungen werden getroffen. Aber das Frontend hat keine Ahnung, was hinter den Kulissen passiert. AG-UI löst das, indem es ein Standardprotokoll zum Streamen von Agent-Events definiert (denk an &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;) direkt an deine UI-Schicht über SSE.&lt;/p&gt;
&lt;p&gt;Die Demo ist ein Kundenservice-Workflow mit drei Agenten: ein Triage-Agent, der Anfragen weiterleitet, ein Erstattungs-Agent für Geldangelegenheiten, und ein Bestell-Agent für Austauschvorgänge. Jeder Agent hat seine eigenen Tools, und die Handoff-Topologie ist explizit definiert — kein &amp;ldquo;finde es aus dem Prompt heraus&amp;rdquo;-Vibe.&lt;/p&gt;
&lt;h2 id="die-handoff-topologie-ist-der-eigentliche-star"&gt;Die Handoff-Topologie ist der eigentliche Star&lt;/h2&gt;
&lt;p&gt;Was mir aufgefallen ist, ist wie &lt;code&gt;HandoffBuilder&lt;/code&gt; dir erlaubt, einen gerichteten Routing-Graphen zwischen Agenten zu deklarieren:&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;Jedes &lt;code&gt;add_handoff&lt;/code&gt; erstellt eine gerichtete Kante mit einer natürlichsprachlichen Beschreibung. Das Framework generiert Handoff-Tools für jeden Agenten basierend auf dieser Topologie. Routing-Entscheidungen basieren also auf deiner Orchestrierungsstruktur, nicht nur darauf, was das LLM gerade für richtig hält. Das ist ein riesiger Gewinn für die Produktionszuverlässigkeit.&lt;/p&gt;
&lt;h2 id="human-in-the-loop-das-tatsächlich-funktioniert"&gt;Human-in-the-Loop, das tatsächlich funktioniert&lt;/h2&gt;
&lt;p&gt;Die Demo zeigt zwei Unterbrechungsmuster, die jede echte Agent-App braucht:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tool-Genehmigungs-Unterbrechungen&lt;/strong&gt; — wenn ein Agent ein Tool aufruft, das mit &lt;code&gt;approval_mode=&amp;quot;always_require&amp;quot;&lt;/code&gt; markiert ist, pausiert der Workflow und sendet ein Event. Das Frontend rendert ein Genehmigungs-Modal mit dem Tool-Namen und den Argumenten. Keine Token-verbrennenden Retry-Schleifen — einfach ein sauberer Pause-Genehmigung-Fortsetzen-Ablauf.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Informationsanfrage-Unterbrechungen&lt;/strong&gt; — wenn ein Agent mehr Kontext vom Benutzer braucht (wie eine Bestell-ID), pausiert er und fragt nach. Das Frontend zeigt die Frage an, der Benutzer antwortet, und die Ausführung wird genau dort fortgesetzt, wo sie aufgehört hat.&lt;/p&gt;
&lt;p&gt;Beide Muster werden als Standard-AG-UI-Events gestreamt, sodass dein Frontend keine agenten-spezifische Logik braucht — es rendert einfach jedes Event, das über die SSE-Verbindung kommt.&lt;/p&gt;
&lt;h2 id="die-anbindung-ist-überraschend-einfach"&gt;Die Anbindung ist überraschend einfach&lt;/h2&gt;
&lt;p&gt;Die Integration zwischen MAF und AG-UI ist ein einziger Funktionsaufruf:&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;Die &lt;code&gt;workflow_factory&lt;/code&gt; erstellt einen frischen Workflow pro Thread, sodass jede Konversation isolierten State bekommt. Der Endpoint übernimmt die gesamte SSE-Verkabelung automatisch. Wenn du bereits FastAPI nutzt (oder es als leichte Schicht hinzufügen kannst), ist das praktisch ohne Reibungsverluste.&lt;/p&gt;
&lt;h2 id="meine-einschätzung"&gt;Meine Einschätzung&lt;/h2&gt;
&lt;p&gt;Für uns .NET-Entwickler ist die sofortige Frage: „Geht das auch in C#?&amp;quot; Das Agent Framework ist für .NET und Python verfügbar, und das AG-UI-Protokoll ist sprachunabhängig (es ist nur SSE). Obwohl diese spezifische Demo Python und FastAPI verwendet, lässt sich das Muster direkt übertragen. Du könntest eine ASP.NET Core Minimal API mit SSE-Endpoints nach dem gleichen AG-UI-Event-Schema aufbauen.&lt;/p&gt;
&lt;p&gt;Die wichtigere Erkenntnis ist, dass Multi-Agent-UIs zu einem erstklassigen Thema werden — nicht mehr nur ein Nachgedanke. Wenn du irgendetwas baust, wo Agenten mit Menschen interagieren — Kundenservice, Genehmigungs-Workflows, Dokumentenverarbeitung — dann ist diese Kombination aus MAF-Orchestrierung und AG-UI-Transparenz das Muster, dem man folgen sollte.&lt;/p&gt;
&lt;h2 id="zusammenfassung"&gt;Zusammenfassung&lt;/h2&gt;
&lt;p&gt;AG-UI + Microsoft Agent Framework gibt dir das Beste aus beiden Welten: robuste Multi-Agent-Orchestrierung im Backend und Echtzeit-Transparenz im Frontend. Keine Black-Box-Agent-Interaktionen mehr.&lt;/p&gt;
&lt;p&gt;Schau dir den &lt;a href="https://devblogs.microsoft.com/agent-framework/ag-ui-multi-agent-workflow-demo/"&gt;vollständigen Walkthrough&lt;/a&gt; und das &lt;a href="https://github.com/ag-ui-protocol/ag-ui"&gt;AG-UI-Protokoll-Repository&lt;/a&gt; an, um tiefer einzutauchen.&lt;/p&gt;</content:encoded></item><item><title>GitHub Copilots Modernisierungs-Assessment ist das beste Migrationstool, das du noch nicht nutzt</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/dotnet-modernization-assessment-github-copilot/</guid><description>Die Modernisierungserweiterung von GitHub Copilot schlägt nicht nur Code-Änderungen vor — sie erstellt ein vollständiges Migrations-Assessment mit umsetzbaren Issues, Azure-Zielvergleichen und einem kollaborativen Workflow. Hier erfährst du, warum das Assessment-Dokument der Schlüssel zu allem ist.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Die Originalversion finden Sie &lt;a href="https://thedotnetblog.com/de/posts/emiliano-montesdeoca/dotnet-modernization-assessment-github-copilot/"&gt;hier&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Eine Legacy-.NET-Framework-App auf modernes .NET zu migrieren ist eine dieser Aufgaben, von der jeder weiß, dass sie erledigt werden sollte, die aber niemand anfangen will. Es ist nie nur „ändere das Ziel-Framework.&amp;quot; Es sind APIs, die verschwunden sind, Pakete, die nicht mehr existieren, Hosting-Modelle, die völlig anders funktionieren, und eine Million kleiner Entscheidungen darüber, was containerisiert, was umgeschrieben und was in Ruhe gelassen werden soll.&lt;/p&gt;
&lt;p&gt;Jeffrey Fritz hat gerade einen &lt;a href="https://devblogs.microsoft.com/dotnet/your-migrations-source-of-truth-the-modernization-assessment/"&gt;tiefen Einblick in GitHub Copilots Modernisierungs-Assessment&lt;/a&gt; veröffentlicht, und ehrlich? Das ist das beste Migrationstooling, das ich für .NET gesehen habe. Nicht wegen der Code-Generierung — das ist mittlerweile Standard. Wegen des Assessment-Dokuments, das es erstellt.&lt;/p&gt;
&lt;h2 id="es-ist-nicht-nur-eine-code-vorschlagsmaschine"&gt;Es ist nicht nur eine Code-Vorschlagsmaschine&lt;/h2&gt;
&lt;p&gt;Die VS Code-Erweiterung folgt einem &lt;strong&gt;Bewerten → Planen → Ausführen&lt;/strong&gt;-Modell. Die Bewertungsphase analysiert deine gesamte Codebase und erstellt ein strukturiertes Dokument, das alles erfasst: was sich ändern muss, welche Azure-Ressourcen provisioniert werden müssen, welches Deployment-Modell verwendet werden soll. Alles Nachfolgende — Infrastructure as Code, Containerisierung, Deployment-Manifeste — leitet sich aus den Ergebnissen des Assessments ab.&lt;/p&gt;
&lt;p&gt;Das Assessment wird unter &lt;code&gt;.github/modernize/assessment/&lt;/code&gt; in deinem Projekt gespeichert. Jeder Durchlauf erzeugt einen unabhängigen Report, sodass du eine Historie aufbaust und verfolgen kannst, wie sich deine Migrationsposition entwickelt, wenn du Issues behebst.&lt;/p&gt;
&lt;h2 id="zwei-wege-zum-start"&gt;Zwei Wege zum Start&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Empfohlenes Assessment&lt;/strong&gt; — der schnelle Weg. Wähle aus kuratierten Domains (Java/.NET Upgrade, Cloud Readiness, Sicherheit) und erhalte aussagekräftige Ergebnisse ohne Konfigurationsaufwand. Ideal für einen ersten Blick, wo deine App steht.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Benutzerdefiniertes Assessment&lt;/strong&gt; — der gezielte Weg. Konfiguriere genau, was analysiert werden soll: Ziel-Compute (App Service, AKS, Container Apps), Ziel-OS, Containerisierungsanalyse. Wähle mehrere Azure-Ziele, um Migrationsansätze nebeneinander zu vergleichen.&lt;/p&gt;
&lt;p&gt;Diese Vergleichsansicht ist wirklich nützlich. Eine App mit 3 obligatorischen Issues für App Service könnte 7 für AKS haben. Beides zu sehen hilft bei der Hosting-Entscheidung, bevor man sich auf einen Migrationspfad festlegt.&lt;/p&gt;
&lt;h2 id="die-issue-aufschlüsselung-ist-umsetzbar"&gt;Die Issue-Aufschlüsselung ist umsetzbar&lt;/h2&gt;
&lt;p&gt;Jedes Issue kommt mit einem Kritikalitätslevel:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Obligatorisch&lt;/strong&gt; — muss behoben werden, sonst scheitert die Migration&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Potenziell&lt;/strong&gt; — könnte die Migration beeinflussen, braucht menschliche Beurteilung&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Optional&lt;/strong&gt; — empfohlene Verbesserungen, blockiert die Migration nicht&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Und jedes Issue verlinkt zu betroffenen Dateien und Zeilennummern, liefert eine detaillierte Beschreibung dessen, was falsch ist und warum es für deine Zielplattform wichtig ist, gibt konkrete Behebungsschritte (nicht nur „repariere das&amp;quot;) und enthält Links zur offiziellen Dokumentation.&lt;/p&gt;
&lt;p&gt;Du kannst einzelne Issues an Entwickler weitergeben, und sie haben alles, was sie zum Handeln brauchen. Das ist der Unterschied zwischen einem Tool, das dir sagt „es gibt ein Problem&amp;quot; und einem, das dir sagt, wie du es löst.&lt;/p&gt;
&lt;h2 id="die-abgedeckten-upgrade-pfade"&gt;Die abgedeckten Upgrade-Pfade&lt;/h2&gt;
&lt;p&gt;Für .NET spezifisch:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;.NET Framework → .NET 10&lt;/li&gt;
&lt;li&gt;ASP.NET → ASP.NET Core&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Jeder Upgrade-Pfad hat Erkennungsregeln, die wissen, welche APIs entfernt wurden, welche Patterns kein direktes Äquivalent haben und welche Sicherheitsprobleme Aufmerksamkeit erfordern.&lt;/p&gt;
&lt;p&gt;Für Teams, die mehrere Apps verwalten, gibt es auch ein CLI, das Multi-Repo-Batch-Assessments unterstützt — alle Repos klonen, alle bewerten, App-spezifische Reports plus eine aggregierte Portfolio-Ansicht bekommen.&lt;/p&gt;
&lt;h2 id="meine-einschätzung"&gt;Meine Einschätzung&lt;/h2&gt;
&lt;p&gt;Wenn du auf Legacy-.NET-Framework-Apps sitzt (und seien wir ehrlich, die meisten Enterprise-Teams tun das), ist dies &lt;em&gt;das&lt;/em&gt; Tool zum Starten. Allein das Assessment-Dokument ist die Zeit wert — es verwandelt ein vages „wir sollten modernisieren&amp;quot; in eine konkrete, priorisierte Liste von Arbeitspaketen mit klaren Wegen nach vorn.&lt;/p&gt;
&lt;p&gt;Der kollaborative Workflow ist auch clever: Assessments exportieren, mit deinem Team teilen, importieren ohne erneut auszuführen. Architektur-Reviews, bei denen die Entscheider nicht diejenigen sind, die die Tools ausführen? Abgedeckt.&lt;/p&gt;
&lt;h2 id="zusammenfassung"&gt;Zusammenfassung&lt;/h2&gt;
&lt;p&gt;GitHub Copilots Modernisierungs-Assessment verwandelt .NET-Migration von einem beängstigenden, undefinierten Projekt in einen strukturierten, nachverfolgbaren Prozess. Starte mit einem empfohlenen Assessment, um zu sehen, wo du stehst, und nutze dann benutzerdefinierte Assessments, um Azure-Ziele zu vergleichen und deinen Migrationsplan zu erstellen.&lt;/p&gt;
&lt;p&gt;Lies den &lt;a href="https://devblogs.microsoft.com/dotnet/your-migrations-source-of-truth-the-modernization-assessment/"&gt;vollständigen Walkthrough&lt;/a&gt; und hole dir die &lt;a href="https://aka.ms/ghcp-appmod/vscode-ext"&gt;VS Code-Erweiterung&lt;/a&gt;, um es an deinem eigenen Code auszuprobieren.&lt;/p&gt;</content:encoded></item><item><title>MCP Apps bekommen eine Fluent API — Erstelle reichhaltige AI-Tool-UIs in .NET in drei Schritten</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/mcp-fluent-api-azure-functions-dotnet/</guid><description>Die neue Fluent-Konfigurations-API für MCP Apps auf Azure Functions ermöglicht es, jedes .NET MCP-Tool in eine vollständige App mit Views, Berechtigungen und CSP-Richtlinien in nur wenigen Codezeilen zu verwandeln.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Die Originalversion finden Sie &lt;a href="https://thedotnetblog.com/de/posts/emiliano-montesdeoca/mcp-fluent-api-azure-functions-dotnet/"&gt;hier&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;MCP-Tools sind großartig, um AI-Agenten Fähigkeiten zu geben. Aber was, wenn dein Tool dem Benutzer etwas zeigen muss — ein Dashboard, ein Formular, eine interaktive Visualisierung? Genau dafür gibt es MCP Apps, und sie sind jetzt viel einfacher zu erstellen.&lt;/p&gt;
&lt;p&gt;Lilian Kasem vom Azure SDK-Team &lt;a href="https://devblogs.microsoft.com/azure-sdk/mcp-as-easy-as-1-2-3-introducing-the-fluent-api-for-mcp-apps/"&gt;hat die neue Fluent-Konfigurations-API vorgestellt&lt;/a&gt; für MCP Apps auf .NET Azure Functions, und es ist die Art von Verbesserung der Entwicklererfahrung, bei der man sich fragt, warum es nicht schon immer so einfach war.&lt;/p&gt;
&lt;h2 id="was-sind-mcp-apps"&gt;Was sind MCP Apps?&lt;/h2&gt;
&lt;p&gt;MCP Apps erweitern das Model Context Protocol, indem sie Tools eigene UI-Views, statische Assets und Sicherheitskontrollen mitgeben können. Anstatt nur Text zurückzugeben, kann dein MCP-Tool vollständige HTML-Erlebnisse rendern — interaktive Dashboards, Datenvisualisierungen, Konfigurationsformulare — alles von AI-Agenten aufrufbar und den Benutzern durch MCP-Clients präsentiert.&lt;/p&gt;
&lt;p&gt;Der Haken war, dass das manuelle Verkabeln all dieser Dinge tiefes Wissen über die MCP-Spezifikation erforderte: &lt;code&gt;ui://&lt;/code&gt;-URIs, spezielle MIME-Types, Metadaten-Koordination zwischen Tools und Ressourcen. Nicht schwer, aber fummellig.&lt;/p&gt;
&lt;h2 id="die-fluent-api-in-drei-schritten"&gt;Die Fluent API in drei Schritten&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Schritt 1: Definiere deine Funktion.&lt;/strong&gt; Ein standardmäßiges Azure Functions MCP-Tool:&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;Schritt 2: Mach sie zur MCP App.&lt;/strong&gt; In deinem Programm-Startup:&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;Schritt 3: Füge deine HTML-View hinzu.&lt;/strong&gt; Erstelle &lt;code&gt;assets/hello-app.html&lt;/code&gt; mit der UI, die du brauchst.&lt;/p&gt;
&lt;p&gt;Das war&amp;rsquo;s. Die Fluent API kümmert sich um die gesamte MCP-Protokoll-Plumbing — generiert die synthetische Ressourcen-Funktion, setzt den korrekten MIME-Type und injiziert die Metadaten, die dein Tool mit seiner View verbinden.&lt;/p&gt;
&lt;h2 id="die-api-oberfläche-ist-gut-durchdacht"&gt;Die API-Oberfläche ist gut durchdacht&lt;/h2&gt;
&lt;p&gt;Ein paar Dinge, die mir besonders gefallen:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;View-Quellen sind flexibel.&lt;/strong&gt; Du kannst HTML von Dateien auf der Festplatte servieren oder Ressourcen direkt in deine Assembly einbetten für eigenständige Deployments:&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;app&lt;/span&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="n"&gt;McpViewSource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FromFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;assets/my-view.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="n"&gt;app&lt;/span&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="n"&gt;McpViewSource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FromEmbeddedResource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;MyApp.Resources.view.html&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;&lt;strong&gt;CSP ist komponierbar.&lt;/strong&gt; Du erlaubst explizit die Origins, die deine App braucht, nach dem Prinzip der minimalen Berechtigung. Rufe &lt;code&gt;WithCsp&lt;/code&gt; mehrmals auf und die Origins akkumulieren sich:&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="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;ConnectTo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://api.example.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;LoadResourcesFrom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://cdn.example.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;AllowFrame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://youtube.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;Sichtbarkeitskontrolle.&lt;/strong&gt; Du kannst ein Tool nur für das LLM sichtbar machen, nur für die Host-UI oder für beides. Du willst ein Tool, das nur UI rendert und nicht vom Modell aufgerufen werden soll? Kein Problem:&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="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithVisibility&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;McpVisibility&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;)&lt;/span&gt; &lt;span class="c1"&gt;// UI-only, hidden from the model&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="erste-schritte"&gt;Erste Schritte&lt;/h2&gt;
&lt;p&gt;Füge das Preview-Paket hinzu:&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;Wenn du bereits MCP-Tools mit Azure Functions baust, ist das nur ein Paket-Update. Der &lt;a href="https://learn.microsoft.com/azure/azure-functions/scenario-mcp-apps?tabs=bash%2Clinux&amp;amp;pivots=programming-language-csharp"&gt;MCP Apps Quickstart&lt;/a&gt; ist der beste Einstiegspunkt, wenn du neu im Konzept bist.&lt;/p&gt;
&lt;h2 id="zusammenfassung"&gt;Zusammenfassung&lt;/h2&gt;
&lt;p&gt;MCP Apps sind eine der spannendsten Entwicklungen im AI-Tooling-Bereich — Tools, die nicht nur Dinge &lt;em&gt;tun&lt;/em&gt;, sondern den Benutzern auch Dinge &lt;em&gt;zeigen&lt;/em&gt; können. Die Fluent API entfernt die Protokollkomplexität und lässt dich auf das Wesentliche konzentrieren: die Logik deines Tools und seine Oberfläche.&lt;/p&gt;
&lt;p&gt;Lies den &lt;a href="https://devblogs.microsoft.com/azure-sdk/mcp-as-easy-as-1-2-3-introducing-the-fluent-api-for-mcp-apps/"&gt;vollständigen Beitrag&lt;/a&gt; für die komplette API-Referenz und Beispiele.&lt;/p&gt;</content:encoded></item><item><title>Microsoft Foundry März 2026 — GPT-5.4, Agent Service GA und das SDK-Refresh, das Alles Verändert</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/microsoft-foundry-march-2026-whats-new/</guid><description>Das März-2026-Update von Microsoft Foundry ist gewaltig: Agent Service erreicht GA, GPT-5.4 bringt zuverlässiges Reasoning, das azure-ai-projects SDK wird in allen Sprachen stabil, und Fireworks AI bringt offene Modelle nach Azure.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Die Originalversion finden Sie &lt;a href="https://thedotnetblog.com/de/posts/emiliano-montesdeoca/microsoft-foundry-march-2026-whats-new/"&gt;hier&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Die monatlichen „What&amp;rsquo;s New in Microsoft Foundry&amp;quot;-Posts sind normalerweise eine Mischung aus inkrementellen Verbesserungen und gelegentlichen Highlight-Features. Die &lt;a href="https://devblogs.microsoft.com/foundry/whats-new-in-microsoft-foundry-mar-2026/"&gt;März 2026-Ausgabe&lt;/a&gt;? Praktisch nur Highlight-Features. Foundry Agent Service erreicht GA, GPT-5.4 geht in Produktion, das SDK bekommt ein großes stabiles Release, und Fireworks AI bringt Open-Model-Inferenz nach Azure. Schauen wir uns an, was für .NET-Entwickler wichtig ist.&lt;/p&gt;
&lt;h2 id="foundry-agent-service-ist-produktionsreif"&gt;Foundry Agent Service ist produktionsreif&lt;/h2&gt;
&lt;p&gt;Das ist die große Neuigkeit. Die Runtime der nächsten Generation für Agenten ist allgemein verfügbar — aufgebaut auf der OpenAI Responses API, draht-kompatibel mit OpenAI-Agenten und offen für Modelle verschiedener Anbieter. Wenn ihr heute mit der Responses API baut, fügt die Migration zu Foundry Enterprise-Sicherheit, privates Networking, Entra RBAC, vollständiges Tracing und Evaluation auf eure bestehende Agentenlogik hinzu.&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;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;from&lt;/span&gt; &lt;span class="nn"&gt;azure.ai.projects.models&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;PromptAgentDefinition&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;project_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;AZURE_AI_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;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;project_client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;agents&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create_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;agent_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;my-enterprise-agent&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;definition&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;PromptAgentDefinition&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;model&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;AZURE_AI_MODEL_DEPLOYMENT_NAME&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="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;Zentrale Neuerungen: End-to-End Private Networking, MCP-Auth-Erweiterung (einschließlich OAuth-Passthrough), Voice Live Preview für Sprach-zu-Sprach-Agenten und gehostete Agenten in 6 neuen Regionen.&lt;/p&gt;
&lt;h2 id="gpt-54--zuverlässigkeit-über-reine-intelligenz"&gt;GPT-5.4 — Zuverlässigkeit über reine Intelligenz&lt;/h2&gt;
&lt;p&gt;Bei GPT-5.4 geht es nicht darum, schlauer zu sein. Es geht um Zuverlässigkeit. Stärkeres Reasoning über lange Interaktionen, bessere Instruktionstreue, weniger Ausfälle mitten im Workflow und integrierte Computer-Use-Fähigkeiten. Für Produktions-Agenten ist diese Zuverlässigkeit viel wichtiger als Benchmark-Scores.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Modell&lt;/th&gt;
&lt;th&gt;Preis (pro M Token)&lt;/th&gt;
&lt;th&gt;Ideal für&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;Produktions-Agenten, Coding, Dokumenten-Workflows&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;Tiefgehende Analyse, wissenschaftliches Reasoning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.4 Mini&lt;/td&gt;
&lt;td&gt;Kostengünstig&lt;/td&gt;
&lt;td&gt;Klassifikation, Extraktion, leichte Tool-Aufrufe&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Die clevere Strategie ist Routing: GPT-5.4 Mini übernimmt die hochvolumige, latenzarme Arbeit, während GPT-5.4 die reasoning-intensiven Anfragen bearbeitet.&lt;/p&gt;
&lt;h2 id="das-sdk-ist-endlich-stabil"&gt;Das SDK ist endlich stabil&lt;/h2&gt;
&lt;p&gt;Das &lt;code&gt;azure-ai-projects&lt;/code&gt; SDK hat stabile Releases in allen Sprachen veröffentlicht — Python 2.0.0, JS/TS 2.0.0, Java 2.0.0 und .NET 2.0.0 (1. April). Die &lt;code&gt;azure-ai-agents&lt;/code&gt;-Abhängigkeit ist weg — alles lebt unter &lt;code&gt;AIProjectClient&lt;/code&gt;. Installation mit &lt;code&gt;pip install azure-ai-projects&lt;/code&gt;, das Paket bündelt &lt;code&gt;openai&lt;/code&gt; und &lt;code&gt;azure-identity&lt;/code&gt; als direkte Abhängigkeiten.&lt;/p&gt;
&lt;p&gt;Für .NET-Entwickler bedeutet das ein einziges NuGet-Paket für die gesamte Foundry-Oberfläche. Schluss mit dem Jonglieren separater Agent-SDKs.&lt;/p&gt;
&lt;h2 id="fireworks-ai-bringt-offene-modelle-nach-azure"&gt;Fireworks AI bringt offene Modelle nach Azure&lt;/h2&gt;
&lt;p&gt;Vielleicht die architektonisch interessanteste Ergänzung: Fireworks AI verarbeitet über 13 Billionen Token täglich bei ~180K Anfragen/Sekunde, jetzt über Foundry verfügbar. DeepSeek V3.2, gpt-oss-120b, Kimi K2.5 und MiniMax M2.5 zum Start.&lt;/p&gt;
&lt;p&gt;Die eigentliche Geschichte ist &lt;strong&gt;Bring-Your-Own-Weights&lt;/strong&gt; — quantisierte oder feingetunete Gewichte von überall hochladen, ohne den Serving-Stack zu ändern. Deployment über serverloses Pay-per-Token oder provisionierten Durchsatz.&lt;/p&gt;
&lt;h2 id="weitere-highlights"&gt;Weitere Highlights&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Phi-4 Reasoning Vision 15B&lt;/strong&gt; — multimodales Reasoning für Charts, Diagramme und Dokumentlayouts&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Evaluations GA&lt;/strong&gt; — fertige Evaluatoren mit kontinuierlichem Produktions-Monitoring direkt in Azure Monitor&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Priority Processing&lt;/strong&gt; (Preview) — dedizierte Compute-Lane für latenzempfindliche Workloads&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Voice Live&lt;/strong&gt; — Sprach-zu-Sprach-Runtime, die direkt mit Foundry-Agenten verbunden ist&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tracing GA&lt;/strong&gt; — End-to-End-Inspektion von Agenten-Traces mit Sortierung und Filterung&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PromptFlow-Deprecation&lt;/strong&gt; — Migration zu Microsoft Framework Workflows bis Januar 2027&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="fazit"&gt;Fazit&lt;/h2&gt;
&lt;p&gt;März 2026 ist ein Wendepunkt für Foundry. Agent Service GA, stabile SDKs in allen Sprachen, GPT-5.4 für zuverlässige Produktions-Agenten und Open-Model-Inferenz über Fireworks AI — die Plattform ist bereit für ernsthafte Workloads.&lt;/p&gt;
&lt;p&gt;Lest den &lt;a href="https://devblogs.microsoft.com/foundry/whats-new-in-microsoft-foundry-mar-2026/"&gt;vollständigen Überblick&lt;/a&gt; und &lt;a href="https://learn.microsoft.com/azure/foundry/quickstarts/get-started-code"&gt;baut euren ersten Agenten&lt;/a&gt;, um loszulegen.&lt;/p&gt;</content:encoded></item><item><title>SQL MCP Server — Der richtige Weg, AI-Agenten Datenbankzugriff zu geben</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/sql-mcp-server-data-api-builder/</guid><description>SQL MCP Server von Data API builder gibt AI-Agenten sicheren, deterministischen Datenbankzugriff, ohne Schemas zu exponieren oder auf NL2SQL zu setzen. RBAC, Caching, Multi-Datenbank-Unterstützung — alles integriert.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Die Originalversion finden Sie &lt;a href="https://thedotnetblog.com/de/posts/emiliano-montesdeoca/sql-mcp-server-data-api-builder/"&gt;hier&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Seien wir ehrlich: Die meisten heute verfügbaren Datenbank-MCP-Server sind beängstigend. Sie nehmen eine natürlichsprachliche Abfrage, generieren SQL im laufenden Betrieb und führen es gegen Ihre Produktionsdaten aus. Was könnte schiefgehen? (Alles. Alles könnte schiefgehen.)&lt;/p&gt;
&lt;p&gt;Das Azure SQL-Team hat gerade den &lt;a href="https://devblogs.microsoft.com/azure-sql/introducing-sql-mcp-server/"&gt;SQL MCP Server vorgestellt&lt;/a&gt;, und er verfolgt einen grundlegend anderen Ansatz. Als Feature von Data API builder (DAB) 2.0 gebaut, gibt er AI-Agenten strukturierten, deterministischen Zugriff auf Datenbankoperationen — ohne NL2SQL, ohne Schema-Exposition und mit vollständigem RBAC bei jedem Schritt.&lt;/p&gt;
&lt;h2 id="warum-kein-nl2sql"&gt;Warum kein NL2SQL?&lt;/h2&gt;
&lt;p&gt;Das ist die interessanteste Design-Entscheidung. Modelle sind nicht deterministisch, und komplexe Abfragen produzieren am wahrscheinlichsten subtile Fehler. Genau die Abfragen, von denen Benutzer hoffen, dass AI sie generieren kann, sind auch diejenigen, die die meiste Prüfung erfordern, wenn sie nicht-deterministisch erzeugt werden.&lt;/p&gt;
&lt;p&gt;Stattdessen verwendet SQL MCP Server einen &lt;strong&gt;NL2DAB&lt;/strong&gt;-Ansatz. Der Agent arbeitet mit der Entitäts-Abstraktionsschicht von Data API builder und dem integrierten Query Builder, um akkurates, wohlgeformtes T-SQL deterministisch zu produzieren. Gleiches Ergebnis für den Benutzer, aber ohne das Risiko halluzinierter JOINs oder versehentlicher Datenexposition.&lt;/p&gt;
&lt;h2 id="sieben-tools-nicht-siebenhundert"&gt;Sieben Tools, nicht siebenhundert&lt;/h2&gt;
&lt;p&gt;SQL MCP Server exponiert genau sieben DML-Tools, unabhängig von der Datenbankgröße:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;describe_entities&lt;/code&gt; — verfügbare Entitäten und Operationen entdecken&lt;/li&gt;
&lt;li&gt;&lt;code&gt;create_record&lt;/code&gt; — Zeilen einfügen&lt;/li&gt;
&lt;li&gt;&lt;code&gt;read_records&lt;/code&gt; — Tabellen und Views abfragen&lt;/li&gt;
&lt;li&gt;&lt;code&gt;update_record&lt;/code&gt; — Zeilen ändern&lt;/li&gt;
&lt;li&gt;&lt;code&gt;delete_record&lt;/code&gt; — Zeilen entfernen&lt;/li&gt;
&lt;li&gt;&lt;code&gt;execute_entity&lt;/code&gt; — gespeicherte Prozeduren ausführen&lt;/li&gt;
&lt;li&gt;&lt;code&gt;aggregate_records&lt;/code&gt; — Aggregationsabfragen&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Das ist clever, weil Context Windows der Denkraum des Agenten sind. Sie mit Hunderten von Tool-Definitionen zu überfluten lässt weniger Raum für das Denken. Sieben feste Tools halten den Agenten auf &lt;em&gt;Denken&lt;/em&gt; statt &lt;em&gt;Navigieren&lt;/em&gt; fokussiert.&lt;/p&gt;
&lt;p&gt;Jedes Tool kann einzeln aktiviert oder deaktiviert werden:&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="s2"&gt;&amp;#34;runtime&amp;#34;&lt;/span&gt;&lt;span class="err"&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;mcp&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;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;path&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/mcp&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;dml-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;describe-entities&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;create-record&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;read-records&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;update-record&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;delete-record&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;execute-entity&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;aggregate-records&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;h2 id="in-drei-befehlen-starten"&gt;In drei Befehlen starten&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 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --database-type mssql &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --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 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --source dbo.Customers &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --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;p&gt;Das ist ein laufender SQL MCP Server, der Ihre Customers-Tabelle exponiert. Die Entitäts-Abstraktionsschicht bedeutet, dass Sie Namen und Spalten aliasieren, Felder pro Rolle beschränken und genau kontrollieren können, was Agenten sehen — ohne interne Schema-Details preiszugeben.&lt;/p&gt;
&lt;h2 id="die-sicherheitsgeschichte-überzeugt"&gt;Die Sicherheitsgeschichte überzeugt&lt;/h2&gt;
&lt;p&gt;Hier zahlt sich die Reife von Data API builder aus:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RBAC auf jeder Ebene&lt;/strong&gt; — jede Entität definiert, welche Rollen lesen, erstellen, aktualisieren oder löschen können, und welche Felder sichtbar sind&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Azure Key Vault-Integration&lt;/strong&gt; — Connection Strings und Secrets sicher verwaltet&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Microsoft Entra + Custom OAuth&lt;/strong&gt; — Authentifizierung auf Produktionsniveau&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Content Security Policy&lt;/strong&gt; — Agenten interagieren über einen kontrollierten Vertrag, nicht über rohes SQL&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Die Schema-Abstraktion ist besonders wichtig. Ihre internen Tabellen- und Spaltennamen werden niemals dem Agenten exponiert. Sie definieren Entitäten, Aliase und Beschreibungen, die für die AI-Interaktion sinnvoll sind — nicht Ihr Datenbank-ERD.&lt;/p&gt;
&lt;h2 id="multi-datenbank-und-multi-protokoll"&gt;Multi-Datenbank und Multi-Protokoll&lt;/h2&gt;
&lt;p&gt;SQL MCP Server unterstützt Microsoft SQL, PostgreSQL, Azure Cosmos DB und MySQL. Und da es ein DAB-Feature ist, bekommen Sie REST-, GraphQL- und MCP-Endpoints gleichzeitig aus derselben Konfiguration. Gleiche Entitätsdefinitionen, gleiche RBAC-Regeln, gleiche Sicherheit — über alle drei Protokolle.&lt;/p&gt;
&lt;p&gt;Die Auto-Konfiguration in DAB 2.0 kann sogar Ihre Datenbank inspizieren und die Konfiguration dynamisch aufbauen, wenn Sie für schnelles Prototyping mit weniger Abstraktion arbeiten möchten.&lt;/p&gt;
&lt;h2 id="meine-einschätzung"&gt;Meine Einschätzung&lt;/h2&gt;
&lt;p&gt;So sollte Enterprise-Datenbankzugriff für AI-Agenten funktionieren. Nicht „Hey LLM, schreib mir SQL und YOLO es gegen Produktion.&amp;quot; Stattdessen: eine wohldefinierte Entitätsschicht, deterministische Abfragegenerierung, RBAC bei jedem Schritt, Caching, Monitoring und Telemetrie. Es ist langweilig auf die bestmögliche Art.&lt;/p&gt;
&lt;p&gt;Für .NET-Entwickler ist die Integrationsgeschichte sauber — DAB ist ein .NET-Tool, der MCP Server läuft als Container, und er funktioniert mit Azure SQL, das die meisten von uns bereits verwenden. Wenn Sie AI-Agenten bauen, die Datenzugriff brauchen, starten Sie hier.&lt;/p&gt;
&lt;h2 id="zusammenfassung"&gt;Zusammenfassung&lt;/h2&gt;
&lt;p&gt;SQL MCP Server ist kostenlos, Open Source und läuft überall. Es ist der präskriptive Ansatz von Microsoft, um AI-Agenten sicheren Datenbankzugriff zu geben. Lesen Sie den &lt;a href="https://devblogs.microsoft.com/azure-sql/introducing-sql-mcp-server/"&gt;vollständigen Beitrag&lt;/a&gt; und die &lt;a href="https://aka.ms/sql/mcp"&gt;Dokumentation&lt;/a&gt; für den Einstieg.&lt;/p&gt;</content:encoded></item><item><title>Verbinde deine MCP-Server auf Azure Functions mit Foundry Agents — So geht's</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/foundry-agents-mcp-servers-azure-functions/</guid><description>Baue deinen MCP-Server einmal, deploye ihn auf Azure Functions und verbinde ihn mit Microsoft Foundry-Agenten mit korrekter Authentifizierung. Deine Tools funktionieren überall — VS Code, Cursor und jetzt auch Enterprise-AI-Agenten.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Die Originalversion finden Sie &lt;a href="https://thedotnetblog.com/de/posts/emiliano-montesdeoca/foundry-agents-mcp-servers-azure-functions/"&gt;hier&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Das liebe ich am MCP-Ökosystem: Du baust deinen Server einmal, und er funktioniert überall. VS Code, Visual Studio, Cursor, ChatGPT — jeder MCP-Client kann deine Tools entdecken und nutzen. Jetzt fügt Microsoft einen weiteren Konsumenten zu dieser Liste hinzu: Foundry-Agenten.&lt;/p&gt;
&lt;p&gt;Lily Ma vom 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;hat einen praktischen Leitfaden veröffentlicht&lt;/a&gt; zur Verbindung von MCP-Servern auf Azure Functions mit Microsoft Foundry-Agenten. Wenn du bereits einen MCP-Server hast, ist das reiner Mehrwert — kein Neuaufbau nötig.&lt;/p&gt;
&lt;h2 id="warum-diese-kombination-sinn-macht"&gt;Warum diese Kombination Sinn macht&lt;/h2&gt;
&lt;p&gt;Azure Functions bietet dir skalierbare Infrastruktur, integrierte Authentifizierung und Serverless-Abrechnung für das Hosting von MCP-Servern. Microsoft Foundry bietet dir AI-Agenten, die denken, planen und handeln können. Beides zu verbinden bedeutet, dass deine benutzerdefinierten Tools — Datenbankabfragen, Business-API-Aufrufe, Validierungslogik — zu Fähigkeiten werden, die Enterprise-AI-Agenten autonom entdecken und nutzen können.&lt;/p&gt;
&lt;p&gt;Der Kernpunkt: Dein MCP-Server bleibt gleich. Du fügst einfach Foundry als weiteren Konsumenten hinzu. Die gleichen Tools, die in deinem VS Code-Setup funktionieren, treiben jetzt einen AI-Agenten an, mit dem dein Team oder deine Kunden interagieren.&lt;/p&gt;
&lt;h2 id="authentifizierungsoptionen"&gt;Authentifizierungsoptionen&lt;/h2&gt;
&lt;p&gt;Hier liefert der Post echten Mehrwert. Vier Authentifizierungsmethoden je nach Szenario:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Methode&lt;/th&gt;
&lt;th&gt;Anwendungsfall&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Schlüsselbasiert&lt;/strong&gt; (Standard)&lt;/td&gt;
&lt;td&gt;Entwicklung oder Server ohne 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;Produktion mit verwalteten Identitäten&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;Produktion, bei der sich jeder Benutzer einzeln authentifiziert&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ohne Authentifizierung&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Entwicklung/Tests oder nur öffentliche Daten&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Für die Produktion ist Microsoft Entra mit Agentenidentität der empfohlene Weg. OAuth Identity Passthrough ist für Fälle, in denen der Benutzerkontext wichtig ist — der Agent fordert Benutzer zur Anmeldung auf, und jede Anfrage trägt das eigene Token des Benutzers.&lt;/p&gt;
&lt;h2 id="einrichtung"&gt;Einrichtung&lt;/h2&gt;
&lt;p&gt;Der allgemeine Ablauf:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Deploye deinen MCP-Server auf Azure Functions&lt;/strong&gt; — Beispiele verfügbar für &lt;a href="https://github.com/Azure-Samples/remote-mcp-functions-dotnet"&gt;.NET&lt;/a&gt;, Python, TypeScript und Java&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Aktiviere die integrierte MCP-Authentifizierung&lt;/strong&gt; auf deiner Function App&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hole deine Endpoint-URL&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;Füge den MCP-Server als Tool in Foundry hinzu&lt;/strong&gt; — navigiere zu deinem Agenten im Portal, füge ein neues MCP-Tool hinzu, gib Endpoint und Credentials an&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Dann teste es im Agent Builder Playground, indem du einen Prompt sendest, der eines deiner Tools auslöst.&lt;/p&gt;
&lt;h2 id="meine-einschätzung"&gt;Meine Einschätzung&lt;/h2&gt;
&lt;p&gt;Die Composability-Geschichte wird hier richtig stark. Baue deinen MCP-Server einmal in .NET (oder Python, TypeScript, Java), deploye ihn auf Azure Functions, und jeder MCP-kompatible Client kann ihn nutzen — Coding-Tools, Chat-Apps und jetzt Enterprise-AI-Agenten. Das ist ein „einmal schreiben, überall nutzen&amp;quot;-Muster, das tatsächlich funktioniert.&lt;/p&gt;
&lt;p&gt;Speziell für .NET-Entwickler macht die &lt;a href="https://github.com/Azure-Samples/remote-mcp-functions-dotnet"&gt;Azure Functions MCP-Erweiterung&lt;/a&gt; das unkompliziert. Du definierst deine Tools als Azure Functions, deployest sie, und du hast einen produktionsreifen MCP-Server mit der gesamten Sicherheit und Skalierung, die Azure Functions bietet.&lt;/p&gt;
&lt;h2 id="zusammenfassung"&gt;Zusammenfassung&lt;/h2&gt;
&lt;p&gt;Wenn du MCP-Tools auf Azure Functions betreibst, ist die Verbindung mit Foundry-Agenten ein schneller Gewinn — deine benutzerdefinierten Tools werden zu Enterprise-AI-Fähigkeiten mit korrekter Authentifizierung und ohne Code-Änderungen am Server selbst.&lt;/p&gt;
&lt;p&gt;Lies den &lt;a href="https://devblogs.microsoft.com/azure-sdk/give-your-foundry-agent-custom-tools-with-mcp-servers-on-azure-functions/"&gt;vollständigen Leitfaden&lt;/a&gt; für Schritt-für-Schritt-Anleitungen zu jeder Authentifizierungsmethode, und sieh dir die &lt;a href="https://learn.microsoft.com/azure/azure-functions/functions-mcp-foundry-tools?tabs=entra%2Cmcp-extension%2Cfoundry"&gt;detaillierte Dokumentation&lt;/a&gt; für Produktions-Setups an.&lt;/p&gt;</content:encoded></item><item><title>VS Code 1.116 — Agents App Bekommt Tastaturnavigation und Dateikontext-Vervollständigungen</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/vscode-1-116-agents-app-updates/</guid><description>VS Code 1.116 konzentriert sich auf die Verfeinerung der Agents App — dedizierte Tastenkürzel, Barrierefreiheitsverbesserungen, Dateikontext-Vervollständigungen und CSS @import Link-Auflösung.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Die Originalversion finden Sie &lt;a href="https://thedotnetblog.com/de/posts/emiliano-montesdeoca/vscode-1-116-agents-app-updates/"&gt;hier&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;VS Code 1.116 ist das April 2026-Release, und obwohl es leichter ausfällt als einige neuere Updates, sind die Änderungen fokussiert und bedeutsam — besonders wenn ihr die Agents App täglich nutzt.&lt;/p&gt;
&lt;p&gt;Hier ist, was gelandet ist, basierend auf den &lt;a href="https://code.visualstudio.com/updates/v1_116"&gt;offiziellen Release Notes&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="verbesserungen-der-agents-app"&gt;Verbesserungen der Agents App&lt;/h2&gt;
&lt;p&gt;Die Agents App reift weiter mit Usability-Verfeinerungen, die im täglichen Workflow einen echten Unterschied machen:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dedizierte Tastenkürzel&lt;/strong&gt; — ihr könnt jetzt die Changes-Ansicht, den Dateibaum innerhalb von Changes und die Chat-Personalisierungsansicht mit dedizierten Befehlen und Tastenkürzeln fokussieren. Wenn ihr bisher in der Agents App herumgeklickt habt, bringt das vollständig tastaturgesteuerte Workflows.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Barrierefreiheits-Hilfedialog&lt;/strong&gt; — das Drücken von &lt;code&gt;Alt+F1&lt;/code&gt; im Chat-Eingabefeld öffnet jetzt einen Barrierefreiheits-Hilfedialog, der verfügbare Befehle und Tastenkürzel anzeigt. Screenreader-Nutzer können auch die Ausführlichkeit der Ansagen steuern. Gute Barrierefreiheit nützt allen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dateikontext-Vervollständigungen&lt;/strong&gt; — tippt &lt;code&gt;#&lt;/code&gt; im Agents App Chat, um Dateikontext-Vervollständigungen für euren aktuellen Workspace auszulösen. Das ist eine dieser kleinen Quality-of-Life-Verbesserungen, die jede Interaktion beschleunigen — keine vollständigen Dateipfade mehr beim Verweisen auf Code.&lt;/p&gt;
&lt;h2 id="css-import-link-auflösung"&gt;CSS &lt;code&gt;@import&lt;/code&gt; Link-Auflösung&lt;/h2&gt;
&lt;p&gt;Schön für Frontend-Entwickler: VS Code löst jetzt CSS &lt;code&gt;@import&lt;/code&gt;-Referenzen auf, die node_modules-Pfade verwenden. Ihr könnt durch Imports wie &lt;code&gt;@import &amp;quot;some-module/style.css&amp;quot;&lt;/code&gt; mit &lt;code&gt;Ctrl+Klick&lt;/code&gt; navigieren, wenn ihr Bundler nutzt. Klein, aber es eliminiert einen Reibungspunkt in CSS-Workflows.&lt;/p&gt;
&lt;h2 id="fazit"&gt;Fazit&lt;/h2&gt;
&lt;p&gt;VS Code 1.116 dreht sich um Verfeinerung — die Agents App navigierbarer, barrierefreier und tastaturfreundlicher zu machen. Wenn ihr viel Zeit in der Agents App verbringt (und ich vermute, das tun viele von uns), summieren sich diese Änderungen.&lt;/p&gt;
&lt;p&gt;Schaut euch die &lt;a href="https://code.visualstudio.com/updates/v1_116"&gt;vollständigen Release Notes&lt;/a&gt; für die komplette Liste an.&lt;/p&gt;</content:encoded></item><item><title>VS Code 1.115 — Hintergrund-Terminal-Benachrichtigungen, SSH-Agent-Modus und Mehr</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/vscode-1-115-agent-improvements/</guid><description>VS Code 1.115 bringt Hintergrund-Terminal-Benachrichtigungen für Agenten, SSH-Remote-Agent-Hosting, Dateieinfügen in Terminals und sitzungsbewusstes Edit-Tracking. Das ist relevant für .NET-Entwickler.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Für die Originalversion &lt;a href="https://thedotnetblog.com/de/posts/emiliano-montesdeoca/vscode-1-115-agent-improvements/"&gt;klicke hier&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;VS Code 1.115 ist gerade &lt;a href="https://code.visualstudio.com/updates/v1_115"&gt;erschienen&lt;/a&gt;, und obwohl es ein leichteres Release in Bezug auf Hauptfeatures ist, sind die agentenbezogenen Verbesserungen wirklich nützlich, wenn man täglich mit KI-Coding-Assistenten arbeitet.&lt;/p&gt;
&lt;p&gt;Lass mich hervorheben, was wirklich wissenswert ist.&lt;/p&gt;
&lt;h2 id="hintergrund-terminals-kommunizieren-mit-agenten"&gt;Hintergrund-Terminals kommunizieren mit Agenten&lt;/h2&gt;
&lt;p&gt;Das ist das herausragende Feature. Hintergrund-Terminals benachrichtigen Agenten jetzt automatisch, wenn Befehle abgeschlossen sind, einschließlich Exit-Code und Terminal-Ausgabe. Eingabeaufforderungen in Hintergrund-Terminals werden ebenfalls erkannt und dem Benutzer angezeigt.&lt;/p&gt;
&lt;p&gt;Warum ist das wichtig? Wenn du Copilots Agent-Modus verwendet hast, um Build-Befehle oder Test-Suites im Hintergrund auszuführen, kennst du den Schmerz von &amp;ldquo;Ist das schon fertig?&amp;rdquo; — Hintergrund-Terminals waren im Wesentlichen Fire-and-Forget. Jetzt wird der Agent benachrichtigt, wenn dein &lt;code&gt;dotnet build&lt;/code&gt; oder &lt;code&gt;dotnet test&lt;/code&gt; abgeschlossen ist, sieht die Ausgabe und kann entsprechend reagieren. Es ist eine kleine Änderung, die agentengesteuerte Workflows deutlich zuverlässiger macht.&lt;/p&gt;
&lt;p&gt;Es gibt auch ein neues &lt;code&gt;send_to_terminal&lt;/code&gt;-Tool, das Agenten ermöglicht, Befehle mit Benutzerbestätigung an Hintergrund-Terminals zu senden. Das behebt das Problem, bei dem &lt;code&gt;run_in_terminal&lt;/code&gt; mit einem Timeout Terminals in den Hintergrund verschob und sie schreibgeschützt machte.&lt;/p&gt;
&lt;h2 id="ssh-remote-agent-hosting"&gt;SSH-Remote-Agent-Hosting&lt;/h2&gt;
&lt;p&gt;VS Code unterstützt jetzt die Verbindung zu Remote-Maschinen über SSH, installiert automatisch die CLI und startet sie im Agent-Host-Modus. Das bedeutet, dass deine KI-Agent-Sitzungen direkt auf Remote-Umgebungen zielen können — nützlich für .NET-Entwickler, die auf Linux-Servern oder Cloud-VMs bauen und testen.&lt;/p&gt;
&lt;h2 id="edit-tracking-in-agent-sitzungen"&gt;Edit-Tracking in Agent-Sitzungen&lt;/h2&gt;
&lt;p&gt;Dateiänderungen während Agent-Sitzungen werden jetzt verfolgt und wiederhergestellt, mit Diffs, Undo/Redo und Zustandswiederherstellung. Wenn ein Agent Änderungen an deinem Code vornimmt und etwas schiefgeht, kannst du genau sehen, was sich geändert hat, und es zurückrollen. Beruhigend, wenn man Agenten seine Codebasis ändern lässt.&lt;/p&gt;
&lt;h2 id="browser-tab-erkennung-und-weitere-verbesserungen"&gt;Browser-Tab-Erkennung und weitere Verbesserungen&lt;/h2&gt;
&lt;p&gt;Ein paar weitere Quality-of-Life-Ergänzungen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Browser-Tab-Tracking&lt;/strong&gt; — Chat kann jetzt Browser-Tabs verfolgen und verlinken, die während einer Sitzung geöffnet wurden, sodass Agenten auf Webseiten verweisen können, die du gerade anschaust&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dateieinfügen im Terminal&lt;/strong&gt; — füge Dateien (einschließlich Bilder) mit Strg+V, Drag-and-Drop oder Rechtsklick in das Terminal ein&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Testabdeckung in der Minimap&lt;/strong&gt; — Testabdeckungsindikatoren werden jetzt in der Minimap für einen schnellen visuellen Überblick angezeigt&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pinch-to-Zoom auf Mac&lt;/strong&gt; — der integrierte Browser unterstützt Pinch-to-Zoom-Gesten&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Copilot-Berechtigungen in Sitzungen&lt;/strong&gt; — die Statusleiste zeigt Nutzungsinformationen in der Sitzungsansicht&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Favicon in Gehe zu Datei&lt;/strong&gt; — geöffnete Webseiten zeigen Favicons in der Schnellauswahlliste&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="fazit"&gt;Fazit&lt;/h2&gt;
&lt;p&gt;VS Code 1.115 ist ein inkrementelles Release, aber die Agent-Verbesserungen — Hintergrund-Terminal-Benachrichtigungen, SSH-Agent-Hosting und Edit-Tracking — ergeben zusammen eine spürbar flüssigere Erfahrung für KI-unterstützte Entwicklung. Wenn du Copilots Agent-Modus für .NET-Projekte verwendest, sind das genau die Art von Quality-of-Life-Verbesserungen, die den täglichen Reibungsverlust reduzieren.&lt;/p&gt;
&lt;p&gt;Schau dir die &lt;a href="https://code.visualstudio.com/updates/v1_115"&gt;vollständigen Release Notes&lt;/a&gt; für alle Details an.&lt;/p&gt;</content:encoded></item><item><title>C# 15 bekommt Union Types — und sie sind genau das, was wir uns gewünscht haben</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/csharp-15-union-types-exhaustive-matching/</guid><description>C# 15 führt das union-Schlüsselwort ein — compiler-erzwungene diskriminierte Unions mit erschöpfendem Pattern Matching. So sehen sie aus, warum sie wichtig sind und wie man sie heute ausprobieren kann.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Für die Originalversion &lt;a href="https://thedotnetblog.com/de/posts/emiliano-montesdeoca/csharp-15-union-types-exhaustive-matching/"&gt;klicke hier&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Das ist das Feature, auf das ich gewartet habe. C# 15 führt das &lt;code&gt;union&lt;/code&gt;-Schlüsselwort ein — echte diskriminierte Unions mit compiler-erzwungenem erschöpfendem Pattern Matching. Wenn du jemals die diskriminierten Unions von F# oder die Enums von Rust beneidet hast, weißt du genau, warum das wichtig ist.&lt;/p&gt;
&lt;p&gt;Bill Wagner hat &lt;a href="https://devblogs.microsoft.com/dotnet/csharp-15-union-types/"&gt;den Deep Dive veröffentlicht&lt;/a&gt; auf dem .NET Blog, und ehrlich? Das Design ist sauber, praktisch und sehr C#. Lass mich dir zeigen, was wirklich hier ist und warum es eine größere Sache ist, als es auf den ersten Blick scheint.&lt;/p&gt;
&lt;h2 id="das-problem-das-unions-lösen"&gt;Das Problem, das Unions lösen&lt;/h2&gt;
&lt;p&gt;Vor C# 15 war die Rückgabe von &amp;ldquo;einem von mehreren möglichen Typen&amp;rdquo; aus einer Methode immer ein Kompromiss:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;object&lt;/code&gt;&lt;/strong&gt; — keine Einschränkungen, keine Compiler-Hilfe, defensives Casting überall&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Marker-Interfaces&lt;/strong&gt; — besser, aber jeder kann sie implementieren. Der Compiler kann die Menge nie als vollständig betrachten&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Abstrakte Basisklassen&lt;/strong&gt; — gleiches Problem, plus die Typen brauchen einen gemeinsamen Vorfahren&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nichts davon gibt dir, was du eigentlich willst: eine geschlossene Menge von Typen, bei der der Compiler garantiert, dass du jeden Fall behandelt hast. Das ist es, was Union Types machen.&lt;/p&gt;
&lt;h2 id="die-syntax-ist-wunderschön-einfach"&gt;Die Syntax ist wunderschön einfach&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;Eine Zeile. &lt;code&gt;Pet&lt;/code&gt; kann eine &lt;code&gt;Cat&lt;/code&gt;, einen &lt;code&gt;Dog&lt;/code&gt; oder einen &lt;code&gt;Bird&lt;/code&gt; enthalten. Implizite Konvertierungen werden automatisch generiert:&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;Pet&lt;/span&gt; &lt;span class="n"&gt;pet&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;Dog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Rex&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;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;pet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Dog { Name = Rex }&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Und hier ist die Magie — der Compiler erzwingt erschöpfendes Matching:&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;Kein Discard &lt;code&gt;_&lt;/code&gt; nötig. Der Compiler weiß, dass dieser Switch jeden möglichen Fall abdeckt. Wenn du später einen vierten Typ zur Union hinzufügst, erzeugt jeder Switch-Ausdruck, der ihn nicht behandelt, eine Warnung. Fehlende Fälle werden zur Build-Zeit erkannt, nicht zur Laufzeit.&lt;/p&gt;
&lt;h2 id="wo-das-praktisch-wird"&gt;Wo das praktisch wird&lt;/h2&gt;
&lt;p&gt;Das &lt;code&gt;Pet&lt;/code&gt;-Beispiel ist nett, aber hier glänzen Unions wirklich in echtem Code.&lt;/p&gt;
&lt;h3 id="api-antworten-die-verschiedene-formen-zurückgeben"&gt;API-Antworten, die verschiedene Formen zurückgeben&lt;/h3&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;Jetzt ist jeder Konsument gezwungen, Erfolg, Fehler und Validierungsfehler zu behandeln. Keine &amp;ldquo;Ich habe vergessen, den Fehlerfall zu prüfen&amp;rdquo;-Bugs mehr.&lt;/p&gt;
&lt;h3 id="einzelwert-oder-collection"&gt;Einzelwert oder Collection&lt;/h3&gt;
&lt;p&gt;Das &lt;code&gt;OneOrMore&amp;lt;T&amp;gt;&lt;/code&gt;-Muster zeigt, wie Unions einen Body mit Hilfsmethoden haben können:&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="n"&gt;union&lt;/span&gt; &lt;span class="n"&gt;OneOrMore&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;IEnumerable&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&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="n"&gt;IEnumerable&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;AsEnumerable&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Value&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;T&lt;/span&gt; &lt;span class="n"&gt;single&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;single&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;IEnumerable&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;multiple&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;multiple&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="kc"&gt;null&lt;/span&gt; &lt;span class="p"&gt;=&amp;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&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;Aufrufer übergeben die Form, die ihnen passt:&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;OneOrMore&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;tags&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;dotnet&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;OneOrMore&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;moreTags&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="s"&gt;&amp;#34;csharp&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;unions&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;preview&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="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;tag&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AsEnumerable&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$&amp;#34;[{tag}] &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="c1"&gt;// [dotnet]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="unrelated-typen-zusammensetzen"&gt;Unrelated Typen zusammensetzen&lt;/h3&gt;
&lt;p&gt;Das ist das Killer-Feature gegenüber traditionellen Hierarchien. Du kannst Typen vereinen, die nichts gemeinsam haben — &lt;code&gt;string&lt;/code&gt; und &lt;code&gt;Exception&lt;/code&gt;, &lt;code&gt;int&lt;/code&gt; und &lt;code&gt;IEnumerable&amp;lt;T&amp;gt;&lt;/code&gt;. Kein gemeinsamer Vorfahre nötig.&lt;/p&gt;
&lt;h2 id="custom-unions-für-bestehende-bibliotheken"&gt;Custom Unions für bestehende Bibliotheken&lt;/h2&gt;
&lt;p&gt;Hier ist eine clevere Design-Entscheidung: Jede Klasse oder Struct mit einem &lt;code&gt;[Union]&lt;/code&gt;-Attribut wird als Union-Typ erkannt, solange sie dem grundlegenden Muster folgt (öffentliche Konstruktoren für Case-Typen und eine &lt;code&gt;Value&lt;/code&gt;-Property). Bibliotheken wie OneOf, die bereits Union-ähnliche Typen bereitstellen, können sich für Compiler-Unterstützung entscheiden, ohne ihre Interna umzuschreiben.&lt;/p&gt;
&lt;p&gt;Für performance-sensitive Szenarien mit Werttypen können Bibliotheken ein Boxing-freies Zugriffsmuster mit &lt;code&gt;HasValue&lt;/code&gt;- und &lt;code&gt;TryGetValue&lt;/code&gt;-Methoden implementieren.&lt;/p&gt;
&lt;h2 id="das-große-ganze"&gt;Das große Ganze&lt;/h2&gt;
&lt;p&gt;Union Types sind Teil einer breiteren Exhaustiveness-Story, die zu C# kommt:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Union Types&lt;/strong&gt; — erschöpfendes Matching über eine geschlossene Menge von Typen (jetzt in Preview verfügbar)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Geschlossene Hierarchien&lt;/strong&gt; — der &lt;code&gt;closed&lt;/code&gt;-Modifier verhindert abgeleitete Klassen außerhalb der definierenden Assembly (vorgeschlagen)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Geschlossene Enums&lt;/strong&gt; — verhindert die Erstellung von Werten außer den deklarierten Membern (vorgeschlagen)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Zusammen werden diese drei Features C# eines der umfassendsten typsicheren Pattern-Matching-Systeme in jeder Mainstream-Sprache geben.&lt;/p&gt;
&lt;h2 id="probier-es-heute-aus"&gt;Probier es heute aus&lt;/h2&gt;
&lt;p&gt;Union Types sind in .NET 11 Preview 2 verfügbar:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Installiere das &lt;a href="https://dotnet.microsoft.com/download/dotnet"&gt;.NET 11 Preview SDK&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Setze &lt;code&gt;net11.0&lt;/code&gt; als Target in deinem Projekt&lt;/li&gt;
&lt;li&gt;Setze &lt;code&gt;&amp;lt;LangVersion&amp;gt;preview&amp;lt;/LangVersion&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Ein Hinweis: In Preview 2 musst du &lt;code&gt;UnionAttribute&lt;/code&gt; und &lt;code&gt;IUnion&lt;/code&gt; in deinem Projekt deklarieren, da sie noch nicht in der Runtime sind. Hol dir &lt;a href="https://github.com/dotnet/docs/blob/e68b5dd1e557b53c45ca43e61b013bc919619fb9/docs/csharp/language-reference/builtin-types/snippets/unions/RuntimePolyfill.cs"&gt;RuntimePolyfill.cs&lt;/a&gt; aus dem Docs-Repo, oder füge das hinzu:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;System.Runtime.CompilerServices&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="na"&gt; [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt; AllowMultiple = false)]&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;sealed&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UnionAttribute&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Attribute&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="k"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;IUnion&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;object?&lt;/span&gt; &lt;span class="n"&gt;Value&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&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;h2 id="fazit"&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Union Types sind eines dieser Features, bei denen man sich fragt, wie wir ohne sie ausgekommen sind. Compiler-erzwungenes erschöpfendes Matching, saubere Syntax, generische Unterstützung und Integration mit bestehendem Pattern Matching — es ist alles, was wir wollten, auf die C#-Art umgesetzt.&lt;/p&gt;
&lt;p&gt;Probier sie in .NET 11 Preview 2 aus, mach Sachen kaputt und &lt;a href="https://github.com/dotnet/csharplang/discussions/9663"&gt;teile dein Feedback auf GitHub&lt;/a&gt;. Das ist Preview, und das C#-Team hört aktiv zu. Deine Edge Cases und Design-Feedback werden die finale Version formen.&lt;/p&gt;
&lt;p&gt;Für die vollständige Sprachreferenz, schau dir die &lt;a href="https://learn.microsoft.com/dotnet/csharp/language-reference/builtin-types/union"&gt;Union Types-Dokumentation&lt;/a&gt; und die &lt;a href="https://learn.microsoft.com/dotnet/csharp/language-reference/proposals/unions"&gt;Feature-Spezifikation&lt;/a&gt; an.&lt;/p&gt;</content:encoded></item><item><title>Aspire 13.2 liefert eine Docs-CLI — und dein KI-Agent kann sie auch nutzen</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/aspire-docs-cli-ai-skills/</guid><description>.NET Aspire 13.2 fügt aspire docs hinzu — eine CLI zum Suchen, Durchstöbern und Lesen offizieller Dokumentation, ohne das Terminal zu verlassen. Sie funktioniert auch als Werkzeug für KI-Agenten. Hier erfährst du, warum das wichtig ist.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Für die Originalversion &lt;a href="https://thedotnetblog.com/de/posts/emiliano-montesdeoca/aspire-docs-cli-ai-skills/"&gt;klicke hier&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Kennst du diesen Moment, wenn du tief in einem Aspire AppHost steckst, Integrationen verdrahtest, und du genau nachschauen musst, welche Parameter die Redis-Integration erwartet? Du wechselst mit Alt-Tab zum Browser, suchst auf aspire.dev, kneifst die Augen zusammen bei den API-Docs, und kommst zurück zu deinem Editor. Kontext verloren. Flow unterbrochen.&lt;/p&gt;
&lt;p&gt;Aspire 13.2 hat gerade &lt;a href="https://devblogs.microsoft.com/aspire/aspire-docs-in-your-terminal/"&gt;eine Lösung dafür geliefert&lt;/a&gt;. Die &lt;code&gt;aspire docs&lt;/code&gt;-CLI ermöglicht es dir, offizielle Aspire-Dokumentation direkt aus deinem Terminal zu suchen, durchstöbern und lesen. Und weil sie auf wiederverwendbaren Services basiert, können KI-Agenten und Skills dieselben Befehle nutzen, um Docs nachzuschlagen, statt APIs zu halluzinieren, die gar nicht existieren.&lt;/p&gt;
&lt;h2 id="das-problem-das-hier-wirklich-gelöst-wird"&gt;Das Problem, das hier wirklich gelöst wird&lt;/h2&gt;
&lt;p&gt;David Pine bringt es im Originalbeitrag auf den Punkt: KI-Agenten waren &lt;em&gt;furchtbar&lt;/em&gt; darin, Entwicklern beim Bauen von Aspire-Apps zu helfen. Sie empfahlen &lt;code&gt;dotnet run&lt;/code&gt; statt &lt;code&gt;aspire run&lt;/code&gt;, verwiesen auf learn.microsoft.com für Docs, die auf aspire.dev leben, schlugen veraltete NuGet-Pakete vor, und — mein persönlicher Favorit — halluzinierten APIs, die nicht existieren.&lt;/p&gt;
&lt;p&gt;Warum? Weil Aspire viel länger .NET-spezifisch war, als es polyglott ist, und LLMs mit Trainingsdaten arbeiten, die älter sind als die neuesten Features. Wenn du einem KI-Agenten die Möglichkeit gibst, tatsächlich die aktuellen Docs nachzuschlagen, hört er auf zu raten und wird nützlich.&lt;/p&gt;
&lt;h2 id="drei-befehle-null-browser-tabs"&gt;Drei Befehle, null Browser-Tabs&lt;/h2&gt;
&lt;p&gt;Die CLI ist erfrischend einfach:&lt;/p&gt;
&lt;h3 id="alle-docs-auflisten"&gt;Alle Docs auflisten&lt;/h3&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 docs list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Gibt jede verfügbare Dokumentationsseite auf aspire.dev zurück. Brauchst du maschinenlesbare Ausgabe? Füge &lt;code&gt;--format Json&lt;/code&gt; hinzu.&lt;/p&gt;
&lt;h3 id="nach-einem-thema-suchen"&gt;Nach einem Thema suchen&lt;/h3&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 docs search &lt;span class="s2"&gt;&amp;#34;redis&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Durchsucht sowohl Titel als auch Inhalte mit gewichteter Relevanzbewertung. Dieselbe Suchmaschine, die intern die Dokumentationswerkzeuge antreibt. Du bekommst gerankte Ergebnisse mit Titeln, Slugs und Relevanzwerten.&lt;/p&gt;
&lt;h3 id="eine-vollständige-seite-lesen-oder-nur-einen-abschnitt"&gt;Eine vollständige Seite lesen (oder nur einen Abschnitt)&lt;/h3&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 docs get redis-integration
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Streamt die vollständige Seite als Markdown in dein Terminal. Brauchst du nur einen Abschnitt?&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 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;p&gt;Chirurgische Präzision. Kein Scrollen durch 500 Zeilen. Nur der Teil, den du brauchst.&lt;/p&gt;
&lt;h2 id="der-ki-agent-aspekt"&gt;Der KI-Agent-Aspekt&lt;/h2&gt;
&lt;p&gt;Hier wird es interessant für uns Entwickler, die mit KI-Werkzeugen arbeiten. Dieselben &lt;code&gt;aspire docs&lt;/code&gt;-Befehle funktionieren als Tools für KI-Agenten — über Skills, MCP-Server oder einfache CLI-Wrapper.&lt;/p&gt;
&lt;p&gt;Statt dass dein KI-Assistent Aspire-APIs auf Basis veralteter Trainingsdaten erfindet, kann er &lt;code&gt;aspire docs search &amp;quot;postgres&amp;quot;&lt;/code&gt; aufrufen, die offiziellen Integrations-Docs finden, die richtige Seite lesen und dir den dokumentierten Ansatz liefern. Echtzeit-aktuelle Dokumentation — nicht das, was das Modell vor sechs Monaten auswendig gelernt hat.&lt;/p&gt;
&lt;p&gt;Die Architektur dahinter ist bewusst so gestaltet. Das Aspire-Team hat wiederverwendbare Services gebaut (&lt;code&gt;IDocsIndexService&lt;/code&gt;, &lt;code&gt;IDocsSearchService&lt;/code&gt;, &lt;code&gt;IDocsFetcher&lt;/code&gt;, &lt;code&gt;IDocsCache&lt;/code&gt;) anstelle einer einmaligen Integration. Das bedeutet, dieselbe Suchmaschine funktioniert für Menschen im Terminal, KI-Agenten in deinem Editor und Automatisierung in deiner CI-Pipeline.&lt;/p&gt;
&lt;h2 id="praxisszenarien"&gt;Praxisszenarien&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Schnelle Terminal-Nachschlagen:&lt;/strong&gt; Du steckst drei Dateien tief und brauchst Redis-Konfigurationsparameter. Zwei Befehle, neunzig Sekunden, zurück an die Arbeit:&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 docs search &lt;span class="s2"&gt;&amp;#34;redis&amp;#34;&lt;/span&gt; --limit &lt;span class="m"&gt;1&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;Configuration&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;KI-gestützte Entwicklung:&lt;/strong&gt; Dein VS Code Skill wrapt die CLI-Befehle. Du fragst „Füge eine PostgreSQL-Datenbank zu meinem AppHost hinzu&amp;quot; und der Agent schlägt die echten Docs nach, bevor er antwortet. Keine Halluzinationen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CI/CD-Validierung:&lt;/strong&gt; Deine Pipeline validiert AppHost-Konfigurationen programmatisch gegen offizielle Dokumentation. Die &lt;code&gt;--format Json&lt;/code&gt;-Ausgabe lässt sich sauber mit &lt;code&gt;jq&lt;/code&gt; und anderen Tools weiterverarbeiten.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Eigene Wissensdatenbanken:&lt;/strong&gt; Baust du deine eigenen KI-Tools? Leite strukturierte JSON-Ausgabe direkt in deine Wissensdatenbank:&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 docs search &lt;span class="s2"&gt;&amp;#34;monitoring&amp;#34;&lt;/span&gt; --format Json &lt;span class="p"&gt;|&lt;/span&gt; jq &lt;span class="s1"&gt;&amp;#39;[.[] | {slug, title, summary}]&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Kein Web Scraping. Keine API-Keys. Dieselben strukturierten Daten, die intern von den Dokumentationswerkzeugen genutzt werden.&lt;/p&gt;
&lt;h2 id="die-dokumentation-ist-immer-aktuell"&gt;Die Dokumentation ist immer aktuell&lt;/h2&gt;
&lt;p&gt;Das ist der Teil, den ich am meisten schätze. Die CLI lädt keinen Snapshot herunter — sie fragt aspire.dev mit ETag-basiertem Caching ab. In dem Moment, in dem die Docs aktualisiert werden, spiegelt deine CLI und jeder darauf aufbauende Skill das wider. Keine veralteten Kopien, keine „aber im Wiki stand doch&amp;hellip;&amp;quot;-Momente.&lt;/p&gt;
&lt;h2 id="zum-abschluss"&gt;Zum Abschluss&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;aspire docs&lt;/code&gt; ist eines dieser kleinen Features, das ein echtes Problem sauber löst. Menschen bekommen terminal-nativen Dokumentationszugriff. KI-Agenten bekommen eine Möglichkeit, aufzuhören zu raten und stattdessen echte Docs zu referenzieren. Und alles wird von derselben Wahrheitsquelle gespeist.&lt;/p&gt;
&lt;p&gt;Wenn du mit .NET Aspire baust und die CLI noch nicht ausprobiert hast, führe &lt;code&gt;aspire docs search &amp;quot;dein-thema-hier&amp;quot;&lt;/code&gt; aus und schau, wie es sich anfühlt. Dann überleg dir, diese Befehle in dein KI-Skill- oder Automatisierungs-Setup einzubauen — deine Agenten werden es dir danken.&lt;/p&gt;
&lt;p&gt;Schau dir &lt;a href="https://davidpine.dev/posts/aspire-docs-mcp-tools/"&gt;David Pines Deep Dive&lt;/a&gt; an, wie die Dokumentationswerkzeuge entstanden sind, und die &lt;a href="https://aspire.dev/reference/cli/commands/aspire-docs/"&gt;offizielle CLI-Referenz&lt;/a&gt; für alle Details.&lt;/p&gt;</content:encoded></item><item><title>Microsoft Agent Framework Erreicht 1.0 — Das Ist Wirklich Wichtig für .NET-Entwickler</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/agent-framework-1-0-production-ready/</guid><description>Microsoft Agent Framework 1.0 ist produktionsreif mit stabilen APIs, Multi-Agent-Orchestrierung und Konnektoren für alle großen KI-Anbieter. Hier ist, was du als .NET-Entwickler wissen musst.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Für die Originalversion &lt;a href="https://thedotnetblog.com/de/posts/emiliano-montesdeoca/agent-framework-1-0-production-ready/"&gt;klicke hier&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Wenn du die Reise des Agent Frameworks seit den frühen Tagen von Semantic Kernel und AutoGen verfolgt hast, ist das hier bedeutend. Microsoft Agent Framework hat gerade &lt;a href="https://devblogs.microsoft.com/agent-framework/microsoft-agent-framework-version-1-0/"&gt;Version 1.0 erreicht&lt;/a&gt; — produktionsreif, stabile APIs, langfristiges Support-Commitment. Es ist sowohl für .NET als auch für Python verfügbar und wirklich bereit für echte Workloads.&lt;/p&gt;
&lt;p&gt;Ich schneide durch den Ankündigungslärm und konzentriere mich auf das, was wichtig ist, wenn du KI-gestützte Apps mit .NET baust.&lt;/p&gt;
&lt;h2 id="die-kurzversion"&gt;Die Kurzversion&lt;/h2&gt;
&lt;p&gt;Agent Framework 1.0 vereint das, was früher Semantic Kernel und AutoGen waren, in ein einziges Open-Source-SDK. Eine Agent-Abstraktion. Eine Orchestrierungs-Engine. Mehrere KI-Anbieter. Wenn du zwischen Semantic Kernel für Enterprise-Patterns und AutoGen für forschungsbasierte Multi-Agent-Workflows hin und her gesprungen bist, kannst du aufhören. Das ist jetzt das eine SDK.&lt;/p&gt;
&lt;h2 id="der-einstieg-ist-fast-unfair-einfach"&gt;Der Einstieg ist fast unfair einfach&lt;/h2&gt;
&lt;p&gt;Hier ist ein funktionierender Agent in .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;Das war&amp;rsquo;s. Eine Handvoll Zeilen und du hast einen KI-Agenten, der gegen Azure Foundry läuft. Das Python-Äquivalent ist genauso knapp. Füge Funktions-Tools, Multi-Turn-Konversationen und Streaming hinzu, wie du vorankommst — die API-Oberfläche skaliert, ohne seltsam zu werden.&lt;/p&gt;
&lt;h2 id="multi-agent-orchestrierung--das-ist-die-echte-sache"&gt;Multi-Agent-Orchestrierung — das ist die echte Sache&lt;/h2&gt;
&lt;p&gt;Einzelne Agenten sind gut für Demos, aber Produktionsszenarien brauchen normalerweise Koordination. Agent Framework 1.0 liefert kampferprobte Orchestrierungsmuster direkt von Microsoft Research und AutoGen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sequenziell&lt;/strong&gt; — Agenten verarbeiten der Reihe nach (Autor → Reviewer → Editor)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gleichzeitig&lt;/strong&gt; — verteile an mehrere Agenten parallel, führe Ergebnisse zusammen&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Handoff&lt;/strong&gt; — ein Agent delegiert basierend auf der Absicht an einen anderen&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gruppen-Chat&lt;/strong&gt; — mehrere Agenten diskutieren und konvergieren zu einer Lösung&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Magentic-One&lt;/strong&gt; — das forschungsbasierte Multi-Agent-Pattern von MSR&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Alle unterstützen Streaming, Checkpointing, Human-in-the-Loop-Freigaben und Pause/Fortsetzen. Der Checkpointing-Teil ist entscheidend — lang laufende Workflows überleben Prozess-Neustarts. Für uns .NET-Entwickler, die dauerhafte Workflows mit Azure Functions gebaut haben, fühlt sich das vertraut an.&lt;/p&gt;
&lt;h2 id="die-features-die-am-meisten-zählen"&gt;Die Features, die am meisten zählen&lt;/h2&gt;
&lt;p&gt;Hier ist meine Shortlist dessen, was wissenswert ist:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Middleware-Hooks.&lt;/strong&gt; Du weißt, wie ASP.NET Core Middleware-Pipelines hat? Gleiches Konzept, aber für die Agent-Ausführung. Fange jede Stufe ab — füge Content-Sicherheit, Logging, Compliance-Richtlinien hinzu — ohne die Agent-Prompts anzufassen. So machst du Agenten enterprise-ready.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Steckbare Memory.&lt;/strong&gt; Konversationshistorie, persistenter Key-Value-State, vektorbasiertes Retrieval. Wähle dein Backend: Foundry Agent Service, Mem0, Redis, Neo4j, oder baue dein eigenes. Memory ist das, was einen zustandslosen LLM-Aufruf in einen Agenten verwandelt, der sich tatsächlich an den Kontext erinnert.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Deklarative YAML-Agenten.&lt;/strong&gt; Definiere die Anweisungen, Tools, Memory und Orchestrierungs-Topologie deines Agenten in versionskontrollierten YAML-Dateien. Lade und starte mit einem einzigen API-Aufruf. Das ist ein Game-Changer für Teams, die das Agent-Verhalten iterieren wollen, ohne Code neu zu deployen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A2A- und MCP-Unterstützung.&lt;/strong&gt; MCP (Model Context Protocol) ermöglicht es Agenten, externe Tools dynamisch zu entdecken und aufzurufen. A2A (Agent-to-Agent-Protokoll) ermöglicht runtime-übergreifende Zusammenarbeit — deine .NET-Agenten können sich mit Agenten in anderen Frameworks koordinieren. A2A 1.0-Unterstützung kommt bald.&lt;/p&gt;
&lt;h2 id="die-preview-features-die-es-wert-sind-beobachtet-zu-werden"&gt;Die Preview-Features, die es wert sind, beobachtet zu werden&lt;/h2&gt;
&lt;p&gt;Einige Features wurden als Preview in 1.0 ausgeliefert — funktional, aber APIs können sich weiterentwickeln:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DevUI&lt;/strong&gt; — ein browserbasierter lokaler Debugger zur Visualisierung der Agent-Ausführung, Nachrichtenflüsse und Tool-Aufrufe in Echtzeit. Denk an Application Insights, aber für Agent-Reasoning.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub Copilot SDK und Claude Code SDK&lt;/strong&gt; — verwende Copilot oder Claude als Agent-Harness direkt aus deinem Orchestrierungscode. Komponiere einen programmierfähigen Agenten neben deinen anderen Agenten im selben Workflow.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agent Harness&lt;/strong&gt; — eine anpassbare lokale Runtime, die Agenten Zugriff auf Shell, Dateisystem und Messaging-Loops gibt. Denk an Coding-Agenten und Automatisierungsmuster.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Skills&lt;/strong&gt; — wiederverwendbare Domain-Capability-Pakete, die Agenten strukturierte Fähigkeiten out of the box geben.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="migration-von-semantic-kernel-oder-autogen"&gt;Migration von Semantic Kernel oder AutoGen&lt;/h2&gt;
&lt;p&gt;Wenn du bestehenden Semantic Kernel- oder AutoGen-Code hast, gibt es dedizierte Migrationsassistenten, die deinen Code analysieren und schrittweise Migrationspläne generieren. Der &lt;a href="https://learn.microsoft.com/en-us/agent-framework/migration-guide/from-semantic-kernel"&gt;Semantic Kernel Migrationsleitfaden&lt;/a&gt; und der &lt;a href="https://learn.microsoft.com/en-us/agent-framework/migration-guide/from-autogen"&gt;AutoGen Migrationsleitfaden&lt;/a&gt; führen dich durch alles.&lt;/p&gt;
&lt;p&gt;Wenn du auf den RC-Paketen warst, ist das Upgrade auf 1.0 nur ein Versions-Bump.&lt;/p&gt;
&lt;h2 id="zum-abschluss"&gt;Zum Abschluss&lt;/h2&gt;
&lt;p&gt;Agent Framework 1.0 ist der Produktions-Meilenstein, auf den Enterprise-Teams gewartet haben. Stabile APIs, Multi-Provider-Support, Orchestrierungsmuster, die tatsächlich im großen Maßstab funktionieren, und Migrationspfade von sowohl Semantic Kernel als auch AutoGen.&lt;/p&gt;
&lt;p&gt;Das Framework ist &lt;a href="https://github.com/microsoft/agent-framework"&gt;vollständig Open Source auf GitHub&lt;/a&gt;, und du kannst heute mit &lt;code&gt;dotnet add package Microsoft.Agents.AI&lt;/code&gt; loslegen. Schau dir den &lt;a href="https://learn.microsoft.com/en-us/agent-framework/get-started/"&gt;Schnellstart-Leitfaden&lt;/a&gt; und die &lt;a href="https://github.com/microsoft/agent-framework"&gt;Beispiele&lt;/a&gt; an, um praktisch einzusteigen.&lt;/p&gt;
&lt;p&gt;Wenn du auf das Signal „sicher für den Produktionseinsatz&amp;quot; gewartet hast — das ist es.&lt;/p&gt;</content:encoded></item><item><title>azd ermöglicht jetzt lokales Ausführen und Debuggen von KI-Agenten — Das hat sich im März 2026 geändert</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/azd-march-2026-local-ai-agent-debugging/</guid><description>Das Azure Developer CLI hat im März 2026 sieben Releases veröffentlicht. Die Highlights: ein lokaler Run-and-Debug-Loop für KI-Agenten, GitHub Copilot-Integration beim Projekt-Setup und Container App Jobs-Unterstützung.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Für die Originalversion &lt;a href="https://thedotnetblog.com/de/posts/emiliano-montesdeoca/azd-march-2026-local-ai-agent-debugging/"&gt;klicke hier&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Sieben Releases in einem Monat. Das hat das Azure Developer CLI (&lt;code&gt;azd&lt;/code&gt;)-Team im März 2026 veröffentlicht, und das Hauptfeature ist genau das, worauf ich gewartet habe: &lt;strong&gt;ein lokaler Run-and-Debug-Loop für KI-Agenten&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;PC Chan &lt;a href="https://devblogs.microsoft.com/azure-sdk/azure-developer-cli-azd-march-2026/"&gt;hat die vollständige Zusammenfassung veröffentlicht&lt;/a&gt;, und obwohl es viel gibt, lass mich das auf das filtern, was für .NET-Entwickler, die KI-gestützte Apps bauen, wirklich wichtig ist.&lt;/p&gt;
&lt;h2 id="ki-agenten-ausführen-und-debuggen-ohne-deployment"&gt;KI-Agenten ausführen und debuggen ohne Deployment&lt;/h2&gt;
&lt;p&gt;Das ist das große Ding. Die neue &lt;code&gt;azure.ai.agents&lt;/code&gt;-Extension fügt Befehle hinzu, die dir eine ordentliche Inner-Loop-Erfahrung für KI-Agenten geben:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;azd ai agent run&lt;/code&gt; — startet deinen Agenten lokal&lt;/li&gt;
&lt;li&gt;&lt;code&gt;azd ai agent invoke&lt;/code&gt; — sendet Nachrichten (lokal oder deployed)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;azd ai agent show&lt;/code&gt; — zeigt Container-Status und Health&lt;/li&gt;
&lt;li&gt;&lt;code&gt;azd ai agent monitor&lt;/code&gt; — streamt Container-Logs in Echtzeit&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vorher bedeutete das Testen eines KI-Agenten jedes Mal ein Deployment zu Microsoft Foundry. Jetzt kannst du lokal iterieren, das Verhalten testen und erst deployen, wenn du bereit bist. Wenn du Agenten mit dem Microsoft Agent Framework oder Semantic Kernel baust, ändert das deinen täglichen Workflow.&lt;/p&gt;
&lt;p&gt;Der invoke-Befehl funktioniert sowohl gegen lokale als auch deployed Agenten, was bedeutet, dass du den gleichen Test-Workflow verwenden kannst, egal wo der Agent läuft.&lt;/p&gt;
&lt;h2 id="github-copilot-richtet-dein-azd-projekt-ein"&gt;GitHub Copilot richtet dein azd-Projekt ein&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;azd init&lt;/code&gt; bietet jetzt eine &amp;ldquo;Set up with GitHub Copilot (Preview)&amp;quot;-Option. Statt manuell Prompts über deine Projektstruktur zu beantworten, scaffoldet ein Copilot-Agent die Konfiguration für dich. Wenn ein Befehl fehlschlägt, bietet &lt;code&gt;azd&lt;/code&gt; jetzt KI-gestützte Fehlerbehebung: Kategorie wählen, den Agenten einen Fix vorschlagen lassen und wiederholen — alles ohne das Terminal zu verlassen.&lt;/p&gt;
&lt;h2 id="container-app-jobs-und-deployment-verbesserungen"&gt;Container App Jobs und Deployment-Verbesserungen&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; deployed jetzt &lt;code&gt;Microsoft.App/jobs&lt;/code&gt; über die bestehende &lt;code&gt;host: containerapp&lt;/code&gt;-Konfiguration.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Konfigurierbare Deployment-Timeouts&lt;/strong&gt;: Neues &lt;code&gt;--timeout&lt;/code&gt;-Flag und &lt;code&gt;deployTimeout&lt;/code&gt;-Feld in &lt;code&gt;azure.yaml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Remote-Build-Fallback&lt;/strong&gt;: Bei fehlgeschlagenem ACR-Build fällt &lt;code&gt;azd&lt;/code&gt; automatisch auf lokalen Docker/Podman-Build zurück.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lokale Preflight-Validierung&lt;/strong&gt;: Bicep-Parameter werden lokal validiert, bevor deployed wird.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="dx-verbesserungen"&gt;DX-Verbesserungen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Automatische pnpm/yarn-Erkennung&lt;/strong&gt; für JS/TS-Projekte&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;pyproject.toml-Unterstützung&lt;/strong&gt; für Python&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lokale Template-Verzeichnisse&lt;/strong&gt; — &lt;code&gt;azd init --template&lt;/code&gt; akzeptiert jetzt Dateisystem-Pfade&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bessere Fehlermeldungen&lt;/strong&gt; im &lt;code&gt;--no-prompt&lt;/code&gt;-Modus&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Build-Umgebungsvariablen&lt;/strong&gt; in alle Framework-Build-Subprozesse injiziert (.NET, Node.js, Java, Python)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="zusammenfassung"&gt;Zusammenfassung&lt;/h2&gt;
&lt;p&gt;Der lokale KI-Agenten-Debug-Loop ist der Star dieses Releases, aber die Gesamtheit an Deployment-Verbesserungen und DX-Polish macht &lt;code&gt;azd&lt;/code&gt; reifer als je zuvor. Wenn du .NET-Apps auf Azure deployst — besonders KI-Agenten — lohnt sich dieses Update.&lt;/p&gt;
&lt;p&gt;Schau dir die &lt;a href="https://devblogs.microsoft.com/azure-sdk/azure-developer-cli-azd-march-2026/"&gt;vollständigen Release Notes&lt;/a&gt; für alle Details an.&lt;/p&gt;</content:encoded></item><item><title>Azure DevOps behebt endlich den Markdown-Editor, über den sich alle beschwert haben</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/azure-devops-markdown-editor-work-items/</guid><description>Der Azure DevOps Markdown-Editor für Work Items bekommt eine klarere Unterscheidung zwischen Vorschau- und Bearbeitungsmodus. Eine kleine Änderung, die ein wirklich nerviges Workflow-Problem behebt.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Für die Originalversion &lt;a href="https://thedotnetblog.com/de/posts/emiliano-montesdeoca/azure-devops-markdown-editor-work-items/"&gt;klicke hier&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Wenn du Azure Boards benutzt, hast du das wahrscheinlich erlebt: Du liest eine Work-Item-Beschreibung durch, vielleicht überprüfst du Akzeptanzkriterien, und du machst versehentlich einen Doppelklick. Boom — du bist im Bearbeitungsmodus. Du wolltest nichts bearbeiten. Du hast nur gelesen.&lt;/p&gt;
&lt;p&gt;Dan Hellem &lt;a href="https://devblogs.microsoft.com/devops/improving-the-markdown-editor-for-work-items/"&gt;hat den Fix angekündigt&lt;/a&gt;, und es ist eine dieser Änderungen, die klein klingen, aber echte Reibung aus deinem täglichen Workflow entfernen.&lt;/p&gt;
&lt;h2 id="was-sich-geändert-hat"&gt;Was sich geändert hat&lt;/h2&gt;
&lt;p&gt;Der Markdown-Editor für Work-Item-Textfelder öffnet jetzt standardmäßig im &lt;strong&gt;Vorschaumodus&lt;/strong&gt;. Du kannst den Inhalt lesen und damit interagieren — Links folgen, Formatierung überprüfen — ohne dir Sorgen zu machen, versehentlich in den Bearbeitungsmodus zu gelangen.&lt;/p&gt;
&lt;p&gt;Wenn du wirklich bearbeiten willst, klickst du auf das Bearbeiten-Symbol oben am Feld. Wenn du fertig bist, verlässt du den Modus explizit. Einfach, bewusst, vorhersagbar.&lt;/p&gt;
&lt;h2 id="warum-das-wichtiger-ist-als-es-klingt"&gt;Warum das wichtiger ist als es klingt&lt;/h2&gt;
&lt;p&gt;Der &lt;a href="https://developercommunity.visualstudio.com/t/Markdown-editor-for-work-item-multi-line/10935496"&gt;Community-Feedback-Thread&lt;/a&gt; dazu war lang. Das Doppelklick-zum-Bearbeiten-Verhalten wurde im Juli 2025 mit dem Markdown-Editor eingeführt, und die Beschwerden begannen fast sofort.&lt;/p&gt;
&lt;p&gt;Für Teams, die Sprint-Planung, Backlog-Pflege oder Code-Reviews mit Azure Boards machen, summiert sich diese Mikro-Reibung. Jeder versehentliche Bearbeitungsmodus-Eintritt ist ein Kontextwechsel.&lt;/p&gt;
&lt;h2 id="rollout-status"&gt;Rollout-Status&lt;/h2&gt;
&lt;p&gt;Dies wird bereits an einen Teil der Kunden ausgerollt und über die nächsten zwei bis drei Wochen auf alle erweitert.&lt;/p&gt;
&lt;h2 id="zusammenfassung"&gt;Zusammenfassung&lt;/h2&gt;
&lt;p&gt;Nicht jede Verbesserung muss ein Headliner sein. Manchmal ist das beste Update einfach etwas Nerviges zu entfernen. Das hier ist genau so eine — ein kleiner UX-Fix, der Azure Boards weniger feindselig für Leute macht, die einfach nur ihre Work Items in Ruhe lesen wollen.&lt;/p&gt;</content:encoded></item><item><title>Bookmark Studio bringt Slot-basierte Navigation und Sharing zu Visual Studio Bookmarks</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/bookmark-studio-visual-studio-extension/</guid><description>Mads Kristensens neue Bookmark Studio Extension fügt tastaturgesteuerte Slot-Navigation, einen Bookmark Manager, Farben, Labels und Export-Funktionen zu Visual Studio Bookmarks hinzu.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Für die Originalversion &lt;a href="https://thedotnetblog.com/de/posts/emiliano-montesdeoca/bookmark-studio-visual-studio-extension/"&gt;klicke hier&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Bookmarks in Visual Studio waren schon immer&amp;hellip; okay. Du setzt eines, navigierst zum nächsten, vergisst welches welches ist. Sie funktionieren, aber sie waren nie eine Funktion, die man als mächtig bezeichnen würde.&lt;/p&gt;
&lt;p&gt;Mads Kristensen hat gerade &lt;a href="https://devblogs.microsoft.com/visualstudio/bookmark-studio-evolving-bookmarks-in-visual-studio/"&gt;Bookmark Studio veröffentlicht&lt;/a&gt;, eine experimentelle Extension, die genau die Lücken füllt, auf die du wahrscheinlich gestoßen bist.&lt;/p&gt;
&lt;h2 id="slot-basierte-navigation"&gt;Slot-basierte Navigation&lt;/h2&gt;
&lt;p&gt;Bookmarks können Slots 1–9 zugewiesen und direkt mit &lt;code&gt;Alt+Shift+1&lt;/code&gt; bis &lt;code&gt;Alt+Shift+9&lt;/code&gt; angesprungen werden. Neue Bookmarks bekommen automatisch den nächsten verfügbaren Slot.&lt;/p&gt;
&lt;h2 id="der-bookmark-manager"&gt;Der Bookmark Manager&lt;/h2&gt;
&lt;p&gt;Ein neues Tool-Fenster zeigt alle Bookmarks mit Filterung nach Name, Datei, Ort, Farbe oder Slot.&lt;/p&gt;
&lt;h2 id="organisation-mit-labels-farben-und-ordnern"&gt;Organisation mit Labels, Farben und Ordnern&lt;/h2&gt;
&lt;p&gt;Bookmarks können optional Labels, Farben haben und in Ordner gruppiert werden. Alle Metadaten werden pro Solution gespeichert.&lt;/p&gt;
&lt;h2 id="exportieren-und-teilen"&gt;Exportieren und Teilen&lt;/h2&gt;
&lt;p&gt;Bookmark Studio ermöglicht den Export als Klartext, Markdown oder CSV. Bookmark-Pfade in PR-Beschreibungen einbinden oder Untersuchungspfade mit Teamkollegen teilen.&lt;/p&gt;
&lt;h2 id="bookmarks-die-dem-code-folgen"&gt;Bookmarks die dem Code folgen&lt;/h2&gt;
&lt;p&gt;Bookmark Studio verfolgt Bookmarks relativ zum verankerten Text, sodass sie nicht auf falsche Zeilen driften.&lt;/p&gt;
&lt;h2 id="zusammenfassung"&gt;Zusammenfassung&lt;/h2&gt;
&lt;p&gt;Bookmark Studio erfindet nichts neu. Es nimmt ein Feature, das jahrelang „gut genug&amp;quot; war, und macht es wirklich nützlich. Hol es dir vom &lt;a href="https://marketplace.visualstudio.com/items?itemName=MadsKristensen.BookmarkStudio"&gt;Visual Studio Marketplace&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Das Aspire 13.2 Dashboard hat jetzt eine Telemetrie-API — und das ändert alles</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/aspire-132-dashboard-export-telemetry/</guid><description>.NET Aspire 13.2 bringt smarteren Telemetrie-Export, eine programmierbare API für Traces und Logs sowie Verbesserungen der GenAI-Visualisierung. Hier erfährst du, warum das für deinen Debugging-Workflow wichtig ist.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Für die Originalversion &lt;a href="https://thedotnetblog.com/de/posts/emiliano-montesdeoca/aspire-132-dashboard-export-telemetry/"&gt;klicke hier&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Wenn du verteilte Apps mit .NET Aspire baust, weißt du bereits, dass das Dashboard das Beste an der ganzen Erfahrung ist. Alle Traces, Logs und Metriken an einem Ort — kein externes Jaeger, kein Seq-Setup, keine „lass mich mal im anderen Terminal schauen&amp;quot;-Momente.&lt;/p&gt;
&lt;p&gt;Aspire 13.2 hat es deutlich besser gemacht. James Newton-King &lt;a href="https://devblogs.microsoft.com/aspire/aspire-dashboard-improvements-export-and-telemetry/"&gt;hat das Update angekündigt&lt;/a&gt;, und ehrlich gesagt? Die Telemetrie-Export- und API-Features allein rechtfertigen das Upgrade.&lt;/p&gt;
&lt;h2 id="telemetrie-exportieren-wie-ein-normaler-mensch"&gt;Telemetrie exportieren wie ein normaler Mensch&lt;/h2&gt;
&lt;p&gt;Hier ist das Szenario, das wir alle kennen: Du debuggst ein verteiltes Problem, reproduzierst es endlich nach zwanzig Minuten Setup, und jetzt musst du dem Team zeigen, was passiert ist. Vorher? Screenshots. Trace-IDs kopieren und einfügen. Das übliche Chaos.&lt;/p&gt;
&lt;p&gt;Aspire 13.2 fügt einen ordentlichen &lt;strong&gt;Logs und Telemetrie verwalten&lt;/strong&gt;-Dialog hinzu, in dem du:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Alle Telemetrie löschen kannst (nützlich vor einem Reproduktionsversuch)&lt;/li&gt;
&lt;li&gt;Ausgewählte Telemetrie als ZIP-Datei im Standard-OTLP/JSON-Format exportieren kannst&lt;/li&gt;
&lt;li&gt;Diese ZIP-Datei später in jedes Aspire-Dashboard reimportieren kannst&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Der letzte Punkt ist das Killer-Feature. Du reproduzierst einen Bug, exportierst die Telemetrie, hängst sie an dein Work Item, und dein Kollege kann sie in sein eigenes Dashboard importieren, um genau das zu sehen, was du gesehen hast. Kein „kannst du das auf deinem Rechner reproduzieren?&amp;quot; mehr.&lt;/p&gt;
&lt;p&gt;Einzelne Traces, Spans und Logs haben auch eine „Export JSON&amp;quot;-Option im Kontextmenü. Musst du einen bestimmten Trace teilen? Rechtsklick, JSON kopieren, in die PR-Beschreibung einfügen. Fertig.&lt;/p&gt;
&lt;h2 id="die-telemetrie-api-ist-der-echte-game-changer"&gt;Die Telemetrie-API ist der echte Game Changer&lt;/h2&gt;
&lt;p&gt;Das begeistert mich am meisten. Das Dashboard bietet jetzt eine HTTP-API unter &lt;code&gt;/api/telemetry&lt;/code&gt; zum programmatischen Abfragen von Telemetriedaten. Verfügbare Endpunkte:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GET /api/telemetry/resources&lt;/code&gt; — Ressourcen mit Telemetrie auflisten&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /api/telemetry/spans&lt;/code&gt; — Spans mit Filtern abfragen&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /api/telemetry/logs&lt;/code&gt; — Logs mit Filtern abfragen&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /api/telemetry/traces&lt;/code&gt; — Traces auflisten&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /api/telemetry/traces/{traceId}&lt;/code&gt; — alle Spans für einen bestimmten Trace abrufen&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Alles kommt im OTLP-JSON-Format zurück. Das treibt die neuen CLI-Befehle &lt;code&gt;aspire agent mcp&lt;/code&gt; und &lt;code&gt;aspire otel&lt;/code&gt; an, aber die wirkliche Bedeutung ist größer: Du kannst jetzt Tooling, Skripte und KI-Agent-Integrationen bauen, die die Telemetrie deiner App direkt abfragen.&lt;/p&gt;
&lt;p&gt;Stell dir einen KI-Coding-Agent vor, der deine tatsächlichen verteilten Traces beim Debuggen sehen kann. Das ist nicht mehr hypothetisch — genau das ermöglicht diese API.&lt;/p&gt;
&lt;h2 id="genai-telemetrie-wird-praktisch"&gt;GenAI-Telemetrie wird praktisch&lt;/h2&gt;
&lt;p&gt;Wenn du KI-gestützte Apps mit Semantic Kernel oder Microsoft.Extensions.AI baust, wirst du den verbesserten GenAI-Telemetrie-Visualizer zu schätzen wissen. Aspire 13.2 fügt hinzu:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;KI-Toolbeschreibungen als Markdown gerendert&lt;/li&gt;
&lt;li&gt;Einen dedizierten GenAI-Button auf der Traces-Seite für schnellen Zugriff&lt;/li&gt;
&lt;li&gt;Bessere Fehlerbehandlung für abgeschnittenes oder nicht-standardmäßiges GenAI-JSON&lt;/li&gt;
&lt;li&gt;Click-to-Highlight-Navigation zwischen Tool-Definitionen&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Der Blogpost erwähnt, dass VS Code Copilot Chat, Copilot CLI und OpenCode alle das Konfigurieren eines &lt;code&gt;OTEL_EXPORTER_OTLP_ENDPOINT&lt;/code&gt; unterstützen. Richte sie auf das Aspire-Dashboard und du kannst buchstäblich deinen KI-Agents beim Denken in Echtzeit über Telemetrie zusehen. Das ist ein Debugging-Erlebnis, das du nirgendwo anders findest.&lt;/p&gt;
&lt;h2 id="zusammenfassung"&gt;Zusammenfassung&lt;/h2&gt;
&lt;p&gt;Aspire 13.2 verwandelt das Dashboard von „netter Debugging-UI&amp;quot; zu „programmierbarer Observability-Plattform&amp;quot;. Der Export/Import-Workflow allein spart echte Zeit beim verteilten Debugging, und die Telemetrie-API öffnet die Tür zu KI-gestützter Diagnostik.&lt;/p&gt;
&lt;p&gt;Wenn du bereits Aspire nutzt, aktualisiere. Wenn nicht — das ist ein guter Grund, &lt;a href="https://aspire.dev"&gt;aspire.dev&lt;/a&gt; auszuprobieren.&lt;/p&gt;</content:encoded></item><item><title>Visual Studios März-Update lässt dich eigene Copilot-Agenten bauen — und find_symbol ist ein großes Ding</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/visual-studio-march-2026-custom-copilot-agents/</guid><description>Visual Studios März 2026-Update bringt benutzerdefinierte Copilot-Agenten, wiederverwendbare Agent Skills, ein sprachbewusstes find_symbol-Tool und Copilot-gestütztes Profiling aus dem Test Explorer.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Für die Originalversion &lt;a href="https://thedotnetblog.com/de/posts/emiliano-montesdeoca/visual-studio-march-2026-custom-copilot-agents/"&gt;klicke hier&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Visual Studio hat gerade sein bedeutendstes Copilot-Update bekommen. Mark Downie &lt;a href="https://devblogs.microsoft.com/visualstudio/visual-studio-march-update-build-your-own-custom-agents/"&gt;hat das März-Release angekündigt&lt;/a&gt;, und die Überschrift sind Custom Agents — aber ehrlich gesagt könnte das &lt;code&gt;find_symbol&lt;/code&gt;-Tool weiter unten die Funktion sein, die deinen Workflow am meisten verändert.&lt;/p&gt;
&lt;h2 id="benutzerdefinierte-copilot-agenten-in-deinem-repo"&gt;Benutzerdefinierte Copilot-Agenten in deinem Repo&lt;/h2&gt;
&lt;p&gt;Willst du, dass Copilot deinen Team-Codierstandards folgt, deine Build-Pipeline ausführt oder deine internen Docs abfragt? Jetzt kannst du genau das bauen.&lt;/p&gt;
&lt;p&gt;Custom Agents werden als &lt;code&gt;.agent.md&lt;/code&gt;-Dateien definiert, die du in &lt;code&gt;.github/agents/&lt;/code&gt; in deinem Repository ablegst. Jeder Agent hat vollen Zugriff auf Workspace-Awareness, Code-Verständnis, Tools, dein bevorzugtes Modell und MCP-Verbindungen.&lt;/p&gt;
&lt;h2 id="agent-skills-wiederverwendbare-instruktionspakete"&gt;Agent Skills: wiederverwendbare Instruktionspakete&lt;/h2&gt;
&lt;p&gt;Skills werden automatisch aus &lt;code&gt;.github/skills/&lt;/code&gt; in deinem Repo oder &lt;code&gt;~/.copilot/skills/&lt;/code&gt; in deinem Profil geladen. Denke an Skills als modulare Expertise, die du mischen und kombinieren kannst.&lt;/p&gt;
&lt;h2 id="find_symbol-sprachbewusste-navigation"&gt;find_symbol: sprachbewusste Navigation&lt;/h2&gt;
&lt;p&gt;Das neue &lt;code&gt;find_symbol&lt;/code&gt;-Tool gibt Copilots Agent-Modus sprachservice-gestützte Symbol-Navigation. Statt Text zu suchen, kann der Agent alle Referenzen eines Symbols finden und auf Typ-Informationen, Deklarationen und Scope zugreifen.&lt;/p&gt;
&lt;p&gt;Für .NET-Entwickler ist das eine massive Verbesserung — C#-Codebasen mit tiefen Typ-Hierarchien profitieren enorm.&lt;/p&gt;
&lt;h2 id="tests-mit-copilot-profilen"&gt;Tests mit Copilot profilen&lt;/h2&gt;
&lt;p&gt;Im Test Explorer gibt es jetzt &lt;strong&gt;Profile with Copilot&lt;/strong&gt;. Der Profiling Agent führt den Test aus und analysiert automatisch CPU-Nutzung und Instrumentierungsdaten.&lt;/p&gt;
&lt;h2 id="perf-tips-beim-live-debugging"&gt;Perf Tips beim Live-Debugging&lt;/h2&gt;
&lt;p&gt;Performance-Optimierung passiert jetzt während des Debuggens. Visual Studio zeigt inline Ausführungszeit und Performance-Signale. Siehst du eine langsame Zeile? Klicke auf den Perf Tip und frage Copilot nach Optimierungsvorschlägen.&lt;/p&gt;
&lt;h2 id="nuget-schwachstellen-aus-dem-solution-explorer-beheben"&gt;NuGet-Schwachstellen aus dem Solution Explorer beheben&lt;/h2&gt;
&lt;p&gt;Bei erkannten NuGet-Schwachstellen siehst du einen &lt;strong&gt;Fix with GitHub Copilot&lt;/strong&gt;-Link direkt im Solution Explorer.&lt;/p&gt;
&lt;h2 id="zusammenfassung"&gt;Zusammenfassung&lt;/h2&gt;
&lt;p&gt;Custom Agents und Skills sind die Überschrift, aber &lt;code&gt;find_symbol&lt;/code&gt; ist der Sleeper Hit — es verändert grundlegend, wie genau Copilot beim Refactoring von .NET-Code sein kann. Kombiniert mit Live-Profiling und Schwachstellen-Fixes fühlen sich die KI-Features von Visual Studio jetzt wirklich praktisch an.&lt;/p&gt;
&lt;p&gt;Lade &lt;a href="https://visualstudio.microsoft.com/downloads/"&gt;Visual Studio 2026 Insiders&lt;/a&gt; herunter, um alles auszuprobieren.&lt;/p&gt;</content:encoded></item><item><title>KubeCon Europe 2026: Was .NET-Entwickler wirklich wissen sollten</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/kubecon-2026-aks-updates-dotnet-developers/</guid><description>Microsoft hat auf der KubeCon Europe 2026 eine Flut von Kubernetes-Ankündigungen veröffentlicht. Hier ist die gefilterte Version — nur die AKS- und Cloud-Native-Updates, die zählen, wenn du .NET-Apps auslieferst.</description><content:encoded>&lt;p&gt;&lt;em&gt;Dieser Beitrag wurde automatisch übersetzt. Für die Originalversion &lt;a href="https://thedotnetblog.com/de/posts/emiliano-montesdeoca/kubecon-2026-aks-updates-dotnet-developers/"&gt;klicke hier&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Kennst du das Gefühl, wenn ein riesiger Ankündigungs-Post erscheint und du durchscrollst und denkst: „Cool, aber was ändert das jetzt tatsächlich für mich&amp;quot;? So geht es mir jede KubeCon-Saison.&lt;/p&gt;
&lt;p&gt;Microsoft hat gerade ihren &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;vollständigen KubeCon Europe 2026 Überblick&lt;/a&gt; veröffentlicht — geschrieben von Brendan Burns persönlich — und ehrlich gesagt steckt hier echte Substanz drin. Nicht nur Feature-Checklisten, sondern operative Verbesserungen, die ändern, wie du Dinge in Produktion betreibst.&lt;/p&gt;
&lt;p&gt;Lass mich aufschlüsseln, was für uns .NET-Entwickler wirklich zählt.&lt;/p&gt;
&lt;h2 id="mtls-ohne-die-service-mesh-steuer"&gt;mTLS ohne die Service-Mesh-Steuer&lt;/h2&gt;
&lt;p&gt;Hier ist die Sache mit Service Meshes: Jeder will die Sicherheitsgarantien, niemand will den operativen Overhead. AKS schließt diese Lücke endlich.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://aka.ms/aks/application-network"&gt;Azure Kubernetes Application Network&lt;/a&gt; gibt dir Mutual TLS, anwendungsbewusste Autorisierung und Traffic-Telemetrie — ohne ein volles Sidecar-lastiges Mesh zu deployen. In Kombination mit &lt;a href="https://aka.ms/acns/cilium-mtls"&gt;Cilium mTLS in Advanced Container Networking Services&lt;/a&gt; bekommst du verschlüsselte Pod-zu-Pod-Kommunikation mit X.509-Zertifikaten und SPIRE für Identity Management.&lt;/p&gt;
&lt;p&gt;Was das in der Praxis bedeutet: Deine ASP.NET Core APIs, die mit Background-Workern kommunizieren, deine gRPC-Services, die sich gegenseitig aufrufen — alles verschlüsselt und identitätsverifiziert auf Netzwerkebene, ohne eine einzige Code-Änderung. Das ist gewaltig.&lt;/p&gt;
&lt;p&gt;Für Teams, die von &lt;code&gt;ingress-nginx&lt;/code&gt; migrieren, gibt es außerdem &lt;a href="https://aka.ms/aks/app-routing/gateway-api"&gt;Application Routing mit Meshless Istio&lt;/a&gt; mit vollem Kubernetes Gateway API Support. Keine Sidecars. Standardbasiert. Und sie haben &lt;code&gt;ingress2gateway&lt;/code&gt;-Tools für inkrementelle Migration mitgeliefert.&lt;/p&gt;
&lt;h2 id="gpu-observability-die-kein-nachgedanke-ist"&gt;GPU-Observability, die kein Nachgedanke ist&lt;/h2&gt;
&lt;p&gt;Wenn du KI-Inferenz neben deinen .NET-Services ausführst (und seien wir ehrlich, wer fängt nicht langsam damit an?), bist du wahrscheinlich auf den GPU-Monitoring-Blindspot gestoßen. Du hattest großartige CPU/Memory-Dashboards und dann&amp;hellip; nichts für GPUs ohne manuelle Exporter-Konfiguration.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://aka.ms/aks/managed-gpu-metrics"&gt;AKS zeigt GPU-Metriken jetzt nativ&lt;/a&gt; in Managed Prometheus und Grafana an. Gleicher Stack, gleiche Dashboards, gleiche Alerting-Pipeline. Keine Custom-Exporter, keine Third-Party-Agents.&lt;/p&gt;
&lt;p&gt;Auf der Netzwerkseite wurde Per-Flow-Visibilität für HTTP-, gRPC- und Kafka-Traffic mit einer &lt;a href="https://learn.microsoft.com/en-us/azure/aks/container-network-observability-logs"&gt;One-Click Azure Monitor-Erfahrung&lt;/a&gt; hinzugefügt. IPs, Ports, Workloads, Flow-Richtung, Policy-Entscheidungen — alles in eingebauten Dashboards.&lt;/p&gt;
&lt;p&gt;Und hier kommt die, bei der ich zweimal hingeschaut habe: &lt;a href="https://learn.microsoft.com/en-us/azure/aks/advanced-container-networking-services-overview"&gt;Agentic Container Networking&lt;/a&gt; fügt eine Web-UI hinzu, in der du natürlichsprachliche Fragen zum Netzwerkzustand deines Clusters stellen kannst. „Warum erreicht Pod X Service Y nicht?&amp;quot; → Read-Only-Diagnose aus Live-Telemetrie. Das ist um 2 Uhr nachts wirklich nützlich.&lt;/p&gt;
&lt;h2 id="cross-cluster-networking-ohne-doktortitel"&gt;Cross-Cluster-Networking ohne Doktortitel&lt;/h2&gt;
&lt;p&gt;Multi-Cluster Kubernetes war historisch eine „Bring deinen eigenen Netzwerk-Kleber mit&amp;quot;-Erfahrung. Azure Kubernetes Fleet Manager liefert jetzt &lt;a href="https://aka.ms/kubernetes-fleet/networking/cross-cluster"&gt;Cross-Cluster-Networking&lt;/a&gt; über Managed Cilium Cluster Mesh:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Einheitliche Konnektivität über AKS-Cluster hinweg&lt;/li&gt;
&lt;li&gt;Globale Service-Registry für Cross-Cluster-Discovery&lt;/li&gt;
&lt;li&gt;Zentral verwaltete Konfiguration statt pro Cluster wiederholt&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wenn du .NET-Microservices über Regionen hinweg für Resilienz oder Compliance betreibst, ersetzt das eine Menge fragilen Custom-Kleber. Service A in West Europe kann Service B in East US über das Mesh entdecken und aufrufen, mit konsistenten Routing- und Sicherheitsrichtlinien.&lt;/p&gt;
&lt;h2 id="upgrades-die-keinen-mut-erfordern"&gt;Upgrades, die keinen Mut erfordern&lt;/h2&gt;
&lt;p&gt;Seien wir ehrlich — Kubernetes-Upgrades in Produktion sind stressig. „Upgraden und hoffen&amp;quot; war die De-facto-Strategie für zu viele Teams und der Hauptgrund, warum Cluster bei Versionen hinterherhinken.&lt;/p&gt;
&lt;p&gt;Zwei neue Fähigkeiten ändern das:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Blue-Green Agent Pool Upgrades&lt;/strong&gt; erstellen einen parallelen Node-Pool mit der neuen Konfiguration. Verhalten validieren, Traffic schrittweise verlagern und einen sauberen Rollback-Pfad behalten. Keine In-Place-Mutationen auf Produktions-Nodes mehr.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Agent Pool Rollback&lt;/strong&gt; ermöglicht es, einen Node-Pool auf seine vorherige Kubernetes-Version und Node-Image zurückzusetzen, wenn ein Upgrade schiefgeht — ohne den Cluster neu aufzubauen.&lt;/p&gt;
&lt;p&gt;Zusammen geben sie Operatoren endlich echte Kontrolle über den Upgrade-Lebenszyklus. Für .NET-Teams ist das wichtig, weil Plattform-Geschwindigkeit direkt steuert, wie schnell du neue Runtimes, Sicherheitspatches und Netzwerk-Fähigkeiten einsetzen kannst.&lt;/p&gt;
&lt;h2 id="ki-workloads-werden-zu-first-class-kubernetes-bürgern"&gt;KI-Workloads werden zu First-Class Kubernetes-Bürgern&lt;/h2&gt;
&lt;p&gt;Die Upstream-Open-Source-Arbeit ist gleichermaßen wichtig. Dynamic Resource Allocation (DRA) ist gerade in Kubernetes 1.36 GA geworden und macht GPU-Scheduling zu einem echten First-Class-Feature statt eines Workarounds.&lt;/p&gt;
&lt;p&gt;Einige Projekte, die es wert sind beobachtet zu werden:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Projekt&lt;/th&gt;
&lt;th&gt;Was es macht&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/kaito-project/kubeairunway"&gt;AI Runway&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Gemeinsame Kubernetes-API für Inferenz — Models deployen ohne K8s-Kenntnisse, mit HuggingFace-Discovery und Kostenschätzungen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.cncf.io/blog/2026/01/07/holmesgpt-agentic-troubleshooting-built-for-the-cloud-native-era/"&gt;HolmesGPT&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Agentisches Troubleshooting für Cloud-Native — jetzt ein CNCF-Sandbox-Projekt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/project-dalec/dalec"&gt;Dalec&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Deklarative Container-Image-Builds mit SBOM-Generierung — weniger CVEs in der Build-Phase&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Die Richtung ist klar: Deine .NET-API, deine Semantic-Kernel-Orchestrierungsschicht und deine Inferenz-Workloads sollten alle auf einem konsistenten Plattformmodell laufen. Wir kommen dahin.&lt;/p&gt;
&lt;h2 id="wo-ich-diese-woche-anfangen-würde"&gt;Wo ich diese Woche anfangen würde&lt;/h2&gt;
&lt;p&gt;Wenn du diese Änderungen für dein Team evaluierst, hier meine ehrliche Prioritätenliste:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Observability zuerst&lt;/strong&gt; — GPU-Metriken und Netzwerk-Flow-Logs in einem Nicht-Prod-Cluster aktivieren. Schau dir an, was du verpasst hast.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Blue-Green-Upgrades testen&lt;/strong&gt; — den Rollback-Workflow vor deinem nächsten Produktions-Cluster-Upgrade ausprobieren. Vertrauen in den Prozess aufbauen.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Identity-Aware Networking pilotieren&lt;/strong&gt; — einen internen Service-Pfad wählen und mTLS mit Cilium aktivieren. Den Overhead messen (Spoiler: er ist minimal).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fleet Manager evaluieren&lt;/strong&gt; — wenn du mehr als zwei Cluster betreibst, zahlt sich Cross-Cluster-Networking durch weniger Custom-Kleber von selbst.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Kleine Experimente, schnelles Feedback. Das ist immer der richtige Zug.&lt;/p&gt;
&lt;h2 id="zum-schluss"&gt;Zum Schluss&lt;/h2&gt;
&lt;p&gt;KubeCon-Ankündigungen können überwältigend sein, aber diese Runde bewegt wirklich etwas für .NET-Teams auf AKS. Bessere Netzwerksicherheit ohne Mesh-Overhead, echte GPU-Observability, sicherere Upgrades und stärkere KI-Infrastruktur-Grundlagen.&lt;/p&gt;
&lt;p&gt;Wenn du bereits auf AKS bist, ist jetzt ein großartiger Moment, deine operative Baseline zu verbessern. Und wenn du planst, .NET-Workloads auf Kubernetes zu verlagern — die Plattform ist gerade deutlich produktionsreifer geworden.&lt;/p&gt;</content:encoded></item><item><title>SQL MCP Server, Copilot in SSMS und ein Database Hub mit KI-Agenten: Was von der SQLCon 2026 wirklich zählt</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/agentic-ai-microsoft-databases-what-matters/</guid><description>Microsoft hat auf der SQLCon 2026 eine ganze Reihe von Datenbank-Ankündigungen gemacht. Hier ist das, was wirklich zählt, wenn du KI-gestützte Apps auf Azure SQL baust.</description><content:encoded>&lt;p&gt;Microsoft hat gerade die &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 zusammen mit der FabCon in Atlanta&lt;/a&gt; eröffnet, und es gibt eine Menge zu besprechen. Die ursprüngliche Ankündigung deckt alles ab, von Sparplänen bis hin zu Enterprise-Compliance-Features. Ich werde die Enterprise-Preisfolien überspringen und mich auf die Dinge konzentrieren, die wichtig sind, wenn du als Entwickler mit Azure SQL und KI arbeitest.&lt;/p&gt;
&lt;h2 id="sql-mcp-server-ist-in-der-public-preview"&gt;SQL MCP Server ist in der Public Preview&lt;/h2&gt;
&lt;p&gt;Das ist für mich die Hauptnachricht. Azure SQL Database Hyperscale hat jetzt einen &lt;strong&gt;SQL MCP Server&lt;/strong&gt; in der Public Preview, mit dem du deine SQL-Daten sicher mit KI-Agenten und Copilots über das &lt;a href="https://modelcontextprotocol.io/"&gt;Model Context Protocol&lt;/a&gt; verbinden kannst.&lt;/p&gt;
&lt;p&gt;Wenn du die MCP-Welle verfolgt hast — und ehrlich gesagt, man kann sie gerade kaum übersehen — dann ist das eine große Sache. Statt eigene Datenpipelines zu bauen, um deinen KI-Agenten Kontext aus der Datenbank zu liefern, bekommst du ein standardisiertes Protokoll, um SQL-Daten direkt zur Verfügung zu stellen. Deine Agenten können live Datenbankinformationen abfragen, darüber nachdenken und darauf reagieren.&lt;/p&gt;
&lt;p&gt;Für diejenigen von uns, die KI-Agenten mit Semantic Kernel oder dem Microsoft Agent Framework bauen, eröffnet das einen sauberen Integrationspfad. Dein Agent muss den Lagerbestand prüfen? Einen Kundendatensatz nachschlagen? Eine Bestellung validieren? MCP gibt ihm einen strukturierten Weg, das zu tun, ohne dass du für jedes Szenario maßgeschneiderten Datenabruf-Code schreiben musst.&lt;/p&gt;
&lt;h2 id="github-copilot-in-ssms-22-ist-jetzt-ga"&gt;GitHub Copilot in SSMS 22 ist jetzt GA&lt;/h2&gt;
&lt;p&gt;Wenn du Zeit in SQL Server Management Studio verbringst — und seien wir ehrlich, die meisten von uns tun das immer noch — GitHub Copilot ist jetzt in SSMS 22 allgemein verfügbar. Dieselbe Copilot-Erfahrung, die du bereits in VS Code und Visual Studio nutzt, aber für T-SQL.&lt;/p&gt;
&lt;p&gt;Der praktische Nutzen ist klar: Chat-basierte Unterstützung beim Schreiben von Abfragen, Refactoring von Stored Procedures, Fehlerbehebung bei Performance-Problemen und Verwaltungsaufgaben. Konzeptionell nichts Revolutionäres, aber es direkt in SSMS zu haben bedeutet, dass du nicht zu einem anderen Editor wechseln musst, nur um KI-Hilfe für deine Datenbankarbeit zu bekommen.&lt;/p&gt;
&lt;h2 id="vector-indexes-haben-ein-ernsthaftes-upgrade-bekommen"&gt;Vector Indexes haben ein ernsthaftes Upgrade bekommen&lt;/h2&gt;
&lt;p&gt;Azure SQL Database hat jetzt schnellere, leistungsfähigere Vector Indexes mit voller Unterstützung für Insert, Update und Delete. Das bedeutet, deine Vektordaten bleiben in Echtzeit aktuell — kein Batch-Reindexing mehr nötig.&lt;/p&gt;
&lt;p&gt;Das ist neu:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Quantisierung&lt;/strong&gt; für kleinere Indexgrößen ohne zu viel Genauigkeit zu verlieren&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Iteratives Filtering&lt;/strong&gt; für präzisere Ergebnisse&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Engere Integration mit dem Query Optimizer&lt;/strong&gt; für vorhersagbare Performance&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wenn du Retrieval-Augmented Generation (RAG) mit Azure SQL als Vector Store machst, sind diese Verbesserungen direkt nützlich. Du kannst deine Vektoren zusammen mit deinen relationalen Daten in derselben Datenbank halten, was deine Architektur im Vergleich zum Betrieb einer separaten Vektordatenbank erheblich vereinfacht.&lt;/p&gt;
&lt;p&gt;Dieselben Vektor-Verbesserungen sind auch in SQL Database in Fabric verfügbar, da beide unter der Haube auf derselben SQL-Engine laufen.&lt;/p&gt;
&lt;h2 id="database-hub-in-fabric-agentisches-management"&gt;Database Hub in Fabric: Agentisches Management&lt;/h2&gt;
&lt;p&gt;Dieser Punkt ist eher zukunftsorientiert, aber er ist interessant. Microsoft hat den &lt;strong&gt;Database Hub in Microsoft Fabric&lt;/strong&gt; (Early Access) angekündigt, der dir eine einheitliche Ansicht über Azure SQL, Cosmos DB, PostgreSQL, MySQL und SQL Server via Arc bietet.&lt;/p&gt;
&lt;p&gt;Der interessante Aspekt ist nicht nur die einheitliche Ansicht — es ist der agentische Ansatz beim Management. KI-Agenten überwachen kontinuierlich dein Datenbankökosystem, zeigen auf, was sich geändert hat, erklären, warum es wichtig ist, und schlagen vor, was als nächstes zu tun ist. Es ist ein Human-in-the-Loop-Modell, bei dem der Agent die Vorarbeit leistet und du die Entscheidungen triffst.&lt;/p&gt;
&lt;p&gt;Für Teams, die mehr als eine Handvoll Datenbanken verwalten, könnte das den operativen Lärm wirklich reduzieren. Statt zwischen Portalen zu wechseln und manuell Metriken zu prüfen, bringt der Agent das Signal zu dir.&lt;/p&gt;
&lt;h2 id="was-das-für-net-entwickler-bedeutet"&gt;Was das für .NET-Entwickler bedeutet&lt;/h2&gt;
&lt;p&gt;Der rote Faden, der all diese Ankündigungen verbindet, ist klar: Microsoft bettet KI-Agenten in jede Schicht des Datenbank-Stacks ein. Nicht als Spielerei, sondern als praktische Werkzeugebene.&lt;/p&gt;
&lt;p&gt;Wenn du .NET-Apps baust, die auf Azure SQL basieren, hier ist, was ich tatsächlich tun würde:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Probier den SQL MCP Server aus&lt;/strong&gt;, wenn du KI-Agenten baust. Es ist der sauberste Weg, deinen Agenten Datenbankzugriff zu geben, ohne eigene Plumbing zu bauen.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Aktiviere Copilot in SSMS&lt;/strong&gt;, falls du es noch nicht getan hast — ein kostenloser Produktivitätsgewinn für die tägliche SQL-Arbeit.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Schau dir Vector Indexes an&lt;/strong&gt;, wenn du RAG machst und derzeit einen separaten Vector Store betreibst. Die Konsolidierung auf Azure SQL bedeutet einen Service weniger zu verwalten.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="zusammenfassung"&gt;Zusammenfassung&lt;/h2&gt;
&lt;p&gt;Die vollständige Ankündigung enthält mehr — Sparpläne, Migrationsassistenten, Compliance-Features — aber die Developer-Story liegt im MCP Server, den Vektor-Verbesserungen und der agentischen Management-Schicht. Das sind die Dinge, die verändern, wie du baust, nicht nur wie du budgetierst.&lt;/p&gt;
&lt;p&gt;Schau dir die &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;vollständige Ankündigung von Shireesh Thota&lt;/a&gt; für das komplette Bild an, und &lt;a href="https://aka.ms/database-hub"&gt;melde dich für den Database Hub Early Access an&lt;/a&gt;, wenn du die neue Management-Erfahrung ausprobieren möchtest.&lt;/p&gt;</content:encoded></item><item><title>Azure DevOps MCP Server landet in Microsoft Foundry: Was das für deine KI-Agenten bedeutet</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/azure-devops-mcp-server-microsoft-foundry/</guid><description>Der Azure DevOps MCP Server ist jetzt in Microsoft Foundry verfügbar. Verbinde deine KI-Agenten direkt mit DevOps-Workflows — Work Items, Repos, Pipelines — mit wenigen Klicks.</description><content:encoded>&lt;p&gt;MCP (Model Context Protocol) hat gerade seinen Moment. Wenn du das KI-Agenten-Ökosystem verfolgst, hast du wahrscheinlich bemerkt, dass MCP-Server überall auftauchen — sie geben Agenten die Fähigkeit, über ein standardisiertes Protokoll mit externen Tools und Diensten zu interagieren.&lt;/p&gt;
&lt;p&gt;Jetzt ist der &lt;a href="https://devblogs.microsoft.com/devops/remote-mcp-server-preview-in-microsoft-foundry/"&gt;Azure DevOps MCP Server in Microsoft Foundry verfügbar&lt;/a&gt;, und das ist eine dieser Integrationen, die einen über die praktischen Möglichkeiten nachdenken lässt.&lt;/p&gt;
&lt;h2 id="was-hier-tatsächlich-passiert"&gt;Was hier tatsächlich passiert&lt;/h2&gt;
&lt;p&gt;Microsoft hat den Azure DevOps MCP Server bereits als &lt;a href="https://devblogs.microsoft.com/devops/azure-devops-remote-mcp-server-public-preview"&gt;Public Preview&lt;/a&gt; veröffentlicht — das ist der MCP-Server selbst. Neu ist die Foundry-Integration. Du kannst den Azure DevOps MCP Server jetzt direkt aus dem Tool-Katalog zu deinen Foundry-Agenten hinzufügen.&lt;/p&gt;
&lt;p&gt;Für diejenigen, die Foundry noch nicht kennen: Es ist Microsofts einheitliche Plattform zum Erstellen und Verwalten von KI-gestützten Anwendungen und Agenten im großen Maßstab. Modellzugriff, Orchestrierung, Evaluierung, Deployment — alles an einem Ort.&lt;/p&gt;
&lt;h2 id="die-einrichtung"&gt;Die Einrichtung&lt;/h2&gt;
&lt;p&gt;Die Einrichtung ist überraschend unkompliziert:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Gehe in deinem Foundry-Agenten zu &lt;strong&gt;Add Tools&lt;/strong&gt; &amp;gt; &lt;strong&gt;Catalog&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Suche nach &amp;ldquo;Azure DevOps&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Wähle den Azure DevOps MCP Server (Preview) und klicke auf &lt;strong&gt;Create&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Gib deinen Organisationsnamen ein und verbinde&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Das war&amp;rsquo;s. Dein Agent hat jetzt Zugriff auf Azure DevOps-Tools.&lt;/p&gt;
&lt;h2 id="kontrollieren-worauf-dein-agent-zugreifen-kann"&gt;Kontrollieren, worauf dein Agent zugreifen kann&lt;/h2&gt;
&lt;p&gt;Das ist der Teil, den ich schätze: Du bist nicht auf einen Alles-oder-Nichts-Ansatz festgelegt. Du kannst festlegen, welche Tools deinem Agenten zur Verfügung stehen. Wenn du also willst, dass er nur Work Items lesen, aber keine Pipelines anfassen darf, kannst du das konfigurieren. Prinzip der minimalen Berechtigung, angewandt auf deine KI-Agenten.&lt;/p&gt;
&lt;p&gt;Das ist wichtig für Enterprise-Szenarien, in denen du nicht willst, dass ein Agent versehentlich eine Deployment-Pipeline auslöst, weil jemand ihn gebeten hat, &amp;ldquo;beim Release zu helfen.&amp;rdquo;&lt;/p&gt;
&lt;h2 id="warum-das-für-net-teams-interessant-ist"&gt;Warum das für .NET-Teams interessant ist&lt;/h2&gt;
&lt;p&gt;Denk darüber nach, was das in der Praxis ermöglicht:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sprint-Planungsassistenten&lt;/strong&gt; — Agenten, die Work Items abrufen, Velocity-Daten analysieren und Sprint-Kapazität vorschlagen können&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Code-Review-Bots&lt;/strong&gt; — Agenten, die deinen PR-Kontext verstehen, weil sie tatsächlich deine Repos und verknüpften Work Items lesen können&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Incident Response&lt;/strong&gt; — Agenten, die Work Items erstellen, kürzliche Deployments abfragen und Bugs mit kürzlichen Änderungen korrelieren können&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Entwickler-Onboarding&lt;/strong&gt; — &amp;ldquo;Woran sollte ich arbeiten?&amp;rdquo; bekommt eine echte Antwort, gestützt auf tatsächliche Projektdaten&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Für .NET-Teams, die Azure DevOps bereits für ihre CI/CD-Pipelines und Projektverwaltung nutzen, ist ein KI-Agent, der direkt mit diesen Systemen interagieren kann, ein bedeutender Schritt in Richtung nützlicher Automatisierung.&lt;/p&gt;
&lt;h2 id="das-größere-mcp-bild"&gt;Das größere MCP-Bild&lt;/h2&gt;
&lt;p&gt;Das ist Teil eines breiteren Trends: MCP-Server werden zum Standard, wie KI-Agenten mit der Außenwelt interagieren. Wir sehen sie für GitHub, Azure DevOps, Datenbanken, SaaS-APIs — und Foundry wird zum Hub, wo all diese Verbindungen zusammenkommen.&lt;/p&gt;
&lt;p&gt;Wenn du Agenten im .NET-Ökosystem baust, lohnt es sich, MCP im Auge zu behalten. Das Protokoll ist standardisiert, das Tooling reift heran, und die Foundry-Integration macht es zugänglich, ohne Server-Verbindungen manuell einrichten zu müssen.&lt;/p&gt;
&lt;h2 id="zusammenfassung"&gt;Zusammenfassung&lt;/h2&gt;
&lt;p&gt;Der Azure DevOps MCP Server in Foundry ist in der Preview, also rechne damit, dass er sich weiterentwickelt. Aber der Kern-Workflow ist solide: verbinden, Tool-Zugriff konfigurieren und deine Agenten mit deinen DevOps-Daten arbeiten lassen. Wenn du bereits im Foundry-Ökosystem bist, ist das nur ein paar Klicks entfernt. Probier es aus und schau, welche Workflows du bauen kannst.&lt;/p&gt;
&lt;p&gt;Schau dir die &lt;a href="https://devblogs.microsoft.com/devops/remote-mcp-server-preview-in-microsoft-foundry/"&gt;vollständige Ankündigung&lt;/a&gt; für die Schritt-für-Schritt-Einrichtung und weitere Details an.&lt;/p&gt;</content:encoded></item><item><title>Background Responses im Microsoft Agent Framework: Keine Timeout-Angst mehr</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/background-responses-agent-framework-long-running-tasks/</guid><description>Das Microsoft Agent Framework ermöglicht nun das Auslagern lang laufender KI-Aufgaben mit Continuation Tokens. So funktionieren Background Responses und warum sie für deine .NET-Agenten wichtig sind.</description><content:encoded>&lt;p&gt;Wenn du irgendetwas mit Reasoning-Modellen wie o3 oder GPT-5.2 gebaut hast, kennst du den Schmerz. Dein Agent fängt an, über eine komplexe Aufgabe nachzudenken, der Client wartet, und irgendwo zwischen &amp;ldquo;das ist okay&amp;rdquo; und &amp;ldquo;ist das abgestürzt?&amp;rdquo; bricht deine Verbindung wegen Timeout ab. Die ganze Arbeit? Weg.&lt;/p&gt;
&lt;p&gt;Das Microsoft Agent Framework hat gerade &lt;a href="https://devblogs.microsoft.com/agent-framework/handling-long-running-operations-with-background-responses/"&gt;Background Responses&lt;/a&gt; ausgeliefert — und ehrlich gesagt, das ist eine dieser Funktionen, die von Anfang an hätte existieren sollen.&lt;/p&gt;
&lt;h2 id="das-problem-mit-blockierenden-aufrufen"&gt;Das Problem mit blockierenden Aufrufen&lt;/h2&gt;
&lt;p&gt;In einem traditionellen Request-Response-Muster blockiert dein Client, bis der Agent fertig ist. Das funktioniert gut für schnelle Aufgaben. Aber wenn du ein Reasoning-Modell bittest, tiefgehende Recherche, mehrstufige Analyse oder einen 20-seitigen Bericht zu erstellen? Da schaust du auf Minuten realer Wartezeit. Während dieses Zeitfensters:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HTTP-Verbindungen können ablaufen&lt;/li&gt;
&lt;li&gt;Netzwerkunterbrechungen zerstören die gesamte Operation&lt;/li&gt;
&lt;li&gt;Dein Benutzer starrt auf einen Spinner und fragt sich, ob irgendetwas passiert&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Background Responses drehen das Ganze um.&lt;/p&gt;
&lt;h2 id="wie-continuation-tokens-funktionieren"&gt;Wie Continuation Tokens funktionieren&lt;/h2&gt;
&lt;p&gt;Anstatt zu blockieren, startest du die Agent-Aufgabe und bekommst ein &lt;strong&gt;Continuation Token&lt;/strong&gt; zurück. Denk daran wie an einen Abholschein in einer Werkstatt — du stehst nicht an der Theke und wartest, du kommst zurück, wenn es fertig ist.&lt;/p&gt;
&lt;p&gt;Der Ablauf ist unkompliziert:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Sende deine Anfrage mit &lt;code&gt;AllowBackgroundResponses = true&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Wenn der Agent Hintergrundverarbeitung unterstützt, bekommst du ein Continuation Token&lt;/li&gt;
&lt;li&gt;Polle nach deinem Zeitplan, bis das Token &lt;code&gt;null&lt;/code&gt; zurückgibt — das bedeutet, das Ergebnis ist fertig&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Hier ist die .NET-Version:&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="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;AzureOpenAIClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Uri&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://&amp;lt;myresource&amp;gt;.openai.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="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 class="s"&gt;&amp;#34;&amp;lt;deployment-name&amp;gt;&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&gt;&lt;/span&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&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="c1"&gt;// Pollen bis fertig&lt;/span&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;p&gt;Wenn der Agent sofort fertig wird (einfache Aufgaben, Modelle die keine Hintergrundverarbeitung brauchen), wird kein Continuation Token zurückgegeben. Dein Code funktioniert einfach — keine spezielle Behandlung nötig.&lt;/p&gt;
&lt;h2 id="streaming-mit-wiederaufnahme-die-echte-magie"&gt;Streaming mit Wiederaufnahme: die echte Magie&lt;/h2&gt;
&lt;p&gt;Polling ist gut für Fire-and-Forget-Szenarien, aber was, wenn du Echtzeit-Fortschritt willst? Background Responses unterstützen auch Streaming mit eingebauter Wiederaufnahme.&lt;/p&gt;
&lt;p&gt;Jedes gestreamte Update trägt sein eigenes Continuation Token. Wenn deine Verbindung mitten im Stream abbricht, setzt du genau dort fort, wo du aufgehört hast:&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;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;AgentResponseUpdate&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;latestUpdate&lt;/span&gt; &lt;span class="p"&gt;=&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&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="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunStreamingAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&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 class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Text&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;latestUpdate&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Simuliere eine Netzwerkunterbrechung&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="c1"&gt;// Genau dort fortsetzen, wo wir aufgehört haben&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;latestUpdate&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="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunStreamingAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="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 class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Text&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;Der Agent verarbeitet serverseitig weiter, unabhängig davon, was mit deinem Client passiert. Das ist eingebaute Fehlertoleranz, ohne dass du Retry-Logik oder Circuit Breaker schreiben musst.&lt;/p&gt;
&lt;h2 id="wann-man-das-tatsächlich-verwenden-sollte"&gt;Wann man das tatsächlich verwenden sollte&lt;/h2&gt;
&lt;p&gt;Nicht jeder Agent-Aufruf braucht Background Responses. Für schnelle Completions fügst du Komplexität ohne Grund hinzu. Aber hier glänzen sie:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Komplexe Reasoning-Aufgaben&lt;/strong&gt; — mehrstufige Analyse, tiefgehende Recherche, alles was ein Reasoning-Modell wirklich zum Nachdenken bringt&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lange Content-Generierung&lt;/strong&gt; — detaillierte Berichte, mehrteilige Dokumente, ausführliche Analysen&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unzuverlässige Netzwerke&lt;/strong&gt; — mobile Clients, Edge-Deployments, instabile Firmen-VPNs&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Asynchrone UX-Muster&lt;/strong&gt; — Aufgabe absenden, etwas anderes machen, Ergebnisse abholen&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Für uns .NET-Entwickler, die Enterprise-Apps bauen, ist der letzte Punkt besonders interessant. Denk an eine Blazor-App, in der ein Benutzer einen komplexen Bericht anfordert — du startest die Agent-Aufgabe, zeigst einen Fortschrittsindikator und lässt sie weiterarbeiten. Keine WebSocket-Akrobatik, keine selbstgebaute Queue-Infrastruktur, nur ein Token und eine Poll-Schleife.&lt;/p&gt;
&lt;h2 id="zusammenfassung"&gt;Zusammenfassung&lt;/h2&gt;
&lt;p&gt;Background Responses sind jetzt sowohl in .NET als auch in Python über das Microsoft Agent Framework verfügbar. Wenn du Agenten baust, die mehr als einfaches Q&amp;amp;A machen, lohnt es sich, das in dein Toolkit aufzunehmen. Das Continuation-Token-Muster hält die Dinge einfach und löst gleichzeitig ein sehr reales Produktionsproblem.&lt;/p&gt;
&lt;p&gt;Schau dir die &lt;a href="https://devblogs.microsoft.com/agent-framework/handling-long-running-operations-with-background-responses/"&gt;vollständige Dokumentation&lt;/a&gt; für die komplette API-Referenz und weitere Beispiele an.&lt;/p&gt;</content:encoded></item><item><title>Foundry Agent Service ist GA: Was für .NET-Agent-Entwickler wirklich zählt</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/foundry-agent-service-ga-what-matters/</guid><description>Microsofts Foundry Agent Service ist jetzt GA — mit Private Networking, Voice Live, Produktions-Evaluierungen und einer offenen Multi-Model-Runtime. Hier ist, was du wissen musst.</description><content:encoded>&lt;p&gt;Seien wir ehrlich — einen KI-Agenten-Prototyp zu bauen ist der einfache Teil. Der schwierige Teil ist alles danach: ihn in Produktion zu bringen mit ordentlicher Netzwerk-Isolation, Evaluierungen durchzuführen die wirklich etwas bedeuten, Compliance-Anforderungen zu erfüllen und um 2 Uhr morgens nichts kaputt zu machen.&lt;/p&gt;
&lt;p&gt;Der &lt;a href="https://devblogs.microsoft.com/foundry/foundry-agent-service-ga/"&gt;Foundry Agent Service ist jetzt GA&lt;/a&gt;, und dieses Release ist laser-fokussiert auf genau diese &amp;ldquo;alles danach&amp;rdquo;-Lücke.&lt;/p&gt;
&lt;h2 id="gebaut-auf-der-responses-api"&gt;Gebaut auf der Responses API&lt;/h2&gt;
&lt;p&gt;Die Schlagzeile: der Foundry Agent Service der nächsten Generation basiert auf der OpenAI Responses API. Wenn du bereits mit diesem Wire-Protokoll baust, erfordert die Migration zu Foundry minimale Code-Änderungen. Was du gewinnst: Enterprise-Sicherheit, Private Networking, Entra RBAC, vollständiges Tracing und Evaluierung — auf deiner bestehenden Agent-Logik.&lt;/p&gt;
&lt;p&gt;Die Architektur ist bewusst offen. Du bist nicht an einen Modell-Anbieter oder ein Orchestrierungs-Framework gebunden. Nutze DeepSeek fürs Planen, OpenAI für die Generierung, LangGraph für die Orchestrierung — die Runtime kümmert sich um die Konsistenz-Schicht.&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;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;from&lt;/span&gt; &lt;span class="nn"&gt;azure.ai.projects.models&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;PromptAgentDefinition&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;with&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;DefaultAzureCredential&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;credential&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;AIProjectClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&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;AZURE_AI_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;credential&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;project_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;project_client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_openai_client&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;openai_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="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;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;project_client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;agents&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create_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;agent_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;my-enterprise-agent&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;definition&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;PromptAgentDefinition&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;model&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;AZURE_AI_MODEL_DEPLOYMENT_NAME&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="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;conversation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;openai_client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conversations&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&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="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;openai_client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;responses&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&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;conversation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;conversation&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&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="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;What are best practices for building AI agents?&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;extra_body&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="s2"&gt;&amp;#34;agent_reference&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;name&amp;#34;&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;name&lt;/span&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;agent_reference&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;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;output_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;blockquote&gt;
&lt;p&gt;Wenn du vom &lt;code&gt;azure-ai-agents&lt;/code&gt;-Paket kommst: Agenten sind jetzt First-Class-Operationen auf &lt;code&gt;AIProjectClient&lt;/code&gt; in &lt;code&gt;azure-ai-projects&lt;/code&gt;. Entferne die standalone-Abhängigkeit und nutze &lt;code&gt;get_openai_client()&lt;/code&gt; um Responses zu steuern.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="private-networking-der-enterprise-blocker-beseitigt"&gt;Private Networking: der Enterprise-Blocker beseitigt&lt;/h2&gt;
&lt;p&gt;Das ist die Funktion, die Enterprise-Adoption freischaltet. Foundry unterstützt jetzt vollständiges End-to-End Private Networking mit BYO VNet:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Kein öffentlicher Egress&lt;/strong&gt; — Agent-Traffic berührt nie das öffentliche Internet&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Container/Subnet-Injection&lt;/strong&gt; in dein Netzwerk für lokale Kommunikation&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tool-Konnektivität inklusive&lt;/strong&gt; — MCP-Server, Azure AI Search, Fabric-Datenagenten operieren alle über private Pfade&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Der letzte Punkt ist entscheidend. Es sind nicht nur Inferenz-Aufrufe, die privat bleiben — jeder Tool-Aufruf und jede Retrieval-Anfrage bleibt ebenfalls innerhalb deiner Netzwerk-Grenze. Für Teams, die unter Datenklassifizierungsrichtlinien arbeiten, die externes Routing verbieten, war das was fehlte.&lt;/p&gt;
&lt;h2 id="mcp-authentifizierung-richtig-gemacht"&gt;MCP-Authentifizierung richtig gemacht&lt;/h2&gt;
&lt;p&gt;MCP-Server-Verbindungen unterstützen jetzt das volle Spektrum an Auth-Patterns:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Auth-Methode&lt;/th&gt;
&lt;th&gt;Wann verwenden&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Key-basiert&lt;/td&gt;
&lt;td&gt;Einfacher geteilter Zugriff für org-weite interne Tools&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entra Agent Identity&lt;/td&gt;
&lt;td&gt;Service-to-Service; der Agent authentifiziert sich als er selbst&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entra Managed Identity&lt;/td&gt;
&lt;td&gt;Projekt-Isolation; kein Credential-Management&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OAuth Identity Passthrough&lt;/td&gt;
&lt;td&gt;Benutzer-delegierter Zugriff; Agent handelt im Auftrag der Benutzer&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;OAuth Identity Passthrough ist der interessante. Wenn Benutzer einem Agenten Zugriff auf ihre persönlichen Daten geben müssen — ihr OneDrive, ihre Salesforce-Org, eine SaaS-API mit Benutzer-Scope — handelt der Agent in ihrem Auftrag mit Standard-OAuth-Flows. Keine geteilte System-Identität, die vorgibt, alle zu sein.&lt;/p&gt;
&lt;h2 id="voice-live-sprache-zu-sprache-ohne-das-leitungswirrwarr"&gt;Voice Live: Sprache-zu-Sprache ohne das Leitungswirrwarr&lt;/h2&gt;
&lt;p&gt;Einem Agenten Sprache hinzuzufügen bedeutete bisher, STT, LLM und TTS zusammenzufügen — drei Services, drei Latenz-Hops, drei Abrechnungsflächen, alles von Hand synchronisiert. &lt;strong&gt;Voice Live&lt;/strong&gt; kollabiert das in eine einzige verwaltete API mit:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Semantische Sprachaktivitäts- und Sprechende-Erkennung (versteht Bedeutung, nicht nur Stille)&lt;/li&gt;
&lt;li&gt;Serverseitige Rauschunterdrückung und Echokompensation&lt;/li&gt;
&lt;li&gt;Barge-in-Unterstützung (Benutzer können mitten in der Antwort unterbrechen)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sprachinteraktionen laufen durch die gleiche Agent-Runtime wie Text. Gleiche Evaluatoren, gleiche Traces, gleiche Kosten-Transparenz. Für Kundensupport, Außendienst oder Barrierefreiheits-Szenarien ersetzt das, was vorher eine individuelle Audio-Pipeline erforderte.&lt;/p&gt;
&lt;h2 id="evaluierungen-von-der-checkbox-zum-kontinuierlichen-monitoring"&gt;Evaluierungen: von der Checkbox zum kontinuierlichen Monitoring&lt;/h2&gt;
&lt;p&gt;Hier wird Foundry ernst bezüglich Produktionsqualität. Das Evaluierungs-System hat jetzt drei Schichten:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Mitgelieferte Evaluatoren&lt;/strong&gt; — Kohärenz, Relevanz, Begründetheit, Retrieval-Qualität, Sicherheit. Verbinde mit einem Dataset oder Live-Traffic und erhalte Scores zurück.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Eigene Evaluatoren&lt;/strong&gt; — kodiere deine eigene Geschäftslogik, Ton-Standards und domänenspezifische Compliance-Regeln.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Kontinuierliche Evaluierung&lt;/strong&gt; — Foundry sampelt Live-Produktionstraffic, führt deine Evaluator-Suite aus und zeigt Ergebnisse in Dashboards. Setze Azure-Monitor-Alerts für sinkende Begründetheit oder Sicherheitsschwellen-Verletzungen.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Alles wird in Azure Monitor Application Insights veröffentlicht. Agent-Qualität, Infrastruktur-Gesundheit, Kosten und App-Telemetrie — alles an einem Ort.&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;eval_object&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;openai_client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;evals&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&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;Agent Quality Evaluation&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;data_source_config&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;DataSourceConfigCustom&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="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;custom&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;item_schema&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="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;object&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="s2"&gt;&amp;#34;properties&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;query&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;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;string&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="s2"&gt;&amp;#34;required&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;query&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;include_sample_schema&lt;/span&gt;&lt;span class="o"&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;testing_criteria&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&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_evaluator&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="s2"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;fluency&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="s2"&gt;&amp;#34;evaluator_name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;builtin.fluency&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="s2"&gt;&amp;#34;initialization_parameters&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="s2"&gt;&amp;#34;deployment_name&amp;#34;&lt;/span&gt;&lt;span class="p"&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;AZURE_AI_MODEL_DEPLOYMENT_NAME&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="s2"&gt;&amp;#34;data_mapping&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="s2"&gt;&amp;#34;query&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;{{item.query}}&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="s2"&gt;&amp;#34;response&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;{{sample.output_text}}&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;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;h2 id="sechs-neue-regionen-für-gehostete-agenten"&gt;Sechs neue Regionen für gehostete Agenten&lt;/h2&gt;
&lt;p&gt;Gehostete Agenten sind jetzt verfügbar in East US, North Central US, Sweden Central, Southeast Asia, Japan East und mehr. Das ist wichtig für Datenresidenz-Anforderungen und um Latenz zu komprimieren, wenn dein Agent nahe an seinen Datenquellen läuft.&lt;/p&gt;
&lt;h2 id="warum-das-für-net-entwickler-wichtig-ist"&gt;Warum das für .NET-Entwickler wichtig ist&lt;/h2&gt;
&lt;p&gt;Auch wenn die Code-Samples im GA-Announcement Python-first sind, ist die zugrundeliegende Infrastruktur sprachunabhängig — und das .NET SDK für &lt;code&gt;azure-ai-projects&lt;/code&gt; folgt den gleichen Mustern. Die Responses API, das Evaluierungs-Framework, das Private Networking, die MCP-Auth — all das ist von .NET aus verfügbar.&lt;/p&gt;
&lt;p&gt;Wenn du darauf gewartet hast, dass KI-Agenten von &amp;ldquo;coole Demo&amp;rdquo; zu &amp;ldquo;kann ich tatsächlich auf der Arbeit ausliefern&amp;rdquo; werden, ist dieses GA-Release das Signal. Private Networking, ordentliche Auth, kontinuierliche Evaluierung und Produktions-Monitoring sind die Teile, die gefehlt haben.&lt;/p&gt;
&lt;h2 id="zusammenfassung"&gt;Zusammenfassung&lt;/h2&gt;
&lt;p&gt;Foundry Agent Service ist jetzt verfügbar. Installiere das SDK, öffne &lt;a href="https://ai.azure.com"&gt;das Portal&lt;/a&gt; und fang an zu bauen. Der &lt;a href="https://learn.microsoft.com/azure/foundry/quickstarts/get-started-code"&gt;Schnellstart-Guide&lt;/a&gt; bringt dich in Minuten von null zu einem laufenden Agenten.&lt;/p&gt;
&lt;p&gt;Für den vollständigen technischen Deep-Dive mit allen Code-Samples, schau dir das &lt;a href="https://devblogs.microsoft.com/foundry/foundry-agent-service-ga/"&gt;GA-Announcement&lt;/a&gt; an.&lt;/p&gt;</content:encoded></item><item><title>Vom Laptop in die Produktion: KI-Agenten mit zwei Befehlen auf Microsoft Foundry deployen</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/deploy-ai-agents-foundry-azd-two-commands/</guid><description>Das Azure Developer CLI hat jetzt 'azd ai agent'-Befehle, die deinen KI-Agenten in Minuten vom lokalen Entwicklungsrechner zu einem Live-Foundry-Endpoint bringen. Hier ist der komplette Workflow.</description><content:encoded>&lt;p&gt;Du kennst diese Lücke zwischen &amp;ldquo;es funktioniert auf meinem Rechner&amp;rdquo; und &amp;ldquo;es ist deployed und bedient Traffic&amp;rdquo;? Für KI-Agenten war diese Lücke schmerzhaft groß. Du musst Ressourcen bereitstellen, Modelle deployen, Identität einrichten, Monitoring aufsetzen — und das ist bevor jemand deinen Agenten überhaupt aufrufen kann.&lt;/p&gt;
&lt;p&gt;Das Azure Developer CLI hat das gerade zu einer &lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-ai-agent-end-to-end/"&gt;Zwei-Befehle-Angelegenheit&lt;/a&gt; gemacht.&lt;/p&gt;
&lt;h2 id="der-neue-azd-ai-agent-workflow"&gt;Der neue &lt;code&gt;azd ai agent&lt;/code&gt; Workflow&lt;/h2&gt;
&lt;p&gt;Lass mich durchgehen, wie das tatsächlich aussieht. Du hast ein KI-Agenten-Projekt — sagen wir einen Hotel-Concierge-Agenten. Er funktioniert lokal. Du willst ihn auf Microsoft Foundry laufen lassen.&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 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;Das war&amp;rsquo;s. Zwei Befehle. &lt;code&gt;azd ai agent init&lt;/code&gt; generiert die Infrastructure-as-Code in deinem Repo, und &lt;code&gt;azd up&lt;/code&gt; provisioniert alles auf Azure und veröffentlicht deinen Agenten. Du bekommst einen direkten Link zu deinem Agenten im Foundry-Portal.&lt;/p&gt;
&lt;h2 id="was-unter-der-haube-passiert"&gt;Was unter der Haube passiert&lt;/h2&gt;
&lt;p&gt;Der &lt;code&gt;init&lt;/code&gt;-Befehl generiert echte, inspizierbare Bicep-Templates in deinem Repo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Eine &lt;strong&gt;Foundry Resource&lt;/strong&gt; (Top-Level-Container)&lt;/li&gt;
&lt;li&gt;Ein &lt;strong&gt;Foundry Project&lt;/strong&gt; (wo dein Agent lebt)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Modell-Deployment&lt;/strong&gt;-Konfiguration (GPT-4o, etc.)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Managed Identity&lt;/strong&gt; mit korrekten RBAC-Rollenzuweisungen&lt;/li&gt;
&lt;li&gt;&lt;code&gt;azure.yaml&lt;/code&gt; für die Service-Map&lt;/li&gt;
&lt;li&gt;&lt;code&gt;agent.yaml&lt;/code&gt; mit Agent-Metadaten und Umgebungsvariablen&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hier der entscheidende Punkt: all das gehört dir. Es ist versioniertes Bicep in deinem Repo. Du kannst es inspizieren, anpassen und zusammen mit deinem Agenten-Code committen. Keine magischen Black Boxes.&lt;/p&gt;
&lt;h2 id="die-innere-entwicklungsschleife"&gt;Die innere Entwicklungsschleife&lt;/h2&gt;
&lt;p&gt;Was mir wirklich gefällt, ist die lokale Entwicklungsgeschichte. Wenn du an der Agenten-Logik iterierst, willst du nicht bei jeder Prompt-Änderung neu deployen:&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 ai agent run
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Das startet deinen Agenten lokal. Kombiniere es mit &lt;code&gt;azd ai agent invoke&lt;/code&gt; um Test-Prompts zu senden, und du hast eine enge Feedback-Schleife. Code bearbeiten, neu starten, aufrufen, wiederholen.&lt;/p&gt;
&lt;p&gt;Der &lt;code&gt;invoke&lt;/code&gt;-Befehl ist auch clever beim Routing — wenn ein lokaler Agent läuft, zielt er automatisch darauf. Wenn nicht, geht er an den Remote-Endpoint.&lt;/p&gt;
&lt;h2 id="echtzeit-monitoring"&gt;Echtzeit-Monitoring&lt;/h2&gt;
&lt;p&gt;Das ist die Funktion, die mich überzeugt hat. Sobald dein Agent deployed ist:&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 ai agent monitor --follow
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jede Anfrage und Antwort, die durch deinen Agenten fließt, wird in Echtzeit in dein Terminal gestreamt. Für das Debugging von Produktionsproblemen ist das unbezahlbar. Kein Durchsuchen von Log Analytics, kein Warten auf Metrik-Aggregation — du siehst, was gerade passiert.&lt;/p&gt;
&lt;h2 id="der-komplette-befehlssatz"&gt;Der komplette Befehlssatz&lt;/h2&gt;
&lt;p&gt;Hier die Kurzreferenz:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Befehl&lt;/th&gt;
&lt;th&gt;Was er tut&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;Scaffolding eines Foundry-Agent-Projekts mit 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;Azure-Ressourcen bereitstellen und Agent deployen&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;Prompts an den Remote- oder lokalen Agent senden&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;Agent lokal für Entwicklung ausführen&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;Echtzeit-Logs vom veröffentlichten Agent streamen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;azd ai agent show&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Agent-Gesundheit und -Status prüfen&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;Alle Azure-Ressourcen aufräumen&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="warum-das-für-net-entwickler-wichtig-ist"&gt;Warum das für .NET-Entwickler wichtig ist&lt;/h2&gt;
&lt;p&gt;Auch wenn das Beispiel in der Ankündigung Python-basiert ist, ist die Infrastruktur-Geschichte sprachunabhängig. Dein .NET-Agent bekommt das gleiche Bicep-Scaffolding, das gleiche Managed-Identity-Setup, die gleiche Monitoring-Pipeline. Und wenn du &lt;code&gt;azd&lt;/code&gt; bereits für deine .NET Aspire-Apps oder Azure-Deployments nutzt, passt das direkt in deinen bestehenden Workflow.&lt;/p&gt;
&lt;p&gt;Die Deployment-Lücke für KI-Agenten war einer der größten Reibungspunkte im Ökosystem. Von einem funktionierenden Prototyp zu einem Produktions-Endpoint mit korrekter Identität, Networking und Monitoring zu kommen, sollte keine Woche DevOps-Arbeit erfordern. Jetzt braucht es zwei Befehle und ein paar Minuten.&lt;/p&gt;
&lt;h2 id="zusammenfassung"&gt;Zusammenfassung&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;azd ai agent&lt;/code&gt; ist jetzt verfügbar. Wenn du das Deployment deiner KI-Agenten aufgeschoben hast, weil das Infrastruktur-Setup nach zu viel Arbeit aussah, probier es aus. Schau dir den &lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-ai-agent-end-to-end/"&gt;vollständigen Walkthrough&lt;/a&gt; für die komplette Schritt-für-Schritt-Anleitung inklusive Frontend-Chat-App-Integration an.&lt;/p&gt;</content:encoded></item><item><title>VS Code 1.112: Was .NET-Entwickler wirklich interessieren sollte</title><link>https://thedotnetblog.com/de/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/de/posts/emiliano-montesdeoca/vscode-1-112-dotnet-developers/</guid><description>VS Code 1.112 ist da und vollgepackt mit Agent-Upgrades, einem integrierten Browser-Debugger, MCP-Sandboxing und Monorepo-Support. Hier ist, was wirklich zählt, wenn du mit .NET entwickelst.</description><content:encoded>&lt;p&gt;VS Code 1.112 ist gelandet, und ehrlich? Dieses Release fühlt sich anders an, wenn du deine Tage in der .NET-Welt verbringst. Es gibt viel in den &lt;a href="https://code.visualstudio.com/updates/v1_112"&gt;offiziellen Release Notes&lt;/a&gt;, aber lass mich dir etwas Scrollen ersparen und mich auf das konzentrieren, was für uns wirklich zählt.&lt;/p&gt;
&lt;h2 id="copilot-cli-ist-gerade-viel-nützlicher-geworden"&gt;Copilot CLI ist gerade viel nützlicher geworden&lt;/h2&gt;
&lt;p&gt;Das große Thema dieses Releases ist &lt;strong&gt;Agent-Autonomie&lt;/strong&gt; — Copilot mehr Raum geben, sein Ding zu machen, ohne dass du jeden Schritt überwachst.&lt;/p&gt;
&lt;h3 id="nachrichtensteuerung-und-warteschlange"&gt;Nachrichtensteuerung und Warteschlange&lt;/h3&gt;
&lt;p&gt;Kennst du den Moment, wenn Copilot CLI mitten in einer Aufgabe ist und dir auffällt, dass du etwas vergessen hast zu erwähnen? Vorher musstest du warten. Jetzt kannst du Nachrichten senden, während eine Anfrage noch läuft — entweder um die aktuelle Antwort zu steuern oder Folgeanweisungen in die Warteschlange zu stellen.&lt;/p&gt;
&lt;p&gt;Das ist riesig für die längeren &lt;code&gt;dotnet&lt;/code&gt;-Scaffolding-Aufgaben, wo du Copilot beim Projekt-Setup zuschaust und denkst &amp;ldquo;oh warte, ich brauche auch MassTransit da drin.&amp;rdquo;&lt;/p&gt;
&lt;h3 id="berechtigungsstufen"&gt;Berechtigungsstufen&lt;/h3&gt;
&lt;p&gt;Das ist die Funktion, die mich am meisten begeistert. Copilot CLI-Sitzungen unterstützen jetzt drei Berechtigungsstufen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Standard-Berechtigungen&lt;/strong&gt; — der übliche Flow, bei dem Tools vor dem Ausführen um Bestätigung bitten&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Genehmigungen umgehen&lt;/strong&gt; — genehmigt alles automatisch und wiederholt bei Fehlern&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Autopilot&lt;/strong&gt; — wird voll autonom: genehmigt Tools, beantwortet eigene Fragen und macht weiter, bis die Aufgabe erledigt ist&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wenn du etwas wie das Scaffolding einer neuen ASP.NET Core API mit Entity Framework, Migrationen und Docker-Setup machst — Autopilot-Modus bedeutet, du beschreibst was du willst und holst dir einen Kaffee. Er wird es herausfinden.&lt;/p&gt;
&lt;p&gt;Du kannst Autopilot mit der Einstellung &lt;code&gt;chat.autopilot.enabled&lt;/code&gt; aktivieren.&lt;/p&gt;
&lt;h3 id="änderungen-vor-der-delegation-vorschauen"&gt;Änderungen vor der Delegation vorschauen&lt;/h3&gt;
&lt;p&gt;Wenn du eine Aufgabe an Copilot CLI delegierst, erstellt er einen Worktree. Vorher, wenn du nicht committete Änderungen hattest, musstest du die Quellcodeverwaltung prüfen, um zu sehen, was betroffen wäre. Jetzt zeigt die Chat-Ansicht ausstehende Änderungen direkt dort an, bevor du entscheidest, ob du sie kopieren, verschieben oder ignorieren willst.&lt;/p&gt;
&lt;p&gt;Kleine Sache, aber es erspart dir den &amp;ldquo;warte, was hatte ich gestaged?&amp;quot;-Moment.&lt;/p&gt;
&lt;h2 id="web-apps-debuggen-ohne-vs-code-zu-verlassen"&gt;Web-Apps debuggen ohne VS Code zu verlassen&lt;/h2&gt;
&lt;p&gt;Der integrierte Browser unterstützt jetzt &lt;strong&gt;vollständiges Debugging&lt;/strong&gt;. Du kannst Breakpoints setzen, durch Code steppen und Variablen inspizieren — alles in VS Code. Kein Wechsel mehr zu Edge DevTools.&lt;/p&gt;
&lt;p&gt;Es gibt einen neuen &lt;code&gt;editor-browser&lt;/code&gt; Debug-Typ, und wenn du bereits vorhandene &lt;code&gt;msedge&lt;/code&gt;- oder &lt;code&gt;chrome&lt;/code&gt;-Launch-Konfigurationen hast, ist die Migration so einfach wie das Ändern des &lt;code&gt;type&lt;/code&gt;-Felds in deiner &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;Für Blazor-Entwickler ist das ein Game Changer. Du führst bereits &lt;code&gt;dotnet watch&lt;/code&gt; im Terminal aus — jetzt bleibt dein Debugging auch im selben Fenster.&lt;/p&gt;
&lt;p&gt;Der Browser hat auch unabhängige Zoom-Stufen bekommen (endlich), richtige Rechtsklick-Kontextmenüs, und der Zoom wird pro Website gespeichert.&lt;/p&gt;
&lt;h2 id="mcp-server-sandboxing"&gt;MCP-Server-Sandboxing&lt;/h2&gt;
&lt;p&gt;Das ist wichtiger als du vielleicht denkst. Wenn du MCP-Server verwendest — vielleicht hast du einen für deine Azure-Ressourcen oder Datenbankabfragen eingerichtet — liefen sie bisher mit denselben Berechtigungen wie dein VS Code-Prozess. Das bedeutet voller Zugriff auf dein Dateisystem, Netzwerk, alles.&lt;/p&gt;
&lt;p&gt;Jetzt kannst du sie sandboxen. In deiner &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;Wenn ein gesandboxter Server Zugriff auf etwas braucht, das er nicht hat, fordert VS Code dich auf, die Berechtigung zu erteilen. Viel besser als der &amp;ldquo;hoffen wir, dass niemand etwas Merkwürdiges macht&amp;rdquo;-Ansatz.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Hinweis:&lt;/strong&gt; Sandboxing ist derzeit auf macOS und Linux verfügbar. Windows-Support kommt — Remote-Szenarien wie WSL funktionieren aber bereits.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="monorepo-customization-discovery"&gt;Monorepo-Customization-Discovery&lt;/h2&gt;
&lt;p&gt;Wenn du in einem Monorepo arbeitest (und seien wir ehrlich, viele Enterprise-.NET-Lösungen enden als eines), löst das einen echten Schmerzpunkt.&lt;/p&gt;
&lt;p&gt;Zuvor, wenn du einen Unterordner deines Repos geöffnet hast, fand VS Code deine &lt;code&gt;copilot-instructions.md&lt;/code&gt;, &lt;code&gt;AGENTS.md&lt;/code&gt; oder benutzerdefinierten Skills nicht, die im Repository-Root lagen. Jetzt mit der Einstellung &lt;code&gt;chat.useCustomizationsInParentRepositories&lt;/code&gt; geht es bis zum &lt;code&gt;.git&lt;/code&gt;-Root hoch und entdeckt alles.&lt;/p&gt;
&lt;p&gt;Das bedeutet, dein Team kann Agent-Anweisungen, Prompt-Dateien und benutzerdefinierte Tools über alle Projekte in einem Monorepo teilen, ohne dass jeder den Root-Ordner öffnen muss.&lt;/p&gt;
&lt;h2 id="troubleshoot-für-agent-debugging"&gt;/troubleshoot für Agent-Debugging&lt;/h2&gt;
&lt;p&gt;Hast du jemals benutzerdefinierte Anweisungen oder Skills eingerichtet und dich gefragt, warum sie nicht erkannt werden? Der neue &lt;code&gt;/troubleshoot&lt;/code&gt;-Skill liest Agent-Debug-Logs und sagt dir, was passiert ist — welche Tools verwendet oder übersprungen wurden, warum Anweisungen nicht geladen wurden und was langsame Antworten verursacht.&lt;/p&gt;
&lt;p&gt;Aktiviere es mit:&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;Dann tippe einfach &lt;code&gt;/troubleshoot why is my custom skill not loading?&lt;/code&gt; im Chat.&lt;/p&gt;
&lt;p&gt;Du kannst diese Debug-Logs jetzt auch exportieren und importieren, was großartig ist, um sie mit deinem Team zu teilen, wenn etwas nicht wie erwartet funktioniert.&lt;/p&gt;
&lt;h2 id="bild--und-binärdatei-unterstützung"&gt;Bild- und Binärdatei-Unterstützung&lt;/h2&gt;
&lt;p&gt;Agenten können jetzt Bilddateien von der Festplatte und Binärdateien nativ lesen. Binärdateien werden im Hexdump-Format präsentiert, und Bildausgaben (wie Screenshots vom integrierten Browser) erscheinen in einer Karussell-Ansicht.&lt;/p&gt;
&lt;p&gt;Für .NET-Entwickler denke: füge einen Screenshot eines UI-Bugs in den Chat ein und lass den Agenten verstehen, was falsch ist, oder lass ihn die Ausgabe eines Blazor-Komponenten-Renderings analysieren.&lt;/p&gt;
&lt;h2 id="automatische-symbol-referenzen"&gt;Automatische Symbol-Referenzen&lt;/h2&gt;
&lt;p&gt;Kleine Qualitäts-Verbesserung: wenn du einen Symbolnamen (eine Klasse, Methode, etc.) kopierst und in den Chat einfügst, konvertiert VS Code ihn jetzt automatisch in eine &lt;code&gt;#sym:Name&lt;/code&gt;-Referenz. Das gibt dem Agenten vollen Kontext über das Symbol, ohne dass du es manuell hinzufügen musst.&lt;/p&gt;
&lt;p&gt;Wenn du stattdessen reinen Text möchtest, verwende &lt;code&gt;Ctrl+Shift+V&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="plugins-können-jetzt-aktiviertdeaktiviert-werden"&gt;Plugins können jetzt aktiviert/deaktiviert werden&lt;/h2&gt;
&lt;p&gt;Zuvor bedeutete das Deaktivieren eines MCP-Servers oder Plugins, ihn zu deinstallieren. Jetzt kannst du sie an- und ausschalten — sowohl global als auch pro Workspace. Rechtsklick in der Erweiterungsansicht oder der Customization-Ansicht und fertig.&lt;/p&gt;
&lt;p&gt;Plugins von npm und pypi können sich jetzt auch automatisch aktualisieren, obwohl sie zuerst um Genehmigung bitten, da Updates bedeuten, dass neuer Code auf deinem Rechner ausgeführt wird.&lt;/p&gt;
&lt;h2 id="zusammenfassung"&gt;Zusammenfassung&lt;/h2&gt;
&lt;p&gt;VS Code 1.112 pusht eindeutig hart auf die Agent-Experience — mehr Autonomie, besseres Debugging, engere Sicherheit. Für .NET-Entwickler sind das integrierte Browser-Debugging und die Copilot CLI-Verbesserungen die herausragenden Features.&lt;/p&gt;
&lt;p&gt;Wenn du noch keine vollständige Copilot CLI-Sitzung im Autopilot-Modus für ein .NET-Projekt ausprobiert hast, ist dieses Release ein guter Zeitpunkt zum Starten. Denk nur daran, deine Berechtigungen einzustellen und es machen zu lassen.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://code.visualstudio.com/updates/v1_112"&gt;VS Code 1.112 herunterladen&lt;/a&gt; oder innerhalb von VS Code aktualisieren über &lt;strong&gt;Hilfe &amp;gt; Nach Updates suchen&lt;/strong&gt;.&lt;/p&gt;</content:encoded></item><item><title>Emiliano Montesdeoca</title><link>https://thedotnetblog.com/de/authors/emiliano-montesdeoca/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thedotnetblog.com/de/authors/emiliano-montesdeoca/</guid><description/><content:encoded/></item><item><title>Schreibe für The .NET Blog</title><link>https://thedotnetblog.com/de/contribute/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thedotnetblog.com/de/contribute/</guid><description>Teile dein Wissen mit der .NET-Community. Lerne, wie du als Autor mitmachst und deinen ersten Beitrag einreichst.</description><content:encoded>&lt;p&gt;The .NET Blog ist eine community-getriebene Publikation, in der Entwickler Einblicke, Tutorials und Geschichten rund um .NET, Azure, KI und Cloud-native-Entwicklung teilen. &lt;strong&gt;Wir begrüßen Beiträge von Entwicklern aller Erfahrungsstufen&lt;/strong&gt; — egal ob du deinen ersten technischen Artikel schreibst oder ein erfahrener Speaker bist.&lt;/p&gt;
&lt;h2 id="so-machst-du-mit"&gt;So machst du mit&lt;/h2&gt;
&lt;p&gt;Alles liegt auf GitHub und folgt einem Pull-Request-Workflow. So legst du los:&lt;/p&gt;
&lt;h3 id="1-repository-forken"&gt;1. Repository forken&lt;/h3&gt;
&lt;p&gt;Gehe zu &lt;a href="https://github.com/thedotnetblog/blog"&gt;github.com/thedotnetblog/blog&lt;/a&gt; und forke das Repository in deinen GitHub-Account.&lt;/p&gt;
&lt;h3 id="2-autorenprofil-anlegen"&gt;2. Autorenprofil anlegen&lt;/h3&gt;
&lt;p&gt;Wenn du zum ersten Mal beiträgst, füge dich als Autor hinzu, indem du einen Ordner unter &lt;code&gt;content/authors/dein-benutzername/&lt;/code&gt; mit einer &lt;code&gt;index.md&lt;/code&gt;-Datei erstellst:&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="nn"&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="nt"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Dein Name&amp;#34;&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="nt"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;dein-benutzername&amp;#34;&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="nt"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Deine Rolle oder Position&amp;#34;&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="nt"&gt;bio&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Eine kurze Biografie über dich.&amp;#34;&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="nt"&gt;avatar&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/img/authors/dein-avatar.jpg&amp;#34;&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="nt"&gt;socials&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;platform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;GitHub&amp;#34;&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;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;https://github.com/dein-benutzername&amp;#34;&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;platform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Twitter&amp;#34;&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;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;https://x.com/dein-benutzername&amp;#34;&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="nn"&gt;---&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;Füge dein Avatar-Bild (quadratisch, mindestens 200×200px) unter &lt;code&gt;static/img/authors/&lt;/code&gt; hinzu.&lt;/p&gt;
&lt;h3 id="3-beitrag-schreiben"&gt;3. Beitrag schreiben&lt;/h3&gt;
&lt;p&gt;Erstelle einen neuen Ordner unter &lt;code&gt;content/posts/dein-benutzername/dein-beitrag-slug/&lt;/code&gt; und füge eine &lt;code&gt;index.md&lt;/code&gt;-Datei hinzu:&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="nn"&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="nt"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Titel deines Beitrags&amp;#34;&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="nt"&gt;date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ld"&gt;2025-01-01&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="nt"&gt;author&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;dein-benutzername&amp;#34;&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="nt"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Eine kurze Beschreibung deines Beitrags.&amp;#34;&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="nt"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;dotnet&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;azure&amp;#34;&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="nn"&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;Inhalt deines Beitrags in Markdown...&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;h3 id="4-pull-request-öffnen"&gt;4. Pull Request öffnen&lt;/h3&gt;
&lt;p&gt;Pushe deine Änderungen in deinen Fork und öffne einen Pull Request gegen den &lt;code&gt;main&lt;/code&gt;-Branch. Unser Team wird ihn reviewen und innerhalb weniger Tage Feedback geben.&lt;/p&gt;
&lt;h2 id="was-wir-suchen"&gt;Was wir suchen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tutorials&lt;/strong&gt; — Schritt-für-Schritt-Anleitungen zu .NET, Azure, KI, Blazor, Aspire und mehr&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tiefgehende Analysen&lt;/strong&gt; — ausführliche Erkundungen einer Technologie, eines Musters oder einer Architektur&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Community-Geschichten&lt;/strong&gt; — deine Erfahrungen beim Bauen mit .NET in der Produktion&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Event-Zusammenfassungen&lt;/strong&gt; — Berichte von Konferenzen, Meetups oder Webinaren&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="richtlinien"&gt;Richtlinien&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Inhalte sollten technisch und für das .NET-Ökosystem relevant sein&lt;/li&gt;
&lt;li&gt;Codebeispiele müssen korrekt und in einem echten Projekt getestet sein&lt;/li&gt;
&lt;li&gt;Füge eine aussagekräftige Beschreibung und mindestens ein relevantes Tag hinzu&lt;/li&gt;
&lt;li&gt;Beiträge werden automatisch in alle unterstützten Sprachen übersetzt&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="kontakt"&gt;Kontakt&lt;/h2&gt;
&lt;p&gt;Öffne ein Issue auf &lt;a href="https://github.com/thedotnetblog/blog/issues"&gt;GitHub&lt;/a&gt; oder schreib uns auf &lt;a href="https://x.com/thedotnetblog"&gt;X / Twitter&lt;/a&gt;. Wir freuen uns, dich in der Community willkommen zu heißen!&lt;/p&gt;</content:encoded></item></channel></rss>