Appearance
默认所有私信共享一个会话,多用户场景必须配置 DM 隔离,否则不同用户的对话上下文会互相可见。通过 session.dmScope 参数按 channel+发送者隔离,用 openclaw security audit 验证权限配置。会话支持每日 4:00 自动重置、空闲超时重置和手动 /new 或 /reset 重置。会话文件存储在 ~/.openclaw/agents/<agentId>/sessions/ 下,可通过 session.maintenance 设置自动清理保留策略和最大条目数。
OpenClaw 会话隔离配置与生命周期设置
OpenClaw 将对话组织成会话(Session),每条消息根据来源——私信、群聊、定时任务等——路由到对应会话。
消息路由规则
| 来源 | 行为 |
|---|---|
| 私信(DM) | 默认共享一个会话 |
| 群聊 | 每个群组独立会话 |
| Room/频道 | 每个 Room 独立会话 |
| Cron 任务 | 每次运行新开一个会话 |
| Webhook | 每个 Hook 独立会话 |
DM 隔离配置(多用户必读)
默认所有 DM 共享一个会话,适合单人使用。
⚠️ 多人发消息给你的 agent 时,必须开启 DM 隔离。如果不开启,所有用户共享同一个对话上下文——Alice 的私信内容 Bob 也能看到。
修复方法:
json5
{
session: {
dmScope: "per-channel-peer", // 按 channel + 发送者隔离(推荐)
},
}其他选项:
| 值 | 行为 |
|---|---|
main(默认) | 所有 DM 共享一个会话 |
per-peer | 按发送者隔离(跨 channel) |
per-channel-peer | 按 channel + 发送者隔离(推荐) |
per-account-channel-peer | 按 account + channel + 发送者隔离 |
提示:如果同一个人从多个 channel 联系你,可用
session.identityLinks关联其身份,让他们共享一个会话。配置完后运行openclaw security audit验证。
Dock 链接渠道
Dock 命令允许用户把当前私信会话的回复路由迁移到另一个链接渠道,而不需要新建会话。具体配置和排错见Channel docking。
会话生命周期
会话会复用直到过期:
- 每日重置(默认):gateway 主机本地时间 4:00 AM 开新会话。判断依据是当前
sessionId的开始时间,而不是后续元数据写入时间。 - 空闲重置(可选):一段时间不活跃后开新会话,设置
session.reset.idleMinutes。判断依据是最后一次真实用户/channel 交互,所以 heartbeat、cron、exec 等系统事件不会保活会话。 - 手动重置:在聊天中输入
/new或/reset;/new <model>同时切换模型。
同时配置每日和空闲重置时,先到期的生效。Heartbeat、cron、exec 等系统事件写入 session metadata,但不延长每日或空闲重置的判断时间。当重置切会话后,旧会话上排队中的系统事件通知会被丢弃,防止新会话的第一个 prompt 前混入过期背景更新。
持有 provider 活跃 CLI 会话的会话不会被默认的每日重置中断,如果需要按定时过期,使用 /reset 或显式配置 session.reset。
状态存储位置
所有会话状态由 gateway 管理,UI 客户端向 gateway 查询会话数据:
- 存储索引:
~/.openclaw/agents/<agentId>/sessions/sessions.json - 对话记录:
~/.openclaw/agents/<agentId>/sessions/<sessionId>.jsonl
sessions.json 文件中的关键时间戳字段:
sessionStartedAt:当前sessionId的开始时间,每日重置使用此字段。lastInteractionAt:最后一次用户/channel 交互时间,用于空闲重置判断。updatedAt:最后一次存储行变更时间,用于列出和修剪,但不作为每日/空闲重置的依据。
没有 sessionStartedAt 的老行会从 transcript JSONL 的会话头部字段解析。如果老行也没有 lastInteractionAt,空闲重置会退回到会话开始时间,而不是后续的书签写入时间。
会话自动维护配置
OpenClaw 自动控制会话存储规模。默认运行在 warn 模式(仅报告会清理什么,不实际清理)。设置 session.maintenance.mode 为 "enforce" 开启自动清理:
json5
{
session: {
maintenance: {
mode: "enforce", // warn 或 enforce
pruneAfter: "30d", // 超过此时间不活跃的会话被清理
maxEntries: 500, // 最多保留条目数
},
},
}对于生产环境的 maxEntries 限制,Gateway 运行时使用小的高水位缓冲区,并按批清理到配置上限。会话存储读取不会在 Gateway 启动时修剪或限制条目,避免每次启动或孤立的 cron 会话都执行全量清理。openclaw sessions cleanup --enforce 可立即应用上限。
维护会保留持久的外部对话指针(如群组会话和线程作用域的聊天会话),同时允许合成 cron、hook、heartbeat、ACP 和子 agent 条目过期清理。
如果你之前使用过 DM 隔离,后来又把 session.dmScope 改回了 main,可用 openclaw sessions cleanup --dry-run --fix-dm-scope 预览过期的 peer-keyed DM 行。加上同一标志可以清除这些旧 DM 行,同时保留它们的对话记录为已删除归档。
预览清理计划:openclaw sessions cleanup --dry-run
检查会话状态
bash
openclaw status # 会话存储路径和近期活动
openclaw sessions --json # 所有会话(用 --active <分钟数> 过滤)
/status # 聊天中查看上下文用量、模型、开关
/context list # 查看系统 prompt 内容延伸阅读
- Session Pruning —— 修剪工具结果
- Compaction —— 总结长对话
- Session Tools —— 跨会话 agent 工具
- Session Management Deep Dive —— 存储 schema、对话记录、发送策略、来源元数据和高级配置
- Multi-Agent —— 多 agent 路由与会话隔离
- Background Tasks —— 后台任务如何创建带会话引用的任务记录
- Channel Routing —— 入站消息如何路由到会话
常见问题
多人用同一个 agent,怎样让每个人的私信不互相暴露?
默认 DM 共享一个会话,多人必须配置 DM 隔离。设 session.dmScope 为 "per-channel-peer",然后运行 openclaw security audit 验证。配置项在 gateway 配置文件的 session 字段下。
会话多久重置一次?怎么改成手动控制?
默认每天 4:00 AM(gateway 主机本地时间)自动重置。要禁止自动重置,显式配置 session.reset 为空(不设 idleMinutes)或设一个很长的 idle 超时。手动重置在聊天里输 /new 或 /reset。
会话文件在哪里,可以备份吗?
在 ~/.openclaw/agents/<agentId>/sessions/ 下,sessions.json 是索引,.jsonl 文件是完整对话记录,可直接备份。