<?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>Tool Calling | The .NET Blog</title><link>https://thedotnetblog.com/ca/tags/tool-calling/</link><description>Articles, tutorials and insights from the .NET community.</description><generator>Hugo</generator><language>ca</language><managingEditor>@thedotnetblog (The .NET Blog)</managingEditor><webMaster>@thedotnetblog</webMaster><lastBuildDate>Tue, 05 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://thedotnetblog.com/ca/tags/tool-calling/index.xml" rel="self" type="application/rss+xml"/><item><title>Microsoft Agent Framework Part 3: De les Eines als Workflows — Les Peces Encaixen</title><link>https://thedotnetblog.com/ca/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/ca/news/emiliano-montesdeoca/maf-building-blocks-part-3-agents-tools-workflows/</guid><description>La tercera part de la sèrie de blocs de construcció d'IA en .NET cobreix el Microsoft Agent Framework — des d'agents únics amb eines fins a workflows multi-agent amb memòria. Això és el que realment importa.</description><content:encoded>&lt;p&gt;&lt;em&gt;Aquesta publicació ha estat traduïda automàticament. Per a la versió original, &lt;a href="https://thedotnetblog.com/ca/news/emiliano-montesdeoca/maf-building-blocks-part-3-agents-tools-workflows/"&gt;fes clic aquí&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Si has seguit la sèrie Building Blocks for AI en .NET, saps que la Part 1 ens va donar &lt;code&gt;IChatClient&lt;/code&gt; (la interfície universal de models) i la Part 2 ens va donar &lt;code&gt;Microsoft.Extensions.VectorData&lt;/code&gt; (cerca semàntica i RAG). Ambdues són fonamentals i útils per si soles. Però aquí és on tot comença a connectar-se.&lt;/p&gt;
&lt;p&gt;La Part 3 tracta del &lt;a href="https://github.com/microsoft/agent-framework"&gt;Microsoft Agent Framework&lt;/a&gt; — i sincerament, és la peça que estava esperant veure arribar a .NET. La versió 1.0 es va publicar a l&amp;rsquo;abril. L&amp;rsquo;API és estable. És hora de construir agents de veritat.&lt;/p&gt;
&lt;h2 id="què-és-un-agent-vs-un-chatbot"&gt;Què és un Agent (vs. un Chatbot)&lt;/h2&gt;
&lt;p&gt;Abans d&amp;rsquo;entrar al codi, aclarim aquesta distinció. Un chatbot rep input, crida un model, retorna output. Bucle simple.&lt;/p&gt;
&lt;p&gt;Un agent té &lt;em&gt;autonomia&lt;/em&gt;. Pot raonar sobre una tasca, decidir quines eines usar, cridar-les, avaluar resultats i decidir què fer a continuació — tot sense que tu escriguis lògica pas a pas per a cada escenari. Li dónes eines i instruccions, i s&amp;rsquo;encarrega de l&amp;rsquo;orquestració.&lt;/p&gt;
&lt;p&gt;Pensa-hi així: &lt;code&gt;IChatClient&lt;/code&gt; és com tenir una conversa. Un agent és com delegar una llista de tasques a algú.&lt;/p&gt;
&lt;h2 id="el-teu-primer-agent-en-10-línies"&gt;El Teu Primer Agent en 10 Línies&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;El mètode d&amp;rsquo;extensió &lt;code&gt;.AsAIAgent()&lt;/code&gt; és el pont. Mateix patró que &lt;code&gt;.AsIChatClient()&lt;/code&gt; de MEAI — embolica el SDK del proveïdor en una abstracció estable. Funciona amb Azure OpenAI, OpenAI, GitHub Models, Microsoft Foundry o models locals.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;streaming també funciona:&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="donant-eines-a-lagent"&gt;Donant Eines a l&amp;rsquo;Agent&lt;/h2&gt;
&lt;p&gt;Aquí és on els agents deixen de ser chatbots sofisticats. Les eines són funcions que el model pot decidir cridar segons el que l&amp;rsquo;usuari demani. No necessites lògica d&amp;rsquo;enrutament — el model ho descobreix sol.&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;Dues coses a tenir en compte. Primer, &lt;code&gt;AIFunctionFactory&lt;/code&gt; és de MEAI — la mateixa fàbrica d&amp;rsquo;eines que usaries amb un &lt;code&gt;IChatClient&lt;/code&gt; normal. Si ja tens eines definides per a escenaris de xat, funcionen aquí també.&lt;/p&gt;
&lt;p&gt;Segon, els atributs &lt;code&gt;Description&lt;/code&gt; importen molt. Són com el model entén què fa una eina i quan usar-la. Tracta&amp;rsquo;ls com a documentació per a la teva IA, no per a humans.&lt;/p&gt;
&lt;h2 id="sessions-converses-amb-memòria-real"&gt;Sessions: Converses amb Memòria Real&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;Sense sessió, cada crida a &lt;code&gt;RunAsync&lt;/code&gt; és sense estat. Amb sessió, l&amp;rsquo;agent sap a quin acudit et refereixes. &lt;code&gt;AgentSession&lt;/code&gt; preserva l&amp;rsquo;historial de conversa entre torns.&lt;/p&gt;
&lt;p&gt;Per a serveis sense estat en producció, les sessions es serialitzen de forma neta:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="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;// ... guarda-ho en algun lloc ...&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;Això és crític si el teu agent s&amp;rsquo;executa en entorns serverless o amb escalat horitzontal.&lt;/p&gt;
&lt;h2 id="aicontextprovider-memòria-persistent-entre-sessions"&gt;AIContextProvider: Memòria Persistent Entre Sessions&lt;/h2&gt;
&lt;p&gt;Les sessions preserven l&amp;rsquo;historial &lt;em&gt;dins&lt;/em&gt; d&amp;rsquo;una sessió. Però què passa amb conèixer coses d&amp;rsquo;un usuari entre sessions? &lt;code&gt;AIContextProvider&lt;/code&gt; s&amp;rsquo;encarrega d&amp;rsquo;això.&lt;/p&gt;
&lt;p&gt;Té dos ganxos:&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;executa &lt;em&gt;abans&lt;/em&gt; de cada interacció, injecta context a 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;executa &lt;em&gt;després&lt;/em&gt; de cada interacció, permet aprendre i persistir&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;El patró és elegant: pots apillar múltiples proveïdors — un per a preferències d&amp;rsquo;usuari, un per a interaccions recents, un que consulta el teu magatzem de VectorData per a documents rellevants. Aquest últim és exactament el patró RAG de la Part 2, ara executant-se automàticament a cada crida de l&amp;rsquo;agent.&lt;/p&gt;
&lt;h2 id="workflows-multi-agent"&gt;Workflows Multi-Agent&lt;/h2&gt;
&lt;p&gt;Aquí és on el framework es guanya el seu nom. Inclou un sistema de workflows basat en grafs on els executors (agents, funcions, el que sigui) es connecten mitjançant arestes.&lt;/p&gt;
&lt;p&gt;Alguns patrons suportats nativament:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Seqüencial&lt;/strong&gt;: La sortida de l&amp;rsquo;Agent A alimenta l&amp;rsquo;Agent B&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Concurrent (fan-out/fan-in)&lt;/strong&gt;: Despacha a múltiples agents en paral·lel, recull resultats&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enrutament condicional&lt;/strong&gt;: Enruta feina a agents diferents segons la sortida&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bucles escriptor-crític&lt;/strong&gt;: Un agent escriu, un altre avalua, bucle fins a aprovació&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sub-workflows&lt;/strong&gt;: Compon workflows jeràrquicament&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Un exemple escriptor-crític:&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;Net, llegible, i l&amp;rsquo;enrutament basat en condicions significa que no escrius la lògica del bucle tu mateix.&lt;/p&gt;
&lt;h2 id="human-in-the-loop"&gt;Human-in-the-Loop&lt;/h2&gt;
&lt;p&gt;No tot hauria d&amp;rsquo;executar-se de forma completament autònoma. Per a operacions sensibles — escriptures a bases de dades, transaccions financeres, enviament de comunicacions — vols que un humà aprovi abans que l&amp;rsquo;agent executi.&lt;/p&gt;
&lt;p&gt;El framework té suport integrat per a això mitjançant &lt;code&gt;FunctionApprovalRequestContent&lt;/code&gt; i &lt;code&gt;FunctionApprovalResponseContent&lt;/code&gt;. L&amp;rsquo;agent proposa la crida a l&amp;rsquo;eina, el teu codi la presenta a l&amp;rsquo;usuari, i la resposta determina si l&amp;rsquo;execució continua.&lt;/p&gt;
&lt;p&gt;Aquesta és la forma correcta de pensar en agents en entorns empresarials: no completament autònoms, sinó &lt;em&gt;autonomia amb barreres&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id="el-quadre-complet"&gt;El Quadre Complet&lt;/h2&gt;
&lt;p&gt;Si fas un pas enrere:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MEAI&lt;/strong&gt; et dóna una interfície universal per a qualsevol model&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;VectorData&lt;/strong&gt; dóna als teus agents accés al coneixement de la teva organització mitjançant cerca semàntica&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agent Framework&lt;/strong&gt; orquestra tot — usa &lt;code&gt;IChatClient&lt;/code&gt; internament, es compon amb proveïdors de context i coordina mitjançant workflows&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cada peça va ser dissenyada per compondre&amp;rsquo;s amb les altres. Consulta el &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; i el &lt;a href="https://github.com/microsoft/agent-framework/tree/main/dotnet"&gt;repositori de GitHub del Agent Framework&lt;/a&gt; per als exemples complets.&lt;/p&gt;
&lt;h2 id="conclusió"&gt;Conclusió&lt;/h2&gt;
&lt;p&gt;El post de la Part 3 del Microsoft Agent Framework tanca el bucle de la sèrie de blocs de construcció. Per als desenvolupadors .NET que volen construir agents AI — no sols chatbots, sinó agents reals que usen eines, recorden coses i coordinen — aquest és el camí.&lt;/p&gt;
&lt;p&gt;La versió estable 1.0 significa que pots construir amb això en producció. Si has estat esperant per saltar al desenvolupament d&amp;rsquo;agents en .NET, el moment és ara.&lt;/p&gt;</content:encoded></item></channel></rss>