<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>The .NET Blog</title><link>https://thedotnetblog.com/fr/</link><description>Articles, tutorials and insights from the .NET community.</description><generator>Hugo</generator><language>fr</language><managingEditor>@thedotnetblog (The .NET Blog)</managingEditor><webMaster>@thedotnetblog</webMaster><lastBuildDate>Mon, 14 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://thedotnetblog.com/fr/index.xml" rel="self" type="application/rss+xml"/><item><title>NDC Oslo 2026</title><link>https://thedotnetblog.com/fr/events/ndc-oslo-2026/</link><pubDate>Mon, 14 Sep 2026 00:00:00 +0000</pubDate><guid>https://thedotnetblog.com/fr/events/ndc-oslo-2026/</guid><description>L'une des plus grandes conférences développeurs d'Europe — 5 jours de workshops, sessions et networking à Oslo Spektrum avec plus de 150 speakers et 160 sessions.</description><content:encoded>&lt;p&gt;&lt;strong&gt;NDC Oslo 2026&lt;/strong&gt; se déroule du &lt;strong&gt;14 au 18 septembre 2026&lt;/strong&gt; à &lt;strong&gt;Oslo Spektrum&lt;/strong&gt;, Oslo, Norvège.&lt;/p&gt;
&lt;p&gt;NDC Oslo est l&amp;rsquo;une des plus grandes et des plus respectées conférences développeurs en Europe, couvrant tout, de .NET et le cloud à la sécurité, l&amp;rsquo;architecture, l&amp;rsquo;IA et au-delà. L&amp;rsquo;édition 2026 est actuellement en phase de réservation, avec un programme massif en préparation.&lt;/p&gt;
&lt;h2 id="en-chiffres"&gt;En chiffres&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;160 sessions&lt;/strong&gt; (en cours de réservation)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;150 speakers&lt;/strong&gt; (en cours de réservation)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;15 workshops&lt;/strong&gt; (en cours de réservation)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;5 jours&lt;/strong&gt; — workshops + conférence&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="speakers-confirmés"&gt;Speakers confirmés&lt;/h2&gt;
&lt;p&gt;La liste des speakers se construit, avec des noms confirmés incluant :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Nick Chapsas&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Maddy Montaquila&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Troy Hunt&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kevlin Henney&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Venkat Subramaniam&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Jeff Fritz&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Philippe De Ryck&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nhlanhla Lucky Nkosi&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Aleksander Stensby&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="billets"&gt;Billets&lt;/h2&gt;
&lt;p&gt;Les billets Early Bird sont disponibles — l&amp;rsquo;offre Early Bird se termine le &lt;strong&gt;22 mai 2026&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Le CFP (Call for Papers) est également ouvert.&lt;/p&gt;
&lt;h2 id="autres-événements-ndc-en-2026"&gt;Autres événements NDC en 2026&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;NDC Sydney — 22–24 avril 2026&lt;/li&gt;
&lt;li&gt;NDC Toronto — 5–8 mai 2026&lt;/li&gt;
&lt;li&gt;NDC Copenhagen — 1–4 juin 2026&lt;/li&gt;
&lt;li&gt;NDC AI — 8–10 juin 2026&lt;/li&gt;
&lt;li&gt;NDC TechTown — 21–24 septembre 2026&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="liens"&gt;Liens&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ndcoslo.com/"&gt;Site de l&amp;rsquo;événement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ndcoslo.com/tickets"&gt;Billets&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ndcoslo.com/call-for-papers"&gt;Call for Papers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ndcoslo.com/speakers"&gt;Speakers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title>.NET Day Switzerland 2026</title><link>https://thedotnetblog.com/fr/events/dotnet-day-switzerland-2026/</link><pubDate>Tue, 25 Aug 2026 00:00:00 +0000</pubDate><guid>https://thedotnetblog.com/fr/events/dotnet-day-switzerland-2026/</guid><description>Une conférence communautaire à but non lucratif pour les développeurs, architectes et experts .NET — couvrant .NET, C#, ASP.NET Core, Azure et plus — à Zurich.</description><content:encoded>&lt;p&gt;&lt;strong&gt;.NET Day Switzerland 2026&lt;/strong&gt; se tient le &lt;strong&gt;25 août 2026&lt;/strong&gt; au &lt;strong&gt;Arena Cinemas Sihlcity&lt;/strong&gt; (Kalanderplatz 8, 8045 Zurich).&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est une conférence communautaire indépendante et à but non lucratif pour les développeurs, architectes et experts qui souhaitent échanger sur .NET, C#, ASP.NET Core, Azure et l&amp;rsquo;écosystème de développement Microsoft. Tous les speakers et bénévoles donnent de leur temps, et tout excédent des ventes de billets est reversé à des œuvres caritatives ou à la communauté .NET suisse.&lt;/p&gt;
&lt;h2 id="ce-qui-vous-attend"&gt;Ce qui vous attend&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Sessions de haute qualité avec des experts internationaux&lt;/li&gt;
&lt;li&gt;Networking avec d&amp;rsquo;autres participants&lt;/li&gt;
&lt;li&gt;Repas, snacks et boissons pendant les pauses, le déjeuner et l&amp;rsquo;apéro&lt;/li&gt;
&lt;li&gt;Opportunités de carrière grâce aux interactions avec les sponsors&lt;/li&gt;
&lt;li&gt;Discussions directes avec les speakers pendant les pauses&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="billets"&gt;Billets&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Catégorie&lt;/th&gt;
&lt;th&gt;Prix&lt;/th&gt;
&lt;th&gt;Disponibilité&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Very Early Bird (1–30 avr)&lt;/td&gt;
&lt;td&gt;299 CHF&lt;/td&gt;
&lt;td&gt;Max. 100 billets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Early Bird&lt;/td&gt;
&lt;td&gt;399 CHF&lt;/td&gt;
&lt;td&gt;Max. 100 billets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Regular&lt;/td&gt;
&lt;td&gt;449 CHF&lt;/td&gt;
&lt;td&gt;Jusqu&amp;rsquo;à épuisement&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Les speakers et le programme n&amp;rsquo;ont pas encore été annoncés — l&amp;rsquo;appel à speakers est ouvert sur &lt;a href="https://sessionize.com/net-day-switzerland-2026/"&gt;Sessionize&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="organisateurs"&gt;Organisateurs&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/FabianGosebrink"&gt;Fabian Gosebrink&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/manumeyer1"&gt;Manuel Meyer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/gassmannt"&gt;Thomas Gassmann&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="liens"&gt;Liens&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dotnetday.ch/"&gt;Site de l&amp;rsquo;événement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://eepurl.com/dDoFEn"&gt;Inscription à la newsletter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title>SDD Conference 2026</title><link>https://thedotnetblog.com/fr/events/sdd-conference-2026/</link><pubDate>Mon, 11 May 2026 00:00:00 +0000</pubDate><guid>https://thedotnetblog.com/fr/events/sdd-conference-2026/</guid><description>Une conférence de 5 jours sur le développement logiciel au Barbican Centre à Londres avec 78 sessions et 14 workshops couvrant architecture, .NET, IA, Azure, DevOps et plus.</description><content:encoded>&lt;p&gt;&lt;strong&gt;SDD 2026&lt;/strong&gt; se déroule du &lt;strong&gt;11 au 15 mai 2026&lt;/strong&gt; au &lt;strong&gt;Barbican Centre à Londres&lt;/strong&gt;. La conférence principale de 3 jours va du mardi au jeudi, avec des workshops optionnels d&amp;rsquo;une journée le lundi et le vendredi.&lt;/p&gt;
&lt;p&gt;Avec &lt;strong&gt;78 sessions&lt;/strong&gt; et &lt;strong&gt;14 workshops&lt;/strong&gt;, c&amp;rsquo;est l&amp;rsquo;une des conférences développeurs les plus denses en Europe.&lt;/p&gt;
&lt;h2 id="sujets"&gt;Sujets&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Pensée Architecturale&lt;/li&gt;
&lt;li&gt;Code Fonctionnel en C# 13&lt;/li&gt;
&lt;li&gt;Design Serverless&lt;/li&gt;
&lt;li&gt;IA Sémantique&lt;/li&gt;
&lt;li&gt;Azure Kubernetes Services&lt;/li&gt;
&lt;li&gt;Stratégies Lean DevOps&lt;/li&gt;
&lt;li&gt;The Model Context Protocol (MCP)&lt;/li&gt;
&lt;li&gt;IA Agentique en .NET&lt;/li&gt;
&lt;li&gt;Refactoring du Monolithe&lt;/li&gt;
&lt;li&gt;Coder Plus Vite avec les LLMs&lt;/li&gt;
&lt;li&gt;Cryptographie dans un Monde Post-Quantique&lt;/li&gt;
&lt;li&gt;Développement Local First&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="speakers"&gt;Speakers&lt;/h2&gt;
&lt;p&gt;Un plateau de classe mondiale avec &lt;strong&gt;Kevlin Henney&lt;/strong&gt;, &lt;strong&gt;Neal Ford&lt;/strong&gt;, &lt;strong&gt;Sander Hoogendoorn&lt;/strong&gt;, &lt;strong&gt;Andrew Clymer&lt;/strong&gt;, &lt;strong&gt;Jacqui Read&lt;/strong&gt;, &lt;strong&gt;Christian Weyer&lt;/strong&gt;, &lt;strong&gt;Jeff Prosise&lt;/strong&gt;, &lt;strong&gt;Jules May&lt;/strong&gt;, &lt;strong&gt;Oliver Sturm&lt;/strong&gt; et &lt;strong&gt;Raju Gandhi&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="billets-et-informations"&gt;Billets et informations&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://sddconf.com/"&gt;Site de l&amp;rsquo;événement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sddvault.s3.amazonaws.com/assets/SDD_2026_schedule.pdf"&gt;PDF de l&amp;rsquo;agenda complet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sddconf.com/register"&gt;Options d&amp;rsquo;inscription&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;98 % des participants de SDD 2025 ont évalué l&amp;rsquo;expérience globale comme bonne, très bonne ou excellente.&lt;/p&gt;</content:encoded></item><item><title>Mise à Jour Avril du Azure DevOps MCP Server : Requêtes WIQL, Auth PAT et MCP Apps Expérimentales</title><link>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/azure-devops-mcp-server-april-2026-wiql-pat-apps/</link><pubDate>Mon, 27 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/azure-devops-mcp-server-april-2026-wiql-pat-apps/</guid><description>Le Azure DevOps MCP Server reçoit des requêtes WIQL pour les work items, l'authentification PAT, des annotations MCP et une fonctionnalité expérimentale de MCP Apps.</description><content:encoded>&lt;p&gt;&lt;em&gt;Cet article a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/posts/emiliano-montesdeoca/azure-devops-mcp-server-april-2026-wiql-pat-apps/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Le Azure DevOps MCP Server s&amp;rsquo;améliore continuellement. La mise à jour d&amp;rsquo;avril couvre les deux serveurs.&lt;/p&gt;
&lt;h2 id="support-des-requêtes-wiql"&gt;Support des Requêtes WIQL&lt;/h2&gt;
&lt;p&gt;Le nouvel outil &lt;code&gt;wit_query_by_wiql&lt;/code&gt; permet d&amp;rsquo;exécuter des requêtes Work Item Query Language depuis votre client MCP.&lt;/p&gt;
&lt;h2 id="personal-access-tokens"&gt;Personal Access Tokens&lt;/h2&gt;
&lt;p&gt;Authentification PAT sur le serveur local — important pour les scénarios d&amp;rsquo;intégration sans authentification interactive.&lt;/p&gt;
&lt;h2 id="annotations-mcp"&gt;Annotations MCP&lt;/h2&gt;
&lt;p&gt;Métadonnées pour les outils en lecture seule, destructifs et open-world — fondamentaux pour la fiabilité des agents.&lt;/p&gt;
&lt;h2 id="consolidation-des-outils-wiki"&gt;Consolidation des Outils Wiki&lt;/h2&gt;
&lt;p&gt;5 outils wiki séparés → 2 outils plus capables. Moins d&amp;rsquo;outils = meilleure performance LLM.&lt;/p&gt;
&lt;h2 id="expérimental--mcp-apps"&gt;Expérimental : MCP Apps&lt;/h2&gt;
&lt;p&gt;Workflows packagés dans l&amp;rsquo;environnement du serveur MCP. La direction est bonne.&lt;/p&gt;
&lt;p&gt;Post original de Dan Hellem : &lt;a href="https://devblogs.microsoft.com/devops/azure-devops-mcp-server-april-update/"&gt;Azure DevOps MCP Server April Update&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>SQL Server 2025 comme Base de Données Prête pour les Agents : Sécurité, Backup et MCP dans un Seul Moteur</title><link>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/sql-server-2025-agent-ready-security-mcp/</link><pubDate>Sun, 26 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/sql-server-2025-agent-ready-security-mcp/</guid><description>La partie finale de la série Polyglot Tax aborde les problèmes de production difficiles : sécurité Row-Level unifiée sur les données relationnelles, JSON, graphes et vecteurs, plus intégration MCP.</description><content:encoded>&lt;p&gt;&lt;em&gt;Cet article a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/posts/emiliano-montesdeoca/sql-server-2025-agent-ready-security-mcp/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;ai suivi la série Polyglot Tax d&amp;rsquo;Aditya Badramraju avec beaucoup d&amp;rsquo;intérêt. La partie 4 clôt la série avec les parties qui déterminent vraiment si vous feriez confiance à cette architecture en production.&lt;/p&gt;
&lt;h2 id="un-modèle-de-sécurité-pour-tous-les-modèles-de-données"&gt;Un Modèle de Sécurité pour Tous les Modèles de Données&lt;/h2&gt;
&lt;p&gt;Une seule politique Row-Level Security couvre toutes les tables — relationnelles, JSON, graphes, vecteurs. Une politique, une preuve pour l&amp;rsquo;auditeur.&lt;/p&gt;
&lt;h2 id="backup-unifié--récupération-atomique"&gt;Backup Unifié = Récupération Atomique&lt;/h2&gt;
&lt;p&gt;Dans un stack polyglottes, la récupération point-in-time sur cinq bases de données est un cauchemar de cohérence. Avec une seule base de données, c&amp;rsquo;est atomique par définition.&lt;/p&gt;
&lt;h2 id="intégration-mcp--agents-sans-middleware"&gt;Intégration MCP : Agents Sans Middleware&lt;/h2&gt;
&lt;p&gt;SQL Server 2025 supporte directement le SQL MCP Server. Les agents appellent des outils, le moteur impose l&amp;rsquo;isolation tenant et le masquage des colonnes automatiquement.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Pour les développeurs .NET qui construisent des applications agent-first sur Azure SQL, cette architecture mérite une sérieuse considération. Post original d&amp;rsquo;Aditya Badramraju : &lt;a href="https://devblogs.microsoft.com/azure-sql/the-polyglot-tax-part-4/"&gt;The Polyglot Tax – Part 4&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>.NET 10 Est Livré avec Ubuntu 26.04 LTS — Ce qui Est Nouveau</title><link>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/dotnet-ubuntu-2604-resolute-raccoon-net10/</link><pubDate>Sat, 25 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/dotnet-ubuntu-2604-resolute-raccoon-net10/</guid><description>Ubuntu 26.04 LTS (Resolute Raccoon) est sorti avec .NET 10 comme toolchain de première classe. Native AOT, conteneurs chiseled, Linux 7.0.</description><content:encoded>&lt;p&gt;&lt;em&gt;Ce post a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/dotnet-ubuntu-2604-resolute-raccoon-net10/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est le jour de l&amp;rsquo;Ubuntu LTS. &lt;a href="https://canonical.com/blog/canonical-releases-ubuntu-26-04-lts-resolute-raccoon"&gt;Ubuntu 26.04 (Resolute Raccoon)&lt;/a&gt; est sorti aujourd&amp;rsquo;hui avec &lt;a href="https://devblogs.microsoft.com/dotnet/whats-new-for-dotnet-in-ubuntu-2604/"&gt;.NET 10&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;LTS sur LTS — cinq ans de support pour l&amp;rsquo;OS, correspondant à la fenêtre de support long terme de .NET 10.&lt;/p&gt;
&lt;h2 id="installer-net-10-en-deux-commandes"&gt;Installer .NET 10 en deux commandes&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install dotnet-sdk-10.0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;.NET est l&amp;rsquo;une des &lt;a href="https://ubuntu.com/toolchains"&gt;toolchains officiellement supportées sur Ubuntu&lt;/a&gt; — pas un add-on tiers.&lt;/p&gt;
&lt;h2 id="conteneurs--mettre-à-jour--noble-vers--resolute"&gt;Conteneurs : mettre à jour &lt;code&gt;-noble&lt;/code&gt; vers &lt;code&gt;-resolute&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;La migration est une seule ligne :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed -i &lt;span class="s2"&gt;&amp;#34;s/noble/resolute/g&amp;#34;&lt;/span&gt; Dockerfile
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Toutes les variantes d&amp;rsquo;images existantes — y compris &lt;a href="https://devblogs.microsoft.com/dotnet/announcing-dotnet-chiseled-containers/"&gt;Chiseled&lt;/a&gt; — sont disponibles.&lt;/p&gt;
&lt;h2 id="native-aot--démarrage-en-3ms-binaire-de-14mb"&gt;Native AOT : démarrage en 3ms, binaire de 1,4MB&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt install -y dotnet-sdk-aot-10.0 clang
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dotnet publish app.cs
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# artifacts/app/app — binaire natif de 1,4MB&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# real 0m0.003s&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pour les charges de travail cloud-native où le temps de démarrage à froid compte — Functions, conteneurs, serverless — c&amp;rsquo;est un vrai changement de jeu.&lt;/p&gt;
&lt;h2 id="besoin-de-net-8-ou-9-"&gt;Besoin de .NET 8 ou 9 ?&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt install -y software-properties-common
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;add-apt-repository ppa:dotnet/backports
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt install -y dotnet-sdk-8.0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Le &lt;a href="https://devblogs.microsoft.com/dotnet/whats-new-for-dotnet-in-ubuntu-2604/"&gt;post complet&lt;/a&gt; contient plus de détails.&lt;/p&gt;</content:encoded></item><item><title>Azure MCP Server Est Maintenant un .mcpb — Installez-le sans Aucun Runtime</title><link>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/azure-mcp-server-mcpb-no-runtime-install/</link><pubDate>Sat, 25 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/azure-mcp-server-mcpb-no-runtime-install/</guid><description>Azure MCP Server est maintenant disponible en tant que MCP Bundle (.mcpb) — téléchargez-le, faites-le glisser dans Claude Desktop et c'est tout. Aucun Node.js, Python ou .NET requis.</description><content:encoded>&lt;p&gt;&lt;em&gt;Ce post a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/azure-mcp-server-mcpb-no-runtime-install/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Vous savez ce qui était pénible dans la configuration des serveurs MCP ? Vous aviez besoin d&amp;rsquo;un runtime. Node.js pour la version npm, Python pour pip/uvx, .NET SDK pour la variante dotnet.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;&lt;a href="https://devblogs.microsoft.com/azure-sdk/azure-mcp-server-mcpb-support/"&gt;Azure MCP Server vient de changer cela&lt;/a&gt;. Il est maintenant disponible en tant que &lt;code&gt;.mcpb&lt;/code&gt; — un MCP Bundle — et la configuration se fait par glisser-déposer.&lt;/p&gt;
&lt;h2 id="quest-ce-quun-mcp-bundle-"&gt;Qu&amp;rsquo;est-ce qu&amp;rsquo;un MCP Bundle ?&lt;/h2&gt;
&lt;p&gt;Pensez-y comme à une extension VS Code (&lt;code&gt;.vsix&lt;/code&gt;) ou une extension de navigateur (&lt;code&gt;.crx&lt;/code&gt;), mais pour les serveurs MCP. Un fichier &lt;code&gt;.mcpb&lt;/code&gt; est une archive ZIP autonome incluant le binaire du serveur et toutes ses dépendances.&lt;/p&gt;
&lt;h2 id="comment-linstaller"&gt;Comment l&amp;rsquo;installer&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;1. Téléchargez le bundle pour votre plateforme&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Allez sur la &lt;a href="https://github.com/microsoft/mcp/releases?q=Azure.Mcp.Server"&gt;page GitHub Releases&lt;/a&gt; et téléchargez le fichier &lt;code&gt;.mcpb&lt;/code&gt; pour votre OS et architecture.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Installez dans Claude Desktop&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le plus simple : faites glisser le fichier &lt;code&gt;.mcpb&lt;/code&gt; dans la fenêtre Claude Desktop sur la page des paramètres Extensions (&lt;code&gt;☰ → Fichier → Paramètres → Extensions&lt;/code&gt;). Vérifiez les détails du serveur, cliquez sur Installer, confirmez.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Authentifiez-vous auprès d&amp;rsquo;Azure&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az login
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;C&amp;rsquo;est tout. Azure MCP Server utilise vos identifiants Azure existants.&lt;/p&gt;
&lt;h2 id="ce-que-vous-pouvez-faire-avec"&gt;Ce que vous pouvez faire avec&lt;/h2&gt;
&lt;p&gt;Plus de 100 outils de services Azure directement depuis votre client IA :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Interroger et gérer Cosmos DB, Storage, Key Vault, App Service, Foundry&lt;/li&gt;
&lt;li&gt;Générer des commandes &lt;code&gt;az&lt;/code&gt; CLI pour n&amp;rsquo;importe quelle tâche&lt;/li&gt;
&lt;li&gt;Créer des modèles Bicep et Terraform&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="pour-commencer"&gt;Pour commencer&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Téléchargement&lt;/strong&gt; : &lt;a href="https://github.com/microsoft/mcp/releases?q=Azure.Mcp.Server-"&gt;GitHub Releases&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dépôt&lt;/strong&gt; : &lt;a href="https://aka.ms/azmcp"&gt;aka.ms/azmcp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Docs&lt;/strong&gt; : &lt;a href="https://aka.ms/azmcp/docs"&gt;aka.ms/azmcp/docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Consultez le &lt;a href="https://devblogs.microsoft.com/azure-sdk/azure-mcp-server-mcpb-support/"&gt;post complet&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Azure SDK Avril 2026 : AI Foundry 2.0 et Ce Que les Développeurs .NET Doivent Savoir</title><link>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/azure-sdk-april-2026-ai-foundry-2-stable/</link><pubDate>Sat, 25 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/azure-sdk-april-2026-ai-foundry-2-stable/</guid><description>La version Azure SDK d'avril 2026 livre Azure.AI.Projects 2.0.0 stable avec des changements cassants importants, des correctifs de sécurité critiques pour Cosmos DB et de nouvelles bibliothèques de Provisioning pour .NET.</description><content:encoded>&lt;p&gt;&lt;em&gt;Cet article a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/posts/emiliano-montesdeoca/azure-sdk-april-2026-ai-foundry-2-stable/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Les versions mensuelles du SDK sont souvent faciles à ignorer. Celle-ci a quelques points à retenir — surtout si vous construisez avec AI Foundry, Cosmos DB en Java, ou faites du provisionnement d&amp;rsquo;infrastructure depuis du code .NET.&lt;/p&gt;
&lt;h2 id="azureaiprojects-200--changements-cassants-qui-font-sens"&gt;Azure.AI.Projects 2.0.0 — Changements Cassants Qui Font Sens&lt;/h2&gt;
&lt;p&gt;Le paquet NuGet &lt;code&gt;Azure.AI.Projects&lt;/code&gt; atteint la version stable 2.0.0: séparations de namespaces, types renommés, et convention &lt;code&gt;Is*&lt;/code&gt; cohérente pour les booléens.&lt;/p&gt;
&lt;h2 id="cosmos-db-java--correctif-de-sécurité-critique-rce"&gt;Cosmos DB Java : Correctif de Sécurité Critique (RCE)&lt;/h2&gt;
&lt;p&gt;La version 4.79.0 inclut un correctif critique pour une &lt;strong&gt;vulnérabilité d&amp;rsquo;exécution de code à distance (CWE-502)&lt;/strong&gt;. Mise à jour immédiate requise.&lt;/p&gt;
&lt;h2 id="nouvelles-bibliothèques-de-provisioning-pour-net"&gt;Nouvelles Bibliothèques de Provisioning pour .NET&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.nuget.org/packages/Azure.Provisioning.Network/1.0.0"&gt;Azure.Provisioning.Network 1.0.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nuget.org/packages/Azure.Provisioning.PrivateDns/1.0.0"&gt;Azure.Provisioning.PrivateDns 1.0.0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Le point fort pour les développeurs .NET ce mois-ci : &lt;code&gt;Azure.AI.Projects 2.0.0&lt;/code&gt; est stable. Post original : &lt;a href="https://devblogs.microsoft.com/azure-sdk/azure-sdk-release-april-2026/"&gt;Azure SDK Release (April 2026)&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>CodeAct dans Agent Framework : Comment Réduire la Latence de votre Agent de Moitié</title><link>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/codeact-agent-framework-hyperlight-50-percent-faster/</link><pubDate>Sat, 25 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/codeact-agent-framework-hyperlight-50-percent-faster/</guid><description>CodeAct réduit les chaînes d'outils multi-étapes en un seul bloc de code sandboxé — réduisant la latence de 52% et l'utilisation des tokens de 64%. Ce que cela signifie pour vos agents et quand l'utiliser.</description><content:encoded>&lt;p&gt;&lt;em&gt;Ce post a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/codeact-agent-framework-hyperlight-50-percent-faster/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Il y a ce moment dans tout projet d&amp;rsquo;agents où vous regardez la trace et pensez : « pourquoi est-ce que ça prend autant de temps ? » Le modèle est bien. Les outils fonctionnent. Mais il y a sept allers-retours pour obtenir un résultat qu&amp;rsquo;on pourrait calculer en une seule fois.&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est exactement le problème que CodeAct résout — et l&amp;rsquo;&lt;a href="https://devblogs.microsoft.com/agent-framework/codeact-with-hyperlight/"&gt;équipe Agent Framework vient de publier un support alpha&lt;/a&gt; via le nouveau paquet &lt;code&gt;agent-framework-hyperlight&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="quest-ce-que-codeact-"&gt;Qu&amp;rsquo;est-ce que CodeAct ?&lt;/h2&gt;
&lt;p&gt;Le &lt;a href="https://arxiv.org/abs/2402.01030"&gt;pattern CodeAct&lt;/a&gt; est élégamment simple : au lieu de donner au modèle une liste d&amp;rsquo;outils à appeler un par un, vous lui donnez un seul outil &lt;code&gt;execute_code&lt;/code&gt; et le laissez exprimer le &lt;em&gt;plan complet&lt;/em&gt; comme un court programme Python. L&amp;rsquo;agent écrit le code une fois, le sandbox l&amp;rsquo;exécute, et vous récupérez un seul résultat consolidé.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Câblage&lt;/th&gt;
&lt;th&gt;Temps&lt;/th&gt;
&lt;th&gt;Tokens&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Traditionnel&lt;/td&gt;
&lt;td&gt;27,81s&lt;/td&gt;
&lt;td&gt;6 890&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CodeAct&lt;/td&gt;
&lt;td&gt;13,23s&lt;/td&gt;
&lt;td&gt;2 489&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Amélioration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;52,4%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;63,9%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="sécurité--micro-vms-hyperlight"&gt;Sécurité : Micro-VMs Hyperlight&lt;/h2&gt;
&lt;p&gt;Le paquet &lt;code&gt;agent-framework-hyperlight&lt;/code&gt; utilise des micro-VMs &lt;a href="https://github.com/hyperlight-dev/hyperlight"&gt;Hyperlight&lt;/a&gt;. Chaque appel &lt;code&gt;execute_code&lt;/code&gt; obtient sa propre micro-VM fraîchement créée. Le démarrage se mesure en millisecondes. L&amp;rsquo;isolation est pratiquement gratuite.&lt;/p&gt;
&lt;p&gt;Vos outils continuent de s&amp;rsquo;exécuter sur l&amp;rsquo;hôte. Le &lt;em&gt;code de collage&lt;/em&gt; généré par le modèle s&amp;rsquo;exécute dans le sandbox. C&amp;rsquo;est le bon découpage.&lt;/p&gt;
&lt;h2 id="configuration-minimale"&gt;Configuration minimale&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;agent_framework&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tool&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;agent_framework_hyperlight&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;HyperlightCodeActProvider&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@tool&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_weather&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;city&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;Return the current weather for a city.&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;city&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;city&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;temperature_c&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;21.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;conditions&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;partly cloudy&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;codeact&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;HyperlightCodeActProvider&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;get_weather&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;approval_mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;never_require&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;CodeActAgent&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;You are a helpful assistant.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;context_providers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;codeact&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="quand-utiliser-codeact-et-quand-ne-pas-lutiliser"&gt;Quand utiliser CodeAct (et quand ne pas l&amp;rsquo;utiliser)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Utilisez CodeAct quand :&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La tâche enchaîne de nombreux petits appels d&amp;rsquo;outils (lookups, jointures, calculs)&lt;/li&gt;
&lt;li&gt;La latence et le coût en tokens comptent&lt;/li&gt;
&lt;li&gt;Vous voulez une isolation forte par appel pour le code généré par le modèle&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Restez avec le tool-calling traditionnel quand :&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;L&amp;rsquo;agent ne fait qu&amp;rsquo;un ou deux appels d&amp;rsquo;outils par tour&lt;/li&gt;
&lt;li&gt;Chaque appel a des effets secondaires à approuver individuellement&lt;/li&gt;
&lt;li&gt;Les descriptions d&amp;rsquo;outils sont peu détaillées&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="essayez-maintenant"&gt;Essayez maintenant&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install agent-framework-hyperlight --pre
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Consultez le &lt;a href="https://devblogs.microsoft.com/agent-framework/codeact-with-hyperlight/"&gt;post complet sur le blog Agent Framework&lt;/a&gt; pour une couverture approfondie.&lt;/p&gt;</content:encoded></item><item><title>GPT-5.5 Est Là et Arrive dans Azure Foundry — Ce que les Développeurs .NET Doivent Savoir</title><link>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/gpt-55-foundry-ga-what-dotnet-developers-need-to-know/</link><pubDate>Sat, 25 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/gpt-55-foundry-ga-what-dotnet-developers-need-to-know/</guid><description>GPT-5.5 est généralement disponible dans Microsoft Foundry. La progression de GPT-5 à 5.5, ce qui s'est vraiment amélioré et comment commencer à l'utiliser dans vos agents aujourd'hui.</description><content:encoded>&lt;p&gt;&lt;em&gt;Ce post a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/gpt-55-foundry-ga-what-dotnet-developers-need-to-know/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Microsoft vient d&amp;rsquo;annoncer que &lt;a href="https://azure.microsoft.com/en-us/blog/openais-gpt-5-5-in-microsoft-foundry-frontier-intelligence-on-an-enterprise-ready-platform/"&gt;GPT-5.5 est généralement disponible dans Microsoft Foundry&lt;/a&gt;. Si vous avez été en train de créer des agents sur Azure, c&amp;rsquo;est la mise à jour que vous attendiez.&lt;/p&gt;
&lt;h2 id="la-progression-de-gpt-5"&gt;La progression de GPT-5&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GPT-5&lt;/strong&gt; : a unifié le raisonnement et la vitesse en un seul système&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPT-5.4&lt;/strong&gt; : raisonnement multi-étapes plus solide, capacités agentiques pour l&amp;rsquo;entreprise&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPT-5.5&lt;/strong&gt; : raisonnement en contexte long plus profond, exécution agentique plus fiable, meilleure efficacité des tokens&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ce-qui-a-vraiment-changé"&gt;Ce qui a vraiment changé&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Codage agentique amélioré&lt;/strong&gt; : GPT-5.5 maintient le contexte sur de grandes bases de code, diagnostique les défaillances architecturales et anticipe les exigences de tests. Le modèle raisonne sur &lt;em&gt;ce que d&amp;rsquo;autre&lt;/em&gt; une correction affecte avant d&amp;rsquo;agir.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Efficacité des tokens&lt;/strong&gt; : Des sorties de meilleure qualité avec moins de tokens et moins de tentatives. Coût et latence directement réduits en production.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Analyse en contexte long&lt;/strong&gt; : Gère de vastes documents et des historiques multi-sessions sans perdre le fil.&lt;/p&gt;
&lt;h2 id="tarification"&gt;Tarification&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Modèle&lt;/th&gt;
&lt;th&gt;Entrée ($/M tokens)&lt;/th&gt;
&lt;th&gt;Entrée en cache&lt;/th&gt;
&lt;th&gt;Sortie ($/M tokens)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.5&lt;/td&gt;
&lt;td&gt;5,00 $&lt;/td&gt;
&lt;td&gt;0,50 $&lt;/td&gt;
&lt;td&gt;30,00 $&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.5 Pro&lt;/td&gt;
&lt;td&gt;30,00 $&lt;/td&gt;
&lt;td&gt;3,00 $&lt;/td&gt;
&lt;td&gt;180,00 $&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="pourquoi-foundry-est-important"&gt;Pourquoi Foundry est important&lt;/h2&gt;
&lt;p&gt;Foundry Agent Service vous permet de définir des agents en YAML ou de les connecter avec Microsoft Agent Framework, GitHub Copilot SDK, LangGraph ou OpenAI Agents SDK — et de les exécuter comme agents hébergés isolés avec un système de fichiers persistant, une identité Microsoft Entra distincte et une tarification à l&amp;rsquo;échelle zéro.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;AIAgent&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;aiProjectClient&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AsAIAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;gpt-5.5&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Vous êtes un assistant utile.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;MonAgent&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;Consultez l&amp;rsquo;&lt;a href="https://azure.microsoft.com/en-us/blog/openais-gpt-5-5-in-microsoft-foundry-frontier-intelligence-on-an-enterprise-ready-platform/"&gt;annonce complète&lt;/a&gt; pour tous les détails.&lt;/p&gt;</content:encoded></item><item><title>Où votre Agent se Souvient-il des Choses ? Guide Pratique sur le Stockage de l'Historique de Chat</title><link>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/chat-history-storage-patterns-agent-framework/</link><pubDate>Sat, 25 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/chat-history-storage-patterns-agent-framework/</guid><description>Géré par le service ou par le client ? Linéaire ou bifurquant ? La décision architecturale qui détermine ce que votre agent IA peut vraiment faire — avec des exemples de code en C# et Python.</description><content:encoded>&lt;p&gt;&lt;em&gt;Ce post a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/chat-history-storage-patterns-agent-framework/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Lors de la création d&amp;rsquo;un agent IA, vous consacrez la majeure partie de votre énergie au modèle, aux outils et aux prompts. La question de &lt;em&gt;l&amp;rsquo;endroit où vit l&amp;rsquo;historique des conversations&lt;/em&gt; semble être un détail d&amp;rsquo;implémentation — mais c&amp;rsquo;est l&amp;rsquo;une des décisions architecturales les plus importantes que vous prendrez.&lt;/p&gt;
&lt;p&gt;Elle détermine si les utilisateurs peuvent bifurquer des conversations, annuler des réponses, reprendre des sessions après un redémarrage, et si vos données quittent jamais votre infrastructure. L&amp;rsquo;&lt;a href="https://devblogs.microsoft.com/agent-framework/chat-history-storage-patterns-in-microsoft-agent-framework/"&gt;équipe Agent Framework a publié une analyse approfondie&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="deux-modèles-fondamentaux"&gt;Deux modèles fondamentaux&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Géré par le service&lt;/strong&gt; : le service IA stocke l&amp;rsquo;état de la conversation. Votre application tient une référence et le service inclut automatiquement l&amp;rsquo;historique pertinent dans chaque requête.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Géré par le client&lt;/strong&gt; : votre application maintient l&amp;rsquo;historique complet et envoie les messages pertinents avec chaque requête. Le service est sans état. Vous contrôlez tout.&lt;/p&gt;
&lt;h2 id="comment-agent-framework-abstrait-cela"&gt;Comment Agent Framework abstrait cela&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// C# — fonctionne pareil quel que soit le fournisseur&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;AgentSession&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreateSessionAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;first&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Je m&amp;#39;appelle Alice.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;second&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Quel est mon nom ?&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Python&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create_session&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;first&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Je m&amp;#39;appelle Alice.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;second&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Quel est mon nom ?&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="référence-rapide-des-fournisseurs"&gt;Référence rapide des fournisseurs&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fournisseur&lt;/th&gt;
&lt;th&gt;Stockage&lt;/th&gt;
&lt;th&gt;Modèle&lt;/th&gt;
&lt;th&gt;Compaction&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;OpenAI/Azure Chat Completions&lt;/td&gt;
&lt;td&gt;Client&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;Vous&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Foundry Agent Service&lt;/td&gt;
&lt;td&gt;Service&lt;/td&gt;
&lt;td&gt;Linéaire&lt;/td&gt;
&lt;td&gt;Service&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Responses API (défaut)&lt;/td&gt;
&lt;td&gt;Service&lt;/td&gt;
&lt;td&gt;Bifurquant&lt;/td&gt;
&lt;td&gt;Service&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Anthropic Claude, Ollama&lt;/td&gt;
&lt;td&gt;Client&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;Vous&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="comment-choisir"&gt;Comment choisir&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Besoin de bifurcation ou « annuler » ?&lt;/strong&gt; → Responses API géré par service&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Besoin de souveraineté des données ?&lt;/strong&gt; → Géré par client avec fournisseur base de données&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Simple chatbot ?&lt;/strong&gt; → Géré par service linéaire suffit&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Lisez le &lt;a href="https://devblogs.microsoft.com/agent-framework/chat-history-storage-patterns-in-microsoft-agent-framework/"&gt;post complet&lt;/a&gt; pour l&amp;rsquo;arbre de décision complet.&lt;/p&gt;</content:encoded></item><item><title>VS Code 1.118 : Copilot CLI obtient des noms de session, des badges de modèle et TypeScript 7.0 Nightly</title><link>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/vscode-1-118-copilot-cli-session-names-model-badge/</link><pubDate>Sat, 25 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/vscode-1-118-copilot-cli-session-names-model-badge/</guid><description>Visual Studio Code 1.118 est une version ciblée sur les améliorations de Copilot CLI — nommage de sessions, badges de modèle, sélection automatique de modèle et opt-in TypeScript 7.0 Nightly.</description><content:encoded>&lt;p&gt;&lt;em&gt;Ce post a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/vscode-1-118-copilot-cli-session-names-model-badge/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://code.visualstudio.com/updates/v1_118"&gt;Visual Studio Code 1.118&lt;/a&gt; est une version plus petite et ciblée — principalement des raffinements de Copilot CLI — mais quelques éléments méritent d&amp;rsquo;être notés.&lt;/p&gt;
&lt;h2 id="copilot-cli--les-sessions-ont-de-vrais-noms"&gt;Copilot CLI : les sessions ont de vrais noms&lt;/h2&gt;
&lt;p&gt;Les APIs de titre de session du SDK Copilot CLI servent maintenant de source de vérité pour les noms de session. Les sessions affichent désormais le vrai nom du SDK au lieu d&amp;rsquo;étiquettes générées automatiquement.&lt;/p&gt;
&lt;h2 id="changer-de-session-plus-rapidement"&gt;Changer de session plus rapidement&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;application Agents a maintenant &lt;code&gt;Ctrl+1&lt;/code&gt;, &lt;code&gt;Ctrl+2&lt;/code&gt;, etc. pour basculer rapidement entre les sessions.&lt;/p&gt;
&lt;h2 id="badges-de-modèle-dans-le-chat"&gt;Badges de modèle dans le chat&lt;/h2&gt;
&lt;p&gt;Les réponses Copilot CLI dans le panneau de chat affichent maintenant un badge de modèle pour voir quel modèle a traité chaque requête.&lt;/p&gt;
&lt;h2 id="sélection-automatique-de-modèle-dans-copilot-cli"&gt;Sélection automatique de modèle dans Copilot CLI&lt;/h2&gt;
&lt;p&gt;La sélection automatique de modèle fonctionne maintenant aussi dans l&amp;rsquo;agent Copilot CLI.&lt;/p&gt;
&lt;h2 id="opt-in-typescript-70-nightly"&gt;Opt-in TypeScript 7.0 Nightly&lt;/h2&gt;
&lt;p&gt;Vous pouvez maintenant tester les nightlies TypeScript 7.0 directement depuis les paramètres VS Code. TypeScript 7.0 est une version majeure (la &lt;a href="https://devblogs.microsoft.com/typescript/announcing-typescript-7-0-beta/"&gt;bêta est sortie il y a quelques jours&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Consultez les &lt;a href="https://code.visualstudio.com/updates/v1_118"&gt;notes de version complètes&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Aspire 13.2 : Support Bun, Meilleurs Conteneurs et Moins de Friction de Debug</title><link>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/aspire-132-bun-container-enhancements/</link><pubDate>Fri, 24 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/aspire-132-bun-container-enhancements/</guid><description>Aspire 13.2 ajoute le support Bun de première classe pour les apps Vite, corrige la fiabilité de Yarn et apporte des améliorations aux conteneurs qui rendent le comportement local plus prévisible.</description><content:encoded>&lt;p&gt;&lt;em&gt;Cet article a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/posts/emiliano-montesdeoca/aspire-132-bun-container-enhancements/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Si vous construisez des backends .NET avec des frontends JavaScript dans Aspire, la 13.2 est la mise à jour qui améliore silencieusement votre quotidien. Des améliorations solides à des choses légèrement agaçantes.&lt;/p&gt;
&lt;h2 id="bun-est-maintenant-citoyen-de-première-classe"&gt;Bun est Maintenant Citoyen de Première Classe&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addViteApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;frontend&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;./frontend&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;withBun&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Si votre équipe utilise déjà Bun, Aspire ne vous force plus à aller à contre-courant.&lt;/p&gt;
&lt;h2 id="yarn-plus-fiable"&gt;Yarn Plus Fiable&lt;/h2&gt;
&lt;p&gt;Les utilisateurs de Yarn bénéficient de moins d&amp;rsquo;échecs mystérieux avec &lt;code&gt;withYarn()&lt;/code&gt; et &lt;code&gt;addViteApp()&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="améliorations-des-conteneurs"&gt;Améliorations des Conteneurs&lt;/h2&gt;
&lt;p&gt;Pull policy explicite avec &lt;code&gt;ImagePullPolicy.Never&lt;/code&gt; pour utiliser l&amp;rsquo;image locale sans aller au registry. PostgreSQL 18+ avec des volumes de données fonctionne maintenant correctement.&lt;/p&gt;
&lt;h2 id="améliorations-du-débogage"&gt;Améliorations du Débogage&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;DebuggerDisplayAttribute&lt;/code&gt; sur les types core&lt;/li&gt;
&lt;li&gt;Meilleurs messages d&amp;rsquo;erreur pour &lt;code&gt;WaitFor&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;BeforeResourceStartedEvent&lt;/code&gt; se déclenche au bon moment&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Post original de David Pine : &lt;a href="https://devblogs.microsoft.com/aspire/aspire-bun-support-and-container-enhancements/"&gt;Aspire 13.2: Bun Support and Container Enhancements&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>68 Minutes par Jour à Ré-Expliquer Son Code ? Il Y a une Solution</title><link>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/auto-memory-stop-re-explaining-code-to-copilot/</link><pubDate>Thu, 23 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/auto-memory-stop-re-explaining-code-to-copilot/</guid><description>Le context rot est réel — votre agent IA dérive après 30 tours, et vous payez la taxe de compactage toutes les heures. auto-memory donne à GitHub Copilot CLI un rappel chirurgical sans brûler des milliers de tokens.</description><content:encoded>&lt;p&gt;&lt;em&gt;Cet article a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/posts/emiliano-montesdeoca/auto-memory-stop-re-explaining-code-to-copilot/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Vous connaissez ce moment où votre session Copilot atteint &lt;code&gt;/compact&lt;/code&gt; et que l&amp;rsquo;agent oublie complètement ce sur quoi vous travailliez ? Vous passez les cinq minutes suivantes à ré-expliquer la structure des fichiers, le test qui échoue, les trois approches déjà essayées. Puis ça recommence.&lt;/p&gt;
&lt;p&gt;Desi Villanueva l&amp;rsquo;a chronométré : &lt;strong&gt;68 minutes par jour&lt;/strong&gt; — juste pour la réorientation. Pas à écrire du code. Pas à revoir des PRs. Juste à remettre l&amp;rsquo;IA au courant de choses qu&amp;rsquo;elle savait déjà.&lt;/p&gt;
&lt;p&gt;Il s&amp;rsquo;avère qu&amp;rsquo;il y a une raison concrète à cela — et une solution concrète.&lt;/p&gt;
&lt;h2 id="le-mensonge-de-la-fenêtre-de-contexte"&gt;Le Mensonge de la Fenêtre de Contexte&lt;/h2&gt;
&lt;p&gt;Votre agent arrive avec un grand nombre sur la boîte. 200K tokens. Ça semble massif. En pratique c&amp;rsquo;est un plafond, pas une garantie.&lt;/p&gt;
&lt;p&gt;Voici le calcul réel :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;200K contexte total&lt;/li&gt;
&lt;li&gt;Moins ~65K pour les outils MCP chargés au démarrage (~33%)&lt;/li&gt;
&lt;li&gt;Moins ~10K pour les fichiers d&amp;rsquo;instructions comme &lt;code&gt;AGENTS.md&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cela vous laisse environ &lt;strong&gt;125K avant d&amp;rsquo;avoir tapé un seul mot&lt;/strong&gt;. Et ça empire — les LLMs ne se dégradent pas gracieusement. Ils atteignent un mur vers 60% d&amp;rsquo;utilisation. Le modèle commence à perdre des éléments mentionnés 30 tours plus tôt.&lt;/p&gt;
&lt;p&gt;Limite effective : &lt;strong&gt;45K tokens&lt;/strong&gt; avant que la qualité se dégrade.&lt;/p&gt;
&lt;h2 id="la-taxe-de-compactage"&gt;La Taxe de Compactage&lt;/h2&gt;
&lt;p&gt;Chaque &lt;code&gt;/compact&lt;/code&gt; vous coûte votre état de flow. Vous êtes profondément dans une session de débogage. Contexte partagé construit sur 30 minutes. Puis l&amp;rsquo;avertissement arrive.&lt;/p&gt;
&lt;p&gt;La partie cruelle : &lt;strong&gt;La mémoire existe déjà.&lt;/strong&gt; Copilot CLI écrit chaque session dans une base de données SQLite locale à &lt;code&gt;~/.copilot/session-store.db&lt;/code&gt;. L&amp;rsquo;agent ne peut tout simplement pas la lire.&lt;/p&gt;
&lt;h2 id="auto-memory--une-couche-de-rappel-pas-un-système-de-mémoire"&gt;auto-memory : Une Couche de Rappel, Pas un Système de Mémoire&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install auto-memory
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;~1 900 lignes de Python. Zéro dépendances. Installé en 30 secondes.&lt;/p&gt;
&lt;p&gt;Au lieu d&amp;rsquo;inonder le contexte avec des résultats grep, vous donnez à l&amp;rsquo;agent un accès chirurgical à ce qui compte vraiment — &lt;strong&gt;50 tokens au lieu de 10 000&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="en-conclusion"&gt;En Conclusion&lt;/h2&gt;
&lt;p&gt;Le context rot est une contrainte architecturale réelle. auto-memory le contourne en donnant à votre agent un mécanisme de rappel bon marché et précis.&lt;/p&gt;
&lt;p&gt;Consultez-le : &lt;a href="https://github.com/dezgit2025/auto-memory"&gt;auto-memory sur GitHub&lt;/a&gt;. Post original de Desi Villanueva : &lt;a href="https://devblogs.microsoft.com/all-things-azure/i-wasted-68-minutes-a-day-re-explaining-my-code-then-i-built-auto-memory/"&gt;I Wasted 68 Minutes a Day&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Foundry Toolboxes : Un seul endpoint pour tous les outils de vos agents</title><link>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/foundry-toolboxes-curate-manage-tools-ai-agents/</link><pubDate>Thu, 23 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/foundry-toolboxes-curate-manage-tools-ai-agents/</guid><description>Microsoft Foundry vient de lancer Toolboxes en preview publique — un moyen de centraliser, gérer et exposer les outils d'agents IA via un unique endpoint compatible MCP.</description><content:encoded>&lt;p&gt;&lt;em&gt;Cet article a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/foundry-toolboxes-curate-manage-tools-ai-agents/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Voici un problème qui semble banal jusqu&amp;rsquo;à ce qu&amp;rsquo;on le vive : l&amp;rsquo;organisation construit plusieurs agents IA, chacun nécessite des outils, et chaque équipe les reconfigure à partir de zéro. La même intégration de recherche web, la même config Azure AI Search, la même connexion au serveur MCP GitHub — mais dans un autre dépôt, par une autre équipe, avec d&amp;rsquo;autres credentials et sans gouvernance partagée.&lt;/p&gt;
&lt;p&gt;Microsoft Foundry vient de lancer &lt;a href="https://devblogs.microsoft.com/foundry/introducing-toolboxes-in-foundry/"&gt;Toolboxes&lt;/a&gt; en preview publique, et c&amp;rsquo;est une réponse directe à ce problème.&lt;/p&gt;
&lt;h2 id="quest-ce-quune-toolbox-"&gt;Qu&amp;rsquo;est-ce qu&amp;rsquo;une Toolbox ?&lt;/h2&gt;
&lt;p&gt;Une Toolbox est un bundle d&amp;rsquo;outils nommé et réutilisable, défini une fois dans Foundry et exposé via un unique endpoint compatible MCP. N&amp;rsquo;importe quel runtime d&amp;rsquo;agent qui parle MCP peut le consommer — pas d&amp;rsquo;enfermement dans Foundry Agents.&lt;/p&gt;
&lt;p&gt;La promesse est simple : &lt;strong&gt;build once, consume anywhere&lt;/strong&gt;. Définir les outils, configurer l&amp;rsquo;authentification de façon centralisée (OAuth passthrough, identité managée Entra), publier l&amp;rsquo;endpoint. Chaque agent qui a besoin de ces outils se connecte à l&amp;rsquo;endpoint et les obtient tous.&lt;/p&gt;
&lt;h2 id="les-quatre-piliers-deux-disponibles-aujourdhui"&gt;Les quatre piliers (deux disponibles aujourd&amp;rsquo;hui)&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pilier&lt;/th&gt;
&lt;th&gt;Statut&lt;/th&gt;
&lt;th&gt;Ce qu&amp;rsquo;il fait&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Discover&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Bientôt&lt;/td&gt;
&lt;td&gt;Trouver des outils approuvés sans recherche manuelle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Build&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Disponible&lt;/td&gt;
&lt;td&gt;Regrouper des outils en un bundle réutilisable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Consume&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Disponible&lt;/td&gt;
&lt;td&gt;Un endpoint MCP unique expose tous les outils&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Govern&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Bientôt&lt;/td&gt;
&lt;td&gt;Auth centralisée + observabilité pour tous les appels&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="exemple-pratique"&gt;Exemple pratique&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;azure.identity&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;DefaultAzureCredential&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;azure.ai.projects&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AIProjectClient&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;os&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AIProjectClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;endpoint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;FOUNDRY_PROJECT_ENDPOINT&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;credential&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;DefaultAzureCredential&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;toolbox_version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;beta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;toolboxes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create_toolbox_version&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;toolbox_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;customer-feedback-triaging-toolbox&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Chercher dans la documentation et répondre aux issues GitHub.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;web_search&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Recherche dans la documentation publique&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;azure_ai_search&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;index_name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;internal-docs&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;mcp_server&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;server_url&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://your-github-mcp-server.com&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Une fois publié, Foundry fournit un endpoint unifié. Une connexion, tous les outils.&lt;/p&gt;
&lt;h2 id="pas-denfermement-dans-foundry-agents"&gt;Pas d&amp;rsquo;enfermement dans Foundry Agents&lt;/h2&gt;
&lt;p&gt;Les Toolboxes sont &lt;strong&gt;créées et gérées&lt;/strong&gt; dans Foundry, mais la surface de consommation est le protocole MCP ouvert. On peut les utiliser depuis des agents personnalisés (Microsoft Agent Framework, LangGraph), GitHub Copilot et autres IDEs compatibles MCP, et tout runtime parlant MCP.&lt;/p&gt;
&lt;h2 id="pourquoi-cest-important-maintenant"&gt;Pourquoi c&amp;rsquo;est important maintenant&lt;/h2&gt;
&lt;p&gt;La vague multi-agents arrive en production. Chaque nouvel agent est une nouvelle surface pour de la configuration dupliquée, des credentials obsolètes et des comportements incohérents. La base Build + Consume suffit pour commencer à centraliser. Quand le pilier Govern arrivera, on aura une couche d&amp;rsquo;outils entièrement observable et contrôlée centralement pour toute la flotte d&amp;rsquo;agents.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;C&amp;rsquo;est encore tôt — preview publique, SDK Python en premier, Discover et Govern à venir. Mais le modèle est solide et le design natif MCP signifie qu&amp;rsquo;il fonctionne avec les outils qu&amp;rsquo;on construit déjà. Tous les détails dans l&amp;rsquo;&lt;a href="https://devblogs.microsoft.com/foundry/introducing-toolboxes-in-foundry/"&gt;annonce officielle&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Hooks azd en Python, TypeScript et .NET : fini les scripts shell</title><link>https://thedotnetblog.com/fr/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/fr/posts/emiliano-montesdeoca/azd-hooks-python-javascript-typescript-dotnet/</guid><description>La CLI Azure Developer prend désormais en charge les hooks en Python, JavaScript, TypeScript et .NET. Plus besoin de basculer vers Bash juste pour lancer un script de migration.</description><content:encoded>&lt;p&gt;&lt;em&gt;Cet article a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/azd-hooks-python-javascript-typescript-dotnet/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Vous avez déjà eu un projet entièrement en .NET et vous avez quand même dû écrire des scripts Bash pour les hooks azd ? Vous connaissez la douleur. Pourquoi basculer vers la syntaxe shell pour une étape de pré-provisioning quand tout le reste du projet est en C# ?&lt;/p&gt;
&lt;p&gt;Cette frustration a maintenant une solution officielle. La CLI Azure Developer &lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-multi-language-hooks/"&gt;vient de publier la prise en charge multi-langages pour les hooks&lt;/a&gt;, et c&amp;rsquo;est exactement aussi bien que ça en a l&amp;rsquo;air.&lt;/p&gt;
&lt;h2 id="les-hooks-en-bref"&gt;Les hooks, en bref&lt;/h2&gt;
&lt;p&gt;Les hooks sont des scripts qui s&amp;rsquo;exécutent à des moments clés du cycle de vie d&amp;rsquo;&lt;code&gt;azd&lt;/code&gt; — avant le provisioning, après le déploiement, etc. Définis dans &lt;code&gt;azure.yaml&lt;/code&gt;, ils permettent d&amp;rsquo;injecter de la logique personnalisée sans modifier la CLI.&lt;/p&gt;
&lt;p&gt;Avant, seuls Bash et PowerShell étaient supportés. Maintenant, on peut utiliser &lt;strong&gt;Python, JavaScript, TypeScript ou .NET&lt;/strong&gt; — et &lt;code&gt;azd&lt;/code&gt; s&amp;rsquo;occupe du reste automatiquement.&lt;/p&gt;
&lt;h2 id="comment-fonctionne-la-détection"&gt;Comment fonctionne la détection&lt;/h2&gt;
&lt;p&gt;Il suffit de pointer le hook vers un fichier et &lt;code&gt;azd&lt;/code&gt; déduit le langage à partir de l&amp;rsquo;extension :&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;Pas de configuration supplémentaire. Si l&amp;rsquo;extension est ambiguë, on peut ajouter &lt;code&gt;kind: python&lt;/code&gt; (ou le langage correspondant) pour le préciser.&lt;/p&gt;
&lt;h2 id="détails-par-langage"&gt;Détails par langage&lt;/h2&gt;
&lt;h3 id="python"&gt;Python&lt;/h3&gt;
&lt;p&gt;Placer un &lt;code&gt;requirements.txt&lt;/code&gt; ou &lt;code&gt;pyproject.toml&lt;/code&gt; à côté du script (ou dans un répertoire parent). &lt;code&gt;azd&lt;/code&gt; crée automatiquement un environnement virtuel, installe les dépendances et exécute le script.&lt;/p&gt;
&lt;h3 id="javascript-et-typescript"&gt;JavaScript et TypeScript&lt;/h3&gt;
&lt;p&gt;Même principe — un &lt;code&gt;package.json&lt;/code&gt; près du script, et &lt;code&gt;azd&lt;/code&gt; exécute d&amp;rsquo;abord &lt;code&gt;npm install&lt;/code&gt;. Pour TypeScript, il utilise &lt;code&gt;npx tsx&lt;/code&gt; sans étape de compilation et sans &lt;code&gt;tsconfig.json&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="net"&gt;.NET&lt;/h3&gt;
&lt;p&gt;Deux modes disponibles :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Mode projet&lt;/strong&gt; : Si un &lt;code&gt;.csproj&lt;/code&gt; est présent à côté du script, &lt;code&gt;azd&lt;/code&gt; exécute automatiquement &lt;code&gt;dotnet restore&lt;/code&gt; et &lt;code&gt;dotnet build&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mode single-file&lt;/strong&gt; : Sur .NET 10+, les fichiers &lt;code&gt;.cs&lt;/code&gt; autonomes s&amp;rsquo;exécutent directement via &lt;code&gt;dotnet run script.cs&lt;/code&gt;. Aucun fichier de projet requis.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="configuration-par-exécuteur"&gt;Configuration par exécuteur&lt;/h2&gt;
&lt;p&gt;Chaque langage supporte un bloc &lt;code&gt;config&lt;/code&gt; optionnel :&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="pourquoi-cest-important-pour-les-développeurs-net"&gt;Pourquoi c&amp;rsquo;est important pour les développeurs .NET&lt;/h2&gt;
&lt;p&gt;Les hooks étaient le dernier endroit dans un projet azd qui forçait à changer de langage. Maintenant, l&amp;rsquo;intégralité du pipeline de déploiement peut vivre dans un seul langage. Il devient possible de réutiliser les utilitaires .NET existants dans les hooks, de référencer des bibliothèques partagées et d&amp;rsquo;abandonner la maintenance de scripts shell.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Un de ces changements qui paraissent anodins mais qui réduisent concrètement la friction au quotidien avec azd. Le support multi-langages pour les hooks est disponible maintenant — tous les détails dans le &lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-multi-language-hooks/"&gt;post officiel&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Windows App Dev CLI v0.3 : F5 depuis le terminal et UI Automation pour les agents</title><link>https://thedotnetblog.com/fr/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/fr/posts/emiliano-montesdeoca/windows-app-dev-cli-v03-run-ui-automation/</guid><description>Windows App Development CLI v0.3 apporte winapp run pour les lancements debug depuis le terminal, winapp ui pour l'automatisation UI, et un nouveau package NuGet qui fait fonctionner dotnet run avec les apps packagées.</description><content:encoded>&lt;p&gt;&lt;em&gt;Cet article a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/windows-app-dev-cli-v03-run-ui-automation/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;expérience F5 de Visual Studio est formidable. Mais devoir ouvrir VS uniquement pour lancer et déboguer une application Windows packagée, c&amp;rsquo;est trop — que ce soit dans un pipeline CI, un workflow automatisé, ou quand un agent IA effectue les tests.&lt;/p&gt;
&lt;p&gt;Windows App Development CLI v0.3 vient d&amp;rsquo;être &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;publié&lt;/a&gt; et répond directement à ce besoin avec deux fonctionnalités phares : &lt;code&gt;winapp run&lt;/code&gt; et &lt;code&gt;winapp ui&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="winapp-run--f5-depuis-nimporte-où"&gt;winapp run : F5 depuis n&amp;rsquo;importe où&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;winapp run&lt;/code&gt; prend un dossier d&amp;rsquo;application non packagée et un manifeste, et fait tout ce que VS fait au lancement debug : enregistre un package loose, lance l&amp;rsquo;application et préserve le &lt;code&gt;LocalState&lt;/code&gt; entre les re-déploiements.&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;# Compiler l&amp;#39;app, puis la lancer comme app packagée&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;winapp run ./bin/Debug
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Fonctionne pour WinUI, WPF, WinForms, Console, Avalonia et plus. Les modes sont conçus pour les développeurs et les workflows automatisés :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--detach&lt;/code&gt;&lt;/strong&gt; : Lance et rend immédiatement le contrôle au terminal. Idéal pour CI/automation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--unregister-on-exit&lt;/code&gt;&lt;/strong&gt; : Nettoie le package enregistré à la fermeture de l&amp;rsquo;app.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--debug-output&lt;/code&gt;&lt;/strong&gt; : Capture les messages &lt;code&gt;OutputDebugString&lt;/code&gt; et les exceptions en temps réel.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="nouveau-package-nuget--dotnet-run-pour-les-apps-packagées"&gt;Nouveau package NuGet : dotnet run pour les apps packagées&lt;/h2&gt;
&lt;p&gt;Pour les développeurs .NET, il y a un nouveau package NuGet : &lt;code&gt;Microsoft.Windows.SDK.BuildTools.WinApp&lt;/code&gt;. Après installation, &lt;code&gt;dotnet run&lt;/code&gt; gère tout l&amp;rsquo;inner loop : build, préparation du package loose-layout, enregistrement Windows et lancement — en une seule étape.&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;# Laisser winapp init tout configurer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;winapp init
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Ou installer directement&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-depuis-la-ligne-de-commande"&gt;winapp ui : UI Automation depuis la ligne de commande&lt;/h2&gt;
&lt;p&gt;C&amp;rsquo;est la fonctionnalité qui ouvre les scénarios agentiques. &lt;code&gt;winapp ui&lt;/code&gt; donne un accès UI Automation complet à toute application Windows en cours d&amp;rsquo;exécution — WPF, WinForms, Win32, Electron, WinUI3 — depuis le terminal.&lt;/p&gt;
&lt;p&gt;Ce qu&amp;rsquo;on peut faire :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lister toutes les fenêtres de niveau supérieur&lt;/li&gt;
&lt;li&gt;Parcourir l&amp;rsquo;arborescence UI Automation complète d&amp;rsquo;une fenêtre&lt;/li&gt;
&lt;li&gt;Rechercher des éléments par nom, type ou ID d&amp;rsquo;automatisation&lt;/li&gt;
&lt;li&gt;Cliquer, invoquer et définir des valeurs&lt;/li&gt;
&lt;li&gt;Prendre des captures d&amp;rsquo;écran&lt;/li&gt;
&lt;li&gt;Attendre l&amp;rsquo;apparition d&amp;rsquo;éléments — idéal pour la synchronisation de tests&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Combiner &lt;code&gt;winapp ui&lt;/code&gt; avec &lt;code&gt;winapp run&lt;/code&gt; donne un workflow complet build → lancement → vérification depuis le terminal. Un agent peut exécuter l&amp;rsquo;app, inspecter l&amp;rsquo;état de l&amp;rsquo;interface et valider le résultat.&lt;/p&gt;
&lt;h2 id="autres-nouveautés"&gt;Autres nouveautés&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;winapp unregister&lt;/code&gt;&lt;/strong&gt; : Supprime un package sideloadé quand on a terminé.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;winapp manifest add-alias&lt;/code&gt;&lt;/strong&gt; : Ajoute un alias pour lancer l&amp;rsquo;app par nom depuis le terminal.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Complétion automatique&lt;/strong&gt; : Un seul commande pour configurer la complétion PowerShell.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="installation"&gt;Installation&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;winget install Microsoft.WinAppCli
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ou&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install -g @microsoft/winappcli
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;La CLI est en preview publique. Le &lt;a href="https://github.com/microsoft/WinAppCli"&gt;dépôt GitHub&lt;/a&gt; contient la documentation complète et 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;annonce originale&lt;/a&gt; tous les détails.&lt;/p&gt;</content:encoded></item><item><title>Patcher Immédiatement : Mise à Jour de Sécurité OOB .NET 10.0.7 pour ASP.NET Core Data Protection</title><link>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/dotnet-10-0-7-oob-security-patch-data-protection/</link><pubDate>Wed, 22 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/dotnet-10-0-7-oob-security-patch-data-protection/</guid><description>.NET 10.0.7 est une version hors-bande corrigeant une vulnérabilité de sécurité dans Microsoft.AspNetCore.DataProtection — l'encrypteur calculait HMAC sur les mauvais octets, pouvant mener à une élévation de privilèges.</description><content:encoded>&lt;p&gt;&lt;em&gt;Cet article a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/posts/emiliano-montesdeoca/dotnet-10-0-7-oob-security-patch-data-protection/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Cette mise à jour n&amp;rsquo;est pas optionnelle. Si votre application utilise &lt;code&gt;Microsoft.AspNetCore.DataProtection&lt;/code&gt;, vous devez mettre à jour vers 10.0.7.&lt;/p&gt;
&lt;h2 id="ce-qui-sest-passé"&gt;Ce Qui S&amp;rsquo;est Passé&lt;/h2&gt;
&lt;p&gt;Après la version Patch Tuesday &lt;code&gt;.NET 10.0.6&lt;/code&gt;, certains utilisateurs ont signalé des échecs de déchiffrement. En enquêtant, l&amp;rsquo;équipe a découvert &lt;strong&gt;CVE-2026-40372&lt;/strong&gt; : le tag HMAC était calculé sur les &lt;strong&gt;mauvais octets&lt;/strong&gt;, pouvant mener à une élévation de privilèges.&lt;/p&gt;
&lt;h2 id="comment-corriger"&gt;Comment Corriger&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dotnet add package Microsoft.AspNetCore.DataProtection --version 10.0.7
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Puis &lt;strong&gt;reconstruire et redéployer&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Annonce originale de Rahul Bhandari : &lt;a href="https://devblogs.microsoft.com/dotnet/dotnet-10-0-7-oob-security-update/"&gt;.NET 10.0.7 Out-of-Band Security Update&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>azd + GitHub Copilot : Configuration de projet assistée par IA et résolution intelligente des erreurs</title><link>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/azd-copilot-integration-ai-setup-troubleshooting/</link><pubDate>Tue, 21 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/azd-copilot-integration-ai-setup-troubleshooting/</guid><description>L'Azure Developer CLI s'intègre maintenant avec GitHub Copilot pour scaffolder ton projet et résoudre les erreurs de déploiement — sans quitter le terminal.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Cet article a été traduit automatiquement. Pour la version originale en anglais, &lt;a href="https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/azd-copilot-integration-ai-setup-troubleshooting/"&gt;clique ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Tu connais ce moment où tu veux déployer une app existante sur Azure et tu te retrouves à fixer un &lt;code&gt;azure.yaml&lt;/code&gt; vide, en essayant de te rappeler si ton API Express devrait utiliser Container Apps ou App Service ? Ce moment vient de devenir beaucoup plus court.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;Azure Developer CLI (&lt;code&gt;azd&lt;/code&gt;) s&amp;rsquo;intègre maintenant avec GitHub Copilot de deux façons concrètes : scaffolding assisté par IA pendant &lt;code&gt;azd init&lt;/code&gt;, et résolution intelligente des erreurs quand les déploiements échouent. Les deux fonctionnalités restent entièrement dans ton terminal — exactement là où je veux qu&amp;rsquo;elles soient.&lt;/p&gt;
&lt;h2 id="configuration-avec-copilot-pendant-azd-init"&gt;Configuration avec Copilot pendant azd init&lt;/h2&gt;
&lt;p&gt;Quand tu lances &lt;code&gt;azd init&lt;/code&gt;, il y a maintenant une option &amp;ldquo;Set up with GitHub Copilot (Preview)&amp;rdquo;. Sélectionne-la et Copilot analyse ta base de code pour générer l&amp;rsquo;&lt;code&gt;azure.yaml&lt;/code&gt;, les templates d&amp;rsquo;infrastructure et les modules Bicep — basés sur ton code réel.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;azd init
# Sélectionne : &amp;#34;Set up with GitHub Copilot (Preview)&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Prérequis :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;azd 1.23.11 ou supérieur&lt;/strong&gt; — vérifie avec &lt;code&gt;azd version&lt;/code&gt; ou mets à jour avec &lt;code&gt;azd update&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Un abonnement GitHub Copilot actif&lt;/strong&gt; (Individual, Business ou Enterprise)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub CLI (&lt;code&gt;gh&lt;/code&gt;)&lt;/strong&gt; — &lt;code&gt;azd&lt;/code&gt; demandera la connexion si nécessaire&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ce que je trouve vraiment utile : ça fonctionne dans les deux sens. Tu construis depuis zéro ? Copilot t&amp;rsquo;aide à configurer les bons services Azure dès le départ. Tu as une app existante que tu voulais déployer depuis longtemps ? Pointe Copilot dessus et il génère la configuration sans que tu aies à restructurer quoi que ce soit.&lt;/p&gt;
&lt;h3 id="ce-que-ça-fait-concrètement"&gt;Ce que ça fait concrètement&lt;/h3&gt;
&lt;p&gt;Imaginons une API Express Node.js avec une dépendance PostgreSQL. Au lieu de décider manuellement entre Container Apps et App Service, puis d&amp;rsquo;écrire du Bicep depuis zéro, Copilot détecte ton stack et génère :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Un &lt;code&gt;azure.yaml&lt;/code&gt; avec les bons paramètres &lt;code&gt;language&lt;/code&gt;, &lt;code&gt;host&lt;/code&gt; et &lt;code&gt;build&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Un module Bicep pour Azure Container Apps&lt;/li&gt;
&lt;li&gt;Un module Bicep pour Azure Database for PostgreSQL&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Et il effectue des vérifications préalables avant de toucher quoi que ce soit — vérifie que ton répertoire git est propre, demande le consentement pour les outils du serveur MCP. Rien ne se passe sans que tu saches exactement ce qui va changer.&lt;/p&gt;
&lt;h2 id="résolution-derreurs-avec-copilot"&gt;Résolution d&amp;rsquo;erreurs avec Copilot&lt;/h2&gt;
&lt;p&gt;Les erreurs de déploiement, ça arrive. Paramètres manquants, problèmes de permissions, disponibilité des SKUs — et le message d&amp;rsquo;erreur ne te dit rarement la seule chose dont tu as vraiment besoin : &lt;em&gt;comment régler le problème&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Sans Copilot, la boucle ressemble à : copier l&amp;rsquo;erreur → chercher dans la doc → lire trois réponses Stack Overflow hors sujet → exécuter quelques commandes &lt;code&gt;az&lt;/code&gt; CLI → réessayer en espérant que ça marche. Avec Copilot intégré dans &lt;code&gt;azd&lt;/code&gt;, cette boucle s&amp;rsquo;effondre. Quand une commande &lt;code&gt;azd&lt;/code&gt; échoue, elle propose immédiatement quatre options :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Explain&lt;/strong&gt; — explication en langage naturel de ce qui s&amp;rsquo;est passé&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Guidance&lt;/strong&gt; — instructions étape par étape pour corriger le problème&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Diagnose and Guide&lt;/strong&gt; — analyse complète + Copilot applique le correctif (avec ton approbation) + nouvelle tentative optionnelle&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Skip&lt;/strong&gt; — gérer toi-même&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;L&amp;rsquo;essentiel : Copilot a déjà le contexte de ton projet, la commande qui a échoué et les détails de l&amp;rsquo;erreur. Ses suggestions sont spécifiques à &lt;em&gt;ta situation&lt;/em&gt;, pas de la documentation générique.&lt;/p&gt;
&lt;h3 id="configurer-un-comportement-par-défaut"&gt;Configurer un comportement par défaut&lt;/h3&gt;
&lt;p&gt;Si tu choisis toujours la même option, saute le prompt interactif :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;azd config set copilot.errorHandling.category troubleshoot
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Valeurs : &lt;code&gt;explain&lt;/code&gt;, &lt;code&gt;guidance&lt;/code&gt;, &lt;code&gt;troubleshoot&lt;/code&gt;, &lt;code&gt;fix&lt;/code&gt;, &lt;code&gt;skip&lt;/code&gt;. Tu peux aussi activer l&amp;rsquo;auto-fix et le retry :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;azd config set copilot.errorHandling.fix allow
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Retour au mode interactif à tout moment :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;azd config unset copilot.errorHandling.category
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;C&amp;rsquo;est exactement le type d&amp;rsquo;intégration Copilot qui apporte une vraie valeur. Essaie-le en lançant &lt;code&gt;azd update&lt;/code&gt; pour obtenir la dernière version, puis utilise &lt;code&gt;azd init&lt;/code&gt; sur ton prochain projet.&lt;/p&gt;
&lt;p&gt;Lis l&amp;rsquo;&lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-copilot-integration/"&gt;annonce originale ici&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Écrire des addons natifs Node.js en C# avec .NET Native AOT</title><link>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/nodejs-addons-csharp-native-aot/</link><pubDate>Tue, 21 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/nodejs-addons-csharp-native-aot/</guid><description>L'équipe C# Dev Kit a remplacé des addons Node.js écrits en C++ par .NET Native AOT — le résultat est plus propre, plus sûr et ne nécessite que le SDK .NET.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Cet article a été traduit automatiquement. Pour la version originale en anglais, &lt;a href="https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/nodejs-addons-csharp-native-aot/"&gt;clique ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Voilà un scénario que j&amp;rsquo;adore : une équipe qui travaille sur des outils .NET avait des addons natifs Node.js écrits en C++ et compilés via &lt;code&gt;node-gyp&lt;/code&gt;. Ça fonctionnait. Mais ça nécessitait Python sur chaque machine de développeur — une vieille version de Python, par-dessus le marché — juste pour construire un package que personne dans l&amp;rsquo;équipe ne toucherait directement.&lt;/p&gt;
&lt;p&gt;Ils se sont donc posé une question très raisonnable : on a déjà le SDK .NET installé, pourquoi écrit-on du C++ ?&lt;/p&gt;
&lt;p&gt;La réponse était Native AOT, et le résultat est vraiment élégant. Drew Noakes de l&amp;rsquo;équipe C# Dev Kit a documenté comment ils l&amp;rsquo;ont fait, et je pense que ça vaut la peine de comprendre — même si tu ne construis pas d&amp;rsquo;extensions VS Code.&lt;/p&gt;
&lt;h2 id="lidée-de-base"&gt;L&amp;rsquo;idée de base&lt;/h2&gt;
&lt;p&gt;Un addon natif Node.js est une bibliothèque partagée (&lt;code&gt;.dll&lt;/code&gt; sous Windows, &lt;code&gt;.so&lt;/code&gt; sous Linux, &lt;code&gt;.dylib&lt;/code&gt; sous macOS) que Node.js peut charger au runtime. L&amp;rsquo;interface s&amp;rsquo;appelle &lt;a href="https://nodejs.org/api/n-api.html"&gt;N-API&lt;/a&gt; — une API C stable et compatible ABI. N-API se fiche du langage qui a produit la bibliothèque, tant qu&amp;rsquo;elle exporte les bons symboles.&lt;/p&gt;
&lt;p&gt;.NET Native AOT peut produire exactement ça. Il compile le code C# en avance en une bibliothèque partagée native avec des points d&amp;rsquo;entrée arbitraires. C&amp;rsquo;est tout le truc.&lt;/p&gt;
&lt;h2 id="configuration-du-projet"&gt;Configuration du projet&lt;/h2&gt;
&lt;p&gt;Le fichier projet est minimal :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;Project&lt;/span&gt; &lt;span class="na"&gt;Sdk=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Microsoft.NET.Sdk&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;PropertyGroup&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;TargetFramework&amp;gt;&lt;/span&gt;net10.0&lt;span class="nt"&gt;&amp;lt;/TargetFramework&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;PublishAot&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/PublishAot&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;AllowUnsafeBlocks&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/AllowUnsafeBlocks&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/PropertyGroup&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/Project&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;PublishAot&lt;/code&gt; dit au SDK de produire une bibliothèque partagée à &lt;code&gt;dotnet publish&lt;/code&gt;. &lt;code&gt;AllowUnsafeBlocks&lt;/code&gt; est nécessaire pour l&amp;rsquo;interop N-API avec des pointeurs de fonctions et des buffers fixes.&lt;/p&gt;
&lt;h2 id="exporter-le-point-dentrée"&gt;Exporter le point d&amp;rsquo;entrée&lt;/h2&gt;
&lt;p&gt;Node.js s&amp;rsquo;attend à ce que ta bibliothèque exporte &lt;code&gt;napi_register_module_v1&lt;/code&gt;. En C#, &lt;code&gt;[UnmanagedCallersOnly]&lt;/code&gt; fait exactement ça :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;unsafe&lt;/span&gt; &lt;span class="kd"&gt;partial&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;RegistryAddon&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt; [UnmanagedCallersOnly(
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt; EntryPoint = &amp;#34;napi_register_module_v1&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt; CallConvs = [typeof(CallConvCdecl)]&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="n"&gt;nint&lt;/span&gt; &lt;span class="n"&gt;Init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nint&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nint&lt;/span&gt; &lt;span class="n"&gt;exports&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Initialize&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;RegisterFunction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exports&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;readStringValue&amp;#34;&lt;/span&gt;&lt;span class="n"&gt;u8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;ReadStringValue&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;exports&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Quelques points à noter : &lt;code&gt;nint&lt;/code&gt; est un entier de taille native — l&amp;rsquo;équivalent managé de &lt;code&gt;intptr_t&lt;/code&gt;. Le suffixe &lt;code&gt;u8&lt;/code&gt; produit un &lt;code&gt;ReadOnlySpan&amp;lt;byte&amp;gt;&lt;/code&gt; avec un littéral de chaîne UTF-8, passé directement à N-API sans aucune allocation d&amp;rsquo;encodage. Et &lt;code&gt;[UnmanagedCallersOnly]&lt;/code&gt; exporte la méthode avec exactement le nom de point d&amp;rsquo;entrée que Node.js cherche.&lt;/p&gt;
&lt;h2 id="résoudre-n-api-contre-le-processus-hôte"&gt;Résoudre N-API contre le processus hôte&lt;/h2&gt;
&lt;p&gt;Les fonctions N-API sont exportées par &lt;code&gt;node.exe&lt;/code&gt; lui-même, pas une bibliothèque séparée. Donc au lieu de lier contre quelque chose, on les résout contre le processus en cours au démarrage :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="n"&gt;Initialize&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;NativeLibrary&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SetDllImportResolver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Reflection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Assembly&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetExecutingAssembly&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ResolveDllImport&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="n"&gt;nint&lt;/span&gt; &lt;span class="n"&gt;ResolveDllImport&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;libraryName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Assembly&lt;/span&gt; &lt;span class="n"&gt;assembly&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DllImportSearchPath&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;searchPath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;libraryName&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="n"&gt;not&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;node&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;NativeLibrary&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetMainProgramHandle&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Avec ça en place, les déclarations P/Invoke fonctionnent proprement avec &lt;code&gt;[LibraryImport]&lt;/code&gt; et le marshalling généré par la source.&lt;/p&gt;
&lt;h2 id="une-vraie-fonction-exportée"&gt;Une vraie fonction exportée&lt;/h2&gt;
&lt;p&gt;Voici le lecteur de registre qu&amp;rsquo;ils ont construit :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;[UnmanagedCallersOnly(CallConvs = [typeof(CallConvCdecl)]&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="n"&gt;nint&lt;/span&gt; &lt;span class="n"&gt;ReadStringValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nint&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nint&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;try&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;keyPath&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GetStringArg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;valueName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GetStringArg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;keyPath&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="p"&gt;||&lt;/span&gt; &lt;span class="n"&gt;valueName&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ThrowError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Expected two string arguments: keyPath, valueName&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;var&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Registry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CurrentUser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;OpenSubKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;keyPath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;writable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="n"&gt;GetValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;valueName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="k"&gt;value&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;CreateString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;GetUndefined&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Exception&lt;/span&gt; &lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ThrowError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;$&amp;#34;Registry read failed: {ex.Message}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Note importante sur le &lt;code&gt;try/catch&lt;/code&gt; : une exception non gérée dans une méthode &lt;code&gt;[UnmanagedCallersOnly]&lt;/code&gt; plante le processus hôte. Toujours attraper et transmettre à JavaScript via &lt;code&gt;ThrowError&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="appeler-depuis-typescript"&gt;Appeler depuis TypeScript&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;registry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kr"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;./native/win32-x64/RegistryAddon.node&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kr"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;RegistryAddon&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sdkPath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;registry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;readStringValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;SOFTWARE\\dotnet\\Setup\\InstalledVersions\\x64\\sdk&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;InstallLocation&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;TypeScript → C#, sans Python, sans C++.&lt;/p&gt;
&lt;h2 id="ce-quils-ont-gagné"&gt;Ce qu&amp;rsquo;ils ont gagné&lt;/h2&gt;
&lt;p&gt;La victoire immédiate : l&amp;rsquo;expérience contributeur. Plus besoin d&amp;rsquo;une version Python spécifique, &lt;code&gt;yarn install&lt;/code&gt; fonctionne avec Node.js et le SDK .NET. Les pipelines CI sont aussi plus simples. Les performances sont comparables à l&amp;rsquo;implémentation C++.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;équipe C# Dev Kit a remplacé la complexité Python/C++ par du C# propre que toute l&amp;rsquo;équipe sait déjà écrire et déboguer. Pour le walkthrough complet avec tous les helpers de marshalling de chaînes, consulte l&amp;rsquo;&lt;a href="https://devblogs.microsoft.com/dotnet/writing-nodejs-addons-with-dotnet-native-aot/"&gt;article original sur le blog .NET&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>VS Code 1.117 : Les Agents Obtiennent Leurs Propres Branches Git et Je Suis Totalement Pour</title><link>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/vscode-1-117-agents-autopilot-worktrees/</link><pubDate>Sun, 19 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/vscode-1-117-agents-autopilot-worktrees/</guid><description>VS Code 1.117 apporte l'isolation par worktree pour les sessions d'agents, le mode Autopilot persistant et le support des sous-agents. Le workflow de codage agentique devient vraiment concret.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Cet article a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/vscode-1-117-agents-autopilot-worktrees/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;La frontière entre « assistant IA » et « coéquipier IA » continue de s&amp;rsquo;amincir. VS Code 1.117 vient de sortir et les &lt;a href="https://code.visualstudio.com/updates/v1_117"&gt;notes de version complètes&lt;/a&gt; sont bien remplies, mais l&amp;rsquo;histoire est claire : les agents deviennent des citoyens de première classe dans votre workflow de développement.&lt;/p&gt;
&lt;p&gt;Voici ce qui compte vraiment.&lt;/p&gt;
&lt;h2 id="le-mode-autopilot-se-souvient-enfin-de-votre-préférence"&gt;Le mode Autopilot se souvient enfin de votre préférence&lt;/h2&gt;
&lt;p&gt;Avant, il fallait réactiver Autopilot à chaque nouvelle session. Agaçant. Maintenant votre mode de permissions persiste d&amp;rsquo;une session à l&amp;rsquo;autre, et vous pouvez configurer la valeur par défaut.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;Agent Host supporte trois configurations de session :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Default&lt;/strong&gt; — les outils demandent confirmation avant de s&amp;rsquo;exécuter&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bypass&lt;/strong&gt; — approuve tout automatiquement&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Autopilot&lt;/strong&gt; — totalement autonome, répond à ses propres questions et continue&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si vous construisez un nouveau projet .NET avec des migrations, Docker et de la CI — réglez-le sur Autopilot une fois et oubliez-le. Cette préférence reste.&lt;/p&gt;
&lt;h2 id="worktree-et-isolation-git-pour-les-sessions-dagents"&gt;Worktree et isolation git pour les sessions d&amp;rsquo;agents&lt;/h2&gt;
&lt;p&gt;C&amp;rsquo;est le gros morceau. Les sessions d&amp;rsquo;agents supportent maintenant l&amp;rsquo;isolation complète par worktree et git. Cela signifie que quand un agent travaille sur une tâche, il obtient sa propre branche et son propre répertoire de travail. Votre branche principale reste intacte.&lt;/p&gt;
&lt;p&gt;Encore mieux — Copilot CLI génère des noms de branche significatifs pour ces sessions worktree. Fini le &lt;code&gt;agent-session-abc123&lt;/code&gt;. Vous obtenez quelque chose qui décrit réellement ce que l&amp;rsquo;agent fait.&lt;/p&gt;
&lt;p&gt;Pour les développeurs .NET qui gèrent plusieurs branches de fonctionnalités ou corrigent des bugs pendant qu&amp;rsquo;une longue tâche de scaffolding tourne, c&amp;rsquo;est un vrai changement. Vous pouvez avoir un agent qui construit vos contrôleurs d&amp;rsquo;API dans un worktree pendant que vous déboguez un problème dans la couche de services dans un autre. Pas de conflits. Pas de stashing. Pas de bazar.&lt;/p&gt;
&lt;h2 id="sous-agents-et-équipes-dagents"&gt;Sous-agents et équipes d&amp;rsquo;agents&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;Agent Host Protocol supporte maintenant les sous-agents. Un agent peut lancer d&amp;rsquo;autres agents pour gérer des parties d&amp;rsquo;une tâche. Pensez-y comme de la délégation — votre agent principal coordonne, et des agents spécialisés s&amp;rsquo;occupent des morceaux.&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est encore tôt, mais le potentiel pour les workflows .NET est évident. Imaginez un agent qui gère vos migrations EF Core pendant qu&amp;rsquo;un autre configure vos tests d&amp;rsquo;intégration. On n&amp;rsquo;y est pas encore complètement, mais le fait que le support du protocole arrive maintenant signifie que l&amp;rsquo;outillage suivra rapidement.&lt;/p&gt;
&lt;h2 id="la-sortie-terminal-automatiquement-incluse-quand-les-agents-envoient-de-linput"&gt;La sortie terminal automatiquement incluse quand les agents envoient de l&amp;rsquo;input&lt;/h2&gt;
&lt;p&gt;Petit mais significatif. Quand un agent envoie de l&amp;rsquo;input au terminal, la sortie du terminal est maintenant automatiquement incluse dans le contexte. Avant, l&amp;rsquo;agent devait faire un tour supplémentaire juste pour lire ce qui s&amp;rsquo;était passé.&lt;/p&gt;
&lt;p&gt;Si vous avez déjà vu un agent exécuter &lt;code&gt;dotnet build&lt;/code&gt;, échouer, puis faire un aller-retour supplémentaire juste pour voir l&amp;rsquo;erreur — cette friction a disparu. Il voit la sortie immédiatement et réagit.&lt;/p&gt;
&lt;h2 id="lapplication-agents-sur-macos-se-met-à-jour-automatiquement"&gt;L&amp;rsquo;application Agents sur macOS se met à jour automatiquement&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;application autonome Agents sur macOS se met maintenant à jour automatiquement. Plus besoin de télécharger manuellement les nouvelles versions. Elle reste simplement à jour.&lt;/p&gt;
&lt;h2 id="les-petites-choses-qui-valent-la-peine-dêtre-connues"&gt;Les petites choses qui valent la peine d&amp;rsquo;être connues&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Les &lt;strong&gt;survols package.json&lt;/strong&gt; affichent maintenant la version installée et la dernière disponible. Utile si vous gérez des outils npm aux côtés de vos projets .NET.&lt;/li&gt;
&lt;li&gt;Les &lt;strong&gt;images dans les commentaires JSDoc&lt;/strong&gt; s&amp;rsquo;affichent correctement dans les survols et les complétions.&lt;/li&gt;
&lt;li&gt;Les &lt;strong&gt;sessions Copilot CLI&lt;/strong&gt; indiquent maintenant si elles ont été créées par VS Code ou en externe — pratique quand vous sautez entre les terminaux.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Copilot CLI, Claude Code et Gemini CLI&lt;/strong&gt; sont reconnus comme types de shell. L&amp;rsquo;éditeur sait ce que vous exécutez.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ce-quil-faut-retenir"&gt;Ce qu&amp;rsquo;il faut retenir&lt;/h2&gt;
&lt;p&gt;VS Code 1.117 n&amp;rsquo;est pas un déversement de fonctionnalités tape-à-l&amp;rsquo;œil. C&amp;rsquo;est de l&amp;rsquo;infrastructure. Isolation par worktree, permissions persistantes, protocoles de sous-agents — ce sont les briques pour un workflow où les agents gèrent des tâches réelles et parallèles sans marcher sur votre code.&lt;/p&gt;
&lt;p&gt;Si vous développez avec .NET et que vous ne vous êtes pas encore lancé dans le workflow agentique, honnêtement, c&amp;rsquo;est le moment de commencer.&lt;/p&gt;</content:encoded></item><item><title>Global Azure Spain 2026</title><link>https://thedotnetblog.com/fr/events/global-azure-spain-2026/</link><pubDate>Sat, 18 Apr 2026 00:00:00 +0000</pubDate><guid>https://thedotnetblog.com/fr/events/global-azure-spain-2026/</guid><description>Le plus grand événement Azure communautaire en Espagne — une journée complète de sessions sur Azure, IA, données, sécurité et développement cloud-native avec 38 speakers sur 3 tracks.</description><content:encoded>&lt;p&gt;Global Azure Spain 2026 a lieu le &lt;strong&gt;18 avril 2026&lt;/strong&gt; au &lt;strong&gt;Kinépolis Diversia&lt;/strong&gt; à Alcobendas, Madrid. C&amp;rsquo;est le plus grand événement communautaire Azure en Espagne, réunissant 38 speakers sur 3 tracks parallèles couvrant les agents IA, le réseau Azure, Cosmos DB, Fabric, IoT, la sécurité et bien plus.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;événement se déroule de &lt;strong&gt;08h30 à 18h30&lt;/strong&gt; et comprend une keynote, des pauses café, un déjeuner et une session de clôture Q&amp;amp;A.&lt;/p&gt;
&lt;h2 id="points-forts-de-lagenda"&gt;Points forts de l&amp;rsquo;agenda&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Domando Agentes de IA&lt;/strong&gt; : gouvernance, outils et APIs avec Azure AI Foundry et Azure API Management&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Construyendo agentes con LibreChat en Azure&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How Can I Steal Your Data with Azure Private Endpoints&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stop Building APIs. Forge Agents with Azure&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agentic DevOps Meets IoT: Real-Time Systems with Fabric and GitHub Copilot&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;El regreso de los tamagotchis!&lt;/strong&gt; : systèmes multi-agents en action&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Foundry Control Plane como plataforma de Agentes global&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rompiendo el perímetro: Zero Trust aplicado en Azure&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="billets"&gt;Billets&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;inscription est une donation symbolique — le prix du billet est entièrement reversé à &lt;strong&gt;Plan International&lt;/strong&gt;, soutenant les droits des enfants et l&amp;rsquo;égalité dans le monde. Capacité limitée, alors réservez votre place rapidement.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.eventbrite.es/e/entradas-global-azure-spain-2026-en-madrid-1981594189564"&gt;Billets sur Eventbrite&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://globalazure.es/"&gt;Site de l&amp;rsquo;événement&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="azure-tour-2026"&gt;Azure Tour 2026&lt;/h2&gt;
&lt;p&gt;Au-delà de Madrid, le Global Azure Tour 2026 comprend également des étapes à &lt;strong&gt;Saragosse&lt;/strong&gt;, &lt;strong&gt;Tenerife&lt;/strong&gt; et &lt;strong&gt;Séville&lt;/strong&gt;.&lt;/p&gt;</content:encoded></item><item><title>Le RFT de Foundry est désormais moins cher et plus intelligent — Voici ce qui a changé</title><link>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/foundry-fine-tuning-april-2026-rft-graders/</link><pubDate>Sat, 18 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/foundry-fine-tuning-april-2026-rft-graders/</guid><description>Microsoft Foundry a publié trois mises à jour RFT ce mois-ci : l'entraînement global pour o4-mini, de nouveaux évaluateurs de modèle GPT-4.1 et un guide de bonnes pratiques qui vous fera gagner des heures de débogage.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Cet article a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/foundry-fine-tuning-april-2026-rft-graders/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Si vous développez des applications .NET qui reposent sur des modèles fine-tunés, les mises à jour Foundry de ce mois méritent votre attention. Le Reinforcement Fine-Tuning est devenu plus accessible et nettement moins cher.&lt;/p&gt;
&lt;p&gt;Les détails complets sont dans l&amp;rsquo;&lt;a href="https://devblogs.microsoft.com/foundry/whats-new-in-foundry-finetune-april-2026/"&gt;annonce officielle&lt;/a&gt;, mais voici le résumé pratique.&lt;/p&gt;
&lt;h2 id="entraînement-global-pour-o4-mini"&gt;Entraînement Global pour o4-mini&lt;/h2&gt;
&lt;p&gt;o4-mini est le modèle de référence pour les charges de travail intensives en raisonnement et agentiques. La grande nouvelle : vous pouvez désormais lancer des jobs de fine-tuning depuis plus de 13 régions Azure avec des tarifs d&amp;rsquo;entraînement par token inférieurs par rapport à l&amp;rsquo;entraînement Standard. Même infrastructure, même qualité, plus grande portée.&lt;/p&gt;
&lt;p&gt;Si votre équipe est répartie géographiquement, c&amp;rsquo;est important. Vous n&amp;rsquo;êtes plus limité à une poignée de régions pour entraîner.&lt;/p&gt;
&lt;p&gt;Voici l&amp;rsquo;appel API REST pour lancer un job d&amp;rsquo;entraînement global :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -X POST &lt;span class="s2"&gt;&amp;#34;https://&amp;lt;your-resource&amp;gt;.openai.azure.com/openai/fine_tuning/jobs?api-version=2025-04-01-preview&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -H &lt;span class="s2"&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -H &lt;span class="s2"&gt;&amp;#34;api-key: &lt;/span&gt;&lt;span class="nv"&gt;$AZURE_OPENAI_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -d &lt;span class="s1"&gt;&amp;#39;{
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;model&amp;#34;: &amp;#34;o4-mini&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;training_file&amp;#34;: &amp;#34;&amp;lt;your-training-file-id&amp;gt;&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;method&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;type&amp;#34;: &amp;#34;reinforcement&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;reinforcement&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;grader&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;type&amp;#34;: &amp;#34;string_check&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;name&amp;#34;: &amp;#34;answer-check&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;input&amp;#34;: &amp;#34;{{sample.output_text}}&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;reference&amp;#34;: &amp;#34;{{item.reference_answer}}&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;operation&amp;#34;: &amp;#34;eq&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;hyperparameters&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;n_epochs&amp;#34;: 2,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;compute_multiplier&amp;#34;: 1.0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;trainingType&amp;#34;: &amp;#34;globalstandard&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; }&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ce flag &lt;code&gt;trainingType: globalstandard&lt;/code&gt; fait toute la différence.&lt;/p&gt;
&lt;h2 id="nouveaux-évaluateurs-de-modèle--famille-gpt-41"&gt;Nouveaux Évaluateurs de Modèle : Famille GPT-4.1&lt;/h2&gt;
&lt;p&gt;Les évaluateurs définissent le signal de récompense contre lequel votre modèle optimise. Jusqu&amp;rsquo;à présent, les évaluateurs basés sur des modèles étaient limités à un ensemble restreint de modèles. Vous avez maintenant trois nouvelles options : GPT-4.1, GPT-4.1-mini et GPT-4.1-nano.&lt;/p&gt;
&lt;p&gt;Quand faut-il utiliser des évaluateurs de modèle plutôt que des déterministes ? Quand la sortie de votre tâche est ouverte, quand vous avez besoin de notation partielle sur plusieurs dimensions, ou quand vous construisez des workflows agentiques où la justesse des appels d&amp;rsquo;outils dépend du contexte sémantique.&lt;/p&gt;
&lt;p&gt;Le truc, c&amp;rsquo;est que la stratégie de niveaux est pratique :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GPT-4.1-nano&lt;/strong&gt; pour les premières itérations. Coût faible, boucles de feedback rapides.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPT-4.1-mini&lt;/strong&gt; une fois que votre grille d&amp;rsquo;évaluation est stable et que vous avez besoin de plus de fidélité.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPT-4.1&lt;/strong&gt; pour l&amp;rsquo;évaluation en production ou les grilles complexes où chaque décision de notation compte.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vous pouvez même mixer les types d&amp;rsquo;évaluateurs dans un seul job RFT. Utilisez le string-match pour la dimension &amp;ldquo;bonne réponse&amp;rdquo; et un évaluateur de modèle pour évaluer la qualité du raisonnement. Cette flexibilité est honnêtement ce qui le rend utile pour des charges de travail réelles.&lt;/p&gt;
&lt;h2 id="le-piège-du-format-de-données-rft"&gt;Le Piège du Format de Données RFT&lt;/h2&gt;
&lt;p&gt;C&amp;rsquo;est ce qui fait trébucher les gens. Le format de données RFT est différent du SFT. Le dernier message de chaque ligne doit avoir le rôle User ou Developer — pas Assistant. La réponse attendue va dans une clé de niveau supérieur comme &lt;code&gt;reference_answer&lt;/code&gt; que l&amp;rsquo;évaluateur référence directement.&lt;/p&gt;
&lt;p&gt;Si vous faisiez du supervised fine-tuning et que vous voulez passer au RFT, vous devez restructurer vos données d&amp;rsquo;entraînement. Ne sautez pas cette étape ou vos jobs échoueront silencieusement.&lt;/p&gt;
&lt;h2 id="pourquoi-cest-important-pour-les-développeurs-net"&gt;Pourquoi C&amp;rsquo;est Important pour les Développeurs .NET&lt;/h2&gt;
&lt;p&gt;Si vous appelez des modèles fine-tunés depuis vos applications .NET via le SDK Azure OpenAI, un entraînement moins cher signifie que vous pouvez itérer plus agressivement. Les options d&amp;rsquo;évaluateurs de modèle signifient que vous pouvez fine-tuner pour des tâches nuancées — pas seulement des scénarios de correspondance exacte. Et le guide de bonnes pratiques sur &lt;a href="https://github.com/microsoft-foundry/fine-tuning/blob/main/Demos/Agentic_RFT_PrivatePreview/RFT_Best_Practice.md"&gt;GitHub&lt;/a&gt; vous fera gagner un temps réel de débogage.&lt;/p&gt;
&lt;p&gt;Commencez petit. Dix à cent échantillons. Évaluateur simple. Validez la boucle. Puis montez en charge.&lt;/p&gt;</content:encoded></item><item><title>Vos expériences IA sur Azure brûlent de l'argent — Voici comment y remédier</title><link>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/cloud-cost-optimization-ai-workloads-azure/</link><pubDate>Sat, 18 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/cloud-cost-optimization-ai-workloads-azure/</guid><description>Les charges de travail IA sur Azure peuvent vite devenir coûteuses. Parlons de ce qui fonctionne vraiment pour garder les coûts sous contrôle sans ralentir votre développement.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Cet article a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/cloud-cost-optimization-ai-workloads-azure/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Si vous construisez des applications alimentées par l&amp;rsquo;IA sur Azure en ce moment, vous avez probablement remarqué quelque chose : votre facture cloud a changé. Pas juste plus élevée — plus bizarre. Avec des pics. Difficile à prévoir.&lt;/p&gt;
&lt;p&gt;Microsoft vient de publier un excellent article sur &lt;a href="https://azure.microsoft.com/en-us/blog/cloud-cost-optimization-principles-that-still-matter/"&gt;les principes d&amp;rsquo;optimisation des coûts cloud qui comptent toujours&lt;/a&gt;, et honnêtement, le timing ne pourrait pas être meilleur. Parce que les charges de travail IA ont changé la donne en matière de coûts.&lt;/p&gt;
&lt;h2 id="pourquoi-les-charges-de-travail-ia-frappent-différemment"&gt;Pourquoi les charges de travail IA frappent différemment&lt;/h2&gt;
&lt;p&gt;Voilà le truc. Les charges de travail .NET traditionnelles sont relativement prévisibles. Vous connaissez votre niveau App Service, vous connaissez vos DTUs SQL, vous pouvez estimer les dépenses mensuelles assez précisément. Les charges de travail IA ? Pas vraiment.&lt;/p&gt;
&lt;p&gt;Vous testez plusieurs modèles pour voir lequel convient. Vous démarrez de l&amp;rsquo;infrastructure GPU pour du fine-tuning. Vous faites des appels API à Azure OpenAI où la consommation de tokens varie énormément selon la longueur du prompt et le comportement des utilisateurs. Chaque expérience coûte de l&amp;rsquo;argent réel, et vous pourriez en mener des dizaines avant de trouver la bonne approche.&lt;/p&gt;
&lt;p&gt;Cette imprévisibilité est ce qui rend l&amp;rsquo;optimisation des coûts critique — pas comme une réflexion après coup, mais dès le premier jour.&lt;/p&gt;
&lt;h2 id="gestion-vs-optimisation--connaissez-la-différence"&gt;Gestion vs. optimisation — connaissez la différence&lt;/h2&gt;
&lt;p&gt;Une distinction de l&amp;rsquo;article que les développeurs négligent selon moi : il y a une différence entre la &lt;em&gt;gestion&lt;/em&gt; des coûts et l&amp;rsquo;&lt;em&gt;optimisation&lt;/em&gt; des coûts.&lt;/p&gt;
&lt;p&gt;La gestion, c&amp;rsquo;est le suivi et le reporting. Vous configurez des budgets dans Azure Cost Management, vous recevez des alertes, vous consultez des tableaux de bord. C&amp;rsquo;est le minimum.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;optimisation, c&amp;rsquo;est là que vous prenez réellement des décisions. Avez-vous vraiment besoin de ce tier S3, ou le S1 gérerait-il votre charge ? Cette instance de calcul toujours allumée est-elle inactive le week-end ? Pourriez-vous utiliser des instances spot pour vos jobs d&amp;rsquo;entraînement ?&lt;/p&gt;
&lt;p&gt;En tant que développeurs .NET, nous avons tendance à nous concentrer sur le code et à laisser les décisions d&amp;rsquo;infrastructure à « l&amp;rsquo;équipe ops ». Mais si vous déployez sur Azure, ces décisions sont aussi les vôtres.&lt;/p&gt;
&lt;h2 id="ce-qui-fonctionne-vraiment"&gt;Ce qui fonctionne vraiment&lt;/h2&gt;
&lt;p&gt;En me basant sur l&amp;rsquo;article et ma propre expérience, voici ce qui fait la différence :&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sachez ce que vous dépensez et où.&lt;/strong&gt; Taguez vos ressources. Sérieusement. Si vous ne pouvez pas identifier quel projet ou expérience mange votre budget, vous ne pouvez rien optimiser. Azure Cost Management avec un tagging approprié est votre meilleur allié.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mettez des garde-fous avant d&amp;rsquo;expérimenter.&lt;/strong&gt; Utilisez Azure Policy pour restreindre les SKUs coûteux dans les environnements dev/test. Définissez des limites de dépenses sur vos déploiements Azure OpenAI. N&amp;rsquo;attendez pas que la facture arrive pour réaliser que quelqu&amp;rsquo;un a laissé un cluster GPU tourner tout le week-end.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dimensionnez en continu.&lt;/strong&gt; Cette VM que vous avez choisie pendant le prototypage ? Elle est probablement inadaptée pour la production. Azure Advisor vous donne des recommandations — regardez-les vraiment. Faites une revue mensuelle, pas annuelle.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pensez au cycle de vie.&lt;/strong&gt; Les ressources de développement devraient s&amp;rsquo;éteindre. Les environnements de test n&amp;rsquo;ont pas besoin de tourner 24h/24. Utilisez des politiques d&amp;rsquo;arrêt automatique. Pour les charges de travail IA spécifiquement, envisagez des options serverless où vous payez par exécution au lieu de maintenir du calcul actif.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mesurez la valeur, pas seulement le coût.&lt;/strong&gt; Celle-ci est facile à oublier. Un modèle qui coûte plus cher mais fournit des résultats nettement meilleurs pourrait être le bon choix. L&amp;rsquo;objectif n&amp;rsquo;est pas de dépenser le moins possible — c&amp;rsquo;est de dépenser intelligemment.&lt;/p&gt;
&lt;h2 id="ce-quil-faut-retenir"&gt;Ce qu&amp;rsquo;il faut retenir&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;optimisation des coûts cloud n&amp;rsquo;est pas un nettoyage ponctuel. C&amp;rsquo;est une habitude. Et avec les charges de travail IA qui rendent les dépenses plus imprévisibles que jamais, prendre cette habitude tôt vous épargne des surprises douloureuses par la suite.&lt;/p&gt;
&lt;p&gt;Si vous êtes un développeur .NET qui construit sur Azure, commencez à traiter votre facture cloud comme vous traitez votre code — révisez-la régulièrement, refactorisez quand ça devient désordonné, et ne déployez jamais sans comprendre ce que ça va vous coûter.&lt;/p&gt;</content:encoded></item><item><title>Arrêtez de surveiller votre terminal : le mode détaché d'Aspire change la donne</title><link>https://thedotnetblog.com/fr/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/fr/posts/emiliano-montesdeoca/aspire-detached-mode-free-your-terminal/</guid><description>Aspire 13.2 vous permet d'exécuter votre AppHost en arrière-plan et de récupérer votre terminal. Combiné aux nouvelles commandes CLI et au support des agents, c'est plus important qu'il n'y paraît.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Cet article a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/aspire-detached-mode-free-your-terminal/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;À chaque fois que vous lancez un AppHost Aspire, votre terminal disparaît. Verrouillé. Occupé jusqu&amp;rsquo;à ce que vous fassiez Ctrl+C. Besoin d&amp;rsquo;exécuter une commande rapide ? Ouvrez un autre onglet. Envie de vérifier les logs ? Encore un onglet. C&amp;rsquo;est une petite friction qui s&amp;rsquo;accumule vite.&lt;/p&gt;
&lt;p&gt;Aspire 13.2 corrige ça. James Newton-King &lt;a href="https://devblogs.microsoft.com/aspire/aspire-detached-mode-and-process-management/"&gt;a détaillé tout ça&lt;/a&gt;, et honnêtement, c&amp;rsquo;est une de ces fonctionnalités qui change immédiatement votre façon de travailler.&lt;/p&gt;
&lt;h2 id="mode-détaché--une-commande-terminal-récupéré"&gt;Mode détaché : une commande, terminal récupéré&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;C&amp;rsquo;est le raccourci pour &lt;code&gt;aspire run --detach&lt;/code&gt;. Votre AppHost démarre en arrière-plan et vous récupérez votre terminal immédiatement. Pas d&amp;rsquo;onglets supplémentaires. Pas de multiplexeur de terminal. Juste votre prompt, prêt à l&amp;rsquo;emploi.&lt;/p&gt;
&lt;h2 id="gérer-ce-qui-tourne"&gt;Gérer ce qui tourne&lt;/h2&gt;
&lt;p&gt;Le truc, c&amp;rsquo;est que tourner en arrière-plan n&amp;rsquo;est utile que si on peut gérer ce qui s&amp;rsquo;y passe. Aspire 13.2 fournit un ensemble complet de commandes CLI pour exactement ça :&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;Ça transforme le CLI d&amp;rsquo;Aspire en un véritable gestionnaire de processus. Vous pouvez démarrer plusieurs AppHosts, vérifier leur statut, suivre leurs logs et les arrêter — le tout depuis une seule session de terminal.&lt;/p&gt;
&lt;h2 id="combinez-le-avec-le-mode-isolé"&gt;Combinez-le avec le mode isolé&lt;/h2&gt;
&lt;p&gt;Le mode détaché se marie naturellement avec le mode isolé. Vous voulez lancer deux instances du même projet en arrière-plan sans conflits 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;Chacune obtient des ports aléatoires, des secrets séparés et son propre cycle de vie. Utilisez &lt;code&gt;aspire ps&lt;/code&gt; pour voir les deux, &lt;code&gt;aspire stop&lt;/code&gt; pour arrêter celle dont vous n&amp;rsquo;avez plus besoin.&lt;/p&gt;
&lt;h2 id="pourquoi-cest-énorme-pour-les-agents-de-code"&gt;Pourquoi c&amp;rsquo;est énorme pour les agents de code&lt;/h2&gt;
&lt;p&gt;C&amp;rsquo;est là que ça devient vraiment intéressant. Un agent de code travaillant dans votre terminal peut maintenant :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Démarrer l&amp;rsquo;app avec &lt;code&gt;aspire start&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Interroger son état avec &lt;code&gt;aspire describe&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Vérifier les logs avec &lt;code&gt;aspire logs&lt;/code&gt; pour diagnostiquer les problèmes&lt;/li&gt;
&lt;li&gt;L&amp;rsquo;arrêter avec &lt;code&gt;aspire stop&lt;/code&gt; quand il a terminé&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Tout ça sans perdre la session de terminal. Avant le mode détaché, un agent qui lançait votre AppHost se retrouvait bloqué dans son propre terminal. Maintenant il peut démarrer, observer, itérer et nettoyer — exactement comme on voudrait qu&amp;rsquo;un agent autonome fonctionne.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;équipe Aspire a misé là-dessus. Lancer &lt;code&gt;aspire agent init&lt;/code&gt; met en place un fichier de compétences Aspire qui enseigne ces commandes aux agents. Ainsi, des outils comme l&amp;rsquo;agent de code de Copilot peuvent gérer vos workloads Aspire directement.&lt;/p&gt;
&lt;h2 id="pour-conclure"&gt;Pour conclure&lt;/h2&gt;
&lt;p&gt;Le mode détaché est une amélioration du workflow déguisée en simple flag. Vous arrêtez de jongler entre les terminaux, les agents ne se bloquent plus eux-mêmes, et les nouvelles commandes CLI vous donnent une vraie visibilité sur ce qui tourne. C&amp;rsquo;est pratique, c&amp;rsquo;est propre, et ça rend le cycle de développement quotidien nettement plus fluide.&lt;/p&gt;
&lt;p&gt;Lisez le &lt;a href="https://devblogs.microsoft.com/aspire/aspire-detached-mode-and-process-management/"&gt;post complet&lt;/a&gt; pour tous les détails et récupérez Aspire 13.2 avec &lt;code&gt;aspire update --self&lt;/code&gt;.&lt;/p&gt;</content:encoded></item><item><title>Docker Sandbox permet aux agents Copilot de refactoriser votre code sans risque pour votre machine</title><link>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/copilot-docker-sandbox-agentic-refactoring/</link><pubDate>Fri, 17 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/copilot-docker-sandbox-agentic-refactoring/</guid><description>Docker Sandbox offre aux agents GitHub Copilot une microVM sécurisée pour refactoriser librement — sans demandes de permission, sans risque pour votre hôte. Voici pourquoi ça change tout pour la modernisation .NET à grande échelle.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Cet article a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/copilot-docker-sandbox-agentic-refactoring/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Si vous avez utilisé le mode agent de Copilot pour autre chose que de petites modifications, vous connaissez la douleur. Chaque écriture de fichier, chaque commande terminal — encore une demande de permission. Maintenant, imaginez ça sur 50 projets. Pas vraiment fun.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;équipe Azure vient de publier un article sur &lt;a href="https://devblogs.microsoft.com/all-things-azure/best-of-both-worlds-for-agentic-refactoring-github-copilot-microvms-via-docker-sandbox/"&gt;Docker Sandbox pour les agents GitHub Copilot&lt;/a&gt;, et honnêtement, c&amp;rsquo;est l&amp;rsquo;une des améliorations les plus pratiques que j&amp;rsquo;ai vues dans l&amp;rsquo;outillage agentique. Le système utilise des microVMs pour donner à Copilot un environnement totalement isolé où il peut faire ce qu&amp;rsquo;il veut — installer des paquets, lancer des builds, exécuter des tests — sans toucher à votre système hôte.&lt;/p&gt;
&lt;h2 id="ce-que-docker-sandbox-vous-apporte-concrètement"&gt;Ce que Docker Sandbox vous apporte concrètement&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;idée de base est simple : démarrer une microVM légère avec un environnement Linux complet, synchroniser votre workspace dedans, et laisser l&amp;rsquo;agent Copilot opérer librement à l&amp;rsquo;intérieur. Quand il a terminé, les modifications sont synchronisées en retour.&lt;/p&gt;
&lt;p&gt;Voici ce qui en fait plus qu&amp;rsquo;un simple &amp;ldquo;exécuter des trucs dans un conteneur&amp;rdquo; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Synchronisation bidirectionnelle du workspace&lt;/strong&gt; qui préserve les chemins absolus. La structure de votre projet est identique à l&amp;rsquo;intérieur du sandbox. Pas d&amp;rsquo;échecs de build liés aux chemins.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Docker daemon privé&lt;/strong&gt; tournant à l&amp;rsquo;intérieur de la microVM. L&amp;rsquo;agent peut construire et exécuter des conteneurs sans jamais monter le socket Docker de votre hôte. C&amp;rsquo;est un gros plus pour la sécurité.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Proxies de filtrage HTTP/HTTPS&lt;/strong&gt; qui contrôlent ce que l&amp;rsquo;agent peut atteindre sur le réseau. Vous décidez quels registries et endpoints sont autorisés. Des attaques de supply chain via un &lt;code&gt;npm install&lt;/code&gt; malveillant dans le sandbox ? Bloquées.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mode YOLO&lt;/strong&gt; — oui, c&amp;rsquo;est vraiment comme ça qu&amp;rsquo;ils l&amp;rsquo;appellent. L&amp;rsquo;agent tourne sans demandes de permission parce qu&amp;rsquo;il ne peut littéralement pas endommager votre hôte. Toute action destructrice est contenue.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="pourquoi-les-développeurs-net-devraient-sy-intéresser"&gt;Pourquoi les développeurs .NET devraient s&amp;rsquo;y intéresser&lt;/h2&gt;
&lt;p&gt;Pensez au travail de modernisation auquel tant d&amp;rsquo;équipes font face en ce moment. Vous avez une solution .NET Framework avec 30 projets, et vous devez la migrer vers .NET 9. Ce sont des centaines de modifications de fichiers — fichiers de projet, mises à jour de namespaces, remplacements d&amp;rsquo;API, migrations NuGet.&lt;/p&gt;
&lt;p&gt;Avec Docker Sandbox, vous pouvez pointer un agent Copilot sur un projet, le laisser refactoriser librement dans la microVM, exécuter &lt;code&gt;dotnet build&lt;/code&gt; et &lt;code&gt;dotnet test&lt;/code&gt; pour valider, et n&amp;rsquo;accepter que les changements qui fonctionnent réellement. Aucun risque qu&amp;rsquo;il détruise accidentellement votre environnement de développement local en expérimentant.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;article décrit également l&amp;rsquo;exécution d&amp;rsquo;une &lt;strong&gt;flotte d&amp;rsquo;agents en parallèle&lt;/strong&gt; — chacun dans son propre sandbox — s&amp;rsquo;attaquant à différents projets simultanément. Pour les grandes solutions .NET ou les architectures microservices, c&amp;rsquo;est un gain de temps massif. Un agent par service, tous isolés, tous validés indépendamment.&lt;/p&gt;
&lt;h2 id="langle-sécurité-compte"&gt;L&amp;rsquo;angle sécurité compte&lt;/h2&gt;
&lt;p&gt;Voici ce que la plupart des gens ignorent : quand vous laissez un agent IA exécuter des commandes arbitraires, vous lui confiez l&amp;rsquo;intégralité de votre machine. Docker Sandbox inverse ce modèle. L&amp;rsquo;agent obtient une autonomie totale dans un environnement jetable. Le proxy réseau garantit qu&amp;rsquo;il ne peut télécharger que depuis des sources approuvées. Votre système de fichiers hôte, votre Docker daemon et vos identifiants restent intacts.&lt;/p&gt;
&lt;p&gt;Pour les équipes avec des exigences de conformité — et c&amp;rsquo;est le cas de la plupart des entreprises .NET — c&amp;rsquo;est la différence entre &amp;ldquo;on ne peut pas utiliser l&amp;rsquo;IA agentique&amp;rdquo; et &amp;ldquo;on peut l&amp;rsquo;adopter en toute sécurité.&amp;rdquo;&lt;/p&gt;
&lt;h2 id="à-retenir"&gt;À retenir&lt;/h2&gt;
&lt;p&gt;Docker Sandbox résout la tension fondamentale du coding agentique : les agents ont besoin de liberté pour être utiles, mais la liberté sur votre machine hôte est dangereuse. Les microVMs vous offrent les deux. Si vous planifiez un refactoring ou une modernisation .NET à grande échelle, ça vaut le coup de le mettre en place maintenant. La combinaison de l&amp;rsquo;intelligence de code de Copilot avec un environnement d&amp;rsquo;exécution sécurisé est exactement ce que les équipes de production attendaient.&lt;/p&gt;</content:encoded></item><item><title>Le clustering de pins arrive enfin dans .NET MAUI Maps — Une propriété, zéro prise de tête</title><link>https://thedotnetblog.com/fr/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/fr/posts/emiliano-montesdeoca/maui-maps-pin-clustering-finally/</guid><description>.NET MAUI 11 Preview 3 ajoute le clustering natif de pins au contrôle Map. Une propriété, des groupes de clustering séparés et la gestion des taps — tout est intégré.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Cet article a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/maui-maps-pin-clustering-finally/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Tu connais ce moment où tu charges une carte avec une centaine de pins et tout se transforme en une tache illisible ? Ouais, c&amp;rsquo;était ça l&amp;rsquo;expérience .NET MAUI Maps jusqu&amp;rsquo;à maintenant. C&amp;rsquo;est terminé.&lt;/p&gt;
&lt;p&gt;David Ortinau &lt;a href="https://devblogs.microsoft.com/dotnet/pin-clustering-in-dotnet-maui-maps/"&gt;vient d&amp;rsquo;annoncer&lt;/a&gt; que .NET MAUI 11 Preview 3 embarque le clustering de pins nativement sur Android et iOS/Mac Catalyst. Et le meilleur — c&amp;rsquo;est ridiculement simple à activer.&lt;/p&gt;
&lt;h2 id="une-propriété-pour-les-gouverner-tous"&gt;Une propriété pour les gouverner tous&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;C&amp;rsquo;est tout. Les pins proches sont regroupés en clusters avec un badge de comptage. Zoom avant, ils s&amp;rsquo;expandent. Zoom arrière, ils se regroupent. Le genre de comportement que les utilisateurs attendent de n&amp;rsquo;importe quelle carte moderne — et maintenant tu l&amp;rsquo;obtiens avec une seule propriété.&lt;/p&gt;
&lt;h2 id="groupes-de-clustering-indépendants"&gt;Groupes de clustering indépendants&lt;/h2&gt;
&lt;p&gt;C&amp;rsquo;est là que ça devient intéressant. Tous les pins ne devraient pas se regrouper ensemble. Les cafés et les parcs sont des choses différentes, et ta carte devrait le savoir.&lt;/p&gt;
&lt;p&gt;La propriété &lt;code&gt;ClusteringIdentifier&lt;/code&gt; te permet de séparer les pins en groupes indépendants :&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;Les pins avec le même identifiant se regroupent ensemble. Des identifiants différents forment des clusters indépendants même quand ils sont géographiquement proches. Pas d&amp;rsquo;identifiant ? Groupe par défaut. Propre et prévisible.&lt;/p&gt;
&lt;h2 id="gestion-des-taps-sur-les-clusters"&gt;Gestion des taps sur les clusters&lt;/h2&gt;
&lt;p&gt;Quand un utilisateur tape sur un cluster, tu reçois un événement &lt;code&gt;ClusterClicked&lt;/code&gt; avec tout ce dont tu as besoin :&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;Les arguments de l&amp;rsquo;événement te donnent &lt;code&gt;Pins&lt;/code&gt; (les pins du cluster), &lt;code&gt;Location&lt;/code&gt; (le centre géographique) et &lt;code&gt;Handled&lt;/code&gt; (à mettre sur &lt;code&gt;true&lt;/code&gt; si tu veux surcharger le zoom par défaut). Simple, pratique, exactement ce qu&amp;rsquo;on attend.&lt;/p&gt;
&lt;h2 id="détails-de-plateforme-à-connaître"&gt;Détails de plateforme à connaître&lt;/h2&gt;
&lt;p&gt;Sur Android, le clustering utilise un algorithme personnalisé basé sur une grille qui recalcule lors des changements de zoom — aucune dépendance externe. Sur iOS et Mac Catalyst, il exploite le support natif de &lt;code&gt;MKClusterAnnotation&lt;/code&gt; de MapKit, ce qui signifie des animations fluides et natives de la plateforme.&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est un de ces cas où l&amp;rsquo;équipe MAUI a fait le bon choix — s&amp;rsquo;appuyer sur la plateforme là où ça a du sens.&lt;/p&gt;
&lt;h2 id="pourquoi-cest-important"&gt;Pourquoi c&amp;rsquo;est important&lt;/h2&gt;
&lt;p&gt;Le clustering de pins a été l&amp;rsquo;une des fonctionnalités les plus demandées dans .NET MAUI (&lt;a href="https://github.com/dotnet/maui/issues/11811"&gt;issue #11811&lt;/a&gt;), et pour une bonne raison. Chaque app qui affiche des emplacements sur une carte — suivi de livraisons, localisateurs de magasins, immobilier — en a besoin. Avant, il fallait le construire soi-même ou intégrer une bibliothèque tierce. Maintenant c&amp;rsquo;est intégré.&lt;/p&gt;
&lt;p&gt;Pour nous développeurs .NET qui construisons des apps mobiles multiplateformes, c&amp;rsquo;est exactement le type d&amp;rsquo;amélioration de qualité de vie qui fait de MAUI un choix véritablement pratique pour les scénarios lourds en cartes.&lt;/p&gt;
&lt;h2 id="pour-commencer"&gt;Pour commencer&lt;/h2&gt;
&lt;p&gt;Installe &lt;a href="https://dotnet.microsoft.com/download/dotnet/11.0"&gt;.NET 11 Preview 3&lt;/a&gt; et mets à jour le workload .NET MAUI. L&amp;rsquo;&lt;a href="https://github.com/dotnet/maui-samples/tree/main/10.0/UserInterface/Views/Map/MapDemo/WorkingWithMaps"&gt;exemple Maps&lt;/a&gt; inclut une nouvelle page Clustering avec laquelle tu peux jouer tout de suite.&lt;/p&gt;
&lt;p&gt;Va construire quelque chose avec — et laisse tes cartes enfin respirer.&lt;/p&gt;</content:encoded></item><item><title>Les outils Azure MCP sont désormais intégrés dans Visual Studio 2022 — Aucune extension nécessaire</title><link>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/azure-mcp-tools-built-into-visual-studio-2022/</link><pubDate>Thu, 16 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/azure-mcp-tools-built-into-visual-studio-2022/</guid><description>Les outils Azure MCP sont livrés avec la charge de travail développement Azure dans Visual Studio 2022. Plus de 230 outils, 45 services Azure, zéro extension à installer.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Cet article a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/azure-mcp-tools-built-into-visual-studio-2022/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Si vous avez utilisé les outils Azure MCP dans Visual Studio via l&amp;rsquo;extension séparée, vous connaissez la chanson — installer le VSIX, redémarrer, espérer que rien ne casse, gérer les incompatibilités de versions. Cette friction, c&amp;rsquo;est terminé.&lt;/p&gt;
&lt;p&gt;Yun Jung Choi a &lt;a href="https://devblogs.microsoft.com/visualstudio/azure-mcp-tools-now-ship-built-into-visual-studio-2022-no-extension-required/"&gt;annoncé&lt;/a&gt; que les outils Azure MCP sont désormais livrés directement avec la charge de travail développement Azure dans Visual Studio 2022. Pas d&amp;rsquo;extension. Pas de VSIX. Pas de danse du redémarrage.&lt;/p&gt;
&lt;h2 id="ce-que-ça-signifie-concrètement"&gt;Ce que ça signifie concrètement&lt;/h2&gt;
&lt;p&gt;À partir de Visual Studio 2022 version 17.14.30, le Azure MCP Server est inclus dans la charge de travail développement Azure. Si vous avez déjà cette charge de travail installée, il suffit de l&amp;rsquo;activer dans GitHub Copilot Chat et c&amp;rsquo;est parti.&lt;/p&gt;
&lt;p&gt;Plus de 230 outils couvrant 45 services Azure — accessibles directement depuis la fenêtre de chat. Listez vos comptes de stockage, déployez une app ASP.NET Core, diagnostiquez des problèmes App Service, interrogez Log Analytics — le tout sans ouvrir un onglet de navigateur.&lt;/p&gt;
&lt;h2 id="pourquoi-cest-plus-important-quil-ny-paraît"&gt;Pourquoi c&amp;rsquo;est plus important qu&amp;rsquo;il n&amp;rsquo;y paraît&lt;/h2&gt;
&lt;p&gt;Voici le truc avec l&amp;rsquo;outillage développeur : chaque étape supplémentaire est de la friction, et la friction tue l&amp;rsquo;adoption. Avoir MCP en tant qu&amp;rsquo;extension séparée signifiait des incompatibilités de versions, des échecs d&amp;rsquo;installation, et une chose de plus à maintenir à jour. L&amp;rsquo;intégrer dans la charge de travail signifie :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Un seul chemin de mise à jour&lt;/strong&gt; via le Visual Studio Installer&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pas de décalage de version&lt;/strong&gt; entre l&amp;rsquo;extension et l&amp;rsquo;IDE&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Toujours à jour&lt;/strong&gt; — le MCP Server se met à jour avec les releases régulières de VS&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pour les équipes qui standardisent sur Azure, c&amp;rsquo;est un vrai gain. Vous installez la charge de travail une fois, activez les outils, et ils sont disponibles à chaque session.&lt;/p&gt;
&lt;h2 id="ce-que-vous-pouvez-faire-avec"&gt;Ce que vous pouvez faire avec&lt;/h2&gt;
&lt;p&gt;Les outils couvrent l&amp;rsquo;intégralité du cycle de développement via Copilot Chat :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Apprendre&lt;/strong&gt; — posez des questions sur les services Azure, les bonnes pratiques, les patterns d&amp;rsquo;architecture&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Concevoir et développer&lt;/strong&gt; — obtenez des recommandations de services, configurez le code de votre application&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Déployer&lt;/strong&gt; — provisionnez des ressources et déployez directement depuis l&amp;rsquo;IDE&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dépanner&lt;/strong&gt; — interrogez les logs, vérifiez l&amp;rsquo;état des ressources, diagnostiquez les problèmes en production&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Un exemple rapide — tapez ceci dans Copilot Chat :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;List my storage accounts in my current subscription.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Copilot appelle les outils Azure MCP en coulisses, interroge vos abonnements, et renvoie une liste formatée avec les noms, emplacements et SKUs. Pas besoin du portail.&lt;/p&gt;
&lt;h2 id="comment-lactiver"&gt;Comment l&amp;rsquo;activer&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Mettez à jour vers Visual Studio 2022 &lt;strong&gt;17.14.30&lt;/strong&gt; ou supérieur&lt;/li&gt;
&lt;li&gt;Assurez-vous que la charge de travail &lt;strong&gt;Azure development&lt;/strong&gt; est installée&lt;/li&gt;
&lt;li&gt;Ouvrez GitHub Copilot Chat&lt;/li&gt;
&lt;li&gt;Cliquez sur le bouton &lt;strong&gt;Select tools&lt;/strong&gt; (l&amp;rsquo;icône des deux clés)&lt;/li&gt;
&lt;li&gt;Activez &lt;strong&gt;Azure MCP Server&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;C&amp;rsquo;est tout. Ça reste activé entre les sessions.&lt;/p&gt;
&lt;h2 id="un-bémol"&gt;Un bémol&lt;/h2&gt;
&lt;p&gt;Les outils sont désactivés par défaut — vous devez les activer manuellement. Et les outils spécifiques à VS 2026 ne sont pas disponibles dans VS 2022. La disponibilité des outils dépend également des permissions de votre abonnement Azure, comme sur le portail.&lt;/p&gt;
&lt;h2 id="la-vue-densemble"&gt;La vue d&amp;rsquo;ensemble&lt;/h2&gt;
&lt;p&gt;Cela fait partie d&amp;rsquo;une tendance claire : MCP est en train de devenir le standard pour exposer les outils cloud dans les IDEs de développement. Nous avons déjà vu la &lt;a href="https://devblogs.microsoft.com/azure-sdk/announcing-azure-mcp-server-2-0-stable-release/"&gt;release stable d&amp;rsquo;Azure MCP Server 2.0&lt;/a&gt; et des intégrations MCP dans VS Code et d&amp;rsquo;autres éditeurs. L&amp;rsquo;intégrer dans le système de charges de travail de Visual Studio est la progression naturelle.&lt;/p&gt;
&lt;p&gt;Pour nous développeurs .NET qui vivons dans Visual Studio, ça élimine encore une raison de basculer vers le portail Azure. Et honnêtement, moins on change d&amp;rsquo;onglet, mieux c&amp;rsquo;est.&lt;/p&gt;</content:encoded></item><item><title>.NET Avril 2026 Servicing — Les correctifs de sécurité à appliquer dès aujourd'hui</title><link>https://thedotnetblog.com/fr/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/fr/posts/emiliano-montesdeoca/dotnet-april-2026-servicing-security-patches/</guid><description>La mise à jour de maintenance d'avril 2026 corrige 6 CVEs dans .NET 10, .NET 9, .NET 8 et .NET Framework — dont deux vulnérabilités d'exécution de code à distance.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Cet article a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/dotnet-april-2026-servicing-security-patches/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Les &lt;a href="https://devblogs.microsoft.com/dotnet/dotnet-and-dotnet-framework-april-2026-servicing-updates/"&gt;mises à jour de maintenance d&amp;rsquo;avril 2026&lt;/a&gt; pour .NET et .NET Framework sont disponibles, et celle-ci inclut des correctifs de sécurité que vous allez vouloir appliquer rapidement. Six CVEs corrigés, dont deux vulnérabilités d&amp;rsquo;exécution de code à distance (RCE).&lt;/p&gt;
&lt;h2 id="ce-qui-a-été-corrigé"&gt;Ce qui a été corrigé&lt;/h2&gt;
&lt;p&gt;Voici le résumé rapide :&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;CVE&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Affecte&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;Contournement de fonctionnalité de sécurité&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;Exécution de code à distance&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;Exécution de code à distance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;.NET 10, 9, 8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVE-2026-32203&lt;/td&gt;
&lt;td&gt;Déni de service&lt;/td&gt;
&lt;td&gt;.NET 10, 9, 8 + .NET Framework&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVE-2026-23666&lt;/td&gt;
&lt;td&gt;Déni de service&lt;/td&gt;
&lt;td&gt;.NET Framework 3.0–4.8.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVE-2026-32226&lt;/td&gt;
&lt;td&gt;Déni de service&lt;/td&gt;
&lt;td&gt;.NET Framework 2.0–4.8.1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Les deux CVEs RCE (CVE-2026-32178 et CVE-2026-33116) affectent le plus large éventail de versions .NET et devraient être la priorité.&lt;/p&gt;
&lt;h2 id="versions-mises-à-jour"&gt;Versions mises à jour&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;Toutes sont disponibles via les canaux habituels — &lt;a href="https://dotnet.microsoft.com/download/dotnet/10.0"&gt;dotnet.microsoft.com&lt;/a&gt;, images de conteneurs sur MCR et gestionnaires de paquets Linux.&lt;/p&gt;
&lt;h2 id="que-faire"&gt;Que faire&lt;/h2&gt;
&lt;p&gt;Mettez à jour vos projets et vos pipelines CI/CD vers les dernières versions corrigées. Si vous utilisez des conteneurs, récupérez les dernières images. Si vous êtes sur .NET Framework, consultez les &lt;a href="https://learn.microsoft.com/dotnet/framework/release-notes/release-notes"&gt;notes de version .NET Framework&lt;/a&gt; pour les correctifs correspondants.&lt;/p&gt;
&lt;p&gt;Pour ceux qui font tourner .NET 10 en production (c&amp;rsquo;est la version actuelle), 10.0.6 est une mise à jour obligatoire. Idem pour .NET 9.0.15 et .NET 8.0.26 si vous êtes sur ces versions LTS. Deux vulnérabilités RCE, ce n&amp;rsquo;est pas quelque chose qu&amp;rsquo;on reporte.&lt;/p&gt;</content:encoded></item><item><title>Aspire 13.2 accueille MongoDB EF Core et Azure Data Lake — Deux intégrations à essayer</title><link>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/aspire-132-mongodb-efcore-data-lake/</link><pubDate>Wed, 15 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/aspire-132-mongodb-efcore-data-lake/</guid><description>Aspire 13.2 ajoute les intégrations MongoDB Entity Framework Core et Azure Data Lake Storage avec des health checks et du service discovery sans configuration. Voici à quoi elles ressemblent en pratique.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Cet article a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/aspire-132-mongodb-efcore-data-lake/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Aspire 13.2 vient d&amp;rsquo;arriver avec &lt;a href="https://devblogs.microsoft.com/aspire/aspire-new-database-integrations/"&gt;deux nouvelles intégrations de bases de données&lt;/a&gt; qui méritent votre attention : MongoDB Entity Framework Core et Azure Data Lake Storage. Si vous vouliez utiliser EF Core avec MongoDB dans une app Aspire, ou si vous aviez besoin de connecter des workloads data lake avec du service discovery, cette version apporte les deux.&lt;/p&gt;
&lt;h2 id="mongodb-rencontre-ef-core-dans-aspire"&gt;MongoDB rencontre EF Core dans Aspire&lt;/h2&gt;
&lt;p&gt;C&amp;rsquo;est celle qui m&amp;rsquo;enthousiasme le plus. Aspire supporte MongoDB depuis un moment, mais c&amp;rsquo;était toujours le driver brut — pas d&amp;rsquo;EF Core, pas de &lt;code&gt;DbContext&lt;/code&gt;, pas de requêtes LINQ sur vos documents. Maintenant vous avez l&amp;rsquo;expérience complète d&amp;rsquo;EF Core avec MongoDB, plus les health checks automatiques et le service discovery d&amp;rsquo;Aspire.&lt;/p&gt;
&lt;p&gt;La mise en place suit le pattern typique d&amp;rsquo;Aspire. Dans votre AppHost :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;mongodb&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddMongoDB&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;mongodb&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithDataVolume&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithLifetime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ContainerLifetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Persistent&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;apiService&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddProject&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Projects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ApiService&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;api&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithReference&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mongodb&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Puis dans votre projet consommateur, ajoutez l&amp;rsquo;intégration EF Core :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dotnet add package Aspire.MongoDB.EntityFrameworkCore
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Et enregistrez votre &lt;code&gt;DbContext&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddMongoDbContext&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;MyDbContext&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;mongodb&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;mydb&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;À partir de là, c&amp;rsquo;est de l&amp;rsquo;EF Core standard. Définissez vos entités, utilisez votre &lt;code&gt;DbContext&lt;/code&gt; comme vous le feriez avec n&amp;rsquo;importe quel autre provider. L&amp;rsquo;intégration gère le connection pooling, les traces OpenTelemetry et les health checks en arrière-plan.&lt;/p&gt;
&lt;p&gt;Pour les développeurs .NET qui utilisaient MongoDB avec le driver brut et configuraient les connection strings manuellement, c&amp;rsquo;est une belle amélioration. Vous obtenez l&amp;rsquo;abstraction complète d&amp;rsquo;EF Core sans perdre le service discovery d&amp;rsquo;Aspire.&lt;/p&gt;
&lt;h2 id="azure-data-lake-storage-entre-dans-la-danse"&gt;Azure Data Lake Storage entre dans la danse&lt;/h2&gt;
&lt;p&gt;Le deuxième ajout majeur est une &lt;a href="https://aspire.dev/integrations/cloud/azure/azure-storage-datalake/"&gt;intégration Azure Data Lake Storage (ADLS)&lt;/a&gt;. Si vous construisez des pipelines de données, des processus ETL ou des plateformes d&amp;rsquo;analytique, vous pouvez maintenant connecter des ressources Data Lake de la même façon que n&amp;rsquo;importe quelle autre dépendance Aspire.&lt;/p&gt;
&lt;p&gt;Dans l&amp;rsquo;AppHost :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;storage&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddAzureStorage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;azure-storage&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;dataLake&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;storage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddDataLake&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;data-lake&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;fileSystem&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;storage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddDataLakeFileSystem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;data-lake-file-system&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;analyticsService&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddProject&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Projects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AnalyticsService&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;analytics&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithReference&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataLake&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithReference&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fileSystem&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Dans le projet consommateur :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddAzureDataLakeServiceClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;data-lake&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddAzureDataLakeFileSystemClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;data-lake-file-system&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pas de gestion manuelle de connection strings, pas de recherche de credentials. Aspire provisionne les ressources et les injecte. Pour ceux d&amp;rsquo;entre nous qui construisent des apps .NET cloud-native touchant à la fois aux données opérationnelles et aux workloads analytiques, cela fait du data lake un citoyen de première classe dans le modèle Aspire.&lt;/p&gt;
&lt;h2 id="les-petits-correctifs-qui-comptent"&gt;Les petits correctifs qui comptent&lt;/h2&gt;
&lt;p&gt;Au-delà des fonctionnalités principales, il y a quelques améliorations à noter :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Correction du connection string MongoDB&lt;/strong&gt; — le slash avant le nom de la base de données est maintenant géré correctement. Si vous aviez un workaround, vous pouvez le supprimer&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Exports SQL Server&lt;/strong&gt; — &lt;code&gt;Aspire.Hosting.SqlServer&lt;/code&gt; exporte maintenant des options de configuration serveur supplémentaires pour un contrôle plus fin&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mises à jour des émulateurs&lt;/strong&gt; — émulateur ServiceBus 2.0.0, émulateur App Configuration 1.0.2, et l&amp;rsquo;émulateur preview de CosmosDB inclut maintenant une vérification de disponibilité&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Azure Managed Redis&lt;/strong&gt; — utilise maintenant &lt;code&gt;rediss://&lt;/code&gt; (Redis Secure) par défaut, donc les connexions sont chiffrées d&amp;rsquo;emblée&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ce dernier point est subtil mais important — un Redis chiffré par défaut signifie une chose de moins à configurer en production.&lt;/p&gt;
&lt;h2 id="pour-conclure"&gt;Pour conclure&lt;/h2&gt;
&lt;p&gt;Aspire 13.2 est une version incrémentale, mais les intégrations MongoDB EF Core et Data Lake comblent de vrais manques. Si vous attendiez un support EF Core correct avec MongoDB dans Aspire, ou si vous aviez besoin que Data Lake soit une dépendance de première classe, &lt;a href="https://get.aspire.dev"&gt;passez à la 13.2&lt;/a&gt; et essayez-les. La commande &lt;code&gt;aspire add&lt;/code&gt; génère tout ce dont vous avez besoin.&lt;/p&gt;
&lt;p&gt;Lisez les &lt;a href="https://aspire.dev/whats-new/aspire-13-2/#-integrations-updates"&gt;notes de version complètes&lt;/a&gt; pour plus de détails, et consultez la &lt;a href="https://aspire.dev/integrations/gallery/"&gt;galerie d&amp;rsquo;intégrations&lt;/a&gt; pour la liste complète.&lt;/p&gt;</content:encoded></item><item><title>azd update — Une seule commande pour tous vos gestionnaires de paquets</title><link>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/azd-update-universal-upgrade-command/</link><pubDate>Wed, 15 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/azd-update-universal-upgrade-command/</guid><description>Azure Developer CLI dispose désormais d'une commande de mise à jour universelle qui fonctionne quelle que soit la méthode d'installation — winget, Homebrew, Chocolatey ou script d'installation.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Cet article a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/azd-update-universal-upgrade-command/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Vous connaissez ce message « Une nouvelle version de azd est disponible » qui apparaît toutes les quelques semaines ? Celui que vous ignorez parce que vous ne vous souvenez plus si vous avez installé &lt;code&gt;azd&lt;/code&gt; via winget, Homebrew ou ce script curl que vous avez exécuté il y a six mois ? Eh bien, c&amp;rsquo;est enfin réglé.&lt;/p&gt;
&lt;p&gt;Microsoft vient de publier &lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-update/"&gt;&lt;code&gt;azd update&lt;/code&gt;&lt;/a&gt; — une seule commande qui met à jour Azure Developer CLI vers la dernière version, quelle que soit la méthode d&amp;rsquo;installation d&amp;rsquo;origine. Windows, macOS, Linux — peu importe. Une seule commande.&lt;/p&gt;
&lt;h2 id="comment-ça-marche"&gt;Comment ça marche&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;azd update
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;C&amp;rsquo;est tout. Si vous voulez un accès anticipé aux nouvelles fonctionnalités, vous pouvez passer au build insiders quotidien :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;azd update --channel daily
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;azd update --channel stable
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;La commande détecte votre méthode d&amp;rsquo;installation actuelle et utilise le mécanisme de mise à jour approprié en arrière-plan. Fini le « attends, j&amp;rsquo;ai utilisé winget ou choco sur cette machine ? »&lt;/p&gt;
&lt;h2 id="le-petit-bémol"&gt;Le petit bémol&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;azd update&lt;/code&gt; est disponible à partir de la version 1.23.x. Si vous êtes sur une version antérieure, vous devrez effectuer une dernière mise à jour manuelle en utilisant votre méthode d&amp;rsquo;installation d&amp;rsquo;origine. Après ça, &lt;code&gt;azd update&lt;/code&gt; gère tout automatiquement.&lt;/p&gt;
&lt;p&gt;Vérifiez votre version actuelle avec &lt;code&gt;azd version&lt;/code&gt;. Si vous avez besoin d&amp;rsquo;une nouvelle installation, la &lt;a href="https://learn.microsoft.com/azure/developer/azure-developer-cli/install-azd"&gt;documentation d&amp;rsquo;installation&lt;/a&gt; est là pour vous.&lt;/p&gt;
&lt;h2 id="pourquoi-cest-important"&gt;Pourquoi c&amp;rsquo;est important&lt;/h2&gt;
&lt;p&gt;C&amp;rsquo;est une petite amélioration de confort, mais pour ceux d&amp;rsquo;entre nous qui utilisent &lt;code&gt;azd&lt;/code&gt; quotidiennement pour déployer des agents IA et des apps Aspire sur Azure, être à jour signifie moins de moments « ce bug était déjà corrigé dans la dernière version ». Une chose de moins à laquelle penser.&lt;/p&gt;
&lt;p&gt;Lisez l&amp;rsquo;&lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-update/"&gt;annonce complète&lt;/a&gt; et l&amp;rsquo;&lt;a href="https://blog.jongallant.com/2026/04/azd-update"&gt;analyse approfondie&lt;/a&gt; de Jon Gallant pour plus de contexte.&lt;/p&gt;</content:encoded></item><item><title>Azure DevOps Server Patch Avril 2026 — Correction du Complétion de PR et Mises à Jour de Sécurité</title><link>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/azure-devops-server-april-2026-patch/</link><pubDate>Wed, 15 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/azure-devops-server-april-2026-patch/</guid><description>Azure DevOps Server reçoit le Patch 3 avec une correction pour les échecs de complétion de PR, une validation améliorée à la déconnexion et la restauration des connexions PAT vers GitHub Enterprise Server.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Cet article a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/azure-devops-server-april-2026-patch/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Petit rappel pour les équipes qui hébergent leur propre Azure DevOps Server : Microsoft a publié le &lt;a href="https://devblogs.microsoft.com/devops/april-patches-for-azure-devops-server/"&gt;Patch 3 d&amp;rsquo;avril 2026&lt;/a&gt; avec trois correctifs ciblés.&lt;/p&gt;
&lt;h2 id="ce-qui-a-été-corrigé"&gt;Ce qui a été corrigé&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Échecs de complétion des pull requests&lt;/strong&gt; — une exception de référence nulle lors de l&amp;rsquo;auto-complétion des work items pouvait faire échouer les merges de PR. Si vous avez rencontré des erreurs aléatoires lors de la complétion de PR, c&amp;rsquo;est probablement la cause&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Validation de la redirection à la déconnexion&lt;/strong&gt; — validation améliorée lors de la déconnexion pour empêcher d&amp;rsquo;éventuelles redirections malveillantes. C&amp;rsquo;est un correctif de sécurité à appliquer rapidement&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Connexions PAT vers GitHub Enterprise Server&lt;/strong&gt; — la création de connexions par Personal Access Token vers GitHub Enterprise Server était cassée, c&amp;rsquo;est maintenant rétabli&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="comment-mettre-à-jour"&gt;Comment mettre à jour&lt;/h2&gt;
&lt;p&gt;Téléchargez le &lt;a href="https://aka.ms/devopsserverpatch3"&gt;Patch 3&lt;/a&gt; et lancez l&amp;rsquo;installateur. Pour vérifier que le patch est bien appliqué :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;patch-installer&amp;gt;.exe CheckInstall
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Si vous utilisez Azure DevOps Server en auto-hébergement, Microsoft recommande vivement de rester sur le dernier patch pour la sécurité comme pour la fiabilité. Consultez les &lt;a href="https://learn.microsoft.com/azure/devops/server/release-notes/azuredevopsserver?view=azure-devops#azure-devops-server-patch-3-release-date-april-14-2026"&gt;notes de version&lt;/a&gt; pour tous les détails.&lt;/p&gt;</content:encoded></item><item><title>Azure Smart Tier est en GA — Optimisation automatique des coûts de Blob Storage sans règles de cycle de vie</title><link>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/azure-smart-tier-blob-storage-ga/</link><pubDate>Wed, 15 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/azure-smart-tier-blob-storage-ga/</guid><description>Le smart tier d'Azure Blob Storage est maintenant en disponibilité générale, déplaçant automatiquement les objets entre les niveaux hot, cool et cold en fonction des patterns d'accès réels — sans règles de cycle de vie.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Cet article a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/azure-smart-tier-blob-storage-ga/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Si vous avez déjà passé du temps à peaufiner les politiques de cycle de vie d&amp;rsquo;Azure Blob Storage pour ensuite les voir s&amp;rsquo;effondrer quand les patterns d&amp;rsquo;accès ont changé, ceci est pour vous. Microsoft vient d&amp;rsquo;annoncer la &lt;a href="https://azure.microsoft.com/en-us/blog/optimize-object-storage-costs-automatically-with-smart-tier-now-generally-available/"&gt;disponibilité générale du smart tier&lt;/a&gt; pour Azure Blob et Data Lake Storage — une capacité de tiering entièrement gérée qui déplace automatiquement les objets entre les niveaux hot, cool et cold en fonction de l&amp;rsquo;utilisation réelle.&lt;/p&gt;
&lt;h2 id="ce-que-fait-réellement-le-smart-tier"&gt;Ce que fait réellement le smart tier&lt;/h2&gt;
&lt;p&gt;Le concept est simple : le smart tier évalue en continu la dernière heure d&amp;rsquo;accès de chaque objet dans votre compte de stockage. Les données fréquemment consultées restent en hot, les données inactives passent en cool après 30 jours, puis en cold après 60 jours supplémentaires. Quand les données sont à nouveau consultées, elles sont repromues en hot immédiatement. Le cycle recommence.&lt;/p&gt;
&lt;p&gt;Pas de règles de cycle de vie à configurer. Pas de prédictions de patterns d&amp;rsquo;accès. Pas de réglages manuels.&lt;/p&gt;
&lt;p&gt;Pendant la preview, Microsoft a rapporté que &lt;strong&gt;plus de 50% de la capacité gérée par smart tier s&amp;rsquo;est automatiquement déplacée vers des niveaux plus froids&lt;/strong&gt; en fonction des patterns d&amp;rsquo;accès réels. C&amp;rsquo;est une réduction de coûts significative pour les comptes de stockage volumineux.&lt;/p&gt;
&lt;h2 id="pourquoi-cest-important-pour-les-développeurs-net"&gt;Pourquoi c&amp;rsquo;est important pour les développeurs .NET&lt;/h2&gt;
&lt;p&gt;Si vous développez des applications qui génèrent des logs, de la télémétrie, des données analytiques, ou tout type de patrimoine de données en croissance — et soyons honnêtes, qui ne le fait pas ? — les coûts de stockage s&amp;rsquo;accumulent vite. L&amp;rsquo;approche traditionnelle consistait à écrire des politiques de gestion de cycle de vie, les tester, puis les réajuster quand les patterns d&amp;rsquo;accès de votre application changeaient. Smart tier supprime entièrement ce workflow.&lt;/p&gt;
&lt;p&gt;Quelques scénarios pratiques où cela aide :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Télémétrie et logs d&amp;rsquo;applications&lt;/strong&gt; — hot lors du débogage, rarement consultés après quelques semaines&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pipelines de données et sorties ETL&lt;/strong&gt; — sollicités intensément pendant le traitement, puis majoritairement cold&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Contenu généré par les utilisateurs&lt;/strong&gt; — les uploads récents sont hot, le contenu ancien refroidit progressivement&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Données de sauvegarde et d&amp;rsquo;archivage&lt;/strong&gt; — consultées occasionnellement pour la conformité, majoritairement inactives&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="configuration"&gt;Configuration&lt;/h2&gt;
&lt;p&gt;Activer le smart tier est une configuration unique :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Nouveaux comptes&lt;/strong&gt; : Sélectionnez smart tier comme niveau d&amp;rsquo;accès par défaut lors de la création du compte de stockage (redondance zonale requise)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Comptes existants&lt;/strong&gt; : Changez le niveau d&amp;rsquo;accès blob de votre valeur par défaut actuelle vers smart tier&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Les objets de moins de 128 KiB restent en hot et n&amp;rsquo;engendrent pas de frais de surveillance. Pour tout le reste, vous payez les tarifs standard de capacité hot/cool/cold sans frais de transition de niveau, sans pénalités de suppression anticipée et sans coûts de récupération de données. Des frais de surveillance mensuels par objet couvrent l&amp;rsquo;orchestration.&lt;/p&gt;
&lt;h2 id="le-compromis-à-connaître"&gt;Le compromis à connaître&lt;/h2&gt;
&lt;p&gt;Les règles de tiering du smart tier sont statiques (30 jours → cool, 90 jours → cold). Si vous avez besoin de seuils personnalisés — par exemple, passer en cool après 7 jours pour un workload spécifique — les règles de cycle de vie restent la solution. Et ne mélangez pas les deux : évitez d&amp;rsquo;utiliser des règles de cycle de vie sur des objets gérés par smart tier, car elles peuvent entrer en conflit.&lt;/p&gt;
&lt;h2 id="pour-conclure"&gt;Pour conclure&lt;/h2&gt;
&lt;p&gt;Ce n&amp;rsquo;est pas révolutionnaire, mais ça résout un vrai casse-tête opérationnel. Si vous gérez des comptes blob storage en croissance et que vous en avez assez de maintenir des politiques de cycle de vie, &lt;a href="https://learn.microsoft.com/en-us/azure/storage/blobs/access-tiers-smart"&gt;activez smart tier&lt;/a&gt; et laissez Azure s&amp;rsquo;en charger. C&amp;rsquo;est disponible dès aujourd&amp;rsquo;hui dans la quasi-totalité des régions zonales du cloud public.&lt;/p&gt;</content:encoded></item><item><title>Où héberger vos agents IA sur Azure ? Un guide de décision pratique</title><link>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/azure-ai-agent-hosting-options-guide/</link><pubDate>Wed, 15 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/azure-ai-agent-hosting-options-guide/</guid><description>Azure propose six façons d'héberger des agents IA — des conteneurs bruts aux Foundry Hosted Agents entièrement gérés. Voici comment choisir la bonne option pour votre charge de travail .NET.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Cet article a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/azure-ai-agent-hosting-options-guide/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Si vous construisez des agents IA avec .NET en ce moment, vous avez probablement remarqué quelque chose : il y a &lt;em&gt;beaucoup&lt;/em&gt; de façons de les héberger sur Azure. Container Apps, AKS, Functions, App Service, Foundry Agents, Foundry Hosted Agents — et tous semblent raisonnables jusqu&amp;rsquo;à ce que vous ayez réellement besoin d&amp;rsquo;en choisir un. Microsoft vient de publier un &lt;a href="https://devblogs.microsoft.com/all-things-azure/hostedagent/"&gt;guide complet sur l&amp;rsquo;hébergement d&amp;rsquo;agents IA sur Azure&lt;/a&gt; qui clarifie tout ça, et je veux le décomposer du point de vue pratique d&amp;rsquo;un développeur .NET.&lt;/p&gt;
&lt;h2 id="les-six-options-en-un-coup-dœil"&gt;Les six options en un coup d&amp;rsquo;œil&lt;/h2&gt;
&lt;p&gt;Voici comment je résumerais le paysage :&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Option&lt;/th&gt;
&lt;th&gt;Idéal pour&lt;/th&gt;
&lt;th&gt;Vous gérez&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Container Apps&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Contrôle total des conteneurs sans complexité K8s&lt;/td&gt;
&lt;td&gt;Observabilité, état, cycle de vie&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AKS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Conformité entreprise, multi-cluster, réseau personnalisé&lt;/td&gt;
&lt;td&gt;Tout (c&amp;rsquo;est le but)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Azure Functions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Tâches d&amp;rsquo;agents événementielles et courtes&lt;/td&gt;
&lt;td&gt;Presque rien — vrai serverless&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;App Service&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Agents HTTP simples, trafic prévisible&lt;/td&gt;
&lt;td&gt;Déploiement, config de scaling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Foundry Agents&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Agents sans code via portail/SDK&lt;/td&gt;
&lt;td&gt;Presque rien&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Foundry Hosted Agents&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Agents framework personnalisé avec infra gérée&lt;/td&gt;
&lt;td&gt;Uniquement votre code d&amp;rsquo;agent&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Les quatre premières sont du compute généraliste — vous &lt;em&gt;pouvez&lt;/em&gt; y exécuter des agents, mais elles n&amp;rsquo;ont pas été conçues pour ça. Les deux dernières sont natives aux agents : elles comprennent les conversations, les appels d&amp;rsquo;outils et les cycles de vie des agents comme des concepts de première classe.&lt;/p&gt;
&lt;h2 id="foundry-hosted-agents--le-sweet-spot-pour-les-développeurs-net-dagents"&gt;Foundry Hosted Agents — le sweet spot pour les développeurs .NET d&amp;rsquo;agents&lt;/h2&gt;
&lt;p&gt;C&amp;rsquo;est ce qui a attiré mon attention. Les Foundry Hosted Agents se situent pile au milieu : vous obtenez la flexibilité d&amp;rsquo;exécuter votre propre code (Semantic Kernel, Agent Framework, LangGraph — peu importe) mais la plateforme gère l&amp;rsquo;infrastructure, l&amp;rsquo;observabilité et la gestion des conversations.&lt;/p&gt;
&lt;p&gt;La pièce clé est le &lt;strong&gt;Hosting Adapter&lt;/strong&gt; — une fine couche d&amp;rsquo;abstraction qui connecte votre framework d&amp;rsquo;agents à la plateforme Foundry. Pour Microsoft Agent Framework, ça ressemble à ça :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;azure.ai.agentserver.agentframework&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;from_agent_framework&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ChatAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;chat_client&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;AzureAIAgentClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;You are a helpful assistant.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;get_local_time&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;__main__&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;from_agent_framework&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;C&amp;rsquo;est toute votre histoire d&amp;rsquo;hébergement. L&amp;rsquo;adapter gère la traduction de protocoles, le streaming via server-sent events, l&amp;rsquo;historique de conversation et le traçage OpenTelemetry — tout automatiquement. Pas de middleware personnalisé, pas de plomberie manuelle.&lt;/p&gt;
&lt;h2 id="le-déploiement-est-vraiment-simple"&gt;Le déploiement est vraiment simple&lt;/h2&gt;
&lt;p&gt;J&amp;rsquo;ai déployé des agents sur Container Apps avant et ça fonctionne, mais on finit par écrire beaucoup de code de colle pour la gestion d&amp;rsquo;état et l&amp;rsquo;observabilité. Avec Hosted Agents et &lt;code&gt;azd&lt;/code&gt;, le déploiement c&amp;rsquo;est :&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;# Installer l&amp;#39;extension agent IA&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;azd ext install azure.ai.agents
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Initialiser depuis un template&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;azd ai agent init
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Construire, pousser, déployer — terminé&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;azd up
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ce seul &lt;code&gt;azd up&lt;/code&gt; construit votre conteneur, le pousse vers ACR, provisionne le projet Foundry, déploie les endpoints de modèle et démarre votre agent. Cinq étapes condensées en une seule commande.&lt;/p&gt;
&lt;h2 id="gestion-de-conversations-intégrée"&gt;Gestion de conversations intégrée&lt;/h2&gt;
&lt;p&gt;C&amp;rsquo;est la partie qui fait gagner le plus de temps en production. Au lieu de construire votre propre store d&amp;rsquo;état de conversation, les Hosted Agents le gèrent nativement :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Créer une conversation persistante&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;conversation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;openai_client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conversations&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Premier tour&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;response1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;openai_client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;responses&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;conversation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;conversation&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;extra_body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;agent_reference&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;MyAgent&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;agent_reference&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Remember: my favorite number is 42.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Deuxième tour — le contexte est préservé&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;response2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;openai_client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;responses&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;conversation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;conversation&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;extra_body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;agent_reference&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;MyAgent&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;agent_reference&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Multiply my favorite number by 10.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pas de Redis. Pas de store de sessions Cosmos DB. Pas de middleware personnalisé pour la sérialisation des messages. La plateforme gère tout simplement.&lt;/p&gt;
&lt;h2 id="mon-framework-de-décision"&gt;Mon framework de décision&lt;/h2&gt;
&lt;p&gt;Après avoir passé en revue les six options, voici mon modèle mental rapide :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Vous avez besoin de zéro infrastructure ?&lt;/strong&gt; → Foundry Agents (portail/SDK, pas de conteneurs)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vous avez du code d&amp;rsquo;agent personnalisé mais voulez un hébergement géré ?&lt;/strong&gt; → Foundry Hosted Agents&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vous avez besoin de tâches d&amp;rsquo;agents événementielles et courtes ?&lt;/strong&gt; → Azure Functions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vous avez besoin d&amp;rsquo;un contrôle maximum des conteneurs sans K8s ?&lt;/strong&gt; → Container Apps&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vous avez besoin de conformité stricte et multi-cluster ?&lt;/strong&gt; → AKS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vous avez un agent HTTP simple avec un trafic prévisible ?&lt;/strong&gt; → App Service&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Pour la plupart des développeurs .NET qui construisent avec Semantic Kernel ou Microsoft Agent Framework, Hosted Agents est probablement le bon point de départ. Vous obtenez le scale-to-zero, OpenTelemetry intégré, la gestion des conversations et la flexibilité de framework — sans gérer Kubernetes ni monter votre propre stack d&amp;rsquo;observabilité.&lt;/p&gt;
&lt;h2 id="pour-conclure"&gt;Pour conclure&lt;/h2&gt;
&lt;p&gt;Le paysage de l&amp;rsquo;hébergement d&amp;rsquo;agents sur Azure mûrit rapidement. Si vous démarrez un nouveau projet d&amp;rsquo;agent IA aujourd&amp;rsquo;hui, je considérerais sérieusement Foundry Hosted Agents avant de recourir à Container Apps ou AKS par habitude. L&amp;rsquo;infrastructure gérée fait gagner un temps réel, et le pattern hosting adapter vous permet de garder votre choix de framework.&lt;/p&gt;
&lt;p&gt;Consultez le &lt;a href="https://devblogs.microsoft.com/all-things-azure/hostedagent/"&gt;guide complet de Microsoft&lt;/a&gt; et le &lt;a href="https://github.com/microsoft-foundry/foundry-samples/tree/main/samples/python/hosted-agents"&gt;repo Foundry Samples&lt;/a&gt; pour des exemples fonctionnels.&lt;/p&gt;</content:encoded></item><item><title>Les Agent Skills en .NET deviennent vraiment flexibles</title><link>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/agent-skills-dotnet-three-authoring-patterns/</link><pubDate>Tue, 14 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/agent-skills-dotnet-three-authoring-patterns/</guid><description>Le Microsoft Agent Framework supporte désormais trois façons de créer des skills — fichiers, classes et code inline — toutes composées via un seul provider. Voici pourquoi c'est important et comment utiliser chacune.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Cet article a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/agent-skills-dotnet-three-authoring-patterns/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Si vous construisez des agents avec le Microsoft Agent Framework, vous connaissez le principe : vous définissez des skills, vous les connectez à un provider et vous laissez l&amp;rsquo;agent décider lequel invoquer. Ce qui est nouveau, c&amp;rsquo;est &lt;em&gt;comment&lt;/em&gt; vous créez ces skills — et le gain en flexibilité est significatif.&lt;/p&gt;
&lt;p&gt;La dernière mise à jour introduit trois patterns d&amp;rsquo;authoring pour les agent skills : &lt;strong&gt;basées sur des fichiers&lt;/strong&gt;, &lt;strong&gt;basées sur des classes&lt;/strong&gt; et &lt;strong&gt;définies en code inline&lt;/strong&gt;. Les trois se branchent sur un seul &lt;code&gt;AgentSkillsProviderBuilder&lt;/code&gt;, ce qui veut dire que vous pouvez les mixer sans logique de routage ni code spécial. Je vous présente chacune et quand l&amp;rsquo;utiliser.&lt;/p&gt;
&lt;h2 id="skills-basées-sur-des-fichiers--le-point-de-départ"&gt;Skills basées sur des fichiers : le point de départ&lt;/h2&gt;
&lt;p&gt;Les skills basées sur des fichiers sont exactement ce que leur nom suggère — un répertoire sur disque avec un fichier &lt;code&gt;SKILL.md&lt;/code&gt;, des scripts optionnels et des documents de référence. La façon la plus directe de donner de nouvelles capacités à votre agent :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;skills/
└── onboarding-guide/
├── SKILL.md
├── scripts/
│ └── check-provisioning.py
└── references/
└── onboarding-checklist.md
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Le frontmatter du &lt;code&gt;SKILL.md&lt;/code&gt; déclare le nom et la description, et la section d&amp;rsquo;instructions dit à l&amp;rsquo;agent comment utiliser les scripts et les références :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;name: onboarding-guide
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;description: &amp;gt;-
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Walk new hires through their first-week setup checklist.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## Instructions
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;1.&lt;/span&gt; Ask for the employee&amp;#39;s name and start date.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;2.&lt;/span&gt; Run &lt;span class="sb"&gt;`scripts/check-provisioning.py`&lt;/span&gt; to verify accounts.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;3.&lt;/span&gt; Walk through &lt;span class="sb"&gt;`references/onboarding-checklist.md`&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;4.&lt;/span&gt; Follow up on incomplete items.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ensuite vous le connectez avec &lt;code&gt;SubprocessScriptRunner.RunAsync&lt;/code&gt; pour l&amp;rsquo;exécution des scripts :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;skillsProvider&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;AgentSkillsProvider&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Combine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AppContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BaseDirectory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;skills&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;SubprocessScriptRunner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunAsync&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;AIAgent&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;AzureOpenAIClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Uri&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;endpoint&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;DefaultAzureCredential&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetResponsesClient&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AsAIAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ChatClientAgentOptions&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;HRAgent&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ChatOptions&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Instructions&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;You are a helpful HR assistant.&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;AIContextProviders&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;skillsProvider&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;deploymentName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;L&amp;rsquo;agent découvre la skill automatiquement et invoque le script de provisioning quand il doit vérifier le statut des comptes. Propre et simple.&lt;/p&gt;
&lt;h2 id="skills-basées-sur-des-classes--distribuer-via-nuget"&gt;Skills basées sur des classes : distribuer via NuGet&lt;/h2&gt;
&lt;p&gt;C&amp;rsquo;est là que ça devient intéressant pour les équipes. Les skills basées sur des classes dérivent de &lt;code&gt;AgentClassSkill&amp;lt;T&amp;gt;&lt;/code&gt; et utilisent des attributs comme &lt;code&gt;[AgentSkillResource]&lt;/code&gt; et &lt;code&gt;[AgentSkillScript]&lt;/code&gt; pour que le framework découvre tout par réflexion :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;sealed&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BenefitsEnrollmentSkill&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;AgentClassSkill&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;BenefitsEnrollmentSkill&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;override&lt;/span&gt; &lt;span class="n"&gt;AgentSkillFrontmatter&lt;/span&gt; &lt;span class="n"&gt;Frontmatter&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;benefits-enrollment&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;Enroll an employee in health, dental, or vision plans.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;protected&lt;/span&gt; &lt;span class="kd"&gt;override&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Instructions&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="m"&gt;1.&lt;/span&gt; &lt;span class="n"&gt;Read&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;available&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;plans&lt;/span&gt; &lt;span class="n"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="m"&gt;2.&lt;/span&gt; &lt;span class="n"&gt;Confirm&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;plan&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;employee&lt;/span&gt; &lt;span class="n"&gt;wants&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="m"&gt;3.&lt;/span&gt; &lt;span class="n"&gt;Use&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;enroll&lt;/span&gt; &lt;span class="n"&gt;script&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;complete&lt;/span&gt; &lt;span class="n"&gt;enrollment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;&amp;#34;&amp;#34;;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt; [AgentSkillResource(&amp;#34;available-plans&amp;#34;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt; [Description(&amp;#34;Plan options with monthly pricing.&amp;#34;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;AvailablePlans&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;##&lt;/span&gt; &lt;span class="n"&gt;Available&lt;/span&gt; &lt;span class="n"&gt;Plans&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;2026&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Health&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Basic&lt;/span&gt; &lt;span class="n"&gt;HMO&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;month&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;Premium&lt;/span&gt; &lt;span class="n"&gt;PPO&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="m"&gt;45&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;month&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Dental&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Standard&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;month&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;Enhanced&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="m"&gt;25&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;month&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Vision&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Basic&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="m"&gt;8&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;month&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;&amp;#34;&amp;#34;;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt; [AgentSkillScript(&amp;#34;enroll&amp;#34;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt; [Description(&amp;#34;Enrolls employee in the specified benefit plan.&amp;#34;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Enroll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;employeeId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;planCode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;success&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;HrClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;EnrollInPlan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;employeeId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;planCode&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;JsonSerializer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Serialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;success&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;employeeId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;planCode&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Le beau ici, c&amp;rsquo;est qu&amp;rsquo;une équipe peut packager ça en paquet NuGet. Vous l&amp;rsquo;ajoutez à votre projet, vous le mettez dans le builder, et ça fonctionne à côté de vos skills fichier sans coordination :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;skillsProvider&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;AgentSkillsProviderBuilder&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UseFileSkill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Combine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AppContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BaseDirectory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;skills&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UseSkill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;BenefitsEnrollmentSkill&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UseFileScriptRunner&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SubprocessScriptRunner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunAsync&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Les deux skills apparaissent dans le system prompt de l&amp;rsquo;agent. L&amp;rsquo;agent décide laquelle utiliser en fonction de la conversation — pas de code de routage nécessaire.&lt;/p&gt;
&lt;h2 id="skills-inline--le-pont-rapide"&gt;Skills inline : le pont rapide&lt;/h2&gt;
&lt;p&gt;Vous connaissez ce moment où une autre équipe construit exactement la skill dont vous avez besoin, mais elle ne sera pas prête avant le prochain sprint ? &lt;code&gt;AgentInlineSkill&lt;/code&gt; est votre pont :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;timeOffSkill&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;AgentInlineSkill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;time-off-balance&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Calculate remaining vacation and sick days.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="m"&gt;1.&lt;/span&gt; &lt;span class="n"&gt;Ask&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;employee&lt;/span&gt; &lt;span class="n"&gt;ID&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;not&lt;/span&gt; &lt;span class="n"&gt;provided&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="m"&gt;2.&lt;/span&gt; &lt;span class="n"&gt;Use&lt;/span&gt; &lt;span class="n"&gt;calculate&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;balance&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;remaining&lt;/span&gt; &lt;span class="n"&gt;balance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="m"&gt;3.&lt;/span&gt; &lt;span class="n"&gt;Present&lt;/span&gt; &lt;span class="n"&gt;used&lt;/span&gt; &lt;span class="n"&gt;and&lt;/span&gt; &lt;span class="n"&gt;remaining&lt;/span&gt; &lt;span class="n"&gt;days&lt;/span&gt; &lt;span class="n"&gt;clearly&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;&amp;#34;&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddScript&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;calculate-balance&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;employeeId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;leaveType&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;totalDays&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;HrDatabase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetAnnualAllowance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;employeeId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;leaveType&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;daysUsed&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;HrDatabase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetDaysUsed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;employeeId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;leaveType&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;remaining&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;totalDays&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;daysUsed&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;JsonSerializer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Serialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;employeeId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;leaveType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;totalDays&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;daysUsed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;remaining&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ajoutez-la au builder comme les autres :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;skillsProvider&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;AgentSkillsProviderBuilder&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UseFileSkill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Combine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AppContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BaseDirectory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;skills&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UseSkill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;BenefitsEnrollmentSkill&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UseSkill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;timeOffSkill&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UseFileScriptRunner&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SubprocessScriptRunner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunAsync&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Quand le paquet NuGet sort enfin, vous échangez la skill inline contre la version classe. L&amp;rsquo;agent ne voit pas la différence.&lt;/p&gt;
&lt;p&gt;Les skills inline ne sont pas que pour les ponts. Elles sont aussi le bon choix quand vous devez générer des skills dynamiquement à l&amp;rsquo;exécution — pensez à une skill par unité métier chargée depuis la config — ou quand un script doit capturer un état local qui n&amp;rsquo;a pas sa place dans un conteneur DI.&lt;/p&gt;
&lt;h2 id="approbation-de-scripts--lhumain-dans-la-boucle"&gt;Approbation de scripts : l&amp;rsquo;humain dans la boucle&lt;/h2&gt;
&lt;p&gt;Pour nous développeurs .NET qui construisons des agents de production, c&amp;rsquo;est la partie qui débloque vraiment les discussions de déploiement. Certains scripts ont des conséquences réelles — inscrire quelqu&amp;rsquo;un à des avantages, interroger l&amp;rsquo;infrastructure de production. Activez &lt;code&gt;UseScriptApproval&lt;/code&gt; et l&amp;rsquo;agent se met en pause avant d&amp;rsquo;exécuter tout script :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;skillsProvider&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;AgentSkillsProviderBuilder&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UseFileSkill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Combine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AppContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BaseDirectory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;skills&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UseSkill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;BenefitsEnrollmentSkill&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UseSkill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;timeOffSkill&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UseFileScriptRunner&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SubprocessScriptRunner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunAsync&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UseScriptApproval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Quand l&amp;rsquo;agent veut exécuter un script, il retourne une demande d&amp;rsquo;approbation à la place. Votre app collecte la décision — approuver ou rejeter — et l&amp;rsquo;agent continue en conséquence. Dans les environnements réglementés, c&amp;rsquo;est la différence entre &amp;ldquo;on peut déployer ça&amp;rdquo; et &amp;ldquo;le juridique dit non.&amp;rdquo;&lt;/p&gt;
&lt;h2 id="pourquoi-cette-combinaison-compte"&gt;Pourquoi cette combinaison compte&lt;/h2&gt;
&lt;p&gt;Le vrai pouvoir n&amp;rsquo;est pas dans un pattern individuel — c&amp;rsquo;est dans la composition. Vous pouvez :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Commencer petit&lt;/strong&gt; avec une skill fichier, itérer sur les instructions et la publier sans écrire de C#&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Distribuer des skills réutilisables&lt;/strong&gt; comme paquets NuGet que d&amp;rsquo;autres équipes ajoutent en une ligne&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Combler les lacunes&lt;/strong&gt; avec des skills inline quand vous avez besoin de quelque chose &lt;em&gt;maintenant&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Filtrer les répertoires partagés&lt;/strong&gt; avec des prédicats pour que votre agent ne charge que ce qu&amp;rsquo;il doit&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ajouter une supervision humaine&lt;/strong&gt; pour les scripts qui touchent les systèmes de production&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tout cela se compose via &lt;code&gt;AgentSkillsProviderBuilder&lt;/code&gt;. Pas de routage spécial, pas de logique conditionnelle, pas de vérifications de type de skill.&lt;/p&gt;
&lt;h2 id="pour-conclure"&gt;Pour conclure&lt;/h2&gt;
&lt;p&gt;Les agent skills en .NET ont maintenant un modèle d&amp;rsquo;authoring véritablement flexible. Que vous soyez un développeur solo qui prototype avec des skills fichier ou une équipe enterprise qui distribue des capacités packagées via NuGet, les patterns s&amp;rsquo;adaptent. Et le mécanisme d&amp;rsquo;approbation de scripts le rend prêt pour la production dans les environnements où vous avez besoin de ce checkpoint humain.&lt;/p&gt;
&lt;p&gt;Consultez l&amp;rsquo;&lt;a href="https://devblogs.microsoft.com/agent-framework/agent-skills-in-net-three-ways-to-author-one-provider-to-run-them/"&gt;annonce originale&lt;/a&gt;, la &lt;a href="https://learn.microsoft.com/en-us/agent-framework/agents/skills"&gt;documentation Agent Skills&lt;/a&gt; sur Microsoft Learn et les &lt;a href="https://github.com/microsoft/agent-framework/tree/main/dotnet/samples/02-agents/AgentSkills"&gt;exemples .NET sur GitHub&lt;/a&gt; pour vous lancer.&lt;/p&gt;</content:encoded></item><item><title>Azure MCP Server 2.0 Est Arrivé — L'Automatisation Agentic Self-Hosted Est Ici</title><link>https://thedotnetblog.com/fr/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/fr/posts/emiliano-montesdeoca/azure-mcp-server-2-self-hosted-agentic-cloud/</guid><description>Azure MCP Server 2.0 devient stable avec des déploiements distants self-hosted, 276 outils sur 57 services Azure, et la sécurité de niveau entreprise — voici ce qui compte pour les développeurs .NET construisant des workflows agentiques.</description><content:encoded>&lt;p&gt;&lt;em&gt;Cet article a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/azure-mcp-server-2-self-hosted-agentic-cloud/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Si vous avez construit quelque chose avec MCP et Azure récemment, vous savez probablement que l&amp;rsquo;expérience locale fonctionne bien. Branchez un serveur MCP, laissez votre agent IA parler aux ressources Azure, et passez à la suite. Mais dès que vous avez besoin de partager cette configuration dans une équipe ? C&amp;rsquo;est là que les choses se compliquaient.&lt;/p&gt;
&lt;p&gt;Plus maintenant. Azure MCP Server &lt;a href="https://devblogs.microsoft.com/azure-sdk/announcing-azure-mcp-server-2-0-stable-release/"&gt;vient d&amp;rsquo;atteindre la version 2.0 stable&lt;/a&gt;, et la fonctionnalité phare est exactement ce que les équipes d&amp;rsquo;entreprise demandaient : &lt;strong&gt;le support du serveur MCP distant self-hosted&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="quest-ce-quazure-mcp-server-"&gt;Qu&amp;rsquo;est-ce qu&amp;rsquo;Azure MCP Server ?&lt;/h2&gt;
&lt;p&gt;Petit rappel. Azure MCP Server implémente la spécification &lt;a href="https://modelcontextprotocol.io/docs/getting-started/intro"&gt;Model Context Protocol&lt;/a&gt; et expose les capacités Azure en tant qu&amp;rsquo;outils structurés et découvrables que les agents IA peuvent invoquer. Pensez-y comme un pont standardisé entre votre agent et Azure — provisionnement, déploiement, monitoring, diagnostics, tout par une interface cohérente.&lt;/p&gt;
&lt;p&gt;Les chiffres parlent d&amp;rsquo;eux-mêmes : &lt;strong&gt;276 outils MCP sur 57 services Azure&lt;/strong&gt;. C&amp;rsquo;est une couverture sérieuse.&lt;/p&gt;
&lt;h2 id="le-grand-changement--les-déploiements-distants-self-hosted"&gt;Le grand changement : les déploiements distants self-hosted&lt;/h2&gt;
&lt;p&gt;Voici la chose. Exécuter MCP localement sur votre machine, c&amp;rsquo;est bien pour le développement et les expériences. Mais dans un scénario d&amp;rsquo;équipe réelle, vous avez besoin de :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Un accès partagé pour les développeurs et les systèmes d&amp;rsquo;agents internes&lt;/li&gt;
&lt;li&gt;Une configuration centralisée (contexte de tenant, valeurs par défaut des abonnements, télémétrie)&lt;/li&gt;
&lt;li&gt;Des limites de réseau et de politique d&amp;rsquo;entreprise&lt;/li&gt;
&lt;li&gt;L&amp;rsquo;intégration dans les pipelines CI/CD&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Azure MCP Server 2.0 s&amp;rsquo;adresse à tout cela. Vous pouvez le déployer comme un service interne géré de manière centralisée avec un transport basé sur HTTP, une authentification appropriée et une gouvernance cohérente.&lt;/p&gt;
&lt;p&gt;Pour l&amp;rsquo;authentification, vous avez deux excellentes options :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Managed Identity&lt;/strong&gt; — lors de l&amp;rsquo;exécution aux côtés 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;Le flux On-Behalf-Of (OBO)&lt;/strong&gt; — une délégation OpenID Connect qui appelle les API Azure en utilisant le contexte de l&amp;rsquo;utilisateur connecté&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Ce flux OBO est particulièrement intéressant pour nous, développeurs .NET. Cela signifie que vos workflows agentiques peuvent fonctionner avec les permissions réelles de l&amp;rsquo;utilisateur, pas un compte de service surprivilégié. Le principe du moindre privilège, intégré nativement.&lt;/p&gt;
&lt;h2 id="renforcement-de-la-sécurité"&gt;Renforcement de la sécurité&lt;/h2&gt;
&lt;p&gt;Ce n&amp;rsquo;est pas seulement une sortie de fonctionnalité — c&amp;rsquo;est aussi une sortie de sécurité. La version 2.0 ajoute :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Une validation d&amp;rsquo;endpoint plus forte&lt;/li&gt;
&lt;li&gt;Des protections contre les modèles d&amp;rsquo;injection dans les outils orientés requête&lt;/li&gt;
&lt;li&gt;Des contrôles d&amp;rsquo;isolation plus serrés pour les environnements de développement&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si vous allez exposer MCP comme un service partagé, ces protections sont importantes. Vraiment importantes.&lt;/p&gt;
&lt;h2 id="où-pouvez-vous-lutiliser-"&gt;Où pouvez-vous l&amp;rsquo;utiliser ?&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;histoire de compatibilité des clients est large. Azure MCP Server 2.0 fonctionne avec :&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;Standalone&lt;/strong&gt; : serveur local pour les configurations simples&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Self-hosted distant&lt;/strong&gt; : la nouvelle vedette de la version 2.0&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Plus il y a le support du cloud souverain pour Azure US Government et Azure exploité par 21Vianet, ce qui est critique pour les déploiements réglementés.&lt;/p&gt;
&lt;h2 id="pourquoi-cest-important-pour-les-développeurs-net"&gt;Pourquoi c&amp;rsquo;est important pour les développeurs .NET&lt;/h2&gt;
&lt;p&gt;Si vous construisez des applications agentiques avec .NET — qu&amp;rsquo;il s&amp;rsquo;agisse de Semantic Kernel, Microsoft Agent Framework, ou votre propre orchestration — Azure MCP Server 2.0 vous donne un moyen prêt pour la production de laisser vos agents interagir avec l&amp;rsquo;infrastructure Azure. Pas de wrappers REST personnalisés. Pas de modèles d&amp;rsquo;intégration spécifiques aux services. Juste MCP.&lt;/p&gt;
&lt;p&gt;Combiné avec 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 fluide pour les applications MCP&lt;/a&gt; qui est arrivée il y a quelques jours, l&amp;rsquo;écosystème .NET MCP mûrit rapidement.&lt;/p&gt;
&lt;h2 id="démarrage"&gt;Démarrage&lt;/h2&gt;
&lt;p&gt;Choisissez votre chemin :&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; — code source, documentation, tout&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://aka.ms/azmcp/download/docker"&gt;Image Docker&lt;/a&gt;&lt;/strong&gt; — déploiement containerisé&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://aka.ms/azmcp/download/vscode"&gt;Extension VS Code&lt;/a&gt;&lt;/strong&gt; — intégration IDE&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://aka.ms/azmcp/self-host"&gt;Guide de self-hosting&lt;/a&gt;&lt;/strong&gt; — la fonctionnalité phare de la version 2.0&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Azure MCP Server 2.0 est exactement le type de mise à niveau d&amp;rsquo;infrastructure qui ne brille pas dans une démo mais change tout en pratique. Un MCP distant self-hosted avec une authentification appropriée, un renforcement de la sécurité et un support du cloud souverain signifient que MCP est prêt pour les vraies équipes construisant de vrais workflows agentiques sur Azure. Si vous attendiez le signal « prêt pour l&amp;rsquo;entreprise » — c&amp;rsquo;est celui-ci.&lt;/p&gt;</content:encoded></item><item><title>.NET Aspire 13.2 Veut Devenir le Meilleur Ami de Votre Agent IA</title><link>https://thedotnetblog.com/fr/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/fr/posts/emiliano-montesdeoca/aspire-agentic-development-build-run-observe/</guid><description>Aspire 13.2 mise tout sur le développement agentique — sortie CLI structurée, exécutions isolées, environnements auto-réparateurs et données OpenTelemetry complètes pour que vos agents IA puissent réellement construire, exécuter et observer vos apps.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Cet article a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/aspire-agentic-development-build-run-observe/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Tu connais ce moment où ton agent IA écrit du code solide, tu es tout excité, et puis tout s&amp;rsquo;effondre quand il essaie de &lt;em&gt;lancer&lt;/em&gt; le truc ? Conflits de ports, processus fantômes, mauvaises variables d&amp;rsquo;environnement — soudain ton agent brûle des tokens à déboguer des problèmes de démarrage au lieu de construire des fonctionnalités.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;équipe Aspire vient de publier un &lt;a href="https://devblogs.microsoft.com/aspire/agentic-dev-aspirations/"&gt;post très bien pensé&lt;/a&gt; sur exactement ce problème, et leur réponse est convaincante : Aspire 13.2 est conçu non seulement pour les humains, mais pour les agents IA.&lt;/p&gt;
&lt;h2 id="le-problème-est-réel"&gt;Le problème est réel&lt;/h2&gt;
&lt;p&gt;Les agents IA sont incroyables pour écrire du code. Mais livrer une app full-stack fonctionnelle implique bien plus que générer des fichiers. Il faut démarrer les services dans le bon ordre, gérer les ports, configurer les variables d&amp;rsquo;environnement, connecter les bases de données et obtenir du feedback quand ça casse. Actuellement, la plupart des agents gèrent tout ça par essai-erreur — exécuter des commandes, lire les sorties d&amp;rsquo;erreur, réessayer.&lt;/p&gt;
&lt;p&gt;On empile des instructions Markdown, des skills personnalisés et des prompts pour les guider, mais c&amp;rsquo;est imprévisible, ça ne se compile pas, et ça coûte des tokens juste pour parser. L&amp;rsquo;équipe Aspire a mis le doigt sur l&amp;rsquo;insight clé : les agents ont besoin de &lt;strong&gt;compilateurs et d&amp;rsquo;APIs structurées&lt;/strong&gt;, pas de plus de Markdown.&lt;/p&gt;
&lt;h2 id="aspire-comme-infrastructure-pour-agents"&gt;Aspire comme infrastructure pour agents&lt;/h2&gt;
&lt;p&gt;Voici ce qu&amp;rsquo;Aspire 13.2 apporte à la table du développement agentique :&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Toute ta stack en code typé.&lt;/strong&gt; L&amp;rsquo;AppHost définit ta topologie complète — API, frontend, base de données, cache — en TypeScript ou 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 peut lire ça pour comprendre la topologie de l&amp;rsquo;app, ajouter des ressources, câbler les connexions et &lt;em&gt;compiler pour vérifier&lt;/em&gt;. Le compilateur lui dit immédiatement si quelque chose ne va pas. Pas de devinettes, pas d&amp;rsquo;essai-erreur avec les fichiers de config.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Une seule commande pour les gouverner toutes.&lt;/strong&gt; Au lieu que les agents jonglent entre &lt;code&gt;docker compose up&lt;/code&gt;, &lt;code&gt;npm run dev&lt;/code&gt; et les scripts de démarrage de base de données, tout est simplement &lt;code&gt;aspire start&lt;/code&gt;. Toutes les ressources se lancent dans le bon ordre, sur les bons ports, avec la bonne configuration. Les processus longs ne bloquent pas non plus l&amp;rsquo;agent — Aspire les gère.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mode isolé pour les agents parallèles.&lt;/strong&gt; Avec &lt;code&gt;--isolated&lt;/code&gt;, chaque exécution d&amp;rsquo;Aspire obtient ses propres ports aléatoires et secrets utilisateur séparés. Plusieurs agents travaillent sur des git worktrees ? Ils n&amp;rsquo;entreront pas en collision. C&amp;rsquo;est énorme pour des outils comme les agents en arrière-plan de VS Code qui créent des environnements parallèles.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Des yeux d&amp;rsquo;agent grâce à la télémétrie.&lt;/strong&gt; C&amp;rsquo;est là que ça devient vraiment puissant. La CLI Aspire expose des données OpenTelemetry complètes pendant le développement — traces, métriques, logs structurés. Ton agent ne se contente pas de lire la sortie console en espérant que tout va bien. Il peut tracer une requête échouée à travers les services, profiler les endpoints lents et identifier précisément où les choses cassent. C&amp;rsquo;est de l&amp;rsquo;observabilité de niveau production dans la boucle de développement.&lt;/p&gt;
&lt;h2 id="lanalogie-des-bumpers-de-bowling"&gt;L&amp;rsquo;analogie des bumpers de bowling&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;équipe Aspire utilise une super analogie : pense à Aspire comme les bumpers de piste de bowling pour les agents IA. Si l&amp;rsquo;agent n&amp;rsquo;est pas parfait (et il ne le sera pas), les bumpers l&amp;rsquo;empêchent de faire des gouttières. La définition de la stack empêche les mauvaises configurations, le compilateur attrape les erreurs, la CLI gère les processus, et la télémétrie fournit la boucle de feedback.&lt;/p&gt;
&lt;p&gt;Combine ça avec quelque chose comme Playwright CLI, et ton agent peut réellement &lt;em&gt;utiliser&lt;/em&gt; ton app — cliquer dans les flux, vérifier le DOM, voir les trucs cassés dans la télémétrie, corriger le code, redémarrer et retester. Construire, exécuter, observer, corriger. C&amp;rsquo;est la boucle de développement autonome que nous poursuivons.&lt;/p&gt;
&lt;h2 id="pour-démarrer"&gt;Pour démarrer&lt;/h2&gt;
&lt;p&gt;Nouveau avec Aspire ? Installe la CLI depuis &lt;a href="https://get.aspire.dev"&gt;get.aspire.dev&lt;/a&gt; et suis le &lt;a href="https://aspire.dev/get-started/first-app"&gt;guide de démarrage&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Tu utilises déjà Aspire ? Lance &lt;code&gt;aspire update --self&lt;/code&gt; pour obtenir la 13.2, puis pointe ton agent de coding favori vers ton repo. Tu seras surpris de voir jusqu&amp;rsquo;où il ira avec les garde-fous d&amp;rsquo;Aspire.&lt;/p&gt;
&lt;h2 id="pour-conclure"&gt;Pour conclure&lt;/h2&gt;
&lt;p&gt;Aspire 13.2 n&amp;rsquo;est plus seulement un framework d&amp;rsquo;applications distribuées — il devient une infrastructure essentielle pour les agents. Des définitions de stack structurées, un démarrage en une commande, des exécutions parallèles isolées et de la télémétrie en temps réel donnent aux agents IA exactement ce dont ils ont besoin pour passer de l&amp;rsquo;écriture de code à la livraison d&amp;rsquo;apps.&lt;/p&gt;
&lt;p&gt;Lis le &lt;a href="https://devblogs.microsoft.com/aspire/agentic-dev-aspirations/"&gt;post complet&lt;/a&gt; de l&amp;rsquo;équipe Aspire pour tous les détails et vidéos de démo.&lt;/p&gt;</content:encoded></item><item><title>Ce Paramètre de Fenêtres Flottantes de Visual Studio Que Vous Ne Connaissiez Pas (Mais Devriez)</title><link>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/visual-studio-floating-windows-powertoys/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/visual-studio-floating-windows-powertoys/</guid><description>Un paramètre caché de Visual Studio vous donne un contrôle total sur les fenêtres flottantes — entrées indépendantes dans la barre des tâches, comportement multi-écran correct et intégration parfaite avec FancyZones. Un menu déroulant change tout.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Cet article a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/visual-studio-floating-windows-powertoys/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Si vous utilisez plusieurs écrans avec Visual Studio (et honnêtement, qui ne le fait pas de nos jours ?), vous avez probablement vécu la frustration : les fenêtres d&amp;rsquo;outils flottantes disparaissent quand vous réduisez l&amp;rsquo;IDE principal, elles restent toujours au-dessus de tout le reste, et elles n&amp;rsquo;apparaissent pas comme des boutons séparés dans la barre des tâches. Ça fonctionne pour certains workflows, mais pour les configurations multi-écrans c&amp;rsquo;est frustrant.&lt;/p&gt;
&lt;p&gt;Mads Kristensen de l&amp;rsquo;équipe Visual Studio &lt;a href="https://devblogs.microsoft.com/visualstudio/take-full-control-of-your-floating-windows-in-visual-studio/"&gt;a partagé un paramètre peu connu&lt;/a&gt; qui change complètement le comportement des fenêtres flottantes. Un menu déroulant. C&amp;rsquo;est tout.&lt;/p&gt;
&lt;h2 id="le-paramètre"&gt;Le paramètre&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Tools &amp;gt; Options &amp;gt; Environment &amp;gt; Windows &amp;gt; Floating Windows&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le menu déroulant &amp;ldquo;These floating windows are owned by the main window&amp;rdquo; a trois options :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;None&lt;/strong&gt; — indépendance totale. Chaque fenêtre flottante a sa propre entrée dans la barre des tâches et se comporte comme une fenêtre Windows normale.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tool Windows&lt;/strong&gt; (par défaut) — les documents flottent librement, les fenêtres d&amp;rsquo;outils restent liées à l&amp;rsquo;IDE.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Documents and Tool Windows&lt;/strong&gt; — comportement classique de Visual Studio, tout lié à la fenêtre principale.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="pourquoi-none-est-le-bon-choix-pour-les-configurations-multi-écrans"&gt;Pourquoi &amp;ldquo;None&amp;rdquo; est le bon choix pour les configurations multi-écrans&lt;/h2&gt;
&lt;p&gt;Réglez-le sur &lt;strong&gt;None&lt;/strong&gt; et soudain toutes vos fenêtres d&amp;rsquo;outils et documents flottants se comportent comme de vraies applications Windows. Elles apparaissent dans la barre des tâches, restent visibles quand vous réduisez la fenêtre principale de Visual Studio, et arrêtent de se forcer au premier plan.&lt;/p&gt;
&lt;p&gt;Combinez ça avec &lt;strong&gt;PowerToys FancyZones&lt;/strong&gt; et c&amp;rsquo;est un vrai changement. Créez des dispositions personnalisées sur vos écrans, placez votre Explorateur de Solutions dans une zone, le débogueur dans une autre, et les fichiers de code où vous voulez. Tout reste en place, tout est accessible indépendamment, et votre espace de travail paraît organisé au lieu de chaotique.&lt;/p&gt;
&lt;h2 id="recommandations-rapides"&gt;Recommandations rapides&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Utilisateurs avancés multi-écrans&lt;/strong&gt; : Réglez sur &lt;strong&gt;None&lt;/strong&gt;, combinez avec FancyZones&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flotteurs occasionnels&lt;/strong&gt; : &lt;strong&gt;Tool Windows&lt;/strong&gt; (par défaut) est un bon compromis&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Workflow traditionnel&lt;/strong&gt; : &lt;strong&gt;Documents and Tool Windows&lt;/strong&gt; garde tout classique&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Astuce pro : &lt;strong&gt;Ctrl + double-clic&lt;/strong&gt; sur la barre de titre de n&amp;rsquo;importe quelle fenêtre d&amp;rsquo;outils pour la rendre flottante ou l&amp;rsquo;ancrer instantanément. Pas besoin de redémarrer après avoir changé le paramètre.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;C&amp;rsquo;est un de ces paramètres du type &amp;ldquo;je n&amp;rsquo;arrive pas à croire que je ne connaissais pas ça&amp;rdquo;. Si les fenêtres flottantes dans Visual Studio vous ont déjà agacé, allez changer ça tout de suite.&lt;/p&gt;
&lt;p&gt;Lisez l&amp;rsquo;&lt;a href="https://devblogs.microsoft.com/visualstudio/take-full-control-of-your-floating-windows-in-visual-studio/"&gt;article complet&lt;/a&gt; pour les détails et les captures d&amp;rsquo;écran.&lt;/p&gt;</content:encoded></item><item><title>Connectez vos serveurs MCP sur Azure Functions aux agents Foundry — Voici comment</title><link>https://thedotnetblog.com/fr/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/fr/posts/emiliano-montesdeoca/foundry-agents-mcp-servers-azure-functions/</guid><description>Construisez votre serveur MCP une fois, déployez-le sur Azure Functions et connectez-le aux agents Microsoft Foundry avec une authentification appropriée. Vos outils fonctionnent partout — VS Code, Cursor, et maintenant les agents IA d'entreprise.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Cet article a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/foundry-agents-mcp-servers-azure-functions/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Voici ce que j&amp;rsquo;adore dans l&amp;rsquo;écosystème MCP : vous construisez votre serveur une fois, et il fonctionne partout. VS Code, Visual Studio, Cursor, ChatGPT — chaque client MCP peut découvrir et utiliser vos outils. Maintenant, Microsoft ajoute un autre consommateur à cette liste : les agents Foundry.&lt;/p&gt;
&lt;p&gt;Lily Ma de l&amp;rsquo;équipe Azure SDK &lt;a href="https://devblogs.microsoft.com/azure-sdk/give-your-foundry-agent-custom-tools-with-mcp-servers-on-azure-functions/"&gt;a publié un guide pratique&lt;/a&gt; sur la connexion de serveurs MCP déployés sur Azure Functions avec les agents Microsoft Foundry. Si vous avez déjà un serveur MCP, c&amp;rsquo;est de la valeur ajoutée pure — aucune reconstruction nécessaire.&lt;/p&gt;
&lt;h2 id="pourquoi-cette-combinaison-a-du-sens"&gt;Pourquoi cette combinaison a du sens&lt;/h2&gt;
&lt;p&gt;Azure Functions vous offre une infrastructure évolutive, une authentification intégrée et une facturation serverless pour héberger des serveurs MCP. Microsoft Foundry vous offre des agents IA capables de raisonner, planifier et agir. Les connecter signifie que vos outils personnalisés — interroger une base de données, appeler une API métier, exécuter une logique de validation — deviennent des capacités que les agents IA d&amp;rsquo;entreprise peuvent découvrir et utiliser de manière autonome.&lt;/p&gt;
&lt;p&gt;Le point clé : votre serveur MCP reste le même. Vous ajoutez simplement Foundry comme un autre consommateur. Les mêmes outils qui fonctionnent dans votre configuration VS Code alimentent maintenant un agent IA avec lequel votre équipe ou vos clients interagissent.&lt;/p&gt;
&lt;h2 id="options-dauthentification"&gt;Options d&amp;rsquo;authentification&lt;/h2&gt;
&lt;p&gt;C&amp;rsquo;est là que l&amp;rsquo;article apporte vraiment de la valeur. Quatre méthodes d&amp;rsquo;authentification selon votre scénario :&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Méthode&lt;/th&gt;
&lt;th&gt;Cas d&amp;rsquo;usage&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Basée sur clé&lt;/strong&gt; (par défaut)&lt;/td&gt;
&lt;td&gt;Développement ou serveurs sans auth Entra&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Microsoft Entra&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Production avec identités managées&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Passthrough d&amp;rsquo;identité OAuth&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Production où chaque utilisateur s&amp;rsquo;authentifie individuellement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Sans authentification&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dev/tests ou données publiques uniquement&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Pour la production, Microsoft Entra avec identité d&amp;rsquo;agent est le chemin recommandé. Le passthrough d&amp;rsquo;identité OAuth est pour les cas où le contexte utilisateur compte — l&amp;rsquo;agent demande aux utilisateurs de se connecter, et chaque requête porte le propre token de l&amp;rsquo;utilisateur.&lt;/p&gt;
&lt;h2 id="mise-en-place"&gt;Mise en place&lt;/h2&gt;
&lt;p&gt;Le flux général :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Déployez votre serveur MCP sur Azure Functions&lt;/strong&gt; — des exemples sont disponibles pour &lt;a href="https://github.com/Azure-Samples/remote-mcp-functions-dotnet"&gt;.NET&lt;/a&gt;, Python, TypeScript et Java&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Activez l&amp;rsquo;authentification MCP intégrée&lt;/strong&gt; sur votre function app&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Obtenez votre URL d&amp;rsquo;endpoint&lt;/strong&gt; — &lt;code&gt;https://&amp;lt;FUNCTION_APP_NAME&amp;gt;.azurewebsites.net/runtime/webhooks/mcp&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ajoutez le serveur MCP comme outil dans Foundry&lt;/strong&gt; — naviguez vers votre agent dans le portail, ajoutez un nouvel outil MCP, fournissez l&amp;rsquo;endpoint et les credentials&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Testez ensuite dans le playground de l&amp;rsquo;Agent Builder en envoyant un prompt qui déclenchera l&amp;rsquo;un de vos outils.&lt;/p&gt;
&lt;h2 id="mon-avis"&gt;Mon avis&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;histoire de la composabilité devient vraiment solide ici. Construisez votre serveur MCP une fois en .NET (ou Python, TypeScript, Java), déployez-le sur Azure Functions, et chaque client compatible MCP peut l&amp;rsquo;utiliser — outils de programmation, apps de chat, et maintenant agents IA d&amp;rsquo;entreprise. C&amp;rsquo;est un pattern « écrire une fois, utiliser partout » qui fonctionne réellement.&lt;/p&gt;
&lt;p&gt;Pour les développeurs .NET spécifiquement, l&amp;rsquo;&lt;a href="https://github.com/Azure-Samples/remote-mcp-functions-dotnet"&gt;extension MCP Azure Functions&lt;/a&gt; rend les choses simples. Vous définissez vos outils comme des Azure Functions, vous déployez, et vous avez un serveur MCP prêt pour la production avec toute la sécurité et la scalabilité qu&amp;rsquo;Azure Functions fournit.&lt;/p&gt;
&lt;h2 id="pour-conclure"&gt;Pour conclure&lt;/h2&gt;
&lt;p&gt;Si vous avez des outils MCP qui tournent sur Azure Functions, les connecter aux agents Foundry est un gain rapide — vos outils personnalisés deviennent des capacités IA d&amp;rsquo;entreprise avec une authentification appropriée et sans modification de code côté serveur.&lt;/p&gt;
&lt;p&gt;Lisez le &lt;a href="https://devblogs.microsoft.com/azure-sdk/give-your-foundry-agent-custom-tools-with-mcp-servers-on-azure-functions/"&gt;guide complet&lt;/a&gt; pour des instructions pas à pas sur chaque méthode d&amp;rsquo;authentification, et consultez la &lt;a href="https://learn.microsoft.com/azure/azure-functions/functions-mcp-foundry-tools?tabs=entra%2Cmcp-extension%2Cfoundry"&gt;documentation détaillée&lt;/a&gt; pour les configurations de production.&lt;/p&gt;</content:encoded></item><item><title>Construire des UIs Multi-Agents en Temps Réel Qui Ne Ressemblent Pas à une Boîte Noire</title><link>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/ag-ui-real-time-multi-agent-ui-maf/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/ag-ui-real-time-multi-agent-ui-maf/</guid><description>AG-UI et Microsoft Agent Framework s'associent pour offrir aux workflows multi-agents un vrai frontend — avec du streaming en temps réel, des approbations humaines et une visibilité totale sur ce que font vos agents.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Cet article a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/ag-ui-real-time-multi-agent-ui-maf/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Voilà le truc avec les systèmes multi-agents : ils sont incroyables en démo. Trois agents qui se passent le travail, résolvent des problèmes, prennent des décisions. Puis tu essaies de le mettre devant de vrais utilisateurs et&amp;hellip; silence. Un indicateur qui tourne. Aucune idée de quel agent fait quoi ni pourquoi le système est en pause. Ce n&amp;rsquo;est pas un produit — c&amp;rsquo;est un problème de confiance.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;équipe Microsoft Agent Framework vient de publier un &lt;a href="https://devblogs.microsoft.com/agent-framework/ag-ui-multi-agent-workflow-demo/"&gt;excellent tutoriel&lt;/a&gt; sur le couplage des workflows MAF avec &lt;a href="https://github.com/ag-ui-protocol/ag-ui"&gt;AG-UI&lt;/a&gt;, un protocole ouvert pour streamer les événements d&amp;rsquo;exécution des agents vers un frontend via les Server-Sent Events. Et franchement ? C&amp;rsquo;est exactement le pont qui nous manquait.&lt;/p&gt;
&lt;h2 id="pourquoi-cest-important-pour-les-développeurs-net"&gt;Pourquoi c&amp;rsquo;est important pour les développeurs .NET&lt;/h2&gt;
&lt;p&gt;Si tu construis des applications alimentées par l&amp;rsquo;IA, tu as probablement déjà heurté ce mur. Ton orchestration backend fonctionne parfaitement — les agents se passent le relais, les outils se déclenchent, les décisions sont prises. Mais le frontend n&amp;rsquo;a aucune idée de ce qui se passe en coulisses. AG-UI résout ça en définissant un protocole standard pour streamer les événements d&amp;rsquo;agents (pense à &lt;code&gt;RUN_STARTED&lt;/code&gt;, &lt;code&gt;STEP_STARTED&lt;/code&gt;, &lt;code&gt;TOOL_CALL_*&lt;/code&gt;, &lt;code&gt;TEXT_MESSAGE_*&lt;/code&gt;) directement vers ta couche UI via SSE.&lt;/p&gt;
&lt;p&gt;La démo est un workflow de support client avec trois agents : un agent de triage qui route les demandes, un agent de remboursement qui gère les questions d&amp;rsquo;argent, et un agent de commandes qui gère les remplacements. Chaque agent a ses propres outils, et la topologie de handoff est définie explicitement — pas de « devine à partir du prompt ».&lt;/p&gt;
&lt;h2 id="la-topologie-de-handoff-est-la-vraie-star"&gt;La topologie de handoff est la vraie star&lt;/h2&gt;
&lt;p&gt;Ce qui m&amp;rsquo;a marqué, c&amp;rsquo;est comment &lt;code&gt;HandoffBuilder&lt;/code&gt; te permet de déclarer un graphe de routage dirigé entre les agents :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;builder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;HandoffBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;ag_ui_handoff_workflow_demo&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;participants&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;triage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;refund&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;termination_condition&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;termination_condition&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;builder&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_handoff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;triage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;refund&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Refunds, damaged-item claims...&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_handoff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;triage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Replacement, exchange...&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_handoff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;refund&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Replacement logistics needed after refund.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_handoff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;triage&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;After replacement/shipping tasks complete.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Chaque &lt;code&gt;add_handoff&lt;/code&gt; crée une arête dirigée avec une description en langage naturel. Le framework génère des outils de handoff pour chaque agent en se basant sur cette topologie. Les décisions de routage reposent donc sur ta structure d&amp;rsquo;orchestration, pas juste sur ce que le LLM a envie de faire. C&amp;rsquo;est un gain énorme pour la fiabilité en production.&lt;/p&gt;
&lt;h2 id="le-human-in-the-loop-qui-fonctionne-vraiment"&gt;Le human-in-the-loop qui fonctionne vraiment&lt;/h2&gt;
&lt;p&gt;La démo présente deux patterns d&amp;rsquo;interruption dont toute app d&amp;rsquo;agents réelle a besoin :&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Interruptions d&amp;rsquo;approbation d&amp;rsquo;outils&lt;/strong&gt; — quand un agent appelle un outil marqué avec &lt;code&gt;approval_mode=&amp;quot;always_require&amp;quot;&lt;/code&gt;, le workflow se met en pause et émet un événement. Le frontend affiche un modal d&amp;rsquo;approbation avec le nom de l&amp;rsquo;outil et ses arguments. Pas de boucles de retry qui brûlent des tokens — juste un flux propre pause-approbation-reprise.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Interruptions de demande d&amp;rsquo;information&lt;/strong&gt; — quand un agent a besoin de plus de contexte de la part de l&amp;rsquo;utilisateur (comme un ID de commande), il se met en pause et pose la question. Le frontend affiche la question, l&amp;rsquo;utilisateur répond, et l&amp;rsquo;exécution reprend exactement là où elle s&amp;rsquo;était arrêtée.&lt;/p&gt;
&lt;p&gt;Les deux patterns sont streamés en tant qu&amp;rsquo;événements AG-UI standard, donc ton frontend n&amp;rsquo;a pas besoin de logique personnalisée par agent — il affiche simplement chaque événement qui arrive via la connexion SSE.&lt;/p&gt;
&lt;h2 id="lintégration-est-étonnamment-simple"&gt;L&amp;rsquo;intégration est étonnamment simple&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;intégration entre MAF et AG-UI se résume à un seul appel de fonction :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;agent_framework.ag_ui&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;AgentFrameworkWorkflow&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;add_agent_framework_fastapi_endpoint&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;demo_workflow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AgentFrameworkWorkflow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;workflow_factory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;_thread_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;create_handoff_workflow&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;ag_ui_handoff_workflow_demo&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;add_agent_framework_fastapi_endpoint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;demo_workflow&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/handoff_demo&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;La &lt;code&gt;workflow_factory&lt;/code&gt; crée un workflow frais par thread, pour que chaque conversation ait son propre état isolé. L&amp;rsquo;endpoint gère toute la plomberie SSE automatiquement. Si tu utilises déjà FastAPI (ou que tu peux l&amp;rsquo;ajouter comme couche légère), c&amp;rsquo;est quasiment zéro friction.&lt;/p&gt;
&lt;h2 id="mon-avis"&gt;Mon avis&lt;/h2&gt;
&lt;p&gt;Pour nous développeurs .NET, la question immédiate est : « Est-ce que je peux faire ça en C# ? » L&amp;rsquo;Agent Framework est disponible pour .NET et Python, et le protocole AG-UI est agnostique au langage (c&amp;rsquo;est juste du SSE). Donc même si cette démo spécifique utilise Python et FastAPI, le pattern se transpose directement. Tu pourrais câbler une API minimale ASP.NET Core avec des endpoints SSE suivant le même schéma d&amp;rsquo;événements AG-UI.&lt;/p&gt;
&lt;p&gt;Le point plus important est que les UIs multi-agents deviennent une préoccupation de premier plan, pas un ajout après coup. Si tu construis quoi que ce soit où des agents interagissent avec des humains — support client, workflows d&amp;rsquo;approbation, traitement de documents — cette combinaison d&amp;rsquo;orchestration MAF et de transparence AG-UI est le pattern à suivre.&lt;/p&gt;
&lt;h2 id="pour-conclure"&gt;Pour conclure&lt;/h2&gt;
&lt;p&gt;AG-UI + Microsoft Agent Framework te donne le meilleur des deux mondes : une orchestration multi-agents robuste côté backend et une visibilité en temps réel côté frontend. Fini les interactions d&amp;rsquo;agents en boîte noire.&lt;/p&gt;
&lt;p&gt;Consulte le &lt;a href="https://devblogs.microsoft.com/agent-framework/ag-ui-multi-agent-workflow-demo/"&gt;tutoriel complet&lt;/a&gt; et le &lt;a href="https://github.com/ag-ui-protocol/ag-ui"&gt;dépôt du protocole AG-UI&lt;/a&gt; pour aller plus loin.&lt;/p&gt;</content:encoded></item><item><title>L'évaluation de modernisation de GitHub Copilot est le meilleur outil de migration que vous n'utilisez pas encore</title><link>https://thedotnetblog.com/fr/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/fr/posts/emiliano-montesdeoca/dotnet-modernization-assessment-github-copilot/</guid><description>L'extension de modernisation de GitHub Copilot ne se contente pas de suggérer des modifications de code — elle produit une évaluation complète de migration avec des issues actionnables, des comparaisons de cibles Azure et un workflow collaboratif. Voici pourquoi le document d'évaluation est la clé de tout.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Cet article a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/dotnet-modernization-assessment-github-copilot/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Migrer une application legacy .NET Framework vers .NET moderne est l&amp;rsquo;une de ces tâches que tout le monde sait devoir faire mais que personne ne veut commencer. Ce n&amp;rsquo;est jamais juste « changer le framework cible ». Ce sont des API qui ont disparu, des packages qui n&amp;rsquo;existent plus, des modèles d&amp;rsquo;hébergement qui fonctionnent totalement différemment, et un million de petites décisions sur ce qu&amp;rsquo;il faut containeriser, réécrire ou laisser tel quel.&lt;/p&gt;
&lt;p&gt;Jeffrey Fritz vient de publier une &lt;a href="https://devblogs.microsoft.com/dotnet/your-migrations-source-of-truth-the-modernization-assessment/"&gt;plongée approfondie dans l&amp;rsquo;évaluation de modernisation de GitHub Copilot&lt;/a&gt;, et honnêtement ? C&amp;rsquo;est le meilleur outillage de migration que j&amp;rsquo;ai vu pour .NET. Pas à cause de la génération de code — c&amp;rsquo;est devenu standard maintenant. À cause du document d&amp;rsquo;évaluation qu&amp;rsquo;il produit.&lt;/p&gt;
&lt;h2 id="ce-nest-pas-quun-moteur-de-suggestions-de-code"&gt;Ce n&amp;rsquo;est pas qu&amp;rsquo;un moteur de suggestions de code&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;extension VS Code suit un modèle &lt;strong&gt;Évaluer → Planifier → Exécuter&lt;/strong&gt;. La phase d&amp;rsquo;évaluation analyse l&amp;rsquo;intégralité de votre codebase et produit un document structuré qui capture tout : ce qui doit changer, quelles ressources Azure provisionner, quel modèle de déploiement utiliser. Tout en aval — infrastructure as code, containerisation, manifestes de déploiement — découle de ce que l&amp;rsquo;évaluation trouve.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;évaluation est stockée sous &lt;code&gt;.github/modernize/assessment/&lt;/code&gt; dans votre projet. Chaque exécution produit un rapport indépendant, vous construisez ainsi un historique et pouvez suivre l&amp;rsquo;évolution de votre posture de migration au fur et à mesure que vous corrigez les issues.&lt;/p&gt;
&lt;h2 id="deux-façons-de-commencer"&gt;Deux façons de commencer&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Évaluation Recommandée&lt;/strong&gt; — la voie rapide. Choisissez parmi des domaines curatés (Mise à jour Java/.NET, Cloud Readiness, Sécurité) et obtenez des résultats significatifs sans toucher à la configuration. Idéal pour un premier regard sur l&amp;rsquo;état de votre application.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Évaluation Personnalisée&lt;/strong&gt; — la voie ciblée. Configurez exactement ce qu&amp;rsquo;il faut analyser : compute cible (App Service, AKS, Container Apps), OS cible, analyse de containerisation. Choisissez plusieurs cibles Azure pour comparer les approches de migration côte à côte.&lt;/p&gt;
&lt;p&gt;Cette vue de comparaison est véritablement utile. Une app avec 3 issues obligatoires pour App Service pourrait en avoir 7 pour AKS. Voir les deux aide à prendre la décision d&amp;rsquo;hébergement avant de s&amp;rsquo;engager sur un chemin de migration.&lt;/p&gt;
&lt;h2 id="le-détail-des-issues-est-actionnable"&gt;Le détail des issues est actionnable&lt;/h2&gt;
&lt;p&gt;Chaque issue est accompagné d&amp;rsquo;un niveau de criticité :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Obligatoire&lt;/strong&gt; — doit être corrigé sinon la migration échoue&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Potentiel&lt;/strong&gt; — pourrait impacter la migration, nécessite un jugement humain&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Optionnel&lt;/strong&gt; — améliorations recommandées, ne bloque pas la migration&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Et chaque issue renvoie aux fichiers affectés et numéros de lignes, fournit une description détaillée de ce qui ne va pas et pourquoi c&amp;rsquo;est important pour votre plateforme cible, donne des étapes concrètes de remédiation (pas juste « corrigez ceci ») et inclut des liens vers la documentation officielle.&lt;/p&gt;
&lt;p&gt;Vous pouvez confier des issues individuelles à des développeurs et ils ont tout ce dont ils ont besoin pour agir. C&amp;rsquo;est la différence entre un outil qui vous dit « il y a un problème » et un qui vous dit comment le résoudre.&lt;/p&gt;
&lt;h2 id="les-chemins-de-mise-à-jour-couverts"&gt;Les chemins de mise à jour couverts&lt;/h2&gt;
&lt;p&gt;Pour .NET spécifiquement :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;.NET Framework → .NET 10&lt;/li&gt;
&lt;li&gt;ASP.NET → ASP.NET Core&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Chaque chemin de mise à jour a des règles de détection qui savent quelles API ont été supprimées, quels patterns n&amp;rsquo;ont pas d&amp;rsquo;équivalent direct et quels problèmes de sécurité nécessitent une attention particulière.&lt;/p&gt;
&lt;p&gt;Pour les équipes gérant plusieurs applications, il y a aussi un CLI qui supporte les évaluations batch multi-repo — clonez tous les repos, évaluez-les tous, obtenez des rapports par application plus une vue agrégée du portfolio.&lt;/p&gt;
&lt;h2 id="mon-avis"&gt;Mon avis&lt;/h2&gt;
&lt;p&gt;Si vous êtes assis sur des applications legacy .NET Framework (et soyons honnêtes, la plupart des équipes enterprise le sont), c&amp;rsquo;est &lt;em&gt;l&amp;rsquo;outil&lt;/em&gt; par lequel commencer. Le document d&amp;rsquo;évaluation seul vaut le temps — il transforme un vague « on devrait moderniser » en une liste concrète et priorisée d&amp;rsquo;éléments de travail avec des chemins clairs vers l&amp;rsquo;avant.&lt;/p&gt;
&lt;p&gt;Le workflow collaboratif est malin aussi : exportez les évaluations, partagez-les avec votre équipe, importez-les sans relancer. Revues d&amp;rsquo;architecture où les décideurs ne sont pas ceux qui exécutent les outils ? Couvert.&lt;/p&gt;
&lt;h2 id="pour-conclure"&gt;Pour conclure&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;évaluation de modernisation de GitHub Copilot transforme la migration .NET d&amp;rsquo;un projet effrayant et indéfini en un processus structuré et traçable. Commencez avec une évaluation recommandée pour voir où vous en êtes, puis utilisez des évaluations personnalisées pour comparer les cibles Azure et construire votre plan de migration.&lt;/p&gt;
&lt;p&gt;Lisez le &lt;a href="https://devblogs.microsoft.com/dotnet/your-migrations-source-of-truth-the-modernization-assessment/"&gt;walkthrough complet&lt;/a&gt; et récupérez l&amp;rsquo;&lt;a href="https://aka.ms/ghcp-appmod/vscode-ext"&gt;extension VS Code&lt;/a&gt; pour l&amp;rsquo;essayer sur votre propre codebase.&lt;/p&gt;</content:encoded></item><item><title>L'Ingénierie de Plateformes Agentique Devient Réalité — Git-APE Montre Comment</title><link>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/agentic-platform-engineering-git-ape/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/agentic-platform-engineering-git-ape/</guid><description>Le projet Git-APE de Microsoft concrétise l'ingénierie de plateformes agentique — en utilisant les agents GitHub Copilot et Azure MCP pour transformer des requêtes en langage naturel en infrastructure cloud validée.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Cet article a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/agentic-platform-engineering-git-ape/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;L&amp;rsquo;ingénierie de plateformes est un de ces termes qui sonne bien en conférence mais qui signifie généralement « on a construit un portail interne et un wrapper Terraform. » La vraie promesse — une infrastructure en self-service qui soit réellement sécurisée, gouvernée et rapide — a toujours été à quelques pas.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;équipe Azure vient de publier la &lt;a href="https://devblogs.microsoft.com/all-things-azure/putting-agentic-platform-engineering-to-the-test/"&gt;Partie 2 de leur série sur l&amp;rsquo;ingénierie de plateformes agentique&lt;/a&gt;, et celle-ci porte sur l&amp;rsquo;implémentation concrète. Ils l&amp;rsquo;appellent &lt;strong&gt;Git-APE&lt;/strong&gt; (oui, l&amp;rsquo;acronyme est intentionnel), et c&amp;rsquo;est un projet open source qui utilise les agents GitHub Copilot plus les serveurs Azure MCP pour transformer des requêtes en langage naturel en infrastructure validée et déployée.&lt;/p&gt;
&lt;h2 id="ce-que-git-ape-fait-concrètement"&gt;Ce que Git-APE fait concrètement&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;idée principale : au lieu que les développeurs apprennent des modules Terraform, naviguent dans des UIs de portails ou déposent des tickets à l&amp;rsquo;équipe plateforme, ils parlent à un agent Copilot. L&amp;rsquo;agent interprète l&amp;rsquo;intention, génère de l&amp;rsquo;Infrastructure-as-Code, la valide contre les politiques et déploie — le tout dans VS Code.&lt;/p&gt;
&lt;p&gt;Voici la mise en place :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/Azure/git-ape
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; git-ape
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ouvre le workspace dans VS Code, et les fichiers de configuration de l&amp;rsquo;agent sont automatiquement découverts par GitHub Copilot. Tu interagis directement avec l&amp;rsquo;agent :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;@git-ape deploy a function app with storage in West Europe
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;L&amp;rsquo;agent utilise Azure MCP Server en interne pour interagir avec les services Azure. La configuration MCP dans les paramètres de VS Code active des capacités spécifiques :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;azureMcp.serverMode&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;namespace&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;azureMcp.enabledServices&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;deploy&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;bestpractices&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;group&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;subscription&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;functionapp&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;storage&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;sql&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;monitor&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;azureMcp.readOnly&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="pourquoi-cest-important"&gt;Pourquoi c&amp;rsquo;est important&lt;/h2&gt;
&lt;p&gt;Pour ceux d&amp;rsquo;entre nous qui construisent sur Azure, cela déplace la conversation de l&amp;rsquo;ingénierie de plateformes de « comment construire un portail » à « comment décrire nos garde-fous comme des APIs. » Quand l&amp;rsquo;interface de ta plateforme est un agent IA, la qualité de tes contraintes et politiques devient le produit.&lt;/p&gt;
&lt;p&gt;Le blog de la Partie 1 posait la théorie : des APIs bien décrites, des schémas de contrôle et des garde-fous explicites rendent les plateformes agent-ready. La Partie 2 prouve que ça marche en livrant des outils concrets. L&amp;rsquo;agent ne génère pas aveuglément des ressources — il valide contre les bonnes pratiques, respecte les conventions de nommage et applique les politiques de ton organisation.&lt;/p&gt;
&lt;p&gt;Le nettoyage est tout aussi simple :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;@git-ape destroy my-resource-group
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="mon-avis"&gt;Mon avis&lt;/h2&gt;
&lt;p&gt;Je serai honnête — ici c&amp;rsquo;est plus le pattern que l&amp;rsquo;outil spécifique qui compte. Git-APE lui-même est une démo/architecture de référence. Mais l&amp;rsquo;idée sous-jacente — les agents comme interface de ta plateforme, MCP comme protocole, GitHub Copilot comme hôte — c&amp;rsquo;est la direction que prend l&amp;rsquo;expérience développeur en entreprise.&lt;/p&gt;
&lt;p&gt;Si tu es une équipe plateforme qui cherche comment rendre son outillage interne agent-friendly, il n&amp;rsquo;y a pas de meilleur point de départ. Et si tu es un développeur .NET qui se demande comment ça se connecte à ton monde : Azure MCP Server et les agents GitHub Copilot fonctionnent avec n&amp;rsquo;importe quel workload Azure. Ton API ASP.NET Core, ton stack .NET Aspire, tes microservices containerisés — tout ça peut être la cible d&amp;rsquo;un flux de déploiement agentique.&lt;/p&gt;
&lt;h2 id="pour-conclure"&gt;Pour conclure&lt;/h2&gt;
&lt;p&gt;Git-APE est un aperçu précoce mais concret de l&amp;rsquo;ingénierie de plateformes agentique en pratique. Clone le &lt;a href="https://github.com/Azure/git-ape"&gt;repo&lt;/a&gt;, essaie la démo et commence à réfléchir à comment les APIs et politiques de ta plateforme devraient se présenter pour qu&amp;rsquo;un agent puisse les utiliser en toute sécurité.&lt;/p&gt;
&lt;p&gt;Lis le &lt;a href="https://devblogs.microsoft.com/all-things-azure/putting-agentic-platform-engineering-to-the-test/"&gt;post complet&lt;/a&gt; pour le walkthrough et les vidéos de démo.&lt;/p&gt;</content:encoded></item><item><title>Le Mode Isolé d'Aspire Résout le Cauchemar des Conflits de Ports pour le Développement Parallèle</title><link>https://thedotnetblog.com/fr/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/fr/posts/emiliano-montesdeoca/aspire-isolated-mode-parallel-instances/</guid><description>Aspire 13.2 introduit le mode --isolated : ports aléatoires, secrets séparés et zéro collision lors de l'exécution de plusieurs instances du même AppHost. Parfait pour les agents IA, les worktrees et les workflows parallèles.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Cet article a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/aspire-isolated-mode-parallel-instances/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Si tu as déjà essayé d&amp;rsquo;exécuter deux instances du même projet en même temps, tu connais la douleur. Le port 8080 est déjà utilisé. Le port 17370 est pris. Tuer quelque chose, redémarrer, jongler avec les variables d&amp;rsquo;environnement — c&amp;rsquo;est un tueur de productivité.&lt;/p&gt;
&lt;p&gt;Ce problème empire, il ne s&amp;rsquo;améliore pas. Les agents IA créent des git worktrees pour travailler indépendamment. Les agents en arrière-plan démarrent des environnements séparés. Les développeurs font des checkout du même repo deux fois pour des branches de fonctionnalités. Chacun de ces scénarios frappe le même mur : deux instances de la même app qui se battent pour les mêmes ports.&lt;/p&gt;
&lt;p&gt;Aspire 13.2 résout ça avec un seul flag. James Newton-King de l&amp;rsquo;équipe Aspire a &lt;a href="https://devblogs.microsoft.com/aspire/aspire-isolated-mode-parallel-development/"&gt;écrit tous les détails&lt;/a&gt;, et c&amp;rsquo;est une de ces fonctionnalités « pourquoi on n&amp;rsquo;avait pas ça avant ? ».&lt;/p&gt;
&lt;h2 id="la-solution----isolated"&gt;La solution : &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;C&amp;rsquo;est tout. Chaque exécution obtient :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Des ports aléatoires&lt;/strong&gt; — plus de collisions entre instances&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Des secrets utilisateur isolés&lt;/strong&gt; — les chaînes de connexion et clés API restent séparées par instance&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pas de réattribution manuelle de ports. Pas de jonglage avec les variables d&amp;rsquo;environnement. Chaque exécution obtient un environnement propre et sans collision automatiquement.&lt;/p&gt;
&lt;h2 id="scénarios-réels-où-ça-brille"&gt;Scénarios réels où ça brille&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Checkouts multiples.&lt;/strong&gt; Tu as une branche de fonctionnalité dans un répertoire et un bugfix dans un autre :&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;Les deux tournent sans conflit. Le dashboard montre ce qui tourne et où.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Agents en arrière-plan dans VS Code.&lt;/strong&gt; Quand l&amp;rsquo;agent en arrière-plan de Copilot Chat crée un git worktree pour travailler sur ton code indépendamment, il peut avoir besoin d&amp;rsquo;exécuter ton AppHost Aspire. Sans &lt;code&gt;--isolated&lt;/code&gt;, c&amp;rsquo;est un conflit de ports avec ton worktree principal. Avec, les deux instances fonctionnent tout simplement.&lt;/p&gt;
&lt;p&gt;Le skill Aspire livré avec &lt;code&gt;aspire agent init&lt;/code&gt; instruit automatiquement les agents d&amp;rsquo;utiliser &lt;code&gt;--isolated&lt;/code&gt; quand ils travaillent dans des worktrees. Donc l&amp;rsquo;agent en arrière-plan de Copilot devrait gérer ça nativement.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tests d&amp;rsquo;intégration en parallèle du développement.&lt;/strong&gt; Besoin d&amp;rsquo;exécuter des tests contre un AppHost live tout en continuant à développer des fonctionnalités ? Le mode isolé donne à chaque contexte ses propres ports et sa propre config.&lt;/p&gt;
&lt;h2 id="comment-ça-fonctionne-sous-le-capot"&gt;Comment ça fonctionne sous le capot&lt;/h2&gt;
&lt;p&gt;Quand tu passes &lt;code&gt;--isolated&lt;/code&gt;, la CLI génère un ID d&amp;rsquo;instance unique pour l&amp;rsquo;exécution. Cela pilote deux comportements :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Randomisation des ports&lt;/strong&gt; — au lieu de se lier à des ports prévisibles définis dans la config de ton AppHost, le mode isolé choisit des ports aléatoires disponibles pour tout — le dashboard, les endpoints de services, tout. Le service discovery s&amp;rsquo;ajuste automatiquement, pour que les services se trouvent mutuellement quel que soit le port attribué.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Isolation des secrets&lt;/strong&gt; — chaque exécution isolée obtient son propre store de secrets utilisateur, indexé par l&amp;rsquo;ID d&amp;rsquo;instance. Les chaînes de connexion et clés API d&amp;rsquo;une exécution ne fuient pas dans une autre.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Ton code n&amp;rsquo;a besoin d&amp;rsquo;aucun changement. Le service discovery d&amp;rsquo;Aspire résout les endpoints au runtime, donc tout se connecte correctement quelle que soit l&amp;rsquo;attribution des ports.&lt;/p&gt;
&lt;h2 id="quand-lutiliser"&gt;Quand l&amp;rsquo;utiliser&lt;/h2&gt;
&lt;p&gt;Utilise &lt;code&gt;--isolated&lt;/code&gt; quand tu exécutes plusieurs instances du même AppHost simultanément — que ce soit pour du développement parallèle, des tests automatisés, des agents IA ou des git worktrees. Pour du développement mono-instance où tu préfères des ports prévisibles, le &lt;code&gt;aspire run&lt;/code&gt; classique fonctionne toujours très bien.&lt;/p&gt;
&lt;h2 id="pour-conclure"&gt;Pour conclure&lt;/h2&gt;
&lt;p&gt;Le mode isolé est une petite fonctionnalité qui résout un problème réel et de plus en plus courant. Alors que le développement assisté par IA nous pousse vers plus de workflows parallèles — agents multiples, worktrees multiples, contextes multiples — la capacité de simplement lancer une autre instance sans se battre pour les ports est essentielle.&lt;/p&gt;
&lt;p&gt;Lis le &lt;a href="https://devblogs.microsoft.com/aspire/aspire-isolated-mode-parallel-development/"&gt;post complet&lt;/a&gt; pour tous les détails techniques et essaie-le avec &lt;code&gt;aspire update --self&lt;/code&gt; pour obtenir la 13.2.&lt;/p&gt;</content:encoded></item><item><title>Les MCP Apps ont une API fluide — Créez des interfaces riches pour outils IA en .NET en trois étapes</title><link>https://thedotnetblog.com/fr/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/fr/posts/emiliano-montesdeoca/mcp-fluent-api-azure-functions-dotnet/</guid><description>La nouvelle API de configuration fluide pour les MCP Apps sur Azure Functions vous permet de transformer n'importe quel outil MCP .NET en une application complète avec des vues, des permissions et des politiques CSP en quelques lignes de code.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Cet article a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/mcp-fluent-api-azure-functions-dotnet/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Les outils MCP sont parfaits pour donner des capacités aux agents IA. Mais que faire si votre outil doit montrer quelque chose à l&amp;rsquo;utilisateur — un tableau de bord, un formulaire, une visualisation interactive ? C&amp;rsquo;est là qu&amp;rsquo;interviennent les MCP Apps, et elles sont devenues beaucoup plus faciles à créer.&lt;/p&gt;
&lt;p&gt;Lilian Kasem de l&amp;rsquo;équipe Azure SDK &lt;a href="https://devblogs.microsoft.com/azure-sdk/mcp-as-easy-as-1-2-3-introducing-the-fluent-api-for-mcp-apps/"&gt;a présenté la nouvelle API de configuration fluide&lt;/a&gt; pour les MCP Apps sur Azure Functions .NET, et c&amp;rsquo;est le genre d&amp;rsquo;amélioration de l&amp;rsquo;expérience développeur qui fait se demander pourquoi ce n&amp;rsquo;était pas déjà aussi simple.&lt;/p&gt;
&lt;h2 id="quest-ce-que-les-mcp-apps-"&gt;Qu&amp;rsquo;est-ce que les MCP Apps ?&lt;/h2&gt;
&lt;p&gt;Les MCP Apps étendent le Model Context Protocol en permettant aux outils d&amp;rsquo;embarquer leurs propres vues UI, assets statiques et contrôles de sécurité. Au lieu de simplement retourner du texte, votre outil MCP peut rendre des expériences HTML complètes — tableaux de bord interactifs, visualisations de données, formulaires de configuration — le tout invocable par des agents IA et présenté aux utilisateurs par les clients MCP.&lt;/p&gt;
&lt;p&gt;Le problème était que tout câbler manuellement nécessitait une connaissance approfondie de la spécification MCP : URIs &lt;code&gt;ui://&lt;/code&gt;, types MIME spéciaux, coordination des métadonnées entre outils et ressources. Pas difficile, mais fastidieux.&lt;/p&gt;
&lt;h2 id="lapi-fluide-en-trois-étapes"&gt;L&amp;rsquo;API fluide en trois étapes&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Étape 1 : Définissez votre fonction.&lt;/strong&gt; Un outil MCP Azure Functions standard :&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;Étape 2 : Promouvez-la en MCP App.&lt;/strong&gt; Dans le démarrage de votre programme :&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;Étape 3 : Ajoutez votre vue HTML.&lt;/strong&gt; Créez &lt;code&gt;assets/hello-app.html&lt;/code&gt; avec l&amp;rsquo;interface dont vous avez besoin.&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est tout. L&amp;rsquo;API fluide gère toute la plomberie du protocole MCP — génère la fonction de ressource synthétique, définit le type MIME correct et injecte les métadonnées qui connectent votre outil à sa vue.&lt;/p&gt;
&lt;h2 id="la-surface-de-lapi-est-bien-conçue"&gt;La surface de l&amp;rsquo;API est bien conçue&lt;/h2&gt;
&lt;p&gt;Quelques éléments que j&amp;rsquo;apprécie particulièrement :&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les sources de vues sont flexibles.&lt;/strong&gt; Vous pouvez servir du HTML depuis des fichiers sur disque ou intégrer des ressources directement dans votre assembly pour des déploiements autonomes :&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;Le CSP est composable.&lt;/strong&gt; Vous autorisez explicitement les origines dont votre app a besoin, en suivant le principe du moindre privilège. Appelez &lt;code&gt;WithCsp&lt;/code&gt; plusieurs fois et les origines s&amp;rsquo;accumulent :&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;Contrôle de visibilité.&lt;/strong&gt; Vous pouvez rendre un outil visible uniquement pour le LLM, uniquement pour l&amp;rsquo;UI de l&amp;rsquo;hôte, ou les deux. Vous voulez un outil qui ne fait que rendre de l&amp;rsquo;UI et ne devrait pas être appelé par le modèle ? Facile :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithVisibility&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;McpVisibility&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;App&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// UI-only, hidden from the model&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="pour-commencer"&gt;Pour commencer&lt;/h2&gt;
&lt;p&gt;Ajoutez le package preview :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dotnet add package Microsoft.Azure.Functions.Worker.Extensions.Mcp --version 1.5.0-preview.1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Si vous construisez déjà des outils MCP avec Azure Functions, c&amp;rsquo;est juste une mise à jour de package. Le &lt;a href="https://learn.microsoft.com/azure/azure-functions/scenario-mcp-apps?tabs=bash%2Clinux&amp;amp;pivots=programming-language-csharp"&gt;quickstart MCP Apps&lt;/a&gt; est le meilleur point de départ si vous découvrez le concept.&lt;/p&gt;
&lt;h2 id="pour-conclure"&gt;Pour conclure&lt;/h2&gt;
&lt;p&gt;Les MCP Apps sont l&amp;rsquo;un des développements les plus passionnants dans l&amp;rsquo;espace des outils IA — des outils qui ne font pas que &lt;em&gt;faire des choses&lt;/em&gt; mais peuvent aussi &lt;em&gt;montrer des choses&lt;/em&gt; aux utilisateurs. L&amp;rsquo;API fluide supprime la complexité du protocole et vous permet de vous concentrer sur l&amp;rsquo;essentiel : la logique de votre outil et son interface.&lt;/p&gt;
&lt;p&gt;Lisez le &lt;a href="https://devblogs.microsoft.com/azure-sdk/mcp-as-easy-as-1-2-3-introducing-the-fluent-api-for-mcp-apps/"&gt;post complet&lt;/a&gt; pour la référence complète de l&amp;rsquo;API et des exemples.&lt;/p&gt;</content:encoded></item><item><title>Microsoft Foundry Mars 2026 — GPT-5.4, Agent Service en GA et la Refonte du SDK Qui Change Tout</title><link>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/microsoft-foundry-march-2026-whats-new/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/microsoft-foundry-march-2026-whats-new/</guid><description>La mise à jour de mars 2026 de Microsoft Foundry est massive : Agent Service passe en GA, GPT-5.4 apporte un raisonnement fiable, le SDK azure-ai-projects se stabilise dans tous les langages, et Fireworks AI amène les modèles ouverts sur Azure.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Cet article a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/microsoft-foundry-march-2026-whats-new/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Les posts mensuels « Quoi de neuf dans Microsoft Foundry » sont généralement un mélange d&amp;rsquo;améliorations incrémentales et de fonctionnalités phares occasionnelles. L&amp;rsquo;&lt;a href="https://devblogs.microsoft.com/foundry/whats-new-in-microsoft-foundry-mar-2026/"&gt;édition de mars 2026&lt;/a&gt; ? C&amp;rsquo;est pratiquement que des fonctionnalités phares. Foundry Agent Service passe en GA, GPT-5.4 arrive en production, le SDK reçoit une version stable majeure, et Fireworks AI apporte l&amp;rsquo;inférence de modèles ouverts sur Azure. Voyons ce qui compte pour les développeurs .NET.&lt;/p&gt;
&lt;h2 id="foundry-agent-service-est-prêt-pour-la-production"&gt;Foundry Agent Service est prêt pour la production&lt;/h2&gt;
&lt;p&gt;C&amp;rsquo;est la grande nouvelle. Le runtime d&amp;rsquo;agents de nouvelle génération est en disponibilité générale — construit sur l&amp;rsquo;API Responses d&amp;rsquo;OpenAI, compatible au niveau du protocole avec les agents OpenAI, et ouvert aux modèles de plusieurs fournisseurs. Si vous construisez avec l&amp;rsquo;API Responses aujourd&amp;rsquo;hui, migrer vers Foundry ajoute la sécurité entreprise, le réseau privé, le RBAC Entra, le traçage complet et l&amp;rsquo;évaluation par-dessus votre logique d&amp;rsquo;agent existante.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;azure.ai.projects&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AIProjectClient&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;azure.ai.projects.models&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;PromptAgentDefinition&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;project_client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AIProjectClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;endpoint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;AZURE_AI_PROJECT_ENDPOINT&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;credential&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;DefaultAzureCredential&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;project_client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;agents&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create_version&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;agent_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;my-enterprise-agent&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;definition&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;PromptAgentDefinition&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;AZURE_AI_MODEL_DEPLOYMENT_NAME&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;You are a helpful assistant.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ajouts clés : réseau privé de bout en bout, extension de l&amp;rsquo;authentification MCP (y compris le passthrough OAuth), aperçu de Voice Live pour les agents voix-à-voix, et agents hébergés dans 6 nouvelles régions.&lt;/p&gt;
&lt;h2 id="gpt-54--la-fiabilité-plutôt-que-lintelligence-brute"&gt;GPT-5.4 — la fiabilité plutôt que l&amp;rsquo;intelligence brute&lt;/h2&gt;
&lt;p&gt;GPT-5.4 n&amp;rsquo;est pas question d&amp;rsquo;être plus intelligent. C&amp;rsquo;est une question de fiabilité. Un raisonnement plus solide sur de longues interactions, une meilleure adhérence aux instructions, moins d&amp;rsquo;échecs en cours de workflow, et des capacités intégrées d&amp;rsquo;utilisation d&amp;rsquo;ordinateur. Pour les agents en production, cette fiabilité compte bien plus que les scores de benchmarks.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Modèle&lt;/th&gt;
&lt;th&gt;Tarif (par M tokens)&lt;/th&gt;
&lt;th&gt;Idéal pour&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.4 (≤272K)&lt;/td&gt;
&lt;td&gt;$2.50 / $15 sortie&lt;/td&gt;
&lt;td&gt;Agents en production, code, workflows documentaires&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.4 Pro&lt;/td&gt;
&lt;td&gt;$30 / $180 sortie&lt;/td&gt;
&lt;td&gt;Analyse approfondie, raisonnement scientifique&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.4 Mini&lt;/td&gt;
&lt;td&gt;Économique&lt;/td&gt;
&lt;td&gt;Classification, extraction, appels d&amp;rsquo;outils légers&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;La stratégie intelligente est le routage : GPT-5.4 Mini gère le travail à haut volume et faible latence tandis que GPT-5.4 prend les requêtes nécessitant un raisonnement intensif.&lt;/p&gt;
&lt;h2 id="le-sdk-est-enfin-stable"&gt;Le SDK est enfin stable&lt;/h2&gt;
&lt;p&gt;Le SDK &lt;code&gt;azure-ai-projects&lt;/code&gt; a publié des versions stables dans tous les langages — Python 2.0.0, JS/TS 2.0.0, Java 2.0.0, et .NET 2.0.0 (1er avril). La dépendance &lt;code&gt;azure-ai-agents&lt;/code&gt; a disparu — tout vit sous &lt;code&gt;AIProjectClient&lt;/code&gt;. Installez avec &lt;code&gt;pip install azure-ai-projects&lt;/code&gt; et le paquet inclut &lt;code&gt;openai&lt;/code&gt; et &lt;code&gt;azure-identity&lt;/code&gt; comme dépendances directes.&lt;/p&gt;
&lt;p&gt;Pour les développeurs .NET, cela signifie un seul paquet NuGet pour toute la surface Foundry. Fini le jonglage entre des SDKs d&amp;rsquo;agents séparés.&lt;/p&gt;
&lt;h2 id="fireworks-ai-amène-les-modèles-ouverts-sur-azure"&gt;Fireworks AI amène les modèles ouverts sur Azure&lt;/h2&gt;
&lt;p&gt;Peut-être l&amp;rsquo;ajout le plus intéressant architecturalement : Fireworks AI traitant plus de 13 billions de tokens par jour à ~180K requêtes/seconde, maintenant disponible via Foundry. DeepSeek V3.2, gpt-oss-120b, Kimi K2.5, et MiniMax M2.5 au lancement.&lt;/p&gt;
&lt;p&gt;La vraie histoire est le &lt;strong&gt;bring-your-own-weights&lt;/strong&gt; — téléchargez des poids quantifiés ou fine-tunés depuis n&amp;rsquo;importe où sans changer la pile de service. Déployez en mode serverless pay-per-token ou en débit provisionné.&lt;/p&gt;
&lt;h2 id="autres-points-forts"&gt;Autres points forts&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Phi-4 Reasoning Vision 15B&lt;/strong&gt; — raisonnement multimodal pour graphiques, diagrammes et mises en page de documents&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Evaluations GA&lt;/strong&gt; — évaluateurs prêts à l&amp;rsquo;emploi avec surveillance continue de production intégrée à Azure Monitor&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Priority Processing&lt;/strong&gt; (Preview) — voie de calcul dédiée pour les charges de travail sensibles à la latence&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Voice Live&lt;/strong&gt; — runtime voix-à-voix connecté directement aux agents Foundry&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tracing GA&lt;/strong&gt; — inspection de bout en bout des traces d&amp;rsquo;agents avec tri et filtrage&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dépréciation de PromptFlow&lt;/strong&gt; — migration vers Microsoft Framework Workflows d&amp;rsquo;ici janvier 2027&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Mars 2026 est un tournant pour Foundry. Agent Service en GA, SDKs stables dans tous les langages, GPT-5.4 pour des agents de production fiables, et inférence de modèles ouverts via Fireworks AI — la plateforme est prête pour des charges de travail sérieuses.&lt;/p&gt;
&lt;p&gt;Lisez le &lt;a href="https://devblogs.microsoft.com/foundry/whats-new-in-microsoft-foundry-mar-2026/"&gt;récapitulatif complet&lt;/a&gt; et &lt;a href="https://learn.microsoft.com/azure/foundry/quickstarts/get-started-code"&gt;créez votre premier agent&lt;/a&gt; pour commencer.&lt;/p&gt;</content:encoded></item><item><title>SQL MCP Server — La bonne façon de donner accès aux bases de données aux agents IA</title><link>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/sql-mcp-server-data-api-builder/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/sql-mcp-server-data-api-builder/</guid><description>SQL MCP Server de Data API builder donne aux agents IA un accès sécurisé et déterministe aux bases de données sans exposer les schémas ni dépendre de NL2SQL. RBAC, cache, support multi-bases — tout est intégré.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Cet article a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/sql-mcp-server-data-api-builder/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Soyons honnêtes : la plupart des serveurs MCP de bases de données disponibles aujourd&amp;rsquo;hui sont effrayants. Ils prennent une requête en langage naturel, génèrent du SQL à la volée et l&amp;rsquo;exécutent contre vos données de production. Qu&amp;rsquo;est-ce qui pourrait mal tourner ? (Tout. Absolument tout.)&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;équipe Azure SQL vient de &lt;a href="https://devblogs.microsoft.com/azure-sql/introducing-sql-mcp-server/"&gt;présenter SQL MCP Server&lt;/a&gt;, et il adopte une approche fondamentalement différente. Construit comme une fonctionnalité de Data API builder (DAB) 2.0, il donne aux agents IA un accès structuré et déterministe aux opérations de base de données — sans NL2SQL, sans exposer votre schéma, et avec un RBAC complet à chaque étape.&lt;/p&gt;
&lt;h2 id="pourquoi-pas-de-nl2sql-"&gt;Pourquoi pas de NL2SQL ?&lt;/h2&gt;
&lt;p&gt;C&amp;rsquo;est la décision de conception la plus intéressante. Les modèles ne sont pas déterministes, et les requêtes complexes sont les plus susceptibles de produire des erreurs subtiles. Les requêtes exactes que les utilisateurs espèrent que l&amp;rsquo;IA peut générer sont aussi celles qui nécessitent le plus de vérification quand elles sont produites de manière non déterministe.&lt;/p&gt;
&lt;p&gt;À la place, SQL MCP Server utilise une approche &lt;strong&gt;NL2DAB&lt;/strong&gt;. L&amp;rsquo;agent travaille avec la couche d&amp;rsquo;abstraction d&amp;rsquo;entités de Data API builder et son constructeur de requêtes intégré pour produire du T-SQL précis et bien formé de manière déterministe. Même résultat pour l&amp;rsquo;utilisateur, mais sans le risque de JOINs hallucinés ou d&amp;rsquo;exposition accidentelle de données.&lt;/p&gt;
&lt;h2 id="sept-outils-pas-sept-cents"&gt;Sept outils, pas sept cents&lt;/h2&gt;
&lt;p&gt;SQL MCP Server expose exactement sept outils DML, quelle que soit la taille de la base de données :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;describe_entities&lt;/code&gt; — découvrir les entités et opérations disponibles&lt;/li&gt;
&lt;li&gt;&lt;code&gt;create_record&lt;/code&gt; — insérer des lignes&lt;/li&gt;
&lt;li&gt;&lt;code&gt;read_records&lt;/code&gt; — interroger des tables et vues&lt;/li&gt;
&lt;li&gt;&lt;code&gt;update_record&lt;/code&gt; — modifier des lignes&lt;/li&gt;
&lt;li&gt;&lt;code&gt;delete_record&lt;/code&gt; — supprimer des lignes&lt;/li&gt;
&lt;li&gt;&lt;code&gt;execute_entity&lt;/code&gt; — exécuter des procédures stockées&lt;/li&gt;
&lt;li&gt;&lt;code&gt;aggregate_records&lt;/code&gt; — requêtes d&amp;rsquo;agrégation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;C&amp;rsquo;est malin, car les fenêtres de contexte sont l&amp;rsquo;espace de réflexion de l&amp;rsquo;agent. Les inonder de centaines de définitions d&amp;rsquo;outils laisse moins de place au raisonnement. Sept outils fixes gardent l&amp;rsquo;agent concentré sur la &lt;em&gt;réflexion&lt;/em&gt; plutôt que la &lt;em&gt;navigation&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Chaque outil peut être activé ou désactivé individuellement :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;runtime&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;mcp&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;enabled&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;path&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/mcp&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;dml-tools&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;describe-entities&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;create-record&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;read-records&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;update-record&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;delete-record&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;execute-entity&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;aggregate-records&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="démarrage-en-trois-commandes"&gt;Démarrage en trois commandes&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dab init &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --database-type mssql &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --connection-string &lt;span class="s2"&gt;&amp;#34;@env(&amp;#39;sql_connection_string&amp;#39;)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dab add Customers &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --source dbo.Customers &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --permissions &lt;span class="s2"&gt;&amp;#34;anonymous:*&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dab start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Voilà un SQL MCP Server en fonctionnement qui expose votre table Customers. La couche d&amp;rsquo;abstraction d&amp;rsquo;entités vous permet de créer des alias pour les noms et colonnes, de limiter les champs par rôle et de contrôler exactement ce que les agents voient — sans exposer les détails internes du schéma.&lt;/p&gt;
&lt;h2 id="laspect-sécurité-est-solide"&gt;L&amp;rsquo;aspect sécurité est solide&lt;/h2&gt;
&lt;p&gt;C&amp;rsquo;est là que la maturité de Data API builder porte ses fruits :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RBAC à chaque couche&lt;/strong&gt; — chaque entité définit quels rôles peuvent lire, créer, mettre à jour ou supprimer, et quels champs sont visibles&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Intégration Azure Key Vault&lt;/strong&gt; — chaînes de connexion et secrets gérés de manière sécurisée&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Microsoft Entra + OAuth personnalisé&lt;/strong&gt; — authentification de niveau production&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Content Security Policy&lt;/strong&gt; — les agents interagissent via un contrat contrôlé, pas du SQL brut&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;L&amp;rsquo;abstraction du schéma est particulièrement importante. Vos noms internes de tables et colonnes ne sont jamais exposés à l&amp;rsquo;agent. Vous définissez des entités, des alias et des descriptions qui ont du sens pour l&amp;rsquo;interaction IA — pas votre diagramme ERD de base de données.&lt;/p&gt;
&lt;h2 id="multi-bases-et-multi-protocoles"&gt;Multi-bases et multi-protocoles&lt;/h2&gt;
&lt;p&gt;SQL MCP Server supporte Microsoft SQL, PostgreSQL, Azure Cosmos DB et MySQL. Et comme c&amp;rsquo;est une fonctionnalité de DAB, vous obtenez des endpoints REST, GraphQL et MCP simultanément depuis la même configuration. Mêmes définitions d&amp;rsquo;entités, mêmes règles RBAC, même sécurité — sur les trois protocoles.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;auto-configuration dans DAB 2.0 peut même inspecter votre base de données et construire la configuration dynamiquement, si vous êtes à l&amp;rsquo;aise avec moins d&amp;rsquo;abstraction pour du prototypage rapide.&lt;/p&gt;
&lt;h2 id="mon-avis"&gt;Mon avis&lt;/h2&gt;
&lt;p&gt;C&amp;rsquo;est ainsi que l&amp;rsquo;accès base de données d&amp;rsquo;entreprise pour les agents IA devrait fonctionner. Pas « hey LLM, écris-moi du SQL et YOLO sur la prod ». À la place : une couche d&amp;rsquo;entités bien définie, une génération de requêtes déterministe, RBAC à chaque étape, cache, monitoring et télémétrie. C&amp;rsquo;est ennuyeux de la meilleure façon possible.&lt;/p&gt;
&lt;p&gt;Pour les développeurs .NET, l&amp;rsquo;histoire d&amp;rsquo;intégration est propre — DAB est un outil .NET, le MCP Server tourne en conteneur, et il fonctionne avec Azure SQL, que la plupart d&amp;rsquo;entre nous utilisent déjà. Si vous construisez des agents IA qui ont besoin d&amp;rsquo;accéder aux données, commencez ici.&lt;/p&gt;
&lt;h2 id="pour-conclure"&gt;Pour conclure&lt;/h2&gt;
&lt;p&gt;SQL MCP Server est gratuit, open-source et tourne partout. C&amp;rsquo;est l&amp;rsquo;approche prescriptive de Microsoft pour donner aux agents IA un accès sécurisé aux bases de données. Consultez le &lt;a href="https://devblogs.microsoft.com/azure-sql/introducing-sql-mcp-server/"&gt;post complet&lt;/a&gt; et la &lt;a href="https://aka.ms/sql/mcp"&gt;documentation&lt;/a&gt; pour commencer.&lt;/p&gt;</content:encoded></item><item><title>VS Code 1.116 — L'App Agents Obtient la Navigation Clavier et les Complétions de Contexte de Fichiers</title><link>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/vscode-1-116-agents-app-updates/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/vscode-1-116-agents-app-updates/</guid><description>VS Code 1.116 se concentre sur le polissage de l'app Agents — raccourcis clavier dédiés, améliorations d'accessibilité, complétions de contexte de fichiers et résolution de liens CSS @import.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Cet article a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/vscode-1-116-agents-app-updates/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;VS Code 1.116 est la version d&amp;rsquo;avril 2026, et bien qu&amp;rsquo;elle soit plus légère que certaines mises à jour récentes, les changements sont ciblés et significatifs — surtout si vous utilisez l&amp;rsquo;app Agents au quotidien.&lt;/p&gt;
&lt;p&gt;Voici ce qui a atterri, d&amp;rsquo;après les &lt;a href="https://code.visualstudio.com/updates/v1_116"&gt;notes de version officielles&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="améliorations-de-lapp-agents"&gt;Améliorations de l&amp;rsquo;app Agents&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;app Agents continue de mûrir avec un polissage de l&amp;rsquo;ergonomie qui fait une vraie différence dans les flux de travail quotidiens :&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Raccourcis clavier dédiés&lt;/strong&gt; — vous pouvez maintenant cibler la vue Changes, l&amp;rsquo;arborescence de fichiers dans Changes, et la vue des Personnalisations du Chat avec des commandes et raccourcis clavier dédiés. Si vous cliquiez partout dans l&amp;rsquo;app Agents pour naviguer, cela apporte des flux de travail entièrement pilotés au clavier.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dialogue d&amp;rsquo;aide à l&amp;rsquo;accessibilité&lt;/strong&gt; — appuyer sur &lt;code&gt;Alt+F1&lt;/code&gt; dans la zone de saisie du chat ouvre maintenant un dialogue d&amp;rsquo;aide à l&amp;rsquo;accessibilité montrant les commandes et raccourcis disponibles. Les utilisateurs de lecteurs d&amp;rsquo;écran peuvent aussi contrôler la verbosité des annonces. Une bonne accessibilité profite à tout le monde.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Complétions de contexte de fichiers&lt;/strong&gt; — tapez &lt;code&gt;#&lt;/code&gt; dans le chat de l&amp;rsquo;app Agents pour déclencher les complétions de contexte de fichiers limitées à votre espace de travail actuel. C&amp;rsquo;est une de ces petites améliorations de qualité de vie qui accélèrent chaque interaction — plus besoin de taper des chemins de fichiers complets en référençant du code.&lt;/p&gt;
&lt;h2 id="résolution-des-liens-css-import"&gt;Résolution des liens CSS &lt;code&gt;@import&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Agréable pour les développeurs frontend : VS Code résout maintenant les références CSS &lt;code&gt;@import&lt;/code&gt; qui utilisent des chemins node_modules. Vous pouvez faire &lt;code&gt;Ctrl+clic&lt;/code&gt; à travers des imports comme &lt;code&gt;@import &amp;quot;some-module/style.css&amp;quot;&lt;/code&gt; en utilisant des bundlers. Petit mais élimine un point de friction dans les workflows CSS.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;VS Code 1.116 est une affaire de raffinement — rendre l&amp;rsquo;app Agents plus navigable, plus accessible et plus conviviale au clavier. Si vous passez beaucoup de temps dans l&amp;rsquo;app Agents (et je soupçonne que beaucoup d&amp;rsquo;entre nous le font), ces changements s&amp;rsquo;accumulent.&lt;/p&gt;
&lt;p&gt;Consultez les &lt;a href="https://code.visualstudio.com/updates/v1_116"&gt;notes de version complètes&lt;/a&gt; pour la liste exhaustive.&lt;/p&gt;</content:encoded></item><item><title>VS Code 1.115 — Notifications de Terminal en Arrière-plan, Mode Agent SSH et Plus</title><link>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/vscode-1-115-agent-improvements/</link><pubDate>Mon, 06 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/vscode-1-115-agent-improvements/</guid><description>VS Code 1.115 apporte les notifications de terminal en arrière-plan pour les agents, l'hébergement d'agents distants via SSH, le collage de fichiers dans les terminaux et le suivi des modifications avec reconnaissance de session. Voici ce qui compte pour les développeurs .NET.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Cet article a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/vscode-1-115-agent-improvements/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;VS Code 1.115 vient de &lt;a href="https://code.visualstudio.com/updates/v1_115"&gt;sortir&lt;/a&gt;, et bien que ce soit une version plus légère en termes de fonctionnalités phares, les améliorations liées aux agents sont vraiment utiles si vous travaillez quotidiennement avec des assistants de code IA.&lt;/p&gt;
&lt;p&gt;Permettez-moi de souligner ce qui vaut vraiment la peine d&amp;rsquo;être connu.&lt;/p&gt;
&lt;h2 id="les-terminaux-en-arrière-plan-communiquent-avec-les-agents"&gt;Les terminaux en arrière-plan communiquent avec les agents&lt;/h2&gt;
&lt;p&gt;C&amp;rsquo;est la fonctionnalité vedette. Les terminaux en arrière-plan notifient désormais automatiquement les agents lorsque les commandes se terminent, y compris le code de sortie et la sortie du terminal. Les invites de saisie dans les terminaux en arrière-plan sont également détectées et présentées à l&amp;rsquo;utilisateur.&lt;/p&gt;
&lt;p&gt;Pourquoi est-ce important ? Si vous avez utilisé le mode agent de Copilot pour exécuter des commandes de build ou des suites de tests en arrière-plan, vous connaissez la frustration du &amp;ldquo;est-ce que c&amp;rsquo;est fini ?&amp;rdquo; — les terminaux en arrière-plan étaient essentiellement du fire-and-forget. Maintenant l&amp;rsquo;agent est notifié quand votre &lt;code&gt;dotnet build&lt;/code&gt; ou &lt;code&gt;dotnet test&lt;/code&gt; se termine, voit la sortie et peut réagir en conséquence. C&amp;rsquo;est un petit changement qui rend les workflows pilotés par les agents nettement plus fiables.&lt;/p&gt;
&lt;p&gt;Il y a aussi un nouvel outil &lt;code&gt;send_to_terminal&lt;/code&gt; qui permet aux agents d&amp;rsquo;envoyer des commandes aux terminaux en arrière-plan avec confirmation de l&amp;rsquo;utilisateur, corrigeant le problème où &lt;code&gt;run_in_terminal&lt;/code&gt; avec un timeout déplaçait les terminaux en arrière-plan et les rendait en lecture seule.&lt;/p&gt;
&lt;h2 id="hébergement-dagents-distants-via-ssh"&gt;Hébergement d&amp;rsquo;agents distants via SSH&lt;/h2&gt;
&lt;p&gt;VS Code prend désormais en charge la connexion à des machines distantes via SSH, en installant automatiquement le CLI et en le démarrant en mode hôte d&amp;rsquo;agents. Cela signifie que vos sessions d&amp;rsquo;agents IA peuvent cibler directement des environnements distants — utile pour les développeurs .NET qui compilent et testent sur des serveurs Linux ou des VMs cloud.&lt;/p&gt;
&lt;h2 id="suivi-des-modifications-dans-les-sessions-dagents"&gt;Suivi des modifications dans les sessions d&amp;rsquo;agents&lt;/h2&gt;
&lt;p&gt;Les modifications de fichiers effectuées pendant les sessions d&amp;rsquo;agents sont désormais suivies et restaurées, avec des diffs, annuler/rétablir et restauration d&amp;rsquo;état. Si un agent modifie votre code et que quelque chose tourne mal, vous pouvez voir exactement ce qui a changé et le reverter. La tranquillité d&amp;rsquo;esprit pour laisser les agents modifier votre codebase.&lt;/p&gt;
&lt;h2 id="reconnaissance-des-onglets-du-navigateur-et-autres-améliorations"&gt;Reconnaissance des onglets du navigateur et autres améliorations&lt;/h2&gt;
&lt;p&gt;Quelques ajouts supplémentaires de qualité de vie :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Suivi des onglets du navigateur&lt;/strong&gt; — le chat peut désormais suivre et lier les onglets du navigateur ouverts pendant une session, pour que les agents puissent référencer les pages web que vous consultez&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Collage de fichiers dans le terminal&lt;/strong&gt; — collez des fichiers (y compris des images) dans le terminal avec Ctrl+V, glisser-déposer ou clic droit&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Couverture de tests dans la minimap&lt;/strong&gt; — les indicateurs de couverture de tests s&amp;rsquo;affichent désormais dans la minimap pour un aperçu visuel rapide&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pinch-to-zoom sur Mac&lt;/strong&gt; — le navigateur intégré prend en charge les gestes de pinch-to-zoom&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Droits Copilot dans les Sessions&lt;/strong&gt; — la barre d&amp;rsquo;état affiche les informations d&amp;rsquo;utilisation dans la vue Sessions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Favicon dans Aller au Fichier&lt;/strong&gt; — les pages web ouvertes affichent des favicons dans la liste de sélection rapide&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="pour-conclure"&gt;Pour conclure&lt;/h2&gt;
&lt;p&gt;VS Code 1.115 est une version incrémentale, mais les améliorations des agents — notifications de terminal en arrière-plan, hébergement d&amp;rsquo;agents SSH et suivi des modifications — contribuent à une expérience nettement plus fluide pour le développement assisté par IA. Si vous utilisez le mode agent de Copilot pour des projets .NET, ce sont le genre d&amp;rsquo;améliorations de qualité de vie qui réduisent les frictions au quotidien.&lt;/p&gt;
&lt;p&gt;Consultez les &lt;a href="https://code.visualstudio.com/updates/v1_115"&gt;notes de version complètes&lt;/a&gt; pour tous les détails.&lt;/p&gt;</content:encoded></item><item><title>C# 15 intègre les types union — et c'est exactement ce qu'on demandait</title><link>https://thedotnetblog.com/fr/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/fr/posts/emiliano-montesdeoca/csharp-15-union-types-exhaustive-matching/</guid><description>C# 15 introduit le mot-clé union — des unions discriminées avec du pattern matching exhaustif imposé par le compilateur. Voici à quoi ça ressemble, pourquoi c'est important, et comment les essayer dès aujourd'hui.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Cet article a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/csharp-15-union-types-exhaustive-matching/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;C&amp;rsquo;est celle que j&amp;rsquo;attendais. C# 15 introduit le mot-clé &lt;code&gt;union&lt;/code&gt; — de vraies unions discriminées avec du pattern matching exhaustif imposé par le compilateur. Si vous avez déjà envié les unions discriminées de F# ou les enums de Rust, vous savez exactement pourquoi c&amp;rsquo;est important.&lt;/p&gt;
&lt;p&gt;Bill Wagner a &lt;a href="https://devblogs.microsoft.com/dotnet/csharp-15-union-types/"&gt;publié l&amp;rsquo;analyse approfondie&lt;/a&gt; sur le blog .NET, et franchement ? Le design est propre, pratique et très C#. Laissez-moi vous montrer ce qu&amp;rsquo;il y a vraiment et pourquoi c&amp;rsquo;est plus important qu&amp;rsquo;il n&amp;rsquo;y paraît à première vue.&lt;/p&gt;
&lt;h2 id="le-problème-que-les-unions-résolvent"&gt;Le problème que les unions résolvent&lt;/h2&gt;
&lt;p&gt;Avant C# 15, retourner &amp;ldquo;l&amp;rsquo;un des plusieurs types possibles&amp;rdquo; depuis une méthode était toujours un compromis :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;object&lt;/code&gt;&lt;/strong&gt; — pas de contraintes, pas d&amp;rsquo;aide du compilateur, du casting défensif partout&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Interfaces marqueurs&lt;/strong&gt; — mieux, mais n&amp;rsquo;importe qui peut les implémenter. Le compilateur ne peut jamais considérer l&amp;rsquo;ensemble comme complet&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Classes de base abstraites&lt;/strong&gt; — même problème, en plus les types ont besoin d&amp;rsquo;un ancêtre commun&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Aucune de ces solutions ne vous donne ce que vous voulez vraiment : un ensemble fermé de types où le compilateur garantit que vous avez géré chaque cas. C&amp;rsquo;est ce que font les types union.&lt;/p&gt;
&lt;h2 id="la-syntaxe-est-dune-simplicité-élégante"&gt;La syntaxe est d&amp;rsquo;une simplicité élégante&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;Une ligne. &lt;code&gt;Pet&lt;/code&gt; peut contenir un &lt;code&gt;Cat&lt;/code&gt;, un &lt;code&gt;Dog&lt;/code&gt; ou un &lt;code&gt;Bird&lt;/code&gt;. Les conversions implicites sont générées automatiquement :&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;Et voici la magie — le compilateur impose le matching exhaustif :&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;Pas besoin de discard &lt;code&gt;_&lt;/code&gt;. Le compilateur sait que ce switch couvre tous les cas possibles. Si vous ajoutez plus tard un quatrième type à l&amp;rsquo;union, chaque expression switch qui ne le gère pas produit un avertissement. Les cas manquants détectés au moment de la compilation, pas à l&amp;rsquo;exécution.&lt;/p&gt;
&lt;h2 id="là-où-ça-devient-pratique"&gt;Là où ça devient pratique&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;exemple de &lt;code&gt;Pet&lt;/code&gt; est mignon, mais c&amp;rsquo;est ici que les unions brillent vraiment dans du vrai code.&lt;/p&gt;
&lt;h3 id="des-réponses-api-qui-retournent-différentes-formes"&gt;Des réponses API qui retournent différentes 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;Maintenant chaque consommateur est obligé de gérer le succès, l&amp;rsquo;erreur et l&amp;rsquo;échec de validation. Plus de bugs &amp;ldquo;j&amp;rsquo;ai oublié de vérifier le cas d&amp;rsquo;erreur&amp;rdquo;.&lt;/p&gt;
&lt;h3 id="valeur-unique-ou-collection"&gt;Valeur unique ou collection&lt;/h3&gt;
&lt;p&gt;Le pattern &lt;code&gt;OneOrMore&amp;lt;T&amp;gt;&lt;/code&gt; montre comment les unions peuvent avoir un corps avec des méthodes utilitaires :&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 appelants passent la forme qui leur convient :&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="composer-des-types-sans-relation"&gt;Composer des types sans relation&lt;/h3&gt;
&lt;p&gt;C&amp;rsquo;est la fonctionnalité décisive par rapport aux hiérarchies traditionnelles. Vous pouvez unir des types qui n&amp;rsquo;ont rien en commun — &lt;code&gt;string&lt;/code&gt; et &lt;code&gt;Exception&lt;/code&gt;, &lt;code&gt;int&lt;/code&gt; et &lt;code&gt;IEnumerable&amp;lt;T&amp;gt;&lt;/code&gt;. Pas besoin d&amp;rsquo;ancêtre commun.&lt;/p&gt;
&lt;h2 id="unions-personnalisées-pour-les-bibliothèques-existantes"&gt;Unions personnalisées pour les bibliothèques existantes&lt;/h2&gt;
&lt;p&gt;Voici un choix de design intelligent : toute classe ou struct avec un attribut &lt;code&gt;[Union]&lt;/code&gt; est reconnue comme un type union, tant qu&amp;rsquo;elle suit le pattern de base (constructeurs publics pour les types de cas et une propriété &lt;code&gt;Value&lt;/code&gt;). Les bibliothèques comme OneOf qui fournissent déjà des types similaires aux unions peuvent opter pour le support du compilateur sans réécrire leurs internals.&lt;/p&gt;
&lt;p&gt;Pour les scénarios sensibles à la performance avec des types valeur, les bibliothèques peuvent implémenter un pattern d&amp;rsquo;accès sans boxing avec les méthodes &lt;code&gt;HasValue&lt;/code&gt; et &lt;code&gt;TryGetValue&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="la-vision-densemble"&gt;La vision d&amp;rsquo;ensemble&lt;/h2&gt;
&lt;p&gt;Les types union font partie d&amp;rsquo;une histoire plus large d&amp;rsquo;exhaustivité qui arrive en C# :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Types union&lt;/strong&gt; — matching exhaustif sur un ensemble fermé de types (disponible maintenant en preview)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hiérarchies fermées&lt;/strong&gt; — le modificateur &lt;code&gt;closed&lt;/code&gt; empêche les classes dérivées en dehors de l&amp;rsquo;assembly de définition (proposé)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enums fermés&lt;/strong&gt; — empêche la création de valeurs autres que les membres déclarés (proposé)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ensemble, ces trois fonctionnalités donneront à C# l&amp;rsquo;un des systèmes de pattern matching typé les plus complets de tous les langages mainstream.&lt;/p&gt;
&lt;h2 id="essayez-les-aujourdhui"&gt;Essayez-les aujourd&amp;rsquo;hui&lt;/h2&gt;
&lt;p&gt;Les types union sont disponibles dans .NET 11 Preview 2 :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Installez le &lt;a href="https://dotnet.microsoft.com/download/dotnet"&gt;SDK .NET 11 Preview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Ciblez &lt;code&gt;net11.0&lt;/code&gt; dans votre projet&lt;/li&gt;
&lt;li&gt;Définissez &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;Une mise en garde : dans Preview 2, vous devrez déclarer &lt;code&gt;UnionAttribute&lt;/code&gt; et &lt;code&gt;IUnion&lt;/code&gt; dans votre projet car ils ne sont pas encore dans le runtime. Récupérez &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; depuis le repo docs, ou ajoutez ceci :&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="pour-conclure"&gt;Pour conclure&lt;/h2&gt;
&lt;p&gt;Les types union sont une de ces fonctionnalités qui vous font vous demander comment on a pu s&amp;rsquo;en passer. Du matching exhaustif imposé par le compilateur, une syntaxe propre, le support des génériques et l&amp;rsquo;intégration avec le pattern matching existant — c&amp;rsquo;est tout ce qu&amp;rsquo;on demandait, fait à la manière C#.&lt;/p&gt;
&lt;p&gt;Essayez-les dans .NET 11 Preview 2, cassez des trucs et &lt;a href="https://github.com/dotnet/csharplang/discussions/9663"&gt;partagez vos retours sur GitHub&lt;/a&gt;. C&amp;rsquo;est une preview, et l&amp;rsquo;équipe C# écoute activement. Vos cas limites et retours de design façonneront la version finale.&lt;/p&gt;
&lt;p&gt;Pour la référence complète du langage, consultez la &lt;a href="https://learn.microsoft.com/dotnet/csharp/language-reference/builtin-types/union"&gt;documentation des types union&lt;/a&gt; et la &lt;a href="https://learn.microsoft.com/dotnet/csharp/language-reference/proposals/unions"&gt;spécification de la fonctionnalité&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Aspire 13.2 embarque une CLI de documentation — et votre agent IA peut l'utiliser aussi</title><link>https://thedotnetblog.com/fr/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/fr/posts/emiliano-montesdeoca/aspire-docs-cli-ai-skills/</guid><description>.NET Aspire 13.2 ajoute aspire docs — une CLI pour rechercher, parcourir et lire la documentation officielle sans quitter votre terminal. Elle fonctionne aussi comme outil pour les agents IA. Voici pourquoi c'est important.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Cet article a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/aspire-docs-cli-ai-skills/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Vous connaissez ce moment où vous êtes plongé dans un Aspire AppHost, en train de câbler des intégrations, et vous devez vérifier exactement quels paramètres l&amp;rsquo;intégration Redis attend ? Vous faites alt-tab vers votre navigateur, vous cherchez sur aspire.dev, vous plissez les yeux sur les docs de l&amp;rsquo;API, puis vous revenez à votre éditeur. Contexte perdu. Flow brisé.&lt;/p&gt;
&lt;p&gt;Aspire 13.2 vient de &lt;a href="https://devblogs.microsoft.com/aspire/aspire-docs-in-your-terminal/"&gt;livrer une solution à ça&lt;/a&gt;. La CLI &lt;code&gt;aspire docs&lt;/code&gt; vous permet de rechercher, parcourir et lire la documentation officielle d&amp;rsquo;Aspire directement depuis votre terminal. Et comme elle s&amp;rsquo;appuie sur des services réutilisables, les agents IA et les skills peuvent utiliser les mêmes commandes pour consulter la doc au lieu d&amp;rsquo;halluciner des APIs qui n&amp;rsquo;existent pas.&lt;/p&gt;
&lt;h2 id="le-problème-que-ça-résout-vraiment"&gt;Le problème que ça résout vraiment&lt;/h2&gt;
&lt;p&gt;David Pine le dit parfaitement dans le post original : les agents IA étaient &lt;em&gt;catastrophiques&lt;/em&gt; pour aider les développeurs à construire des apps Aspire. Ils recommandaient &lt;code&gt;dotnet run&lt;/code&gt; au lieu de &lt;code&gt;aspire run&lt;/code&gt;, référençaient learn.microsoft.com pour des docs qui se trouvent sur aspire.dev, suggéraient des packages NuGet obsolètes, et — mon préféré — hallucinaient des APIs inexistantes.&lt;/p&gt;
&lt;p&gt;Pourquoi ? Parce qu&amp;rsquo;Aspire a été spécifique à .NET bien plus longtemps qu&amp;rsquo;il n&amp;rsquo;est polyglotte, et les LLMs travaillent avec des données d&amp;rsquo;entraînement qui précèdent les dernières fonctionnalités. Quand vous donnez à un agent IA la capacité de consulter les docs actuels, il arrête de deviner et commence à être utile.&lt;/p&gt;
&lt;h2 id="trois-commandes-zéro-onglet-de-navigateur"&gt;Trois commandes, zéro onglet de navigateur&lt;/h2&gt;
&lt;p&gt;La CLI est d&amp;rsquo;une simplicité rafraîchissante :&lt;/p&gt;
&lt;h3 id="lister-toute-la-documentation"&gt;Lister toute la documentation&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;Retourne chaque page de documentation disponible sur aspire.dev. Besoin d&amp;rsquo;une sortie lisible par une machine ? Ajoutez &lt;code&gt;--format Json&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="rechercher-un-sujet"&gt;Rechercher un sujet&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;Recherche à la fois dans les titres et le contenu avec un score de pertinence pondéré. Le même moteur de recherche qui alimente les outils de documentation en interne. Vous obtenez des résultats classés avec titres, slugs et scores de pertinence.&lt;/p&gt;
&lt;h3 id="lire-une-page-complète-ou-juste-une-section"&gt;Lire une page complète (ou juste une section)&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;Envoie la page complète en markdown dans votre terminal. Besoin d&amp;rsquo;une seule section ?&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;Précision chirurgicale. Pas besoin de scroller 500 lignes. Juste la partie dont vous avez besoin.&lt;/p&gt;
&lt;h2 id="langle-agent-ia"&gt;L&amp;rsquo;angle agent IA&lt;/h2&gt;
&lt;p&gt;C&amp;rsquo;est là que ça devient intéressant pour nous, développeurs qui construisons avec des outils IA. Les mêmes commandes &lt;code&gt;aspire docs&lt;/code&gt; fonctionnent comme outils pour les agents IA — via des skills, des serveurs MCP, ou de simples wrappers CLI.&lt;/p&gt;
&lt;p&gt;Au lieu que votre assistant IA invente des APIs Aspire basées sur des données d&amp;rsquo;entraînement obsolètes, il peut appeler &lt;code&gt;aspire docs search &amp;quot;postgres&amp;quot;&lt;/code&gt;, trouver les docs d&amp;rsquo;intégration officiels, lire la bonne page, et vous donner l&amp;rsquo;approche documentée. De la documentation en temps réel et à jour — pas ce que le modèle a mémorisé il y a six mois.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;architecture derrière tout ça est intentionnelle. L&amp;rsquo;équipe Aspire a construit des services réutilisables (&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;) plutôt qu&amp;rsquo;une intégration ponctuelle. Cela signifie que le même moteur de recherche fonctionne pour les humains dans le terminal, les agents IA dans votre éditeur, et l&amp;rsquo;automatisation dans votre pipeline CI.&lt;/p&gt;
&lt;h2 id="scénarios-concrets"&gt;Scénarios concrets&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Consultations rapides dans le terminal :&lt;/strong&gt; Vous êtes trois fichiers en profondeur et vous avez besoin des paramètres de configuration Redis. Deux commandes, quatre-vingt-dix secondes, retour au travail :&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;Développement assisté par IA :&lt;/strong&gt; Votre skill VS Code encapsule les commandes CLI. Vous demandez « Ajoute une base de données PostgreSQL à mon AppHost » et l&amp;rsquo;agent consulte les vrais docs avant de répondre. Pas d&amp;rsquo;hallucinations.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Validation CI/CD :&lt;/strong&gt; Votre pipeline valide les configurations AppHost contre la documentation officielle de manière programmatique. La sortie &lt;code&gt;--format Json&lt;/code&gt; se connecte proprement à &lt;code&gt;jq&lt;/code&gt; et d&amp;rsquo;autres outils.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bases de connaissances personnalisées :&lt;/strong&gt; Vous construisez vos propres outils IA ? Envoyez la sortie JSON structurée directement dans votre base de connaissances :&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;Pas de web scraping. Pas de clés API. Les mêmes données structurées utilisées en interne par les outils de documentation.&lt;/p&gt;
&lt;h2 id="la-documentation-est-toujours-à-jour"&gt;La documentation est toujours à jour&lt;/h2&gt;
&lt;p&gt;C&amp;rsquo;est la partie que j&amp;rsquo;apprécie le plus. La CLI ne télécharge pas un snapshot — elle interroge aspire.dev avec un cache basé sur les ETags. Dès que la documentation est mise à jour, votre CLI et tout skill construit dessus le reflète. Pas de copies obsolètes, pas de moments « mais le wiki disait&amp;hellip; ».&lt;/p&gt;
&lt;h2 id="pour-conclure"&gt;Pour conclure&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;aspire docs&lt;/code&gt; est une de ces petites fonctionnalités qui résout un vrai problème proprement. Les humains obtiennent un accès à la documentation natif au terminal. Les agents IA obtiennent un moyen d&amp;rsquo;arrêter de deviner et de commencer à référencer de vrais docs. Et tout est soutenu par la même source de vérité.&lt;/p&gt;
&lt;p&gt;Si vous construisez avec .NET Aspire et n&amp;rsquo;avez pas encore essayé la CLI, lancez &lt;code&gt;aspire docs search &amp;quot;votre-sujet-ici&amp;quot;&lt;/code&gt; et voyez comment ça se passe. Ensuite, envisagez d&amp;rsquo;intégrer ces commandes dans votre skill IA ou votre configuration d&amp;rsquo;automatisation — vos agents vous remercieront.&lt;/p&gt;
&lt;p&gt;Consultez &lt;a href="https://davidpine.dev/posts/aspire-docs-mcp-tools/"&gt;l&amp;rsquo;analyse approfondie de David Pine&lt;/a&gt; sur la construction des outils de documentation, et la &lt;a href="https://aspire.dev/reference/cli/commands/aspire-docs/"&gt;référence officielle de la CLI&lt;/a&gt; pour tous les détails.&lt;/p&gt;</content:encoded></item><item><title>Microsoft Agent Framework Atteint la 1.0 — Voici Ce Qui Compte Vraiment pour les Développeurs .NET</title><link>https://thedotnetblog.com/fr/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/fr/posts/emiliano-montesdeoca/agent-framework-1-0-production-ready/</guid><description>Microsoft Agent Framework 1.0 est prêt pour la production avec des APIs stables, une orchestration multi-agent et des connecteurs pour tous les principaux fournisseurs d'IA. Voici ce que vous devez savoir en tant que développeur .NET.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Cet article a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/agent-framework-1-0-production-ready/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Si vous avez suivi le parcours d&amp;rsquo;Agent Framework depuis les premiers jours de Semantic Kernel et AutoGen, celui-ci est significatif. Microsoft Agent Framework vient d&amp;rsquo;&lt;a href="https://devblogs.microsoft.com/agent-framework/microsoft-agent-framework-version-1-0/"&gt;atteindre la version 1.0&lt;/a&gt; — prêt pour la production, APIs stables, engagement de support à long terme. Il est disponible pour .NET et Python, et il est véritablement prêt pour les charges de travail réelles.&lt;/p&gt;
&lt;p&gt;Laissez-moi couper à travers le bruit de l&amp;rsquo;annonce et me concentrer sur ce qui compte si vous construisez des applications alimentées par l&amp;rsquo;IA avec .NET.&lt;/p&gt;
&lt;h2 id="la-version-courte"&gt;La version courte&lt;/h2&gt;
&lt;p&gt;Agent Framework 1.0 unifie ce qui était auparavant Semantic Kernel et AutoGen en un seul SDK open source. Une abstraction d&amp;rsquo;agent. Un moteur d&amp;rsquo;orchestration. Plusieurs fournisseurs d&amp;rsquo;IA. Si vous avez jonglé entre Semantic Kernel pour les patterns entreprise et AutoGen pour les workflows multi-agent de niveau recherche, vous pouvez arrêter. C&amp;rsquo;est le seul SDK maintenant.&lt;/p&gt;
&lt;h2 id="démarrer-est-presque-injustement-simple"&gt;Démarrer est presque injustement simple&lt;/h2&gt;
&lt;p&gt;Voici un agent fonctionnel en .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;C&amp;rsquo;est tout. Une poignée de lignes et vous avez un agent IA qui tourne contre Azure Foundry. L&amp;rsquo;équivalent Python est tout aussi concis. Ajoutez des outils de fonctions, des conversations multi-tours et du streaming au fur et à mesure — la surface de l&amp;rsquo;API monte en puissance sans devenir bizarre.&lt;/p&gt;
&lt;h2 id="orchestration-multi-agent--cest-du-sérieux"&gt;Orchestration multi-agent — c&amp;rsquo;est du sérieux&lt;/h2&gt;
&lt;p&gt;Les agents individuels sont bien pour les démos, mais les scénarios de production nécessitent généralement de la coordination. Agent Framework 1.0 est livré avec des patterns d&amp;rsquo;orchestration éprouvés au combat directement de Microsoft Research et AutoGen :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Séquentiel&lt;/strong&gt; — les agents traitent dans l&amp;rsquo;ordre (rédacteur → réviseur → éditeur)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Concurrent&lt;/strong&gt; — distribue vers plusieurs agents en parallèle, converge les résultats&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Handoff&lt;/strong&gt; — un agent délègue à un autre basé sur l&amp;rsquo;intention&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Chat de groupe&lt;/strong&gt; — plusieurs agents discutent et convergent vers une solution&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Magentic-One&lt;/strong&gt; — le pattern multi-agent de niveau recherche de MSR&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tous supportent le streaming, le checkpointing, les approbations humain-dans-la-boucle, et la pause/reprise. La partie checkpointing est cruciale — les workflows de longue durée survivent aux redémarrages de processus. Pour nous, développeurs .NET qui avons construit des workflows durables avec Azure Functions, ça nous parle.&lt;/p&gt;
&lt;h2 id="les-fonctionnalités-qui-comptent-le-plus"&gt;Les fonctionnalités qui comptent le plus&lt;/h2&gt;
&lt;p&gt;Voici ma liste de ce qui vaut la peine d&amp;rsquo;être connu :&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hooks middleware.&lt;/strong&gt; Vous savez comment ASP.NET Core a des pipelines middleware ? Même concept, mais pour l&amp;rsquo;exécution des agents. Interceptez chaque étape — ajoutez la sécurité du contenu, le logging, les politiques de conformité — sans toucher aux prompts de l&amp;rsquo;agent. C&amp;rsquo;est comme ça que vous rendez les agents prêts pour l&amp;rsquo;entreprise.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mémoire pluggable.&lt;/strong&gt; Historique conversationnel, état persistant clé-valeur, récupération basée sur les vecteurs. Choisissez votre backend : Foundry Agent Service, Mem0, Redis, Neo4j, ou créez le vôtre. La mémoire est ce qui transforme un appel LLM sans état en un agent qui se souvient réellement du contexte.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Agents YAML déclaratifs.&lt;/strong&gt; Définissez les instructions de votre agent, ses outils, sa mémoire et sa topologie d&amp;rsquo;orchestration dans des fichiers YAML versionnés. Chargez et exécutez avec un seul appel API. C&amp;rsquo;est un changement de donne pour les équipes qui veulent itérer sur le comportement de l&amp;rsquo;agent sans redéployer du code.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Support A2A et MCP.&lt;/strong&gt; MCP (Model Context Protocol) permet aux agents de découvrir et d&amp;rsquo;invoquer des outils externes dynamiquement. A2A (protocole Agent-to-Agent) permet la collaboration inter-runtime — vos agents .NET peuvent se coordonner avec des agents s&amp;rsquo;exécutant dans d&amp;rsquo;autres frameworks. Le support A2A 1.0 arrive bientôt.&lt;/p&gt;
&lt;h2 id="les-fonctionnalités-en-preview-à-surveiller"&gt;Les fonctionnalités en preview à surveiller&lt;/h2&gt;
&lt;p&gt;Certaines fonctionnalités ont été livrées en preview dans la 1.0 — fonctionnelles mais les APIs peuvent évoluer :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DevUI&lt;/strong&gt; — un débogueur local basé navigateur pour visualiser l&amp;rsquo;exécution de l&amp;rsquo;agent, les flux de messages et les appels d&amp;rsquo;outils en temps réel. Pensez Application Insights, mais pour le raisonnement de l&amp;rsquo;agent.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub Copilot SDK et Claude Code SDK&lt;/strong&gt; — utilisez Copilot ou Claude comme harness d&amp;rsquo;agent directement depuis votre code d&amp;rsquo;orchestration. Composez un agent capable de coder aux côtés de vos autres agents dans le même workflow.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agent Harness&lt;/strong&gt; — un runtime local personnalisable donnant aux agents l&amp;rsquo;accès au shell, au système de fichiers et aux boucles de messagerie. Pensez agents de codage et patterns d&amp;rsquo;automatisation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Skills&lt;/strong&gt; — des packages de capacités de domaine réutilisables qui donnent aux agents des capacités structurées prêtes à l&amp;rsquo;emploi.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="migration-depuis-semantic-kernel-ou-autogen"&gt;Migration depuis Semantic Kernel ou AutoGen&lt;/h2&gt;
&lt;p&gt;Si vous avez du code Semantic Kernel ou AutoGen existant, il existe des assistants de migration dédiés qui analysent votre code et génèrent des plans de migration étape par étape. Le &lt;a href="https://learn.microsoft.com/en-us/agent-framework/migration-guide/from-semantic-kernel"&gt;guide de migration Semantic Kernel&lt;/a&gt; et le &lt;a href="https://learn.microsoft.com/en-us/agent-framework/migration-guide/from-autogen"&gt;guide de migration AutoGen&lt;/a&gt; vous accompagnent à travers tout.&lt;/p&gt;
&lt;p&gt;Si vous étiez sur les packages RC, la mise à niveau vers 1.0 est juste un changement de version.&lt;/p&gt;
&lt;h2 id="pour-conclure"&gt;Pour conclure&lt;/h2&gt;
&lt;p&gt;Agent Framework 1.0 est le jalon de production que les équipes entreprise attendaient. APIs stables, support multi-fournisseur, patterns d&amp;rsquo;orchestration qui fonctionnent réellement à l&amp;rsquo;échelle, et des chemins de migration depuis Semantic Kernel et AutoGen.&lt;/p&gt;
&lt;p&gt;Le framework est &lt;a href="https://github.com/microsoft/agent-framework"&gt;entièrement open source sur GitHub&lt;/a&gt;, et vous pouvez commencer dès aujourd&amp;rsquo;hui avec &lt;code&gt;dotnet add package Microsoft.Agents.AI&lt;/code&gt;. Consultez le &lt;a href="https://learn.microsoft.com/en-us/agent-framework/get-started/"&gt;guide de démarrage rapide&lt;/a&gt; et les &lt;a href="https://github.com/microsoft/agent-framework"&gt;exemples&lt;/a&gt; pour mettre les mains dans le cambouis.&lt;/p&gt;
&lt;p&gt;Si vous attendiez le signal « utilisable en production en toute sécurité » — c&amp;rsquo;est celui-ci.&lt;/p&gt;</content:encoded></item><item><title>azd permet maintenant d'exécuter et déboguer des agents IA localement — Ce qui a changé en mars 2026</title><link>https://thedotnetblog.com/fr/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/fr/posts/emiliano-montesdeoca/azd-march-2026-local-ai-agent-debugging/</guid><description>L'Azure Developer CLI a publié sept versions en mars 2026. Les points forts : une boucle locale d'exécution et débogage pour les agents IA, l'intégration GitHub Copilot pour la configuration de projets, et le support des Container App Jobs.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Cet article a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/azd-march-2026-local-ai-agent-debugging/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Sept versions en un mois. C&amp;rsquo;est ce que l&amp;rsquo;équipe Azure Developer CLI (&lt;code&gt;azd&lt;/code&gt;) a livré en mars 2026, et la fonctionnalité phare est celle que j&amp;rsquo;attendais : &lt;strong&gt;une boucle locale d&amp;rsquo;exécution et débogage pour les agents 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;a publié le récapitulatif complet&lt;/a&gt;, et bien qu&amp;rsquo;il y ait beaucoup de contenu, laissez-moi filtrer ce qui compte vraiment pour les développeurs .NET qui construisent des apps alimentées par l&amp;rsquo;IA.&lt;/p&gt;
&lt;h2 id="exécuter-et-déboguer-des-agents-ia-sans-déployer"&gt;Exécuter et déboguer des agents IA sans déployer&lt;/h2&gt;
&lt;p&gt;C&amp;rsquo;est le gros morceau. La nouvelle extension &lt;code&gt;azure.ai.agents&lt;/code&gt; ajoute des commandes qui offrent une vraie boucle interne pour les agents IA :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;azd ai agent run&lt;/code&gt; — démarre votre agent localement&lt;/li&gt;
&lt;li&gt;&lt;code&gt;azd ai agent invoke&lt;/code&gt; — lui envoie des messages (local ou déployé)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;azd ai agent show&lt;/code&gt; — affiche le statut du conteneur et sa santé&lt;/li&gt;
&lt;li&gt;&lt;code&gt;azd ai agent monitor&lt;/code&gt; — diffuse les logs du conteneur en temps réel&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Avant, tester un agent IA signifiait déployer sur Microsoft Foundry à chaque modification. Maintenant, vous pouvez itérer localement, tester le comportement de votre agent, et ne déployer que quand vous êtes prêt.&lt;/p&gt;
&lt;h2 id="github-copilot-configure-votre-projet-azd"&gt;GitHub Copilot configure votre projet azd&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;azd init&lt;/code&gt; offre maintenant une option &amp;ldquo;Set up with GitHub Copilot (Preview)&amp;rdquo;. Au lieu de répondre manuellement aux prompts, un agent Copilot génère la configuration pour vous. Quand une commande échoue, &lt;code&gt;azd&lt;/code&gt; propose un dépannage assisté par IA — tout sans quitter le terminal.&lt;/p&gt;
&lt;h2 id="container-app-jobs-et-améliorations-de-déploiement"&gt;Container App Jobs et améliorations de déploiement&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Container App Jobs&lt;/strong&gt; : &lt;code&gt;azd&lt;/code&gt; déploie maintenant &lt;code&gt;Microsoft.App/jobs&lt;/code&gt; via la config existante &lt;code&gt;host: containerapp&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Timeouts configurables&lt;/strong&gt; : Nouveau flag &lt;code&gt;--timeout&lt;/code&gt; sur &lt;code&gt;azd deploy&lt;/code&gt; et champ &lt;code&gt;deployTimeout&lt;/code&gt; dans &lt;code&gt;azure.yaml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fallback de build distant&lt;/strong&gt; : En cas d&amp;rsquo;échec du build ACR, &lt;code&gt;azd&lt;/code&gt; retombe automatiquement sur Docker/Podman local.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Validation preflight locale&lt;/strong&gt; : Les paramètres Bicep sont validés localement avant le déploiement.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="améliorations-dx"&gt;Améliorations DX&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Détection automatique pnpm/yarn&lt;/strong&gt; pour les projets JS/TS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Support pyproject.toml&lt;/strong&gt; pour le packaging Python&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Répertoires de templates locaux&lt;/strong&gt; — &lt;code&gt;azd init --template&lt;/code&gt; accepte les chemins du système de fichiers&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Meilleurs messages d&amp;rsquo;erreur&lt;/strong&gt; en mode &lt;code&gt;--no-prompt&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Variables d&amp;rsquo;environnement de build&lt;/strong&gt; injectées dans tous les sous-processus de build (.NET, Node.js, Java, Python)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="pour-conclure"&gt;Pour conclure&lt;/h2&gt;
&lt;p&gt;La boucle locale de débogage d&amp;rsquo;agents IA est la star de cette version, mais l&amp;rsquo;accumulation d&amp;rsquo;améliorations de déploiement et de polish DX rend &lt;code&gt;azd&lt;/code&gt; plus mature que jamais. Si vous déployez des apps .NET sur Azure — surtout des agents IA — cette mise à jour vaut le détour.&lt;/p&gt;
&lt;p&gt;Consultez les &lt;a href="https://devblogs.microsoft.com/azure-sdk/azure-developer-cli-azd-march-2026/"&gt;notes de version complètes&lt;/a&gt; pour tous les détails.&lt;/p&gt;</content:encoded></item><item><title>Azure DevOps corrige enfin l'éditeur Markdown dont tout le monde se plaignait</title><link>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/azure-devops-markdown-editor-work-items/</link><pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/azure-devops-markdown-editor-work-items/</guid><description>L'éditeur Markdown d'Azure DevOps pour les work items obtient une distinction plus claire entre mode aperçu et édition. Un petit changement qui résout un problème de workflow vraiment agaçant.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Cet article a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/azure-devops-markdown-editor-work-items/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Si vous utilisez Azure Boards, vous avez probablement vécu ça : vous lisez la description d&amp;rsquo;un work item, peut-être en vérifiant les critères d&amp;rsquo;acceptation, et vous double-cliquez accidentellement. Boom — vous êtes en mode édition. Vous ne vouliez rien modifier. Vous étiez en train de lire.&lt;/p&gt;
&lt;p&gt;Dan Hellem &lt;a href="https://devblogs.microsoft.com/devops/improving-the-markdown-editor-for-work-items/"&gt;a annoncé le correctif&lt;/a&gt;, et c&amp;rsquo;est un de ces changements qui semblent petits mais qui éliminent une vraie friction de votre workflow quotidien.&lt;/p&gt;
&lt;h2 id="ce-qui-a-changé"&gt;Ce qui a changé&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;éditeur Markdown pour les champs texte des work items s&amp;rsquo;ouvre désormais en &lt;strong&gt;mode aperçu par défaut&lt;/strong&gt;. Vous pouvez lire et interagir avec le contenu — suivre les liens, vérifier le formatage — sans risquer d&amp;rsquo;entrer accidentellement en mode édition.&lt;/p&gt;
&lt;p&gt;Quand vous voulez vraiment éditer, vous cliquez sur l&amp;rsquo;icône d&amp;rsquo;édition en haut du champ. Quand vous avez terminé, vous revenez explicitement au mode aperçu. Simple, intentionnel, prévisible.&lt;/p&gt;
&lt;h2 id="pourquoi-cest-plus-important-quil-ny-paraît"&gt;Pourquoi c&amp;rsquo;est plus important qu&amp;rsquo;il n&amp;rsquo;y paraît&lt;/h2&gt;
&lt;p&gt;Le &lt;a href="https://developercommunity.visualstudio.com/t/Markdown-editor-for-work-item-multi-line/10935496"&gt;fil de feedback communautaire&lt;/a&gt; était long. Le comportement de double-clic pour éditer a été introduit avec l&amp;rsquo;éditeur Markdown en juillet 2025, et les plaintes ont commencé presque immédiatement.&lt;/p&gt;
&lt;p&gt;Pour les équipes qui font du sprint planning, du refinement ou du code review avec Azure Boards, ce type de micro-friction s&amp;rsquo;accumule.&lt;/p&gt;
&lt;h2 id="état-du-déploiement"&gt;État du déploiement&lt;/h2&gt;
&lt;p&gt;Ce changement est déjà en cours de déploiement pour un sous-ensemble de clients et s&amp;rsquo;étendra à tous dans les deux à trois prochaines semaines.&lt;/p&gt;
&lt;h2 id="pour-conclure"&gt;Pour conclure&lt;/h2&gt;
&lt;p&gt;Toute amélioration n&amp;rsquo;a pas besoin d&amp;rsquo;être une fonctionnalité phare. Parfois la meilleure mise à jour consiste simplement à supprimer quelque chose d&amp;rsquo;agaçant. C&amp;rsquo;est exactement ça — un petit correctif UX qui rend Azure Boards moins hostile pour les gens qui veulent juste lire leurs work items tranquillement.&lt;/p&gt;</content:encoded></item><item><title>Bookmark Studio apporte la navigation par slots et le partage aux signets de Visual Studio</title><link>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/bookmark-studio-visual-studio-extension/</link><pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/bookmark-studio-visual-studio-extension/</guid><description>La nouvelle extension Bookmark Studio de Mads Kristensen ajoute la navigation par slots au clavier, un gestionnaire de signets, des couleurs, des labels et des capacités d'export aux signets de Visual Studio.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Cet article a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/bookmark-studio-visual-studio-extension/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Les signets dans Visual Studio ont toujours été&amp;hellip; corrects. Vous en placez un, vous naviguez au suivant, vous oubliez lequel est lequel. Ça fonctionne, mais ce n&amp;rsquo;a jamais été une fonctionnalité qu&amp;rsquo;on qualifierait de puissante.&lt;/p&gt;
&lt;p&gt;Mads Kristensen vient de &lt;a href="https://devblogs.microsoft.com/visualstudio/bookmark-studio-evolving-bookmarks-in-visual-studio/"&gt;sortir Bookmark Studio&lt;/a&gt;, une extension expérimentale qui comble exactement les lacunes que vous avez probablement rencontrées.&lt;/p&gt;
&lt;h2 id="navigation-par-slots"&gt;Navigation par slots&lt;/h2&gt;
&lt;p&gt;Les signets peuvent être assignés aux slots 1–9 et accessibles directement avec &lt;code&gt;Alt+Shift+1&lt;/code&gt; à &lt;code&gt;Alt+Shift+9&lt;/code&gt;. Les nouveaux signets obtiennent automatiquement le prochain slot disponible.&lt;/p&gt;
&lt;h2 id="le-gestionnaire-de-signets"&gt;Le Gestionnaire de Signets&lt;/h2&gt;
&lt;p&gt;Une nouvelle fenêtre d&amp;rsquo;outils affiche tous vos signets avec filtrage par nom, fichier, emplacement, couleur ou slot.&lt;/p&gt;
&lt;h2 id="organisation-avec-labels-couleurs-et-dossiers"&gt;Organisation avec labels, couleurs et dossiers&lt;/h2&gt;
&lt;p&gt;Les signets peuvent avoir des labels, couleurs et être groupés en dossiers. Toutes les métadonnées sont stockées par solution.&lt;/p&gt;
&lt;h2 id="exporter-et-partager"&gt;Exporter et partager&lt;/h2&gt;
&lt;p&gt;Bookmark Studio permet d&amp;rsquo;exporter les signets en texte brut, Markdown ou CSV.&lt;/p&gt;
&lt;h2 id="signets-qui-suivent-le-code"&gt;Signets qui suivent le code&lt;/h2&gt;
&lt;p&gt;Bookmark Studio suit les signets relativement au texte auquel ils sont ancrés, ils ne dérivent donc pas vers les mauvaises lignes.&lt;/p&gt;
&lt;h2 id="pour-conclure"&gt;Pour conclure&lt;/h2&gt;
&lt;p&gt;Bookmark Studio ne réinvente rien. Il prend une fonctionnalité qui était « suffisante » depuis des années et la rend vraiment utile. Téléchargez-le depuis le &lt;a href="https://marketplace.visualstudio.com/items?itemName=MadsKristensen.BookmarkStudio"&gt;Visual Studio Marketplace&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>La mise à jour de mars de Visual Studio permet de créer des agents Copilot personnalisés — et find_symbol est révolutionnaire</title><link>https://thedotnetblog.com/fr/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/fr/posts/emiliano-montesdeoca/visual-studio-march-2026-custom-copilot-agents/</guid><description>La mise à jour de mars 2026 de Visual Studio apporte des agents Copilot personnalisés, des skills réutilisables, l'outil find_symbol avec reconnaissance du langage, et le profiling avec Copilot depuis Test Explorer.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Cet article a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/visual-studio-march-2026-custom-copilot-agents/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Visual Studio vient de recevoir sa mise à jour Copilot la plus significative. Mark Downie &lt;a href="https://devblogs.microsoft.com/visualstudio/visual-studio-march-update-build-your-own-custom-agents/"&gt;a annoncé la version de mars&lt;/a&gt;, et le titre principal concerne les agents personnalisés — mais honnêtement, l&amp;rsquo;outil &lt;code&gt;find_symbol&lt;/code&gt; pourrait être la fonctionnalité qui change le plus votre workflow.&lt;/p&gt;
&lt;h2 id="agents-copilot-personnalisés-dans-votre-repo"&gt;Agents Copilot personnalisés dans votre repo&lt;/h2&gt;
&lt;p&gt;Envie que Copilot suive les standards de code de votre équipe ? Les agents personnalisés sont définis comme des fichiers &lt;code&gt;.agent.md&lt;/code&gt; dans &lt;code&gt;.github/agents/&lt;/code&gt;. Chaque agent a un accès complet au workspace, à la compréhension du code, aux outils, votre modèle préféré et aux connexions MCP.&lt;/p&gt;
&lt;h2 id="agent-skills--packs-dinstructions-réutilisables"&gt;Agent skills : packs d&amp;rsquo;instructions réutilisables&lt;/h2&gt;
&lt;p&gt;Les skills sont chargés automatiquement depuis &lt;code&gt;.github/skills/&lt;/code&gt; dans votre repo ou &lt;code&gt;~/.copilot/skills/&lt;/code&gt; dans votre profil.&lt;/p&gt;
&lt;h2 id="find_symbol--navigation-consciente-du-langage"&gt;find_symbol : navigation consciente du langage&lt;/h2&gt;
&lt;p&gt;Le nouvel outil &lt;code&gt;find_symbol&lt;/code&gt; donne au mode agent de Copilot une navigation de symboles basée sur les services de langage. Au lieu de chercher du texte, l&amp;rsquo;agent peut trouver toutes les références d&amp;rsquo;un symbole et accéder aux informations de type et de portée.&lt;/p&gt;
&lt;p&gt;Pour les développeurs .NET, c&amp;rsquo;est une amélioration massive — les bases de code C# avec des hiérarchies de types profondes en bénéficient énormément.&lt;/p&gt;
&lt;h2 id="profiler-des-tests-avec-copilot"&gt;Profiler des tests avec Copilot&lt;/h2&gt;
&lt;p&gt;Il y a un nouveau &lt;strong&gt;Profile with Copilot&lt;/strong&gt; dans le menu contextuel du Test Explorer. Le Profiling Agent exécute le test et analyse automatiquement les performances.&lt;/p&gt;
&lt;h2 id="perf-tips-pendant-le-débogage-en-direct"&gt;Perf tips pendant le débogage en direct&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;optimisation des performances se fait maintenant pendant le débogage. Visual Studio affiche le temps d&amp;rsquo;exécution inline. Ligne lente ? Cliquez sur le Perf Tip et demandez à Copilot des suggestions.&lt;/p&gt;
&lt;h2 id="corriger-les-vulnérabilités-nuget-depuis-solution-explorer"&gt;Corriger les vulnérabilités NuGet depuis Solution Explorer&lt;/h2&gt;
&lt;p&gt;Un lien &lt;strong&gt;Fix with GitHub Copilot&lt;/strong&gt; apparaît directement dans Solution Explorer quand une vulnérabilité est détectée.&lt;/p&gt;
&lt;h2 id="pour-conclure"&gt;Pour conclure&lt;/h2&gt;
&lt;p&gt;Les agents personnalisés et les skills font le titre, mais &lt;code&gt;find_symbol&lt;/code&gt; est la pépite cachée — il change fondamentalement la précision de Copilot lors du refactoring de code .NET. Téléchargez &lt;a href="https://visualstudio.microsoft.com/downloads/"&gt;Visual Studio 2026 Insiders&lt;/a&gt; pour tout essayer.&lt;/p&gt;</content:encoded></item><item><title>Le Dashboard d'Aspire 13.2 a maintenant une API de télémétrie — et ça change tout</title><link>https://thedotnetblog.com/fr/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/fr/posts/emiliano-montesdeoca/aspire-132-dashboard-export-telemetry/</guid><description>.NET Aspire 13.2 apporte un export de télémétrie plus intelligent, une API programmable pour les traces et logs, et des améliorations de visualisation GenAI. Voici pourquoi c'est important pour votre workflow de débogage.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Cet article a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/aspire-132-dashboard-export-telemetry/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Si vous développez des applications distribuées avec .NET Aspire, vous savez déjà que le dashboard est la meilleure chose de toute l&amp;rsquo;expérience. Toutes vos traces, logs et métriques au même endroit — pas de Jaeger externe, pas de configuration Seq, pas de moments « laissez-moi vérifier l&amp;rsquo;autre terminal ».&lt;/p&gt;
&lt;p&gt;Aspire 13.2 vient de considérablement améliorer les choses. James Newton-King &lt;a href="https://devblogs.microsoft.com/aspire/aspire-dashboard-improvements-export-and-telemetry/"&gt;a annoncé la mise à jour&lt;/a&gt;, et honnêtement ? Les fonctionnalités d&amp;rsquo;export de télémétrie et l&amp;rsquo;API justifient à elles seules la mise à niveau.&lt;/p&gt;
&lt;h2 id="exporter-la-télémétrie-comme-une-personne-normale"&gt;Exporter la télémétrie comme une personne normale&lt;/h2&gt;
&lt;p&gt;Voici le scénario qu&amp;rsquo;on a tous vécu : vous déboguez un problème distribué, vous le reproduisez enfin après vingt minutes de configuration, et maintenant vous devez partager ce qui s&amp;rsquo;est passé avec votre équipe. Avant ? Des captures d&amp;rsquo;écran. Du copier-coller d&amp;rsquo;identifiants de traces. Le bazar habituel.&lt;/p&gt;
&lt;p&gt;Aspire 13.2 ajoute un dialogue &lt;strong&gt;Gérer les logs et la télémétrie&lt;/strong&gt; où vous pouvez :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Effacer toute la télémétrie (utile avant une tentative de reproduction)&lt;/li&gt;
&lt;li&gt;Exporter la télémétrie sélectionnée dans un fichier ZIP au format standard OTLP/JSON&lt;/li&gt;
&lt;li&gt;Ré-importer ce ZIP dans n&amp;rsquo;importe quel dashboard Aspire ultérieurement&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ce dernier point est la fonctionnalité phare. Vous reproduisez un bug, exportez la télémétrie, l&amp;rsquo;attachez à votre work item, et votre collègue peut l&amp;rsquo;importer dans son propre dashboard pour voir exactement ce que vous avez vu. Fini le « tu peux reproduire sur ta machine ? »&lt;/p&gt;
&lt;p&gt;Les traces, spans et logs individuels ont aussi une option « Export JSON » dans leurs menus contextuels. Besoin de partager une trace spécifique ? Clic droit, copier le JSON, coller dans la description de votre PR. Terminé.&lt;/p&gt;
&lt;h2 id="lapi-de-télémétrie-est-le-vrai-changement-majeur"&gt;L&amp;rsquo;API de télémétrie est le vrai changement majeur&lt;/h2&gt;
&lt;p&gt;C&amp;rsquo;est ce qui m&amp;rsquo;enthousiasme le plus. Le dashboard expose maintenant une API HTTP sous &lt;code&gt;/api/telemetry&lt;/code&gt; pour interroger les données de télémétrie programmatiquement. Endpoints disponibles :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GET /api/telemetry/resources&lt;/code&gt; — lister les ressources avec télémétrie&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /api/telemetry/spans&lt;/code&gt; — interroger les spans avec des filtres&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /api/telemetry/logs&lt;/code&gt; — interroger les logs avec des filtres&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /api/telemetry/traces&lt;/code&gt; — lister les traces&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /api/telemetry/traces/{traceId}&lt;/code&gt; — obtenir tous les spans d&amp;rsquo;une trace spécifique&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tout revient au format OTLP JSON. Cela alimente les nouvelles commandes CLI &lt;code&gt;aspire agent mcp&lt;/code&gt; et &lt;code&gt;aspire otel&lt;/code&gt;, mais l&amp;rsquo;implication réelle est plus grande : vous pouvez maintenant construire des outils, scripts et intégrations d&amp;rsquo;agents IA qui interrogent directement la télémétrie de votre app.&lt;/p&gt;
&lt;p&gt;Imaginez un agent IA de codage qui peut voir vos traces distribuées réelles pendant le débogage. Ce n&amp;rsquo;est plus hypothétique — c&amp;rsquo;est ce que cette API permet.&lt;/p&gt;
&lt;h2 id="la-télémétrie-genai-devient-pratique"&gt;La télémétrie GenAI devient pratique&lt;/h2&gt;
&lt;p&gt;Si vous construisez des apps alimentées par l&amp;rsquo;IA avec Semantic Kernel ou Microsoft.Extensions.AI, vous apprécierez le visualiseur de télémétrie GenAI amélioré. Aspire 13.2 ajoute :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Les descriptions d&amp;rsquo;outils IA rendues en Markdown&lt;/li&gt;
&lt;li&gt;Un bouton GenAI dédié sur la page des traces pour un accès rapide&lt;/li&gt;
&lt;li&gt;Une meilleure gestion des erreurs pour le JSON GenAI tronqué ou non standard&lt;/li&gt;
&lt;li&gt;Une navigation click-to-highlight entre les définitions d&amp;rsquo;outils&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;L&amp;rsquo;article mentionne que VS Code Copilot chat, Copilot CLI et OpenCode supportent tous la configuration d&amp;rsquo;un &lt;code&gt;OTEL_EXPORTER_OTLP_ENDPOINT&lt;/code&gt;. Pointez-les vers le dashboard Aspire et vous pouvez littéralement regarder vos agents IA réfléchir en temps réel via la télémétrie. C&amp;rsquo;est une expérience de débogage que vous ne trouverez nulle part ailleurs.&lt;/p&gt;
&lt;h2 id="pour-conclure"&gt;Pour conclure&lt;/h2&gt;
&lt;p&gt;Aspire 13.2 transforme le dashboard d&amp;rsquo;une « jolie UI de débogage » en « plateforme d&amp;rsquo;observabilité programmable ». Le workflow d&amp;rsquo;export/import seul fait gagner du temps réel en débogage distribué, et l&amp;rsquo;API de télémétrie ouvre la porte au diagnostic assisté par IA.&lt;/p&gt;
&lt;p&gt;Si vous êtes déjà sur Aspire, mettez à jour. Sinon — c&amp;rsquo;est une bonne raison de découvrir &lt;a href="https://aspire.dev"&gt;aspire.dev&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>KubeCon Europe 2026 : Ce que les développeurs .NET devraient vraiment retenir</title><link>https://thedotnetblog.com/fr/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/fr/posts/emiliano-montesdeoca/kubecon-2026-aks-updates-dotnet-developers/</guid><description>Microsoft a publié une avalanche d'annonces Kubernetes à KubeCon Europe 2026. Voici la version filtrée — uniquement les mises à jour AKS et cloud-native qui comptent si vous livrez des apps .NET.</description><content:encoded>&lt;p&gt;&lt;em&gt;Cet article a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/kubecon-2026-aks-updates-dotnet-developers/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Vous connaissez cette sensation quand un énorme post d&amp;rsquo;annonces tombe et que vous scrollez en pensant « cool, mais concrètement ça change quoi pour moi » ? C&amp;rsquo;est moi à chaque saison KubeCon.&lt;/p&gt;
&lt;p&gt;Microsoft vient de publier son &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;récapitulatif complet de KubeCon Europe 2026&lt;/a&gt; — écrit par Brendan Burns en personne — et honnêtement ? Il y a du vrai contenu ici. Pas juste des cases à cocher, mais des améliorations opérationnelles qui changent votre façon de gérer les choses en production.&lt;/p&gt;
&lt;p&gt;Laissez-moi décortiquer ce qui compte vraiment pour nous développeurs .NET.&lt;/p&gt;
&lt;h2 id="mtls-sans-la-taxe-du-service-mesh"&gt;mTLS sans la taxe du service mesh&lt;/h2&gt;
&lt;p&gt;Voici le truc avec les service meshes : tout le monde veut les garanties de sécurité, personne ne veut la charge opérationnelle. AKS comble enfin cet écart.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://aka.ms/aks/application-network"&gt;Azure Kubernetes Application Network&lt;/a&gt; vous donne le TLS mutuel, l&amp;rsquo;autorisation consciente de l&amp;rsquo;application et la télémétrie du trafic — sans déployer un mesh complet avec sidecars. Combiné avec &lt;a href="https://aka.ms/acns/cilium-mtls"&gt;Cilium mTLS dans Advanced Container Networking Services&lt;/a&gt;, vous obtenez une communication chiffrée pod-à-pod utilisant des certificats X.509 et SPIRE pour la gestion des identités.&lt;/p&gt;
&lt;p&gt;Ce que ça signifie en pratique : vos APIs ASP.NET Core qui communiquent avec des workers en arrière-plan, vos services gRPC qui s&amp;rsquo;appellent mutuellement — tout chiffré et vérifié au niveau réseau, sans aucune modification de code. C&amp;rsquo;est énorme.&lt;/p&gt;
&lt;p&gt;Pour les équipes qui migrent depuis &lt;code&gt;ingress-nginx&lt;/code&gt;, il y a aussi &lt;a href="https://aka.ms/aks/app-routing/gateway-api"&gt;Application Routing avec Meshless Istio&lt;/a&gt; avec support complet de Kubernetes Gateway API. Pas de sidecars. Basé sur les standards. Et ils ont livré des outils &lt;code&gt;ingress2gateway&lt;/code&gt; pour une migration incrémentale.&lt;/p&gt;
&lt;h2 id="observabilité-gpu-qui-nest-pas-une-pensée-après-coup"&gt;Observabilité GPU qui n&amp;rsquo;est pas une pensée après coup&lt;/h2&gt;
&lt;p&gt;Si vous exécutez de l&amp;rsquo;inférence IA aux côtés de vos services .NET (et soyons honnêtes, qui ne commence pas ?), vous avez probablement rencontré l&amp;rsquo;angle mort du monitoring GPU. Vous aviez de super dashboards CPU/mémoire et ensuite&amp;hellip; rien pour les GPU sans configuration manuelle d&amp;rsquo;exporteurs.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://aka.ms/aks/managed-gpu-metrics"&gt;AKS expose maintenant les métriques GPU nativement&lt;/a&gt; dans Prometheus et Grafana managés. Même stack, mêmes dashboards, même pipeline d&amp;rsquo;alertes. Pas d&amp;rsquo;exporteurs custom, pas d&amp;rsquo;agents tiers.&lt;/p&gt;
&lt;p&gt;Côté réseau, ils ont ajouté de la visibilité par flux pour le trafic HTTP, gRPC et Kafka avec une &lt;a href="https://learn.microsoft.com/en-us/azure/aks/container-network-observability-logs"&gt;expérience Azure Monitor en un clic&lt;/a&gt;. IPs, ports, workloads, direction des flux, décisions de policies — tout dans des dashboards intégrés.&lt;/p&gt;
&lt;p&gt;Et voici celle qui m&amp;rsquo;a fait regarder deux fois : &lt;a href="https://learn.microsoft.com/en-us/azure/aks/advanced-container-networking-services-overview"&gt;agentic container networking&lt;/a&gt; ajoute une interface web où vous pouvez poser des questions en langage naturel sur l&amp;rsquo;état réseau de votre cluster. « Pourquoi le pod X n&amp;rsquo;atteint-il pas le service Y ? » → diagnostics en lecture seule depuis la télémétrie en direct. C&amp;rsquo;est vraiment utile à 2h du matin.&lt;/p&gt;
&lt;h2 id="networking-cross-cluster-sans-avoir-besoin-dun-doctorat"&gt;Networking cross-cluster sans avoir besoin d&amp;rsquo;un doctorat&lt;/h2&gt;
&lt;p&gt;Le multi-cluster Kubernetes a toujours été une expérience « apportez votre propre colle réseau ». Azure Kubernetes Fleet Manager propose maintenant du &lt;a href="https://aka.ms/kubernetes-fleet/networking/cross-cluster"&gt;networking cross-cluster&lt;/a&gt; via un cluster mesh Cilium managé :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Connectivité unifiée entre clusters AKS&lt;/li&gt;
&lt;li&gt;Registre global de services pour la découverte cross-cluster&lt;/li&gt;
&lt;li&gt;Configuration gérée centralement, pas répétée par cluster&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si vous exécutez des microservices .NET sur plusieurs régions pour la résilience ou la conformité, ça remplace beaucoup de colle custom fragile. Le Service A en West Europe peut découvrir et appeler le Service B en East US à travers le mesh, avec des politiques de routage et de sécurité cohérentes.&lt;/p&gt;
&lt;h2 id="des-mises-à-jour-qui-ne-demandent-pas-du-courage"&gt;Des mises à jour qui ne demandent pas du courage&lt;/h2&gt;
&lt;p&gt;Soyons honnêtes — les mises à jour Kubernetes en production sont stressantes. « Mettre à jour et espérer » a été la stratégie de fait pour trop d&amp;rsquo;équipes, et c&amp;rsquo;est la raison principale pour laquelle les clusters restent en retard sur les versions.&lt;/p&gt;
&lt;p&gt;Deux nouvelles capacités changent la donne :&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les blue-green agent pool upgrades&lt;/strong&gt; créent un pool de nœuds parallèle avec la nouvelle configuration. Validez le comportement, déplacez le trafic progressivement et gardez un chemin de rollback propre. Plus de mutations in-place sur les nœuds de production.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Le rollback d&amp;rsquo;agent pool&lt;/strong&gt; permet de revenir à la version Kubernetes et l&amp;rsquo;image de nœud précédentes d&amp;rsquo;un pool après qu&amp;rsquo;une mise à jour se passe mal — sans reconstruire le cluster.&lt;/p&gt;
&lt;p&gt;Ensemble, ils donnent enfin aux opérateurs un vrai contrôle sur le cycle de vie des mises à jour. Pour les équipes .NET, c&amp;rsquo;est important car la vélocité de la plateforme contrôle directement la vitesse à laquelle vous pouvez adopter de nouveaux runtimes, patchs de sécurité et capacités réseau.&lt;/p&gt;
&lt;h2 id="les-workloads-ia-deviennent-des-citoyens-de-première-classe-kubernetes"&gt;Les workloads IA deviennent des citoyens de première classe Kubernetes&lt;/h2&gt;
&lt;p&gt;Le travail upstream en open-source est tout aussi important. Dynamic Resource Allocation (DRA) vient de passer en GA dans Kubernetes 1.36, faisant du scheduling GPU une vraie fonctionnalité de première classe plutôt qu&amp;rsquo;un contournement.&lt;/p&gt;
&lt;p&gt;Quelques projets à surveiller :&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Projet&lt;/th&gt;
&lt;th&gt;Ce qu&amp;rsquo;il fait&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/kaito-project/kubeairunway"&gt;AI Runway&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;API Kubernetes commune pour l&amp;rsquo;inférence — déployez des modèles sans connaître K8s, avec découverte HuggingFace et estimations de coûts&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;Dépannage agentique pour le cloud-native — maintenant un projet CNCF Sandbox&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/project-dalec/dalec"&gt;Dalec&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Builds déclaratifs d&amp;rsquo;images de conteneur avec génération de SBOM — moins de CVE à l&amp;rsquo;étape de build&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;La direction est claire : votre API .NET, votre couche d&amp;rsquo;orchestration Semantic Kernel et vos workloads d&amp;rsquo;inférence devraient tous tourner sur un modèle de plateforme cohérent. On y arrive.&lt;/p&gt;
&lt;h2 id="par-où-commencer-cette-semaine"&gt;Par où commencer cette semaine&lt;/h2&gt;
&lt;p&gt;Si vous évaluez ces changements pour votre équipe, voici ma liste de priorités honnête :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;L&amp;rsquo;observabilité d&amp;rsquo;abord&lt;/strong&gt; — activez les métriques GPU et les logs de flux réseau dans un cluster non-prod. Voyez ce que vous avez manqué.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Testez les blue-green upgrades&lt;/strong&gt; — essayez le workflow de rollback avant votre prochaine mise à jour de cluster en production. Construisez la confiance dans le processus.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pilotez le networking identity-aware&lt;/strong&gt; — choisissez un chemin de service interne et activez mTLS avec Cilium. Mesurez l&amp;rsquo;overhead (spoiler : c&amp;rsquo;est minimal).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Évaluez Fleet Manager&lt;/strong&gt; — si vous gérez plus de deux clusters, le networking cross-cluster se rentabilise tout seul en réduisant la colle custom.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Petites expériences, feedback rapide. C&amp;rsquo;est toujours le bon choix.&lt;/p&gt;
&lt;h2 id="pour-conclure"&gt;Pour conclure&lt;/h2&gt;
&lt;p&gt;Les annonces KubeCon peuvent être accablantes, mais cette fournée fait vraiment bouger les choses pour les équipes .NET sur AKS. Meilleure sécurité réseau sans overhead de mesh, vraie observabilité GPU, mises à jour plus sûres et des fondations d&amp;rsquo;infrastructure IA plus solides.&lt;/p&gt;
&lt;p&gt;Si vous êtes déjà sur AKS, c&amp;rsquo;est un excellent moment pour renforcer votre baseline opérationnel. Et si vous prévoyez de migrer des workloads .NET vers Kubernetes — la plateforme vient de devenir nettement plus prête pour la production.&lt;/p&gt;</content:encoded></item><item><title>SQL MCP Server, Copilot dans SSMS et un Database Hub avec des agents IA : Ce qui compte vraiment de SQLCon 2026</title><link>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/agentic-ai-microsoft-databases-what-matters/</link><pubDate>Sat, 28 Mar 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/agentic-ai-microsoft-databases-what-matters/</guid><description>Microsoft a dévoilé une pile d'annonces sur les bases de données à SQLCon 2026. Voici ce qui compte vraiment si vous construisez des apps alimentées par l'IA sur Azure SQL.</description><content:encoded>&lt;p&gt;Microsoft vient de lancer &lt;a href="https://www.microsoft.com/en-us/sql-server/blog/2026/03/18/advancing-agentic-ai-with-microsoft-databases-across-a-unified-data-estate/"&gt;SQLCon 2026 en parallèle de FabCon à Atlanta&lt;/a&gt;, et il y a beaucoup à décortiquer. L&amp;rsquo;annonce originale couvre tout, des plans d&amp;rsquo;économies aux fonctionnalités de conformité enterprise. Je vais passer les slides sur les tarifs enterprise et me concentrer sur les éléments qui comptent si vous êtes un développeur qui construit des choses avec Azure SQL et l&amp;rsquo;IA.&lt;/p&gt;
&lt;h2 id="sql-mcp-server-est-en-public-preview"&gt;SQL MCP Server est en public preview&lt;/h2&gt;
&lt;p&gt;C&amp;rsquo;est le titre principal pour moi. Azure SQL Database Hyperscale dispose maintenant d&amp;rsquo;un &lt;strong&gt;SQL MCP Server&lt;/strong&gt; en public preview qui vous permet de connecter vos données SQL de manière sécurisée à des agents IA et des Copilots en utilisant le &lt;a href="https://modelcontextprotocol.io/"&gt;Model Context Protocol&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Si vous avez suivi la vague MCP — et honnêtement, c&amp;rsquo;est difficile de la rater en ce moment — c&amp;rsquo;est une grosse nouvelle. Au lieu de construire des pipelines de données personnalisés pour alimenter vos agents IA en contexte depuis votre base de données, vous obtenez un protocole standardisé pour exposer les données SQL directement. Vos agents peuvent interroger, raisonner et agir sur des informations de base de données en temps réel.&lt;/p&gt;
&lt;p&gt;Pour ceux d&amp;rsquo;entre nous qui construisent des agents IA avec Semantic Kernel ou le Microsoft Agent Framework, ça ouvre un chemin d&amp;rsquo;intégration propre. Votre agent a besoin de vérifier l&amp;rsquo;inventaire ? Chercher un enregistrement client ? Valider une commande ? MCP lui donne une façon structurée de le faire sans que vous écriviez du code de récupération de données sur mesure pour chaque scénario.&lt;/p&gt;
&lt;h2 id="github-copilot-dans-ssms-22-est-maintenant-ga"&gt;GitHub Copilot dans SSMS 22 est maintenant GA&lt;/h2&gt;
&lt;p&gt;Si vous passez du temps dans SQL Server Management Studio — et soyons honnêtes, la plupart d&amp;rsquo;entre nous le font encore — GitHub Copilot est maintenant disponible de manière générale dans SSMS 22. La même expérience Copilot que vous utilisez déjà dans VS Code et Visual Studio, mais pour T-SQL.&lt;/p&gt;
&lt;p&gt;La valeur pratique est simple : une assistance par chat pour écrire des requêtes, refactoriser des procédures stockées, résoudre des problèmes de performance et gérer des tâches d&amp;rsquo;administration. Rien de révolutionnaire dans le concept, mais l&amp;rsquo;avoir directement dans SSMS signifie que vous n&amp;rsquo;avez pas besoin de changer de contexte vers un autre éditeur juste pour obtenir de l&amp;rsquo;aide IA sur votre travail de base de données.&lt;/p&gt;
&lt;h2 id="les-index-vectoriels-ont-reçu-une-sérieuse-mise-à-jour"&gt;Les index vectoriels ont reçu une sérieuse mise à jour&lt;/h2&gt;
&lt;p&gt;Azure SQL Database dispose maintenant d&amp;rsquo;index vectoriels plus rapides et plus performants avec un support complet pour l&amp;rsquo;insertion, la mise à jour et la suppression. Ça veut dire que vos données vectorielles restent à jour en temps réel — pas besoin de réindexation par lots.&lt;/p&gt;
&lt;p&gt;Voici les nouveautés :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Quantification&lt;/strong&gt; pour des tailles d&amp;rsquo;index plus petites sans trop perdre en précision&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Filtrage itératif&lt;/strong&gt; pour des résultats plus précis&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Intégration plus étroite avec l&amp;rsquo;optimiseur de requêtes&lt;/strong&gt; pour des performances prévisibles&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si vous faites du Retrieval-Augmented Generation (RAG) avec Azure SQL comme vector store, ces améliorations sont directement utiles. Vous pouvez garder vos vecteurs à côté de vos données relationnelles dans la même base de données, ce qui simplifie considérablement votre architecture par rapport à l&amp;rsquo;exécution d&amp;rsquo;une base de données vectorielle séparée.&lt;/p&gt;
&lt;p&gt;Les mêmes améliorations vectorielles sont également disponibles dans SQL Database in Fabric, puisque les deux tournent sur le même moteur SQL en dessous.&lt;/p&gt;
&lt;h2 id="database-hub-dans-fabric--gestion-agentique"&gt;Database Hub dans Fabric : gestion agentique&lt;/h2&gt;
&lt;p&gt;Celui-ci est plus tourné vers l&amp;rsquo;avenir, mais il est intéressant. Microsoft a annoncé le &lt;strong&gt;Database Hub dans Microsoft Fabric&lt;/strong&gt; (accès anticipé), qui vous donne une vue unifiée sur Azure SQL, Cosmos DB, PostgreSQL, MySQL et SQL Server via Arc.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;angle intéressant n&amp;rsquo;est pas juste la vue unifiée — c&amp;rsquo;est l&amp;rsquo;approche agentique de la gestion. Des agents IA surveillent en continu votre parc de bases de données, font remonter ce qui a changé, expliquent pourquoi c&amp;rsquo;est important et suggèrent quoi faire ensuite. C&amp;rsquo;est un modèle human-in-the-loop où l&amp;rsquo;agent fait le gros du travail et vous prenez les décisions.&lt;/p&gt;
&lt;p&gt;Pour les équipes qui gèrent plus qu&amp;rsquo;une poignée de bases de données, ça pourrait vraiment réduire le bruit opérationnel. Au lieu de sauter entre les portails et de vérifier manuellement les métriques, l&amp;rsquo;agent vous apporte le signal.&lt;/p&gt;
&lt;h2 id="ce-que-ça-signifie-pour-les-développeurs-net"&gt;Ce que ça signifie pour les développeurs .NET&lt;/h2&gt;
&lt;p&gt;Le fil conducteur de toutes ces annonces est clair : Microsoft intègre des agents IA à chaque couche de la pile de bases de données. Pas comme un gadget, mais comme une couche d&amp;rsquo;outillage pratique.&lt;/p&gt;
&lt;p&gt;Si vous construisez des apps .NET adossées à Azure SQL, voici ce que je ferais concrètement :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Essayez le SQL MCP Server&lt;/strong&gt; si vous construisez des agents IA. C&amp;rsquo;est la façon la plus propre de donner à vos agents un accès à la base de données sans plomberie personnalisée.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Activez Copilot dans SSMS&lt;/strong&gt; si ce n&amp;rsquo;est pas déjà fait — un gain de productivité gratuit pour le travail SQL quotidien.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Regardez les index vectoriels&lt;/strong&gt; si vous faites du RAG et que vous utilisez actuellement un vector store séparé. Consolider sur Azure SQL signifie un service de moins à gérer.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="pour-conclure"&gt;Pour conclure&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;annonce complète contient plus — plans d&amp;rsquo;économies, assistants de migration, fonctionnalités de conformité — mais l&amp;rsquo;histoire pour les développeurs se trouve dans le MCP Server, les améliorations vectorielles et la couche de gestion agentique. Ce sont les éléments qui changent la façon dont vous construisez, pas juste la façon dont vous budgétisez.&lt;/p&gt;
&lt;p&gt;Consultez &lt;a href="https://www.microsoft.com/en-us/sql-server/blog/2026/03/18/advancing-agentic-ai-with-microsoft-databases-across-a-unified-data-estate/"&gt;l&amp;rsquo;annonce complète de Shireesh Thota&lt;/a&gt; pour avoir le tableau complet, et &lt;a href="https://aka.ms/database-hub"&gt;inscrivez-vous pour l&amp;rsquo;accès anticipé au Database Hub&lt;/a&gt; si vous voulez essayer la nouvelle expérience de gestion.&lt;/p&gt;</content:encoded></item><item><title>Du laptop à la production : déployer des agents IA sur Microsoft Foundry en deux commandes</title><link>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/deploy-ai-agents-foundry-azd-two-commands/</link><pubDate>Thu, 26 Mar 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/deploy-ai-agents-foundry-azd-two-commands/</guid><description>L'Azure Developer CLI dispose maintenant de commandes 'azd ai agent' qui amènent votre agent IA du développement local à un endpoint Foundry en production en quelques minutes. Voici le workflow complet.</description><content:encoded>&lt;p&gt;Vous connaissez ce fossé entre &amp;ldquo;ça marche sur ma machine&amp;rdquo; et &amp;ldquo;c&amp;rsquo;est déployé et sert du trafic&amp;rdquo; ? Pour les agents IA, ce fossé a été douloureusement large. Il faut provisionner des ressources, déployer des modèles, configurer l&amp;rsquo;identité, mettre en place le monitoring — et tout ça avant que quiconque puisse réellement appeler votre agent.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;Azure Developer CLI vient d&amp;rsquo;en faire une &lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-ai-agent-end-to-end/"&gt;affaire de deux commandes&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="le-nouveau-workflow-azd-ai-agent"&gt;Le nouveau workflow &lt;code&gt;azd ai agent&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Laissez-moi vous montrer ce que ça donne concrètement. Vous avez un projet d&amp;rsquo;agent IA — disons un agent concierge d&amp;rsquo;hôtel. Il fonctionne en local. Vous voulez qu&amp;rsquo;il tourne sur Microsoft Foundry.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;azd ai agent init
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;azd up
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;C&amp;rsquo;est tout. Deux commandes. &lt;code&gt;azd ai agent init&lt;/code&gt; génère l&amp;rsquo;infrastructure-as-code dans votre repo, et &lt;code&gt;azd up&lt;/code&gt; provisionne tout sur Azure et publie votre agent. Vous obtenez un lien direct vers votre agent dans le portail Foundry.&lt;/p&gt;
&lt;h2 id="ce-qui-se-passe-sous-le-capot"&gt;Ce qui se passe sous le capot&lt;/h2&gt;
&lt;p&gt;La commande &lt;code&gt;init&lt;/code&gt; génère de vrais templates Bicep inspectables dans votre repo :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Une &lt;strong&gt;Foundry Resource&lt;/strong&gt; (conteneur de niveau supérieur)&lt;/li&gt;
&lt;li&gt;Un &lt;strong&gt;Foundry Project&lt;/strong&gt; (où vit votre agent)&lt;/li&gt;
&lt;li&gt;Configuration du &lt;strong&gt;déploiement de modèle&lt;/strong&gt; (GPT-4o, etc.)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Identité managée&lt;/strong&gt; avec les attributions de rôles RBAC appropriées&lt;/li&gt;
&lt;li&gt;&lt;code&gt;azure.yaml&lt;/code&gt; pour la carte des services&lt;/li&gt;
&lt;li&gt;&lt;code&gt;agent.yaml&lt;/code&gt; avec les métadonnées de l&amp;rsquo;agent et les variables d&amp;rsquo;environnement&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le point clé : tout cela vous appartient. C&amp;rsquo;est du Bicep versionné dans votre repo. Vous pouvez l&amp;rsquo;inspecter, le personnaliser et le commiter aux côtés du code de votre agent. Pas de boîtes noires magiques.&lt;/p&gt;
&lt;h2 id="la-boucle-interne-de-développement"&gt;La boucle interne de développement&lt;/h2&gt;
&lt;p&gt;Ce que j&amp;rsquo;aime vraiment, c&amp;rsquo;est l&amp;rsquo;expérience de développement local. Quand vous itérez sur la logique de l&amp;rsquo;agent, vous ne voulez pas redéployer à chaque modification d&amp;rsquo;un prompt :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;azd ai agent run
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Cela démarre votre agent localement. Combinez-le avec &lt;code&gt;azd ai agent invoke&lt;/code&gt; pour envoyer des prompts de test, et vous avez une boucle de feedback rapide. Modifier le code, redémarrer, invoquer, répéter.&lt;/p&gt;
&lt;p&gt;La commande &lt;code&gt;invoke&lt;/code&gt; est intelligente pour le routage aussi — quand un agent local tourne, elle le cible automatiquement. Sinon, elle va vers l&amp;rsquo;endpoint distant.&lt;/p&gt;
&lt;h2 id="monitoring-en-temps-réel"&gt;Monitoring en temps réel&lt;/h2&gt;
&lt;p&gt;C&amp;rsquo;est la fonctionnalité qui m&amp;rsquo;a convaincu. Une fois votre agent déployé :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;azd ai agent monitor --follow
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Chaque requête et réponse transitant par votre agent est streamée vers votre terminal en temps réel. Pour déboguer des problèmes en production, c&amp;rsquo;est inestimable. Plus besoin de fouiller dans les Log Analytics, plus d&amp;rsquo;attente pour l&amp;rsquo;agrégation des métriques — vous voyez ce qui se passe maintenant.&lt;/p&gt;
&lt;h2 id="lensemble-complet-des-commandes"&gt;L&amp;rsquo;ensemble complet des commandes&lt;/h2&gt;
&lt;p&gt;Voici la référence rapide :&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Commande&lt;/th&gt;
&lt;th&gt;Ce qu&amp;rsquo;elle fait&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;azd ai agent init&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Scaffold d&amp;rsquo;un projet agent Foundry avec IaC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;azd up&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Provisionne les ressources Azure et déploie l&amp;rsquo;agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;azd ai agent invoke&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Envoie des prompts à l&amp;rsquo;agent distant ou local&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;azd ai agent run&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Exécute l&amp;rsquo;agent localement pour le développement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;azd ai agent monitor&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Streame les logs en temps réel de l&amp;rsquo;agent publié&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;azd ai agent show&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Vérifie la santé et le statut de l&amp;rsquo;agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;azd down&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Nettoie toutes les ressources Azure&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="pourquoi-cest-important-pour-les-développeurs-net"&gt;Pourquoi c&amp;rsquo;est important pour les développeurs .NET&lt;/h2&gt;
&lt;p&gt;Même si l&amp;rsquo;exemple de l&amp;rsquo;annonce est basé sur Python, l&amp;rsquo;histoire de l&amp;rsquo;infrastructure est agnostique au langage. Votre agent .NET bénéficie du même scaffolding Bicep, de la même configuration d&amp;rsquo;identité managée, du même pipeline de monitoring. Et si vous utilisez déjà &lt;code&gt;azd&lt;/code&gt; pour vos apps .NET Aspire ou vos déploiements Azure, ça s&amp;rsquo;intègre directement dans votre workflow existant.&lt;/p&gt;
&lt;p&gt;Le fossé de déploiement pour les agents IA a été l&amp;rsquo;un des plus grands points de friction dans l&amp;rsquo;écosystème. Passer d&amp;rsquo;un prototype fonctionnel à un endpoint de production avec identité, réseau et monitoring appropriés ne devrait pas nécessiter une semaine de travail DevOps. Maintenant il faut deux commandes et quelques minutes.&lt;/p&gt;
&lt;h2 id="pour-conclure"&gt;Pour conclure&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;azd ai agent&lt;/code&gt; est disponible maintenant. Si vous avez repoussé le déploiement de vos agents IA parce que la mise en place de l&amp;rsquo;infrastructure semblait trop de travail, essayez. Consultez le &lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-ai-agent-end-to-end/"&gt;walkthrough complet&lt;/a&gt; pour le guide étape par étape incluant l&amp;rsquo;intégration d&amp;rsquo;une app de chat frontend.&lt;/p&gt;</content:encoded></item><item><title>Foundry Agent Service est GA : Ce qui compte vraiment pour les développeurs d'agents .NET</title><link>https://thedotnetblog.com/fr/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/fr/posts/emiliano-montesdeoca/foundry-agent-service-ga-what-matters/</guid><description>Le Foundry Agent Service de Microsoft vient de passer en GA avec le réseau privé, Voice Live, les évaluations de production et un runtime multi-modèle ouvert. Voici ce que vous devez savoir.</description><content:encoded>&lt;p&gt;Soyons honnêtes — construire un prototype d&amp;rsquo;agent IA est la partie facile. La partie difficile, c&amp;rsquo;est tout ce qui suit : le mettre en production avec un isolement réseau approprié, exécuter des évaluations qui signifient réellement quelque chose, gérer les exigences de conformité, et ne rien casser à 2h du matin.&lt;/p&gt;
&lt;p&gt;Le &lt;a href="https://devblogs.microsoft.com/foundry/foundry-agent-service-ga/"&gt;Foundry Agent Service vient de passer en GA&lt;/a&gt;, et cette version est focalisée comme un laser sur ce fossé du &amp;ldquo;tout ce qui suit&amp;rdquo;.&lt;/p&gt;
&lt;h2 id="construit-sur-la-responses-api"&gt;Construit sur la Responses API&lt;/h2&gt;
&lt;p&gt;Le titre principal : le Foundry Agent Service de nouvelle génération est construit sur l&amp;rsquo;OpenAI Responses API. Si vous construisez déjà avec ce protocole, migrer vers Foundry nécessite des changements de code minimaux. Ce que vous gagnez : sécurité entreprise, réseau privé, RBAC Entra, traçabilité complète et évaluation — par-dessus votre logique d&amp;rsquo;agent existante.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;architecture est intentionnellement ouverte. Vous n&amp;rsquo;êtes pas verrouillé à un fournisseur de modèle ou un framework d&amp;rsquo;orchestration. Utilisez DeepSeek pour la planification, OpenAI pour la génération, LangGraph pour l&amp;rsquo;orchestration — le runtime gère la couche de cohérence.&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 vous venez du package &lt;code&gt;azure-ai-agents&lt;/code&gt;, les agents sont maintenant des opérations de première classe sur &lt;code&gt;AIProjectClient&lt;/code&gt; dans &lt;code&gt;azure-ai-projects&lt;/code&gt;. Supprimez la dépendance standalone et utilisez &lt;code&gt;get_openai_client()&lt;/code&gt; pour piloter les réponses.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="réseau-privé--le-bloqueur-entreprise-supprimé"&gt;Réseau privé : le bloqueur entreprise supprimé&lt;/h2&gt;
&lt;p&gt;C&amp;rsquo;est la fonctionnalité qui débloque l&amp;rsquo;adoption enterprise. Foundry supporte maintenant le réseau privé complet de bout en bout avec BYO VNet :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Aucun egress public&lt;/strong&gt; — le trafic de l&amp;rsquo;agent ne touche jamais l&amp;rsquo;internet public&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Injection de conteneurs/sous-réseaux&lt;/strong&gt; dans votre réseau pour la communication locale&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Connectivité des outils incluse&lt;/strong&gt; — serveurs MCP, Azure AI Search, agents de données Fabric fonctionnent tous sur des chemins privés&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ce dernier point est critique. Ce ne sont pas seulement les appels d&amp;rsquo;inférence qui restent privés — chaque invocation d&amp;rsquo;outil et appel de récupération reste aussi à l&amp;rsquo;intérieur de votre périmètre réseau. Pour les équipes opérant sous des politiques de classification de données qui interdisent le routage externe, c&amp;rsquo;est ce qui manquait.&lt;/p&gt;
&lt;h2 id="authentification-mcp-bien-faite"&gt;Authentification MCP bien faite&lt;/h2&gt;
&lt;p&gt;Les connexions aux serveurs MCP supportent maintenant le spectre complet des patterns d&amp;rsquo;authentification :&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Méthode d&amp;rsquo;auth&lt;/th&gt;
&lt;th&gt;Quand l&amp;rsquo;utiliser&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Basée sur clé&lt;/td&gt;
&lt;td&gt;Accès partagé simple pour les outils internes à l&amp;rsquo;organisation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entra Agent Identity&lt;/td&gt;
&lt;td&gt;Service à service ; l&amp;rsquo;agent s&amp;rsquo;authentifie comme lui-même&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entra Managed Identity&lt;/td&gt;
&lt;td&gt;Isolation par projet ; pas de gestion de credentials&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OAuth Identity Passthrough&lt;/td&gt;
&lt;td&gt;Accès délégué par utilisateur ; l&amp;rsquo;agent agit au nom des utilisateurs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;OAuth Identity Passthrough est le plus intéressant. Quand les utilisateurs doivent donner à un agent l&amp;rsquo;accès à leurs données personnelles — leur OneDrive, leur organisation Salesforce, une API SaaS scopée par utilisateur — l&amp;rsquo;agent agit en leur nom avec des flux OAuth standard. Pas d&amp;rsquo;identité système partagée prétendant être tout le monde.&lt;/p&gt;
&lt;h2 id="voice-live--voix-à-voix-sans-la-plomberie"&gt;Voice Live : voix à voix sans la plomberie&lt;/h2&gt;
&lt;p&gt;Ajouter la voix à un agent signifiait auparavant assembler STT, LLM et TTS — trois services, trois sauts de latence, trois surfaces de facturation, le tout synchronisé à la main. &lt;strong&gt;Voice Live&lt;/strong&gt; condense tout ça en une seule API managée avec :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Détection sémantique de l&amp;rsquo;activité vocale et de fin de tour (comprend le sens, pas juste le silence)&lt;/li&gt;
&lt;li&gt;Suppression du bruit et annulation d&amp;rsquo;écho côté serveur&lt;/li&gt;
&lt;li&gt;Support du barge-in (les utilisateurs peuvent interrompre en pleine réponse)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Les interactions vocales passent par le même runtime d&amp;rsquo;agent que le texte. Mêmes évaluateurs, mêmes traces, même visibilité des coûts. Pour le support client, le service terrain ou les scénarios d&amp;rsquo;accessibilité, ça remplace ce qui nécessitait auparavant un pipeline audio personnalisé.&lt;/p&gt;
&lt;h2 id="évaluations--de-la-case-à-cocher-au-monitoring-continu"&gt;Évaluations : de la case à cocher au monitoring continu&lt;/h2&gt;
&lt;p&gt;C&amp;rsquo;est là que Foundry devient sérieux sur la qualité en production. Le système d&amp;rsquo;évaluation a maintenant trois couches :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Évaluateurs prêts à l&amp;rsquo;emploi&lt;/strong&gt; — cohérence, pertinence, fondement, qualité de récupération, sécurité. Connectez à un dataset ou au trafic en direct et obtenez des scores.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Évaluateurs personnalisés&lt;/strong&gt; — encodez votre propre logique métier, standards de ton et règles de conformité spécifiques au domaine.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Évaluation continue&lt;/strong&gt; — Foundry échantillonne le trafic de production en direct, exécute votre suite d&amp;rsquo;évaluateurs et affiche les résultats dans des tableaux de bord. Configurez des alertes Azure Monitor pour quand le fondement baisse ou que les seuils de sécurité sont dépassés.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Tout est publié dans Azure Monitor Application Insights. Qualité de l&amp;rsquo;agent, santé de l&amp;rsquo;infrastructure, coûts et télémétrie applicative — tout au même endroit.&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="six-nouvelles-régions-pour-les-agents-hébergés"&gt;Six nouvelles régions pour les agents hébergés&lt;/h2&gt;
&lt;p&gt;Les agents hébergés sont maintenant disponibles dans East US, North Central US, Sweden Central, Southeast Asia, Japan East et plus. C&amp;rsquo;est important pour les exigences de résidence des données et pour comprimer la latence quand votre agent tourne près de ses sources de données.&lt;/p&gt;
&lt;h2 id="pourquoi-cest-important-pour-les-développeurs-net"&gt;Pourquoi c&amp;rsquo;est important pour les développeurs .NET&lt;/h2&gt;
&lt;p&gt;Même si les exemples de code dans l&amp;rsquo;annonce GA sont Python-first, l&amp;rsquo;infrastructure sous-jacente est agnostique au langage — et le SDK .NET pour &lt;code&gt;azure-ai-projects&lt;/code&gt; suit les mêmes patterns. La Responses API, le framework d&amp;rsquo;évaluation, le réseau privé, l&amp;rsquo;auth MCP — tout cela est disponible depuis .NET.&lt;/p&gt;
&lt;p&gt;Si vous attendiez que les agents IA passent de &amp;ldquo;démo cool&amp;rdquo; à &amp;ldquo;je peux réellement livrer ça au travail&amp;rdquo;, cette version GA est le signal. Réseau privé, authentification appropriée, évaluation continue et monitoring de production sont les pièces qui manquaient.&lt;/p&gt;
&lt;h2 id="pour-conclure"&gt;Pour conclure&lt;/h2&gt;
&lt;p&gt;Foundry Agent Service est disponible maintenant. Installez le SDK, ouvrez &lt;a href="https://ai.azure.com"&gt;le portail&lt;/a&gt; et commencez à construire. Le &lt;a href="https://learn.microsoft.com/azure/foundry/quickstarts/get-started-code"&gt;guide de démarrage rapide&lt;/a&gt; vous amène de zéro à un agent en fonctionnement en quelques minutes.&lt;/p&gt;
&lt;p&gt;Pour le deep-dive technique complet avec tous les exemples de code, consultez l&amp;rsquo;&lt;a href="https://devblogs.microsoft.com/foundry/foundry-agent-service-ga/"&gt;annonce GA&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Le serveur MCP Azure DevOps débarque dans Microsoft Foundry : ce que ça signifie pour vos agents IA</title><link>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/azure-devops-mcp-server-microsoft-foundry/</link><pubDate>Thu, 26 Mar 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/posts/emiliano-montesdeoca/azure-devops-mcp-server-microsoft-foundry/</guid><description>Le serveur MCP Azure DevOps est maintenant disponible dans Microsoft Foundry. Connectez vos agents IA directement aux workflows DevOps — work items, repos, pipelines — en quelques clics.</description><content:encoded>&lt;p&gt;MCP (Model Context Protocol) a le vent en poupe. Si vous suivez l&amp;rsquo;écosystème des agents IA, vous avez probablement remarqué que les serveurs MCP apparaissent partout — donnant aux agents la capacité d&amp;rsquo;interagir avec des outils et services externes via un protocole standardisé.&lt;/p&gt;
&lt;p&gt;Maintenant le &lt;a href="https://devblogs.microsoft.com/devops/remote-mcp-server-preview-in-microsoft-foundry/"&gt;serveur MCP Azure DevOps est disponible dans Microsoft Foundry&lt;/a&gt;, et c&amp;rsquo;est une de ces intégrations qui fait réfléchir aux possibilités pratiques.&lt;/p&gt;
&lt;h2 id="ce-qui-se-passe-réellement-ici"&gt;Ce qui se passe réellement ici&lt;/h2&gt;
&lt;p&gt;Microsoft a déjà publié le serveur MCP Azure DevOps en &lt;a href="https://devblogs.microsoft.com/devops/azure-devops-remote-mcp-server-public-preview"&gt;public preview&lt;/a&gt; — c&amp;rsquo;est le serveur MCP lui-même. La nouveauté, c&amp;rsquo;est l&amp;rsquo;intégration Foundry. Vous pouvez maintenant ajouter le serveur MCP Azure DevOps à vos agents Foundry directement depuis le catalogue d&amp;rsquo;outils.&lt;/p&gt;
&lt;p&gt;Pour ceux qui ne connaissent pas encore Foundry : c&amp;rsquo;est la plateforme unifiée de Microsoft pour construire et gérer des applications et agents alimentés par l&amp;rsquo;IA à grande échelle. Accès aux modèles, orchestration, évaluation, déploiement — tout au même endroit.&lt;/p&gt;
&lt;h2 id="la-mise-en-place"&gt;La mise en place&lt;/h2&gt;
&lt;p&gt;La configuration est étonnamment simple :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Dans votre agent Foundry, allez dans &lt;strong&gt;Add Tools&lt;/strong&gt; &amp;gt; &lt;strong&gt;Catalog&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Cherchez &amp;ldquo;Azure DevOps&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Sélectionnez le Azure DevOps MCP Server (preview) et cliquez sur &lt;strong&gt;Create&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Entrez le nom de votre organisation et connectez&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;C&amp;rsquo;est tout. Votre agent a maintenant accès aux outils Azure DevOps.&lt;/p&gt;
&lt;h2 id="contrôler-ce-à-quoi-votre-agent-peut-accéder"&gt;Contrôler ce à quoi votre agent peut accéder&lt;/h2&gt;
&lt;p&gt;C&amp;rsquo;est la partie que j&amp;rsquo;apprécie : vous n&amp;rsquo;êtes pas coincé avec une approche tout-ou-rien. Vous pouvez spécifier quels outils sont disponibles pour votre agent. Si vous voulez qu&amp;rsquo;il ne lise que les work items sans toucher aux pipelines, vous pouvez configurer ça. Principe du moindre privilège, appliqué à vos agents IA.&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est important pour les scénarios enterprise où vous ne voulez pas qu&amp;rsquo;un agent déclenche accidentellement un pipeline de déploiement parce que quelqu&amp;rsquo;un lui a demandé d&amp;rsquo;&amp;ldquo;aider avec la release.&amp;rdquo;&lt;/p&gt;
&lt;h2 id="pourquoi-cest-intéressant-pour-les-équipes-net"&gt;Pourquoi c&amp;rsquo;est intéressant pour les équipes .NET&lt;/h2&gt;
&lt;p&gt;Pensez à ce que ça permet en pratique :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Assistants de planification de sprint&lt;/strong&gt; — des agents qui peuvent récupérer les work items, analyser les données de vélocité et suggérer la capacité du sprint&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bots de code review&lt;/strong&gt; — des agents qui comprennent le contexte de votre PR parce qu&amp;rsquo;ils peuvent réellement lire vos repos et work items liés&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Réponse aux incidents&lt;/strong&gt; — des agents qui peuvent créer des work items, interroger les déploiements récents et corréler les bugs avec les changements récents&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Onboarding des développeurs&lt;/strong&gt; — &amp;ldquo;Sur quoi devrais-je travailler ?&amp;rdquo; obtient une vraie réponse basée sur les données réelles du projet&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pour les équipes .NET qui utilisent déjà Azure DevOps pour leurs pipelines CI/CD et la gestion de projet, avoir un agent IA qui peut interagir directement avec ces systèmes est un pas significatif vers une automatisation utile.&lt;/p&gt;
&lt;h2 id="la-vision-plus-large-de-mcp"&gt;La vision plus large de MCP&lt;/h2&gt;
&lt;p&gt;Cela fait partie d&amp;rsquo;une tendance plus large : les serveurs MCP deviennent le moyen standard par lequel les agents IA interagissent avec le monde extérieur. On les voit pour GitHub, Azure DevOps, les bases de données, les APIs SaaS — et Foundry devient le hub où toutes ces connexions convergent.&lt;/p&gt;
&lt;p&gt;Si vous construisez des agents dans l&amp;rsquo;écosystème .NET, MCP mérite votre attention. Le protocole est standardisé, l&amp;rsquo;outillage mûrit, et l&amp;rsquo;intégration Foundry le rend accessible sans avoir à câbler manuellement les connexions serveur.&lt;/p&gt;
&lt;h2 id="pour-conclure"&gt;Pour conclure&lt;/h2&gt;
&lt;p&gt;Le serveur MCP Azure DevOps dans Foundry est en preview, alors attendez-vous à ce qu&amp;rsquo;il évolue. Mais le workflow de base est solide : connecter, configurer l&amp;rsquo;accès aux outils, et laisser vos agents travailler avec vos données DevOps. Si vous êtes déjà dans l&amp;rsquo;écosystème Foundry, c&amp;rsquo;est à quelques clics. Essayez et voyez quels workflows vous pouvez construire.&lt;/p&gt;
&lt;p&gt;Consultez l&amp;rsquo;&lt;a href="https://devblogs.microsoft.com/devops/remote-mcp-server-preview-in-microsoft-foundry/"&gt;annonce complète&lt;/a&gt; pour la configuration étape par étape et plus de détails.&lt;/p&gt;</content:encoded></item><item><title>Les réponses en arrière-plan dans Microsoft Agent Framework : fini l'angoisse des timeouts</title><link>https://thedotnetblog.com/fr/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/fr/posts/emiliano-montesdeoca/background-responses-agent-framework-long-running-tasks/</guid><description>Microsoft Agent Framework permet maintenant de décharger les tâches IA longues avec des tokens de continuation. Voici comment fonctionnent les réponses en arrière-plan et pourquoi elles comptent pour vos agents .NET.</description><content:encoded>&lt;p&gt;Si vous avez construit quoi que ce soit avec des modèles de raisonnement comme o3 ou GPT-5.2, vous connaissez la douleur. Votre agent commence à réfléchir à une tâche complexe, le client attend, et quelque part entre &amp;ldquo;ça va&amp;rdquo; et &amp;ldquo;est-ce que ça a planté ?&amp;rdquo; votre connexion expire. Tout ce travail ? Perdu.&lt;/p&gt;
&lt;p&gt;Microsoft Agent Framework vient de livrer les &lt;a href="https://devblogs.microsoft.com/agent-framework/handling-long-running-operations-with-background-responses/"&gt;réponses en arrière-plan&lt;/a&gt; — et honnêtement, c&amp;rsquo;est une de ces fonctionnalités qui auraient dû exister depuis le premier jour.&lt;/p&gt;
&lt;h2 id="le-problème-avec-les-appels-bloquants"&gt;Le problème avec les appels bloquants&lt;/h2&gt;
&lt;p&gt;Dans un schéma requête-réponse traditionnel, votre client bloque jusqu&amp;rsquo;à ce que l&amp;rsquo;agent termine. Ça marche bien pour les tâches rapides. Mais quand vous demandez à un modèle de raisonnement de faire une recherche approfondie, une analyse en plusieurs étapes, ou de générer un rapport de 20 pages ? Vous regardez des minutes de temps réel. Pendant cette fenêtre :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Les connexions HTTP peuvent expirer&lt;/li&gt;
&lt;li&gt;Les coupures réseau tuent toute l&amp;rsquo;opération&lt;/li&gt;
&lt;li&gt;Votre utilisateur fixe un spinner en se demandant s&amp;rsquo;il se passe quelque chose&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Les réponses en arrière-plan inversent la donne.&lt;/p&gt;
&lt;h2 id="comment-fonctionnent-les-tokens-de-continuation"&gt;Comment fonctionnent les tokens de continuation&lt;/h2&gt;
&lt;p&gt;Au lieu de bloquer, vous lancez la tâche de l&amp;rsquo;agent et récupérez un &lt;strong&gt;token de continuation&lt;/strong&gt;. Pensez-y comme un ticket de retrait dans un atelier de réparation — vous ne restez pas debout au comptoir à attendre, vous revenez quand c&amp;rsquo;est prêt.&lt;/p&gt;
&lt;p&gt;Le flux est direct :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Envoyez votre requête avec &lt;code&gt;AllowBackgroundResponses = true&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Si l&amp;rsquo;agent supporte le traitement en arrière-plan, vous recevez un token de continuation&lt;/li&gt;
&lt;li&gt;Interrogez à votre rythme jusqu&amp;rsquo;à ce que le token retourne &lt;code&gt;null&lt;/code&gt; — ça signifie que le résultat est prêt&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Voici la version .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;// Interroger jusqu&amp;#39;à complétion&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 finit immédiatement (tâches simples, modèles qui n&amp;rsquo;ont pas besoin de traitement en arrière-plan), aucun token de continuation n&amp;rsquo;est renvoyé. Votre code fonctionne simplement — aucun traitement spécial nécessaire.&lt;/p&gt;
&lt;h2 id="streaming-avec-reprise--la-vraie-magie"&gt;Streaming avec reprise : la vraie magie&lt;/h2&gt;
&lt;p&gt;Le polling convient pour les scénarios fire-and-forget, mais que faire quand vous voulez un progrès en temps réel ? Les réponses en arrière-plan supportent aussi le streaming avec reprise intégrée.&lt;/p&gt;
&lt;p&gt;Chaque mise à jour streamée porte son propre token de continuation. Si votre connexion tombe en plein stream, vous reprenez exactement là où vous en étiez :&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;// Simuler une interruption réseau&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span 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;// Reprendre exactement là où nous en étions&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 continue le traitement côté serveur indépendamment de ce qui se passe avec votre client. C&amp;rsquo;est de la tolérance aux pannes intégrée sans que vous écriviez de la logique de retry ou des circuit breakers.&lt;/p&gt;
&lt;h2 id="quand-utiliser-ça-concrètement"&gt;Quand utiliser ça concrètement&lt;/h2&gt;
&lt;p&gt;Tous les appels d&amp;rsquo;agent n&amp;rsquo;ont pas besoin de réponses en arrière-plan. Pour les completions rapides, vous ajoutez de la complexité pour rien. Mais voici où elles brillent :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tâches de raisonnement complexe&lt;/strong&gt; — analyse en plusieurs étapes, recherche approfondie, tout ce qui fait vraiment réfléchir un modèle de raisonnement&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Génération de contenu long&lt;/strong&gt; — rapports détaillés, documents en plusieurs parties, analyses approfondies&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Réseaux peu fiables&lt;/strong&gt; — clients mobiles, déploiements edge, VPN d&amp;rsquo;entreprise instables&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Patterns UX asynchrones&lt;/strong&gt; — soumettez une tâche, allez faire autre chose, revenez pour les résultats&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pour nous développeurs .NET qui construisons des apps enterprise, ce dernier point est particulièrement intéressant. Pensez à une app Blazor où un utilisateur demande un rapport complexe — vous lancez la tâche de l&amp;rsquo;agent, affichez un indicateur de progression, et le laissez continuer à travailler. Pas d&amp;rsquo;acrobaties WebSocket, pas d&amp;rsquo;infrastructure de file d&amp;rsquo;attente personnalisée, juste un token et une boucle de polling.&lt;/p&gt;
&lt;h2 id="pour-conclure"&gt;Pour conclure&lt;/h2&gt;
&lt;p&gt;Les réponses en arrière-plan sont disponibles maintenant en .NET et Python via Microsoft Agent Framework. Si vous construisez des agents qui font plus que du simple Q&amp;amp;A, ça vaut le coup de l&amp;rsquo;ajouter à votre boîte à outils. Le pattern du token de continuation garde les choses simples tout en résolvant un vrai problème de production.&lt;/p&gt;
&lt;p&gt;Consultez la &lt;a href="https://devblogs.microsoft.com/agent-framework/handling-long-running-operations-with-background-responses/"&gt;documentation complète&lt;/a&gt; pour la référence API complète et plus d&amp;rsquo;exemples.&lt;/p&gt;</content:encoded></item><item><title>VS Code 1.112 : Ce qui devrait vraiment intéresser les développeurs .NET</title><link>https://thedotnetblog.com/fr/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/fr/posts/emiliano-montesdeoca/vscode-1-112-dotnet-developers/</guid><description>VS Code 1.112 vient de sortir avec des améliorations d'agents, un débogueur de navigateur intégré, le sandboxing MCP et le support monorepo. Voici ce qui compte vraiment si vous développez avec .NET.</description><content:encoded>&lt;p&gt;VS Code 1.112 vient d&amp;rsquo;atterrir, et honnêtement ? Celui-ci frappe différemment si vous passez vos journées dans le monde .NET. Il y a beaucoup dans les &lt;a href="https://code.visualstudio.com/updates/v1_112"&gt;notes de version officielles&lt;/a&gt;, mais laissez-moi vous épargner du défilement et me concentrer sur ce qui nous importe vraiment.&lt;/p&gt;
&lt;h2 id="copilot-cli-est-devenu-bien-plus-utile"&gt;Copilot CLI est devenu bien plus utile&lt;/h2&gt;
&lt;p&gt;Le grand thème de cette version est l&amp;rsquo;&lt;strong&gt;autonomie de l&amp;rsquo;agent&lt;/strong&gt; — donner à Copilot plus de liberté pour faire son travail sans que vous surveilliez chaque étape.&lt;/p&gt;
&lt;h3 id="direction-et-file-dattente-de-messages"&gt;Direction et file d&amp;rsquo;attente de messages&lt;/h3&gt;
&lt;p&gt;Vous connaissez ce moment où Copilot CLI est à mi-chemin d&amp;rsquo;une tâche et vous réalisez que vous avez oublié de mentionner quelque chose ? Avant, vous deviez attendre. Maintenant vous pouvez envoyer des messages pendant qu&amp;rsquo;une requête est encore en cours — soit pour diriger la réponse actuelle, soit pour mettre en file d&amp;rsquo;attente des instructions de suivi.&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est énorme pour ces tâches de scaffolding &lt;code&gt;dotnet&lt;/code&gt; plus longues où vous regardez Copilot configurer un projet et pensez &amp;ldquo;oh attends, j&amp;rsquo;ai aussi besoin de MassTransit là-dedans.&amp;rdquo;&lt;/p&gt;
&lt;h3 id="niveaux-de-permissions"&gt;Niveaux de permissions&lt;/h3&gt;
&lt;p&gt;C&amp;rsquo;est celui qui m&amp;rsquo;excite le plus. Les sessions Copilot CLI supportent maintenant trois niveaux de permissions :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Permissions par défaut&lt;/strong&gt; — le flux habituel où les outils demandent confirmation avant d&amp;rsquo;exécuter&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Contourner les approbations&lt;/strong&gt; — auto-approuve tout et réessaie en cas d&amp;rsquo;erreur&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Autopilote&lt;/strong&gt; — entièrement autonome : approuve les outils, répond à ses propres questions et continue jusqu&amp;rsquo;à ce que la tâche soit terminée&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si vous faites quelque chose comme créer une nouvelle API ASP.NET Core avec Entity Framework, des migrations et un setup Docker — le mode Autopilote signifie que vous décrivez ce que vous voulez et allez chercher un café. Il se débrouillera.&lt;/p&gt;
&lt;p&gt;Vous pouvez activer l&amp;rsquo;Autopilote avec le paramètre &lt;code&gt;chat.autopilot.enabled&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="prévisualiser-les-changements-avant-délégation"&gt;Prévisualiser les changements avant délégation&lt;/h3&gt;
&lt;p&gt;Quand vous déléguez une tâche à Copilot CLI, il crée un worktree. Avant, si vous aviez des changements non commités, vous deviez vérifier le Contrôle de Source pour voir ce qui serait affecté. Maintenant la vue Chat affiche les changements en attente juste là avant que vous décidiez de les copier, déplacer ou ignorer.&lt;/p&gt;
&lt;p&gt;Petit détail, mais ça vous évite ce moment &amp;ldquo;attends, qu&amp;rsquo;est-ce que j&amp;rsquo;avais en staging ?&amp;rdquo;&lt;/p&gt;
&lt;h2 id="déboguez-les-apps-web-sans-quitter-vs-code"&gt;Déboguez les apps web sans quitter VS Code&lt;/h2&gt;
&lt;p&gt;Le navigateur intégré supporte maintenant le &lt;strong&gt;débogage complet&lt;/strong&gt;. Vous pouvez placer des breakpoints, parcourir le code pas à pas et inspecter les variables — le tout dans VS Code. Plus besoin de basculer vers Edge DevTools.&lt;/p&gt;
&lt;p&gt;Il y a un nouveau type de débogage &lt;code&gt;editor-browser&lt;/code&gt;, et si vous avez déjà des configurations de lancement &lt;code&gt;msedge&lt;/code&gt; ou &lt;code&gt;chrome&lt;/code&gt;, migrer est aussi simple que changer le champ &lt;code&gt;type&lt;/code&gt; dans votre &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;Pour les développeurs Blazor, c&amp;rsquo;est un game changer. Vous exécutez déjà &lt;code&gt;dotnet watch&lt;/code&gt; dans le terminal — maintenant votre débogage reste dans la même fenêtre aussi.&lt;/p&gt;
&lt;p&gt;Le navigateur a aussi obtenu des niveaux de zoom indépendants (enfin), des menus contextuels avec clic droit appropriés, et le zoom est mémorisé par site web.&lt;/p&gt;
&lt;h2 id="sandboxing-des-serveurs-mcp"&gt;Sandboxing des serveurs MCP&lt;/h2&gt;
&lt;p&gt;Ceci importe plus que vous ne le pensez. Si vous utilisez des serveurs MCP — peut-être que vous en avez configuré un personnalisé pour vos ressources Azure ou vos requêtes de base de données — ils fonctionnaient avec les mêmes permissions que votre processus VS Code. Ça signifie un accès total à votre système de fichiers, réseau, tout.&lt;/p&gt;
&lt;p&gt;Maintenant vous pouvez les sandboxer. Dans votre &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;Quand un serveur sandboxé a besoin d&amp;rsquo;accéder à quelque chose qu&amp;rsquo;il n&amp;rsquo;a pas, VS Code vous demande d&amp;rsquo;accorder la permission. Bien mieux que l&amp;rsquo;approche &amp;ldquo;espérons que personne ne fait rien de bizarre&amp;rdquo;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note :&lt;/strong&gt; Le sandboxing est disponible sur macOS et Linux pour l&amp;rsquo;instant. Le support Windows arrive — les scénarios distants comme WSL fonctionnent cependant.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="découverte-des-personnalisations-en-monorepo"&gt;Découverte des personnalisations en monorepo&lt;/h2&gt;
&lt;p&gt;Si vous travaillez dans un monorepo (et soyons honnêtes, beaucoup de solutions .NET d&amp;rsquo;entreprise finissent par en être un), ça résout un vrai point douloureux.&lt;/p&gt;
&lt;p&gt;Avant, si vous ouvriez un sous-dossier de votre repo, VS Code ne trouvait pas votre &lt;code&gt;copilot-instructions.md&lt;/code&gt;, &lt;code&gt;AGENTS.md&lt;/code&gt; ou vos skills personnalisés situés à la racine du dépôt. Maintenant avec le paramètre &lt;code&gt;chat.useCustomizationsInParentRepositories&lt;/code&gt;, il remonte jusqu&amp;rsquo;à la racine &lt;code&gt;.git&lt;/code&gt; et découvre tout.&lt;/p&gt;
&lt;p&gt;Ça signifie que votre équipe peut partager des instructions d&amp;rsquo;agent, des fichiers de prompt et des outils personnalisés entre tous les projets dans un monorepo sans que tout le monde ait à ouvrir le dossier racine.&lt;/p&gt;
&lt;h2 id="troubleshoot-pour-le-débogage-dagents"&gt;/troubleshoot pour le débogage d&amp;rsquo;agents&lt;/h2&gt;
&lt;p&gt;Vous avez déjà configuré des instructions personnalisées ou des skills et vous vous êtes demandé pourquoi ils ne sont pas détectés ? Le nouveau skill &lt;code&gt;/troubleshoot&lt;/code&gt; lit les logs de débogage de l&amp;rsquo;agent et vous dit ce qui s&amp;rsquo;est passé — quels outils ont été utilisés ou ignorés, pourquoi les instructions n&amp;rsquo;ont pas chargé, et ce qui cause des réponses lentes.&lt;/p&gt;
&lt;p&gt;Activez-le avec :&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;Puis tapez simplement &lt;code&gt;/troubleshoot why is my custom skill not loading?&lt;/code&gt; dans le chat.&lt;/p&gt;
&lt;p&gt;Vous pouvez aussi exporter et importer ces logs de débogage maintenant, ce qui est super pour les partager avec votre équipe quand quelque chose ne fonctionne pas comme prévu.&lt;/p&gt;
&lt;h2 id="support-des-fichiers-image-et-binaires"&gt;Support des fichiers image et binaires&lt;/h2&gt;
&lt;p&gt;Les agents peuvent maintenant lire les fichiers image depuis le disque et les fichiers binaires nativement. Les fichiers binaires sont présentés au format hexdump, et les sorties image (comme les captures d&amp;rsquo;écran du navigateur intégré) s&amp;rsquo;affichent dans une vue carrousel.&lt;/p&gt;
&lt;p&gt;Pour les développeurs .NET, pensez : collez une capture d&amp;rsquo;écran d&amp;rsquo;un bug UI dans le chat et laissez l&amp;rsquo;agent comprendre ce qui ne va pas, ou faites-lui analyser la sortie du rendu d&amp;rsquo;un composant Blazor.&lt;/p&gt;
&lt;h2 id="références-de-symboles-automatiques"&gt;Références de symboles automatiques&lt;/h2&gt;
&lt;p&gt;Petite amélioration de qualité de vie : quand vous copiez un nom de symbole (une classe, méthode, etc.) et le collez dans le chat, VS Code le convertit maintenant automatiquement en une référence &lt;code&gt;#sym:Name&lt;/code&gt;. Ça donne à l&amp;rsquo;agent le contexte complet sur ce symbole sans que vous ayez à l&amp;rsquo;ajouter manuellement.&lt;/p&gt;
&lt;p&gt;Si vous voulez du texte brut à la place, utilisez &lt;code&gt;Ctrl+Shift+V&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="les-plugins-peuvent-maintenant-être-activésdésactivés"&gt;Les plugins peuvent maintenant être activés/désactivés&lt;/h2&gt;
&lt;p&gt;Avant, désactiver un serveur MCP ou un plugin signifiait le désinstaller. Maintenant vous pouvez les activer et désactiver — globalement et par workspace. Clic droit dans la vue Extensions ou la vue Personnalisations et c&amp;rsquo;est fait.&lt;/p&gt;
&lt;p&gt;Les plugins de npm et pypi peuvent aussi se mettre à jour automatiquement maintenant, bien qu&amp;rsquo;ils demanderont une approbation d&amp;rsquo;abord puisque les mises à jour signifient exécuter du nouveau code sur votre machine.&lt;/p&gt;
&lt;h2 id="pour-conclure"&gt;Pour conclure&lt;/h2&gt;
&lt;p&gt;VS Code 1.112 pousse clairement fort sur l&amp;rsquo;expérience agent — plus d&amp;rsquo;autonomie, meilleur débogage, sécurité plus serrée. Pour les développeurs .NET, le débogage du navigateur intégré et les améliorations de Copilot CLI sont les fonctionnalités phares.&lt;/p&gt;
&lt;p&gt;Si vous n&amp;rsquo;avez pas encore essayé de lancer une session Copilot CLI complète en mode Autopilote pour un projet .NET, cette version est un bon moment pour commencer. N&amp;rsquo;oubliez pas de configurer vos permissions et laissez mijoter.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://code.visualstudio.com/updates/v1_112"&gt;Télécharger VS Code 1.112&lt;/a&gt; ou mettre à jour depuis VS Code via &lt;strong&gt;Aide &amp;gt; Vérifier les mises à jour&lt;/strong&gt;.&lt;/p&gt;</content:encoded></item><item><title>Contribuer à The .NET Blog</title><link>https://thedotnetblog.com/fr/contribute/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thedotnetblog.com/fr/contribute/</guid><description>Partagez vos connaissances avec la communauté .NET. Découvrez comment rejoindre le blog en tant qu'auteur et soumettre votre premier article.</description><content:encoded>&lt;p&gt;The .NET Blog est une publication communautaire où les développeurs partagent des analyses, des tutoriels et des histoires sur .NET, Azure, l&amp;rsquo;IA et le développement cloud-native. &lt;strong&gt;Nous accueillons les contributions de développeurs de tous niveaux&lt;/strong&gt; — que vous écriviez votre premier article technique ou que vous soyez un conférencier expérimenté.&lt;/p&gt;
&lt;h2 id="comment-rejoindre"&gt;Comment rejoindre&lt;/h2&gt;
&lt;p&gt;Tout se passe sur GitHub avec un workflow de pull requests. Voici comment commencer :&lt;/p&gt;
&lt;h3 id="1-forker-le-dépôt"&gt;1. Forker le dépôt&lt;/h3&gt;
&lt;p&gt;Rendez-vous sur &lt;a href="https://github.com/thedotnetblog/blog"&gt;github.com/thedotnetblog/blog&lt;/a&gt; et forkez le dépôt sur votre compte GitHub.&lt;/p&gt;
&lt;h3 id="2-créer-votre-profil-dauteur"&gt;2. Créer votre profil d&amp;rsquo;auteur&lt;/h3&gt;
&lt;p&gt;Si c&amp;rsquo;est votre première contribution, ajoutez-vous comme auteur en créant un dossier dans &lt;code&gt;content/authors/your-username/&lt;/code&gt; avec un fichier &lt;code&gt;index.md&lt;/code&gt; contenant votre nom, rôle et biographie. Ajoutez votre image d&amp;rsquo;avatar (carrée, au moins 200x200px) dans &lt;code&gt;static/img/authors/&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="3-rédiger-votre-article"&gt;3. Rédiger votre article&lt;/h3&gt;
&lt;p&gt;Créez un nouveau dossier dans &lt;code&gt;content/posts/your-username/your-post-slug/&lt;/code&gt; et ajoutez un fichier &lt;code&gt;index.md&lt;/code&gt; avec le titre, la date, l&amp;rsquo;auteur, la description et les tags.&lt;/p&gt;
&lt;h3 id="4-ouvrir-une-pull-request"&gt;4. Ouvrir une Pull Request&lt;/h3&gt;
&lt;p&gt;Poussez vos modifications sur votre fork et ouvrez une pull request vers la branche &lt;code&gt;main&lt;/code&gt;. Notre équipe la passera en revue et fournira des commentaires dans les quelques jours.&lt;/p&gt;
&lt;h2 id="ce-que-nous-recherchons"&gt;Ce que nous recherchons&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tutoriels&lt;/strong&gt; — guides pas à pas sur .NET, Azure, IA, Blazor, Aspire et plus&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Analyses approfondies&lt;/strong&gt; — explorations détaillées d&amp;rsquo;une technologie, d&amp;rsquo;un pattern ou d&amp;rsquo;une architecture&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Histoires de la communauté&lt;/strong&gt; — votre expérience avec .NET en production&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Résumés d&amp;rsquo;événements&lt;/strong&gt; — comptes-rendus de conférences, meetups ou webinaires&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="directives"&gt;Directives&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Le contenu doit être technique et pertinent pour l&amp;rsquo;écosystème .NET&lt;/li&gt;
&lt;li&gt;Les exemples de code doivent être exacts et testés dans un vrai projet&lt;/li&gt;
&lt;li&gt;Inclure une description significative et au moins un tag pertinent&lt;/li&gt;
&lt;li&gt;Les articles sont automatiquement traduits dans toutes les langues supportées&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contact"&gt;Contact&lt;/h2&gt;
&lt;p&gt;Ouvrez une issue sur &lt;a href="https://github.com/thedotnetblog/blog/issues"&gt;GitHub&lt;/a&gt; ou contactez-nous sur &lt;a href="https://x.com/thedotnetblog"&gt;X / Twitter&lt;/a&gt;. Nous serions ravis de vous accueillir dans la communauté !&lt;/p&gt;</content:encoded></item><item><title>Emiliano Montesdeoca</title><link>https://thedotnetblog.com/fr/authors/emiliano-montesdeoca/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://thedotnetblog.com/fr/authors/emiliano-montesdeoca/</guid><description/><content:encoded/></item></channel></rss>