Sessions and memory
การจัดการเซสชัน
OpenClaw กำหนดเส้นทางข้อความขาเข้าทุกข้อความไปยัง เซสชัน ตามแหล่งที่มา เช่น DM, แชตกลุ่ม, งาน Cron เป็นต้น สถานะทั้งหมดของเซสชันอยู่ภายใต้การดูแลของ Gateway โดยไคลเอ็นต์ UI จะสอบถามข้อมูลเซสชันจาก Gateway
สำหรับค่าเริ่มต้นของเอเจนต์ส่วนตัว ซึ่งเป็นบทสนทนาต่อเนื่องหนึ่งรายการที่ใช้ร่วมกันในทุก ช่องทาง DM โดยมีกิจกรรมกลุ่มและงานเบื้องหลังไหลเข้ามารวมกัน โปรดดู เซสชันหลัก
วิธีกำหนดเส้นทางข้อความ
| แหล่งที่มา | ลักษณะการทำงาน |
|---|---|
| ข้อความโดยตรง | ใช้เซสชันร่วมกันโดยค่าเริ่มต้น |
| แชตกลุ่ม | แยกตามแต่ละกลุ่ม |
| ห้อง/ช่องทาง | แยกตามแต่ละห้อง |
| งาน Cron | ใช้เซสชันใหม่ในการทำงานแต่ละครั้ง |
| Webhook | แยกตามแต่ละฮุก |
การแยก DM
โดยค่าเริ่มต้น DM ทั้งหมดใช้เซสชันเดียวกันเพื่อให้บทสนทนาต่อเนื่อง ซึ่งเหมาะสำหรับ การตั้งค่าที่มีผู้ใช้คนเดียว
{ session: { dmScope: "per-channel-peer", // แยกตามช่องทาง + ผู้ส่ง },}ตัวเลือก session.dmScope:
| ค่า | ลักษณะการทำงาน |
|---|---|
main (ค่าเริ่มต้น) |
DM ทั้งหมดใช้เซสชันหลักร่วมกัน |
per-peer |
แยกตามผู้ส่งโดยครอบคลุมทุกช่องทาง |
per-channel-peer |
แยกตามช่องทาง + ผู้ส่ง (แนะนำ) |
per-account-channel-peer |
แยกตามบัญชี + ช่องทาง + ผู้ส่ง |
การเชื่อมโยงช่องทางด้วย Dock
คำสั่ง Dock จะย้ายเส้นทางตอบกลับของเซสชันแชตโดยตรงปัจจุบันไปยัง ช่องทางอื่นที่เชื่อมโยงอยู่โดยไม่เริ่มเซสชันใหม่ โปรดดูตัวอย่าง การกำหนดค่า และ การแก้ไขปัญหาที่การเชื่อมโยงช่องทาง
ตรวจสอบการตั้งค่าด้วย openclaw security audit
จดจำข้ามบทสนทนา
ทรานสคริปต์ที่แยกจากกันจะควบคุมประวัติภายในของแต่ละบทสนทนา สำหรับเอเจนต์ส่วนตัว
หรือเอเจนต์ที่เชื่อถืออย่างเต็มที่ memorySearch.rememberAcrossConversations: true
จะเพิ่มขั้นตอนเรียกคืนข้อมูลแบบไม่บังคับจากบทสนทนาส่วนตัวอื่นของเอเจนต์นั้น
โดยไม่รวมทรานสคริปต์เข้าด้วยกัน
บทสนทนาโดยตรงแบบส่วนตัวและบทสนทนา UI ที่ระบุอย่างชัดเจนและคงอยู่ถาวรสามารถส่ง บริบทที่เกี่ยวข้องให้กันได้ กลุ่มและช่องทางยังคงแยกจากกันในทั้งสองทิศทาง: ทรานสคริปต์ของกลุ่มและช่องทางจะไม่เป็นแหล่งเรียกคืนข้อมูลส่วนตัว และการตอบกลับใน บทสนทนาเหล่านั้นจะไม่ได้รับบริบทจากทรานสคริปต์ส่วนตัว บทสนทนาปัจจุบัน จะถูกยกเว้นเช่นกันเนื่องจากโหลดประวัติไว้แล้ว
การตั้งค่านี้ไม่เปลี่ยนคีย์เซสชัน ขอบเขต DM การกำหนดเส้นทาง การนำส่ง หรือ
tools.sessions.visibility หน่วยความจำพื้นที่ทำงานที่ใช้ร่วมกันใน MEMORY.md และ
memory/*.md ยังคงทำงานเหมือนเดิม ผู้ให้บริการหน่วยความจำปัจจุบัน
ต้องรองรับการเรียกคืนทรานสคริปต์ส่วนตัวที่มีการป้องกัน ส่วนเอนจินบริบท เช่น
Lossless Claw ยังคงทำงานอย่างเป็นอิสระและสามารถทำงานควบคู่กันได้ โปรดดู
รายละเอียดการตั้งค่าและรันไทม์ที่
Active Memory
วงจรชีวิตของเซสชัน
เซสชันจะถูกนำกลับมาใช้จนกว่าจะรีเซ็ตด้วยตนเองหรือเลือกใช้นโยบายรีเซ็ตอัตโนมัติ:
- ไม่รีเซ็ตอัตโนมัติ (ค่าเริ่มต้น
mode: "none") - เซสชันจะคงsessionIdเดิมไว้ โดย Compaction จะจัดการบริบทที่ใช้งานอยู่เมื่อบทสนทนายาวขึ้น - รีเซ็ตรายวัน (
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 อย่างชัดเจนเมื่อเซสชันเหล่านั้น
ควรหมดอายุตามตัวจับเวลา
เลือกใช้การรีเซ็ตอัตโนมัติแบบส่วนกลาง แล้วแทนที่ค่าตามประเภทแชตหรือช่องทาง:
{ 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
เมื่อต้องการหลักฐานการตรวจสอบหรือ
การยืนยันอย่างชัดเจน
การบำรุงรักษาเซสชัน
OpenClaw จำกัดพื้นที่จัดเก็บเซสชันเมื่อเวลาผ่านไปผ่าน session.maintenance โดยมีค่าเริ่มต้น
ดังนี้:
{ 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 และเอเจนต์ย่อยหมดอายุได้
หากก่อนหน้านี้ใช้การแยก DM และภายหลังเปลี่ยน session.dmScope กลับเป็น
main ให้ดูตัวอย่างแถว DM ที่มีคีย์ตามเพียร์และล้าสมัยด้วย
openclaw sessions cleanup --dry-run --fix-dm-scope การใช้แฟล็กเดียวกัน
จะเลิกใช้งานแถว DM โดยตรงเก่าเหล่านั้นและเก็บทรานสคริปต์ไว้เป็นไฟล์เก็บถาวร
ที่ถูกลบ
ดูตัวอย่างการบำรุงรักษาใด ๆ ด้วย openclaw sessions cleanup --dry-run
การตรวจสอบเซสชัน
| คำสั่ง | แสดง |
|---|---|
openclaw status |
พาธที่เก็บเซสชันและกิจกรรมล่าสุด |
openclaw sessions --json |
เซสชันทั้งหมด (กรองด้วย --active <minutes>) |
/status ในแชต |
การใช้บริบท โมเดล และตัวเลือกเปิด/ปิด |
/context list |
สิ่งที่อยู่ในพรอมต์ระบบ |
อ่านเพิ่มเติม
- การค้นหาเซสชัน - การเรียกคืนแบบเต็มข้อความจากทรานสคริปต์ที่ผ่านมา
- การล้างข้อมูลเซสชัน - การตัดผลลัพธ์จากเครื่องมือ
- Compaction - การสรุปบทสนทนาที่ยาว
- เครื่องมือเซสชัน - เครื่องมือเอเจนต์สำหรับการทำงานข้ามเซสชัน
- เจาะลึกการจัดการเซสชัน - สคีมาที่เก็บ ทรานสคริปต์ นโยบายการส่ง เมทาดาทาต้นทาง และการกำหนดค่าขั้นสูง
- หลายเอเจนต์ - การกำหนดเส้นทางและการแยกเซสชันระหว่างเอเจนต์
- งานเบื้องหลัง - วิธีที่งานซึ่งแยกออกมาสร้างระเบียนงานพร้อมการอ้างอิงเซสชัน
- การกำหนดเส้นทางช่องทาง - วิธีกำหนดเส้นทางข้อความขาเข้าไปยังเซสชัน