<?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>Sse | The .NET Blog</title><link>https://thedotnetblog.com/id/tags/sse/</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>Fri, 10 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://thedotnetblog.com/id/tags/sse/index.xml" rel="self" type="application/rss+xml"/><item><title>Membangun UI Multi-Agen Real-Time yang Tidak Terasa Seperti Kotak Hitam</title><link>https://thedotnetblog.com/id/posts/emiliano-montesdeoca/ag-ui-real-time-multi-agent-ui-maf/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/id/posts/emiliano-montesdeoca/ag-ui-real-time-multi-agent-ui-maf/</guid><description>AG-UI dan Microsoft Agent Framework bergabung untuk memberikan alur kerja multi-agen frontend yang layak — dengan streaming real-time, persetujuan manusia, dan visibilitas penuh atas apa yang dilakukan agen Anda.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Postingan ini diterjemahkan secara otomatis. Untuk versi aslinya, &lt;a href="https://thedotnetblog.com/id/posts/emiliano-montesdeoca/ag-ui-real-time-multi-agent-ui-maf/"&gt;klik di sini&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Begini kenyataan tentang sistem multi-agen: tampilannya luar biasa dalam demo. Tiga agen saling mengoper pekerjaan, memecahkan masalah, mengambil keputusan. Lalu Anda mencoba menampilkannya kepada pengguna nyata dan&amp;hellip; sunyi. Indikator yang berputar. Tidak ada yang tahu agen mana yang melakukan apa atau mengapa sistem berhenti. Ini bukan produk — ini masalah kepercayaan.&lt;/p&gt;
&lt;p&gt;Tim Microsoft Agent Framework baru saja menerbitkan &lt;a href="https://devblogs.microsoft.com/agent-framework/ag-ui-multi-agent-workflow-demo/"&gt;panduan yang luar biasa&lt;/a&gt; tentang cara memadukan alur kerja MAF dengan &lt;a href="https://github.com/ag-ui-protocol/ag-ui"&gt;AG-UI&lt;/a&gt;, protokol terbuka untuk mengalirkan peristiwa eksekusi agen ke frontend melalui Server-Sent Events. Dan jujur saja? Inilah jembatan yang selama ini kita butuhkan.&lt;/p&gt;
&lt;h2 id="mengapa-ini-penting-bagi-developer-net"&gt;Mengapa ini penting bagi developer .NET&lt;/h2&gt;
&lt;p&gt;Jika Anda membangun aplikasi bertenaga AI, Anda mungkin sudah pernah menabrak dinding ini. Orkestrasi backend Anda bekerja dengan baik — agen saling meneruskan pekerjaan, alat berjalan, keputusan dibuat. Tapi frontend tidak tahu apa yang terjadi di balik layar. AG-UI mengatasi ini dengan mendefinisikan protokol standar untuk mengalirkan peristiwa agen (&lt;code&gt;RUN_STARTED&lt;/code&gt;, &lt;code&gt;STEP_STARTED&lt;/code&gt;, &lt;code&gt;TOOL_CALL_*&lt;/code&gt;, &lt;code&gt;TEXT_MESSAGE_*&lt;/code&gt;) langsung ke lapisan UI Anda melalui SSE.&lt;/p&gt;
&lt;p&gt;Demo yang mereka bangun adalah alur kerja dukungan pelanggan dengan tiga agen: agen triase yang merutekan permintaan, agen pengembalian dana yang menangani urusan keuangan, dan agen pesanan yang mengelola penggantian. Setiap agen memiliki alat-alatnya sendiri, dan topologi handoff didefinisikan secara eksplisit — tidak ada nuansa &amp;ldquo;cari tahu dari prompt&amp;rdquo;.&lt;/p&gt;
&lt;h2 id="topologi-handoff-adalah-bintang-sesungguhnya"&gt;Topologi handoff adalah bintang sesungguhnya&lt;/h2&gt;
&lt;p&gt;Yang menarik perhatian saya adalah bagaimana &lt;code&gt;HandoffBuilder&lt;/code&gt; memungkinkan Anda mendeklarasikan graf perutean berarah antar agen:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;builder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;HandoffBuilder&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="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;ag_ui_handoff_workflow_demo&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;participants&lt;/span&gt;&lt;span class="o"&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;refund&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;order&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;termination_condition&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;termination_condition&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&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="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;builder&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_handoff&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="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;refund&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Refunds, damaged-item claims...&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="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_handoff&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="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Replacement, exchange...&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="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_handoff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;refund&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Replacement logistics needed after refund.&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="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_handoff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order&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;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;After replacement/shipping tasks complete.&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="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Setiap &lt;code&gt;add_handoff&lt;/code&gt; membuat sisi berarah dengan deskripsi bahasa alami. Framework menghasilkan alat handoff untuk setiap agen berdasarkan topologi ini. Jadi keputusan perutean didasarkan pada struktur orkestrasi Anda, bukan pada apa yang ingin dilakukan LLM. Ini sangat penting untuk keandalan produksi.&lt;/p&gt;
&lt;h2 id="human-in-the-loop-yang-benar-benar-bekerja"&gt;Human-in-the-loop yang benar-benar bekerja&lt;/h2&gt;
&lt;p&gt;Demo ini memperlihatkan dua pola interupsi yang dibutuhkan oleh aplikasi agen mana pun di dunia nyata:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Interupsi persetujuan alat&lt;/strong&gt; — ketika agen memanggil alat yang ditandai dengan &lt;code&gt;approval_mode=&amp;quot;always_require&amp;quot;&lt;/code&gt;, alur kerja dijeda dan mengeluarkan peristiwa. Frontend merender modal persetujuan dengan nama alat dan argumennya. Tidak ada loop percobaan ulang yang membakar token — hanya alur jeda-setujui-lanjutkan yang bersih.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Interupsi permintaan informasi&lt;/strong&gt; — ketika agen membutuhkan lebih banyak konteks dari pengguna (seperti ID pesanan), agen berhenti dan bertanya. Frontend menampilkan pertanyaan, pengguna merespons, dan eksekusi dilanjutkan dari tepat di mana ia berhenti.&lt;/p&gt;
&lt;p&gt;Kedua pola dialirkan sebagai peristiwa AG-UI standar, sehingga frontend Anda tidak memerlukan logika khusus per agen — cukup merender peristiwa apa pun yang masuk melalui koneksi SSE.&lt;/p&gt;
&lt;h2 id="menghubungkannya-sangat-sederhana"&gt;Menghubungkannya sangat sederhana&lt;/h2&gt;
&lt;p&gt;Integrasi antara MAF dan AG-UI adalah satu panggilan fungsi:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;agent_framework.ag_ui&lt;/span&gt; &lt;span class="kn"&gt;import&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;AgentFrameworkWorkflow&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;add_agent_framework_fastapi_endpoint&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&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;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;FastAPI&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;demo_workflow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AgentFrameworkWorkflow&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;workflow_factory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;_thread_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;create_handoff_workflow&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="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;ag_ui_handoff_workflow_demo&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="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;add_agent_framework_fastapi_endpoint&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;app&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;demo_workflow&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/handoff_demo&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="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;workflow_factory&lt;/code&gt; membuat alur kerja baru per thread, sehingga setiap percakapan mendapat status yang terisolasi. Endpoint menangani semua plumbing SSE secara otomatis. Jika Anda sudah menggunakan FastAPI (atau bisa menambahkannya sebagai lapisan ringan), ini hampir tanpa gesekan.&lt;/p&gt;
&lt;h2 id="pandangan-saya"&gt;Pandangan saya&lt;/h2&gt;
&lt;p&gt;Bagi developer .NET, pertanyaan langsung adalah: &amp;ldquo;Bisakah saya melakukan ini di C#?&amp;rdquo; Agent Framework tersedia untuk .NET dan Python, dan protokol AG-UI bersifat language-agnostic (ini hanyalah SSE). Jadi meskipun demo ini menggunakan Python dan FastAPI, polanya langsung dapat diterapkan. Anda bisa menghubungkan ASP.NET Core minimal API dengan endpoint SSE mengikuti skema peristiwa AG-UI yang sama.&lt;/p&gt;
&lt;p&gt;Kesimpulan yang lebih besar adalah bahwa UI multi-agen menjadi perhatian kelas satu, bukan renungan. Jika Anda membangun apa pun di mana agen berinteraksi dengan manusia — dukungan pelanggan, alur kerja persetujuan, pemrosesan dokumen — kombinasi orkestrasi MAF dan transparansi AG-UI adalah pola yang harus diikuti.&lt;/p&gt;
&lt;h2 id="kesimpulan"&gt;Kesimpulan&lt;/h2&gt;
&lt;p&gt;AG-UI + Microsoft Agent Framework memberi Anda yang terbaik dari kedua dunia: orkestrasi multi-agen yang kuat di backend dan visibilitas real-time di frontend. Tidak ada lagi interaksi agen sebagai kotak hitam.&lt;/p&gt;
&lt;p&gt;Lihat &lt;a href="https://devblogs.microsoft.com/agent-framework/ag-ui-multi-agent-workflow-demo/"&gt;panduan lengkap&lt;/a&gt; dan &lt;a href="https://github.com/ag-ui-protocol/ag-ui"&gt;repositori protokol AG-UI&lt;/a&gt; untuk mendalami lebih jauh.&lt;/p&gt;</content:encoded></item></channel></rss>