<?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/it/</link><description>Articles, tutorials and insights from the .NET community.</description><generator>Hugo</generator><language>it</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/it/index.xml" rel="self" type="application/rss+xml"/><item><title>NDC Oslo 2026</title><link>https://thedotnetblog.com/it/events/ndc-oslo-2026/</link><pubDate>Mon, 14 Sep 2026 00:00:00 +0000</pubDate><guid>https://thedotnetblog.com/it/events/ndc-oslo-2026/</guid><description>Una delle più grandi conferenze per sviluppatori in Europa — 5 giorni di workshop, sessioni e networking all'Oslo Spektrum con oltre 150 speaker e 160 sessioni.</description><content:encoded>&lt;p&gt;&lt;strong&gt;NDC Oslo 2026&lt;/strong&gt; si svolge dal &lt;strong&gt;14 al 18 settembre 2026&lt;/strong&gt; all&amp;rsquo;&lt;strong&gt;Oslo Spektrum&lt;/strong&gt;, Oslo, Norvegia.&lt;/p&gt;
&lt;p&gt;NDC Oslo è una delle conferenze per sviluppatori più grandi e rispettate in Europa, che copre tutto, da .NET e cloud a sicurezza, architettura, IA e oltre. L&amp;rsquo;edizione 2026 è attualmente in fase di prenotazione, con un programma massiccio in preparazione.&lt;/p&gt;
&lt;h2 id="in-numeri"&gt;In numeri&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;160 sessioni&lt;/strong&gt; (in prenotazione)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;150 speaker&lt;/strong&gt; (in prenotazione)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;15 workshop&lt;/strong&gt; (in prenotazione)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;5 giorni&lt;/strong&gt; — workshop + conferenza&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="speaker-confermati"&gt;Speaker confermati&lt;/h2&gt;
&lt;p&gt;La lista degli speaker è in fase di definizione, con nomi confermati tra cui:&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="biglietti"&gt;Biglietti&lt;/h2&gt;
&lt;p&gt;I biglietti Early Bird sono disponibili — l&amp;rsquo;offerta Early Bird scade il &lt;strong&gt;22 maggio 2026&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;È aperto anche il CFP (Call for Papers).&lt;/p&gt;
&lt;h2 id="altri-eventi-ndc-nel-2026"&gt;Altri eventi NDC nel 2026&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;NDC Sydney — 22–24 aprile 2026&lt;/li&gt;
&lt;li&gt;NDC Toronto — 5–8 maggio 2026&lt;/li&gt;
&lt;li&gt;NDC Copenhagen — 1–4 giugno 2026&lt;/li&gt;
&lt;li&gt;NDC AI — 8–10 giugno 2026&lt;/li&gt;
&lt;li&gt;NDC TechTown — 21–24 settembre 2026&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="link"&gt;Link&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ndcoslo.com/"&gt;Sito dell&amp;rsquo;evento&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ndcoslo.com/tickets"&gt;Biglietti&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/it/events/dotnet-day-switzerland-2026/</link><pubDate>Tue, 25 Aug 2026 00:00:00 +0000</pubDate><guid>https://thedotnetblog.com/it/events/dotnet-day-switzerland-2026/</guid><description>Una conferenza comunitaria no-profit per sviluppatori, architetti ed esperti .NET — su .NET, C#, ASP.NET Core, Azure e altro — a Zurigo.</description><content:encoded>&lt;p&gt;&lt;strong&gt;.NET Day Switzerland 2026&lt;/strong&gt; si svolge il &lt;strong&gt;25 agosto 2026&lt;/strong&gt; presso l&amp;rsquo;&lt;strong&gt;Arena Cinemas Sihlcity&lt;/strong&gt; (Kalanderplatz 8, 8045 Zurigo).&lt;/p&gt;
&lt;p&gt;È una conferenza comunitaria indipendente e no-profit per sviluppatori, architetti ed esperti che vogliono discutere di .NET, C#, ASP.NET Core, Azure e dell&amp;rsquo;ecosistema di sviluppo Microsoft. Tutti gli speaker e lo staff prestano il loro tempo come volontari, e qualsiasi surplus dalla vendita dei biglietti va in beneficenza o alla community .NET svizzera.&lt;/p&gt;
&lt;h2 id="cosa-ti-aspetta"&gt;Cosa ti aspetta&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Sessioni di alta qualità con esperti internazionali&lt;/li&gt;
&lt;li&gt;Networking con altri partecipanti&lt;/li&gt;
&lt;li&gt;Cibo, snack e bevande durante le pause, il pranzo e l&amp;rsquo;aperitivo&lt;/li&gt;
&lt;li&gt;Opportunità di carriera attraverso interazioni con gli sponsor&lt;/li&gt;
&lt;li&gt;Conversazioni dirette con gli speaker durante le pause&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="biglietti"&gt;Biglietti&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Categoria&lt;/th&gt;
&lt;th&gt;Prezzo&lt;/th&gt;
&lt;th&gt;Disponibilità&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 biglietti&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 biglietti&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;Fino a esaurimento&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Speaker e programma non sono ancora stati annunciati — la call for speakers è aperta su &lt;a href="https://sessionize.com/net-day-switzerland-2026/"&gt;Sessionize&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="organizzatori"&gt;Organizzatori&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="link"&gt;Link&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dotnetday.ch/"&gt;Sito dell&amp;rsquo;evento&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://eepurl.com/dDoFEn"&gt;Iscrizione alla newsletter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title>SDD Conference 2026</title><link>https://thedotnetblog.com/it/events/sdd-conference-2026/</link><pubDate>Mon, 11 May 2026 00:00:00 +0000</pubDate><guid>https://thedotnetblog.com/it/events/sdd-conference-2026/</guid><description>Una conferenza di 5 giorni sullo sviluppo software al Barbican Centre di Londra con 78 sessioni e 14 workshop su architettura, .NET, IA, Azure, DevOps e altro.</description><content:encoded>&lt;p&gt;&lt;strong&gt;SDD 2026&lt;/strong&gt; si svolge dall&amp;rsquo;&lt;strong&gt;11 al 15 maggio 2026&lt;/strong&gt; al &lt;strong&gt;Barbican Centre di Londra&lt;/strong&gt;. La conferenza principale di 3 giorni va da martedì a giovedì, con workshop opzionali di un&amp;rsquo;intera giornata il lunedì e il venerdì.&lt;/p&gt;
&lt;p&gt;Con &lt;strong&gt;78 sessioni&lt;/strong&gt; e &lt;strong&gt;14 workshop&lt;/strong&gt;, è una delle conferenze per sviluppatori più ricche d&amp;rsquo;Europa.&lt;/p&gt;
&lt;h2 id="argomenti"&gt;Argomenti&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Pensiero Architetturale&lt;/li&gt;
&lt;li&gt;Codice Funzionale in C# 13&lt;/li&gt;
&lt;li&gt;Design Serverless&lt;/li&gt;
&lt;li&gt;IA Semantica&lt;/li&gt;
&lt;li&gt;Azure Kubernetes Services&lt;/li&gt;
&lt;li&gt;Strategie Lean DevOps&lt;/li&gt;
&lt;li&gt;The Model Context Protocol (MCP)&lt;/li&gt;
&lt;li&gt;IA Agentica in .NET&lt;/li&gt;
&lt;li&gt;Refactoring del Monolite&lt;/li&gt;
&lt;li&gt;Programmare Più Velocemente con gli LLM&lt;/li&gt;
&lt;li&gt;Crittografia in un Mondo Post-Quantistico&lt;/li&gt;
&lt;li&gt;Sviluppo Local First&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="speaker"&gt;Speaker&lt;/h2&gt;
&lt;p&gt;Lineup di classe mondiale che include &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; e &lt;strong&gt;Raju Gandhi&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="biglietti-e-informazioni"&gt;Biglietti e informazioni&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://sddconf.com/"&gt;Sito dell&amp;rsquo;evento&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sddvault.s3.amazonaws.com/assets/SDD_2026_schedule.pdf"&gt;PDF dell&amp;rsquo;agenda completa&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sddconf.com/register"&gt;Opzioni di registrazione&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Il 98% dei partecipanti di SDD 2025 ha valutato l&amp;rsquo;esperienza complessiva come buona, molto buona o eccellente.&lt;/p&gt;</content:encoded></item><item><title>Azure DevOps MCP Server Aggiornamento Aprile: Query WIQL, Auth PAT e MCP Apps Sperimentali</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/azure-devops-mcp-server-april-2026-wiql-pat-apps/</guid><description>Il Azure DevOps MCP Server riceve query WIQL per i work item, autenticazione Personal Access Token, annotazioni MCP e una funzionalità sperimentale di MCP Apps.</description><content:encoded>&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/posts/emiliano-montesdeoca/azure-devops-mcp-server-april-2026-wiql-pat-apps/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Il Azure DevOps MCP Server continua a migliorare. L&amp;rsquo;aggiornamento di aprile copre entrambi i server.&lt;/p&gt;
&lt;h2 id="supporto-query-wiql"&gt;Supporto Query WIQL&lt;/h2&gt;
&lt;p&gt;Il nuovo strumento &lt;code&gt;wit_query_by_wiql&lt;/code&gt; permette di eseguire query Work Item Query Language direttamente dal client MCP.&lt;/p&gt;
&lt;h2 id="personal-access-tokens"&gt;Personal Access Tokens&lt;/h2&gt;
&lt;p&gt;Autenticazione PAT sul server locale — importante per scenari di integrazione senza autenticazione interattiva.&lt;/p&gt;
&lt;h2 id="annotazioni-mcp"&gt;Annotazioni MCP&lt;/h2&gt;
&lt;p&gt;Tag di metadati per strumenti di sola lettura, distruttivi e open-world — fondamentali per l&amp;rsquo;affidabilità degli agenti.&lt;/p&gt;
&lt;h2 id="consolidamento-degli-strumenti-wiki"&gt;Consolidamento degli Strumenti Wiki&lt;/h2&gt;
&lt;p&gt;5 strumenti wiki separati → 2 strumenti più capaci. Meno strumenti = migliori prestazioni LLM.&lt;/p&gt;
&lt;h2 id="sperimentale-mcp-apps"&gt;Sperimentale: MCP Apps&lt;/h2&gt;
&lt;p&gt;Workflow impacchettati nell&amp;rsquo;ambiente del server MCP. La direzione è giusta.&lt;/p&gt;
&lt;p&gt;Post originale di 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>.NET 10 Arriva con Ubuntu 26.04 LTS — Le Novità</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/dotnet-ubuntu-2604-resolute-raccoon-net10/</guid><description>Ubuntu 26.04 LTS (Resolute Raccoon) è uscito con .NET 10 come toolchain di prima classe. Native AOT, contenitori chiseled, Linux 7.0.</description><content:encoded>&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/posts/emiliano-montesdeoca/dotnet-ubuntu-2604-resolute-raccoon-net10/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;È il giorno dell&amp;rsquo;Ubuntu LTS. &lt;a href="https://canonical.com/blog/canonical-releases-ubuntu-26-04-lts-resolute-raccoon"&gt;Ubuntu 26.04 (Resolute Raccoon)&lt;/a&gt; è uscito oggi con &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 su LTS — cinque anni di supporto per l&amp;rsquo;OS, in linea con la finestra di supporto a lungo termine di .NET 10.&lt;/p&gt;
&lt;h2 id="installa-net-10-in-due-comandi"&gt;Installa .NET 10 in due comandi&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 è una delle &lt;a href="https://ubuntu.com/toolchains"&gt;toolchain ufficialmente supportate su Ubuntu&lt;/a&gt; — non un add-on di terze parti.&lt;/p&gt;
&lt;h2 id="container-aggiorna--noble-a--resolute"&gt;Container: aggiorna &lt;code&gt;-noble&lt;/code&gt; a &lt;code&gt;-resolute&lt;/code&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed -i &lt;span class="s2"&gt;&amp;#34;s/noble/resolute/g&amp;#34;&lt;/span&gt; Dockerfile
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="native-aot-avvio-in-3ms-binario-da-14mb"&gt;Native AOT: avvio in 3ms, binario da 1,4MB&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt install -y dotnet-sdk-aot-10.0 clang
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dotnet publish app.cs
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# binario nativo da 1,4MB, avvio in 3ms&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Per carichi di lavoro cloud-native dove il tempo di cold-start conta — Functions, container, serverless — un vero cambio di gioco.&lt;/p&gt;
&lt;h2 id="hai-bisogno-di-net-8-o-9"&gt;Hai bisogno di .NET 8 o 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;Il &lt;a href="https://devblogs.microsoft.com/dotnet/whats-new-for-dotnet-in-ubuntu-2604/"&gt;post completo&lt;/a&gt; ha più dettagli.&lt;/p&gt;</content:encoded></item><item><title>Azure MCP Server Ora è un .mcpb — Installalo senza Nessun Runtime</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/azure-mcp-server-mcpb-no-runtime-install/</guid><description>Azure MCP Server è ora disponibile come MCP Bundle (.mcpb) — scaricalo, trascinalo in Claude Desktop e il gioco è fatto. Nessun Node.js, Python o .NET richiesto.</description><content:encoded>&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/posts/emiliano-montesdeoca/azure-mcp-server-mcpb-no-runtime-install/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Sai cosa era fastidioso nella configurazione dei server MCP? Avevi bisogno di un runtime. Node.js per la versione npm, Python per pip/uvx, .NET SDK per la variante dotnet.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;&lt;a href="https://devblogs.microsoft.com/azure-sdk/azure-mcp-server-mcpb-support/"&gt;Azure MCP Server ha appena cambiato questo&lt;/a&gt;. È ora disponibile come &lt;code&gt;.mcpb&lt;/code&gt; — un MCP Bundle — e la configurazione è drag-and-drop.&lt;/p&gt;
&lt;h2 id="cosè-un-mcp-bundle"&gt;Cos&amp;rsquo;è un MCP Bundle?&lt;/h2&gt;
&lt;p&gt;Pensaci come a un&amp;rsquo;estensione VS Code (&lt;code&gt;.vsix&lt;/code&gt;) o un&amp;rsquo;estensione browser (&lt;code&gt;.crx&lt;/code&gt;), ma per i server MCP. Un file &lt;code&gt;.mcpb&lt;/code&gt; è un archivio ZIP autonomo che include il binario del server e tutte le sue dipendenze.&lt;/p&gt;
&lt;h2 id="come-installarlo"&gt;Come installarlo&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;1. Scarica il bundle per la tua piattaforma&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Vai alla &lt;a href="https://github.com/microsoft/mcp/releases?q=Azure.Mcp.Server"&gt;pagina GitHub Releases&lt;/a&gt; e scarica il file &lt;code&gt;.mcpb&lt;/code&gt; per il tuo OS e architettura.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Installa in Claude Desktop&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Il modo più semplice: trascina il file &lt;code&gt;.mcpb&lt;/code&gt; nella finestra di Claude Desktop sulla pagina delle impostazioni Estensioni (&lt;code&gt;☰ → File → Impostazioni → Estensioni&lt;/code&gt;). Rivedi i dettagli del server, clicca su Installa, conferma.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Autenticati su Azure&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az login
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Fatto. Azure MCP Server usa le tue credenziali Azure esistenti.&lt;/p&gt;
&lt;h2 id="cosa-puoi-fare"&gt;Cosa puoi fare&lt;/h2&gt;
&lt;p&gt;Oltre 100 strumenti di servizi Azure direttamente dal tuo client AI:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Interrogare e gestire Cosmos DB, Storage, Key Vault, App Service, Foundry&lt;/li&gt;
&lt;li&gt;Generare comandi &lt;code&gt;az&lt;/code&gt; CLI per qualsiasi attività&lt;/li&gt;
&lt;li&gt;Creare template Bicep e Terraform&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="per-iniziare"&gt;Per iniziare&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;Consulta il &lt;a href="https://devblogs.microsoft.com/azure-sdk/azure-mcp-server-mcpb-support/"&gt;post completo&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Azure SDK Aprile 2026: AI Foundry 2.0 e Cosa Devono Sapere gli Sviluppatori .NET</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/azure-sdk-april-2026-ai-foundry-2-stable/</guid><description>La versione Azure SDK di aprile 2026 porta Azure.AI.Projects 2.0.0 stabile con breaking change significativi, correzioni critiche di sicurezza per Cosmos DB e nuove librerie di Provisioning per .NET.</description><content:encoded>&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/posts/emiliano-montesdeoca/azure-sdk-april-2026-ai-foundry-2-stable/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Le versioni mensili dell&amp;rsquo;SDK sono spesso facili da ignorare. Questa ha alcune cose degne di attenzione — specialmente se stai costruendo con AI Foundry, Cosmos DB in Java, o fai provisioning di infrastruttura da codice .NET.&lt;/p&gt;
&lt;h2 id="azureaiprojects-200--breaking-change-che-hanno-senso"&gt;Azure.AI.Projects 2.0.0 — Breaking Change che Hanno Senso&lt;/h2&gt;
&lt;p&gt;Split di namespace, tipi rinominati, e convenzione &lt;code&gt;Is*&lt;/code&gt; coerente per i booleani.&lt;/p&gt;
&lt;h2 id="cosmos-db-java-correzione-critica-di-sicurezza-rce"&gt;Cosmos DB Java: Correzione Critica di Sicurezza (RCE)&lt;/h2&gt;
&lt;p&gt;La versione 4.79.0 corregge una &lt;strong&gt;vulnerabilità di Remote Code Execution (CWE-502)&lt;/strong&gt;. Aggiorna immediatamente.&lt;/p&gt;
&lt;h2 id="nuove-librerie-di-provisioning-per-net"&gt;Nuove Librerie di Provisioning per .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;p&gt;Post originale: &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 in Agent Framework: Come Dimezzare la Latenza del tuo Agente</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/codeact-agent-framework-hyperlight-50-percent-faster/</guid><description>CodeAct comprime catene di strumenti in più fasi in un unico blocco di codice sandboxed — riducendo la latenza del 52% e l'utilizzo dei token del 64%. Cosa significa per i tuoi agenti e quando usarlo.</description><content:encoded>&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/posts/emiliano-montesdeoca/codeact-agent-framework-hyperlight-50-percent-faster/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;è quel momento in ogni progetto di agenti in cui guardi il trace e pensi: &amp;ldquo;perché ci vuole così tanto?&amp;rdquo; Il modello funziona bene. Gli strumenti funzionano. Ma ci sono sette round trip per ottenere un risultato che potresti calcolare in una sola volta.&lt;/p&gt;
&lt;p&gt;Questo è esattamente il problema che CodeAct risolve — e il &lt;a href="https://devblogs.microsoft.com/agent-framework/codeact-with-hyperlight/"&gt;team di Agent Framework ha appena pubblicato il supporto alpha&lt;/a&gt; tramite il nuovo pacchetto &lt;code&gt;agent-framework-hyperlight&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="cosè-codeact"&gt;Cos&amp;rsquo;è CodeAct?&lt;/h2&gt;
&lt;p&gt;Il &lt;a href="https://arxiv.org/abs/2402.01030"&gt;pattern CodeAct&lt;/a&gt; è elegantemente semplice: invece di dare al modello una lista di strumenti da chiamare uno alla volta, gli dai un unico strumento &lt;code&gt;execute_code&lt;/code&gt; e lo lasci esprimere l&amp;rsquo;&lt;em&gt;intero piano&lt;/em&gt; come un breve programma Python. L&amp;rsquo;agente scrive il codice una volta, la sandbox lo esegue, e ottieni un singolo risultato consolidato.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approccio&lt;/th&gt;
&lt;th&gt;Tempo&lt;/th&gt;
&lt;th&gt;Token&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Tradizionale&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;Miglioramento&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="la-componente-di-sicurezza-micro-vm-hyperlight"&gt;La componente di sicurezza: Micro-VM Hyperlight&lt;/h2&gt;
&lt;p&gt;Il pacchetto &lt;code&gt;agent-framework-hyperlight&lt;/code&gt; utilizza micro-VM di &lt;a href="https://github.com/hyperlight-dev/hyperlight"&gt;Hyperlight&lt;/a&gt;. Ogni chiamata &lt;code&gt;execute_code&lt;/code&gt; ottiene la propria micro-VM appena creata. L&amp;rsquo;avvio si misura in millisecondi. L&amp;rsquo;isolamento è praticamente gratuito.&lt;/p&gt;
&lt;p&gt;I tuoi strumenti continuano a girare sull&amp;rsquo;host. Il &lt;em&gt;codice collante&lt;/em&gt; generato dal modello gira nella sandbox. Questa è la divisione giusta.&lt;/p&gt;
&lt;h2 id="configurazione-minima"&gt;Configurazione minima&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="quando-usare-codeact-e-quando-no"&gt;Quando usare CodeAct (e quando no)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Usa CodeAct quando:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Il task concatena molte piccole chiamate a strumenti (lookup, join, calcoli)&lt;/li&gt;
&lt;li&gt;La latenza e il costo dei token contano&lt;/li&gt;
&lt;li&gt;Vuoi un isolamento forte per chiamata sul codice generato dal modello&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Resta con il tool-calling tradizionale quando:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;L&amp;rsquo;agente fa solo una o due chiamate a strumenti per turno&lt;/li&gt;
&lt;li&gt;Ogni chiamata ha effetti collaterali da approvare individualmente&lt;/li&gt;
&lt;li&gt;Le descrizioni degli strumenti sono scarse o ambigue&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="provalo-ora"&gt;Provalo ora&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;Leggi il &lt;a href="https://devblogs.microsoft.com/agent-framework/codeact-with-hyperlight/"&gt;post completo sul blog di Agent Framework&lt;/a&gt; per una copertura più approfondita.&lt;/p&gt;</content:encoded></item><item><title>Dove il tuo Agente Ricorda le Cose? Guida Pratica all'Archiviazione della Cronologia Chat</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/chat-history-storage-patterns-agent-framework/</guid><description>Gestito dal servizio o dal client? Lineare o ramificabile? La decisione architetturale che definisce cosa può fare davvero il tuo agente IA — con esempi di codice in C# e Python.</description><content:encoded>&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/posts/emiliano-montesdeoca/chat-history-storage-patterns-agent-framework/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Quando costruisci un agente IA, dedichi la maggior parte dell&amp;rsquo;energia al modello, agli strumenti e ai prompt. La domanda su &lt;em&gt;dove vive la cronologia della conversazione&lt;/em&gt; sembra un dettaglio di implementazione — ma è una delle decisioni architetturali più importanti che prenderai.&lt;/p&gt;
&lt;p&gt;Determina se gli utenti possono ramificare le conversazioni, annullare le risposte, riprendere le sessioni dopo un riavvio e se i tuoi dati escono mai dalla tua infrastruttura. Il &lt;a href="https://devblogs.microsoft.com/agent-framework/chat-history-storage-patterns-in-microsoft-agent-framework/"&gt;team di Agent Framework ha pubblicato un&amp;rsquo;analisi approfondita&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="due-pattern-fondamentali"&gt;Due pattern fondamentali&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Gestito dal servizio&lt;/strong&gt;: il servizio IA archivia lo stato della conversazione. La tua app mantiene un riferimento e il servizio include automaticamente la cronologia rilevante in ogni richiesta.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Gestito dal client&lt;/strong&gt;: la tua app mantiene la cronologia completa e invia messaggi rilevanti con ogni richiesta. Il servizio è stateless. Tu controlli tutto.&lt;/p&gt;
&lt;h2 id="come-agent-framework-astrae-questo"&gt;Come Agent Framework astrae questo&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;AgentSession&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreateSessionAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;first&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Mi chiamo 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;Come mi chiamo?&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create_session&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;first&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Mi chiamo 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;Come mi chiamo?&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="riferimento-rapido-ai-provider"&gt;Riferimento rapido ai provider&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Archiviazione&lt;/th&gt;
&lt;th&gt;Modello&lt;/th&gt;
&lt;th&gt;Compattazione&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;Tu&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Foundry Agent Service&lt;/td&gt;
&lt;td&gt;Servizio&lt;/td&gt;
&lt;td&gt;Lineare&lt;/td&gt;
&lt;td&gt;Servizio&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Responses API (default)&lt;/td&gt;
&lt;td&gt;Servizio&lt;/td&gt;
&lt;td&gt;Ramificabile&lt;/td&gt;
&lt;td&gt;Servizio&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;Tu&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="come-scegliere"&gt;Come scegliere&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Hai bisogno di ramificazione o &amp;ldquo;annulla&amp;rdquo;?&lt;/strong&gt; → Responses API gestito dal servizio&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hai bisogno di sovranità dei dati?&lt;/strong&gt; → Gestito dal client con provider di database&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;È un semplice chatbot?&lt;/strong&gt; → Gestito dal servizio lineare va benissimo&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Leggi il &lt;a href="https://devblogs.microsoft.com/agent-framework/chat-history-storage-patterns-in-microsoft-agent-framework/"&gt;post completo&lt;/a&gt; per l&amp;rsquo;albero decisionale completo.&lt;/p&gt;</content:encoded></item><item><title>GPT-5.5 È Arrivato su Azure Foundry — Cosa Devono Sapere i Sviluppatori .NET</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/gpt-55-foundry-ga-what-dotnet-developers-need-to-know/</guid><description>GPT-5.5 è generalmente disponibile in Microsoft Foundry. La progressione da GPT-5 a 5.5, cosa è realmente migliorato e come iniziare a usarlo nei tuoi agenti oggi.</description><content:encoded>&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/posts/emiliano-montesdeoca/gpt-55-foundry-ga-what-dotnet-developers-need-to-know/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Microsoft ha appena annunciato che &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 è generalmente disponibile in Microsoft Foundry&lt;/a&gt;. Se stai costruendo agenti su Azure, questo è l&amp;rsquo;aggiornamento che stavi aspettando.&lt;/p&gt;
&lt;h2 id="la-progressione-di-gpt-5"&gt;La progressione di GPT-5&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GPT-5&lt;/strong&gt;: ha unificato ragionamento e velocità in un unico sistema&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPT-5.4&lt;/strong&gt;: ragionamento multi-step più solido, capacità agentiche per l&amp;rsquo;enterprise&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPT-5.5&lt;/strong&gt;: ragionamento in contesto lungo più profondo, esecuzione agentica più affidabile, migliore efficienza dei token&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="cosa-è-cambiato-davvero"&gt;Cosa è cambiato davvero&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Coding agentico migliorato&lt;/strong&gt;: GPT-5.5 mantiene il contesto su grandi codebase, diagnostica guasti architetturali e anticipa i requisiti di test. Il modello ragiona su &lt;em&gt;cos&amp;rsquo;altro&lt;/em&gt; influenza una correzione prima di agire.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Efficienza dei token&lt;/strong&gt;: Output di qualità superiore con meno token e meno tentativi. Costo e latenza direttamente inferiori in produzione.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Analisi in contesto lungo&lt;/strong&gt;: Gestisce documenti estesi e cronologie multi-sessione senza perdere il filo.&lt;/p&gt;
&lt;h2 id="prezzi"&gt;Prezzi&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Modello&lt;/th&gt;
&lt;th&gt;Input ($/M token)&lt;/th&gt;
&lt;th&gt;Input in cache&lt;/th&gt;
&lt;th&gt;Output ($/M token)&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="perché-foundry-è-importante"&gt;Perché Foundry è importante&lt;/h2&gt;
&lt;p&gt;Foundry Agent Service permette di definire agenti in YAML o collegarli con Microsoft Agent Framework, GitHub Copilot SDK, LangGraph o OpenAI Agents SDK — ed eseguirli come agenti ospitati isolati con filesystem persistente, identità Microsoft Entra e prezzi scale-to-zero.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;AIAgent&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;aiProjectClient&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AsAIAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;gpt-5.5&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Sei un assistente utile.&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;MioAgente&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;Consulta l&amp;rsquo;&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;annuncio completo&lt;/a&gt; per tutti i dettagli.&lt;/p&gt;</content:encoded></item><item><title>VS Code 1.118: Copilot CLI ottiene Nomi di Sessione, Badge di Modello e TypeScript 7.0 Nightly</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/vscode-1-118-copilot-cli-session-names-model-badge/</guid><description>Visual Studio Code 1.118 è una release focalizzata sui miglioramenti di Copilot CLI — denominazione sessioni, badge modello, selezione automatica modello e opt-in TypeScript 7.0 Nightly.</description><content:encoded>&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/posts/emiliano-montesdeoca/vscode-1-118-copilot-cli-session-names-model-badge/"&gt;clicca qui&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; è una release più piccola e focalizzata — principalmente raffinamenti di Copilot CLI.&lt;/p&gt;
&lt;h2 id="copilot-cli-le-sessioni-hanno-nomi-reali"&gt;Copilot CLI: le sessioni hanno nomi reali&lt;/h2&gt;
&lt;p&gt;Le API di titolo di sessione dell&amp;rsquo;SDK di Copilot CLI vengono ora usate come fonte di verità per i nomi delle sessioni. Invece di etichette auto-generate, le sessioni mostrano il nome reale dall&amp;rsquo;SDK.&lt;/p&gt;
&lt;h2 id="cambia-sessione-più-velocemente"&gt;Cambia sessione più velocemente&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;app Agents ha ora &lt;code&gt;Ctrl+1&lt;/code&gt;, &lt;code&gt;Ctrl+2&lt;/code&gt;, ecc. per passare rapidamente tra le sessioni.&lt;/p&gt;
&lt;h2 id="badge-modello-nella-chat"&gt;Badge modello nella chat&lt;/h2&gt;
&lt;p&gt;Le risposte di Copilot CLI nel pannello chat mostrano ora un badge modello — puoi vedere a colpo d&amp;rsquo;occhio quale modello ha gestito ogni richiesta.&lt;/p&gt;
&lt;h2 id="selezione-automatica-del-modello-in-copilot-cli"&gt;Selezione automatica del modello in Copilot CLI&lt;/h2&gt;
&lt;p&gt;La selezione automatica del modello funziona ora anche nell&amp;rsquo;agente Copilot CLI.&lt;/p&gt;
&lt;h2 id="opt-in-per-typescript-70-nightly"&gt;Opt-in per TypeScript 7.0 Nightly&lt;/h2&gt;
&lt;p&gt;Puoi ora optare per testare i nightly di TypeScript 7.0 direttamente dalle impostazioni di VS Code. TypeScript 7.0 è un release importante (la &lt;a href="https://devblogs.microsoft.com/typescript/announcing-typescript-7-0-beta/"&gt;beta è uscita pochi giorni fa&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Consulta le &lt;a href="https://code.visualstudio.com/updates/v1_118"&gt;note di release complete&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Aspire 13.2: Supporto Bun, Contenitori Migliori e Meno Attrito nel Debug</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/aspire-132-bun-container-enhancements/</guid><description>Aspire 13.2 aggiunge supporto Bun di prima classe per le app Vite, corregge l'affidabilità di Yarn e porta miglioramenti ai container che rendono il comportamento locale più prevedibile.</description><content:encoded>&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/posts/emiliano-montesdeoca/aspire-132-bun-container-enhancements/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Se stai costruendo backend .NET con frontend JavaScript in Aspire, la 13.2 è l&amp;rsquo;aggiornamento che migliora silenziosamente la tua giornata.&lt;/p&gt;
&lt;h2 id="bun-è-ora-di-prima-classe"&gt;Bun è Ora di Prima Classe&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;Se il tuo team usa già Bun, Aspire non ti costringe più a nuotare controcorrente.&lt;/p&gt;
&lt;h2 id="yarn-più-affidabile"&gt;Yarn Più Affidabile&lt;/h2&gt;
&lt;p&gt;Gli utenti Yarn ottengono meno errori misteriosi con &lt;code&gt;withYarn()&lt;/code&gt; e &lt;code&gt;addViteApp()&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="miglioramenti-ai-container"&gt;Miglioramenti ai Container&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;ImagePullPolicy.Never&lt;/code&gt; per usare l&amp;rsquo;immagine locale senza andare al registry. PostgreSQL 18+ con volumi di dati ora funziona correttamente.&lt;/p&gt;
&lt;h2 id="miglioramenti-al-debug"&gt;Miglioramenti al Debug&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;DebuggerDisplayAttribute&lt;/code&gt; sui tipi core&lt;/li&gt;
&lt;li&gt;Messaggi di errore migliori per &lt;code&gt;WaitFor&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;BeforeResourceStartedEvent&lt;/code&gt; si attiva al momento giusto&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Post originale di 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 Minuti al Giorno a Ri-Spiegare il Codice? C'è una Soluzione</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/auto-memory-stop-re-explaining-code-to-copilot/</guid><description>Il context rot è reale — il tuo agente IA deriva dopo 30 turni, e paghi la tassa di compattazione ogni ora. auto-memory dà a GitHub Copilot CLI un richiamo chirurgico senza bruciare migliaia di token.</description><content:encoded>&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/posts/emiliano-montesdeoca/auto-memory-stop-re-explaining-code-to-copilot/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Conosci quel momento in cui la tua sessione di Copilot raggiunge &lt;code&gt;/compact&lt;/code&gt; e l&amp;rsquo;agente dimentica completamente su cosa stavi lavorando? Passi i successivi cinque minuti a ri-spiegare la struttura dei file, il test fallito, i tre approcci già provati. Poi succede di nuovo.&lt;/p&gt;
&lt;p&gt;Desi Villanueva l&amp;rsquo;ha cronometrato: &lt;strong&gt;68 minuti al giorno&lt;/strong&gt; — solo per il riorientamento. Non scrivendo codice. Non rivedendo PR. Solo aggiornando l&amp;rsquo;IA su cose che già sapeva.&lt;/p&gt;
&lt;h2 id="la-bugia-della-finestra-di-contesto"&gt;La Bugia della Finestra di Contesto&lt;/h2&gt;
&lt;p&gt;Il tuo agente arriva con un numero grande sulla scatola. 200K token. Sembra massiccio. In pratica è un soffitto, non una garanzia.&lt;/p&gt;
&lt;p&gt;La matematica reale: circa &lt;strong&gt;125K prima di digitare una parola&lt;/strong&gt;, e il limite effettivo è &lt;strong&gt;45K token&lt;/strong&gt; prima che la qualità degrade — a causa del problema &amp;ldquo;lost in the middle&amp;rdquo; degli LLM.&lt;/p&gt;
&lt;h2 id="la-tassa-di-compattazione"&gt;La Tassa di Compattazione&lt;/h2&gt;
&lt;p&gt;La parte crudele: &lt;strong&gt;la memoria esiste già.&lt;/strong&gt; Copilot CLI scrive ogni sessione in un database SQLite locale in &lt;code&gt;~/.copilot/session-store.db&lt;/code&gt;. L&amp;rsquo;agente semplicemente non può leggerlo.&lt;/p&gt;
&lt;h2 id="auto-memory-uno-strato-di-richiamo-non-un-sistema-di-memoria"&gt;auto-memory: Uno Strato di Richiamo, Non un Sistema di Memoria&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 righe di Python. Zero dipendenze. Installato in 30 secondi.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;50 token invece di 10.000&lt;/strong&gt; — accesso chirurgico ai file che hai toccato ieri, non un diluvio di risultati grep irrilevanti.&lt;/p&gt;
&lt;h2 id="conclusione"&gt;Conclusione&lt;/h2&gt;
&lt;p&gt;Il context rot è un vero vincolo architetturale. auto-memory lo aggira dando al tuo agente un meccanismo di richiamo economico e preciso.&lt;/p&gt;
&lt;p&gt;Dai un&amp;rsquo;occhiata: &lt;a href="https://github.com/dezgit2025/auto-memory"&gt;auto-memory su GitHub&lt;/a&gt;. Post originale di 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>Foundry Toolboxes: Un unico endpoint per tutti i tool degli agenti</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/foundry-toolboxes-curate-manage-tools-ai-agents/</guid><description>Microsoft Foundry ha lanciato Toolboxes in public preview — un modo per curare, gestire ed esporre i tool degli agenti IA tramite un unico endpoint compatibile MCP.</description><content:encoded>&lt;p&gt;&lt;em&gt;Questo articolo è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/posts/emiliano-montesdeoca/foundry-toolboxes-curate-manage-tools-ai-agents/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;è un problema che sembra noioso finché non lo si vive in prima persona: l&amp;rsquo;organizzazione sta costruendo più agenti IA, ognuno ha bisogno di tool, e ogni team li riconfigura da zero. La stessa integrazione di ricerca web, la stessa config di Azure AI Search, la stessa connessione al server MCP di GitHub — ma in un altro repository, da un altro team, con altre credenziali e senza governance condivisa.&lt;/p&gt;
&lt;p&gt;Microsoft Foundry ha appena lanciato &lt;a href="https://devblogs.microsoft.com/foundry/introducing-toolboxes-in-foundry/"&gt;Toolboxes&lt;/a&gt; in public preview, ed è una risposta diretta a questo problema.&lt;/p&gt;
&lt;h2 id="cosè-una-toolbox"&gt;Cos&amp;rsquo;è una Toolbox?&lt;/h2&gt;
&lt;p&gt;Una Toolbox è un bundle di tool con nome, riutilizzabile, che si definisce una volta in Foundry e si espone tramite un unico endpoint compatibile MCP. Qualsiasi runtime di agente che parla MCP può consumarlo — nessun lock-in con Foundry Agents.&lt;/p&gt;
&lt;p&gt;La promessa è semplice: &lt;strong&gt;build once, consume anywhere&lt;/strong&gt;. Definisci i tool, configura l&amp;rsquo;autenticazione centralmente (OAuth passthrough, identità gestita di Entra), pubblica l&amp;rsquo;endpoint. Ogni agente che ha bisogno di quei tool si connette all&amp;rsquo;endpoint e li ottiene tutti.&lt;/p&gt;
&lt;h2 id="i-quattro-pilastri-due-disponibili-oggi"&gt;I quattro pilastri (due disponibili oggi)&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pilastro&lt;/th&gt;
&lt;th&gt;Stato&lt;/th&gt;
&lt;th&gt;Cosa fa&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;In arrivo&lt;/td&gt;
&lt;td&gt;Trova tool approvati senza ricerca manuale&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;Disponibile&lt;/td&gt;
&lt;td&gt;Raggruppa tool in un bundle riutilizzabile&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;Disponibile&lt;/td&gt;
&lt;td&gt;Un endpoint MCP unico espone tutti i tool&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;In arrivo&lt;/td&gt;
&lt;td&gt;Auth centralizzata + observability per tutte le chiamate&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="esempio-pratico"&gt;Esempio pratico&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;Cerca documentazione e rispondi alle issue di GitHub.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;web_search&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Cerca documentazione pubblica&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;Una volta pubblicato, Foundry fornisce un endpoint unificato. Una connessione, tutti i tool.&lt;/p&gt;
&lt;h2 id="nessun-lock-in-con-foundry-agents"&gt;Nessun lock-in con Foundry Agents&lt;/h2&gt;
&lt;p&gt;Le Toolbox vengono &lt;strong&gt;create e gestite&lt;/strong&gt; in Foundry, ma la superficie di consumo è il protocollo MCP aperto. Si possono usare da agenti personalizzati (Microsoft Agent Framework, LangGraph), GitHub Copilot e altri IDE compatibili MCP.&lt;/p&gt;
&lt;h2 id="perché-è-importante-adesso"&gt;Perché è importante adesso&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;ondata multi-agente sta arrivando in produzione. Ogni nuovo agente è una nuova superficie per configurazione duplicata, credenziali scadute e comportamento inconsistente. La base Build + Consume è sufficiente per iniziare a centralizzare. Quando arriverà il pilastro Govern, si avrà uno strato di tool completamente osservabile e controllato centralmente per tutta la flotta di agenti.&lt;/p&gt;
&lt;h2 id="conclusione"&gt;Conclusione&lt;/h2&gt;
&lt;p&gt;È ancora presto — public preview, SDK Python prima, con Discover e Govern ancora in arrivo. Ma il modello è solido e il design nativo MCP significa che funziona con i tool che si stanno già costruendo. Dai un&amp;rsquo;occhiata all&amp;rsquo;&lt;a href="https://devblogs.microsoft.com/foundry/introducing-toolboxes-in-foundry/"&gt;annuncio ufficiale&lt;/a&gt; per iniziare.&lt;/p&gt;</content:encoded></item><item><title>Hook azd in Python, TypeScript e .NET: basta script shell</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/azd-hooks-python-javascript-typescript-dotnet/</guid><description>La CLI di Azure Developer ora supporta hook in Python, JavaScript, TypeScript e .NET. Niente più switch di contesto verso Bash solo per uno script di migrazione.</description><content:encoded>&lt;p&gt;&lt;em&gt;Questo articolo è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/posts/emiliano-montesdeoca/azd-hooks-python-javascript-typescript-dotnet/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Se hai mai avuto un progetto completamente in .NET e ti sei ritrovato a scrivere script Bash solo per gli hook di azd, conosci bene quella sensazione. Perché passare alla sintassi shell per un passaggio di pre-provisioning quando tutto il resto del progetto è in C#?&lt;/p&gt;
&lt;p&gt;Quella frustrazione ha ora una soluzione ufficiale. La CLI di Azure Developer &lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-multi-language-hooks/"&gt;ha appena introdotto il supporto multi-linguaggio per gli hook&lt;/a&gt;, ed è esattamente buono come sembra.&lt;/p&gt;
&lt;h2 id="gli-hook-in-breve"&gt;Gli hook, in breve&lt;/h2&gt;
&lt;p&gt;Gli hook sono script eseguiti in punti chiave del ciclo di vita di &lt;code&gt;azd&lt;/code&gt; — prima del provisioning, dopo il deployment, e altro ancora. Definiti in &lt;code&gt;azure.yaml&lt;/code&gt;, permettono di iniettare logica personalizzata senza modificare la CLI.&lt;/p&gt;
&lt;p&gt;Prima erano supportati solo Bash e PowerShell. Ora si può usare &lt;strong&gt;Python, JavaScript, TypeScript o .NET&lt;/strong&gt; — e &lt;code&gt;azd&lt;/code&gt; si occupa del resto automaticamente.&lt;/p&gt;
&lt;h2 id="come-funziona-il-rilevamento"&gt;Come funziona il rilevamento&lt;/h2&gt;
&lt;p&gt;Basta puntare l&amp;rsquo;hook verso un file e &lt;code&gt;azd&lt;/code&gt; deduce il linguaggio dall&amp;rsquo;estensione:&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;Nessuna configurazione aggiuntiva. Se l&amp;rsquo;estensione è ambigua, si può aggiungere &lt;code&gt;kind: python&lt;/code&gt; (o il linguaggio appropriato) per specificarlo esplicitamente.&lt;/p&gt;
&lt;h2 id="dettagli-per-linguaggio"&gt;Dettagli per linguaggio&lt;/h2&gt;
&lt;h3 id="python"&gt;Python&lt;/h3&gt;
&lt;p&gt;Inserire un &lt;code&gt;requirements.txt&lt;/code&gt; o &lt;code&gt;pyproject.toml&lt;/code&gt; vicino allo script (o in una directory padre). &lt;code&gt;azd&lt;/code&gt; crea automaticamente un ambiente virtuale, installa le dipendenze ed esegue lo script.&lt;/p&gt;
&lt;h3 id="javascript-e-typescript"&gt;JavaScript e TypeScript&lt;/h3&gt;
&lt;p&gt;Stesso schema — un &lt;code&gt;package.json&lt;/code&gt; vicino allo script e &lt;code&gt;azd&lt;/code&gt; esegue prima &lt;code&gt;npm install&lt;/code&gt;. Per TypeScript, usa &lt;code&gt;npx tsx&lt;/code&gt; senza step di compilazione né &lt;code&gt;tsconfig.json&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="net"&gt;.NET&lt;/h3&gt;
&lt;p&gt;Due modalità disponibili:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Modalità progetto&lt;/strong&gt;: Se c&amp;rsquo;è un &lt;code&gt;.csproj&lt;/code&gt; vicino allo script, &lt;code&gt;azd&lt;/code&gt; esegue automaticamente &lt;code&gt;dotnet restore&lt;/code&gt; e &lt;code&gt;dotnet build&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Modalità single-file&lt;/strong&gt;: Con .NET 10+, i file &lt;code&gt;.cs&lt;/code&gt; autonomi vengono eseguiti direttamente via &lt;code&gt;dotnet run script.cs&lt;/code&gt;. Nessun file di progetto richiesto.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="configurazione-per-executor"&gt;Configurazione per executor&lt;/h2&gt;
&lt;p&gt;Ogni linguaggio supporta un blocco &lt;code&gt;config&lt;/code&gt; opzionale:&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="perché-è-importante-per-gli-sviluppatori-net"&gt;Perché è importante per gli sviluppatori .NET&lt;/h2&gt;
&lt;p&gt;Gli hook erano l&amp;rsquo;ultimo posto in un progetto basato su azd che costringeva a cambiare linguaggio. Ora l&amp;rsquo;intera pipeline di deployment può vivere in un unico linguaggio. È possibile riutilizzare le utility .NET esistenti negli hook, referenziare librerie condivise ed eliminare la manutenzione di script shell.&lt;/p&gt;
&lt;h2 id="conclusione"&gt;Conclusione&lt;/h2&gt;
&lt;p&gt;Uno di quei cambiamenti che sembrano piccoli ma che riducono concretamente la frizione quotidiana con azd. Il supporto multi-linguaggio per gli hook è disponibile ora — tutti i dettagli nel &lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-multi-language-hooks/"&gt;post ufficiale&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Windows App Dev CLI v0.3: F5 dal terminale e UI Automation per gli agenti</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/windows-app-dev-cli-v03-run-ui-automation/</guid><description>Windows App Development CLI v0.3 porta winapp run per avviare e fare debug dal terminale, winapp ui per l'automazione dell'interfaccia e un nuovo pacchetto NuGet che fa funzionare dotnet run con le app pacchettizzate.</description><content:encoded>&lt;p&gt;&lt;em&gt;Questo articolo è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/posts/emiliano-montesdeoca/windows-app-dev-cli-v03-run-ui-automation/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;esperienza F5 di Visual Studio è fantastica. Ma dover aprire VS solo per avviare e fare debug di un&amp;rsquo;app Windows pacchettizzata è eccessivo — che si tratti di una pipeline CI, di un workflow automatizzato o di un agente AI che esegue i test.&lt;/p&gt;
&lt;p&gt;Windows App Development CLI v0.3 è &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;appena uscita&lt;/a&gt; e lo affronta direttamente con due funzionalità principali: &lt;code&gt;winapp run&lt;/code&gt; e &lt;code&gt;winapp ui&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="winapp-run-f5-da-qualsiasi-posto"&gt;winapp run: F5 da qualsiasi posto&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;winapp run&lt;/code&gt; prende una cartella di app non pacchettizzata e un manifesto, e fa tutto ciò che VS fa nel debug launch: registra un pacchetto loose, avvia l&amp;rsquo;app e preserva il &lt;code&gt;LocalState&lt;/code&gt; tra i re-deploy.&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;# Compila l&amp;#39;app, poi avviala come app pacchettizzata&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;Funziona per WinUI, WPF, WinForms, Console, Avalonia e altro. Le modalità sono pensate per sviluppatori e workflow automatizzati:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--detach&lt;/code&gt;&lt;/strong&gt;: Avvia e restituisce il controllo al terminale immediatamente. Perfetto per CI.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--unregister-on-exit&lt;/code&gt;&lt;/strong&gt;: Pulisce il pacchetto registrato alla chiusura dell&amp;rsquo;app.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--debug-output&lt;/code&gt;&lt;/strong&gt;: Cattura i messaggi &lt;code&gt;OutputDebugString&lt;/code&gt; e le eccezioni in tempo reale.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="nuovo-pacchetto-nuget-dotnet-run-per-le-app-pacchettizzate"&gt;Nuovo pacchetto NuGet: dotnet run per le app pacchettizzate&lt;/h2&gt;
&lt;p&gt;Per gli sviluppatori .NET c&amp;rsquo;è un nuovo pacchetto NuGet: &lt;code&gt;Microsoft.Windows.SDK.BuildTools.WinApp&lt;/code&gt;. Dopo l&amp;rsquo;installazione, &lt;code&gt;dotnet run&lt;/code&gt; gestisce tutto l&amp;rsquo;inner loop: build, preparare un pacchetto loose-layout, registrare su Windows e avviare — tutto in un unico step.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;winapp init
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# o&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dotnet add package Microsoft.Windows.SDK.BuildTools.WinApp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="winapp-ui-ui-automation-dalla-riga-di-comando"&gt;winapp ui: UI Automation dalla riga di comando&lt;/h2&gt;
&lt;p&gt;Questa è la funzionalità che apre gli scenari agentici. &lt;code&gt;winapp ui&lt;/code&gt; fornisce accesso completo UI Automation a qualsiasi app Windows in esecuzione — WPF, WinForms, Win32, Electron, WinUI3 — direttamente dal terminale.&lt;/p&gt;
&lt;p&gt;Cosa si può fare:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Elencare tutte le finestre di primo livello&lt;/li&gt;
&lt;li&gt;Navigare l&amp;rsquo;albero completo di UI Automation di una finestra&lt;/li&gt;
&lt;li&gt;Cercare elementi per nome, tipo o ID di automazione&lt;/li&gt;
&lt;li&gt;Cliccare, invocare e impostare valori&lt;/li&gt;
&lt;li&gt;Fare screenshot&lt;/li&gt;
&lt;li&gt;Attendere la comparsa di elementi — ideale per la sincronizzazione dei test&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Combinare &lt;code&gt;winapp ui&lt;/code&gt; con &lt;code&gt;winapp run&lt;/code&gt; crea un workflow completo build → avvio → verifica dal terminale. Un agente può eseguire l&amp;rsquo;app, ispezionare lo stato dell&amp;rsquo;UI e validare il risultato.&lt;/p&gt;
&lt;h2 id="altre-novità"&gt;Altre novità&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;winapp unregister&lt;/code&gt;&lt;/strong&gt;: Rimuove un pacchetto sideloaded quando si è finito.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;winapp manifest add-alias&lt;/code&gt;&lt;/strong&gt;: Aggiunge un alias per avviare l&amp;rsquo;app per nome dal terminale.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tab completion&lt;/strong&gt;: Configura il completamento PowerShell con un singolo comando.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="come-ottenerlo"&gt;Come ottenerlo&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;# o&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;La CLI è in preview pubblica. Il &lt;a href="https://github.com/microsoft/WinAppCli"&gt;repository su GitHub&lt;/a&gt; ha la documentazione completa e l&amp;rsquo;&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;annuncio originale&lt;/a&gt; ha tutti i dettagli.&lt;/p&gt;</content:encoded></item><item><title>azd + GitHub Copilot: Configurazione del progetto con IA e risoluzione intelligente degli errori</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/azd-copilot-integration-ai-setup-troubleshooting/</guid><description>L'Azure Developer CLI si integra ora con GitHub Copilot per generare l'infrastruttura del tuo progetto e risolvere errori di deployment — senza uscire dal terminale.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo articolo è stato tradotto automaticamente. Per la versione originale in inglese, &lt;a href="https://thedotnetblog.com/it/posts/emiliano-montesdeoca/azd-copilot-integration-ai-setup-troubleshooting/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Conosci quel momento in cui vuoi fare il deploy di un&amp;rsquo;app esistente su Azure e ti ritrovi a fissare un &lt;code&gt;azure.yaml&lt;/code&gt; vuoto, cercando di ricordare se la tua API Express dovrebbe usare Container Apps o App Service? Quel momento è appena diventato molto più breve.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;Azure Developer CLI (&lt;code&gt;azd&lt;/code&gt;) si integra ora con GitHub Copilot in due modi concreti: scaffolding assistito dall&amp;rsquo;IA durante &lt;code&gt;azd init&lt;/code&gt;, e risoluzione intelligente degli errori quando i deployment falliscono. Entrambe le funzionalità rimangono completamente nel terminale — esattamente dove voglio che siano.&lt;/p&gt;
&lt;h2 id="configurazione-con-copilot-durante-azd-init"&gt;Configurazione con Copilot durante azd init&lt;/h2&gt;
&lt;p&gt;Quando esegui &lt;code&gt;azd init&lt;/code&gt;, ora compare l&amp;rsquo;opzione &amp;ldquo;Set up with GitHub Copilot (Preview)&amp;rdquo;. Selezionala e Copilot analizza la tua codebase per generare &lt;code&gt;azure.yaml&lt;/code&gt;, i template di infrastruttura e i moduli Bicep — basandosi sul tuo codice reale.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;azd init
# Seleziona: &amp;#34;Set up with GitHub Copilot (Preview)&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Prerequisiti:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;azd 1.23.11 o superiore&lt;/strong&gt; — verifica con &lt;code&gt;azd version&lt;/code&gt; o aggiorna con &lt;code&gt;azd update&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Abbonamento attivo a GitHub Copilot&lt;/strong&gt; (Individual, Business o 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; chiederà il login se necessario&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Quello che trovo genuinamente utile: funziona in entrambi i sensi. Stai costruendo da zero? Copilot ti aiuta a configurare i servizi Azure giusti sin dall&amp;rsquo;inizio. Hai un&amp;rsquo;app esistente che volevi deployare da tempo? Punta Copilot su di essa e genera la configurazione senza che tu debba ristrutturare nulla.&lt;/p&gt;
&lt;h3 id="cosa-fa-davvero"&gt;Cosa fa davvero&lt;/h3&gt;
&lt;p&gt;Diciamo che hai un&amp;rsquo;API Express Node.js con dipendenza da PostgreSQL. Invece di decidere manualmente tra Container Apps e App Service, e poi scrivere Bicep da zero, Copilot rileva il tuo stack e genera:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Un &lt;code&gt;azure.yaml&lt;/code&gt; con le impostazioni corrette di &lt;code&gt;language&lt;/code&gt;, &lt;code&gt;host&lt;/code&gt; e &lt;code&gt;build&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Un modulo Bicep per Azure Container Apps&lt;/li&gt;
&lt;li&gt;Un modulo Bicep per Azure Database for PostgreSQL&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;E prima di toccare qualsiasi cosa esegue verifiche preventive — controlla che la tua directory git sia pulita, chiede il consenso per gli strumenti del server MCP. Niente accade senza che tu sappia esattamente cosa sta per cambiare.&lt;/p&gt;
&lt;h2 id="risoluzione-degli-errori-con-copilot"&gt;Risoluzione degli errori con Copilot&lt;/h2&gt;
&lt;p&gt;Gli errori di deployment sono inevitabili. Parametri mancanti, problemi di permessi, disponibilità degli SKU — e il messaggio d&amp;rsquo;errore raramente ti dice l&amp;rsquo;unica cosa che hai davvero bisogno di sapere: &lt;em&gt;come risolverlo&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Senza Copilot, il ciclo è: copiare l&amp;rsquo;errore → cercare nella documentazione → leggere tre risposte irrilevanti su Stack Overflow → eseguire alcuni comandi &lt;code&gt;az&lt;/code&gt; CLI → riprovare sperando. Con Copilot integrato in &lt;code&gt;azd&lt;/code&gt;, questo ciclo collassa. Quando qualsiasi comando &lt;code&gt;azd&lt;/code&gt; fallisce, offre immediatamente quattro opzioni:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Explain&lt;/strong&gt; — spiegazione in linguaggio naturale di cosa è andato storto&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Guidance&lt;/strong&gt; — istruzioni passo dopo passo per correggere il problema&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Diagnose and Guide&lt;/strong&gt; — analisi completa + Copilot applica la correzione (con la tua approvazione) + retry opzionale&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Skip&lt;/strong&gt; — gestire da soli&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Il punto cruciale: Copilot ha già il contesto del tuo progetto, il comando che ha fallito e l&amp;rsquo;output dell&amp;rsquo;errore. I suoi suggerimenti sono specifici per &lt;em&gt;la tua situazione&lt;/em&gt;, non documentazione generica.&lt;/p&gt;
&lt;h3 id="configurare-il-comportamento-predefinito"&gt;Configurare il comportamento predefinito&lt;/h3&gt;
&lt;p&gt;Se scegli sempre la stessa opzione, salta il prompt interattivo:&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;Valori: &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;. Puoi anche abilitare auto-fix e retry:&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;Ritorno alla modalità interattiva in qualsiasi momento:&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="conclusione"&gt;Conclusione&lt;/h2&gt;
&lt;p&gt;Questo è esattamente il tipo di integrazione di Copilot che porta valore reale. Provalo eseguendo &lt;code&gt;azd update&lt;/code&gt; per ottenere l&amp;rsquo;ultima versione e usa &lt;code&gt;azd init&lt;/code&gt; nel tuo prossimo progetto.&lt;/p&gt;
&lt;p&gt;Leggi l&amp;rsquo;&lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-copilot-integration/"&gt;annuncio originale qui&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Scrivere addon nativi Node.js in C# con .NET Native AOT</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/nodejs-addons-csharp-native-aot/</guid><description>Il team di C# Dev Kit ha sostituito gli addon Node.js scritti in C++ con .NET Native AOT — il risultato è più pulito, più sicuro e richiede solo il SDK .NET.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo articolo è stato tradotto automaticamente. Per la versione originale in inglese, &lt;a href="https://thedotnetblog.com/it/posts/emiliano-montesdeoca/nodejs-addons-csharp-native-aot/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Uno scenario che adoro: un team che lavora su strumenti .NET aveva addon nativi Node.js scritti in C++ e compilati tramite &lt;code&gt;node-gyp&lt;/code&gt;. Funzionava. Ma richiedeva Python installato su ogni macchina dello sviluppatore — una vecchia versione di Python, per giunta — solo per costruire un pacchetto che nessuno nel team avrebbe mai toccato direttamente.&lt;/p&gt;
&lt;p&gt;Si sono quindi posti una domanda molto ragionevole: abbiamo già il SDK .NET installato, perché stiamo scrivendo C++?&lt;/p&gt;
&lt;p&gt;La risposta è stata Native AOT, e il risultato è genuinamente elegante.&lt;/p&gt;
&lt;h2 id="lidea-di-base"&gt;L&amp;rsquo;idea di base&lt;/h2&gt;
&lt;p&gt;Un addon nativo Node.js è una libreria condivisa (&lt;code&gt;.dll&lt;/code&gt; su Windows, &lt;code&gt;.so&lt;/code&gt; su Linux, &lt;code&gt;.dylib&lt;/code&gt; su macOS) che Node.js può caricare a runtime. L&amp;rsquo;interfaccia si chiama &lt;a href="https://nodejs.org/api/n-api.html"&gt;N-API&lt;/a&gt; — una API C stabile e compatibile con ABI. A N-API non importa quale linguaggio ha prodotto la libreria, solo che esporti i simboli giusti.&lt;/p&gt;
&lt;p&gt;.NET Native AOT può produrre esattamente questo. Compila il codice C# ahead-of-time in una libreria nativa condivisa con punti di ingresso arbitrari. Questo è tutto il trucco.&lt;/p&gt;
&lt;h2 id="setup-del-progetto"&gt;Setup del progetto&lt;/h2&gt;
&lt;p&gt;Il file di progetto è minimale:&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; dice all&amp;rsquo;SDK di produrre una libreria condivisa a &lt;code&gt;dotnet publish&lt;/code&gt;. &lt;code&gt;AllowUnsafeBlocks&lt;/code&gt; è necessario per l&amp;rsquo;interop N-API con puntatori a funzione e buffer fissi.&lt;/p&gt;
&lt;h2 id="esportare-il-punto-di-ingresso"&gt;Esportare il punto di ingresso&lt;/h2&gt;
&lt;p&gt;Node.js si aspetta che la tua libreria esporti &lt;code&gt;napi_register_module_v1&lt;/code&gt;. In C#, &lt;code&gt;[UnmanagedCallersOnly]&lt;/code&gt; fa esattamente questo:&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;Cose da notare: &lt;code&gt;nint&lt;/code&gt; è un intero di dimensione nativa — l&amp;rsquo;equivalente gestito di &lt;code&gt;intptr_t&lt;/code&gt;. Il suffisso &lt;code&gt;u8&lt;/code&gt; produce un &lt;code&gt;ReadOnlySpan&amp;lt;byte&amp;gt;&lt;/code&gt; con un letterale stringa UTF-8, passato direttamente a N-API senza alcuna allocazione di encoding. E &lt;code&gt;[UnmanagedCallersOnly]&lt;/code&gt; esporta il metodo con esattamente il nome del punto di ingresso che Node.js cerca.&lt;/p&gt;
&lt;h2 id="risolvere-n-api-contro-il-processo-host"&gt;Risolvere N-API contro il processo host&lt;/h2&gt;
&lt;p&gt;Le funzioni N-API sono esportate da &lt;code&gt;node.exe&lt;/code&gt; stesso, non da una libreria separata. Quindi invece di linkare contro qualcosa, le si risolve contro il processo in esecuzione all&amp;rsquo;avvio:&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;Con questo in place, le dichiarazioni P/Invoke funzionano correttamente con &lt;code&gt;[LibraryImport]&lt;/code&gt; e marshalling generato da sorgente.&lt;/p&gt;
&lt;h2 id="una-funzione-esportata-reale"&gt;Una funzione esportata reale&lt;/h2&gt;
&lt;p&gt;Ecco il lettore del registro che hanno costruito:&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;Nota importante sul &lt;code&gt;try/catch&lt;/code&gt;: un&amp;rsquo;eccezione non gestita in un metodo &lt;code&gt;[UnmanagedCallersOnly]&lt;/code&gt; fa crashare il processo host. Cattura sempre e passa a JavaScript tramite &lt;code&gt;ThrowError&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="chiamarlo-da-typescript"&gt;Chiamarlo da TypeScript&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#, senza Python, senza C++.&lt;/p&gt;
&lt;h2 id="cosa-hanno-guadagnato"&gt;Cosa hanno guadagnato&lt;/h2&gt;
&lt;p&gt;La vittoria immediata è stata nell&amp;rsquo;esperienza dei contributori: nessuna versione Python specifica necessaria, &lt;code&gt;yarn install&lt;/code&gt; funziona con solo Node.js e il SDK .NET. Anche le pipeline CI sono diventate più semplici. Le prestazioni sono state comparabili all&amp;rsquo;implementazione C++.&lt;/p&gt;
&lt;h2 id="conclusione"&gt;Conclusione&lt;/h2&gt;
&lt;p&gt;Il team C# Dev Kit ha sostituito il carico di Python/C++ con codice C# pulito che tutto il team sa già scrivere e debuggare. Per il walkthrough completo con tutti gli helper di marshalling delle stringhe, dai un&amp;rsquo;occhiata all&amp;rsquo;&lt;a href="https://devblogs.microsoft.com/dotnet/writing-nodejs-addons-with-dotnet-native-aot/"&gt;articolo originale sul blog .NET&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>VS Code 1.117: Gli Agent Stanno Ottenendo i Propri Branch Git e Io Sono Tutto a Favore</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/vscode-1-117-agents-autopilot-worktrees/</guid><description>VS Code 1.117 porta l'isolamento con worktree per le sessioni degli agent, la modalità Autopilot persistente e il supporto per i subagent. Il workflow di coding agentico è diventato molto più reale.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/posts/emiliano-montesdeoca/vscode-1-117-agents-autopilot-worktrees/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;La linea tra &amp;ldquo;assistente IA&amp;rdquo; e &amp;ldquo;compagno di squadra IA&amp;rdquo; continua ad assottigliarsi. VS Code 1.117 è appena uscito e le &lt;a href="https://code.visualstudio.com/updates/v1_117"&gt;note di rilascio complete&lt;/a&gt; sono piene, ma la storia è chiara: gli agent stanno diventando cittadini di prima classe nel tuo workflow di sviluppo.&lt;/p&gt;
&lt;p&gt;Ecco cosa conta davvero.&lt;/p&gt;
&lt;h2 id="la-modalità-autopilot-finalmente-ricorda-la-tua-preferenza"&gt;La modalità Autopilot finalmente ricorda la tua preferenza&lt;/h2&gt;
&lt;p&gt;Prima, dovevi riattivare Autopilot ogni volta che iniziavi una nuova sessione. Fastidioso. Ora la tua modalità di permessi persiste tra le sessioni, e puoi configurare il valore predefinito.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;Agent Host supporta tre configurazioni di sessione:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Default&lt;/strong&gt; — gli strumenti chiedono conferma prima di eseguire&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bypass&lt;/strong&gt; — approva tutto automaticamente&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Autopilot&lt;/strong&gt; — completamente autonomo, risponde alle proprie domande e va avanti&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Se stai creando un nuovo progetto .NET con migrazioni, Docker e CI — impostalo su Autopilot una volta e dimenticatene. Quella preferenza resta.&lt;/p&gt;
&lt;h2 id="worktree-e-isolamento-git-per-le-sessioni-degli-agent"&gt;Worktree e isolamento git per le sessioni degli agent&lt;/h2&gt;
&lt;p&gt;Questa è la grande novità. Le sessioni degli agent ora supportano l&amp;rsquo;isolamento completo con worktree e git. Questo significa che quando un agent lavora su un task, ottiene il proprio branch e la propria directory di lavoro. Il tuo branch principale resta intatto.&lt;/p&gt;
&lt;p&gt;Ancora meglio — Copilot CLI genera nomi di branch significativi per queste sessioni worktree. Basta con &lt;code&gt;agent-session-abc123&lt;/code&gt;. Ottieni qualcosa che descrive davvero cosa sta facendo l&amp;rsquo;agent.&lt;/p&gt;
&lt;p&gt;Per gli sviluppatori .NET che gestiscono più feature branch o correggono bug mentre un lungo task di scaffolding è in esecuzione, questo è un punto di svolta. Puoi avere un agent che costruisce i tuoi controller API in un worktree mentre tu fai debug di un problema nel service layer in un altro. Nessun conflitto. Nessun stashing. Nessun casino.&lt;/p&gt;
&lt;h2 id="subagent-e-team-di-agent"&gt;Subagent e team di agent&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;Agent Host Protocol ora supporta i subagent. Un agent può avviare altri agent per gestire parti di un task. Pensalo come delegare — il tuo agent principale coordina, e agent specializzati si occupano dei pezzi.&lt;/p&gt;
&lt;p&gt;Siamo ancora all&amp;rsquo;inizio, ma il potenziale per i workflow .NET è ovvio. Immagina un agent che gestisce le tue migrazioni EF Core mentre un altro configura i tuoi test di integrazione. Non siamo ancora completamente lì, ma il fatto che il supporto al protocollo arrivi ora significa che gli strumenti seguiranno velocemente.&lt;/p&gt;
&lt;h2 id="loutput-del-terminale-incluso-automaticamente-quando-gli-agent-inviano-input"&gt;L&amp;rsquo;output del terminale incluso automaticamente quando gli agent inviano input&lt;/h2&gt;
&lt;p&gt;Piccolo ma significativo. Quando un agent invia input al terminale, l&amp;rsquo;output del terminale viene ora automaticamente incluso nel contesto. Prima, l&amp;rsquo;agent doveva fare un turno extra solo per leggere cosa era successo.&lt;/p&gt;
&lt;p&gt;Se hai mai visto un agent eseguire &lt;code&gt;dotnet build&lt;/code&gt;, fallire, e poi fare un altro giro solo per vedere l&amp;rsquo;errore — quella frizione è sparita. Vede l&amp;rsquo;output immediatamente e reagisce.&lt;/p&gt;
&lt;h2 id="lapp-agents-su-macos-si-aggiorna-automaticamente"&gt;L&amp;rsquo;app Agents su macOS si aggiorna automaticamente&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;app standalone Agents su macOS ora si aggiorna automaticamente. Basta scaricare manualmente nuove versioni. Resta semplicemente aggiornata.&lt;/p&gt;
&lt;h2 id="le-cose-più-piccole-che-vale-la-pena-sapere"&gt;Le cose più piccole che vale la pena sapere&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Gli &lt;strong&gt;hover su package.json&lt;/strong&gt; ora mostrano sia la versione installata che l&amp;rsquo;ultima disponibile. Utile se gestisci strumenti npm insieme ai tuoi progetti .NET.&lt;/li&gt;
&lt;li&gt;Le &lt;strong&gt;immagini nei commenti JSDoc&lt;/strong&gt; vengono renderizzate correttamente negli hover e nei completamenti.&lt;/li&gt;
&lt;li&gt;Le &lt;strong&gt;sessioni Copilot CLI&lt;/strong&gt; ora indicano se sono state create da VS Code o esternamente — comodo quando salti tra i terminali.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Copilot CLI, Claude Code e Gemini CLI&lt;/strong&gt; sono riconosciuti come tipi di shell. L&amp;rsquo;editor sa cosa stai eseguendo.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="il-punto-chiave"&gt;Il punto chiave&lt;/h2&gt;
&lt;p&gt;VS Code 1.117 non è un dump di feature appariscenti. È infrastruttura. Isolamento con worktree, permessi persistenti, protocolli per subagent — questi sono i mattoni per un workflow dove gli agent gestiscono task reali e paralleli senza pestare il tuo codice.&lt;/p&gt;
&lt;p&gt;Se stai sviluppando con .NET e non ti sei ancora buttato nel workflow agentico, onestamente, ora è il momento di iniziare.&lt;/p&gt;</content:encoded></item><item><title>Global Azure Spain 2026</title><link>https://thedotnetblog.com/it/events/global-azure-spain-2026/</link><pubDate>Sat, 18 Apr 2026 00:00:00 +0000</pubDate><guid>https://thedotnetblog.com/it/events/global-azure-spain-2026/</guid><description>Il più grande evento Azure della community in Spagna — un'intera giornata di sessioni su Azure, IA, dati, sicurezza e sviluppo cloud-native con 38 speaker su 3 track.</description><content:encoded>&lt;p&gt;Global Azure Spain 2026 si tiene il &lt;strong&gt;18 aprile 2026&lt;/strong&gt; al &lt;strong&gt;Kinépolis Diversia&lt;/strong&gt; ad Alcobendas, Madrid. È il più grande evento comunitario Azure in Spagna, con 38 speaker su 3 track paralleli dedicati ad agenti IA, networking Azure, Cosmos DB, Fabric, IoT, sicurezza e molto altro.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;evento si svolge dalle &lt;strong&gt;08:30 alle 18:30&lt;/strong&gt; e include keynote, pause caffè, pranzo e una sessione di chiusura Q&amp;amp;A.&lt;/p&gt;
&lt;h2 id="punti-salienti-dellagenda"&gt;Punti salienti dell&amp;rsquo;agenda&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Domando Agentes de IA&lt;/strong&gt;: governance, strumenti e API con Azure AI Foundry e 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;: sistemi multi-agente in azione&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="biglietti"&gt;Biglietti&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;iscrizione prevede una donazione simbolica — l&amp;rsquo;intero prezzo del biglietto va direttamente a &lt;strong&gt;Plan International&lt;/strong&gt;, a sostegno dei diritti dei bambini e dell&amp;rsquo;uguaglianza nel mondo. Posti limitati, prenota il tuo posto in anticipo.&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;Biglietti su Eventbrite&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://globalazure.es/"&gt;Sito dell&amp;rsquo;evento&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;Oltre a Madrid, il Global Azure Tour 2026 prevede tappe anche a &lt;strong&gt;Saragozza&lt;/strong&gt;, &lt;strong&gt;Tenerife&lt;/strong&gt; e &lt;strong&gt;Siviglia&lt;/strong&gt;.&lt;/p&gt;</content:encoded></item><item><title>I tuoi esperimenti IA su Azure stanno bruciando soldi — Ecco come risolvere</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/cloud-cost-optimization-ai-workloads-azure/</guid><description>I carichi di lavoro IA su Azure possono diventare costosi in fretta. Parliamo di cosa funziona davvero per tenere i costi sotto controllo senza rallentare lo sviluppo.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/posts/emiliano-montesdeoca/cloud-cost-optimization-ai-workloads-azure/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Se stai costruendo app basate sull&amp;rsquo;IA su Azure in questo momento, probabilmente hai notato qualcosa: la tua bolletta cloud è diversa rispetto a prima. Non solo più alta — più strana. A picchi. Difficile da prevedere.&lt;/p&gt;
&lt;p&gt;Microsoft ha appena pubblicato un ottimo articolo sui &lt;a href="https://azure.microsoft.com/en-us/blog/cloud-cost-optimization-principles-that-still-matter/"&gt;principi di ottimizzazione dei costi cloud che contano ancora&lt;/a&gt;, e onestamente, il tempismo non potrebbe essere migliore. Perché i carichi di lavoro IA hanno cambiato le regole del gioco per quanto riguarda i costi.&lt;/p&gt;
&lt;h2 id="perché-i-carichi-di-lavoro-ia-colpiscono-diversamente"&gt;Perché i carichi di lavoro IA colpiscono diversamente&lt;/h2&gt;
&lt;p&gt;Ecco il punto. I carichi di lavoro .NET tradizionali sono relativamente prevedibili. Conosci il tuo tier App Service, conosci i tuoi DTU SQL, puoi stimare la spesa mensile abbastanza precisamente. Carichi di lavoro IA? Non proprio.&lt;/p&gt;
&lt;p&gt;Stai testando più modelli per vedere quale si adatta. Stai avviando infrastruttura con GPU per il fine-tuning. Stai facendo chiamate API ad Azure OpenAI dove il consumo di token varia enormemente in base alla lunghezza del prompt e al comportamento degli utenti. Ogni esperimento costa soldi veri, e potresti farne decine prima di trovare l&amp;rsquo;approccio giusto.&lt;/p&gt;
&lt;p&gt;Questa imprevedibilità è ciò che rende l&amp;rsquo;ottimizzazione dei costi critica — non come un ripensamento, ma dal primo giorno.&lt;/p&gt;
&lt;h2 id="gestione-vs-ottimizzazione--conosci-la-differenza"&gt;Gestione vs. ottimizzazione — conosci la differenza&lt;/h2&gt;
&lt;p&gt;Una distinzione dell&amp;rsquo;articolo che secondo me gli sviluppatori trascurano: c&amp;rsquo;è una differenza tra &lt;em&gt;gestione&lt;/em&gt; dei costi e &lt;em&gt;ottimizzazione&lt;/em&gt; dei costi.&lt;/p&gt;
&lt;p&gt;La gestione è tracciamento e reporting. Imposti budget in Azure Cost Management, ricevi avvisi, vedi dashboard. Questo è il minimo indispensabile.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;ottimizzazione è dove prendi effettivamente le decisioni. Hai davvero bisogno di quel tier S3, o l&amp;rsquo;S1 gestirebbe il tuo carico? Quell&amp;rsquo;istanza di compute sempre attiva sta ferma nei weekend? Potresti usare istanze spot per i tuoi job di addestramento?&lt;/p&gt;
&lt;p&gt;Come sviluppatori .NET, tendiamo a concentrarci sul codice e lasciare le decisioni sull&amp;rsquo;infrastruttura al &amp;ldquo;team ops&amp;rdquo;. Ma se stai facendo deploy su Azure, quelle decisioni sono anche le tue.&lt;/p&gt;
&lt;h2 id="cosa-funziona-davvero"&gt;Cosa funziona davvero&lt;/h2&gt;
&lt;p&gt;Basandomi sull&amp;rsquo;articolo e sulla mia esperienza personale, ecco cosa fa la differenza:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sappi cosa stai spendendo e dove.&lt;/strong&gt; Tagga le tue risorse. Sul serio. Se non riesci a capire quale progetto o esperimento sta mangiando il tuo budget, non puoi ottimizzare nulla. Azure Cost Management con un tagging appropriato è il tuo migliore amico.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Metti dei guardrail prima di sperimentare.&lt;/strong&gt; Usa Azure Policy per limitare SKU costosi negli ambienti dev/test. Imposta limiti di spesa sui tuoi deployment Azure OpenAI. Non aspettare che arrivi la bolletta per scoprire che qualcuno ha lasciato un cluster GPU acceso tutto il weekend.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ridimensiona continuamente.&lt;/strong&gt; Quella VM che hai scelto durante il prototipo? Probabilmente è sbagliata per la produzione. Azure Advisor ti dà raccomandazioni — guardale davvero. Rivedi mensilmente, non annualmente.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pensa al ciclo di vita.&lt;/strong&gt; Le risorse di sviluppo dovrebbero spegnersi. Gli ambienti di test non devono girare 24/7. Usa policy di spegnimento automatico. Per i carichi di lavoro IA nello specifico, considera opzioni serverless dove paghi per esecuzione invece di mantenere il compute attivo.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Misura il valore, non solo il costo.&lt;/strong&gt; Questa è facile da dimenticare. Un modello che costa di più ma fornisce risultati significativamente migliori potrebbe essere la scelta giusta. L&amp;rsquo;obiettivo non è spendere il meno possibile — è spendere in modo intelligente.&lt;/p&gt;
&lt;h2 id="il-punto-chiave"&gt;Il punto chiave&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;ottimizzazione dei costi cloud non è una pulizia una tantum. È un&amp;rsquo;abitudine. E con i carichi di lavoro IA che rendono la spesa meno prevedibile che mai, costruire questa abitudine presto ti risparmia sorprese dolorose in futuro.&lt;/p&gt;
&lt;p&gt;Se sei uno sviluppatore .NET che costruisce su Azure, inizia a trattare la tua bolletta cloud come tratti il tuo codice — rivedila regolarmente, fai refactoring quando diventa disordinata, e non fare mai deploy senza capire quanto ti costerà.&lt;/p&gt;</content:encoded></item><item><title>L'RFT di Foundry è ora più economico e intelligente — Ecco cosa è cambiato</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/foundry-fine-tuning-april-2026-rft-graders/</guid><description>Microsoft Foundry ha rilasciato tre aggiornamenti RFT questo mese: addestramento globale per o4-mini, nuovi valutatori di modello GPT-4.1 e una guida alle best practice che vi farà risparmiare ore di debugging.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/posts/emiliano-montesdeoca/foundry-fine-tuning-april-2026-rft-graders/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Se state sviluppando app .NET che si basano su modelli fine-tunati, gli aggiornamenti Foundry di questo mese meritano la vostra attenzione. Il Reinforcement Fine-Tuning è diventato più accessibile e significativamente più economico.&lt;/p&gt;
&lt;p&gt;I dettagli completi sono nell&amp;rsquo;&lt;a href="https://devblogs.microsoft.com/foundry/whats-new-in-foundry-finetune-april-2026/"&gt;annuncio ufficiale&lt;/a&gt;, ma ecco il riassunto pratico.&lt;/p&gt;
&lt;h2 id="addestramento-globale-per-o4-mini"&gt;Addestramento Globale per o4-mini&lt;/h2&gt;
&lt;p&gt;o4-mini è il modello di riferimento per workload pesanti in ragionamento e agentici. La grande notizia: ora potete lanciare job di fine-tuning da più di 13 regioni Azure con tariffe di addestramento per token più basse rispetto all&amp;rsquo;addestramento Standard. Stessa infrastruttura, stessa qualità, maggiore copertura.&lt;/p&gt;
&lt;p&gt;Se il vostro team è distribuito geograficamente, questo conta. Non siete più vincolati a un pugno di regioni per addestrare.&lt;/p&gt;
&lt;p&gt;Ecco la chiamata API REST per avviare un job di addestramento globale:&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;Quel flag &lt;code&gt;trainingType: globalstandard&lt;/code&gt; è la differenza chiave.&lt;/p&gt;
&lt;h2 id="nuovi-valutatori-di-modello-famiglia-gpt-41"&gt;Nuovi Valutatori di Modello: Famiglia GPT-4.1&lt;/h2&gt;
&lt;p&gt;I valutatori definiscono il segnale di ricompensa contro cui il vostro modello ottimizza. Finora, i valutatori basati su modello erano limitati a un insieme più ristretto di modelli. Ora avete tre nuove opzioni: GPT-4.1, GPT-4.1-mini e GPT-4.1-nano.&lt;/p&gt;
&lt;p&gt;Quando dovreste usare valutatori di modello invece di quelli deterministici? Quando l&amp;rsquo;output del vostro task è aperto, quando avete bisogno di punteggio parziale su più dimensioni, o quando state costruendo workflow agentici dove la correttezza delle chiamate agli strumenti dipende dal contesto semantico.&lt;/p&gt;
&lt;p&gt;Il punto è che la strategia a livelli è pratica:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GPT-4.1-nano&lt;/strong&gt; per le iterazioni iniziali. Basso costo, cicli di feedback rapidi.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPT-4.1-mini&lt;/strong&gt; una volta che la vostra rubrica di valutazione è stabile e avete bisogno di maggiore fedeltà.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPT-4.1&lt;/strong&gt; per la valutazione in produzione o rubriche complesse dove ogni decisione di punteggio conta.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Potete persino mescolare tipi di valutatori in un singolo job RFT. Usate string-match per la dimensione &amp;ldquo;risposta corretta&amp;rdquo; e un valutatore di modello per valutare la qualità del ragionamento. Questa flessibilità è onestamente ciò che lo rende utile per workload reali.&lt;/p&gt;
&lt;h2 id="la-trappola-del-formato-dati-rft"&gt;La Trappola del Formato Dati RFT&lt;/h2&gt;
&lt;p&gt;Questo fa inciampare molti. Il formato dati RFT è diverso da SFT. L&amp;rsquo;ultimo messaggio in ogni riga deve avere il ruolo User o Developer — non Assistant. La risposta attesa va in una chiave di livello superiore come &lt;code&gt;reference_answer&lt;/code&gt; che il valutatore referenzia direttamente.&lt;/p&gt;
&lt;p&gt;Se stavate facendo supervised fine-tuning e volete passare a RFT, dovete ristrutturare i vostri dati di addestramento. Non saltate questo passaggio o i vostri job falliranno silenziosamente.&lt;/p&gt;
&lt;h2 id="perché-questo-è-importante-per-gli-sviluppatori-net"&gt;Perché Questo È Importante per gli Sviluppatori .NET&lt;/h2&gt;
&lt;p&gt;Se state chiamando modelli fine-tunati dalle vostre app .NET tramite l&amp;rsquo;SDK Azure OpenAI, un addestramento più economico significa che potete iterare in modo più aggressivo. Le opzioni dei valutatori di modello significano che potete fare fine-tuning per task sfumati — non solo scenari di corrispondenza esatta. E la guida alle best practice su &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; vi farà risparmiare tempo reale di debugging.&lt;/p&gt;
&lt;p&gt;Iniziate in piccolo. Da dieci a cento campioni. Valutatore semplice. Validate il ciclo. Poi scalate.&lt;/p&gt;</content:encoded></item><item><title>Docker Sandbox permette agli agenti Copilot di refactorizzare il codice senza mettere a rischio la tua macchina</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/copilot-docker-sandbox-agentic-refactoring/</guid><description>Docker Sandbox offre agli agenti di GitHub Copilot una microVM sicura dove possono refactorizzare liberamente — nessun prompt di permessi, nessun rischio per il tuo host. Ecco perché questo cambia tutto per la modernizzazione .NET su larga scala.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/posts/emiliano-montesdeoca/copilot-docker-sandbox-agentic-refactoring/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Se hai usato la modalità agente di Copilot per qualcosa di più di piccole modifiche, conosci il dolore. Ogni scrittura di file, ogni comando nel terminale — un altro prompt di permessi. Ora immagina di farlo su 50 progetti. Non è divertente.&lt;/p&gt;
&lt;p&gt;Il team di Azure ha appena pubblicato un post su &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 per gli agenti di GitHub Copilot&lt;/a&gt;, e onestamente, è uno dei miglioramenti più pratici che abbia mai visto nel tooling agentico. Utilizza microVM per dare a Copilot un ambiente completamente isolato dove può fare di tutto — installare pacchetti, eseguire build, lanciare test — senza toccare il tuo sistema host.&lt;/p&gt;
&lt;h2 id="cosa-ti-offre-realmente-docker-sandbox"&gt;Cosa ti offre realmente Docker Sandbox&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;idea di base è semplice: avviare una microVM leggera con un ambiente Linux completo, sincronizzare il tuo workspace al suo interno e lasciare che l&amp;rsquo;agente Copilot operi liberamente dentro. Quando ha finito, le modifiche vengono sincronizzate indietro.&lt;/p&gt;
&lt;p&gt;Ecco cosa lo rende più di un semplice &amp;ldquo;eseguire roba in un container&amp;rdquo;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sincronizzazione bidirezionale del workspace&lt;/strong&gt; che preserva i percorsi assoluti. La struttura del tuo progetto appare identica dentro la sandbox. Nessun fallimento di build legato ai percorsi.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Docker daemon privato&lt;/strong&gt; in esecuzione dentro la microVM. L&amp;rsquo;agente può costruire ed eseguire container senza mai montare il socket Docker del tuo host. Questo è un grande vantaggio per la sicurezza.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Proxy di filtraggio HTTP/HTTPS&lt;/strong&gt; che controllano cosa l&amp;rsquo;agente può raggiungere sulla rete. Tu decidi quali registry ed endpoint sono consentiti. Attacchi alla supply chain da un &lt;code&gt;npm install&lt;/code&gt; malevolo nella sandbox? Bloccati.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Modalità YOLO&lt;/strong&gt; — sì, la chiamano proprio così. L&amp;rsquo;agente gira senza prompt di permessi perché letteralmente non può danneggiare il tuo host. Ogni azione distruttiva è contenuta.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="perché-gli-sviluppatori-net-dovrebbero-interessarsi"&gt;Perché gli sviluppatori .NET dovrebbero interessarsi&lt;/h2&gt;
&lt;p&gt;Pensa al lavoro di modernizzazione che così tanti team stanno affrontando in questo momento. Hai una soluzione .NET Framework con 30 progetti e devi migrarla a .NET 9. Sono centinaia di modifiche ai file — file di progetto, aggiornamenti dei namespace, sostituzioni di API, migrazioni NuGet.&lt;/p&gt;
&lt;p&gt;Con Docker Sandbox, puoi puntare un agente Copilot su un progetto, lasciarlo refactorizzare liberamente dentro la microVM, eseguire &lt;code&gt;dotnet build&lt;/code&gt; e &lt;code&gt;dotnet test&lt;/code&gt; per validare, e accettare solo le modifiche che funzionano davvero. Nessun rischio che distrugga accidentalmente il tuo ambiente di sviluppo locale mentre sperimenta.&lt;/p&gt;
&lt;p&gt;Il post descrive anche l&amp;rsquo;esecuzione di una &lt;strong&gt;flotta di agenti paralleli&lt;/strong&gt; — ognuno nella propria sandbox — che lavorano su diversi progetti contemporaneamente. Per soluzioni .NET di grandi dimensioni o architetture a microservizi, questo è un enorme risparmio di tempo. Un agente per servizio, tutti in esecuzione isolata, tutti validati indipendentemente.&lt;/p&gt;
&lt;h2 id="laspetto-sicurezza-conta"&gt;L&amp;rsquo;aspetto sicurezza conta&lt;/h2&gt;
&lt;p&gt;Ecco il punto che la maggior parte delle persone trascura: quando lasci che un agente IA esegua comandi arbitrari, gli stai affidando l&amp;rsquo;intera macchina. Docker Sandbox ribalta questo modello. L&amp;rsquo;agente ottiene piena autonomia in un ambiente usa e getta. Il proxy di rete assicura che possa scaricare solo da fonti approvate. Il tuo filesystem host, il Docker daemon e le tue credenziali restano intatti.&lt;/p&gt;
&lt;p&gt;Per i team con requisiti di compliance — e questo vale per la maggior parte delle aziende .NET — questa è la differenza tra &amp;ldquo;non possiamo usare l&amp;rsquo;IA agentica&amp;rdquo; e &amp;ldquo;possiamo adottarla in sicurezza.&amp;rdquo;&lt;/p&gt;
&lt;h2 id="conclusione"&gt;Conclusione&lt;/h2&gt;
&lt;p&gt;Docker Sandbox risolve la tensione fondamentale del coding agentico: gli agenti hanno bisogno di libertà per essere utili, ma la libertà sulla tua macchina host è pericolosa. Le microVM ti danno entrambe le cose. Se stai pianificando qualsiasi refactoring o modernizzazione .NET su larga scala, vale la pena configurarlo ora. La combinazione dell&amp;rsquo;intelligenza di codice di Copilot con un ambiente di esecuzione sicuro è esattamente ciò che i team di produzione stavano aspettando.&lt;/p&gt;</content:encoded></item><item><title>Smetti di sorvegliare il tuo terminale: la modalità detached di Aspire cambia il flusso di lavoro</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/aspire-detached-mode-free-your-terminal/</guid><description>Aspire 13.2 ti permette di eseguire il tuo AppHost in background e riprenderti il terminale. Combinato con i nuovi comandi CLI e il supporto per gli agenti, è più importante di quanto sembri.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/posts/emiliano-montesdeoca/aspire-detached-mode-free-your-terminal/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ogni volta che esegui un AppHost di Aspire, il tuo terminale sparisce. Bloccato. Occupato finché non premi Ctrl+C. Devi eseguire un comando veloce? Apri un&amp;rsquo;altra scheda. Vuoi controllare i log? Un&amp;rsquo;altra scheda. È una piccola frizione che si accumula in fretta.&lt;/p&gt;
&lt;p&gt;Aspire 13.2 risolve questo problema. James Newton-King &lt;a href="https://devblogs.microsoft.com/aspire/aspire-detached-mode-and-process-management/"&gt;ha scritto tutti i dettagli&lt;/a&gt;, e onestamente, questa è una di quelle funzionalità che cambia immediatamente il modo in cui lavori.&lt;/p&gt;
&lt;h2 id="modalità-detached-un-comando-terminale-recuperato"&gt;Modalità detached: un comando, terminale recuperato&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;Questa è la scorciatoia per &lt;code&gt;aspire run --detach&lt;/code&gt;. Il tuo AppHost si avvia in background e riottieni il terminale immediatamente. Niente schede extra. Niente multiplexer di terminale. Solo il tuo prompt, pronto all&amp;rsquo;uso.&lt;/p&gt;
&lt;h2 id="gestire-ciò-che-è-in-esecuzione"&gt;Gestire ciò che è in esecuzione&lt;/h2&gt;
&lt;p&gt;Il punto è questo — eseguire in background è utile solo se riesci a gestire ciò che c&amp;rsquo;è là fuori. Aspire 13.2 include un set completo di comandi CLI proprio per questo:&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;Questo trasforma il CLI di Aspire in un vero gestore di processi. Puoi avviare più AppHost, controllare il loro stato, seguire i loro log e spegnerli — tutto da un&amp;rsquo;unica sessione di terminale.&lt;/p&gt;
&lt;h2 id="combinalo-con-la-modalità-isolata"&gt;Combinalo con la modalità isolata&lt;/h2&gt;
&lt;p&gt;La modalità detached si abbina naturalmente con la modalità isolata. Vuoi eseguire due istanze dello stesso progetto in background senza conflitti di porta?&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;Ognuna ottiene porte casuali, secret separati e il proprio ciclo di vita. Usa &lt;code&gt;aspire ps&lt;/code&gt; per vedere entrambe, &lt;code&gt;aspire stop&lt;/code&gt; per fermare quella di cui non hai più bisogno.&lt;/p&gt;
&lt;h2 id="perché-questo-è-enorme-per-gli-agenti-di-codice"&gt;Perché questo è enorme per gli agenti di codice&lt;/h2&gt;
&lt;p&gt;Qui diventa davvero interessante. Un agente di codice che lavora nel tuo terminale ora può:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Avviare l&amp;rsquo;app con &lt;code&gt;aspire start&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Interrogare il suo stato con &lt;code&gt;aspire describe&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Controllare i log con &lt;code&gt;aspire logs&lt;/code&gt; per diagnosticare problemi&lt;/li&gt;
&lt;li&gt;Fermarla con &lt;code&gt;aspire stop&lt;/code&gt; quando ha finito&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Tutto senza perdere la sessione del terminale. Prima della modalità detached, un agente che eseguiva il tuo AppHost si bloccava nel proprio terminale. Ora può avviare, osservare, iterare e ripulire — esattamente come vorresti che funzionasse un agente autonomo.&lt;/p&gt;
&lt;p&gt;Il team di Aspire ha puntato su questo. Eseguire &lt;code&gt;aspire agent init&lt;/code&gt; configura un file di skill di Aspire che insegna questi comandi agli agenti. Così strumenti come l&amp;rsquo;agente di codice di Copilot possono gestire i tuoi workload Aspire direttamente.&lt;/p&gt;
&lt;h2 id="per-concludere"&gt;Per concludere&lt;/h2&gt;
&lt;p&gt;La modalità detached è un upgrade del flusso di lavoro mascherato da semplice flag. Smetti di cambiare contesto tra i terminali, gli agenti smettono di bloccarsi da soli, e i nuovi comandi CLI ti danno visibilità reale su ciò che è in esecuzione. È pratico, è pulito, e rende il ciclo di sviluppo quotidiano notevolmente più fluido.&lt;/p&gt;
&lt;p&gt;Leggi il &lt;a href="https://devblogs.microsoft.com/aspire/aspire-detached-mode-and-process-management/"&gt;post completo&lt;/a&gt; per tutti i dettagli e scarica Aspire 13.2 con &lt;code&gt;aspire update --self&lt;/code&gt;.&lt;/p&gt;</content:encoded></item><item><title>Gli strumenti Azure MCP sono ora integrati in Visual Studio 2022 — Nessuna estensione necessaria</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/azure-mcp-tools-built-into-visual-studio-2022/</guid><description>Gli strumenti Azure MCP vengono distribuiti come parte del carico di lavoro di sviluppo Azure in Visual Studio 2022. Oltre 230 strumenti, 45 servizi Azure, zero estensioni da installare.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo articolo è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/posts/emiliano-montesdeoca/azure-mcp-tools-built-into-visual-studio-2022/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Se hai usato gli strumenti Azure MCP in Visual Studio tramite l&amp;rsquo;estensione separata, conosci il rituale — installare il VSIX, riavviare, sperare che non si rompa nulla, gestire le incompatibilità di versione. Quella frizione è finita.&lt;/p&gt;
&lt;p&gt;Yun Jung Choi ha &lt;a href="https://devblogs.microsoft.com/visualstudio/azure-mcp-tools-now-ship-built-into-visual-studio-2022-no-extension-required/"&gt;annunciato&lt;/a&gt; che gli strumenti Azure MCP vengono ora distribuiti direttamente come parte del carico di lavoro di sviluppo Azure in Visual Studio 2022. Nessuna estensione. Nessun VSIX. Nessun balletto del riavvio.&lt;/p&gt;
&lt;h2 id="cosa-significa-concretamente"&gt;Cosa significa concretamente&lt;/h2&gt;
&lt;p&gt;A partire da Visual Studio 2022 versione 17.14.30, il Azure MCP Server è incluso nel carico di lavoro di sviluppo Azure. Se hai già quel carico di lavoro installato, basta attivarlo in GitHub Copilot Chat e sei a posto.&lt;/p&gt;
&lt;p&gt;Oltre 230 strumenti per 45 servizi Azure — accessibili direttamente dalla finestra di chat. Elenca i tuoi account di archiviazione, fai il deploy di un&amp;rsquo;app ASP.NET Core, diagnostica problemi di App Service, interroga Log Analytics — tutto senza aprire una scheda del browser.&lt;/p&gt;
&lt;h2 id="perché-questo-conta-più-di-quanto-sembri"&gt;Perché questo conta più di quanto sembri&lt;/h2&gt;
&lt;p&gt;Il punto sugli strumenti per sviluppatori è questo: ogni passaggio in più è frizione, e la frizione uccide l&amp;rsquo;adozione. Avere MCP come estensione separata significava incompatibilità di versione, errori di installazione e un&amp;rsquo;altra cosa da tenere aggiornata. Integrarlo nel carico di lavoro significa:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Un unico percorso di aggiornamento&lt;/strong&gt; tramite il Visual Studio Installer&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nessuna divergenza di versione&lt;/strong&gt; tra l&amp;rsquo;estensione e l&amp;rsquo;IDE&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sempre aggiornato&lt;/strong&gt; — il MCP Server si aggiorna con i rilasci regolari di VS&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Per i team che standardizzano su Azure, questo è un grande vantaggio. Installi il carico di lavoro una volta, attivi gli strumenti, e sono disponibili per ogni sessione.&lt;/p&gt;
&lt;h2 id="cosa-puoi-farci"&gt;Cosa puoi farci&lt;/h2&gt;
&lt;p&gt;Gli strumenti coprono l&amp;rsquo;intero ciclo di vita dello sviluppo tramite Copilot Chat:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Imparare&lt;/strong&gt; — chiedi informazioni sui servizi Azure, best practice, pattern architetturali&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Progettare e sviluppare&lt;/strong&gt; — ottieni raccomandazioni sui servizi, configura il codice dell&amp;rsquo;applicazione&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fare deploy&lt;/strong&gt; — provisiona risorse e fai il deploy direttamente dall&amp;rsquo;IDE&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Risolvere problemi&lt;/strong&gt; — interroga i log, verifica lo stato delle risorse, diagnostica problemi in produzione&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Un esempio rapido — scrivi questo 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 chiama gli strumenti Azure MCP dietro le quinte, interroga le tue sottoscrizioni e restituisce una lista formattata con nomi, posizioni e SKU. Niente portale necessario.&lt;/p&gt;
&lt;h2 id="come-attivarlo"&gt;Come attivarlo&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Aggiorna a Visual Studio 2022 &lt;strong&gt;17.14.30&lt;/strong&gt; o superiore&lt;/li&gt;
&lt;li&gt;Assicurati che il carico di lavoro &lt;strong&gt;Azure development&lt;/strong&gt; sia installato&lt;/li&gt;
&lt;li&gt;Apri GitHub Copilot Chat&lt;/li&gt;
&lt;li&gt;Clicca sul pulsante &lt;strong&gt;Select tools&lt;/strong&gt; (l&amp;rsquo;icona delle due chiavi)&lt;/li&gt;
&lt;li&gt;Attiva &lt;strong&gt;Azure MCP Server&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Tutto qui. Rimane attivato tra le sessioni.&lt;/p&gt;
&lt;h2 id="unavvertenza"&gt;Un&amp;rsquo;avvertenza&lt;/h2&gt;
&lt;p&gt;Gli strumenti sono disattivati per default — devi attivarli manualmente. E gli strumenti specifici per VS 2026 non sono disponibili in VS 2022. La disponibilità degli strumenti dipende anche dai permessi della tua sottoscrizione Azure, come nel portale.&lt;/p&gt;
&lt;h2 id="il-quadro-generale"&gt;Il quadro generale&lt;/h2&gt;
&lt;p&gt;Questo fa parte di una tendenza chiara: MCP sta diventando lo standard per esporre gli strumenti cloud negli IDE di sviluppo. Abbiamo già visto il &lt;a href="https://devblogs.microsoft.com/azure-sdk/announcing-azure-mcp-server-2-0-stable-release/"&gt;rilascio stabile di Azure MCP Server 2.0&lt;/a&gt; e integrazioni MCP in VS Code e altri editor. Averlo integrato nel sistema dei carichi di lavoro di Visual Studio è la naturale evoluzione.&lt;/p&gt;
&lt;p&gt;Per noi sviluppatori .NET che viviamo in Visual Studio, questo elimina un altro motivo per fare context-switch verso il portale Azure. E onestamente, meno cambi di scheda si fanno, meglio è.&lt;/p&gt;</content:encoded></item><item><title>Il Pin Clustering Arriva Finalmente in .NET MAUI Maps — Una Proprietà, Zero Problemi</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/maui-maps-pin-clustering-finally/</guid><description>.NET MAUI 11 Preview 3 aggiunge il clustering nativo dei pin al controllo Map. Una proprietà, gruppi di clustering separati e gestione dei tap — tutto integrato.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo articolo è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/posts/emiliano-montesdeoca/maui-maps-pin-clustering-finally/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Conosci quel momento in cui carichi una mappa con un centinaio di pin e tutto diventa una macchia illeggibile? Sì, questa è stata l&amp;rsquo;esperienza con .NET MAUI Maps fino ad ora. Non più.&lt;/p&gt;
&lt;p&gt;David Ortinau &lt;a href="https://devblogs.microsoft.com/dotnet/pin-clustering-in-dotnet-maui-maps/"&gt;ha appena annunciato&lt;/a&gt; che .NET MAUI 11 Preview 3 include il pin clustering out of the box su Android e iOS/Mac Catalyst. E la parte migliore — è ridicolmente semplice da attivare.&lt;/p&gt;
&lt;h2 id="una-proprietà-per-dominarli-tutti"&gt;Una proprietà per dominarli tutti&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;Tutto qui. I pin vicini vengono raggruppati in cluster con un badge di conteggio. Zoom in e si espandono. Zoom out e si raggruppano. Il tipo di comportamento che gli utenti si aspettano da qualsiasi mappa moderna — e ora lo ottieni con una singola proprietà.&lt;/p&gt;
&lt;h2 id="gruppi-di-clustering-indipendenti"&gt;Gruppi di clustering indipendenti&lt;/h2&gt;
&lt;p&gt;Ecco dove diventa interessante. Non tutti i pin dovrebbero raggrupparsi insieme. Le caffetterie e i parchi sono cose diverse, e la tua mappa dovrebbe saperlo.&lt;/p&gt;
&lt;p&gt;La proprietà &lt;code&gt;ClusteringIdentifier&lt;/code&gt; ti permette di separare i pin in gruppi indipendenti:&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;I pin con lo stesso identificatore si raggruppano insieme. Identificatori diversi formano cluster indipendenti anche quando sono geograficamente vicini. Nessun identificatore? Gruppo predefinito. Pulito e prevedibile.&lt;/p&gt;
&lt;h2 id="gestione-dei-tap-sui-cluster"&gt;Gestione dei tap sui cluster&lt;/h2&gt;
&lt;p&gt;Quando un utente tocca un cluster, ricevi un evento &lt;code&gt;ClusterClicked&lt;/code&gt; con tutto ciò di cui hai bisogno:&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;Gli argomenti dell&amp;rsquo;evento ti danno &lt;code&gt;Pins&lt;/code&gt; (i pin nel cluster), &lt;code&gt;Location&lt;/code&gt; (il centro geografico) e &lt;code&gt;Handled&lt;/code&gt; (impostalo su &lt;code&gt;true&lt;/code&gt; se vuoi sovrascrivere lo zoom predefinito). Semplice, pratico, esattamente quello che ti aspetteresti.&lt;/p&gt;
&lt;h2 id="dettagli-di-piattaforma-da-conoscere"&gt;Dettagli di piattaforma da conoscere&lt;/h2&gt;
&lt;p&gt;Su Android, il clustering usa un algoritmo personalizzato basato su griglia che ricalcola ai cambi di zoom — nessuna dipendenza esterna. Su iOS e Mac Catalyst, sfrutta il supporto nativo di &lt;code&gt;MKClusterAnnotation&lt;/code&gt; di MapKit, il che significa animazioni fluide e native della piattaforma.&lt;/p&gt;
&lt;p&gt;Questo è uno di quei casi in cui il team MAUI ha fatto la scelta giusta — appoggiarsi alla piattaforma dove ha senso.&lt;/p&gt;
&lt;h2 id="perché-è-importante"&gt;Perché è importante&lt;/h2&gt;
&lt;p&gt;Il pin clustering è stata una delle funzionalità più richieste in .NET MAUI (&lt;a href="https://github.com/dotnet/maui/issues/11811"&gt;issue #11811&lt;/a&gt;), e a buon ragione. Ogni app che mostra posizioni su una mappa — tracciamento consegne, localizzatori di negozi, immobiliare — ne ha bisogno. Prima dovevi costruirlo da solo o integrare una libreria di terze parti. Ora è integrato.&lt;/p&gt;
&lt;p&gt;Per noi sviluppatori .NET che costruiamo app mobile multipiattaforma, questo è il tipo di miglioramento della qualità della vita che rende MAUI una scelta genuinamente pratica per scenari con uso intensivo di mappe.&lt;/p&gt;
&lt;h2 id="per-iniziare"&gt;Per iniziare&lt;/h2&gt;
&lt;p&gt;Installa &lt;a href="https://dotnet.microsoft.com/download/dotnet/11.0"&gt;.NET 11 Preview 3&lt;/a&gt; e aggiorna il workload .NET MAUI. L&amp;rsquo;&lt;a href="https://github.com/dotnet/maui-samples/tree/main/10.0/UserInterface/Views/Map/MapDemo/WorkingWithMaps"&gt;esempio Maps&lt;/a&gt; include una nuova pagina Clustering con cui puoi giocare subito.&lt;/p&gt;
&lt;p&gt;Vai a costruire qualcosa — e lascia che le tue mappe finalmente respirino.&lt;/p&gt;</content:encoded></item><item><title>.NET Aprile 2026 Servicing — Patch di sicurezza da applicare oggi</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/dotnet-april-2026-servicing-security-patches/</guid><description>L'aggiornamento di servicing di aprile 2026 corregge 6 CVE in .NET 10, .NET 9, .NET 8 e .NET Framework — incluse due vulnerabilità di esecuzione di codice remoto.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/posts/emiliano-montesdeoca/dotnet-april-2026-servicing-security-patches/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Gli &lt;a href="https://devblogs.microsoft.com/dotnet/dotnet-and-dotnet-framework-april-2026-servicing-updates/"&gt;aggiornamenti di servicing di aprile 2026&lt;/a&gt; per .NET e .NET Framework sono disponibili, e questo include correzioni di sicurezza che vorrai applicare presto. Sei CVE corrette, incluse due vulnerabilità di esecuzione di codice remoto (RCE).&lt;/p&gt;
&lt;h2 id="cosa-è-stato-corretto"&gt;Cosa è stato corretto&lt;/h2&gt;
&lt;p&gt;Ecco il riepilogo rapido:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;CVE&lt;/th&gt;
&lt;th&gt;Tipo&lt;/th&gt;
&lt;th&gt;Interessa&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;Bypass delle funzionalità di sicurezza&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;Esecuzione di codice remoto&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;Esecuzione di codice remoto&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;Le due CVE RCE (CVE-2026-32178 e CVE-2026-33116) interessano la gamma più ampia di versioni .NET e dovrebbero essere la priorità.&lt;/p&gt;
&lt;h2 id="versioni-aggiornate"&gt;Versioni aggiornate&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;Tutte sono disponibili attraverso i canali abituali — &lt;a href="https://dotnet.microsoft.com/download/dotnet/10.0"&gt;dotnet.microsoft.com&lt;/a&gt;, immagini container su MCR e gestori di pacchetti Linux.&lt;/p&gt;
&lt;h2 id="cosa-fare"&gt;Cosa fare&lt;/h2&gt;
&lt;p&gt;Aggiorna i tuoi progetti e le pipeline CI/CD alle ultime versioni con patch. Se stai usando container, scarica le immagini più recenti. Se sei su .NET Framework, controlla le &lt;a href="https://learn.microsoft.com/dotnet/framework/release-notes/release-notes"&gt;note di rilascio di .NET Framework&lt;/a&gt; per le patch corrispondenti.&lt;/p&gt;
&lt;p&gt;Per chi sta eseguendo .NET 10 in produzione (è la versione corrente), 10.0.6 è un aggiornamento obbligatorio. Lo stesso vale per .NET 9.0.15 e .NET 8.0.26 se sei su quelle versioni LTS. Due vulnerabilità RCE non sono qualcosa che si rimanda.&lt;/p&gt;</content:encoded></item><item><title>Aspire 13.2 aggiunge MongoDB EF Core e Azure Data Lake — Due integrazioni da provare</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/aspire-132-mongodb-efcore-data-lake/</guid><description>Aspire 13.2 aggiunge le integrazioni MongoDB Entity Framework Core e Azure Data Lake Storage con health check e service discovery senza configurazione. Ecco come si presentano nella pratica.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/posts/emiliano-montesdeoca/aspire-132-mongodb-efcore-data-lake/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Aspire 13.2 è appena arrivato con &lt;a href="https://devblogs.microsoft.com/aspire/aspire-new-database-integrations/"&gt;due nuove integrazioni database&lt;/a&gt; che meritano la vostra attenzione: MongoDB Entity Framework Core e Azure Data Lake Storage. Se volevate usare EF Core con MongoDB in un&amp;rsquo;app Aspire, o avevate bisogno di collegare workload data lake con il service discovery, questa release offre entrambe le cose.&lt;/p&gt;
&lt;h2 id="mongodb-incontra-ef-core-in-aspire"&gt;MongoDB incontra EF Core in Aspire&lt;/h2&gt;
&lt;p&gt;Questa è quella che mi entusiasma di più. Aspire supporta MongoDB da un po&amp;rsquo;, ma è sempre stato il driver grezzo — niente EF Core, niente &lt;code&gt;DbContext&lt;/code&gt;, niente query LINQ sui vostri documenti. Ora avete l&amp;rsquo;esperienza completa di EF Core con MongoDB, più gli health check automatici e il service discovery di Aspire.&lt;/p&gt;
&lt;p&gt;La configurazione segue il classico pattern di Aspire. Nel vostro 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;Poi nel progetto consumatore, aggiungete l&amp;rsquo;integrazione EF Core:&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;E registrate il vostro &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;Da lì in poi, è EF Core standard. Definite le vostre entità, usate il vostro &lt;code&gt;DbContext&lt;/code&gt; come fareste con qualsiasi altro provider. L&amp;rsquo;integrazione gestisce il connection pooling, le trace OpenTelemetry e gli health check dietro le quinte.&lt;/p&gt;
&lt;p&gt;Per gli sviluppatori .NET che usavano MongoDB con il driver grezzo e configuravano le connection string manualmente, questo è un bel miglioramento. Ottenete l&amp;rsquo;astrazione completa di EF Core senza perdere il service discovery di Aspire.&lt;/p&gt;
&lt;h2 id="azure-data-lake-storage-entra-in-gioco"&gt;Azure Data Lake Storage entra in gioco&lt;/h2&gt;
&lt;p&gt;La seconda grande aggiunta è un&amp;rsquo;&lt;a href="https://aspire.dev/integrations/cloud/azure/azure-storage-datalake/"&gt;integrazione Azure Data Lake Storage (ADLS)&lt;/a&gt;. Se state costruendo pipeline di dati, processi ETL o piattaforme di analisi, ora potete collegare risorse Data Lake allo stesso modo di qualsiasi altra dipendenza Aspire.&lt;/p&gt;
&lt;p&gt;Nell&amp;rsquo;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;Nel progetto consumatore:&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;Nessuna gestione manuale delle connection string, nessuna caccia alle credenziali. Aspire effettua il provisioning delle risorse e le inietta. Per chi di noi costruisce app .NET cloud-native che toccano sia dati operazionali che workload analitici, questo fa sentire il data lake come un cittadino di prima classe nel modello Aspire.&lt;/p&gt;
&lt;h2 id="le-piccole-correzioni-che-contano"&gt;Le piccole correzioni che contano&lt;/h2&gt;
&lt;p&gt;Oltre alle funzionalità principali, ci sono alcuni miglioramenti degni di nota:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fix della connection string MongoDB&lt;/strong&gt; — lo slash prima del nome del database ora viene gestito correttamente. Se avevate un workaround, potete rimuoverlo&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Export SQL Server&lt;/strong&gt; — &lt;code&gt;Aspire.Hosting.SqlServer&lt;/code&gt; ora esporta opzioni di configurazione server aggiuntive per un controllo più granulare&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Aggiornamenti emulatori&lt;/strong&gt; — emulatore ServiceBus 2.0.0, emulatore App Configuration 1.0.2, e l&amp;rsquo;emulatore preview di CosmosDB ora include un readiness check&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Azure Managed Redis&lt;/strong&gt; — ora usa &lt;code&gt;rediss://&lt;/code&gt; (Redis Secure) di default, quindi le connessioni sono crittografate fin da subito&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;L&amp;rsquo;ultimo punto è sottile ma importante — Redis crittografato di default significa una cosa in meno da configurare in produzione.&lt;/p&gt;
&lt;h2 id="per-concludere"&gt;Per concludere&lt;/h2&gt;
&lt;p&gt;Aspire 13.2 è una release incrementale, ma le integrazioni MongoDB EF Core e Data Lake colmano lacune reali. Se stavate aspettando un supporto EF Core adeguato con MongoDB in Aspire, o avevate bisogno del Data Lake come dipendenza di prima classe, &lt;a href="https://get.aspire.dev"&gt;aggiornate alla 13.2&lt;/a&gt; e provatele. Il comando &lt;code&gt;aspire add&lt;/code&gt; genera tutto il necessario.&lt;/p&gt;
&lt;p&gt;Leggete le &lt;a href="https://aspire.dev/whats-new/aspire-13-2/#-integrations-updates"&gt;note di rilascio complete&lt;/a&gt; per maggiori dettagli, e date un&amp;rsquo;occhiata alla &lt;a href="https://aspire.dev/integrations/gallery/"&gt;galleria delle integrazioni&lt;/a&gt; per la lista completa.&lt;/p&gt;</content:encoded></item><item><title>azd update — Un solo comando per tutti i tuoi package manager</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/azd-update-universal-upgrade-command/</guid><description>Azure Developer CLI ora ha un comando di aggiornamento universale che funziona indipendentemente da come lo hai installato — winget, Homebrew, Chocolatey o script di installazione.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/posts/emiliano-montesdeoca/azd-update-universal-upgrade-command/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Conosci quel messaggio &amp;ldquo;È disponibile una nuova versione di azd&amp;rdquo; che compare ogni poche settimane? Quello che ignori perché non ricordi se hai installato &lt;code&gt;azd&lt;/code&gt; tramite winget, Homebrew o quello script curl che hai eseguito sei mesi fa? Ecco, finalmente è stato risolto.&lt;/p&gt;
&lt;p&gt;Microsoft ha appena rilasciato &lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-update/"&gt;&lt;code&gt;azd update&lt;/code&gt;&lt;/a&gt; — un unico comando che aggiorna Azure Developer CLI all&amp;rsquo;ultima versione indipendentemente da come lo hai installato in origine. Windows, macOS, Linux — non importa. Un solo comando.&lt;/p&gt;
&lt;h2 id="come-funziona"&gt;Come funziona&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;Tutto qui. Se vuoi accesso anticipato alle nuove funzionalità, puoi passare alla build giornaliera insiders:&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;Il comando rileva il tuo metodo di installazione attuale e utilizza il meccanismo di aggiornamento appropriato dietro le quinte. Niente più &amp;ldquo;aspetta, ho usato winget o choco su questa macchina?&amp;rdquo;&lt;/p&gt;
&lt;h2 id="il-piccolo-dettaglio"&gt;Il piccolo dettaglio&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;azd update&lt;/code&gt; è disponibile a partire dalla versione 1.23.x. Se sei su una versione precedente, dovrai fare un ultimo aggiornamento manuale usando il tuo metodo di installazione originale. Dopo di che, &lt;code&gt;azd update&lt;/code&gt; gestisce tutto d&amp;rsquo;ora in avanti.&lt;/p&gt;
&lt;p&gt;Controlla la tua versione attuale con &lt;code&gt;azd version&lt;/code&gt;. Se hai bisogno di un&amp;rsquo;installazione da zero, la &lt;a href="https://learn.microsoft.com/azure/developer/azure-developer-cli/install-azd"&gt;documentazione di installazione&lt;/a&gt; fa al caso tuo.&lt;/p&gt;
&lt;h2 id="perché-è-importante"&gt;Perché è importante&lt;/h2&gt;
&lt;p&gt;È un piccolo miglioramento della qualità della vita, ma per chi di noi usa &lt;code&gt;azd&lt;/code&gt; quotidianamente per il deploy di agenti IA e app Aspire su Azure, essere aggiornati significa meno momenti &amp;ldquo;questo bug era già stato corretto nell&amp;rsquo;ultima versione&amp;rdquo;. Una cosa in meno a cui pensare.&lt;/p&gt;
&lt;p&gt;Leggi l&amp;rsquo;&lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-update/"&gt;annuncio completo&lt;/a&gt; e l&amp;rsquo;&lt;a href="https://blog.jongallant.com/2026/04/azd-update"&gt;approfondimento&lt;/a&gt; di Jon Gallant per maggiori dettagli.&lt;/p&gt;</content:encoded></item><item><title>Azure DevOps Server Patch Aprile 2026 — Fix per il Completamento delle PR e Aggiornamenti di Sicurezza</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/azure-devops-server-april-2026-patch/</guid><description>Azure DevOps Server riceve la Patch 3 con un fix per i fallimenti nel completamento delle PR, validazione migliorata al logout e ripristino delle connessioni PAT con GitHub Enterprise Server.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/posts/emiliano-montesdeoca/azure-devops-server-april-2026-patch/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Avviso rapido per i team che eseguono Azure DevOps Server in self-hosting: Microsoft ha rilasciato la &lt;a href="https://devblogs.microsoft.com/devops/april-patches-for-azure-devops-server/"&gt;Patch 3 di aprile 2026&lt;/a&gt; con tre fix mirati.&lt;/p&gt;
&lt;h2 id="cosa-è-stato-corretto"&gt;Cosa è stato corretto&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fallimenti nel completamento delle pull request&lt;/strong&gt; — un&amp;rsquo;eccezione di riferimento null durante l&amp;rsquo;auto-completamento dei work item poteva causare il fallimento dei merge delle PR. Se hai riscontrato errori casuali nel completamento delle PR, questa è probabilmente la causa&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Validazione del redirect al logout&lt;/strong&gt; — validazione migliorata durante il logout per prevenire potenziali redirect malevoli. Questo è un fix di sicurezza che vale la pena applicare tempestivamente&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Connessioni PAT con GitHub Enterprise Server&lt;/strong&gt; — la creazione di connessioni con Personal Access Token verso GitHub Enterprise Server era rotta, ora è stata ripristinata&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="come-aggiornare"&gt;Come aggiornare&lt;/h2&gt;
&lt;p&gt;Scarica la &lt;a href="https://aka.ms/devopsserverpatch3"&gt;Patch 3&lt;/a&gt; e avvia l&amp;rsquo;installer. Per verificare che la patch sia stata applicata:&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;Se esegui Azure DevOps Server on-premises, Microsoft raccomanda fortemente di restare sempre sull&amp;rsquo;ultima patch sia per sicurezza che per affidabilità. Consulta le &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;note di rilascio&lt;/a&gt; per tutti i dettagli.&lt;/p&gt;</content:encoded></item><item><title>Azure Smart Tier è in GA — Ottimizzazione automatica dei costi di Blob Storage senza regole di ciclo di vita</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/azure-smart-tier-blob-storage-ga/</guid><description>Lo smart tier di Azure Blob Storage è ora in disponibilità generale, spostando automaticamente gli oggetti tra i livelli hot, cool e cold in base ai pattern di accesso reali — senza bisogno di regole di ciclo di vita.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/posts/emiliano-montesdeoca/azure-smart-tier-blob-storage-ga/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Se hai mai passato tempo a ottimizzare le policy di ciclo di vita di Azure Blob Storage per poi vederle crollare quando i pattern di accesso sono cambiati, questo è per te. Microsoft ha appena annunciato la &lt;a href="https://azure.microsoft.com/en-us/blog/optimize-object-storage-costs-automatically-with-smart-tier-now-generally-available/"&gt;disponibilità generale dello smart tier&lt;/a&gt; per Azure Blob e Data Lake Storage — una funzionalità di tiering completamente gestita che sposta automaticamente gli oggetti tra i livelli hot, cool e cold in base all&amp;rsquo;utilizzo reale.&lt;/p&gt;
&lt;h2 id="cosa-fa-realmente-lo-smart-tier"&gt;Cosa fa realmente lo smart tier&lt;/h2&gt;
&lt;p&gt;Il concetto è semplice: lo smart tier valuta continuamente l&amp;rsquo;ultimo orario di accesso di ogni oggetto nel tuo account di archiviazione. I dati acceduti frequentemente restano in hot, i dati inattivi passano a cool dopo 30 giorni, e poi a cold dopo altri 60 giorni. Quando i dati vengono nuovamente acceduti, vengono promossi subito a hot. Il ciclo ricomincia.&lt;/p&gt;
&lt;p&gt;Nessuna regola di ciclo di vita da configurare. Nessuna previsione dei pattern di accesso. Nessun tuning manuale.&lt;/p&gt;
&lt;p&gt;Durante la preview, Microsoft ha riportato che &lt;strong&gt;oltre il 50% della capacità gestita dallo smart tier si è spostata automaticamente verso livelli più freddi&lt;/strong&gt; in base ai pattern di accesso reali. È una riduzione dei costi significativa per account di archiviazione di grandi dimensioni.&lt;/p&gt;
&lt;h2 id="perché-è-importante-per-gli-sviluppatori-net"&gt;Perché è importante per gli sviluppatori .NET&lt;/h2&gt;
&lt;p&gt;Se stai costruendo applicazioni che generano log, telemetria, dati analitici, o qualsiasi tipo di patrimonio dati in crescita — e siamo onesti, chi non lo fa? — i costi di archiviazione si accumulano velocemente. L&amp;rsquo;approccio tradizionale era scrivere policy di gestione del ciclo di vita, testarle e poi ricalibrarle quando i pattern di accesso della tua applicazione cambiavano. Lo smart tier elimina completamente quel workflow.&lt;/p&gt;
&lt;p&gt;Alcuni scenari pratici dove questo aiuta:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Telemetria e log delle applicazioni&lt;/strong&gt; — hot durante il debug, raramente acceduti dopo qualche settimana&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pipeline di dati e output ETL&lt;/strong&gt; — acceduti intensamente durante l&amp;rsquo;elaborazione, poi per lo più cold&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Contenuti generati dagli utenti&lt;/strong&gt; — gli upload recenti sono hot, i contenuti più vecchi si raffreddano gradualmente&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dati di backup e archiviazione&lt;/strong&gt; — acceduti occasionalmente per conformità, per lo più inattivi&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="come-configurarlo"&gt;Come configurarlo&lt;/h2&gt;
&lt;p&gt;Abilitare lo smart tier è una configurazione una tantum:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Account nuovi&lt;/strong&gt;: Seleziona smart tier come livello di accesso predefinito durante la creazione dell&amp;rsquo;account di archiviazione (ridondanza zonale richiesta)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Account esistenti&lt;/strong&gt;: Cambia il livello di accesso blob dall&amp;rsquo;impostazione predefinita attuale a smart tier&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Gli oggetti più piccoli di 128 KiB restano in hot e non generano la tariffa di monitoraggio. Per tutto il resto, paghi le tariffe standard di capacità hot/cool/cold senza costi di transizione tra livelli, senza penali per eliminazione anticipata e senza costi di recupero dati. Una tariffa mensile di monitoraggio per oggetto copre l&amp;rsquo;orchestrazione.&lt;/p&gt;
&lt;h2 id="il-compromesso-da-conoscere"&gt;Il compromesso da conoscere&lt;/h2&gt;
&lt;p&gt;Le regole di tiering dello smart tier sono statiche (30 giorni → cool, 90 giorni → cold). Se hai bisogno di soglie personalizzate — ad esempio, spostare a cool dopo 7 giorni per un workload specifico — le regole di ciclo di vita restano la strada giusta. E non mescolare entrambi: evita di usare regole di ciclo di vita su oggetti gestiti dallo smart tier, perché possono entrare in conflitto.&lt;/p&gt;
&lt;h2 id="conclusione"&gt;Conclusione&lt;/h2&gt;
&lt;p&gt;Non è rivoluzionario, ma risolve un vero grattacapo operativo. Se gestisci account di blob storage in crescita e sei stanco di mantenere le policy di ciclo di vita, &lt;a href="https://learn.microsoft.com/en-us/azure/storage/blobs/access-tiers-smart"&gt;abilita lo smart tier&lt;/a&gt; e lascia che Azure se ne occupi. È disponibile oggi in quasi tutte le regioni zonali del cloud pubblico.&lt;/p&gt;</content:encoded></item><item><title>Dove dovresti ospitare i tuoi agenti IA su Azure? Una guida decisionale pratica</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/azure-ai-agent-hosting-options-guide/</guid><description>Azure offre sei modi per ospitare agenti IA — dai container grezzi ai Foundry Hosted Agents completamente gestiti. Ecco come scegliere quello giusto per il tuo workload .NET.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/posts/emiliano-montesdeoca/azure-ai-agent-hosting-options-guide/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Se stai costruendo agenti IA con .NET in questo momento, probabilmente hai notato qualcosa: ci sono &lt;em&gt;molti&lt;/em&gt; modi per ospitarli su Azure. Container Apps, AKS, Functions, App Service, Foundry Agents, Foundry Hosted Agents — e tutti sembrano ragionevoli finché non devi effettivamente sceglierne uno. Microsoft ha appena pubblicato una &lt;a href="https://devblogs.microsoft.com/all-things-azure/hostedagent/"&gt;guida completa all&amp;rsquo;hosting di agenti IA su Azure&lt;/a&gt; che chiarisce tutto, e voglio analizzarla dalla prospettiva pratica di uno sviluppatore .NET.&lt;/p&gt;
&lt;h2 id="le-sei-opzioni-a-colpo-docchio"&gt;Le sei opzioni a colpo d&amp;rsquo;occhio&lt;/h2&gt;
&lt;p&gt;Ecco come riassumerei il panorama:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Opzione&lt;/th&gt;
&lt;th&gt;Ideale per&lt;/th&gt;
&lt;th&gt;Gestisci tu&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;Controllo totale dei container senza complessità K8s&lt;/td&gt;
&lt;td&gt;Osservabilità, stato, ciclo di vita&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;Compliance aziendale, multi-cluster, networking personalizzato&lt;/td&gt;
&lt;td&gt;Tutto (è quello il punto)&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;Task di agenti event-driven e di breve durata&lt;/td&gt;
&lt;td&gt;Quasi niente — serverless vero&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;Agenti HTTP semplici, traffico prevedibile&lt;/td&gt;
&lt;td&gt;Deploy, config di scaling&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;Agenti senza codice via portale/SDK&lt;/td&gt;
&lt;td&gt;Quasi niente&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;Agenti con framework personalizzato e infra gestita&lt;/td&gt;
&lt;td&gt;Solo il tuo codice agente&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Le prime quattro sono compute general-purpose — &lt;em&gt;puoi&lt;/em&gt; eseguire agenti su di esse, ma non sono state progettate per quello. Le ultime due sono native per agenti: comprendono conversazioni, chiamate a strumenti e cicli di vita degli agenti come concetti di prima classe.&lt;/p&gt;
&lt;h2 id="foundry-hosted-agents--il-punto-ideale-per-sviluppatori-net-di-agenti"&gt;Foundry Hosted Agents — il punto ideale per sviluppatori .NET di agenti&lt;/h2&gt;
&lt;p&gt;Questo è ciò che ha catturato la mia attenzione. I Foundry Hosted Agents si posizionano proprio nel mezzo: ottieni la flessibilità di eseguire il tuo codice (Semantic Kernel, Agent Framework, LangGraph — qualsiasi cosa) ma la piattaforma gestisce infrastruttura, osservabilità e gestione delle conversazioni.&lt;/p&gt;
&lt;p&gt;Il pezzo chiave è l&amp;rsquo;&lt;strong&gt;Hosting Adapter&lt;/strong&gt; — un sottile livello di astrazione che collega il tuo framework di agenti alla piattaforma Foundry. Per Microsoft Agent Framework, appare così:&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;Questa è tutta la tua storia di hosting. L&amp;rsquo;adapter gestisce traduzione di protocolli, streaming via server-sent events, cronologia delle conversazioni e tracing OpenTelemetry — tutto automaticamente. Nessun middleware personalizzato, nessun plumbing manuale.&lt;/p&gt;
&lt;h2 id="il-deploy-è-genuinamente-semplice"&gt;Il deploy è genuinamente semplice&lt;/h2&gt;
&lt;p&gt;Ho fatto deploy di agenti su Container Apps prima e funziona, ma finisci per scrivere molto codice di collegamento per gestione dello stato e osservabilità. Con Hosted Agents e &lt;code&gt;azd&lt;/code&gt;, il deploy è:&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;# Installare l&amp;#39;estensione agente IA&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;# Inizializzare da un template&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;# Costruire, pushare, fare deploy — fatto&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;Quel singolo &lt;code&gt;azd up&lt;/code&gt; costruisce il tuo container, lo pusha su ACR, provisiona il progetto Foundry, fa deploy degli endpoint del modello e avvia il tuo agente. Cinque passaggi condensati in un solo comando.&lt;/p&gt;
&lt;h2 id="gestione-conversazioni-integrata"&gt;Gestione conversazioni integrata&lt;/h2&gt;
&lt;p&gt;Questa è la parte che fa risparmiare più tempo in produzione. Invece di costruire il tuo store di stato delle conversazioni, gli Hosted Agents lo gestiscono nativamente:&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;# Creare una conversazione persistente&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;# Primo turno&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;# Secondo turno — il contesto è preservato&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;Niente Redis. Niente session store Cosmos DB. Niente middleware personalizzato per la serializzazione dei messaggi. La piattaforma semplicemente se ne occupa.&lt;/p&gt;
&lt;h2 id="il-mio-framework-decisionale"&gt;Il mio framework decisionale&lt;/h2&gt;
&lt;p&gt;Dopo aver esaminato tutte e sei le opzioni, ecco il mio modello mentale rapido:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Hai bisogno di zero infrastruttura?&lt;/strong&gt; → Foundry Agents (portale/SDK, niente container)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hai codice agente personalizzato ma vuoi hosting gestito?&lt;/strong&gt; → Foundry Hosted Agents&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hai bisogno di task agente event-driven e di breve durata?&lt;/strong&gt; → Azure Functions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hai bisogno di massimo controllo dei container senza K8s?&lt;/strong&gt; → Container Apps&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hai bisogno di compliance rigorosa e multi-cluster?&lt;/strong&gt; → AKS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hai un agente HTTP semplice con traffico prevedibile?&lt;/strong&gt; → App Service&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Per la maggior parte degli sviluppatori .NET che costruiscono con Semantic Kernel o Microsoft Agent Framework, Hosted Agents è probabilmente il punto di partenza giusto. Ottieni scale-to-zero, OpenTelemetry integrato, gestione conversazioni e flessibilità di framework — senza gestire Kubernetes o montare il tuo stack di osservabilità.&lt;/p&gt;
&lt;h2 id="per-concludere"&gt;Per concludere&lt;/h2&gt;
&lt;p&gt;Il panorama dell&amp;rsquo;hosting di agenti su Azure sta maturando velocemente. Se stai iniziando un nuovo progetto di agente IA oggi, considererei seriamente Foundry Hosted Agents prima di ricorrere a Container Apps o AKS per abitudine. L&amp;rsquo;infrastruttura gestita fa risparmiare tempo reale, e il pattern hosting adapter ti permette di mantenere la tua scelta di framework.&lt;/p&gt;
&lt;p&gt;Dai un&amp;rsquo;occhiata alla &lt;a href="https://devblogs.microsoft.com/all-things-azure/hostedagent/"&gt;guida completa di Microsoft&lt;/a&gt; e al &lt;a href="https://github.com/microsoft-foundry/foundry-samples/tree/main/samples/python/hosted-agents"&gt;repo Foundry Samples&lt;/a&gt; per esempi funzionanti.&lt;/p&gt;</content:encoded></item><item><title>Le Agent Skills in .NET sono diventate davvero flessibili</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/agent-skills-dotnet-three-authoring-patterns/</guid><description>Il Microsoft Agent Framework ora supporta tre modi per creare skill — file, classi e codice inline — tutte composte attraverso un singolo provider. Ecco perché è importante e come usare ciascun approccio.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo articolo è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/posts/emiliano-montesdeoca/agent-skills-dotnet-three-authoring-patterns/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Se avete costruito agenti con il Microsoft Agent Framework, conoscete il processo: definite le skill, le collegate a un provider e lasciate che l&amp;rsquo;agente decida quale invocare. La novità è &lt;em&gt;come&lt;/em&gt; create queste skill — e il salto in flessibilità è significativo.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;ultimo aggiornamento introduce tre pattern di authoring per le agent skill: &lt;strong&gt;basate su file&lt;/strong&gt;, &lt;strong&gt;basate su classi&lt;/strong&gt; e &lt;strong&gt;definite in codice inline&lt;/strong&gt;. Tutte e tre si collegano a un unico &lt;code&gt;AgentSkillsProviderBuilder&lt;/code&gt;, il che significa che potete mescolarle senza logica di routing o codice speciale. Vi mostro ciascuna e quando usarla.&lt;/p&gt;
&lt;h2 id="skill-basate-su-file-il-punto-di-partenza"&gt;Skill basate su file: il punto di partenza&lt;/h2&gt;
&lt;p&gt;Le skill basate su file sono esattamente quello che sembrano — una directory su disco con un file &lt;code&gt;SKILL.md&lt;/code&gt;, script opzionali e documenti di riferimento. Il modo più diretto per dare nuove capacità al vostro agente:&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;Il frontmatter di &lt;code&gt;SKILL.md&lt;/code&gt; dichiara il nome e la descrizione, e la sezione istruzioni dice all&amp;rsquo;agente come usare script e riferimenti:&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;Poi lo collegate con &lt;code&gt;SubprocessScriptRunner.RunAsync&lt;/code&gt; per l&amp;rsquo;esecuzione degli script:&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;L&amp;rsquo;agente scopre la skill automaticamente e invoca lo script di provisioning quando deve verificare lo stato degli account. Pulito e semplice.&lt;/p&gt;
&lt;h2 id="skill-basate-su-classi-distribuire-via-nuget"&gt;Skill basate su classi: distribuire via NuGet&lt;/h2&gt;
&lt;p&gt;Qui diventa interessante per i team. Le skill basate su classi derivano da &lt;code&gt;AgentClassSkill&amp;lt;T&amp;gt;&lt;/code&gt; e usano attributi come &lt;code&gt;[AgentSkillResource]&lt;/code&gt; e &lt;code&gt;[AgentSkillScript]&lt;/code&gt; perché il framework scopra tutto tramite reflection:&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;Il bello è che un team può impacchettarlo come pacchetto NuGet. Lo aggiungete al progetto, lo inserite nel builder e funziona accanto alle vostre skill basate su file senza coordinazione:&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;Entrambe le skill appaiono nel system prompt dell&amp;rsquo;agente. L&amp;rsquo;agente decide quale usare in base alla conversazione — nessun codice di routing necessario.&lt;/p&gt;
&lt;h2 id="skill-inline-il-ponte-rapido"&gt;Skill inline: il ponte rapido&lt;/h2&gt;
&lt;p&gt;Conoscete quel momento in cui un altro team sta costruendo esattamente la skill di cui avete bisogno, ma non sarà pronta fino al prossimo sprint? &lt;code&gt;AgentInlineSkill&lt;/code&gt; è il vostro ponte:&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;Aggiungetela al builder come le altre:&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;Quando il pacchetto NuGet esce finalmente, sostituite la skill inline con la versione basata su classe. L&amp;rsquo;agente non nota la differenza.&lt;/p&gt;
&lt;p&gt;Ma le skill inline non sono solo per i ponti. Sono anche la scelta giusta quando dovete generare skill dinamicamente a runtime — pensate a una skill per unità di business caricata dalla configurazione — o quando uno script deve catturare stato locale che non appartiene a un container DI.&lt;/p&gt;
&lt;h2 id="approvazione-degli-script-umano-nel-loop"&gt;Approvazione degli script: umano nel loop&lt;/h2&gt;
&lt;p&gt;Per noi sviluppatori .NET che costruiamo agenti di produzione, questa è la parte che sblocca davvero le discussioni sul deployment. Alcuni script hanno conseguenze reali — iscrivere qualcuno ai benefit, interrogare l&amp;rsquo;infrastruttura di produzione. Attivate &lt;code&gt;UseScriptApproval&lt;/code&gt; e l&amp;rsquo;agente si ferma prima di eseguire qualsiasi script:&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;Quando l&amp;rsquo;agente vuole eseguire uno script, restituisce una richiesta di approvazione. La vostra app raccoglie la decisione — approvare o rifiutare — e l&amp;rsquo;agente continua di conseguenza. Negli ambienti regolamentati, questa è la differenza tra &amp;ldquo;possiamo fare il deploy&amp;rdquo; e &amp;ldquo;l&amp;rsquo;ufficio legale dice no.&amp;rdquo;&lt;/p&gt;
&lt;h2 id="perché-questa-combinazione-conta"&gt;Perché questa combinazione conta&lt;/h2&gt;
&lt;p&gt;Il vero potere non è in nessun pattern individuale — è nella composizione. Potete:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Iniziare in piccolo&lt;/strong&gt; con una skill basata su file, iterare sulle istruzioni e pubblicarla senza scrivere C#&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Distribuire skill riutilizzabili&lt;/strong&gt; come pacchetti NuGet che altri team aggiungono con una riga&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Colmare lacune&lt;/strong&gt; con skill inline quando avete bisogno di qualcosa &lt;em&gt;adesso&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Filtrare directory condivise&lt;/strong&gt; con predicati perché il vostro agente carichi solo quello che deve&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Aggiungere supervisione umana&lt;/strong&gt; per gli script che toccano sistemi di produzione&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tutto questo si compone tramite &lt;code&gt;AgentSkillsProviderBuilder&lt;/code&gt;. Nessun routing speciale, nessuna logica condizionale, nessun controllo del tipo di skill.&lt;/p&gt;
&lt;h2 id="per-concludere"&gt;Per concludere&lt;/h2&gt;
&lt;p&gt;Le agent skill in .NET ora hanno un modello di authoring genuinamente flessibile. Che siate uno sviluppatore solo che prototipa con skill basate su file o un team enterprise che distribuisce capacità impacchettate via NuGet, i pattern si adattano. E il meccanismo di approvazione degli script lo rende pronto per la produzione negli ambienti dove serve quel checkpoint umano.&lt;/p&gt;
&lt;p&gt;Date un&amp;rsquo;occhiata all&amp;rsquo;&lt;a href="https://devblogs.microsoft.com/agent-framework/agent-skills-in-net-three-ways-to-author-one-provider-to-run-them/"&gt;annuncio originale&lt;/a&gt;, alla &lt;a href="https://learn.microsoft.com/en-us/agent-framework/agents/skills"&gt;documentazione Agent Skills&lt;/a&gt; su Microsoft Learn e agli &lt;a href="https://github.com/microsoft/agent-framework/tree/main/dotnet/samples/02-agents/AgentSkills"&gt;esempi .NET su GitHub&lt;/a&gt; per iniziare.&lt;/p&gt;</content:encoded></item><item><title>Azure MCP Server 2.0 è Arrivato — L'Automazione Agentica Self-Hosted nel Cloud È Qui</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/azure-mcp-server-2-self-hosted-agentic-cloud/</guid><description>Azure MCP Server 2.0 è stabile con deployment remoti self-hosted, 276 tool su 57 servizi Azure, e sicurezza di livello enterprise — ecco cosa conta per gli sviluppatori .NET che costruiscono workflow agentici.</description><content:encoded>&lt;p&gt;&lt;em&gt;Questo articolo è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/posts/emiliano-montesdeoca/azure-mcp-server-2-self-hosted-agentic-cloud/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Se hai costruito qualcosa con MCP e Azure di recente, probabilmente sai già che l&amp;rsquo;esperienza locale funziona bene. Connetti un server MCP, lascia che il tuo agente AI parli alle risorse Azure, e vai avanti. Ma nel momento in cui hai bisogno di condividere questa configurazione con un team? Ecco dove le cose si complicavano.&lt;/p&gt;
&lt;p&gt;Non più. Azure MCP Server &lt;a href="https://devblogs.microsoft.com/azure-sdk/announcing-azure-mcp-server-2-0-stable-release/"&gt;ha appena raggiunto la versione 2.0 stabile&lt;/a&gt;, e la feature principale è esattamente quello che i team enterprise chiedevano: &lt;strong&gt;supporto per server MCP remoti self-hosted&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="che-cosè-azure-mcp-server"&gt;Che cos&amp;rsquo;è Azure MCP Server?&lt;/h2&gt;
&lt;p&gt;Un rapido ripasso. Azure MCP Server implementa la specifica &lt;a href="https://modelcontextprotocol.io/docs/getting-started/intro"&gt;Model Context Protocol&lt;/a&gt; ed espone le capacità di Azure come tool strutturati e scopribili che gli agenti AI possono invocare. Pensalo come un ponte standardizzato tra il tuo agente e Azure — provisioning, deployment, monitoring, diagnostica, tutto attraverso un&amp;rsquo;interfaccia coerente.&lt;/p&gt;
&lt;p&gt;I numeri parlano da soli: &lt;strong&gt;276 tool MCP su 57 servizi Azure&lt;/strong&gt;. È una copertura seria.&lt;/p&gt;
&lt;h2 id="il-grande-affare-deployment-remoti-self-hosted"&gt;Il grande affare: deployment remoti self-hosted&lt;/h2&gt;
&lt;p&gt;Ecco il punto. Eseguire MCP localmente sulla tua macchina va bene per lo sviluppo e gli esperimenti. Ma in uno scenario di team reale, hai bisogno di:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Accesso condiviso per sviluppatori e sistemi agentici interni&lt;/li&gt;
&lt;li&gt;Configurazione centralizzata (contesto tenant, impostazioni di sottoscrizione predefinite, telemetria)&lt;/li&gt;
&lt;li&gt;Limiti di rete e policy aziendali&lt;/li&gt;
&lt;li&gt;Integrazione nelle pipeline CI/CD&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Azure MCP Server 2.0 affronta tutto questo. Puoi deployarlo come servizio interno gestito centralmente con trasporto basato su HTTP, autenticazione adeguata e governance coerente.&lt;/p&gt;
&lt;p&gt;Per l&amp;rsquo;autenticazione, hai due solide opzioni:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Managed Identity&lt;/strong&gt; — quando eseguito insieme a &lt;a href="https://aka.ms/azmcp/self-host/foundry"&gt;Microsoft Foundry&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;On-Behalf-Of (OBO) flow&lt;/strong&gt; — delegazione OpenID Connect che chiama le API Azure usando il contesto dell&amp;rsquo;utente autenticato&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Quel flusso OBO è particolarmente interessante per noi sviluppatori .NET. Significa che i tuoi workflow agentici possono operare con i permessi effettivi dell&amp;rsquo;utente, non con un account di servizio sovra-privilegiato. Principio del minimo privilegio, integrato fin dall&amp;rsquo;inizio.&lt;/p&gt;
&lt;h2 id="hardening-della-sicurezza"&gt;Hardening della sicurezza&lt;/h2&gt;
&lt;p&gt;Non è solo un rilascio di feature — è anche uno di sicurezza. Il rilascio 2.0 aggiunge:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Validazione endpoint più forte&lt;/li&gt;
&lt;li&gt;Protezioni contro i pattern di injection negli strumenti orientati alle query&lt;/li&gt;
&lt;li&gt;Controlli di isolamento più rigidi per gli ambienti di sviluppo&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Se stai per esporre MCP come servizio condiviso, questi salvaguardi contano. Molto.&lt;/p&gt;
&lt;h2 id="dove-puoi-usarlo"&gt;Dove puoi usarlo?&lt;/h2&gt;
&lt;p&gt;La storia della compatibilità client è ampia. Azure MCP Server 2.0 funziona con:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;IDE&lt;/strong&gt;: VS Code, Visual Studio, IntelliJ, Eclipse, Cursor&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agenti CLI&lt;/strong&gt;: GitHub Copilot CLI, Claude Code&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Standalone&lt;/strong&gt;: server locale per configurazioni semplici&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Self-hosted remote&lt;/strong&gt;: la nuova stella del 2.0&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Inoltre c&amp;rsquo;è il supporto per sovereign cloud per Azure US Government e Azure gestito da 21Vianet, che è critico per i deployment regolamentati.&lt;/p&gt;
&lt;h2 id="perché-questo-conta-per-gli-sviluppatori-net"&gt;Perché questo conta per gli sviluppatori .NET&lt;/h2&gt;
&lt;p&gt;Se stai costruendo applicazioni agentiche con .NET — che sia Semantic Kernel, Microsoft Agent Framework, o la tua orchestrazione personalizzata — Azure MCP Server 2.0 ti dà un modo production-ready per lasciare che i tuoi agenti interagiscano con l&amp;rsquo;infrastruttura Azure. Nessun wrapper REST personalizzato. Nessun pattern di integrazione specifico per il servizio. Solo MCP.&lt;/p&gt;
&lt;p&gt;Combinato con l&amp;rsquo;&lt;a href="https://devblogs.microsoft.com/azure-sdk/mcp-as-easy-as-1-2-3-introducing-the-fluent-api-for-mcp-apps/"&gt;API fluent per MCP Apps&lt;/a&gt; uscito pochi giorni fa, l&amp;rsquo;ecosistema .NET MCP sta maturando velocemente.&lt;/p&gt;
&lt;h2 id="per-iniziare"&gt;Per iniziare&lt;/h2&gt;
&lt;p&gt;Scegli il tuo percorso:&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; — codice sorgente, documentazione, tutto&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; — deployment containerizzato&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; — integrazione IDE&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; — la feature principale del 2.0&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="per-concludere"&gt;Per concludere&lt;/h2&gt;
&lt;p&gt;Azure MCP Server 2.0 è esattamente il tipo di upgrade infrastrutturale che non sembra vistoso in una demo ma cambia tutto nella pratica. MCP remoto self-hosted con autenticazione appropriata, hardening della sicurezza e supporto per sovereign cloud significa che MCP è pronto per team reali che costruiscono workflow agentici reali su Azure. Se stavi aspettando il segnale &amp;ldquo;enterprise-ready&amp;rdquo; — questo è.&lt;/p&gt;</content:encoded></item><item><title>.NET Aspire 13.2 Vuole Essere il Migliore Amico del Tuo Agente IA</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/aspire-agentic-development-build-run-observe/</guid><description>Aspire 13.2 punta tutto sullo sviluppo agentico — output CLI strutturato, esecuzioni isolate, ambienti auto-riparanti e dati OpenTelemetry completi perché i tuoi agenti IA possano davvero costruire, eseguire e osservare le tue app.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/posts/emiliano-montesdeoca/aspire-agentic-development-build-run-observe/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Conosci quel momento in cui il tuo agente IA scrive del codice solido, ti entusiasmi, e poi tutto crolla quando prova a &lt;em&gt;eseguire&lt;/em&gt; la cosa? Conflitti di porte, processi fantasma, variabili d&amp;rsquo;ambiente sbagliate — improvvisamente il tuo agente sta bruciando token per risolvere problemi di avvio invece di costruire funzionalità.&lt;/p&gt;
&lt;p&gt;Il team di Aspire ha appena pubblicato un &lt;a href="https://devblogs.microsoft.com/aspire/agentic-dev-aspirations/"&gt;post molto ben pensato&lt;/a&gt; su esattamente questo problema, e la loro risposta è convincente: Aspire 13.2 è progettato non solo per gli umani, ma per gli agenti IA.&lt;/p&gt;
&lt;h2 id="il-problema-è-reale"&gt;Il problema è reale&lt;/h2&gt;
&lt;p&gt;Gli agenti IA sono incredibili nello scrivere codice. Ma consegnare un&amp;rsquo;app full-stack funzionante richiede molto di più che generare file. Devi avviare i servizi nell&amp;rsquo;ordine giusto, gestire le porte, impostare le variabili d&amp;rsquo;ambiente, connettere i database e ottenere feedback quando qualcosa si rompe. Al momento, la maggior parte degli agenti gestisce tutto questo per tentativi — eseguendo comandi, leggendo output di errore, riprovando.&lt;/p&gt;
&lt;p&gt;Aggiungiamo istruzioni Markdown, skill personalizzati e prompt per guidarli, ma sono imprevedibili, non possono essere compilati e costano token solo per essere parsati. Il team di Aspire ha centrato l&amp;rsquo;insight chiave: gli agenti hanno bisogno di &lt;strong&gt;compilatori e API strutturate&lt;/strong&gt;, non di più Markdown.&lt;/p&gt;
&lt;h2 id="aspire-come-infrastruttura-per-agenti"&gt;Aspire come infrastruttura per agenti&lt;/h2&gt;
&lt;p&gt;Ecco cosa porta Aspire 13.2 al tavolo dello sviluppo agentico:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tutto il tuo stack in codice tipizzato.&lt;/strong&gt; L&amp;rsquo;AppHost definisce la tua topologia completa — API, frontend, database, cache — in TypeScript o C# compilabile:&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;Un agente può leggere questo per capire la topologia dell&amp;rsquo;app, aggiungere risorse, collegare connessioni e &lt;em&gt;compilare per verificare&lt;/em&gt;. Il compilatore gli dice immediatamente se qualcosa è sbagliato. Niente congetture, niente tentativi con i file di configurazione.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Un solo comando per governarli tutti.&lt;/strong&gt; Invece di far destreggiate gli agenti tra &lt;code&gt;docker compose up&lt;/code&gt;, &lt;code&gt;npm run dev&lt;/code&gt; e script di avvio database, tutto è semplicemente &lt;code&gt;aspire start&lt;/code&gt;. Tutte le risorse si avviano nell&amp;rsquo;ordine giusto, sulle porte giuste, con la configurazione giusta. I processi a lunga durata non bloccano l&amp;rsquo;agente — Aspire li gestisce.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Modalità isolata per agenti paralleli.&lt;/strong&gt; Con &lt;code&gt;--isolated&lt;/code&gt;, ogni esecuzione di Aspire ottiene le proprie porte casuali e segreti utente separati. Hai più agenti che lavorano su git worktree? Non entreranno in collisione. Questo è enorme per strumenti come gli agenti in background di VS Code che creano ambienti paralleli.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Occhi da agente attraverso la telemetria.&lt;/strong&gt; Qui diventa davvero potente. La CLI di Aspire espone dati OpenTelemetry completi durante lo sviluppo — tracce, metriche, log strutturati. Il tuo agente non sta solo leggendo l&amp;rsquo;output della console sperando per il meglio. Può tracciare una richiesta fallita tra i servizi, profilare endpoint lenti e individuare esattamente dove le cose si rompono. Questa è osservabilità di livello produzione nel ciclo di sviluppo.&lt;/p&gt;
&lt;h2 id="lanalogia-dei-parabordi-del-bowling"&gt;L&amp;rsquo;analogia dei parabordi del bowling&lt;/h2&gt;
&lt;p&gt;Il team di Aspire usa un&amp;rsquo;ottima analogia: pensa ad Aspire come ai parabordi della pista da bowling per gli agenti IA. Se l&amp;rsquo;agente non è perfetto (e non lo sarà), i parabordi impediscono che tiri nel canale. La definizione dello stack previene la misconfigurazioni, il compilatore cattura gli errori, la CLI gestisce i processi e la telemetria fornisce il ciclo di feedback.&lt;/p&gt;
&lt;p&gt;Combina questo con qualcosa come Playwright CLI, e il tuo agente può davvero &lt;em&gt;usare&lt;/em&gt; la tua app — cliccando nei flussi, controllando il DOM, vedendo le cose rotte nella telemetria, sistemando il codice, riavviando e testando di nuovo. Costruire, eseguire, osservare, sistemare. Questo è il ciclo di sviluppo autonomo che stavamo inseguendo.&lt;/p&gt;
&lt;h2 id="per-iniziare"&gt;Per iniziare&lt;/h2&gt;
&lt;p&gt;Nuovo con Aspire? Installa la CLI da &lt;a href="https://get.aspire.dev"&gt;get.aspire.dev&lt;/a&gt; e segui la &lt;a href="https://aspire.dev/get-started/first-app"&gt;guida introduttiva&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Già usi Aspire? Esegui &lt;code&gt;aspire update --self&lt;/code&gt; per ottenere la 13.2, poi punta il tuo agente di coding preferito al tuo repo. Potresti stupirti di quanto va più lontano con i guardrail di Aspire.&lt;/p&gt;
&lt;h2 id="per-concludere"&gt;Per concludere&lt;/h2&gt;
&lt;p&gt;Aspire 13.2 non è più solo un framework per app distribuite — sta diventando infrastruttura essenziale per agenti. Definizioni di stack strutturate, avvio con un comando, esecuzioni parallele isolate e telemetria in tempo reale danno agli agenti IA esattamente ciò di cui hanno bisogno per passare dallo scrivere codice al consegnare app.&lt;/p&gt;
&lt;p&gt;Leggi il &lt;a href="https://devblogs.microsoft.com/aspire/agentic-dev-aspirations/"&gt;post completo&lt;/a&gt; dal team di Aspire per tutti i dettagli e i video dimostrativi.&lt;/p&gt;</content:encoded></item><item><title>Collega i tuoi server MCP su Azure Functions ai Foundry Agents — Ecco come</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/foundry-agents-mcp-servers-azure-functions/</guid><description>Costruisci il tuo server MCP una volta, distribiscilo su Azure Functions e collegalo agli agenti Microsoft Foundry con autenticazione adeguata. I tuoi strumenti funzionano ovunque — VS Code, Cursor, e ora agenti AI aziendali.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/posts/emiliano-montesdeoca/foundry-agents-mcp-servers-azure-functions/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ecco cosa adoro dell&amp;rsquo;ecosistema MCP: costruisci il tuo server una volta e funziona ovunque. VS Code, Visual Studio, Cursor, ChatGPT — ogni client MCP può scoprire e utilizzare i tuoi strumenti. Ora, Microsoft sta aggiungendo un altro consumatore a quella lista: gli agenti Foundry.&lt;/p&gt;
&lt;p&gt;Lily Ma del team Azure SDK &lt;a href="https://devblogs.microsoft.com/azure-sdk/give-your-foundry-agent-custom-tools-with-mcp-servers-on-azure-functions/"&gt;ha pubblicato una guida pratica&lt;/a&gt; su come collegare server MCP distribuiti su Azure Functions con gli agenti Microsoft Foundry. Se hai già un server MCP, questo è puro valore aggiunto — nessuna ricostruzione necessaria.&lt;/p&gt;
&lt;h2 id="perché-questa-combinazione-ha-senso"&gt;Perché questa combinazione ha senso&lt;/h2&gt;
&lt;p&gt;Azure Functions ti offre infrastruttura scalabile, autenticazione integrata e fatturazione serverless per ospitare server MCP. Microsoft Foundry ti dà agenti AI che possono ragionare, pianificare e agire. Collegare i due significa che i tuoi strumenti personalizzati — interrogare un database, chiamare un&amp;rsquo;API aziendale, eseguire logica di validazione — diventano capacità che gli agenti AI aziendali possono scoprire e utilizzare autonomamente.&lt;/p&gt;
&lt;p&gt;Il punto chiave: il tuo server MCP resta lo stesso. Stai semplicemente aggiungendo Foundry come un altro consumatore. Gli stessi strumenti che funzionano nel tuo setup VS Code ora alimentano un agente AI con cui il tuo team o i clienti interagiscono.&lt;/p&gt;
&lt;h2 id="opzioni-di-autenticazione"&gt;Opzioni di autenticazione&lt;/h2&gt;
&lt;p&gt;È qui che il post offre davvero valore. Quattro metodi di autenticazione a seconda del tuo scenario:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metodo&lt;/th&gt;
&lt;th&gt;Caso d&amp;rsquo;uso&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Basato su chiave&lt;/strong&gt; (predefinito)&lt;/td&gt;
&lt;td&gt;Sviluppo o server senza autenticazione Entra&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;Produzione con identità gestite&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Passthrough identità OAuth&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Produzione dove ogni utente si autentica individualmente&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Senza autenticazione&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dev/test o solo dati pubblici&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Per la produzione, Microsoft Entra con identità dell&amp;rsquo;agente è il percorso consigliato. Il passthrough identità OAuth è per quando il contesto utente conta — l&amp;rsquo;agente chiede agli utenti di accedere, e ogni richiesta porta il token personale dell&amp;rsquo;utente.&lt;/p&gt;
&lt;h2 id="configurazione"&gt;Configurazione&lt;/h2&gt;
&lt;p&gt;Il flusso generale:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Distribuisci il tuo server MCP su Azure Functions&lt;/strong&gt; — esempi disponibili per &lt;a href="https://github.com/Azure-Samples/remote-mcp-functions-dotnet"&gt;.NET&lt;/a&gt;, Python, TypeScript e Java&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Abilita l&amp;rsquo;autenticazione MCP integrata&lt;/strong&gt; sulla tua function app&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ottieni l&amp;rsquo;URL del tuo endpoint&lt;/strong&gt; — &lt;code&gt;https://&amp;lt;FUNCTION_APP_NAME&amp;gt;.azurewebsites.net/runtime/webhooks/mcp&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Aggiungi il server MCP come strumento in Foundry&lt;/strong&gt; — naviga al tuo agente nel portale, aggiungi un nuovo strumento MCP, fornisci endpoint e credenziali&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Poi testalo nel playground dell&amp;rsquo;Agent Builder inviando un prompt che attiverebbe uno dei tuoi strumenti.&lt;/p&gt;
&lt;h2 id="la-mia-opinione"&gt;La mia opinione&lt;/h2&gt;
&lt;p&gt;La storia della composabilità qui sta diventando davvero forte. Costruisci il tuo server MCP una volta in .NET (o Python, TypeScript, Java), distribuiscilo su Azure Functions, e ogni client compatibile con MCP può usarlo — strumenti di codifica, app di chat, e ora agenti AI aziendali. È un pattern &amp;ldquo;scrivi una volta, usa ovunque&amp;rdquo; che funziona davvero.&lt;/p&gt;
&lt;p&gt;Per gli sviluppatori .NET nello specifico, l&amp;rsquo;&lt;a href="https://github.com/Azure-Samples/remote-mcp-functions-dotnet"&gt;estensione MCP di Azure Functions&lt;/a&gt; rende tutto semplice. Definisci i tuoi strumenti come Azure Functions, fai il deploy, e hai un server MCP di livello produzione con tutta la sicurezza e la scalabilità che Azure Functions offre.&lt;/p&gt;
&lt;h2 id="conclusione"&gt;Conclusione&lt;/h2&gt;
&lt;p&gt;Se hai strumenti MCP in esecuzione su Azure Functions, collegarli agli agenti Foundry è una vittoria rapida — i tuoi strumenti personalizzati diventano capacità AI aziendali con autenticazione adeguata e senza modifiche al codice del server.&lt;/p&gt;
&lt;p&gt;Leggi la &lt;a href="https://devblogs.microsoft.com/azure-sdk/give-your-foundry-agent-custom-tools-with-mcp-servers-on-azure-functions/"&gt;guida completa&lt;/a&gt; per istruzioni passo passo su ogni metodo di autenticazione, e consulta la &lt;a href="https://learn.microsoft.com/azure/azure-functions/functions-mcp-foundry-tools?tabs=entra%2Cmcp-extension%2Cfoundry"&gt;documentazione dettagliata&lt;/a&gt; per configurazioni di produzione.&lt;/p&gt;</content:encoded></item><item><title>Costruire UI Multi-Agente in Tempo Reale Che Non Sembrino una Scatola Nera</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/ag-ui-real-time-multi-agent-ui-maf/</guid><description>AG-UI e Microsoft Agent Framework si alleano per dare ai workflow multi-agente un vero frontend — con streaming in tempo reale, approvazioni umane e piena visibilità su cosa stanno facendo i tuoi agenti.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/posts/emiliano-montesdeoca/ag-ui-real-time-multi-agent-ui-maf/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ecco il punto dei sistemi multi-agente: nelle demo sono incredibili. Tre agenti che si passano il lavoro, risolvono problemi, prendono decisioni. Poi provi a metterlo davanti a utenti reali e&amp;hellip; silenzio. Un indicatore che gira. Nessuna idea di quale agente stia facendo cosa o perché il sistema sia in pausa. Quello non è un prodotto — è un problema di fiducia.&lt;/p&gt;
&lt;p&gt;Il team di Microsoft Agent Framework ha appena pubblicato un &lt;a href="https://devblogs.microsoft.com/agent-framework/ag-ui-multi-agent-workflow-demo/"&gt;fantastico walkthrough&lt;/a&gt; su come accoppiare i workflow MAF con &lt;a href="https://github.com/ag-ui-protocol/ag-ui"&gt;AG-UI&lt;/a&gt;, un protocollo aperto per lo streaming degli eventi di esecuzione degli agenti verso un frontend tramite Server-Sent Events. E onestamente? È esattamente il ponte che ci mancava.&lt;/p&gt;
&lt;h2 id="perché-questo-è-importante-per-gli-sviluppatori-net"&gt;Perché questo è importante per gli sviluppatori .NET&lt;/h2&gt;
&lt;p&gt;Se stai costruendo app alimentate dall&amp;rsquo;IA, probabilmente hai già sbattuto contro questo muro. La tua orchestrazione backend funziona benissimo — gli agenti si passano il lavoro, gli strumenti si attivano, le decisioni vengono prese. Ma il frontend non ha idea di cosa stia succedendo dietro le quinte. AG-UI risolve questo definendo un protocollo standard per lo streaming degli eventi degli agenti (pensa a &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;) direttamente verso il tuo layer UI tramite SSE.&lt;/p&gt;
&lt;p&gt;La demo è un workflow di supporto clienti con tre agenti: un agente di triage che smista le richieste, un agente rimborsi che gestisce le questioni di denaro, e un agente ordini che gestisce le sostituzioni. Ogni agente ha i propri strumenti, e la topologia di handoff è definita esplicitamente — niente &amp;ldquo;scoprilo dal prompt&amp;rdquo;.&lt;/p&gt;
&lt;h2 id="la-topologia-di-handoff-è-la-vera-star"&gt;La topologia di handoff è la vera star&lt;/h2&gt;
&lt;p&gt;Quello che mi ha colpito è come &lt;code&gt;HandoffBuilder&lt;/code&gt; ti permette di dichiarare un grafo di routing diretto tra gli agenti:&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;Ogni &lt;code&gt;add_handoff&lt;/code&gt; crea un arco diretto con una descrizione in linguaggio naturale. Il framework genera strumenti di handoff per ogni agente basandosi su questa topologia. Quindi le decisioni di routing sono fondate sulla tua struttura di orchestrazione, non solo su quello che il LLM decide di fare. Questo è un vantaggio enorme per l&amp;rsquo;affidabilità in produzione.&lt;/p&gt;
&lt;h2 id="human-in-the-loop-che-funziona-davvero"&gt;Human-in-the-loop che funziona davvero&lt;/h2&gt;
&lt;p&gt;La demo mostra due pattern di interruzione di cui qualsiasi app di agenti reale ha bisogno:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Interruzioni di approvazione strumenti&lt;/strong&gt; — quando un agente chiama uno strumento marcato con &lt;code&gt;approval_mode=&amp;quot;always_require&amp;quot;&lt;/code&gt;, il workflow si mette in pausa ed emette un evento. Il frontend mostra un modal di approvazione con il nome dello strumento e i suoi argomenti. Niente loop di retry che bruciano token — solo un flusso pulito pausa-approvazione-ripresa.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Interruzioni di richiesta informazioni&lt;/strong&gt; — quando un agente ha bisogno di più contesto dall&amp;rsquo;utente (come un ID ordine), si mette in pausa e chiede. Il frontend mostra la domanda, l&amp;rsquo;utente risponde, e l&amp;rsquo;esecuzione riprende esattamente da dove si era fermata.&lt;/p&gt;
&lt;p&gt;Entrambi i pattern vengono trasmessi come eventi AG-UI standard, quindi il tuo frontend non ha bisogno di logica personalizzata per agente — semplicemente renderizza qualsiasi evento arrivi dalla connessione SSE.&lt;/p&gt;
&lt;h2 id="collegare-il-tutto-è-sorprendentemente-semplice"&gt;Collegare il tutto è sorprendentemente semplice&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;integrazione tra MAF e AG-UI si riduce a una singola chiamata di funzione:&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;La &lt;code&gt;workflow_factory&lt;/code&gt; crea un workflow fresco per thread, così ogni conversazione ottiene il proprio stato isolato. L&amp;rsquo;endpoint gestisce tutta l&amp;rsquo;infrastruttura SSE automaticamente. Se stai già usando FastAPI (o puoi aggiungerlo come layer leggero), c&amp;rsquo;è praticamente zero frizione.&lt;/p&gt;
&lt;h2 id="la-mia-opinione"&gt;La mia opinione&lt;/h2&gt;
&lt;p&gt;Per noi sviluppatori .NET, la domanda immediata è: &amp;ldquo;Posso farlo in C#?&amp;rdquo; L&amp;rsquo;Agent Framework è disponibile sia per .NET che per Python, e il protocollo AG-UI è agnostico rispetto al linguaggio (è solo SSE). Quindi anche se questa demo specifica usa Python e FastAPI, il pattern si traduce direttamente. Potresti configurare una API minimale ASP.NET Core con endpoint SSE seguendo lo stesso schema di eventi AG-UI.&lt;/p&gt;
&lt;p&gt;Il messaggio più importante è che le UI multi-agente stanno diventando una preoccupazione di prima classe, non un ripensamento. Se stai costruendo qualcosa dove gli agenti interagiscono con gli umani — supporto clienti, workflow di approvazione, elaborazione documenti — questa combinazione di orchestrazione MAF e trasparenza AG-UI è il pattern da seguire.&lt;/p&gt;
&lt;h2 id="per-concludere"&gt;Per concludere&lt;/h2&gt;
&lt;p&gt;AG-UI + Microsoft Agent Framework ti dà il meglio di entrambi i mondi: orchestrazione multi-agente robusta nel backend e visibilità in tempo reale nel frontend. Niente più interazioni tra agenti come scatole nere.&lt;/p&gt;
&lt;p&gt;Dai un&amp;rsquo;occhiata al &lt;a href="https://devblogs.microsoft.com/agent-framework/ag-ui-multi-agent-workflow-demo/"&gt;walkthrough completo&lt;/a&gt; e al &lt;a href="https://github.com/ag-ui-protocol/ag-ui"&gt;repository del protocollo AG-UI&lt;/a&gt; per approfondire.&lt;/p&gt;</content:encoded></item><item><title>L'Ingegneria delle Piattaforme Agentiche Sta Diventando Realtà — Git-APE Mostra Come</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/agentic-platform-engineering-git-ape/</guid><description>Il progetto Git-APE di Microsoft mette in pratica l'ingegneria delle piattaforme agentiche — usando agenti GitHub Copilot e Azure MCP per trasformare richieste in linguaggio naturale in infrastruttura cloud validata.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/posts/emiliano-montesdeoca/agentic-platform-engineering-git-ape/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;L&amp;rsquo;ingegneria delle piattaforme è stato uno di quei termini che suona bene alle conferenze ma che di solito significa &amp;ldquo;abbiamo costruito un portale interno e un wrapper Terraform.&amp;rdquo; La vera promessa — infrastruttura self-service che sia realmente sicura, governata e veloce — è sempre stata a qualche passo di distanza.&lt;/p&gt;
&lt;p&gt;Il team Azure ha appena pubblicato la &lt;a href="https://devblogs.microsoft.com/all-things-azure/putting-agentic-platform-engineering-to-the-test/"&gt;Parte 2 della serie sull&amp;rsquo;ingegneria delle piattaforme agentiche&lt;/a&gt;, e questa è tutta sull&amp;rsquo;implementazione pratica. Lo chiamano &lt;strong&gt;Git-APE&lt;/strong&gt; (sì, l&amp;rsquo;acronimo è intenzionale), ed è un progetto open source che utilizza agenti GitHub Copilot più server Azure MCP per trasformare richieste in linguaggio naturale in infrastruttura validata e deployata.&lt;/p&gt;
&lt;h2 id="cosa-fa-git-ape-concretamente"&gt;Cosa fa Git-APE concretamente&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;idea centrale: invece di far imparare ai developer moduli Terraform, navigare nelle UI dei portali o aprire ticket al team piattaforma, parlano con un agente Copilot. L&amp;rsquo;agente interpreta l&amp;rsquo;intento, genera Infrastructure-as-Code, la valida contro le policy e deploya — tutto all&amp;rsquo;interno di VS Code.&lt;/p&gt;
&lt;p&gt;Ecco il 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;Apri il workspace in VS Code, e i file di configurazione dell&amp;rsquo;agente vengono scoperti automaticamente da GitHub Copilot. Interagisci direttamente con l&amp;rsquo;agente:&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;L&amp;rsquo;agente utilizza Azure MCP Server internamente per interagire con i servizi Azure. La configurazione MCP nelle impostazioni di VS Code abilita capacità specifiche:&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="perché-è-importante"&gt;Perché è importante&lt;/h2&gt;
&lt;p&gt;Per chi di noi costruisce su Azure, questo sposta la conversazione sull&amp;rsquo;ingegneria delle piattaforme da &amp;ldquo;come costruiamo un portale&amp;rdquo; a &amp;ldquo;come descriviamo i nostri guardrail come API.&amp;rdquo; Quando l&amp;rsquo;interfaccia della tua piattaforma è un agente IA, la qualità dei tuoi vincoli e delle tue policy diventa il prodotto.&lt;/p&gt;
&lt;p&gt;Il blog della Parte 1 esponeva la teoria: API ben descritte, schemi di controllo e guardrail espliciti rendono le piattaforme agent-ready. La Parte 2 dimostra che funziona rilasciando strumenti concreti. L&amp;rsquo;agente non genera risorse alla cieca — valida contro le best practice, rispetta le convenzioni di naming e applica le policy della tua organizzazione.&lt;/p&gt;
&lt;p&gt;La pulizia è altrettanto semplice:&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="la-mia-opinione"&gt;La mia opinione&lt;/h2&gt;
&lt;p&gt;Sarò onesto — qui si tratta più del pattern che dello strumento specifico. Git-APE in sé è una demo/architettura di riferimento. Ma l&amp;rsquo;idea sottostante — agenti come interfaccia alla tua piattaforma, MCP come protocollo, GitHub Copilot come host — è la direzione in cui sta andando l&amp;rsquo;esperienza developer enterprise.&lt;/p&gt;
&lt;p&gt;Se sei un team piattaforma che cerca come rendere il proprio tooling interno agent-friendly, non c&amp;rsquo;è punto di partenza migliore. E se sei uno sviluppatore .NET che si chiede come questo si collega al suo mondo: Azure MCP Server e gli agenti GitHub Copilot funzionano con qualsiasi workload Azure. La tua API ASP.NET Core, il tuo stack .NET Aspire, i tuoi microservizi containerizzati — tutto può essere il target di un flusso di deployment agentico.&lt;/p&gt;
&lt;h2 id="per-concludere"&gt;Per concludere&lt;/h2&gt;
&lt;p&gt;Git-APE è uno sguardo precoce ma concreto sull&amp;rsquo;ingegneria delle piattaforme agentiche nella pratica. Clona il &lt;a href="https://github.com/Azure/git-ape"&gt;repo&lt;/a&gt;, prova la demo e inizia a pensare a come le API e le policy della tua piattaforma dovrebbero apparire per permettere a un agente di usarle in sicurezza.&lt;/p&gt;
&lt;p&gt;Leggi il &lt;a href="https://devblogs.microsoft.com/all-things-azure/putting-agentic-platform-engineering-to-the-test/"&gt;post completo&lt;/a&gt; per il walkthrough e i video dimostrativi.&lt;/p&gt;</content:encoded></item><item><title>La Modalità Isolata di Aspire Risolve l'Incubo dei Conflitti di Porta per lo Sviluppo Parallelo</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/aspire-isolated-mode-parallel-instances/</guid><description>Aspire 13.2 introduce la modalità --isolated: porte random, segreti separati e zero collisioni quando si eseguono più istanze dello stesso AppHost. Perfetto per agenti IA, worktree e workflow paralleli.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/posts/emiliano-montesdeoca/aspire-isolated-mode-parallel-instances/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Se hai mai provato a eseguire due istanze dello stesso progetto contemporaneamente, conosci il dolore. La porta 8080 è già in uso. La porta 17370 è occupata. Uccidi qualcosa, riavvia, destreggiati tra le variabili d&amp;rsquo;ambiente — è un killer della produttività.&lt;/p&gt;
&lt;p&gt;Questo problema sta peggiorando, non migliorando. Gli agenti IA creano git worktree per lavorare in modo indipendente. Gli agenti in background avviano ambienti separati. Gli sviluppatori fanno checkout dello stesso repo due volte per i feature branch. Ognuno di questi scenari sbatte contro lo stesso muro: due istanze della stessa app che lottano per le stesse porte.&lt;/p&gt;
&lt;p&gt;Aspire 13.2 risolve questo con un singolo flag. James Newton-King del team Aspire ha &lt;a href="https://devblogs.microsoft.com/aspire/aspire-isolated-mode-parallel-development/"&gt;scritto tutti i dettagli&lt;/a&gt;, ed è una di quelle feature &amp;ldquo;perché non l&amp;rsquo;avevamo già?&amp;rdquo;&lt;/p&gt;
&lt;h2 id="la-soluzione---isolated"&gt;La soluzione: &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;Questo è tutto. Ogni esecuzione ottiene:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Porte random&lt;/strong&gt; — niente più collisioni tra istanze&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Segreti utente isolati&lt;/strong&gt; — connection string e chiavi API restano separate per istanza&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nessuna riassegnazione manuale delle porte. Nessun giocoleria con le variabili d&amp;rsquo;ambiente. Ogni esecuzione ottiene un ambiente pulito e privo di collisioni automaticamente.&lt;/p&gt;
&lt;h2 id="scenari-reali-dove-questo-brilla"&gt;Scenari reali dove questo brilla&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Checkout multipli.&lt;/strong&gt; Hai un feature branch in una directory e un bugfix in un&amp;rsquo;altra:&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;Entrambi girano senza conflitti. La dashboard mostra cosa sta girando e dove.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Agenti in background in VS Code.&lt;/strong&gt; Quando l&amp;rsquo;agente in background di Copilot Chat crea un git worktree per lavorare sul tuo codice in modo indipendente, potrebbe aver bisogno di eseguire il tuo AppHost Aspire. Senza &lt;code&gt;--isolated&lt;/code&gt;, c&amp;rsquo;è un conflitto di porte con il tuo worktree principale. Con esso, entrambe le istanze funzionano e basta.&lt;/p&gt;
&lt;p&gt;Lo skill Aspire distribuito con &lt;code&gt;aspire agent init&lt;/code&gt; istruisce automaticamente gli agenti a usare &lt;code&gt;--isolated&lt;/code&gt; quando lavorano nei worktree. Quindi l&amp;rsquo;agente in background di Copilot dovrebbe gestire tutto nativamente.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Test di integrazione in parallelo allo sviluppo.&lt;/strong&gt; Hai bisogno di eseguire test contro un AppHost live mentre continui a sviluppare funzionalità? La modalità isolata dà a ogni contesto le sue porte e la sua configurazione.&lt;/p&gt;
&lt;h2 id="come-funziona-sotto-il-cofano"&gt;Come funziona sotto il cofano&lt;/h2&gt;
&lt;p&gt;Quando passi &lt;code&gt;--isolated&lt;/code&gt;, la CLI genera un ID di istanza unico per l&amp;rsquo;esecuzione. Questo guida due comportamenti:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Randomizzazione delle porte&lt;/strong&gt; — invece di legarsi a porte prevedibili definite nella configurazione del tuo AppHost, la modalità isolata sceglie porte casuali disponibili per tutto — la dashboard, gli endpoint dei servizi, tutto. Il service discovery si adatta automaticamente, così i servizi si trovano a vicenda indipendentemente da quali porte ottengono.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Isolamento dei segreti&lt;/strong&gt; — ogni esecuzione isolata ottiene il proprio store di segreti utente, identificato dall&amp;rsquo;ID dell&amp;rsquo;istanza. Connection string e chiavi API di un&amp;rsquo;esecuzione non trapelano in un&amp;rsquo;altra.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Il tuo codice non ha bisogno di modifiche. Il service discovery di Aspire risolve gli endpoint a runtime, quindi tutto si connette correttamente indipendentemente dall&amp;rsquo;assegnazione delle porte.&lt;/p&gt;
&lt;h2 id="quando-usarlo"&gt;Quando usarlo&lt;/h2&gt;
&lt;p&gt;Usa &lt;code&gt;--isolated&lt;/code&gt; quando esegui più istanze dello stesso AppHost contemporaneamente — che si tratti di sviluppo parallelo, test automatizzati, agenti IA o git worktree. Per lo sviluppo a singola istanza dove preferisci porte prevedibili, il normale &lt;code&gt;aspire run&lt;/code&gt; funziona ancora benissimo.&lt;/p&gt;
&lt;h2 id="per-concludere"&gt;Per concludere&lt;/h2&gt;
&lt;p&gt;La modalità isolata è una piccola feature che risolve un problema reale e sempre più comune. Man mano che lo sviluppo assistito da IA ci spinge verso più workflow paralleli — agenti multipli, worktree multipli, contesti multipli — la capacità di semplicemente avviare un&amp;rsquo;altra istanza senza lottare per le porte è essenziale.&lt;/p&gt;
&lt;p&gt;Leggi il &lt;a href="https://devblogs.microsoft.com/aspire/aspire-isolated-mode-parallel-development/"&gt;post completo&lt;/a&gt; per tutti i dettagli tecnici e provalo con &lt;code&gt;aspire update --self&lt;/code&gt; per ottenere la 13.2.&lt;/p&gt;</content:encoded></item><item><title>La valutazione di modernizzazione di GitHub Copilot è il miglior strumento di migrazione che non stai ancora usando</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/dotnet-modernization-assessment-github-copilot/</guid><description>L'estensione di modernizzazione di GitHub Copilot non si limita a suggerire modifiche al codice — produce una valutazione completa della migrazione con issue azionabili, confronti tra target Azure e un workflow collaborativo. Ecco perché il documento di valutazione è la chiave di tutto.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/posts/emiliano-montesdeoca/dotnet-modernization-assessment-github-copilot/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Migrare un&amp;rsquo;app legacy .NET Framework a .NET moderno è una di quelle attività che tutti sanno di dover fare ma che nessuno vuole iniziare. Non è mai solo &amp;ldquo;cambiare il target framework.&amp;rdquo; Sono API che sono scomparse, pacchetti che non esistono più, modelli di hosting che funzionano in modo completamente diverso, e un milione di piccole decisioni su cosa containerizzare, cosa riscrivere e cosa lasciare così.&lt;/p&gt;
&lt;p&gt;Jeffrey Fritz ha appena pubblicato un &lt;a href="https://devblogs.microsoft.com/dotnet/your-migrations-source-of-truth-the-modernization-assessment/"&gt;approfondimento sulla valutazione di modernizzazione di GitHub Copilot&lt;/a&gt;, e onestamente? È il miglior tooling di migrazione che abbia visto per .NET. Non per la generazione di codice — quello è ormai standard. Per il documento di valutazione che produce.&lt;/p&gt;
&lt;h2 id="non-è-solo-un-motore-di-suggerimenti-di-codice"&gt;Non è solo un motore di suggerimenti di codice&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;estensione VS Code segue un modello &lt;strong&gt;Valuta → Pianifica → Esegui&lt;/strong&gt;. La fase di valutazione analizza l&amp;rsquo;intero codebase e produce un documento strutturato che cattura tutto: cosa deve cambiare, quali risorse Azure provisionare, quale modello di deployment usare. Tutto ciò che segue — infrastructure as code, containerizzazione, manifesti di deployment — deriva da ciò che la valutazione trova.&lt;/p&gt;
&lt;p&gt;La valutazione viene salvata in &lt;code&gt;.github/modernize/assessment/&lt;/code&gt; nel tuo progetto. Ogni esecuzione produce un report indipendente, così accumuli uno storico e puoi monitorare come la tua postura di migrazione evolve man mano che risolvi gli issue.&lt;/p&gt;
&lt;h2 id="due-modi-per-iniziare"&gt;Due modi per iniziare&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Valutazione Consigliata&lt;/strong&gt; — il percorso veloce. Scegli tra domini curati (Upgrade Java/.NET, Cloud Readiness, Sicurezza) e ottieni risultati significativi senza toccare la configurazione. Ottimo per un primo sguardo a dove si trova la tua app.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Valutazione Personalizzata&lt;/strong&gt; — il percorso mirato. Configura esattamente cosa analizzare: compute target (App Service, AKS, Container Apps), OS target, analisi della containerizzazione. Scegli più target Azure per confrontare gli approcci di migrazione fianco a fianco.&lt;/p&gt;
&lt;p&gt;Quella vista di confronto è genuinamente utile. Un&amp;rsquo;app con 3 issue obbligatori per App Service potrebbe averne 7 per AKS. Vedere entrambi aiuta a guidare la decisione sull&amp;rsquo;hosting prima di impegnarsi in un percorso di migrazione.&lt;/p&gt;
&lt;h2 id="la-suddivisione-degli-issue-è-azionabile"&gt;La suddivisione degli issue è azionabile&lt;/h2&gt;
&lt;p&gt;Ogni issue viene con un livello di criticità:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Obbligatorio&lt;/strong&gt; — deve essere risolto o la migrazione fallisce&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Potenziale&lt;/strong&gt; — potrebbe impattare la migrazione, necessita di giudizio umano&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Opzionale&lt;/strong&gt; — miglioramenti raccomandati, non bloccano la migrazione&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;E ogni issue linka ai file interessati e numeri di riga, fornisce una descrizione dettagliata di cosa c&amp;rsquo;è che non va e perché conta per la tua piattaforma target, dà passaggi concreti di remediation (non solo &amp;ldquo;sistema questo&amp;rdquo;), e include link alla documentazione ufficiale.&lt;/p&gt;
&lt;p&gt;Puoi assegnare singoli issue agli sviluppatori e hanno tutto ciò di cui hanno bisogno per agire. Questa è la differenza tra uno strumento che ti dice &amp;ldquo;c&amp;rsquo;è un problema&amp;rdquo; e uno che ti dice come risolverlo.&lt;/p&gt;
&lt;h2 id="i-percorsi-di-upgrade-coperti"&gt;I percorsi di upgrade coperti&lt;/h2&gt;
&lt;p&gt;Per .NET specificamente:&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;Ogni percorso di upgrade ha regole di rilevamento che sanno quali API sono state rimosse, quali pattern non hanno un equivalente diretto e quali problemi di sicurezza richiedono attenzione.&lt;/p&gt;
&lt;p&gt;Per i team che gestiscono più applicazioni, c&amp;rsquo;è anche un CLI che supporta valutazioni batch multi-repo — clona tutti i repo, valutali tutti, ottieni report per app più una vista aggregata del portfolio.&lt;/p&gt;
&lt;h2 id="la-mia-opinione"&gt;La mia opinione&lt;/h2&gt;
&lt;p&gt;Se sei seduto su applicazioni legacy .NET Framework (e siamo onesti, la maggior parte dei team enterprise lo è), questo è &lt;em&gt;lo&lt;/em&gt; strumento con cui iniziare. Il solo documento di valutazione vale il tempo — trasforma un vago &amp;ldquo;dovremmo modernizzare&amp;rdquo; in una lista concreta e prioritizzata di elementi di lavoro con percorsi chiari in avanti.&lt;/p&gt;
&lt;p&gt;Il workflow collaborativo è intelligente anche: esporta le valutazioni, condividile con il tuo team, importale senza rieseguire. Review di architettura dove chi decide non è chi esegue gli strumenti? Coperto.&lt;/p&gt;
&lt;h2 id="conclusione"&gt;Conclusione&lt;/h2&gt;
&lt;p&gt;La valutazione di modernizzazione di GitHub Copilot trasforma la migrazione .NET da un progetto spaventoso e indefinito in un processo strutturato e tracciabile. Inizia con una valutazione consigliata per vedere a che punto sei, poi usa valutazioni personalizzate per confrontare i target Azure e costruire il tuo piano di migrazione.&lt;/p&gt;
&lt;p&gt;Leggi il &lt;a href="https://devblogs.microsoft.com/dotnet/your-migrations-source-of-truth-the-modernization-assessment/"&gt;walkthrough completo&lt;/a&gt; e scarica l&amp;rsquo;&lt;a href="https://aka.ms/ghcp-appmod/vscode-ext"&gt;estensione VS Code&lt;/a&gt; per provarla sul tuo codebase.&lt;/p&gt;</content:encoded></item><item><title>Le MCP Apps hanno una Fluent API — Crea interfacce ricche per strumenti AI in .NET in tre passaggi</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/mcp-fluent-api-azure-functions-dotnet/</guid><description>La nuova API di configurazione fluent per le MCP Apps su Azure Functions ti permette di trasformare qualsiasi strumento MCP .NET in un'app completa con viste, permessi e policy CSP in poche righe di codice.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/posts/emiliano-montesdeoca/mcp-fluent-api-azure-functions-dotnet/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Gli strumenti MCP sono fantastici per dare capacità agli agenti AI. Ma cosa succede se il tuo strumento deve mostrare qualcosa all&amp;rsquo;utente — una dashboard, un form, una visualizzazione interattiva? È qui che entrano in gioco le MCP Apps, e ora sono diventate molto più facili da costruire.&lt;/p&gt;
&lt;p&gt;Lilian Kasem del team Azure SDK &lt;a href="https://devblogs.microsoft.com/azure-sdk/mcp-as-easy-as-1-2-3-introducing-the-fluent-api-for-mcp-apps/"&gt;ha presentato la nuova API di configurazione fluent&lt;/a&gt; per le MCP Apps su Azure Functions .NET, ed è il tipo di miglioramento dell&amp;rsquo;esperienza sviluppatore che ti fa chiedere perché non fosse sempre così semplice.&lt;/p&gt;
&lt;h2 id="cosa-sono-le-mcp-apps"&gt;Cosa sono le MCP Apps?&lt;/h2&gt;
&lt;p&gt;Le MCP Apps estendono il Model Context Protocol permettendo agli strumenti di portare le proprie viste UI, asset statici e controlli di sicurezza. Invece di restituire solo testo, il tuo strumento MCP può renderizzare esperienze HTML complete — dashboard interattive, visualizzazioni di dati, form di configurazione — tutto invocabile dagli agenti AI e presentato agli utenti dai client MCP.&lt;/p&gt;
&lt;p&gt;Il problema era che collegare tutto manualmente richiedeva di conoscere la specifica MCP in profondità: URI &lt;code&gt;ui://&lt;/code&gt;, tipi MIME speciali, coordinamento dei metadati tra strumenti e risorse. Non difficile, ma noioso.&lt;/p&gt;
&lt;h2 id="la-fluent-api-in-tre-passaggi"&gt;La Fluent API in tre passaggi&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Passaggio 1: Definisci la tua funzione.&lt;/strong&gt; Uno strumento MCP standard di Azure Functions:&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;Passaggio 2: Promuovila a MCP App.&lt;/strong&gt; Nello startup del tuo programma:&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;Passaggio 3: Aggiungi la tua vista HTML.&lt;/strong&gt; Crea &lt;code&gt;assets/hello-app.html&lt;/code&gt; con l&amp;rsquo;interfaccia di cui hai bisogno.&lt;/p&gt;
&lt;p&gt;Tutto qui. La Fluent API gestisce tutta l&amp;rsquo;infrastruttura del protocollo MCP — genera la funzione risorsa sintetica, imposta il tipo MIME corretto e inietta i metadati che collegano il tuo strumento alla sua vista.&lt;/p&gt;
&lt;h2 id="la-superficie-dellapi-è-ben-progettata"&gt;La superficie dell&amp;rsquo;API è ben progettata&lt;/h2&gt;
&lt;p&gt;Alcune cose che mi piacciono molto:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Le fonti delle viste sono flessibili.&lt;/strong&gt; Puoi servire HTML da file su disco, o incorporare risorse direttamente nel tuo assembly per deployment autonomi:&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;Il CSP è componibile.&lt;/strong&gt; Autorizzi esplicitamente le origini di cui la tua app ha bisogno, seguendo i principi del minimo privilegio. Chiama &lt;code&gt;WithCsp&lt;/code&gt; più volte e le origini si accumulano:&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;Controllo della visibilità.&lt;/strong&gt; Puoi rendere uno strumento visibile solo al LLM, solo all&amp;rsquo;UI dell&amp;rsquo;host, o entrambi. Vuoi uno strumento che renderizza solo UI e non dovrebbe essere chiamato dal modello? Facile:&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="per-iniziare"&gt;Per iniziare&lt;/h2&gt;
&lt;p&gt;Aggiungi il pacchetto preview:&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;Se stai già costruendo strumenti MCP con Azure Functions, è solo un aggiornamento del pacchetto. Il &lt;a href="https://learn.microsoft.com/azure/azure-functions/scenario-mcp-apps?tabs=bash%2Clinux&amp;amp;pivots=programming-language-csharp"&gt;quickstart MCP Apps&lt;/a&gt; è il miglior punto di partenza se sei nuovo al concetto.&lt;/p&gt;
&lt;h2 id="conclusione"&gt;Conclusione&lt;/h2&gt;
&lt;p&gt;Le MCP Apps sono uno degli sviluppi più entusiasmanti nello spazio degli strumenti AI — strumenti che non solo &lt;em&gt;fanno cose&lt;/em&gt; ma possono &lt;em&gt;mostrare cose&lt;/em&gt; agli utenti. La Fluent API rimuove la complessità del protocollo e ti permette di concentrarti su ciò che conta: la logica del tuo strumento e la sua interfaccia.&lt;/p&gt;
&lt;p&gt;Leggi il &lt;a href="https://devblogs.microsoft.com/azure-sdk/mcp-as-easy-as-1-2-3-introducing-the-fluent-api-for-mcp-apps/"&gt;post completo&lt;/a&gt; per il riferimento completo dell&amp;rsquo;API e gli esempi.&lt;/p&gt;</content:encoded></item><item><title>Microsoft Foundry Marzo 2026 — GPT-5.4, Agent Service GA e il Refresh dell'SDK Che Cambia Tutto</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/microsoft-foundry-march-2026-whats-new/</guid><description>L'aggiornamento di marzo 2026 di Microsoft Foundry è enorme: Agent Service raggiunge la GA, GPT-5.4 porta un ragionamento affidabile, l'SDK azure-ai-projects diventa stabile in tutti i linguaggi, e Fireworks AI porta i modelli aperti su Azure.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/posts/emiliano-montesdeoca/microsoft-foundry-march-2026-whats-new/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I post mensili &amp;ldquo;Novità in Microsoft Foundry&amp;rdquo; sono solitamente un mix di miglioramenti incrementali e occasionali funzionalità di rilievo. L&amp;rsquo;&lt;a href="https://devblogs.microsoft.com/foundry/whats-new-in-microsoft-foundry-mar-2026/"&gt;edizione di marzo 2026&lt;/a&gt;? Praticamente tutte funzionalità di rilievo. Foundry Agent Service raggiunge la GA, GPT-5.4 arriva in produzione, l&amp;rsquo;SDK riceve un importante rilascio stabile, e Fireworks AI porta l&amp;rsquo;inferenza di modelli aperti su Azure. Vediamo cosa conta per gli sviluppatori .NET.&lt;/p&gt;
&lt;h2 id="foundry-agent-service-è-pronto-per-la-produzione"&gt;Foundry Agent Service è pronto per la produzione&lt;/h2&gt;
&lt;p&gt;Questa è la grande notizia. Il runtime di agenti di nuova generazione è generalmente disponibile — costruito sull&amp;rsquo;API Responses di OpenAI, compatibile a livello di protocollo con gli agenti OpenAI, e aperto a modelli di diversi provider. Se state costruendo con l&amp;rsquo;API Responses oggi, migrare a Foundry aggiunge sicurezza enterprise, networking privato, RBAC di Entra, tracing completo e valutazione sulla vostra logica di agenti esistente.&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;Aggiunte chiave: networking privato end-to-end, espansione dell&amp;rsquo;autenticazione MCP (incluso il passthrough OAuth), anteprima di Voice Live per agenti voce-a-voce, e agenti ospitati in 6 nuove regioni.&lt;/p&gt;
&lt;h2 id="gpt-54--affidabilità-oltre-lintelligenza-pura"&gt;GPT-5.4 — affidabilità oltre l&amp;rsquo;intelligenza pura&lt;/h2&gt;
&lt;p&gt;GPT-5.4 non riguarda l&amp;rsquo;essere più intelligente. Riguarda l&amp;rsquo;essere più affidabile. Ragionamento più solido nelle interazioni lunghe, migliore aderenza alle istruzioni, meno fallimenti a metà workflow, e capacità integrate di computer use. Per gli agenti in produzione, quell&amp;rsquo;affidabilità conta molto più dei punteggi nei benchmark.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Modello&lt;/th&gt;
&lt;th&gt;Prezzo (per M token)&lt;/th&gt;
&lt;th&gt;Ideale Per&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;Agenti in produzione, coding, workflow documentali&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;Analisi approfondita, ragionamento scientifico&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.4 Mini&lt;/td&gt;
&lt;td&gt;Economico&lt;/td&gt;
&lt;td&gt;Classificazione, estrazione, chiamate leggere a strumenti&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;La mossa intelligente è una strategia di routing: GPT-5.4 Mini gestisce il lavoro ad alto volume e bassa latenza mentre GPT-5.4 si occupa delle richieste con ragionamento pesante.&lt;/p&gt;
&lt;h2 id="lsdk-è-finalmente-stabile"&gt;L&amp;rsquo;SDK è finalmente stabile&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;SDK &lt;code&gt;azure-ai-projects&lt;/code&gt; ha rilasciato versioni stabili in tutti i linguaggi — Python 2.0.0, JS/TS 2.0.0, Java 2.0.0, e .NET 2.0.0 (1 aprile). La dipendenza da &lt;code&gt;azure-ai-agents&lt;/code&gt; è sparita — tutto vive sotto &lt;code&gt;AIProjectClient&lt;/code&gt;. Installate con &lt;code&gt;pip install azure-ai-projects&lt;/code&gt; e il pacchetto include &lt;code&gt;openai&lt;/code&gt; e &lt;code&gt;azure-identity&lt;/code&gt; come dipendenze dirette.&lt;/p&gt;
&lt;p&gt;Per gli sviluppatori .NET, questo significa un singolo pacchetto NuGet per l&amp;rsquo;intera superficie di Foundry. Basta destreggiarsi tra SDK di agenti separati.&lt;/p&gt;
&lt;h2 id="fireworks-ai-porta-i-modelli-aperti-su-azure"&gt;Fireworks AI porta i modelli aperti su Azure&lt;/h2&gt;
&lt;p&gt;Forse l&amp;rsquo;aggiunta più interessante dal punto di vista architetturale: Fireworks AI elabora oltre 13 trilioni di token al giorno a ~180K richieste/secondo, ora disponibile tramite Foundry. DeepSeek V3.2, gpt-oss-120b, Kimi K2.5, e MiniMax M2.5 al lancio.&lt;/p&gt;
&lt;p&gt;La vera storia è il &lt;strong&gt;bring-your-own-weights&lt;/strong&gt; — caricate pesi quantizzati o fine-tunati da qualsiasi luogo senza cambiare lo stack di serving. Deploy tramite serverless pay-per-token o throughput provisionato.&lt;/p&gt;
&lt;h2 id="altri-punti-salienti"&gt;Altri punti salienti&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Phi-4 Reasoning Vision 15B&lt;/strong&gt; — ragionamento multimodale per grafici, diagrammi e layout di documenti&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Evaluations GA&lt;/strong&gt; — valutatori pronti all&amp;rsquo;uso con monitoraggio continuo della produzione integrato in Azure Monitor&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Priority Processing&lt;/strong&gt; (Preview) — corsia di calcolo dedicata per carichi di lavoro sensibili alla latenza&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Voice Live&lt;/strong&gt; — runtime voce-a-voce che si connette direttamente agli agenti Foundry&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tracing GA&lt;/strong&gt; — ispezione end-to-end delle tracce degli agenti con ordinamento e filtraggio&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deprecazione di PromptFlow&lt;/strong&gt; — migrazione a Microsoft Framework Workflows entro gennaio 2027&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="conclusione"&gt;Conclusione&lt;/h2&gt;
&lt;p&gt;Marzo 2026 è un punto di svolta per Foundry. Agent Service GA, SDK stabili in tutti i linguaggi, GPT-5.4 per agenti di produzione affidabili, e inferenza di modelli aperti via Fireworks AI — la piattaforma è pronta per carichi di lavoro seri.&lt;/p&gt;
&lt;p&gt;Leggete il &lt;a href="https://devblogs.microsoft.com/foundry/whats-new-in-microsoft-foundry-mar-2026/"&gt;riepilogo completo&lt;/a&gt; e &lt;a href="https://learn.microsoft.com/azure/foundry/quickstarts/get-started-code"&gt;create il vostro primo agente&lt;/a&gt; per iniziare.&lt;/p&gt;</content:encoded></item><item><title>Quell'Impostazione delle Finestre Flottanti di Visual Studio Che Non Conoscevi (Ma Dovresti)</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/visual-studio-floating-windows-powertoys/</guid><description>Un'impostazione nascosta di Visual Studio ti dà il pieno controllo sulle finestre flottanti — voci indipendenti nella barra delle applicazioni, comportamento corretto con più monitor e integrazione perfetta con FancyZones. Un menu a tendina cambia tutto.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/posts/emiliano-montesdeoca/visual-studio-floating-windows-powertoys/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Se usate più monitor con Visual Studio (e onestamente, chi non lo fa al giorno d&amp;rsquo;oggi?), probabilmente avete sperimentato la frustrazione: le finestre degli strumenti flottanti scompaiono quando minimizzate l&amp;rsquo;IDE principale, restano sempre sopra a tutto il resto, e non appaiono come pulsanti separati nella barra delle applicazioni. Funziona per alcuni workflow, ma per configurazioni multi-monitor è frustrante.&lt;/p&gt;
&lt;p&gt;Mads Kristensen del team di Visual Studio &lt;a href="https://devblogs.microsoft.com/visualstudio/take-full-control-of-your-floating-windows-in-visual-studio/"&gt;ha condiviso un&amp;rsquo;impostazione poco conosciuta&lt;/a&gt; che cambia completamente il comportamento delle finestre flottanti. Un menu a tendina. Tutto qui.&lt;/p&gt;
&lt;h2 id="limpostazione"&gt;L&amp;rsquo;impostazione&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;Il menu a tendina &amp;ldquo;These floating windows are owned by the main window&amp;rdquo; ha tre opzioni:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;None&lt;/strong&gt; — indipendenza totale. Ogni finestra flottante ha la propria voce nella barra delle applicazioni e si comporta come una normale finestra di Windows.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tool Windows&lt;/strong&gt; (predefinito) — i documenti flottano liberamente, le finestre degli strumenti restano legate all&amp;rsquo;IDE.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Documents and Tool Windows&lt;/strong&gt; — comportamento classico di Visual Studio, tutto legato alla finestra principale.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="perché-none-è-la-scelta-giusta-per-configurazioni-multi-monitor"&gt;Perché &amp;ldquo;None&amp;rdquo; è la scelta giusta per configurazioni multi-monitor&lt;/h2&gt;
&lt;p&gt;Impostatelo su &lt;strong&gt;None&lt;/strong&gt; e improvvisamente tutte le vostre finestre flottanti di strumenti e documenti si comportano come vere applicazioni Windows. Appaiono nella barra delle applicazioni, restano visibili quando minimizzate la finestra principale di Visual Studio, e smettono di forzarsi in primo piano.&lt;/p&gt;
&lt;p&gt;Combinatelo con &lt;strong&gt;PowerToys FancyZones&lt;/strong&gt; ed è un vero game changer. Create layout personalizzati sui vostri monitor, agganciate l&amp;rsquo;Esplora Soluzioni in una zona, il debugger in un&amp;rsquo;altra, e i file di codice dove volete. Tutto resta al suo posto, tutto è accessibile indipendentemente, e il vostro spazio di lavoro risulta organizzato invece che caotico.&lt;/p&gt;
&lt;h2 id="raccomandazioni-rapide"&gt;Raccomandazioni rapide&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Utenti avanzati multi-monitor&lt;/strong&gt;: Impostate su &lt;strong&gt;None&lt;/strong&gt;, abbinate con FancyZones&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Utenti occasionali delle finestre flottanti&lt;/strong&gt;: &lt;strong&gt;Tool Windows&lt;/strong&gt; (predefinito) è un buon compromesso&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Workflow tradizionale&lt;/strong&gt;: &lt;strong&gt;Documents and Tool Windows&lt;/strong&gt; mantiene tutto classico&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Consiglio pro: &lt;strong&gt;Ctrl + doppio clic&lt;/strong&gt; sulla barra del titolo di qualsiasi finestra degli strumenti per renderla flottante o agganciarla istantaneamente. Non serve riavviare dopo aver cambiato l&amp;rsquo;impostazione.&lt;/p&gt;
&lt;h2 id="conclusione"&gt;Conclusione&lt;/h2&gt;
&lt;p&gt;È una di quelle impostazioni del tipo &amp;ldquo;non ci posso credere che non lo sapevo&amp;rdquo;. Se le finestre flottanti in Visual Studio vi hanno mai infastidito, andate a cambiare questa impostazione adesso.&lt;/p&gt;
&lt;p&gt;Leggete il &lt;a href="https://devblogs.microsoft.com/visualstudio/take-full-control-of-your-floating-windows-in-visual-studio/"&gt;post completo&lt;/a&gt; per i dettagli e gli screenshot.&lt;/p&gt;</content:encoded></item><item><title>SQL MCP Server — Il modo giusto per dare accesso ai database agli agenti AI</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/sql-mcp-server-data-api-builder/</guid><description>SQL MCP Server di Data API builder offre agli agenti AI un accesso sicuro e deterministico ai database senza esporre schemi o affidarsi a NL2SQL. RBAC, cache, supporto multi-database — tutto integrato.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/posts/emiliano-montesdeoca/sql-mcp-server-data-api-builder/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Siamo onesti: la maggior parte dei server MCP per database disponibili oggi sono spaventosi. Prendono una query in linguaggio naturale, generano SQL al volo e lo eseguono contro i tuoi dati di produzione. Cosa potrebbe andare storto? (Tutto. Tutto potrebbe andare storto.)&lt;/p&gt;
&lt;p&gt;Il team di Azure SQL ha appena &lt;a href="https://devblogs.microsoft.com/azure-sql/introducing-sql-mcp-server/"&gt;presentato SQL MCP Server&lt;/a&gt;, e adotta un approccio fondamentalmente diverso. Costruito come funzionalità di Data API builder (DAB) 2.0, dà agli agenti AI un accesso strutturato e deterministico alle operazioni sul database — senza NL2SQL, senza esporre il tuo schema, e con RBAC completo ad ogni passaggio.&lt;/p&gt;
&lt;h2 id="perché-non-nl2sql"&gt;Perché non NL2SQL?&lt;/h2&gt;
&lt;p&gt;Questa è la decisione di design più interessante. I modelli non sono deterministici, e le query complesse sono le più propense a produrre errori sottili. Le query esatte che gli utenti sperano che l&amp;rsquo;AI possa generare sono anche quelle che richiedono più scrutinio quando prodotte in modo non deterministico.&lt;/p&gt;
&lt;p&gt;Invece, SQL MCP Server usa un approccio &lt;strong&gt;NL2DAB&lt;/strong&gt;. L&amp;rsquo;agente lavora con il livello di astrazione delle entità di Data API builder e il suo query builder integrato per produrre T-SQL accurato e ben formato in modo deterministico. Stesso risultato per l&amp;rsquo;utente, ma senza il rischio di JOIN allucinati o esposizione accidentale di dati.&lt;/p&gt;
&lt;h2 id="sette-strumenti-non-settecento"&gt;Sette strumenti, non settecento&lt;/h2&gt;
&lt;p&gt;SQL MCP Server espone esattamente sette strumenti DML, indipendentemente dalle dimensioni del database:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;describe_entities&lt;/code&gt; — scoprire entità e operazioni disponibili&lt;/li&gt;
&lt;li&gt;&lt;code&gt;create_record&lt;/code&gt; — inserire righe&lt;/li&gt;
&lt;li&gt;&lt;code&gt;read_records&lt;/code&gt; — interrogare tabelle e viste&lt;/li&gt;
&lt;li&gt;&lt;code&gt;update_record&lt;/code&gt; — modificare righe&lt;/li&gt;
&lt;li&gt;&lt;code&gt;delete_record&lt;/code&gt; — rimuovere righe&lt;/li&gt;
&lt;li&gt;&lt;code&gt;execute_entity&lt;/code&gt; — eseguire stored procedure&lt;/li&gt;
&lt;li&gt;&lt;code&gt;aggregate_records&lt;/code&gt; — query di aggregazione&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Questo è intelligente perché le finestre di contesto sono lo spazio di pensiero dell&amp;rsquo;agente. Inondarle con centinaia di definizioni di strumenti lascia meno spazio per il ragionamento. Sette strumenti fissi mantengono l&amp;rsquo;agente concentrato sul &lt;em&gt;pensare&lt;/em&gt; piuttosto che sul &lt;em&gt;navigare&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Ogni strumento può essere abilitato o disabilitato individualmente:&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="iniziare-in-tre-comandi"&gt;Iniziare in tre comandi&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;Ecco un SQL MCP Server funzionante che espone la tua tabella Customers. Il livello di astrazione delle entità significa che puoi creare alias per nomi e colonne, limitare i campi per ruolo e controllare esattamente cosa vedono gli agenti — senza esporre dettagli interni dello schema.&lt;/p&gt;
&lt;h2 id="la-storia-della-sicurezza-è-solida"&gt;La storia della sicurezza è solida&lt;/h2&gt;
&lt;p&gt;Qui è dove la maturità di Data API builder ripaga:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RBAC ad ogni livello&lt;/strong&gt; — ogni entità definisce quali ruoli possono leggere, creare, aggiornare o eliminare, e quali campi sono visibili&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Integrazione con Azure Key Vault&lt;/strong&gt; — stringhe di connessione e segreti gestiti in modo sicuro&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Microsoft Entra + OAuth personalizzato&lt;/strong&gt; — autenticazione di livello produzione&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Content Security Policy&lt;/strong&gt; — gli agenti interagiscono attraverso un contratto controllato, non SQL grezzo&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;L&amp;rsquo;astrazione dello schema è particolarmente importante. I nomi interni delle tue tabelle e colonne non vengono mai esposti all&amp;rsquo;agente. Definisci entità, alias e descrizioni che hanno senso per l&amp;rsquo;interazione AI — non il tuo diagramma ERD del database.&lt;/p&gt;
&lt;h2 id="multi-database-e-multi-protocollo"&gt;Multi-database e multi-protocollo&lt;/h2&gt;
&lt;p&gt;SQL MCP Server supporta Microsoft SQL, PostgreSQL, Azure Cosmos DB e MySQL. E poiché è una funzionalità di DAB, ottieni endpoint REST, GraphQL e MCP simultaneamente dalla stessa configurazione. Stesse definizioni di entità, stesse regole RBAC, stessa sicurezza — su tutti e tre i protocolli.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;auto-configurazione in DAB 2.0 può persino ispezionare il tuo database e costruire la configurazione dinamicamente, se sei a tuo agio con meno astrazione per la prototipazione rapida.&lt;/p&gt;
&lt;h2 id="la-mia-opinione"&gt;La mia opinione&lt;/h2&gt;
&lt;p&gt;Ecco come dovrebbe funzionare l&amp;rsquo;accesso aziendale ai database per gli agenti AI. Non &amp;ldquo;hey LLM, scrivimi un po&amp;rsquo; di SQL e YOLO sulla produzione.&amp;rdquo; Invece: un livello di entità ben definito, generazione deterministica delle query, RBAC ad ogni passaggio, caching, monitoraggio e telemetria. È noioso nel miglior modo possibile.&lt;/p&gt;
&lt;p&gt;Per gli sviluppatori .NET, la storia dell&amp;rsquo;integrazione è pulita — DAB è uno strumento .NET, l&amp;rsquo;MCP Server gira come container, e funziona con Azure SQL, che la maggior parte di noi sta già usando. Se stai costruendo agenti AI che hanno bisogno di accesso ai dati, inizia qui.&lt;/p&gt;
&lt;h2 id="conclusione"&gt;Conclusione&lt;/h2&gt;
&lt;p&gt;SQL MCP Server è gratuito, open-source e gira ovunque. È l&amp;rsquo;approccio prescrittivo di Microsoft per dare agli agenti AI un accesso sicuro ai database. Consulta il &lt;a href="https://devblogs.microsoft.com/azure-sql/introducing-sql-mcp-server/"&gt;post completo&lt;/a&gt; e la &lt;a href="https://aka.ms/sql/mcp"&gt;documentazione&lt;/a&gt; per iniziare.&lt;/p&gt;</content:encoded></item><item><title>VS Code 1.116 — L'App Agents Ottiene Navigazione da Tastiera e Completamenti per il Contesto dei File</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/vscode-1-116-agents-app-updates/</guid><description>VS Code 1.116 si concentra sulla rifinitura dell'app Agents — scorciatoie da tastiera dedicate, miglioramenti dell'accessibilità, completamenti per il contesto dei file e risoluzione dei link CSS @import.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/posts/emiliano-montesdeoca/vscode-1-116-agents-app-updates/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;VS Code 1.116 è il rilascio di aprile 2026, e sebbene sia più leggero di alcuni aggiornamenti recenti, i cambiamenti sono mirati e significativi — specialmente se usate l&amp;rsquo;app Agents quotidianamente.&lt;/p&gt;
&lt;p&gt;Ecco cosa è arrivato, in base alle &lt;a href="https://code.visualstudio.com/updates/v1_116"&gt;note di rilascio ufficiali&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="miglioramenti-dellapp-agents"&gt;Miglioramenti dell&amp;rsquo;app Agents&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;app Agents continua a maturare con un polishing dell&amp;rsquo;usabilità che fa una vera differenza nei flussi di lavoro quotidiani:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Scorciatoie da tastiera dedicate&lt;/strong&gt; — ora potete mettere a fuoco la vista Changes, l&amp;rsquo;albero dei file all&amp;rsquo;interno di Changes e la vista delle Personalizzazioni della Chat con comandi e scorciatoie da tastiera dedicati. Se cliccavate ovunque nell&amp;rsquo;app Agents per navigare, questo porta flussi di lavoro completamente controllabili da tastiera.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dialogo di aiuto per l&amp;rsquo;accessibilità&lt;/strong&gt; — premere &lt;code&gt;Alt+F1&lt;/code&gt; nella casella di input della chat ora apre un dialogo di aiuto per l&amp;rsquo;accessibilità che mostra i comandi e le scorciatoie disponibili. Gli utenti di screen reader possono anche controllare la verbosità degli annunci. Una buona accessibilità beneficia tutti.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Completamenti per il contesto dei file&lt;/strong&gt; — digitate &lt;code&gt;#&lt;/code&gt; nella chat dell&amp;rsquo;app Agents per attivare i completamenti per il contesto dei file limitati al vostro workspace corrente. Questa è una di quelle piccole migliorie della qualità della vita che velocizzano ogni interazione — niente più percorsi completi dei file quando si referenzia il codice.&lt;/p&gt;
&lt;h2 id="risoluzione-dei-link-css-import"&gt;Risoluzione dei link CSS &lt;code&gt;@import&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Ottimo per gli sviluppatori frontend: VS Code ora risolve i riferimenti CSS &lt;code&gt;@import&lt;/code&gt; che usano percorsi di node_modules. Potete fare &lt;code&gt;Ctrl+clic&lt;/code&gt; attraverso import come &lt;code&gt;@import &amp;quot;some-module/style.css&amp;quot;&lt;/code&gt; quando usate bundler. Piccolo ma elimina un punto di attrito nei workflow CSS.&lt;/p&gt;
&lt;h2 id="conclusione"&gt;Conclusione&lt;/h2&gt;
&lt;p&gt;VS Code 1.116 riguarda il raffinamento — rendere l&amp;rsquo;app Agents più navigabile, più accessibile e più amichevole con la tastiera. Se passate molto tempo nell&amp;rsquo;app Agents (e sospetto che molti di noi lo facciano), questi cambiamenti si sommano.&lt;/p&gt;
&lt;p&gt;Consultate le &lt;a href="https://code.visualstudio.com/updates/v1_116"&gt;note di rilascio complete&lt;/a&gt; per l&amp;rsquo;elenco completo.&lt;/p&gt;</content:encoded></item><item><title>VS Code 1.115 — Notifiche del Terminale in Background, Modalità Agente SSH e Altro</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/vscode-1-115-agent-improvements/</guid><description>VS Code 1.115 porta notifiche del terminale in background per gli agenti, hosting remoto di agenti tramite SSH, incolla file nei terminali e tracciamento delle modifiche con riconoscimento di sessione. Ecco cosa conta per gli sviluppatori .NET.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/posts/emiliano-montesdeoca/vscode-1-115-agent-improvements/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;VS Code 1.115 è appena &lt;a href="https://code.visualstudio.com/updates/v1_115"&gt;uscito&lt;/a&gt;, e sebbene sia un rilascio più leggero in termini di funzionalità principali, i miglioramenti relativi agli agenti sono genuinamente utili se lavori quotidianamente con assistenti di codice basati su IA.&lt;/p&gt;
&lt;p&gt;Lasciami evidenziare cosa vale davvero la pena sapere.&lt;/p&gt;
&lt;h2 id="i-terminali-in-background-comunicano-con-gli-agenti"&gt;I terminali in background comunicano con gli agenti&lt;/h2&gt;
&lt;p&gt;Questa è la funzionalità di punta. I terminali in background ora notificano automaticamente gli agenti quando i comandi vengono completati, inclusi il codice di uscita e l&amp;rsquo;output del terminale. I prompt di input nei terminali in background vengono anche rilevati e mostrati all&amp;rsquo;utente.&lt;/p&gt;
&lt;p&gt;Perché è importante? Se hai usato la modalità agente di Copilot per eseguire comandi di build o suite di test in background, conosci il dolore del &amp;ldquo;ma è già finito?&amp;rdquo; — i terminali in background erano essenzialmente spara-e-dimentica. Ora l&amp;rsquo;agente viene notificato quando il tuo &lt;code&gt;dotnet build&lt;/code&gt; o &lt;code&gt;dotnet test&lt;/code&gt; è completato, vede l&amp;rsquo;output e può reagire di conseguenza. È un piccolo cambiamento che rende i flussi di lavoro guidati dagli agenti significativamente più affidabili.&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;è anche un nuovo strumento &lt;code&gt;send_to_terminal&lt;/code&gt; che permette agli agenti di inviare comandi ai terminali in background con conferma dell&amp;rsquo;utente, risolvendo il problema dove &lt;code&gt;run_in_terminal&lt;/code&gt; con un timeout spostava i terminali in background e li rendeva di sola lettura.&lt;/p&gt;
&lt;h2 id="hosting-remoto-di-agenti-tramite-ssh"&gt;Hosting remoto di agenti tramite SSH&lt;/h2&gt;
&lt;p&gt;VS Code ora supporta la connessione a macchine remote tramite SSH, installando automaticamente la CLI e avviandola in modalità host di agenti. Questo significa che le tue sessioni di agenti IA possono puntare direttamente ad ambienti remoti — utile per gli sviluppatori .NET che compilano e testano su server Linux o VM nel cloud.&lt;/p&gt;
&lt;h2 id="tracciamento-delle-modifiche-nelle-sessioni-degli-agenti"&gt;Tracciamento delle modifiche nelle sessioni degli agenti&lt;/h2&gt;
&lt;p&gt;Le modifiche ai file effettuate durante le sessioni degli agenti ora vengono tracciate e ripristinate, con diff, annulla/ripristina e ripristino dello stato. Se un agente apporta modifiche al tuo codice e qualcosa va storto, puoi vedere esattamente cosa è cambiato e fare il rollback. Tranquillità nel lasciare che gli agenti modifichino la tua codebase.&lt;/p&gt;
&lt;h2 id="riconoscimento-delle-schede-del-browser-e-altri-miglioramenti"&gt;Riconoscimento delle schede del browser e altri miglioramenti&lt;/h2&gt;
&lt;p&gt;Alcune aggiunte aggiuntive per la qualità della vita:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tracciamento delle schede del browser&lt;/strong&gt; — la chat ora può tracciare e collegare le schede del browser aperte durante una sessione, così gli agenti possono fare riferimento alle pagine web che stai guardando&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Incolla file nel terminale&lt;/strong&gt; — incolla file (incluse immagini) nel terminale con Ctrl+V, trascinamento o clic destro&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Copertura dei test nella minimap&lt;/strong&gt; — gli indicatori di copertura dei test ora appaiono nella minimap per una panoramica visiva rapida&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pinch-to-zoom su Mac&lt;/strong&gt; — il browser integrato supporta i gesti pinch-to-zoom&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Diritti Copilot nelle Sessioni&lt;/strong&gt; — la barra di stato mostra le informazioni di utilizzo nella vista Sessioni&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Favicon in Vai al File&lt;/strong&gt; — le pagine web aperte mostrano le favicon nella lista di selezione rapida&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="per-concludere"&gt;Per concludere&lt;/h2&gt;
&lt;p&gt;VS Code 1.115 è un rilascio incrementale, ma i miglioramenti degli agenti — notifiche del terminale in background, hosting di agenti SSH e tracciamento delle modifiche — si sommano a un&amp;rsquo;esperienza notevolmente più fluida per lo sviluppo assistito dall&amp;rsquo;IA. Se stai usando la modalità agente di Copilot per progetti .NET, questi sono il tipo di miglioramenti di qualità della vita che riducono l&amp;rsquo;attrito quotidiano.&lt;/p&gt;
&lt;p&gt;Dai un&amp;rsquo;occhiata alle &lt;a href="https://code.visualstudio.com/updates/v1_115"&gt;note di rilascio complete&lt;/a&gt; per ogni dettaglio.&lt;/p&gt;</content:encoded></item><item><title>C# 15 introduce i tipi union — e sono esattamente quello che stavamo chiedendo</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/csharp-15-union-types-exhaustive-matching/</guid><description>C# 15 introduce la parola chiave union — unioni discriminate con pattern matching esaustivo imposto dal compilatore. Ecco come appaiono, perché sono importanti e come provarle oggi.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/posts/emiliano-montesdeoca/csharp-15-union-types-exhaustive-matching/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Questa è quella che stavo aspettando. C# 15 introduce la parola chiave &lt;code&gt;union&lt;/code&gt; — vere unioni discriminate con pattern matching esaustivo imposto dal compilatore. Se hai mai invidiato le unioni discriminate di F# o gli enum di Rust, sai esattamente perché questo è importante.&lt;/p&gt;
&lt;p&gt;Bill Wagner ha &lt;a href="https://devblogs.microsoft.com/dotnet/csharp-15-union-types/"&gt;pubblicato l&amp;rsquo;approfondimento&lt;/a&gt; sul blog .NET, e onestamente? Il design è pulito, pratico e molto C#. Lascia che ti mostri cosa c&amp;rsquo;è davvero e perché è una cosa più grande di quanto possa sembrare a prima vista.&lt;/p&gt;
&lt;h2 id="il-problema-che-le-union-risolvono"&gt;Il problema che le union risolvono&lt;/h2&gt;
&lt;p&gt;Prima di C# 15, restituire &amp;ldquo;uno tra diversi tipi possibili&amp;rdquo; da un metodo era sempre un compromesso:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;object&lt;/code&gt;&lt;/strong&gt; — nessun vincolo, nessun aiuto dal compilatore, casting difensivo ovunque&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Interfacce marcatore&lt;/strong&gt; — meglio, ma chiunque può implementarle. Il compilatore non può mai considerare l&amp;rsquo;insieme completo&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Classi base astratte&lt;/strong&gt; — stesso problema, in più i tipi hanno bisogno di un antenato comune&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nessuna di queste ti dà quello che vuoi veramente: un insieme chiuso di tipi dove il compilatore garantisce che hai gestito ogni caso. Questo è quello che fanno i tipi union.&lt;/p&gt;
&lt;h2 id="la-sintassi-è-di-una-semplicità-elegante"&gt;La sintassi è di una semplicità elegante&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;Una riga. &lt;code&gt;Pet&lt;/code&gt; può contenere un &lt;code&gt;Cat&lt;/code&gt;, un &lt;code&gt;Dog&lt;/code&gt; o un &lt;code&gt;Bird&lt;/code&gt;. Le conversioni implicite vengono generate automaticamente:&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;Ed ecco la magia — il compilatore impone il matching esaustivo:&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;Nessun discard &lt;code&gt;_&lt;/code&gt; necessario. Il compilatore sa che questo switch copre ogni caso possibile. Se successivamente aggiungi un quarto tipo alla union, ogni espressione switch che non lo gestisce produce un avviso. Casi mancanti rilevati al momento della compilazione, non a runtime.&lt;/p&gt;
&lt;h2 id="dove-diventa-pratico"&gt;Dove diventa pratico&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;esempio di &lt;code&gt;Pet&lt;/code&gt; è carino, ma è qui che le union brillano davvero nel codice reale.&lt;/p&gt;
&lt;h3 id="risposte-api-che-restituiscono-forme-diverse"&gt;Risposte API che restituiscono forme diverse&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;Ora ogni consumatore è obbligato a gestire successo, errore e fallimento di validazione. Niente più bug da &amp;ldquo;ho dimenticato di controllare il caso di errore&amp;rdquo;.&lt;/p&gt;
&lt;h3 id="valore-singolo-o-collection"&gt;Valore singolo o collection&lt;/h3&gt;
&lt;p&gt;Il pattern &lt;code&gt;OneOrMore&amp;lt;T&amp;gt;&lt;/code&gt; mostra come le union possono avere un corpo con metodi di utilità:&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;I chiamanti passano la forma che preferiscono:&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="comporre-tipi-non-correlati"&gt;Comporre tipi non correlati&lt;/h3&gt;
&lt;p&gt;Questa è la funzionalità killer rispetto alle gerarchie tradizionali. Puoi unire tipi che non hanno nulla in comune — &lt;code&gt;string&lt;/code&gt; e &lt;code&gt;Exception&lt;/code&gt;, &lt;code&gt;int&lt;/code&gt; e &lt;code&gt;IEnumerable&amp;lt;T&amp;gt;&lt;/code&gt;. Nessun antenato comune necessario.&lt;/p&gt;
&lt;h2 id="union-personalizzate-per-librerie-esistenti"&gt;Union personalizzate per librerie esistenti&lt;/h2&gt;
&lt;p&gt;Ecco una scelta di design intelligente: qualsiasi classe o struct con un attributo &lt;code&gt;[Union]&lt;/code&gt; viene riconosciuta come tipo union, purché segua il pattern di base (costruttori pubblici per i tipi di caso e una proprietà &lt;code&gt;Value&lt;/code&gt;). Librerie come OneOf che già forniscono tipi simili alle union possono optare per il supporto del compilatore senza riscrivere i loro interni.&lt;/p&gt;
&lt;p&gt;Per scenari sensibili alle performance con tipi di valore, le librerie possono implementare un pattern di accesso senza boxing con i metodi &lt;code&gt;HasValue&lt;/code&gt; e &lt;code&gt;TryGetValue&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="il-quadro-generale"&gt;Il quadro generale&lt;/h2&gt;
&lt;p&gt;I tipi union fanno parte di una storia più ampia di esaustività in arrivo in C#:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tipi union&lt;/strong&gt; — matching esaustivo su un insieme chiuso di tipi (disponibile ora in preview)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gerarchie chiuse&lt;/strong&gt; — il modificatore &lt;code&gt;closed&lt;/code&gt; impedisce classi derivate al di fuori dell&amp;rsquo;assembly di definizione (proposto)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enum chiusi&lt;/strong&gt; — impedisce la creazione di valori diversi dai membri dichiarati (proposto)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Insieme, queste tre funzionalità daranno a C# uno dei sistemi di pattern matching type-safe più completi in qualsiasi linguaggio mainstream.&lt;/p&gt;
&lt;h2 id="provale-oggi"&gt;Provale oggi&lt;/h2&gt;
&lt;p&gt;I tipi union sono disponibili in .NET 11 Preview 2:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Installa il &lt;a href="https://dotnet.microsoft.com/download/dotnet"&gt;SDK .NET 11 Preview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Imposta come target &lt;code&gt;net11.0&lt;/code&gt; nel tuo progetto&lt;/li&gt;
&lt;li&gt;Imposta &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;Un&amp;rsquo;avvertenza: in Preview 2, dovrai dichiarare &lt;code&gt;UnionAttribute&lt;/code&gt; e &lt;code&gt;IUnion&lt;/code&gt; nel tuo progetto poiché non sono ancora nel runtime. Prendi &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; dal repo docs, o aggiungi questo:&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="per-concludere"&gt;Per concludere&lt;/h2&gt;
&lt;p&gt;I tipi union sono una di quelle funzionalità che ti fanno chiedere come abbiamo fatto senza. Pattern matching esaustivo imposto dal compilatore, sintassi pulita, supporto ai generici e integrazione con il pattern matching esistente — è tutto quello che abbiamo chiesto, fatto alla maniera C#.&lt;/p&gt;
&lt;p&gt;Provale in .NET 11 Preview 2, rompi cose e &lt;a href="https://github.com/dotnet/csharplang/discussions/9663"&gt;condividi il tuo feedback su GitHub&lt;/a&gt;. Questa è una preview, e il team C# sta attivamente ascoltando. I tuoi edge case e feedback di design daranno forma alla release finale.&lt;/p&gt;
&lt;p&gt;Per il riferimento completo del linguaggio, consulta la &lt;a href="https://learn.microsoft.com/dotnet/csharp/language-reference/builtin-types/union"&gt;documentazione dei tipi union&lt;/a&gt; e la &lt;a href="https://learn.microsoft.com/dotnet/csharp/language-reference/proposals/unions"&gt;specifica della funzionalità&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Aspire 13.2 include una CLI per la documentazione — e anche il tuo agente IA può usarla</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/aspire-docs-cli-ai-skills/</guid><description>.NET Aspire 13.2 aggiunge aspire docs — una CLI per cercare, esplorare e leggere la documentazione ufficiale senza uscire dal terminale. Funziona anche come strumento per agenti IA. Ecco perché è importante.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/posts/emiliano-montesdeoca/aspire-docs-cli-ai-skills/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Conosci quel momento in cui sei immerso in un Aspire AppHost, stai collegando integrazioni, e devi controllare esattamente quali parametri si aspetta l&amp;rsquo;integrazione Redis? Fai alt-tab al browser, cerchi su aspire.dev, strizzi gli occhi sulla documentazione delle API, poi torni al tuo editor. Contesto perso. Flusso interrotto.&lt;/p&gt;
&lt;p&gt;Aspire 13.2 ha appena &lt;a href="https://devblogs.microsoft.com/aspire/aspire-docs-in-your-terminal/"&gt;rilasciato una soluzione per questo&lt;/a&gt;. La CLI &lt;code&gt;aspire docs&lt;/code&gt; ti permette di cercare, esplorare e leggere la documentazione ufficiale di Aspire direttamente dal tuo terminale. E siccome è supportata da servizi riutilizzabili, gli agenti IA e le skill possono usare gli stessi comandi per consultare la documentazione invece di allucinare API che non esistono.&lt;/p&gt;
&lt;h2 id="il-problema-che-questo-risolve-davvero"&gt;Il problema che questo risolve davvero&lt;/h2&gt;
&lt;p&gt;David Pine lo dice perfettamente nel post originale: gli agenti IA erano &lt;em&gt;terribili&lt;/em&gt; nell&amp;rsquo;aiutare gli sviluppatori a costruire app con Aspire. Raccomandavano &lt;code&gt;dotnet run&lt;/code&gt; invece di &lt;code&gt;aspire run&lt;/code&gt;, facevano riferimento a learn.microsoft.com per docs che vivono su aspire.dev, suggerivano pacchetti NuGet obsoleti, e — il mio preferito — allucinavano API inesistenti.&lt;/p&gt;
&lt;p&gt;Perché? Perché Aspire è stato specifico per .NET molto più a lungo di quanto sia stato poliglotta, e i LLM lavorano con dati di addestramento che precedono le ultime funzionalità. Quando dai a un agente IA la possibilità di consultare la documentazione attuale, smette di tirare a indovinare e inizia a essere utile.&lt;/p&gt;
&lt;h2 id="tre-comandi-zero-schede-del-browser"&gt;Tre comandi, zero schede del browser&lt;/h2&gt;
&lt;p&gt;La CLI è di una semplicità rinfrescante:&lt;/p&gt;
&lt;h3 id="elencare-tutta-la-documentazione"&gt;Elencare tutta la documentazione&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;Restituisce ogni pagina di documentazione disponibile su aspire.dev. Serve un output leggibile dalle macchine? Aggiungi &lt;code&gt;--format Json&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="cercare-un-argomento"&gt;Cercare un argomento&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;Cerca sia nei titoli che nei contenuti con punteggio di rilevanza ponderato. Lo stesso motore di ricerca che alimenta internamente gli strumenti di documentazione. Ottieni risultati classificati con titoli, slug e punteggi di rilevanza.&lt;/p&gt;
&lt;h3 id="leggere-una-pagina-intera-o-solo-una-sezione"&gt;Leggere una pagina intera (o solo una sezione)&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;Trasmette la pagina completa in markdown nel tuo terminale. Ti serve solo una sezione?&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;Precisione chirurgica. Niente scrolling su 500 righe. Solo la parte che ti serve.&lt;/p&gt;
&lt;h2 id="laspetto-agente-ia"&gt;L&amp;rsquo;aspetto agente IA&lt;/h2&gt;
&lt;p&gt;Ecco dove diventa interessante per noi sviluppatori che costruiamo con strumenti IA. Gli stessi comandi &lt;code&gt;aspire docs&lt;/code&gt; funzionano come strumenti per agenti IA — tramite skill, server MCP, o semplici wrapper CLI.&lt;/p&gt;
&lt;p&gt;Invece di far inventare al tuo assistente IA delle API Aspire basate su dati di addestramento obsoleti, può chiamare &lt;code&gt;aspire docs search &amp;quot;postgres&amp;quot;&lt;/code&gt;, trovare la documentazione ufficiale dell&amp;rsquo;integrazione, leggere la pagina giusta, e darti l&amp;rsquo;approccio documentato. Documentazione in tempo reale e aggiornata — non quello che il modello ha memorizzato sei mesi fa.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;architettura dietro tutto questo è intenzionale. Il team Aspire ha costruito servizi riutilizzabili (&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;) anziché un&amp;rsquo;integrazione una tantum. Questo significa che lo stesso motore di ricerca funziona per gli umani nel terminale, gli agenti IA nel tuo editor, e l&amp;rsquo;automazione nella tua pipeline CI.&lt;/p&gt;
&lt;h2 id="scenari-reali"&gt;Scenari reali&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Consultazioni rapide nel terminale:&lt;/strong&gt; Sei tre file in profondità e hai bisogno dei parametri di configurazione Redis. Due comandi, novanta secondi, di nuovo al lavoro:&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;Sviluppo assistito dall&amp;rsquo;IA:&lt;/strong&gt; La tua skill di VS Code avvolge i comandi CLI. Chiedi &amp;ldquo;Aggiungi un database PostgreSQL al mio AppHost&amp;rdquo; e l&amp;rsquo;agente consulta i docs reali prima di rispondere. Nessuna allucinazione.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Validazione CI/CD:&lt;/strong&gt; La tua pipeline valida le configurazioni AppHost contro la documentazione ufficiale in modo programmatico. L&amp;rsquo;output &lt;code&gt;--format Json&lt;/code&gt; si collega in modo pulito a &lt;code&gt;jq&lt;/code&gt; e altri strumenti.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Basi di conoscenza personalizzate:&lt;/strong&gt; Stai costruendo i tuoi strumenti IA? Invia l&amp;rsquo;output JSON strutturato direttamente nella tua base di conoscenza:&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;Niente web scraping. Niente chiavi API. Gli stessi dati strutturati usati internamente dagli strumenti di documentazione.&lt;/p&gt;
&lt;h2 id="la-documentazione-è-sempre-aggiornata"&gt;La documentazione è sempre aggiornata&lt;/h2&gt;
&lt;p&gt;Questa è la parte che apprezzo di più. La CLI non scarica uno snapshot — interroga aspire.dev con caching basato su ETag. Nel momento in cui la documentazione viene aggiornata, la tua CLI e qualsiasi skill costruita su di essa lo riflette. Niente copie obsolete, niente momenti &amp;ldquo;ma il wiki diceva&amp;hellip;&amp;rdquo;.&lt;/p&gt;
&lt;h2 id="per-concludere"&gt;Per concludere&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;aspire docs&lt;/code&gt; è una di quelle piccole funzionalità che risolve un problema reale in modo pulito. Gli umani ottengono accesso alla documentazione nativo nel terminale. Gli agenti IA ottengono un modo per smettere di indovinare e iniziare a fare riferimento a docs reali. E tutto è supportato dalla stessa fonte di verità.&lt;/p&gt;
&lt;p&gt;Se stai costruendo con .NET Aspire e non hai ancora provato la CLI, esegui &lt;code&gt;aspire docs search &amp;quot;il-tuo-argomento-qui&amp;quot;&lt;/code&gt; e vedi come ti sembra. Poi considera di integrare quei comandi nella skill IA o nella configurazione di automazione che stai usando — i tuoi agenti ti ringrazieranno.&lt;/p&gt;
&lt;p&gt;Dai un&amp;rsquo;occhiata all&amp;rsquo;&lt;a href="https://davidpine.dev/posts/aspire-docs-mcp-tools/"&gt;approfondimento di David Pine&lt;/a&gt; su come sono nati gli strumenti di documentazione, e al &lt;a href="https://aspire.dev/reference/cli/commands/aspire-docs/"&gt;riferimento ufficiale della CLI&lt;/a&gt; per tutti i dettagli.&lt;/p&gt;</content:encoded></item><item><title>Microsoft Agent Framework Raggiunge la 1.0 — Ecco Cosa Conta Davvero per gli Sviluppatori .NET</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/agent-framework-1-0-production-ready/</guid><description>Microsoft Agent Framework 1.0 è pronto per la produzione con API stabili, orchestrazione multi-agente e connettori per tutti i principali provider di IA. Ecco cosa devi sapere come sviluppatore .NET.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/posts/emiliano-montesdeoca/agent-framework-1-0-production-ready/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Se hai seguito il percorso di Agent Framework dai primi giorni di Semantic Kernel e AutoGen, questo è significativo. Microsoft Agent Framework ha appena &lt;a href="https://devblogs.microsoft.com/agent-framework/microsoft-agent-framework-version-1-0/"&gt;raggiunto la versione 1.0&lt;/a&gt; — pronto per la produzione, API stabili, impegno di supporto a lungo termine. È disponibile sia per .NET che per Python, ed è genuinamente pronto per carichi di lavoro reali.&lt;/p&gt;
&lt;p&gt;Vi taglio attraverso il rumore dell&amp;rsquo;annuncio e mi concentro su ciò che conta se state costruendo app alimentate dall&amp;rsquo;IA con .NET.&lt;/p&gt;
&lt;h2 id="la-versione-breve"&gt;La versione breve&lt;/h2&gt;
&lt;p&gt;Agent Framework 1.0 unifica quello che erano Semantic Kernel e AutoGen in un singolo SDK open source. Un&amp;rsquo;astrazione di agente. Un motore di orchestrazione. Molteplici provider di IA. Se avete saltato tra Semantic Kernel per i pattern enterprise e AutoGen per i workflow multi-agente di livello ricerca, potete smettere. Questo è l&amp;rsquo;unico SDK ora.&lt;/p&gt;
&lt;h2 id="iniziare-è-quasi-ingiustamente-semplice"&gt;Iniziare è quasi ingiustamente semplice&lt;/h2&gt;
&lt;p&gt;Ecco un agente funzionante 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;Tutto qui. Una manciata di righe e hai un agente IA che gira su Azure Foundry. L&amp;rsquo;equivalente Python è altrettanto conciso. Aggiungi strumenti di funzione, conversazioni multi-turno e streaming man mano che procedi — la superficie dell&amp;rsquo;API scala senza diventare strana.&lt;/p&gt;
&lt;h2 id="orchestrazione-multi-agente--questa-è-la-cosa-seria"&gt;Orchestrazione multi-agente — questa è la cosa seria&lt;/h2&gt;
&lt;p&gt;Gli agenti singoli vanno bene per le demo, ma gli scenari di produzione di solito necessitano di coordinamento. Agent Framework 1.0 arriva con pattern di orchestrazione testati in battaglia direttamente da Microsoft Research e AutoGen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sequenziale&lt;/strong&gt; — gli agenti elaborano in ordine (scrittore → revisore → editor)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Concorrente&lt;/strong&gt; — distribuisci a più agenti in parallelo, convergi i risultati&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Handoff&lt;/strong&gt; — un agente delega a un altro in base all&amp;rsquo;intento&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Chat di gruppo&lt;/strong&gt; — più agenti discutono e convergono su una soluzione&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Magentic-One&lt;/strong&gt; — il pattern multi-agente di livello ricerca di MSR&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tutti supportano streaming, checkpointing, approvazioni human-in-the-loop e pausa/ripresa. La parte di checkpointing è cruciale — i workflow di lunga durata sopravvivono ai riavvii del processo. Per noi sviluppatori .NET che abbiamo costruito workflow durevoli con Azure Functions, questo è familiare.&lt;/p&gt;
&lt;h2 id="le-funzionalità-che-contano-di-più"&gt;Le funzionalità che contano di più&lt;/h2&gt;
&lt;p&gt;Ecco la mia lista di ciò che vale la pena sapere:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hook middleware.&lt;/strong&gt; Sapete come ASP.NET Core ha le pipeline middleware? Stesso concetto, ma per l&amp;rsquo;esecuzione degli agenti. Intercetta ogni fase — aggiungi sicurezza dei contenuti, logging, policy di conformità — senza toccare i prompt dell&amp;rsquo;agente. È così che rendi gli agenti pronti per l&amp;rsquo;enterprise.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Memoria pluggable.&lt;/strong&gt; Storico conversazionale, stato persistente chiave-valore, recupero basato su vettori. Scegli il tuo backend: Foundry Agent Service, Mem0, Redis, Neo4j, o costruisci il tuo. La memoria è ciò che trasforma una chiamata LLM senza stato in un agente che ricorda davvero il contesto.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Agenti YAML dichiarativi.&lt;/strong&gt; Definisci le istruzioni del tuo agente, gli strumenti, la memoria e la topologia di orchestrazione in file YAML versionati. Carica ed esegui con una singola chiamata API. Questo è un game-changer per i team che vogliono iterare sul comportamento dell&amp;rsquo;agente senza ridistribuire il codice.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Supporto A2A e MCP.&lt;/strong&gt; MCP (Model Context Protocol) permette agli agenti di scoprire e invocare strumenti esterni dinamicamente. A2A (protocollo Agent-to-Agent) abilita la collaborazione cross-runtime — i tuoi agenti .NET possono coordinarsi con agenti in esecuzione in altri framework. Il supporto A2A 1.0 arriverà presto.&lt;/p&gt;
&lt;h2 id="le-funzionalità-in-preview-da-tenere-docchio"&gt;Le funzionalità in preview da tenere d&amp;rsquo;occhio&lt;/h2&gt;
&lt;p&gt;Alcune funzionalità sono state rilasciate come preview nella 1.0 — funzionali ma le API potrebbero evolvere:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DevUI&lt;/strong&gt; — un debugger locale basato su browser per visualizzare l&amp;rsquo;esecuzione dell&amp;rsquo;agente, i flussi di messaggi e le chiamate agli strumenti in tempo reale. Pensate ad Application Insights, ma per il ragionamento dell&amp;rsquo;agente.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub Copilot SDK e Claude Code SDK&lt;/strong&gt; — usa Copilot o Claude come harness dell&amp;rsquo;agente direttamente dal tuo codice di orchestrazione. Componi un agente capace di programmare accanto ai tuoi altri agenti nello stesso workflow.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agent Harness&lt;/strong&gt; — un runtime locale personalizzabile che dà agli agenti accesso a shell, file system e loop di messaggistica. Pensate ad agenti di coding e pattern di automazione.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Skills&lt;/strong&gt; — pacchetti riutilizzabili di capacità di dominio che danno agli agenti capacità strutturate pronte all&amp;rsquo;uso.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="migrazione-da-semantic-kernel-o-autogen"&gt;Migrazione da Semantic Kernel o AutoGen&lt;/h2&gt;
&lt;p&gt;Se avete codice Semantic Kernel o AutoGen esistente, ci sono assistenti di migrazione dedicati che analizzano il vostro codice e generano piani di migrazione passo dopo passo. La &lt;a href="https://learn.microsoft.com/en-us/agent-framework/migration-guide/from-semantic-kernel"&gt;guida alla migrazione da Semantic Kernel&lt;/a&gt; e la &lt;a href="https://learn.microsoft.com/en-us/agent-framework/migration-guide/from-autogen"&gt;guida alla migrazione da AutoGen&lt;/a&gt; vi accompagnano attraverso tutto.&lt;/p&gt;
&lt;p&gt;Se siete stati sui pacchetti RC, l&amp;rsquo;aggiornamento alla 1.0 è solo un cambio di versione.&lt;/p&gt;
&lt;h2 id="per-concludere"&gt;Per concludere&lt;/h2&gt;
&lt;p&gt;Agent Framework 1.0 è il traguardo di produzione che i team enterprise stavano aspettando. API stabili, supporto multi-provider, pattern di orchestrazione che funzionano davvero su scala, e percorsi di migrazione sia da Semantic Kernel che da AutoGen.&lt;/p&gt;
&lt;p&gt;Il framework è &lt;a href="https://github.com/microsoft/agent-framework"&gt;completamente open source su GitHub&lt;/a&gt;, e potete iniziare oggi con &lt;code&gt;dotnet add package Microsoft.Agents.AI&lt;/code&gt;. Date un&amp;rsquo;occhiata alla &lt;a href="https://learn.microsoft.com/en-us/agent-framework/get-started/"&gt;guida rapida&lt;/a&gt; e agli &lt;a href="https://github.com/microsoft/agent-framework"&gt;esempi&lt;/a&gt; per mettere le mani in pasta.&lt;/p&gt;
&lt;p&gt;Se stavate aspettando il segnale &amp;ldquo;sicuro da usare in produzione&amp;rdquo; — eccolo.&lt;/p&gt;</content:encoded></item><item><title>azd ora permette di eseguire e debuggare agenti IA localmente — Ecco cosa è cambiato a marzo 2026</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/azd-march-2026-local-ai-agent-debugging/</guid><description>L'Azure Developer CLI ha rilasciato sette versioni a marzo 2026. I punti salienti: un loop locale di esecuzione e debug per agenti IA, integrazione con GitHub Copilot nella configurazione dei progetti, e supporto per Container App Jobs.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/posts/emiliano-montesdeoca/azd-march-2026-local-ai-agent-debugging/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Sette rilasci in un mese. È quello che il team dell&amp;rsquo;Azure Developer CLI (&lt;code&gt;azd&lt;/code&gt;) ha pubblicato a marzo 2026, e la funzionalità principale è quella che stavo aspettando: &lt;strong&gt;un loop locale di esecuzione e debug per agenti IA&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;ha pubblicato il riepilogo completo&lt;/a&gt;, e anche se c&amp;rsquo;è molto contenuto, lasciatemi filtrare ciò che conta davvero per gli sviluppatori .NET che costruiscono app con IA.&lt;/p&gt;
&lt;h2 id="eseguire-e-debuggare-agenti-ia-senza-deploy"&gt;Eseguire e debuggare agenti IA senza deploy&lt;/h2&gt;
&lt;p&gt;Questa è la novità principale. La nuova estensione &lt;code&gt;azure.ai.agents&lt;/code&gt; aggiunge comandi che danno un&amp;rsquo;esperienza di inner-loop adeguata per gli agenti IA:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;azd ai agent run&lt;/code&gt; — avvia il tuo agente localmente&lt;/li&gt;
&lt;li&gt;&lt;code&gt;azd ai agent invoke&lt;/code&gt; — gli invia messaggi (locale o in produzione)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;azd ai agent show&lt;/code&gt; — mostra lo stato del container e la sua salute&lt;/li&gt;
&lt;li&gt;&lt;code&gt;azd ai agent monitor&lt;/code&gt; — trasmette i log del container in tempo reale&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Prima, testare un agente IA significava fare deploy su Microsoft Foundry ogni volta che facevi un cambiamento. Ora puoi iterare localmente, testare il comportamento del tuo agente, e fare deploy solo quando sei pronto.&lt;/p&gt;
&lt;h2 id="github-copilot-configura-il-tuo-progetto-azd"&gt;GitHub Copilot configura il tuo progetto azd&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;azd init&lt;/code&gt; ora offre un&amp;rsquo;opzione &amp;ldquo;Set up with GitHub Copilot (Preview)&amp;rdquo;. Invece di rispondere manualmente ai prompt, un agente Copilot genera la configurazione per te. Quando un comando fallisce, &lt;code&gt;azd&lt;/code&gt; offre troubleshooting assistito dall&amp;rsquo;IA — tutto senza lasciare il terminale.&lt;/p&gt;
&lt;h2 id="container-app-jobs-e-miglioramenti-del-deployment"&gt;Container App Jobs e miglioramenti del deployment&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; ora fa deploy di &lt;code&gt;Microsoft.App/jobs&lt;/code&gt; tramite la config esistente &lt;code&gt;host: containerapp&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Timeout configurabili&lt;/strong&gt;: Nuovo flag &lt;code&gt;--timeout&lt;/code&gt; su &lt;code&gt;azd deploy&lt;/code&gt; e campo &lt;code&gt;deployTimeout&lt;/code&gt; in &lt;code&gt;azure.yaml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fallback di build remoto&lt;/strong&gt;: Quando il build ACR fallisce, &lt;code&gt;azd&lt;/code&gt; passa automaticamente a Docker/Podman locale.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Validazione preflight locale&lt;/strong&gt;: I parametri Bicep vengono validati localmente prima del deploy.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="miglioramenti-dx"&gt;Miglioramenti DX&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Rilevamento automatico pnpm/yarn&lt;/strong&gt; per progetti JS/TS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Supporto pyproject.toml&lt;/strong&gt; per Python&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Directory template locali&lt;/strong&gt; — &lt;code&gt;azd init --template&lt;/code&gt; accetta percorsi del filesystem&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Messaggi di errore migliori&lt;/strong&gt; in modalità &lt;code&gt;--no-prompt&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Variabili d&amp;rsquo;ambiente di build&lt;/strong&gt; iniettate in tutti i sottoprocessi di build (.NET, Node.js, Java, Python)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="per-concludere"&gt;Per concludere&lt;/h2&gt;
&lt;p&gt;Il loop locale di debug per agenti IA è la star di questa release, ma l&amp;rsquo;accumulo di miglioramenti al deployment e alla DX rende &lt;code&gt;azd&lt;/code&gt; più maturo che mai. Se fai deploy di app .NET su Azure — specialmente agenti IA — questo aggiornamento vale la pena.&lt;/p&gt;
&lt;p&gt;Consulta le &lt;a href="https://devblogs.microsoft.com/azure-sdk/azure-developer-cli-azd-march-2026/"&gt;note di rilascio complete&lt;/a&gt; per tutti i dettagli.&lt;/p&gt;</content:encoded></item><item><title>Azure DevOps finalmente sistema l'editor Markdown di cui tutti si lamentavano</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/azure-devops-markdown-editor-work-items/</guid><description>L'editor Markdown di Azure DevOps per i work item ottiene una distinzione più chiara tra anteprima e modifica. Un piccolo cambiamento che risolve un problema di UX davvero fastidioso.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/posts/emiliano-montesdeoca/azure-devops-markdown-editor-work-items/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Se usi Azure Boards, probabilmente hai vissuto questo: stai leggendo la descrizione di un work item, magari controllando i criteri di accettazione, e fai accidentalmente doppio clic. Boom — sei in modalità modifica. Non volevi modificare niente. Stavi solo leggendo.&lt;/p&gt;
&lt;p&gt;Dan Hellem &lt;a href="https://devblogs.microsoft.com/devops/improving-the-markdown-editor-for-work-items/"&gt;ha annunciato la correzione&lt;/a&gt;, ed è uno di quei cambiamenti che sembrano piccoli ma rimuovono vera frizione dal tuo flusso di lavoro quotidiano.&lt;/p&gt;
&lt;h2 id="cosa-è-cambiato"&gt;Cosa è cambiato&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;editor Markdown per i campi testo dei work item ora si apre in &lt;strong&gt;modalità anteprima di default&lt;/strong&gt;. Puoi leggere e interagire con il contenuto — seguire link, verificare la formattazione — senza preoccuparti di entrare accidentalmente in modalità modifica.&lt;/p&gt;
&lt;p&gt;Quando vuoi davvero modificare, clicchi sull&amp;rsquo;icona di modifica in cima al campo. Quando hai finito, esci esplicitamente alla modalità anteprima. Semplice, intenzionale, prevedibile.&lt;/p&gt;
&lt;h2 id="perché-conta-più-di-quanto-sembra"&gt;Perché conta più di quanto sembra&lt;/h2&gt;
&lt;p&gt;Il &lt;a href="https://developercommunity.visualstudio.com/t/Markdown-editor-for-work-item-multi-line/10935496"&gt;thread di feedback della community&lt;/a&gt; era lungo. Il comportamento del doppio clic per modificare è stato introdotto con l&amp;rsquo;editor Markdown a luglio 2025, e le lamentele sono iniziate quasi subito.&lt;/p&gt;
&lt;p&gt;Per i team che fanno sprint planning, backlog refinement o code review con Azure Boards, questo tipo di micro-frizione si accumula.&lt;/p&gt;
&lt;h2 id="stato-del-rollout"&gt;Stato del rollout&lt;/h2&gt;
&lt;p&gt;È già in fase di distribuzione per un sottoinsieme di clienti e si espanderà a tutti nelle prossime due-tre settimane.&lt;/p&gt;
&lt;h2 id="per-concludere"&gt;Per concludere&lt;/h2&gt;
&lt;p&gt;Non ogni miglioramento deve essere una funzionalità da prima pagina. A volte il miglior aggiornamento è semplicemente rimuovere qualcosa di fastidioso. Questo è esattamente così — un piccolo fix UX che rende Azure Boards meno ostile per chi vuole solo leggere i propri work item in pace.&lt;/p&gt;</content:encoded></item><item><title>Bookmark Studio porta navigazione a slot e condivisione ai segnalibri di Visual Studio</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/bookmark-studio-visual-studio-extension/</guid><description>La nuova estensione Bookmark Studio di Mads Kristensen aggiunge navigazione a slot da tastiera, un gestore di segnalibri, colori, etichette e funzionalità di esportazione ai segnalibri di Visual Studio.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/posts/emiliano-montesdeoca/bookmark-studio-visual-studio-extension/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I segnalibri in Visual Studio sono sempre stati&amp;hellip; discreti. Ne metti uno, navighi al successivo, dimentichi qual è quale. Funzionano, ma non sono mai stati qualcosa che chiameresti potente.&lt;/p&gt;
&lt;p&gt;Mads Kristensen ha appena &lt;a href="https://devblogs.microsoft.com/visualstudio/bookmark-studio-evolving-bookmarks-in-visual-studio/"&gt;rilasciato Bookmark Studio&lt;/a&gt;, un&amp;rsquo;estensione sperimentale che colma esattamente le lacune che probabilmente hai incontrato.&lt;/p&gt;
&lt;h2 id="navigazione-a-slot"&gt;Navigazione a slot&lt;/h2&gt;
&lt;p&gt;I segnalibri possono essere assegnati a slot da 1 a 9 e raggiunti direttamente con &lt;code&gt;Alt+Shift+1&lt;/code&gt; fino a &lt;code&gt;Alt+Shift+9&lt;/code&gt;. I nuovi segnalibri ottengono automaticamente il primo slot disponibile.&lt;/p&gt;
&lt;h2 id="il-gestore-di-segnalibri"&gt;Il Gestore di Segnalibri&lt;/h2&gt;
&lt;p&gt;Una nuova finestra strumenti mostra tutti i segnalibri con filtri per nome, file, posizione, colore o slot.&lt;/p&gt;
&lt;h2 id="organizzazione-con-etichette-colori-e-cartelle"&gt;Organizzazione con etichette, colori e cartelle&lt;/h2&gt;
&lt;p&gt;I segnalibri possono avere etichette, colori ed essere raggruppati in cartelle. I metadati sono salvati per soluzione.&lt;/p&gt;
&lt;h2 id="esporta-e-condividi"&gt;Esporta e condividi&lt;/h2&gt;
&lt;p&gt;Bookmark Studio permette di esportare segnalibri come testo, Markdown o CSV.&lt;/p&gt;
&lt;h2 id="segnalibri-che-seguono-il-codice"&gt;Segnalibri che seguono il codice&lt;/h2&gt;
&lt;p&gt;Bookmark Studio traccia i segnalibri relativamente al testo ancorato, quindi non si spostano sulle righe sbagliate.&lt;/p&gt;
&lt;h2 id="per-concludere"&gt;Per concludere&lt;/h2&gt;
&lt;p&gt;Bookmark Studio non reinventa nulla. Prende una funzionalità che era &amp;ldquo;sufficiente&amp;rdquo; da anni e la rende davvero utile. Scaricalo dal &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>L'aggiornamento di marzo di Visual Studio permette di creare agenti Copilot personalizzati — e find_symbol è rivoluzionario</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/visual-studio-march-2026-custom-copilot-agents/</guid><description>L'aggiornamento di marzo 2026 di Visual Studio porta agenti Copilot personalizzati, skill riutilizzabili, lo strumento find_symbol con riconoscimento del linguaggio, e profiling con Copilot dal Test Explorer.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/posts/emiliano-montesdeoca/visual-studio-march-2026-custom-copilot-agents/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Visual Studio ha appena ricevuto il suo aggiornamento Copilot più significativo. Mark Downie &lt;a href="https://devblogs.microsoft.com/visualstudio/visual-studio-march-update-build-your-own-custom-agents/"&gt;ha annunciato il rilascio di marzo&lt;/a&gt;, e il titolo sono gli agenti personalizzati — ma onestamente, lo strumento &lt;code&gt;find_symbol&lt;/code&gt; potrebbe essere la funzionalità che cambia di più il tuo workflow.&lt;/p&gt;
&lt;h2 id="agenti-copilot-personalizzati-nel-tuo-repo"&gt;Agenti Copilot personalizzati nel tuo repo&lt;/h2&gt;
&lt;p&gt;Vuoi che Copilot segua gli standard del tuo team? Gli agenti personalizzati sono definiti come file &lt;code&gt;.agent.md&lt;/code&gt; in &lt;code&gt;.github/agents/&lt;/code&gt;. Ogni agente ha accesso completo al workspace, comprensione del codice, strumenti, il tuo modello preferito e connessioni MCP.&lt;/p&gt;
&lt;h2 id="agent-skill-pacchetti-di-istruzioni-riutilizzabili"&gt;Agent skill: pacchetti di istruzioni riutilizzabili&lt;/h2&gt;
&lt;p&gt;Le skill vengono caricate automaticamente da &lt;code&gt;.github/skills/&lt;/code&gt; nel tuo repo o &lt;code&gt;~/.copilot/skills/&lt;/code&gt; nel tuo profilo.&lt;/p&gt;
&lt;h2 id="find_symbol-navigazione-consapevole-del-linguaggio"&gt;find_symbol: navigazione consapevole del linguaggio&lt;/h2&gt;
&lt;p&gt;Il nuovo strumento &lt;code&gt;find_symbol&lt;/code&gt; dà alla modalità agente di Copilot una navigazione dei simboli basata sui servizi di linguaggio. Invece di cercare testo, l&amp;rsquo;agente può trovare tutti i riferimenti di un simbolo e accedere a informazioni su tipi e scope.&lt;/p&gt;
&lt;p&gt;Per gli sviluppatori .NET, è un miglioramento enorme — i codebase C# con gerarchie di tipi profonde ne beneficiano enormemente.&lt;/p&gt;
&lt;h2 id="profilare-test-con-copilot"&gt;Profilare test con Copilot&lt;/h2&gt;
&lt;p&gt;C&amp;rsquo;è un nuovo &lt;strong&gt;Profile with Copilot&lt;/strong&gt; nel menu contestuale del Test Explorer. Il Profiling Agent esegue il test e analizza le performance automaticamente.&lt;/p&gt;
&lt;h2 id="perf-tip-durante-il-debug-dal-vivo"&gt;Perf tip durante il debug dal vivo&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;ottimizzazione delle performance ora avviene durante il debug. Visual Studio mostra il tempo di esecuzione inline. Linea lenta? Clicca sul Perf Tip e chiedi a Copilot suggerimenti.&lt;/p&gt;
&lt;h2 id="correggere-vulnerabilità-nuget-dal-solution-explorer"&gt;Correggere vulnerabilità NuGet dal Solution Explorer&lt;/h2&gt;
&lt;p&gt;Un link &lt;strong&gt;Fix with GitHub Copilot&lt;/strong&gt; appare direttamente nel Solution Explorer quando viene rilevata una vulnerabilità.&lt;/p&gt;
&lt;h2 id="per-concludere"&gt;Per concludere&lt;/h2&gt;
&lt;p&gt;Agenti personalizzati e skill fanno il titolo, ma &lt;code&gt;find_symbol&lt;/code&gt; è la gemma nascosta — cambia fondamentalmente la precisione di Copilot nel refactoring di codice .NET. Scarica &lt;a href="https://visualstudio.microsoft.com/downloads/"&gt;Visual Studio 2026 Insiders&lt;/a&gt; per provare tutto.&lt;/p&gt;</content:encoded></item><item><title>La Dashboard di Aspire 13.2 ora ha un'API di telemetria — e cambia tutto</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/aspire-132-dashboard-export-telemetry/</guid><description>.NET Aspire 13.2 porta un'esportazione telemetrica più intelligente, un'API programmabile per trace e log, e miglioramenti alla visualizzazione GenAI. Ecco perché è importante per il tuo flusso di debug.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/posts/emiliano-montesdeoca/aspire-132-dashboard-export-telemetry/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Se hai sviluppato applicazioni distribuite con .NET Aspire, sai già che la dashboard è la cosa migliore dell&amp;rsquo;intera esperienza. Tutti i tuoi trace, log e metriche in un unico posto — niente Jaeger esterno, niente configurazione di Seq, niente momenti &amp;ldquo;fammi controllare l&amp;rsquo;altro terminale&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Aspire 13.2 ha appena migliorato tutto significativamente. James Newton-King &lt;a href="https://devblogs.microsoft.com/aspire/aspire-dashboard-improvements-export-and-telemetry/"&gt;ha annunciato l&amp;rsquo;aggiornamento&lt;/a&gt;, e onestamente? Le funzionalità di esportazione telemetria e l&amp;rsquo;API da sole giustificano l&amp;rsquo;upgrade.&lt;/p&gt;
&lt;h2 id="esportare-telemetria-come-una-persona-normale"&gt;Esportare telemetria come una persona normale&lt;/h2&gt;
&lt;p&gt;Ecco lo scenario che abbiamo vissuto tutti: stai debuggando un problema distribuito, finalmente lo riproduci dopo venti minuti di setup, e ora devi condividere con il team quello che è successo. Prima? Screenshot. Copia e incolla degli ID delle trace. Il solito caos.&lt;/p&gt;
&lt;p&gt;Aspire 13.2 aggiunge un dialog &lt;strong&gt;Gestisci log e telemetria&lt;/strong&gt; dove puoi:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pulire tutta la telemetria (utile prima di un tentativo di riproduzione)&lt;/li&gt;
&lt;li&gt;Esportare telemetria selezionata in un file ZIP nel formato standard OTLP/JSON&lt;/li&gt;
&lt;li&gt;Re-importare quel ZIP in qualsiasi dashboard Aspire successivamente&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Quest&amp;rsquo;ultimo punto è la funzionalità killer. Riproduci un bug, esporti la telemetria, la alleghi al tuo work item, e il tuo collega può importarla nella propria dashboard per vedere esattamente quello che hai visto tu. Niente più &amp;ldquo;riesci a riprodurlo sulla tua macchina?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Trace, span e log individuali hanno anche un&amp;rsquo;opzione &amp;ldquo;Export JSON&amp;rdquo; nei menu contestuali. Devi condividere una trace specifica? Click destro, copia JSON, incolla nella descrizione della PR. Fatto.&lt;/p&gt;
&lt;h2 id="lapi-di-telemetria-è-il-vero-punto-di-svolta"&gt;L&amp;rsquo;API di telemetria è il vero punto di svolta&lt;/h2&gt;
&lt;p&gt;Questo è ciò che mi entusiasma di più. La dashboard ora espone un&amp;rsquo;API HTTP sotto &lt;code&gt;/api/telemetry&lt;/code&gt; per interrogare i dati di telemetria programmaticamente. Endpoint disponibili:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GET /api/telemetry/resources&lt;/code&gt; — elencare risorse con telemetria&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /api/telemetry/spans&lt;/code&gt; — interrogare span con filtri&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /api/telemetry/logs&lt;/code&gt; — interrogare log con filtri&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /api/telemetry/traces&lt;/code&gt; — elencare trace&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /api/telemetry/traces/{traceId}&lt;/code&gt; — ottenere tutti gli span per una trace specifica&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tutto torna in formato OTLP JSON. Questo alimenta i nuovi comandi CLI &lt;code&gt;aspire agent mcp&lt;/code&gt; e &lt;code&gt;aspire otel&lt;/code&gt;, ma l&amp;rsquo;implicazione reale è più grande: ora puoi costruire strumenti, script e integrazioni con agenti IA che interrogano direttamente la telemetria della tua app.&lt;/p&gt;
&lt;p&gt;Immagina un agente IA che può vedere le tue trace distribuite reali durante il debug. Non è più ipotetico — è ciò che questa API rende possibile.&lt;/p&gt;
&lt;h2 id="la-telemetria-genai-diventa-pratica"&gt;La telemetria GenAI diventa pratica&lt;/h2&gt;
&lt;p&gt;Se stai costruendo app con IA usando Semantic Kernel o Microsoft.Extensions.AI, apprezzerai il visualizzatore di telemetria GenAI migliorato. Aspire 13.2 aggiunge:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Descrizioni degli strumenti IA renderizzate come Markdown&lt;/li&gt;
&lt;li&gt;Un pulsante GenAI dedicato nella pagina delle trace per accesso rapido&lt;/li&gt;
&lt;li&gt;Migliore gestione errori per JSON GenAI troncato o non standard&lt;/li&gt;
&lt;li&gt;Navigazione click-to-highlight tra le definizioni degli strumenti&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Il post menziona che VS Code Copilot chat, Copilot CLI e OpenCode supportano tutti la configurazione di un &lt;code&gt;OTEL_EXPORTER_OTLP_ENDPOINT&lt;/code&gt;. Puntali alla dashboard Aspire e puoi letteralmente guardare i tuoi agenti IA pensare in tempo reale attraverso la telemetria. Questa è un&amp;rsquo;esperienza di debug che non troverai da nessun&amp;rsquo;altra parte.&lt;/p&gt;
&lt;h2 id="per-concludere"&gt;Per concludere&lt;/h2&gt;
&lt;p&gt;Aspire 13.2 trasforma la dashboard da &amp;ldquo;bella UI di debug&amp;rdquo; a &amp;ldquo;piattaforma di osservabilità programmabile&amp;rdquo;. Il flusso di esportazione/importazione da solo fa risparmiare tempo reale nel debug distribuito, e l&amp;rsquo;API di telemetria apre la porta alla diagnostica assistita dall&amp;rsquo;IA.&lt;/p&gt;
&lt;p&gt;Se sei già su Aspire, aggiorna. Se no — questa è una buona ragione per dare un&amp;rsquo;occhiata a &lt;a href="https://aspire.dev"&gt;aspire.dev&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>KubeCon Europe 2026: Cosa dovrebbero davvero sapere gli sviluppatori .NET</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/kubecon-2026-aks-updates-dotnet-developers/</guid><description>Microsoft ha rilasciato una valanga di annunci Kubernetes alla KubeCon Europe 2026. Ecco la versione filtrata — solo gli aggiornamenti AKS e cloud-native che contano se sviluppi app .NET.</description><content:encoded>&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/posts/emiliano-montesdeoca/kubecon-2026-aks-updates-dotnet-developers/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Conosci quella sensazione quando esce un post di annunci enorme e scrolli pensando &amp;ldquo;bello, ma cosa cambia davvero per me&amp;rdquo;? Mi succede ogni stagione KubeCon.&lt;/p&gt;
&lt;p&gt;Microsoft ha appena pubblicato il &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;riassunto completo di KubeCon Europe 2026&lt;/a&gt; — scritto da Brendan Burns in persona — e onestamente? C&amp;rsquo;è sostanza vera. Non solo checklist di feature, ma miglioramenti operativi che cambiano come gestisci le cose in produzione.&lt;/p&gt;
&lt;p&gt;Vediamo cosa conta davvero per noi sviluppatori .NET.&lt;/p&gt;
&lt;h2 id="mtls-senza-la-tassa-del-service-mesh"&gt;mTLS senza la tassa del service mesh&lt;/h2&gt;
&lt;p&gt;Il punto sui service mesh: tutti vogliono le garanzie di sicurezza, nessuno vuole il carico operativo. AKS sta finalmente colmando questo divario.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://aka.ms/aks/application-network"&gt;Azure Kubernetes Application Network&lt;/a&gt; ti dà mutual TLS, autorizzazione application-aware e telemetria del traffico — senza deployare un mesh pesante con sidecar. Combinato con &lt;a href="https://aka.ms/acns/cilium-mtls"&gt;Cilium mTLS in Advanced Container Networking Services&lt;/a&gt;, ottieni comunicazione crittografata pod-a-pod usando certificati X.509 e SPIRE per la gestione delle identità.&lt;/p&gt;
&lt;p&gt;Cosa significa in pratica: le tue API ASP.NET Core che parlano con worker in background, i tuoi servizi gRPC che si chiamano a vicenda — tutto crittografato e verificato a livello di rete, senza modifiche al codice applicativo. È enorme.&lt;/p&gt;
&lt;p&gt;Per i team che migrano da &lt;code&gt;ingress-nginx&lt;/code&gt;, c&amp;rsquo;è anche &lt;a href="https://aka.ms/aks/app-routing/gateway-api"&gt;Application Routing con Meshless Istio&lt;/a&gt; con supporto completo per Kubernetes Gateway API. Niente sidecar. Basato su standard. E hanno rilasciato strumenti &lt;code&gt;ingress2gateway&lt;/code&gt; per la migrazione incrementale.&lt;/p&gt;
&lt;h2 id="osservabilità-gpu-che-non-è-un-ripensamento"&gt;Osservabilità GPU che non è un ripensamento&lt;/h2&gt;
&lt;p&gt;Se stai eseguendo inferenza IA accanto ai tuoi servizi .NET (e siamo onesti, chi non sta iniziando?), probabilmente hai incontrato il punto cieco del monitoraggio GPU. Avevi dashboard fantastiche per CPU/memoria e poi&amp;hellip; niente per le GPU senza configurazione manuale degli exporter.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://aka.ms/aks/managed-gpu-metrics"&gt;AKS ora espone le metriche GPU nativamente&lt;/a&gt; in Prometheus e Grafana gestiti. Stesso stack, stesse dashboard, stessa pipeline di alerting. Nessun exporter custom, nessun agent di terze parti.&lt;/p&gt;
&lt;p&gt;Sul lato rete, hanno aggiunto visibilità per flusso per traffico HTTP, gRPC e Kafka con un&amp;rsquo;&lt;a href="https://learn.microsoft.com/en-us/azure/aks/container-network-observability-logs"&gt;esperienza Azure Monitor one-click&lt;/a&gt;. IP, porte, workload, direzione del flusso, decisioni di policy — tutto in dashboard integrate.&lt;/p&gt;
&lt;p&gt;E quella che mi ha fatto guardare due volte: &lt;a href="https://learn.microsoft.com/en-us/azure/aks/advanced-container-networking-services-overview"&gt;agentic container networking&lt;/a&gt; aggiunge un&amp;rsquo;interfaccia web dove puoi fare domande in linguaggio naturale sullo stato di rete del tuo cluster. &amp;ldquo;Perché il pod X non raggiunge il servizio Y?&amp;rdquo; → diagnostica read-only dalla telemetria live. Genuinamente utile alle 2 di notte.&lt;/p&gt;
&lt;h2 id="networking-cross-cluster-senza-bisogno-di-un-dottorato"&gt;Networking cross-cluster senza bisogno di un dottorato&lt;/h2&gt;
&lt;p&gt;Il multi-cluster Kubernetes storicamente è stato un&amp;rsquo;esperienza &amp;ldquo;porta la tua colla di rete&amp;rdquo;. Azure Kubernetes Fleet Manager ora offre &lt;a href="https://aka.ms/kubernetes-fleet/networking/cross-cluster"&gt;networking cross-cluster&lt;/a&gt; tramite Cilium cluster mesh gestito:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Connettività unificata tra cluster AKS&lt;/li&gt;
&lt;li&gt;Registro globale dei servizi per la scoperta cross-cluster&lt;/li&gt;
&lt;li&gt;Configurazione gestita centralmente, non ripetuta per cluster&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Se esegui microservizi .NET su più regioni per resilienza o compliance, questo sostituisce molto collante custom fragile. Il Servizio A in West Europe può scoprire e chiamare il Servizio B in East US attraverso il mesh, con policy di routing e sicurezza consistenti.&lt;/p&gt;
&lt;h2 id="aggiornamenti-che-non-richiedono-coraggio"&gt;Aggiornamenti che non richiedono coraggio&lt;/h2&gt;
&lt;p&gt;Siamo onesti — gli aggiornamenti Kubernetes in produzione sono stressanti. &amp;ldquo;Aggiornare e sperare&amp;rdquo; è stata la strategia de facto per troppi team, ed è la ragione principale per cui i cluster restano indietro con le versioni.&lt;/p&gt;
&lt;p&gt;Due nuove capacità cambiano questo:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Blue-green agent pool upgrade&lt;/strong&gt; creano un pool di nodi parallelo con la nuova configurazione. Valida il comportamento, sposta il traffico gradualmente e mantieni un percorso di rollback pulito. Niente più mutazioni in-place su nodi di produzione.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Agent pool rollback&lt;/strong&gt; permette di riportare un pool di nodi alla versione Kubernetes e all&amp;rsquo;immagine nodo precedenti dopo che un aggiornamento va storto — senza ricostruire il cluster.&lt;/p&gt;
&lt;p&gt;Insieme, danno finalmente agli operatori un vero controllo sul ciclo di vita degli aggiornamenti. Per i team .NET, questo è importante perché la velocità della piattaforma controlla direttamente quanto rapidamente puoi adottare nuovi runtime, patch di sicurezza e capacità di rete.&lt;/p&gt;
&lt;h2 id="i-workload-ia-diventano-cittadini-di-prima-classe-in-kubernetes"&gt;I workload IA diventano cittadini di prima classe in Kubernetes&lt;/h2&gt;
&lt;p&gt;Il lavoro upstream open-source è altrettanto importante. Dynamic Resource Allocation (DRA) è appena andato in GA in Kubernetes 1.36, rendendo lo scheduling GPU una feature di prima classe invece di un workaround.&lt;/p&gt;
&lt;p&gt;Alcuni progetti da tenere d&amp;rsquo;occhio:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Progetto&lt;/th&gt;
&lt;th&gt;Cosa fa&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;API Kubernetes comune per l&amp;rsquo;inferenza — deploy di modelli senza conoscere K8s, con scoperta HuggingFace e stime dei costi&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;Troubleshooting agentico per il cloud-native — ora un progetto CNCF Sandbox&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;Build dichiarativi di immagini container con generazione SBOM — meno CVE nella fase di build&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;La direzione è chiara: la tua API .NET, il tuo layer di orchestrazione con Semantic Kernel e i tuoi workload di inferenza dovrebbero tutti girare su un modello di piattaforma consistente. Ci stiamo arrivando.&lt;/p&gt;
&lt;h2 id="da-dove-partirei-questa-settimana"&gt;Da dove partirei questa settimana&lt;/h2&gt;
&lt;p&gt;Se stai valutando questi cambiamenti per il tuo team, ecco la mia lista onesta di priorità:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Osservabilità prima&lt;/strong&gt; — abilita le metriche GPU e i log di flusso di rete in un cluster non-prod. Guarda cosa ti sei perso.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prova i blue-green upgrade&lt;/strong&gt; — testa il workflow di rollback prima del tuo prossimo aggiornamento di cluster in produzione. Costruisci fiducia nel processo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pilota il networking identity-aware&lt;/strong&gt; — scegli un percorso di servizio interno e abilita mTLS con Cilium. Misura l&amp;rsquo;overhead (spoiler: è minimo).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Valuta Fleet Manager&lt;/strong&gt; — se gestisci più di due cluster, il networking cross-cluster si ripaga da solo in riduzione di collante custom.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Piccoli esperimenti, feedback veloce. È sempre la mossa giusta.&lt;/p&gt;
&lt;h2 id="per-concludere"&gt;Per concludere&lt;/h2&gt;
&lt;p&gt;Gli annunci KubeCon possono essere travolgenti, ma questa tornata muove davvero l&amp;rsquo;ago per i team .NET su AKS. Migliore sicurezza di rete senza overhead di mesh, vera osservabilità GPU, aggiornamenti più sicuri e fondamenta più solide per l&amp;rsquo;infrastruttura IA.&lt;/p&gt;
&lt;p&gt;Se sei già su AKS, è un ottimo momento per rafforzare la tua baseline operativa. E se stai pianificando di spostare workload .NET su Kubernetes — la piattaforma è appena diventata significativamente più pronta per la produzione.&lt;/p&gt;</content:encoded></item><item><title>SQL MCP Server, Copilot in SSMS e un Database Hub con agenti IA: Cosa conta davvero dalla SQLCon 2026</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/agentic-ai-microsoft-databases-what-matters/</guid><description>Microsoft ha rilasciato una serie di annunci sui database alla SQLCon 2026. Ecco cosa conta davvero se stai costruendo app basate su IA con Azure SQL.</description><content:encoded>&lt;p&gt;Microsoft ha appena inaugurato &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 insieme a FabCon ad Atlanta&lt;/a&gt;, e c&amp;rsquo;è un sacco di roba da analizzare. L&amp;rsquo;annuncio originale copre tutto, dai piani di risparmio alle funzionalità di conformità enterprise. Io salterò le slide sui prezzi enterprise e mi concentrerò sugli elementi che contano se sei uno sviluppatore che costruisce cose con Azure SQL e IA.&lt;/p&gt;
&lt;h2 id="sql-mcp-server-è-in-public-preview"&gt;SQL MCP Server è in public preview&lt;/h2&gt;
&lt;p&gt;Questa è la notizia principale per me. Azure SQL Database Hyperscale ora ha un &lt;strong&gt;SQL MCP Server&lt;/strong&gt; in public preview che ti permette di connettere in modo sicuro i tuoi dati SQL ad agenti IA e Copilot usando il &lt;a href="https://modelcontextprotocol.io/"&gt;Model Context Protocol&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Se hai seguito l&amp;rsquo;onda MCP — e onestamente, è difficile non notarla in questo momento — questa è una grande novità. Invece di costruire pipeline di dati personalizzate per alimentare i tuoi agenti IA con il contesto dal tuo database, ottieni un protocollo standardizzato per esporre i dati SQL direttamente. I tuoi agenti possono interrogare, ragionare e agire su informazioni del database in tempo reale.&lt;/p&gt;
&lt;p&gt;Per quelli di noi che costruiscono agenti IA con Semantic Kernel o il Microsoft Agent Framework, questo apre un percorso di integrazione pulito. Il tuo agente deve controllare l&amp;rsquo;inventario? Cercare un record cliente? Validare un ordine? MCP gli dà un modo strutturato per farlo senza che tu debba scrivere codice di recupero dati su misura per ogni scenario.&lt;/p&gt;
&lt;h2 id="github-copilot-in-ssms-22-è-ora-ga"&gt;GitHub Copilot in SSMS 22 è ora GA&lt;/h2&gt;
&lt;p&gt;Se passi del tempo in SQL Server Management Studio — e siamo onesti, la maggior parte di noi lo fa ancora — GitHub Copilot è ora disponibile in versione generale in SSMS 22. La stessa esperienza Copilot che già usi in VS Code e Visual Studio, ma per T-SQL.&lt;/p&gt;
&lt;p&gt;Il valore pratico è semplice: assistenza via chat per scrivere query, refactoring di stored procedure, risoluzione di problemi di performance e gestione di task amministrativi. Niente di rivoluzionario come concetto, ma averlo direttamente in SSMS significa che non devi cambiare contesto verso un altro editor solo per ottenere aiuto IA sul tuo lavoro coi database.&lt;/p&gt;
&lt;h2 id="gli-indici-vettoriali-hanno-avuto-un-serio-upgrade"&gt;Gli indici vettoriali hanno avuto un serio upgrade&lt;/h2&gt;
&lt;p&gt;Azure SQL Database ora ha indici vettoriali più veloci e più capaci con supporto completo per insert, update e delete. Questo significa che i tuoi dati vettoriali restano aggiornati in tempo reale — niente reindicizzazione batch necessaria.&lt;/p&gt;
&lt;p&gt;Ecco le novità:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Quantizzazione&lt;/strong&gt; per dimensioni degli indici più piccole senza perdere troppa accuratezza&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Filtro iterativo&lt;/strong&gt; per risultati più precisi&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Integrazione più stretta con il query optimizer&lt;/strong&gt; per performance prevedibili&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Se stai facendo Retrieval-Augmented Generation (RAG) con Azure SQL come vector store, questi miglioramenti sono direttamente utili. Puoi tenere i tuoi vettori insieme ai dati relazionali nello stesso database, il che semplifica notevolmente la tua architettura rispetto a gestire un database vettoriale separato.&lt;/p&gt;
&lt;p&gt;Gli stessi miglioramenti vettoriali sono disponibili anche in SQL Database in Fabric, dato che entrambi girano sullo stesso motore SQL sotto il cofano.&lt;/p&gt;
&lt;h2 id="database-hub-in-fabric-gestione-agentica"&gt;Database Hub in Fabric: gestione agentica&lt;/h2&gt;
&lt;p&gt;Questo punto è più orientato al futuro, ma è interessante. Microsoft ha annunciato il &lt;strong&gt;Database Hub in Microsoft Fabric&lt;/strong&gt; (accesso anticipato), che ti dà un pannello unico su Azure SQL, Cosmos DB, PostgreSQL, MySQL e SQL Server via Arc.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;aspetto interessante non è solo la vista unificata — è l&amp;rsquo;approccio agentico alla gestione. Agenti IA monitorano continuamente il tuo parco database, evidenziano cosa è cambiato, spiegano perché è importante e suggeriscono cosa fare dopo. È un modello human-in-the-loop dove l&amp;rsquo;agente fa il lavoro pesante e tu prendi le decisioni.&lt;/p&gt;
&lt;p&gt;Per i team che gestiscono più di una manciata di database, questo potrebbe davvero ridurre il rumore operativo. Invece di saltare tra portali e controllare manualmente le metriche, l&amp;rsquo;agente porta il segnale a te.&lt;/p&gt;
&lt;h2 id="cosa-significa-questo-per-gli-sviluppatori-net"&gt;Cosa significa questo per gli sviluppatori .NET&lt;/h2&gt;
&lt;p&gt;Il filo conduttore di tutti questi annunci è chiaro: Microsoft sta integrando agenti IA in ogni livello dello stack database. Non come un espediente, ma come un livello pratico di strumenti.&lt;/p&gt;
&lt;p&gt;Se stai costruendo app .NET supportate da Azure SQL, ecco cosa farei concretamente:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Prova il SQL MCP Server&lt;/strong&gt; se stai costruendo agenti IA. È il modo più pulito per dare ai tuoi agenti accesso al database senza plumbing personalizzato.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Attiva Copilot in SSMS&lt;/strong&gt; se non l&amp;rsquo;hai già fatto — un guadagno di produttività gratuito per il lavoro SQL quotidiano.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dai un&amp;rsquo;occhiata agli indici vettoriali&lt;/strong&gt; se stai facendo RAG e attualmente usi un vector store separato. Consolidare su Azure SQL significa un servizio in meno da gestire.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="per-concludere"&gt;Per concludere&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;annuncio completo contiene di più — piani di risparmio, assistenti per la migrazione, funzionalità di conformità — ma la storia per gli sviluppatori è nel MCP Server, nei miglioramenti vettoriali e nel livello di gestione agentica. Questi sono gli elementi che cambiano come costruisci, non solo come fai il budget.&lt;/p&gt;
&lt;p&gt;Dai un&amp;rsquo;occhiata all&amp;rsquo;&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;annuncio completo di Shireesh Thota&lt;/a&gt; per il quadro completo, e &lt;a href="https://aka.ms/database-hub"&gt;iscriviti per l&amp;rsquo;accesso anticipato al Database Hub&lt;/a&gt; se vuoi provare la nuova esperienza di gestione.&lt;/p&gt;</content:encoded></item><item><title>Azure DevOps MCP Server arriva in Microsoft Foundry: cosa significa per i tuoi agenti IA</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/azure-devops-mcp-server-microsoft-foundry/</guid><description>L'Azure DevOps MCP Server è ora disponibile in Microsoft Foundry. Collega i tuoi agenti IA direttamente ai workflow DevOps — work item, repo, pipeline — con pochi clic.</description><content:encoded>&lt;p&gt;MCP (Model Context Protocol) sta avendo il suo momento. Se hai seguito l&amp;rsquo;ecosistema degli agenti IA, probabilmente hai notato che i server MCP stanno spuntando ovunque — dando agli agenti la capacità di interagire con strumenti e servizi esterni attraverso un protocollo standardizzato.&lt;/p&gt;
&lt;p&gt;Ora l&amp;rsquo;&lt;a href="https://devblogs.microsoft.com/devops/remote-mcp-server-preview-in-microsoft-foundry/"&gt;Azure DevOps MCP Server è disponibile in Microsoft Foundry&lt;/a&gt;, e questa è una di quelle integrazioni che ti fa pensare alle possibilità pratiche.&lt;/p&gt;
&lt;h2 id="cosa-sta-succedendo-realmente-qui"&gt;Cosa sta succedendo realmente qui&lt;/h2&gt;
&lt;p&gt;Microsoft ha già rilasciato l&amp;rsquo;Azure DevOps MCP Server come &lt;a href="https://devblogs.microsoft.com/devops/azure-devops-remote-mcp-server-public-preview"&gt;public preview&lt;/a&gt; — quello è il server MCP stesso. La novità è l&amp;rsquo;integrazione con Foundry. Ora puoi aggiungere l&amp;rsquo;Azure DevOps MCP Server ai tuoi agenti Foundry direttamente dal catalogo degli strumenti.&lt;/p&gt;
&lt;p&gt;Per chi non conosce ancora Foundry: è la piattaforma unificata di Microsoft per costruire e gestire applicazioni e agenti alimentati dall&amp;rsquo;IA su larga scala. Accesso ai modelli, orchestrazione, valutazione, deployment — tutto in un unico posto.&lt;/p&gt;
&lt;h2 id="la-configurazione"&gt;La configurazione&lt;/h2&gt;
&lt;p&gt;La configurazione è sorprendentemente semplice:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Nel tuo agente Foundry, vai su &lt;strong&gt;Add Tools&lt;/strong&gt; &amp;gt; &lt;strong&gt;Catalog&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Cerca &amp;ldquo;Azure DevOps&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Seleziona l&amp;rsquo;Azure DevOps MCP Server (preview) e clicca su &lt;strong&gt;Create&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Inserisci il nome della tua organizzazione e connetti&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Tutto qui. Il tuo agente ora ha accesso agli strumenti Azure DevOps.&lt;/p&gt;
&lt;h2 id="controllare-a-cosa-può-accedere-il-tuo-agente"&gt;Controllare a cosa può accedere il tuo agente&lt;/h2&gt;
&lt;p&gt;Questa è la parte che apprezzo: non sei bloccato con un approccio tutto-o-niente. Puoi specificare quali strumenti sono disponibili per il tuo agente. Quindi se vuoi che legga solo i work item ma non tocchi le pipeline, puoi configurarlo. Principio del minimo privilegio, applicato ai tuoi agenti IA.&lt;/p&gt;
&lt;p&gt;Questo conta per gli scenari enterprise dove non vuoi che un agente attivi accidentalmente una pipeline di deployment perché qualcuno gli ha chiesto di &amp;ldquo;aiutare con il release.&amp;rdquo;&lt;/p&gt;
&lt;h2 id="perché-è-interessante-per-i-team-net"&gt;Perché è interessante per i team .NET&lt;/h2&gt;
&lt;p&gt;Pensa a cosa abilita nella pratica:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Assistenti per la pianificazione degli sprint&lt;/strong&gt; — agenti che possono recuperare work item, analizzare dati di velocità e suggerire la capacità dello sprint&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bot di code review&lt;/strong&gt; — agenti che capiscono il contesto della tua PR perché possono effettivamente leggere i tuoi repo e work item collegati&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Risposta agli incidenti&lt;/strong&gt; — agenti che possono creare work item, interrogare i deployment recenti e correlare bug con modifiche recenti&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Onboarding degli sviluppatori&lt;/strong&gt; — &amp;ldquo;Su cosa dovrei lavorare?&amp;rdquo; ottiene una risposta reale basata su dati reali del progetto&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Per i team .NET che già usano Azure DevOps per le loro pipeline CI/CD e la gestione dei progetti, avere un agente IA che può interagire direttamente con questi sistemi è un passo significativo verso un&amp;rsquo;automazione utile.&lt;/p&gt;
&lt;h2 id="il-quadro-più-ampio-di-mcp"&gt;Il quadro più ampio di MCP&lt;/h2&gt;
&lt;p&gt;Questo fa parte di una tendenza più ampia: i server MCP stanno diventando il modo standard in cui gli agenti IA interagiscono con il mondo esterno. Li vediamo per GitHub, Azure DevOps, database, API SaaS — e Foundry sta diventando l&amp;rsquo;hub dove tutte queste connessioni convergono.&lt;/p&gt;
&lt;p&gt;Se stai costruendo agenti nell&amp;rsquo;ecosistema .NET, vale la pena tenere d&amp;rsquo;occhio MCP. Il protocollo è standardizzato, gli strumenti stanno maturando, e l&amp;rsquo;integrazione Foundry lo rende accessibile senza dover configurare manualmente le connessioni server.&lt;/p&gt;
&lt;h2 id="per-concludere"&gt;Per concludere&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;Azure DevOps MCP Server in Foundry è in preview, quindi aspettati che si evolva. Ma il workflow principale è solido: connettere, configurare l&amp;rsquo;accesso agli strumenti e lasciare che i tuoi agenti lavorino con i tuoi dati DevOps. Se sei già nell&amp;rsquo;ecosistema Foundry, è a pochi clic. Provalo e vedi quali workflow puoi costruire.&lt;/p&gt;
&lt;p&gt;Consulta l&amp;rsquo;&lt;a href="https://devblogs.microsoft.com/devops/remote-mcp-server-preview-in-microsoft-foundry/"&gt;annuncio completo&lt;/a&gt; per la configurazione passo per passo e maggiori dettagli.&lt;/p&gt;</content:encoded></item><item><title>Dal laptop alla produzione: deploy di agenti IA su Microsoft Foundry con due comandi</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/deploy-ai-agents-foundry-azd-two-commands/</guid><description>L'Azure Developer CLI ora ha i comandi 'azd ai agent' che portano il tuo agente IA dallo sviluppo locale a un endpoint Foundry in produzione in pochi minuti. Ecco il workflow completo.</description><content:encoded>&lt;p&gt;Conosci quel divario tra &amp;ldquo;funziona sulla mia macchina&amp;rdquo; e &amp;ldquo;è in produzione e serve traffico&amp;rdquo;? Per gli agenti IA, quel divario è stato dolorosamente ampio. Devi provisionare risorse, fare il deploy dei modelli, configurare l&amp;rsquo;identità, impostare il monitoraggio — e questo è prima che qualcuno possa effettivamente chiamare il tuo agente.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;Azure Developer CLI ha appena reso tutto questo una &lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-ai-agent-end-to-end/"&gt;questione di due comandi&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="il-nuovo-workflow-azd-ai-agent"&gt;Il nuovo workflow &lt;code&gt;azd ai agent&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Lascia che ti mostri come funziona nella pratica. Hai un progetto di agente IA — diciamo un agente concierge d&amp;rsquo;hotel. Funziona in locale. Vuoi farlo girare su Microsoft Foundry.&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;Tutto qui. Due comandi. &lt;code&gt;azd ai agent init&lt;/code&gt; genera l&amp;rsquo;infrastructure-as-code nel tuo repo, e &lt;code&gt;azd up&lt;/code&gt; provisiona tutto su Azure e pubblica il tuo agente. Ottieni un link diretto al tuo agente nel portale Foundry.&lt;/p&gt;
&lt;h2 id="cosa-succede-sotto-il-cofano"&gt;Cosa succede sotto il cofano&lt;/h2&gt;
&lt;p&gt;Il comando &lt;code&gt;init&lt;/code&gt; genera template Bicep reali e ispezionabili nel tuo repo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Una &lt;strong&gt;Foundry Resource&lt;/strong&gt; (contenitore di livello superiore)&lt;/li&gt;
&lt;li&gt;Un &lt;strong&gt;Foundry Project&lt;/strong&gt; (dove vive il tuo agente)&lt;/li&gt;
&lt;li&gt;Configurazione del &lt;strong&gt;deployment del modello&lt;/strong&gt; (GPT-4o, ecc.)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Managed Identity&lt;/strong&gt; con assegnazioni di ruoli RBAC appropriate&lt;/li&gt;
&lt;li&gt;&lt;code&gt;azure.yaml&lt;/code&gt; per la mappa dei servizi&lt;/li&gt;
&lt;li&gt;&lt;code&gt;agent.yaml&lt;/code&gt; con metadati dell&amp;rsquo;agente e variabili d&amp;rsquo;ambiente&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Il punto chiave: tutto questo è tuo. È Bicep versionato nel tuo repo. Puoi ispezionarlo, personalizzarlo e committarlo insieme al codice del tuo agente. Nessuna scatola nera magica.&lt;/p&gt;
&lt;h2 id="il-ciclo-interno-di-sviluppo"&gt;Il ciclo interno di sviluppo&lt;/h2&gt;
&lt;p&gt;Quello che mi piace davvero è l&amp;rsquo;esperienza di sviluppo locale. Quando stai iterando sulla logica dell&amp;rsquo;agente, non vuoi fare il redeploy ogni volta che cambi un prompt:&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;Questo avvia il tuo agente in locale. Combinalo con &lt;code&gt;azd ai agent invoke&lt;/code&gt; per inviare prompt di test, e hai un ciclo di feedback stretto. Modificare codice, riavviare, invocare, ripetere.&lt;/p&gt;
&lt;p&gt;Il comando &lt;code&gt;invoke&lt;/code&gt; è anche intelligente nel routing — quando un agente locale è in esecuzione, lo punta automaticamente. Quando non lo è, va all&amp;rsquo;endpoint remoto.&lt;/p&gt;
&lt;h2 id="monitoraggio-in-tempo-reale"&gt;Monitoraggio in tempo reale&lt;/h2&gt;
&lt;p&gt;Questa è la funzionalità che mi ha convinto. Una volta che il tuo agente è in deploy:&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;Ogni richiesta e risposta che passa attraverso il tuo agente viene trasmessa al tuo terminale in tempo reale. Per il debug di problemi in produzione, non ha prezzo. Niente ricerche in Log Analytics, niente attese per l&amp;rsquo;aggregazione delle metriche — vedi cosa sta succedendo adesso.&lt;/p&gt;
&lt;h2 id="il-set-completo-dei-comandi"&gt;Il set completo dei comandi&lt;/h2&gt;
&lt;p&gt;Ecco il riferimento rapido:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Comando&lt;/th&gt;
&lt;th&gt;Cosa fa&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;azd ai agent init&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Scaffold di un progetto agente Foundry con 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;Provisiona risorse Azure e fa il deploy dell&amp;rsquo;agente&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;Invia prompt all&amp;rsquo;agente remoto o locale&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;Esegue l&amp;rsquo;agente in locale per lo sviluppo&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;Streama log in tempo reale dall&amp;rsquo;agente pubblicato&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;Controlla salute e stato dell&amp;rsquo;agente&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;Pulisce tutte le risorse Azure&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="perché-è-importante-per-gli-sviluppatori-net"&gt;Perché è importante per gli sviluppatori .NET&lt;/h2&gt;
&lt;p&gt;Anche se l&amp;rsquo;esempio nell&amp;rsquo;annuncio è basato su Python, la storia dell&amp;rsquo;infrastruttura è language-agnostic. Il tuo agente .NET ottiene lo stesso scaffolding Bicep, lo stesso setup di managed identity, la stessa pipeline di monitoraggio. E se stai già usando &lt;code&gt;azd&lt;/code&gt; per le tue app .NET Aspire o deployment Azure, si integra direttamente nel tuo workflow esistente.&lt;/p&gt;
&lt;p&gt;Il divario di deployment per gli agenti IA è stato uno dei maggiori punti di attrito nell&amp;rsquo;ecosistema. Passare da un prototipo funzionante a un endpoint di produzione con identità, networking e monitoraggio appropriati non dovrebbe richiedere una settimana di lavoro DevOps. Ora richiede due comandi e qualche minuto.&lt;/p&gt;
&lt;h2 id="per-concludere"&gt;Per concludere&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;azd ai agent&lt;/code&gt; è disponibile ora. Se hai rimandato il deployment dei tuoi agenti IA perché il setup dell&amp;rsquo;infrastruttura sembrava troppo lavoro, provalo. Consulta il &lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-ai-agent-end-to-end/"&gt;walkthrough completo&lt;/a&gt; per la guida passo per passo inclusa l&amp;rsquo;integrazione di un&amp;rsquo;app chat frontend.&lt;/p&gt;</content:encoded></item><item><title>Foundry Agent Service è GA: Cosa conta davvero per chi costruisce agenti .NET</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/foundry-agent-service-ga-what-matters/</guid><description>Il Foundry Agent Service di Microsoft è appena andato in GA con networking privato, Voice Live, valutazioni di produzione e un runtime multi-modello aperto. Ecco cosa devi sapere.</description><content:encoded>&lt;p&gt;Siamo onesti — costruire un prototipo di agente IA è la parte facile. La parte difficile è tutto quello che viene dopo: metterlo in produzione con un adeguato isolamento di rete, eseguire valutazioni che significhino davvero qualcosa, gestire i requisiti di conformità e non rompere nulla alle 2 di notte.&lt;/p&gt;
&lt;p&gt;Il &lt;a href="https://devblogs.microsoft.com/foundry/foundry-agent-service-ga/"&gt;Foundry Agent Service è appena andato in GA&lt;/a&gt;, e questo rilascio è focalizzato come un laser su quel gap del &amp;ldquo;tutto quello che viene dopo&amp;rdquo;.&lt;/p&gt;
&lt;h2 id="costruito-sulla-responses-api"&gt;Costruito sulla Responses API&lt;/h2&gt;
&lt;p&gt;Il titolo: il Foundry Agent Service di nuova generazione è costruito sulla OpenAI Responses API. Se stai già costruendo con quel wire protocol, migrare a Foundry richiede modifiche minime al codice. Cosa guadagni: sicurezza enterprise, networking privato, RBAC Entra, tracing completo e valutazione — sopra la tua logica di agente esistente.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;architettura è intenzionalmente aperta. Non sei vincolato a un provider di modelli o a un framework di orchestrazione. Usa DeepSeek per la pianificazione, OpenAI per la generazione, LangGraph per l&amp;rsquo;orchestrazione — il runtime gestisce il livello di consistenza.&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;Se vieni dal pacchetto &lt;code&gt;azure-ai-agents&lt;/code&gt;, gli agenti sono ora operazioni di prima classe su &lt;code&gt;AIProjectClient&lt;/code&gt; in &lt;code&gt;azure-ai-projects&lt;/code&gt;. Rimuovi la dipendenza standalone e usa &lt;code&gt;get_openai_client()&lt;/code&gt; per gestire le risposte.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="networking-privato-il-bloccante-enterprise-rimosso"&gt;Networking privato: il bloccante enterprise rimosso&lt;/h2&gt;
&lt;p&gt;Questa è la funzionalità che sblocca l&amp;rsquo;adozione enterprise. Foundry ora supporta networking privato completo end-to-end con BYO VNet:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Nessun egress pubblico&lt;/strong&gt; — il traffico dell&amp;rsquo;agente non tocca mai internet pubblico&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Iniezione di container/subnet&lt;/strong&gt; nella tua rete per comunicazione locale&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Connettività degli strumenti inclusa&lt;/strong&gt; — server MCP, Azure AI Search, agenti dati Fabric operano tutti su percorsi privati&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;L&amp;rsquo;ultimo punto è critico. Non sono solo le chiamate di inferenza a restare private — ogni invocazione di strumento e chiamata di retrieval resta anch&amp;rsquo;essa all&amp;rsquo;interno del perimetro della tua rete. Per i team che operano sotto policy di classificazione dei dati che vietano il routing esterno, questo era ciò che mancava.&lt;/p&gt;
&lt;h2 id="autenticazione-mcp-fatta-bene"&gt;Autenticazione MCP fatta bene&lt;/h2&gt;
&lt;p&gt;Le connessioni ai server MCP ora supportano l&amp;rsquo;intero spettro di pattern di autenticazione:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metodo di auth&lt;/th&gt;
&lt;th&gt;Quando usarlo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Basato su chiave&lt;/td&gt;
&lt;td&gt;Accesso condiviso semplice per strumenti interni all&amp;rsquo;organizzazione&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entra Agent Identity&lt;/td&gt;
&lt;td&gt;Servizio a servizio; l&amp;rsquo;agente si autentica come se stesso&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entra Managed Identity&lt;/td&gt;
&lt;td&gt;Isolamento per progetto; nessuna gestione delle credenziali&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OAuth Identity Passthrough&lt;/td&gt;
&lt;td&gt;Accesso delegato dall&amp;rsquo;utente; l&amp;rsquo;agente agisce per conto degli utenti&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;OAuth Identity Passthrough è quello interessante. Quando gli utenti devono concedere a un agente l&amp;rsquo;accesso ai propri dati personali — il loro OneDrive, la loro organizzazione Salesforce, un&amp;rsquo;API SaaS con scope per utente — l&amp;rsquo;agente agisce per loro conto con flussi OAuth standard. Nessuna identità di sistema condivisa che finge di essere tutti.&lt;/p&gt;
&lt;h2 id="voice-live-voce-a-voce-senza-lidraulica"&gt;Voice Live: voce a voce senza l&amp;rsquo;idraulica&lt;/h2&gt;
&lt;p&gt;Aggiungere la voce a un agente significava unire STT, LLM e TTS — tre servizi, tre hop di latenza, tre superfici di fatturazione, tutto sincronizzato a mano. &lt;strong&gt;Voice Live&lt;/strong&gt; collassa tutto in una singola API gestita con:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Rilevamento semantico dell&amp;rsquo;attività vocale e del fine turno (capisce il significato, non solo il silenzio)&lt;/li&gt;
&lt;li&gt;Soppressione del rumore e cancellazione dell&amp;rsquo;eco lato server&lt;/li&gt;
&lt;li&gt;Supporto barge-in (gli utenti possono interrompere a metà risposta)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le interazioni vocali passano attraverso lo stesso runtime dell&amp;rsquo;agente del testo. Stessi valutatori, stesse tracce, stessa visibilità dei costi. Per supporto clienti, servizio sul campo o scenari di accessibilità, questo sostituisce ciò che prima richiedeva una pipeline audio personalizzata.&lt;/p&gt;
&lt;h2 id="valutazioni-da-checkbox-a-monitoraggio-continuo"&gt;Valutazioni: da checkbox a monitoraggio continuo&lt;/h2&gt;
&lt;p&gt;Qui è dove Foundry diventa serio sulla qualità in produzione. Il sistema di valutazione ora ha tre livelli:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Valutatori pronti all&amp;rsquo;uso&lt;/strong&gt; — coerenza, rilevanza, fondatezza, qualità del retrieval, sicurezza. Connetti a un dataset o al traffico live e ottieni punteggi.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Valutatori personalizzati&lt;/strong&gt; — codifica la tua logica di business, standard di tono e regole di conformità specifiche del dominio.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Valutazione continua&lt;/strong&gt; — Foundry campiona il traffico di produzione live, esegue la tua suite di valutatori e mostra i risultati nei dashboard. Imposta alert di Azure Monitor per quando la fondatezza cala o le soglie di sicurezza vengono superate.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Tutto viene pubblicato in Azure Monitor Application Insights. Qualità dell&amp;rsquo;agente, salute dell&amp;rsquo;infrastruttura, costi e telemetria dell&amp;rsquo;applicazione — tutto in un unico posto.&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="sei-nuove-regioni-per-agenti-ospitati"&gt;Sei nuove regioni per agenti ospitati&lt;/h2&gt;
&lt;p&gt;Gli agenti ospitati sono ora disponibili in East US, North Central US, Sweden Central, Southeast Asia, Japan East e altre. Questo conta per i requisiti di residenza dei dati e per comprimere la latenza quando il tuo agente gira vicino alle sue fonti dati.&lt;/p&gt;
&lt;h2 id="perché-è-importante-per-gli-sviluppatori-net"&gt;Perché è importante per gli sviluppatori .NET&lt;/h2&gt;
&lt;p&gt;Anche se gli esempi di codice nell&amp;rsquo;annuncio GA sono Python-first, l&amp;rsquo;infrastruttura sottostante è language-agnostic — e l&amp;rsquo;SDK .NET per &lt;code&gt;azure-ai-projects&lt;/code&gt; segue gli stessi pattern. La Responses API, il framework di valutazione, il networking privato, l&amp;rsquo;auth MCP — tutto questo è disponibile da .NET.&lt;/p&gt;
&lt;p&gt;Se stavi aspettando che gli agenti IA passassero da &amp;ldquo;demo cool&amp;rdquo; a &amp;ldquo;posso davvero consegnare questo al lavoro&amp;rdquo;, questo rilascio GA è il segnale. Networking privato, autenticazione adeguata, valutazione continua e monitoraggio di produzione sono i pezzi che mancavano.&lt;/p&gt;
&lt;h2 id="per-concludere"&gt;Per concludere&lt;/h2&gt;
&lt;p&gt;Foundry Agent Service è disponibile ora. Installa l&amp;rsquo;SDK, apri &lt;a href="https://ai.azure.com"&gt;il portale&lt;/a&gt; e inizia a costruire. La &lt;a href="https://learn.microsoft.com/azure/foundry/quickstarts/get-started-code"&gt;guida quickstart&lt;/a&gt; ti porta da zero a un agente funzionante in pochi minuti.&lt;/p&gt;
&lt;p&gt;Per il deep-dive tecnico completo con tutti gli esempi di codice, consulta l&amp;rsquo;&lt;a href="https://devblogs.microsoft.com/foundry/foundry-agent-service-ga/"&gt;annuncio GA&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Risposte in background nel Microsoft Agent Framework: basta ansia da timeout</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/background-responses-agent-framework-long-running-tasks/</guid><description>Microsoft Agent Framework ora permette di scaricare attività IA di lunga durata con token di continuazione. Ecco come funzionano le risposte in background e perché contano per i tuoi agenti .NET.</description><content:encoded>&lt;p&gt;Se hai costruito qualcosa con modelli di ragionamento come o3 o GPT-5.2, conosci il dolore. Il tuo agente inizia a ragionare su un compito complesso, il client resta in attesa, e da qualche parte tra &amp;ldquo;va tutto bene&amp;rdquo; e &amp;ldquo;si sarà bloccato?&amp;rdquo; la tua connessione va in timeout. Tutto quel lavoro? Perso.&lt;/p&gt;
&lt;p&gt;Microsoft Agent Framework ha appena rilasciato le &lt;a href="https://devblogs.microsoft.com/agent-framework/handling-long-running-operations-with-background-responses/"&gt;risposte in background&lt;/a&gt; — e onestamente, questa è una di quelle funzionalità che avrebbero dovuto esistere dal primo giorno.&lt;/p&gt;
&lt;h2 id="il-problema-con-le-chiamate-bloccanti"&gt;Il problema con le chiamate bloccanti&lt;/h2&gt;
&lt;p&gt;In un pattern tradizionale richiesta-risposta, il tuo client si blocca finché l&amp;rsquo;agente non finisce. Funziona bene per i compiti veloci. Ma quando chiedi a un modello di ragionamento di fare ricerca approfondita, analisi multi-step, o generare un report di 20 pagine? Stai guardando minuti di tempo reale. Durante quella finestra:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Le connessioni HTTP possono scadere&lt;/li&gt;
&lt;li&gt;I problemi di rete uccidono l&amp;rsquo;intera operazione&lt;/li&gt;
&lt;li&gt;Il tuo utente fissa uno spinner chiedendosi se sta succedendo qualcosa&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le risposte in background ribaltano tutto questo.&lt;/p&gt;
&lt;h2 id="come-funzionano-i-token-di-continuazione"&gt;Come funzionano i token di continuazione&lt;/h2&gt;
&lt;p&gt;Invece di bloccare, lanci il compito dell&amp;rsquo;agente e ottieni un &lt;strong&gt;token di continuazione&lt;/strong&gt;. Pensalo come un biglietto di ritiro in un&amp;rsquo;officina — non resti al bancone ad aspettare, torni quando è pronto.&lt;/p&gt;
&lt;p&gt;Il flusso è diretto:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Invia la tua richiesta con &lt;code&gt;AllowBackgroundResponses = true&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Se l&amp;rsquo;agente supporta l&amp;rsquo;elaborazione in background, ricevi un token di continuazione&lt;/li&gt;
&lt;li&gt;Interroga al tuo ritmo finché il token non torna &lt;code&gt;null&lt;/code&gt; — significa che il risultato è pronto&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Ecco la versione .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="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;// Interrogare fino al completamento&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;Se l&amp;rsquo;agente completa immediatamente (compiti semplici, modelli che non necessitano di elaborazione in background), nessun token viene restituito. Il tuo codice funziona e basta — nessuna gestione speciale necessaria.&lt;/p&gt;
&lt;h2 id="streaming-con-ripresa-la-vera-magia"&gt;Streaming con ripresa: la vera magia&lt;/h2&gt;
&lt;p&gt;Il polling va bene per scenari fire-and-forget, ma cosa succede quando vuoi il progresso in tempo reale? Le risposte in background supportano anche lo streaming con ripresa integrata.&lt;/p&gt;
&lt;p&gt;Ogni aggiornamento dello stream porta il suo token di continuazione. Se la tua connessione cade a metà stream, riprendi esattamente da dove avevi lasciato:&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;// Simulare un&amp;#39;interruzione di rete&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;// Riprendere esattamente da dove avevamo lasciato&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;L&amp;rsquo;agente continua a elaborare lato server indipendentemente da cosa succede al tuo client. È tolleranza ai guasti integrata senza che tu scriva logica di retry o circuit breaker.&lt;/p&gt;
&lt;h2 id="quando-usare-questo-concretamente"&gt;Quando usare questo concretamente&lt;/h2&gt;
&lt;p&gt;Non ogni chiamata all&amp;rsquo;agente ha bisogno di risposte in background. Per completamenti veloci, stai aggiungendo complessità senza motivo. Ma ecco dove brillano:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Compiti di ragionamento complesso&lt;/strong&gt; — analisi multi-step, ricerca approfondita, qualsiasi cosa che faccia davvero pensare un modello di ragionamento&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generazione di contenuti lunghi&lt;/strong&gt; — report dettagliati, documenti multi-parte, analisi estese&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reti poco affidabili&lt;/strong&gt; — client mobili, deployment edge, VPN aziendali instabili&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pattern UX asincroni&lt;/strong&gt; — invia un compito, vai a fare altro, torna per i risultati&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Per noi sviluppatori .NET che costruiamo app enterprise, l&amp;rsquo;ultimo punto è particolarmente interessante. Pensa a un&amp;rsquo;app Blazor dove un utente richiede un report complesso — lanci il compito dell&amp;rsquo;agente, mostri un indicatore di progresso, e li lasci continuare a lavorare. Niente acrobazie WebSocket, niente infrastruttura di code personalizzata, solo un token e un loop di polling.&lt;/p&gt;
&lt;h2 id="per-concludere"&gt;Per concludere&lt;/h2&gt;
&lt;p&gt;Le risposte in background sono disponibili ora sia in .NET che in Python attraverso Microsoft Agent Framework. Se stai costruendo agenti che fanno qualcosa di più complesso del semplice Q&amp;amp;A, vale la pena aggiungerlo al tuo toolkit. Il pattern del token di continuazione mantiene le cose semplici risolvendo un problema di produzione molto reale.&lt;/p&gt;
&lt;p&gt;Consulta la &lt;a href="https://devblogs.microsoft.com/agent-framework/handling-long-running-operations-with-background-responses/"&gt;documentazione completa&lt;/a&gt; per il riferimento completo dell&amp;rsquo;API e altri esempi.&lt;/p&gt;</content:encoded></item><item><title>VS Code 1.112: Cosa dovrebbe davvero interessare agli sviluppatori .NET</title><link>https://thedotnetblog.com/it/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/it/posts/emiliano-montesdeoca/vscode-1-112-dotnet-developers/</guid><description>VS Code 1.112 è appena uscito ed è pieno di upgrade per gli agenti, un debugger browser integrato, sandboxing MCP e supporto monorepo. Ecco cosa conta davvero se sviluppi con .NET.</description><content:encoded>&lt;p&gt;VS Code 1.112 è appena atterrato, e onestamente? Questo colpisce diversamente se passi le tue giornate nel mondo .NET. C&amp;rsquo;è molto nelle &lt;a href="https://code.visualstudio.com/updates/v1_112"&gt;note di rilascio ufficiali&lt;/a&gt;, ma lascia che ti risparmi un po&amp;rsquo; di scrolling e mi concentri su quello che conta davvero per noi.&lt;/p&gt;
&lt;h2 id="copilot-cli-è-diventato-molto-più-utile"&gt;Copilot CLI è diventato molto più utile&lt;/h2&gt;
&lt;p&gt;Il grande tema di questo rilascio è l&amp;rsquo;&lt;strong&gt;autonomia dell&amp;rsquo;agente&lt;/strong&gt; — dare a Copilot più spazio per fare il suo lavoro senza che tu supervisioni ogni passo.&lt;/p&gt;
&lt;h3 id="steering-e-coda-dei-messaggi"&gt;Steering e coda dei messaggi&lt;/h3&gt;
&lt;p&gt;Conosci quel momento in cui Copilot CLI è a metà di un task e ti rendi conto che hai dimenticato di menzionare qualcosa? Prima, dovevi aspettare. Ora puoi inviare messaggi mentre una richiesta è ancora in corso — sia per dirigere la risposta corrente che per mettere in coda istruzioni di follow-up.&lt;/p&gt;
&lt;p&gt;Questo è enorme per quei task di scaffolding &lt;code&gt;dotnet&lt;/code&gt; più lunghi dove stai guardando Copilot configurare un progetto e pensi &amp;ldquo;oh aspetta, mi serve anche MassTransit lì dentro.&amp;rdquo;&lt;/p&gt;
&lt;h3 id="livelli-di-permessi"&gt;Livelli di permessi&lt;/h3&gt;
&lt;p&gt;Questo è quello che mi entusiasma di più. Le sessioni Copilot CLI ora supportano tre livelli di permessi:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Permessi predefiniti&lt;/strong&gt; — il flusso solito dove gli strumenti chiedono conferma prima di eseguire&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bypass approvazioni&lt;/strong&gt; — auto-approva tutto e riprova in caso di errore&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Autopilota&lt;/strong&gt; — completamente autonomo: approva strumenti, risponde alle proprie domande e continua finché il task non è completo&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Se stai facendo qualcosa come creare una nuova API ASP.NET Core con Entity Framework, migrazioni e Docker setup — la modalità Autopilota significa che descrivi quello che vuoi e vai a prendere un caffè. Lo capirà da solo.&lt;/p&gt;
&lt;p&gt;Puoi abilitare l&amp;rsquo;Autopilota con l&amp;rsquo;impostazione &lt;code&gt;chat.autopilot.enabled&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="anteprima-delle-modifiche-prima-della-delega"&gt;Anteprima delle modifiche prima della delega&lt;/h3&gt;
&lt;p&gt;Quando deleghi un task a Copilot CLI, crea un worktree. Prima, se avevi modifiche non committate, dovevi controllare il Source Control per vedere cosa sarebbe stato influenzato. Ora la vista Chat mostra le modifiche pendenti proprio lì prima che tu decida se copiarle, spostarle o ignorarle.&lt;/p&gt;
&lt;p&gt;Piccola cosa, ma ti salva da quel momento &amp;ldquo;aspetta, cosa avevo in staging?&amp;rdquo;&lt;/p&gt;
&lt;h2 id="debug-delle-web-app-senza-lasciare-vs-code"&gt;Debug delle web app senza lasciare VS Code&lt;/h2&gt;
&lt;p&gt;Il browser integrato ora supporta il &lt;strong&gt;debugging completo&lt;/strong&gt;. Puoi impostare breakpoint, fare step through del codice e ispezionare variabili — tutto dentro VS Code. Basta passare a Edge DevTools.&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;è un nuovo tipo di debug &lt;code&gt;editor-browser&lt;/code&gt;, e se hai già configurazioni di lancio &lt;code&gt;msedge&lt;/code&gt; o &lt;code&gt;chrome&lt;/code&gt; esistenti, migrare è semplice come cambiare il campo &lt;code&gt;type&lt;/code&gt; nel tuo &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;Per gli sviluppatori Blazor, questo è un game changer. Stai già eseguendo &lt;code&gt;dotnet watch&lt;/code&gt; nel terminale — ora anche il tuo debugging resta nella stessa finestra.&lt;/p&gt;
&lt;p&gt;Il browser ha anche ottenuto livelli di zoom indipendenti (finalmente), menu contestuali con clic destro appropriati, e lo zoom viene ricordato per sito web.&lt;/p&gt;
&lt;h2 id="sandboxing-dei-server-mcp"&gt;Sandboxing dei server MCP&lt;/h2&gt;
&lt;p&gt;Questo conta più di quanto potresti pensare. Se usi server MCP — magari ne hai configurato uno personalizzato per le tue risorse Azure o query al database — giravano con gli stessi permessi del tuo processo VS Code. Questo significa accesso completo al tuo filesystem, rete, tutto.&lt;/p&gt;
&lt;p&gt;Ora puoi metterli in sandbox. Nel tuo &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;Quando un server sandboxato ha bisogno di accedere a qualcosa che non ha, VS Code ti chiede di concedere il permesso. Molto meglio dell&amp;rsquo;approccio &amp;ldquo;speriamo che nessuno faccia nulla di strano&amp;rdquo;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Nota:&lt;/strong&gt; Il sandboxing è disponibile su macOS e Linux per ora. Il supporto Windows è in arrivo — scenari remoti come WSL funzionano però.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="scoperta-delle-personalizzazioni-nei-monorepo"&gt;Scoperta delle personalizzazioni nei monorepo&lt;/h2&gt;
&lt;p&gt;Se lavori in un monorepo (e siamo onesti, molte soluzioni .NET enterprise finiscono per diventarne uno), questo risolve un vero punto dolente.&lt;/p&gt;
&lt;p&gt;Prima, se aprivi una sottocartella del tuo repo, VS Code non trovava il tuo &lt;code&gt;copilot-instructions.md&lt;/code&gt;, &lt;code&gt;AGENTS.md&lt;/code&gt; o skills personalizzati alla radice del repository. Ora con l&amp;rsquo;impostazione &lt;code&gt;chat.useCustomizationsInParentRepositories&lt;/code&gt;, risale fino alla radice &lt;code&gt;.git&lt;/code&gt; e scopre tutto.&lt;/p&gt;
&lt;p&gt;Questo significa che il tuo team può condividere istruzioni per agenti, file di prompt e strumenti personalizzati tra tutti i progetti in un monorepo senza che tutti debbano aprire la cartella radice.&lt;/p&gt;
&lt;h2 id="troubleshoot-per-il-debugging-degli-agenti"&gt;/troubleshoot per il debugging degli agenti&lt;/h2&gt;
&lt;p&gt;Hai mai configurato istruzioni personalizzate o skills e ti sei chiesto perché non vengono rilevati? Il nuovo skill &lt;code&gt;/troubleshoot&lt;/code&gt; legge i log di debug dell&amp;rsquo;agente e ti dice cosa è successo — quali strumenti sono stati usati o saltati, perché le istruzioni non sono state caricate, e cosa sta causando risposte lente.&lt;/p&gt;
&lt;p&gt;Abilitalo con:&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;Poi scrivi semplicemente &lt;code&gt;/troubleshoot why is my custom skill not loading?&lt;/code&gt; nella chat.&lt;/p&gt;
&lt;p&gt;Puoi anche esportare e importare questi log di debug ora, il che è ottimo per condividerli con il team quando qualcosa non funziona come previsto.&lt;/p&gt;
&lt;h2 id="supporto-file-immagine-e-binari"&gt;Supporto file immagine e binari&lt;/h2&gt;
&lt;p&gt;Gli agenti possono ora leggere file immagine dal disco e file binari nativamente. I file binari vengono presentati in formato hexdump, e gli output delle immagini (come screenshot dal browser integrato) appaiono in una vista carousel.&lt;/p&gt;
&lt;p&gt;Per gli sviluppatori .NET, pensa: incolla uno screenshot di un bug UI nella chat e fai capire all&amp;rsquo;agente cosa c&amp;rsquo;è che non va, o fagli analizzare l&amp;rsquo;output del rendering di un componente Blazor.&lt;/p&gt;
&lt;h2 id="riferimenti-automatici-ai-simboli"&gt;Riferimenti automatici ai simboli&lt;/h2&gt;
&lt;p&gt;Piccolo miglioramento di qualità della vita: quando copi il nome di un simbolo (una classe, metodo, ecc.) e lo incolli nella chat, VS Code ora lo converte automaticamente in un riferimento &lt;code&gt;#sym:Name&lt;/code&gt;. Questo dà all&amp;rsquo;agente il contesto completo su quel simbolo senza che tu debba aggiungerlo manualmente.&lt;/p&gt;
&lt;p&gt;Se vuoi testo semplice, usa &lt;code&gt;Ctrl+Shift+V&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="i-plugin-possono-ora-essere-abilitatidisabilitati"&gt;I plugin possono ora essere abilitati/disabilitati&lt;/h2&gt;
&lt;p&gt;Prima, disabilitare un server MCP o plugin significava disinstallarlo. Ora puoi attivarli e disattivarli — sia globalmente che per workspace. Clic destro nella vista Estensioni o nella vista Personalizzazioni e hai fatto.&lt;/p&gt;
&lt;p&gt;I plugin da npm e pypi possono anche auto-aggiornarsi ora, anche se chiederanno approvazione prima poiché gli aggiornamenti significano eseguire nuovo codice sulla tua macchina.&lt;/p&gt;
&lt;h2 id="per-concludere"&gt;Per concludere&lt;/h2&gt;
&lt;p&gt;VS Code 1.112 sta chiaramente spingendo forte sull&amp;rsquo;esperienza agent — più autonomia, debugging migliore, sicurezza più stretta. Per gli sviluppatori .NET, il debugging del browser integrato e i miglioramenti di Copilot CLI sono le funzionalità di punta.&lt;/p&gt;
&lt;p&gt;Se non hai ancora provato a eseguire una sessione completa di Copilot CLI in modalità Autopilota per un progetto .NET, questo rilascio è un buon momento per iniziare. Ricorda solo di impostare i tuoi permessi e lasciare cuocere.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://code.visualstudio.com/updates/v1_112"&gt;Scarica VS Code 1.112&lt;/a&gt; o aggiorna dall&amp;rsquo;interno di VS Code tramite &lt;strong&gt;Aiuto &amp;gt; Controlla aggiornamenti&lt;/strong&gt;.&lt;/p&gt;</content:encoded></item><item><title>Emiliano Montesdeoca</title><link>https://thedotnetblog.com/it/authors/emiliano-montesdeoca/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thedotnetblog.com/it/authors/emiliano-montesdeoca/</guid><description/><content:encoded/></item><item><title>Scrivi per The .NET Blog</title><link>https://thedotnetblog.com/it/contribute/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thedotnetblog.com/it/contribute/</guid><description>Condividi le tue conoscenze con la community .NET. Scopri come diventare autore e inviare il tuo primo articolo.</description><content:encoded>&lt;p&gt;The .NET Blog una pubblicazione guidata dalla community dove gli sviluppatori condividono approfondimenti, tutorial e storie su .NET, Azure, AI e sviluppo cloud-native. &lt;strong&gt;Accogliamo contributi da sviluppatori di tutti i che tu stia scrivendo il tuo primo articolo tecnico o sia un relatore esperto.livelli&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="come-partecipare"&gt;Come Partecipare&lt;/h2&gt;
&lt;p&gt;Tutto vive su GitHub e segue un flusso di lavoro basato su pull request. Ecco come iniziare:&lt;/p&gt;
&lt;h3 id="1-fai-il-fork-del-repository"&gt;1. Fai il Fork del Repository&lt;/h3&gt;
&lt;p&gt;Vai su &lt;a href="https://github.com/thedotnetblog/blog"&gt;github.com/thedotnetblog/blog&lt;/a&gt; e crea un fork nel tuo account GitHub.&lt;/p&gt;
&lt;h3 id="2-crea-il-tuo-profilo-autore"&gt;2. Crea il tuo Profilo Autore&lt;/h3&gt;
&lt;p&gt;Se il tuo primo contributo, aggiungiti come autore creando una cartella in &lt;code&gt;content/authors/tuo-username/&lt;/code&gt; con un file &lt;code&gt;index.md&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="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;Il tuo Nome&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;tuo-username&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;Il tuo ruolo o titolo&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;Una breve biografia su di te.&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/tuo-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/tuo-username&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/tuo-username&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;Aggiungi la tua immagine avatar (quadrata, almeno 200200px) in &lt;code&gt;static/img/authors/&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="3-scrivi-il-tuo-articolo"&gt;3. Scrivi il tuo Articolo&lt;/h3&gt;
&lt;p&gt;Crea una nuova cartella in &lt;code&gt;content/posts/tuo-username/slug-del-tuo-articolo/&lt;/code&gt; e aggiungi un file &lt;code&gt;index.md&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="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;Titolo del tuo Articolo&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;tuo-username&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;Una breve descrizione del tuo articolo.&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;Il contenuto del tuo articolo 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-apri-una-pull-request"&gt;4. Apri una Pull Request&lt;/h3&gt;
&lt;p&gt;Invia le tue modifiche al tuo fork e apri una pull request verso il branch &lt;code&gt;main&lt;/code&gt;. Il nostro team la esaminer e fornir feedback entro pochi giorni.&lt;/p&gt;
&lt;h2 id="cosa-cerchiamo"&gt;Cosa Cerchiamo&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;** guide passo passo su .NET, Azure, AI, Blazor, Aspire e altroTutorial**&lt;/li&gt;
&lt;li&gt;** esplorazioni dettagliate di una tecnologia, pattern o architetturaApprofondimenti**&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Storie della la tua esperienza con .NET in produzionecommunity&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resoconti di riassunti di conferenze, meetup o webinareventi&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="linee-guida"&gt;Linee Guida&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Il contenuto deve essere tecnico e pertinente all&amp;rsquo;ecosistema .NET&lt;/li&gt;
&lt;li&gt;Gli esempi di codice devono essere accurati e testati in un progetto reale&lt;/li&gt;
&lt;li&gt;Includi una descrizione significativa e almeno un tag pertinente&lt;/li&gt;
&lt;li&gt;Gli articoli vengono tradotti automaticamente in tutte le lingue supportate&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contatti"&gt;Contatti&lt;/h2&gt;
&lt;p&gt;Apri una issue su &lt;a href="https://github.com/thedotnetblog/blog/issues"&gt;GitHub&lt;/a&gt; o contattaci su &lt;a href="https://x.com/thedotnetblog"&gt;X / Twitter&lt;/a&gt;. Saremmo felici di accoglierti nella community!&lt;/p&gt;</content:encoded></item></channel></rss>