---
read_when:
    - คุณต้องการทำความเข้าใจการกำหนดเส้นทางและการแยกเซสชัน
    - คุณต้องการกำหนดขอบเขต DM สำหรับการตั้งค่าที่มีผู้ใช้หลายคน
    - คุณกำลังแก้ไขข้อบกพร่องของการรีเซ็ตเซสชันรายวันหรือเมื่อไม่มีการใช้งาน
summary: OpenClaw จัดการเซสชันการสนทนาอย่างไร
title: การจัดการเซสชัน
x-i18n:
    generated_at: "2026-07-16T18:59:48Z"
    model: gpt-5.6
    postprocess_version: locale-links-v1
    prompt_version: 32
    provider: openai
    source_hash: 8ec9e33b4d288fa12016092ab2201431631fc9cb77e6e9d4261d348d5a849f65
    source_path: concepts/session.md
    workflow: 16
---

OpenClaw กำหนดเส้นทางข้อความขาเข้าทุกข้อความไปยัง **เซสชัน** ตามแหล่งที่มา
เช่น ข้อความส่วนตัว แชตกลุ่ม งาน Cron เป็นต้น สถานะทั้งหมดของเซสชันอยู่ภายใต้การจัดการของ
**Gateway** โดยไคลเอ็นต์ UI จะสอบถามข้อมูลเซสชันจาก Gateway

## วิธีการกำหนดเส้นทางข้อความ

| แหล่งที่มา          | ลักษณะการทำงาน                  |
| --------------- | ------------------------- |
| ข้อความส่วนตัว | ใช้เซสชันร่วมกันโดยค่าเริ่มต้น |
| แชตกลุ่ม     | แยกตามแต่ละกลุ่ม        |
| ห้อง/ช่อง  | แยกตามแต่ละห้อง         |
| งาน Cron       | ใช้เซสชันใหม่ในการทำงานแต่ละครั้ง     |
| Webhook        | แยกตามแต่ละฮุก         |

## การแยกข้อความส่วนตัว

โดยค่าเริ่มต้น ข้อความส่วนตัวทั้งหมดจะใช้เซสชันเดียวกันเพื่อให้การสนทนาต่อเนื่อง ซึ่งเหมาะสำหรับ
การตั้งค่าที่มีผู้ใช้เพียงคนเดียว

<Warning>
หากมีหลายคนที่สามารถส่งข้อความถึงเอเจนต์ได้ ให้เปิดใช้การแยกข้อความส่วนตัว หากไม่เปิดใช้
ผู้ใช้ทุกคนจะใช้บริบทการสนทนาเดียวกัน ดังนั้นข้อความส่วนตัวของ Alice จะ
ปรากฏแก่ Bob
</Warning>

```json5
{
  session: {
    dmScope: "per-channel-peer", // แยกตามช่อง + ผู้ส่ง
  },
}
```

ตัวเลือก `session.dmScope`:

| ค่า                      | ลักษณะการทำงาน                                  |
| -------------------------- | ----------------------------------------- |
| `main` (ค่าเริ่มต้น)           | ข้อความส่วนตัวทั้งหมดใช้เซสชันเดียวกัน                 |
| `per-peer`                 | แยกตามผู้ส่งโดยครอบคลุมทุกช่อง        |
| `per-channel-peer`         | แยกตามช่อง + ผู้ส่ง (แนะนำ) |
| `per-account-channel-peer` | แยกตามบัญชี + ช่อง + ผู้ส่ง     |

<Tip>
หากบุคคลเดียวกันติดต่อผ่านหลายช่อง ให้ใช้
`session.identityLinks` เพื่อจับคู่ข้อมูลประจำตัวกับ ID เพียร์มาตรฐานเดียว เพื่อให้
ใช้เซสชันร่วมกัน
</Tip>

### เชื่อมต่อช่องที่ลิงก์ไว้

คำสั่งเชื่อมต่อจะย้ายเส้นทางการตอบกลับของเซสชันแชตส่วนตัวปัจจุบันไปยัง
ช่องอื่นที่ลิงก์ไว้โดยไม่เริ่มเซสชันใหม่ โปรดดูตัวอย่าง การกำหนดค่า และ
การแก้ไขปัญหาที่ [การเชื่อมต่อช่อง](/th/concepts/channel-docking)

ตรวจสอบการตั้งค่าด้วย `openclaw security audit`

## วงจรชีวิตของเซสชัน

เซสชันจะถูกนำกลับมาใช้ใหม่จนกว่าจะหมดอายุตาม `session.reset`:

- **รีเซ็ตรายวัน** (ค่าเริ่มต้น `mode: "daily"`) - เริ่มเซสชันใหม่เมื่อถึงชั่วโมงท้องถิ่น
  ที่กำหนดไว้ (`session.reset.atHour`, ค่าเริ่มต้น `4`, 0-23) บนโฮสต์ Gateway
  ความใหม่รายวันอิงจากเวลาที่ `sessionId` ปัจจุบันเริ่มต้น ไม่ใช่จากการเขียน
  เมทาดาทาในภายหลัง
- **รีเซ็ตเมื่อไม่มีการใช้งาน** (`mode: "idle"`) - เริ่มเซสชันใหม่หลังจากไม่มีการใช้งานเป็นเวลา
  `session.reset.idleMinutes` ความใหม่เมื่อไม่มีการใช้งานอิงจากการโต้ตอบจริงครั้งล่าสุดของผู้ใช้/ช่อง
  ดังนั้นเหตุการณ์ระบบ Heartbeat, Cron และ exec จะไม่ทำให้
  เซสชันยังคงใช้งานอยู่
- **รีเซ็ตด้วยตนเอง** - พิมพ์ `/new` หรือ `/reset` ในแชต นอกจากนี้ `/new <model>`
  ยังใช้เปลี่ยนโมเดลด้วย

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

เซสชันที่มีเซสชัน CLI ซึ่งอยู่ภายใต้การจัดการของผู้ให้บริการและยังทำงานอยู่ จะไม่ถูกตัดโดย
ค่าเริ่มต้นรายวันโดยนัย ใช้ `/reset` หรือกำหนดค่า `session.reset` อย่างชัดเจนเมื่อ
ต้องการให้เซสชันเหล่านั้นหมดอายุตามตัวจับเวลา

แทนที่ค่าเริ่มต้นตามประเภทแชตหรือตามช่อง:

```json5
{
  session: {
    reset: { mode: "daily", atHour: 4 },
    resetByType: {
      group: { mode: "idle", idleMinutes: 120 },
      thread: { mode: "daily", atHour: 6 },
    },
    resetByChannel: {
      discord: { mode: "idle", idleMinutes: 10080 },
    },
  },
}
```

`resetByType` รองรับ `direct` (นามแฝงแบบเดิม `dm`), `group` และ `thread`
`session.idleMinutes` ระดับบนสุดแบบเดิมยังคงทำงานเป็นนามแฝงเพื่อความเข้ากันได้สำหรับ
ค่าเริ่มต้นโหมดไม่มีการใช้งาน เมื่อไม่ได้ตั้งค่าบล็อก `session.reset`/`resetByType`

## ตำแหน่งที่จัดเก็บสถานะ

- **แถวเซสชันขณะรันไทม์:** `~/.openclaw/agents/<agentId>/agent/openclaw-agent.sqlite`
- **ไฟล์บันทึกบทสนทนาที่เก็บถาวร:** `~/.openclaw/agents/<agentId>/sessions/`
- **แหล่งข้อมูลการย้ายแถวแบบเดิม:** `~/.openclaw/agents/<agentId>/sessions/sessions.json`

แถวเซสชันในฐานข้อมูล SQLite แยกตามเอเจนต์จะเก็บการประทับเวลาของวงจรชีวิต
แยกกัน:

- `sessionStartedAt`: เวลาที่ `sessionId` ปัจจุบันเริ่มต้น การรีเซ็ตรายวันใช้ค่านี้
- `lastInteractionAt`: การโต้ตอบล่าสุดของผู้ใช้/ช่องที่ยืดอายุเมื่อไม่มีการใช้งาน
- `updatedAt`: การแก้ไขแถวในที่เก็บครั้งล่าสุด มีประโยชน์สำหรับการแสดงรายการและการล้างข้อมูล แต่ไม่ใช่
  แหล่งข้อมูลที่มีอำนาจสำหรับความใหม่ของการรีเซ็ตรายวัน/เมื่อไม่มีการใช้งาน

ระหว่างการย้ายข้อมูลจากการติดตั้งรุ่นเก่า การเริ่มต้น Gateway และ `openclaw doctor
--fix` จะนำเข้าแถว `sessions.json` แบบเดิมและประวัติบันทึกบทสนทนา JSONL ที่มีการใช้งานอยู่
ไปยัง SQLite โดยอัตโนมัติ แถวที่ไม่มี `sessionStartedAt` จะถูกแก้ไขจาก
ส่วนหัวเซสชันของบันทึกบทสนทนา JSONL แบบเดิมเมื่อมีข้อมูล หากแถวเก่าไม่มี
`lastInteractionAt` ด้วย ความใหม่เมื่อไม่มีการใช้งานจะใช้เวลาเริ่มต้นเซสชันดังกล่าวเป็นค่าทดแทน
ไม่ใช่การเขียนข้อมูลเพื่อการดูแลระบบในภายหลัง ใช้ `openclaw doctor --session-sqlite inspect
--session-sqlite-all-agents` และ [ลำดับการย้ายข้อมูลของ
Doctor](/th/cli/doctor#session-sqlite-migration) เมื่อต้องการหลักฐานการตรวจสอบ
หรือการยืนยันอย่างชัดเจน

## การบำรุงรักษาเซสชัน

OpenClaw จำกัดพื้นที่จัดเก็บเซสชันเมื่อเวลาผ่านไปผ่าน `session.maintenance` โดยมีค่าเริ่มต้น
ดังนี้:

```json5
{
  session: {
    maintenance: {
      mode: "enforce", // "enforce" ใช้การล้างข้อมูลจริง; "warn" รายงานเท่านั้น
      pruneAfter: "30d",
      maxEntries: 500,
    },
  },
}
```

สำหรับขีดจำกัด `maxEntries` ระดับการใช้งานจริง การเขียนขณะรันไทม์ของ Gateway จะใช้บัฟเฟอร์
ขีดจำกัดบนขนาดเล็ก และล้างข้อมูลแบบเป็นชุดให้ลดลงถึงขีดจำกัดที่กำหนด
การอ่านที่เก็บเซสชันจะไม่ล้างข้อมูลหรือจำกัดจำนวนรายการระหว่างการเริ่มต้น Gateway ดังนั้น
การเริ่มต้นและเซสชัน Cron แบบแยกจะไม่ต้องรับภาระการล้างที่เก็บทั้งหมด
`openclaw sessions cleanup --enforce` จะใช้ขีดจำกัดทันที

เซสชันตรวจสอบการรันโมเดลของ Gateway มีอายุสั้นโดยค่าเริ่มต้น แถวที่ตรงกับ
`agent:*:explicit:model-run-<uuid>` จะใช้ระยะเวลาเก็บรักษาคงที่ `24h` แต่การล้างข้อมูลจะ
ทำงานตามแรงกดดันเท่านั้น กล่าวคือจะลบแถวตรวจสอบที่ล้าสมัยเฉพาะเมื่อถึงแรงกดดันจาก
การบำรุงรักษา/ขีดจำกัดของรายการเซสชัน และจะทำงานก่อนเกณฑ์อายุ
ของรายการล้าสมัยทั่วไปและขีดจำกัดรายการ เซสชันส่วนตัว กลุ่ม เธรด Cron ฮุก Heartbeat
ACP และเอเจนต์ย่อยตามปกติจะไม่ใช้ระยะเวลาเก็บรักษา 24h นี้

การบำรุงรักษาจะเก็บตัวชี้การสนทนาภายนอกที่คงทนไว้ รวมถึงเซสชันกลุ่ม
และเซสชันแชตที่จำกัดขอบเขตตามเธรด ขณะเดียวกันยังคงอนุญาตให้รายการ Cron สังเคราะห์
ฮุก Heartbeat, ACP และเอเจนต์ย่อยหมดอายุได้

หากก่อนหน้านี้เคยใช้การแยกข้อความส่วนตัว แล้วภายหลังเปลี่ยน `session.dmScope` กลับเป็น
`main` ให้ดูตัวอย่างแถวข้อความส่วนตัวที่มีคีย์ตามเพียร์และล้าสมัยด้วย
`openclaw sessions cleanup --dry-run --fix-dm-scope` การใช้แฟล็กเดียวกัน
จะเลิกใช้งานแถวข้อความส่วนตัวโดยตรงเก่าเหล่านั้น และเก็บบันทึกบทสนทนาไว้เป็นคลังที่ลบแล้ว

ดูตัวอย่างการบำรุงรักษาใดๆ ด้วย `openclaw sessions cleanup --dry-run`

## การตรวจสอบเซสชัน

| คำสั่ง                    | แสดง                                           |
| -------------------------- | ----------------------------------------------- |
| `openclaw status`          | พาธของที่เก็บเซสชันและกิจกรรมล่าสุด          |
| `openclaw sessions --json` | เซสชันทั้งหมด (กรองด้วย `--active <minutes>`) |
| `/status` ในแชต          | การใช้บริบท โมเดล และตัวสลับ               |
| `/context list`            | เนื้อหาในพรอมต์ระบบ                    |

## อ่านเพิ่มเติม

- [การค้นหาเซสชัน](/th/concepts/session-search) - การเรียกคืนแบบข้อความฉบับเต็มจากบันทึกบทสนทนาในอดีต
- [การล้างเซสชัน](/th/concepts/session-pruning) - การตัดทอนผลลัพธ์ของเครื่องมือ
- [Compaction](/th/concepts/compaction) - การสรุปการสนทนาที่ยาว
- [เครื่องมือเซสชัน](/th/concepts/session-tool) - เครื่องมือเอเจนต์สำหรับการทำงานข้ามเซสชัน
- [เจาะลึกการจัดการเซสชัน](/th/reference/session-management-compaction) -
  สคีมาที่เก็บ บันทึกบทสนทนา นโยบายการส่ง เมทาดาทาต้นทาง และการกำหนดค่าขั้นสูง
- [หลายเอเจนต์](/th/concepts/multi-agent) - การกำหนดเส้นทางและการแยกเซสชันระหว่างเอเจนต์
- [งานเบื้องหลัง](/th/automation/tasks) - วิธีที่งานซึ่งแยกการทำงานสร้างระเบียนงานพร้อมข้อมูลอ้างอิงเซสชัน
- [การกำหนดเส้นทางช่อง](/th/channels/channel-routing) - วิธีที่ข้อความขาเข้าถูกกำหนดเส้นทางไปยังเซสชัน

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

- [การล้างเซสชัน](/th/concepts/session-pruning)
- [เครื่องมือเซสชัน](/th/concepts/session-tool)
- [คิวคำสั่ง](/th/concepts/queue)
