Messages and delivery

การสตรีมและการแบ่งเป็นส่วนย่อย

OpenClaw มีเลเยอร์การสตรีมที่เป็นอิสระจากกัน 2 เลเยอร์ และปัจจุบัน ไม่มีการ สตรีมส่วนต่างของโทเค็นอย่างแท้จริง ไปยังข้อความของช่องทาง:

  • การสตรีมแบบบล็อก (ช่องทาง): ส่ง บล็อก ที่เสร็จสมบูรณ์ขณะที่ผู้ช่วย กำลังเขียน ซึ่งเป็นข้อความช่องทางปกติ ไม่ใช่ส่วนต่างของโทเค็น
  • การสตรีมตัวอย่าง (Telegram/Discord/Slack/Matrix/Mattermost/MS Teams): อัปเดต ข้อความตัวอย่าง ชั่วคราวระหว่างการสร้าง (ส่ง + แก้ไข/ต่อท้าย)

การสตรีมแบบบล็อก (ข้อความช่องทาง)

การสตรีมแบบบล็อกจะส่งเอาต์พุตของผู้ช่วยเป็นส่วนขนาดใหญ่เมื่อพร้อมใช้งาน

text
เอาต์พุตโมเดล  └─ text_delta/เหตุการณ์       ├─ (blockStreamingBreak=text_end)       │    └─ ตัวแบ่งส่วนส่งบล็อกเมื่อบัฟเฟอร์มีขนาดเพิ่มขึ้น       └─ (blockStreamingBreak=message_end)            └─ ตัวแบ่งส่วนล้างบัฟเฟอร์เมื่อ message_end                   └─ ส่งไปยังช่องทาง (การตอบกลับแบบบล็อก)
  • text_delta/events: เหตุการณ์สตรีมของโมเดล (อาจมีข้อมูลห่างกันสำหรับโมเดลที่ไม่สตรีม)
  • chunker: EmbeddedBlockChunker ที่ใช้ขอบเขตต่ำสุด/สูงสุด + การกำหนดลักษณะการแบ่ง
  • channel send: ข้อความขาออกจริง (การตอบกลับแบบบล็อก)

ตัวควบคุม (ทั้งหมดอยู่ภายใต้ agents.defaults เว้นแต่จะระบุไว้):

คีย์ ค่า / รูปแบบ ค่าเริ่มต้น
blockStreamingDefault "on" / "off" "off"
blockStreamingBreak "text_end" / "message_end" -
blockStreamingChunk { minChars, maxChars, breakPreference? } -
blockStreamingCoalesce { minChars?, maxChars?, idleMs? } (รวมบล็อกที่สตรีมก่อนส่ง) -
*.streaming.block.enabled (การแทนที่สำหรับช่องทาง) true / false, บังคับการสตรีมแบบบล็อกต่อช่องทาง (และต่อบัญชี) -
*.textChunkLimit (เช่น channels.whatsapp.textChunkLimit) ตัวเลข, ขีดจำกัดสูงสุดแบบตายตัว 4000
*.streaming.chunkMode "length" / "newline" "length"
channels.discord.maxLinesPerMessage ตัวเลข, ขีดจำกัดจำนวนบรรทัดแบบยืดหยุ่นที่แบ่งการตอบกลับยาวในแนวตั้งเพื่อหลีกเลี่ยงการตัดใน UI 17

streaming.chunkMode: "newline" จะแบ่งตรงบรรทัดว่าง (ขอบเขตย่อหน้า) ไม่ใช่ทุกการขึ้นบรรทัดใหม่ ก่อนจะเปลี่ยนไปใช้การแบ่งตามความยาวเมื่อข้อความ เกินขีดจำกัด

ช่องทางที่รวมมาให้สะกดการแทนที่เหล่านี้เป็น channels.<id>.streaming.{chunkMode,block.enabled,block.coalesce} รูปแบบคีย์ระดับเดียว *.chunkMode / *.blockStreaming / *.blockStreamingCoalesce เป็น รูปแบบเดิมในทุกช่องทางที่รวมมาให้: openclaw doctor --fix จะย้ายรูปแบบเหล่านี้ไปยัง รูปแบบซ้อน และสคีมาของช่องทางจะปฏิเสธรูปแบบดังกล่าว การกำหนดค่า Plugin ของ SDK ภายนอก ที่ยังใช้รูปแบบคีย์ระดับเดียวจะยังคงทำงานผ่านกลไกสำรองที่เลิกสนับสนุนแล้ว (พร้อมคำเตือนขณะรันไทม์) จนถึงรอบการเผยแพร่ถัดไป

ความหมายของขอบเขต สำหรับ blockStreamingBreak:

  • text_end: สตรีมบล็อกทันทีที่ตัวแบ่งส่วนส่งออกมา และล้างบัฟเฟอร์ทุกครั้งที่เกิด text_end
  • message_end: รอจนกว่าข้อความของผู้ช่วยจะเสร็จสิ้น แล้วจึงล้าง เอาต์พุตที่บัฟเฟอร์ไว้ หากข้อความที่บัฟเฟอร์เกิน maxChars ก็ยังใช้ตัวแบ่งส่วน จึงอาจส่งหลายส่วนในตอนท้ายได้

การส่งสื่อด้วยการสตรีมแบบบล็อก

สื่อที่สตรีมต้องใช้ฟิลด์เพย์โหลดที่มีโครงสร้าง เช่น mediaUrl หรือ mediaUrls; ข้อความที่สตรีมจะไม่ถูกแยกวิเคราะห์เป็นคำสั่งไฟล์แนบ เมื่อการสตรีมแบบบล็อก ส่งสื่อออกไปก่อน OpenClaw จะจดจำการส่งดังกล่าวสำหรับเทิร์นนั้น หาก เพย์โหลดสุดท้ายของผู้ช่วยมี URL สื่อเดียวกันซ้ำ การส่งขั้นสุดท้ายจะตัด สื่อที่ซ้ำออกแทนที่จะส่งไฟล์แนบอีกครั้ง

เพย์โหลดสุดท้ายที่ซ้ำกันทุกประการจะถูกระงับ หากเพย์โหลดสุดท้ายเพิ่ม ข้อความที่แตกต่างรอบสื่อซึ่งสตรีมไปแล้ว OpenClaw จะยังคงส่ง ข้อความใหม่โดยส่งสื่อเพียงครั้งเดียว วิธีนี้ป้องกันข้อความเสียง หรือไฟล์ซ้ำในช่องทางอย่าง Telegram

อัลกอริทึมการแบ่งส่วน (ขอบเขตต่ำ/สูง)

การแบ่งส่วนแบบบล็อกดำเนินการโดย EmbeddedBlockChunker:

  • ขอบเขตต่ำ: อย่าส่งจนกว่าบัฟเฟอร์ >= minChars (เว้นแต่ถูกบังคับ)
  • ขอบเขตสูง: พยายามแบ่งก่อน maxChars; หากถูกบังคับ ให้แบ่งที่ maxChars
  • ลำดับการกำหนดลักษณะการแบ่ง: paragraph -> newline -> sentence -> ช่องว่าง -> บังคับแบ่ง
  • รั้วโค้ด: ห้ามแบ่งภายในรั้ว เมื่อถูกบังคับที่ maxChars ให้ปิด และเปิดรั้วใหม่เพื่อคงความถูกต้องของ Markdown

maxChars จะถูกจำกัดให้อยู่ภายใน textChunkLimit ของช่องทาง จึงไม่สามารถเกิน ขีดจำกัดของแต่ละช่องทางได้

การรวมส่วน (รวมบล็อกที่สตรีม)

เมื่อเปิดใช้การสตรีมแบบบล็อก OpenClaw สามารถ รวมส่วนบล็อกที่ต่อเนื่องกัน ก่อนส่ง เพื่อลดข้อความบรรทัดเดียวจำนวนมาก ขณะเดียวกันยังคงแสดง เอาต์พุตแบบต่อเนื่อง

  • การรวมส่วนจะรอ ช่วงว่างที่ไม่มีการทำงาน (idleMs) ก่อนล้างบัฟเฟอร์
  • บัฟเฟอร์ถูกจำกัดด้วย maxChars และจะถูกล้างหากเกินค่านี้
  • minChars ป้องกันไม่ให้ส่งส่วนย่อยขนาดเล็กจนกว่าจะสะสมข้อความได้เพียงพอ (การล้างบัฟเฟอร์ขั้นสุดท้ายจะส่งข้อความที่เหลือเสมอ)
  • ตัวเชื่อมได้มาจาก blockStreamingChunk.breakPreference: paragraph -> \n\n, newline -> \n, sentence -> เว้นวรรค
  • การแทนที่สำหรับช่องทางใช้งานได้ผ่าน *.streaming.block.coalesce (รวมถึง การกำหนดค่าต่อบัญชี)
  • Discord, Signal และ Slack ใช้ค่าเริ่มต้นในการรวมส่วนเป็น { minChars: 1500, idleMs: 1000 } เว้นแต่จะถูกแทนที่

การเว้นจังหวะระหว่างบล็อกให้คล้ายมนุษย์

เมื่อเปิดใช้การสตรีมแบบบล็อก ให้เพิ่ม การหยุดแบบสุ่ม ระหว่างการตอบกลับ แบบบล็อกหลังจากบล็อกแรก เพื่อให้การตอบกลับแบบหลายกรอบข้อความดูเป็นธรรมชาติยิ่งขึ้น

agents.defaults.humanDelay.mode ลักษณะการทำงาน
off (ค่าเริ่มต้น) ไม่หยุด
natural หยุดแบบสุ่ม 800-2500ms
custom minMs/maxMs

แทนที่ต่อเอเจนต์ผ่าน agents.list[].humanDelay ใช้เฉพาะกับ การตอบกลับ แบบบล็อก ไม่ใช้กับการตอบกลับขั้นสุดท้ายหรือสรุปเครื่องมือ

"สตรีมเป็นส่วนหรือทั้งหมด"

  • สตรีมเป็นส่วน: blockStreamingDefault: "on" + blockStreamingBreak: "text_end" (ส่งระหว่างดำเนินการ) ช่องทางที่ไม่ใช่ Telegram ต้องใช้ *.streaming.block.enabled: true ด้วย
  • สตรีมทั้งหมดในตอนท้าย: blockStreamingBreak: "message_end" (ล้างบัฟเฟอร์ ครั้งเดียว แต่อาจมีหลายส่วนหากยาวมาก)
  • ไม่มีการสตรีมแบบบล็อก: blockStreamingDefault: "off" (เฉพาะการตอบกลับขั้นสุดท้าย)

การสตรีมแบบบล็อกจะ ปิดอยู่ เว้นแต่ จะตั้งค่า *.streaming.block.enabled เป็น true อย่างชัดเจน (ข้อยกเว้น: QQ Bot ไม่มีคีย์ streaming.block และจะสตรีม การตอบกลับแบบบล็อก เว้นแต่ channels.qqbot.streaming.mode เป็น "off") ช่องทางสามารถ สตรีมตัวอย่างแบบสด (channels.<channel>.streaming.mode) โดยไม่มีการตอบกลับ แบบบล็อก ค่าเริ่มต้น blockStreaming* อยู่ภายใต้ agents.defaults ไม่ใช่ที่ รากของการกำหนดค่า

โหมดการสตรีมตัวอย่าง

คีย์มาตรฐาน: channels.<channel>.streaming ({ mode, ... } แบบซ้อน; รูปแบบ บูลีน/สตริงระดับบนสุดแบบเดิมจะถูกเขียนใหม่โดย openclaw doctor --fix)

โหมด ลักษณะการทำงาน
off ปิดใช้การสตรีมตัวอย่าง
partial แทนที่ตัวอย่างเดียวด้วยข้อความล่าสุด
block อัปเดตตัวอย่างเป็นขั้นแบบแบ่งส่วน/ต่อท้าย
progress แสดงตัวอย่างความคืบหน้า/สถานะระหว่างการสร้าง และแสดงคำตอบสุดท้ายเมื่อเสร็จสิ้น

streaming.mode: "block" เป็นโหมดการสตรีมตัวอย่างสำหรับช่องทางที่ รองรับการแก้ไข เช่น Discord และ Telegram โดยตัวมันเองไม่ได้เปิดใช้การส่ง แบบบล็อกของช่องทางดังกล่าว ใช้ streaming.block.enabled สำหรับการตอบกลับแบบบล็อกตามปกติ Microsoft Teams เป็น ข้อยกเว้น: ไม่มีการส่งแบบบล็อกสำหรับตัวอย่างฉบับร่าง ดังนั้น streaming.mode: "block" จะปิดการสตรีมแบบเนทีฟทั้งหมด และการตอบกลับจะถูกส่งเป็น การส่งแบบบล็อกปกติแทนการสตรีมบางส่วน/ความคืบหน้าแบบเนทีฟ Mattermost ก็ แตกต่างเช่นกัน: ในโหมด block ระบบจะสลับตัวอย่างระหว่างข้อความที่เสร็จสมบูรณ์กับ บล็อกกิจกรรมเครื่องมือ เพื่อให้บล็อกก่อนหน้ายังคงปรากฏเป็นโพสต์แยกกัน แทนที่จะถูกเขียนทับในฉบับร่างเดียวที่แก้ไขได้

การแมปช่องทาง

ช่องทาง off partial block progress
Telegram ใช่ ใช่ ใช่ ฉบับร่างความคืบหน้าที่แก้ไขได้
Discord ใช่ ใช่ ใช่ ฉบับร่างความคืบหน้าที่แก้ไขได้
Slack ใช่ ใช่ ใช่ ใช่
Mattermost ใช่ ใช่ ใช่ ใช่
MS Teams ใช่ ใช่ ใช่ สตรีมความคืบหน้าแบบเนทีฟ

การกำหนดค่าส่วนตัวอย่าง (streaming.preview.chunk.* เช่น ภายใต้ channels.discord.streaming หรือ channels.telegram.streaming) มีค่าเริ่มต้นเป็น minChars: 200, maxChars: 800 (ถูกจำกัดให้อยู่ภายใน textChunkLimit ของช่องทาง) และ breakPreference: "paragraph"

เฉพาะ Slack:

  • channels.slack.streaming.nativeTransport ใช้สลับการเรียก API การสตรีมแบบเนทีฟของ Slack (chat.startStream/chat.appendStream/chat.stopStream) เมื่อ channels.slack.streaming.mode="partial" (ค่าเริ่มต้น: true)
  • การสตรีมแบบเนทีฟของ Slack และสถานะเธรดผู้ช่วยของ Slack ต้องมีเป้าหมายเป็น เธรดการตอบกลับ DM ระดับบนสุดจะไม่แสดงตัวอย่างแบบเธรดดังกล่าว แต่ยัง สามารถใช้โพสต์ตัวอย่างฉบับร่างและการแก้ไขของ Slack ได้

การย้ายคีย์เดิม

ช่องทาง คีย์เดิม สถานะ
Telegram streamMode, streaming แบบสเกลาร์/บูลีน ถูกเขียนใหม่เป็น streaming.mode โดย openclaw doctor --fix; ไม่ถูกอ่านขณะรันไทม์
Discord streamMode, streaming แบบบูลีน ถูกเขียนใหม่เป็น streaming.mode โดย openclaw doctor --fix; ไม่ถูกอ่านขณะรันไทม์
Slack streamMode; streaming แบบบูลีน; nativeStreaming แบบเดิม ถูกเขียนใหม่เป็น streaming.mode (และ streaming.nativeTransport สำหรับรูปแบบบูลีน/เดิม) โดย openclaw doctor --fix; ไม่ถูกอ่านขณะรันไทม์
Matrix streaming แบบสเกลาร์/บูลีน ถูกเขียนใหม่เป็น streaming.mode (รวมถึงโหมด "quiet" ของ Matrix) โดย openclaw doctor --fix; ไม่ถูกอ่านขณะรันไทม์
Feishu streaming แบบบูลีน ถูกเขียนใหม่เป็น streaming.mode โดย openclaw doctor --fix; ไม่ถูกอ่านขณะรันไทม์
QQ Bot streaming แบบบูลีน; streaming.c2cStreamApi ถูกเขียนใหม่เป็น streaming.mode (และ streaming.nativeTransport สำหรับรูปแบบบูลีน/c2cStreamApi) โดย openclaw doctor --fix; ไม่ถูกอ่านขณะรันไทม์

ลักษณะการทำงานขณะรันไทม์

Telegram

  • ใช้การส่ง + แก้ไขการอัปเดตตัวอย่าง sendMessage + editMessageText ใน DM และ กลุ่ม/หัวข้อ โดยข้อความสุดท้ายจะแก้ไขตัวอย่างที่ใช้งานอยู่โดยตรง Telegram ไม่ใช้ฉบับร่าง "กำลังพิมพ์" ชั่วคราว 30 วินาที (sendMessageDraft) สำหรับ การสตรีมคำตอบ
  • ตัวอย่างเริ่มต้นขนาดสั้นยังคงใช้การหน่วงแบบ debounce เพื่อประสบการณ์การแจ้งเตือนแบบพุช แต่ จะแสดงขึ้นหลังจากการหน่วงที่มีขอบเขต เพื่อให้การทำงานที่กำลังดำเนินอยู่ไม่เงียบหายไปจากหน้าจอ
  • ข้อความสุดท้ายขนาดยาวจะนำข้อความตัวอย่างกลับมาใช้กับส่วนแรก และส่งเฉพาะ ส่วนที่เหลือ
  • โหมด block จะหมุนตัวอย่างไปเป็นข้อความใหม่เมื่อถึง streaming.preview.chunk.maxChars (ค่าเริ่มต้น 800 และจำกัดไม่เกินขีดจำกัดการแก้ไข 4096 ของ Telegram) ส่วนโหมดอื่นจะขยายตัวอย่างเดียวได้สูงสุด 4096 อักขระ
  • โหมด progress จะเก็บความคืบหน้าของเครื่องมือไว้ในฉบับร่างสถานะที่แก้ไขได้ แสดง ป้ายกำกับสถานะเมื่อการสตรีมคำตอบทำงานอยู่แต่ยังไม่มีบรรทัดเครื่องมือ ล้างฉบับร่างเมื่อเสร็จสิ้น และส่งคำตอบสุดท้าย ผ่านการส่งตามปกติ
  • หากการแก้ไขครั้งสุดท้ายล้มเหลวก่อนยืนยันข้อความที่เสร็จสมบูรณ์ OpenClaw จะใช้ การส่งข้อความสุดท้ายตามปกติและล้างตัวอย่างที่ค้างอยู่
  • ระบบจะข้ามการสตรีมตัวอย่างเมื่อเปิดใช้การสตรีมแบบบล็อกของ Telegram อย่างชัดเจน เพื่อหลีกเลี่ยงการสตรีมซ้ำซ้อน
  • /reasoning stream สามารถเขียนกระบวนการให้เหตุผลลงในตัวอย่างชั่วคราวซึ่งจะ ถูกลบหลังจากส่งข้อความสุดท้าย
  • การตอบกลับข้อความอ้างอิงที่เลือกใน Telegram เป็นข้อยกเว้น: เมื่อ replyToMode ไม่ใช่ "off" และมีข้อความอ้างอิงที่เลือก OpenClaw จะข้ามสตรีมตัวอย่างคำตอบ สำหรับรอบนั้น (คำตอบสุดท้ายต้องผ่านเส้นทางการตอบกลับข้อความอ้างอิงแบบเนทีฟ) ดังนั้นบรรทัดตัวอย่างความคืบหน้าของเครื่องมือจึงไม่สามารถแสดงผลได้ การตอบกลับ ข้อความปัจจุบันที่ไม่มีข้อความอ้างอิงที่เลือกจะยังคงใช้การสตรีมตัวอย่าง ดูรายละเอียดที่ เอกสารช่องทาง Telegram

Discord

  • ใช้การส่ง + แก้ไขข้อความตัวอย่าง
  • โหมด block ใช้การแบ่งฉบับร่างเป็นส่วน (draftChunk)
  • ระบบจะข้ามการสตรีมตัวอย่างเมื่อเปิดใช้การสตรีมแบบบล็อกของ Discord อย่างชัดเจน
  • โหมด progress จะต่อท้ายใบรับกิจกรรม -# ขนาดเล็ก (จำนวนการคิด/การเรียกเครื่องมือ และเวลาที่ผ่านไป) เข้ากับคำตอบสุดท้าย และลบฉบับร่างสถานะ เมื่อส่งคำตอบนั้นแล้ว เพื่อให้ช่องทางที่มีการใช้งานหนาแน่นไม่มีบันทึกเครื่องมือที่หลงเหลือ อยู่เหนือข้อความตอบกลับ สำหรับข้อความสุดท้ายที่เป็นข้อผิดพลาด ฉบับร่างจะยังคงอยู่เป็นบันทึกของรอบ ที่ล้มเหลว
  • เพย์โหลดสื่อ ข้อผิดพลาด และการตอบกลับแบบระบุชัดเจนในขั้นสุดท้ายจะยกเลิกตัวอย่างที่รอดำเนินการ โดยไม่ปล่อยฉบับร่างใหม่ แล้วจึงใช้การส่งตามปกติ

Slack

  • partial สามารถใช้การสตรีมแบบเนทีฟของ Slack (chat.startStream/append/stop) เมื่อพร้อมใช้งาน
  • block ใช้ตัวอย่างฉบับร่างแบบต่อท้าย
  • progress ใช้ข้อความตัวอย่างสถานะ แล้วตามด้วยคำตอบสุดท้าย
  • DM ระดับบนสุดที่ไม่มีเธรดตอบกลับจะใช้โพสต์และการแก้ไขตัวอย่างฉบับร่าง แทนการสตรีมแบบเนทีฟของ Slack
  • การสตรีมตัวอย่างทั้งแบบเนทีฟและแบบฉบับร่างจะระงับการตอบกลับแบบบล็อกสำหรับรอบนั้น เพื่อให้ การตอบกลับของ Slack สตรีมผ่านเส้นทางการส่งเพียงเส้นทางเดียว
  • เพย์โหลดสื่อ/ข้อผิดพลาดขั้นสุดท้ายและข้อความสุดท้ายเกี่ยวกับความคืบหน้าจะไม่สร้างข้อความฉบับร่าง ชั่วคราวที่ต้องทิ้ง มีเพียงข้อความสุดท้ายแบบข้อความ/บล็อกที่สามารถแก้ไขตัวอย่างได้เท่านั้นที่จะปล่อย ข้อความฉบับร่างที่รอดำเนินการ

Mattermost

  • ในโหมด partial จะสตรีมการคิดและข้อความตอบกลับบางส่วนลงในโพสต์ ตัวอย่างฉบับร่างเดียว ซึ่งจะเสร็จสมบูรณ์โดยตรงเมื่อส่งคำตอบสุดท้ายได้อย่างปลอดภัย
  • ในโหมด progress จะสตรีมการคิดและกิจกรรมของเครื่องมือลงในตัวอย่างสถานะ เดียว ซึ่งจะเสร็จสมบูรณ์โดยตรงเมื่อส่งคำตอบสุดท้ายได้อย่างปลอดภัย
  • ในโหมด block จะสลับระหว่างโพสต์ข้อความที่เสร็จสมบูรณ์กับโพสต์กิจกรรมของเครื่องมือ การอัปเดตเครื่องมือทั้งแบบขนานและแบบต่อเนื่องจะใช้โพสต์กิจกรรมของเครื่องมือปัจจุบันร่วมกัน
  • เปลี่ยนไปส่งโพสต์สุดท้ายใหม่ หากโพสต์ตัวอย่างถูกลบหรือ ไม่พร้อมใช้งานด้วยเหตุอื่นในขณะทำให้เสร็จสมบูรณ์
  • เพย์โหลดสื่อ/ข้อผิดพลาดขั้นสุดท้ายจะยกเลิกการอัปเดตตัวอย่างที่รอดำเนินการก่อนการส่ง ตามปกติ แทนที่จะปล่อยโพสต์ตัวอย่างชั่วคราว

Matrix

  • ตัวอย่างฉบับร่างจะเสร็จสมบูรณ์โดยตรงเมื่อข้อความสุดท้ายสามารถนำเหตุการณ์ตัวอย่าง กลับมาใช้ได้
  • ข้อความสุดท้ายที่มีเฉพาะสื่อ เป็นข้อผิดพลาด หรือเป้าหมายการตอบกลับไม่ตรงกัน จะยกเลิกการอัปเดตตัวอย่าง ที่รอดำเนินการก่อนการส่งตามปกติ และจะลบตัวอย่างค้างที่มองเห็นอยู่แล้ว

การอัปเดตตัวอย่างความคืบหน้าของเครื่องมือ

การสตรีมตัวอย่างยังสามารถรวมการอัปเดต ความคืบหน้าของเครื่องมือ ได้ด้วย ซึ่งเป็นบรรทัดสถานะสั้น ๆ เช่น "กำลังค้นหาเว็บ" "กำลังอ่านไฟล์" หรือ "กำลังเรียกเครื่องมือ" ที่ปรากฏ ในข้อความตัวอย่างเดียวกันขณะที่เครื่องมือกำลังทำงาน ก่อนข้อความตอบกลับสุดท้าย ในโหมดเซิร์ฟเวอร์แอป Codex ข้อความคำนำ/คำบรรยายของ Codex จะใช้ เส้นทางตัวอย่างเดียวกันนี้ เพื่อให้ข้อความความคืบหน้าสั้น ๆ เช่น "กำลังตรวจสอบ..." สามารถสตรีมเข้าสู่ฉบับร่างที่แก้ไขได้โดยไม่กลายเป็นส่วนหนึ่งของคำตอบสุดท้าย วิธีนี้ช่วยให้ รอบการใช้เครื่องมือหลายขั้นตอนยังคงแสดงการเคลื่อนไหว แทนที่จะเงียบระหว่างตัวอย่าง การคิดครั้งแรกกับคำตอบสุดท้าย

เครื่องมือที่ทำงานเป็นเวลานานอาจส่งความคืบหน้าแบบระบุชนิดก่อนส่งผลลัพธ์กลับ ตัวอย่างเช่น web_fetch จะเริ่มตัวจับเวลาห้าวินาทีเมื่อเริ่มทำงาน หากการดึงข้อมูลยัง รอดำเนินการอยู่ ตัวอย่างจะแสดง Fetching page content... แต่หากการดึงข้อมูลเสร็จสิ้นหรือ ถูกยกเลิกก่อนหน้านั้น จะไม่มีการส่งบรรทัดความคืบหน้า ผลลัพธ์สุดท้ายของเครื่องมือในภายหลัง จะยังคงส่งไปยังโมเดลตามปกติ

พื้นผิวที่รองรับ:

  • Discord, Slack, Telegram และ Matrix จะสตรีมความคืบหน้าของเครื่องมือและ การอัปเดตคำนำของ Codex เข้าในการแก้ไขตัวอย่างสดโดยค่าเริ่มต้น เมื่อการสตรีมตัวอย่าง ทำงานอยู่ Microsoft Teams ใช้สตรีมความคืบหน้าแบบเนทีฟใน แชตส่วนตัว
  • Telegram เปิดตัวพร้อมการอัปเดตตัวอย่างความคืบหน้าของเครื่องมือที่เปิดใช้งานมาตั้งแต่ v2026.4.22 การเปิดใช้งานต่อไปจะคงพฤติกรรมที่เผยแพร่แล้วดังกล่าว
  • Mattermost จะรวมกิจกรรมของเครื่องมือไว้ในโพสต์ตัวอย่างเดียวในโหมด partial และ progress หรือใช้โพสต์กิจกรรมของเครื่องมือหนึ่งโพสต์ระหว่างบล็อกข้อความในโหมด block (ดูด้านบน)
  • การแก้ไขความคืบหน้าของเครื่องมือจะเป็นไปตามโหมดการสตรีมตัวอย่างที่ทำงานอยู่ โดยจะ ถูกข้ามเมื่อการสตรีมตัวอย่างเป็น off หรือเมื่อการสตรีมแบบบล็อกเข้าควบคุม ข้อความแล้ว ใน Telegram นั้น streaming.mode: "off" ใช้เฉพาะขั้นสุดท้ายเท่านั้น: การแจ้งความคืบหน้าทั่วไปจะถูกระงับแทนที่จะส่งเป็นข้อความสถานะแยกต่างหาก ขณะที่พรอมต์ขออนุมัติ เพย์โหลดสื่อ และข้อผิดพลาดยังคงส่งตามเส้นทาง ปกติ
  • หากต้องการคงการสตรีมตัวอย่างไว้แต่ซ่อนบรรทัดความคืบหน้าของเครื่องมือ ให้ตั้งค่า streaming.preview.toolProgress เป็น false สำหรับช่องทางนั้น (ค่าเริ่มต้น true) หากต้องการให้บรรทัดความคืบหน้าของเครื่องมือมองเห็นได้ต่อไปแต่ซ่อนข้อความคำสั่ง/การดำเนินการ ให้ตั้งค่า streaming.preview.commandText เป็น "status" หรือ streaming.progress.commandText เป็น "status" โดยค่าเริ่มต้นคือ "raw" เพื่อ คงพฤติกรรมที่เผยแพร่แล้ว นโยบายนี้ใช้ร่วมกันในช่องทางฉบับร่าง/ความคืบหน้า ที่ใช้ตัวแสดงผลความคืบหน้าแบบกะทัดรัดของ OpenClaw รวมถึง Discord, Matrix, Microsoft Teams, Mattermost, ตัวอย่างฉบับร่างของ Slack และ Telegram หากต้องการปิดใช้ การแก้ไขตัวอย่างทั้งหมด ให้ตั้งค่า streaming.mode เป็น off

การแสดงผลฉบับร่างความคืบหน้า

ฉบับร่างโหมดความคืบหน้า (streaming.progress.*) มีขอบเขตจำกัดและกำหนดค่าได้แยกตาม ช่องทาง:

คีย์ ค่าเริ่มต้น ลักษณะการทำงาน
streaming.progress.maxLines 8 จำนวนบรรทัดความคืบหน้าแบบกะทัดรัดสูงสุดที่เก็บไว้ใต้ป้ายกำกับฉบับร่าง
streaming.progress.maxLineChars 120 จำนวนอักขระสูงสุดต่อบรรทัดแบบกะทัดรัดก่อนตัดทอน (คำนึงถึงขอบเขตคำ)
streaming.progress.label "auto" ชื่อฉบับร่าง โดยใช้สตริงที่กำหนดเอง หรือ false เพื่อซ่อน
streaming.progress.labels กลุ่มที่มีมาให้ ป้ายกำกับตัวเลือกที่ใช้เมื่อ label: "auto"

ช่องทางความคืบหน้าจากคำบรรยาย

นอกเหนือจากความคืบหน้าของเครื่องมือ ตัวแสดงผลความคืบหน้าแบบกะทัดรัดสามารถแสดงช่องทางเพิ่มเติม ในฉบับร่างได้อีกหนึ่งช่อง:

  • streaming.progress.commentary - แสดง คำบรรยาย ก่อนใช้เครื่องมือของโมเดล (คำบรรยายสั้น ๆ เช่น "จะตรวจสอบ... แล้ว...") สลับกับบรรทัดเครื่องมือในฉบับร่างความคืบหน้า สำหรับ Discord และ Telegram ในโหมดความคืบหน้า คำนำเดียวกันนี้จะใช้เป็นพาดหัวสถานะแม้ว่าจะปิดช่องทางเสริมนี้ ส่วนช่องทางอื่นจะคงพฤติกรรมความคืบหน้าเดิม ดู ฉบับร่างความคืบหน้า
json
{  "channels": {    "discord": {      "streaming": { "mode": "progress", "progress": { "commentary": true } }    }  }}

ให้บรรทัดความคืบหน้ามองเห็นได้ต่อไป แต่ซ่อนข้อความคำสั่ง/การดำเนินการดิบ:

json
{  "channels": {    "telegram": {      "streaming": {        "mode": "partial",        "preview": {          "toolProgress": true,          "commandText": "status"        }      }    }  }}

ใช้โครงสร้างเดียวกันภายใต้คีย์ของช่องทางความคืบหน้าแบบกะทัดรัดอื่น เช่น channels.discord, channels.matrix, channels.msteams, channels.mattermost หรือตัวอย่างฉบับร่างของ Slack สำหรับโหมดฉบับร่างความคืบหน้า ให้ใส่ นโยบายเดียวกันภายใต้ streaming.progress:

json
{  "channels": {    "telegram": {      "streaming": {        "mode": "progress",        "progress": {          "toolProgress": true,          "commandText": "status"        }      }    }  }}

ที่เกี่ยวข้อง

Was this useful?
On this page

On this page