Manajemen Sesi & Compaction (Pendalaman)
Dokumen ini menjelaskan bagaimana OpenClaw mengelola sesi secara end-to-end:- Perutean sesi (bagaimana pesan masuk dipetakan ke
sessionKey) - Penyimpanan sesi (
sessions.json) dan apa yang dilacak - Persistensi transkrip (
*.jsonl) dan strukturnya - Higiene transkrip (perbaikan khusus provider sebelum run)
- Batas konteks (jendela konteks vs token yang dilacak)
- Compaction (pemadatan manual + otomatis) dan tempat mengaitkan pekerjaan pra-pemadatan
- Housekeeping senyap (misalnya penulisan memory yang tidak boleh menghasilkan output yang terlihat pengguna)
- /concepts/session
- /concepts/compaction
- /concepts/memory
- /concepts/memory-search
- /concepts/session-pruning
- /reference/transcript-hygiene
Sumber kebenaran: Gateway
OpenClaw dirancang di sekitar satu proses Gateway yang memiliki status sesi.- UI (aplikasi macOS, UI Control web, TUI) harus menanyakan Gateway untuk daftar sesi dan jumlah token.
- Dalam mode remote, file sesi berada di host remote; “memeriksa file Mac lokal Anda” tidak akan mencerminkan apa yang digunakan Gateway.
Dua lapisan persistensi
OpenClaw mempersistensi sesi dalam dua lapisan:-
Penyimpanan sesi (
sessions.json)- Peta key/value:
sessionKey -> SessionEntry - Kecil, dapat diubah, aman untuk diedit (atau entri dihapus)
- Melacak metadata sesi (id sesi saat ini, aktivitas terakhir, toggle, penghitung token, dll.)
- Peta key/value:
-
Transkrip (
<sessionId>.jsonl)- Transkrip append-only dengan struktur pohon (entri memiliki
id+parentId) - Menyimpan percakapan sebenarnya + pemanggilan tool + ringkasan pemadatan
- Digunakan untuk membangun ulang konteks model untuk giliran berikutnya
- Transkrip append-only dengan struktur pohon (entri memiliki
Lokasi di disk
Per agen, pada host Gateway:- Penyimpanan:
~/.openclaw/agents/<agentId>/sessions/sessions.json - Transkrip:
~/.openclaw/agents/<agentId>/sessions/<sessionId>.jsonl- Sesi topik Telegram:
.../<sessionId>-topic-<threadId>.jsonl
- Sesi topik Telegram:
src/config/sessions.ts.
Pemeliharaan penyimpanan dan kontrol disk
Persistensi sesi memiliki kontrol pemeliharaan otomatis (session.maintenance) untuk sessions.json dan artefak transkrip:
mode:warn(default) atauenforcepruneAfter: batas usia entri basi (default30d)maxEntries: batas jumlah entri dalamsessions.json(default500)rotateBytes: rotasisessions.jsonsaat ukurannya terlalu besar (default10mb)resetArchiveRetention: retensi untuk arsip transkrip*.reset.<timestamp>(default: sama denganpruneAfter;falsemenonaktifkan pembersihan)maxDiskBytes: anggaran opsional untuk direktori sesihighWaterBytes: target opsional setelah pembersihan (default80%darimaxDiskBytes)
mode: "enforce"):
- Hapus terlebih dahulu artefak transkrip yang diarsipkan atau yatim tertua.
- Jika masih di atas target, keluarkan entri sesi tertua dan file transkripnya.
- Lanjutkan hingga penggunaan berada pada atau di bawah
highWaterBytes.
mode: "warn", OpenClaw melaporkan potensi pengeluaran tetapi tidak mengubah penyimpanan/file.
Jalankan pemeliharaan sesuai permintaan:
Sesi cron dan log run
Run cron terisolasi juga membuat entri/transkrip sesi, dan memiliki kontrol retensi khusus:cron.sessionRetention(default24h) memangkas sesi run cron terisolasi lama dari penyimpanan sesi (falsemenonaktifkan).cron.runLog.maxBytes+cron.runLog.keepLinesmemangkas file~/.openclaw/cron/runs/<jobId>.jsonl(default:2_000_000byte dan2000baris).
Kunci sesi (sessionKey)
sessionKey mengidentifikasi bucket percakapan mana yang sedang Anda gunakan (perutean + isolasi).
Pola umum:
- Chat utama/langsung (per agen):
agent:<agentId>:<mainKey>(defaultmain) - Grup:
agent:<agentId>:<channel>:group:<id> - Ruang/channel (Discord/Slack):
agent:<agentId>:<channel>:channel:<id>atau...:room:<id> - Cron:
cron:<job.id> - Webhook:
hook:<uuid>(kecuali dioverride)
Id sesi (sessionId)
Setiap sessionKey menunjuk ke sessionId saat ini (file transkrip yang melanjutkan percakapan).
Aturan praktis:
- Reset (
/new,/reset) membuatsessionIdbaru untuksessionKeytersebut. - Reset harian (default pukul 4:00 pagi waktu lokal di host gateway) membuat
sessionIdbaru pada pesan berikutnya setelah batas reset. - Kedaluwarsa idle (
session.reset.idleMinutesatausession.idleMinuteslama) membuatsessionIdbaru saat pesan tiba setelah jendela idle. Saat harian + idle sama-sama dikonfigurasi, yang lebih dulu kedaluwarsa akan menang. - Guard fork induk thread (
session.parentForkMaxTokens, default100000) melewati fork transkrip induk saat sesi induk sudah terlalu besar; thread baru dimulai dari awal. Setel0untuk menonaktifkan.
initSessionState() dalam src/auto-reply/reply/session.ts.
Skema penyimpanan sesi (sessions.json)
Tipe nilai penyimpanan adalah SessionEntry dalam src/config/sessions.ts.
Field penting (tidak lengkap):
sessionId: id transkrip saat ini (nama file diturunkan dari ini kecualisessionFiledisetel)updatedAt: stempel waktu aktivitas terakhirsessionFile: override jalur transkrip eksplisit opsionalchatType:direct | group | room(membantu UI dan kebijakan pengiriman)provider,subject,room,space,displayName: metadata untuk pelabelan grup/channel- Toggle:
thinkingLevel,verboseLevel,reasoningLevel,elevatedLevelsendPolicy(override per sesi)
- Pemilihan model:
providerOverride,modelOverride,authProfileOverride
- Penghitung token (best-effort / bergantung provider):
inputTokens,outputTokens,totalTokens,contextTokens
compactionCount: seberapa sering pemadatan otomatis selesai untuk kunci sesi inimemoryFlushAt: stempel waktu untuk memory flush pra-pemadatan terakhirmemoryFlushCompactionCount: jumlah pemadatan saat flush terakhir berjalan
Struktur transkrip (*.jsonl)
Transkrip dikelola oleh @mariozechner/pi-coding-agent melalui SessionManager.
File ini berbentuk JSONL:
- Baris pertama: header sesi (
type: "session", menyertakanid,cwd,timestamp,parentSessionopsional) - Lalu: entri sesi dengan
id+parentId(pohon)
message: pesan user/asisten/toolResultcustom_message: pesan yang diinjeksi extension yang memang masuk ke konteks model (dapat disembunyikan dari UI)custom: status extension yang tidak masuk ke konteks modelcompaction: ringkasan pemadatan yang dipersistensikan denganfirstKeptEntryIddantokensBeforebranch_summary: ringkasan yang dipersistensikan saat menavigasi cabang pohon
SessionManager untuk membacanya/menulisnya.
Jendela konteks vs token yang dilacak
Dua konsep berbeda penting di sini:- Jendela konteks model: batas keras per model (token yang terlihat oleh model)
- Penghitung penyimpanan sesi: statistik bergulir yang ditulis ke
sessions.json(digunakan untuk /status dan dashboard)
- Jendela konteks berasal dari katalog model (dan dapat dioverride melalui konfigurasi).
contextTokensdalam penyimpanan adalah nilai estimasi/pelaporan runtime; jangan anggap sebagai jaminan yang ketat.
Compaction: apa itu
Compaction merangkum percakapan lama menjadi entricompaction yang dipersistensikan dalam transkrip dan menjaga pesan terbaru tetap utuh.
Setelah pemadatan, giliran berikutnya akan melihat:
- Ringkasan pemadatan
- Pesan setelah
firstKeptEntryId
Batas potongan pemadatan dan pemasangan tool
Saat OpenClaw membagi transkrip panjang menjadi potongan pemadatan, OpenClaw menjaga pemanggilan tool oleh asisten tetap dipasangkan dengan entritoolResult yang sesuai.
- Jika pemisahan berdasarkan proporsi token jatuh di antara pemanggilan tool dan hasilnya, OpenClaw menggeser batas ke pesan pemanggilan tool asisten alih-alih memisahkan pasangan tersebut.
- Jika blok tool-result di bagian akhir sebaliknya akan mendorong potongan melampaui target, OpenClaw mempertahankan blok tool tertunda tersebut dan menjaga ekor yang belum diringkas tetap utuh.
- Blok pemanggilan tool yang dibatalkan/error tidak akan menahan split tertunda tetap terbuka.
Kapan pemadatan otomatis terjadi (runtime Pi)
Dalam agen Pi tertanam, pemadatan otomatis dipicu dalam dua kasus:- Pemulihan luapan: model mengembalikan error luapan konteks
(
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, dan varian serupa berbentuk provider) → padatkan → coba lagi. - Pemeliharaan ambang: setelah giliran berhasil, ketika:
contextTokens > contextWindow - reserveTokens
Di mana:
contextWindowadalah jendela konteks modelreserveTokensadalah ruang cadangan untuk prompt + output model berikutnya
Pengaturan pemadatan (reserveTokens, keepRecentTokens)
Pengaturan pemadatan Pi berada dalam pengaturan Pi:
- Jika
compaction.reserveTokens < reserveTokensFloor, OpenClaw menaikkannya. - Lantai default adalah
20000token. - Setel
agents.defaults.compaction.reserveTokensFloor: 0untuk menonaktifkan lantai. - Jika nilainya sudah lebih tinggi, OpenClaw akan membiarkannya.
ensurePiCompactionReserveTokens() dalam src/agents/pi-settings.ts
(dipanggil dari src/agents/pi-embedded-runner.ts).
Penyedia pemadatan yang dapat dipasang
Plugins dapat mendaftarkan penyedia pemadatan melaluiregisterCompactionProvider() pada API plugin. Saat agents.defaults.compaction.provider disetel ke id penyedia yang terdaftar, extension safeguard mendelegasikan peringkasan ke penyedia tersebut alih-alih pipeline bawaan summarizeInStages.
provider: id plugin penyedia pemadatan yang terdaftar. Biarkan tidak disetel untuk peringkasan LLM default.- Menyetel
providermemaksamode: "safeguard". - Penyedia menerima instruksi pemadatan dan kebijakan pelestarian pengenal yang sama seperti jalur bawaan.
- Safeguard tetap mempertahankan konteks sufiks giliran terbaru dan giliran terpisah setelah output penyedia.
- Jika penyedia gagal atau mengembalikan hasil kosong, OpenClaw secara otomatis kembali ke peringkasan LLM bawaan.
- Sinyal abort/timeout dilempar ulang (tidak ditelan) untuk menghormati pembatalan oleh pemanggil.
src/plugins/compaction-provider.ts, src/agents/pi-hooks/compaction-safeguard.ts.
Permukaan yang terlihat pengguna
Anda dapat mengamati pemadatan dan status sesi melalui:/status(di sesi chat mana pun)openclaw status(CLI)openclaw sessions/sessions --json- Mode verbose:
🧹 Auto-compaction complete+ jumlah pemadatan
Housekeeping senyap (NO_REPLY)
OpenClaw mendukung giliran “senyap” untuk tugas latar belakang ketika pengguna tidak boleh melihat output perantara.
Konvensi:
- Asisten memulai outputnya dengan token senyap yang persis
NO_REPLY/no_replyuntuk menunjukkan “jangan kirim balasan ke pengguna”. - OpenClaw menghapus/menekan ini di lapisan pengiriman.
- Penekanan token senyap yang persis bersifat tidak peka huruf besar/kecil, jadi
NO_REPLYdanno_replykeduanya dihitung ketika seluruh payload hanyalah token senyap itu. - Ini hanya untuk giliran latar belakang/tanpa pengiriman yang benar-benar senyap; ini bukan shortcut untuk permintaan pengguna biasa yang dapat ditindaklanjuti.
2026.1.10, OpenClaw juga menekan streaming draf/pengetikan ketika
potongan parsial dimulai dengan NO_REPLY, sehingga operasi senyap tidak membocorkan
output parsial di tengah giliran.
”Memory flush” pra-pemadatan (diimplementasikan)
Tujuan: sebelum pemadatan otomatis terjadi, jalankan giliran agentik senyap yang menulis status tahan lama ke disk (misalnyamemory/YYYY-MM-DD.md di workspace agen) sehingga pemadatan tidak dapat
menghapus konteks penting.
OpenClaw menggunakan pendekatan flush pra-ambang:
- Pantau penggunaan konteks sesi.
- Saat melampaui “ambang lunak” (di bawah ambang pemadatan Pi), jalankan direktif senyap “tulis memory sekarang” ke agen.
- Gunakan token senyap persis
NO_REPLY/no_replyagar pengguna tidak melihat apa pun.
agents.defaults.compaction.memoryFlush):
enabled(default:true)softThresholdTokens(default:4000)prompt(pesan user untuk giliran flush)systemPrompt(prompt sistem tambahan yang ditambahkan untuk giliran flush)
- Prompt/prompt sistem default menyertakan petunjuk
NO_REPLYuntuk menekan pengiriman. - Flush berjalan sekali per siklus pemadatan (dilacak dalam
sessions.json). - Flush hanya berjalan untuk sesi Pi tertanam (backend CLI melewatinya).
- Flush dilewati saat workspace sesi read-only (
workspaceAccess: "ro"atau"none"). - Lihat Memory untuk tata letak file workspace dan pola penulisan.
session_before_compact di API extension, tetapi logika
flush OpenClaw saat ini berada di sisi Gateway.
Daftar periksa pemecahan masalah
- Kunci sesi salah? Mulailah dari /concepts/session dan konfirmasikan
sessionKeydi/status. - Penyimpanan vs transkrip tidak cocok? Konfirmasikan host Gateway dan jalur penyimpanan dari
openclaw status. - Spam pemadatan? Periksa:
- jendela konteks model (terlalu kecil)
- pengaturan pemadatan (
reserveTokensyang terlalu tinggi untuk jendela model dapat menyebabkan pemadatan lebih awal) - pembengkakan tool-result: aktifkan/setel pemangkasan sesi
- Giliran senyap bocor? Pastikan balasan dimulai dengan
NO_REPLY(token persis tidak peka huruf besar/kecil) dan Anda menggunakan build yang menyertakan perbaikan penekanan streaming.