<?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/pl/tags/orchestration/</link><description>Articles, tutorials and insights from the .NET community.</description><generator>Hugo</generator><language>pl</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/pl/tags/orchestration/index.xml" rel="self" type="application/rss+xml"/><item><title>Wzorzec Handoff: Gdy Jeden Agent To Za Mało</title><link>https://thedotnetblog.com/pl/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/pl/news/emiliano-montesdeoca/maf-handoff-orchestration-pattern-tour/</guid><description>Wzorzec orkiestracji Handoff w Microsoft Agent Framework pozwala agentom decydować, kto obsługuje następną turę — bez utraty kontekstu rozmowy ani naruszania reguł topologii.</description><content:encoded>&lt;p&gt;W pewnym momencie każdy system wieloagentowy przerasta prosty router. Pierwszym sygnałem jest zazwyczaj sytuacja, gdy specjalistyczny agent musi zadać pytanie uzupełniające lub w połowie tury uświadamia sobie, że powinien kontynuować inny agent. Stały pipeline zawodzi w tym miejscu. Router jednorazowy zawodzi w tym miejscu.&lt;/p&gt;
&lt;p&gt;To właśnie problem, który wzorzec orkiestracji Handoff w Microsoft Agent Framework jest zaprojektowany do rozwiązania.&lt;/p&gt;
&lt;h2 id="jak-działa-handoff"&gt;Jak Działa Handoff&lt;/h2&gt;
&lt;p&gt;Deweloper deklaruje graf: oto agenci, oto krawędzie między nimi. Framework robi resztę — syntetyzuje narzędzie handoff dla każdej krawędzi wychodzącej i wstrzykuje je do każdego agenta. Gdy agent zdecyduje się przekazać kontrolę, wywołuje narzędzie. Framework wymusza topologię.&lt;/p&gt;
&lt;p&gt;Trzy rzeczy odróżniają to od zwykłego wzajemnego wywoływania agentów:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Jeden wspólny transkrypt&lt;/strong&gt; — agent odbierający widzi pełną historię rozmowy. Bez zaczynania od zera.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Wymuszanie topologii&lt;/strong&gt; — agent może wykonać handoff tylko do zadeklarowanych celów. Błędy routingu są wykrywane podczas tworzenia, nie w środowisku produkcyjnym.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Naturalne zakończenie&lt;/strong&gt; — gdy aktywny agent kończy swoją turę bez wywoływania narzędzia handoff, workflow oddaje kontrolę użytkownikowi. Bez pollingu, bez jawnych warunków wyjścia.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="minimalny-przykład"&gt;Minimalny Przykład&lt;/h2&gt;
&lt;p&gt;W .NET budowanie workflow handoff wygląda tak:&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 może wysyłać do każdego ze specjalistów. Obaj specjaliści mogą odsyłać z powrotem do triage. Graf jest acykliczny, ale obsługuje krawędzie wsteczne gdy są potrzebne (&amp;ldquo;potrzebuję więcej informacji&amp;rdquo; → powrót do badań).&lt;/p&gt;
&lt;h2 id="kiedy-używać-handoff-i-kiedy-nie"&gt;Kiedy Używać Handoff (i Kiedy Nie)&lt;/h2&gt;
&lt;p&gt;Handoff to dobry wybór gdy:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Własność może zmienić się w połowie rozmowy&lt;/strong&gt; — agent może uświadomić sobie, że jest złym specjalistą&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Krawędzie wsteczne mają znaczenie&lt;/strong&gt; — może być konieczne ponowne odwiedzenie poprzedniego kroku bez restartu&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Decyzje routingu są subtelne&lt;/strong&gt; — decyzja o wykonaniu handoff jest kontekstualna i lepiej podejmowana przez model niż typowane predykaty&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Nie&lt;/em&gt; jest właściwym wyborem gdy:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Twój pipeline jest stały i sekwencyjny — użyj workflow &lt;code&gt;Sequential&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Każdy krok jest niezależny — agenci dzielący transkrypt, którego potrzebował tylko jeden z nich, to po prostu szum&lt;/li&gt;
&lt;li&gt;Potrzebujesz rygorystycznych gwarancji przetwarzania — niedeterminizm routingu opartego na modelu nie jest tym, czego chcesz&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="krawędzie-wsteczne-i-human-in-the-loop"&gt;Krawędzie Wsteczne i Human-in-the-Loop&lt;/h2&gt;
&lt;p&gt;Jedną z najciekawszych form, które Handoff umożliwia, są prawdziwe krawędzie wsteczne. Agent może zdecydować &amp;ldquo;nie mam wystarczających informacji&amp;rdquo; i przekierować z powrotem do kroku badawczego — nie za pomocą zakodowanej pętli, lecz dlatego, że model decyduje, że to właściwa decyzja.&lt;/p&gt;
&lt;p&gt;Interakcje human-in-the-loop komponują się naturalnie. Gdy specjalista potrzebuje danych wejściowych od użytkownika, workflow oddaje kontrolę użytkownikowi za pomocą domyślnej pętli tur, zbiera odpowiedź i wznawia pracę z pełnym kontekstem. Agent nigdy nie stracił rozmowy.&lt;/p&gt;
&lt;h2 id="podsumowanie"&gt;Podsumowanie&lt;/h2&gt;
&lt;p&gt;Handoff to jeden z tych wzorców, które wyglądają prosto, ale umożliwiają wiele po zinternalizowaniu: zdecentralizowany routing, wspólny kontekst, wymuszona topologia, naturalne zakończenie. To właściwy następny krok, gdy Twoi agenci zaczynają mówić &amp;ldquo;właściwie, ktoś inny powinien to obsłużyć.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Przeczytaj pełny przewodnik w oryginalnym wpisie: &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>