Microsoft Agent Framework: Handoff Orchestration Pattern — โครงสร้าง multi-agent ที่ให้ agent ตัดสินใจส่งต่องานเอง บนกราฟที่ developer ควบคุม
วันที่ 7 พ.ค. 2026 Jacob Alber ลงโพสต์เชิงลึก “A Tour of the Handoff Orchestration Pattern” บน Microsoft Agent Framework dev blog — อธิบาย pattern ที่กำลังจะกลายเป็น default ของ multi-agent system ใน .NET/Python stack ของ Microsoft
ใจกลางของบทความคือคำถามที่นัก develop multi-agent ต้องเจอ — เมื่อ pipeline แบบ static ไม่พอ และ router แบบ one-shot ก็ไม่พอ — graph แบบไหนจะให้ agent ตัดสินใจส่งต่องานเองได้โดยไม่หลุด context และไม่ทะลุ guardrail?
Handoff คืออะไร
Microsoft อธิบาย Handoff ว่าเป็น decentralized routing — developer ประกาศ graph ของ agent กับ directed edge ระหว่างกัน framework จะ inject synthetic handoff tool ให้แต่ละ agent — 1 tool ต่อ outbound edge — agent เรียก tool เพื่อโยนการสนทนาไปยัง target
3 property ที่ Handoff ให้ตั้งแต่บรรทัดแรก:
- One shared transcript — agent ถัดไปเห็นทุกอย่างที่ agent ก่อนหน้าพูด ไม่ใช่ fan-out หลาย thread
- Topology enforced — agent ส่งต่อได้แค่ target ที่ประกาศไว้เท่านั้น misrouting กันที่ระดับ workflow ไม่ใช่ที่ prompt
- Natural termination — เมื่อ agent ที่กำลังทำงานจบ turn โดยไม่เรียก handoff tool workflow จะคืน control ให้ user เอง
ตัวอย่าง: e-Commerce support workflow
บล็อกใช้ตัวอย่างที่ไม่ใช่ star topology ทั่วไป — Triage → Returns ↔ Orders → Fraud (terminal) — มี 2 จุดที่น่าสนใจ:
- Returns ↔ Orders เป็น side edge — ผู้ใช้ที่เริ่มจาก return อาจต้องการ replacement order หรือ user ที่เริ่มจาก order อาจอยากเปลี่ยนเป็น refund — ถ้าวิ่งกลับ Triage ก่อน จะเสีย turn และเสีย context
- Returns → Fraud เป็น one-way และ Fraud เป็น terminal — ไม่มี outbound handoff ใน ๆ — เมื่อ control ตกที่ Fraud workflow จะ drain ออก output
โค้ด .NET ที่ wire ใช้ WithHandoff(returns, fraud, handoffReason: "Suspected return fraud or abuse.") — handoffReason กลายเป็น tool description ที่ LLM อ่านตอนตัดสินใจ — สอน model เมื่อไหร่ควร escalate โดยไม่ต้องยัด logic ในระบบ prompt ของ Returns
EnableReturnToPrevious() เปลี่ยนพฤติกรรมที่ user message ถัดไปจะไปที่ specialist คนสุดท้ายแทนที่จะวิ่งกลับ Triage — ตรงตาม mental model ของผู้ใช้กลางบทสนทนา
เปรียบเทียบ Sequential vs Handoff vs Conditional
ตารางใน blog ตอบคำถามว่าเมื่อไรใช้อันไหน:
- Sequential — pipeline ที่รูปแบบ fix ตั้งแต่เขียน
- Conditional / WorkflowBuilder + AddSwitch — branch ที่ developer ตัดสินใจด้วย typed predicate
- Handoff — branch ที่ agent ตัดสินใจ ภายใน boundary ที่ developer set ไว้
ตัวอย่าง trigger ที่จะย้ายจาก Sequential ไป Handoff คือ “มีคนต้องถามคำถาม user” — Sequential ไม่มี built-in pause writer ถาม researcher ขอ source เพิ่มไม่ได้ editor ก็หยุดถาม user ไม่ได้
.NET vs Python — ความต่างที่ author ควรรู้
ทั้ง 2 runtime มี mental model เหมือนกัน แต่มี API ที่ต่าง:
with_autonomous_mode(turn_limits={...})เป็น first-class API ใน Python — .NET ไม่มี API ตรง ๆ ต้อง approximate ด้วย topology (เช่น เพิ่ม edge กลับไป coordinator)with_termination_condition(callable)เป็น Python-only — .NET ใช้ idiom ทำ agent ปลายทางให้เป็น terminal node แทน- default mesh ใน Python — ถ้าไม่เรียก
add_handoffagent ทุกตัวจะ handoff หากันได้ทั้งหมด — ใน .NET ทุก edge ต้อง declare explicit EnableReturnToPrevious()ใน .NET เป็น one-line — ใน Python เป็น default behavior หลังกำหนด start agentHandoffSentEventใน Python ให้ typed breadcrumb source/target ใน stream — .NET ใช้ builder toggleEmitAgentResponseEvents
มุมมอง AI Curator
Handoff Orchestration บอกอะไรเกี่ยวกับทิศทาง agent stack ของ Microsoft? — มันเป็นการยอมรับว่า single-agent + huge prompt (แนวทางปี 2024-2025) มาถึงเพดานแล้ว — model จัดการ context ยาว 100k+ token ได้ แต่ maintainability ของ system prompt ที่ต้อง branch ใน 1 ก้อน มันแย่ลงตาม case ที่เพิ่ม
Microsoft แก้ด้วยการแยก concern — routing logic ออกจาก agent system prompt — agent มีหน้าที่รู้แค่ “ฉันเก่งอะไร” และ “ฉันจะส่งต่อใครได้บ้าง พร้อม reason” — ส่วน graph ทั้งหมดอยู่ในโค้ด developer review/diff ได้ง่าย — pattern เดียวกับ React component composition vs God component
ที่สำคัญ Handoff ไม่ใช่ของ Microsoft คนเดียว — Anthropic ก็ public Multi-Agent Orchestration ใน Claude Managed Agents ตอน Code with Claude (6 พ.ค.) — Google ADK มี SkillToolset + sub-agent — OpenAI Agents SDK มี handoffs API มาตั้งแต่ 2025 — แสดงว่าวงการ converge ไปที่ pattern เดียวกันแล้ว — declarative graph + agent-driven routing
สำหรับทีมไทยที่กำลังจะ start สร้าง multi-agent — อย่าเริ่มจาก single agent ขนาดยักษ์ — ลง investment ใน Handoff หรือเทียบเท่าตั้งแต่วันแรก — เพราะตอน scale คุณจะ refactor ยากกว่ามากถ้าเริ่มผิด
ที่อยากเตือนคืออย่าลืม observability — Handoff ที่ agent ตัดสินใจเอง = bug ใหม่ที่ stuck ใน loop ระหว่าง specialist 2 ตัว หรือ misroute เพราะ prompt ของ source agent ตี handoff reason ผิด — ต้องมี trace + replay ตั้งแต่ day 1 — Microsoft Agent Framework ให้ stream event แบบ typed มาช่วยอยู่ — ใช้ให้คุ้ม
แหล่งข่าว
อ่านเพิ่มในหมวด เครื่องมือนักพัฒนา
Betelgeuse รัน Qwen3.8 Flash Next ขนาด 68GB บน RTX 3060 กับแรม 16GB ส่วน Basalt วัดให้เห็นว่าเอนจินที่เร่งด้วยแฟล็กลัดทำให้โมเดลลืมของ
Betelgeuse ฟอร์ก llama.cpp ที่เปิดเมื่อ 31 ต.ค. ดึง expert จาก NVMe เข้า VRAM ตามต้องการ อ้าง 22 tok/s แบบไม่ทิ้ง expert แต่ README เตือนเองว่ายังทดลองและตัวเลขมาจากคนละรอบ วันเดียวกันผู้พัฒนา Basalt เผยผลวัดว่าแฟล็กเร่งความเร็วทำคุณภาพ Q8 ตกไปใกล้ Q2
กฎห้ามโคลนเกมของ Claude Code เริ่มกระทบงานจริง บริษัทรับทำเกมกระดานร้องงานลูกค้าหยุด แต่รายงานหลายชิ้นปนกับตัวกรองไซเบอร์คนละเรื่อง
ต่อจากที่เราพบกฎนี้ในไบนารี Claude Code ผู้ใช้เริ่มรายงานว่างานเชิงพาณิชย์ถูกปฏิเสธ และ Tom's Hardware กับ Mashable หยิบไปรายงาน แต่เมื่อไล่ issue ที่อ้างถึง พบว่าหลายรายการเกิดก่อนกฎจะมา จึงน่าจะเป็นตัวกรองด้านไซเบอร์ ส่วน Anthropic ยังไม่ชี้แจง
Claude Code ส่ง transcript ของ background agent ให้โมเดลทุก ~30 วินาทีเพื่อเขียนสถานะ 3–5 คำ ผู้วัดรายงานกินราว 16% และยังปิดแบบทางการไม่ได้
รายงานอิสระพบว่าฟีเจอร์ agent_summary ของ Claude Code ส่ง transcript เต็มของ background agent ไปถามสถานะทุก ~30 วินาที คิดเป็น 16.4% ของค่าใช้จ่ายในระบบของผู้วัด Issue เปิดมาตั้งแต่ ส.ค. ยังไม่มีสวิตช์ปิดที่รองรับ เราตรวจพบโค้ดนี้ใน 2.1.314 และพบกฎใหม่เรื่องเกมที่ไม่อยู่ใน changelog