hermes-agent-interrupt-explained

Hermes Agent: พฤติกรรม Interrupt บน Discord
Hermes Agent: พฤติกรรม Interrupt บน Discord

Hermes Agent: พฤติกรรม Interrupt บน Discord — อธิบายแบบละเอียด

เมื่อใช้ Hermes Agent บน Discord แล้วพิมพ์ข้อความขณะที่ agent กำลังทำงานอยู่ Discord จะแสดงคำว่า "interrupt" ขึ้นมา หลายคนสงสัยว่ามันทำงานอย่างไรกันแน่ — มันสร้างสองคำสั่งขนานกัน? หรือเข้าไปแก้ไขงานที่กำลังทำ? หรือมันแค่หยุดแล้วเริ่มใหม่?

คำตอบสั้นๆ คือ: Interrupt = ยกเลิกงานรอบปัจจุบันทันที แล้วจัดคิวข้อความของคุณเป็น prompt รอบต่อไป — ไม่ใช่คำสั่งขนาน ไม่ใช่การแก้งานกลางคัน


สิ่งที่เกิดขึ้นทันทีเมื่อพิมพ์ระหว่าง Agent ทำงาน

1. Agent หยุดทันที (Hard Kill)

Hermes ใช้ระบบ interrupt แบบ hard kill ไม่ใช่ soft pause ดังนั้นเมื่อข้อความของคุณถูกรับ กระบวนการต่อไปนี้จะเกิดขึ้นภายในเวลาไม่กี่มิลลิวินาที:

  • Tool call ที่กำลังรันอยู่ถูก SIGTERM แล้วตามด้วย SIGKILL ภายใน 1 วินาที

  • HTTP connection ไปยัง LLM ถูก force-close เพื่อหยุดการสร้าง token ทันที จากนั้น HTTP client ถูก rebuild ใหม่สะอาด

  • Tool calls ที่รอคิวอยู่ถูก skip ทั้งหมด หาก LLM สร้าง tool call plan ไว้หลายอัน แต่ยังรันไม่ครบ อันที่เหลือถูกยกเลิกทั้งสิ้น

2. LLM Response ที่กำลัง Stream หายไป

นี่คือจุดที่หลายคนสับสน — partial response ที่ LLM กำลัง stream อยู่ตอนที่โดน interrupt จะไม่ถูก inject เข้า conversation history เลย เหมือน turn นั้นไม่เคยเกิดขึ้น ระบบไม่บันทึกข้อความกลางคันลง SQLite session ดังนั้นดูเหมือน agent "ลืม" ว่ากำลังทำอะไรอยู่

3. ข้อความใหม่ของคุณกลายเป็น Prompt ถัดไป

ข้อความที่คุณพิมพ์ระหว่าง interrupt ไม่ได้ถูก inject เข้ากลาง turn เดิม แต่จะถูกจัดเป็น prompt เริ่มต้นของรอบใหม่ ทันทีหลัง agent หยุด

Bonus: ถ้าคุณพิมพ์หลายข้อความตามกันขณะที่ agent กำลังหยุด ทุกข้อความเหล่านั้นจะถูก join ด้วย \n แล้ว combine เป็น prompt เดียว เช่น พิมพ์ "หยุดก่อน" แล้วพิมพ์ต่อ "ทำแบบนี้แทน" → agent จะรับ prompt ว่า "หยุดก่อน\nทำแบบนี้แทน" เป็น input เดียว


สิ่งที่ "หาย" และสิ่งที่ "ยังอยู่"

นี่คือส่วนที่สำคัญที่สุด เพราะหลายคนเข้าใจผิดว่า interrupt ทำให้ Hermes ลืมทุกอย่าง

สิ่ง

สถานะหลัง Interrupt

Conversation history ทุก turn ก่อน interrupt

✅ ยังอยู่ครบ (บันทึกใน SQLite ทุก turn)

System prompt และ MEMORY.md

✅ ยังอยู่ ถูก rebuild ปกติ

Tool results จาก tools ที่รันเสร็จแล้วก่อนหน้า

✅ ยังอยู่ใน context

LLM response ที่กำลัง stream อยู่ตอน interrupt

❌ ถูกทิ้ง ไม่บันทึก

Tool call ที่กำลัง run อยู่ตอน interrupt

❌ ถูก kill + ผลลัพธ์หาย

Tool calls ที่ยังรอคิวอยู่ (ยังไม่ได้รัน)

❌ ถูก skip ทั้งหมด

กล่าวคือ Hermes จำบทสนทนาทั้งหมดก่อนหน้าได้ แค่ "งานใน turn ที่โดน interrupt" เท่านั้นที่หายไป


ทำไมต้องทำแบบนี้ — ปัญหาระดับ API

มีเหตุผลทางเทคนิคที่ Hermes ต้องตัด unfinished tool calls ออกจาก history ก่อน submit ครั้งถัดไป

ปัญหาคือ LLM API เช่น OpenAI หรือ Anthropic ไม่ยอมรับ conversation history ที่มี assistant message ซึ่งมี tool_call อยู่แต่ยังไม่มี tool_result ตอบกลับ — มันจะ reject ด้วย error ทันที ดังนั้น Hermes จึงต้องล้าง partial turn ออก ซึ่งทำให้ดูเหมือน "ลืม" งานที่กำลังทำอยู่


Interrupt vs /steer — ต่างกันอย่างไร

หลายคนนึกว่า interrupt น่าจะทำงานแบบ /steer คือ ปรับทิศทางได้โดยยัง context เดิมอยู่ แต่จริงๆ แล้วสองอย่างนี้ต่างกันมาก:

Interrupt (พิมพ์ระหว่างทำงาน)

/steer

หยุด task ปัจจุบัน?

✅ ทันที (hard kill)

✅ แต่เป็น soft redirect

Tool calls ที่ทำไปแล้วยังอยู่?

เฉพาะที่เสร็จก่อน interrupt

✅ ยังอยู่ทั้งหมด

Context ของ turn ปัจจุบัน?

❌ หายไปทั้ง turn

✅ ยังอยู่ แค่เปลี่ยนทิศทาง

ข้อความกลายเป็นอะไร?

Fresh prompt ของรอบใหม่

Steering hint ใน turn เดิม

เหมาะกับ?

หยุดแล้วสั่งงานใหม่เลย

ปรับแนวทางการทำงานกลางคัน

Analogy ง่ายๆ:

  • Interrupt = กด Ctrl+C แล้วพิมพ์ command ใหม่ใน terminal — งานเก่าตาย งานใหม่เริ่มสะอาด

  • /steer = บอกคนงานที่กำลังสร้างบ้านว่า "เปลี่ยนสีผนังเป็นน้ำเงินแทนนะ" — งานยังดำเนินต่อแต่เปลี่ยนทิศ


Queue Mode — ทางเลือกที่หลายคนไม่รู้จัก

Hermes มี queue mode ซึ่งเป็นทางเลือกที่ดีกว่า interrupt ในหลายกรณี แทนที่จะ kill งานปัจจุบัน ข้อความของคุณจะถูกจัดคิวไว้รอจนกว่างานปัจจุบันจะเสร็จ แล้วค่อยรันต่อเนื่อง

เหมาะกับกรณีที่คุณต้องการ เพิ่ม follow-up task โดยไม่ทำลายงานที่กำลังดำเนินอยู่ — บริบทและ tool results ทั้งหมดจะสมบูรณ์กว่าการใช้ interrupt


สรุปพฤติกรรมจริงในหนึ่งประโยค

Interrupt = hard kill งาน + ลบ partial turn ออกจาก history + จัดข้อความคุณเป็น prompt รอบใหม่ โดยความจำของบทสนทนาก่อนหน้าทั้งหมดยังคงอยู่ครบ — มีแค่ turn ที่โดน interrupt นั้นเองที่หายไป