<?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/it/tags/orchestration/</link><description>Articles, tutorials and insights from the .NET community.</description><generator>Hugo</generator><language>it</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/it/tags/orchestration/index.xml" rel="self" type="application/rss+xml"/><item><title>Il Pattern Handoff: Quando Un Agente Non Basta</title><link>https://thedotnetblog.com/it/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/it/news/emiliano-montesdeoca/maf-handoff-orchestration-pattern-tour/</guid><description>Il pattern di orchestrazione Handoff di Microsoft Agent Framework consente agli agenti di decidere chi gestisce il prossimo turno — senza perdere il contesto della conversazione o violare le regole di topologia.</description><content:encoded>&lt;p&gt;A un certo punto ogni sistema multi-agente supera un semplice router. Il primo segnale è di solito quando un agente specialista deve fare una domanda di follow-up, o si rende conto a metà turno che un altro agente dovrebbe continuare. Una pipeline fissa fallisce lì. Un router a singolo passaggio fallisce lì.&lt;/p&gt;
&lt;p&gt;È esattamente il problema per cui il pattern di orchestrazione Handoff in Microsoft Agent Framework è progettato.&lt;/p&gt;
&lt;h2 id="come-funziona-handoff"&gt;Come Funziona Handoff&lt;/h2&gt;
&lt;p&gt;Lo sviluppatore dichiara un grafo: ecco gli agenti, ecco i bordi tra di loro. Il framework fa il resto — sintetizza uno strumento handoff per ogni bordo in uscita e lo inietta in ogni agente. Quando un agente decide di cedere il controllo, chiama lo strumento. Il framework applica la topologia.&lt;/p&gt;
&lt;p&gt;Tre cose rendono questo diverso dal semplice fare in modo che gli agenti si chiamino tra di loro:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Una trascrizione condivisa&lt;/strong&gt; — l&amp;rsquo;agente ricevente vede l&amp;rsquo;intera cronologia della conversazione. Senza ricominciare da zero.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Applicazione della topologia&lt;/strong&gt; — un agente può fare handoff solo a destinazioni dichiarate. I bug di routing vengono rilevati in fase di authoring, non in produzione.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Terminazione naturale&lt;/strong&gt; — quando l&amp;rsquo;agente attivo finisce il suo turno senza chiamare uno strumento handoff, il workflow cede all&amp;rsquo;utente. Senza polling, senza condizioni di uscita esplicite.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="un-esempio-minimale"&gt;Un Esempio Minimale&lt;/h2&gt;
&lt;p&gt;In .NET, costruire un workflow handoff appare così:&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 può inviare a entrambi i specialisti. Entrambi i specialisti possono rimandare a triage. Il grafo è compatibile con l&amp;rsquo;aciclico ma supporta bordi posteriori quando ne hai bisogno (&amp;ldquo;ho bisogno di più informazioni&amp;rdquo; → torna alla ricerca).&lt;/p&gt;
&lt;h2 id="quando-usare-handoff-e-quando-no"&gt;Quando Usare Handoff (e Quando No)&lt;/h2&gt;
&lt;p&gt;Handoff è una buona scelta quando:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;La proprietà può cambiare a metà conversazione&lt;/strong&gt; — un agente può rendersi conto di essere lo specialista sbagliato&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;I bordi posteriori contano&lt;/strong&gt; — potresti dover rivisitare un passo precedente senza ricominciare&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Le decisioni di routing sono sfumate&lt;/strong&gt; — la decisione di fare handoff è contestuale e meglio presa dal modello che da predicati tipizzati&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Non&lt;/em&gt; è la scelta giusta quando:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La tua pipeline è fissa e sequenziale — usa il workflow &lt;code&gt;Sequential&lt;/code&gt; per quello&lt;/li&gt;
&lt;li&gt;Ogni passo è indipendente — agenti che condividono una trascrizione dove solo uno di loro ne aveva bisogno è solo rumore&lt;/li&gt;
&lt;li&gt;Hai bisogno di garanzie di elaborazione rigorose — il non-determinismo del routing guidato dal modello non è ciò che vuoi&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="bordi-posteriori-e-human-in-the-loop"&gt;Bordi Posteriori e Human-in-the-Loop&lt;/h2&gt;
&lt;p&gt;Una delle forme più interessanti che Handoff consente sono i veri bordi posteriori. Un agente può decidere &amp;ldquo;non ho abbastanza informazioni&amp;rdquo; e tornare a un passo di ricerca, non con un loop codificato, ma perché il modello decide che è la scelta giusta.&lt;/p&gt;
&lt;p&gt;Le interazioni human-in-the-loop si compongono naturalmente. Quando uno specialista ha bisogno dell&amp;rsquo;input dell&amp;rsquo;utente, il workflow cede all&amp;rsquo;utente tramite il loop di turno predefinito, raccoglie la risposta e riprende con il contesto completo. L&amp;rsquo;agente non ha mai perso la conversazione.&lt;/p&gt;
&lt;h2 id="conclusione"&gt;Conclusione&lt;/h2&gt;
&lt;p&gt;Handoff è uno di quei pattern che sembra semplice ma permette molto una volta interiorizzato: routing decentralizzato, contesto condiviso, topologia applicata, terminazione naturale. È il giusto passo successivo quando i tuoi agenti cominciano a dire &amp;ldquo;in realtà, qualcun altro dovrebbe gestire questo.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Leggi il percorso completo nel post originale: &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>