Messages and delivery
ข้อความ
ข้อความขาเข้าจะผ่านการกำหนดเส้นทาง การขจัดข้อความซ้ำ/การหน่วงรวมข้อความ การรันเอเจนต์ และการส่งขาออก:
ข้อความขาเข้า -> การกำหนดเส้นทาง/การผูก -> คีย์เซสชัน -> ขจัดข้อความซ้ำ + หน่วงรวมข้อความ -> คิว (หากมีการรันที่กำลังทำงานอยู่แล้ว) -> การรันเอเจนต์ (สตรีมมิง + เครื่องมือ) -> การตอบกลับขาออก (ขีดจำกัดของช่องทาง + การแบ่งส่วน)พื้นผิวการกำหนดค่าหลัก:
messages.*สำหรับคำนำหน้า การเข้าคิว การหน่วงรวมข้อความขาเข้า และพฤติกรรมของกลุ่มagents.defaults.*สำหรับการสตรีมแบบบล็อก การแบ่งส่วน และค่าเริ่มต้นของการตอบกลับแบบเงียบ- การกำหนดค่าแทนที่ของช่องทาง (
channels.telegram.*,channels.whatsapp.*เป็นต้น) สำหรับขีดจำกัดและตัวสลับการสตรีมของแต่ละช่องทาง
ดูสคีมาทั้งหมดที่ การกำหนดค่า
การขจัดข้อความขาเข้าซ้ำ
ช่องทางอาจส่งข้อความเดิมซ้ำหลังจากเชื่อมต่อใหม่ OpenClaw เก็บแคชในหน่วยความจำโดยใช้ขอบเขตเอเจนต์ เส้นทางช่องทาง (ช่องทาง + คู่สนทนา + บัญชี + เธรด) และรหัสข้อความเป็นคีย์ เพื่อไม่ให้ข้อความที่ส่งซ้ำเรียกใช้การรันเอเจนต์ครั้งที่สอง รายการแคชจะหมดอายุหลังจาก 20 นาทีหรือเมื่อมีการติดตามครบ 5000 รายการ แล้วแต่ว่าเงื่อนไขใดเกิดขึ้นก่อน
การหน่วงรวมข้อความขาเข้า
สามารถรวมข้อความตัวอักษรที่ส่งต่อเนื่องอย่างรวดเร็วจากผู้ส่งคนเดียวกันเป็นหนึ่งเทิร์นของเอเจนต์ผ่าน messages.inbound ได้ การหน่วงรวมข้อความมีขอบเขตตามช่องทาง + การสนทนา และใช้ข้อความล่าสุดสำหรับเธรด/รหัสการตอบกลับ
{ messages: { inbound: { debounceMs: 2000, byChannel: { discord: 1500, slack: 1500, whatsapp: 5000, }, }, },}- การหน่วงรวมข้อความใช้กับข้อความตัวอักษรเท่านั้น ส่วนสื่อ/ไฟล์แนบจะถูกส่งต่อทันที
- คำสั่งควบคุม (หยุด/ยกเลิก/สถานะ เป็นต้น) จะข้ามการหน่วงรวมข้อความเพื่อให้ส่งต่อทันที
- ปิดใช้งานโดยค่าเริ่มต้น:
messages.inbound.debounceMsไม่มีค่าเริ่มต้นในตัว ดังนั้นการหน่วงรวมข้อความจะเปิดใช้งานเมื่อกำหนดค่าแล้วเท่านั้น (แบบส่วนกลางหรือรายช่องทาง) - การเลือกใช้
coalesceSameSenderDmsของ iMessage เป็นข้อยกเว้นเพียงกรณีเดียว โดยจะพักข้อความ DM ทั้งหมดจากผู้ส่งคนเดียวกัน (รวมคำสั่ง) ไว้นานพอให้การส่งคำสั่ง+URL แบบแยกข้อความของ Apple มาถึงเป็นหนึ่งเทิร์น แชตกลุ่มจะส่งต่อทันทีเสมอโดยไม่ขึ้นกับการตั้งค่านี้
เซสชันและอุปกรณ์
เซสชันเป็นของ Gateway ไม่ใช่ของไคลเอนต์
- แชตโดยตรงจะรวมไว้ในคีย์เซสชันหลักของเอเจนต์
- กลุ่ม/ช่องทางจะมีคีย์เซสชันของตนเอง
- ที่เก็บเซสชันและบันทึกบทสนทนาอยู่บนโฮสต์ Gateway
อุปกรณ์/ช่องทางหลายรายการสามารถเชื่อมโยงกับเซสชันเดียวกันได้ แต่ประวัติจะไม่ซิงก์กลับไปยังไคลเอนต์ทุกเครื่องอย่างสมบูรณ์ ใช้อุปกรณ์หลักเพียงเครื่องเดียวสำหรับการสนทนาที่ยาวเพื่อหลีกเลี่ยงบริบทที่แตกต่างกัน Control UI และ TUI จะแสดงบันทึกบทสนทนาของเซสชันที่อิงจาก Gateway เสมอ จึงเป็นแหล่งข้อมูลที่เชื่อถือได้
รายละเอียด: การจัดการเซสชัน
เนื้อหาพรอมต์และบริบทประวัติ
Plugin ของช่องทางจะเติมฟิลด์ข้อความหลายรายการในบริบทขาเข้า โดยเรียงจากที่ควรใช้มากที่สุดไปน้อยที่สุด:
| ฟิลด์ | วัตถุประสงค์ |
|---|---|
BodyForAgent |
ข้อความสำหรับโมเดลในเทิร์นปัจจุบัน หากไม่ได้กำหนดจะใช้ CommandBody / RawBody / Body แทน |
BodyForCommands |
ข้อความที่ผ่านการทำความสะอาดสำหรับแยกวิเคราะห์ไดเรกทีฟ/คำสั่ง หากไม่ได้กำหนดจะใช้ CommandBody / RawBody / Body แทน |
CommandBody |
เนื้อหาขั้นกลางแบบเดิม ควรใช้ BodyForCommands |
RawBody |
นามแฝงที่เลิกใช้แล้วสำหรับ CommandBody |
Body |
เนื้อหาพรอมต์แบบเดิม อาจมีซองข้อมูลช่องทางและตัวครอบประวัติ |
เมื่อช่องทางส่งประวัติมาด้วย ระบบจะครอบประวัติด้วย:
[Chat messages since your last reply - for context][Current message - respond to this]
สำหรับแชตที่ไม่ใช่แชตโดยตรง (กลุ่ม/ช่องทาง/ห้อง) เนื้อหาข้อความปัจจุบันจะมีป้ายชื่อผู้ส่งนำหน้า โดยใช้รูปแบบเดียวกับรายการประวัติ การตัดไดเรกทีฟจะใช้กับส่วนข้อความปัจจุบันเท่านั้น เพื่อให้ประวัติยังคงสมบูรณ์ ช่องทางที่ครอบประวัติควรกำหนด BodyForCommands (หรือ CommandBody / RawBody แบบเดิม) เป็นข้อความต้นฉบับ และเก็บ Body เป็นพรอมต์ที่รวมแล้ว
บัฟเฟอร์ประวัติมีเฉพาะรายการที่รอดำเนินการ โดยรวมข้อความกลุ่มที่ไม่ได้เรียกใช้การรัน (เช่น ข้อความที่ต้องมีการกล่าวถึง) และไม่รวมข้อความที่อยู่ในบันทึกบทสนทนาของเซสชันแล้ว ประวัติที่มีโครงสร้าง การตอบกลับ ข้อความที่ส่งต่อ และข้อมูลเมตาของช่องทาง จะแสดงเป็นบล็อกบริบทบทบาทผู้ใช้ที่ไม่น่าเชื่อถือระหว่างการประกอบพรอมต์
กำหนดขนาดประวัติด้วย messages.groupChat.historyLimit (ค่าเริ่มต้นส่วนกลาง) หรือการกำหนดค่าแทนที่รายช่องทาง เช่น channels.slack.historyLimit และ channels.telegram.accounts.<id>.historyLimit (กำหนด 0 เพื่อปิดใช้งาน)
ข้อมูลเมตาของผลลัพธ์เครื่องมือ
content ของผลลัพธ์เครื่องมือคือผลลัพธ์ที่โมเดลมองเห็น ส่วน details คือข้อมูลเมตารันไทม์สำหรับการแสดงผล UI การวินิจฉัย การส่งสื่อ และ Plugin
toolResult.detailsจะถูกตัดออกก่อนเล่นซ้ำกับผู้ให้บริการและก่อนป้อนข้อมูลเข้า Compaction- บันทึกบทสนทนาของเซสชันที่จัดเก็บไว้จะเก็บเฉพาะ
detailsที่มีขนาดจำกัด ส่วนข้อมูลเมตาที่ใหญ่เกินไปจะถูกแทนที่ด้วยสรุปแบบย่อที่ทำเครื่องหมายpersistedDetailsTruncated: true - Plugin และเครื่องมือควรใส่ข้อความที่โมเดลต้องอ่านไว้ใน
contentไม่ใช่เฉพาะในdetails
การเข้าคิวและข้อความติดตาม
เมื่อมีการรันที่กำลังทำงานอยู่แล้ว ข้อความขาเข้าจะถูกนำไปชี้นำการรันนั้นโดยค่าเริ่มต้น messages.queue ควบคุมโหมด:
| โหมด | พฤติกรรม |
|---|---|
steer (ค่าเริ่มต้น) |
แทรกพรอมต์ใหม่ลงในการรันที่กำลังทำงานอยู่ |
followup |
รันข้อความหลังจากการรันที่กำลังทำงานอยู่เสร็จสิ้น |
collect |
รวมข้อความที่เข้ากันได้เป็นหนึ่งเทิร์นในภายหลัง |
interrupt |
ยกเลิกการรันที่กำลังทำงานอยู่ แล้วเริ่มพรอมต์ล่าสุด |
คิวใช้การหน่วงรวมข้อความในตัว 500ms สำหรับการชี้นำ ข้อความติดตาม และการรวมชุด messages.queue.cap มีค่าเริ่มต้นเป็นข้อความในคิว 20 รายการ และ messages.queue.drop มีค่าเริ่มต้นเป็น summarize (มี old และ new ให้ใช้ด้วย) กำหนดค่าแทนที่รายช่องทางผ่าน messages.queue.byChannel และ messages.queue.debounceMsByChannel
รายละเอียด: คิวคำสั่ง และ คิวการชี้นำ
การเป็นเจ้าของการรันของช่องทาง
Plugin ของช่องทางอาจรักษาลำดับ หน่วงรวมอินพุต และใช้แรงดันย้อนกลับของการขนส่งก่อนที่ข้อความจะเข้าสู่คิวเซสชัน แต่ไม่ควรกำหนดการหมดเวลาแยกต่างหากครอบเทิร์นของเอเจนต์เอง เมื่อข้อความถูกกำหนดเส้นทางไปยังเซสชันแล้ว วงจรชีวิตของเซสชัน เครื่องมือ และรันไทม์จะควบคุมงานที่ใช้เวลานาน เพื่อให้ทุกช่องทางรายงานและกู้คืนจากเทิร์นที่ล่าช้าอย่างสอดคล้องกัน
การสตรีม การแบ่งส่วน และการรวมชุด
การสตรีมแบบบล็อกจะส่งการตอบกลับบางส่วนขณะที่โมเดลสร้างบล็อกข้อความ ส่วนการแบ่งส่วนจะเคารพขีดจำกัดข้อความของช่องทางและหลีกเลี่ยงการแยกโค้ดที่อยู่ในรั้ว
agents.defaults.blockStreamingDefault(on|off, ค่าเริ่มต้นoff)agents.defaults.blockStreamingBreak(text_end|message_end)agents.defaults.blockStreamingChunk(minChars|maxChars|breakPreference)agents.defaults.blockStreamingCoalesce(การรวมชุดตามช่วงที่ไม่มีการใช้งาน)agents.defaults.humanDelay(ช่วงพักคล้ายมนุษย์ระหว่างการตอบกลับแบบบล็อก)- การกำหนดค่าแทนที่ของช่องทาง:
*.streaming.block.enabledและ*.streaming.block.coalesceในช่องทางที่รวมมาให้ คีย์แบบแบนที่ล้าสมัยจะถูกย้ายโดยopenclaw doctor --fixการสตรีมแบบบล็อกจะปิดอยู่ เว้นแต่เปิดใช้งานอย่างชัดเจนในทุกช่องทาง รวมถึง Telegram ข้อยกเว้นคือ QQ Bot ซึ่งไม่มีคีย์streaming.blockและจะสตรีมการตอบกลับแบบบล็อก เว้นแต่channels.qqbot.streaming.modeเป็น"off"
รายละเอียด: การสตรีม + การแบ่งส่วน
การมองเห็นกระบวนการให้เหตุผลและโทเค็น
/reasoning on|off|streamควบคุมการมองเห็น- เนื้อหากระบวนการให้เหตุผลยังคงนับรวมในการใช้โทเค็นเมื่อโมเดลสร้างเนื้อหาดังกล่าว
- Telegram รองรับการสตรีมกระบวนการให้เหตุผลไปยังกล่องฉบับร่างชั่วคราว ซึ่งจะถูกลบหลังจากส่งขั้นสุดท้าย ใช้
/reasoning onสำหรับเอาต์พุตกระบวนการให้เหตุผลแบบถาวร
รายละเอียด: ไดเรกทีฟการคิด + การให้เหตุผล และ การใช้โทเค็น
คำนำหน้า เธรด และการตอบกลับ
- ลำดับการใช้คำนำหน้าขาออก:
messages.responsePrefix,channels.<channel>.responsePrefix,channels.<channel>.accounts.<id>.responsePrefixนอกจากนี้ WhatsApp ยังมีchannels.whatsapp.messagePrefixสำหรับคำนำหน้าขาเข้า - การทำเธรดการตอบกลับผ่าน
replyToModeและค่าเริ่มต้นรายช่องทาง
รายละเอียด: การกำหนดค่า และเอกสารของช่องทาง
การตอบกลับแบบเงียบ
โทเค็นแบบเงียบ NO_REPLY (ไม่คำนึงถึงตัวพิมพ์เล็ก-ใหญ่ ดังนั้น no_reply จึงตรงกันด้วย) หมายถึง "ไม่ส่งการตอบกลับที่ผู้ใช้มองเห็น" เมื่อเทิร์นหนึ่งมีสื่อจากเครื่องมือที่รอส่งอยู่ด้วย เช่น เสียง TTS ที่สร้างขึ้น OpenClaw จะตัดข้อความแบบเงียบออก แต่ยังคงส่งไฟล์แนบสื่อ
นโยบายความเงียบจะพิจารณาตามประเภทการสนทนา:
- การสนทนาโดยตรงจะไม่ได้รับคำแนะนำพรอมต์
NO_REPLYหากการรันโดยตรงส่งคืนเพียงโทเค็นแบบเงียบโดยไม่ตั้งใจ OpenClaw จะระงับโทเค็นดังกล่าวแทนการเขียนใหม่หรือส่งออก - กลุ่ม/ช่องทางอนุญาตให้เงียบโดยค่าเริ่มต้น ในโหมดการตอบกลับที่มองเห็นได้
message_toolความเงียบหมายถึงโมเดลไม่เรียกmessage(action=send) - การประสานงานภายในอนุญาตให้เงียบโดยค่าเริ่มต้น
ค่าเริ่มต้นอยู่ภายใต้ agents.defaults.silentReply โดย surfaces.<id>.silentReply สามารถกำหนดนโยบายกลุ่ม/ภายในแทนเป็นรายพื้นผิวได้
OpenClaw ยังใช้การตอบกลับแบบเงียบสำหรับความล้มเหลวทั่วไปของตัวรันภายในแชตที่ไม่ใช่แชตโดยตรง เพื่อไม่ให้กลุ่ม/ช่องทางเห็นข้อความข้อผิดพลาดมาตรฐานของ Gateway ความล้มเหลวที่จัดประเภทแล้วและมีข้อความแนะนำการกู้คืนสำหรับผู้ใช้ เช่น การแจ้งว่าไม่มีการยืนยันตัวตน ถึงขีดจำกัดอัตรา หรือระบบทำงานหนักเกินไป ยังคงส่งได้ แชตโดยตรงจะแสดงข้อความความล้มเหลวแบบย่อโดยค่าเริ่มต้น ส่วนรายละเอียดดิบของตัวรันจะแสดงเมื่อเปิดใช้งาน /verbose full เท่านั้น
การตอบกลับที่มีเพียงโทเค็นแบบเงียบจะถูกทิ้งในทุกพื้นผิว เพื่อให้เซสชันแม่ยังคงเงียบ แทนการเขียนข้อความเซนทิเนลใหม่เป็นข้อความสำรอง
ที่เกี่ยวข้อง
- การปรับโครงสร้างวงจรชีวิตข้อความ - การออกแบบเป้าหมายสำหรับการส่งและรับที่คงทน
- การสตรีม - การส่งข้อความแบบเรียลไทม์
- การลองใหม่ - พฤติกรรมการลองส่งข้อความใหม่
- คิว - คิวประมวลผลข้อความ
- ช่องทาง - การผสานรวมแพลตฟอร์มรับส่งข้อความ