会话管理和压缩(深入解析)

本文档解释 OpenClaw 如何端到端管理会话:会话路由、会话存储(sessions.json)、记录持久化(*.jsonl)、记录清洁、上下文限制、压缩以及静默维护。

高层概览见:/concepts/session/concepts/compaction/concepts/session-pruning

权威来源:Gateway

OpenClaw 围绕单一 Gateway 进程设计,它拥有会话状态。UI 应该查询 Gateway 获取会话列表和 token 计数。

两个持久化层

  1. 会话存储(sessions.json — key/value 映射,小、可变、可安全编辑,跟踪会话元数据。
  2. 记录(<sessionId>.jsonl — 追加式记录,树结构(条目有 id + parentId),存储实际对话 + 工具调用 + 压缩摘要。

存储维护和磁盘控制

会话持久化有自动维护控制(session.maintenance):mode(warn/enforce)、pruneAfter(30d)、maxEntries(500)、rotateBytes(10mb)、maxDiskBytes 等。

Session key 和 Session id

sessionKey 标识你在哪个会话桶中(路由 + 隔离)。sessionId 指向当前的记录文件。Reset 创建新 sessionId,每日重置和空闲过期也是。

压缩

压缩将较旧的对话总结为持久的 compaction 条目,保留近期消息。压缩是持久的(不同于会话修剪)。

Pi 运行时中的自动压缩在溢出恢复或阈值维护时触发。

压缩前”记忆刷新”(已实现)

在自动压缩发生前,运行一个静默的 agentic 回合将持久状态写入磁盘(如工作空间中的 memory/YYYY-MM-DD.md),这样压缩不会擦除关键上下文。使用 NO_REPLY 抑制用户可见输出。

静默维护(NO_REPLY

OpenClaw 支持后台任务的”静默”回合。助手以 NO_REPLY 开始输出表示”不要向用户投递回复”。2026.1.10 起还抑制 NO_REPLY 开头的草稿/typing 流式。

排查清单

  • Session key 错了?从 /status 确认。
  • 存储与记录不匹配?确认 Gateway 主机和存储路径。
  • 压缩频繁?检查模型上下文窗口、压缩设置、工具结果膨胀。
  • 静默回合泄露?确认回复以 NO_REPLY 开头。