---
read_when:
    - การกำหนดค่าการอัปเดตความคืบหน้าที่มองเห็นได้สำหรับรอบแชทที่ใช้เวลานาน
    - การเลือกระหว่างโหมดสตรีมมิงแบบบางส่วน แบบบล็อก และแบบความคืบหน้า
    - อธิบายวิธีที่ OpenClaw อัปเดตข้อความช่องทางหนึ่งขณะที่งานกำลังดำเนินอยู่
    - การแก้ไขปัญหาร่างความคืบหน้า ข้อความความคืบหน้าแบบสแตนด์อโลน หรือ fallback การสรุปขั้นสุดท้าย
summary: 'ร่างความคืบหน้า: ข้อความงานระหว่างทำที่มองเห็นได้หนึ่งรายการ ซึ่งอัปเดตขณะเอเจนต์ทำงาน'
title: ฉบับร่างความคืบหน้า
x-i18n:
    generated_at: "2026-06-27T17:29:20Z"
    model: gpt-5.5
    postprocess_version: locale-links-v1
    provider: openai
    source_hash: 7cc005ed39c2a4a6d887748c769c9d2bb9c133aeeda87b2c11bfe5360f364fdd
    source_path: concepts/progress-drafts.md
    workflow: 16
---

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

เมื่อเปิดใช้ร่างความคืบหน้า 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
Working
Shelling
Scuttling
Clawing
Pinching
Molting
Bubbling
Tiding
Reefing
Cracking
Sifting
Brining
Nautiling
Krilling
Barnacling
Lobstering
Tidepooling
Pearling
Snapping
Surfacing
```

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

```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 ใช้

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

- [การสตรีมและการแบ่งชิ้น](/th/concepts/streaming)
- [ข้อความ](/th/concepts/messages)
- [การกำหนดค่าช่องทาง](/th/gateway/config-channels)
- [Discord](/th/channels/discord)
- [Matrix](/th/channels/matrix)
- [Microsoft Teams](/th/channels/msteams)
- [Slack](/th/channels/slack)
- [Telegram](/th/channels/telegram)
