Messages and delivery
ฉบับร่างความคืบหน้า
ร่างความคืบหน้าช่วยให้เทิร์นของเอเจนต์ที่ทำงานนานดูมีความเคลื่อนไหวในแชต โดยไม่เปลี่ยน การสนทนาให้กลายเป็นกองของการตอบสถานะชั่วคราว
เมื่อเปิดใช้ร่างความคืบหน้า OpenClaw จะสร้างข้อความงานที่กำลังดำเนินการที่มองเห็นได้เพียงหนึ่งข้อความ หลังจากเทิร์นพิสูจน์แล้วว่ากำลังทำงานจริง อัปเดตข้อความนั้นขณะที่ เอเจนต์อ่าน วางแผน เรียกใช้เครื่องมือ หรือรอการอนุมัติ แล้วจึงเปลี่ยนร่างนั้น เป็นคำตอบสุดท้ายเมื่อช่องทางสามารถทำได้อย่างปลอดภัย
Shelling...📖 from docs/concepts/progress-drafts.md🔎 Web Search: for "discord edit message"🛠️ Bash: run testsใช้ร่างความคืบหน้าเมื่อคุณต้องการข้อความสถานะที่เป็นระเบียบเพียงหนึ่งข้อความระหว่างงานที่ใช้เครื่องมือหนัก และคำตอบสุดท้ายเมื่อเทิร์นเสร็จสิ้น
เริ่มต้นอย่างรวดเร็ว
เปิดใช้ร่างความคืบหน้าต่อช่องทางด้วย streaming.mode: "progress":
{ channels: { discord: { streaming: { mode: "progress", }, }, },}โดยทั่วไปเท่านี้ก็เพียงพอแล้ว OpenClaw จะเลือกป้ายกำกับคำเดียวโดยอัตโนมัติ รอ จนกว่างานจะใช้เวลาอย่างน้อยห้าวินาทีหรือปล่อยอีเวนต์งานครั้งที่สอง เพิ่มบรรทัด ความคืบหน้าแบบกระชับในขณะที่มีงานที่เป็นประโยชน์เกิดขึ้น และระงับข้อความความคืบหน้าแบบเดี่ยว ที่ซ้ำกันสำหรับเทิร์นนั้น
สิ่งที่ผู้ใช้เห็น
ร่างความคืบหน้ามีสองส่วน:
| ส่วน | วัตถุประสงค์ |
|---|---|
| ป้ายกำกับ | บรรทัดเริ่มต้น/สถานะสั้นๆ เช่น Working หรือ Shelling |
| บรรทัดความคืบหน้า | การอัปเดตการรันแบบกระชับ โดยใช้ไอคอนเครื่องมือและตัวจัดรูปแบบรายละเอียดเดียวกับเอาต์พุตแบบละเอียด |
ป้ายกำกับจะปรากฏหลังจากเอเจนต์เริ่มงานที่มีความหมาย และยังคงยุ่งอยู่
เป็นเวลาห้าวินาทีหรือปล่อยอีเวนต์งานครั้งที่สอง ป้ายกำกับเป็นส่วนหนึ่งของรายการบรรทัด
ความคืบหน้าแบบเลื่อนต่อเนื่อง ดังนั้นสถานะเริ่มต้นจะเลื่อนหายไปเมื่อมีงานที่เป็นรูปธรรมเพียงพอปรากฏขึ้น
การตอบกลับที่เป็นข้อความล้วนเท่านั้นจะไม่แสดงร่างความคืบหน้า บรรทัดความคืบหน้าจะถูกเพิ่ม
เฉพาะเมื่อเอเจนต์ปล่อยการอัปเดตงานที่เป็นประโยชน์ เช่น 🛠️ Bash: run tests,
🔎 Web Search: for "discord edit message" หรือ ✍️ Write: to /tmp/file
โดยค่าเริ่มต้นจะใช้โหมดอธิบายแบบกระชับเดียวกับ /verbose; ตั้งค่า
agents.defaults.toolProgressDetail: "raw" เมื่อดีบักและคุณต้องการให้ผนวก
คำสั่ง/รายละเอียดดิบด้วย
คำตอบสุดท้ายจะแทนที่ร่างเมื่อทำได้ มิฉะนั้น
OpenClaw จะส่งคำตอบสุดท้ายตามปกติ และล้างหรือหยุดอัปเดต
ร่างตามทรานสปอร์ตของช่องทาง
เลือกโหมด
channels.<channel>.streaming.mode ควบคุมพฤติกรรมระหว่างดำเนินการที่มองเห็นได้:
| โหมด | เหมาะที่สุดสำหรับ | สิ่งที่ปรากฏในแชต |
|---|---|---|
off |
ช่องทางที่เงียบ | เฉพาะคำตอบสุดท้าย |
partial |
ดูข้อความคำตอบค่อยๆ ปรากฏ | ร่างหนึ่งรายการที่แก้ไขด้วยข้อความคำตอบล่าสุด |
block |
ชิ้นส่วนตัวอย่างคำตอบที่ใหญ่ขึ้น | ตัวอย่างหนึ่งรายการที่อัปเดตหรือผนวกเป็นชิ้นใหญ่ขึ้น |
progress |
เทิร์นที่ใช้เครื่องมือหนักหรือทำงานนาน | ร่างสถานะหนึ่งรายการ แล้วตามด้วยคำตอบสุดท้าย |
เลือก progress เมื่อผู้ใช้ให้ความสำคัญกับ "สิ่งที่กำลังเกิดขึ้น" มากกว่าการดู
ข้อความคำตอบสตรีมทีละโทเค็น
เลือก partial เมื่อคำตอบเองคือสัญญาณความคืบหน้า
เลือก block เมื่อคุณต้องการอัปเดตตัวอย่างร่างเป็นชิ้นข้อความที่ใหญ่ขึ้น บน
Discord และ Telegram, streaming.mode: "block" ยังคงเป็นการสตรีมตัวอย่าง ไม่ใช่
การส่งแบบบล็อกปกติ ใช้ streaming.block.enabled หรือแบบเดิม
blockStreaming เมื่อคุณต้องการการตอบกลับแบบบล็อกปกติ
กำหนดค่าป้ายกำกับ
ป้ายกำกับความคืบหน้าอยู่ภายใต้ channels.<channel>.streaming.progress
ป้ายกำกับเริ่มต้นคือ auto ซึ่งเลือกจากพูลป้ายกำกับคำเดียวในตัวของ OpenClaw:
WorkingShellingScuttlingClawingPinchingMoltingBubblingTidingReefingCrackingSiftingBriningNautilingKrillingBarnaclingLobsteringTidepoolingPearlingSnappingSurfacingใช้ป้ายกำกับคงที่:
{ channels: { discord: { streaming: { mode: "progress", progress: { label: "Investigating", }, }, }, },}ใช้พูลป้ายกำกับอัตโนมัติของคุณเอง:
{ channels: { discord: { streaming: { mode: "progress", progress: { label: "auto", labels: ["Checking", "Reading", "Testing", "Finishing"], }, }, }, },}ซ่อนป้ายกำกับและแสดงเฉพาะบรรทัดความคืบหน้า:
{ channels: { discord: { streaming: { mode: "progress", progress: { label: false, }, }, }, },}ควบคุมบรรทัดความคืบหน้า
บรรทัดความคืบหน้าถูกเปิดใช้งานโดยค่าเริ่มต้นในโหมดความคืบหน้า บรรทัดเหล่านี้มาจากอีเวนต์ การรันจริง: การเริ่มต้นเครื่องมือ การอัปเดตรายการ แผนงาน การอนุมัติ เอาต์พุตคำสั่ง สรุปแพตช์ และกิจกรรมเอเจนต์ที่คล้ายกัน
เครื่องมือยังสามารถปล่อยความคืบหน้าแบบมีชนิดได้ในขณะที่การเรียกเครื่องมือเดียวกำลังทำงานอยู่ นี่คือวิธีที่การดึงข้อมูลหรือการค้นหาที่ช้าสามารถอัปเดตร่างที่มองเห็นได้ก่อนที่เครื่องมือ จะส่งคืนผลลัพธ์สุดท้าย การอัปเดตความคืบหน้าเป็นผลลัพธ์เครื่องมือบางส่วนที่มี เนื้อหาโมเดลว่างและเมทาดาทาช่องทางสาธารณะที่ชัดเจน:
{ "content": [], "progress": { "text": "Fetching page content...", "visibility": "channel", "privacy": "public", "id": "web_fetch:fetching" }}OpenClaw จะแสดงเฉพาะ progress.text ใน UI ความคืบหน้าของช่องทาง
ผลลัพธ์เครื่องมือปกติยังคงมาถึงภายหลังเป็น content และ details และเป็น
ส่วนเดียวที่ส่งคืนให้โมเดล
เมื่อเพิ่มความคืบหน้าให้เครื่องมือ ให้ใช้ข้อความสั้นๆ ทั่วไป และหน่วงไว้จนกว่า การดำเนินการจะค้างอยู่นานพอที่จะเป็นประโยชน์:
const clearProgressTimer = scheduleToolProgress( onUpdate, { text: "Fetching page content...", id: "web_fetch:fetching" }, 5_000, { signal },); try { return await runToolWork();} finally { clearProgressTimer();}แพตเทิร์นนี้หมายความว่าการเรียกที่เร็วจะไม่แสดงบรรทัดความคืบหน้า การเรียกที่นานจะแสดงหนึ่งบรรทัด ขณะที่ยังค้างอยู่ และการเรียกที่ถูกยกเลิกจะล้างตัวจับเวลาก่อนที่ความคืบหน้าค้างเก่า จะปรากฏได้ ข้อความความคืบหน้าเป็นช่องทาง UI สาธารณะด้านข้าง จึงต้องไม่ รวมความลับ อาร์กิวเมนต์ดิบ เนื้อหาที่ดึงมา เอาต์พุตคำสั่ง หรือข้อความหน้าเว็บ
OpenClaw ใช้ตัวจัดรูปแบบเดียวกันสำหรับร่างความคืบหน้าและ /verbose:
{ agents: { defaults: { toolProgressDetail: "explain", // explain | raw }, },}"explain" เป็นค่าเริ่มต้นและทำให้ร่างคงที่ด้วยป้ายกำกับที่กระชับ เช่น
🛠️ check JS syntax for /tmp/app.js "raw" จะผนวก
คำสั่ง/รายละเอียดพื้นฐานเมื่อมี ซึ่งมีประโยชน์ขณะดีบักแต่ทำให้แชตมีเสียงรบกวนมากขึ้น
ตัวอย่างเช่น คำสั่งเดียวกันจะแสดงต่างกันขึ้นอยู่กับโหมดรายละเอียด:
| โหมด | บรรทัดความคืบหน้า |
|---|---|
explain |
🛠️ check JS syntax for /tmp/app.js |
raw |
🛠️ check JS syntax for /tmp/app.js, node --check /tmp/app.js |
จำกัดจำนวนบรรทัดที่ยังคงมองเห็นได้:
{ channels: { discord: { streaming: { mode: "progress", progress: { maxLines: 4, }, }, }, },}บรรทัดความคืบหน้าจะถูกย่อโดยอัตโนมัติเพื่อลดการจัดเรียงบับเบิลแชตใหม่ขณะที่แก้ไขร่าง
OpenClaw จะตัดบรรทัดความคืบหน้าที่ยาวโดยค่าเริ่มต้น เพื่อให้การแก้ไขร่างซ้ำๆ ไม่ ตัดบรรทัดต่างกันในทุกการอัปเดต งบประมาณต่อบรรทัดเริ่มต้นคือ 120 อักขระ ข้อความร้อยแก้วจะตัดที่ขอบเขตคำ ส่วนรายละเอียดที่ยาว เช่น พาธหรือคำสั่งดิบ จะถูกย่อด้วยจุดไข่ปลาตรงกลางเพื่อให้ยังเห็นส่วนท้ายได้
ปรับงบประมาณต่อบรรทัด:
{ channels: { discord: { streaming: { mode: "progress", progress: { maxLineChars: 160, }, }, }, },}Slack สามารถเรนเดอร์บรรทัดความคืบหน้าเป็นฟิลด์ Block Kit แบบมีโครงสร้างแทน เนื้อความข้อความเดียวได้:
{ channels: { slack: { streaming: { mode: "progress", progress: { render: "rich", }, }, }, },}การเรนเดอร์แบบ rich ยังคงมี fallback ข้อความล้วนเดิม เพื่อให้ช่องทางและไคลเอนต์ที่ ไม่รองรับรูปแบบที่สมบูรณ์กว่ายังสามารถแสดงข้อความความคืบหน้าแบบกระชับได้
คงร่างความคืบหน้าเดี่ยวไว้ แต่ซ่อนบรรทัดเครื่องมือและงาน:
{ channels: { discord: { streaming: { mode: "progress", progress: { toolProgress: false, }, }, }, },}ด้วย toolProgress: false OpenClaw ยังระงับข้อความ
ความคืบหน้าของเครื่องมือแบบเดี่ยวที่เก่ากว่าสำหรับเทิร์นนั้น ช่องทางจะยังคงเงียบทางสายตาจนถึง
คำตอบสุดท้าย ยกเว้นป้ายกำกับหากมีการกำหนดค่าไว้
พฤติกรรมของช่องทาง
แต่ละช่องทางใช้ทรานสปอร์ตที่สะอาดที่สุดที่รองรับ:
| ช่องทาง | ทรานสปอร์ตความคืบหน้า | หมายเหตุ |
|---|---|---|
| Discord | ส่งหนึ่งข้อความ แล้วแก้ไขข้อความนั้น | ข้อความสุดท้ายจะแก้ไขแทนที่เมื่อพอดีกับข้อความตัวอย่างที่ปลอดภัยหนึ่งข้อความ |
| Matrix | ส่งหนึ่งอีเวนต์ แล้วแก้ไขอีเวนต์นั้น | การกำหนดค่าสตรีมระดับบัญชีควบคุมร่างระดับบัญชี |
| Microsoft Teams | สตรีม Teams แบบเนทีฟในแชตส่วนตัว | streaming.mode: "block" แมปไปยังการส่งแบบบล็อกของ Teams |
| Slack | สตรีมเนทีฟหรือโพสต์ร่างที่แก้ไขได้ | ความพร้อมใช้งานของเธรดส่งผลต่อการใช้สตรีมมิงเนทีฟ |
| Telegram | ส่งหนึ่งข้อความ แล้วแก้ไขข้อความนั้น | ร่างที่มองเห็นเก่ากว่าอาจถูกแทนที่เพื่อให้ไทม์สแตมป์สุดท้ายยังมีประโยชน์ |
| Mattermost | โพสต์ร่างที่แก้ไขได้ | กิจกรรมเครื่องมือถูกรวมเข้าในโพสต์รูปแบบร่างเดียวกัน |
ช่องทางที่ไม่มีการรองรับการแก้ไขอย่างปลอดภัยมักจะ fallback ไปยังตัวบ่งชี้การพิมพ์หรือ การส่งเฉพาะคำตอบสุดท้าย
การจบผลลัพธ์
เมื่อคำตอบสุดท้ายพร้อม OpenClaw จะพยายามทำให้แชตสะอาด:
- หากร่างสามารถกลายเป็นคำตอบสุดท้ายได้อย่างปลอดภัย OpenClaw จะแก้ไขแทนที่
- หากช่องทางใช้สตรีมความคืบหน้าเนทีฟ OpenClaw จะจบสตรีมนั้น เมื่อทรานสปอร์ตเนทีฟยอมรับข้อความสุดท้าย
- หากคำตอบสุดท้ายมีสื่อ พรอมป์อนุมัติ เป้าหมายการตอบกลับที่ชัดเจน มีชิ้นส่วนมากเกินไป หรือแก้ไข/ส่งไม่สำเร็จ OpenClaw จะส่งคำตอบสุดท้ายผ่าน เส้นทางการส่งของช่องทางปกติ
เส้นทาง fallback เป็นความตั้งใจ ส่งคำตอบสุดท้ายใหม่ดีกว่า การทำข้อความหาย ตอบผิดเธรด หรือเขียนทับร่างด้วยเพย์โหลดที่ช่องทาง ไม่สามารถแทนค่าได้อย่างปลอดภัย
การแก้ไขปัญหา
ฉันเห็นเฉพาะคำตอบสุดท้าย
ตรวจสอบว่า channels.<channel>.streaming.mode ตั้งค่าเป็น progress สำหรับ
บัญชีหรือช่องทางที่จัดการข้อความ บางเส้นทางในกลุ่มหรือการตอบกลับแบบอ้างอิงอาจ
ปิดใช้ตัวอย่างร่างสำหรับเทิร์นหนึ่งเมื่อช่องทางไม่สามารถแก้ไขข้อความที่ถูกต้อง
ได้อย่างปลอดภัย
ฉันเห็นป้ายกำกับแต่ไม่มีบรรทัดเครื่องมือ
ตรวจสอบ streaming.progress.toolProgress หากเป็น false OpenClaw จะคง
พฤติกรรมร่างเดี่ยวไว้ แต่ซ่อนบรรทัดความคืบหน้าของเครื่องมือและงาน
ฉันเห็นข้อความสุดท้ายใหม่แทนร่างที่ถูกแก้ไข
นั่นคือ fallback เพื่อความปลอดภัย อาจเกิดขึ้นกับการตอบกลับที่มีสื่อ คำตอบยาว เป้าหมายการตอบกลับที่ชัดเจน ร่าง Telegram เก่า เป้าหมายเธรด Slack ที่หายไป ข้อความตัวอย่างที่ถูกลบ หรือการจบสตรีมเนทีฟล้มเหลว
ฉันยังเห็นข้อความความคืบหน้าแบบเดี่ยว
โหมดความคืบหน้าจะระงับข้อความความคืบหน้าของเครื่องมือแบบเดี่ยวเริ่มต้นเมื่อมีร่าง
ที่ใช้งานอยู่ หากข้อความแบบเดี่ยวยังปรากฏ ให้ตรวจสอบว่าเทิร์นกำลังใช้
โหมดความคืบหน้าจริง และไม่ใช่ streaming.mode: "off" หรือเส้นทางช่องทางที่
ไม่สามารถสร้างร่างสำหรับข้อความนั้นได้
Teams มีพฤติกรรมต่างจาก Discord หรือ Telegram
Microsoft Teams ใช้สตรีมแบบเนทีฟในแชตส่วนตัวแทนการส่งผ่านตัวอย่างแบบส่งแล้วแก้ไขทั่วไป Teams ยังถือว่า streaming.mode: "block" เป็นการส่งแบบบล็อกของ Teams เนื่องจากไม่มีโหมดบล็อกแบบร่างตัวอย่างเดียวกับที่ Discord และ Telegram ใช้