<?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>Orchestration | The .NET Blog</title><link>https://thedotnetblog.com/ca/tags/orchestration/</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>Mon, 01 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://thedotnetblog.com/ca/tags/orchestration/index.xml" rel="self" type="application/rss+xml"/><item><title>El Patró Handoff: Quan Un Agent No És Suficient</title><link>https://thedotnetblog.com/ca/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/ca/news/emiliano-montesdeoca/maf-handoff-orchestration-pattern-tour/</guid><description>El patró d'orquestració Handoff de Microsoft Agent Framework permet als agents decidir qui gestiona el pròxim torn — sense perdre el context de la conversa ni trencar les regles de topologia.</description><content:encoded>&lt;p&gt;En algun moment, cada sistema multi-agent supera un router simple. El primer signe sol ser quan un agent especialista ha de fer una pregunta de seguiment, o s&amp;rsquo;adona a meitat d&amp;rsquo;un torn que un altre agent hauria de continuar. Un pipeline fix falla allà. Un router d&amp;rsquo;un sol pas falla allà.&lt;/p&gt;
&lt;p&gt;Exactament és el problema per al qual el patró d&amp;rsquo;orquestració Handoff a Microsoft Agent Framework està dissenyat.&lt;/p&gt;
&lt;h2 id="com-funciona-handoff"&gt;Com Funciona Handoff&lt;/h2&gt;
&lt;p&gt;El desenvolupador declara un graf: aquí hi ha els agents, aquí hi ha les arestes entre ells. El framework fa la resta — sintetitza una eina handoff per aresta de sortida i la injecta a cada agent. Quan un agent decideix cedir el control, crida l&amp;rsquo;eina. El framework aplica la topologia.&lt;/p&gt;
&lt;p&gt;Tres coses fan que això sigui diferent de simplement fer que els agents es cridin entre si:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Una transcripció compartida&lt;/strong&gt; — l&amp;rsquo;agent receptor veu l&amp;rsquo;historial complet de la conversa. Sense tornar a començar des de zero.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Aplicació de topologia&lt;/strong&gt; — un agent només pot fer handoff a destins declarats. Els errors de routing es detecten durant l&amp;rsquo;autoria, no a producció.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Terminació natural&lt;/strong&gt; — quan l&amp;rsquo;agent actiu acaba el seu torn sense cridar una eina handoff, el flux de treball cedeix a l&amp;rsquo;usuari. Sense polling, sense condicions de sortida explícites.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="un-exemple-mínim"&gt;Un Exemple Mínim&lt;/h2&gt;
&lt;p&gt;A .NET, construir un flux de treball handoff té aquest aspecte:&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 pot enviar a qualsevol especialista. Tots dos especialistes poden enviar de tornada a triage. El graf és compatible amb l&amp;rsquo;acíclic però admet arestes posteriors quan les necessites (&amp;ldquo;necessito més informació&amp;rdquo; → tornar a la recerca).&lt;/p&gt;
&lt;h2 id="quan-utilitzar-handoff-i-quan-no"&gt;Quan Utilitzar Handoff (i Quan No)&lt;/h2&gt;
&lt;p&gt;Handoff és una bona opció quan:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;La propietat pot canviar a meitat de la conversa&lt;/strong&gt; — un agent pot adonar-se que és l&amp;rsquo;especialista equivocat&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Les arestes posteriors importen&lt;/strong&gt; — potser cal revisitar un pas anterior sense reiniciar&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Les decisions de routing són matisat&lt;/strong&gt; — la decisió de fer handoff és contextual i és millor que la prengui el model que predicats tipats&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;No&lt;/em&gt; és l&amp;rsquo;elecció correcta quan:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;El teu pipeline és fix i seqüencial — fes servir el flux de treball &lt;code&gt;Sequential&lt;/code&gt; per a això&lt;/li&gt;
&lt;li&gt;Cada pas és independent — els agents que comparteixen una transcripció quan només un la necessitava és simplement soroll&lt;/li&gt;
&lt;li&gt;Necessites garanties estrictes de processament — el no-determinisme del routing impulsat pel model no és el que vols&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="arestes-posteriors-i-human-in-the-loop"&gt;Arestes Posteriors i Human-in-the-Loop&lt;/h2&gt;
&lt;p&gt;Una de les formes més interessants que Handoff permet són les arestes posteriors reals. Un agent pot decidir &amp;ldquo;no tinc prou informació&amp;rdquo; i enrutar de tornada a un pas de recerca — no amb un bucle codificat, sinó perquè el model decideix que és la decisió correcta.&lt;/p&gt;
&lt;p&gt;Les interaccions human-in-the-loop també es composen de manera natural. Quan un especialista necessita l&amp;rsquo;input de l&amp;rsquo;usuari, el flux de treball cedeix a l&amp;rsquo;usuari a través del bucle de torns per defecte, recull la resposta i reprèn amb context complet. L&amp;rsquo;agent mai ha perdut la conversa.&lt;/p&gt;
&lt;h2 id="conclusió"&gt;Conclusió&lt;/h2&gt;
&lt;p&gt;Handoff és un d&amp;rsquo;aquells patrons que sembla simple però permet molt un cop interioritzat: routing descentralitzat, context compartit, topologia aplicada, terminació natural. És el proper pas correcte quan els teus agents comencen a dir &amp;ldquo;en realitat, algú altre hauria de gestionar això.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Llegeix el recorregut complet a la publicació 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></channel></rss>