<?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/id/tags/orchestration/</link><description>Articles, tutorials and insights from the .NET community.</description><generator>Hugo</generator><language>id</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/id/tags/orchestration/index.xml" rel="self" type="application/rss+xml"/><item><title>Pola Handoff: Ketika Satu Agen Tidak Cukup</title><link>https://thedotnetblog.com/id/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/id/news/emiliano-montesdeoca/maf-handoff-orchestration-pattern-tour/</guid><description>Pola orkestrasi Handoff dalam Microsoft Agent Framework memungkinkan agen menentukan siapa yang menangani giliran berikutnya — tanpa kehilangan konteks percakapan atau melanggar aturan topologi.</description><content:encoded>&lt;p&gt;Pada titik tertentu, setiap sistem multi-agen melampaui router sederhana. Tanda pertama biasanya ketika agen spesialis perlu mengajukan pertanyaan lanjutan, atau menyadari di tengah giliran bahwa agen lain harus melanjutkan. Pipeline tetap gagal di sana. Router satu-kali gagal di sana.&lt;/p&gt;
&lt;p&gt;Itulah tepatnya masalah yang dirancang untuk diselesaikan oleh pola orkestrasi Handoff di Microsoft Agent Framework.&lt;/p&gt;
&lt;h2 id="cara-kerja-handoff"&gt;Cara Kerja Handoff&lt;/h2&gt;
&lt;p&gt;Pengembang mendeklarasikan sebuah graf: ini agen-agennya, ini edge-edge di antara mereka. Framework melakukan sisanya — mensintesis tool handoff per edge keluar dan menyuntikkannya ke setiap agen. Ketika agen memutuskan untuk menyerahkan kendali, ia memanggil tool tersebut. Framework menerapkan topologi.&lt;/p&gt;
&lt;p&gt;Tiga hal yang membuat ini berbeda dari sekadar membuat agen saling memanggil:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Satu transkrip bersama&lt;/strong&gt; — agen penerima melihat riwayat percakapan lengkap. Tanpa memulai dari nol.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Penegakan topologi&lt;/strong&gt; — agen hanya dapat handoff ke tujuan yang dideklarasikan. Bug routing terdeteksi saat authoring, bukan di produksi.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Penghentian alami&lt;/strong&gt; — ketika agen aktif mengakhiri gilirannya tanpa memanggil tool handoff, workflow menyerahkan kepada pengguna. Tanpa polling, tanpa kondisi keluar eksplisit.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="contoh-minimal"&gt;Contoh Minimal&lt;/h2&gt;
&lt;p&gt;Di .NET, membangun workflow handoff terlihat seperti ini:&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 dapat mengirim ke salah satu spesialis. Kedua spesialis dapat mengirim kembali ke triage. Graf mendukung asiklik tetapi mendukung back-edge saat dibutuhkan (&amp;ldquo;saya butuh lebih banyak informasi&amp;rdquo; → kembali ke penelitian).&lt;/p&gt;
&lt;h2 id="kapan-menggunakan-handoff-dan-kapan-tidak"&gt;Kapan Menggunakan Handoff (dan Kapan Tidak)&lt;/h2&gt;
&lt;p&gt;Handoff adalah pilihan yang baik ketika:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Kepemilikan dapat berubah di tengah percakapan&lt;/strong&gt; — agen mungkin menyadari bahwa dirinya adalah spesialis yang salah&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Back-edge penting&lt;/strong&gt; — Anda mungkin perlu mengunjungi kembali langkah sebelumnya tanpa restart&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Keputusan routing halus&lt;/strong&gt; — keputusan untuk handoff bersifat kontekstual dan lebih baik diambil oleh model daripada predikat bertipe&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Bukan&lt;/em&gt; pilihan yang tepat ketika:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pipeline Anda tetap dan berurutan — gunakan workflow &lt;code&gt;Sequential&lt;/code&gt; untuk itu&lt;/li&gt;
&lt;li&gt;Setiap langkah independen — agen berbagi transkrip di mana hanya satu yang membutuhkannya hanyalah kebisingan&lt;/li&gt;
&lt;li&gt;Anda memerlukan jaminan pemrosesan yang ketat — non-determinisme routing berbasis model bukan yang Anda inginkan&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="back-edge-dan-human-in-the-loop"&gt;Back-Edge dan Human-in-the-Loop&lt;/h2&gt;
&lt;p&gt;Salah satu bentuk paling menarik yang diaktifkan Handoff adalah back-edge sejati. Agen dapat memutuskan &amp;ldquo;saya tidak punya cukup informasi&amp;rdquo; dan routing kembali ke langkah penelitian — bukan dengan loop hardcoded, tetapi karena model memutuskan itu adalah keputusan yang tepat.&lt;/p&gt;
&lt;p&gt;Interaksi human-in-the-loop juga tersusun secara alami. Ketika spesialis memerlukan input pengguna, workflow menyerahkan kembali kepada pengguna melalui loop giliran default, mengumpulkan respons, dan melanjutkan dengan konteks lengkap. Agen tidak pernah kehilangan percakapan.&lt;/p&gt;
&lt;h2 id="kesimpulan"&gt;Kesimpulan&lt;/h2&gt;
&lt;p&gt;Handoff adalah salah satu pola yang terlihat sederhana tetapi memungkinkan banyak hal setelah diinternalisasi: routing terdesentralisasi, konteks bersama, topologi yang diterapkan, penghentian alami. Ini adalah langkah selanjutnya yang tepat ketika agen Anda mulai berkata &amp;ldquo;sebenarnya, orang lain yang harus menangani ini.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Baca panduan lengkap di posting aslinya: &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>