<?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>Dotnet | The .NET Blog</title><link>https://thedotnetblog.com/ca/tags/dotnet/</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>Thu, 23 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://thedotnetblog.com/ca/tags/dotnet/index.xml" rel="self" type="application/rss+xml"/><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>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>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>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>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>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>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>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>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>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>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>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>