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 — วิธีที่ข้อความขาเข้าถูกกำหนดเส้นทางไปยังเซสชัน

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