<?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/es/tags/orchestration/</link><description>Articles, tutorials and insights from the .NET community.</description><generator>Hugo</generator><language>es</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/es/tags/orchestration/index.xml" rel="self" type="application/rss+xml"/><item><title>El Patrón Handoff: Cuando Un Agente No Es Suficiente</title><link>https://thedotnetblog.com/es/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/es/news/emiliano-montesdeoca/maf-handoff-orchestration-pattern-tour/</guid><description>El patrón de orquestación Handoff de Microsoft Agent Framework permite a los agentes decidir quién maneja el siguiente turno — sin perder el contexto de la conversación ni romper las reglas de topología.</description><content:encoded>&lt;p&gt;En algún momento, todo sistema multi-agente supera un enrutador simple. La primera señal suele aparecer cuando un agente especialista necesita hacer una pregunta de seguimiento, o se da cuenta a mitad del turno de que otro agente debería continuar. Un pipeline fijo falla ahí. Un enrutador de un solo paso falla ahí.&lt;/p&gt;
&lt;p&gt;Exactamente para eso está diseñado el patrón de orquestación Handoff en Microsoft Agent Framework.&lt;/p&gt;
&lt;h2 id="cómo-funciona-handoff"&gt;Cómo Funciona Handoff&lt;/h2&gt;
&lt;p&gt;El desarrollador declara un grafo: aquí están los agentes, aquí están las aristas entre ellos. El framework hace el resto — sintetiza una herramienta de handoff por cada arista de salida y la inyecta en cada agente. Cuando un agente decide pasar el control, llama a la herramienta. El framework aplica la topología.&lt;/p&gt;
&lt;p&gt;Tres cosas hacen esto diferente a simplemente hacer que los agentes se llamen entre sí:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Un transcripto compartido&lt;/strong&gt; — el agente receptor ve el historial completo de la conversación. Sin empezar desde cero.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Aplicación de topología&lt;/strong&gt; — un agente solo puede hacer handoff a destinos declarados. Los errores de enrutamiento se detectan en tiempo de autoría, no en producción.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Terminación natural&lt;/strong&gt; — cuando el agente activo termina su turno sin llamar a una herramienta de handoff, el flujo de trabajo cede al usuario. Sin sondeo, sin condiciones de salida explícitas.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="un-ejemplo-mínimo"&gt;Un Ejemplo Mínimo&lt;/h2&gt;
&lt;p&gt;En .NET, construir un flujo de trabajo handoff se ve así:&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 puede enviar a cualquier especialista. Ambos especialistas pueden enviar de vuelta a triage. El grafo es compatible con acíclico pero admite aristas hacia atrás cuando las necesitas (&amp;ldquo;necesito más información&amp;rdquo; → de vuelta a investigación).&lt;/p&gt;
&lt;h2 id="cuándo-usar-handoff-y-cuándo-no"&gt;Cuándo Usar Handoff (y Cuándo No)&lt;/h2&gt;
&lt;p&gt;Handoff es una buena opción cuando:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;La propiedad puede cambiar a mitad de conversación&lt;/strong&gt; — un agente puede darse cuenta de que es el especialista equivocado&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Las aristas hacia atrás importan&lt;/strong&gt; — puede que necesites revisar un paso anterior sin reiniciar&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Las decisiones de enrutamiento son difusas&lt;/strong&gt; — la decisión de hacer handoff es contextual y mejor tomada por el modelo que por predicados tipificados&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;No&lt;/em&gt; es la elección correcta cuando:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tu pipeline es fijo y secuencial — usa el flujo de trabajo &lt;code&gt;Sequential&lt;/code&gt; para eso&lt;/li&gt;
&lt;li&gt;Cada paso es independiente — los agentes compartiendo un transcripto donde solo uno de ellos lo necesitaba es solo ruido&lt;/li&gt;
&lt;li&gt;Necesitas garantías estrictas de procesamiento — la no determinismo del enrutamiento impulsado por modelos no es lo que deseas&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="aristas-hacia-atrás-y-humano-en-el-bucle"&gt;Aristas hacia Atrás y Humano en el Bucle&lt;/h2&gt;
&lt;p&gt;Una de las formas más interesantes que Handoff permite son las aristas hacia atrás genuinas. Un agente puede decidir &amp;ldquo;no tengo suficiente información&amp;rdquo; y enrutar de vuelta a un paso de investigación, no con un bucle codificado, sino porque el modelo decide que es la decisión correcta.&lt;/p&gt;
&lt;p&gt;Las interacciones de humano en el bucle también se componen naturalmente. Cuando un especialista necesita entrada del usuario, el flujo de trabajo cede de vuelta al usuario a través del bucle de turno predeterminado, recopila la respuesta y se reanuda con contexto completo. El agente nunca perdió la conversación.&lt;/p&gt;
&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;Handoff es uno de esos patrones que suena simple pero permite mucho una vez que lo internalizas: enrutamiento descentralizado, contexto compartido, topología aplicada, terminación natural. Es el siguiente paso correcto cuando tus agentes comienzan a decir &amp;ldquo;en realidad, alguien más debería manejar esto.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Lee el recorrido completo en el 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></channel></rss>