Messages and delivery

ฉบับร่างความคืบหน้า

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

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

text
Shelling...📖 from docs/concepts/progress-drafts.md🔎 Web Search: for "discord edit message"🛠️ Bash: run tests

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

เริ่มต้นอย่างรวดเร็ว

เปิดใช้ร่างความคืบหน้าต่อช่องทางด้วย streaming.mode: "progress":

json5
{  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:

text
WorkingShellingScuttlingClawingPinchingMoltingBubblingTidingReefingCrackingSiftingBriningNautilingKrillingBarnaclingLobsteringTidepoolingPearlingSnappingSurfacing

ใช้ป้ายกำกับคงที่:

json5
{  channels: {    discord: {      streaming: {        mode: "progress",        progress: {          label: "Investigating",        },      },    },  },}

ใช้พูลป้ายกำกับอัตโนมัติของคุณเอง:

json5
{  channels: {    discord: {      streaming: {        mode: "progress",        progress: {          label: "auto",          labels: ["Checking", "Reading", "Testing", "Finishing"],        },      },    },  },}

ซ่อนป้ายกำกับและแสดงเฉพาะบรรทัดความคืบหน้า:

json5
{  channels: {    discord: {      streaming: {        mode: "progress",        progress: {          label: false,        },      },    },  },}

ควบคุมบรรทัดความคืบหน้า

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

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

json
{  "content": [],  "progress": {    "text": "Fetching page content...",    "visibility": "channel",    "privacy": "public",    "id": "web_fetch:fetching"  }}

OpenClaw จะแสดงเฉพาะ progress.text ใน UI ความคืบหน้าของช่องทาง ผลลัพธ์เครื่องมือปกติยังคงมาถึงภายหลังเป็น content และ details และเป็น ส่วนเดียวที่ส่งคืนให้โมเดล

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

typescript
const clearProgressTimer = scheduleToolProgress(  onUpdate,  { text: "Fetching page content...", id: "web_fetch:fetching" },  5_000,  { signal },); try {  return await runToolWork();} finally {  clearProgressTimer();}

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

OpenClaw ใช้ตัวจัดรูปแบบเดียวกันสำหรับร่างความคืบหน้าและ /verbose:

json5
{  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

จำกัดจำนวนบรรทัดที่ยังคงมองเห็นได้:

json5
{  channels: {    discord: {      streaming: {        mode: "progress",        progress: {          maxLines: 4,        },      },    },  },}

บรรทัดความคืบหน้าจะถูกย่อโดยอัตโนมัติเพื่อลดการจัดเรียงบับเบิลแชตใหม่ขณะที่แก้ไขร่าง

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

ปรับงบประมาณต่อบรรทัด:

json5
{  channels: {    discord: {      streaming: {        mode: "progress",        progress: {          maxLineChars: 160,        },      },    },  },}

Slack สามารถเรนเดอร์บรรทัดความคืบหน้าเป็นฟิลด์ Block Kit แบบมีโครงสร้างแทน เนื้อความข้อความเดียวได้:

json5
{  channels: {    slack: {      streaming: {        mode: "progress",        progress: {          render: "rich",        },      },    },  },}

การเรนเดอร์แบบ rich ยังคงมี fallback ข้อความล้วนเดิม เพื่อให้ช่องทางและไคลเอนต์ที่ ไม่รองรับรูปแบบที่สมบูรณ์กว่ายังสามารถแสดงข้อความความคืบหน้าแบบกระชับได้

คงร่างความคืบหน้าเดี่ยวไว้ แต่ซ่อนบรรทัดเครื่องมือและงาน:

json5
{  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 ใช้

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

Was this useful?
On this page

On this page