Sessions and memory
การจัดการเซสชัน
OpenClaw จัดระเบียบการสนทนาเป็น เซสชัน ข้อความแต่ละรายการจะถูกกำหนดเส้นทางไปยังเซสชันตามแหล่งที่มา เช่น DM, แชตกลุ่ม, งาน Cron เป็นต้น
วิธีการกำหนดเส้นทางข้อความ
| แหล่งที่มา | พฤติกรรม |
|---|---|
| ข้อความโดยตรง | ใช้เซสชันร่วมกันโดยค่าเริ่มต้น |
| แชตกลุ่ม | แยกตามแต่ละกลุ่ม |
| ห้อง/ช่อง | แยกตามแต่ละห้อง |
| งาน Cron | เซสชันใหม่ต่อการรันแต่ละครั้ง |
| Webhooks | แยกตามแต่ละ hook |
การแยก DM
โดยค่าเริ่มต้น DM ทั้งหมดจะใช้เซสชันเดียวร่วมกันเพื่อความต่อเนื่อง วิธีนี้เหมาะสำหรับการตั้งค่าแบบผู้ใช้คนเดียว
วิธีแก้:
{
session: {
dmScope: "per-channel-peer", // isolate by channel + sender
},
}
ตัวเลือกอื่น:
main(ค่าเริ่มต้น) -- DM ทั้งหมดใช้เซสชันเดียวร่วมกันper-peer-- แยกตามผู้ส่ง (ข้ามช่อง)per-channel-peer-- แยกตามช่อง + ผู้ส่ง (แนะนำ)per-account-channel-peer-- แยกตามบัญชี + ช่อง + ผู้ส่ง
ช่องที่ dock แล้ว
คำสั่ง Dock อนุญาตให้ผู้ใช้ย้ายเส้นทางตอบกลับของเซสชันแชตโดยตรงปัจจุบันไปยังช่องอื่นที่เชื่อมโยงไว้ได้โดยไม่ต้องเริ่มเซสชันใหม่ ดูตัวอย่าง การกำหนดค่า และการแก้ไขปัญหาได้ที่ การ dock ช่อง
ตรวจสอบการตั้งค่าของคุณด้วย openclaw security audit
วงจรชีวิตของเซสชัน
เซสชันจะถูกนำกลับมาใช้ซ้ำจนกว่าจะหมดอายุ:
- รีเซ็ตรายวัน (ค่าเริ่มต้น) -- เซสชันใหม่เวลา 4:00 AM ตามเวลาท้องถิ่นบนโฮสต์ Gateway ความสดใหม่รายวันอิงจากเวลาที่
sessionIdปัจจุบันเริ่มต้น ไม่ใช่จากการเขียน metadata ภายหลัง - รีเซ็ตเมื่อว่าง (ไม่บังคับ) -- เซสชันใหม่หลังจากไม่มีการใช้งานเป็นระยะเวลาหนึ่ง ตั้งค่า
session.reset.idleMinutesความสดใหม่เมื่อว่างอิงจากการโต้ตอบจริงล่าสุดของผู้ใช้/ช่อง ดังนั้นเหตุการณ์ระบบอย่าง Heartbeat, Cron และ exec จะไม่ทำให้เซสชันยังคงอยู่ - รีเซ็ตด้วยตนเอง -- พิมพ์
/newหรือ/resetในแชต/new <model>จะสลับ model ด้วย
เมื่อกำหนดค่าทั้งการรีเซ็ตรายวันและการรีเซ็ตเมื่อว่าง รายการที่หมดอายุก่อนจะมีผล Heartbeat, Cron, exec และเทิร์นเหตุการณ์ระบบอื่นๆ อาจเขียน metadata ของเซสชันได้ แต่การเขียนเหล่านั้นจะไม่ยืดความสดใหม่ของการรีเซ็ตรายวันหรือการรีเซ็ตเมื่อว่าง เมื่อการรีเซ็ตเปลี่ยนเซสชัน การแจ้งเหตุการณ์ระบบที่อยู่ในคิวสำหรับเซสชันเก่าจะถูกทิ้ง เพื่อไม่ให้อัปเดตพื้นหลังที่ล้าสมัยถูกนำหน้า prompt แรกในเซสชันใหม่
เซสชันที่มีเซสชัน CLI ที่ provider เป็นเจ้าของซึ่งยังใช้งานอยู่จะไม่ถูกตัดโดยค่าเริ่มต้นรายวันแบบ implicit ใช้ /reset หรือกำหนดค่า session.reset อย่างชัดเจนเมื่อควรให้เซสชันเหล่านั้นหมดอายุตามเวลา
ตำแหน่งที่เก็บสถานะ
สถานะเซสชันทั้งหมดเป็นของ Gateway ไคลเอ็นต์ UI จะ query Gateway เพื่อขอข้อมูลเซสชัน
- Store:
~/.openclaw/agents/<agentId>/sessions/sessions.json - Transcripts:
~/.openclaw/agents/<agentId>/sessions/<sessionId>.jsonl
sessions.json เก็บ timestamp ของวงจรชีวิตแยกกัน:
sessionStartedAt: เวลาที่sessionIdปัจจุบันเริ่มต้น การรีเซ็ตรายวันใช้ค่านี้lastInteractionAt: การโต้ตอบล่าสุดของผู้ใช้/ช่องที่ยืดอายุเมื่อว่างupdatedAt: การเปลี่ยนแปลงแถวของ store ล่าสุด มีประโยชน์สำหรับการแสดงรายการและ pruning แต่ไม่ใช่แหล่งอ้างอิงที่มีอำนาจสำหรับความสดใหม่ของการรีเซ็ตรายวัน/เมื่อว่าง
แถวเก่าที่ไม่มี sessionStartedAt จะถูกแก้จาก header เซสชันใน transcript JSONL เมื่อมี หากแถวเก่ายังไม่มี lastInteractionAt ด้วย ความสดใหม่เมื่อว่างจะ fallback ไปยังเวลาเริ่มต้นเซสชันนั้น ไม่ใช่การเขียน bookkeeping ภายหลัง
การบำรุงรักษาเซสชัน
OpenClaw จำกัดขนาดพื้นที่จัดเก็บเซสชันโดยอัตโนมัติตามเวลา โดยค่าเริ่มต้นจะทำงานในโหมด warn (รายงานสิ่งที่จะถูกล้าง) ตั้งค่า session.maintenance.mode เป็น "enforce" สำหรับการล้างอัตโนมัติ:
{
session: {
maintenance: {
mode: "enforce",
pruneAfter: "30d",
maxEntries: 500,
},
},
}
สำหรับขีดจำกัด maxEntries ระดับ production การเขียนของ runtime Gateway จะใช้บัฟเฟอร์ high-water ขนาดเล็กและล้างกลับลงไปถึง cap ที่กำหนดค่าไว้เป็น batch การอ่าน session store จะไม่ prune หรือ cap รายการระหว่างการเริ่มต้น Gateway วิธีนี้หลีกเลี่ยงการรันการล้าง store แบบเต็มทุกครั้งที่เริ่มต้นหรือมีเซสชัน Cron แบบแยก openclaw sessions cleanup --enforce จะใช้ cap ทันที
การบำรุงรักษาจะรักษา pointer การสนทนาภายนอกที่คงทน รวมถึงเซสชันกลุ่มและเซสชันแชตที่มีขอบเขตตาม thread ขณะเดียวกันยังอนุญาตให้รายการ Cron, hook, Heartbeat, ACP และ sub-agent แบบสังเคราะห์หมดอายุได้
หากคุณเคยใช้การแยกข้อความโดยตรงมาก่อน แล้วภายหลังเปลี่ยน session.dmScope กลับเป็น main ให้ preview แถว DM ที่ keyed ตาม peer ซึ่งล้าสมัยด้วย openclaw sessions cleanup --dry-run --fix-dm-scope การใช้ flag เดียวกันจะเลิกใช้แถว direct-DM เก่าเหล่านั้นและเก็บ transcript ของแถวเหล่านั้นไว้เป็น archive ที่ถูกลบ
Preview ด้วย openclaw sessions cleanup --dry-run
การตรวจสอบเซสชัน
openclaw status-- path ของ session store และกิจกรรมล่าสุดopenclaw sessions --json-- เซสชันทั้งหมด (กรองด้วย--active <minutes>)/statusในแชต -- การใช้บริบท, model และ toggle/context list-- สิ่งที่อยู่ใน system prompt
อ่านเพิ่มเติม
- Session Pruning -- การตัดผลลัพธ์ของเครื่องมือ
- Compaction -- การสรุปบทสนทนายาว
- Session Tools -- เครื่องมือ agent สำหรับงานข้ามเซสชัน
- Session Management Deep Dive -- schema ของ store, transcript, policy การส่ง, metadata ต้นทาง และการกำหนดค่าขั้นสูง
- Multi-Agent — การกำหนดเส้นทางและการแยกเซสชันข้าม agent
- Background Tasks — วิธีที่งานแบบ detached สร้างบันทึก task พร้อมการอ้างอิงเซสชัน
- Channel Routing — วิธีที่ข้อความขาเข้าถูกกำหนดเส้นทางไปยังเซสชัน