Manajemen Sesi & Pemadatan (Pendalaman)
Dokumen ini menjelaskan bagaimana OpenClaw mengelola sesi dari ujung ke ujung:- Perutean sesi (bagaimana pesan masuk dipetakan ke
sessionKey) - Penyimpanan sesi (
sessions.json) dan apa yang dilacak - Persistensi transkrip (
*.jsonl) dan strukturnya - Kebersihan transkrip (penyesuaian khusus penyedia sebelum dijalankan)
- Batas konteks (jendela konteks vs token yang dilacak)
- Pemadatan (pemadatan manual + otomatis) dan tempat mengaitkan pekerjaan pra-pemadatan
- Housekeeping senyap (misalnya, penulisan memori yang seharusnya tidak menghasilkan output yang terlihat oleh 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 Kontrol web, TUI) harus meminta daftar sesi dan jumlah token ke Gateway.
- Dalam mode jarak jauh, file sesi berada di host jarak jauh; “memeriksa file Mac lokal Anda” tidak akan mencerminkan apa yang digunakan oleh Gateway.
Dua lapisan persistensi
OpenClaw menyimpan sesi dalam dua lapisan:-
Penyimpanan sesi (
sessions.json)- Peta key/value:
sessionKey -> SessionEntry - Kecil, dapat diubah, aman untuk diedit (atau menghapus entri)
- 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 + panggilan alat + ringkasan pemadatan
- Digunakan untuk membangun ulang konteks model untuk giliran mendatang
- 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 usang (default30d)maxEntries: batas entri disessions.json(default500)rotateBytes: rotasisessions.jsonsaat 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 artefak transkrip arsip atau yatim tertua terlebih dahulu.
- Jika masih di atas target, keluarkan entri sesi tertua beserta file transkripnya.
- Lanjutkan sampai penggunaan berada pada atau di bawah
highWaterBytes.
mode: "warn", OpenClaw melaporkan potensi pengeluaran tetapi tidak mengubah penyimpanan/file.
Jalankan pemeliharaan sesuai kebutuhan:
Sesi cron dan log run
Run cron yang 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 tempat Anda berada (perutean + isolasi).
Pola umum:
- Obrolan utama/langsung (per agen):
agent:<agentId>:<mainKey>(defaultmain) - Grup:
agent:<agentId>:<channel>:group:<id> - Ruangan/channel (Discord/Slack):
agent:<agentId>:<channel>:channel:<id>atau...:room:<id> - Cron:
cron:<job.id> - Webhook:
hook:<uuid>(kecuali ditimpa)
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 ketika pesan tiba setelah jendela idle. Saat harian + idle sama-sama dikonfigurasi, yang kedaluwarsa lebih dulu yang berlaku. - Pelindung fork induk thread (
session.parentForkMaxTokens, default100000) melewati forking transkrip induk ketika sesi induk sudah terlalu besar; thread baru dimulai dari awal. Tetapkan0untuk 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 utama (tidak lengkap):
sessionId: ID transkrip saat ini (nama file diturunkan dari ini kecualisessionFileditetapkan)updatedAt: stempel waktu aktivitas terakhirsessionFile: penggantian 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(penggantian per sesi)
- Pemilihan model:
providerOverride,modelOverride,authProfileOverride
- Penghitung token (best-effort / bergantung pada penyedia):
inputTokens,outputTokens,totalTokens,contextTokens
compactionCount: seberapa sering pemadatan otomatis selesai untuk kunci sesi inimemoryFlushAt: stempel waktu untuk flush memori pra-pemadatan terakhirmemoryFlushCompactionCount: jumlah pemadatan saat flush terakhir dijalankan
Struktur transkrip (*.jsonl)
Transkrip dikelola oleh SessionManager dari @mariozechner/pi-coding-agent.
File ini berbentuk JSONL:
- Baris pertama: header sesi (
type: "session", menyertakanid,cwd,timestamp,parentSessionopsional) - Lalu: entri sesi dengan
id+parentId(pohon)
message: pesan pengguna/asisten/toolResultcustom_message: pesan yang disisipkan ekstensi yang memang masuk ke konteks model (dapat disembunyikan dari UI)custom: status ekstensi yang tidak masuk ke konteks modelcompaction: ringkasan pemadatan yang dipersistenkan denganfirstKeptEntryIddantokensBeforebranch_summary: ringkasan yang dipersistenkan saat menavigasi cabang pohon
SessionManager untuk membaca/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 dasbor)
- Jendela konteks berasal dari katalog model (dan dapat ditimpa melalui konfigurasi).
contextTokensdalam penyimpanan adalah nilai estimasi/pelaporan runtime; jangan anggap itu sebagai jaminan ketat.
Pemadatan: apa itu
Pemadatan merangkum percakapan lama menjadi entricompaction yang dipersistenkan dalam transkrip dan menjaga pesan terbaru tetap utuh.
Setelah pemadatan, giliran mendatang akan melihat:
- Ringkasan pemadatan
- Pesan setelah
firstKeptEntryId
Batas potongan pemadatan dan pemasangan alat
Ketika OpenClaw membagi transkrip panjang menjadi potongan pemadatan, ia menjaga panggilan alat asisten tetap berpasangan dengan entritoolResult yang cocok.
- Jika pembagian berdasarkan porsi token jatuh di antara panggilan alat dan hasilnya, OpenClaw menggeser batas ke pesan panggilan alat asisten alih-alih memisahkan pasangan tersebut.
- Jika blok tool-result di akhir sebaliknya akan mendorong potongan melewati target, OpenClaw mempertahankan blok alat yang tertunda itu dan menjaga ekor yang belum diringkas tetap utuh.
- Blok panggilan alat yang dibatalkan/error tidak menahan pembagian tertunda tetap terbuka.
Kapan pemadatan otomatis terjadi (runtime Pi)
Dalam agen Pi tersemat, pemadatan otomatis dipicu dalam dua kasus:- Pemulihan overflow: model mengembalikan kesalahan overflow 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 yang dibentuk penyedia) → padatkan → coba lagi. - Pemeliharaan ambang batas: setelah giliran berhasil, ketika:
contextTokens > contextWindow - reserveTokens
Di mana:
contextWindowadalah jendela konteks modelreserveTokensadalah ruang cadangan yang disisihkan untuk prompt + output model berikutnya
Pengaturan pemadatan (reserveTokens, keepRecentTokens)
Pengaturan pemadatan Pi berada dalam pengaturan Pi:
- Jika
compaction.reserveTokens < reserveTokensFloor, OpenClaw menaikkannya. - Ambang bawah default adalah
20000token. - Tetapkan
agents.defaults.compaction.reserveTokensFloor: 0untuk menonaktifkan ambang bawah. - Jika sudah lebih tinggi, OpenClaw membiarkannya.
ensurePiCompactionReserveTokens() dalam src/agents/pi-settings.ts
(dipanggil dari src/agents/pi-embedded-runner.ts).
Permukaan yang terlihat pengguna
Anda dapat mengamati pemadatan dan status sesi melalui:/status(dalam sesi obrolan apa 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 di mana pengguna tidak seharusnya 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 persis tidak peka huruf besar-kecil, jadi
NO_REPLYdanno_replysama-sama dihitung ketika seluruh payload hanyalah token senyap. - Ini hanya untuk giliran latar belakang/tanpa pengiriman yang benar-benar demikian; ini bukan jalan pintas 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.
”Flush memori” pra-pemadatan (diimplementasikan)
Tujuan: sebelum pemadatan otomatis terjadi, jalankan giliran agentic 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 batas:
- Pantau penggunaan konteks sesi.
- Saat melampaui “ambang lunak” (di bawah ambang pemadatan Pi), jalankan arahan senyap “tulis memori 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 pengguna untuk giliran flush)systemPrompt(prompt sistem tambahan yang ditambahkan untuk giliran flush)
- Prompt/prompt sistem default menyertakan petunjuk
NO_REPLYuntuk menekan pengiriman. - Flush dijalankan sekali per siklus pemadatan (dilacak di
sessions.json). - Flush hanya dijalankan untuk sesi Pi tersemat (backend CLI melewatkannya).
- Flush dilewati ketika workspace sesi bersifat hanya-baca (
workspaceAccess: "ro"atau"none"). - Lihat Memory untuk tata letak file workspace dan pola penulisan.
session_before_compact dalam API ekstensi, tetapi logika
flush OpenClaw saat ini berada di sisi Gateway.
Daftar periksa pemecahan masalah
- Kunci sesi salah? Mulai dari /concepts/session dan konfirmasikan
sessionKeydi/status. - Ketidakcocokan penyimpanan vs transkrip? 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 yang tidak peka huruf besar-kecil) dan Anda menggunakan build yang menyertakan perbaikan penekanan streaming.