<?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>Posts | The .NET Blog</title><link>https://thedotnetblog.com/ca/posts/</link><description>Articles, tutorials and insights from the .NET community.</description><generator>Hugo</generator><language>ca</language><managingEditor>@thedotnetblog (The .NET Blog)</managingEditor><webMaster>@thedotnetblog</webMaster><lastBuildDate>Sat, 25 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://thedotnetblog.com/ca/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>.NET 10 Inclòs amb Ubuntu 26.04 LTS — Les Novetats</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/dotnet-ubuntu-2604-resolute-raccoon-net10/</guid><description>Ubuntu 26.04 LTS (Resolute Raccoon) arriba amb .NET 10 com a toolchain de primera classe. Native AOT, contenidors chiseled, Linux 7.0.</description><content:encoded>&lt;p&gt;&lt;em&gt;Aquest post ha estat traduït automàticament. Per a la versió original, &lt;a href="https://thedotnetblog.com/ca/posts/emiliano-montesdeoca/dotnet-ubuntu-2604-resolute-raccoon-net10/"&gt;fes clic aquí&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;És el dia d&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; ha arribat avui amb &lt;a href="https://devblogs.microsoft.com/dotnet/whats-new-for-dotnet-in-ubuntu-2604/"&gt;.NET 10&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="installa-net-10-en-dos-comandes"&gt;Instal·la .NET 10 en dos comandes&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install dotnet-sdk-10.0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="contenidors-actualitza--noble-a--resolute"&gt;Contenidors: actualitza &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-arrencada-en-3ms-binari-de-14mb"&gt;Native AOT: arrencada en 3ms, binari de 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;# binari natiu de 1.4MB, arrencada en 3ms&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="necessites-net-8-o-9"&gt;Necessites .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;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;Consulta el &lt;a href="https://devblogs.microsoft.com/dotnet/whats-new-for-dotnet-in-ubuntu-2604/"&gt;post complet&lt;/a&gt; per a més detalls.&lt;/p&gt;</content:encoded></item><item><title>CodeAct al Agent Framework: Com Reduir la Latència del teu Agent a la Meitat</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/codeact-agent-framework-hyperlight-50-percent-faster/</guid><description>CodeAct col·lapsa cadenes d'eines de múltiples passos en un únic bloc de codi sandboxed — reduint la latència un 52% i l'ús de tokens un 64%. Aquí tens el que significa pels teus agents i quan fer-lo servir.</description><content:encoded>&lt;p&gt;&lt;em&gt;Aquest post ha estat traduït automàticament. Per a la versió original, &lt;a href="https://thedotnetblog.com/ca/posts/emiliano-montesdeoca/codeact-agent-framework-hyperlight-50-percent-faster/"&gt;fes clic aquí&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Hi ha un moment en tot projecte d&amp;rsquo;agents en què mires el trace i penses: &amp;ldquo;per què tarda tant això?&amp;rdquo; El model està bé. Les eines funcionen. Però hi ha set round trips per obtenir un resultat que es podria calcular d&amp;rsquo;una sola vegada.&lt;/p&gt;
&lt;p&gt;Exactament aquest és el problema que resol CodeAct — i l&amp;rsquo;&lt;a href="https://devblogs.microsoft.com/agent-framework/codeact-with-hyperlight/"&gt;equip d&amp;rsquo;Agent Framework acaba de publicar suport alpha&lt;/a&gt; a través del nou paquet &lt;code&gt;agent-framework-hyperlight&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="què-és-codeact"&gt;Què és CodeAct?&lt;/h2&gt;
&lt;p&gt;El &lt;a href="https://arxiv.org/abs/2402.01030"&gt;patró CodeAct&lt;/a&gt; és elegantment simple: en lloc de donar al model una llista d&amp;rsquo;eines i deixar-lo cridar-les una per una, li dones una única eina &lt;code&gt;execute_code&lt;/code&gt; i li permets expressar el &lt;em&gt;pla complet&lt;/em&gt; com un programa Python curt. L&amp;rsquo;agent escriu el codi una vegada, el sandbox l&amp;rsquo;executa, i tornes a rebre un únic resultat consolidat.&lt;/p&gt;
&lt;p&gt;Un pla de cinc passos que abans requeria cinc torns del model ara es converteix en un torn &lt;code&gt;execute_code&lt;/code&gt; que conté un script Python que crida les teves eines via &lt;code&gt;call_tool(...)&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;El benchmark del repositori ho fa concret. Vuit usuaris, dotzenes de comandes, cinc eines. Mateix model, mateixes eines, mateix prompt — només cablejat diferent:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Cablejat&lt;/th&gt;
&lt;th&gt;Temps&lt;/th&gt;
&lt;th&gt;Tokens&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Tradicional&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;Millora&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-peça-de-seguretat-micro-vms-de-hyperlight"&gt;La peça de seguretat: micro-VMs de Hyperlight&lt;/h2&gt;
&lt;p&gt;El paquet &lt;code&gt;agent-framework-hyperlight&lt;/code&gt; utilitza micro-VMs de &lt;a href="https://github.com/hyperlight-dev/hyperlight"&gt;Hyperlight&lt;/a&gt;. Cada crida &lt;code&gt;execute_code&lt;/code&gt; obté la seva pròpia micro-VM recentment creada — amb la seva pròpia memòria, sense accés al sistema de fitxers del host més enllà del que muntes explícitament. L&amp;rsquo;arrencada es mesura en mil·lisegons.&lt;/p&gt;
&lt;p&gt;Les teves eines segueixen executant-se al host. El &lt;em&gt;codi de pegament&lt;/em&gt; generat pel model s&amp;rsquo;executa en el sandbox. Aquesta és la divisió correcta.&lt;/p&gt;
&lt;h2 id="com-connectar-ho"&gt;Com connectar-ho&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="quan-fer-servir-codeact-i-quan-no"&gt;Quan fer servir CodeAct (i quan no)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Fes servir CodeAct quan:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La tasca encadena moltes crides petites a eines (consultes, joins, càlculs, formatació)&lt;/li&gt;
&lt;li&gt;Et preocupa la latència i el cost de tokens&lt;/li&gt;
&lt;li&gt;Vols aïllament fort per crida en codi generat pel model&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Queda&amp;rsquo;t amb el tool-calling tradicional quan:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;L&amp;rsquo;agent només fa una o dues crides a eines per torn&lt;/li&gt;
&lt;li&gt;Cada crida té efectes secundaris que vols aprovar individualment&lt;/li&gt;
&lt;li&gt;Les descripcions d&amp;rsquo;eines són escasses o ambigües&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="prova-ho-ara"&gt;Prova-ho ara&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;Consulta el &lt;a href="https://devblogs.microsoft.com/agent-framework/codeact-with-hyperlight/"&gt;post complet al blog d&amp;rsquo;Agent Framework&lt;/a&gt; per a cobertura més profunda.&lt;/p&gt;</content:encoded></item><item><title>El Azure MCP Server Ara és un .mcpb — Instal·la'l sense Cap Runtime</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/azure-mcp-server-mcpb-no-runtime-install/</guid><description>L'Azure MCP Server ja està disponible com a MCP Bundle (.mcpb) — descarrega'l, arrossega'l a Claude Desktop i ja està. Sense Node.js, Python ni .NET requerits.</description><content:encoded>&lt;p&gt;&lt;em&gt;Aquest post ha estat traduït automàticament. Per a la versió original, &lt;a href="https://thedotnetblog.com/ca/posts/emiliano-montesdeoca/azure-mcp-server-mcpb-no-runtime-install/"&gt;fes clic aquí&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Saps el que era molest de configurar servidors MCP? Necessitaves un runtime. Node.js per a la versió npm, Python per a pip/uvx, .NET SDK per a la variant 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 acaba de canviar això&lt;/a&gt;. Ara està disponible com a &lt;code&gt;.mcpb&lt;/code&gt; — un MCP Bundle — i la configuració és arrossegar i deixar anar.&lt;/p&gt;
&lt;h2 id="què-és-un-mcp-bundle"&gt;Què és un MCP Bundle?&lt;/h2&gt;
&lt;p&gt;Pensa-hi com una extensió de VS Code (&lt;code&gt;.vsix&lt;/code&gt;) o una extensió de navegador (&lt;code&gt;.crx&lt;/code&gt;), però per a servidors MCP. Un fitxer &lt;code&gt;.mcpb&lt;/code&gt; és un arxiu ZIP autònom que inclou el binari del servidor i totes les seves dependències.&lt;/p&gt;
&lt;h2 id="com-installar-lo"&gt;Com instal·lar-lo&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;1. Descarrega el bundle per a la teva plataforma&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ves a la &lt;a href="https://github.com/microsoft/mcp/releases?q=Azure.Mcp.Server"&gt;pàgina de GitHub Releases&lt;/a&gt; i descarrega el fitxer &lt;code&gt;.mcpb&lt;/code&gt; per al teu OS i arquitectura.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Instal·la a Claude Desktop&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;La manera més fàcil: arrossega i deixa anar el fitxer &lt;code&gt;.mcpb&lt;/code&gt; a la finestra de Claude Desktop mentre estàs a la pàgina de configuració d&amp;rsquo;Extensions. Revisa els detalls del servidor, fes clic a Instal·la i confirma.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Autentifica&amp;rsquo;t a Azure&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az login
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="per-a-començar"&gt;Per a començar&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Descarrega&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;Repositori&lt;/strong&gt;: &lt;a href="https://aka.ms/azmcp"&gt;aka.ms/azmcp&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Consulta el &lt;a href="https://devblogs.microsoft.com/azure-sdk/azure-mcp-server-mcpb-support/"&gt;post complet&lt;/a&gt; per a més detalls.&lt;/p&gt;</content:encoded></item><item><title>GPT-5.5 Ja És Aquí a Azure Foundry — El que els Desenvolupadors .NET Han de Saber</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/gpt-55-foundry-ga-what-dotnet-developers-need-to-know/</guid><description>GPT-5.5 ja és disponible a Microsoft Foundry. La progressió des de GPT-5 fins a 5.5, què ha millorat realment i com començar a usar-lo en els teus agents avui.</description><content:encoded>&lt;p&gt;&lt;em&gt;Aquest post ha estat traduït automàticament. Per a la versió original, &lt;a href="https://thedotnetblog.com/ca/posts/emiliano-montesdeoca/gpt-55-foundry-ga-what-dotnet-developers-need-to-know/"&gt;fes clic aquí&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Microsoft acaba d&amp;rsquo;anunciar que &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 ja és disponible a Microsoft Foundry&lt;/a&gt;. Si has estat construint agents a Azure, aquesta és l&amp;rsquo;actualització que esperaves.&lt;/p&gt;
&lt;h2 id="la-progressió-de-gpt-5"&gt;La progressió de GPT-5&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GPT-5&lt;/strong&gt;: va unificar raonament i velocitat en un sol sistema&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPT-5.4&lt;/strong&gt;: raonament multi-pas més robust, capacitats agèntiques per a empreses&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPT-5.5&lt;/strong&gt;: raonament de llarg context més profund, execució agèntica més fiable, millor eficiència de tokens&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="què-ha-canviat-realment"&gt;Què ha canviat realment&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Millor codificació agèntica&lt;/strong&gt;: GPT-5.5 manté el context a través de grans bases de codi, diagnostica fallades arquitectòniques i anticipa requisits de proves.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Eficiència de tokens&lt;/strong&gt;: Sortides de major qualitat amb menys tokens i menys reintents. Menys cost i latència en producció.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Anàlisi de llarg context&lt;/strong&gt;: Gestiona documents extensos i historials multi-sessió sense perdre el fil.&lt;/p&gt;
&lt;h2 id="preus"&gt;Preus&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Entrada ($/M tokens)&lt;/th&gt;
&lt;th&gt;Entrada en memòria cau&lt;/th&gt;
&lt;th&gt;Sortida ($/M tokens)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.5&lt;/td&gt;
&lt;td&gt;$5.00&lt;/td&gt;
&lt;td&gt;$0.50&lt;/td&gt;
&lt;td&gt;$30.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.5 Pro&lt;/td&gt;
&lt;td&gt;$30.00&lt;/td&gt;
&lt;td&gt;$3.00&lt;/td&gt;
&lt;td&gt;$180.00&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="foundry-agent-service"&gt;Foundry Agent Service&lt;/h2&gt;
&lt;p&gt;Defineix agents en YAML o connecta&amp;rsquo;ls amb Microsoft Agent Framework, GitHub Copilot SDK, LangGraph o l&amp;rsquo;SDK d&amp;rsquo;OpenAI Agents — i executa&amp;rsquo;ls com a agents allotjats aïllats amb sistema de fitxers persistent, identitat de Microsoft Entra i preus d&amp;rsquo;escala a 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;Ets un assistent útil.&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;ElMeuAgent&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;anunci complet&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>On Recorda les Coses el teu Agent? Guia Pràctica sobre l'Emmagatzematge de l'Historial de Xat</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/chat-history-storage-patterns-agent-framework/</guid><description>Gestionat pel servei o pel client? Lineal o amb bifurcacions? La decisió arquitectònica que defineix el que el teu agent IA pot fer realment.</description><content:encoded>&lt;p&gt;&lt;em&gt;Aquest post ha estat traduït automàticament. Per a la versió original, &lt;a href="https://thedotnetblog.com/ca/posts/emiliano-montesdeoca/chat-history-storage-patterns-agent-framework/"&gt;fes clic aquí&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Quan construeixes un agent IA, dediques la major part de la teva energia al model, les eines i els prompts. La pregunta de &lt;em&gt;on viu l&amp;rsquo;historial de conversa&lt;/em&gt; sembla un detall d&amp;rsquo;implementació — però és una de les decisions arquitectòniques més importants que prendràs.&lt;/p&gt;
&lt;p&gt;Determina si els usuaris poden bifurcar converses, desfer respostes, reprendre sessions després d&amp;rsquo;un reinici, i si les teves dades surten mai de la teva infraestructura. L&amp;rsquo;&lt;a href="https://devblogs.microsoft.com/agent-framework/chat-history-storage-patterns-in-microsoft-agent-framework/"&gt;equip d&amp;rsquo;Agent Framework ha publicat una anàlisi en profunditat&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="dos-patrons-fonamentals"&gt;Dos patrons fonamentals&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Gestionat pel servei&lt;/strong&gt;: el servei d&amp;rsquo;IA emmagatzema l&amp;rsquo;estat de la conversa. La teva app manté una referència i el servei inclou automàticament l&amp;rsquo;historial rellevant en cada sol·licitud.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Gestionat pel client&lt;/strong&gt;: la teva app manté l&amp;rsquo;historial complet i envia missatges rellevants amb cada sol·licitud. El servei no té estat. Controles tot.&lt;/p&gt;
&lt;h2 id="com-agent-framework-abstreu-això"&gt;Com Agent Framework abstreu això&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// C# — funciona igual independentment del proveïdor&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;AgentSession&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreateSessionAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;first&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Em dic 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;Quin és el meu nom?&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Python&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create_session&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;first&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Em dic 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;Quin és el meu nom?&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="referència-ràpida-de-proveïdors"&gt;Referència ràpida de proveïdors&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Proveïdor&lt;/th&gt;
&lt;th&gt;Emmagatzematge&lt;/th&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Compactació&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;Servei&lt;/td&gt;
&lt;td&gt;Lineal&lt;/td&gt;
&lt;td&gt;Servei&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Responses API (per defecte)&lt;/td&gt;
&lt;td&gt;Servei&lt;/td&gt;
&lt;td&gt;Bifurcació&lt;/td&gt;
&lt;td&gt;Servei&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;p&gt;Llegeix el &lt;a href="https://devblogs.microsoft.com/agent-framework/chat-history-storage-patterns-in-microsoft-agent-framework/"&gt;post complet&lt;/a&gt; per a l&amp;rsquo;arbre de decisions complet.&lt;/p&gt;</content:encoded></item><item><title>VS Code 1.118: Copilot CLI Obté Noms de Sessió, Insígnies de Model i TypeScript 7.0 Nightly</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/vscode-1-118-copilot-cli-session-names-model-badge/</guid><description>Visual Studio Code 1.118 és un llançament enfocat en millores de Copilot CLI — noms de sessió, insígnies de model, selecció automàtica de model i opt-in a TypeScript 7.0 nightly.</description><content:encoded>&lt;p&gt;&lt;em&gt;Aquest post ha estat traduït automàticament. Per a la versió original, &lt;a href="https://thedotnetblog.com/ca/posts/emiliano-montesdeoca/vscode-1-118-copilot-cli-session-names-model-badge/"&gt;fes clic aquí&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; és un llançament petit i enfocat — principalment millores de Copilot CLI.&lt;/p&gt;
&lt;h2 id="copilot-cli-les-sessions-ara-tenen-noms-reals"&gt;Copilot CLI: les sessions ara tenen noms reals&lt;/h2&gt;
&lt;p&gt;Les APIs de títol de sessió del SDK de Copilot CLI s&amp;rsquo;utilitzen ara com a font de veritat. Les sessions mostren el nom real del SDK en lloc d&amp;rsquo;etiquetes auto-generades.&lt;/p&gt;
&lt;h2 id="canvia-de-sessió-amb-dreceres-de-teclat"&gt;Canvia de sessió amb dreceres de teclat&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;app d&amp;rsquo;Agents ara té &lt;code&gt;Ctrl+1&lt;/code&gt;, &lt;code&gt;Ctrl+2&lt;/code&gt;, etc. per canviar ràpidament entre sessions.&lt;/p&gt;
&lt;h2 id="insígnies-de-model-al-xat"&gt;Insígnies de model al xat&lt;/h2&gt;
&lt;p&gt;Les respostes de Copilot CLI al panell de xat ara mostren una insígnia de model per veure quin model ha gestionat cada sol·licitud.&lt;/p&gt;
&lt;h2 id="selecció-automàtica-de-model-a-copilot-cli"&gt;Selecció automàtica de model a Copilot CLI&lt;/h2&gt;
&lt;p&gt;La selecció automàtica de model — anteriorment disponible en altres parts de Copilot — ara funciona també a l&amp;rsquo;agent Copilot CLI.&lt;/p&gt;
&lt;h2 id="opt-in-a-typescript-70-nightly"&gt;Opt-in a TypeScript 7.0 nightly&lt;/h2&gt;
&lt;p&gt;Ara pots optar per provar els nightly de TypeScript 7.0 directament des de la configuració de VS Code.&lt;/p&gt;
&lt;p&gt;Consulta les &lt;a href="https://code.visualstudio.com/updates/v1_118"&gt;notes de versió completes&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Foundry Toolboxes: Un únic endpoint per a totes les eines dels teus agents</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/foundry-toolboxes-curate-manage-tools-ai-agents/</guid><description>Microsoft Foundry acaba de llançar Toolboxes en preview pública — una manera de curar, gestionar i exposar eines d'agents IA a través d'un únic endpoint compatible amb MCP.</description><content:encoded>&lt;p&gt;&lt;em&gt;Aquesta publicació ha estat traduïda automàticament. Per a la versió original, &lt;a href="https://thedotnetblog.com/ca/posts/emiliano-montesdeoca/foundry-toolboxes-curate-manage-tools-ai-agents/"&gt;feu clic aquí&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Hi ha un problema que sembla avorrit fins que el pateixes de primera mà: la teva organització està construint múltiples agents d&amp;rsquo;IA, cadascun necessita eines, i cada equip les connecta des de zero. La mateixa integració de cerca web, la mateixa config d&amp;rsquo;Azure AI Search, la mateixa connexió al servidor MCP de GitHub — però en un altre repositori, per un altre equip, amb altres credencials i sense cap governança compartida.&lt;/p&gt;
&lt;p&gt;Microsoft Foundry acaba de llançar &lt;a href="https://devblogs.microsoft.com/foundry/introducing-toolboxes-in-foundry/"&gt;Toolboxes&lt;/a&gt; en preview pública, i és una resposta directa a aquest problema.&lt;/p&gt;
&lt;h2 id="què-és-un-toolbox"&gt;Què és un Toolbox?&lt;/h2&gt;
&lt;p&gt;Un Toolbox és un bundle d&amp;rsquo;eines amb nom, reutilitzable, que defineixes una vegada a Foundry i exposes a través d&amp;rsquo;un únic endpoint compatible amb MCP. Qualsevol runtime d&amp;rsquo;agent que parli MCP pot consumir-lo — no estàs bloquejat a Foundry Agents.&lt;/p&gt;
&lt;p&gt;La proposta és simple: &lt;strong&gt;build once, consume anywhere&lt;/strong&gt;. Defineix les eines, configura l&amp;rsquo;autenticació de forma centralitzada, publica l&amp;rsquo;endpoint. Cada agent que necessiti les eines es connecta a l&amp;rsquo;endpoint i les obté totes.&lt;/p&gt;
&lt;h2 id="els-quatre-pilars-dos-disponibles-avui"&gt;Els quatre pilars (dos disponibles avui)&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pilar&lt;/th&gt;
&lt;th&gt;Estat&lt;/th&gt;
&lt;th&gt;Què 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;Pròximament&lt;/td&gt;
&lt;td&gt;Troba eines aprovades sense buscar manualment&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;Disponible avui&lt;/td&gt;
&lt;td&gt;Agrupa eines en un bundle reutilitzable&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;Disponible avui&lt;/td&gt;
&lt;td&gt;Un únic endpoint MCP exposa totes les eines&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;Pròximament&lt;/td&gt;
&lt;td&gt;Auth centralitzada + observabilitat en totes les crides&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="exemple-pràctic"&gt;Exemple pràctic&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 documentació i respon a issues de 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 documentació pública&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&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;Un cop publicat, Foundry et dona un endpoint unificat. Un punt de connexió, totes les eines.&lt;/p&gt;
&lt;h2 id="no-estàs-bloquejat-a-foundry-agents"&gt;No estàs bloquejat a Foundry Agents&lt;/h2&gt;
&lt;p&gt;Els Toolboxes es &lt;strong&gt;creen i gestionen&lt;/strong&gt; a Foundry, però la superfície de consum és el protocol MCP obert. Pots usar-los des d&amp;rsquo;agents personalitzats amb Microsoft Agent Framework o LangGraph, GitHub Copilot i qualsevol runtime que parli MCP.&lt;/p&gt;
&lt;h2 id="per-què-importa-ara"&gt;Per què importa ara&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;onada multi-agent està arribant a producció. Cada nou agent és una nova superfície per a configuració duplicada, credencials desfasades i comportament inconsistent. La base de Build + Consume és suficient per començar a centralitzar. Quan arribi el pilar Govern, tindràs una capa d&amp;rsquo;eines observable i controlada centralment per a tota la teva flota d&amp;rsquo;agents.&lt;/p&gt;
&lt;h2 id="conclusió"&gt;Conclusió&lt;/h2&gt;
&lt;p&gt;Això és aviat — preview pública, SDK Python primer. Però el model és sòlid i el disseny natiu MCP significa que funciona amb les eines que ja estàs construint. Fes una ullada a l&amp;rsquo;&lt;a href="https://devblogs.microsoft.com/foundry/introducing-toolboxes-in-foundry/"&gt;anunci oficial&lt;/a&gt; per començar.&lt;/p&gt;</content:encoded></item><item><title>Hooks d'azd en Python, TypeScript i .NET: adéu als scripts de shell</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/azd-hooks-python-javascript-typescript-dotnet/</guid><description>La CLI d'Azure Developer ara permet escriure hooks en Python, JavaScript, TypeScript o .NET. S'ha acabat canviar de context a Bash per executar un script de migració.</description><content:encoded>&lt;p&gt;&lt;em&gt;Aquesta publicació ha estat traduïda automàticament. Per a la versió original, &lt;a href="https://thedotnetblog.com/ca/posts/emiliano-montesdeoca/azd-hooks-python-javascript-typescript-dotnet/"&gt;feu clic aquí&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Si alguna vegada has tingut un projecte completament en .NET i tot i així has hagut d&amp;rsquo;escriure scripts Bash per als hooks d&amp;rsquo;azd, coneixes bé aquell dolor. Per què canviar a sintaxi de shell en un pas de pre-provisioning quan tota la resta del projecte és C#?&lt;/p&gt;
&lt;p&gt;Aquesta frustració té ara solució oficial. L&amp;rsquo;Azure Developer CLI &lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-multi-language-hooks/"&gt;acaba de llançar suport multi-llenguatge per a hooks&lt;/a&gt;, i és exactament tan bo com sona.&lt;/p&gt;
&lt;h2 id="hooks-breument"&gt;Hooks, breument&lt;/h2&gt;
&lt;p&gt;Els hooks són scripts que s&amp;rsquo;executen en punts clau del cicle de vida d&amp;rsquo;&lt;code&gt;azd&lt;/code&gt; — abans del provisioning, després del desplegament, i més. Es defineixen a &lt;code&gt;azure.yaml&lt;/code&gt; i permeten injectar lògica personalitzada sense modificar la CLI.&lt;/p&gt;
&lt;p&gt;Abans només s&amp;rsquo;admetien Bash i PowerShell. Ara pots usar &lt;strong&gt;Python, JavaScript, TypeScript o .NET&lt;/strong&gt; — i &lt;code&gt;azd&lt;/code&gt; s&amp;rsquo;encarrega de la resta automàticament.&lt;/p&gt;
&lt;h2 id="com-funciona-la-detecció"&gt;Com funciona la detecció&lt;/h2&gt;
&lt;p&gt;Simplement apuntes el hook a un fitxer i &lt;code&gt;azd&lt;/code&gt; infereix el llenguatge per l&amp;rsquo;extensió:&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;Sense configuració addicional. Si l&amp;rsquo;extensió és ambigua, pots afegir &lt;code&gt;kind: python&lt;/code&gt; (o el que correspongui) per especificar-ho explícitament.&lt;/p&gt;
&lt;h2 id="detalls-importants-per-llenguatge"&gt;Detalls importants per llenguatge&lt;/h2&gt;
&lt;h3 id="python"&gt;Python&lt;/h3&gt;
&lt;p&gt;Col·loca un &lt;code&gt;requirements.txt&lt;/code&gt; o &lt;code&gt;pyproject.toml&lt;/code&gt; al costat del script (o en qualsevol directori pare) i &lt;code&gt;azd&lt;/code&gt; crea un entorn virtual, instal·la dependències i executa l&amp;rsquo;script.&lt;/p&gt;
&lt;h3 id="javascript-i-typescript"&gt;JavaScript i TypeScript&lt;/h3&gt;
&lt;p&gt;El mateix patró — posa un &lt;code&gt;package.json&lt;/code&gt; a prop del script i &lt;code&gt;azd&lt;/code&gt; executarà &lt;code&gt;npm install&lt;/code&gt; primer. Per a TypeScript, usa &lt;code&gt;npx tsx&lt;/code&gt; sense pas de compilació ni &lt;code&gt;tsconfig.json&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="net"&gt;.NET&lt;/h3&gt;
&lt;p&gt;Dos modes disponibles:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Mode projecte&lt;/strong&gt;: Si hi ha un &lt;code&gt;.csproj&lt;/code&gt; al costat del script, &lt;code&gt;azd&lt;/code&gt; executa &lt;code&gt;dotnet restore&lt;/code&gt; i &lt;code&gt;dotnet build&lt;/code&gt; automàticament.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mode single-file&lt;/strong&gt;: En .NET 10+, pots posar un fitxer &lt;code&gt;.cs&lt;/code&gt; independent i s&amp;rsquo;executa directament amb &lt;code&gt;dotnet run script.cs&lt;/code&gt;. Sense fitxer de projecte.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="configuració-per-executor"&gt;Configuració per executor&lt;/h2&gt;
&lt;p&gt;Cada llenguatge admet un bloc &lt;code&gt;config&lt;/code&gt; opcional:&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="per-què-importa-per-a-desenvolupadors-net"&gt;Per què importa per a desenvolupadors .NET&lt;/h2&gt;
&lt;p&gt;Els hooks eren l&amp;rsquo;últim lloc d&amp;rsquo;un projecte basat en azd que t&amp;rsquo;obligava a usar un altre llenguatge. Ara tot el pipeline de desplegament pot viure en un sol llenguatge. Pots reutilitzar les teves utilitats .NET existents als hooks, referenciar llibreries compartides i evitar el manteniment de scripts de shell.&lt;/p&gt;
&lt;h2 id="conclusió"&gt;Conclusió&lt;/h2&gt;
&lt;p&gt;És un d&amp;rsquo;aquells canvis que semblen petits però que eliminen molta fricció del dia a dia amb azd. El suport multi-llenguatge per a hooks ja està disponible — consulta el &lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-multi-language-hooks/"&gt;post oficial&lt;/a&gt; per a la documentació completa.&lt;/p&gt;</content:encoded></item><item><title>Windows App Dev CLI v0.3: F5 des del terminal i automatització de UI per a agents</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/windows-app-dev-cli-v03-run-ui-automation/</guid><description>Windows App Development CLI v0.3 arriba amb winapp run per llançar i depurar des del terminal, winapp ui per a l'automatització de la interfície, i un paquet NuGet que fa funcionar dotnet run amb apps empaquetades.</description><content:encoded>&lt;p&gt;&lt;em&gt;Aquesta publicació ha estat traduïda automàticament. Per a la versió original, &lt;a href="https://thedotnetblog.com/ca/posts/emiliano-montesdeoca/windows-app-dev-cli-v03-run-ui-automation/"&gt;feu clic aquí&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;experiència F5 de Visual Studio és fantàstica. Però haver d&amp;rsquo;obrir VS només per llançar i depurar una app Windows empaquetada és excessiu quan estàs en un pipeline de CI, executant un workflow automatitzat, o quan un agent d&amp;rsquo;IA fa les proves.&lt;/p&gt;
&lt;p&gt;Windows App Development CLI v0.3 acaba de &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;sortir&lt;/a&gt; i ho aborda directament amb dues funcions destacades: &lt;code&gt;winapp run&lt;/code&gt; i &lt;code&gt;winapp ui&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="winapp-run-f5-des-de-qualsevol-lloc"&gt;winapp run: F5 des de qualsevol lloc&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;winapp run&lt;/code&gt; pren una carpeta d&amp;rsquo;app sense empaquetar i un manifest, i fa tot el que VS fa en un debug launch: registra un paquet loose, llança l&amp;rsquo;app i preserva el &lt;code&gt;LocalState&lt;/code&gt; entre re-deploys.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;winapp run ./bin/Debug
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Funciona per a WinUI, WPF, WinForms, Console, Avalonia i més. Els modes estan pensats per a developers i workflows automatitzats:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--detach&lt;/code&gt;&lt;/strong&gt;: Llança i retorna el control al terminal immediatament.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--unregister-on-exit&lt;/code&gt;&lt;/strong&gt;: Neteja el paquet registrat en tancar l&amp;rsquo;app.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--debug-output&lt;/code&gt;&lt;/strong&gt;: Captura missatges &lt;code&gt;OutputDebugString&lt;/code&gt; i excepcions en temps real.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="nou-paquet-nuget-dotnet-run-per-a-apps-empaquetades"&gt;Nou paquet NuGet: dotnet run per a apps empaquetades&lt;/h2&gt;
&lt;p&gt;Per a developers .NET hi ha un nou paquet NuGet: &lt;code&gt;Microsoft.Windows.SDK.BuildTools.WinApp&lt;/code&gt;. Afegeix-lo al projecte i &lt;code&gt;dotnet run&lt;/code&gt; gestiona tot l&amp;rsquo;inner loop: build, preparar un paquet loose-layout, registrar a Windows i llançar — tot en un pas.&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-des-de-la-línia-de-comandes"&gt;winapp ui: UI Automation des de la línia de comandes&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;winapp ui&lt;/code&gt; et dóna accés complet d&amp;rsquo;UI Automation a qualsevol app Windows en execució — WPF, WinForms, Win32, Electron, WinUI3. Pots llistar finestres, navegar l&amp;rsquo;arbre de UI Automation, trobar elements, fer clics, prendre captures de pantalla i esperar l&amp;rsquo;aparició d&amp;rsquo;elements.&lt;/p&gt;
&lt;p&gt;Combina &lt;code&gt;winapp ui&lt;/code&gt; amb &lt;code&gt;winapp run&lt;/code&gt; i tens un workflow complet build → llançar → verificar des del terminal. Un agent pot executar la teva app, inspeccionar l&amp;rsquo;estat de la UI i validar el resultat.&lt;/p&gt;
&lt;h2 id="altres-novetats"&gt;Altres novetats&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;winapp unregister&lt;/code&gt;&lt;/strong&gt;: Elimina un paquet sideloaded quan acabes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;winapp manifest add-alias&lt;/code&gt;&lt;/strong&gt;: Afegeix un àlies per llançar l&amp;rsquo;app per nom des del terminal.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tab completion&lt;/strong&gt;: Configura completat amb una sola comanda per a PowerShell.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="com-obtenir-ho"&gt;Com obtenir-ho&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;Consulta el &lt;a href="https://github.com/microsoft/WinAppCli"&gt;repositori a GitHub&lt;/a&gt; per a documentació completa i 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;anunci original&lt;/a&gt; per a tots els detalls.&lt;/p&gt;</content:encoded></item><item><title>azd + GitHub Copilot: Configuració de projecte amb IA i resolució intel·ligent d'errors</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/azd-copilot-integration-ai-setup-troubleshooting/</guid><description>L'Azure Developer CLI ara s'integra amb GitHub Copilot per generar la infraestructura del teu projecte i resoldre errors de desplegament — sense sortir del terminal.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Aquest article ha estat traduït automàticament. Per veure la versió original en anglès, &lt;a href="https://thedotnetblog.com/ca/posts/emiliano-montesdeoca/azd-copilot-integration-ai-setup-troubleshooting/"&gt;fes clic aquí&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Coneixes aquell moment en què vols desplegar una aplicació existent a Azure i et quedes mirant un &lt;code&gt;azure.yaml&lt;/code&gt; en blanc, intentant recordar si la teva API Express hauria d&amp;rsquo;usar Container Apps o App Service? Aquell moment acaba de ser molt més curt.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;Azure Developer CLI (&lt;code&gt;azd&lt;/code&gt;) ara s&amp;rsquo;integra amb GitHub Copilot de dues maneres concretes: scaffolding assistit per IA durant &lt;code&gt;azd init&lt;/code&gt;, i resolució intel·ligent d&amp;rsquo;errors quan els desplegaments fallen. Les dues funcions es queden completament al terminal — exactament on vull que siguin.&lt;/p&gt;
&lt;h2 id="configuració-amb-copilot-durant-azd-init"&gt;Configuració amb Copilot durant azd init&lt;/h2&gt;
&lt;p&gt;Quan executes &lt;code&gt;azd init&lt;/code&gt;, ara apareix l&amp;rsquo;opció &amp;ldquo;Set up with GitHub Copilot (Preview)&amp;rdquo;. Selecciona-la i Copilot analitza el teu codebase per generar l&amp;rsquo;&lt;code&gt;azure.yaml&lt;/code&gt;, les plantilles d&amp;rsquo;infraestructura i els mòduls Bicep — basant-se en el teu codi real.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;azd init
# Selecciona: &amp;#34;Set up with GitHub Copilot (Preview)&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Requisits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;azd 1.23.11 o superior&lt;/strong&gt; — comprova amb &lt;code&gt;azd version&lt;/code&gt; o actualitza amb &lt;code&gt;azd update&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Una subscripció activa de 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; demanarà login si cal&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;El que trobo genuïnament útil és que funciona en els dos sentits. Construint des de zero? Copilot t&amp;rsquo;ajuda a configurar els serveis Azure correctes des del principi. Tens una app existent que vols desplegar? Apunta Copilot cap a ella i genera la configuració sense haver de reestructurar res.&lt;/p&gt;
&lt;h3 id="el-que-fa-realment"&gt;El que fa realment&lt;/h3&gt;
&lt;p&gt;Imagina que tens una API Express en Node.js amb dependència de PostgreSQL. En lloc de decidir manualment entre Container Apps i App Service, i després escriure Bicep des de zero, Copilot detecta el teu stack i genera:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Un &lt;code&gt;azure.yaml&lt;/code&gt; amb els ajustaments correctes de &lt;code&gt;language&lt;/code&gt;, &lt;code&gt;host&lt;/code&gt; i &lt;code&gt;build&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Un mòdul Bicep per a Azure Container Apps&lt;/li&gt;
&lt;li&gt;Un mòdul Bicep per a Azure Database for PostgreSQL&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I fa comprovacions prèvies abans de tocar res — verifica que el teu directori git estigui net, demana consentiment per a les eines del servidor MCP. Res no passa sense que sàpigues exactament què canviarà.&lt;/p&gt;
&lt;h2 id="resolució-derrors-amb-copilot"&gt;Resolució d&amp;rsquo;errors amb Copilot&lt;/h2&gt;
&lt;p&gt;Els errors de desplegament són inevitables. Paràmetres que falten, problemes de permisos, disponibilitat de SKUs — i el missatge d&amp;rsquo;error rarament et diu l&amp;rsquo;única cosa que realment necessites saber: &lt;em&gt;com solucionar-ho&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Sense Copilot, el cicle és: copiar l&amp;rsquo;error → buscar als docs → llegir tres respostes irrellevants de Stack Overflow → executar alguns comandos &lt;code&gt;az&lt;/code&gt; CLI → tornar-ho a intentar i rezar. Amb Copilot integrat a &lt;code&gt;azd&lt;/code&gt;, aquest cicle s&amp;rsquo;esfondra. Quan qualsevol comandament &lt;code&gt;azd&lt;/code&gt; falla, ofereix immediatament quatre opcions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Explain&lt;/strong&gt; — descripció en llenguatge natural del que ha anat malament&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Guidance&lt;/strong&gt; — instruccions pas a pas per solucionar-ho&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Diagnose and Guide&lt;/strong&gt; — anàlisi completa + Copilot aplica la solució (amb la teva aprovació) + reintent opcional&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Skip&lt;/strong&gt; — gestionar-ho tu mateix&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;El punt clau: Copilot ja té context sobre el teu projecte, el comandament que ha fallat i la sortida de l&amp;rsquo;error. Les seves suggerències són específiques per a &lt;em&gt;la teva situació&lt;/em&gt;.&lt;/p&gt;
&lt;h3 id="configurar-un-comportament-predeterminat"&gt;Configurar un comportament predeterminat&lt;/h3&gt;
&lt;p&gt;Si sempre tries la mateixa opció, salta el prompt interactiu:&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;Valors: &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;. També pots habilitar auto-fix i reintent:&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;Torna al mode interactiu en qualsevol moment:&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="conclusió"&gt;Conclusió&lt;/h2&gt;
&lt;p&gt;Executa &lt;code&gt;azd update&lt;/code&gt; per obtenir la versió més recent i usa &lt;code&gt;azd init&lt;/code&gt; en el teu proper projecte. És exactament el tipus d&amp;rsquo;integració de Copilot que aporta valor real.&lt;/p&gt;
&lt;p&gt;Llegeix l&amp;rsquo;&lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-copilot-integration/"&gt;anunci original aquí&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Escrivint complements natius de Node.js en C# amb .NET Native AOT</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/nodejs-addons-csharp-native-aot/</guid><description>L'equip de C# Dev Kit va substituir els complements de Node.js en C++ per .NET Native AOT — el resultat és més net, més segur i només necessita el .NET SDK.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Aquest article ha estat traduït automàticament. Per a la versió original en anglès, &lt;a href="https://thedotnetblog.com/ca/posts/emiliano-montesdeoca/nodejs-addons-csharp-native-aot/"&gt;feu clic aquí&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Aquí teniu un escenari que m&amp;rsquo;encanta: un equip que treballa en eines .NET tenia complements natius de Node.js escrits en C++ i compilats amb &lt;code&gt;node-gyp&lt;/code&gt;. Funcionava. Però requeria que Python estigués instal·lat a la màquina de cada desenvolupador — una versió antiga de Python, per cert — només per compilar un paquet que ningú de l&amp;rsquo;equip tocaria mai directament.&lt;/p&gt;
&lt;p&gt;Llavors es van fer una pregunta molt raonable: ja tenim el .NET SDK instal·lat, per què estem escrivint C++ en absolut?&lt;/p&gt;
&lt;p&gt;La resposta va ser Native AOT, i el resultat és genuïnament elegant. Drew Noakes de l&amp;rsquo;equip de C# Dev Kit va descriure com ho van fer, i crec que val la pena entendre-ho fins i tot si no esteu creant extensions de VS Code.&lt;/p&gt;
&lt;h2 id="la-idea-bàsica"&gt;La idea bàsica&lt;/h2&gt;
&lt;p&gt;Un complement natiu de Node.js és una biblioteca compartida (&lt;code&gt;.dll&lt;/code&gt; a Windows, &lt;code&gt;.so&lt;/code&gt; a Linux, &lt;code&gt;.dylib&lt;/code&gt; a macOS) que Node.js pot carregar en temps d&amp;rsquo;execució. La interfície s&amp;rsquo;anomena &lt;a href="https://nodejs.org/api/n-api.html"&gt;N-API&lt;/a&gt; — una API C estable i compatible amb ABI. N-API no li importa quin idioma ha produït la biblioteca, només que exporti els símbols correctes.&lt;/p&gt;
&lt;p&gt;.NET Native AOT pot produir exactament això. Compila el vostre codi C# per endavant en una biblioteca compartida nativa amb punts d&amp;rsquo;entrada arbitraris. Aquest és tot el truc.&lt;/p&gt;
&lt;h2 id="la-configuració-del-projecte"&gt;La configuració del projecte&lt;/h2&gt;
&lt;p&gt;El fitxer de projecte és mínim:&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; és el que indica al SDK que produeixi una biblioteca compartida en &lt;code&gt;dotnet publish&lt;/code&gt;. &lt;code&gt;AllowUnsafeBlocks&lt;/code&gt; és necessari per a l&amp;rsquo;interoperabilitat N-API amb punters de funcions i buffers fixes.&lt;/p&gt;
&lt;h2 id="exportant-el-punt-dentrada"&gt;Exportant el punt d&amp;rsquo;entrada&lt;/h2&gt;
&lt;p&gt;Node.js espera que la vostra biblioteca exporti &lt;code&gt;napi_register_module_v1&lt;/code&gt;. En C#, &lt;code&gt;[UnmanagedCallersOnly]&lt;/code&gt; fa exactament això:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;[UnmanagedCallersOnly(
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt; EntryPoint = &amp;#34;napi_register_module_v1&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt; CallConvs = [typeof(CallConvCdecl)]&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="n"&gt;nint&lt;/span&gt; &lt;span class="n"&gt;Init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nint&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nint&lt;/span&gt; &lt;span class="n"&gt;exports&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Initialize&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;RegisterFunction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exports&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;readStringValue&amp;#34;&lt;/span&gt;&lt;span class="n"&gt;u8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;ReadStringValue&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;exports&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;nint&lt;/code&gt; és un enter de mida nativa. El sufix &lt;code&gt;u8&lt;/code&gt; produeix un &lt;code&gt;ReadOnlySpan&amp;lt;byte&amp;gt;&lt;/code&gt; amb un literal de cadena UTF-8, passat directament a N-API sense cap assignació d&amp;rsquo;encoding.&lt;/p&gt;
&lt;h2 id="resolent-n-api-contra-el-procés-amfitrió"&gt;Resolent N-API contra el procés amfitrió&lt;/h2&gt;
&lt;p&gt;Les funcions N-API les exporta &lt;code&gt;node.exe&lt;/code&gt; en si, no una biblioteca separada. Per tant, en lloc d&amp;rsquo;enllaçar contra alguna cosa, les resoleu contra el procés en execució a l&amp;rsquo;inici:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;NativeLibrary&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SetDllImportResolver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Reflection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Assembly&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetExecutingAssembly&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ResolveDllImport&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Amb això, les vostres declaracions P/Invoke funcionen neta:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;[LibraryImport(&amp;#34;node&amp;#34;, EntryPoint = &amp;#34;napi_create_string_utf8&amp;#34;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;internal&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;partial&lt;/span&gt; &lt;span class="n"&gt;Status&lt;/span&gt; &lt;span class="n"&gt;CreateStringUtf8&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;nint&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ReadOnlySpan&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nuint&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;out&lt;/span&gt; &lt;span class="n"&gt;nint&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="cridant-lo-des-de-typescript"&gt;Cridant-lo des de TypeScript&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;dotnet publish&lt;/code&gt; produeix la vostra biblioteca nativa específica de la plataforma. La canvieu de nom a &lt;code&gt;.node&lt;/code&gt; i l&amp;rsquo;useu amb un &lt;code&gt;require()&lt;/code&gt; estàndard:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;registry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kr"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;./native/win32-x64/RegistryAddon.node&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kr"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;RegistryAddon&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sdkPath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;registry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;readStringValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;SOFTWARE\\dotnet\\Setup\\InstalledVersions\\x64\\sdk&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;InstallLocation&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Això és tot. TypeScript cap a C#, sense Python, sense C++.&lt;/p&gt;
&lt;h2 id="conclusions"&gt;Conclusions&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;equip de C# Dev Kit va substituir la sobrecàrrega de Python/C++ amb codi C# net que tothom a l&amp;rsquo;equip ja sap com escriure i depurar. El patró no és complicat un cop el veieu, i és un gran exemple de Native AOT resolent un problema real del qual no es parla prou.&lt;/p&gt;
&lt;p&gt;Llegiu la &lt;a href="https://devblogs.microsoft.com/dotnet/writing-nodejs-addons-with-dotnet-native-aot/"&gt;publicació original al blog de .NET&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>VS Code 1.117: Els agents s'estan guanyant les seves pròpies branques Git i això m'encanta</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/vscode-1-117-agents-autopilot-worktrees/</guid><description>VS Code 1.117 incorpora aïllament de worktrees per a sessions d'agents, mode Autopilot persistent i suport per a subagents. El flux de treball de codificació agentica acaba de fer un salt seriós.</description><content:encoded>&lt;p&gt;La línia entre &amp;ldquo;assistència IA&amp;rdquo; i &amp;ldquo;company de feina IA&amp;rdquo; cada cop és més fina. VS Code 1.117 acaba d&amp;rsquo;arribar i les &lt;a href="https://code.visualstudio.com/updates/v1_117"&gt;notes completes de la versió&lt;/a&gt; venen carregades, però el missatge és clar: els agents s&amp;rsquo;estan convertint en ciutadans de primera classe del teu flux de treball de desenvolupament.&lt;/p&gt;
&lt;p&gt;Això és el que realment importa.&lt;/p&gt;
&lt;h2 id="el-mode-autopilot-finalment-recorda-la-teva-preferència"&gt;El mode Autopilot finalment recorda la teva preferència&lt;/h2&gt;
&lt;p&gt;Abans, havies de reactivar Autopilot cada vegada que començaves una sessió nova. Molest. Ara el teu mode de permisos es manté entre sessions i pots configurar el valor per defecte.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;Agent Host admet tres configuracions de sessió:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Per defecte&lt;/strong&gt; — les eines demanen confirmació abans d&amp;rsquo;executar-se&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bypass&lt;/strong&gt; — aprova automàticament tot&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Autopilot&lt;/strong&gt; — totalment autònom, respon les seves pròpies preguntes i continua fins que la tasca s&amp;rsquo;acaba&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si estàs preparant un projecte .NET nou amb migracions, Docker i CI, configura-ho una vegada en mode Autopilot i oblida-t&amp;rsquo;en. Aquesta preferència es manté.&lt;/p&gt;
&lt;h2 id="aïllament-de-worktree-i-git-per-a-sessions-dagents"&gt;Aïllament de worktree i Git per a sessions d&amp;rsquo;agents&lt;/h2&gt;
&lt;p&gt;Aquesta és la gran novetat. Les sessions d&amp;rsquo;agents ara admeten un aïllament complet de worktree i Git. Això vol dir que, quan un agent treballa en una tasca, obté la seva pròpia branca i el seu propi directori de treball. La teva branca principal queda intacta.&lt;/p&gt;
&lt;p&gt;I encara millor: Copilot CLI genera noms de branca significatius per a aquestes sessions de worktree. Res de &lt;code&gt;agent-session-abc123&lt;/code&gt;. Obtens alguna cosa que realment descriu el que l&amp;rsquo;agent està fent.&lt;/p&gt;
&lt;p&gt;Per als desenvolupadors .NET que treballen amb diverses branques de funcionalitat o arreglen errors mentre corre una tasca llarga d&amp;rsquo;esqueletatge de projecte, això canvia les regles del joc. Pots tenir un agent construint els controladors de l&amp;rsquo;API en un worktree mentre tu depures un problema a la capa de serveis en un altre. Sense conflictes. Sense &lt;code&gt;stash&lt;/code&gt;. Sense embolics.&lt;/p&gt;
&lt;h2 id="subagents-i-equips-dagents"&gt;Subagents i equips d&amp;rsquo;agents&lt;/h2&gt;
&lt;p&gt;El protocol Agent Host ara admet subagents. Un agent pot engegar altres agents per encarregar-los parts d&amp;rsquo;una tasca. Pensa-ho com delegar: el teu agent principal coordina i els agents especialitzats fan les peces concretes.&lt;/p&gt;
&lt;p&gt;Això encara és una funcionalitat inicial, però el potencial per als fluxos de treball .NET és evident. Imagina un agent gestionant les teves migracions d&amp;rsquo;EF Core mentre un altre prepara els tests d&amp;rsquo;integració. Encara no hi som del tot, però el suport al protocol que arriba ara farà que les eines segueixin ràpidament.&lt;/p&gt;
&lt;h2 id="la-sortida-del-terminal-sinclou-automàticament-quan-els-agents-envien-entrada"&gt;La sortida del terminal s&amp;rsquo;inclou automàticament quan els agents envien entrada&lt;/h2&gt;
&lt;p&gt;Petita, però important. Quan un agent envia entrada al terminal, la sortida del terminal s&amp;rsquo;inclou automàticament al context. Abans, l&amp;rsquo;agent havia de fer un torn extra només per llegir què havia passat.&lt;/p&gt;
&lt;p&gt;Si mai has vist un agent executar &lt;code&gt;dotnet build&lt;/code&gt;, fallar i després fer una altra ronda només per llegir l&amp;rsquo;error, aquesta fricció desapareix. Ho veu de seguida i reacciona.&lt;/p&gt;
&lt;h2 id="lapp-dagents-sactualitza-sola-a-macos"&gt;L&amp;rsquo;app d&amp;rsquo;Agents s&amp;rsquo;actualitza sola a macOS&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;aplicació d&amp;rsquo;Agents independent per a macOS ara s&amp;rsquo;actualitza sola. Ja no cal descarregar noves versions manualment. Simplement es manté al dia.&lt;/p&gt;
&lt;h2 id="el-que-val-la-pena-saber-de-la-resta"&gt;El que val la pena saber de la resta&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Els hovers de package.json&lt;/strong&gt; ara mostren tant la versió instal·lada com la més recent. Útil si gestiones eines npm al costat dels teus projectes .NET.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Les imatges als comentaris JSDoc&lt;/strong&gt; es renderitzen correctament als hovers i a les completes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Les sessions de Copilot CLI&lt;/strong&gt; ara indiquen si s&amp;rsquo;han creat des de VS Code o externament, cosa útil quan saltes entre terminals.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Copilot CLI, Claude Code i Gemini CLI&lt;/strong&gt; es reconeixen com a tipus de shell. L&amp;rsquo;editor sap què estàs executant.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="la-conclusió"&gt;La conclusió&lt;/h2&gt;
&lt;p&gt;VS Code 1.117 no és un llançament ple de funcions espectaculars. És infraestructura. L&amp;rsquo;aïllament de worktrees, els permisos persistents i els protocols de subagents són els blocs de construcció d&amp;rsquo;un flux de treball on els agents gestionen tasques reals en paral·lel sense trepitjar-se el codi.&lt;/p&gt;
&lt;p&gt;Si estàs construint amb .NET i encara no t&amp;rsquo;has llançat al flux de treball agentic, sincerament, ara és el moment de començar.&lt;/p&gt;</content:encoded></item><item><title>Els vostres experiments d'IA a Azure estan cremant diners: aquí teniu com solucionar-ho</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/cloud-cost-optimization-ai-workloads-azure/</guid><description>Les càrregues de treball d'IA a Azure poden ser cares ràpidament. Parlem del que realment funciona per mantenir els costos sota control sense frenar el vostre desenvolupament.</description><content:encoded>&lt;p&gt;Si esteu creant aplicacions amb intel·ligència artificial a Azure en aquest moment, probablement heu notat alguna cosa: la vostra factura al núvol sembla diferent del que abans. No només més alt, sinó més estrany. Espinós. Difícil de predir.&lt;/p&gt;
&lt;p&gt;Microsoft acaba de publicar un article fantàstic sobre &lt;a href="https://azure.microsoft.com/en-us/blog/cloud-cost-optimization-principles-that-still-matter/"&gt;principis d&amp;rsquo;optimització de costos del núvol que encara importen&lt;/a&gt;, i sincerament, el moment no podria ser millor. Perquè les càrregues de treball d&amp;rsquo;IA han canviat el joc pel que fa als costos.&lt;/p&gt;
&lt;h2 id="per-què-les-càrregues-de-treball-dia-són-diferents"&gt;Per què les càrregues de treball d&amp;rsquo;IA són diferents&lt;/h2&gt;
&lt;p&gt;Aquí està la cosa. Les càrregues de treball.NET tradicionals són relativament previsibles. Coneixeu el vostre nivell de servei d&amp;rsquo;aplicacions, coneixeu les vostres DTU SQL, podeu estimar la despesa mensual amb força precisió. Càrregues de treball d&amp;rsquo;IA? No tant.&lt;/p&gt;
&lt;p&gt;Esteu provant diversos models per veure quin s&amp;rsquo;adapta. Esteu creant una infraestructura recolzada per la GPU per ajustar-la. Esteu fent trucades a l&amp;rsquo;API a Azure OpenAI, on el consum de testimoni varia enormement depenent de la durada del missatge i del comportament de l&amp;rsquo;usuari. Cada experiment costa diners reals i podeu executar-ne desenes abans d&amp;rsquo;aconseguir l&amp;rsquo;enfocament correcte.&lt;/p&gt;
&lt;p&gt;Aquesta impredictibilitat és el que fa que l&amp;rsquo;optimització de costos sigui crítica, no com una idea posterior, sinó des del primer dia.&lt;/p&gt;
&lt;h2 id="gestió-vs-optimització-coneixeu-la-diferència"&gt;Gestió vs. optimització: coneixeu la diferència&lt;/h2&gt;
&lt;p&gt;Una distinció de l&amp;rsquo;article que crec que els desenvolupadors passen per alt: hi ha una diferència entre &lt;em&gt;gestió&lt;/em&gt; de costos i &lt;em&gt;optimització&lt;/em&gt; de costos.&lt;/p&gt;
&lt;p&gt;La gestió és el seguiment i la presentació d&amp;rsquo;informes. Configureu pressupostos a Azure Cost Management, rebeu alertes i veureu taulers de control. Això són apostes de taula.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;optimització és on realment es prenen decisions. Realment necessiteu aquest nivell S3 o S1 gestionaria la vostra càrrega? Aquesta instància informàtica sempre activa està inactiva els caps de setmana? Podríeu utilitzar instàncies puntuals per als vostres treballs de formació?&lt;/p&gt;
&lt;p&gt;Com a desenvolupadors de.NET, tendim a centrar-nos en el codi i deixar les decisions sobre la infraestructura a &amp;ldquo;l&amp;rsquo;equip d&amp;rsquo;operacions&amp;rdquo;. Però si esteu implementant a Azure, aquestes decisions també són les vostres.&lt;/p&gt;
&lt;h2 id="el-que-realment-funciona"&gt;El que realment funciona&lt;/h2&gt;
&lt;p&gt;A partir de l&amp;rsquo;article i de la meva pròpia experiència, aquí teniu el que mou l&amp;rsquo;agulla:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Coneix el que gastes i on.&lt;/strong&gt; Etiqueta els teus recursos. De debò. Si no sabeu quin projecte o experiment s&amp;rsquo;està consumint el vostre pressupost, no podeu optimitzar res. Azure Cost Management amb l&amp;rsquo;etiquetatge adequat és el vostre millor amic.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Configureu baranes abans d&amp;rsquo;experimentar.&lt;/strong&gt; Utilitzeu la política d&amp;rsquo;Azure per restringir les SKU cares en entorns de desenvolupament/prova. Establiu límits de despesa als vostres desplegaments d&amp;rsquo;Azure OpenAI. No espereu fins que arribi la factura per adonar-vos que algú va deixar un clúster de GPU en funcionament durant el cap de setmana.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mida correctament contínuament.&lt;/strong&gt; Aquesta màquina virtual que vau triar durant la creació de prototips? Probablement és incorrecte per a la producció. Azure Advisor us ofereix recomanacions; mireu-les. Revisió mensual, no anual.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Penseu en el cicle de vida.&lt;/strong&gt; Els recursos per a desenvolupadors haurien de baixar. Els entorns de prova no cal que funcionin les 24 hores del dia. Utilitzeu polítiques d&amp;rsquo;apagada automàtica. Específicament, per a les càrregues de treball d&amp;rsquo;IA, tingueu en compte les opcions sense servidor on pagueu per execució en lloc de mantenir el càlcul calent.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mesura el valor, no només el cost.&lt;/strong&gt; Aquest és fàcil d&amp;rsquo;oblidar. Un model que costa més però que ofereix resultats significativament millors podria ser la trucada adequada. L&amp;rsquo;objectiu no és gastar el mínim, sinó gastar intel·ligentment.&lt;/p&gt;
&lt;h2 id="el-menjar-per-emportar"&gt;El menjar per emportar&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;optimització de costos del núvol no és una neteja puntual. És un hàbit. I amb les càrregues de treball d&amp;rsquo;IA que fan que la despesa sigui menys predictible que mai, construir aquest hàbit aviat us estalvia de sorpreses doloroses més tard.&lt;/p&gt;
&lt;p&gt;Si sou un desenvolupador de.NET que es basa en Azure, comenceu a tractar la vostra factura al núvol com si tracteu el codi: reviseu-lo regularment, refactoritzeu-lo quan estigui desordenat i mai no ho feu sense entendre el que us costarà.&lt;/p&gt;</content:encoded></item><item><title>L'RFT de Foundry s'ha tornat més barat i intel·ligent: això és el que ha canviat</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/foundry-fine-tuning-april-2026-rft-graders/</guid><description>Microsoft Foundry va enviar tres actualitzacions de RFT aquest mes: formació global per a o4-mini, nous gradadors de models GPT-4.1 i una guia de bones pràctiques que us estalviarà hores de depuració.</description><content:encoded>&lt;p&gt;Si esteu creant aplicacions.NET que es basen en models afinats, val la pena prestar atenció a les actualitzacions de Foundry d&amp;rsquo;aquest mes. L&amp;rsquo;afinació del reforç acaba de ser més accessible i molt més barata.&lt;/p&gt;
&lt;p&gt;Els detalls complets es troben a l&amp;rsquo;&lt;a href="https://devblogs.microsoft.com/foundry/whats-new-in-foundry-finetune-april-2026/"&gt;anunci oficial&lt;/a&gt;, però aquí teniu el desglossament pràctic.&lt;/p&gt;
&lt;h2 id="formació-global-per-a-o4-mini"&gt;Formació global per a o4-mini&lt;/h2&gt;
&lt;p&gt;o4-mini és el model de referència per a càrregues de treball pesades i de raonament. La gran notícia: ara podeu llançar treballs d&amp;rsquo;ajustament de més de 13 regions Azure amb taxes d&amp;rsquo;entrenament per testimoni més baixes en comparació amb la formació estàndard. Mateixa infraestructura, mateixa qualitat, abast més ampli.&lt;/p&gt;
&lt;p&gt;Si el vostre equip està repartit per geografies, això és important. Ja no estàs fixat a un grapat de regions per entrenar.&lt;/p&gt;
&lt;p&gt;Aquí teniu la crida a l&amp;rsquo;API REST per iniciar una feina de formació global:&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;Aquesta bandera &lt;code&gt;trainingType: globalstandard&lt;/code&gt; és la diferència clau.&lt;/p&gt;
&lt;h2 id="nou-model-de-classificadors-família-gpt-41"&gt;Nou model de classificadors: família GPT-4.1&lt;/h2&gt;
&lt;p&gt;Els qualificadors defineixen el senyal de recompensa amb el qual optimitza el vostre model. Fins ara, els qualificadors basats en models es limitaven a un conjunt més petit de models. Ara teniu tres opcions noves: GPT-4.1, GPT-4.1-mini i GPT-4.1-nano.&lt;/p&gt;
&lt;p&gt;Quan hauríeu d&amp;rsquo;aconseguir els qualificadors model en lloc dels deterministes? Quan la sortida de la vostra tasca és oberta, quan necessiteu una puntuació de crèdit parcial en diverses dimensions o quan esteu creant fluxos de treball agents on la correcció de la trucada d&amp;rsquo;eines depèn del context semàntic.&lt;/p&gt;
&lt;p&gt;Aquesta és la qüestió: l&amp;rsquo;estratègia de classificació és pràctica:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GPT-4.1-nano&lt;/strong&gt; per a les iteracions inicials. Bucles de retroalimentació ràpids i de baix cost.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPT-4.1-mini&lt;/strong&gt; un cop la rúbrica de qualificació sigui estable i necessiteu una fidelitat més alta.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPT-4.1&lt;/strong&gt; per a la qualificació de la producció o rúbriques complexes on cada decisió de puntuació compta.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Fins i tot podeu barrejar tipus de classificador en un sol treball RFT. Utilitzeu string-match per a la dimensió &amp;ldquo;resposta correcta&amp;rdquo; i un model de qualificació per avaluar la qualitat del raonament. Aquesta flexibilitat és sincerament el que fa que sigui útil per a càrregues de treball reals.&lt;/p&gt;
&lt;h2 id="el-format-de-dades-de-rft-es-troba"&gt;El format de dades de RFT es troba&lt;/h2&gt;
&lt;p&gt;Això fa ensorrar la gent. El format de dades RFT és diferent de SFT. L&amp;rsquo;últim missatge de cada fila ha de ser una funció d&amp;rsquo;usuari o de desenvolupador, no d&amp;rsquo;assistent. La resposta esperada va en una clau de nivell superior com &lt;code&gt;reference_answer&lt;/code&gt; que el qualificador fa referència directament.&lt;/p&gt;
&lt;p&gt;Si heu estat fent un ajustament supervisat i voleu canviar a RFT, heu de reestructurar les vostres dades d&amp;rsquo;entrenament. No us salteu aquest pas o els vostres treballs fallaran en silenci.&lt;/p&gt;
&lt;h2 id="per-què-això-és-important-per-als-desenvolupadors-denet"&gt;Per què això és important per als desenvolupadors de.NET&lt;/h2&gt;
&lt;p&gt;Si truqueu a models ajustats des de les vostres aplicacions.NET mitjançant l&amp;rsquo;SDK d&amp;rsquo;Azure OpenAI, una formació més barata significa que podeu repetir de manera més agressiva. Les opcions de classificació del model us permeten ajustar amb precisió les tasques matisades, no només escenaris de concordança exacta. I la guia de bones pràctiques a &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; us estalviarà temps real de depuració.&lt;/p&gt;
&lt;p&gt;Comença petit. De deu a cent mostres. Avaluador simple. Valida el bucle. Després escala.&lt;/p&gt;</content:encoded></item><item><title>Deixeu de fer de cangur al vostre terminal: el mode desconnectat d'Aspire canvia el flux de treball</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/aspire-detached-mode-free-your-terminal/</guid><description>Aspire 13.2 us permet executar el vostre AppHost en segon pla i recuperar el vostre terminal. Combinat amb les noves ordres de la CLI i el suport d'agents, això és més gran del que sembla.</description><content:encoded>&lt;p&gt;Cada vegada que executeu un Aspire AppHost, el vostre terminal desapareixerà. Tancat. Ocupat fins que en feu Ctrl+C. Necessites executar una comanda ràpida? Obre una altra pestanya. Voleu comprovar els registres? Una altra pestanya. És una petita fricció que s&amp;rsquo;acumula ràpidament.&lt;/p&gt;
&lt;p&gt;Aspire 13.2 soluciona això. James Newton-King &lt;a href="https://devblogs.microsoft.com/aspire/aspire-detached-mode-and-process-management/"&gt;va escriure tots els detalls&lt;/a&gt;, i sincerament, aquesta és una d&amp;rsquo;aquestes característiques que canvia immediatament la manera de treballar.&lt;/p&gt;
&lt;h2 id="mode-desconnectat-una-comanda-terminal-enrere"&gt;Mode desconnectat: una comanda, terminal enrere&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;Aquesta és l&amp;rsquo;abreviatura de &lt;code&gt;aspire run --detach&lt;/code&gt;. El vostre AppHost s&amp;rsquo;inicia en segon pla i recupereu el terminal immediatament. Sense pestanyes addicionals. Sense multiplexor de terminals. Només la teva indicació, llest per començar.&lt;/p&gt;
&lt;h2 id="gestionant-el-que-sestà-executant"&gt;Gestionant el que s&amp;rsquo;està executant&lt;/h2&gt;
&lt;p&gt;Aquesta és la qüestió: executar-se en segon pla només és útil si realment podeu gestionar el que hi ha. Aspire 13.2 ofereix un conjunt complet d&amp;rsquo;ordres CLI per exactament això:&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;Això converteix l&amp;rsquo;Aspire CLI en un gestor de processos adequat. Podeu iniciar diversos AppHosts, comprovar el seu estat, seguir els seus registres i tancar-los, tot des d&amp;rsquo;una única sessió de terminal.&lt;/p&gt;
&lt;h2 id="combina-ho-amb-el-mode-aïllat"&gt;Combina-ho amb el mode aïllat&lt;/h2&gt;
&lt;p&gt;El mode separat es combina de manera natural amb el mode aïllat. Voleu executar dues instàncies del mateix projecte en segon pla sense conflictes de ports?&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;Cadascun obté ports aleatoris, secrets separats i el seu propi cicle de vida. Utilitzeu &lt;code&gt;aspire ps&lt;/code&gt; per veure tots dos, &lt;code&gt;aspire stop&lt;/code&gt; per matar el que hàgiu acabat.&lt;/p&gt;
&lt;h2 id="per-què-això-és-enorme-per-als-agents-de-codificació"&gt;Per què això és enorme per als agents de codificació&lt;/h2&gt;
&lt;p&gt;Aquí és on es posa realment interessant. Un agent de codificació que treballa al vostre terminal ara pot:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Inicieu l&amp;rsquo;aplicació amb &lt;code&gt;aspire start&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Consulta el seu estat amb &lt;code&gt;aspire describe&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Comproveu els registres amb &lt;code&gt;aspire logs&lt;/code&gt; per diagnosticar problemes&lt;/li&gt;
&lt;li&gt;Atureu-ho amb &lt;code&gt;aspire stop&lt;/code&gt; quan estigui acabat&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Tot sense perdre la sessió del terminal. Abans del mode desconnectat, un agent que executava el vostre AppHost es bloquejaria fora del seu propi terminal. Ara pot començar, observar, iterar i netejar, exactament com voldríeu que funcionés un agent autònom.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;equip d&amp;rsquo;Aspire es va inclinar en això. L&amp;rsquo;execució de &lt;code&gt;aspire agent init&lt;/code&gt; configura un fitxer d&amp;rsquo;habilitats d&amp;rsquo;Aspire que ensenya als agents aquestes ordres. Així, eines com l&amp;rsquo;agent de codificació de Copilot poden gestionar les vostres càrregues de treball d&amp;rsquo;Aspire des de la caixa.&lt;/p&gt;
&lt;h2 id="tancant"&gt;Tancant&lt;/h2&gt;
&lt;p&gt;El mode desconnectat és una actualització del flux de treball disfressada com una simple bandera. Atureu el canvi de context entre terminals, els agents deixen de bloquejar-se i les noves ordres CLI us ofereixen una visibilitat real del que s&amp;rsquo;està executant. És pràctic, és net i fa que el cicle de desenvolupament diari sigui notablement més suau.&lt;/p&gt;
&lt;p&gt;Llegiu la &lt;a href="https://devblogs.microsoft.com/aspire/aspire-detached-mode-and-process-management/"&gt;publicació completa&lt;/a&gt; per obtenir tots els detalls i agafeu Aspire 13.2 amb &lt;code&gt;aspire update --self&lt;/code&gt;.&lt;/p&gt;</content:encoded></item><item><title>Docker Sandbox permet als agents Copilot refactoritzar el vostre codi sense posar en risc la vostra màquina</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/copilot-docker-sandbox-agentic-refactoring/</guid><description>Docker Sandbox ofereix als agents de GitHub Copilot una microVM segura per funcionar amb refactorització: sense sol·licituds de permís, sense risc per al vostre amfitrió. Heus aquí per què això ho canvia tot per a la modernització de.NET a gran escala.</description><content:encoded>&lt;p&gt;Si heu utilitzat el mode d&amp;rsquo;agent de Copilot per a qualsevol cosa més enllà de petites edicions, coneixeu el dolor. Cada escriptura de fitxers, cada ordre del terminal: un altre indicador de permís. Ara imagineu-ho fent servir 50 projectes. No és divertit.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;equip d&amp;rsquo;Azure acaba de publicar una publicació sobre &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 for GitHub Copilot agents&lt;/a&gt;, i sincerament, aquesta és una de les millores d&amp;rsquo;eines d&amp;rsquo;agents més pràctiques que he vist. Utilitza microVMs per oferir a Copilot un entorn totalment aïllat on es pot desenredar: instal·lar paquets, executar compilacions, executar proves, sense tocar el vostre sistema amfitrió.&lt;/p&gt;
&lt;h2 id="què-us-ofereix-realment-docker-sandbox"&gt;Què us ofereix realment Docker Sandbox&lt;/h2&gt;
&lt;p&gt;La idea bàsica és senzilla: engegueu una microVM lleugera amb un entorn Linux complet, sincronitzeu-hi el vostre espai de treball i deixeu que l&amp;rsquo;agent Copilot operi lliurement a l&amp;rsquo;interior. Quan s&amp;rsquo;hagi acabat, torna a canviar la sincronització.&lt;/p&gt;
&lt;p&gt;Això és el que fa que sigui més que &amp;ldquo;executar coses en un contenidor&amp;rdquo;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sincronització bidireccional de l&amp;rsquo;espai de treball&lt;/strong&gt; que conserva camins absoluts. L&amp;rsquo;estructura del vostre projecte sembla idèntica dins del sandbox. No hi ha errors de compilació relacionats amb el camí.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dimoni Docker privat&lt;/strong&gt; que s&amp;rsquo;executa dins de la microVM. L&amp;rsquo;agent pot construir i executar contenidors sense muntar mai el sòcol Docker del vostre host. Això és un gran problema per a la seguretat.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Proxis de filtratge HTTP/HTTPS&lt;/strong&gt; que controlen a què pot arribar l&amp;rsquo;agent a la xarxa. Tu decideixes quins registres i punts finals es permeten. Atacs a la cadena de subministrament d&amp;rsquo;un canalla &lt;code&gt;npm install&lt;/code&gt; dins del sandbox? Bloquejat.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mode YOLO&lt;/strong&gt; — sí, així l&amp;rsquo;anomenen. L&amp;rsquo;agent s&amp;rsquo;executa sense sol·licituds de permís perquè literalment no pot danyar el vostre amfitrió. Tota acció destructiva està continguda.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="per-què-els-desenvolupadorsnet-haurien-de-preocupar-se"&gt;Per què els desenvolupadors.NET haurien de preocupar-se&lt;/h2&gt;
&lt;p&gt;Penseu en el treball de modernització que tants equips s&amp;rsquo;enfronten ara mateix. Teniu una solució.NET Framework amb 30 projectes i l&amp;rsquo;heu de traslladar a.NET 9. Això són centenars de canvis de fitxers: fitxers de projecte, actualitzacions d&amp;rsquo;espais de noms, substitucions d&amp;rsquo;API, migracions NuGet.&lt;/p&gt;
&lt;p&gt;Amb Docker Sandbox, podeu apuntar un agent Copilot a un projecte, deixar-lo refactoritzar lliurement dins de la microVM, executar &lt;code&gt;dotnet build&lt;/code&gt; i &lt;code&gt;dotnet test&lt;/code&gt; per validar i acceptar només els canvis que funcionen realment. No hi ha cap risc que accidentalment destrueixi el vostre entorn de desenvolupament local mentre experimenteu.&lt;/p&gt;
&lt;p&gt;La publicació també descriu l&amp;rsquo;execució d&amp;rsquo;una &lt;strong&gt;flota d&amp;rsquo;agents paral·lels&lt;/strong&gt;, cadascun en el seu propi sandbox, abordant diferents projectes simultàniament. Per a grans solucions.NET o arquitectures de microserveis, això suposa un estalvi de temps enorme. Un agent per servei, tots en funcionament aïllat, tots validats de manera independent.&lt;/p&gt;
&lt;h2 id="langle-de-seguretat-és-important"&gt;L&amp;rsquo;angle de seguretat és important&lt;/h2&gt;
&lt;p&gt;Això és el que la majoria de la gent passa per alt: quan deixeu que un agent d&amp;rsquo;IA executi ordres arbitràries, hi confieu amb tota la vostra màquina. Docker Sandbox canvia aquest model. L&amp;rsquo;agent obté total autonomia dins d&amp;rsquo;un entorn d&amp;rsquo;ús. El servidor intermediari de xarxa garanteix que només es pot extreure de fonts aprovades. El vostre sistema de fitxers amfitrió, el dimoni Docker i les credencials no es toquen.&lt;/p&gt;
&lt;p&gt;Per als equips amb requisits de compliment, i això és la majoria de les botigues.NET empresarials, aquesta és la diferència entre &amp;ldquo;no podem utilitzar IA agència&amp;rdquo; i &amp;ldquo;podem adoptar-la de manera segura&amp;rdquo;.&lt;/p&gt;
&lt;h2 id="per-emportar"&gt;Per emportar&lt;/h2&gt;
&lt;p&gt;Docker Sandbox resol la tensió fonamental de la codificació agentica: els agents necessiten llibertat per ser útils, però la llibertat a la vostra màquina amfitriona és perillosa. Les microVM us ofereixen tots dos. Si esteu planejant qualsevol refactorització o modernització de.NET a gran escala, val la pena configurar-la ara. La combinació de la intel·ligència de codi de Copilot amb un entorn d&amp;rsquo;execució segur és exactament el que els equips de producció estaven esperant.&lt;/p&gt;</content:encoded></item><item><title>El clúster de pins finalment arriba als mapes.NET MAUI: una propietat, zero dolor</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/maui-maps-pin-clustering-finally/</guid><description>.NET MAUI 11 Preview 3 afegeix un clúster de pins natius al control de mapa. Una propietat, grups d'agrupament separats i gestió de tocs, tot integrat.</description><content:encoded>&lt;p&gt;Coneixes aquell moment en què carregues un mapa amb cent agulles i tot es converteix en una taca il·legible? Sí, aquesta ha estat l&amp;rsquo;experiència de.NET MAUI Maps fins ara. No més.&lt;/p&gt;
&lt;p&gt;David Ortinau &lt;a href="https://devblogs.microsoft.com/dotnet/pin-clustering-in-dotnet-maui-maps/"&gt;acaba d&amp;rsquo;anunciar&lt;/a&gt; que.NET MAUI 11 Preview 3 inclou pins agrupats fora de la caixa a Android i iOS/Mac Catalyst. I la millor part: activar-lo és ridículament senzill.&lt;/p&gt;
&lt;h2 id="una-propietat-per-governar-les-totes"&gt;Una propietat per governar-les totes&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;Això és tot. Els pins propers s&amp;rsquo;agrupen en grups amb una insígnia de recompte. Apropa i s&amp;rsquo;amplien. Allunya el zoom i es col·lapsen. El tipus de comportament que els usuaris esperen de qualsevol mapa modern, i ara ho obteniu amb una única propietat.&lt;/p&gt;
&lt;h2 id="grups-de-agrupació-independents"&gt;Grups de agrupació independents&lt;/h2&gt;
&lt;p&gt;Aquí és on es posa interessant. No tots els pins s&amp;rsquo;han d&amp;rsquo;agrupar. Les cafeteries i els parcs són coses diferents, i el vostre mapa ho hauria de saber.&lt;/p&gt;
&lt;p&gt;La propietat &lt;code&gt;ClusteringIdentifier&lt;/code&gt; us permet separar els pins en grups independents:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Pins&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Pin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Label&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Pike Place Coffee&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Location&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Location&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;47.6097&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="m"&gt;122.3331&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ClusteringIdentifier&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;coffee&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Pins&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Pin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Label&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Occidental Square&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Location&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Location&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;47.6064&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="m"&gt;122.3325&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ClusteringIdentifier&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;parks&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pins amb el mateix grup d&amp;rsquo;identificadors junts. Els diferents identificadors formen clústers independents fins i tot quan estan geogràficament propers. Sense identificador? Grup per defecte. Net i previsible.&lt;/p&gt;
&lt;h2 id="gestió-de-les-aixetes-de-clúster"&gt;Gestió de les aixetes de clúster&lt;/h2&gt;
&lt;p&gt;Quan un usuari toca un clúster, obteniu un esdeveniment &lt;code&gt;ClusterClicked&lt;/code&gt; amb tot el que necessiteu:&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;Els arguments de l&amp;rsquo;esdeveniment us proporcionen &lt;code&gt;Pins&lt;/code&gt; (els pins del clúster), &lt;code&gt;Location&lt;/code&gt; (el centre geogràfic) i &lt;code&gt;Handled&lt;/code&gt; (establert a &lt;code&gt;true&lt;/code&gt; si voleu anul·lar el zoom predeterminat). Senzill, pràctic, exactament el que esperaries.&lt;/p&gt;
&lt;h2 id="val-la-pena-conèixer-els-detalls-de-la-plataforma"&gt;Val la pena conèixer els detalls de la plataforma&lt;/h2&gt;
&lt;p&gt;A Android, la agrupació en clúster utilitza un algorisme personalitzat basat en quadrícula que recalcula els canvis de zoom, sense dependències externes. A iOS i Mac Catalyst, aprofita el suport natiu &lt;code&gt;MKClusterAnnotation&lt;/code&gt; de MapKit, que significa animacions fluides i natives de la plataforma.&lt;/p&gt;
&lt;p&gt;Aquest és un d&amp;rsquo;aquests casos en què l&amp;rsquo;equip de MAUI va fer la trucada correcta: recolzeu-vos a la plataforma on tingui sentit.&lt;/p&gt;
&lt;h2 id="per-què-això-és-important"&gt;Per què això és important&lt;/h2&gt;
&lt;p&gt;La agrupació de pins ha estat una de les funcions més sol·licitades a.NET MAUI (&lt;a href="https://github.com/dotnet/maui/issues/11811"&gt;issue #11811&lt;/a&gt;), i per una bona raó. Tota aplicació que mostra ubicacions en un mapa (seguiment de lliurament, localitzadors de botigues, béns immobles) ho necessita. Anteriorment, havíeu de crear-lo vosaltres mateixos o treure una biblioteca de tercers. Ara està incorporat.&lt;/p&gt;
&lt;p&gt;Per als desenvolupadors de.NET que creem aplicacions mòbils multiplataforma, aquest és el tipus de millora de la qualitat de vida que fa que MAUI sigui una opció realment pràctica per a escenaris amb mapes pesats.&lt;/p&gt;
&lt;h2 id="comença"&gt;Comença&lt;/h2&gt;
&lt;p&gt;Instal·leu &lt;a href="https://dotnet.microsoft.com/download/dotnet/11.0"&gt;.NET 11 Preview 3&lt;/a&gt; i actualitzeu la càrrega de treball.NET MAUI. La &lt;a href="https://github.com/dotnet/maui-samples/tree/main/10.0/UserInterface/Views/Map/MapDemo/WorkingWithMaps"&gt;mostra de mapes&lt;/a&gt; inclou una nova pàgina de clúster amb la qual podeu jugar immediatament.&lt;/p&gt;
&lt;p&gt;Aneu a construir alguna cosa amb ell i deixeu que els vostres mapes finalment respiren.&lt;/p&gt;</content:encoded></item><item><title>Les eines MCP d'Azure s'incorporen ara a Visual Studio 2022: no es requereix cap extensió</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/azure-mcp-tools-built-into-visual-studio-2022/</guid><description>Les eines d'Azure MCP s'envien com a part de la càrrega de treball de desenvolupament d'Azure a Visual Studio 2022. Més de 230 eines, 45 serveis d'Azure, sense extensions per instal·lar.</description><content:encoded>&lt;p&gt;Si heu estat utilitzant les eines de l&amp;rsquo;Azure MCP a Visual Studio mitjançant l&amp;rsquo;extensió separada, ja coneixeu l&amp;rsquo;exercici: instal·leu el VSIX, reinicieu, espereu que no es trenqui, gestioneu els desajustos de versions. Aquesta fricció ha desaparegut.&lt;/p&gt;
&lt;p&gt;Yun Jung Choi &lt;a href="https://devblogs.microsoft.com/visualstudio/azure-mcp-tools-now-ship-built-into-visual-studio-2022-no-extension-required/"&gt;va anunciar&lt;/a&gt; que les eines d&amp;rsquo;Azure MCP ara s&amp;rsquo;envien directament com a part de la càrrega de treball de desenvolupament d&amp;rsquo;Azure a Visual Studio 2022. Sense extensió. No VSIX. No reinicia el ball.&lt;/p&gt;
&lt;h2 id="què-significa-realment-això"&gt;Què significa realment això&lt;/h2&gt;
&lt;p&gt;A partir de la versió 17.14.30 de Visual Studio 2022, l&amp;rsquo;Azure MCP Server s&amp;rsquo;inclou amb la càrrega de treball de desenvolupament d&amp;rsquo;Azure. Si ja teniu aquesta càrrega de treball instal·lada, només cal que l&amp;rsquo;activeu a GitHub Copilot Chat i ja heu acabat.&lt;/p&gt;
&lt;p&gt;Més de 230 eines en 45 serveis Azure, accessibles directament des de la finestra de xat. Enumereu els vostres comptes d&amp;rsquo;emmagatzematge, implementeu una aplicació ASP.NET Core, diagnostiqueu problemes del servei d&amp;rsquo;aplicacions, consulteu Log Analytics, tot sense obrir una pestanya del navegador.&lt;/p&gt;
&lt;h2 id="per-què-això-importa-més-del-que-sembla"&gt;Per què això importa més del que sembla&lt;/h2&gt;
&lt;p&gt;Això és el que passa amb les eines per a desenvolupadors: cada pas addicional és fricció i la fricció mata l&amp;rsquo;adopció. Tenir MCP com a extensió independent significava desajustos de versions, errors d&amp;rsquo;instal·lació i una cosa més a mantenir actualitzada. Incorporar-lo a la càrrega de treball significa:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Camí d&amp;rsquo;actualització únic&lt;/strong&gt; mitjançant l&amp;rsquo;instal·lador de Visual Studio&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sense deriva de versió&lt;/strong&gt; entre l&amp;rsquo;extensió i l&amp;rsquo;IDE&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sempre actual&lt;/strong&gt;: el servidor MCP s&amp;rsquo;actualitza amb versions regulars de VS&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Per als equips que s&amp;rsquo;estandarditzen a Azure, això és un gran problema. Instal·leu la càrrega de treball una vegada, activeu les eines i hi són per a cada sessió.&lt;/p&gt;
&lt;h2 id="què-pots-fer-amb-ell"&gt;Què pots fer amb ell&lt;/h2&gt;
&lt;p&gt;Les eines cobreixen tot el cicle de vida del desenvolupament mitjançant Copilot Chat:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Aprendre&lt;/strong&gt;: pregunteu sobre els serveis d&amp;rsquo;Azure, les pràctiques recomanades i els patrons d&amp;rsquo;arquitectura&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Disseny i desenvolupament&lt;/strong&gt;: obteniu recomanacions de servei, configureu el codi de l&amp;rsquo;aplicació&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Desplega&lt;/strong&gt;: proveïu recursos i implementeu-los directament des de l&amp;rsquo;IDE&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resolució de problemes&lt;/strong&gt;: consulteu registres, comproveu l&amp;rsquo;estat dels recursos, diagnosticeu problemes de producció&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Un exemple ràpid: escriviu això a 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 truca a les eines d&amp;rsquo;Azure MCP darrere de les escenes, consulta les vostres subscripcions i retorna una llista amb format amb noms, ubicacions i SKU. No cal cap portal.&lt;/p&gt;
&lt;h2 id="com-activar-lo"&gt;Com activar-lo&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Actualització a Visual Studio 2022 &lt;strong&gt;17.14.30&lt;/strong&gt; o superior&lt;/li&gt;
&lt;li&gt;Assegureu-vos que la càrrega de treball &lt;strong&gt;Desenvolupament d&amp;rsquo;Azure&lt;/strong&gt; estigui instal·lada&lt;/li&gt;
&lt;li&gt;Obriu GitHub Copilot Chat&lt;/li&gt;
&lt;li&gt;Feu clic al botó &lt;strong&gt;Selecciona eines&lt;/strong&gt; (la icona de dues claus)&lt;/li&gt;
&lt;li&gt;Activa &lt;strong&gt;Servidor MCP d&amp;rsquo;Azure&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Això és tot. Es manté activat durant les sessions.&lt;/p&gt;
&lt;h2 id="una-advertència"&gt;Una advertència&lt;/h2&gt;
&lt;p&gt;Les eines estan desactivades de manera predeterminada: heu d&amp;rsquo;activar-les. I les eines específiques de VS 2026 no estan disponibles a VS 2022. La disponibilitat de les eines també depèn dels vostres permisos de subscripció a Azure, igual que el portal.&lt;/p&gt;
&lt;h2 id="la-imatge-més-gran"&gt;La imatge més gran&lt;/h2&gt;
&lt;p&gt;Això forma part d&amp;rsquo;una tendència clara: MCP s&amp;rsquo;està convertint en la forma estàndard d&amp;rsquo;aprofitar les eines de núvol en els IDE de desenvolupadors. Ja hem vist la &lt;a href="https://devblogs.microsoft.com/azure-sdk/announcing-azure-mcp-server-2-0-stable-release/"&gt;versión estable d&amp;rsquo;Azure MCP Server 2.0&lt;/a&gt; i les integracions MCP a VS Code i altres editors. Tenir-lo integrat al sistema de càrrega de treball de Visual Studio és la progressió natural.&lt;/p&gt;
&lt;p&gt;Per als desenvolupadors de.NET que vivim a Visual Studio, això elimina un altre motiu per canviar de context al portal Azure. I sincerament, com menys canvis de pestanya, millor.&lt;/p&gt;</content:encoded></item><item><title>Aspire 13.2 obté MongoDB EF Core i Azure Data Lake: dues integracions que val la pena provar</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/aspire-132-mongodb-efcore-data-lake/</guid><description>Aspire 13.2 afegeix integracions MongoDB Entity Framework Core i Azure Data Lake Storage amb comprovacions de salut i descobriment de serveis sense configuració. Aquí teniu el que semblen a la pràctica.</description><content:encoded>&lt;p&gt;Aspire 13.2 acaba d&amp;rsquo;aterrar amb &lt;a href="https://devblogs.microsoft.com/aspire/aspire-new-database-integrations/"&gt;dues noves integracions de bases de dades&lt;/a&gt; que mereixen la vostra atenció: MongoDB Entity Framework Core i Azure Data Lake Storage. Si heu volgut utilitzar EF Core amb MongoDB en una aplicació Aspire o necessiteu connectar les càrregues de treball del llac de dades amb un descobriment de serveis adequat, aquesta versió ofereix tots dos.&lt;/p&gt;
&lt;h2 id="mongodb-compleix-ef-core-a-aspire"&gt;MongoDB compleix EF Core a Aspire&lt;/h2&gt;
&lt;p&gt;Aquest és el que m&amp;rsquo;emociona més. Aspire ha donat suport a MongoDB durant un temps, però sempre va ser el controlador en brut: sense EF Core, sense &lt;code&gt;DbContext&lt;/code&gt;, sense consultes LINQ als vostres documents. Ara teniu l&amp;rsquo;experiència completa d&amp;rsquo;EF Core amb MongoDB, a més de les comprovacions automàtiques de l&amp;rsquo;estat i el descobriment de serveis d&amp;rsquo;Aspire.&lt;/p&gt;
&lt;p&gt;Configurar-lo és el patró típic d&amp;rsquo;Aspire. Al vostre 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;A continuació, al vostre projecte de consum, afegiu la integració d&amp;rsquo;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;I registre el teu &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;A partir d&amp;rsquo;aquí, és EF Core estàndard. Defineix les teves entitats, utilitza el teu &lt;code&gt;DbContext&lt;/code&gt; com ho faries amb qualsevol altre proveïdor. La integració gestiona l&amp;rsquo;agrupació de connexions, les traces d&amp;rsquo;OpenTelemetry i les comprovacions de salut darrere de les escenes.&lt;/p&gt;
&lt;p&gt;Per als desenvolupadors de.NET que han estat utilitzant MongoDB amb el controlador en brut i cablejat manualment les cadenes de connexió, aquesta és una bona actualització de qualitat de vida. Obteniu l&amp;rsquo;abstracció completa d&amp;rsquo;EF Core sense perdre el descobriment del servei d&amp;rsquo;Aspire.&lt;/p&gt;
&lt;h2 id="azure-data-lake-storage-suneix-a-la-festa"&gt;Azure Data Lake Storage s&amp;rsquo;uneix a la festa&lt;/h2&gt;
&lt;p&gt;La segona gran incorporació és una &lt;a href="https://aspire.dev/integrations/cloud/azure/azure-storage-datalake/"&gt;integració d&amp;rsquo;Azure Data Lake Storage (ADLS)&lt;/a&gt;. Si esteu creant canalitzacions de dades, processos ETL o plataformes d&amp;rsquo;anàlisi, ara podeu connectar els recursos de Data Lake de la mateixa manera que connectaríeu qualsevol altra dependència d&amp;rsquo;Aspire.&lt;/p&gt;
&lt;p&gt;A l&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;En el projecte de consum:&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;Sense gestió manual de cadenes de connexió, sense recerca de credencials. Aspire proporciona recursos i els injecta. Per a aquells de nosaltres que creem aplicacions.NET natives del núvol que toquen tant dades operatives com càrregues de treball d&amp;rsquo;anàlisi, això fa que el llac de dades se senti com un ciutadà de primera classe en el model Aspire.&lt;/p&gt;
&lt;h2 id="les-petites-solucions-que-importen"&gt;Les petites solucions que importen&lt;/h2&gt;
&lt;p&gt;Més enllà de les funcions dels titulars, hi ha algunes millores en la qualitat de vida que cal destacar:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Correcció de cadena de connexió MongoDB&lt;/strong&gt;: la barra inclinada abans del nom de la base de dades ara es gestiona correctament. Si heu treballat amb això, podeu eliminar aquesta solució&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Exporta SQL Server&lt;/strong&gt; — &lt;code&gt;Aspire.Hosting.SqlServer&lt;/code&gt; ara exporta opcions addicionals de configuració del servidor per a un control més detallat&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Actualitzacions de l&amp;rsquo;emulador&lt;/strong&gt;: l&amp;rsquo;emulador ServiceBus 2.0.0, l&amp;rsquo;emulador de configuració d&amp;rsquo;aplicacions 1.0.2 i l&amp;rsquo;emulador de vista prèvia de CosmosDB ara inclou una comprovació de la preparació&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Azure Managed Redis&lt;/strong&gt;: ara el valor predeterminat és &lt;code&gt;rediss://&lt;/code&gt; (Redis Secure), de manera que les connexions es xifren de manera immediata&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Aquest últim és subtil però important: Redis xifrat per defecte significa una cosa menys per configurar en producció.&lt;/p&gt;
&lt;h2 id="tancant"&gt;Tancant&lt;/h2&gt;
&lt;p&gt;Aspire 13.2 és una versió incremental, però les integracions MongoDB EF Core i Data Lake omplen buits reals. Si estàveu esperant el suport adequat d&amp;rsquo;EF Core amb MongoDB a Aspire, o necessiteu que Data Lake sigui una dependència de primera classe, &lt;a href="https://get.aspire.dev"&gt;actualitzeu a 13.2&lt;/a&gt; i feu-los una volta. L&amp;rsquo;ordre &lt;code&gt;aspire add&lt;/code&gt; inclou tot el que necessiteu.&lt;/p&gt;
&lt;p&gt;Llegiu les &lt;a href="https://aspire.dev/whats-new/aspire-13-2/#-integrations-updates"&gt;notes completes de la versió&lt;/a&gt; per obtenir més detalls i consulteu la &lt;a href="https://aspire.dev/integrations/gallery/"&gt;galeria d&amp;rsquo;integració&lt;/a&gt; per obtenir la llista completa.&lt;/p&gt;</content:encoded></item><item><title>azd update: una comanda per controlar tots els vostres gestors de paquets</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/azd-update-universal-upgrade-command/</guid><description>L'Azure Developer CLI ara té una ordre d'actualització universal que funciona independentment de com l'hagueu instal·lat: winget, Homebrew, Chocolatey o script d'instal·lació.</description><content:encoded>&lt;p&gt;Sabeu que el missatge &amp;ldquo;Hi ha una versió nova d&amp;rsquo;azd disponible&amp;rdquo; que apareix cada poques setmanes? El que descarteu perquè no recordeu si vau instal·lar &lt;code&gt;azd&lt;/code&gt; mitjançant winget, Homebrew o aquell script curl que vau executar fa sis mesos? Sí, finalment s&amp;rsquo;ha arreglat.&lt;/p&gt;
&lt;p&gt;Microsoft acaba d&amp;rsquo;enviar &lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-update/"&gt;&lt;code&gt;azd update&lt;/code&gt;&lt;/a&gt;: una ordre única que actualitza l&amp;rsquo;Azure Developer CLI a la darrera versió, independentment de com l&amp;rsquo;haveu instal·lat originalment. Windows, macOS, Linux, no importa. Una ordre.&lt;/p&gt;
&lt;h2 id="com-funciona"&gt;Com funciona&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;Això és tot. Si voleu un accés anticipat a noves funcions, podeu canviar a la creació diària d&amp;rsquo;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;L&amp;rsquo;ordre detecta el vostre mètode d&amp;rsquo;instal·lació actual i utilitza el mecanisme d&amp;rsquo;actualització adequat sota el capó. No més &amp;ldquo;espera, he fet servir winget o choco en aquesta màquina?&amp;rdquo;&lt;/p&gt;
&lt;h2 id="la-petita-captura"&gt;La petita captura&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;azd update&lt;/code&gt; s&amp;rsquo;envia a partir de la versió 1.23.x. Si teniu una versió anterior, haureu de fer una darrera actualització manual mitjançant el vostre mètode d&amp;rsquo;instal·lació original. Després d&amp;rsquo;això, &lt;code&gt;azd update&lt;/code&gt; s&amp;rsquo;encarrega de tot el futur.&lt;/p&gt;
&lt;p&gt;Comproveu la vostra versió actual amb &lt;code&gt;azd version&lt;/code&gt;. Si necessiteu una instal·lació nova, els &lt;a href="https://learn.microsoft.com/azure/developer/azure-developer-cli/install-azd"&gt;documents d&amp;rsquo;instal·lació&lt;/a&gt; us cobreixen.&lt;/p&gt;
&lt;h2 id="per-què-és-important"&gt;Per què és important&lt;/h2&gt;
&lt;p&gt;Aquesta és una petita millora de la qualitat de vida, però per a aquells de nosaltres que utilitzem &lt;code&gt;azd&lt;/code&gt; diàriament per desplegar agents d&amp;rsquo;IA i aplicacions Aspire a Azure, mantenir-se al dia significa menys moments &amp;ldquo;aquest error ja s&amp;rsquo;ha solucionat a la darrera versió&amp;rdquo;. Una cosa menys per pensar.&lt;/p&gt;
&lt;p&gt;Llegiu l&amp;rsquo;&lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-update/"&gt;anunci complet&lt;/a&gt; i la &lt;a href="https://blog.jongallant.com/2026/04/azd-update"&gt;immersió més profunda&lt;/a&gt; de Jon Gallant per a més context.&lt;/p&gt;</content:encoded></item><item><title>Azure Smart Tier és GA: optimització automàtica de costos d'emmagatzematge de blob sense regles de cicle de vida</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/azure-smart-tier-blob-storage-ga/</guid><description>El nivell intel·ligent d'Azure Blob Storage ara està disponible en general, movent els objectes automàticament entre els nivells calents, freds i freds en funció dels patrons d'accés reals; no calen regles de cicle de vida.</description><content:encoded>&lt;p&gt;Si alguna vegada heu passat temps ajustant les polítiques de cicle de vida d&amp;rsquo;Azure Blob Storage i després heu vist com es van trencar quan els patrons d&amp;rsquo;accés canviaven, aquesta és la vostra. Microsoft acaba d&amp;rsquo;anunciar la &lt;a href="https://azure.microsoft.com/en-us/blog/optimize-object-storage-costs-automatically-with-smart-tier-now-generally-available/"&gt;disponibilitat general del nivell intel·ligent&lt;/a&gt; per a Azure Blob i Data Lake Storage: una capacitat de nivells totalment gestionada que mou automàticament objectes entre nivells calents, freds i freds en funció de l&amp;rsquo;ús real.&lt;/p&gt;
&lt;h2 id="què-fa-realment-el-nivell-intelligent"&gt;Què fa realment el nivell intel·ligent&lt;/h2&gt;
&lt;p&gt;El concepte és senzill: el nivell intel·ligent avalua contínuament el darrer temps d&amp;rsquo;accés de cada objecte al vostre compte d&amp;rsquo;emmagatzematge. Les dades a les quals s&amp;rsquo;accedeix amb freqüència es mantenen en calent, les dades inactives es mouen per refredar-se després de 30 dies i després a fred després de 60 dies més. Quan s&amp;rsquo;accedeix de nou a les dades, es torna a activar immediatament. El cicle es reinicia.&lt;/p&gt;
&lt;p&gt;No hi ha regles de cicle de vida per configurar. No hi ha prediccions de patrons d&amp;rsquo;accés. Sense sintonització manual.&lt;/p&gt;
&lt;p&gt;Durant la previsualització, Microsoft va informar que &lt;strong&gt;més del 50% de la capacitat gestionada per nivells intel·ligents es va canviar automàticament a nivells més freds&lt;/strong&gt; en funció dels patrons d&amp;rsquo;accés reals. Això suposa una reducció de costos significativa per als comptes d&amp;rsquo;emmagatzematge grans.&lt;/p&gt;
&lt;h2 id="per-què-això-és-important-per-als-desenvolupadors-denet"&gt;Per què això és important per als desenvolupadors de.NET&lt;/h2&gt;
&lt;p&gt;Si esteu creant aplicacions que generen registres, telemetria, dades analítiques o qualsevol tipus de fons de dades en creixement, i sincerament, qui no, els costos d&amp;rsquo;emmagatzematge s&amp;rsquo;acumulen ràpidament. L&amp;rsquo;enfocament tradicional era escriure polítiques de gestió del cicle de vida, provar-les i tornar-les a ajustar quan canviaven els patrons d&amp;rsquo;accés de la vostra aplicació. El nivell intel·ligent elimina tot aquest flux de treball.&lt;/p&gt;
&lt;p&gt;Alguns escenaris pràctics on això ajuda:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Telemetria i registres d&amp;rsquo;aplicacions&lt;/strong&gt;: calent durant la depuració, rarament s&amp;rsquo;hi accedeix després d&amp;rsquo;unes setmanes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Conductes de dades i sortides d&amp;rsquo;ETL&lt;/strong&gt;: s&amp;rsquo;hi accedeix molt durant el processament, després principalment en fred&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Contingut generat per l&amp;rsquo;usuari&lt;/strong&gt;: les càrregues recents són interessants, el contingut més antic es refreda gradualment&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Còpia de seguretat i dades d&amp;rsquo;arxiu&lt;/strong&gt;: s&amp;rsquo;accedeix de tant en tant per complir-ho, principalment inactiu&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="configurant-lo"&gt;Configurant-lo&lt;/h2&gt;
&lt;p&gt;Habilitar el nivell intel·ligent és una configuració única:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Comptes nous&lt;/strong&gt;: seleccioneu el nivell intel·ligent com a nivell d&amp;rsquo;accés predeterminat durant la creació del compte d&amp;rsquo;emmagatzematge (es requereix redundància zonal)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Comptes existents&lt;/strong&gt;: canvieu el nivell d&amp;rsquo;accés a blob del nivell predeterminat actual al nivell intel·ligent&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Els objectes de menys de 128 KiB es mantenen en calent i no incorren en la taxa de supervisió. Per a la resta, pagueu tarifes estàndard de capacitat calenta/fresca/fred sense càrrecs de transició de nivell, sense despeses d&amp;rsquo;eliminació anticipada i sense costos de recuperació de dades. Una quota de seguiment mensual per objecte cobreix l&amp;rsquo;orquestració.&lt;/p&gt;
&lt;h2 id="la-compensació-a-conèixer"&gt;La compensació a conèixer&lt;/h2&gt;
&lt;p&gt;Les regles de classificació del nivell intel·ligent són estàtiques (30 dies → fred, 90 dies → fred). Si necessiteu llindars personalitzats (per exemple, passar a la refrigeració després de 7 dies per a una càrrega de treball específica), les regles del cicle de vida encara són el camí a seguir. I no barregeu les dues coses: eviteu utilitzar regles de cicle de vida en objectes gestionats per nivell intel·ligent, ja que poden entrar en conflicte.&lt;/p&gt;
&lt;h2 id="tancant"&gt;Tancant&lt;/h2&gt;
&lt;p&gt;Això no és revolucionari, però soluciona un autèntic mal de cap operatiu. Si gestioneu comptes d&amp;rsquo;emmagatzematge de blobs en creixement i esteu cansat de mantenir polítiques de cicle de vida, &lt;a href="https://learn.microsoft.com/en-us/azure/storage/blobs/access-tiers-smart"&gt;habilita el nivell intel·ligent&lt;/a&gt; i deixeu que Azure s&amp;rsquo;encarregui. Actualment està disponible a gairebé totes les regions de núvol públic de zona.&lt;/p&gt;</content:encoded></item><item><title>Manteniment de.NET d'abril de 2026: pegats de seguretat que hauríeu d'aplicar avui</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/dotnet-april-2026-servicing-security-patches/</guid><description>La versió de servei d'abril de 2026 aplega 6 CVE a.NET 10,.NET 9,.NET 8 i.NET Framework, incloses dues vulnerabilitats d'execució de codi remota.</description><content:encoded>&lt;p&gt;Les &lt;a href="https://devblogs.microsoft.com/dotnet/dotnet-and-dotnet-framework-april-2026-servicing-updates/"&gt;actualitzacions de servei d&amp;rsquo;abril de 2026&lt;/a&gt; per a.NET i.NET Framework ja estan fora, i aquesta inclou solucions de seguretat que voldreu aplicar aviat. Sis CVE pegats, incloses dues vulnerabilitats d&amp;rsquo;execució de codi remota (RCE).&lt;/p&gt;
&lt;h2 id="què-està-pegat"&gt;Què està pegat&lt;/h2&gt;
&lt;p&gt;Aquí teniu el resum ràpid:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;CVE&lt;/th&gt;
&lt;th&gt;Tipus&lt;/th&gt;
&lt;th&gt;Afecta&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 de les funcions de seguretat&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;Execució de codi remota&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;Execució de codi remota&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;.NET 10, 9 i 8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVE-2026-32203&lt;/td&gt;
&lt;td&gt;Denegació de servei&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;Denegació de servei&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;Denegació de servei&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;Els dos CVE RCE (CVE-2026-32178 i CVE-2026-33116) afecten la gamma més àmplia de versions.NET i haurien de ser la prioritat.&lt;/p&gt;
&lt;h2 id="versions-actualitzades"&gt;Versions actualitzades&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;Tots estan disponibles a través dels canals habituals: &lt;a href="https://dotnet.microsoft.com/download/dotnet/10.0"&gt;dotnet.microsoft.com&lt;/a&gt;, imatges de contenidors a MCR i gestors de paquets de Linux.&lt;/p&gt;
&lt;h2 id="què-fer"&gt;Què fer&lt;/h2&gt;
&lt;p&gt;Actualitzeu els vostres projectes i pipelines CI/CD a les últimes versions de pedaços. Si utilitzeu contenidors, traieu les imatges més recents. Si esteu a.NET Framework, consulteu les &lt;a href="https://learn.microsoft.com/dotnet/framework/release-notes/release-notes"&gt;Notes de la versió de.NET Framework&lt;/a&gt; per trobar els pedaços corresponents.&lt;/p&gt;
&lt;p&gt;Per a aquells que executen.NET 10 en producció (és la versió actual), 10.0.6 és una actualització obligatòria. El mateix per a.NET 9.0.15 i.NET 8.0.26 si esteu en aquestes pistes LTS. Dues vulnerabilitats RCE no són una cosa que posposeu.&lt;/p&gt;</content:encoded></item><item><title>On hauríeu d'allotjar els vostres agents d'IA a Azure? Una guia pràctica de decisions</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/azure-ai-agent-hosting-options-guide/</guid><description>Azure ofereix sis maneres d'allotjar agents d'IA: des de contenidors en brut fins a agents allotjats de Foundry totalment gestionats. A continuació s'explica com triar l'adequat per a la vostra càrrega de treball.NET.</description><content:encoded>&lt;p&gt;Si esteu creant agents d&amp;rsquo;IA amb.NET ara mateix, probablement heu notat alguna cosa: hi ha * moltes * maneres d&amp;rsquo;allotjar-los a Azure. Container Apps, AKS, Functions, App Service, Foundry Agents, Foundry Hosted Agents, i tots semblen raonables fins que realment n&amp;rsquo;has de triar un. Microsoft acaba de publicar una &lt;a href="https://devblogs.microsoft.com/all-things-azure/hostedagent/"&gt;guia completa per a l&amp;rsquo;allotjament d&amp;rsquo;agents d&amp;rsquo;Azure AI&lt;/a&gt; que ho aclareix, i vull desglossar-ho des d&amp;rsquo;una perspectiva pràctica del desenvolupador.NET.&lt;/p&gt;
&lt;h2 id="les-sis-opcions-dun-cop-dull"&gt;Les sis opcions d&amp;rsquo;un cop d&amp;rsquo;ull&lt;/h2&gt;
&lt;p&gt;Així és com resumiria el paisatge:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Opció&lt;/th&gt;
&lt;th&gt;El millor per&lt;/th&gt;
&lt;th&gt;Tu gestiones&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Aplicacions de contenidors&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Control total del contenidor sense complexitat K8s&lt;/td&gt;
&lt;td&gt;Observabilitat, estat, cicle de vida&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;Compliment empresarial, multi-clúster, xarxes personalitzades&lt;/td&gt;
&lt;td&gt;Tot (aquest és el punt)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Funcions d&amp;rsquo;Azure&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Tasques d&amp;rsquo;agent de curta durada i impulsades per esdeveniments&lt;/td&gt;
&lt;td&gt;No gaire, veritat sense servidor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Servei d&amp;rsquo;aplicacions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Agents HTTP simples, trànsit previsible&lt;/td&gt;
&lt;td&gt;Desplegament, configuració d&amp;rsquo;escalat&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Agents de Foundry&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Agents opcionals de codi a través del portal/SDK&lt;/td&gt;
&lt;td&gt;Gairebé res&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Agents allotjats de Foundry&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Agents de marc personalitzats amb infraestructures gestionades&lt;/td&gt;
&lt;td&gt;Només el vostre codi d&amp;rsquo;agent&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Els quatre primers són càlculs de propòsit general: &lt;em&gt;podeu&lt;/em&gt; executar-hi agents, però no estaven dissenyats per a això. Els dos últims són nadius dels agents: entenen les converses, les trucades d&amp;rsquo;eines i els cicles de vida dels agents com a conceptes de primera classe.&lt;/p&gt;
&lt;h2 id="foundry-hosted-agents-el-lloc-ideal-per-als-desenvolupadors-dagentsnet"&gt;Foundry Hosted Agents: el lloc ideal per als desenvolupadors d&amp;rsquo;agents.NET&lt;/h2&gt;
&lt;p&gt;Aquí és el que em va cridar l&amp;rsquo;atenció. Els agents allotjats de Foundry se situen al centre: teniu la flexibilitat d&amp;rsquo;executar el vostre propi codi (nucli semàntic, marc d&amp;rsquo;agents, LangGraph, el que sigui), però la plataforma gestiona la infraestructura, l&amp;rsquo;observabilitat i la gestió de converses.&lt;/p&gt;
&lt;p&gt;La peça clau és l&amp;rsquo;&lt;strong&gt;Adaptador d&amp;rsquo;allotjament&lt;/strong&gt;: una capa d&amp;rsquo;abstracció fina que connecta el vostre marc d&amp;rsquo;agent amb la plataforma Foundry. Per a Microsoft Agent Framework, té aquest aspecte:&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;Aquesta és tota la vostra història d&amp;rsquo;allotjament. L&amp;rsquo;adaptador gestiona la traducció del protocol, la transmissió mitjançant esdeveniments enviats pel servidor, l&amp;rsquo;historial de converses i el seguiment d&amp;rsquo;OpenTelemetry, tot automàticament. Sense programari intermedi personalitzat, sense fontaneria manual.&lt;/p&gt;
&lt;h2 id="el-desplegament-és-realment-senzill"&gt;El desplegament és realment senzill&lt;/h2&gt;
&lt;p&gt;Abans he desplegat agents a Container Apps i funciona, però acabeu escrivint molt codi de cola per a la gestió de l&amp;rsquo;estat i l&amp;rsquo;observabilitat. Amb Hosted Agents i &lt;code&gt;azd&lt;/code&gt;, el desplegament és:&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;# Install the AI agent extension&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;# Init from a 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;# Build, push, deploy — done&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;Aquest únic &lt;code&gt;azd up&lt;/code&gt; crea el vostre contenidor, l&amp;rsquo;envia a ACR, subministra el projecte Foundry, desplega els punts finals del model i inicia el vostre agent. Cinc passos es van col·lapsar en una ordre.&lt;/p&gt;
&lt;h2 id="gestió-de-converses-integrada"&gt;Gestió de converses integrada&lt;/h2&gt;
&lt;p&gt;Aquesta és la peça que estalvia més temps en la producció. En lloc de crear el vostre propi magatzem d&amp;rsquo;estat de conversa, els agents allotjats ho gestionen de manera nativa:&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;# Create a persistent conversation&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;# First turn&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;# Second turn — context is preserved&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;No Redis. No hi ha botiga de sessions de Cosmos DB. No hi ha programari intermediari personalitzat per a la serialització de missatges. La plataforma només ho gestiona.&lt;/p&gt;
&lt;h2 id="el-meu-marc-de-decisió"&gt;El meu marc de decisió&lt;/h2&gt;
&lt;p&gt;Després de revisar les sis opcions, aquí teniu el meu model mental ràpid:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Necessites zero infraestructura?&lt;/strong&gt; → Agents de Foundry (portal/SDK, sense contenidors)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tens un codi d&amp;rsquo;agent personalitzat però vols un allotjament gestionat?&lt;/strong&gt; → Agents allotjats de Foundry&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Necessiteu tasques d&amp;rsquo;agent de curta durada i basades en esdeveniments?&lt;/strong&gt; → Azure Functions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Necessites el màxim control dels contenidors sense K8?&lt;/strong&gt; → Aplicacions de contenidors&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Necessites un compliment estricte i múltiples clústers?&lt;/strong&gt; → AKS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Teniu un agent HTTP senzill amb trànsit previsible?&lt;/strong&gt; → Servei d&amp;rsquo;aplicacions&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Per a la majoria de desenvolupadors de.NET que creen amb Semantic Kernel o Microsoft Agent Framework, Hosted Agents és probablement el punt de partida adequat. Obteniu una escala a zero, OpenTelemetry integrada, gestió de converses i flexibilitat de marc, sense gestionar Kubernetes ni connectar la vostra pròpia pila d&amp;rsquo;observabilitat.&lt;/p&gt;
&lt;h2 id="tancant"&gt;Tancant&lt;/h2&gt;
&lt;p&gt;El paisatge d&amp;rsquo;allotjament d&amp;rsquo;agents a Azure està madurant ràpidament. Si inicieu un nou projecte d&amp;rsquo;agent d&amp;rsquo;IA avui, m&amp;rsquo;agradaria considerar seriosament els agents allotjats de Foundry abans d&amp;rsquo;arribar a Container Apps o AKS per costum. La infraestructura gestionada estalvia temps real i el patró de l&amp;rsquo;adaptador d&amp;rsquo;allotjament us permet mantenir la vostra elecció de marc.&lt;/p&gt;
&lt;p&gt;Consulteu la &lt;a href="https://devblogs.microsoft.com/all-things-azure/hostedagent/"&gt;guia completa de Microsoft&lt;/a&gt; i el &lt;a href="https://github.com/microsoft-foundry/foundry-samples/tree/main/samples/python/hosted-agents"&gt;repositori de mostres de Foundry&lt;/a&gt; per obtenir exemples de treball.&lt;/p&gt;</content:encoded></item><item><title>Servidor Azure DevOps d'abril de 2026: correcció de finalització de relacions públiques i actualitzacions de seguretat</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/azure-devops-server-april-2026-patch/</guid><description>L'Azure DevOps Server obté el Pedaç 3 amb una solució per a errors de finalització de relacions públiques, una validació de tancament de sessió millorada i connexions PAT restaurades de GitHub Enterprise Server.</description><content:encoded>&lt;p&gt;Informació ràpida per als equips que executen Azure DevOps Server: Microsoft va llançar &lt;a href="https://devblogs.microsoft.com/devops/april-patches-for-azure-devops-server/"&gt;el pegat 3 per a l&amp;rsquo;abril de 2026&lt;/a&gt; amb tres solucions específiques.&lt;/p&gt;
&lt;h2 id="què-sha-solucionat"&gt;Què s&amp;rsquo;ha solucionat&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Errores de finalització de la sol·licitud d&amp;rsquo;extracció&lt;/strong&gt;: una excepció de referència nul·la durant la compleció automàtica d&amp;rsquo;elements de treball podria provocar que les combinacions de PR fallin. Si heu trobat errors de finalització de PR aleatòries, és probable que aquesta sigui la causa&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Validació de la redirecció de tancament de la sessió&lt;/strong&gt;: validació millorada durant la tancament de la sessió per evitar possibles redireccions malicioses. Aquesta és una solució de seguretat que val la pena aplicar ràpidament&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Connexions PAT del servidor GitHub Enterprise&lt;/strong&gt;: la creació de connexions de testimoni d&amp;rsquo;accés personal al servidor GitHub Enterprise es va trencar, ara s&amp;rsquo;ha restaurat&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="com-actualitzar"&gt;Com actualitzar&lt;/h2&gt;
&lt;p&gt;Baixeu &lt;a href="https://aka.ms/devopsserverpatch3"&gt;Pedaç 3&lt;/a&gt; i executeu l&amp;rsquo;instal·lador. Per verificar que s&amp;rsquo;ha aplicat el pegat:&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;Si esteu executant Azure DevOps Server localment, Microsoft us recomana fermament mantenir-vos en l&amp;rsquo;últim pedaç tant per seguretat com per fiabilitat. Consulteu les &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;notes de la versió&lt;/a&gt; per a tots els detalls.&lt;/p&gt;</content:encoded></item><item><title>Les habilitats d'agent a.NET s'acaben de ser molt flexibles</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/agent-skills-dotnet-three-authoring-patterns/</guid><description>El Microsoft Agent Framework ara admet tres maneres de crear habilitats: fitxers, classes i codi en línia, totes compostes a través d'un sol proveïdor. Heus aquí per què és important i com utilitzar-los.</description><content:encoded>&lt;p&gt;Si heu estat creant agents amb Microsoft Agent Framework, coneixeu l&amp;rsquo;exercici: definiu les habilitats, les connecteu a un proveïdor i deixeu que l&amp;rsquo;agent esbringui quina invocar. El que és nou és &lt;em&gt;com&lt;/em&gt; autors d&amp;rsquo;aquestes habilitats, i el salt de flexibilitat és important.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;última actualització introdueix tres patrons de creació personalitzats per a les habilitats d&amp;rsquo;agent: &lt;strong&gt;basat en fitxers&lt;/strong&gt;, &lt;strong&gt;basat en classes&lt;/strong&gt; i &lt;strong&gt;definit en codi en línia&lt;/strong&gt;. Els tres es connecten a un únic &lt;code&gt;AgentSkillsProviderBuilder&lt;/code&gt;, el que significa que podeu barrejar i combinar sense cap lògica d&amp;rsquo;encaminament ni codi de cola especial. Permeteu-me que us acompanyi a través de cadascuna i quan ho aconseguiu.&lt;/p&gt;
&lt;h2 id="habilitats-basades-en-fitxers-el-punt-de-partida"&gt;Habilitats basades en fitxers: el punt de partida&lt;/h2&gt;
&lt;p&gt;Les habilitats basades en fitxers són exactament el que sonen: un directori al disc amb un fitxer &lt;code&gt;SKILL.md&lt;/code&gt;, scripts opcionals i documents de referència. Penseu en això com la manera més senzilla de donar noves capacitats al vostre agent:&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;El frontmatter &lt;code&gt;SKILL.md&lt;/code&gt; declara el nom i la descripció de l&amp;rsquo;habilitat, i la secció d&amp;rsquo;instruccions indica a l&amp;rsquo;agent com utilitzar els scripts i les referències:&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;A continuació, connecteu-lo amb &lt;code&gt;SubprocessScriptRunner.RunAsync&lt;/code&gt; per a l&amp;rsquo;execució de l&amp;rsquo;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;agent descobreix l&amp;rsquo;habilitat automàticament i invoca l&amp;rsquo;script de subministrament quan necessita comprovar l&amp;rsquo;estat del compte. Net i senzill.&lt;/p&gt;
&lt;h2 id="habilitats-basades-en-classe-enviament-mitjançant-nuget"&gt;Habilitats basades en classe: enviament mitjançant NuGet&lt;/h2&gt;
&lt;p&gt;Aquí és on es posa interessant per als equips. Les habilitats basades en classe es deriven de &lt;code&gt;AgentClassSkill&amp;lt;T&amp;gt;&lt;/code&gt; i utilitzen atributs com &lt;code&gt;[AgentSkillResource]&lt;/code&gt; i &lt;code&gt;[AgentSkillScript]&lt;/code&gt; perquè el marc ho descobreixi tot mitjançant la reflexió:&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;La bellesa aquí és que un equip pot empaquetar-ho com a paquet NuGet. L&amp;rsquo;afegiu al vostre projecte, el deixeu anar al constructor i funciona juntament amb les vostres habilitats basades en fitxers amb una coordinació 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="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;Les dues habilitats es mostren a l&amp;rsquo;indicador del sistema de l&amp;rsquo;agent. L&amp;rsquo;agent decideix quin utilitzar en funció de la conversa, no cal cap codi d&amp;rsquo;encaminament.&lt;/p&gt;
&lt;h2 id="habilitats-en-línia-el-pont-ràpid"&gt;Habilitats en línia: el pont ràpid&lt;/h2&gt;
&lt;p&gt;Coneixeu aquell moment en què un altre equip està construint exactament l&amp;rsquo;habilitat que necessiteu, però no s&amp;rsquo;enviarà per a un sprint? &lt;code&gt;AgentInlineSkill&lt;/code&gt; és el teu pont:&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;Afegiu-lo al constructor igual que els altres:&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;Quan finalment s&amp;rsquo;envia el paquet NuGet, canvieu l&amp;rsquo;habilitat en línia per la basada en classe. L&amp;rsquo;agent no sap la diferència.&lt;/p&gt;
&lt;p&gt;Però les habilitats en línia no són només per als ponts. També són l&amp;rsquo;opció correcta quan necessiteu generar habilitats de manera dinàmica en temps d&amp;rsquo;execució (penseu en una habilitat per unitat de negoci carregada des de la configuració) o quan un script s&amp;rsquo;ha de tancar a l&amp;rsquo;estat local que no pertany a un contenidor DI.&lt;/p&gt;
&lt;h2 id="aprovació-de-lscript-human-in-the-loop"&gt;Aprovació de l&amp;rsquo;script: human-in-the-loop&lt;/h2&gt;
&lt;p&gt;Per als desenvolupadors de.NET que creem agents de producció, aquesta és la part que realment desbloqueja les converses de desplegament. Alguns scripts tenen conseqüències reals: inscriure algú als beneficis, consultar la producció infra. Gireu &lt;code&gt;UseScriptApproval&lt;/code&gt; i l&amp;rsquo;agent s&amp;rsquo;aturarà abans d&amp;rsquo;executar qualsevol 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;Quan l&amp;rsquo;agent vol executar un script, torna una sol·licitud d&amp;rsquo;aprovació. La vostra aplicació recull la decisió (aprovar o rebutjar) i l&amp;rsquo;agent continua en conseqüència. En entorns regulats, aquesta és la diferència entre &amp;ldquo;podem desplegar això&amp;rdquo; i &amp;ldquo;legal diu que no&amp;rdquo;.&lt;/p&gt;
&lt;h2 id="per-què-és-important-aquesta-combinació"&gt;Per què és important aquesta combinació&lt;/h2&gt;
&lt;p&gt;El poder real no és cap patró d&amp;rsquo;autor, sinó la composició. Pots:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Comença petit&lt;/strong&gt; amb una habilitat basada en fitxers, itera les instruccions i envia&amp;rsquo;l sense escriure C#&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Envia habilitats reutilitzables&lt;/strong&gt; com a paquets NuGet que altres equips poden afegir amb una línia&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rebre els buits&lt;/strong&gt; amb habilitats en línia quan necessiteu alguna cosa &lt;em&gt;ara&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Filtreu els directoris d&amp;rsquo;habilitats compartits&lt;/strong&gt; amb predicats perquè el vostre agent només carregui el que hauria de fer&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Afegiu supervisió humana&lt;/strong&gt; per als scripts que toquen els sistemes de producció&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tots ells es componen mitjançant &lt;code&gt;AgentSkillsProviderBuilder&lt;/code&gt;. Sense encaminament especial, sense lògica condicional, sense comprovacions de tipus d&amp;rsquo;habilitat.&lt;/p&gt;
&lt;h2 id="tancant"&gt;Tancant&lt;/h2&gt;
&lt;p&gt;Les habilitats d&amp;rsquo;agent a.NET ara tenen un model d&amp;rsquo;autoria realment flexible. Tant si sou un desenvolupador en solitari que dibuixa un prototip amb habilitats basades en fitxers com si un equip empresarial envia capacitats empaquetades mitjançant NuGet, els patrons s&amp;rsquo;ajusten. I el mecanisme d&amp;rsquo;aprovació de l&amp;rsquo;script fa que estigui llest per a la producció per a entorns on necessiteu aquest punt de control humà.&lt;/p&gt;
&lt;p&gt;Consulteu l&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;anunci original&lt;/a&gt; per a la guia completa, la &lt;a href="https://learn.microsoft.com/en-us/agent-framework/agents/skills"&gt;documentació d&amp;rsquo;habilitats de l&amp;rsquo;agent&lt;/a&gt; a Microsoft Learn i les &lt;a href="https://github.com/microsoft/agent-framework/tree/main/dotnet/samples/02-agents/AgentSkills"&gt;mostres.NET a GitHub&lt;/a&gt; per fer-ho pràctica.&lt;/p&gt;</content:encoded></item><item><title>L'Azure MCP Server 2.0 s'acaba de caure: l'automatització del núvol agent autoallotjada és aquí</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/azure-mcp-server-2-self-hosted-agentic-cloud/</guid><description>Azure MCP Server 2.0 es manté estable amb desplegaments remots autoallotjats, 276 eines en 57 serveis Azure i seguretat de nivell empresarial: això és el que importa per als desenvolupadors de.NET que creen fluxos de treball agents.</description><content:encoded>&lt;p&gt;Si darrerament heu estat creant alguna cosa amb MCP i Azure, probablement ja sabeu que l&amp;rsquo;experiència local funciona bé. Connecteu un servidor MCP, deixeu que el vostre agent d&amp;rsquo;IA parli amb els recursos d&amp;rsquo;Azure, seguiu endavant. Però, en el moment que necessiteu compartir aquesta configuració amb un equip? Allà va ser on les coses es van complicar.&lt;/p&gt;
&lt;p&gt;Ja no. Servidor MCP d&amp;rsquo;Azure &lt;a href="https://devblogs.microsoft.com/azure-sdk/announcing-azure-mcp-server-2-0-stable-release/"&gt;acaba d&amp;rsquo;aconseguir 2.0 estable&lt;/a&gt;, i la funció de titular és exactament el que els equips empresarials han demanat: &lt;strong&gt;suport del servidor MCP remot autoallotjat&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="què-és-azure-mcp-server"&gt;Què és Azure MCP Server?&lt;/h2&gt;
&lt;p&gt;Actualització ràpida. Azure MCP Server implementa l&amp;rsquo;especificació &lt;a href="https://modelcontextprotocol.io/docs/getting-started/intro"&gt;Model Context Protocol&lt;/a&gt; i exposa les capacitats d&amp;rsquo;Azure com a eines estructurades i detectables que els agents d&amp;rsquo;IA poden invocar. Penseu en això com un pont estandarditzat entre el vostre agent i Azure: subministrament, desplegament, supervisió, diagnòstic, tot mitjançant una interfície coherent.&lt;/p&gt;
&lt;p&gt;Les xifres parlen per si soles: &lt;strong&gt;276 eines MCP en 57 serveis Azure&lt;/strong&gt;. Això és una cobertura seriosa.&lt;/p&gt;
&lt;h2 id="el-gran-problema-desplegaments-remots-autoallotjats"&gt;El gran problema: desplegaments remots autoallotjats&lt;/h2&gt;
&lt;p&gt;Aquí està la cosa. Executar MCP localment a la vostra màquina està bé per a desenvolupament i experiments. Però en un escenari d&amp;rsquo;equip real, necessiteu:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Accés compartit per a desenvolupadors i sistemes d&amp;rsquo;agents interns&lt;/li&gt;
&lt;li&gt;Configuració centralitzada (context de l&amp;rsquo;arrendatari, valors predeterminats de subscripció, telemetria)&lt;/li&gt;
&lt;li&gt;Xarxa empresarial i límits polítics&lt;/li&gt;
&lt;li&gt;Integració en pipelines CI/CD&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Azure MCP Server 2.0 aborda tot això. Podeu implementar-lo com a servei intern gestionat de manera centralitzada amb transport basat en HTTP, autenticació adequada i govern coherent.&lt;/p&gt;
&lt;p&gt;Per a l&amp;rsquo;autenticació, obteniu dues opcions sòlides:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Identitat gestionada&lt;/strong&gt;: quan s&amp;rsquo;executa al costat de &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;Flux en nom de (OBO)&lt;/strong&gt;: delegació d&amp;rsquo;OpenID Connect que crida a les API d&amp;rsquo;Azure mitjançant el context de l&amp;rsquo;usuari iniciat&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Aquest flux OBO és especialment interessant per als desenvolupadors de.NET. Vol dir que els vostres fluxos de treball d&amp;rsquo;agent poden funcionar amb els permisos reals de l&amp;rsquo;usuari, no amb un compte de servei amb privilegis excessius. Principi del mínim privilegi, integrat.&lt;/p&gt;
&lt;h2 id="enduriment-de-la-seguretat"&gt;Enduriment de la seguretat&lt;/h2&gt;
&lt;p&gt;Això no és només una versió de funcions, també és una de seguretat. La versió 2.0 afegeix:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Validació de punt final més forta&lt;/li&gt;
&lt;li&gt;Proteccions contra patrons d&amp;rsquo;injecció en eines orientades a la consulta&lt;/li&gt;
&lt;li&gt;Controls d&amp;rsquo;aïllament més estrictes per a entorns de desenvolupament&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si voleu exposar MCP com a servei compartit, aquestes garanties són importants. Molts.&lt;/p&gt;
&lt;h2 id="on-el-pots-utilitzar"&gt;On el pots utilitzar?&lt;/h2&gt;
&lt;p&gt;La història de la compatibilitat del client és àmplia. Azure MCP Server 2.0 funciona amb:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;IDEs&lt;/strong&gt;: VS Code, Visual Studio, IntelliJ, Eclipse, Cursor&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agents CLI&lt;/strong&gt;: GitHub Copilot CLI, Claude Code&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Autònom&lt;/strong&gt;: servidor local per a configuracions senzilles&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Control remot autoallotjat&lt;/strong&gt;: la nova estrella de la 2.0&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A més, hi ha suport sobirà al núvol per al govern d&amp;rsquo;Azure dels Estats Units i Azure operat per 21Vianet, que és fonamental per als desplegaments regulats.&lt;/p&gt;
&lt;h2 id="per-què-això-és-important-per-als-desenvolupadors-denet"&gt;Per què això és important per als desenvolupadors de.NET&lt;/h2&gt;
&lt;p&gt;Si esteu creant aplicacions agents amb.NET, ja sigui el nucli semàntic, el Microsoft Agent Framework o la vostra pròpia orquestració, Azure MCP Server 2.0 us ofereix una manera preparada per a la producció de permetre que els vostres agents interactuïn amb la infraestructura Azure. No hi ha embolcalls REST personalitzats. No hi ha patrons d&amp;rsquo;integració específics del servei. Només MCP.&lt;/p&gt;
&lt;p&gt;Combinat amb 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 fluida per a aplicacions MCP&lt;/a&gt; que va caure fa uns dies, l&amp;rsquo;ecosistema.NET MCP està madurant ràpidament.&lt;/p&gt;
&lt;h2 id="primers-passos"&gt;Primers passos&lt;/h2&gt;
&lt;p&gt;Tria el teu camí:&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; — codi font, documents, tot&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://aka.ms/azmcp/download/docker"&gt;Imatge Docker&lt;/a&gt;&lt;/strong&gt; — desplegament en contenidors&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://aka.ms/azmcp/download/vscode"&gt;Extensió de codi VS&lt;/a&gt;&lt;/strong&gt; — Integració IDE&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://aka.ms/azmcp/self-host"&gt;Guia d&amp;rsquo;allotjament personal&lt;/a&gt;&lt;/strong&gt;: la funció insígnia 2.0&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="tancant"&gt;Tancant&lt;/h2&gt;
&lt;p&gt;Azure MCP Server 2.0 és exactament el tipus d&amp;rsquo;actualització d&amp;rsquo;infraestructura que no sembla cridaner en una demostració, però que ho canvia tot a la pràctica. MCP remot autoallotjat amb autenticació adequada, reforç de la seguretat i suport sobirà del núvol significa que MCP està preparat per a equips reals que creen fluxos de treball reals a l&amp;rsquo;Azure. Si heu estat esperant el senyal &amp;ldquo;preparat per a l&amp;rsquo;empresa&amp;rdquo;, això és tot.&lt;/p&gt;</content:encoded></item><item><title>.NET Aspire 13.2 vol ser el millor amic del vostre agent d'IA</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/aspire-agentic-development-build-run-observe/</guid><description>Aspire 13.2 s'inclou tot en el desenvolupament agent: sortida CLI estructurada, execucions aïllades, entorns de curació automàtica i dades completes d'OpenTelemetry perquè els vostres agents d'IA puguin crear, executar i observar les vostres aplicacions.</description><content:encoded>&lt;p&gt;Coneixeu aquell moment en què el vostre agent de codificació d&amp;rsquo;IA escriu un codi sòlid, us emocioneu i després es desfà completament intentant &lt;em&gt;executar&lt;/em&gt; la cosa? Conflictes de ports, processos fantasma, variables d&amp;rsquo;entorn incorrectes: de sobte, el vostre agent està cremant fitxes per resoldre problemes d&amp;rsquo;inici en lloc de crear funcions.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;equip d&amp;rsquo;Aspire acaba de publicar una &lt;a href="https://devblogs.microsoft.com/aspire/agentic-dev-aspirations/"&gt;publicació molt atenta&lt;/a&gt; sobre exactament aquest problema, i la seva resposta és convincent: Aspire 13.2 està dissenyat no només per a humans, sinó per a agents d&amp;rsquo;IA.&lt;/p&gt;
&lt;h2 id="el-problema-és-real"&gt;El problema és real&lt;/h2&gt;
&lt;p&gt;Els agents d&amp;rsquo;IA són increïbles per escriure codi. Però enviar una aplicació de pila completa que funcioni implica molt més que generar fitxers. Heu d&amp;rsquo;iniciar els serveis en l&amp;rsquo;ordre correcte, gestionar ports, establir variables d&amp;rsquo;entorn, connectar bases de dades i obtenir comentaris quan les coses es trenquin. Ara mateix, la majoria d&amp;rsquo;agents gestionen tot això mitjançant prova i error: executant ordres, llegint la sortida d&amp;rsquo;error, tornant-ho a provar.&lt;/p&gt;
&lt;p&gt;Superposem instruccions de Markdown, habilitats personalitzades i indicacions per intentar guiar-les, però són imprevisibles, no es poden compilar i costen fitxes només per analitzar-les. L&amp;rsquo;equip d&amp;rsquo;Aspire va clavar la visió bàsica: els agents necessiten &lt;strong&gt;compiladors i API estructurades&lt;/strong&gt;, no més Markdown.&lt;/p&gt;
&lt;h2 id="aspira-com-a-infraestructura-dagents"&gt;Aspira com a infraestructura d&amp;rsquo;agents&lt;/h2&gt;
&lt;p&gt;Això és el que aporta Aspire 13.2 a la taula de desenvolupament agent:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;La vostra pila sencera en codi escrit.&lt;/strong&gt; L&amp;rsquo;AppHost defineix la vostra topologia completa: API, frontend, base de dades, memòria cau, en TypeScript o C# compilable:&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 agent pot llegir-ho per entendre la topologia de l&amp;rsquo;aplicació, afegir recursos, connectar connexions i &lt;em&gt;crear per verificar&lt;/em&gt;. El compilador li indica immediatament si alguna cosa no funciona. Sense endevinar, sense prova i error amb fitxers de configuració.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Una comanda per governar-los tots.&lt;/strong&gt; En lloc d&amp;rsquo;agents que fan malabars amb &lt;code&gt;docker compose up&lt;/code&gt;, &lt;code&gt;npm run dev&lt;/code&gt; i scripts d&amp;rsquo;inici de bases de dades, tot és només &lt;code&gt;aspire start&lt;/code&gt;. Tots els recursos s&amp;rsquo;inicien en l&amp;rsquo;ordre correcte, als ports adequats, amb la configuració correcta. Els processos de llarga durada tampoc pengen l&amp;rsquo;agent: Aspire els gestiona.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mode aïllat per a agents paral·lels.&lt;/strong&gt; Amb &lt;code&gt;--isolated&lt;/code&gt;, cada execució d&amp;rsquo;Aspire té els seus propis ports aleatoris i secrets d&amp;rsquo;usuari separats. Hi ha diversos agents treballant en els arbres de treball de git? No xocaran. Això és enorme per a eines com els agents de fons de VS Code que fan girar entorns paral·lels.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ulls d&amp;rsquo;agent a través de la telemetria.&lt;/strong&gt; Aquí és on es fa realment potent. L&amp;rsquo;Aspire CLI exposa dades completes d&amp;rsquo;OpenTelemetry durant el desenvolupament: traces, mètriques, registres estructurats. El vostre agent no només llegeix la sortida de la consola i espera el millor. Pot rastrejar una sol·licitud fallida entre serveis, perfilar punts finals lents i identificar exactament on es trenquen les coses. Això és observabilitat de grau de producció en el bucle de desenvolupament.&lt;/p&gt;
&lt;h2 id="lanalogia-del-para-xocs-de-bitlles"&gt;L&amp;rsquo;analogia del para-xocs de bitlles&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;equip d&amp;rsquo;Aspire utilitza una gran analogia: penseu en Aspire com a para-xocs de la pista de bitlles per als agents d&amp;rsquo;IA. Si l&amp;rsquo;agent no és perfecte (i no ho serà), els para-xocs eviten que llanci boles de canaló. La definició de pila evita la configuració incorrecta, el compilador detecta errors, la CLI gestiona la gestió del procés i la telemetria proporciona el bucle de retroalimentació.&lt;/p&gt;
&lt;p&gt;Combineu-ho amb alguna cosa com Playwright CLI i el vostre agent pot &lt;em&gt;utilitzar&lt;/em&gt; la vostra aplicació: fent clic a través dels fluxos, comprovant el DOM, veient coses trencades a la telemetria, arreglant el codi, reiniciant i provant de nou. Construir, executar, observar, arreglar. Aquest és el bucle de desenvolupament autònom que hem estat perseguint.&lt;/p&gt;
&lt;h2 id="primers-passos"&gt;Primers passos&lt;/h2&gt;
&lt;p&gt;Nou a Aspire? Instal·leu la CLI des de &lt;a href="https://get.aspire.dev"&gt;get.aspire.dev&lt;/a&gt; i seguiu la &lt;a href="https://aspire.dev/get-started/first-app"&gt;guia d&amp;rsquo;inici&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ja fas servir Aspire? Executeu &lt;code&gt;aspire update --self&lt;/code&gt; per obtenir 13.2 i, a continuació, indiqueu el vostre agent de codificació preferit al vostre repositori. Potser us sorprendrà quant s&amp;rsquo;avança amb les baranes d&amp;rsquo;Aspire al seu lloc.&lt;/p&gt;
&lt;h2 id="tancant"&gt;Tancant&lt;/h2&gt;
&lt;p&gt;Aspire 13.2 ja no és només un marc d&amp;rsquo;aplicacions distribuïdes, sinó que s&amp;rsquo;està convertint en una infraestructura d&amp;rsquo;agent essencial. Les definicions de pila estructurades, l&amp;rsquo;inici d&amp;rsquo;un sol comandament, les execucions paral·leles aïllades i la telemetria en temps real ofereixen als agents d&amp;rsquo;IA exactament el que necessiten per passar d&amp;rsquo;escriure codi a enviar aplicacions.&lt;/p&gt;
&lt;p&gt;Llegiu la &lt;a href="https://devblogs.microsoft.com/aspire/agentic-dev-aspirations/"&gt;publicació completa&lt;/a&gt; de l&amp;rsquo;equip d&amp;rsquo;Aspire per veure tots els detalls i vídeos de demostració.&lt;/p&gt;</content:encoded></item><item><title>Aquella configuració de Windows flotant de Visual Studio que no sabíeu (però hauríeu)</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/visual-studio-floating-windows-powertoys/</guid><description>Una configuració oculta de Visual Studio us ofereix un control total sobre les finestres flotants: entrades independents de la barra de tasques, un comportament adequat de diversos monitors i una perfecta integració de FancyZones. Un desplegable ho canvia tot.</description><content:encoded>&lt;p&gt;Si utilitzeu diversos monitors amb Visual Studio (i sincerament, qui no ho fa en aquests dies), probablement heu experimentat la molèstia: les finestres d&amp;rsquo;eines flotants desapareixen quan minimitzeu l&amp;rsquo;IDE principal, sempre es mantenen al capdavant de tota la resta i no apareixen com a botons separats de la barra de tasques. Funciona per a alguns fluxos de treball, però per a configuracions de diversos monitors és frustrant.&lt;/p&gt;
&lt;p&gt;Mads Kristensen de l&amp;rsquo;equip de Visual Studio &lt;a href="https://devblogs.microsoft.com/visualstudio/take-full-control-of-your-floating-windows-in-visual-studio/"&gt;ha compartit una configuració poc coneguda&lt;/a&gt; que canvia completament el comportament de les finestres flotants. Un desplegable. Això és tot.&lt;/p&gt;
&lt;h2 id="la-configuració"&gt;La configuració&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Eines &amp;gt; Opcions &amp;gt; Entorn &amp;gt; Windows &amp;gt; Finestres flotants&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;El menú desplegable &amp;ldquo;Aquestes finestres flotants són propietat de la finestra principal&amp;rdquo; té tres opcions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cap&lt;/strong&gt; — total independència. Cada finestra flotant té la seva pròpia entrada a la barra de tasques i es comporta com una finestra normal de Windows.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tool Windows&lt;/strong&gt; (per defecte): els documents floten lliurement, les finestres d&amp;rsquo;eines es mantenen lligades a l&amp;rsquo;IDE.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Finestres de documents i eines&lt;/strong&gt;: comportament clàssic de Visual Studio, tot lligat a la finestra principal.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="per-què-cap-és-el-moviment-per-a-les-configuracions-de-diversos-monitors"&gt;Per què &amp;ldquo;Cap&amp;rdquo; és el moviment per a les configuracions de diversos monitors&lt;/h2&gt;
&lt;p&gt;Estableix-lo a &lt;strong&gt;Cap&lt;/strong&gt; i, de sobte, totes les teves finestres i documents d&amp;rsquo;eines flotants es comporten com aplicacions de Windows reals. Apareixen a la barra de tasques, es mantenen visibles quan minimitzeu la finestra principal de Visual Studio i deixen de forçar-se al davant de tot.&lt;/p&gt;
&lt;p&gt;Combineu-ho amb &lt;strong&gt;PowerToys FancyZones&lt;/strong&gt; i és un canvi de joc. Creeu dissenys personalitzats als vostres monitors, col·loqueu el vostre Explorador de solucions a una zona, depureu a una altra i codifiqueu fitxers allà on vulgueu. Tot es manté, tot és accessible de manera independent i el vostre espai de treball se sent organitzat en lloc de caòtic.&lt;/p&gt;
&lt;h2 id="recomanacions-ràpides"&gt;Recomanacions ràpides&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Usuaris avançats amb monitors múltiples&lt;/strong&gt;: s&amp;rsquo;estableix en &lt;strong&gt;Cap&lt;/strong&gt;, s&amp;rsquo;acobla amb FancyZones&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flotants ocasionals&lt;/strong&gt;: &lt;strong&gt;Tool Windows&lt;/strong&gt; (per defecte) és un sòlid terme mitjà&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flux de treball tradicional&lt;/strong&gt;: &lt;strong&gt;Documents i Windows Tool&lt;/strong&gt; manté tot el clàssic&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Consell professional: &lt;strong&gt;Ctrl + feu doble clic&lt;/strong&gt; a la barra de títol de qualsevol finestra d&amp;rsquo;eina per flotar o acoblar-la a l&amp;rsquo;instant. No cal reiniciar després de canviar la configuració.&lt;/p&gt;
&lt;h2 id="tancant"&gt;Tancant&lt;/h2&gt;
&lt;p&gt;És una d&amp;rsquo;aquestes configuracions &amp;ldquo;No em puc creure que no sabia sobre això&amp;rdquo;. Si alguna vegada les finestres flotants a Visual Studio us han molestat, aneu a canviar-ho ara mateix.&lt;/p&gt;
&lt;p&gt;Llegiu la &lt;a href="https://devblogs.microsoft.com/visualstudio/take-full-control-of-your-floating-windows-in-visual-studio/"&gt;publicació completa&lt;/a&gt; per obtenir els detalls i les captures de pantalla.&lt;/p&gt;</content:encoded></item><item><title>Connecteu els vostres servidors MCP a les funcions d'Azure amb els agents de Foundry: aquí teniu com</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/foundry-agents-mcp-servers-azure-functions/</guid><description>Creeu el vostre servidor MCP una vegada, implementeu-lo a Azure Functions i connecteu-lo als agents de Microsoft Foundry amb l'autenticació adequada. Les vostres eines funcionen a tot arreu: VS Code, Cursor i ara agents d'IA empresarials.</description><content:encoded>&lt;p&gt;Aquí hi ha una cosa que m&amp;rsquo;encanta de l&amp;rsquo;ecosistema MCP: creeu el vostre servidor una vegada i funciona a tot arreu. VS Code, Visual Studio, Cursor, ChatGPT: cada client MCP pot descobrir i utilitzar les vostres eines. Ara, Microsoft afegeix un altre consumidor a aquesta llista: agents de Foundry.&lt;/p&gt;
&lt;p&gt;Lily Ma de l&amp;rsquo;equip d&amp;rsquo;Azure SDK &lt;a href="https://devblogs.microsoft.com/azure-sdk/give-your-foundry-agent-custom-tools-with-mcp-servers-on-azure-functions/"&gt;va publicar una guia pràctica&lt;/a&gt; sobre la connexió de servidors MCP desplegats a Azure Functions amb agents de Microsoft Foundry. Si ja teniu un servidor MCP, això és pur valor afegit, no cal reconstruir-lo.&lt;/p&gt;
&lt;h2 id="per-què-aquesta-combinació-té-sentit"&gt;Per què aquesta combinació té sentit&lt;/h2&gt;
&lt;p&gt;Azure Functions us ofereix una infraestructura escalable, una autenticació integrada i una facturació sense servidor per allotjar servidors MCP. Microsoft Foundry us ofereix agents d&amp;rsquo;IA que poden raonar, planificar i prendre accions. Connectar les dues significa que les vostres eines personalitzades (consultar una base de dades, trucar a una API empresarial, executar una lògica de validació) esdevenen capacitats que els agents d&amp;rsquo;IA empresarials poden descobrir i utilitzar de manera autònoma.&lt;/p&gt;
&lt;p&gt;El punt clau: el vostre servidor MCP es manté igual. Només esteu afegint Foundry com un altre consumidor. Les mateixes eines que funcionen a la configuració de VS Code ara alimenten un agent d&amp;rsquo;IA amb el qual interactuen el vostre equip o clients.&lt;/p&gt;
&lt;h2 id="opcions-dautenticació"&gt;Opcions d&amp;rsquo;autenticació&lt;/h2&gt;
&lt;p&gt;Aquí és on la publicació realment afegeix valor. Quatre mètodes d&amp;rsquo;autenticació segons el vostre escenari:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mètode&lt;/th&gt;
&lt;th&gt;Cas d&amp;rsquo;ús&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Basat en clau&lt;/strong&gt; (per defecte)&lt;/td&gt;
&lt;td&gt;Desenvolupament o servidors sense autenticació Entra&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Entrada de Microsoft&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Producció amb identitats gestionades&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Transmissió d&amp;rsquo;identitat OAuth&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Producció on cada usuari s&amp;rsquo;autentica individualment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;No autenticat&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Desenvolupament/proves o dades públiques només&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Per a la producció, el camí recomanat és Microsoft Entra amb la identitat de l&amp;rsquo;agent. El pas d&amp;rsquo;identitat d&amp;rsquo;OAuth és per quan el context de l&amp;rsquo;usuari importa: l&amp;rsquo;agent demana als usuaris que iniciïn sessió i cada sol·licitud porta el testimoni propi de l&amp;rsquo;usuari.&lt;/p&gt;
&lt;h2 id="configurant-lo"&gt;Configurant-lo&lt;/h2&gt;
&lt;p&gt;El flux d&amp;rsquo;alt nivell:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Implementeu el vostre servidor MCP a Azure Functions&lt;/strong&gt;: mostres disponibles per a &lt;a href="https://github.com/Azure-Samples/remote-mcp-functions-dotnet"&gt;.NET&lt;/a&gt;, Python, TypeScript i Java&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Activa l&amp;rsquo;autenticació MCP integrada&lt;/strong&gt; a l&amp;rsquo;aplicació de funcions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Obteniu l&amp;rsquo;URL del vostre punt final&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;Afegiu el servidor MCP com a eina a Foundry&lt;/strong&gt;: aneu al vostre agent al portal, afegiu una eina MCP nova, proporcioneu el punt final i les credencials.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A continuació, proveu-ho al parc infantil de l&amp;rsquo;Agent Builder enviant un missatge que activaria una de les vostres eines.&lt;/p&gt;
&lt;h2 id="la-meva-opinió"&gt;La meva opinió&lt;/h2&gt;
&lt;p&gt;La història de la composició aquí s&amp;rsquo;està fent molt forta. Creeu el vostre servidor MCP una vegada a.NET (o Python, TypeScript, Java), implementeu-lo a Azure Functions i tots els clients compatibles amb MCP el podran utilitzar: eines de codificació, aplicacions de xat i ara agents d&amp;rsquo;IA empresarials. Aquest és un patró &amp;ldquo;Escriu una vegada, utilitza a tot arreu&amp;rdquo; que realment funciona.&lt;/p&gt;
&lt;p&gt;Per als desenvolupadors de.NET específicament, l&amp;rsquo;&lt;a href="https://github.com/Azure-Samples/remote-mcp-functions-dotnet"&gt;extensió MCP d&amp;rsquo;Azure Functions&lt;/a&gt; ho fa senzill. Definiu les vostres eines com a Azure Functions, les implementeu i disposeu d&amp;rsquo;un servidor MCP de nivell de producció amb tota la seguretat i escala que ofereix Azure Functions.&lt;/p&gt;
&lt;h2 id="tancant"&gt;Tancant&lt;/h2&gt;
&lt;p&gt;Si teniu eines MCP que s&amp;rsquo;executen a Azure Functions, connectar-les als agents de Foundry és una victòria ràpida: les vostres eines personalitzades es converteixen en capacitats d&amp;rsquo;IA empresarial amb una autenticació adequada i sense canvis de codi al propi servidor.&lt;/p&gt;
&lt;p&gt;Llegiu la &lt;a href="https://devblogs.microsoft.com/azure-sdk/give-your-foundry-agent-custom-tools-with-mcp-servers-on-azure-functions/"&gt;guia completa&lt;/a&gt; per obtenir instruccions pas a pas sobre cada mètode d&amp;rsquo;autenticació i consulteu la &lt;a href="https://learn.microsoft.com/azure/azure-functions/functions-mcp-foundry-tools?tabs=entra%2Cmcp-extension%2Cfoundry"&gt;documentació detallada&lt;/a&gt; per a les configuracions de producció.&lt;/p&gt;</content:encoded></item><item><title>Creació d'interfícies d'usuari multiagent en temps real que no semblin com una caixa negra</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/ag-ui-real-time-multi-agent-ui-maf/</guid><description>AG-UI i Microsoft Agent Framework s'uneixen per oferir als fluxos de treball multiagent una interfície adequada, amb transmissió en temps real, aprovacions humanes i visibilitat total del que estan fent els vostres agents.</description><content:encoded>&lt;p&gt;Això és el que passa amb els sistemes multiagent: tenen un aspecte increïble a les demostracions. Tres agents que passen treballant, resolent problemes, prenent decisions. Aleshores intentes posar-ho davant dels usuaris reals i&amp;hellip; silenci. Un indicador de gir. No hi ha idea de quin agent està fent què o per què el sistema està en pausa. Això no és un producte, és un problema de confiança.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;equip de Microsoft Agent Framework acaba de publicar una &lt;a href="https://devblogs.microsoft.com/agent-framework/ag-ui-multi-agent-workflow-demo/"&gt;revisió fantàstica&lt;/a&gt; sobre la combinació de fluxos de treball MAF amb &lt;a href="https://github.com/ag-ui-protocol/ag-ui"&gt;AG-UI&lt;/a&gt;, un protocol obert per a esdeveniments d&amp;rsquo;execució d&amp;rsquo;agents de transmissió a una interfície sobre esdeveniments enviats pel servidor. I sincerament? Aquest és el tipus de pont que hem trobat a faltar.&lt;/p&gt;
&lt;h2 id="per-què-això-és-important-per-als-desenvolupadors-denet"&gt;Per què això és important per als desenvolupadors de.NET&lt;/h2&gt;
&lt;p&gt;Si esteu creant aplicacions basades en intel·ligència artificial, probablement heu tocat aquest mur. La vostra orquestració de fons funciona molt bé: els agents s&amp;rsquo;entreguen, les eines es disparen i es prenen decisions. Però la interfície no té ni idea del que passa darrere de les escenes. AG-UI ho soluciona mitjançant la definició d&amp;rsquo;un protocol estàndard per als esdeveniments de l&amp;rsquo;agent de transmissió (penseu 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;) directament a la vostra capa d&amp;rsquo;IU a través de SSE.&lt;/p&gt;
&lt;p&gt;La demostració que van crear és un flux de treball d&amp;rsquo;atenció al client amb tres agents: un agent de triatge que encamina les sol·licituds, un agent de reemborsament que gestiona els diners i un agent de comandes que gestiona les substitucions. Cada agent té les seves pròpies eines i la topologia de traspàs es defineix explícitament: no hi ha vibracions de &amp;ldquo;esbrinar-ho a partir del missatge&amp;rdquo;.&lt;/p&gt;
&lt;h2 id="la-topologia-de-traspàs-és-la-veritable-estrella"&gt;La topologia de traspàs és la veritable estrella&lt;/h2&gt;
&lt;p&gt;El que em va cridar l&amp;rsquo;atenció és com &lt;code&gt;HandoffBuilder&lt;/code&gt; us permet declarar un gràfic d&amp;rsquo;encaminament dirigit entre agents:&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;Cada &lt;code&gt;add_handoff&lt;/code&gt; crea una vora dirigida amb una descripció en llenguatge natural. El marc genera eines de transferència per a cada agent basant-se en aquesta topologia. Per tant, les decisions d&amp;rsquo;encaminament es basen en la vostra estructura d&amp;rsquo;orquestració, no només en el que el LLM vulgui fer. Això és un gran negoci per a la fiabilitat de la producció.&lt;/p&gt;
&lt;h2 id="human-in-the-loop-que-realment-funciona"&gt;Human-in-the-loop que realment funciona&lt;/h2&gt;
&lt;p&gt;La demostració mostra dos patrons d&amp;rsquo;interrupció que necessita qualsevol aplicació d&amp;rsquo;agent del món real:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;L&amp;rsquo;aprovació de l&amp;rsquo;eina s&amp;rsquo;interromp&lt;/strong&gt;: quan un agent truca a una eina marcada amb &lt;code&gt;approval_mode=&amp;quot;always_require&amp;quot;&lt;/code&gt;, el flux de treball s&amp;rsquo;atura i emet un esdeveniment. La interfície representa un modal d&amp;rsquo;aprovació amb el nom de l&amp;rsquo;eina i els arguments. No hi ha bucles de reintent de gravació de testimonis, només un flux net de pausa, aprovació i reinici.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;La sol·licitud d&amp;rsquo;informació s&amp;rsquo;interromp&lt;/strong&gt;: quan un agent necessita més context de l&amp;rsquo;usuari (com ara un identificador de comanda), s&amp;rsquo;atura i pregunta. La interfície mostra la pregunta, l&amp;rsquo;usuari respon i l&amp;rsquo;execució es reprèn exactament des d&amp;rsquo;on es va aturar.&lt;/p&gt;
&lt;p&gt;Tots dos patrons es transmeten com a esdeveniments AG-UI estàndard, de manera que la vostra interfície no necessita lògica personalitzada per agent; només representa qualsevol esdeveniment que passi a través de la connexió SSE.&lt;/p&gt;
&lt;h2 id="el-cablejat-és-sorprenentment-senzill"&gt;El cablejat és sorprenentment senzill&lt;/h2&gt;
&lt;p&gt;La integració entre MAF i AG-UI és una única trucada de funció:&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;El &lt;code&gt;workflow_factory&lt;/code&gt; crea un flux de treball nou per fil, de manera que cada conversa té un estat aïllat. El punt final gestiona tota la fontaneria SSE automàticament. Si ja esteu utilitzant FastAPI (o podeu afegir-lo com a capa lleugera), això és gairebé zero fricció.&lt;/p&gt;
&lt;h2 id="la-meva-opinió"&gt;La meva opinió&lt;/h2&gt;
&lt;p&gt;Per als desenvolupadors de.NET, la pregunta immediata és: &amp;ldquo;Puc fer això en C#?&amp;rdquo; L&amp;rsquo;Agent Framework està disponible tant per a.NET com per a Python, i el protocol AG-UI és independent de l&amp;rsquo;idioma (només és SSE). Així, mentre que aquesta demostració específica utilitza Python i FastAPI, el patró es tradueix directament. Podeu connectar una API mínima ASP.NET Core amb punts finals SSE seguint el mateix esquema d&amp;rsquo;esdeveniments AG-UI.&lt;/p&gt;
&lt;p&gt;El més important és que les interfícies d&amp;rsquo;usuari multiagent s&amp;rsquo;estan convertint en una preocupació de primera classe, no en una idea posterior. Si esteu creant qualsevol cosa on els agents interactuen amb humans (atenció al client, fluxos de treball d&amp;rsquo;aprovació, processament de documents), aquesta combinació d&amp;rsquo;orquestració MAF i transparència AG-UI és el patró a seguir.&lt;/p&gt;
&lt;h2 id="tancant"&gt;Tancant&lt;/h2&gt;
&lt;p&gt;AG-UI + Microsoft Agent Framework us ofereix el millor dels dos mons: una robusta orquestració multiagent al backend i visibilitat en temps real al frontend. No més interaccions d&amp;rsquo;agent de caixa negra.&lt;/p&gt;
&lt;p&gt;Fes una ullada a la &lt;a href="https://devblogs.microsoft.com/agent-framework/ag-ui-multi-agent-workflow-demo/"&gt;revisió completa&lt;/a&gt; i al &lt;a href="https://github.com/ag-ui-protocol/ag-ui"&gt;repositori del protocol AG-UI&lt;/a&gt; per aprofundir.&lt;/p&gt;</content:encoded></item><item><title>El mode aïllat d'Aspire soluciona el malson del conflicte del port per al desenvolupament paral·lel</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/aspire-isolated-mode-parallel-instances/</guid><description>Aspire 13.2 introdueix el mode --isolated: ports aleatoris, secrets separats i zero col·lisions quan s'executen diverses instàncies del mateix AppHost. Perfecte per a agents d'IA, arbres de treball i fluxos de treball paral·lels.</description><content:encoded>&lt;p&gt;Si alguna vegada has provat d&amp;rsquo;executar dues instàncies del mateix projecte al mateix temps, saps el dolor. El port 8080 ja està en ús. S&amp;rsquo;ha pres el port 17370. Matar alguna cosa, reiniciar, fer malabars amb les variables d&amp;rsquo;entorn: és un assassí de la productivitat.&lt;/p&gt;
&lt;p&gt;Aquest problema empitjora, no millora. Els agents d&amp;rsquo;IA creen arbres de treball git per treballar de manera independent. Els agents de fons generen entorns separats. Els desenvolupadors comproven el mateix repositori dues vegades per a les branques de funcions. Cadascun d&amp;rsquo;aquests escenaris toca el mateix mur: dues instàncies de la mateixa aplicació lluitant pels mateixos ports.&lt;/p&gt;
&lt;p&gt;Aspire 13.2 soluciona això amb una sola bandera. James Newton-King de l&amp;rsquo;equip d&amp;rsquo;Aspire &lt;a href="https://devblogs.microsoft.com/aspire/aspire-isolated-mode-parallel-development/"&gt;va escriure tots els detalls&lt;/a&gt;, i és una d&amp;rsquo;aquestes característiques de &amp;ldquo;per què no vam tenir això abans&amp;rdquo;.&lt;/p&gt;
&lt;h2 id="la-correcció---isolated"&gt;La correcció: &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;Això és tot. Cada cursa obté:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ports aleatoris&lt;/strong&gt;: no hi ha més col·lisions entre instàncies&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Secrets d&amp;rsquo;usuari aïllats&lt;/strong&gt;: les cadenes de connexió i les claus API es mantenen separades per instància&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No hi ha reasignació manual del port. Sense malabars amb variables d&amp;rsquo;entorn. Cada cursa obté un entorn fresc i lliure de col·lisions automàticament.&lt;/p&gt;
&lt;h2 id="escenaris-reals-on-això-brilla"&gt;Escenaris reals on això brilla&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Múltiples pagaments.&lt;/strong&gt; Tens una branca de funcions en un directori i una correcció d&amp;rsquo;errors en un altre:&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;Tots dos funcionen sense conflictes. El tauler mostra què s&amp;rsquo;està executant i on.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Agents de fons a VS Code.&lt;/strong&gt; Quan l&amp;rsquo;agent de fons de Copilot Chat crea un arbre de treball git per treballar amb el vostre codi de manera independent, pot ser que hagi d&amp;rsquo;executar l&amp;rsquo;Aspire AppHost. Sense &lt;code&gt;--isolated&lt;/code&gt;, això és una col·lisió de port amb el vostre arbre de treball principal. Amb ell, ambdues instàncies només funcionen.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;habilitat d&amp;rsquo;Aspire que s&amp;rsquo;envia amb &lt;code&gt;aspire agent init&lt;/code&gt; indica automàticament als agents que utilitzin &lt;code&gt;--isolated&lt;/code&gt; quan treballen en arbres de treball. Per tant, l&amp;rsquo;agent de fons de Copilot hauria de gestionar-ho des de la caixa.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Proves d&amp;rsquo;integració juntament amb el desenvolupament.&lt;/strong&gt; Necessites fer proves amb un AppHost en directe mentre continues creant funcions? El mode aïllat dóna a cada context els seus propis ports i configuració.&lt;/p&gt;
&lt;h2 id="com-funciona-sota-el-capó"&gt;Com funciona sota el capó&lt;/h2&gt;
&lt;p&gt;Quan passeu &lt;code&gt;--isolated&lt;/code&gt;, la CLI genera un ID d&amp;rsquo;instància únic per a l&amp;rsquo;execució. Això provoca dos comportaments:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Aleatoria de ports&lt;/strong&gt;: en lloc d&amp;rsquo;unir-se a ports previsibles definits a la configuració de l&amp;rsquo;AppHost, el mode aïllat tria els ports disponibles aleatòriament per a tot: el tauler de control, els punts finals del servei, tot això. El descobriment de serveis s&amp;rsquo;ajusta automàticament, de manera que els serveis es troben entre ells independentment dels ports on aterren.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Aïllament secret&lt;/strong&gt;: cada execució aïllada obté el seu propi magatzem de secrets d&amp;rsquo;usuari, clau per l&amp;rsquo;ID de la instància. Les cadenes de connexió i les claus API d&amp;rsquo;una execució no es filtren a una altra.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;El vostre codi no necessita cap canvi. El descobriment de serveis d&amp;rsquo;Aspire resol els punts finals en temps d&amp;rsquo;execució, de manera que tot es connecta correctament independentment de l&amp;rsquo;assignació del port.&lt;/p&gt;
&lt;h2 id="quan-utilitzar-lo"&gt;Quan utilitzar-lo&lt;/h2&gt;
&lt;p&gt;Utilitzeu &lt;code&gt;--isolated&lt;/code&gt; quan executeu diverses instàncies del mateix AppHost simultàniament, tant si es tracta de desenvolupament paral·lel, proves automatitzades, agents d&amp;rsquo;IA o arbres de treball de git. Per al desenvolupament d&amp;rsquo;una sola instància on preferiu ports previsibles, &lt;code&gt;aspire run&lt;/code&gt; normal encara funciona bé.&lt;/p&gt;
&lt;h2 id="tancant"&gt;Tancant&lt;/h2&gt;
&lt;p&gt;El mode aïllat és una petita característica que resol un problema real i cada cop més comú. A mesura que el desenvolupament assistit per IA ens empeny cap a fluxos de treball més paral·lels (múltiples agents, múltiples arbres de treball, múltiples contextos), la capacitat de fer girar una altra instància sense lluitar pels ports és essencial.&lt;/p&gt;
&lt;p&gt;Llegiu la &lt;a href="https://devblogs.microsoft.com/aspire/aspire-isolated-mode-parallel-development/"&gt;publicació completa&lt;/a&gt; per obtenir tots els detalls tècnics i proveu-ho amb &lt;code&gt;aspire update --self&lt;/code&gt; per obtenir 13.2.&lt;/p&gt;</content:encoded></item><item><title>L'avaluació de la modernització de GitHub Copilot és la millor eina de migració que encara no feu servir</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/dotnet-modernization-assessment-github-copilot/</guid><description>L'extensió de modernització de GitHub Copilot no només suggereix canvis de codi, sinó que produeix una avaluació completa de la migració amb problemes accionables, comparacions d'objectius d'Azure i un flux de treball col·laboratiu. Heus aquí per què el document d'avaluació és la clau de tot.</description><content:encoded>&lt;p&gt;Migrar una aplicació.NET Framework heretada a.NET moderna és una d&amp;rsquo;aquestes tasques que tothom sap que hauria de fer, però ningú vol començar. Mai és només &amp;ldquo;canviar el marc objectiu&amp;rdquo;. Són les API que van desaparèixer, paquets que ja no existeixen, models d&amp;rsquo;allotjament que funcionen d&amp;rsquo;una manera completament diferent i un milió de petites decisions sobre què contener, què reescriure i què deixar en pau.&lt;/p&gt;
&lt;p&gt;Jeffrey Fritz acaba de publicar una &lt;a href="https://devblogs.microsoft.com/dotnet/your-migrations-source-of-truth-the-modernization-assessment/"&gt;immersió profunda en l&amp;rsquo;avaluació de la modernització de GitHub Copilot&lt;/a&gt;, i sincerament? Aquesta és la millor eina de migració que he vist per a.NET. No a causa de la generació de codi, això és ara l&amp;rsquo;aposta de la taula. Pel document d&amp;rsquo;avaluació que elabora.&lt;/p&gt;
&lt;h2 id="no-és-només-un-motor-de-suggeriments-de-codi"&gt;No és només un motor de suggeriments de codi&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;extensió VS Code segueix un model &lt;strong&gt;Avaluar → Planificar → Executar&lt;/strong&gt;. La fase d&amp;rsquo;avaluació analitza tota la vostra base de codi i produeix un document estructurat que ho recull tot: què cal canviar, quins recursos d&amp;rsquo;Azure proveir, quin model de desplegament utilitzar. Tot el que hi ha a baix (infraestructura com a codi, contenidors, manifestos de desplegament) depèn del que troba l&amp;rsquo;avaluació.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;avaluació s&amp;rsquo;emmagatzema a &lt;code&gt;.github/modernize/assessment/&lt;/code&gt; del vostre projecte. Cada execució produeix un informe independent, de manera que creeu un historial i podeu fer un seguiment de com evoluciona la vostra postura de migració a mesura que solucioneu els problemes.&lt;/p&gt;
&lt;h2 id="dues-maneres-de-començar"&gt;Dues maneres de començar&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Avaluació recomanada&lt;/strong&gt;: el camí ràpid. Trieu entre dominis seleccionats (actualització de Java/.NET, preparació al núvol, seguretat) i obteniu resultats significatius sense tocar la configuració. Ideal per a una primera mirada a on es troba la teva aplicació.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Avaluació personalitzada&lt;/strong&gt;: el camí objectiu. Configureu exactament què voleu analitzar: càlcul objectiu (App Service, AKS, Container Apps), sistema operatiu objectiu, anàlisi de contenidors. Trieu diversos objectius d&amp;rsquo;Azure per comparar els enfocaments de migració de manera conjunta.&lt;/p&gt;
&lt;p&gt;Aquesta visió de comparació és realment útil. Una aplicació amb 3 problemes obligatoris per a App Service pot tenir 7 per a AKS. Veure tots dos ajuda a impulsar la decisió d&amp;rsquo;allotjament abans de comprometre&amp;rsquo;s amb una ruta de migració.&lt;/p&gt;
&lt;h2 id="el-desglossament-del-problema-és-accionable"&gt;El desglossament del problema és accionable&lt;/h2&gt;
&lt;p&gt;Cada problema ve amb un nivell de criticitat:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Obligatori&lt;/strong&gt;: s&amp;rsquo;ha de solucionar o la migració falla&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Potencial&lt;/strong&gt;: pot afectar la migració, necessita el judici humà&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Opcional&lt;/strong&gt;: millores recomanades, no bloquejaran la migració&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I cada problema enllaça amb fitxers i números de línia afectats, proporciona una descripció detallada del que està malament i per què és important per a la vostra plataforma objectiu, ofereix passos concrets de correcció (no només &amp;ldquo;arreglar-ho&amp;rdquo;) i inclou enllaços a documentació oficial.&lt;/p&gt;
&lt;p&gt;Podeu lliurar problemes individuals als desenvolupadors i aquests tenen tot el que necessiten per actuar. Aquesta és la diferència entre una eina que us diu &amp;ldquo;hi ha un problema&amp;rdquo; i una que us indica com resoldre&amp;rsquo;l.&lt;/p&gt;
&lt;h2 id="els-camins-dactualització-coberts"&gt;Els camins d&amp;rsquo;actualització coberts&lt;/h2&gt;
&lt;p&gt;Específicament per a.NET:
-.NET Framework →.NET 10&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ASP.NET → ASP.NET Core&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cada camí d&amp;rsquo;actualització té regles de detecció que coneixen quines API s&amp;rsquo;han eliminat, quins patrons no tenen cap equivalent directe i quins problemes de seguretat necessiten atenció.&lt;/p&gt;
&lt;p&gt;Per als equips que gestionen diverses aplicacions, també hi ha una CLI que admet avaluacions per lots multirepositori: cloneu tots els repositoris, avalueu-los tots, obteniu informes per aplicació i una visualització de cartera agregada.&lt;/p&gt;
&lt;h2 id="la-meva-opinió"&gt;La meva opinió&lt;/h2&gt;
&lt;p&gt;Si esteu asseguts en aplicacions heretades de.NET Framework (i siguem reals, la majoria dels equips empresarials ho són), aquesta és &lt;em&gt;l&amp;rsquo;eina&lt;/em&gt; per començar. Només el document d&amp;rsquo;avaluació val la pena el temps: converteix un vague &amp;ldquo;hauríem de modernitzar&amp;rdquo; en una llista concreta i prioritzada d&amp;rsquo;elements de treball amb camins clars.&lt;/p&gt;
&lt;p&gt;El flux de treball col·laboratiu també és intel·ligent: exporteu avaluacions, compartiu amb el vostre equip, importeu-les sense tornar-les a executar. Revisions d&amp;rsquo;arquitectura on els que prenen les decisions no són els que executen les eines? Coberta.&lt;/p&gt;
&lt;h2 id="tancant"&gt;Tancant&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;avaluació de la modernització de GitHub Copilot transforma la migració.NET d&amp;rsquo;un projecte aterridor i indefinit a un procés estructurat i rastrejable. Comenceu amb una avaluació recomanada per veure on us trobeu i, a continuació, utilitzeu avaluacions personalitzades per comparar els objectius d&amp;rsquo;Azure i crear el vostre pla de migració.&lt;/p&gt;
&lt;p&gt;Llegiu el &lt;a href="https://devblogs.microsoft.com/dotnet/your-migrations-source-of-truth-the-modernization-assessment/"&gt;tutorial complet&lt;/a&gt; i agafeu l&amp;rsquo;&lt;a href="https://aka.ms/ghcp-appmod/vscode-ext"&gt;extensió del codi VS&lt;/a&gt; per provar-ho a la vostra pròpia base de codi.&lt;/p&gt;</content:encoded></item><item><title>L'enginyeria de la plataforma agentica s'està tornant real: Git-APE mostra com</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/agentic-platform-engineering-git-ape/</guid><description>El projecte Git-APE de Microsoft posa en pràctica l'enginyeria de plataformes agents, utilitzant agents GitHub Copilot i Azure MCP per convertir les sol·licituds de llenguatge natural en una infraestructura de núvol validada.</description><content:encoded>&lt;p&gt;L&amp;rsquo;enginyeria de plataformes ha estat un d&amp;rsquo;aquells termes que sona molt bé a les conferències, però normalment significa &amp;ldquo;vam construir un portal intern i un embolcall de Terraform&amp;rdquo;. La veritable promesa: una infraestructura d&amp;rsquo;autoservei que és realment segura, governada i ràpida, sempre ha estat a pocs passos.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;equip d&amp;rsquo;Azure acaba de publicar la &lt;a href="https://devblogs.microsoft.com/all-things-azure/putting-agentic-platform-engineering-to-the-test/"&gt;Part 2 de la seva sèrie d&amp;rsquo;enginyeria de plataformes agents&lt;/a&gt;, i aquesta tracta sobre la implementació pràctica. L&amp;rsquo;anomenen &lt;strong&gt;Git-APE&lt;/strong&gt; (sí, l&amp;rsquo;acrònim és intencionat) i és un projecte de codi obert que utilitza agents GitHub Copilot més servidors Azure MCP per convertir les sol·licituds de llenguatge natural en una infraestructura validada i desplegada.&lt;/p&gt;
&lt;h2 id="què-fa-realment-git-ape"&gt;Què fa realment Git-APE&lt;/h2&gt;
&lt;p&gt;La idea bàsica: en lloc que els desenvolupadors aprenguin mòduls de Terraform, naveguin per les interfícies d&amp;rsquo;usuari del portal o presenten entrades a un equip de plataforma, parlen amb un agent Copilot. L&amp;rsquo;agent interpreta la intenció, genera Infrastructure-as-Code, la valida amb polítiques i desplega, tot dins de VS Code.&lt;/p&gt;
&lt;p&gt;Aquí teniu la configuració:&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;Obriu l&amp;rsquo;espai de treball a VS Code i GitHub Copilot descobreix automàticament els fitxers de configuració de l&amp;rsquo;agent. Interacciones directament amb l&amp;rsquo;agent:&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;agent utilitza Azure MCP Server sota el capó per interactuar amb els serveis d&amp;rsquo;Azure. La configuració de MCP a la configuració del codi VS permet capacitats específiques:&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="per-què-això-és-important"&gt;Per què això és important&lt;/h2&gt;
&lt;p&gt;Per a aquells que estem construint a Azure, això canvia la conversa sobre l&amp;rsquo;enginyeria de la plataforma de &amp;ldquo;com construïm un portal&amp;rdquo; a &amp;ldquo;com descriurem les nostres baranes com a API&amp;rdquo;. Quan la interfície de la vostra plataforma és un agent d&amp;rsquo;IA, la qualitat de les vostres limitacions i polítiques es converteix en el producte.&lt;/p&gt;
&lt;p&gt;El bloc de la Part 1 va exposar la teoria: les API ben descrites, els esquemes de control i les baranes explícites fan que les plataformes estiguin preparades per a agents. La part 2 demostra que funciona enviant eines reals. L&amp;rsquo;agent no només genera recursos a cegues, sinó que valida les millors pràctiques, respecta les convencions de denominació i aplica les polítiques de la vostra organització.&lt;/p&gt;
&lt;p&gt;La neteja és igual de fàcil:&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-meva-opinió"&gt;La meva opinió&lt;/h2&gt;
&lt;p&gt;Seré sincer: aquest tracta més del patró que de l&amp;rsquo;eina específica. El mateix Git-APE és una arquitectura de demostració/referència. Però la idea subjacent (agents com a interfície de la vostra plataforma, MCP com a protocol, GitHub Copilot com a amfitrió) és cap a on es dirigeix ​​l&amp;rsquo;experiència dels desenvolupadors empresarials.&lt;/p&gt;
&lt;p&gt;Si sou un equip de plataformes que mira com fer que els vostres agents d&amp;rsquo;eines internes siguin amigables, no hi ha millor punt de partida. I si sou un desenvolupador de.NET i us pregunteu com es connecta això amb el vostre món: els agents Azure MCP Server i GitHub Copilot funcionen amb qualsevol càrrega de treball d&amp;rsquo;Azure. La vostra API ASP.NET Core, la vostra pila.NET Aspire, els vostres microserveis en contenidors: tot això pot ser l&amp;rsquo;objectiu d&amp;rsquo;un flux de desplegament agent.&lt;/p&gt;
&lt;h2 id="tancant"&gt;Tancant&lt;/h2&gt;
&lt;p&gt;Git-APE és una visió primerenca però concreta de l&amp;rsquo;enginyeria de plataformes agències a la pràctica. Cloneu el &lt;a href="https://github.com/Azure/git-ape"&gt;repo&lt;/a&gt;, proveu la demostració i comenceu a pensar com haurien de buscar un agent per utilitzar-los de manera segura les API i les polítiques de la vostra plataforma.&lt;/p&gt;
&lt;p&gt;Llegiu la &lt;a href="https://devblogs.microsoft.com/all-things-azure/putting-agentic-platform-engineering-to-the-test/"&gt;publicació completa&lt;/a&gt; per a la guia i les demostracions de vídeo.&lt;/p&gt;</content:encoded></item><item><title>Les aplicacions MCP obtenen una API fluida: creeu interfícies d'usuari d'eines d'IA rica a.NET amb tres passos</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/mcp-fluent-api-azure-functions-dotnet/</guid><description>La nova API de configuració fluida per a aplicacions MCP a Azure Functions us permet convertir qualsevol eina.NET MCP en una aplicació completa amb vistes, permisos i polítiques de CSP en poques línies de codi.</description><content:encoded>&lt;p&gt;Les eines MCP són excel·lents per oferir capacitats als agents d&amp;rsquo;IA. Però, què passa si la vostra eina ha de mostrar alguna cosa a l&amp;rsquo;usuari: un tauler, un formulari, una visualització interactiva? Aquí és on entren les aplicacions MCP i són molt més fàcils de crear.&lt;/p&gt;
&lt;p&gt;Lilian Kasem de l&amp;rsquo;equip de l&amp;rsquo;SDK d&amp;rsquo;Azure &lt;a href="https://devblogs.microsoft.com/azure-sdk/mcp-as-easy-as-1-2-3-introducing-the-fluent-api-for-mcp-apps/"&gt;va presentar la nova API de configuració fluida&lt;/a&gt; per a les aplicacions MCP a.NET Azure Functions, i és el tipus de millora de l&amp;rsquo;experiència dels desenvolupadors que us fa preguntar-vos per què no sempre va ser tan senzill.&lt;/p&gt;
&lt;h2 id="què-són-les-aplicacions-mcp"&gt;Què són les aplicacions MCP?&lt;/h2&gt;
&lt;p&gt;Les aplicacions MCP amplien el protocol de context del model deixant que les eines portin les seves pròpies vistes d&amp;rsquo;interfície d&amp;rsquo;usuari, actius estàtics i controls de seguretat. En lloc de només retornar text, la vostra eina MCP pot representar experiències HTML completes (taulers interactius, visualitzacions de dades, formularis de configuració), tot això invocable pels agents d&amp;rsquo;IA i presentat als usuaris pels clients MCP.&lt;/p&gt;
&lt;p&gt;El problema va ser que el cablejat de tot això manualment requeria conèixer íntimament les especificacions MCP: &lt;code&gt;ui://&lt;/code&gt; URI, tipus de mime especials, coordinació de metadades entre eines i recursos. No és difícil, però complicat.&lt;/p&gt;
&lt;h2 id="lapi-fluida-en-tres-passos"&gt;L&amp;rsquo;API fluida en tres passos&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Pas 1: defineix la teva funció.&lt;/strong&gt; Només una eina MCP estàndard d&amp;rsquo;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;Pas 2: promocioneu-lo a una aplicació MCP.&lt;/strong&gt; A l&amp;rsquo;inici del vostre programa:&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;Pas 3: afegiu la vostra vista HTML.&lt;/strong&gt; Creeu &lt;code&gt;assets/hello-app.html&lt;/code&gt; amb la interfície d&amp;rsquo;usuari que necessiteu.&lt;/p&gt;
&lt;p&gt;Això és tot. L&amp;rsquo;API fluida gestiona tota la fontaneria d&amp;rsquo;especificacions MCP: genera la funció de recursos sintètics, estableix el tipus de mime correcte, injecta les metadades que connecten l&amp;rsquo;eina a la seva vista.&lt;/p&gt;
&lt;h2 id="la-superfície-de-lapi-està-ben-dissenyada"&gt;La superfície de l&amp;rsquo;API està ben dissenyada&lt;/h2&gt;
&lt;p&gt;Algunes coses que m&amp;rsquo;agraden molt:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les fonts de visualització són flexibles.&lt;/strong&gt; Podeu publicar HTML des de fitxers al disc o inserir recursos directament al vostre conjunt per a desplegaments autònoms:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithView&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;McpViewSource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FromFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;assets/my-view.html&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithView&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;McpViewSource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FromEmbeddedResource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;MyApp.Resources.view.html&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;CSP es pot redactar.&lt;/strong&gt; Llista de permisos explícita que els orígens de la teva aplicació necessita, seguint els principis de privilegis mínims. Truqueu a &lt;code&gt;WithCsp&lt;/code&gt; diverses vegades i els orígens s&amp;rsquo;acumulen:&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;Control de visibilitat.&lt;/strong&gt; Podeu fer que una eina només sigui visible per al LLM, només per a la interfície d&amp;rsquo;usuari de l&amp;rsquo;amfitrió o ambdues. Voleu una eina que només representi la interfície d&amp;rsquo;usuari i que el model no l&amp;rsquo;hagi de cridar? Fàcil:&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="primers-passos"&gt;Primers passos&lt;/h2&gt;
&lt;p&gt;Afegeix el paquet de previsualització:&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;Si ja esteu creant eines MCP amb Azure Functions, això és només una actualització del paquet. El &lt;a href="https://learn.microsoft.com/azure/azure-functions/scenario-mcp-apps?tabs=bash%2Clinux&amp;amp;pivots=programming-language-csharp"&gt;inici ràpid de les aplicacions MCP&lt;/a&gt; és el millor lloc per començar si sou nou al concepte.&lt;/p&gt;
&lt;h2 id="tancant"&gt;Tancant&lt;/h2&gt;
&lt;p&gt;Les aplicacions MCP són un dels desenvolupaments més interessants de l&amp;rsquo;espai d&amp;rsquo;eines d&amp;rsquo;IA: eines que no només * fan coses * sinó que poden * mostrar coses * als usuaris. L&amp;rsquo;API fluida elimina la complexitat del protocol i us permet centrar-vos en allò que importa: la lògica de l&amp;rsquo;eina i la seva interfície d&amp;rsquo;usuari.&lt;/p&gt;
&lt;p&gt;Llegiu la &lt;a href="https://devblogs.microsoft.com/azure-sdk/mcp-as-easy-as-1-2-3-introducing-the-fluent-api-for-mcp-apps/"&gt;publicació completa&lt;/a&gt; per obtenir la referència completa de l&amp;rsquo;API i els exemples.&lt;/p&gt;</content:encoded></item><item><title>Microsoft Foundry Març de 2026: GPT-5.4, Agent Service GA i l'SDK Refresh que ho canvia tot</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/microsoft-foundry-march-2026-whats-new/</guid><description>L'actualització de març de 2026 de Microsoft Foundry és massiva: Agent Service arriba a GA, GPT-5.4 aporta un raonament fiable, l'SDK azure-ai-projects es manté estable en tots els idiomes i Fireworks AI porta models oberts a Azure.</description><content:encoded>&lt;p&gt;Les publicacions mensuals &amp;ldquo;Què hi ha de nou a Microsoft Foundry&amp;rdquo; solen ser una barreja de millores incrementals i la funció de titular ocasional. La &lt;a href="https://devblogs.microsoft.com/foundry/whats-new-in-microsoft-foundry-mar-2026/"&gt;edició de març de 2026&lt;/a&gt;? Es tracta bàsicament de totes les funcions dels titulars. El servei d&amp;rsquo;agent de Foundry passa a GA, el GPT-5.4 s&amp;rsquo;envia per a la producció, l&amp;rsquo;SDK obté una versió estable important i Fireworks AI aporta la inferència de model obert a Azure. Permeteu-me desglossar el que importa per als desenvolupadors de.NET.&lt;/p&gt;
&lt;h2 id="el-servei-dagent-de-foundry-està-llest-per-a-la-producció"&gt;El servei d&amp;rsquo;agent de Foundry està llest per a la producció&lt;/h2&gt;
&lt;p&gt;Aquest és el gran. El temps d&amp;rsquo;execució de l&amp;rsquo;agent de nova generació està disponible generalment: construït a partir de l&amp;rsquo;API OpenAI Responses, compatible amb cables amb els agents OpenAI i obert a models de diversos proveïdors. Si esteu creant amb l&amp;rsquo;API Responses avui, la migració a Foundry afegeix seguretat empresarial, xarxes privades, Entra RBAC, seguiment complet i avaluació a més de la vostra lògica d&amp;rsquo;agent existent.&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;Addicions clau: xarxes privades d&amp;rsquo;extrem a extrem, expansió d&amp;rsquo;autenticació MCP (inclòs OAuth passthrough), previsualització de Voice Live per a agents de veu a veu i agents allotjats en 6 regions noves.&lt;/p&gt;
&lt;h2 id="gpt-54-fiabilitat-sobre-la-intelligència-bruta"&gt;GPT-5.4: fiabilitat sobre la intel·ligència bruta&lt;/h2&gt;
&lt;p&gt;GPT-5.4 no es tracta de ser més intel·ligent. Es tracta de ser més fiable. Raonament més sòlid sobre interaccions llargues, millor adherència a les instruccions, menys errors en el flux de treball mitjà i capacitats integrades d&amp;rsquo;ús de l&amp;rsquo;ordinador. Per als agents de producció, aquesta fiabilitat és molt més important que les puntuacions de referència.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Preu (per M fitxes)&lt;/th&gt;
&lt;th&gt;Millor 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 $ de sortida&lt;/td&gt;
&lt;td&gt;Agents de producció, codificació, fluxos de treball de documents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.4 Pro&lt;/td&gt;
&lt;td&gt;30 $ / 180 $ de sortida&lt;/td&gt;
&lt;td&gt;Anàlisi profunda, raonament científic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.4 Mini&lt;/td&gt;
&lt;td&gt;Rentable&lt;/td&gt;
&lt;td&gt;Classificació, extracció, trucades d&amp;rsquo;eines lleugeres&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;El joc intel·ligent és una estratègia d&amp;rsquo;encaminament: GPT-5.4 Mini gestiona el treball de gran volum i de baixa latència, mentre que GPT-5.4 accepta les sol·licituds de gran raonament.&lt;/p&gt;
&lt;h2 id="lsdk-és-finalment-estable"&gt;L&amp;rsquo;SDK és finalment estable&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;azure-ai-projects&lt;/code&gt; SDK va enviar versions estables a tots els idiomes: Python 2.0.0, JS/TS 2.0.0, Java 2.0.0 i.NET 2.0.0 (1 d&amp;rsquo;abril). La dependència &lt;code&gt;azure-ai-agents&lt;/code&gt; ha desaparegut: tot viu sota &lt;code&gt;AIProjectClient&lt;/code&gt;. Instal·leu amb &lt;code&gt;pip install azure-ai-projects&lt;/code&gt; i els paquets de paquets &lt;code&gt;openai&lt;/code&gt; i &lt;code&gt;azure-identity&lt;/code&gt; com a dependències directes.&lt;/p&gt;
&lt;p&gt;Per als desenvolupadors de.NET, això significa un únic paquet NuGet per a tota la superfície de Foundry. No més fer malabars amb els SDK d&amp;rsquo;agents separats.&lt;/p&gt;
&lt;h2 id="fireworks-ai-porta-models-oberts-a-azure"&gt;Fireworks AI porta models oberts a Azure&lt;/h2&gt;
&lt;p&gt;Potser l&amp;rsquo;addició més interessant des del punt de vista arquitectònic: Fireworks AI processa més de 13 bilions de fitxes diaris a ~180.000 sol·licituds per segon, ara disponible a través de Foundry. DeepSeek V3.2, gpt-oss-120b, Kimi K2.5 i MiniMax M2.5 al llançament.&lt;/p&gt;
&lt;p&gt;La història real és &lt;strong&gt;porta els teus propis pesos&lt;/strong&gt;: penja pesos quantificats o ajustats des de qualsevol lloc sense canviar la pila de porcions. Desplegueu mitjançant pagament per testimoni sense servidor o rendiment subministrat.&lt;/p&gt;
&lt;h2 id="altres-aspectes-destacats"&gt;Altres aspectes destacats&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Phi-4 Reasoning Vision 15B&lt;/strong&gt;: raonament multimodal per a gràfics, diagrames i dissenys de documents&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Avaluacions GA&lt;/strong&gt;: avaluadors predefinits amb un seguiment continu de la producció canalitzat a Azure Monitor&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Processament prioritari&lt;/strong&gt; (visualització prèvia): carril informàtic dedicat per a càrregues de treball sensibles a la latència&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Voice Live&lt;/strong&gt;: temps d&amp;rsquo;execució de veu a veu que es connecta directament als agents de Foundry&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tracing GA&lt;/strong&gt;: inspecció de traça d&amp;rsquo;agents d&amp;rsquo;extrem a extrem amb classificació i filtre&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PromptFlow obsolet&lt;/strong&gt;: migració a Microsoft Framework Workflows abans de gener de 2027&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="tancant"&gt;Tancant&lt;/h2&gt;
&lt;p&gt;El març de 2026 és un punt d&amp;rsquo;inflexió per a Foundry. Agent Service GA, SDK estables en tots els idiomes, GPT-5.4 per a agents de producció fiables i inferència de model obert mitjançant Fireworks AI: la plataforma està preparada per a càrregues de treball serioses.&lt;/p&gt;
&lt;p&gt;Llegiu el &lt;a href="https://devblogs.microsoft.com/foundry/whats-new-in-microsoft-foundry-mar-2026/"&gt;resum complet&lt;/a&gt; i &lt;a href="https://learn.microsoft.com/azure/foundry/quickstarts/get-started-code"&gt;creeu el vostre primer agent&lt;/a&gt; per començar.&lt;/p&gt;</content:encoded></item><item><title>Servidor SQL MCP: la manera correcta de donar accés a la base de dades d'AI Agents</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/sql-mcp-server-data-api-builder/</guid><description>El servidor SQL MCP del creador d'API de dades ofereix als agents d'IA un accés segur i determinista a la base de dades sense exposar esquemes ni confiar en NL2SQL. RBAC, emmagatzematge en memòria cau, suport multibase de dades, tot integrat.</description><content:encoded>&lt;p&gt;Siguem sincers: la majoria dels servidors MCP de bases de dades disponibles avui dia són aterridors. Prenen una consulta en llenguatge natural, generen SQL sobre la marxa i l&amp;rsquo;executen amb les dades de producció. Què podria sortir malament? (Tot. Tot podria sortir malament.)&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;equip d&amp;rsquo;Azure SQL acaba de &lt;a href="https://devblogs.microsoft.com/azure-sql/introducing-sql-mcp-server/"&gt;introduir SQL MCP Server&lt;/a&gt;, i té un enfocament fonamentalment diferent. Creat com a característica del Data API Builder (DAB) 2.0, ofereix als agents d&amp;rsquo;IA un accés estructurat i determinista a les operacions de la base de dades, sense NL2SQL, sense exposar el vostre esquema i amb RBAC complet a cada pas.&lt;/p&gt;
&lt;h2 id="per-què-no-nl2sql"&gt;Per què no NL2SQL?&lt;/h2&gt;
&lt;p&gt;Aquesta és la decisió de disseny més interessant. Els models no són deterministes i les consultes complexes tenen més probabilitats de produir errors subtils. Les consultes exactes que els usuaris esperen que l&amp;rsquo;IA pugui generar són també les que necessiten més escrutini quan es produeixen de manera no determinista.&lt;/p&gt;
&lt;p&gt;En lloc d&amp;rsquo;això, SQL MCP Server utilitza un enfocament &lt;strong&gt;NL2DAB&lt;/strong&gt;. L&amp;rsquo;agent treballa amb la capa d&amp;rsquo;abstracció d&amp;rsquo;entitats del creador de l&amp;rsquo;API de dades i el creador de consultes integrat per produir un T-SQL precís i ben format de manera determinista. Mateix resultat per a l&amp;rsquo;usuari, però sense risc de JOIN al·lucinats o exposició accidental de dades.&lt;/p&gt;
&lt;h2 id="set-eines-no-set-centes"&gt;Set eines, no set-centes&lt;/h2&gt;
&lt;p&gt;SQL MCP Server exposa exactament set eines DML, independentment de la mida de la base de dades:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;describe_entities&lt;/code&gt; — descobreix entitats i operacions disponibles&lt;/li&gt;
&lt;li&gt;&lt;code&gt;create_record&lt;/code&gt; — inserir files&lt;/li&gt;
&lt;li&gt;&lt;code&gt;read_records&lt;/code&gt; — consulteu taules i vistes&lt;/li&gt;
&lt;li&gt;&lt;code&gt;update_record&lt;/code&gt; — modifica les files&lt;/li&gt;
&lt;li&gt;&lt;code&gt;delete_record&lt;/code&gt; — elimina les files&lt;/li&gt;
&lt;li&gt;&lt;code&gt;execute_entity&lt;/code&gt; — executa procediments emmagatzemats&lt;/li&gt;
&lt;li&gt;&lt;code&gt;aggregate_records&lt;/code&gt; — consultes d&amp;rsquo;agregació&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Això és intel·ligent perquè les finestres de context són l&amp;rsquo;espai de pensament de l&amp;rsquo;agent. Inundar-los amb centenars de definicions d&amp;rsquo;eines deixa menys espai per al raonament. Set eines fixes mantenen l&amp;rsquo;agent centrat a &lt;em&gt;pensar&lt;/em&gt; en lloc de &lt;em&gt;navegar&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Cada eina es pot activar o desactivar individualment:&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="com-començar-en-tres-ordres"&gt;Com començar en tres ordres&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;Això és un servidor SQL MCP en execució que exposa la vostra taula de clients. La capa d&amp;rsquo;abstracció d&amp;rsquo;entitats significa que podeu aliar noms i columnes, limitar camps per rol i controlar exactament el que veuen els agents, sense exposar els detalls de l&amp;rsquo;esquema intern.&lt;/p&gt;
&lt;h2 id="la-història-de-seguretat-és-sòlida"&gt;La història de seguretat és sòlida&lt;/h2&gt;
&lt;p&gt;Aquí és on la maduresa del creador de l&amp;rsquo;API de dades té els seus fruits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RBAC a cada capa&lt;/strong&gt;: cada entitat defineix quins rols poden llegir, crear, actualitzar o suprimir i quins camps són visibles&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Integració d&amp;rsquo;Azure Key Vault&lt;/strong&gt;: cadenes de connexió i secrets gestionats de manera segura&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Microsoft Entra + OAuth personalitzat&lt;/strong&gt;: autenticació de grau de producció&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Política de seguretat de contingut&lt;/strong&gt;: els agents interactuen mitjançant un contracte controlat, no SQL brut&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;L&amp;rsquo;abstracció de l&amp;rsquo;esquema és especialment important. Els noms de les vostres taules i columnes internes mai s&amp;rsquo;exposen a l&amp;rsquo;agent. Definiu entitats, àlies i descripcions que tinguin sentit per a la interacció de l&amp;rsquo;IA, no la vostra base de dades ERD.&lt;/p&gt;
&lt;h2 id="multibase-de-dades-i-multiprotocol"&gt;Multibase de dades i multiprotocol&lt;/h2&gt;
&lt;p&gt;SQL MCP Server és compatible amb Microsoft SQL, PostgreSQL, Azure Cosmos DB i MySQL. I com que és una funció DAB, obteniu punts finals REST, GraphQL i MCP simultàniament des de la mateixa configuració. Les mateixes definicions d&amp;rsquo;entitat, les mateixes regles RBAC, la mateixa seguretat, als tres protocols.&lt;/p&gt;
&lt;p&gt;La configuració automàtica a DAB 2.0 pot fins i tot inspeccionar la vostra base de dades i crear la configuració de manera dinàmica, si us sentiu còmode amb menys abstracció per a la creació de prototips ràpids.&lt;/p&gt;
&lt;h2 id="la-meva-opinió"&gt;La meva opinió&lt;/h2&gt;
&lt;p&gt;Així és com hauria de funcionar l&amp;rsquo;accés a la base de dades empresarial per als agents d&amp;rsquo;IA. No &amp;ldquo;hey LLM, escriu-me una mica d&amp;rsquo;SQL i YOLO contra la producció&amp;rdquo;. En lloc d&amp;rsquo;això: una capa d&amp;rsquo;entitat ben definida, generació de consultes deterministes, RBAC a cada pas, memòria cau, monitorització i telemetria. És avorrit de la millor manera possible.&lt;/p&gt;
&lt;p&gt;Per als desenvolupadors de.NET, la història d&amp;rsquo;integració és neta: DAB és una eina.NET, el servidor MCP s&amp;rsquo;executa com a contenidor i funciona amb Azure SQL, que la majoria de nosaltres ja estem utilitzant. Si esteu creant agents d&amp;rsquo;IA que necessiten accés a dades, comenceu aquí.&lt;/p&gt;
&lt;h2 id="tancant"&gt;Tancant&lt;/h2&gt;
&lt;p&gt;SQL MCP Server és gratuït, de codi obert i s&amp;rsquo;executa a qualsevol lloc. És l&amp;rsquo;enfocament prescriptiu de Microsoft per oferir als agents d&amp;rsquo;IA un accés segur a la base de dades. Consulteu la &lt;a href="https://devblogs.microsoft.com/azure-sql/introducing-sql-mcp-server/"&gt;publicació completa&lt;/a&gt; i la &lt;a href="https://aka.ms/sql/mcp"&gt;documentació&lt;/a&gt; per començar.&lt;/p&gt;</content:encoded></item><item><title>VS Code 1.116: l'aplicació d'agents obté la navegació per teclat i la finalització del context dels fitxers</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/vscode-1-116-agents-app-updates/</guid><description>VS Code 1.116 se centra en la poliment de l'aplicació Agents: combinacions de tecles dedicades, millores d'accessibilitat, completacions de context de fitxers i resolució d'enllaços CSS @import.</description><content:encoded>&lt;p&gt;VS Code 1.116 és la versió d&amp;rsquo;abril de 2026 i, tot i que és més lleuger que algunes actualitzacions recents, els canvis són enfocats i significatius, sobretot si feu servir l&amp;rsquo;aplicació Agents diàriament.&lt;/p&gt;
&lt;p&gt;Aquí teniu el que va arribar, basat en les &lt;a href="https://code.visualstudio.com/updates/v1_116"&gt;notes oficials de la versió&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="millores-de-laplicació-dagents"&gt;Millores de l&amp;rsquo;aplicació d&amp;rsquo;agents&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;aplicació Agents continua madurant amb un poliment d&amp;rsquo;usabilitat que marca una diferència real en els fluxos de treball diaris:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Combinacions de tecles dedicades&lt;/strong&gt;: ara podeu centrar la vista Canvis, l&amp;rsquo;arbre de fitxers dins de Canvis i la vista Personalitzacions de xat amb ordres dedicades i dreceres de teclat. Si heu fet clic per l&amp;rsquo;aplicació Agents per navegar, això ofereix fluxos de treball complets basats en el teclat.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Diàleg d&amp;rsquo;ajuda d&amp;rsquo;accessibilitat&lt;/strong&gt;: prement &lt;code&gt;Alt+F1&lt;/code&gt; al quadre d&amp;rsquo;entrada del xat ara s&amp;rsquo;obre un diàleg d&amp;rsquo;ajuda d&amp;rsquo;accessibilitat que mostra les ordres i les combinacions de tecles disponibles. Els usuaris de lectors de pantalla també poden controlar la verbositat dels anuncis. Una bona accessibilitat beneficia a tothom.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Completacions de context de fitxer&lt;/strong&gt;: escriviu &lt;code&gt;#&lt;/code&gt; al xat de l&amp;rsquo;aplicació Agents per activar les finalitzacions de context de fitxer a l&amp;rsquo;abast del vostre espai de treball actual. Aquesta és una d&amp;rsquo;aquelles petites millores de qualitat de vida que acceleren cada interacció; ja no cal escriure els camins complets dels fitxers quan es fa referència al codi.&lt;/p&gt;
&lt;h2 id="css-import-resolució-denllaç"&gt;CSS &lt;code&gt;@import&lt;/code&gt; resolució d&amp;rsquo;enllaç&lt;/h2&gt;
&lt;p&gt;Una bona per als desenvolupadors d&amp;rsquo;interfície: ara VS Code resol les referències CSS &lt;code&gt;@import&lt;/code&gt; que utilitzen camins node_modules. Podeu &lt;code&gt;Ctrl+click&lt;/code&gt; mitjançant importacions com &lt;code&gt;@import &amp;quot;some-module/style.css&amp;quot;&lt;/code&gt; quan utilitzeu agrupadors. Petit però elimina un punt de fricció en els fluxos de treball CSS.&lt;/p&gt;
&lt;h2 id="tancant"&gt;Tancant&lt;/h2&gt;
&lt;p&gt;VS Code 1.116 tracta de perfeccionament, fent que l&amp;rsquo;aplicació Agents sigui més navegable, més accessible i més amigable amb el teclat. Si passeu molt de temps a l&amp;rsquo;aplicació Agents (i sospito que molts de nosaltres ho estem), aquests canvis s&amp;rsquo;acumulen.&lt;/p&gt;
&lt;p&gt;Consulteu les &lt;a href="https://code.visualstudio.com/updates/v1_116"&gt;notes completes de la versió&lt;/a&gt; per obtenir la llista completa.&lt;/p&gt;</content:encoded></item><item><title>VS Code 1.115: notificacions de terminal en segon pla, mode d'agent SSH i més</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/vscode-1-115-agent-improvements/</guid><description>VS Code 1.115 ofereix notificacions de terminal en segon pla per als agents, allotjament d'agents remots SSH, enganxament de fitxers als terminals i seguiment d'edició conscient de la sessió. Això és el que importa per als desenvolupadors de.NET.</description><content:encoded>&lt;p&gt;VS Code 1.115 acaba de &lt;a href="https://code.visualstudio.com/updates/v1_115"&gt;sortir&lt;/a&gt; i, tot i que és una versió més lleugera pel que fa a les funcions de titular, les millores relacionades amb l&amp;rsquo;agent són realment útils si treballeu amb assistents de codificació d&amp;rsquo;IA diàriament.&lt;/p&gt;
&lt;p&gt;Permeteu-me destacar el que realment val la pena saber.&lt;/p&gt;
&lt;h2 id="els-terminals-de-fons-parlen-amb-els-agents"&gt;Els terminals de fons parlen amb els agents&lt;/h2&gt;
&lt;p&gt;Aquesta és la característica destacada. Els terminals de fons ara notifiquen automàticament als agents quan es completen les ordres, inclòs el codi de sortida i la sortida del terminal. Les sol·licituds d&amp;rsquo;entrada als terminals de fons també es detecten i s&amp;rsquo;envien a l&amp;rsquo;usuari.&lt;/p&gt;
&lt;p&gt;Per què importa això? Si heu utilitzat el mode d&amp;rsquo;agent de Copilot per executar ordres de compilació o suites de proves en segon pla, coneixeu el dolor de &amp;ldquo;Ja s&amp;rsquo;ha acabat?&amp;rdquo; — Els terminals de fons eren essencialment de foc i oblidar. Ara l&amp;rsquo;agent rep una notificació quan el vostre &lt;code&gt;dotnet build&lt;/code&gt; o &lt;code&gt;dotnet test&lt;/code&gt; s&amp;rsquo;acabi, veu la sortida i pot reaccionar en conseqüència. És un petit canvi que fa que els fluxos de treball impulsats per agents siguin significativament més fiables.&lt;/p&gt;
&lt;p&gt;També hi ha una nova eina &lt;code&gt;send_to_terminal&lt;/code&gt; que permet als agents enviar ordres a terminals en segon pla amb la confirmació de l&amp;rsquo;usuari, solucionant el problema en què &lt;code&gt;run_in_terminal&lt;/code&gt; amb un temps d&amp;rsquo;espera traslladaria els terminals a segon pla i els faria només de lectura.&lt;/p&gt;
&lt;h2 id="allotjament-dagent-remot-ssh"&gt;Allotjament d&amp;rsquo;agent remot SSH&lt;/h2&gt;
&lt;p&gt;VS Code ara admet la connexió a màquines remotes mitjançant SSH, instal·lant automàticament la CLI i iniciant-la en mode d&amp;rsquo;amfitrió de l&amp;rsquo;agent. Això significa que les vostres sessions d&amp;rsquo;agent d&amp;rsquo;IA poden orientar-se directament a entorns remots, cosa que és útil per als desenvolupadors de.NET que creen i proveu en servidors Linux o màquines virtuals en núvol.&lt;/p&gt;
&lt;h2 id="edita-el-seguiment-a-les-sessions-dagent"&gt;Edita el seguiment a les sessions d&amp;rsquo;agent&lt;/h2&gt;
&lt;p&gt;Les edicions de fitxers fetes durant les sessions de l&amp;rsquo;agent ara es fan un seguiment i es restauren, amb diferències, desfer/refer i restauració de l&amp;rsquo;estat. Si un agent fa canvis al vostre codi i alguna cosa va malament, podeu veure exactament què ha canviat i revertir-lo. Tranquil·litat per deixar que els agents modifiquin la vostra base de codi.&lt;/p&gt;
&lt;h2 id="coneixement-de-la-pestanya-del-navegador-i-altres-millores"&gt;Coneixement de la pestanya del navegador i altres millores&lt;/h2&gt;
&lt;p&gt;Algunes addicions més de qualitat de vida:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Seguiment de pestanyes del navegador&lt;/strong&gt;: ara el xat pot fer un seguiment i enllaçar amb les pestanyes del navegador obertes durant una sessió, de manera que els agents poden fer referència a les pàgines web que esteu mirant&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fitxer enganxat al terminal&lt;/strong&gt;: enganxeu fitxers (incloses les imatges) al terminal amb Ctrl+V, arrossegueu i deixeu anar o feu clic amb el botó dret.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cobertura de prova al minimapa&lt;/strong&gt;: ara els indicadors de cobertura de prova es mostren al minimapa per obtenir una visió visual ràpida&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pinch-to-zoom a Mac&lt;/strong&gt;: el navegador integrat admet gestos de pessigar-to-zoom&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Drets de Copilot a Sessions&lt;/strong&gt;: la barra d&amp;rsquo;estat mostra la informació d&amp;rsquo;ús a la vista Sessions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Favicon a Anar al fitxer&lt;/strong&gt;: les pàgines web obertes mostren favicons a la llista de selecció ràpida&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="tancant"&gt;Tancant&lt;/h2&gt;
&lt;p&gt;VS Code 1.115 és una versió incremental, però les millores de l&amp;rsquo;agent (notificacions de terminal en segon pla, allotjament d&amp;rsquo;agents SSH i seguiment d&amp;rsquo;edició) afegeixen una experiència notablement més fluida per al desenvolupament assistit per IA. Si utilitzeu el mode d&amp;rsquo;agent de Copilot per a projectes.NET, aquests són els tipus de correccions de qualitat de vida que redueixen la fricció diàriament.&lt;/p&gt;
&lt;p&gt;Consulteu les &lt;a href="https://code.visualstudio.com/updates/v1_115"&gt;notes completes de la versió&lt;/a&gt; per a cada detall.&lt;/p&gt;</content:encoded></item><item><title>C# 15 obté tipus d'unió, i són exactament el que hem estat demanant</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/csharp-15-union-types-exhaustive-matching/</guid><description>C# 15 introdueix la paraula clau union: unions discriminades aplicades pel compilador amb una concordança exhaustiva de patrons. Aquí teniu el seu aspecte, per què importen i com provar-los avui.</description><content:encoded>&lt;p&gt;Aquest és el que estava esperant. C# 15 introdueix la paraula clau &lt;code&gt;union&lt;/code&gt;: unions discriminades adequades amb una concordança exhaustiva de patrons forçada pel compilador. Si alguna vegada has envejat els sindicats discriminats de F# o les enumeracions de Rust, saps exactament per què això importa.&lt;/p&gt;
&lt;p&gt;Bill Wagner &lt;a href="https://devblogs.microsoft.com/dotnet/csharp-15-union-types/"&gt;va publicar la immersió profunda&lt;/a&gt; al bloc.NET, i sincerament? El disseny és net, pràctic i molt C#. Permeteu-me explicar-vos què hi ha realment aquí i per què és una cosa més gran del que pot semblar a primera vista.&lt;/p&gt;
&lt;h2 id="el-problema-que-resolen-els-sindicats"&gt;El problema que resolen els sindicats&lt;/h2&gt;
&lt;p&gt;Abans de C# 15, retornar &amp;ldquo;un dels diversos tipus possibles&amp;rdquo; d&amp;rsquo;un mètode sempre era un compromís:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;object&lt;/code&gt;&lt;/strong&gt; — sense restriccions, sense ajuda del compilador, llançament defensiu a tot arreu&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Interfícies de marcador&lt;/strong&gt;: millor, però qualsevol pot implementar-les. El compilador mai pot considerar el conjunt complet&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Classes base abstractes&lt;/strong&gt;: el mateix problema, a més els tipus necessiten un avantpassat comú&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cap d&amp;rsquo;aquests us ofereix el que realment voleu: un conjunt tancat de tipus on el compilador garanteix que heu gestionat tots els casos. Això és el que fan els sindicats.&lt;/p&gt;
&lt;h2 id="la-sintaxi-és-molt-senzilla"&gt;La sintaxi és molt senzilla&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 línia. &lt;code&gt;Pet&lt;/code&gt; pot contenir 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;. Les conversions implícites es generen automàticament:&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;I aquí està la màgia: el compilador imposa una concordança exhaustiva:&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;No cal descartar &lt;code&gt;_&lt;/code&gt;. El compilador sap que aquest commutador cobreix tots els casos possibles. Si més tard afegiu un quart tipus a la unió, cada expressió de commutació que no la gestioni produeix un avís. Casos que falten capturats en temps de compilació, no en temps d&amp;rsquo;execució.&lt;/p&gt;
&lt;h2 id="on-això-es-fa-pràctic"&gt;On això es fa pràctic&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;exemple &lt;code&gt;Pet&lt;/code&gt; és bonic, però aquí és on els sindicats realment brillen en codi real.&lt;/p&gt;
&lt;h3 id="respostes-de-lapi-que-retornen-diferents-formes"&gt;Respostes de l&amp;rsquo;API que retornen diferents formes&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;Ara tots els consumidors es veuen obligats a gestionar l&amp;rsquo;èxit, l&amp;rsquo;error i el fracàs de validació. No hi ha més errors &amp;ldquo;m&amp;rsquo;he oblidat de comprovar el cas d&amp;rsquo;error&amp;rdquo;.&lt;/p&gt;
&lt;h3 id="valor-únic-o-collecció"&gt;Valor únic o col·lecció&lt;/h3&gt;
&lt;p&gt;El patró &lt;code&gt;OneOrMore&amp;lt;T&amp;gt;&lt;/code&gt; mostra com els sindicats poden tenir un cos amb mètodes auxiliars:&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;Les persones que trucen passen el formulari que sigui convenient:&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="composició-de-tipus-no-relacionats"&gt;Composició de tipus no relacionats&lt;/h3&gt;
&lt;p&gt;Aquesta és la característica assassina de les jerarquies tradicionals. Podeu unir tipus que no tenen res en comú: &lt;code&gt;string&lt;/code&gt; i &lt;code&gt;Exception&lt;/code&gt;, &lt;code&gt;int&lt;/code&gt; i &lt;code&gt;IEnumerable&amp;lt;T&amp;gt;&lt;/code&gt;. No es necessita cap avantpassat comú.&lt;/p&gt;
&lt;h2 id="unions-personalitzades-per-a-biblioteques-existents"&gt;Unions personalitzades per a biblioteques existents&lt;/h2&gt;
&lt;p&gt;Aquí teniu una opció de disseny intel·ligent: qualsevol classe o estructura amb un atribut &lt;code&gt;[Union]&lt;/code&gt; es reconeix com a tipus d&amp;rsquo;unió, sempre que segueixi el patró bàsic (constructors públics per a tipus de casos i una propietat &lt;code&gt;Value&lt;/code&gt;). Les biblioteques com OneOf que ja proporcionen tipus d&amp;rsquo;unió poden optar al suport del compilador sense reescriure els seus elements interns.&lt;/p&gt;
&lt;p&gt;Per a escenaris sensibles al rendiment amb tipus de valors, les biblioteques poden implementar un patró d&amp;rsquo;accés que no sigui boxing amb mètodes &lt;code&gt;HasValue&lt;/code&gt; i &lt;code&gt;TryGetValue&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="la-imatge-més-gran"&gt;La imatge més gran&lt;/h2&gt;
&lt;p&gt;Els tipus d&amp;rsquo;unió formen part d&amp;rsquo;una història d&amp;rsquo;exhaustivitat més àmplia que arriba a C#:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tipus d&amp;rsquo;unió&lt;/strong&gt;: concordança exhaustiva sobre un conjunt tancat de tipus (disponible ara a la vista prèvia)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Jerarquies tancades&lt;/strong&gt; — El modificador &lt;code&gt;closed&lt;/code&gt; impedeix classes derivades fora del conjunt definidor (proposat)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enumeracions tancades&lt;/strong&gt;: impedeix la creació de valors diferents dels membres declarats (proposat)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En conjunt, aquestes tres funcions donaran a C# un dels sistemes de concordança de patrons segurs de tipus més complets en qualsevol llenguatge convencional.&lt;/p&gt;
&lt;h2 id="prova-ho-avui"&gt;Prova-ho avui&lt;/h2&gt;
&lt;p&gt;Els tipus d&amp;rsquo;unió estan disponibles a.NET 11 Preview 2:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Instal·leu &lt;a href="https://dotnet.microsoft.com/download/dotnet"&gt;.NET 11 Preview SDK&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Orienta &lt;code&gt;net11.0&lt;/code&gt; al teu projecte&lt;/li&gt;
&lt;li&gt;Establiu &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;Una advertència: a la vista prèvia 2, haureu de declarar &lt;code&gt;UnionAttribute&lt;/code&gt; i &lt;code&gt;IUnion&lt;/code&gt; al vostre projecte, ja que encara no estan en temps d&amp;rsquo;execució. Agafeu &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; del dipòsit de documents o afegiu això:&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="tancant"&gt;Tancant&lt;/h2&gt;
&lt;p&gt;Els tipus d&amp;rsquo;unió són una d&amp;rsquo;aquestes característiques que us fan preguntar-vos com ens ho hem passat sense ells. Coincidència exhaustiva forçada pel compilador, sintaxi neta, suport genèric i integració amb la concordança de patrons existents: és tot el que hem estat demanant, fet de la manera C#.&lt;/p&gt;
&lt;p&gt;Proveu-los a.NET 11 Preview 2, trenca coses i &lt;a href="https://github.com/dotnet/csharplang/discussions/9663"&gt;compartiu els vostres comentaris a GitHub&lt;/a&gt;. Aquesta és una vista prèvia i l&amp;rsquo;equip de C# escolta activament. Els vostres casos de punta i els vostres comentaris sobre el disseny donaran forma a la versió final.&lt;/p&gt;
&lt;p&gt;Per obtenir la referència completa de l&amp;rsquo;idioma, consulteu els &lt;a href="https://learn.microsoft.com/dotnet/csharp/language-reference/builtin-types/union"&gt;documents de tipus unió&lt;/a&gt; i l&amp;rsquo;&lt;a href="https://learn.microsoft.com/dotnet/csharp/language-reference/proposals/unions"&gt;especificació de la funció&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Aspire 13.2 envia una CLI de Docs, i el vostre agent d'IA també la pot utilitzar</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/aspire-docs-cli-ai-skills/</guid><description>.NET Aspire 13.2 afegeix aspire docs: una CLI per cercar, navegar i llegir documentació oficial sense sortir del terminal. També funciona com una eina per als agents d'IA. Heus aquí per què això importa.</description><content:encoded>&lt;p&gt;Coneixeu aquell moment en què esteu endinsat en un Aspire AppHost, connectant integracions i heu de comprovar exactament quins paràmetres espera la integració de Redis? Feu una pestanya alternativa al vostre navegador, busqueu aspire.dev, mireu els documents de l&amp;rsquo;API i torneu al vostre editor. Context perdut. Flux trencat.&lt;/p&gt;
&lt;p&gt;Aspire 13.2 només &lt;a href="https://devblogs.microsoft.com/aspire/aspire-docs-in-your-terminal/"&gt;ha enviat una solució per això&lt;/a&gt;. La CLI &lt;code&gt;aspire docs&lt;/code&gt; us permet cercar, navegar i llegir la documentació oficial d&amp;rsquo;Aspire directament des del vostre terminal. I com que està recolzat per serveis reutilitzables, els agents i les habilitats d&amp;rsquo;IA poden utilitzar les mateixes ordres per buscar documents en lloc d&amp;rsquo;al·lucinar API que no existeixen.&lt;/p&gt;
&lt;h2 id="el-problema-que-això-resol-realment"&gt;El problema que això resol realment&lt;/h2&gt;
&lt;p&gt;David Pine ho clava a la publicació original: els agents d&amp;rsquo;IA van ser &lt;em&gt;terribles&lt;/em&gt; per ajudar els desenvolupadors a crear aplicacions Aspire. Recomanarien &lt;code&gt;dotnet run&lt;/code&gt; en lloc de &lt;code&gt;aspire run&lt;/code&gt;, fer referència a learn.microsoft.com per als documents que viuen a aspire.dev, suggerir paquets NuGet obsolets i, el meu favorit personal, al·lucinar API que no existeixen.&lt;/p&gt;
&lt;p&gt;Per què? Com que Aspire era específic de.NET molt més temps del que ha estat políglot, i els LLM treballen amb dades de formació anteriors a les últimes funcions. Quan doneu a un agent d&amp;rsquo;IA la possibilitat de buscar realment els documents actuals, deixa d&amp;rsquo;endevinar i comença a ser útil.&lt;/p&gt;
&lt;h2 id="tres-ordres-zero-pestanyes-del-navegador"&gt;Tres ordres, zero pestanyes del navegador&lt;/h2&gt;
&lt;p&gt;La CLI és molt senzilla:&lt;/p&gt;
&lt;h3 id="llista-tots-els-documents"&gt;Llista tots els documents&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;Retorna totes les pàgines de documentació disponibles a aspire.dev. Necessites una sortida llegible per màquina? Afegeix &lt;code&gt;--format Json&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="cerca-un-tema"&gt;Cerca un tema&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 tant títols com contingut amb una puntuació de rellevància ponderada. El mateix motor de cerca que impulsa l&amp;rsquo;eina de documentació internament. Obteniu resultats classificats amb títols, slugs i puntuacions de rellevància.&lt;/p&gt;
&lt;h3 id="llegeix-una-pàgina-sencera-o-només-una-secció"&gt;Llegeix una pàgina sencera (o només una secció)&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;Transmet la pàgina completa com a reducció al terminal. Necessites només una secció?&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;Precisió quirúrgica. Sense desplaçament per 500 línies. Només la part que necessiteu.&lt;/p&gt;
&lt;h2 id="langle-de-lagent-dia"&gt;L&amp;rsquo;angle de l&amp;rsquo;agent d&amp;rsquo;IA&lt;/h2&gt;
&lt;p&gt;Aquí és on és interessant per als desenvolupadors que construïm amb eines d&amp;rsquo;IA. Les mateixes ordres &lt;code&gt;aspire docs&lt;/code&gt; funcionen com a eines per als agents d&amp;rsquo;IA, mitjançant habilitats, servidors MCP o embolcalls CLI senzills.&lt;/p&gt;
&lt;p&gt;En comptes que el vostre assistent d&amp;rsquo;IA creï les API d&amp;rsquo;Aspire basades en dades d&amp;rsquo;entrenament obsoletes, pot trucar a &lt;code&gt;aspire docs search &amp;quot;postgres&amp;quot;&lt;/code&gt;, trobar els documents oficials d&amp;rsquo;integració, llegir la pàgina adequada i oferir-vos l&amp;rsquo;enfocament documentat. Documentació actual en temps real, no la que el model va memoritzar fa sis mesos.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;arquitectura darrere d&amp;rsquo;això és intencionada. L&amp;rsquo;equip d&amp;rsquo;Aspire va crear serveis reutilitzables (&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;) en lloc d&amp;rsquo;una integració única. Això vol dir que el mateix motor de cerca funciona per a humans al terminal, agents d&amp;rsquo;IA al vostre editor i automatització al vostre pipeline CI.&lt;/p&gt;
&lt;h2 id="escenaris-del-món-real"&gt;Escenaris del món real&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Cerques ràpides del terminal:&lt;/strong&gt; Teniu tres fitxers de profunditat i necessiteu paràmetres de configuració de Redis. Dues ordres, noranta segons, tornen a treballar:&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;Desenvolupament assistit per IA:&lt;/strong&gt; la vostra habilitat VS Code inclou les ordres CLI. Demaneu &amp;ldquo;Afegeix una base de dades PostgreSQL al meu AppHost&amp;rdquo; i l&amp;rsquo;agent cerca els documents reals abans de respondre. Sense al·lucinacions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Validació CI/CD:&lt;/strong&gt; el vostre pipeline valida les configuracions d&amp;rsquo;AppHost amb la documentació oficial mitjançant programació. &lt;code&gt;--format Json&lt;/code&gt; emet les canonades netament a &lt;code&gt;jq&lt;/code&gt; i altres eines.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bases de coneixement personalitzades:&lt;/strong&gt; crear la teva pròpia eina d&amp;rsquo;IA? Introduïu la sortida JSON estructurada directament a la vostra base de coneixement:&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;Sense raspat web. No hi ha claus API. Les mateixes dades estructurades que les eines de documents utilitza internament.&lt;/p&gt;
&lt;h2 id="la-documentació-sempre-està-en-directe"&gt;La documentació sempre està en directe&lt;/h2&gt;
&lt;p&gt;Aquesta és la part que més agraeixo. La CLI no baixa cap instantània: consulta aspire.dev amb la memòria cau basada en ETag. En el moment en què s&amp;rsquo;actualitzen els documents, la vostra CLI i qualsevol habilitat incorporada al damunt ho reflecteixen. No hi ha còpies obsoletes, no &amp;ldquo;però el wiki va dir&amp;hellip;&amp;rdquo; moments.&lt;/p&gt;
&lt;h2 id="tancant"&gt;Tancant&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;aspire docs&lt;/code&gt; és una d&amp;rsquo;aquestes petites característiques que resol un problema real de manera neta. Els humans tenen accés a la documentació nativa del terminal. Els agents d&amp;rsquo;IA tenen una manera de deixar d&amp;rsquo;endevinar i començar a fer referència a documents reals. I tot està recolzat per la mateixa font de veritat.&lt;/p&gt;
&lt;p&gt;Si esteu creant amb.NET Aspire i encara no heu provat la CLI, executeu &lt;code&gt;aspire docs search &amp;quot;your-topic-here&amp;quot;&lt;/code&gt; i mireu com us sembla. A continuació, considereu incloure aquestes ordres en qualsevol habilitat d&amp;rsquo;IA o configuració d&amp;rsquo;automatització que feu servir; els vostres agents us ho agrairan.&lt;/p&gt;
&lt;p&gt;Fes una ullada a &lt;a href="https://davidpine.dev/posts/aspire-docs-mcp-tools/"&gt;La immersió profunda de David Pine&lt;/a&gt; sobre com es van reunir les eines de documents i la &lt;a href="https://aspire.dev/reference/cli/commands/aspire-docs/"&gt;referència oficial de la CLI&lt;/a&gt; per a tots els detalls.&lt;/p&gt;</content:encoded></item><item><title>Microsoft Agent Framework Hits 1.0: això és el que realment importa per als desenvolupadors de.NET</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/agent-framework-1-0-production-ready/</guid><description>Microsoft Agent Framework 1.0 està preparat per a la producció amb API estables, orquestració multiagent i connectors per a tots els principals proveïdors d'IA. Això és el que necessiteu saber com a desenvolupador.NET.</description><content:encoded>&lt;p&gt;Si heu estat seguint el viatge de l&amp;rsquo;Agent Framework des dels primers dies del nucli semàntic i de l&amp;rsquo;AutoGen, aquest és significatiu. Microsoft Agent Framework només &lt;a href="https://devblogs.microsoft.com/agent-framework/microsoft-agent-framework-version-1-0/"&gt;accedir a la versió 1.0&lt;/a&gt;: API estables, preparades per a la producció, compromís de suport a llarg termini. Està disponible tant per a.NET com per a Python, i està realment preparat per a càrregues de treball reals.&lt;/p&gt;
&lt;p&gt;Permeteu-me reduir el soroll de l&amp;rsquo;anunci i centrar-me en allò que importa si esteu creant aplicacions basades en IA amb.NET.&lt;/p&gt;
&lt;h2 id="la-versió-curta"&gt;La versió curta&lt;/h2&gt;
&lt;p&gt;Agent Framework 1.0 unifica el que abans era Semantic Kernel i AutoGen en un únic SDK de codi obert. Abstracció d&amp;rsquo;un agent. Un motor d&amp;rsquo;orquestració. Diversos proveïdors d&amp;rsquo;IA. Si heu estat rebotant entre el nucli semàntic per a patrons empresarials i AutoGen per a fluxos de treball multiagent de grau de recerca, podeu aturar-vos. Aquest és l&amp;rsquo;SDK ara.&lt;/p&gt;
&lt;h2 id="començar-és-gairebé-injustament-senzill"&gt;Començar és gairebé injustament senzill&lt;/h2&gt;
&lt;p&gt;Aquí hi ha un agent que treballa a.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;Això és tot. Un grapat de línies i teniu un agent d&amp;rsquo;IA que s&amp;rsquo;executa contra Azure Foundry. L&amp;rsquo;equivalent de Python és igualment concís. Afegiu eines de funció, converses de diversos torns i transmissió a mesura que avanceu: la superfície de l&amp;rsquo;API augmenta sense ser estrany.&lt;/p&gt;
&lt;h2 id="orquestració-multiagent-aquest-és-el-veritable-negoci"&gt;Orquestració multiagent: aquest és el veritable negoci&lt;/h2&gt;
&lt;p&gt;Els agents únics estan bé per a les demostracions, però els escenaris de producció solen necessitar coordinació. Agent Framework 1.0 s&amp;rsquo;envia amb patrons d&amp;rsquo;orquestració provats en batalla directament de Microsoft Research i AutoGen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Seqüencial&lt;/strong&gt;: els agents processen per ordre (escriptor → revisor → editor)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Simultània&lt;/strong&gt;: es distribueix a diversos agents en paral·lel, convergeix els resultats&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Handoff&lt;/strong&gt;: un agent delega a un altre segons la intenció&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Xat de grup&lt;/strong&gt;: diversos agents discuteixen i convergeixen en una solució&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Magentic-One&lt;/strong&gt;: el patró multiagent de grau de recerca de MSR&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tots admeten la transmissió en temps real, els punts de control, les aprovacions humanes en el bucle i la pausa/reprèn. La part del punt de control és crucial: els fluxos de treball de llarga durada sobreviuen als reinicis del procés. Per als desenvolupadors de.NET que hem creat fluxos de treball duradors amb Azure Functions, això ens sembla familiar.&lt;/p&gt;
&lt;h2 id="les-característiques-que-més-importen"&gt;Les característiques que més importen&lt;/h2&gt;
&lt;p&gt;Aquí teniu la meva llista del que val la pena saber:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Enganxs de middleware.&lt;/strong&gt; Saps com ASP.NET Core té canalitzacions de middleware? Mateix concepte, però per a l&amp;rsquo;execució de l&amp;rsquo;agent. Intercepteu totes les etapes (afegiu seguretat de contingut, registre, polítiques de compliment) sense tocar les indicacions de l&amp;rsquo;agent. Així és com podeu preparar els agents per a l&amp;rsquo;empresa.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Memòria connectable.&lt;/strong&gt; Historial de conversa, estat clau-valor persistent, recuperació basada en vectors. Trieu el vostre backend: Foundry Agent Service, Mem0, Redis, Neo4j o enrotlleu el vostre. La memòria és el que converteix una trucada LLM sense estat en un agent que realment recorda el context.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Agents YAML declaratius.&lt;/strong&gt; Definiu les instruccions, les eines, la memòria i la topologia d&amp;rsquo;orquestració del vostre agent en fitxers YAML controlats per versions. Carregueu i executeu amb una única trucada a l&amp;rsquo;API. Això és un canvi de joc per als equips que volen repetir el comportament de l&amp;rsquo;agent sense tornar a desplegar el codi.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Compatibilitat amb A2A i MCP.&lt;/strong&gt; MCP (Model Context Protocol) permet als agents descobrir i invocar eines externes de manera dinàmica. A2A (protocol d&amp;rsquo;agent a agent) permet la col·laboració entre temps d&amp;rsquo;execució: els vostres agents.NET poden coordinar-se amb els agents que s&amp;rsquo;executen en altres marcs. El suport A2A 1.0 arribarà aviat.&lt;/p&gt;
&lt;h2 id="les-funcions-de-previsualització-val-la-pena-veure-les"&gt;Les funcions de previsualització val la pena veure-les&lt;/h2&gt;
&lt;p&gt;Algunes funcions s&amp;rsquo;envien com a previsualització a la versió 1.0: funcionals, però les API poden evolucionar:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DevUI&lt;/strong&gt;: un depurador local basat en navegador per visualitzar l&amp;rsquo;execució de l&amp;rsquo;agent, els fluxos de missatges i les trucades d&amp;rsquo;eines en temps real. Penseu en Application Insights, però per al raonament dels agents.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub Copilot SDK i Claude Code SDK&lt;/strong&gt;: utilitzeu Copilot o Claude com a arnès d&amp;rsquo;agent directament des del vostre codi d&amp;rsquo;orquestració. Escriu un agent capaç de codificar juntament amb els altres agents en el mateix flux de treball.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agent Harness&lt;/strong&gt;: un temps d&amp;rsquo;execució local personalitzable que ofereix als agents accés a l&amp;rsquo;intèrpret d&amp;rsquo;ordres, al sistema de fitxers i als bucles de missatgeria. Penseu en agents de codificació i patrons d&amp;rsquo;automatització.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Habilitats&lt;/strong&gt;: paquets de capacitats de domini reutilitzables que ofereixen als agents capacitats estructurades de manera immediata.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="migració-des-del-nucli-semàntic-o-autogen"&gt;Migració des del nucli semàntic o AutoGen&lt;/h2&gt;
&lt;p&gt;Si teniu codi Semàntic Kernel o AutoGen, hi ha assistents de migració dedicats que analitzen el vostre codi i generen plans de migració pas a pas. La &lt;a href="https://learn.microsoft.com/en-us/agent-framework/migration-guide/from-semantic-kernel"&gt;guia de migració del nucli semàntic&lt;/a&gt; i la &lt;a href="https://learn.microsoft.com/en-us/agent-framework/migration-guide/from-autogen"&gt;guia de migració d&amp;rsquo;AutoGen&lt;/a&gt; us acompanyen tot.&lt;/p&gt;
&lt;p&gt;Si heu estat als paquets RC, l&amp;rsquo;actualització a la 1.0 és només un augment de la versió.&lt;/p&gt;
&lt;h2 id="tancant"&gt;Tancant&lt;/h2&gt;
&lt;p&gt;Agent Framework 1.0 és la fita de producció que els equips empresarials estaven esperant. API estables, suport per a diversos proveïdors, patrons d&amp;rsquo;orquestració que funcionen realment a escala i rutes de migració tant del nucli semàntic com d&amp;rsquo;AutoGen.&lt;/p&gt;
&lt;p&gt;El marc és &lt;a href="https://github.com/microsoft/agent-framework"&gt;totalment de codi obert a GitHub&lt;/a&gt;, i podeu començar avui mateix amb &lt;code&gt;dotnet add package Microsoft.Agents.AI&lt;/code&gt;. Consulteu la &lt;a href="https://learn.microsoft.com/en-us/agent-framework/get-started/"&gt;guia d&amp;rsquo;inici ràpid&lt;/a&gt; i les &lt;a href="https://github.com/microsoft/agent-framework"&gt;mostres&lt;/a&gt; per embrutar-vos les mans.&lt;/p&gt;
&lt;p&gt;Si heu estat esperant el senyal &amp;ldquo;Segur per utilitzar en producció&amp;rdquo;, això és tot.&lt;/p&gt;</content:encoded></item><item><title>azd ara us permet executar i depurar agents d'IA localment: aquí teniu el que va canviar el març de 2026</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/azd-march-2026-local-ai-agent-debugging/</guid><description>L'Azure Developer CLI va enviar set versions el març de 2026. Els aspectes més destacats: un bucle local d'execució i depuració per a agents d'IA, integració de GitHub Copilot a la configuració del projecte i suport de Container App Jobs.</description><content:encoded>&lt;p&gt;Set llançaments en un mes. Això és el que va impulsar l&amp;rsquo;equip de l&amp;rsquo;Azure Developer CLI (&lt;code&gt;azd&lt;/code&gt;) el març de 2026, i la funció de titular és la que estava esperant: &lt;strong&gt;un bucle local d&amp;rsquo;execució i depuració per als agents d&amp;rsquo;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;va publicar el resum complet&lt;/a&gt; i, tot i que hi ha moltes coses, permeteu-me filtrar-ho fins al que realment importa per als desenvolupadors de.NET que creen aplicacions basades en IA.&lt;/p&gt;
&lt;h2 id="executeu-i-depureu-agents-dia-sense-desplegar-los"&gt;Executeu i depureu agents d&amp;rsquo;IA sense desplegar-los&lt;/h2&gt;
&lt;p&gt;Aquest és el gran. La nova extensió &lt;code&gt;azure.ai.agents&lt;/code&gt; afegeix un conjunt d&amp;rsquo;ordres que us ofereixen una experiència de bucle interior adequada per als agents d&amp;rsquo;IA:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;azd ai agent run&lt;/code&gt;: inicia el vostre agent localment&lt;/li&gt;
&lt;li&gt;&lt;code&gt;azd ai agent invoke&lt;/code&gt;: li envia missatges (locals o desplegats)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;azd ai agent show&lt;/code&gt;: mostra l&amp;rsquo;estat i la salut del contenidor&lt;/li&gt;
&lt;li&gt;&lt;code&gt;azd ai agent monitor&lt;/code&gt;: transmet els registres dels contenidors en temps real&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Abans d&amp;rsquo;això, provar un agent d&amp;rsquo;IA significava desplegar-lo a Microsoft Foundry cada vegada que feies un canvi. Ara podeu iterar localment, provar el comportament del vostre agent i només implementar-lo quan estigueu preparat. Si heu estat creant agents amb Microsoft Agent Framework o Semantic Kernel, això canvia el vostre flux de treball diari.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;ordre d&amp;rsquo;invocació funciona amb agents locals i desplegats, la qual cosa significa que podeu utilitzar el mateix flux de treball de prova independentment d&amp;rsquo;on s&amp;rsquo;executi l&amp;rsquo;agent. Aquest és el tipus de detall que us estalvia mantenir dos conjunts de scripts de prova.&lt;/p&gt;
&lt;h2 id="github-copilot-arma-el-vostre-projecte-azd"&gt;GitHub Copilot arma el vostre projecte azd&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;azd init&lt;/code&gt; ara ofereix una opció &amp;ldquo;Configura amb GitHub Copilot (vista prèvia)&amp;rdquo;. En lloc de respondre manualment les sol·licituds sobre l&amp;rsquo;estructura del vostre projecte, un agent de Copilot us encarrega la configuració. Comprova si hi ha un directori de treball brut abans de modificar res i demana el consentiment de l&amp;rsquo;eina del servidor MCP per endavant.&lt;/p&gt;
&lt;p&gt;Quan una ordre falla, &lt;code&gt;azd&lt;/code&gt; ara ofereix una resolució de problemes assistida per IA: trieu una categoria (explica, orienta, soluciona problemes o salta), deixeu que l&amp;rsquo;agent suggereixi una solució i torneu-ho a provar, tot sense sortir del terminal. Per a configuracions d&amp;rsquo;infraestructures complexes, això suposa un estalvi de temps real.&lt;/p&gt;
&lt;h2 id="feines-de-laplicació-de-contenidors-i-millores-en-el-desplegament"&gt;Feines de l&amp;rsquo;aplicació de contenidors i millores en el desplegament&lt;/h2&gt;
&lt;p&gt;Algunes funcions de desplegament que cal destacar:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fines d&amp;rsquo;aplicacions de contenidors&lt;/strong&gt;: &lt;code&gt;azd&lt;/code&gt; ara desplega &lt;code&gt;Microsoft.App/jobs&lt;/code&gt; mitjançant la configuració existent &lt;code&gt;host: containerapp&lt;/code&gt;. La vostra plantilla de bíceps determina si l&amp;rsquo;objectiu és una aplicació de contenidor o una feina, sense cap configuració addicional.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Temps d&amp;rsquo;espera de desplegament configurables&lt;/strong&gt;: nova marca &lt;code&gt;--timeout&lt;/code&gt; a &lt;code&gt;azd deploy&lt;/code&gt; i un camp &lt;code&gt;deployTimeout&lt;/code&gt; a &lt;code&gt;azure.yaml&lt;/code&gt;. Ja no cal endevinar el límit predeterminat de 1200 segons.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Recurs de compilació remota&lt;/strong&gt;: quan la compilació remota d&amp;rsquo;ACR falla, &lt;code&gt;azd&lt;/code&gt; torna automàticament a la compilació local de Docker/Podman.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Validació local de preflight&lt;/strong&gt;: els paràmetres de bíceps es validen localment abans de desplegar-se, capturant els paràmetres que falten sense un viatge d&amp;rsquo;anada i tornada a Azure.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="polit-de-lexperiència-del-desenvolupador"&gt;Polit de l&amp;rsquo;experiència del desenvolupador&lt;/h2&gt;
&lt;p&gt;Algunes millores més petites que sumen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Detecció automàtica de pnpm/fils&lt;/strong&gt; per a projectes JS/TS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compatibilitat amb pyproject.toml&lt;/strong&gt; per a l&amp;rsquo;embalatge de Python&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Directoris de plantilles locals&lt;/strong&gt; — &lt;code&gt;azd init --template&lt;/code&gt; ara accepta camins del sistema de fitxers per a la iteració fora de línia&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Millors missatges d&amp;rsquo;error&lt;/strong&gt; en mode &lt;code&gt;--no-prompt&lt;/code&gt;: tots els valors que falten es reporten alhora amb ordres de resolució&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Variables d&amp;rsquo;entorn de compilació&lt;/strong&gt; injectades a tots els subprocessos de creació de marcs (.NET, Node.js, Java, Python)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Aquesta última és subtil però important: la vostra compilació.NET ara té accés a les variables d&amp;rsquo;entorn &lt;code&gt;azd&lt;/code&gt;, la qual cosa significa que podeu fer una injecció de configuració en temps de compilació sense scripts addicionals.&lt;/p&gt;
&lt;h2 id="tancant"&gt;Tancant&lt;/h2&gt;
&lt;p&gt;El bucle de depuració de l&amp;rsquo;agent d&amp;rsquo;IA local és l&amp;rsquo;estrella d&amp;rsquo;aquesta versió, però l&amp;rsquo;acumulació de millores en el desplegament i la poliment DX fa que &lt;code&gt;azd&lt;/code&gt; se senti més madur que mai. Si esteu desplegant aplicacions.NET a Azure, especialment agents d&amp;rsquo;IA, aquesta actualització val la pena instal·lar-la.&lt;/p&gt;
&lt;p&gt;Comproveu les &lt;a href="https://devblogs.microsoft.com/azure-sdk/azure-developer-cli-azd-march-2026/"&gt;notes completes de la versió&lt;/a&gt; per a cada detall o comenceu amb &lt;a href="https://learn.microsoft.com/azure/developer/azure-developer-cli/install-azd"&gt;instal·lació d&amp;rsquo;azd&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Azure DevOps finalment soluciona l'UX de l'editor de Markdown de què es va queixar tothom</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/azure-devops-markdown-editor-work-items/</guid><description>L'editor d'Azure DevOps Markdown per a elements de treball obté una distinció més clara entre el mode de previsualització i el d'edició. És un petit canvi que soluciona un problema de flux de treball realment molest.</description><content:encoded>&lt;p&gt;Si utilitzeu Azure Boards, probablement haureu experimentat això: esteu llegint la descripció d&amp;rsquo;un element de treball, potser revisant els criteris d&amp;rsquo;acceptació i accidentalment feu doble clic. Boom: esteu en mode d&amp;rsquo;edició. No volies editar res. Només estaves llegint.&lt;/p&gt;
&lt;p&gt;Dan Hellem &lt;a href="https://devblogs.microsoft.com/devops/improving-the-markdown-editor-for-work-items/"&gt;va anunciar la correcció&lt;/a&gt;, i és un d&amp;rsquo;aquests canvis que sona minúscul però que en realitat elimina la fricció real del vostre flux de treball diari.&lt;/p&gt;
&lt;h2 id="què-va-canviar"&gt;Què va canviar&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;editor Markdown per als camps de text d&amp;rsquo;elements de treball ara s&amp;rsquo;obre en &lt;strong&gt;mode de vista prèvia de manera predeterminada&lt;/strong&gt;. Podeu llegir i interactuar amb el contingut (seguir enllaços, revisar el format) sense preocupar-vos d&amp;rsquo;entrar accidentalment al mode d&amp;rsquo;edició.&lt;/p&gt;
&lt;p&gt;Quan realment voleu editar, feu clic a la icona d&amp;rsquo;edició a la part superior del camp. Quan hàgiu acabat, torneu al mode de previsualització explícitament. Simple, intencionat, previsible.&lt;/p&gt;
&lt;p&gt;Això és tot. Aquest és el canvi.&lt;/p&gt;
&lt;h2 id="per-què-això-importa-més-del-que-sembla"&gt;Per què això importa més del que sembla&lt;/h2&gt;
&lt;p&gt;El &lt;a href="https://developercommunity.visualstudio.com/t/Markdown-editor-for-work-item-multi-line/10935496"&gt;fil de comentaris de la comunitat&lt;/a&gt; sobre això era llarg. El comportament de fer doble clic per editar es va introduir amb l&amp;rsquo;editor Markdown el juliol de 2025 i les queixes van començar gairebé immediatament. El problema no eren només les edicions accidentals, sinó que tota la interacció semblava impredictible. Mai no sabíeu si fer clic es llegiria o editaria.&lt;/p&gt;
&lt;p&gt;Per als equips que fan planificació d&amp;rsquo;esprints, preparació de backlog o revisió de codi amb Azure Boards, aquest tipus de compostos de microfricció. Cada entrada accidental del mode d&amp;rsquo;edició és un canvi de context. Cada &amp;ldquo;espera, he canviat alguna cosa?&amp;rdquo; moment és una atenció perduda.&lt;/p&gt;
&lt;p&gt;El nou valor predeterminat respecta el patró d&amp;rsquo;interacció més comú: llegiu els elements de treball amb molta més freqüència que no els editeu.&lt;/p&gt;
&lt;h2 id="estat-de-llançament"&gt;Estat de llançament&lt;/h2&gt;
&lt;p&gt;Això ja s&amp;rsquo;està implementant a un subconjunt de clients i s&amp;rsquo;ampliarà a tothom durant les properes dues o tres setmanes. Si encara no ho veus, aviat ho faràs.&lt;/p&gt;
&lt;h2 id="tancant"&gt;Tancant&lt;/h2&gt;
&lt;p&gt;No totes les millores han de ser una característica de titular. De vegades, la millor actualització és simplement eliminar alguna cosa molesta. Aquest és un d&amp;rsquo;ells: una petita correcció d&amp;rsquo;UX que fa que Azure Boards se senti menys hostil a les persones que només volen llegir els seus elements de treball amb tranquil·litat.&lt;/p&gt;</content:encoded></item><item><title>Bookmark Studio aporta la navegació i l'ús compartit basats en ranures als marcadors de Visual Studio</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/bookmark-studio-visual-studio-extension/</guid><description>La nova extensió de Bookmark Studio de Mads Kristensen afegeix navegació per ranures de teclat, un gestor d'adreces d'interès, colors, etiquetes i capacitats d'exportació/compartiment als marcadors de Visual Studio.</description><content:encoded>&lt;p&gt;Els marcadors a Visual Studio sempre han estat&amp;hellip; bé. En establiu un, navegueu al següent, oblideu quin marcador és quin. Funcionen, però mai han estat el tipus de funció que podríeu dir poderosa.&lt;/p&gt;
&lt;p&gt;Mads Kristensen acaba de &lt;a href="https://devblogs.microsoft.com/visualstudio/bookmark-studio-evolving-bookmarks-in-visual-studio/"&gt;publicar Bookmark Studio&lt;/a&gt;, una extensió experimental que omple exactament els buits que probablement us heu trobat si feu servir els marcadors amb regularitat.&lt;/p&gt;
&lt;h2 id="navegació-basada-en-ranures"&gt;Navegació basada en ranures&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;addició bàsica: ara les adreces d&amp;rsquo;interès es poden assignar a les ranures 1–9 i passar directament a &lt;code&gt;Alt+Shift+1&lt;/code&gt; a &lt;code&gt;Alt+Shift+9&lt;/code&gt;. Les adreces d&amp;rsquo;interès noves obtenen automàticament la següent ranura disponible, de manera que, en la majoria dels casos, la navegació ràpida funciona sense cap configuració.&lt;/p&gt;
&lt;p&gt;Sembla senzill, però canvia les adreces d&amp;rsquo;interès de &amp;ldquo;Tinc algunes adreces d&amp;rsquo;interès en algun lloc&amp;rdquo; a &amp;ldquo;L&amp;rsquo;espai 3 és el meu controlador de l&amp;rsquo;API, l&amp;rsquo;espai 5 és la capa de servei, l&amp;rsquo;espai 7 és la prova&amp;rdquo;. Aquest tipus de memòria espacial fa que la navegació sigui gairebé instantània durant les sessions de treball concentrades.&lt;/p&gt;
&lt;h2 id="el-gestor-dadreces-dinterès"&gt;El gestor d&amp;rsquo;adreces d&amp;rsquo;interès&lt;/h2&gt;
&lt;p&gt;Una nova finestra d&amp;rsquo;eines mostra totes les vostres adreces d&amp;rsquo;interès en un sol lloc amb un filtratge per nom, fitxer, ubicació, color o ranura. Fes doble clic o navega amb el teclat per saltar a qualsevol marcador.&lt;/p&gt;
&lt;p&gt;Si alguna vegada heu tingut més de cinc o sis adreces d&amp;rsquo;interès i heu perdut la pista de quins, només val la pena instal·lar l&amp;rsquo;extensió.&lt;/p&gt;
&lt;h2 id="organització-amb-etiquetes-colors-i-carpetes"&gt;Organització amb etiquetes, colors i carpetes&lt;/h2&gt;
&lt;p&gt;Opcionalment, les adreces d&amp;rsquo;interès poden tenir etiquetes, colors i agrupar-se en carpetes. Res d&amp;rsquo;això és necessari: el vostre flux de treball de marcador actual continua funcionant. Però quan esteu depurant un problema complex o explorant una base de codi desconeguda, poder codificar amb colors i etiquetar les vostres adreces d&amp;rsquo;interès afegeix un context útil.&lt;/p&gt;
&lt;p&gt;Totes les metadades s&amp;rsquo;emmagatzemen per solució, de manera que la vostra organització d&amp;rsquo;adreces d&amp;rsquo;interès persisteix entre les sessions.&lt;/p&gt;
&lt;h2 id="exporta-i-comparteix"&gt;Exporta i comparteix&lt;/h2&gt;
&lt;p&gt;Aquesta és la funció que no sabia que volia. Bookmark Studio us permet exportar les adreces d&amp;rsquo;interès com a text sense format, Markdown o CSV. Això vol dir que pots:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Incloeu camins d&amp;rsquo;adreces d&amp;rsquo;interès a les descripcions de la sol·licitud d&amp;rsquo;extracció&lt;/li&gt;
&lt;li&gt;Compartiu la investigació amb els companys d&amp;rsquo;equip&lt;/li&gt;
&lt;li&gt;Mou els conjunts d&amp;rsquo;adreces d&amp;rsquo;interès entre repositoris o branques&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Els marcadors deixen de ser una eina de navegació en solitari i comencen a ser una manera de comunicar-se &amp;ldquo;aquí teniu el camí a través d&amp;rsquo;aquest codi&amp;rdquo;.&lt;/p&gt;
&lt;h2 id="adreces-dinterès-que-fan-un-seguiment-del-moviment-del-codi"&gt;Adreces d&amp;rsquo;interès que fan un seguiment del moviment del codi&lt;/h2&gt;
&lt;p&gt;Bookmark Studio fa un seguiment de les adreces d&amp;rsquo;interès en relació al text al qual estan ancorats, de manera que no es desviïn cap a línies incorrectes mentre editeu. Si alguna vegada heu establert adreces d&amp;rsquo;interès durant una sessió de depuració i heu fet que tots apunten a les línies equivocades després d&amp;rsquo;un refactor, això ho soluciona.&lt;/p&gt;
&lt;h2 id="tancant"&gt;Tancant&lt;/h2&gt;
&lt;p&gt;Bookmark Studio no reinventa res. Es necessita una funció que ha estat &amp;ldquo;prou bona&amp;rdquo; ​​durant anys i la fa realment útil per al desenvolupament centrat. La navegació per ranures, el Gestor d&amp;rsquo;adreces d&amp;rsquo;interès i les capacitats d&amp;rsquo;exportació són els més destacats.&lt;/p&gt;
&lt;p&gt;Agafeu-lo del &lt;a href="https://marketplace.visualstudio.com/items?itemName=MadsKristensen.BookmarkStudio"&gt;Visual Studio Marketplace&lt;/a&gt; i proveu-ho.&lt;/p&gt;</content:encoded></item><item><title>El tauler de control de l'Aspire 13.2 acaba de tenir una API de telemetria i ho canvia tot</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/aspire-132-dashboard-export-telemetry/</guid><description>.NET Aspire 13.2 ofereix una exportació de telemetria més intel·ligent, una API programable per a traces i registres i millores de visualització de GenAI. Heus aquí per què això és important per al vostre flux de treball de depuració.</description><content:encoded>&lt;p&gt;Si heu estat creant aplicacions distribuïdes amb.NET Aspire, ja sabeu que el tauler és el millor de tota l&amp;rsquo;experiència. Tots els vostres rastres, registres i mètriques en un sol lloc: sense Jaeger extern, sense configuració de Seq, sense moments &amp;ldquo;deixa&amp;rsquo;m comprovar l&amp;rsquo;altre terminal&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Aspire 13.2 l&amp;rsquo;acaba de millorar significativament. James Newton-King &lt;a href="https://devblogs.microsoft.com/aspire/aspire-dashboard-improvements-export-and-telemetry/"&gt;va anunciar l&amp;rsquo;actualització&lt;/a&gt;, i sincerament? Només l&amp;rsquo;exportació de telemetria i les funcions de l&amp;rsquo;API mereixen l&amp;rsquo;actualització.&lt;/p&gt;
&lt;h2 id="exporta-la-telemetria-com-una-persona-sensata"&gt;Exporta la telemetria com una persona sensata&lt;/h2&gt;
&lt;p&gt;Aquest és l&amp;rsquo;escenari que tots hem viscut: esteu depurant un problema distribuït, finalment el reproduïu després de vint minuts de configuració i ara heu de compartir el que va passar amb el vostre equip. Abans? Captures de pantalla. Copia i enganxa ID de traça. L&amp;rsquo;embolic habitual.&lt;/p&gt;
&lt;p&gt;Aspire 13.2 afegeix un diàleg adequat &lt;strong&gt;Gestiona els registres i la telemetria&lt;/strong&gt; on podeu:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Esborra tota la telemetria (útil abans d&amp;rsquo;un intent de reproducció)&lt;/li&gt;
&lt;li&gt;Exporteu la telemetria seleccionada a un fitxer ZIP en format estàndard OTLP/JSON&lt;/li&gt;
&lt;li&gt;Torneu a importar aquest ZIP a qualsevol tauler de control d&amp;rsquo;Aspire més tard&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Aquesta última part és la característica assassina. Reproduïu un error, exporteu la telemetria, l&amp;rsquo;adjunteu al vostre element de treball i el vostre company d&amp;rsquo;equip pot importar-lo al seu propi tauler per veure exactament el que heu vist. No més &amp;ldquo;pots reproduir-lo a la teva màquina?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Les traces, els intervals i els registres individuals també reben una opció &amp;ldquo;Exporta JSON&amp;rdquo; als seus menús contextuals. Necessites compartir un rastre específic? Feu clic amb el botó dret, copieu JSON i enganxeu-lo a la vostra descripció de PR. Fet.&lt;/p&gt;
&lt;h2 id="lapi-de-telemetria-és-el-veritable-canvi-de-joc"&gt;L&amp;rsquo;API de telemetria és el veritable canvi de joc&lt;/h2&gt;
&lt;p&gt;Això és el que m&amp;rsquo;emociona més. El tauler ara exposa una API HTTP a &lt;code&gt;/api/telemetry&lt;/code&gt; per consultar dades de telemetria amb programació. Punts finals disponibles:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GET /api/telemetry/resources&lt;/code&gt;: llista els recursos amb telemetria&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /api/telemetry/spans&lt;/code&gt;: la consulta s&amp;rsquo;estén amb filtres&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /api/telemetry/logs&lt;/code&gt;: registres de consultes amb filtres&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /api/telemetry/traces&lt;/code&gt; — llista traces&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /api/telemetry/traces/{traceId}&lt;/code&gt;: obteniu tots els intervals d&amp;rsquo;un rastre específic&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tot torna en format OTLP JSON. Això impulsa les noves ordres CLI &lt;code&gt;aspire agent mcp&lt;/code&gt; i &lt;code&gt;aspire otel&lt;/code&gt;, però la implicació real és més gran: ara podeu crear eines, scripts i integracions d&amp;rsquo;agents d&amp;rsquo;IA que consulten directament la telemetria de la vostra aplicació.&lt;/p&gt;
&lt;p&gt;Imagineu un agent de codificació d&amp;rsquo;IA que pugui mirar les vostres traces distribuïdes reals mentre es depura. Això ja no és hipotètic: això és el que permet aquesta API.&lt;/p&gt;
&lt;h2 id="la-telemetria-genai-es-fa-pràctica"&gt;La telemetria GenAI es fa pràctica&lt;/h2&gt;
&lt;p&gt;Si esteu creant aplicacions basades en IA amb Semantic Kernel o Microsoft.Extensions.AI, apreciareu el visualitzador de telemetria GenAI millorat. Aspire 13.2 afegeix:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Descripcions d&amp;rsquo;eines d&amp;rsquo;IA representades com a Markdown&lt;/li&gt;
&lt;li&gt;Un botó dedicat GenAI a la pàgina de traces per accedir ràpidament a traces d&amp;rsquo;IA&lt;/li&gt;
&lt;li&gt;Millor gestió d&amp;rsquo;errors per a JSON GenAI truncat o no estàndard&lt;/li&gt;
&lt;li&gt;Navegació fent clic per ressaltar entre definicions d&amp;rsquo;eines&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La publicació del bloc esmenta que el xat de VS Code Copilot, la CLI de Copilot i l&amp;rsquo;OpenCode admeten la configuració d&amp;rsquo;un &lt;code&gt;OTEL_EXPORTER_OTLP_ENDPOINT&lt;/code&gt;. Apunteu-los al tauler de control d&amp;rsquo;Aspire i podreu veure literalment els vostres agents d&amp;rsquo;IA pensar en temps real mitjançant la telemetria. Aquesta és una experiència de depuració que no trobareu enlloc més.&lt;/p&gt;
&lt;h2 id="tancant"&gt;Tancant&lt;/h2&gt;
&lt;p&gt;Aspire 13.2 fa que el tauler de control sigui &amp;ldquo;una bona interfície d&amp;rsquo;usuari de depuració&amp;rdquo; a una &amp;ldquo;plataforma d&amp;rsquo;observabilitat programable&amp;rdquo;. Només el flux de treball d&amp;rsquo;exportació/importació estalvia temps real en la depuració distribuïda i l&amp;rsquo;API de telemetria obre la porta als diagnòstics assistits per IA.&lt;/p&gt;
&lt;p&gt;Si ja esteu a Aspire, actualitzeu-lo. Si no ho feu, aquesta és una bona raó per consultar &lt;a href="https://aspire.dev"&gt;aspire.dev&lt;/a&gt; i veure de què es tracta.&lt;/p&gt;</content:encoded></item><item><title>L'actualització de març de Visual Studio us permet crear agents de pilot personalitzats, i l'eina find_symbol és una gran cosa</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/visual-studio-march-2026-custom-copilot-agents/</guid><description>L'actualització de març de 2026 de Visual Studio inclou agents Copilot personalitzats, habilitats d'agent reutilitzables, una eina find_symbol conscient de l'idioma i perfils basats en Copilot des de Test Explorer. Aquí teniu el que importa.</description><content:encoded>&lt;p&gt;Visual Studio acaba de rebre la seva actualització Copilot més important fins ara. Mark Downie &lt;a href="https://devblogs.microsoft.com/visualstudio/visual-studio-march-update-build-your-own-custom-agents/"&gt;va anunciar el llançament de març&lt;/a&gt;, i el títol és agents personalitzats, però sincerament, l&amp;rsquo;eina &lt;code&gt;find_symbol&lt;/code&gt; soterrada més avall podria ser la característica que canviï més el vostre flux de treball.&lt;/p&gt;
&lt;p&gt;Permeteu-me desglossar el que hi ha realment aquí.&lt;/p&gt;
&lt;h2 id="agents-de-copilot-personalitzats-al-vostre-dipòsit"&gt;Agents de Copilot personalitzats al vostre dipòsit&lt;/h2&gt;
&lt;p&gt;Voleu que Copilot segueixi els estàndards de codificació del vostre equip, executi el vostre pipeline de compilació o consulti els vostres documents interns? Ara pots construir exactament això.&lt;/p&gt;
&lt;p&gt;Els agents personalitzats es defineixen com a fitxers &lt;code&gt;.agent.md&lt;/code&gt; que deixeu anar a &lt;code&gt;.github/agents/&lt;/code&gt; al vostre repositori. Cada agent té accés complet a la consciència de l&amp;rsquo;espai de treball, la comprensió del codi, les eines, el model preferit i les connexions MCP a serveis externs. Apareixen al selector d&amp;rsquo;agents al costat dels agents integrats.&lt;/p&gt;
&lt;p&gt;Aquest és el mateix patró que VS Code ha donat suport, i és fantàstic veure que Visual Studio es posa al dia. Per als equips que ja han creat agents per a VS Code, els vostres fitxers &lt;code&gt;.agent.md&lt;/code&gt; haurien de funcionar en ambdós IDE (tot i que els noms d&amp;rsquo;eines poden variar, així que proveu-los).&lt;/p&gt;
&lt;p&gt;El repositori &lt;a href="https://github.com/github/awesome-copilot"&gt;awesome-copilot&lt;/a&gt; té configuracions d&amp;rsquo;agents contribuïts per la comunitat que podeu utilitzar com a punts de partida.&lt;/p&gt;
&lt;h2 id="habilitats-dagent-paquets-dinstruccions-reutilitzables"&gt;Habilitats d&amp;rsquo;agent: paquets d&amp;rsquo;instruccions reutilitzables&lt;/h2&gt;
&lt;p&gt;Les habilitats es recullen automàticament de &lt;code&gt;.github/skills/&lt;/code&gt; al vostre repositori o &lt;code&gt;~/.copilot/skills/&lt;/code&gt; al vostre perfil. Cada habilitat és un fitxer &lt;code&gt;SKILL.md&lt;/code&gt; seguint l&amp;rsquo;&lt;a href="https://agentskills.io/specification"&gt;especificació d&amp;rsquo;habilitats de l&amp;rsquo;agent&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Penseu en les habilitats com a experiència modular que podeu combinar i combinar. És possible que tingueu una habilitat per a les convencions de l&amp;rsquo;API, una altra per als vostres patrons de prova i una altra per al vostre flux de treball de desplegament. Quan s&amp;rsquo;activa una habilitat, apareix al xat perquè sàpigues que s&amp;rsquo;està aplicant.&lt;/p&gt;
&lt;p&gt;Si heu estat utilitzant habilitats a VS Code, ara funcionen de la mateixa manera a Visual Studio.&lt;/p&gt;
&lt;h2 id="find_symbol-navegació-conscient-de-lidioma-per-als-agents"&gt;find_symbol: navegació conscient de l&amp;rsquo;idioma per als agents&lt;/h2&gt;
&lt;p&gt;Aquí és on les coses es posen realment interessants. La nova eina &lt;code&gt;find_symbol&lt;/code&gt; ofereix al mode d&amp;rsquo;agent de Copilot una navegació real de símbols basada en el servei d&amp;rsquo;idiomes. En lloc de cercar el vostre codi com a text, l&amp;rsquo;agent pot:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Trobeu totes les referències a un símbol al vostre projecte&lt;/li&gt;
&lt;li&gt;Informació de tipus d&amp;rsquo;accés, declaracions i metadades d&amp;rsquo;abast&lt;/li&gt;
&lt;li&gt;Navegueu pels llocs de trucades amb coneixement complet de l&amp;rsquo;idioma&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Què significa això a la pràctica: quan demaneu a Copilot que refactori un mètode o actualitzeu una signatura de paràmetres en llocs de trucada, realment pot veure l&amp;rsquo;estructura del vostre codi. No més situacions &amp;ldquo;l&amp;rsquo;agent va canviar el mètode però va perdre tres llocs de trucades&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Els llenguatges admesos inclouen C#, C++, Razor, TypeScript i qualsevol cosa amb una extensió LSP compatible. Per als desenvolupadors de.NET, aquesta és una millora massiva: les bases de codi C# amb jerarquies i interfícies de tipus profundes es beneficien enormement de la navegació conscient dels símbols.&lt;/p&gt;
&lt;h2 id="proves-de-perfil-amb-copilot"&gt;Proves de perfil amb Copilot&lt;/h2&gt;
&lt;p&gt;Ara hi ha una ordre &lt;strong&gt;Perfil amb Copilot&lt;/strong&gt; al menú contextual de l&amp;rsquo;Explorador de proves. Seleccioneu una prova, feu clic al perfil i l&amp;rsquo;agent de perfils l&amp;rsquo;executa automàticament i analitza el rendiment, combinant l&amp;rsquo;ús de la CPU i les dades d&amp;rsquo;instrumentació per oferir informació útil.&lt;/p&gt;
&lt;p&gt;No més configurar manualment sessions de perfilador, executar la prova, exportar resultats i intentar llegir un gràfic de flama. L&amp;rsquo;agent fa l&amp;rsquo;anàlisi i us diu què és lent i per què. Actualment només.NET, cosa que té sentit donada la profunda integració de diagnòstic.NET de Visual Studio.&lt;/p&gt;
&lt;h2 id="consells-de-rendiment-durant-la-depuració-en-directe"&gt;Consells de rendiment durant la depuració en directe&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;optimització del rendiment ara es produeix mentre depureu, no després. A mesura que passeu pel codi, Visual Studio mostra el temps d&amp;rsquo;execució i els senyals de rendiment en línia. Veus una línia lenta? Feu clic al Consell de rendiment i demaneu a Copilot suggeriments d&amp;rsquo;optimització allà mateix.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;agent de perfils captura automàticament les dades del temps d&amp;rsquo;execució (temps transcorregut, ús de la CPU, comportament de la memòria) i Copilot les utilitza per identificar els punts calents. Això manté el treball de rendiment com a part del vostre flux de depuració en lloc d&amp;rsquo;una tasca separada que continueu posposant.&lt;/p&gt;
&lt;h2 id="corregiu-les-vulnerabilitats-de-nuget-des-de-lexplorador-de-solucions"&gt;Corregiu les vulnerabilitats de NuGet des de l&amp;rsquo;Explorador de solucions&lt;/h2&gt;
&lt;p&gt;Quan es detecta una vulnerabilitat en un paquet NuGet, ara veuràs una notificació amb un enllaç &lt;strong&gt;Corregir amb GitHub Copilot&lt;/strong&gt; directament a l&amp;rsquo;Explorador de solucions. Feu clic i Copilot analitza la vulnerabilitat, recomana les actualitzacions de paquets adequades i les implementa.&lt;/p&gt;
&lt;p&gt;Per als equips que lluiten per mantenir les dependències actualitzades (que és bàsicament per a tothom), això elimina la fricció de &amp;ldquo;Sé que hi ha una vulnerabilitat, però esbrinar la ruta d&amp;rsquo;actualització correcta és un projecte en si mateix&amp;rdquo;.&lt;/p&gt;
&lt;h2 id="tancant"&gt;Tancant&lt;/h2&gt;
&lt;p&gt;Els agents personalitzats i les habilitats són el titular, però &lt;code&gt;find_symbol&lt;/code&gt; és l&amp;rsquo;èxit dormint: canvia fonamentalment la precisió que pot ser Copilot quan es refactoritza el codi.NET. Combinada amb la integració de perfils en directe i les correccions de vulnerabilitats, aquesta actualització fa que les funcions d&amp;rsquo;IA de Visual Studio se sentin realment pràctiques en lloc de preparar-se per a la demostració.&lt;/p&gt;
&lt;p&gt;Baixeu &lt;a href="https://visualstudio.microsoft.com/downloads/"&gt;Visual Studio 2026 Insiders&lt;/a&gt; per provar-ho tot.&lt;/p&gt;</content:encoded></item><item><title>KubeCon Europe 2026: què haurien de preocupar-se realment als desenvolupadors.NET</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/kubecon-2026-aks-updates-dotnet-developers/</guid><description>Microsoft va deixar caure un mur d'anuncis de Kubernetes a KubeCon Europe 2026. Aquí teniu la versió filtrada: només les actualitzacions AKS i natives del núvol que importen si envieu aplicacions.NET.</description><content:encoded>&lt;p&gt;Coneixes aquesta sensació quan cau una publicació d&amp;rsquo;anunci massiva i t&amp;rsquo;estàs desplaçant per ella pensant &amp;ldquo;genial, però què canvia això realment per a mi&amp;rdquo;? Soc jo cada temporada de la KubeCon.&lt;/p&gt;
&lt;p&gt;Microsoft acaba de publicar &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;el seu resum complet de KubeCon Europe 2026&lt;/a&gt;, escrit pel mateix Brendan Burns, i sincerament? Aquí hi ha substància real. No només inclouen les caselles de selecció, sinó també el tipus de millores operatives que canvien la manera d&amp;rsquo;executar les coses en producció.&lt;/p&gt;
&lt;p&gt;Permeteu-me desglossar el que realment importa per als desenvolupadors de.NET.&lt;/p&gt;
&lt;h2 id="mtls-sense-limpost-de-malla-de-servei"&gt;mTLS sense l&amp;rsquo;impost de malla de servei&lt;/h2&gt;
&lt;p&gt;Això és el que passa amb les malles de servei: tothom vol les garanties de seguretat, ningú vol la sobrecàrrega operativa. AKS finalment està tancant aquesta bretxa.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://aka.ms/aks/application-network"&gt;Azure Kubernetes Application Network&lt;/a&gt; us ofereix TLS mutu, autorització conscient de l&amp;rsquo;aplicació i telemetria de trànsit, sense desplegar una malla plena de sidecars. Combinat amb &lt;a href="https://aka.ms/acns/cilium-mtls"&gt;Cilium mTLS a Advanced Container Networking Services&lt;/a&gt;, obteniu una comunicació xifrada de pod a pod mitjançant certificats X.509 i SPIRE per a la gestió d&amp;rsquo;identitats.&lt;/p&gt;
&lt;p&gt;Què significa això a la pràctica: les vostres API ASP.NET Core parlen amb treballadors en segon pla, els vostres serveis gRPC es trucen entre ells, tot xifrat i verificat per la identitat a nivell de xarxa, sense canvis en el codi de l&amp;rsquo;aplicació. Això és enorme.&lt;/p&gt;
&lt;p&gt;Per als equips que migren des de &lt;code&gt;ingress-nginx&lt;/code&gt;, també hi ha &lt;a href="https://aka.ms/aks/app-routing/gateway-api"&gt;Application Routing with Meshless Istio&lt;/a&gt; amb suport complet de l&amp;rsquo;API de Kubernetes Gateway. Sense sidecars. Basat en estàndards. I van enviar eines &lt;code&gt;ingress2gateway&lt;/code&gt; per a la migració incremental.&lt;/p&gt;
&lt;h2 id="observabilitat-de-la-gpu-que-no-és-una-idea-posterior"&gt;Observabilitat de la GPU que no és una idea posterior&lt;/h2&gt;
&lt;p&gt;Si utilitzeu una inferència d&amp;rsquo;IA juntament amb els vostres serveis.NET (i siguem sincers, qui no comença a fer-ho?), probablement heu arribat al punt cec de supervisió de la GPU. Obtindreu grans taulers de CPU/memòria i després&amp;hellip; res per a les GPU sense una fontaneria d&amp;rsquo;exportació manual.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://aka.ms/aks/managed-gpu-metrics"&gt;AKS ara mostra les mètriques de la GPU de manera nativa&lt;/a&gt; a Prometheus i Grafana gestionats. Mateixa pila, mateixos taulers de comandament, mateix canal d&amp;rsquo;alertes. Sense exportadors personalitzats, ni agents de tercers.&lt;/p&gt;
&lt;p&gt;Al costat de la xarxa, van afegir visibilitat per flux per al trànsit HTTP, gRPC i Kafka amb una &lt;a href="https://learn.microsoft.com/en-us/azure/aks/container-network-observability-logs"&gt;experiència d&amp;rsquo;Azure Monitor amb un sol clic&lt;/a&gt;. IP, ports, càrregues de treball, direcció del flux, decisions polítiques, tot en taulers integrats.&lt;/p&gt;
&lt;p&gt;I aquesta és la que m&amp;rsquo;ha fet fer una doble presa: &lt;a href="https://learn.microsoft.com/en-us/azure/aks/advanced-container-networking-services-overview"&gt;xarxa de contenidors agent&lt;/a&gt; afegeix una interfície d&amp;rsquo;usuari web on podeu fer preguntes en llenguatge natural sobre l&amp;rsquo;estat de la xarxa del vostre clúster. &amp;ldquo;Per què el pod X no arriba al servei Y?&amp;rdquo; → diagnòstics de només lectura de la telemetria en directe. Això és realment útil a les 2 del matí.&lt;/p&gt;
&lt;h2 id="xarxes-entre-clústers-que-no-requereixen-un-doctorat"&gt;Xarxes entre clústers que no requereixen un doctorat&lt;/h2&gt;
&lt;p&gt;Històricament, Kubernetes multiclúster ha estat una experiència de &amp;ldquo;porta la teva pròpia cola de xarxa&amp;rdquo;. Azure Kubernetes Fleet Manager ara s&amp;rsquo;envia &lt;a href="https://aka.ms/kubernetes-fleet/networking/cross-cluster"&gt;xarxes entre clústers&lt;/a&gt; mitjançant la malla de clúster de Cilium gestionada:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Connectivitat unificada entre clústers AKS&lt;/li&gt;
&lt;li&gt;Registre global de serveis per a la descoberta entre clústers&lt;/li&gt;
&lt;li&gt;Configuració gestionada de manera centralitzada, no repetida per clúster&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si utilitzeu microserveis.NET en diferents regions per a la seva resiliència o compliment, això substitueix una gran quantitat de fontaneria personalitzada fràgil. El servei A a l&amp;rsquo;oest d&amp;rsquo;Europa pot descobrir i trucar al servei B a l&amp;rsquo;est dels EUA a través de la malla, amb polítiques d&amp;rsquo;encaminament i seguretat coherents.&lt;/p&gt;
&lt;h2 id="actualitzacions-que-no-requereixen-valentia"&gt;Actualitzacions que no requereixen valentia&lt;/h2&gt;
&lt;p&gt;Siguem sincers: les actualitzacions de Kubernetes en producció són estressants. &amp;ldquo;Actualitzar i esperar&amp;rdquo; ha estat l&amp;rsquo;estratègia de facto per a massa equips, i és el principal motiu pel qual els clústers es queden endarrerits en les versions.&lt;/p&gt;
&lt;p&gt;Dues noves capacitats canvien això:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les actualitzacions del grup d&amp;rsquo;agents blau-verd&lt;/strong&gt; creen un grup de nodes paral·lels amb la nova configuració. Valideu el comportament, canvieu el trànsit gradualment i manteniu un camí de retrocés net. No més mutacions in situ als nodes de producció.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;La recuperació de l&amp;rsquo;agrupació d&amp;rsquo;agents&lt;/strong&gt; us permet revertir una agrupació de nodes a la seva versió anterior de Kubernetes i a la imatge de node després d&amp;rsquo;una actualització de costat, sense haver de reconstruir el clúster.&lt;/p&gt;
&lt;p&gt;En conjunt, finalment donen als operadors un control real sobre el cicle de vida de l&amp;rsquo;actualització. Per als equips.NET, això és important perquè la velocitat de la plataforma controla directament la rapidesa amb què podeu adoptar nous temps d&amp;rsquo;execució, pedaços de seguretat i capacitats de xarxa.&lt;/p&gt;
&lt;h2 id="les-càrregues-de-treball-dia-sestan-convertint-en-ciutadans-de-primer-nivell-de-kubernetes"&gt;Les càrregues de treball d&amp;rsquo;IA s&amp;rsquo;estan convertint en ciutadans de primer nivell de Kubernetes&lt;/h2&gt;
&lt;p&gt;El treball de codi obert amunt és igual d&amp;rsquo;important. L&amp;rsquo;assignació dinàmica de recursos (DRA) acaba de passar a GA a Kubernetes 1.36, fent que la programació de la GPU sigui una funció adequada de primera classe en lloc d&amp;rsquo;una solució alternativa.&lt;/p&gt;
&lt;p&gt;Alguns projectes que val la pena veure:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Projecte&lt;/th&gt;
&lt;th&gt;Què 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 comuna de Kubernetes per a la inferència: implementeu models sense conèixer els K8, amb el descobriment d&amp;rsquo;HuggingFace i les estimacions de costos&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;Resolució de problemes d&amp;rsquo;agent per als nadius del núvol: ara un projecte Sandbox CNCF&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;La imatge de contenidor declarativa es construeix amb la generació SBOM: menys CVE en l&amp;rsquo;etapa de creació&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;La direcció és clara: la vostra API.NET, la vostra capa d&amp;rsquo;orquestració del nucli semàntic i les vostres càrregues de treball d&amp;rsquo;inferència s&amp;rsquo;han d&amp;rsquo;executar en un model de plataforma coherent. Hi arribem.&lt;/p&gt;
&lt;h2 id="per-on-començaria-aquesta-setmana"&gt;Per on començaria aquesta setmana&lt;/h2&gt;
&lt;p&gt;Si esteu avaluant aquests canvis per al vostre equip, aquí teniu la meva llista de prioritats honesta:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Observabilitat primer&lt;/strong&gt;: activeu les mètriques de la GPU i els registres de flux de xarxa en un clúster que no sigui de producte. Mira què t&amp;rsquo;has perdut.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Proveu les actualitzacions blau-verd&lt;/strong&gt;: proveu el flux de treball de retrocés abans de la propera actualització del clúster de producció. Generar confiança en el procés.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pilota de xarxes conscients de la identitat&lt;/strong&gt;: trieu una ruta de servei interna i activeu mTLS amb Cilium. Mesureu la sobrecàrrega (spoiler: és mínim).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Avalueu el gestor de flotes&lt;/strong&gt;: si executeu més de dos clústers, la xarxa entre clústers es compensa amb una cola personalitzada reduïda.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Petits experiments, feedback ràpid. Aquest és sempre el moviment.&lt;/p&gt;
&lt;h2 id="tancant"&gt;Tancant&lt;/h2&gt;
&lt;p&gt;Els anuncis de KubeCon poden ser aclaparadors, però aquest lot realment mou l&amp;rsquo;agulla dels equips.NET a AKS. Millor seguretat de xarxes sense sobrecàrrega de malla, observabilitat real de la GPU, actualitzacions més segures i bases d&amp;rsquo;infraestructura d&amp;rsquo;IA més sòlides.&lt;/p&gt;
&lt;p&gt;Si ja esteu a AKS, aquest és un bon moment per endurir la vostra línia de base operativa. I si teniu previst traslladar les càrregues de treball.NET a Kubernetes, la plataforma s&amp;rsquo;acaba de preparar molt més per a la producció.&lt;/p&gt;</content:encoded></item><item><title>Servidor SQL MCP, Copilot a SSMS i un concentrador de bases de dades amb agents d'IA: el que realment importa de SQLCon 2026</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/agentic-ai-microsoft-databases-what-matters/</guid><description>Microsoft va deixar caure una pila d'anuncis de bases de dades a SQLCon 2026. Aquí teniu les coses que realment importen si esteu creant aplicacions basades en IA a Azure SQL.</description><content:encoded>&lt;p&gt;Microsoft acaba de començar &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 juntament amb FabCon a Atlanta&lt;/a&gt;, i hi ha molt per desempaquetar. L&amp;rsquo;anunci original cobreix des de plans d&amp;rsquo;estalvi fins a funcions de compliment empresarial. Vaig a ometre les diapositives de preus empresarials i em centraré en les peces que importen si sou un desenvolupador que construeix coses amb Azure SQL i AI.&lt;/p&gt;
&lt;h2 id="el-servidor-sql-mcp-està-en-previsualització-pública"&gt;El servidor SQL MCP està en previsualització pública&lt;/h2&gt;
&lt;p&gt;Aquest és el titular per a mi. L&amp;rsquo;Azure SQL Database Hyperscale ara té un &lt;strong&gt;SQL MCP Server&lt;/strong&gt; en previsualització pública que us permet connectar de manera segura les vostres dades SQL a agents d&amp;rsquo;IA i Copilots mitjançant el &lt;a href="https://modelcontextprotocol.io/"&gt;Model Context Protocol&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Si heu estat seguint l&amp;rsquo;onada MCP, i sincerament, és difícil perdre&amp;rsquo;s ara mateix, això és un gran problema. En lloc de crear canalitzacions de dades personalitzades per alimentar el context dels vostres agents d&amp;rsquo;IA des de la vostra base de dades, obteniu un protocol estandarditzat per exposar les dades SQL directament. Els vostres agents poden consultar, raonar i actuar sobre la informació de la base de dades en directe.&lt;/p&gt;
&lt;p&gt;Per a aquells de nosaltres que creem agents d&amp;rsquo;IA amb Semantic Kernel o Microsoft Agent Framework, això obre un camí d&amp;rsquo;integració net. El vostre agent necessita comprovar l&amp;rsquo;inventari? Busqueu un registre de client? Validar una comanda? MCP li ofereix una manera estructurada de fer-ho sense que escriviu codi d&amp;rsquo;obtenció de dades a mida per a cada escenari.&lt;/p&gt;
&lt;h2 id="github-copilot-a-ssms-22-ara-és-ga"&gt;GitHub Copilot a SSMS 22 ara és GA&lt;/h2&gt;
&lt;p&gt;Si passeu algun temps a SQL Server Management Studio (i siguem sincers, la majoria de nosaltres encara ho fem), GitHub Copilot ara està disponible generalment a SSMS 22. La mateixa experiència Copilot que ja feu servir a VS Code i Visual Studio, però per a T-SQL.&lt;/p&gt;
&lt;p&gt;El valor pràctic aquí és senzill: assistència basada en xat per escriure consultes, refactoritzar procediments emmagatzemats, resoldre problemes de rendiment i gestionar tasques d&amp;rsquo;administració. No hi ha res revolucionari en concepte, però tenir-lo allà mateix a SSMS significa que no cal que canvieu de context a un altre editor només per obtenir ajuda d&amp;rsquo;IA amb el treball de la vostra base de dades.&lt;/p&gt;
&lt;h2 id="els-índexs-vectorials-han-rebut-una-actualització-seriosa"&gt;Els índexs vectorials han rebut una actualització seriosa&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;Azure SQL Database ara té índexs vectorials més ràpids i capaços amb suport complet per a la inserció, l&amp;rsquo;actualització i la supressió. Això vol dir que les vostres dades vectorials es mantenen actuals en temps real, sense necessitat de reindexació per lots.&lt;/p&gt;
&lt;p&gt;Aquí teniu les novetats:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Quantització&lt;/strong&gt; per a mides d&amp;rsquo;índex més petites sense perdre massa precisió&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Filtratge iteratiu&lt;/strong&gt; per obtenir resultats més precisos&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Integració més estreta de l&amp;rsquo;optimitzador de consultes&lt;/strong&gt; per a un rendiment previsible&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si esteu fent la generació augmentada per la recuperació (RAG) amb Azure SQL com a magatzem de vectors, aquestes millores són directament útils. Podeu mantenir els vostres vectors al costat de les vostres dades relacionals a la mateixa base de dades, cosa que simplifica significativament la vostra arquitectura en comparació amb l&amp;rsquo;execució d&amp;rsquo;una base de dades vectorial separada.&lt;/p&gt;
&lt;p&gt;Les mateixes millores vectorials també estan disponibles a la base de dades SQL a Fabric, ja que totes dues s&amp;rsquo;executen amb el mateix motor SQL a sota.&lt;/p&gt;
&lt;h2 id="database-hub-in-fabric-gestió-agentica"&gt;Database Hub in Fabric: gestió agentica&lt;/h2&gt;
&lt;p&gt;Aquest és més avançat, però és interessant. Microsoft va anunciar el &lt;strong&gt;Database Hub a Microsoft Fabric&lt;/strong&gt; (accés anticipat), que us ofereix un únic panell de vidre a Azure SQL, Cosmos DB, PostgreSQL, MySQL i SQL Server mitjançant Arc.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;angle interessant no és només la visió unificada, sinó l&amp;rsquo;enfocament agent de la gestió. Els agents d&amp;rsquo;IA controlen contínuament el patrimoni de la vostra base de dades, evidencien què ha canviat, expliquen per què és important i suggereixen què fer a continuació. És un model human-in-the-loop on l&amp;rsquo;agent fa el treball i tu fas les trucades.&lt;/p&gt;
&lt;p&gt;Per als equips que gestionen més d&amp;rsquo;un grapat de bases de dades, això podria reduir realment el soroll operatiu. En lloc de saltar entre portals i comprovar manualment les mètriques, l&amp;rsquo;agent us porta el senyal.&lt;/p&gt;
&lt;h2 id="què-significa-això-per-als-desenvolupadors-denet"&gt;Què significa això per als desenvolupadors de.NET&lt;/h2&gt;
&lt;p&gt;El fil que connecta tots aquests anuncis és clar: Microsoft està incorporant agents d&amp;rsquo;IA a cada capa de la pila de bases de dades. No com un truc, sinó com una capa d&amp;rsquo;eines pràctica.&lt;/p&gt;
&lt;p&gt;Si esteu creant aplicacions.NET amb el suport d&amp;rsquo;Azure SQL, això és el que faria realment:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Proveu el servidor SQL MCP&lt;/strong&gt; si esteu creant agents d&amp;rsquo;IA. És la manera més neta de donar accés a la base de dades dels vostres agents sense fontaneria personalitzada.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Activa Copilot a SSMS&lt;/strong&gt; si encara no ho has fet: guanys de productivitat gratuïts per al treball SQL diari.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mira els índexs vectorials&lt;/strong&gt; si estàs fent RAG i actualment tens una botiga de vectors independent. La consolidació a Azure SQL significa un servei menys per gestionar.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="tancant"&gt;Tancant&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;anunci complet té més: plans d&amp;rsquo;estalvi, assistents de migració, funcions de compliment, però la història del desenvolupador es troba al servidor MCP, les millores vectorials i la capa de gestió agent. Aquestes són les peces que canvien la manera de construir, no només el pressupost.&lt;/p&gt;
&lt;p&gt;Fes una ullada a l&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;anunci complet de Shireesh Thota&lt;/a&gt; per obtenir la imatge completa i &lt;a href="https://aka.ms/database-hub"&gt;inscriu-te a l&amp;rsquo;accés anticipat al centre de bases de dades&lt;/a&gt; si vols provar la nova experiència de gestió.&lt;/p&gt;</content:encoded></item><item><title>De l'ordinador portàtil a la producció: desplegament d'agents d'IA a Microsoft Foundry amb dues ordres</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/deploy-ai-agents-foundry-azd-two-commands/</guid><description>L'Azure Developer CLI ara té ordres "azd ai agent" que porten el vostre agent d'IA des del desenvolupador local a un punt final de Foundry en directe en qüestió de minuts. Aquí teniu el flux de treball complet.</description><content:encoded>&lt;p&gt;Coneixeu aquesta bretxa entre &amp;ldquo;funciona a la meva màquina&amp;rdquo; i &amp;ldquo;està desplegat i atén el trànsit&amp;rdquo;? Per als agents d&amp;rsquo;IA, aquesta bretxa ha estat dolorosament àmplia. Heu de subministrar recursos, desplegar models, connectar la identitat, configurar la supervisió, i això és abans que ningú pugui trucar al vostre agent.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;Azure Developer CLI acaba de convertir-ho en un &lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-ai-agent-end-to-end/"&gt;assumpte de dos comandaments&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="el-nou-flux-de-treball-azd-ai-agent"&gt;El nou flux de treball &lt;code&gt;azd ai agent&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Permeteu-me explicar com és realment això. Teniu un projecte d&amp;rsquo;agent d&amp;rsquo;IA, diguem-ne un agent de consergeria d&amp;rsquo;hotel. Funciona localment. Voleu que funcioni a 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;Això és tot. Dues ordres. &lt;code&gt;azd ai agent init&lt;/code&gt; arma la infraestructura com a codi al vostre dipòsit i &lt;code&gt;azd up&lt;/code&gt; proveeix tot a Azure i publica el vostre agent. Obteniu un enllaç directe al vostre agent al portal de Foundry.&lt;/p&gt;
&lt;h2 id="què-passa-sota-el-capó"&gt;Què passa sota el capó&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;ordre &lt;code&gt;init&lt;/code&gt; genera plantilles de bíceps reals i inspeccionables al vostre repositori:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Un &lt;strong&gt;Recurs de Foundry&lt;/strong&gt; (contenidor de primer nivell)&lt;/li&gt;
&lt;li&gt;Un &lt;strong&gt;Projecte de Foundry&lt;/strong&gt; (on viu el vostre agent)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Configuració del model de desplegament&lt;/strong&gt; (GPT-4o, etc.)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Identitat gestionada&lt;/strong&gt; amb assignacions de rol RBAC adequades&lt;/li&gt;
&lt;li&gt;&lt;code&gt;azure.yaml&lt;/code&gt; per al mapa de serveis&lt;/li&gt;
&lt;li&gt;&lt;code&gt;agent.yaml&lt;/code&gt; amb metadades de l&amp;rsquo;agent i variables d&amp;rsquo;entorn&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Aquí teniu la part clau: sou el propietari de tot això. Està versionat Bicep al teu repositori. Podeu inspeccionar-lo, personalitzar-lo i confirmar-lo juntament amb el vostre codi d&amp;rsquo;agent. Sense capses negres màgiques.&lt;/p&gt;
&lt;h2 id="el-bucle-intern-del-desenvolupament"&gt;El bucle intern del desenvolupament&lt;/h2&gt;
&lt;p&gt;El que m&amp;rsquo;agrada molt és la història del desenvolupament local. Quan esteu iterant la lògica de l&amp;rsquo;agent, no voleu tornar a desplegar cada vegada que canvieu una sol·licitud:&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;Això inicia el vostre agent localment. Vinculeu-lo amb &lt;code&gt;azd ai agent invoke&lt;/code&gt; per enviar sol·licituds de prova i teniu un bucle de comentaris ajustat. Edita el codi, reinicia, invoca, repeteix.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;ordre &lt;code&gt;invoke&lt;/code&gt; també és intel·ligent pel que fa a l&amp;rsquo;encaminament: quan s&amp;rsquo;executa un agent local, l&amp;rsquo;orienta automàticament. Quan no ho és, arriba al punt final remot.&lt;/p&gt;
&lt;h2 id="monitorització-en-temps-real"&gt;Monitorització en temps real&lt;/h2&gt;
&lt;p&gt;Aquesta és la característica que em va vendre. Un cop desplegat el vostre agent:&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;Cada sol·licitud i resposta que flueix pel vostre agent es transmet al vostre terminal en temps real. Per depurar problemes de producció, això és inestimable. Sense investigar l&amp;rsquo;analítica de registres, sense esperar que les mètriques s&amp;rsquo;agreguin; veuràs què està passant ara mateix.&lt;/p&gt;
&lt;h2 id="el-conjunt-dordres-complet"&gt;El conjunt d&amp;rsquo;ordres complet&lt;/h2&gt;
&lt;p&gt;Aquí teniu la referència ràpida:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Comandament&lt;/th&gt;
&lt;th&gt;Què 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;Armar un projecte d&amp;rsquo;agent de Foundry amb 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;Proveïu els recursos d&amp;rsquo;Azure i implementeu l&amp;rsquo;agent&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;Envieu sol·licituds a l&amp;rsquo;agent local o remot&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;Executeu l&amp;rsquo;agent localment per al desenvolupament&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;Transmet els registres en temps real de l&amp;rsquo;agent publicat&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;Comproveu l&amp;rsquo;estat i l&amp;rsquo;estat de l&amp;rsquo;agent&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;Netegeu tots els recursos d&amp;rsquo;Azure&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="per-què-això-és-important-per-als-desenvolupadors-denet"&gt;Per què això és important per als desenvolupadors de.NET&lt;/h2&gt;
&lt;p&gt;Tot i que la mostra de l&amp;rsquo;anunci està basada en Python, la història de la infraestructura és independent del llenguatge. El vostre agent.NET obté la mateixa bastida Bíceps, la mateixa configuració d&amp;rsquo;identitat gestionada, la mateixa canalització de monitorització. I si ja esteu utilitzant &lt;code&gt;azd&lt;/code&gt; per a les vostres aplicacions.NET Aspire o implementacions d&amp;rsquo;Azure, això s&amp;rsquo;adapta perfectament al vostre flux de treball existent.&lt;/p&gt;
&lt;p&gt;La bretxa de desplegament dels agents d&amp;rsquo;IA ha estat un dels punts de fricció més grans de l&amp;rsquo;ecosistema. Passar d&amp;rsquo;un prototip de treball a un punt final de producció amb una identitat, una xarxa i un seguiment adequats no hauria de requerir una setmana de treball DevOps. Ara requereix dues ordres i uns minuts.&lt;/p&gt;
&lt;h2 id="tancant"&gt;Tancant&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;azd ai agent&lt;/code&gt; ja està disponible. Si heu postergat la implementació dels vostres agents d&amp;rsquo;IA perquè la configuració de la infraestructura us semblava massa feina, proveu-ho. Fes una ullada a la &lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-ai-agent-end-to-end/"&gt;tutorial completa&lt;/a&gt; per veure el pas a pas complet, inclosa la integració de l&amp;rsquo;aplicació de xat frontal.&lt;/p&gt;</content:encoded></item><item><title>El servei d'agents de Foundry és GA: el que realment importa per als constructors d'agents.NET</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/foundry-agent-service-ga-what-matters/</guid><description>El servei d'agents de Foundry de Microsoft acaba d'arribar a GA amb xarxes privades, Voice Live, avaluacions de producció i un temps d'execució obert multimodel. Aquí teniu el que heu de saber.</description><content:encoded>&lt;p&gt;Siguem sincers: construir un prototip d&amp;rsquo;agent d&amp;rsquo;IA és la part fàcil. La part difícil és que tot sigui després: posar-lo en producció amb un aïllament adequat de la xarxa, fer avaluacions que realment signifiquen alguna cosa, gestionar els requisits de compliment i no trencar les coses a les 2 del matí.&lt;/p&gt;
&lt;p&gt;El &lt;a href="https://devblogs.microsoft.com/foundry/foundry-agent-service-ga/"&gt;Foundry Agent Service acaba de passar a GA&lt;/a&gt;, i aquest llançament està centrat en aquest buit de &amp;ldquo;tot després&amp;rdquo;.&lt;/p&gt;
&lt;h2 id="creat-a-partir-de-lapi-responses"&gt;Creat a partir de l&amp;rsquo;API Responses&lt;/h2&gt;
&lt;p&gt;Aquí teniu el titular: el servei d&amp;rsquo;agent de Foundry de nova generació es basa en l&amp;rsquo;API de respostes d&amp;rsquo;OpenAI. Si ja esteu creant amb aquest protocol de cable, migrar a Foundry és un canvi de codi mínim. Què obteniu: seguretat empresarial, xarxes privades, Entra RBAC, seguiment complet i avaluació, a més de la vostra lògica d&amp;rsquo;agent existent.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;arquitectura és oberta intencionadament. No esteu bloquejat a un proveïdor de models ni a un marc d&amp;rsquo;orquestració. Utilitzeu DeepSeek per a la planificació, OpenAI per a la generació, LangGraph per a l&amp;rsquo;orquestració: el temps d&amp;rsquo;execució gestiona la capa de coherència.&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;Si veniu del paquet &lt;code&gt;azure-ai-agents&lt;/code&gt;, ara els agents són operacions de primera classe a &lt;code&gt;AIProjectClient&lt;/code&gt; a &lt;code&gt;azure-ai-projects&lt;/code&gt;. Deixeu anar el pin autònom i utilitzeu &lt;code&gt;get_openai_client()&lt;/code&gt; per generar respostes.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="xarxes-privades-sha-eliminat-el-bloquejador-empresarial"&gt;Xarxes privades: s&amp;rsquo;ha eliminat el bloquejador empresarial&lt;/h2&gt;
&lt;p&gt;Aquesta és la característica que desbloqueja l&amp;rsquo;adopció empresarial. Foundry ara admet xarxes privades d&amp;rsquo;extrem a extrem amb BYO VNet:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sense sortida pública&lt;/strong&gt;: el trànsit d&amp;rsquo;agents no toca mai l&amp;rsquo;Internet pública&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Injecció de contenidor/subxarxa&lt;/strong&gt; a la vostra xarxa per a la comunicació local&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Connectivitat d&amp;rsquo;eines inclosa&lt;/strong&gt;: els servidors MCP, Azure AI Search i els agents de dades de Fabric operen per camins privats&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Aquest darrer punt és crític. No només les trucades d&amp;rsquo;inferència es mantenen privades: totes les trucades d&amp;rsquo;invocació i recuperació d&amp;rsquo;eines també es mantenen dins dels límits de la vostra xarxa. Per als equips que operen sota polítiques de classificació de dades que prohibeixen l&amp;rsquo;encaminament extern, això és el que faltava.&lt;/p&gt;
&lt;h2 id="autenticació-mcp-feta-correctament"&gt;Autenticació MCP feta correctament&lt;/h2&gt;
&lt;p&gt;Les connexions del servidor MCP ara admeten l&amp;rsquo;espectre complet de patrons d&amp;rsquo;autenticació:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mètode d&amp;rsquo;autenticació&lt;/th&gt;
&lt;th&gt;Quan s&amp;rsquo;ha d&amp;rsquo;utilitzar&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Basat en claus&lt;/td&gt;
&lt;td&gt;Accés compartit senzill per a eines internes de tota l&amp;rsquo;organització&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entra la identitat de l&amp;rsquo;agent&lt;/td&gt;
&lt;td&gt;servei a servei; l&amp;rsquo;agent s&amp;rsquo;autentica com ell mateix&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entra a la identitat gestionada&lt;/td&gt;
&lt;td&gt;Aïllament per projecte; cap gestió de credencials&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Passthrough d&amp;rsquo;identitat OAuth&lt;/td&gt;
&lt;td&gt;Accés delegat per l&amp;rsquo;usuari; agent actua en nom dels usuaris&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;OAuth Identity Passthrough és l&amp;rsquo;interessant. Quan els usuaris han de concedir a un agent accés a les seves dades personals (el seu OneDrive, la seva organització de Salesforce, una API de SaaS definida per l&amp;rsquo;usuari), l&amp;rsquo;agent actua en nom seu amb els fluxos d&amp;rsquo;OAuth estàndard. No hi ha cap identitat de sistema compartida que pretengui ser tothom.&lt;/p&gt;
&lt;h2 id="voice-live-veu-a-veu-sense-la-fontaneria"&gt;Voice Live: veu a veu sense la fontaneria&lt;/h2&gt;
&lt;p&gt;Afegir veu a un agent solia significar unir STT, LLM i TTS: tres serveis, tres salts de latència, tres superfícies de facturació, tot sincronitzat a mà. &lt;strong&gt;Voice Live&lt;/strong&gt; ho col·lapsa en una única API gestionada amb:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Activitat de veu semàntica i detecció de final de torn (comprèn el significat, no només el silenci)&lt;/li&gt;
&lt;li&gt;Supressió de soroll del costat del servidor i cancel·lació d&amp;rsquo;eco&lt;/li&gt;
&lt;li&gt;Suport d&amp;rsquo;intrusió (els usuaris poden interrompre la resposta mitjana)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Les interaccions de veu passen pel mateix temps d&amp;rsquo;execució de l&amp;rsquo;agent que el text. Els mateixos avaluadors, els mateixos rastres, la mateixa visibilitat de costos. Per a escenaris d&amp;rsquo;assistència al client, servei de camp o accessibilitat, això substitueix el que abans requeria una canalització d&amp;rsquo;àudio personalitzada.&lt;/p&gt;
&lt;h2 id="avaluacions-des-de-la-casella-de-selecció-fins-al-seguiment-continu"&gt;Avaluacions: des de la casella de selecció fins al seguiment continu&lt;/h2&gt;
&lt;p&gt;Aquí és on Foundry es pren seriosament sobre la qualitat de la producció. El sistema d&amp;rsquo;avaluació té ara tres capes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Avaluadors fora de la caixa&lt;/strong&gt;: coherència, rellevància, fonamentació, qualitat de recuperació, seguretat. Connecta&amp;rsquo;t a un conjunt de dades o trànsit en directe i recupera les puntuacions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Avaluadors personalitzats&lt;/strong&gt;: codifiqueu la vostra pròpia lògica empresarial, estàndards de to i regles de compliment específiques del domini.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Avaluació contínua&lt;/strong&gt;: Foundry mostra el trànsit de producció en directe, executa la vostra suite d&amp;rsquo;avaluadors i mostra els resultats mitjançant taulers de control. Establiu alertes d&amp;rsquo;Azure Monitor per quan cau la connexió a terra o incompliment dels llindars de seguretat.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Tot es publica a Azure Monitor Application Insights. Qualitat de l&amp;rsquo;agent, salut de la infraestructura, cost i telemetria d&amp;rsquo;aplicacions, tot en un sol lloc.&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="sis-noves-regions-per-als-agents-allotjats"&gt;Sis noves regions per als agents allotjats&lt;/h2&gt;
&lt;p&gt;Els agents allotjats ara estan disponibles a l&amp;rsquo;est dels EUA, al nord del centre dels EUA, a Suècia al centre, al sud-est asiàtic, al Japó oriental i més. Això és important per als requisits de residència de les dades i per comprimir la latència quan el vostre agent s&amp;rsquo;executa a prop de les seves fonts de dades.&lt;/p&gt;
&lt;h2 id="per-què-això-és-important-per-als-desenvolupadors-denet"&gt;Per què això és important per als desenvolupadors de.NET&lt;/h2&gt;
&lt;p&gt;Tot i que les mostres de codi de l&amp;rsquo;anunci de GA són Python primer, la infraestructura subjacent és independent del llenguatge, i l&amp;rsquo;SDK.NET per a &lt;code&gt;azure-ai-projects&lt;/code&gt; segueix els mateixos patrons. L&amp;rsquo;API Responses, el marc d&amp;rsquo;avaluació, la xarxa privada, l&amp;rsquo;autenticació MCP, tot això està disponible a.NET.&lt;/p&gt;
&lt;p&gt;Si heu estat esperant que els agents d&amp;rsquo;IA passin de &amp;ldquo;demo fantàstica&amp;rdquo; a &amp;ldquo;Puc enviar-ho a la feina&amp;rdquo;, aquest llançament de GA és el senyal. Les xarxes privades, l&amp;rsquo;autenticació adequada, l&amp;rsquo;avaluació contínua i el seguiment de la producció són les peces que faltaven.&lt;/p&gt;
&lt;h2 id="tancant"&gt;Tancant&lt;/h2&gt;
&lt;p&gt;El servei d&amp;rsquo;agent de Foundry ja està disponible. Instal·leu l&amp;rsquo;SDK, obriu &lt;a href="https://ai.azure.com"&gt;el portal&lt;/a&gt; i comenceu a crear. La &lt;a href="https://learn.microsoft.com/azure/foundry/quickstarts/get-started-code"&gt;guia d&amp;rsquo;inici ràpid&lt;/a&gt; us porta de zero a un agent en execució en qüestió de minuts.&lt;/p&gt;
&lt;p&gt;Per obtenir la informació tècnica completa amb totes les mostres de codi, consulteu l&amp;rsquo;&lt;a href="https://devblogs.microsoft.com/foundry/foundry-agent-service-ga/"&gt;anunci de GA&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>El servidor Azure DevOps MCP arriba a Microsoft Foundry: què significa això per als vostres agents d'IA</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/azure-devops-mcp-server-microsoft-foundry/</guid><description>El servidor Azure DevOps MCP ja està disponible a Microsoft Foundry. Connecteu els vostres agents d'IA directament als fluxos de treball de DevOps (elements de treball, repositoris, canalitzacions) amb uns quants clics.</description><content:encoded>&lt;p&gt;MCP (Model Context Protocol) ha tingut un moment. Si heu estat seguint l&amp;rsquo;ecosistema d&amp;rsquo;agents d&amp;rsquo;IA, probablement heu notat que els servidors MCP apareixen a tot arreu, donant als agents la possibilitat d&amp;rsquo;interaccionar amb eines i serveis externs mitjançant un protocol estandarditzat.&lt;/p&gt;
&lt;p&gt;Ara el &lt;a href="https://devblogs.microsoft.com/devops/remote-mcp-server-preview-in-microsoft-foundry/"&gt;Servidor MCP d&amp;rsquo;Azure DevOps està disponible a Microsoft Foundry&lt;/a&gt;, i aquesta és una d&amp;rsquo;aquestes integracions que et fa pensar en les possibilitats pràctiques.&lt;/p&gt;
&lt;h2 id="què-està-passant-realment-aquí"&gt;Què està passant realment aquí&lt;/h2&gt;
&lt;p&gt;Microsoft ja va llançar l&amp;rsquo;Azure DevOps MCP Server com a &lt;a href="https://devblogs.microsoft.com/devops/azure-devops-remote-mcp-server-public-preview"&gt;vista prèvia pública&lt;/a&gt;, això és el propi servidor MCP. La novetat és la integració de Foundry. Ara podeu afegir l&amp;rsquo;Azure DevOps MCP Server als vostres agents de Foundry directament des del catàleg d&amp;rsquo;eines.&lt;/p&gt;
&lt;p&gt;Per a aquells que encara no estiguin familiaritzats amb Foundry: és la plataforma unificada de Microsoft per crear i gestionar aplicacions i agents basats en IA a escala. Accés al model, orquestració, avaluació, desplegament, tot en un sol lloc.&lt;/p&gt;
&lt;h2 id="configurant-lo"&gt;Configurant-lo&lt;/h2&gt;
&lt;p&gt;La configuració és sorprenentment senzilla:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Al vostre agent de Foundry, aneu a &lt;strong&gt;Afegeix eines&lt;/strong&gt; &amp;gt; &lt;strong&gt;Catàleg&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Cerqueu &amp;ldquo;Azure DevOps&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Seleccioneu el servidor Azure DevOps MCP (visualització prèvia) i feu clic a &lt;strong&gt;Crea&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Introduïu el nom de la vostra organització i connecteu-vos&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Això és tot. El vostre agent ara té accés a les eines d&amp;rsquo;Azure DevOps.&lt;/p&gt;
&lt;h2 id="controlar-a-què-pot-accedir-el-vostre-agent"&gt;Controlar a què pot accedir el vostre agent&lt;/h2&gt;
&lt;p&gt;Aquesta és la part que agraeixo: no us enganxeu amb un enfocament de tot o res. Podeu especificar quines eines estan disponibles per al vostre agent. Per tant, si només voleu que llegeixi elements de treball però no toqui les canalitzacions, podeu configurar-ho. Principi de privilegis mínims, aplicat als vostres agents d&amp;rsquo;IA.&lt;/p&gt;
&lt;p&gt;Això és important per als escenaris empresarials en què no voleu que un agent activi accidentalment una canalització de desplegament perquè algú li va demanar que &amp;ldquo;ajudés amb el llançament&amp;rdquo;.&lt;/p&gt;
&lt;h2 id="per-què-això-és-interessant-per-als-equipsnet"&gt;Per què això és interessant per als equips.NET&lt;/h2&gt;
&lt;p&gt;Penseu en què permet això a la pràctica:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ajudants de planificació de sprint&lt;/strong&gt;: agents que poden extreure elements de treball, analitzar dades de velocitat i suggerir capacitat de sprint&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bots de revisió de codi&lt;/strong&gt;: agents que entenen el vostre context de relacions públiques perquè poden llegir els vostres repositoris i els elements de treball enllaçats.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resposta a incidents&lt;/strong&gt;: agents que poden crear elements de treball, consultar implementacions recents i correlacionar errors amb canvis recents&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Incorporació de desenvolupadors&lt;/strong&gt; — &amp;ldquo;En què he de treballar?&amp;rdquo; obté una resposta real recolzada per dades reals del projecte&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Per als equips.NET que ja utilitzen Azure DevOps per als seus pipelines CI/CD i la gestió de projectes, tenir un agent d&amp;rsquo;IA que pugui interactuar directament amb aquests sistemes és un pas important cap a una automatització útil (no només chatbot com a servei).&lt;/p&gt;
&lt;h2 id="la-imatge-mcp-més-gran"&gt;La imatge MCP més gran&lt;/h2&gt;
&lt;p&gt;Això forma part d&amp;rsquo;una tendència més àmplia: els servidors MCP s&amp;rsquo;estan convertint en la manera estàndard en què els agents d&amp;rsquo;IA interactuen amb el món exterior. Els veiem per a GitHub, Azure DevOps, bases de dades, API SaaS, i Foundry s&amp;rsquo;està convertint en el centre on s&amp;rsquo;uneixen totes aquestes connexions.&lt;/p&gt;
&lt;p&gt;Si esteu creant agents a l&amp;rsquo;ecosistema.NET, val la pena prestar atenció a MCP. El protocol està estandarditzat, les eines estan madurant i la integració de Foundry el fa accessible sense haver de connectar manualment les connexions del servidor.&lt;/p&gt;
&lt;h2 id="tancant"&gt;Tancant&lt;/h2&gt;
&lt;p&gt;El servidor Azure DevOps MCP a Foundry està en vista prèvia, així que espereu que evolucioni. Però el flux de treball bàsic és sòlid: connecteu-vos, configureu l&amp;rsquo;accés a les eines i deixeu que els vostres agents treballin amb les vostres dades de DevOps. Si ja sou a l&amp;rsquo;ecosistema de Foundry, això és a uns quants clics. Prova-ho i mira quins fluxos de treball pots crear.&lt;/p&gt;
&lt;p&gt;Consulteu l&amp;rsquo;&lt;a href="https://devblogs.microsoft.com/devops/remote-mcp-server-preview-in-microsoft-foundry/"&gt;anunci complet&lt;/a&gt; per a la configuració pas a pas i més detalls.&lt;/p&gt;</content:encoded></item><item><title>Respostes de fons a Microsoft Agent Framework: no hi ha més ansietat de temps d'espera</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/background-responses-agent-framework-long-running-tasks/</guid><description>Microsoft Agent Framework ara us permet descarregar tasques d'IA de llarga durada amb fitxes de continuació. A continuació s'explica com funcionen les respostes de fons i per què són importants per als vostres agents.NET.</description><content:encoded>&lt;p&gt;Si heu creat alguna cosa amb models de raonament com l&amp;rsquo;o3 o el GPT-5.2, coneixeu el dolor. El vostre agent comença a pensar en una tasca complexa, el client s&amp;rsquo;asseu allà esperant i en algun lloc entre &amp;ldquo;això està bé&amp;rdquo; i &amp;ldquo;s&amp;rsquo;ha estavellat?&amp;rdquo; la vostra connexió s&amp;rsquo;esgota. Tota aquesta feina? Desaparegut.&lt;/p&gt;
&lt;p&gt;Microsoft Agent Framework acaba d&amp;rsquo;enviar &lt;a href="https://devblogs.microsoft.com/agent-framework/handling-long-running-operations-with-background-responses/"&gt;respostes de fons&lt;/a&gt; i, sincerament, aquesta és una d&amp;rsquo;aquestes característiques que haurien d&amp;rsquo;haver existit des del primer dia.&lt;/p&gt;
&lt;h2 id="el-problema-amb-el-bloqueig-de-trucades"&gt;El problema amb el bloqueig de trucades&lt;/h2&gt;
&lt;p&gt;En un patró de sol·licitud-resposta tradicional, el vostre client es bloqueja fins que l&amp;rsquo;agent acabi. Això funciona bé per a tasques ràpides. Però quan demaneu a un model de raonament que faci una investigació profunda, una anàlisi en diversos passos o que generi un informe de 20 pàgines? Esteu mirant els minuts del rellotge de paret. Durant aquesta finestra:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Les connexions HTTP es poden esgotar&lt;/li&gt;
&lt;li&gt;Els blips de xarxa maten tota l&amp;rsquo;operació&lt;/li&gt;
&lt;li&gt;El vostre usuari mira un spinner preguntant-se si està passant alguna cosa&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Les respostes de fons donen la volta a això.&lt;/p&gt;
&lt;h2 id="com-funcionen-les-fitxes-de-continuació"&gt;Com funcionen les fitxes de continuació&lt;/h2&gt;
&lt;p&gt;En lloc de bloquejar, inicieu la tasca de l&amp;rsquo;agent i recupereu un &lt;strong&gt;token de continuació&lt;/strong&gt;. Penseu-ho com un bitllet de reclamació en un taller de reparacions: no us quedeu al taulell esperant, torneu quan estigui llest.&lt;/p&gt;
&lt;p&gt;El flux és senzill:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Envieu la vostra sol·licitud amb &lt;code&gt;AllowBackgroundResponses = true&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Si l&amp;rsquo;agent admet el processament en segon pla, obtindreu un testimoni de continuació&lt;/li&gt;
&lt;li&gt;Enquesta sobre el teu horari fins que el testimoni torni &lt;code&gt;null&lt;/code&gt;; això vol dir que el resultat està preparat&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Aquí teniu la versió de.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;// Poll until complete&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;Si l&amp;rsquo;agent completa immediatament (tasques senzilles, models que no necessiten processament en segon pla), no es retorna cap testimoni de continuació. El vostre codi només funciona, no cal cap manipulació especial.&lt;/p&gt;
&lt;h2 id="transmissió-amb-currículum-la-veritable-màgia"&gt;Transmissió amb currículum: la veritable màgia&lt;/h2&gt;
&lt;p&gt;Les enquestes estan bé per als escenaris de foc i oblit, però què passa quan voleu progrés en temps real? Les respostes en segon pla també admeten la transmissió amb la represa integrada.&lt;/p&gt;
&lt;p&gt;Cada actualització en streaming porta el seu propi testimoni de continuació. Si la vostra connexió cau a la meitat del flux, repreneu exactament on ho vau deixar:&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;// Simulate a network interruption&lt;/span&gt;
&lt;/span&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;// Resume from exactly where we left off&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;agent continua processant el costat del servidor independentment del que passi amb el vostre client. Això és una tolerància a fallades integrada sense que escriviu la lògica de reintent o els interruptors.&lt;/p&gt;
&lt;h2 id="quan-sha-dutilitzar-realment"&gt;Quan s&amp;rsquo;ha d&amp;rsquo;utilitzar realment&lt;/h2&gt;
&lt;p&gt;No totes les trucades d&amp;rsquo;agent necessiten respostes en segon pla. Per completar-les ràpidament, esteu afegint complexitat sense cap motiu. Però aquí és on brillen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tasques de raonament complexes&lt;/strong&gt;: anàlisi en diversos passos, investigació profunda, qualsevol cosa que faci pensar realment a un model de raonament&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generació llarga de contingut&lt;/strong&gt;: informes detallats, documents de diverses parts, anàlisis exhaustives&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Xarxes poc fiables&lt;/strong&gt;: clients mòbils, desplegaments perifèrics, VPN corporatives descabellades&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Patrons UX asíncrons&lt;/strong&gt;: envieu una tasca, aneu a fer una altra cosa, torneu per obtenir resultats&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Per als desenvolupadors de.NET que creem aplicacions empresarials, aquesta última és especialment interessant. Penseu en una aplicació Blazor en què un usuari sol·licita un informe complex: desactiveu la tasca de l&amp;rsquo;agent, els mostreu un indicador de progrés i deixeu que continuï treballant. Sense gimnàstica WebSocket, sense infraestructura de cua personalitzada, només un testimoni i un bucle d&amp;rsquo;enquesta.&lt;/p&gt;
&lt;h2 id="tancant"&gt;Tancant&lt;/h2&gt;
&lt;p&gt;Les respostes de fons estan disponibles ara tant a.NET com a Python mitjançant Microsoft Agent Framework. Si esteu creant agents que fan alguna cosa més complexa que les simples preguntes i respostes, val la pena afegir-ho al vostre conjunt d&amp;rsquo;eines. El patró de testimoni de continuació manté les coses senzilles alhora que resol un problema de producció molt real.&lt;/p&gt;
&lt;p&gt;Consulteu la &lt;a href="https://devblogs.microsoft.com/agent-framework/handling-long-running-operations-with-background-responses/"&gt;documentació completa&lt;/a&gt; per obtenir la referència completa de l&amp;rsquo;API i més exemples.&lt;/p&gt;</content:encoded></item><item><title>VS Code 1.112: Què haurien de preocupar-se realment als desenvolupadors de.NET</title><link>https://thedotnetblog.com/ca/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/ca/posts/emiliano-montesdeoca/vscode-1-112-dotnet-developers/</guid><description>VS Code 1.112 acaba de caure i està ple d'actualitzacions d'agents, un depurador de navegador integrat, MCP sandboxing i suport monorepo. Això és el que realment importa si esteu creant amb.NET.</description><content:encoded>&lt;p&gt;VS Code 1.112 acaba d&amp;rsquo;aterrar, i sincerament? Aquest és diferent si passeu els vostres dies a la terra.NET. Hi ha moltes coses a les &lt;a href="https://code.visualstudio.com/updates/v1_112"&gt;notes oficials de la versió&lt;/a&gt;, però permeteu-me que us estalviï una mica de desplaçament i que em concentri en allò que realment ens importa.&lt;/p&gt;
&lt;h2 id="copilot-cli-acaba-de-ser-molt-més-útil"&gt;Copilot CLI acaba de ser molt més útil&lt;/h2&gt;
&lt;p&gt;El gran tema d&amp;rsquo;aquest llançament és &lt;strong&gt;autonomia de l&amp;rsquo;agent&lt;/strong&gt;, donant més espai a Copilot per fer les seves coses sense que facis de cangur a cada pas.&lt;/p&gt;
&lt;h3 id="direcció-i-cua-de-missatges"&gt;Direcció i cua de missatges&lt;/h3&gt;
&lt;p&gt;Coneixes aquell moment en què Copilot CLI està a mig camí d&amp;rsquo;una tasca i t&amp;rsquo;adones que t&amp;rsquo;has oblidat d&amp;rsquo;esmentar alguna cosa? Abans, calia esperar. Ara només podeu enviar missatges mentre una sol·licitud encara s&amp;rsquo;està executant, ja sigui per dirigir la resposta actual o posar en cua les instruccions de seguiment.&lt;/p&gt;
&lt;p&gt;Això és enorme per a aquelles tasques més llargues de bastida &lt;code&gt;dotnet&lt;/code&gt; en què esteu veient Copilot configura un projecte i penseu &amp;ldquo;oh, espera, també necessito MassTransit&amp;rdquo;.&lt;/p&gt;
&lt;h3 id="nivells-de-permís"&gt;Nivells de permís&lt;/h3&gt;
&lt;p&gt;Aquest és el que m&amp;rsquo;emociona més. Les sessions de Copilot CLI ara admeten tres nivells de permís:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Permisos predeterminats&lt;/strong&gt;: el flux habitual on les eines demanen confirmació abans d&amp;rsquo;executar-se&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Evita les aprovacions&lt;/strong&gt;: s&amp;rsquo;aprova tot automàticament i torna a provar els errors&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pilot automàtic&lt;/strong&gt;: és totalment autònom: aprova les eines, respon a les seves pròpies preguntes i continua fins que es fa la tasca&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si esteu fent alguna cosa com la bastida d&amp;rsquo;una nova API ASP.NET Core amb Entity Framework, migracions i una configuració de Docker, el mode Autopilot significa que descriu el que voleu i aneu a prendre un cafè. Ho descobrirà.&lt;/p&gt;
&lt;p&gt;Podeu habilitar el pilot automàtic amb la configuració &lt;code&gt;chat.autopilot.enabled&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="previsualitza-els-canvis-abans-de-la-delegació"&gt;Previsualitza els canvis abans de la delegació&lt;/h3&gt;
&lt;p&gt;Quan delegueu una tasca a Copilot CLI, es crea un arbre de treball. Abans, si teníeu canvis no compromesos, havíeu de comprovar el control de fonts per veure què es veuria afectat. Ara, la vista de xat mostra els canvis pendents abans de decidir si els voleu copiar, moure o ignorar-los.&lt;/p&gt;
&lt;p&gt;Poca cosa, però us salva d&amp;rsquo;aquell &amp;ldquo;espera, què he posat en escena?&amp;rdquo; moment.&lt;/p&gt;
&lt;h2 id="depura-les-aplicacions-web-sense-sortir-de-vs-code"&gt;Depura les aplicacions web sense sortir de VS Code&lt;/h2&gt;
&lt;p&gt;El navegador integrat ara admet &lt;strong&gt;depuració completa&lt;/strong&gt;. Podeu establir punts d&amp;rsquo;interrupció, passar pel codi i inspeccionar variables, tot dins de VS Code. No més canviar a Edge DevTools.&lt;/p&gt;
&lt;p&gt;Hi ha un nou tipus de depuració &lt;code&gt;editor-browser&lt;/code&gt; i si ja teniu configuracions de llançament de &lt;code&gt;msedge&lt;/code&gt; o &lt;code&gt;chrome&lt;/code&gt;, la migració és tan senzilla com canviar el camp &lt;code&gt;type&lt;/code&gt; al vostre &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 als desenvolupadors de Blazor, això és un canvi de joc. Ja esteu executant &lt;code&gt;dotnet watch&lt;/code&gt; al terminal; ara la vostra depuració també es manté a la mateixa finestra.&lt;/p&gt;
&lt;p&gt;El navegador també va obtenir nivells de zoom independents (finalment), menús contextuals adequats del clic dret i el zoom es recorda per lloc web.&lt;/p&gt;
&lt;h2 id="sandboxing-del-servidor-mcp"&gt;Sandboxing del servidor MCP&lt;/h2&gt;
&lt;p&gt;Aquest és més important del que podríeu pensar. Si utilitzeu servidors MCP (potser n&amp;rsquo;heu configurat un de personalitzat per als vostres recursos d&amp;rsquo;Azure o consultes de base de dades), s&amp;rsquo;han executat amb els mateixos permisos que el vostre procés de VS Code. Això significa un accés complet al vostre sistema de fitxers, xarxa, tot.&lt;/p&gt;
&lt;p&gt;Ara els podeu sorrar. Al teu &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;Quan un servidor amb caixa de sorra necessita accés a alguna cosa que no té, VS Code us demana que atorgueu permís. Molt millor que l&amp;rsquo;enfocament &amp;ldquo;Espero que ningú faci res estrany&amp;rdquo;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Nota:&lt;/strong&gt; Sandboxing està disponible per ara a macOS i Linux. Arriba el suport de Windows, però escenaris remots com WSL funcionen.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="descobriment-de-personalitzacions-de-monorepo"&gt;Descobriment de personalitzacions de Monorepo&lt;/h2&gt;
&lt;p&gt;Si esteu treballant en un monorepo (i siguem sincers, moltes solucions empresarials.NET acaben com una), això resol un veritable problema.&lt;/p&gt;
&lt;p&gt;Anteriorment, si obríeu una subcarpeta del vostre repositori, VS Code no trobaria les vostres habilitats &lt;code&gt;copilot-instructions.md&lt;/code&gt;, &lt;code&gt;AGENTS.md&lt;/code&gt; o personalitzades a l&amp;rsquo;arrel del dipòsit. Ara, amb la configuració &lt;code&gt;chat.useCustomizationsInParentRepositories&lt;/code&gt;, puja a l&amp;rsquo;arrel &lt;code&gt;.git&lt;/code&gt; i ho descobreix tot.&lt;/p&gt;
&lt;p&gt;Això significa que el vostre equip pot compartir instruccions de l&amp;rsquo;agent, fitxers de sol·licitud i eines personalitzades en tots els projectes en un monorepo sense que tothom hagi d&amp;rsquo;obrir la carpeta arrel.&lt;/p&gt;
&lt;h2 id="resolució-de-problemes-per-a-la-depuració-de-lagent"&gt;/resolució de problemes per a la depuració de l&amp;rsquo;agent&lt;/h2&gt;
&lt;p&gt;Alguna vegada has configurat instruccions o habilitats personalitzades i t&amp;rsquo;has preguntat per què no les recullen? La nova habilitat &lt;code&gt;/troubleshoot&lt;/code&gt; llegeix els registres de depuració de l&amp;rsquo;agent i us diu què va passar: quines eines s&amp;rsquo;han utilitzat o s&amp;rsquo;han omès, per què les instruccions no s&amp;rsquo;han carregat i què està causant respostes lentes.&lt;/p&gt;
&lt;p&gt;Activa-ho amb:&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;A continuació, només cal escriure &lt;code&gt;/troubleshoot why is my custom skill not loading?&lt;/code&gt; al xat.&lt;/p&gt;
&lt;p&gt;També podeu exportar i importar aquests registres de depuració ara, la qual cosa és ideal per compartir amb el vostre equip quan alguna cosa no funciona com s&amp;rsquo;esperava.&lt;/p&gt;
&lt;h2 id="compatibilitat-amb-imatges-i-fitxers-binaris"&gt;Compatibilitat amb imatges i fitxers binaris&lt;/h2&gt;
&lt;p&gt;Els agents ara poden llegir fitxers d&amp;rsquo;imatge del disc i fitxers binaris de manera nativa. Els fitxers binaris es presenten en format hexdump i les sortides d&amp;rsquo;imatge (com les captures de pantalla del navegador integrat) es mostren en una vista de carrusel.&lt;/p&gt;
&lt;p&gt;Per als desenvolupadors de.NET, penseu: enganxeu una captura de pantalla d&amp;rsquo;un error de la interfície d&amp;rsquo;usuari al xat i feu que l&amp;rsquo;agent entengui què passa, o feu que analitzi la sortida d&amp;rsquo;una representació de component Blazor.&lt;/p&gt;
&lt;h2 id="referències-de-símbols-automàtiques"&gt;Referències de símbols automàtiques&lt;/h2&gt;
&lt;p&gt;Petita millora de la qualitat de vida: quan copieu un nom de símbol (una classe, un mètode, etc.) i l&amp;rsquo;enganxeu al xat, ara VS Code el converteix automàticament en una referència &lt;code&gt;#sym:Name&lt;/code&gt;. Això proporciona a l&amp;rsquo;agent un context complet sobre aquest símbol sense que hàgiu d&amp;rsquo;afegir-lo manualment.&lt;/p&gt;
&lt;p&gt;Si voleu text sense format, feu servir &lt;code&gt;Ctrl+Shift+V&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="els-connectors-ara-es-poden-activardesactivar"&gt;Els connectors ara es poden activar/desactivar&lt;/h2&gt;
&lt;p&gt;Abans, desactivar un servidor o connector MCP significava desinstal·lar-lo. Ara podeu activar-los i desactivar-los, tant a nivell global com per espai de treball. Feu clic amb el botó dret a la vista Extensions o a la vista Personalitzacions i ja heu acabat.&lt;/p&gt;
&lt;p&gt;Els connectors de npm i pypi també es poden actualitzar automàticament ara, tot i que primer demanaran l&amp;rsquo;aprovació, ja que les actualitzacions signifiquen executar codi nou a la vostra màquina.&lt;/p&gt;
&lt;h2 id="tancant"&gt;Tancant&lt;/h2&gt;
&lt;p&gt;VS Code 1.112 està clarament empenyent l&amp;rsquo;experiència de l&amp;rsquo;agent: més autonomia, millor depuració, seguretat més estricta. Per als desenvolupadors de.NET, la depuració integrada del navegador i les millores de Copilot CLI són les característiques més destacades.&lt;/p&gt;
&lt;p&gt;Si encara no heu provat d&amp;rsquo;executar una sessió CLI Copilot completa en mode Autopilot per a un projecte.NET, aquesta versió és un bon moment per començar. Només recordeu establir els vostres permisos i deixar-ho cuinar.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://code.visualstudio.com/updates/v1_112"&gt;Descarregueu VS Code 1.112&lt;/a&gt; o actualitzeu-ho des de VS Code mitjançant &lt;strong&gt;Ajuda &amp;gt; Comproveu actualitzacions&lt;/strong&gt;.&lt;/p&gt;</content:encoded></item></channel></rss>