<?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>Ai | The .NET Blog</title><link>https://thedotnetblog.com/fr/tags/ai/</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>Wed, 03 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://thedotnetblog.com/fr/tags/ai/index.xml" rel="self" type="application/rss+xml"/><item><title>NL2SQL est l'injection SQL de l'ère agentique</title><link>https://thedotnetblog.com/fr/news/emiliano-montesdeoca/nl2sql-agentic-sql-injection-mcp-server/</link><pubDate>Wed, 03 Jun 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/news/emiliano-montesdeoca/nl2sql-agentic-sql-injection-mcp-server/</guid><description>Avant de laisser un agent interroger votre base de données en langage naturel, lisez ceci. NL2SQL semble simple jusqu'à ce que vous réfléchissiez à la complétude du schéma, à l'indéterminisme et à ce que SQL MCP Server résout vraiment.</description><content:encoded>&lt;p&gt;Il existe une version du discours NL2SQL qui semble parfaite : les utilisateurs posent des questions en langage naturel, les agents génèrent du SQL, les données reviennent. Moins d&amp;rsquo;écrans, moins de requêtes, moins de code. Simple.&lt;/p&gt;
&lt;p&gt;Puis vous y réfléchissez cinq minutes de plus.&lt;/p&gt;
&lt;h2 id="les-problèmes-dont-personne-ne-parle-dans-la-démo"&gt;Les problèmes dont personne ne parle dans la démo&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Les schémas n&amp;rsquo;ont pas été conçus pour expliquer les choses.&lt;/strong&gt; Noms de tables cryptiques, noms de colonnes incohérents, relations techniquement valides mais sémantiquement invalides sans prédicats supplémentaires — c&amp;rsquo;est normal dans les bases de données d&amp;rsquo;entreprise. Ce ne sont pas des bugs, c&amp;rsquo;est simplement l&amp;rsquo;histoire accumulée des changements métier. Mais quand vous demandez à un modèle d&amp;rsquo;inférer l&amp;rsquo;intention d&amp;rsquo;un schéma qui n&amp;rsquo;a pas été conçu pour communiquer l&amp;rsquo;intention, le modèle essaiera quand même. Il ne s&amp;rsquo;arrêtera pas. Il générera sa meilleure requête et retournera des résultats avec assurance.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les modèles ne sont pas déterministes.&lt;/strong&gt; Posez la même question sur la même base de données deux fois et vous pourriez obtenir du SQL différent. Le modèle calcule des probabilités, et de légères variations de contexte produisent des sorties différentes. Vous ne pouvez pas tester votre chemin vers une garantie que l&amp;rsquo;agent génère toujours la bonne requête.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;La révision par l&amp;rsquo;utilisateur ne passe pas à l&amp;rsquo;échelle.&lt;/strong&gt; &amp;ldquo;Vérifiez simplement chaque requête avant l&amp;rsquo;exécution&amp;rdquo; semble sûr. Mais cela suppose que les utilisateurs sont des experts à la fois dans le modèle de données et en SQL — exactement les personnes qui n&amp;rsquo;avaient pas besoin de l&amp;rsquo;interface en langage naturel. Cela introduit également une surcharge cognitive et une nouvelle classe de biais de confirmation, où les utilisateurs submergés par la complexité des requêtes approuvent des requêtes invalides plutôt que de les investiguer.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Et puis il y a l&amp;rsquo;injection.&lt;/strong&gt; Dans le développement SQL traditionnel, la paramétrisation a résolu l&amp;rsquo;injection parce que la saisie utilisateur remplissait des paramètres, pas la structure SQL. Avec NL2SQL, le modèle génère le SQL lui-même. Le prompt, le contexte du schéma, l&amp;rsquo;historique de conversation et les données récupérées influencent tous ce qui est exécuté. Si quelqu&amp;rsquo;un élabore un prompt qui change ce que le modèle génère, c&amp;rsquo;est de l&amp;rsquo;injection — pas au niveau des paramètres, mais au niveau de la génération des requêtes. Et contrairement à la suppression d&amp;rsquo;une table (évident, récupérable), l&amp;rsquo;injection NL2SQL produit des requêtes qui retournent des résultats incorrects sans aucune erreur visible. Des décisions métier sont prises sur de mauvaises données.&lt;/p&gt;
&lt;h2 id="ce-que-sql-mcp-server-résout-réellement"&gt;Ce que SQL MCP Server résout réellement&lt;/h2&gt;
&lt;p&gt;C&amp;rsquo;est là que l&amp;rsquo;article fait son point pratique le plus utile. Plutôt que de donner à un agent un accès arbitraire au schéma et d&amp;rsquo;espérer le meilleur, SQL MCP Server expose une &lt;strong&gt;surface API organisée&lt;/strong&gt; construite sur &lt;a href="https://learn.microsoft.com/en-us/azure/data-api-builder/overview"&gt;Data API builder&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;La différence est importante : l&amp;rsquo;agent ne génère pas de SQL. Il appelle des endpoints nommés qui retournent des formes de résultat prédéfinies. Le SQL est écrit une fois, par un développeur, et est déterministe. Le non-déterminisme de l&amp;rsquo;agent se limite à choisir &lt;em&gt;quel&lt;/em&gt; endpoint appeler, pas à construire des requêtes arbitraires.&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est analogue à ce que la paramétrisation a fait pour l&amp;rsquo;injection SQL dans le modèle d&amp;rsquo;application traditionnel — vous supprimez la capacité de construire des requêtes arbitraires à partir d&amp;rsquo;entrées non fiables.&lt;/p&gt;
&lt;h2 id="la-bonne-question"&gt;La bonne question&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;article ne dit pas &amp;ldquo;n&amp;rsquo;utilisez jamais NL2SQL.&amp;rdquo; Il dit : soyez délibéré sur &lt;em&gt;où&lt;/em&gt; vous l&amp;rsquo;appliquez et &lt;em&gt;ce que&lt;/em&gt; vous exposez. Pour une analyse exploratoire dans un environnement contrôlé, avec un schéma limité et un accès en lecture seule, NL2SQL pourrait convenir. Pour les systèmes de production où les décisions métier dépendent des résultats, une couche API organisée est significativement plus sûre.&lt;/p&gt;
&lt;p&gt;Honnêteté : certains problèmes sont vraiment mieux résolus avec des requêtes structurées derrière des endpoints nommés qu&amp;rsquo;avec du langage naturel vers SQL. SQL MCP Server vous donne cette option sans abandonner entièrement l&amp;rsquo;interface agentique.&lt;/p&gt;
&lt;p&gt;Publication originale : &lt;a href="https://devblogs.microsoft.com/azure-sql/sql-mcp-server-nl2sql/"&gt;Considering NL2SQL? Should your database really be the prompt? How can SQL MCP Server help?&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>Microsoft Foundry Avril 2026 : Foundry Local GA, GPT-5.5, CodeAct avec Hyperlight</title><link>https://thedotnetblog.com/fr/news/emiliano-montesdeoca/microsoft-foundry-april-2026-whats-new/</link><pubDate>Tue, 02 Jun 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/news/emiliano-montesdeoca/microsoft-foundry-april-2026-whats-new/</guid><description>Le récapitulatif Foundry d'avril est chargé : Foundry Local atteint la GA, GPT-5.5 arrive, Agent Framework reçoit le traçage OpenTelemetry, CodeAct exécute Python dans des micro-VMs Hyperlight, et le tableau de bord de surveillance des agents est disponible.</description><content:encoded>&lt;p&gt;Un mois chargé pour Microsoft Foundry. Voici les annonces les plus importantes.&lt;/p&gt;
&lt;h2 id="foundry-local-est-généralement-disponible"&gt;Foundry Local est Généralement Disponible&lt;/h2&gt;
&lt;p&gt;Foundry Local — le runtime d&amp;rsquo;IA local multiplateforme de Microsoft — passe de la préversion à la GA sur Windows, macOS (Apple Silicon) et Linux x64. Inférence de modèles locaux prête pour la production avec un SDK convivial pour les développeurs. La version 1.1 ajoute la transcription, les embeddings et la prise en charge de l&amp;rsquo;API Responses.&lt;/p&gt;
&lt;h2 id="gpt-55"&gt;GPT-5.5&lt;/h2&gt;
&lt;p&gt;Le dernier modèle de la famille GPT-5 est maintenant disponible dans Foundry. Quota par défaut pour les abonnements Tier 5 et Tier 6. Si vous avez travaillé avec des variantes antérieures de GPT-5, cela vaut la peine d&amp;rsquo;être évalué pour vos cas d&amp;rsquo;utilisation.&lt;/p&gt;
&lt;h2 id="traçage-dagent-framework-dans-foundry"&gt;Traçage d&amp;rsquo;Agent Framework dans Foundry&lt;/h2&gt;
&lt;p&gt;Deux fonctionnalités de traçage sont disponibles en préversion ce mois-ci :&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Traçage de Microsoft Agent Framework&lt;/strong&gt; — Les agents MAF peuvent maintenant émettre des traces OpenTelemetry dans Foundry. Déboguez le comportement des agents, tracez l&amp;rsquo;exécution en plusieurs étapes, exposez la latence et les erreurs dans les appels d&amp;rsquo;outils. Cela comble un vrai manque : savoir &lt;em&gt;ce que votre agent a réellement fait&lt;/em&gt; en production, pas seulement ce qu&amp;rsquo;il a retourné.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Traçage des agents hébergés&lt;/strong&gt; — Les sessions, appels d&amp;rsquo;outils et étapes d&amp;rsquo;exécution des agents hébergés apparaissent également dans les traces Foundry. La même histoire d&amp;rsquo;observabilité étendue au niveau hébergé.&lt;/p&gt;
&lt;h2 id="codeact-avec-hyperlight-alpha"&gt;CodeAct avec Hyperlight (Alpha)&lt;/h2&gt;
&lt;p&gt;C&amp;rsquo;est l&amp;rsquo;ajout techniquement le plus intéressant : Agent Framework peut désormais exécuter du code Python dans des micro-machines virtuelles &lt;a href="https://github.com/hyperlight-dev/hyperlight"&gt;Hyperlight&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;CodeAct est le modèle où un agent génère et exécute du code Python comme outil. La préoccupation évidente est la sécurité — vous exécutez du code généré par le modèle. Les micro-VMs d&amp;rsquo;Hyperlight fournissent une isolation au niveau du processus avec un temps de démarrage proche du natif, rendant l&amp;rsquo;exécution de code en sandbox pratique sans la surcharge de conteneurs ou de VMs complets.&lt;/p&gt;
&lt;p&gt;Pour les flux de travail agentiques où l&amp;rsquo;exécution de code est nécessaire, c&amp;rsquo;est une amélioration de sécurité significative par rapport à l&amp;rsquo;exécution de code dans le processus hôte.&lt;/p&gt;
&lt;h2 id="tableau-de-bord-de-surveillance-des-agents-préversion"&gt;Tableau de Bord de Surveillance des Agents (Préversion)&lt;/h2&gt;
&lt;p&gt;Un tableau de bord d&amp;rsquo;opérations unifié combinant l&amp;rsquo;utilisation des tokens, la latence, le taux de succès des exécutions et les scores des évaluateurs en une seule vue. La distinction par rapport aux tableaux de bord d&amp;rsquo;observabilité classiques : il inclut les résultats d&amp;rsquo;évaluation aux côtés des métriques opérationnelles, vous permettant de corréler « l&amp;rsquo;agent est plus lent » avec « les scores de l&amp;rsquo;évaluateur ont chuté » — ou de confirmer qu&amp;rsquo;ils ne sont pas liés.&lt;/p&gt;
&lt;h2 id="évaluateurs-personnalisés-dévaluation-continue-préversion"&gt;Évaluateurs Personnalisés d&amp;rsquo;Évaluation Continue (Préversion)&lt;/h2&gt;
&lt;p&gt;Vous pouvez maintenant apporter vos propres évaluateurs basés sur du code ou des prompts dans les pipelines d&amp;rsquo;évaluation continue. Auparavant, l&amp;rsquo;évaluation continue était limitée aux évaluateurs intégrés. Les évaluateurs personnalisés vous permettent d&amp;rsquo;appliquer des critères de qualité spécifiques à votre équipe dans votre boucle de surveillance en production.&lt;/p&gt;
&lt;h2 id="inventaire-des-agents-dans-le-plan-de-contrôle"&gt;Inventaire des Agents dans le Plan de Contrôle&lt;/h2&gt;
&lt;p&gt;La vue Operate du Plan de Contrôle Foundry affiche désormais tous les agents pris en charge dans un abonnement : agents Foundry, Azure SRE Agent, boucles d&amp;rsquo;agents Logic Apps et agents personnalisés enregistrés. Une vue pour comprendre ce qui est déployé et où.&lt;/p&gt;
&lt;p&gt;Publication originale : &lt;a href="https://devblogs.microsoft.com/foundry/whats-new-in-microsoft-foundry-apr-2026/"&gt;What&amp;rsquo;s new in Microsoft Foundry | April 2026&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>Le Modèle Handoff : Quand Un Agent Ne Suffit Pas</title><link>https://thedotnetblog.com/fr/news/emiliano-montesdeoca/maf-handoff-orchestration-pattern-tour/</link><pubDate>Mon, 01 Jun 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/news/emiliano-montesdeoca/maf-handoff-orchestration-pattern-tour/</guid><description>Le modèle d'orchestration Handoff de Microsoft Agent Framework permet aux agents de décider qui gère le prochain tour — sans perdre le contexte de la conversation ni enfreindre les règles de topologie.</description><content:encoded>&lt;p&gt;À un moment donné, tout système multi-agents dépasse un simple routeur. Le premier signe apparaît généralement quand un agent spécialiste doit poser une question de suivi, ou réalise en milieu de tour qu&amp;rsquo;un autre agent devrait continuer. Un pipeline fixe échoue là. Un routeur à passage unique échoue là.&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est exactement le problème que le modèle d&amp;rsquo;orchestration Handoff dans Microsoft Agent Framework est conçu pour résoudre.&lt;/p&gt;
&lt;h2 id="comment-fonctionne-handoff"&gt;Comment Fonctionne Handoff&lt;/h2&gt;
&lt;p&gt;Le développeur déclare un graphe : voici les agents, voici les arêtes entre eux. Le framework fait le reste — il synthétise un outil handoff par arête sortante et l&amp;rsquo;injecte dans chaque agent. Quand un agent décide de passer le contrôle, il appelle l&amp;rsquo;outil. Le framework applique la topologie.&lt;/p&gt;
&lt;p&gt;Trois choses rendent cela différent du fait d&amp;rsquo;avoir simplement des agents qui s&amp;rsquo;appellent mutuellement :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Une transcription partagée&lt;/strong&gt; — l&amp;rsquo;agent récepteur voit l&amp;rsquo;intégralité de l&amp;rsquo;historique de conversation. Pas de recommencement à zéro.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Application de la topologie&lt;/strong&gt; — un agent ne peut faire handoff qu&amp;rsquo;à des cibles déclarées. Vous détectez les bugs de routage au moment de l&amp;rsquo;authoring, pas en production.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Terminaison naturelle&lt;/strong&gt; — quand l&amp;rsquo;agent actif termine son tour sans appeler un outil handoff, le workflow cède à l&amp;rsquo;utilisateur. Pas de polling, pas de conditions de sortie explicites.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="un-exemple-minimal"&gt;Un Exemple Minimal&lt;/h2&gt;
&lt;p&gt;En .NET, construire un workflow handoff ressemble à 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;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.Workflows&lt;/span&gt;&lt;span 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;triage&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;chatClient&lt;/span&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;instructions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Route to the right specialist.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&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;Triage&amp;#34;&lt;/span&gt;&lt;span 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;billing&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;chatClient&lt;/span&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;instructions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Handle billing questions.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&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;Billing&amp;#34;&lt;/span&gt;&lt;span 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;tech&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;chatClient&lt;/span&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;instructions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Handle technical support.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&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;Tech&amp;#34;&lt;/span&gt;&lt;span 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;workflow&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;HandoffWorkflow&lt;/span&gt;&lt;span class="p"&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="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="n"&gt;triage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;targets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;billing&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tech&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&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;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;billing&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;targets&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&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;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tech&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;targets&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;billing&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;Triage peut envoyer à l&amp;rsquo;un ou l&amp;rsquo;autre spécialiste. Les deux spécialistes peuvent renvoyer vers triage. Le graphe est compatible avec l&amp;rsquo;acyclique mais prend en charge les arêtes arrière quand vous en avez besoin (&amp;ldquo;j&amp;rsquo;ai besoin de plus d&amp;rsquo;informations&amp;rdquo; → retour à la recherche).&lt;/p&gt;
&lt;h2 id="quand-utiliser-handoff-et-quand-ne-pas-le-faire"&gt;Quand Utiliser Handoff (et Quand Ne Pas Le Faire)&lt;/h2&gt;
&lt;p&gt;Handoff est un bon choix quand :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;La propriété peut changer en cours de conversation&lt;/strong&gt; — un agent peut réaliser qu&amp;rsquo;il est le mauvais spécialiste&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Les arêtes arrière comptent&lt;/strong&gt; — vous pourriez avoir besoin de revisiter une étape antérieure sans repartir à zéro&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Les décisions de routage sont floues&lt;/strong&gt; — la décision de faire un handoff est contextuelle et mieux prise par le modèle que par des prédicats typés&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ce n&amp;rsquo;est &lt;em&gt;pas&lt;/em&gt; le bon choix quand :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Votre pipeline est fixe et séquentiel — utilisez le workflow &lt;code&gt;Sequential&lt;/code&gt; pour cela&lt;/li&gt;
&lt;li&gt;Chaque étape est indépendante — des agents partageant une transcription où seul l&amp;rsquo;un d&amp;rsquo;eux en avait besoin n&amp;rsquo;est que du bruit&lt;/li&gt;
&lt;li&gt;Vous avez besoin de garanties strictes de traitement — le non-déterminisme du routage piloté par modèle n&amp;rsquo;est pas ce que vous voulez&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="arêtes-arrière-et-humain-dans-la-boucle"&gt;Arêtes Arrière et Humain-dans-la-Boucle&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;une des formes les plus intéressantes qu&amp;rsquo;Handoff permet est les vraies arêtes arrière. Un agent peut décider &amp;ldquo;je n&amp;rsquo;ai pas assez d&amp;rsquo;informations&amp;rdquo; et revenir à une étape de recherche, pas avec une boucle codée en dur, mais parce que le modèle décide que c&amp;rsquo;est la bonne décision.&lt;/p&gt;
&lt;p&gt;Les interactions humain-dans-la-boucle se composent également naturellement. Quand un spécialiste a besoin d&amp;rsquo;une entrée de l&amp;rsquo;utilisateur, le workflow cède à l&amp;rsquo;utilisateur via la boucle de tour par défaut, recueille la réponse et reprend avec le contexte complet. L&amp;rsquo;agent n&amp;rsquo;a jamais perdu la conversation.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Handoff est l&amp;rsquo;un de ces modèles qui semble simple mais permet beaucoup une fois intégré : routage décentralisé, contexte partagé, topologie appliquée, terminaison naturelle. C&amp;rsquo;est la prochaine étape appropriée quand vos agents commencent à dire &amp;ldquo;en fait, quelqu&amp;rsquo;un d&amp;rsquo;autre devrait gérer ça.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Lisez le guide complet dans le post original : &lt;a href="https://devblogs.microsoft.com/agent-framework/a-tour-of-handoff-orchestration-pattern/"&gt;A Tour of the Handoff Orchestration Pattern&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>Workflows Durables dans Microsoft Agent Framework : De In-Memory à Azure Functions</title><link>https://thedotnetblog.com/fr/news/emiliano-montesdeoca/maf-durable-workflows-azure-functions-durable-task/</link><pubDate>Sun, 31 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/news/emiliano-montesdeoca/maf-durable-workflows-azure-functions-durable-task/</guid><description>Le modèle de programmation de workflows de MAF prend désormais en charge l'exécution durable basée sur Durable Task — voici comment créer des workflows d'agents composables qui survivent aux redémarrages de processus et s'adaptent à Azure Functions.</description><content:encoded>&lt;p&gt;L&amp;rsquo;un des points douloureux avec les premiers workflows d&amp;rsquo;agents IA : ils sont fragiles. Un workflow multi-étapes de longue durée lié à un seul processus signifie que le redémarrage du processus = état perdu. Pour des démos simples, c&amp;rsquo;est acceptable. Pour des charges de travail en production, ce ne l&amp;rsquo;est pas.&lt;/p&gt;
&lt;p&gt;Le modèle de programmation de workflows de Microsoft Agent Framework prend désormais en charge l&amp;rsquo;&lt;strong&gt;exécution durable&lt;/strong&gt;, basée sur le framework Durable Task, avec hébergement Azure Functions. Voici comment fonctionne le modèle de programmation et pourquoi l&amp;rsquo;histoire de la durabilité compte.&lt;/p&gt;
&lt;h2 id="les-blocs-de-construction-fondamentaux"&gt;Les Blocs de Construction Fondamentaux&lt;/h2&gt;
&lt;p&gt;Les &lt;strong&gt;Executors&lt;/strong&gt; sont l&amp;rsquo;unité fondamentale de travail. Chacun est typé — il prend une entrée spécifique et produit une sortie spécifique :&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;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.Agents.AI.Workflows&lt;/span&gt;&lt;span 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;internal&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;OrderLookup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&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;Executor&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;OrderCancelRequest&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;&amp;gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;OrderLookup&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="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="kd"&gt;async&lt;/span&gt; &lt;span class="n"&gt;ValueTask&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;HandleAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;OrderCancelRequest&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;IWorkflowContext&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="n"&gt;CancellationToken&lt;/span&gt; &lt;span class="n"&gt;cancellationToken&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="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;// rechercher la commande, la retourner&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="k"&gt;new&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;Id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;OrderId&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;p&gt;Les &lt;strong&gt;Workflows&lt;/strong&gt; relient les executors en graphes dirigés en utilisant un constructeur fluide. Le framework gère l&amp;rsquo;exécution, le flux de données entre les étapes et la propagation des erreurs.&lt;/p&gt;
&lt;p&gt;Vous pouvez modéliser :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Des chaînes séquentielles (étape A → étape B → étape C)&lt;/li&gt;
&lt;li&gt;Fan-out/fan-in parallèle (exécuter les agents A, B, C en parallèle, agréger les résultats)&lt;/li&gt;
&lt;li&gt;Branchement conditionnel&lt;/li&gt;
&lt;li&gt;Approbations humain-dans-la-boucle (suspendre le workflow, attendre un signal externe)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="le-runner-in-memory-pour-le-développement-local"&gt;Le Runner In-Memory pour le Développement Local&lt;/h2&gt;
&lt;p&gt;Démarrer est rapide :&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;dotnet&lt;/span&gt; &lt;span class="k"&gt;add&lt;/span&gt; &lt;span class="n"&gt;package&lt;/span&gt; &lt;span class="n"&gt;Microsoft&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Agents&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AI&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;dotnet&lt;/span&gt; &lt;span class="k"&gt;add&lt;/span&gt; &lt;span class="n"&gt;package&lt;/span&gt; &lt;span class="n"&gt;Microsoft&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Agents&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AI&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Workflows&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Le package principal inclut un runner léger en cours de processus. Pas de dépendances externes, pas de base de données, pas de ressources Azure. Fonctionne très bien pour le développement local et les tests unitaires.&lt;/p&gt;
&lt;h2 id="ajouter-la-durabilité-avec-durable-task"&gt;Ajouter la Durabilité avec Durable Task&lt;/h2&gt;
&lt;p&gt;Quand un workflow doit survivre aux redémarrages de processus — parce qu&amp;rsquo;il est de longue durée, parce qu&amp;rsquo;il a des étapes humain-dans-la-boucle, parce qu&amp;rsquo;il se distribue sur de nombreux appels d&amp;rsquo;agents en parallèle — le runner in-memory n&amp;rsquo;est pas suffisant.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;intégration Durable Task de MAF stocke l&amp;rsquo;état du workflow dans Azure Storage. Si le processus redémarre, le workflow reprend là où il s&amp;rsquo;était arrêté. Le modèle de programmation reste le même ; vous remplacez simplement le runner.&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;dotnet&lt;/span&gt; &lt;span class="k"&gt;add&lt;/span&gt; &lt;span class="n"&gt;package&lt;/span&gt; &lt;span class="n"&gt;Microsoft&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Agents&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AI&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Workflows&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DurableTask&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Les mêmes executors, le même graphe de workflow — basé sur un état durable.&lt;/p&gt;
&lt;h2 id="hébergement-azure-functions"&gt;Hébergement Azure Functions&lt;/h2&gt;
&lt;p&gt;La troisième couche est l&amp;rsquo;hébergement Azure Functions. Votre workflow devient une application Function : déclenchez le workflow via un endpoint HTTP, et le runtime durable gère la mise à l&amp;rsquo;échelle, l&amp;rsquo;état et la fiabilité.&lt;/p&gt;
&lt;p&gt;Cela signifie qu&amp;rsquo;un workflow multi-agents avec des appels parallèles, des branches conditionnelles et des approbations humaines peut s&amp;rsquo;adapter à un environnement Functions serverless sans gestion d&amp;rsquo;état personnalisée.&lt;/p&gt;
&lt;h2 id="pourquoi-cest-important"&gt;Pourquoi C&amp;rsquo;est Important&lt;/h2&gt;
&lt;p&gt;La combinaison est significative pour les vrais systèmes IA :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Appels d&amp;rsquo;agents en parallèle&lt;/strong&gt; — distribuer vers plusieurs agents spécialisés simultanément sans blocage, agréger les résultats quand tous terminent&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Processus de longue durée&lt;/strong&gt; — les workflows qui impliquent une approbation humaine ou des événements externes peuvent se suspendre et reprendre sur des heures ou des jours&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mise à l&amp;rsquo;échelle&lt;/strong&gt; — Azure Functions fait évoluer l&amp;rsquo;exécution horizontalement ; le framework Durable Task gère la coordination de l&amp;rsquo;état parallèle&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si vous construisez des workflows MAF au-delà de simples démos locaux, c&amp;rsquo;est le chemin vers l&amp;rsquo;exécution de qualité production.&lt;/p&gt;
&lt;p&gt;Publication originale : &lt;a href="https://devblogs.microsoft.com/dotnet/durable-workflows-in-microsoft-agent-framework/"&gt;Durable Workflows in the Microsoft Agent Framework&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>Votre Agent MAF Local Vient d'Obtenir une Maison en Production</title><link>https://thedotnetblog.com/fr/news/emiliano-montesdeoca/maf-agent-local-to-production-foundry-hosted-agents/</link><pubDate>Sat, 30 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/news/emiliano-montesdeoca/maf-agent-local-to-production-foundry-hosted-agents/</guid><description>Foundry Hosted Agents donne à votre agent Microsoft Agent Framework une identité, un scaling, une persistance de session et une observabilité sans configuration supplémentaire. Voici à quoi cela ressemble en pratique.</description><content:encoded>&lt;p&gt;Faire fonctionner un agent localement est la partie amusante. La partie délicate est tout ce qui vient après : le déployer sans perdre la tête, gérer les sessions, configurer l&amp;rsquo;identité, câbler l&amp;rsquo;observabilité. Cela signifie généralement beaucoup d&amp;rsquo;infrastructure personnalisée.&lt;/p&gt;
&lt;p&gt;Foundry Hosted Agents vient de supprimer la majeure partie de cette infrastructure pour les utilisateurs de Microsoft Agent Framework (MAF).&lt;/p&gt;
&lt;h2 id="ce-que-foundry-hosted-agents-fait-vraiment"&gt;Ce que Foundry Hosted Agents Fait Vraiment&lt;/h2&gt;
&lt;p&gt;Lorsque vous déployez un agent MAF dans Foundry Hosted Agents, la plateforme gère une liste étonnamment longue de choses que vous auriez autrement à construire vous-même :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Mise à l&amp;rsquo;échelle à zéro&lt;/strong&gt; — votre agent ne coûte rien en idle et redémarre automatiquement&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sandboxes isolés par VM par session&lt;/strong&gt; — chaque session utilisateur obtient son propre sandbox avec persistance du système de fichiers qui survit aux événements de réduction d&amp;rsquo;échelle&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Entra ID intégré&lt;/strong&gt; — chaque agent obtient sa propre identité pour appeler les modèles Foundry, Toolbox et les services Azure sans secrets dans l&amp;rsquo;image&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Déploiements versionnés&lt;/strong&gt; — chaque déploiement est un instantané immuable, avec support de déploiement blue/green et canary&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Observabilité sans configuration&lt;/strong&gt; — &lt;code&gt;APPLICATIONINSIGHTS_CONNECTION_STRING&lt;/code&gt; est injecté au runtime pour que les traces OpenTelemetry de MAF s&amp;rsquo;écoulent automatiquement dans App Insights&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ce dernier point est vraiment appréciable. Pas de câblage supplémentaire, pas de configuration additionnelle. Les traces apparaissent simplement.&lt;/p&gt;
&lt;h2 id="la-différence-de-code-est-minime"&gt;La Différence de Code Est Minime&lt;/h2&gt;
&lt;p&gt;C&amp;rsquo;est ce que j&amp;rsquo;apprécie le plus dans cette intégration. Vous ne réécrivez pas votre agent. Vous l&amp;rsquo;encapsulez simplement :&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;En .NET :&lt;/strong&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="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.Agents.AI.Foundry.Hosting&lt;/span&gt;&lt;span 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;builder&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;WebApplication&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreateBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;);&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;Services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddFoundryResponses&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&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;app&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;Build&lt;/span&gt;&lt;span class="p"&gt;();&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;MapFoundryResponses&lt;/span&gt;&lt;span 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="p"&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;&lt;strong&gt;En Python :&lt;/strong&gt;&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;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ResponsesHostServer&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;server&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 tout. La même logique que vous avez testée localement est ce qui s&amp;rsquo;exécute en production. La plateforme l&amp;rsquo;encapsule dans l&amp;rsquo;infrastructure de gestion de sessions, d&amp;rsquo;identité et de scaling.&lt;/p&gt;
&lt;h2 id="deux-protocoles-un-agent"&gt;Deux Protocoles, Un Agent&lt;/h2&gt;
&lt;p&gt;Les Hosted Agents supportent deux styles d&amp;rsquo;endpoints :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Responses&lt;/strong&gt; (&lt;code&gt;/responses&lt;/code&gt;) — compatible OpenAI, gère l&amp;rsquo;historique des conversations et le streaming. Bon défaut pour les agents de type chat.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Invocations&lt;/strong&gt; (&lt;code&gt;/invocations&lt;/code&gt;) — vous définissez le schéma requête/réponse. Bon pour les workflows non conversationnels.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si vous construisez quelque chose qui ressemble à une conversation, commencez avec Responses. Si vous construisez un agent de type API qui prend une entrée structurée et retourne une sortie structurée, Invocations vous donne la flexibilité.&lt;/p&gt;
&lt;h2 id="le-flux-de-déploiement-avec-azd"&gt;Le Flux de Déploiement avec &lt;code&gt;azd&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Lorsque vous exécutez &lt;code&gt;azd up&lt;/code&gt; avec un agent MAF :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Crée optionnellement un projet Foundry et déploie un modèle&lt;/li&gt;
&lt;li&gt;Empaquette votre code et pousse une image vers Azure Container Registry&lt;/li&gt;
&lt;li&gt;Provisionne du calcul depuis l&amp;rsquo;image ACR&lt;/li&gt;
&lt;li&gt;Attribue un Entra ID dédié à l&amp;rsquo;agent&lt;/li&gt;
&lt;li&gt;Expose un endpoint stable (&lt;code&gt;https://{project_endpoint}/agents/{agent_name}&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Gère tout le reste à partir de ce point&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Les sessions persistent jusqu&amp;rsquo;à 30 jours. Le calcul inactif est déprovisionné après 15 minutes et restauré transparemment sur la prochaine requête. Du point de vue de l&amp;rsquo;agent, rien n&amp;rsquo;a changé.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;La distance entre &amp;ldquo;fonctionnant localement&amp;rdquo; et &amp;ldquo;s&amp;rsquo;exécutant en production&amp;rdquo; a toujours été longue et douloureuse pour les agents IA. Foundry Hosted Agents + MAF réduit considérablement cet écart. Si vous avez déjà un agent local construit avec Agent Framework, cela vaut la peine d&amp;rsquo;essayer aujourd&amp;rsquo;hui.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;équipe annonce que GA arrive bientôt — c&amp;rsquo;est actuellement en preview. Consultez les &lt;a href="https://learn.microsoft.com/en-us/agent-framework/hosting/foundry-hosted-agent"&gt;docs d&amp;rsquo;intégration MAF Hosted Agent&lt;/a&gt; et les &lt;a href="https://github.com/microsoft/agent-framework/tree/main/dotnet/samples/04-hosting/FoundryHostedAgents"&gt;exemples .NET&lt;/a&gt; pour démarrer.&lt;/p&gt;
&lt;p&gt;Article original : &lt;a href="https://devblogs.microsoft.com/agent-framework/from-local-to-production-deploy-your-microsoft-agent-framework-agent-with-foundry-hosted-agents/"&gt;From Local to Production: Deploy Your Microsoft Agent Framework Agent with Foundry Hosted Agents&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>Créer des Agents, C'est la Partie Facile — Les Exécuter en Toute Sécurité, C'est la Partie Difficile</title><link>https://thedotnetblog.com/fr/news/emiliano-montesdeoca/maf-agent-governance-toolkit-runtime-policy/</link><pubDate>Fri, 29 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/news/emiliano-montesdeoca/maf-agent-governance-toolkit-runtime-policy/</guid><description>Microsoft Agent Framework et Agent Governance Toolkit s'associent pour appliquer les politiques d'exécution, gouverner les appels d'outils et fournir des journaux d'audit chaînés par Merkle — sans toucher aux prompts de l'agent.</description><content:encoded>&lt;p&gt;Il existe un modèle dans le développement d&amp;rsquo;agents IA que j&amp;rsquo;ai commencé à appeler le « regret de démo ». L&amp;rsquo;agent fonctionne très bien dans les démos. Ensuite, quelqu&amp;rsquo;un demande : que se passe-t-il s&amp;rsquo;il appelle le mauvais outil ? Et s&amp;rsquo;il accède à des données auxquelles il ne devrait pas ? Qui a audité ça ?&lt;/p&gt;
&lt;p&gt;Microsoft Agent Framework vous soutient pour la construction et l&amp;rsquo;orchestration. Agent Governance Toolkit (AGT) couvre la partie après — gouvernance, application des politiques et auditabilité à l&amp;rsquo;exécution.&lt;/p&gt;
&lt;h2 id="ce-que-chaque-projet-fait-vraiment"&gt;Ce Que Chaque Projet Fait Vraiment&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Microsoft Agent Framework (MAF)&lt;/strong&gt; vous offre le modèle de programmation : workflows multi-agents, interopérabilité du protocole A2A, hooks de middleware, mémoire et hébergement géré via Foundry Agent Service. Il gère la sécurité du contenu au niveau de l&amp;rsquo;entrée/sortie du modèle.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Agent Governance Toolkit (AGT)&lt;/strong&gt; se connecte à ce même pipeline de middleware pour gouverner les &lt;em&gt;actions&lt;/em&gt;. Chaque appel d&amp;rsquo;outil, accès aux ressources et message inter-agents est évalué par rapport à la politique avant l&amp;rsquo;exécution. Surcharge inférieure à la milliseconde. Pas de sidecars, pas de proxies, pas de prompts modifiés.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Action Agent --&amp;gt; Vérification Politique --&amp;gt; Autoriser / Refuser --&amp;gt; Journal Audit (&amp;lt; 0.1 ms)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Des couches différentes, une couverture complète, un pipeline.&lt;/p&gt;
&lt;h2 id="sintégrer-cest-juste-ajouter-un-middleware"&gt;S&amp;rsquo;intégrer, C&amp;rsquo;est Juste Ajouter un Middleware&lt;/h2&gt;
&lt;p&gt;En Python, AGT s&amp;rsquo;ajoute au même paramètre &lt;code&gt;middleware&lt;/code&gt; que vous utiliseriez pour la journalisation ou les filtres de contenu :&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;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;OpenAIChatClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&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="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Contoso Loan Officer&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&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 governed loan 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;check_credit_score&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;get_loan_rates&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;approve_small_loan&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;middleware&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;AuditTrailMiddleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;audit_log&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;audit_log&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;agent_did&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;loan-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;GovernancePolicyMiddleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;evaluator&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;evaluator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;audit_log&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;audit_log&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;CapabilityGuardMiddleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;allowed_tools&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;check_credit_score&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;get_loan_rates&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;RogueDetectionMiddleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;detector&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;detector&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;agent_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;loan-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="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;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;En .NET, même modèle via &lt;code&gt;.Use()&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="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="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BuildAIAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&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;Use&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;GovernancePolicyMiddleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;evaluator&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&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;Use&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;CapabilityGuardMiddleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;allowedTools&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&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;Use&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;AuditTrailMiddleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;auditLog&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;Même agent, même orchestration, mêmes outils. AGT ajoute des capacités de gouvernance sans toucher à la logique de l&amp;rsquo;agent.&lt;/p&gt;
&lt;h2 id="ce-que-vous-obtenez"&gt;Ce Que Vous Obtenez&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GovernancePolicyMiddleware&lt;/strong&gt; — évalue chaque action par rapport aux règles de politique déclaratives&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CapabilityGuardMiddleware&lt;/strong&gt; — liste blanche des outils qu&amp;rsquo;un agent est autorisé à appeler (l&amp;rsquo;outil &lt;code&gt;approve_small_loan&lt;/code&gt; n&amp;rsquo;est pas dans la liste autorisée ci-dessus — délibérément)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RogueDetectionMiddleware&lt;/strong&gt; — détecte les modèles de comportement anormaux à l&amp;rsquo;exécution&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AuditTrailMiddleware&lt;/strong&gt; — journal d&amp;rsquo;audit chaîné par Merkle pour que chaque action soit cryptographiquement inviolable&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ce dernier point compte pour la conformité. Une chaîne Merkle signifie que si quelqu&amp;rsquo;un modifie le journal, la chaîne se rompt. L&amp;rsquo;audit est la preuve.&lt;/p&gt;
&lt;h2 id="cinq-scénarios-industriels"&gt;Cinq Scénarios Industriels&lt;/h2&gt;
&lt;p&gt;Le dépôt AGT comprend cinq scénarios complets de bout en bout : services financiers (agent de crédit), santé (données patient), juridique (examen de contrat), gouvernement (services aux citoyens) et fabrication (contrôle qualité). Chacun associe de vrais agents MAF avec un vrai middleware de gouvernance AGT.&lt;/p&gt;
&lt;p&gt;Ce ne sont pas des démos jouets. Ce sont le type de scénarios où vous auriez vraiment besoin d&amp;rsquo;une gouvernance en production.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Si vous construisez des agents qui touchent des données réelles, prennent des décisions avec des conséquences, ou s&amp;rsquo;exécutent sans surveillance en production — la gouvernance n&amp;rsquo;est pas optionnelle. La combinaison MAF + AGT vous donne la pile complète : construisez-le avec Agent Framework, gouvernez-le avec AGT.&lt;/p&gt;
&lt;p&gt;Les deux projets sont open source. L&amp;rsquo;article original contient des liens vers les exemples de code complets.&lt;/p&gt;
&lt;p&gt;Publication originale : &lt;a href="https://devblogs.microsoft.com/agent-framework/governance-at-the-speed-of-agents-microsoft-agent-framework-and-agent-governance-toolkit-better-together/"&gt;Governance at the Speed of Agents: Microsoft Agent Framework and Agent Governance Toolkit, Better Together&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>Foundry Local 1.1 : Transcription en Temps Réel, Embeddings et l'API de Réponses</title><link>https://thedotnetblog.com/fr/news/emiliano-montesdeoca/foundry-local-11-transcription-embeddings-responses-api/</link><pubDate>Thu, 28 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/news/emiliano-montesdeoca/foundry-local-11-transcription-embeddings-responses-api/</guid><description>Foundry Local 1.1 ajoute la transcription en direct depuis le microphone, les embeddings de texte et le support de l'API de Réponses — tout s'exécutant localement sans dépendance cloud, sans latence réseau, sans coût par token.</description><content:encoded>&lt;p&gt;Foundry Local 1.0 a prouvé le concept : exécuter des modèles d&amp;rsquo;IA localement sur Windows, macOS (Apple Silicon) et Linux x64 avec un SDK adapté aux développeurs. La version 1.1 ajoute trois capacités qui couvrent de nombreux cas d&amp;rsquo;usage réels en production.&lt;/p&gt;
&lt;h2 id="transcription-audio-en-direct"&gt;Transcription Audio en Direct&lt;/h2&gt;
&lt;p&gt;La nouvelle fonctionnalité la plus significative : le streaming de parole en texte en temps réel directement depuis le microphone. Sous-titres, interfaces vocales, transcription de réunions, outils d&amp;rsquo;accessibilité — tout s&amp;rsquo;exécutant localement sans aucune dépendance cloud.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;API est basée sur des sessions et transmet les résultats au fur et à mesure qu&amp;rsquo;ils arrivent, avec des marqueurs &lt;code&gt;is_final&lt;/code&gt; pour distinguer le texte intermédiaire du texte finalisé. Disponible pour toutes les liaisons de langages : JavaScript, C#, Python et Rust.&lt;/p&gt;
&lt;p&gt;Chargez un modèle de parole en streaming depuis le catalogue, créez une session avec les paramètres audio (fréquence d&amp;rsquo;échantillonnage, canaux, langue), lancez-la, poussez des blocs audio PCM bruts et consommez le flux asynchrone de résultats. Le post contient des exemples complets en Python et C#.&lt;/p&gt;
&lt;h2 id="embeddings-de-texte"&gt;Embeddings de Texte&lt;/h2&gt;
&lt;p&gt;Recherche sémantique, pipelines RAG, clustering, correspondance de similarité — tout cela nécessite des embeddings. Foundry Local 1.1 ajoute le support des modèles d&amp;rsquo;embedding pour générer des vecteurs localement depuis le même SDK, sans envoyer de données vers un endpoint cloud.&lt;/p&gt;
&lt;p&gt;Pour les applications où la résidence des données est importante ou où vous traitez du contenu sensible, la génération locale d&amp;rsquo;embeddings est une capacité significative.&lt;/p&gt;
&lt;h2 id="api-de-réponses"&gt;API de Réponses&lt;/h2&gt;
&lt;p&gt;Foundry Local prend maintenant en charge l&amp;rsquo;&lt;a href="https://platform.openai.com/docs/api-reference/responses"&gt;API de Réponses&lt;/a&gt; — l&amp;rsquo;interface structurée conçue pour les interactions agentiques. Cela ajoute :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Appel d&amp;rsquo;outils&lt;/strong&gt; — laissez les modèles s&amp;rsquo;exécutant localement invoquer des outils que vous définissez&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Entrée multimodale vision-langage&lt;/strong&gt; — passez image + texte à des modèles capables de vision&lt;/li&gt;
&lt;li&gt;Compatible avec la forme d&amp;rsquo;API standard, donc les agents existants ciblant l&amp;rsquo;API de Réponses d&amp;rsquo;OpenAI fonctionnent contre des modèles locaux&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="améliorations-de-la-taille-du-paquet"&gt;Améliorations de la Taille du Paquet&lt;/h2&gt;
&lt;p&gt;Deux changements réduisent la taille du paquet JavaScript :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La couche FFI &lt;code&gt;koffi&lt;/code&gt; a été remplacée par un addon C Node-API personnalisé&lt;/li&gt;
&lt;li&gt;Le fournisseur d&amp;rsquo;exécution WebGPU est livré comme plugin séparé, donc les applications qui n&amp;rsquo;ont pas besoin d&amp;rsquo;accélération GPU ne paient pas le coût de taille&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le SDK C# cible maintenant des versions de framework inférieures pour une compatibilité .NET plus large.&lt;/p&gt;
&lt;h2 id="pourquoi-cest-important"&gt;Pourquoi C&amp;rsquo;est Important&lt;/h2&gt;
&lt;p&gt;Les trois capacités ensemble — transcription, embeddings, appel d&amp;rsquo;outils — couvrent les blocs de construction essentiels de nombreuses applications d&amp;rsquo;IA. Les exécuter localement signifie :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pas d&amp;rsquo;internet requis&lt;/li&gt;
&lt;li&gt;Pas de coûts par token&lt;/li&gt;
&lt;li&gt;Aucune donnée ne quitte la machine&lt;/li&gt;
&lt;li&gt;Latence constante quelles que soient les conditions réseau&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Foundry Local est le bon choix pour les scénarios en périphérie, les charges de travail sensibles à la vie privée, les applications hors ligne, ou tout ce où vous voulez éviter la dépendance cloud pendant le développement.&lt;/p&gt;
&lt;p&gt;Post original : &lt;a href="https://devblogs.microsoft.com/foundry/foundry-local-v1-1/"&gt;Foundry Local 1.1: Live Transcription, Embeddings, and Responses API&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>Cosmos DB Shell Est en Préversion Publique — Et Il a un Serveur MCP Intégré</title><link>https://thedotnetblog.com/fr/news/emiliano-montesdeoca/cosmosdb-shell-public-preview-mcp-server-cli/</link><pubDate>Sun, 24 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/news/emiliano-montesdeoca/cosmosdb-shell-public-preview-mcp-server-cli/</guid><description>Azure Cosmos DB Shell est un nouveau CLI open source qui expose les commandes de base de données comme outils MCP. Vos agents IA peuvent naviguer dans les conteneurs, exécuter des requêtes et gérer des données en utilisant la même interface que vous.</description><content:encoded>&lt;p&gt;Si vous avez déjà dû naviguer entre un onglet de portail, un exemple de SDK et un script à moitié terminé juste pour répondre à une question Cosmos DB, vous connaissez déjà la friction que ce projet est conçu pour éliminer.&lt;/p&gt;
&lt;p&gt;Azure Cosmos DB Shell vient d&amp;rsquo;entrer en préversion publique. C&amp;rsquo;est un CLI open source avec une syntaxe de type bash et — la partie qui le rend intéressant — un serveur MCP intégré.&lt;/p&gt;
&lt;h2 id="ce-qui-le-différencie-des-autres-clis-de-base-de-données"&gt;Ce Qui le Différencie des Autres CLIs de Base de Données&lt;/h2&gt;
&lt;p&gt;Le CLI lui-même est utile : commandes familières, support de script, intégration CI/CD. Cette partie est le minimum attendu pour un outil de base de données orienté développeur.&lt;/p&gt;
&lt;p&gt;La partie intéressante est l&amp;rsquo;intégration du serveur MCP. Chaque commande que le CLI expose devient disponible comme outil MCP que vos agents IA peuvent appeler. Il n&amp;rsquo;y a pas de couche API personnalisée, pas de code d&amp;rsquo;intégration à écrire. Votre agent peut :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Naviguer dans les hiérarchies de bases de données avec &lt;code&gt;cd&lt;/code&gt;, &lt;code&gt;ls&lt;/code&gt;, &lt;code&gt;pwd&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Exécuter des requêtes SQL avec &lt;code&gt;query&lt;/code&gt; et obtenir des résultats structurés&lt;/li&gt;
&lt;li&gt;Créer et modifier des éléments avec &lt;code&gt;create item&lt;/code&gt;, &lt;code&gt;update&lt;/code&gt;, &lt;code&gt;rm&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Gérer des bases de données et des conteneurs avec &lt;code&gt;mkdb&lt;/code&gt;, &lt;code&gt;mkcon&lt;/code&gt;, &lt;code&gt;rmdb&lt;/code&gt;, &lt;code&gt;rmcon&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Inspecter le contexte actuel avec &lt;code&gt;endpoint&lt;/code&gt;, &lt;code&gt;pwd&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le changement clé : votre agent ne parle pas à une API Cosmos DB — il parle à la même interface shell que vous utilisez. Les commandes sont déterministes, auditables et open source pour que vous puissiez inspecter exactement ce qui se passe.&lt;/p&gt;
&lt;h2 id="la-base-open-source-compte"&gt;La Base Open Source Compte&lt;/h2&gt;
&lt;p&gt;Ce n&amp;rsquo;est pas un service géré boîte noire. Le shell est open source, ce qui signifie :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Les équipes de sécurité peuvent auditer l&amp;rsquo;implémentation&lt;/li&gt;
&lt;li&gt;Les équipes de plateforme peuvent le forker et l&amp;rsquo;étendre pour leurs standards spécifiques&lt;/li&gt;
&lt;li&gt;Les développeurs peuvent contribuer des améliorations qui bénéficient à tous&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pour les équipes d&amp;rsquo;entreprise adoptant des outils IA, &amp;ldquo;peut-on voir exactement comment ça fonctionne&amp;rdquo; est de plus en plus une exigence non optionnelle. L&amp;rsquo;open source ici est un différenciateur significatif.&lt;/p&gt;
&lt;h2 id="trois-scénarios-qui-deviennent-plus-faciles"&gt;Trois Scénarios Qui Deviennent Plus Faciles&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Analyse intelligente des données&lt;/strong&gt; — connectez un agent au shell, posez des questions en langage naturel, obtenez des résultats de requêtes structurés. L&amp;rsquo;agent gère la construction de la requête ; le shell gère l&amp;rsquo;exécution.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Gestion autonome des données&lt;/strong&gt; — les workflows qui doivent créer, mettre à jour ou supprimer des données dans Cosmos DB peuvent le faire via les outils MCP sans avoir besoin d&amp;rsquo;une intégration personnalisée.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Surveillance et alertes en temps réel&lt;/strong&gt; — un agent peut interroger périodiquement des conteneurs, comparer les résultats et signaler des anomalies via le canal de notification approprié.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;interface MCP rend ces scénarios composables avec n&amp;rsquo;importe quelle plateforme IA qui parle MCP — pas seulement les outils Microsoft.&lt;/p&gt;
&lt;h2 id="pour-commencer"&gt;Pour Commencer&lt;/h2&gt;
&lt;p&gt;Le shell est en préversion publique. Installez-le, configurez votre connexion Cosmos DB et activez le serveur MCP. De là, tout hôte d&amp;rsquo;agent compatible MCP peut découvrir et utiliser les outils.&lt;/p&gt;
&lt;p&gt;Post original : &lt;a href="https://devblogs.microsoft.com/cosmosdb/azure-cosmos-db-shell-public-preview-ai-mcp-cli/"&gt;Announcing the Public Preview of Azure Cosmos DB Shell: Open-Source Power Meets AI-Driven Database Automation&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>Azure SQL Peut Maintenant Générer des Embeddings — En T-SQL Pur, Sans Couche Applicative</title><link>https://thedotnetblog.com/fr/news/emiliano-montesdeoca/azure-sql-ai-generate-embeddings-ga-rag-tsql/</link><pubDate>Fri, 22 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/news/emiliano-montesdeoca/azure-sql-ai-generate-embeddings-ga-rag-tsql/</guid><description>AI_GENERATE_EMBEDDINGS et CREATE EXTERNAL MODEL sont maintenant en GA dans Azure SQL Database et Managed Instance. Des pipelines RAG entièrement construits en T-SQL, sans déplacement de données requis.</description><content:encoded>&lt;p&gt;Si vous avez déjà construit un pipeline RAG, vous connaissez la taxe pipeline : vos données vivent dans SQL, mais pour générer des embeddings vous devez les extraire, appeler une API d&amp;rsquo;embeddings, gérer le traitement par lots et les limites de débit, et stocker les résultats quelque part avec une recherche vectorielle. Souvent dans une base de données entièrement différente.&lt;/p&gt;
&lt;p&gt;Azure SQL vient d&amp;rsquo;éliminer la majeure partie de cela avec deux fonctionnalités désormais généralement disponibles : &lt;code&gt;CREATE EXTERNAL MODEL&lt;/code&gt; et &lt;code&gt;AI_GENERATE_EMBEDDINGS&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="ce-quelles-font"&gt;Ce Qu&amp;rsquo;elles Font&lt;/h2&gt;
&lt;p&gt;Ces deux fonctionnalités T-SQL fonctionnent comme un pipeline intégré :&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;CREATE EXTERNAL MODEL&lt;/code&gt;&lt;/strong&gt; — enregistre un endpoint de modèle d&amp;rsquo;IA externe comme un objet de base de données nommé. Vous définissez l&amp;rsquo;emplacement, le format d&amp;rsquo;API, le type de modèle et les identifiants une seule fois. Réutilisez-les partout.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;AI_GENERATE_EMBEDDINGS&lt;/code&gt;&lt;/strong&gt; — une fonction T-SQL scalaire qui appelle le modèle enregistré et renvoie un tableau JSON de valeurs vectorielles. Fonctionne dans les instructions SELECT, INSERT, UPDATE et MERGE.&lt;/p&gt;
&lt;p&gt;Ensemble, ils forment un pipeline d&amp;rsquo;embeddings de bout en bout sans quitter le moteur SQL.&lt;/p&gt;
&lt;h2 id="le-flux-de-travail-complet"&gt;Le Flux de Travail Complet&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- Étape 1 : Enregistrez votre fournisseur d&amp;#39;embeddings une fois
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;EXTERNAL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MODEL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MyEmbeddingModel&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="k"&gt;WITH&lt;/span&gt;&lt;span class="w"&gt; &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="k"&gt;LOCATION&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;https://your-aoai-resource.openai.azure.com/&amp;#39;&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="n"&gt;API_FORMAT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Azure OpenAI&amp;#39;&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="n"&gt;MODEL_TYPE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;EMBEDDINGS&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="n"&gt;MODEL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;text-embedding-ada-002&amp;#39;&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="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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- Étape 2 : Générez des embeddings en ligne en T-SQL
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;UPDATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;docs&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="k"&gt;SET&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;embedding&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;AI_GENERATE_EMBEDDINGS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;USE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MODEL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MyEmbeddingModel&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="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;documents&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;docs&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- Étape 3 : Recherche avec la distance vectorielle
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;TOP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;content&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="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;documents&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="k"&gt;ORDER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;BY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;VECTOR_DISTANCE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;cosine&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;embedding&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="n"&gt;AI_GENERATE_EMBEDDINGS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;USE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MODEL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MyEmbeddingModel&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;C&amp;rsquo;est tout le pipeline : données dans SQL, embeddings générés dans SQL, recherche de similarité dans SQL. Pas de couche d&amp;rsquo;orchestration, pas d&amp;rsquo;ETL, pas de base de données vectorielle séparée.&lt;/p&gt;
&lt;h2 id="formats-dapi-et-options-supportés"&gt;Formats d&amp;rsquo;API et Options Supportés&lt;/h2&gt;
&lt;p&gt;En GA, &lt;code&gt;API_FORMAT&lt;/code&gt; supporte &lt;strong&gt;Azure OpenAI&lt;/strong&gt; et &lt;strong&gt;OpenAI&lt;/strong&gt;. &lt;code&gt;MODEL_TYPE&lt;/code&gt; est verrouillé sur &lt;code&gt;EMBEDDINGS&lt;/code&gt; pour l&amp;rsquo;instant. Le JSON &lt;code&gt;PARAMETERS&lt;/code&gt; vous permet de définir des valeurs par défaut au niveau du modèle, notamment le nombre de tentatives :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;PARAMETERS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;{&amp;#34;sql_rest_options&amp;#34;:{&amp;#34;retry_count&amp;#34;:3}}&amp;#39;&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;L&amp;rsquo;authentification utilise les identifiants de la base de données, donc les secrets restent hors de votre code applicatif.&lt;/p&gt;
&lt;h2 id="ce-que-cela-permet-pour-les-applications-net"&gt;Ce Que Cela Permet pour les Applications .NET&lt;/h2&gt;
&lt;p&gt;Pour les développeurs .NET qui construisent des fonctionnalités d&amp;rsquo;IA sur des données SQL existantes, c&amp;rsquo;est significatif. Vous n&amp;rsquo;avez pas besoin de :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Extraire des données vers un magasin intermédiaire pour les embeddings&lt;/li&gt;
&lt;li&gt;Gérer un pipeline d&amp;rsquo;embeddings externe&lt;/li&gt;
&lt;li&gt;Configurer une base de données vectorielle séparée (bien que vous puissiez utiliser Azure AI Search si vous voulez un magasin vectoriel complet)&lt;/li&gt;
&lt;li&gt;Modifier la couche d&amp;rsquo;accès aux données de votre application&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vous pouvez ajouter la recherche sémantique aux applications SQL existantes de manière incrémentale, en utilisant les mêmes outils T-SQL que vous avez déjà.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Les patterns RAG sur les données SQL sont devenus dramatiquement plus simples. &lt;code&gt;AI_GENERATE_EMBEDDINGS&lt;/code&gt; + &lt;code&gt;CREATE EXTERNAL MODEL&lt;/code&gt; signifie que votre application SQL existante peut acquérir des capacités de recherche vectorielle sans ajouter de nouvelle infrastructure.&lt;/p&gt;
&lt;p&gt;Les deux fonctionnalités sont en GA dans Azure SQL Database et Azure SQL Managed Instance aujourd&amp;rsquo;hui.&lt;/p&gt;
&lt;p&gt;Post original : &lt;a href="https://devblogs.microsoft.com/azure-sql/generate-embeddings-function-and-external-model-object-support-are-now-generally-available-in-azure-sql/"&gt;Generate Embeddings Function and External Model Object Support Are Now Generally Available in Azure SQL&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>Votre Agent IA a un Problème d'Identité (Et Voici le Modèle qui le Résout)</title><link>https://thedotnetblog.com/fr/news/emiliano-montesdeoca/azd-least-privilege-ai-agents-oauth-token-pattern/</link><pubDate>Wed, 20 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/news/emiliano-montesdeoca/azd-least-privilege-ai-agents-oauth-token-pattern/</guid><description>Un nouveau modèle azd de Curity et Microsoft montre comment créer des agents IA qui utilisent des tokens OAuth de courte durée avec des scopes à grain fin — pour que les agents ne puissent jamais voir des données qu'ils ne devraient pas voir.</description><content:encoded>&lt;p&gt;Il y a un moment dans chaque projet d&amp;rsquo;agent IA qui ressemble à ceci : la démo fonctionne parfaitement, l&amp;rsquo;agent interprète le langage naturel, appelle les bonnes API, retourne les bonnes données. Ensuite vous commencez à penser aux vrais utilisateurs.&lt;/p&gt;
&lt;p&gt;Qu&amp;rsquo;est-ce qui empêche la session d&amp;rsquo;agent d&amp;rsquo;un utilisateur de voir les données d&amp;rsquo;un autre utilisateur ? Et si l&amp;rsquo;agent est trompé par une injection de prompt ? Et s&amp;rsquo;il appelle un outil d&amp;rsquo;une manière inattendue ?&lt;/p&gt;
&lt;p&gt;Ce ne sont pas des cas limites. Ce sont des décisions de conception que vous devez prendre avant de livrer.&lt;/p&gt;
&lt;p&gt;Un nouveau modèle &lt;code&gt;azd&lt;/code&gt; de Curity et Microsoft vous donne une référence fonctionnelle pour exactement ce problème.&lt;/p&gt;
&lt;h2 id="le-problème-central--authentification--autorisation"&gt;Le Problème Central : Authentification ≠ Autorisation&lt;/h2&gt;
&lt;p&gt;La plupart des exemples d&amp;rsquo;agents gèrent bien l&amp;rsquo;authentification des utilisateurs. Ils gèrent mal l&amp;rsquo;autorisation. Savoir &lt;em&gt;qui&lt;/em&gt; est l&amp;rsquo;utilisateur ne vous dit pas &lt;em&gt;quelles données&lt;/em&gt; il devrait voir.&lt;/p&gt;
&lt;p&gt;Une application cliente traditionnelle fait des appels d&amp;rsquo;API prévisibles. Un agent IA est non déterministe — il interprète le langage naturel et décide quoi appeler. Il peut être créatif. Il peut aussi se tromper. Et s&amp;rsquo;il est manipulé par injection de prompt, vous avez besoin de règles qui ne dépendent pas du bon comportement de l&amp;rsquo;IA.&lt;/p&gt;
&lt;p&gt;La solution démontrée par ce modèle : &lt;strong&gt;des tokens de courte durée qui transportent exactement les bonnes informations pour chaque saut&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="comment-fonctionne-la-chaîne-de-tokens"&gt;Comment Fonctionne la Chaîne de Tokens&lt;/h2&gt;
&lt;p&gt;Le modèle utilise des tokens d&amp;rsquo;accès OAuth 2.0 avec échange de tokens pour réduire les permissions à chaque étape. Un token utilisateur est échangé deux fois avant d&amp;rsquo;atteindre le serveur MCP :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Premier échange&lt;/strong&gt; — réduit la portée et convertit le token opaque en JWT&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deuxième échange&lt;/strong&gt; — ajoute l&amp;rsquo;identité de l&amp;rsquo;agent et une nouvelle audience pour le saut du serveur MCP&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;À quoi ressemble le token du serveur MCP :&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;scope&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;stocks/read&amp;#34;&lt;/span&gt;&lt;span class="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;sub&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;62c839b8...&amp;#34;&lt;/span&gt;&lt;span class="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;aud&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://mcp.demo.example&amp;#34;&lt;/span&gt;&lt;span class="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;customer_id&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;178&amp;#34;&lt;/span&gt;&lt;span class="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;region&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;USA&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;Le &lt;code&gt;customer_id&lt;/code&gt; est intégré dans le token par le serveur d&amp;rsquo;autorisation, pas passé comme paramètre que l&amp;rsquo;agent contrôle. L&amp;rsquo;API vérifie le token, pas les instructions de l&amp;rsquo;agent.&lt;/p&gt;
&lt;p&gt;Cela signifie : même si quelqu&amp;rsquo;un trompe l&amp;rsquo;agent pour qu&amp;rsquo;il essaie d&amp;rsquo;obtenir les données d&amp;rsquo;un autre client, le token ne l&amp;rsquo;autorisera pas.&lt;/p&gt;
&lt;h2 id="ce-que-le-modèle-déploie"&gt;Ce que le Modèle Déploie&lt;/h2&gt;
&lt;p&gt;Avec quelques commandes &lt;code&gt;azd&lt;/code&gt; vous obtenez :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Un agent backend sur Microsoft Foundry (C#, SDK Microsoft A2A et MCP)&lt;/li&gt;
&lt;li&gt;Un serveur MCP exposant un exemple d&amp;rsquo;API de portefeuille&lt;/li&gt;
&lt;li&gt;Curity Identity Server comme serveur d&amp;rsquo;autorisation, aux côtés d&amp;rsquo;Entra ID pour l&amp;rsquo;authentification&lt;/li&gt;
&lt;li&gt;Des passerelles API externes et internes gérant l&amp;rsquo;échange de tokens et la journalisation d&amp;rsquo;audit&lt;/li&gt;
&lt;li&gt;Bicep pour toute l&amp;rsquo;infrastructure Azure : Container Apps, VNet, ACR, Azure AI Foundry, Key Vault, Azure SQL Database, stockage&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tout le modèle est inspecTable et personnalisable.&lt;/p&gt;
&lt;h2 id="le-principe-de-conception-qui-vaut-la-peine-dêtre-emprunté"&gt;Le Principe de Conception qui Vaut la Peine d&amp;rsquo;être Emprunté&lt;/h2&gt;
&lt;p&gt;Même si vous n&amp;rsquo;utilisez pas Curity, le modèle est transférable : &lt;strong&gt;les agents ne devraient jamais avoir un accès permanent à l&amp;rsquo;API&lt;/strong&gt;. Chaque action devrait utiliser un token de courte durée avec le scope minimum nécessaire pour cet appel spécifique, émis pour l&amp;rsquo;identité spécifique de l&amp;rsquo;agent, portant les claims dont l&amp;rsquo;API a besoin pour prendre des décisions d&amp;rsquo;autorisation.&lt;/p&gt;
&lt;p&gt;Cela résiste aux agents créatifs, aux erreurs et à l&amp;rsquo;injection de prompt d&amp;rsquo;une façon que &amp;ldquo;assurez-vous simplement que l&amp;rsquo;agent ne fait pas de mauvaises choses&amp;rdquo; ne fera jamais.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Les modèles de sécurité pour les agents IA sont encore en cours d&amp;rsquo;élaboration dans l&amp;rsquo;industrie. Ce modèle est l&amp;rsquo;une des implémentations de référence les plus complètes que j&amp;rsquo;ai vues — il couvre le flux d&amp;rsquo;autorisation réel, pas seulement l&amp;rsquo;authentification.&lt;/p&gt;
&lt;p&gt;Post original : &lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-curity-least-privilege-ai-agents/"&gt;Least privilege AI agents: A new azd template from Curity and Microsoft&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>Aspire 13.3 : Support Kubernetes, Journaux du Navigateur et la Compétence Aspireify</title><link>https://thedotnetblog.com/fr/news/emiliano-montesdeoca/aspire-133-kubernetes-browser-logs-aspireify/</link><pubDate>Mon, 18 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/news/emiliano-montesdeoca/aspire-133-kubernetes-browser-logs-aspireify/</guid><description>Cinq semaines après 13.2, Aspire 13.3 arrive avec 45 nouvelles fonctionnalités, notamment le déploiement AKS de première classe, une compétence d'intégration assistée par IA, la capture des journaux du navigateur et des résultats de commandes structurés.</description><content:encoded>&lt;p&gt;Cinq semaines, ce n&amp;rsquo;est pas beaucoup pour une version, mais Aspire 13.3 ne le semble pas. Les éléments principaux sont significatifs : déploiement Kubernetes et AKS de première classe avec Helm, une compétence d&amp;rsquo;intégration assistée par agent appelée Aspireify, la capture des journaux du navigateur directement dans le dashboard et des résultats de commandes structurés. En plus, 45 nouvelles fonctionnalités, 134 améliorations et 93 corrections de bugs.&lt;/p&gt;
&lt;p&gt;Passons aux points saillants.&lt;/p&gt;
&lt;h2 id="aspireify--intégration-assistée-par-agent"&gt;Aspireify : Intégration Assistée par Agent&lt;/h2&gt;
&lt;p&gt;Ajouter Aspire à un projet existant semble simple — ajoutez un AppHost, c&amp;rsquo;est fait. En pratique, cela implique beaucoup d&amp;rsquo;archéologie : quels ports comptent, quelles variables d&amp;rsquo;environnement sont de vraies dépendances, quels services Docker Compose doivent correspondre aux intégrations Aspire.&lt;/p&gt;
&lt;p&gt;La nouvelle &lt;strong&gt;compétence Aspireify&lt;/strong&gt; donne à votre agent de code un flux de travail guidé précisément pour cela. Quand &lt;code&gt;aspire init&lt;/code&gt; crée un AppHost squelette, la compétence Aspireify aide l&amp;rsquo;agent à inspecter le dépôt, à comprendre comment il fonctionne déjà et à câbler l&amp;rsquo;AppHost pour s&amp;rsquo;adapter à l&amp;rsquo;application — pas l&amp;rsquo;inverse.&lt;/p&gt;
&lt;p&gt;La posture par défaut est &amp;ldquo;minimiser les modifications de votre code.&amp;rdquo; Si votre application lit déjà &lt;code&gt;DATABASE_URL&lt;/code&gt;, l&amp;rsquo;agent le mappe avec &lt;code&gt;WithEnvironment()&lt;/code&gt; au lieu de vous demander de réécrire votre configuration. Si un port est codé en dur, la compétence indique à l&amp;rsquo;agent quand le préserver.&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est le type d&amp;rsquo;outillage IA qui fait réellement gagner du temps plutôt que de générer plus de travail à revoir.&lt;/p&gt;
&lt;h2 id="déploiement-kubernetes-et-aks-de-première-classe"&gt;Déploiement Kubernetes et AKS de Première Classe&lt;/h2&gt;
&lt;p&gt;Celui-là était sur la liste de souhaits depuis un moment. Aspire 13.3 inclut le &lt;strong&gt;support de déploiement Kubernetes et AKS de première classe avec Helm&lt;/strong&gt;. Vous pouvez maintenant cibler AKS comme destination de déploiement directement depuis les outils Aspire.&lt;/p&gt;
&lt;p&gt;Pour les équipes qui exécutent déjà des charges de travail de production sur AKS, cela comble un écart significatif. Votre modèle d&amp;rsquo;application Aspire a maintenant un chemin propre du développement local vers Kubernetes sans rédaction manuelle de charts Helm.&lt;/p&gt;
&lt;h2 id="journaux-du-navigateur-dans-le-dashboard"&gt;Journaux du Navigateur dans le Dashboard&lt;/h2&gt;
&lt;p&gt;C&amp;rsquo;est une de ces fonctionnalités qui semblent mineures jusqu&amp;rsquo;à ce que vous déboguiez un problème frontend.&lt;/p&gt;
&lt;p&gt;La nouvelle API &lt;code&gt;WithBrowserLogs()&lt;/code&gt; attache une ressource de navigateur suivie à toute ressource capable d&amp;rsquo;endpoints. Aspire lance Chromium en utilisant un pipe CDP privé et diffuse les journaux de console, les requêtes réseau et les erreurs directement dans le flux de journaux de la ressource :&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;frontend&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;AddViteApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;frontend&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&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="n"&gt;WithHttpEndpoint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&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;WithBrowserLogs&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;AppHost TypeScript prend en charge la même chose :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;frontend&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;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;withHttpEndpoint&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;port&lt;/span&gt;: &lt;span class="kt"&gt;3000&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/span&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;withBrowserLogs&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;Erreurs de console, requêtes réseau échouées, exceptions côté client — tout visible dans le même dashboard où vous regardez déjà les traces et métriques. Plus besoin de changer d&amp;rsquo;onglet vers les DevTools du navigateur pour les bases.&lt;/p&gt;
&lt;h2 id="résultats-de-commandes-structurés"&gt;Résultats de Commandes Structurés&lt;/h2&gt;
&lt;p&gt;Les commandes de ressources ont reçu une mise à niveau significative. Jusqu&amp;rsquo;à présent, les commandes renvoyaient succès/échec. Maintenant elles retournent des résultats structurés : texte, JSON ou markdown qui circule à travers le modèle, l&amp;rsquo;interface du dashboard, la CLI et les outils MCP.&lt;/p&gt;
&lt;p&gt;Le dashboard relie tout cela avec un nouveau centre de notifications dans l&amp;rsquo;en-tête. Les résultats des commandes apparaissent sous forme de notifications horodatées avec rendu markdown et une action &amp;ldquo;Voir la réponse&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Cela rend les commandes de ressources véritablement composables. Une intégration peut maintenant exposer une commande qui renvoie une sortie significative — comme une URL de tunnel — plutôt que de simplement changer d&amp;rsquo;état quelque part.&lt;/p&gt;
&lt;h2 id="en-résumé"&gt;En Résumé&lt;/h2&gt;
&lt;p&gt;Aspire 13.3 vaut la mise à jour ne serait-ce que pour le support Kubernetes. Les journaux du navigateur et les résultats de commandes structurés ressemblent au type d&amp;rsquo;améliorations de qualité de vie qui s&amp;rsquo;accumulent rapidement dans un flux de travail de développement quotidien.&lt;/p&gt;
&lt;p&gt;Notes de version complètes : &lt;a href="https://devblogs.microsoft.com/aspire/whats-new-aspire-13-3/"&gt;What&amp;rsquo;s New in Aspire 13.3&lt;/a&gt;&lt;/p&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>Créer une application de conférence IA avec la pile composable de .NET</title><link>https://thedotnetblog.com/fr/news/emiliano-montesdeoca/ai-conference-app-dotnet-composable-stack/</link><pubDate>Wed, 06 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/news/emiliano-montesdeoca/ai-conference-app-dotnet-composable-stack/</guid><description>Microsoft a créé ConferencePulse — une application Blazor pour les conférences en direct — en combinant Microsoft.Extensions.AI, DataIngestion, VectorData, MCP et Agent Framework. Voici comment les pièces s'assemblent.</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/news/emiliano-montesdeoca/ai-conference-app-dotnet-composable-stack/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://devblogs.microsoft.com/dotnet/building-ai-conference-app-dotnet-composable-stack/"&gt;Créer une application de conférence IA avec la pile composable de .NET&lt;/a&gt; — Microsoft a créé ConferencePulse, une application Blazor Server pour les sessions de conférence en direct, en combinant cinq bibliothèques d&amp;rsquo;extension .NET. Elle a été utilisée au MVP Summit.&lt;/p&gt;
&lt;h2 id="ce-que-fait-conferencepulse"&gt;Ce que fait ConferencePulse&lt;/h2&gt;
&lt;p&gt;ConferencePulse s&amp;rsquo;exécute pendant les sessions en direct et fournit : des sondages générés par l&amp;rsquo;IA à partir du contenu de la session, des questions-réponses du public avec un pipeline RAG puisant dans une base de connaissances en direct, des insights générés automatiquement et des résumés de sessions produits par plusieurs agents IA concurrents. La pile est .NET 10, Blazor Server, Aspire, répartie sur cinq projets : Web, Core, Ingestion, Agents, Mcp et AppHost.&lt;/p&gt;
&lt;h2 id="microsoftextensionsai--une-abstraction-pour-tout"&gt;Microsoft.Extensions.AI : une abstraction pour tout&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;IChatClient&lt;/code&gt; est l&amp;rsquo;abstraction unifiée — on la configure une fois et la même interface fonctionne pour Azure OpenAI, OpenAI, Anthropic ou tout autre fournisseur. Six lignes pour obtenir un client entièrement configuré avec l&amp;rsquo;invocation de fonctions, le traçage OpenTelemetry et le middleware de journalisation :&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;services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddChatClient&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="n"&gt;GetChatClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;gpt-4o&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&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;UseFunctionInvocation&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&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;UseOpenTelemetry&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&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;UseLogging&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;Le même &lt;code&gt;IChatClient&lt;/code&gt; est réutilisé plus tard pour l&amp;rsquo;étape d&amp;rsquo;enrichissement de l&amp;rsquo;ingestion de données — pas besoin d&amp;rsquo;un client séparé pour cela.&lt;/p&gt;
&lt;h2 id="pipeline-dataingestion"&gt;Pipeline DataIngestion&lt;/h2&gt;
&lt;p&gt;Le contenu de la session circule dans un pipeline : &lt;code&gt;MarkdownReader&lt;/code&gt; → &lt;code&gt;HeaderChunker&lt;/code&gt; (500 tokens, 50 tokens de chevauchement) → &lt;code&gt;SummaryEnricher&lt;/code&gt; + &lt;code&gt;KeywordEnricher&lt;/code&gt; → &lt;code&gt;VectorStoreWriter&lt;/code&gt; (Qdrant). Les enrichisseurs utilisent le même &lt;code&gt;IChatClient&lt;/code&gt; pour générer des résumés et extraire des mots-clés avant l&amp;rsquo;indexation. Les questions du public, les paires de questions-réponses et les résultats des sondages sont ingérés en temps réel au fur et à mesure de la session — la base de connaissances s&amp;rsquo;enrichit pendant la conférence.&lt;/p&gt;
&lt;h2 id="vectordata--recherche-indépendante-du-fournisseur"&gt;VectorData : recherche indépendante du fournisseur&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;VectorStoreCollection.SearchAsync()&lt;/code&gt; fonctionne de la même manière que le magasin sous-jacent soit Qdrant ou Azure AI Search. La recherche hybride (vecteur + texte intégral) est prise en charge. Le pipeline RAG pour les questions-réponses du public interroge cette collection et récupère des extraits pertinents à transmettre comme contexte au client de chat.&lt;/p&gt;
&lt;h2 id="mcp--contenu-de-session-comme-outils"&gt;MCP : contenu de session comme outils&lt;/h2&gt;
&lt;p&gt;Le contenu de la session est exposé via MCP afin que tout client compatible MCP puisse y accéder. Le serveur et le client sont tous deux implémentés — le serveur expose les connaissances de la session comme outils MCP, et le client permet d&amp;rsquo;appeler ces outils depuis le pipeline de l&amp;rsquo;agent.&lt;/p&gt;
&lt;h2 id="agent-framework--résumé-multi-agents-en-parallèle"&gt;Agent Framework : résumé multi-agents en parallèle&lt;/h2&gt;
&lt;p&gt;Le résumé de la session est généré par trois agents s&amp;rsquo;exécutant de manière concurrente — &lt;code&gt;PollSummaryAgent&lt;/code&gt;, &lt;code&gt;QuestionSummaryAgent&lt;/code&gt; et &lt;code&gt;InsightSummaryAgent&lt;/code&gt; — puis fusionnés. Cela utilise le modèle de chat de groupe ou d&amp;rsquo;exécution parallèle de Microsoft Agent Framework. Chaque agent gère une préoccupation ; l&amp;rsquo;orchestrateur fusionne les sorties.&lt;/p&gt;
&lt;h2 id="le-principe-de-conception"&gt;Le principe de conception&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;article soulève un point important : utiliser l&amp;rsquo;outil le plus simple qui convient. Les appels directs à &lt;code&gt;IChatClient&lt;/code&gt; pour les tâches de génération simples. L&amp;rsquo;appel d&amp;rsquo;outil/fonction pour l&amp;rsquo;extraction de données structurées. Les agents complets uniquement quand on a besoin d&amp;rsquo;un raisonnement autonome en plusieurs étapes. La stratification des bibliothèques l&amp;rsquo;impose — on peut utiliser &lt;code&gt;Microsoft.Extensions.AI&lt;/code&gt; sans inclure l&amp;rsquo;Agent Framework complet.&lt;/p&gt;
&lt;p&gt;Consultez le &lt;a href="https://devblogs.microsoft.com/dotnet/building-ai-conference-app-dotnet-composable-stack/"&gt;post complet&lt;/a&gt; pour la structure complète du projet et les liens vers le code source.&lt;/p&gt;</content:encoded></item><item><title>Microsoft Agent Framework Partie 3 : Des outils aux workflows — Les blocs s'emboîtent</title><link>https://thedotnetblog.com/fr/news/emiliano-montesdeoca/maf-building-blocks-part-3-agents-tools-workflows/</link><pubDate>Tue, 05 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/news/emiliano-montesdeoca/maf-building-blocks-part-3-agents-tools-workflows/</guid><description>La partie 3 de la série Building Blocks for AI en .NET couvre le Microsoft Agent Framework — des agents simples avec des outils aux workflows multi-agents avec mémoire. Voici ce qui compte vraiment.</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/news/emiliano-montesdeoca/maf-building-blocks-part-3-agents-tools-workflows/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Si vous avez suivi la série Building Blocks for AI en .NET, vous savez que la Partie 1 nous a donné &lt;code&gt;IChatClient&lt;/code&gt; (l&amp;rsquo;interface universelle de modèles) et la Partie 2 &lt;code&gt;Microsoft.Extensions.VectorData&lt;/code&gt; (recherche sémantique et RAG). Ces deux éléments sont fondamentaux et utiles indépendamment. Mais c&amp;rsquo;est ici que tout commence à se connecter.&lt;/p&gt;
&lt;p&gt;La Partie 3 porte sur le &lt;a href="https://github.com/microsoft/agent-framework"&gt;Microsoft Agent Framework&lt;/a&gt; — et franchement, c&amp;rsquo;est la pièce que j&amp;rsquo;attendais de voir arriver dans .NET. La version 1.0 est sortie en avril. L&amp;rsquo;API est stable. Il est temps de construire de vrais agents.&lt;/p&gt;
&lt;h2 id="ce-quest-vraiment-un-agent-vs-un-chatbot"&gt;Ce qu&amp;rsquo;est vraiment un agent (vs. un chatbot)&lt;/h2&gt;
&lt;p&gt;Avant de plonger dans le code, clarifions cette distinction. Un chatbot reçoit un input, appelle un modèle, retourne un output. Boucle simple.&lt;/p&gt;
&lt;p&gt;Un agent a de l&amp;rsquo;&lt;em&gt;autonomie&lt;/em&gt;. Il peut raisonner sur une tâche, décider quels outils utiliser, les appeler, évaluer les résultats et décider quoi faire ensuite — tout cela sans que vous écriviez une logique étape par étape pour chaque scénario. Vous lui donnez des outils et des instructions, et il s&amp;rsquo;occupe de l&amp;rsquo;orchestration.&lt;/p&gt;
&lt;p&gt;Voyez-le ainsi : &lt;code&gt;IChatClient&lt;/code&gt; c&amp;rsquo;est comme avoir une conversation. Un agent c&amp;rsquo;est comme déléguer une liste de tâches à quelqu&amp;rsquo;un.&lt;/p&gt;
&lt;h2 id="votre-premier-agent-en-10-lignes"&gt;Votre premier agent en 10 lignes&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.Agents.AI
&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-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="n"&gt;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="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;GetChatClient&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;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;instructions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;You are good at telling jokes.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&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;Joker&amp;#34;&lt;/span&gt;&lt;span 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;Tell me a joke about a pirate.&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;La méthode d&amp;rsquo;extension &lt;code&gt;.AsAIAgent()&lt;/code&gt; est le pont. Même pattern que &lt;code&gt;.AsIChatClient()&lt;/code&gt; de MEAI — elle enveloppe le SDK du fournisseur dans une abstraction stable. Fonctionne avec Azure OpenAI, OpenAI, GitHub Models, Microsoft Foundry ou des modèles locaux.&lt;/p&gt;
&lt;p&gt;Le streaming fonctionne aussi :&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;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="s"&gt;&amp;#34;Tell me a joke about a pirate.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&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&gt;&lt;/span&gt;&lt;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="donner-des-outils-à-lagent"&gt;Donner des outils à l&amp;rsquo;agent&lt;/h2&gt;
&lt;p&gt;C&amp;rsquo;est là que les agents cessent d&amp;rsquo;être des chatbots sophistiqués. Les outils sont des fonctions que le modèle peut décider d&amp;rsquo;appeler selon ce que l&amp;rsquo;utilisateur demande. Pas de logique de routage nécessaire — le modèle le détermine lui-même.&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;[Description(&amp;#34;Get the weather for a given location.&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;static&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;GetWeather&lt;/span&gt;&lt;span class="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; [Description(&amp;#34;The location to get the weather for.&amp;#34;)]&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;location&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;$&amp;#34;The weather in {location} is cloudy with a high of 15°C.&amp;#34;&lt;/span&gt;&lt;span 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="n"&gt;chatClient&lt;/span&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;instructions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&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="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;AIFunctionFactory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GetWeather&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;Deux choses à noter. Premièrement, &lt;code&gt;AIFunctionFactory&lt;/code&gt; vient de MEAI — la même factory d&amp;rsquo;outils que vous utiliseriez avec un &lt;code&gt;IChatClient&lt;/code&gt; normal. Si vous avez déjà défini des outils pour des scénarios de chat, ils fonctionnent ici aussi.&lt;/p&gt;
&lt;p&gt;Deuxièmement, les attributs &lt;code&gt;Description&lt;/code&gt; sont très importants. C&amp;rsquo;est comment le modèle comprend ce que fait un outil et quand l&amp;rsquo;utiliser. Traitez-les comme de la documentation pour votre IA, pas pour les humains.&lt;/p&gt;
&lt;h2 id="sessions--des-conversations-avec-une-vraie-mémoire"&gt;Sessions : Des conversations avec une vraie mémoire&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;AgentSession&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreateSessionAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&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;Tell me a joke about a pirate.&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&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;Now add some emojis and tell it in the voice of a pirate&amp;#39;s parrot.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&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="p"&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sans session, chaque appel à &lt;code&gt;RunAsync&lt;/code&gt; est sans état. Avec une session, l&amp;rsquo;agent sait à quelle blague vous faites référence. &lt;code&gt;AgentSession&lt;/code&gt; préserve l&amp;rsquo;historique de conversation entre les tours.&lt;/p&gt;
&lt;p&gt;Pour les services sans état en production, les sessions se sérialisent proprement :&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;JsonElement&lt;/span&gt; &lt;span class="n"&gt;sessionState&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;SerializeSessionAsync&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="c1"&gt;// ... stockez-le quelque part ...&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;restoredSession&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;DeserializeSessionAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sessionState&lt;/span&gt;&lt;span class="p"&gt;);&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="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;What were we just talking about?&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;restoredSession&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 crucial si votre agent s&amp;rsquo;exécute dans un environnement serverless ou mis à l&amp;rsquo;échelle horizontalement.&lt;/p&gt;
&lt;h2 id="aicontextprovider--mémoire-persistante-entre-les-sessions"&gt;AIContextProvider : Mémoire persistante entre les sessions&lt;/h2&gt;
&lt;p&gt;Les sessions préservent l&amp;rsquo;historique &lt;em&gt;au sein&lt;/em&gt; d&amp;rsquo;une session. Mais qu&amp;rsquo;en est-il de connaître des choses sur un utilisateur entre les sessions ? &lt;code&gt;AIContextProvider&lt;/code&gt; gère cela.&lt;/p&gt;
&lt;p&gt;Il a deux hooks :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;ProvideAIContextAsync&lt;/code&gt;&lt;/strong&gt; — s&amp;rsquo;exécute &lt;em&gt;avant&lt;/em&gt; chaque interaction, injecte du contexte dans l&amp;rsquo;agent&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;StoreAIContextAsync&lt;/code&gt;&lt;/strong&gt; — s&amp;rsquo;exécute &lt;em&gt;après&lt;/em&gt; chaque interaction, permet d&amp;rsquo;apprendre et de persister&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le pattern est élégant : vous pouvez empiler plusieurs providers — un pour les préférences utilisateur, un pour les interactions récentes, un qui interroge votre store VectorData pour des documents pertinents. Ce dernier est exactement le pattern RAG de la Partie 2, s&amp;rsquo;exécutant maintenant automatiquement à chaque appel d&amp;rsquo;agent.&lt;/p&gt;
&lt;h2 id="workflows-multi-agents"&gt;Workflows multi-agents&lt;/h2&gt;
&lt;p&gt;C&amp;rsquo;est là que le framework mérite son nom. Il inclut un système de workflows basé sur des graphes où les executors (agents, fonctions, quoi que ce soit) se connectent via des arêtes.&lt;/p&gt;
&lt;p&gt;Quelques patterns supportés nativement :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Séquentiel&lt;/strong&gt; : La sortie de l&amp;rsquo;Agent A alimente l&amp;rsquo;Agent B&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Concurrent (fan-out/fan-in)&lt;/strong&gt; : Dispatch vers plusieurs agents en parallèle, collecte des résultats&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Routage conditionnel&lt;/strong&gt; : Achemine le travail vers différents agents selon la sortie&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Boucles écrivain-critique&lt;/strong&gt; : Un agent écrit, un autre évalue, boucle jusqu&amp;rsquo;à approbation&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sub-workflows&lt;/strong&gt; : Composition hiérarchique de workflows&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Un exemple écrivain-critique :&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;WorkflowBuilder&lt;/span&gt; &lt;span class="n"&gt;builder&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;writerAgent&lt;/span&gt;&lt;span class="p"&gt;);&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="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddEdge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;writerAgent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;criticAgent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&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;AddEdge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;criticAgent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;writerAgent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;result&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;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsApproved&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&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;WithOutputFrom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;criticAgent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsApproved&lt;/span&gt;&lt;span class="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;workflow&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;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;Propre, lisible, et le routage basé sur des conditions signifie que vous n&amp;rsquo;écrivez pas la logique de boucle vous-même.&lt;/p&gt;
&lt;h2 id="human-in-the-loop"&gt;Human-in-the-Loop&lt;/h2&gt;
&lt;p&gt;Tout ne devrait pas s&amp;rsquo;exécuter de manière entièrement autonome. Pour les opérations sensibles — écritures en base de données, transactions financières, envoi de communications — vous voulez qu&amp;rsquo;un humain approuve avant que l&amp;rsquo;agent n&amp;rsquo;exécute.&lt;/p&gt;
&lt;p&gt;Le framework a un support intégré pour cela via &lt;code&gt;FunctionApprovalRequestContent&lt;/code&gt; et &lt;code&gt;FunctionApprovalResponseContent&lt;/code&gt;. L&amp;rsquo;agent propose l&amp;rsquo;appel d&amp;rsquo;outil, votre code applicatif le présente à l&amp;rsquo;utilisateur, et la réponse détermine si l&amp;rsquo;exécution se poursuit.&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est la bonne façon de penser aux agents dans les contextes d&amp;rsquo;entreprise : pas entièrement autonomes, mais &lt;em&gt;autonomie avec des garde-fous&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id="vue-densemble"&gt;Vue d&amp;rsquo;ensemble&lt;/h2&gt;
&lt;p&gt;Si vous prenez du recul :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MEAI&lt;/strong&gt; vous donne une interface universelle vers n&amp;rsquo;importe quel modèle&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;VectorData&lt;/strong&gt; donne à vos agents accès à la connaissance de votre organisation via la recherche sémantique&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agent Framework&lt;/strong&gt; orchestre tout — utilise &lt;code&gt;IChatClient&lt;/code&gt; en interne, se compose avec des context providers, et coordonne via des workflows&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Chaque pièce a été conçue pour se composer avec les autres. Consultez le &lt;a href="https://devblogs.microsoft.com/dotnet/microsoft-agent-framework-building-blocks-for-ai-part-3/"&gt;post original de Jeremy Likness&lt;/a&gt; et le &lt;a href="https://github.com/microsoft/agent-framework/tree/main/dotnet"&gt;dépôt GitHub de l&amp;rsquo;Agent Framework&lt;/a&gt; pour les exemples complets.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Le post Partie 3 du Microsoft Agent Framework boucle la boucle de la série Building Blocks. Pour les développeurs .NET qui veulent construire des agents IA — pas seulement des chatbots, de vrais agents qui utilisent des outils, se souviennent de choses et coordonnent — c&amp;rsquo;est votre voie.&lt;/p&gt;
&lt;p&gt;La version stable 1.0 signifie que vous pouvez construire avec cela en production. Si vous attendiez de vous lancer dans le développement d&amp;rsquo;agents en .NET, c&amp;rsquo;est le bon moment.&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/news/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/news/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/news/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>CodeAct dans Agent Framework : Comment Réduire la Latence de votre Agent de Moitié</title><link>https://thedotnetblog.com/fr/news/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/news/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/news/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/news/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/news/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/news/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/news/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/news/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/news/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>Foundry Toolboxes : Un seul endpoint pour tous les outils de vos agents</title><link>https://thedotnetblog.com/fr/news/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/news/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/news/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>Windows App Dev CLI v0.3 : F5 depuis le terminal et UI Automation pour les agents</title><link>https://thedotnetblog.com/fr/news/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/news/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/news/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>VS Code 1.117 : Les Agents Obtiennent Leurs Propres Branches Git et Je Suis Totalement Pour</title><link>https://thedotnetblog.com/fr/news/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/news/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/news/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/news/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/news/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/news/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/news/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/news/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/news/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>Docker Sandbox permet aux agents Copilot de refactoriser votre code sans risque pour votre machine</title><link>https://thedotnetblog.com/fr/news/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/news/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/news/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>Où héberger vos agents IA sur Azure ? Un guide de décision pratique</title><link>https://thedotnetblog.com/fr/news/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/news/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/news/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/news/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/news/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/news/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/news/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/news/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/news/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/news/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/news/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/news/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>Connectez vos serveurs MCP sur Azure Functions aux agents Foundry — Voici comment</title><link>https://thedotnetblog.com/fr/news/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/news/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/news/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/news/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/news/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/news/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>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/news/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/news/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/news/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/news/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/news/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/news/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/news/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/news/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/news/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.115 — Notifications de Terminal en Arrière-plan, Mode Agent SSH et Plus</title><link>https://thedotnetblog.com/fr/news/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/news/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/news/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>Aspire 13.2 embarque une CLI de documentation — et votre agent IA peut l'utiliser aussi</title><link>https://thedotnetblog.com/fr/news/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/news/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/news/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/news/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/news/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/news/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/news/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/news/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/news/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>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/news/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/news/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/news/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/news/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/news/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/news/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/news/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/news/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/news/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/news/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/news/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/news/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/news/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/news/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/news/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/news/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/news/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/news/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/news/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/news/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/news/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></channel></rss>