Sitzungsverwaltung und Kompaktierung (detaillierte Betrachtung)
Dieses Dokument erklärt, wie OpenClaw Sitzungen durchgängig verwaltet:- Sitzungsrouting (wie eingehende Nachrichten einem
sessionKeyzugeordnet werden) - Sitzungsspeicher (
sessions.json) und was er nachverfolgt - Persistenz von Transkripten (
*.jsonl) und ihre Struktur - Transkript-Hygiene (providerspezifische Korrekturen vor Ausführungen)
- Kontextgrenzen (Kontextfenster vs. nachverfolgte Tokens)
- Kompaktierung (manuell + automatische Kompaktierung) und wo Arbeiten vor der Kompaktierung eingebunden werden können
- Stilles Housekeeping (z. B. Memory-Schreibvorgänge, die keine benutzersichtbare Ausgabe erzeugen sollen)
- /concepts/session
- /concepts/compaction
- /concepts/memory
- /concepts/memory-search
- /concepts/session-pruning
- /reference/transcript-hygiene
Quelle der Wahrheit: das Gateway
OpenClaw ist um einen einzelnen Gateway-Prozess herum aufgebaut, der den Sitzungsstatus verwaltet.- UIs (macOS-App, web Control UI, TUI) sollten das Gateway nach Sitzungslisten und Token-Anzahlen abfragen.
- Im Remote-Modus liegen Sitzungsdateien auf dem Remote-Host; ein „Prüfen Ihrer lokalen Mac-Dateien“ spiegelt nicht wider, was das Gateway verwendet.
Zwei Persistenzebenen
OpenClaw speichert Sitzungen in zwei Ebenen:-
Sitzungsspeicher (
sessions.json)- Key/Value-Zuordnung:
sessionKey -> SessionEntry - Klein, veränderlich, sicher zu bearbeiten (oder Einträge zu löschen)
- Verfolgt Sitzungsmetadaten nach (aktuelle Sitzungs-ID, letzte Aktivität, Umschalter, Token-Zähler usw.)
- Key/Value-Zuordnung:
-
Transkript (
<sessionId>.jsonl)- Append-only-Transkript mit Baumstruktur (Einträge haben
id+parentId) - Speichert die eigentliche Unterhaltung + Tool-Aufrufe + Kompaktierungszusammenfassungen
- Wird verwendet, um den Modellkontext für zukünftige Turns wieder aufzubauen
- Append-only-Transkript mit Baumstruktur (Einträge haben
Speicherorte auf dem Datenträger
Pro Agent auf dem Gateway-Host:- Speicher:
~/.openclaw/agents/<agentId>/sessions/sessions.json - Transkripte:
~/.openclaw/agents/<agentId>/sessions/<sessionId>.jsonl- Telegram-Topic-Sitzungen:
.../<sessionId>-topic-<threadId>.jsonl
- Telegram-Topic-Sitzungen:
src/config/sessions.ts auf.
Speicherpflege und Festplattenkontrollen
Die Sitzungs-Persistenz hat automatische Wartungssteuerungen (session.maintenance) für sessions.json und Transkriptartefakte:
mode:warn(Standard) oderenforcepruneAfter: Altersgrenze für veraltete Einträge (Standard30d)maxEntries: Begrenzung der Einträge insessions.json(Standard500)rotateBytes: rotiertsessions.json, wenn es zu groß wird (Standard10mb)resetArchiveRetention: Aufbewahrung für*.reset.<timestamp>-Transkriptarchive (Standard: identisch mitpruneAfter;falsedeaktiviert die Bereinigung)maxDiskBytes: optionales Budget für das SitzungsverzeichnishighWaterBytes: optionales Ziel nach der Bereinigung (Standard80%vonmaxDiskBytes)
mode: "enforce"):
- Zuerst die ältesten archivierten oder verwaisten Transkriptartefakte entfernen.
- Wenn das Ziel weiterhin überschritten ist, die ältesten Sitzungseinträge und ihre Transkriptdateien auswerfen.
- So lange fortfahren, bis die Nutzung bei oder unter
highWaterBytesliegt.
mode: "warn" meldet OpenClaw potenzielle Auswerfungen, verändert aber den Speicher/die Dateien nicht.
Wartung bei Bedarf ausführen:
Cron-Sitzungen und Ausführungsprotokolle
Isolierte Cron-Ausführungen erstellen ebenfalls Sitzungseinträge/Transkripte und haben eigene Aufbewahrungssteuerungen:cron.sessionRetention(Standard24h) entfernt alte isolierte Cron-Ausführungssitzungen aus dem Sitzungsspeicher (falsedeaktiviert dies).cron.runLog.maxBytes+cron.runLog.keepLinesbeschneiden Dateien unter~/.openclaw/cron/runs/<jobId>.jsonl(Standard:2_000_000Bytes und2000Zeilen).
Sitzungsschlüssel (sessionKey)
Ein sessionKey identifiziert, in welchem Konversations-Bucket Sie sich befinden (Routing + Isolation).
Häufige Muster:
- Haupt-/Direktchat (pro Agent):
agent:<agentId>:<mainKey>(Standardmain) - Gruppe:
agent:<agentId>:<channel>:group:<id> - Raum/Kanal (Discord/Slack):
agent:<agentId>:<channel>:channel:<id>oder...:room:<id> - Cron:
cron:<job.id> - Webhook:
hook:<uuid>(sofern nicht überschrieben)
Sitzungs-IDs (sessionId)
Jeder sessionKey verweist auf eine aktuelle sessionId (die Transkriptdatei, die die Unterhaltung fortsetzt).
Faustregeln:
- Reset (
/new,/reset) erstellt eine neuesessionIdfür diesensessionKey. - Täglicher Reset (standardmäßig 4:00 Uhr Ortszeit auf dem Gateway-Host) erstellt beim nächsten Nachrichteneingang nach der Reset-Grenze eine neue
sessionId. - Leerlaufablauf (
session.reset.idleMinutesoder altsession.idleMinutes) erstellt eine neuesessionId, wenn nach dem Leerlauffenster eine Nachricht eingeht. Wenn täglich + Leerlauf beide konfiguriert sind, gewinnt das zuerst ablaufende. - Fork-Schutz für übergeordnete Threads (
session.parentForkMaxTokens, Standard100000) überspringt das Forken des übergeordneten Transkripts, wenn die übergeordnete Sitzung bereits zu groß ist; der neue Thread beginnt frisch. Setzen Sie0, um dies zu deaktivieren.
initSessionState() in src/auto-reply/reply/session.ts.
Schema des Sitzungsspeichers (sessions.json)
Der Werttyp des Speichers ist SessionEntry in src/config/sessions.ts.
Wichtige Felder (nicht vollständig):
sessionId: aktuelle Transkript-ID (der Dateiname wird daraus abgeleitet, sofernsessionFilenicht gesetzt ist)updatedAt: Zeitstempel der letzten AktivitätsessionFile: optionale explizite Überschreibung des TranskriptpfadschatType:direct | group | room(hilft UIs und der Sendepolitik)provider,subject,room,space,displayName: Metadaten für die Kennzeichnung von Gruppen/Kanälen- Umschalter:
thinkingLevel,verboseLevel,reasoningLevel,elevatedLevelsendPolicy(Überschreibung pro Sitzung)
- Modellauswahl:
providerOverride,modelOverride,authProfileOverride
- Token-Zähler (nach bestem Wissen / providerabhängig):
inputTokens,outputTokens,totalTokens,contextTokens
compactionCount: wie oft die automatische Kompaktierung für diesen Sitzungsschlüssel abgeschlossen wurdememoryFlushAt: Zeitstempel des letzten Memory-Flushs vor der KompaktierungmemoryFlushCompactionCount: Kompaktierungsanzahl, bei der der letzte Flush ausgeführt wurde
Transkriptstruktur (*.jsonl)
Transkripte werden vom SessionManager aus @mariozechner/pi-coding-agent verwaltet.
Die Datei ist JSONL:
- Erste Zeile: Sitzungs-Header (
type: "session", enthältid,cwd,timestamp, optionalparentSession) - Danach: Sitzungseinträge mit
id+parentId(Baum)
message: Benutzer-/Assistent-/ToolResult-Nachrichtencustom_message: von Erweiterungen injizierte Nachrichten, die in den Modellkontext eingehen (können in der UI verborgen sein)custom: Erweiterungsstatus, der nicht in den Modellkontext eingehtcompaction: persistierte Kompaktierungszusammenfassung mitfirstKeptEntryIdundtokensBeforebranch_summary: persistierte Zusammenfassung beim Navigieren in einem Baumzweig
SessionManager, um sie zu lesen/zu schreiben.
Kontextfenster vs. nachverfolgte Tokens
Zwei verschiedene Konzepte sind wichtig:- Modellkontextfenster: harte Obergrenze pro Modell (Tokens, die für das Modell sichtbar sind)
- Zähler im Sitzungsspeicher: rollierende Statistiken, die in
sessions.jsongeschrieben werden (verwendet für /status und Dashboards)
- Das Kontextfenster stammt aus dem Modellkatalog (und kann über die Konfiguration überschrieben werden).
contextTokensim Speicher ist ein Laufzeit-Schätzwert/-Berichtswert; behandeln Sie ihn nicht als strikte Garantie.
Kompaktierung: was sie ist
Die Kompaktierung fasst ältere Unterhaltung in einen persistiertencompaction-Eintrag im Transkript zusammen und lässt aktuelle Nachrichten intakt.
Nach der Kompaktierung sehen zukünftige Turns:
- Die Kompaktierungszusammenfassung
- Nachrichten nach
firstKeptEntryId
Chunk-Grenzen bei der Kompaktierung und Tool-Paarung
Wenn OpenClaw ein langes Transkript in Kompaktierungs-Chunks aufteilt, hält es Tool-Aufrufe des Assistenten mit ihren passendentoolResult-Einträgen zusammen.
- Wenn die tokenanteilige Aufteilung zwischen einem Tool-Aufruf und seinem Ergebnis landet, verschiebt OpenClaw die Grenze auf die Assistentennachricht mit dem Tool-Aufruf, statt das Paar zu trennen.
- Wenn ein nachlaufender Tool-Result-Block das Chunk andernfalls über das Ziel hinausschieben würde, bewahrt OpenClaw diesen ausstehenden Tool-Block und lässt das nicht zusammengefasste Ende intakt.
- Abgebrochene/fehlerhafte Tool-Aufruf-Blöcke halten eine ausstehende Aufteilung nicht offen.
Wann automatische Kompaktierung erfolgt (Pi-Runtime)
Im eingebetteten Pi-Agenten wird die automatische Kompaktierung in zwei Fällen ausgelöst:- Wiederherstellung bei Überlauf: Das Modell gibt einen Kontextüberlauffehler zurück
(
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 exceededund ähnliche providerspezifische Varianten) → komprimieren → erneut versuchen. - Schwellenwert-Wartung: nach einem erfolgreichen Turn, wenn:
contextTokens > contextWindow - reserveTokens
Dabei gilt:
contextWindowist das Kontextfenster des ModellsreserveTokensist der reservierte Puffer für Prompts + die nächste Modellausgabe
Einstellungen für die Kompaktierung (reserveTokens, keepRecentTokens)
Die Kompaktierungseinstellungen von Pi befinden sich in den Pi-Einstellungen:
- Wenn
compaction.reserveTokens < reserveTokensFloor, erhöht OpenClaw diesen Wert. - Die Standarduntergrenze beträgt
20000Tokens. - Setzen Sie
agents.defaults.compaction.reserveTokensFloor: 0, um die Untergrenze zu deaktivieren. - Wenn der Wert bereits höher ist, lässt OpenClaw ihn unverändert.
ensurePiCompactionReserveTokens() in src/agents/pi-settings.ts
(aufgerufen von src/agents/pi-embedded-runner.ts).
Benutzersichtbare Oberflächen
Sie können Kompaktierung und Sitzungsstatus beobachten über:/status(in jeder Chatsitzung)openclaw status(CLI)openclaw sessions/sessions --json- Verbose-Modus:
🧹 Auto-compaction complete+ Kompaktierungsanzahl
Stilles Housekeeping (NO_REPLY)
OpenClaw unterstützt „stille“ Turns für Hintergrundaufgaben, bei denen der Benutzer keine Zwischenausgabe sehen soll.
Konvention:
- Der Assistent beginnt seine Ausgabe mit dem exakten Still-Token
NO_REPLY/no_reply, um „keine Antwort an den Benutzer senden“ anzuzeigen. - OpenClaw entfernt/unterdrückt dies in der Zustellungsebene.
- Die Unterdrückung exakter Still-Tokens ist nicht case-sensitiv, daher zählen
NO_REPLYundno_replybeide, wenn die gesamte Nutzlast nur aus diesem Still-Token besteht. - Dies ist nur für echte Hintergrund-/Nicht-Zustellungs-Turns gedacht; es ist keine Abkürzung für gewöhnliche umsetzbare Benutzeranfragen.
2026.1.10 unterdrückt OpenClaw außerdem Draft-/Typing-Streaming, wenn ein
partieller Chunk mit NO_REPLY beginnt, damit stille Vorgänge keine partielle Ausgabe
mitten im Turn offenlegen.
„Memory-Flush“ vor der Kompaktierung (implementiert)
Ziel: Bevor automatische Kompaktierung erfolgt, einen stillen agentischen Turn ausführen, der dauerhaften Status auf den Datenträger schreibt (z. B.memory/YYYY-MM-DD.md im Agent-Workspace), damit die Kompaktierung
keinen kritischen Kontext löschen kann.
OpenClaw verwendet den Ansatz Flush vor dem Schwellenwert:
- Die Nutzung des Sitzungskontexts überwachen.
- Wenn sie einen „weichen Schwellenwert“ überschreitet (unterhalb des Kompaktierungsschwellenwerts von Pi), einen stillen „jetzt Memory schreiben“-Befehl an den Agenten ausführen.
- Das exakte Still-Token
NO_REPLY/no_replyverwenden, damit der Benutzer nichts sieht.
agents.defaults.compaction.memoryFlush):
enabled(Standard:true)softThresholdTokens(Standard:4000)prompt(Benutzernachricht für den Flush-Turn)systemPrompt(zusätzlicher System-Prompt, der für den Flush-Turn angehängt wird)
- Der Standard-Prompt/System-Prompt enthält einen
NO_REPLY-Hinweis zur Unterdrückung der Zustellung. - Der Flush wird einmal pro Kompaktierungszyklus ausgeführt (nachverfolgt in
sessions.json). - Der Flush wird nur für eingebettete Pi-Sitzungen ausgeführt (CLI-Backends überspringen ihn).
- Der Flush wird übersprungen, wenn der Sitzungs-Workspace schreibgeschützt ist (
workspaceAccess: "ro"oder"none"). - Informationen zum Layout des Workspace-Dateisystems und zu Schreibmustern finden Sie unter Memory.
session_before_compact bereit, aber die Flush-Logik von OpenClaw lebt heute auf der Gateway-Seite.
Checkliste zur Fehlerbehebung
- Falscher Sitzungsschlüssel? Beginnen Sie mit /concepts/session und bestätigen Sie den
sessionKeyin/status. - Abweichung zwischen Speicher und Transkript? Bestätigen Sie den Gateway-Host und den Speicherpfad aus
openclaw status. - Kompaktierungs-Spam? Prüfen Sie:
- Kontextfenster des Modells (zu klein)
- Kompaktierungseinstellungen (
reserveTokenszu hoch für das Modellfenster kann frühere Kompaktierung verursachen) - Aufblähung durch Tool-Ergebnisse: Session Pruning aktivieren/abstimmen
- Lecken stille Turns? Bestätigen Sie, dass die Antwort mit
NO_REPLYbeginnt (nicht case-sensitives exaktes Token) und dass Sie auf einem Build mit dem Fix zur Streaming-Unterdrückung sind.