Skip to content

默认所有私信共享一个会话,多用户场景必须配置 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 &lt;model&gt; 同时切换模型。

同时配置每日和空闲重置时,先到期的生效。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 内容

延伸阅读

常见问题

多人用同一个 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 文件是完整对话记录,可直接备份。