Sessionshantering och kompaktering (fördjupning)
Det här dokumentet förklarar hur OpenClaw hanterar sessioner från början till slut:- Sessionsroutning (hur inkommande meddelanden mappar till en
sessionKey) - Sessionslagring (
sessions.json) och vad den spårar - Persistens av transkript (
*.jsonl) och dess struktur - Transkripthygien (leverantörsspecifika korrigeringar före körningar)
- Kontextgränser (kontextfönster vs spårade tokens)
- Kompaktering (manuell + automatisk kompaktering) och var man kan haka in arbete före kompaktering
- Tyst städning (t.ex. minnesskrivningar som inte ska ge användarsynlig utdata)
Sanningskälla: Gateway
OpenClaw är designat kring en enda Gateway-process som äger sessionstillståndet.- UI:er (macOS-app, webbaserat Control UI, TUI) ska fråga Gateway om sessionslistor och tokenräkningar.
- I fjärrläge ligger sessionsfilerna på fjärrvärden; att ”kontrollera dina lokala Mac-filer” återspeglar inte vad Gateway använder.
Två persistenslager
OpenClaw persisterar sessioner i två lager:-
Sessionslagring (
sessions.json)- Nyckel/värde-karta:
sessionKey -> SessionEntry - Liten, muterbar, säker att redigera (eller radera poster)
- Spårar sessionsmetadata (aktuellt sessions-id, senaste aktivitet, växlar, tokenräknare m.m.)
- Nyckel/värde-karta:
-
Transkript (
<sessionId>.jsonl)- Append-only-transkript med trädstruktur (poster har
id+parentId) - Lagrar den faktiska konversationen + verktygsanrop + kompakteringssammanfattningar
- Används för att bygga upp modellkontexten för framtida vändor
- Append-only-transkript med trädstruktur (poster har
Platser på disk
Per agent, på Gateway-värden:- Lagring:
~/.openclaw/agents/<agentId>/sessions/sessions.json - Transkript:
~/.openclaw/agents/<agentId>/sessions/<sessionId>.jsonl- Telegram-ämnessessioner:
.../<sessionId>-topic-<threadId>.jsonl
- Telegram-ämnessessioner:
src/config/sessions.ts.
Sessionsnycklar (sessionKey)
En sessionKey identifierar vilken konversationshink du befinner dig i (routning + isolering).
Vanliga mönster:
- Huvud-/direktchatt (per agent):
agent:<agentId>:<mainKey>(standardmain) - Grupp:
agent:<agentId>:<channel>:group:<id> - Rum/kanal (Discord/Slack):
agent:<agentId>:<channel>:channel:<id>eller...:room:<id> - Cron:
cron:<job.id> - Webhook:
hook:<uuid>(om inte åsidosatt)
Sessions-id:n (sessionId)
Varje sessionKey pekar på ett aktuellt sessionId (transkriptfilen som fortsätter konversationen).
Tumregler:
- Återställning (
/new,/reset) skapar ett nyttsessionIdför densessionKey. - Daglig återställning (standard 04:00 lokal tid på Gateway-värden) skapar ett nytt
sessionIdvid nästa meddelande efter återställningsgränsen. - Idle utgång (
session.reset.idleMinuteseller äldresession.idleMinutes) skapar en nysessionIdnär ett meddelande kommer efter tomgångsfönstret. När dagligen + inaktiv är båda konfigurerade, vilket som löper ut första vinner.
initSessionState() i src/auto-reply/reply/session.ts.
Schema för sessionslagring (sessions.json)
Lagringens värdetyp är SessionEntry i src/config/sessions.ts.
Viktiga fält (inte uttömmande):
sessionId: aktuellt transkript-id (filnamn härleds från detta om intesessionFileär satt)updatedAt: tidsstämpel för senaste aktivitetsessionFile: valfri explicit åsidosättning av transkriptsökvägchatType:direct | group | room(hjälper UI:er och sändpolicy)provider,subject,room,space,displayName: metadata för grupp-/kanaletikettering- Växlar:
thinkingLevel,verboseLevel,reasoningLevel,elevatedLevelsendPolicy(åsidosättning per session)
- Modellval:
providerOverride,modelOverride,authProfileOverride
- Tokenräknare (best-effort / leverantörsberoende):
inputTokens,outputTokens,totalTokens,contextTokens
compactionCount: hur ofta automatisk kompaktering har slutförts för denna sessionsnyckelmemoryFlushAt: tidsstämpel för senaste pre-kompakterings-minnesflushmemoryFlushCompactionCount: kompakteringsräkning när senaste flush kördes
Transkriptstruktur (*.jsonl)
Transkript hanteras av @mariozechner/pi-coding-agents SessionManager.
Filen är JSONL:
- Första raden: sessionshuvud (
type: "session", inkluderarid,cwd,timestamp, valfriparentSession) - Därefter: sessionsposter med
id+parentId(träd)
message: användar-/assistent-/toolResult-meddelandencustom_message: tilläggsinjicerade meddelanden som kommer in i modellkontext (kan döljas från UI)custom: tilläggstillstånd som inte kommer in i modellkontextcompaction: persisterad kompakteringssammanfattning medfirstKeptEntryIdochtokensBeforebranch_summary: persisterad sammanfattning vid navigering av en trädgren
SessionManager för att läsa/skriva dem.
Kontextfönster vs spårade tokens
Två olika begrepp är viktiga:- Modellens kontextfönster: hård gräns per modell (tokens synliga för modellen)
- Räknare i sessionslagringen: rullande statistik som skrivs till
sessions.json(används för /status och dashboards)
- Kontextfönstret kommer från modellkatalogen (och kan åsidosättas via konfig).
contextTokensi lagringen är ett körtidsestimat/rapporteringsvärde; behandla det inte som en strikt garanti.
Kompaktering: vad det är
Kompaktering sammanfattar äldre konversation till en persisteradcompaction-post i transkriptet och behåller senaste meddelanden intakta.
Efter kompaktering ser framtida vändor:
- Kompakteringssammanfattningen
- Meddelanden efter
firstKeptEntryId
När automatisk kompaktering sker (Pi runtime)
I den inbäddade Pi-agenten triggas automatisk kompaktering i två fall:- Återhämtning vid överskridande: modellen returnerar ett fel om kontextöverskridande → kompakta → försök igen.
- Tröskelunderhåll: efter en lyckad vända, när:
contextTokens > contextWindow - reserveTokens
Där:
contextWindowär modellens kontextfönsterreserveTokensär marginal reserverad för promptar + nästa modellutdata
Inställningar för kompaktering (reserveTokens, keepRecentTokens)
Pis kompakteringsinställningar finns i Pi-inställningar:
- Om
compaction.reserveTokens < reserveTokensFloor, höjer OpenClaw det. - Standardgolvet är
20000tokens. - Sätt
agents.defaults.compaction.reserveTokensFloor: 0för att inaktivera golvet. - Om det redan är högre lämnar OpenClaw det orört.
ensurePiCompactionReserveTokens() i src/agents/pi-settings.ts
(anropas från src/agents/pi-embedded-runner.ts).
Användarsynliga ytor
Du kan observera kompaktering och sessionstillstånd via:/status(i valfri chattsession)openclaw status(CLI)openclaw sessions/sessions --json- Utförligt läge:
🧹 Auto-compaction complete+ kompakteringsräkning
Tyst städning (NO_REPLY)
OpenClaw stöder ”tysta” vändor för bakgrundsuppgifter där användaren inte ska se mellanliggande utdata.
Konvention:
- Assistenten inleder sin utdata med
NO_REPLYför att indikera ”leverera inget svar till användaren”. - OpenClaw strimlar/undertrycker detta i leveranslagret.
2026.1.10 undertrycker OpenClaw även utkast-/skrivstreaming när ett partiellt chunk börjar med NO_REPLY, så att tysta operationer inte läcker partiell utdata mitt i en vända.
”Minnesflush” före kompaktering (implementerad)
Mål: innan automatisk komprimering händer, kör en tyst agentic tur som skriver hållbar tillstånd till disk (e. .minne/YYY-MM-DD.md i agentens arbetsyta) så komprimering kan inte
radera kritiska sammanhang.
OpenClaw använder metoden pre-tröskel-flush:
- Övervaka sessionens kontextanvändning.
- När den passerar en ”mjuk tröskel” (under Pis kompakteringströskel), kör en tyst ”skriv minne nu”-direktiv till agenten.
- Använd
NO_REPLYså att användaren inte ser något.
agents.defaults.compaction.memoryFlush):
enabled(standard:true)softThresholdTokens(standard:4000)prompt(användarmeddelande för flush-vändan)systemPrompt(extra systemprompt som läggs till för flush-vändan)
- Standardprompt/systemprompt innehåller en
NO_REPLY-hint för att undertrycka leverans. - Flush körs en gång per kompakteringscykel (spåras i
sessions.json). - Flush körs endast för inbäddade Pi-sessioner (CLI-backends hoppar över den).
- Flush hoppas över när sessionens arbetsyta är skrivskyddad (
workspaceAccess: "ro"eller"none"). - Se Memory för arbetsytans fillayout och skrivmönster.
session_before_compact-hook i tilläggs-API:t, men OpenClaws
flushlogik ligger i dag på Gateway-sidan.
Felsökningschecklista
- Sessionsnyckel fel? Börja med /concepts/session och bekräfta
sessionKeyi/status. - Lagra vs utskrift felaktigt? Bekräfta Gateway-värden och butikssökvägen från
openclaw status. - Komprimering skräppost? Kontroll:
- modellens kontextfönster (för litet)
- kompakteringsinställningar (
reserveTokensför högt i förhållande till modellfönstret kan orsaka tidigare kompaktering) - uppblåst tool-result: aktivera/justera session pruning
- Tysta svängar läckande? Bekräfta svaret börjar med
NO_REPLY(exakt token) och du är på en byggnad som inkluderar strömmande dämpning fix.