Sessions and memory

Compaction

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

วิธีทำงาน

  1. รอบบทสนทนาเก่าจะถูกสรุปเป็นรายการแบบกะทัดรัด
  2. สรุปจะถูกบันทึกในทรานสคริปต์ของเซสชัน
  3. ข้อความล่าสุดจะถูกเก็บไว้ครบถ้วน

เมื่อ OpenClaw แบ่งประวัติเป็นชิ้นส่วนสำหรับ Compaction ระบบจะเก็บการเรียกเครื่องมือของผู้ช่วยไว้คู่กับรายการ toolResult ที่ตรงกัน หากจุดแบ่งตกอยู่ภายในบล็อกเครื่องมือ OpenClaw จะเลื่อนขอบเขตเพื่อให้คู่นั้นอยู่ด้วยกัน และรักษาส่วนท้ายปัจจุบันที่ยังไม่ถูกสรุปไว้

ประวัติบทสนทนาทั้งหมดยังคงอยู่บนดิสก์ Compaction เปลี่ยนเฉพาะสิ่งที่โมเดลเห็นในรอบถัดไปเท่านั้น

Compaction อัตโนมัติ

Compaction อัตโนมัติเปิดอยู่ตามค่าเริ่มต้น ระบบจะทำงานเมื่อเซสชันใกล้ถึงขีดจำกัดบริบท หรือเมื่อโมเดลส่งข้อผิดพลาดบริบทล้นกลับมา (ในกรณีนั้น OpenClaw จะ compact แล้วลองใหม่)

คุณจะเห็น:

  • 🧹 Auto-compaction complete ในโหมด verbose
  • /status แสดง 🧹 Compactions: <count>
ลายเซ็นภาวะล้นที่รู้จัก

OpenClaw ตรวจจับบริบทล้นจากรูปแบบข้อผิดพลาดของผู้ให้บริการเหล่านี้:

  • request_too_large
  • context length exceeded
  • input exceeds the maximum number of tokens
  • input token count exceeds the maximum number of input tokens
  • input is too long for the model
  • ollama error: context length exceeded

Compaction ด้วยตนเอง

พิมพ์ /compact ในแชตใดก็ได้เพื่อบังคับทำ Compaction เพิ่มคำสั่งเพื่อชี้นำสรุป:

/compact Focus on the API design decisions

เมื่อตั้งค่า agents.defaults.compaction.keepRecentTokens แล้ว Compaction ด้วยตนเองจะเคารพจุดตัดของ Pi นั้น และเก็บส่วนท้ายล่าสุดไว้ในบริบทที่สร้างใหม่ หากไม่มีงบประมาณการเก็บรักษาที่ระบุชัดเจน Compaction ด้วยตนเองจะทำงานเหมือนจุดตรวจแบบเด็ดขาด และดำเนินต่อจากสรุปใหม่เพียงอย่างเดียว

การกำหนดค่า

กำหนดค่า Compaction ใต้ agents.defaults.compaction ใน openclaw.json ของคุณ ตัวปรับที่ใช้บ่อยที่สุดแสดงไว้ด้านล่าง สำหรับเอกสารอ้างอิงฉบับเต็ม ดู เจาะลึกการจัดการเซสชัน

การใช้โมเดลอื่น

ตามค่าเริ่มต้น Compaction ใช้โมเดลหลักของเอเจนต์ ตั้งค่า agents.defaults.compaction.model เพื่อมอบหมายการสรุปให้โมเดลที่มีความสามารถสูงกว่าหรือเฉพาะทางกว่า การ override รับสตริง provider/model-id ใดก็ได้:

{
  "agents": {
    "defaults": {
      "compaction": {
        "model": "openrouter/anthropic/claude-sonnet-4-6"
      }
    }
  }
}

สิ่งนี้ทำงานกับโมเดลภายในเครื่องได้ด้วย เช่น โมเดล Ollama ตัวที่สองที่อุทิศให้กับการสรุป:

{
  "agents": {
    "defaults": {
      "compaction": {
        "model": "ollama/llama3.1:8b"
      }
    }
  }
}

เมื่อไม่ได้ตั้งค่า Compaction จะเริ่มด้วยโมเดลเซสชันที่ใช้งานอยู่ หากการสรุปล้มเหลวด้วยข้อผิดพลาดจากผู้ให้บริการที่มีสิทธิ์ใช้โมเดลสำรอง OpenClaw จะลองความพยายาม Compaction นั้นใหม่ผ่านห่วงโซ่โมเดลสำรองที่มีอยู่ของเซสชัน ตัวเลือกสำรองเป็นแบบชั่วคราวและจะไม่ถูกเขียนกลับไปยังสถานะเซสชัน การ override agents.defaults.compaction.model ที่ระบุชัดเจนยังคงตรงตัว และไม่สืบทอดห่วงโซ่สำรองของเซสชัน

การรักษาตัวระบุ

การสรุป Compaction จะรักษาตัวระบุทึบแสงไว้ตามค่าเริ่มต้น (identifierPolicy: "strict") override ด้วย identifierPolicy: "off" เพื่อปิดใช้งาน หรือใช้ identifierPolicy: "custom" พร้อม identifierInstructions สำหรับคำแนะนำแบบกำหนดเอง

ตัวคุมไบต์ของทรานสคริปต์ที่ใช้งานอยู่

เมื่อตั้งค่า agents.defaults.compaction.maxActiveTranscriptBytes แล้ว OpenClaw จะเรียกใช้ Compaction ภายในเครื่องตามปกติก่อนการรัน หาก JSONL ที่ใช้งานอยู่มีขนาดถึงค่านั้น สิ่งนี้มีประโยชน์สำหรับเซสชันที่ทำงานยาวนาน ซึ่งการจัดการบริบทฝั่งผู้ให้บริการอาจทำให้บริบทโมเดลยังอยู่ในสภาพดี ขณะที่ทรานสคริปต์ภายในเครื่องเติบโตต่อไปเรื่อยๆ ระบบจะไม่แยกไบต์ JSONL ดิบ แต่จะขอให้ไปป์ไลน์ Compaction ปกติสร้างสรุปเชิงความหมาย

ทรานสคริปต์ตัวสืบทอด

เมื่อเปิดใช้ agents.defaults.compaction.truncateAfterCompaction OpenClaw จะไม่เขียนทับทรานสคริปต์เดิมแบบ in place แต่จะสร้างทรานสคริปต์ตัวสืบทอดที่ใช้งานอยู่ใหม่จากสรุป Compaction, สถานะที่รักษาไว้ และส่วนท้ายที่ยังไม่ถูกสรุป จากนั้นเก็บ JSONL ก่อนหน้าไว้เป็นแหล่งจุดตรวจที่ถูกเก็บถาวร ทรานสคริปต์ตัวสืบทอดยังลบรอบผู้ใช้ยาวๆ ที่ซ้ำกันแบบตรงตัวซึ่งมาถึงภายในหน้าต่างลองใหม่สั้นๆ ออกด้วย เพื่อไม่ให้พายุการลองใหม่ของช่องทางถูกพาเข้าสู่ทรานสคริปต์ที่ใช้งานอยู่ถัดไปหลัง Compaction

จุดตรวจก่อน Compaction จะถูกเก็บไว้เฉพาะขณะที่ยังต่ำกว่าขีดจำกัดขนาดจุดตรวจของ OpenClaw เท่านั้น ทรานสคริปต์ที่ใช้งานอยู่ซึ่งมีขนาดเกินยังคงถูก compact แต่ OpenClaw จะข้ามสแนปช็อต debug ขนาดใหญ่แทนการเพิ่มการใช้ดิสก์เป็นสองเท่า

การแจ้งเตือน Compaction

ตามค่าเริ่มต้น Compaction ทำงานแบบเงียบ ตั้งค่า notifyUser เพื่อแสดงข้อความสถานะสั้นๆ เมื่อ Compaction เริ่มต้นและเสร็จสิ้น:

{
  agents: {
    defaults: {
      compaction: {
        notifyUser: true,
      },
    },
  },
}

การ flush หน่วยความจำ

ก่อน Compaction OpenClaw สามารถรันรอบ silent memory flush เพื่อเก็บโน้ตที่คงทนลงดิสก์ ตั้งค่า agents.defaults.compaction.memoryFlush.model เมื่อรอบดูแลระบบนี้ควรใช้โมเดลภายในเครื่องแทนโมเดลบทสนทนาที่ใช้งานอยู่:

{
  "agents": {
    "defaults": {
      "compaction": {
        "memoryFlush": {
          "model": "ollama/qwen3:8b"
        }
      }
    }
  }
}

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

ผู้ให้บริการ Compaction แบบเสียบเปลี่ยนได้

Plugins สามารถลงทะเบียนผู้ให้บริการ Compaction แบบกำหนดเองผ่าน registerCompactionProvider() บน API ของ Plugin เมื่อมีการลงทะเบียนและกำหนดค่าผู้ให้บริการแล้ว OpenClaw จะมอบหมายการสรุปให้ผู้ให้บริการนั้นแทนไปป์ไลน์ LLM ในตัว

หากต้องการใช้ผู้ให้บริการที่ลงทะเบียนแล้ว ให้ตั้งค่า id ของผู้ให้บริการนั้นในคอนฟิกของคุณ:

{
  "agents": {
    "defaults": {
      "compaction": {
        "provider": "my-provider"
      }
    }
  }
}

การตั้งค่า provider จะบังคับ mode: "safeguard" โดยอัตโนมัติ ผู้ให้บริการจะได้รับคำสั่ง Compaction และนโยบายการรักษาตัวระบุเดียวกับเส้นทางในตัว และ OpenClaw ยังคงรักษาบริบทส่วนต่อท้ายของรอบล่าสุดและรอบที่ถูกแบ่งหลังผลลัพธ์จากผู้ให้บริการ

Compaction เทียบกับการตัดทอน

Compaction การตัดทอน
ทำอะไร สรุปบทสนทนาเก่า ตัดผลลัพธ์เครื่องมือเก่า
ถูกบันทึกไหม? ใช่ (ในทรานสคริปต์เซสชัน) ไม่ (เฉพาะในหน่วยความจำ ต่อคำขอ)
ขอบเขต บทสนทนาทั้งหมด เฉพาะผลลัพธ์เครื่องมือ

การตัดทอนเซสชัน เป็นส่วนเสริมที่เบากว่า ซึ่งตัดเอาต์พุตเครื่องมือโดยไม่ต้องสรุป

การแก้ไขปัญหา

compact บ่อยเกินไปหรือไม่? หน้าต่างบริบทของโมเดลอาจเล็ก หรือเอาต์พุตเครื่องมืออาจมีขนาดใหญ่ ลองเปิดใช้ การตัดทอนเซสชัน

บริบทดูเก่าหลัง Compaction หรือไม่? ใช้ /compact Focus on <topic> เพื่อชี้นำสรุป หรือเปิดใช้ memory flush เพื่อให้โน้ตยังคงอยู่

ต้องการเริ่มใหม่ทั้งหมดหรือไม่? /new เริ่มเซสชันใหม่โดยไม่ทำ Compaction

สำหรับการกำหนดค่าขั้นสูง (โทเค็นสำรอง การรักษาตัวระบุ เครื่องมือบริบทแบบกำหนดเอง Compaction ฝั่งเซิร์ฟเวอร์ OpenAI) ดู เจาะลึกการจัดการเซสชัน

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

  • เซสชัน: การจัดการเซสชันและวงจรชีวิต
  • การตัดทอนเซสชัน: การตัดผลลัพธ์เครื่องมือ
  • บริบท: วิธีสร้างบริบทสำหรับรอบของเอเจนต์
  • Hooks: hook วงจรชีวิตของ Compaction (before_compaction, after_compaction)