<?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 Agents | The .NET Blog</title><link>https://thedotnetblog.com/fr/tags/ai-agents/</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>Tue, 05 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://thedotnetblog.com/fr/tags/ai-agents/index.xml" rel="self" type="application/rss+xml"/><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>SQL MCP Server sur Azure App Service — Sans Conteneurs</title><link>https://thedotnetblog.com/fr/news/emiliano-montesdeoca/sql-mcp-server-azure-app-service-no-containers/</link><pubDate>Tue, 05 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/news/emiliano-montesdeoca/sql-mcp-server-azure-app-service-no-containers/</guid><description>Le SQL MCP Server peut désormais s'exécuter sur Azure App Service sans Docker ni Kubernetes. Voici ce que cela signifie pour les développeurs .NET qui construisent des agents IA communiquant avec des bases de données SQL.</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/sql-mcp-server-azure-app-service-no-containers/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Soyons honnêtes : chaque fois que je lis &amp;ldquo;nécessite un conteneur&amp;rdquo; dans un tutoriel, une petite partie de moi soupire. Les conteneurs sont formidables — jusqu&amp;rsquo;à ce que ton équipe n&amp;rsquo;ait pas de stratégie de conteneurs, et soudain une fonctionnalité qui semblait simple se retrouve bloquée par une complexité d&amp;rsquo;orchestration que personne n&amp;rsquo;avait anticipée.&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est pourquoi celui-ci a retenu mon attention. Le SQL MCP Server peut désormais s&amp;rsquo;exécuter sur Azure App Service — sans Docker, sans Kubernetes, juste avec la même configuration Data API Builder (DAB) qui expose ta base de données SQL via MCP, REST et GraphQL.&lt;/p&gt;
&lt;h2 id="quest-ce-que-le-sql-mcp-server-"&gt;Qu&amp;rsquo;est-ce que le SQL MCP Server ?&lt;/h2&gt;
&lt;p&gt;Contexte rapide si tu ne le connais pas encore. Le SQL MCP Server se place entre ton agent IA et ta base de données SQL. Au lieu de donner à ton agent un accès direct à la base de données (une très mauvaise idée), il expose tes tables et vues comme une couche d&amp;rsquo;abstraction — des entités avec des permissions définies.&lt;/p&gt;
&lt;p&gt;Il est construit sur &lt;a href="https://learn.microsoft.com/fr-fr/azure/data-api-builder/"&gt;Data API Builder&lt;/a&gt;, ce qui signifie qu&amp;rsquo;un seul fichier de configuration gère MCP &lt;em&gt;et&lt;/em&gt; REST &lt;em&gt;et&lt;/em&gt; GraphQL simultanément. Ton agent parle à l&amp;rsquo;endpoint MCP. Ton application traditionnelle parle à REST ou GraphQL. Même config, même runtime, surfaces différentes.&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est vraiment utile. Tu ne maintiens pas deux couches d&amp;rsquo;API séparées.&lt;/p&gt;
&lt;h2 id="le-problème-des-conteneurs-et-la-solution"&gt;Le Problème des Conteneurs (et la Solution)&lt;/h2&gt;
&lt;p&gt;Le modèle de déploiement original du SQL MCP Server utilisait des conteneurs. Cela fonctionne bien dans beaucoup d&amp;rsquo;équipes — mais pas toutes. De nombreuses équipes .NET standardisent sur Azure App Service ou des VMs. Exiger un runtime de conteneur juste pour exposer un endpoint SQL ajoute de la friction que personne n&amp;rsquo;a demandée.&lt;/p&gt;
&lt;p&gt;Le nouveau guide montre comment contourner entièrement le conteneur. Tout fonctionne avec une commande &lt;code&gt;dab start&lt;/code&gt;, hébergé sur App Service comme un processus web .NET 8 standard.&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 Data API Builder&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dotnet tool install microsoft.dataapibuilder --prerelease -g
&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 la configuration&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dab init --database-type mssql --host-mode Development --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;&lt;span class="c1"&gt;# Ajouter une entité&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dab add products --source dbo.products --permissions &lt;span class="s2"&gt;&amp;#34;authenticated:*&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;&lt;span class="c1"&gt;# Configurer le fournisseur d&amp;#39;auth App Service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dab configure --runtime.host.authentication.provider AppService
&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;# Démarrer le serveur&lt;/span&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;À ce stade, tu as MCP à &lt;code&gt;/mcp&lt;/code&gt;, REST et GraphQL depuis le même processus, et rien qui tourne dans un conteneur.&lt;/p&gt;
&lt;h2 id="authentification-sans-clés-dapi-partagées"&gt;Authentification Sans Clés d&amp;rsquo;API Partagées&lt;/h2&gt;
&lt;p&gt;C&amp;rsquo;est la partie que j&amp;rsquo;apprécie le plus. Quand tu déploies sur App Service, tu configures Microsoft Entra ID comme fournisseur d&amp;rsquo;authentification. Pas de secrets partagés dans les fichiers de configuration, pas de clés d&amp;rsquo;API à faire tourner.&lt;/p&gt;
&lt;p&gt;La chaîne de connexion reste dans une variable d&amp;rsquo;environnement App Service (pas dans &lt;code&gt;dab-config.json&lt;/code&gt;), et l&amp;rsquo;endpoint MCP est protégé par l&amp;rsquo;authentification de la plateforme. Si tu es déjà aligné sur Entra ID pour tes charges de travail Azure, cela s&amp;rsquo;intègre naturellement.&lt;/p&gt;
&lt;p&gt;Pour le développement local, tu passes en mode &lt;code&gt;Simulator&lt;/code&gt; et transport STDIO. Tu reviens en mode &lt;code&gt;AppService&lt;/code&gt; avant le déploiement. Propre et explicite.&lt;/p&gt;
&lt;h2 id="déploiement-sur-app-service"&gt;Déploiement sur App Service&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;az appservice plan create &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --name &amp;lt;plan-name&amp;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; --resource-group &amp;lt;resource-group&amp;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; --sku B1 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --is-linux
&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;az webapp create &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --name &amp;lt;app-name&amp;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; --resource-group &amp;lt;resource-group&amp;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; --plan &amp;lt;plan-name&amp;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; --runtime &lt;span class="s2"&gt;&amp;#34;DOTNETCORE:8.0&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;az webapp config &lt;span class="nb"&gt;set&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; --name &amp;lt;app-name&amp;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; --resource-group &amp;lt;resource-group&amp;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; --startup-file &lt;span class="s2"&gt;&amp;#34;dab start&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ensuite tu déploies ton projet DAB en utilisant la méthode de déploiement de code que ton équipe utilise déjà. Le détail clé : c&amp;rsquo;est un déploiement de &lt;strong&gt;code&lt;/strong&gt;, pas de conteneur.&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 agents IA en .NET, ton agent devra tôt ou tard communiquer avec une base de données. Le SQL MCP Server te donne une façon structurée de le faire sans exposer des chaînes de connexion brutes.&lt;/p&gt;
&lt;p&gt;Consulte le guide complet dans le &lt;a href="https://devblogs.microsoft.com/azure-sql/sql-mcp-server-app-service/"&gt;billet original&lt;/a&gt; et le &lt;a href="https://github.com/Azure-Samples/SQL-MCP-NoContainer"&gt;dépôt d&amp;rsquo;exemple sur GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Le SQL MCP Server sur App Service est une option pragmatique solide pour les équipes .NET qui souhaitent donner à leurs agents un accès structuré aux données SQL sans stratégie de conteneurs. Essaie-le — tes agents apprécieront la surface d&amp;rsquo;API propre.&lt;/p&gt;</content:encoded></item><item><title>Gouverner les appels d'outils MCP en .NET avec Agent Governance Toolkit</title><link>https://thedotnetblog.com/fr/news/emiliano-montesdeoca/governing-mcp-tool-calls-dotnet/</link><pubDate>Mon, 04 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/news/emiliano-montesdeoca/governing-mcp-tool-calls-dotnet/</guid><description>Resume pratique pour les equipes .NET sur "Gouverner les appels d'outils MCP en .NET avec Agent Governance Toolkit", avec des etapes concretes pour la production.</description><content:encoded>&lt;p&gt;&lt;em&gt;Cet article a ete traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/fr/news/emiliano-montesdeoca/governing-mcp-tool-calls-dotnet/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://devblogs.microsoft.com/dotnet/governing-mcp-tool-calls-in-dotnet-with-the-agent-governance-toolkit/"&gt;Gouverner les appels d&amp;rsquo;outils MCP en .NET avec Agent Governance Toolkit&lt;/a&gt; merite l&amp;rsquo;attention des equipes qui construisent et exploitent des systemes .NET en production.&lt;/p&gt;
&lt;p&gt;Selon moi, l&amp;rsquo;important n&amp;rsquo;est pas seulement la nouveaute, mais la capacite a la transformer vite en pratique d&amp;rsquo;ingenierie reutilisable.&lt;/p&gt;
&lt;h2 id="pourquoi-cest-important-pour-les-equipes-net"&gt;Pourquoi c&amp;rsquo;est important pour les equipes .NET&lt;/h2&gt;
&lt;p&gt;Ce type d&amp;rsquo;evolution aide a equilibrer vitesse de livraison, coherence de plateforme et gouvernance.&lt;/p&gt;
&lt;h2 id="prochaines-etapes-pratiques"&gt;Prochaines etapes pratiques&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Validez la fonctionnalite dans un petit pilote .NET avec des donnees proches de la production.&lt;/li&gt;
&lt;li&gt;Definissez observabilite et plan de rollback avant d&amp;rsquo;elargir.&lt;/li&gt;
&lt;li&gt;Documentez le pattern pour qu&amp;rsquo;il soit reutilisable par d&amp;rsquo;autres equipes.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="source"&gt;Source&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Article original: &lt;a href="https://devblogs.microsoft.com/dotnet/governing-mcp-tool-calls-in-dotnet-with-the-agent-governance-toolkit/"&gt;https://devblogs.microsoft.com/dotnet/governing-mcp-tool-calls-in-dotnet-with-the-agent-governance-toolkit/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title>Mise a jour d'avril de Visual Studio: integration Cloud Agent pour les flux .NET</title><link>https://thedotnetblog.com/fr/news/emiliano-montesdeoca/visual-studio-april-update-cloud-agent-integration/</link><pubDate>Mon, 04 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/fr/news/emiliano-montesdeoca/visual-studio-april-update-cloud-agent-integration/</guid><description>Resume pratique pour les equipes .NET sur "Mise a jour d'avril de Visual Studio: integration Cloud Agent pour les flux .NET", avec des etapes concretes pour la production.</description><content:encoded>&lt;p&gt;&lt;em&gt;Cet article a ete traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/fr/news/emiliano-montesdeoca/visual-studio-april-update-cloud-agent-integration/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://devblogs.microsoft.com/visualstudio/visual-studio-april-update-cloud-agent-integration/"&gt;Mise a jour d&amp;rsquo;avril de Visual Studio: integration Cloud Agent pour les flux .NET&lt;/a&gt; merite l&amp;rsquo;attention des equipes qui construisent et exploitent des systemes .NET en production.&lt;/p&gt;
&lt;p&gt;Selon moi, l&amp;rsquo;important n&amp;rsquo;est pas seulement la nouveaute, mais la capacite a la transformer vite en pratique d&amp;rsquo;ingenierie reutilisable.&lt;/p&gt;
&lt;h2 id="pourquoi-cest-important-pour-les-equipes-net"&gt;Pourquoi c&amp;rsquo;est important pour les equipes .NET&lt;/h2&gt;
&lt;p&gt;Ce type d&amp;rsquo;evolution aide a equilibrer vitesse de livraison, coherence de plateforme et gouvernance.&lt;/p&gt;
&lt;h2 id="prochaines-etapes-pratiques"&gt;Prochaines etapes pratiques&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Validez la fonctionnalite dans un petit pilote .NET avec des donnees proches de la production.&lt;/li&gt;
&lt;li&gt;Definissez observabilite et plan de rollback avant d&amp;rsquo;elargir.&lt;/li&gt;
&lt;li&gt;Documentez le pattern pour qu&amp;rsquo;il soit reutilisable par d&amp;rsquo;autres equipes.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="source"&gt;Source&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Article original: &lt;a href="https://devblogs.microsoft.com/visualstudio/visual-studio-april-update-cloud-agent-integration/"&gt;https://devblogs.microsoft.com/visualstudio/visual-studio-april-update-cloud-agent-integration/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item></channel></rss>