会话与记忆
会话管理
OpenClaw 将每个代理的一个直接聊天会话视为主会话。直接聊天会合并到 agent::(默认为 main),而群组/频道聊天则拥有自己的键。session.mainKey 会被遵循。使用 session.dmScope 来控制私信的分组方式:
main(默认):所有私信共享主会话以实现连续性。per-peer:按发送者 ID 跨频道隔离。per-channel-peer:按频道 + 发送者隔离(推荐用于多用户收件箱)。per-account-channel-peer:按账户 + 频道 + 发送者隔离(推荐用于多账户收件箱)。使用session.identityLinks将带有提供商前缀的对等方 ID 映射到一个规范身份,这样当使用per-peer、per-channel-peer或per-account-channel-peer时,同一个人可以跨频道共享一个私信会话。
安全私信模式(推荐用于多用户设置)
安全警告: 如果你的代理可以接收来自多个用户的私信,你应强烈考虑启用安全私信模式。若不启用,所有用户将共享相同的对话上下文,这可能导致用户间的私人信息泄露。
默认设置下可能出现的问题示例:
- 爱丽丝(
<SENDER_A>)向你的代理发送关于私人话题的消息(例如,医疗预约) - 鲍勃(
<SENDER_B>)向你的代理发送消息询问“我们之前聊了什么?” - 由于两个私信共享同一个会话,模型可能会使用爱丽丝之前的上下文来回答鲍勃。
解决方案: 设置 dmScope 以按用户隔离会话:
// ~/.openclaw/openclaw.json
{
session: {
// 安全私信模式:按频道 + 发送者隔离私信上下文。
dmScope: "per-channel-peer",
},
}
何时启用此模式:
- 你为多个发送者设置了配对批准
- 你使用了包含多个条目的私信允许列表
- 你设置了
dmPolicy: "open" - 多个电话号码或账户可以向你的代理发送消息
注意事项:
- 默认值为
dmScope: "main"以实现连续性(所有私信共享主会话)。这对于单用户设置是可以的。 - 本地 CLI 引导程序在未设置时默认写入
session.dmScope: "per-channel-peer"(已有的显式值会被保留)。 - 对于同一频道的多账户收件箱,建议使用
per-account-channel-peer。 - 如果同一个人通过多个频道联系你,请使用
session.identityLinks将他们的私信会话合并到一个规范身份下。 - 你可以使用
openclaw security audit验证你的私信设置(参见安全)。
网关是唯一可信源
所有会话状态都由网关(“主”OpenClaw)拥有。UI 客户端(macOS 应用、WebChat 等) 必须向网关查询会话列表和令牌计数,而不是读取本地文件。
- 在远程模式下,你关心的会话存储位于远程网关主机上,而不是你的 Mac 上。
- UI 中显示的令牌计数来自网关的存储字段(
inputTokens、outputTokens、totalTokens、contextTokens)。客户端不会解析 JSONL 记录来“修正”总数。
状态存储位置
- 在网关主机上:
- 存储文件:
~/.openclaw/agents//sessions/sessions.json(按代理)。
- 存储文件:
- 记录文件:
~/.openclaw/agents//sessions/.jsonl(Telegram 话题会话使用.../-topic-.jsonl)。 - 存储是一个映射
sessionKey -> { sessionId, updatedAt, ... }。删除条目是安全的;它们会在需要时重新创建。 - 群组条目可能包含
displayName、channel、subject、room和space,以便在 UI 中标记会话。 - 会话条目包含
origin元数据(标签 + 路由提示),以便 UI 可以解释会话的来源。 - OpenClaw 不读取旧的 Pi/Tau 会话文件夹。
维护
OpenClaw 应用会话存储维护,以保持 sessions.json 和记录文件随时间推移保持在可控范围内。
默认值
session.maintenance.mode:warnsession.maintenance.pruneAfter:30dsession.maintenance.maxEntries:500session.maintenance.rotateBytes:10mbsession.maintenance.resetArchiveRetention: 默认为pruneAfter(30d)session.maintenance.maxDiskBytes: 未设置(禁用)session.maintenance.highWaterBytes: 启用预算时默认为maxDiskBytes的80%
工作原理
维护在会话存储写入期间运行,你也可以使用 openclaw sessions cleanup 按需触发。
mode: "warn":报告哪些内容将被驱逐,但不修改条目/记录文件。mode: "enforce":按以下顺序应用清理:- 清理早于
pruneAfter的陈旧条目 - 将条目数量限制在
maxEntries以内(最旧的优先) - 为已移除且不再被引用的条目归档记录文件
- 根据保留策略清理旧的
*.deleted.和*.reset.归档文件 - 当
sessions.json超过rotateBytes时进行轮换 - 如果设置了
maxDiskBytes,则强制执行磁盘预算,目标为highWaterBytes(最旧的工件优先,然后是最旧的会话)
- 清理早于
大型存储的性能注意事项
大型会话存储在高流量设置中很常见。维护工作是写入路径上的工作,因此非常大的存储可能会增加写入延迟。最增加成本的因素:
- 非常高的
session.maintenance.maxEntries值 - 很长的
pruneAfter窗口,导致陈旧条目长期保留 ~/.openclaw/agents//sessions/目录中有大量记录/归档工件- 启用磁盘预算(
maxDiskBytes)但没有合理的清理/上限限制
应对措施:
- 在生产环境中使用
mode: "enforce",以便自动限制增长 - 同时设置时间和数量限制(
pruneAfter+maxEntries),而不是只设置一个 - 在大型部署中设置
maxDiskBytes+highWaterBytes作为硬性上限 - 将
highWaterBytes保持在显著低于maxDiskBytes的水平(默认为 80%) - 配置更改后运行
openclaw sessions cleanup --dry-run --json,以在执行前验证预期影响 - 对于频繁活动的会话,在运行手动清理时传递
--active-key
自定义示例
使用保守的强制执行策略:
{
session: {
maintenance: {
mode: "enforce",
pruneAfter: "45d",
maxEntries: 800,
rotateBytes: "20mb",
resetArchiveRetention: "14d",
},
},
}
为会话目录启用硬磁盘预算:
{
session: {
maintenance: {
mode: "enforce",
maxDiskBytes: "1gb",
highWaterBytes: "800mb",
},
},
}
为大型安装调优(示例):
{
session: {
maintenance: {
mode: "enforce",
pruneAfter: "14d",
maxEntries: 2000,
rotateBytes: "25mb",
maxDiskBytes: "2gb",
highWaterBytes: "1.6gb",
},
},
}
从 CLI 预览或强制执行维护:
openclaw sessions cleanup --dry-run
openclaw sessions cleanup --enforce
会话清理
OpenClaw 默认在 LLM 调用前从内存上下文中修剪旧的工具结果。这不会重写 JSONL 历史记录。参见 /concepts/session-pruning。
预压缩内存刷新
当会话接近自动压缩时,OpenClaw 可以运行一个静默内存刷新轮次,提醒模型将持久性笔记写入磁盘。这仅在工作区可写时运行。参见记忆和压缩。