Messages and delivery
การสตรีมและการแบ่งเป็นส่วนย่อย
OpenClaw มีเลเยอร์การสตรีมที่เป็นอิสระจากกัน 2 เลเยอร์ และปัจจุบัน ไม่มีการ สตรีมส่วนต่างของโทเค็นอย่างแท้จริง ไปยังข้อความของช่องทาง:
- การสตรีมแบบบล็อก (ช่องทาง): ส่ง บล็อก ที่เสร็จสมบูรณ์ขณะที่ผู้ช่วย กำลังเขียน ซึ่งเป็นข้อความช่องทางปกติ ไม่ใช่ส่วนต่างของโทเค็น
- การสตรีมตัวอย่าง (Telegram/Discord/Slack/Matrix/Mattermost/MS Teams): อัปเดต ข้อความตัวอย่าง ชั่วคราวระหว่างการสร้าง (ส่ง + แก้ไข/ต่อท้าย)
การสตรีมแบบบล็อก (ข้อความช่องทาง)
การสตรีมแบบบล็อกจะส่งเอาต์พุตของผู้ช่วยเป็นส่วนขนาดใหญ่เมื่อพร้อมใช้งาน
เอาต์พุตโมเดล └─ 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_endmessage_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 ในโหมดความคืบหน้า คำนำเดียวกันนี้จะใช้เป็นพาดหัวสถานะแม้ว่าจะปิดช่องทางเสริมนี้ ส่วนช่องทางอื่นจะคงพฤติกรรมความคืบหน้าเดิม ดู ฉบับร่างความคืบหน้า
{ "channels": { "discord": { "streaming": { "mode": "progress", "progress": { "commentary": true } } } }}ให้บรรทัดความคืบหน้ามองเห็นได้ต่อไป แต่ซ่อนข้อความคำสั่ง/การดำเนินการดิบ:
{ "channels": { "telegram": { "streaming": { "mode": "partial", "preview": { "toolProgress": true, "commandText": "status" } } } }}ใช้โครงสร้างเดียวกันภายใต้คีย์ของช่องทางความคืบหน้าแบบกะทัดรัดอื่น เช่น
channels.discord, channels.matrix, channels.msteams,
channels.mattermost หรือตัวอย่างฉบับร่างของ Slack สำหรับโหมดฉบับร่างความคืบหน้า ให้ใส่
นโยบายเดียวกันภายใต้ streaming.progress:
{ "channels": { "telegram": { "streaming": { "mode": "progress", "progress": { "toolProgress": true, "commandText": "status" } } } }}ที่เกี่ยวข้อง
- การปรับโครงสร้างวงจรชีวิตข้อความ - มุ่งสู่การออกแบบตัวอย่าง การแก้ไข การสตรีม และการทำให้เสร็จสมบูรณ์ที่ใช้ร่วมกัน
- ฉบับร่างความคืบหน้า - ข้อความงานที่กำลังดำเนินอยู่ซึ่งมองเห็นได้และอัปเดตระหว่างรอบที่ใช้เวลานาน
- ข้อความ - วงจรชีวิตและการส่งข้อความ
- การลองใหม่ - พฤติกรรมการลองใหม่เมื่อการส่งล้มเหลว
- ช่องทาง - การรองรับการสตรีมแยกตามช่องทาง