Gestion des sessions et compaction (analyse approfondie)
Ce document explique comment OpenClaw gere les sessions de bout en bout :- Routage des sessions (comment les messages entrants correspondent a un
sessionKey) - Magasin de sessions (
sessions.json) et ce qu’il suit - Persistance des transcriptions (
*.jsonl) et leur structure - Hygiene des transcriptions (correctifs specifiques au fournisseur avant les executions)
- Limites de contexte (fenetre de contexte vs jetons suivis)
- Compaction (compaction manuelle + automatique) et ou brancher le travail pre-compaction
- Maintenance silencieuse (par ex. ecritures de memoire qui ne doivent pas produire de sortie visible pour l’utilisateur)
Source de verite : la Gateway (passerelle)
OpenClaw est concu autour d’un processus Gateway unique qui possede l’etat des sessions.- Les IU (application macOS, interface web Control, TUI) doivent interroger la Gateway pour les listes de sessions et les comptes de jetons.
- En mode distant, les fichiers de session se trouvent sur l’hote distant ; « verifier vos fichiers locaux sur le Mac » ne refletera pas ce que la Gateway utilise.
Deux couches de persistance
OpenClaw persiste les sessions en deux couches :-
Magasin de sessions (
sessions.json)- Carte cle/valeur :
sessionKey -> SessionEntry - Petit, mutable, sans danger a modifier (ou a supprimer des entrees)
- Suit les metadonnees de session (identifiant de session courant, derniere activite, bascules, compteurs de jetons, etc.)
- Carte cle/valeur :
-
Transcription (
<sessionId>.jsonl)- Transcription en ajout seul avec structure arborescente (les entrees ont
id+parentId) - Stocke la conversation reelle + les appels d’outils + les resumes de compaction
- Utilisee pour reconstruire le contexte du modele pour les tours futurs
- Transcription en ajout seul avec structure arborescente (les entrees ont
Emplacements sur disque
Par agent, sur l’hote de la Gateway :- Magasin :
~/.openclaw/agents/<agentId>/sessions/sessions.json - Transcriptions :
~/.openclaw/agents/<agentId>/sessions/<sessionId>.jsonl- Sessions de sujets Telegram :
.../<sessionId>-topic-<threadId>.jsonl
- Sessions de sujets Telegram :
src/config/sessions.ts.
Cles de session (sessionKey)
Une sessionKey identifie quel compartiment de conversation vous utilisez (routage + isolation).
Modèles communs:
- Discussion principale/directe (par agent) :
agent:<agentId>:<mainKey>(par defautmain) - Groupe :
agent:<agentId>:<channel>:group:<id> - Salle/canal (Discord/Slack) :
agent:<agentId>:<channel>:channel:<id>ou...:room:<id> - Cron :
cron:<job.id> - Webhook :
hook:<uuid>(sauf remplacement)
Identifiants de session (sessionId)
Chaque sessionKey pointe vers un sessionId courant (le fichier de transcription qui poursuit la conversation).
Regles empiriques :
- Reinitialisation (
/new,/reset) cree un nouvelsessionIdpour cettesessionKey. - Reinitialisation quotidienne (par defaut a 4 h 00 heure locale sur l’hote de la Gateway) cree un nouvel
sessionIdau message suivant apres la limite de reinitialisation. - Expiration d’inactivite (
session.reset.idleMinutesou l’heritagesession.idleMinutes) cree un nouvelsessionIdlorsqu’un message arrive apres la fenetre d’inactivite. Lorsque quotidien + inactivite sont tous deux configures, celui qui expire en premier l’emporte.
initSessionState() dans src/auto-reply/reply/session.ts.
Schema du magasin de sessions (sessions.json)
Le type de valeur du magasin est SessionEntry dans src/config/sessions.ts.
Champs cles (liste non exhaustive) :
sessionId: identifiant de transcription courant (le nom de fichier en est derive sauf sisessionFileest defini)updatedAt: horodatage de la derniere activitesessionFile: remplacement explicite optionnel du chemin de transcriptionchatType:direct | group | room(aide les IU et la politique d’envoi)provider,subject,room,space,displayName: metadonnees pour l’etiquetage de groupe/canal- Toggles:
thinkingLevel,verboseLevel,reasoningLevel,elevatedLevelsendPolicy(remplacement par session)
- Selection du modele :
providerOverride,modelOverride,authProfileOverride
- Compteurs de jetons (au mieux / dependants du fournisseur) :
inputTokens,outputTokens,totalTokens,contextTokens
compactionCount: frequence a laquelle l’auto-compaction s’est terminee pour cette cle de sessionmemoryFlushAt: horodatage du dernier vidage de memoire pre-compactionmemoryFlushCompactionCount: nombre de compactions lorsque le dernier vidage a ete execute
Structure des transcriptions (*.jsonl)
Les transcriptions sont gerees par le SessionManager de @mariozechner/pi-coding-agent.
Le fichier est en JSONL :
- Premiere ligne : en-tete de session (
type: "session", inclutid,cwd,timestamp,parentSessionoptionnel) - Puis : entrees de session avec
id+parentId(arbre)
message: messages utilisateur/assistant/toolResultcustom_message: messages injectes par des extensions qui entrent dans le contexte du modele (peuvent etre masques de l’IU)custom: etat d’extension qui n’entre pas dans le contexte du modelecompaction: resume de compaction persiste avecfirstKeptEntryIdettokensBeforebranch_summary: resume persiste lors de la navigation dans une branche de l’arbre
SessionManager pour les lire/ecrire.
Fenetres de contexte vs jetons suivis
Deux concepts differents comptent :- Fenetre de contexte du modele : plafond strict par modele (jetons visibles par le modele)
- Compteurs du magasin de sessions : statistiques glissantes ecrites dans
sessions.json(utilisees pour /status et les tableaux de bord)
- La fenetre de contexte provient du catalogue de modeles (et peut etre remplacee via la configuration).
contextTokensdans le magasin est une valeur d’estimation/de rapport a l’execution ; ne la traitez pas comme une garantie stricte.
Compaction : ce que c’est
La compaction resume les conversations plus anciennes dans une entreecompaction persistee dans la transcription et conserve les messages recents intacts.
Apres compaction, les tours futurs voient :
- Le resume de compaction
- Les messages apres
firstKeptEntryId
Quand l’auto-compaction se produit (runtime Pi)
Dans l’agent Pi embarque, l’auto-compaction se declenche dans deux cas :- Recuperation apres depassement : le modele renvoie une erreur de depassement de contexte → compacter → reessayer.
- Maintenance par seuil : apres un tour reussi, lorsque :
contextTokens > contextWindow - reserveTokens
Où :
contextWindowest la fenetre de contexte du modelereserveTokensest la marge reservee pour les invites + la sortie du modele suivante
Parametres de compaction (reserveTokens, keepRecentTokens)
Les parametres de compaction de Pi se trouvent dans les parametres Pi :
- Si
compaction.reserveTokens < reserveTokensFloor, OpenClaw l’augmente. - Le plancher par defaut est de
20000jetons. - Definissez
agents.defaults.compaction.reserveTokensFloor: 0pour desactiver le plancher. - S’il est deja plus eleve, OpenClaw le laisse tel quel.
ensurePiCompactionReserveTokens() dans src/agents/pi-settings.ts
(appelé depuis src/agents/pi-embedded-runner.ts).
Surfaces visibles par l’utilisateur
Vous pouvez observer la compaction et l’etat des sessions via :/status(dans toute session de discussion)openclaw status(CLI)openclaw sessions/sessions --json- Mode verbeux :
🧹 Auto-compaction complete+ nombre de compactions
Maintenance silencieuse (NO_REPLY)
OpenClaw prend en charge les tours « silencieux » pour les taches en arriere-plan ou l’utilisateur ne doit pas voir de sortie intermediaire.
Convention :
- L’assistant commence sa sortie par
NO_REPLYpour indiquer « ne pas livrer de reponse a l’utilisateur ». - OpenClaw supprime/masque cela dans la couche de livraison.
2026.1.10, OpenClaw supprime egalement le streaming brouillon/frappe lorsqu’un fragment partiel commence par NO_REPLY, afin que les operations silencieuses ne divulguent pas de sortie partielle en cours de tour.
« Vidage de memoire » pre-compaction (implante)
Objectif : avant que l’auto-compaction ne se produise, executer un tour agentique silencieux qui ecrit un etat durable sur disque (par ex.memory/YYYY-MM-DD.md dans l’espace de travail de l’agent) afin que la compaction ne puisse pas effacer un contexte critique.
OpenClaw utilise l’approche vidage avant seuil :
- Surveiller l’utilisation du contexte de session.
- Lorsqu’elle franchit un « seuil souple » (inferieur au seuil de compaction de Pi), executer une directive silencieuse « ecrire la memoire maintenant » a l’agent.
- Utiliser
NO_REPLYpour que l’utilisateur ne voie rien.
agents.defaults.compaction.memoryFlush) :
enabled(par defaut :true)softThresholdTokens(par defaut :4000)prompt(message utilisateur pour le tour de vidage)systemPrompt(invite systeme supplementaire ajoutee pour le tour de vidage)
- L’invite par défaut/système contient un indice
NO_REPLYpour supprimer la livraison. - Le vidage s’execute une fois par cycle de compaction (suivi dans
sessions.json). - Le vidage ne s’execute que pour les sessions Pi embarquees (les backends CLI l’ignorent).
- Le vidage est ignore lorsque l’espace de travail de la session est en lecture seule (
workspaceAccess: "ro"ou"none"). - Voir Memory pour la disposition des fichiers de l’espace de travail et les modeles d’ecriture.
session_before_compact dans l’API d’extension, mais la logique de vidage d’OpenClaw reside aujourd’hui du cote de la Gateway.
Liste de verification de depannage
- Cle de session incorrecte ? Commencez par /concepts/session et confirmez le
sessionKeydans/status. - Incoherence magasin vs transcription ? Confirmez l’hote de la Gateway et le chemin du magasin depuis
openclaw status. - Spam de compaction ? Verifiez :
- la fenetre de contexte du modele (trop petite)
- les parametres de compaction (
reserveTokenstrop eleve pour la fenetre du modele peut provoquer une compaction plus precoce) - l’encombrement des resultats d’outils : activez/ajustez l’elimination de sessions
- Tours silencieux qui fuient ? Confirmez que la reponse commence par
NO_REPLY(jeton exact) et que vous utilisez une version incluant le correctif de suppression du streaming.