会话管理
OpenClaw 根据每条入站消息的来源将其路由到一个 会话:DM、群聊、cron 任务等。所有会话状态都由 Gateway 拥有;UI 客户端向 Gateway 查询会话数据。
要在 Control UI、终端或编码 harness 中继续同一个由 Gateway 拥有的会话,请参见会话同步与附加。
对于个人代理默认设置——一个由所有 DM 渠道共享的持续对话,群活动和后台工作流入其中——请参见主会话。
消息如何路由¶
| 来源 | 行为 |
|---|---|
| 直接消息 | 默认共享会话 |
| 群聊 | 默认按群隔离 |
| 房间/频道 | 默认按房间隔离 |
| cron 任务 | 每次运行新建会话 |
| Webhooks | 按 hook 隔离 |
当使用 session.scope: "global" 时,所选代理仍拥有其会话。
共享键 global 不会合并不同代理的对话:
命令、技能、回复和后台任务通知仍保留由路由或显式请求所选的代理。
会话列表、模型筛选器、预览和共享控件也保留所存储对话的代理,而不是聚合视图的默认代理。
使用 /stop 停止、删除、重置或归档会话时,只会取消所选对话中该代理的工作。
即使代理使用相同的会话键,另一个代理的活跃轮次和排队消息也会被保留。
DM 隔离¶
默认情况下,所有 DM 共享一个会话以保持连续性,这对单用户设置没有问题。
Warning
如果多个人可以给你的代理发消息,请启用 DM 隔离。否则,所有用户共享相同的对话上下文,Alice 的私信将对 Bob 可见。
session.dmScope 选项:
| 值 | 行为 |
|---|---|
main(默认) |
所有 DM 共享主会话 |
per-peer |
按发送者隔离,跨渠道 |
per-channel-peer |
按渠道 + 发送者隔离(推荐) |
per-account-channel-peer |
按账户 + 渠道 + 发送者隔离 |
Slack Agent View 和 Assistant View 的 DM 是例外:每个可见根都会在 dmScope 所选基础之上获得自己的 :thread:<rootTs> 会话,因此这些对话即使在 main 下也保持隔离。参见
Agent View DMs。
Tip
如果同一个人从多个渠道联系你,请使用 session.identityLinks 将其身份映射到一个规范 peer id,以便他们共享一个会话。
使用 openclaw security audit 验证你的设置。
已弃用的渠道停靠¶
渠道停靠和手动跨渠道回复焦点已移除。/dock-* 命令不再将会话的回复目标移动到另一个渠道。
使用 session.identityLinks 关联一个人的身份以用于 DM 会话路由,或使用线程绑定会话 将受支持的对话保持附加到子代理。这些是独立功能;两者都不会恢复手动跨渠道停靠。
群和房间路由¶
session.groupScope 控制非直接 peer 存储对话上下文的位置:
| 值 | 行为 |
|---|---|
per-group(默认) |
让每个群、房间或频道保留在其现有的渠道范围会话中 |
main |
将群、房间和频道路由到代理的主会话 |
路由绑定可以覆盖全局值。当只有指定的团队房间应加入主对话时,这很有用:
{
bindings: [
{
agentId: "main",
match: {
channel: "slack",
peer: { kind: "channel", id: "C0123TEAM" },
},
session: { groupScope: "main" },
},
],
}
对于将房间分类为群的提供商,使用 peer.kind: "group"。
绑定覆盖优先于全局 session.groupScope。此设置仅更改会话键选择:DM 路由、提及门控、投递上下文以及对源房间的回复均保持不变。
隐身会话¶
隐身会话仅可从 Control UI 的 New thread 屏幕使用。在开始线程之前打开 Incognito,可将其会话条目、转录和压缩状态保存在进程内存中,而不是磁盘上。线程在创建后 24 小时或 Gateway 重启时过期,以先到者为准。活动不会延长其生命周期。过期会停止活跃工作,并删除会话和转录,且不创建归档。隐身模式不会运行 OpenClaw 的自动内存刷新,在你重置或删除它时也不会创建转录归档。Codex 支持的运行也会以临时模式启动其 harness 线程,因此 Codex 不会写入 rollout 或本地会话状态文件;其他模型提供商使用 HTTP API,并在 OpenClaw 中不保留本地提供商转录。
委托工作使用其原生执行和完成所有者。实时子代理活动和完成投递仍可用。
incognito- 段保留给仪表板、子代理和隐藏内部会话键;openclaw doctor --fix 会重命名任何冲突的旧持久键。
隐身模式不会限制代理的正常工具。显式请求保存信息,或任何由工具驱动的文件写入,仍可能将数据持久化到隐身会话存储之外。你配置的模型提供商仍会处理你发送的消息。隐身内容会从普通 Gateway 输出、投递和响应诊断、WebSocket 事件预览、raw-stream、cache-trace 以及 Anthropic 负载日志中排除。实时回复仍可用,OpenClaw 仍会记录操作诊断和无内容审计元数据,例如 HMAC 引用。
在多用户网关上,隐身线程仅对管理员作用域连接可见,并且永远不会通过另一个会话的代理会话工具或会话记录搜索出现。这可防止它们被 storage 以及其他通过网关访问的用户看到,但不能防止网关所有者或进程操作者看到,后者始终可以观察实时会话。
跨对话记忆¶
独立的会话记录控制每个对话的本地历史。对于个人或完全受信任的代理,memory.search.rememberAcrossConversations: true 会添加一个可选的检索步骤,跨该代理的其他私有对话进行检索;它不会合并它们的会话记录。
私有直接对话和持久显式 UI 对话可以相互提供相关上下文。在默认 session.groupScope: "per-group" 下,群组与频道在两个方向上都保持隔离:它们的会话记录不是私有召回来源,这些对话中的回复也不会接收私有会话记录上下文。当前对话也会被排除,因为其历史已经加载。
此设置不会更改会话键、DM 作用域、路由、投递或 tools.sessions.visibility。MEMORY.md 和 memory/*.md 中的共享工作区记忆也保持现有行为。当前内存提供者必须支持受保护的私有会话记录召回;诸如 Lossless Claw 之类的上下文引擎保持独立,并可与其并行运行。有关设置和运行时详情,请参阅 活动记忆。
会话生命周期¶
会话会被重复使用,直到你手动重置它们或选择自动重置策略:
- 无自动重置(默认
mode: "none")- 会话保持相同的sessionId;随着对话增长,压缩会管理活动上下文。 - 每日重置(
mode: "daily")- 选择启用网关主机上配置的本地小时(session.reset.atHour,默认4,0-23)开始新会话。每日新鲜度基于当前sessionId开始的时间,而不是后续的元数据写入。 - 空闲重置(
mode: "idle")- 在session.reset.idleMinutes无活动后选择开始新会话。空闲新鲜度基于最后一次真实用户/频道交互,因此心跳、cron 和 exec 系统事件不会保持会话存活。 - 手动重置 - 在聊天中输入
/new或/reset。/new <model>还会切换模型。
当同时配置了每日重置和空闲重置时,先过期的生效。心跳、cron、exec 和其他系统事件轮次可能会写入会话元数据,但这些写入不会延长每日或空闲重置的新鲜度。当重置滚动会话时,旧会话中排队的系统事件通知会被丢弃,以免过时的后台更新被前置到新会话的第一个提示中。
具有活动提供者拥有的 CLI 会话的会话遵循相同的无自动重置默认设置。当这些会话应按计时器过期时,请使用 /reset 或显式配置 session.reset。
全局启用自动重置,然后按聊天类型或频道覆盖它们:
{
session: {
reset: { mode: "daily", atHour: 4 },
resetByType: {
group: { mode: "idle", idleMinutes: 120 },
thread: { mode: "daily", atHour: 6 },
},
resetByChannel: {
discord: { mode: "idle", idleMinutes: 10080 },
},
},
}
resetByType 支持 direct、group 和 thread。Doctor 会将旧版 dm 条目迁移到 direct,并将 session.idleMinutes 迁移到 session.reset.idleMinutes;模式会拒绝这两种已弃用的形式。
Gateway 重启恢复¶
当 Gateway 重启中断活动轮次时,OpenClaw 会尝试自动继续现有会话。三次未能启动后端轮次的尝试会耗尽恢复预算。一旦真实后端轮次开始,预算就会刷新,因此之后的 Gateway 重启不会消耗旧的配额。仅接受、排队或准备恢复请求不会刷新它。不报告轮次接受的 CLI 后端只有在观察到助手输出或工具活动后才会刷新预算;静默启动不会刷新它。
当重放被中断的轮次时,恢复会保留其记录的工具调用和结果,包括嵌套工具活动,并复用原始用户消息。已完成的回复或后续用户消息会关闭该轮次以进行重放。
在重启恢复等待启动期间发送的消息保持待定状态。一旦恢复开始,它们遵循会话的正常消息队列策略。你不需要仅因为恢复正在等待容量而重新发送消息。停止或替换会话仍会取消待定工作。
如果自动恢复耗尽,会话记录仍然可用。在 WebChat 中使用 在新会话中恢复,或在其他频道中使用 /new 或 /reset,以开始替代会话。
状态存储位置¶
- 运行时会话行和会话记录: 默认
~/.openclaw/agents/<agentId>/agent/openclaw-agent.sqlite - 已归档会话记录文件:
~/.openclaw/agents/<agentId>/sessions/ - 旧版行迁移源:
~/.openclaw/agents/<agentId>/sessions/sessions.json
每个代理的 SQLite 数据库中的会话行保留独立的生命周期时间戳:
sessionStartedAt:当前sessionId开始的时间;每日重置使用此值。lastInteractionAt:延长空闲生命周期的最后一次用户/频道交互。updatedAt:最后一次存储行变更;可用于列表和修剪,但不是每日/空闲重置新鲜度的权威依据。
要从旧安装导入旧版 sessions.json 行和热会话记录 JSONL 历史,请停止 Gateway,备份其状态,并在重启前运行 openclaw doctor --fix。Gateway 和本地 CLI 启动使用 SQLite,不会导入、恢复或重写旧版会话文件。如果启动时发现旧版存储,它会拒绝就绪,并打印活动配置文件的 Doctor 命令,而不是静默地以空历史启动。在 Doctor 导入期间,没有 sessionStartedAt 的行会在可用时从旧版会话记录 JSONL 会话头中解析。如果旧行也缺少 lastInteractionAt,空闲新鲜度会回退到该会话开始时间,而不是后续的簿记写入。使用 openclaw doctor --session-sqlite inspect
--session-sqlite-all-agents 和 Doctor 迁移顺序 进行检查和验证。
会话维护¶
OpenClaw 通过 session.maintenance 随时间限制会话存储,默认值如下:
{
session: {
maintenance: {
mode: "enforce", // "enforce" applies cleanup; "warn" only reports
pruneAfter: "30d",
archiveDashboardAfter: "7d", // false or 0 disables this dashboard trigger
maxEntries: 5000,
preserveRecent: false, // opt in with a duration such as "7d"
},
},
}
对于生产规模的 maxEntries 限制,Gateway 运行时写入会使用一个较小的高水位缓冲,并分批清理回配置的上限。
Gateway 启动期间,会话存储读取不会修剪或限制条目,因此启动和隔离的 cron 会话不会承担完整存储清理的开销。
openclaw sessions cleanup --enforce 会立即应用上限。
普通条目写入还会在下一个老化边界启用后台维护,
并在存储保持打开期间每 30 分钟周期性重新检查。这使
符合条件的会话无需进一步流量即可老化。无法改变
年龄或计数维护结果的写入会跳过候选扫描。自动规划在进入前台写入队列前
只读取保留和保护元数据;
上限选择只保留所需的最旧合格条目。写入器在应用更改前会检查
已准备的存储修订,因此并发更新会被重新考虑而不是覆盖。
如果写入使自动维护计划失效,其替代计划会等待
最后一次写入后的静默窗口(一秒,然后两秒)。连续
三次失效会暂停自动重试并记录原因;新的
条目写入可以安排另一次尝试。warn 模式会记录维护
年龄事实,而不构建或派发自动回收。
maxEntries 默认为 5000 行未归档会话行。归档行不占用
上限。现有显式限制保持不变。
当压力超过上限时,清理会归档最旧的合格普通
会话,而不是删除其转录。合成运行时会话,例如
cron、hooks、heartbeat、ACP 和子代理,仍是一次性的,并且可以
被移除。已固定的根会话、活动或已接纳的工作、模型锁定会话以及
持久外部会话指针受保护;因此,当受保护行本身超过上限时,未归档总数
可能仍高于上限。
根会话以及自动父级为代理 Home 根的会话可以固定; 真正的子会话和子代理运行会拒绝固定请求。持久子 会话保留其侧边栏嵌套;子代理运行显示在转录活动和 会话转录中。现有子固定会消失,并且不再保护会话 免受维护。
Gateway 模型运行探测会话默认是短命的。匹配
agent:*:explicit:model-run-<uuid> 的行使用固定 24h 保留,但清理受
压力门控:它仅在达到会话条目
维护/上限压力时移除过期探测行,并在更广泛的过期条目
老化截止和条目上限之前运行。普通直接、群组、线程、cron、hook、heartbeat、
ACP 和子代理会话不会继承此 24h 保留。
维护会保留持久外部会话指针,包括直接、 群组和线程范围的聊天会话,同时仍允许合成 cron、hook、 heartbeat、ACP 和子代理条目老化。
共享或高容量安装可以设置 preserveRecent 以保护
最近活动的交互式会话以及这些会话拥有的每个 SQLite 历史代。
省略或设置为 false 时,该选项被禁用,因此
个人安装保持正常的最旧优先策略。合成
模型运行、cron、hook、heartbeat、ACP 和子代理会话仍符合
有界清理条件。保护可能暂时使存储高于其条目
或磁盘目标;它会在配置的不活动窗口后过期。
最近会话保护不会改变受管工作树垃圾回收;
持久仪表板会话默认在 7 天不活动后自动归档,
并且 pruneAfter 默认在 30 天后就地归档其他合格持久会话,
保留其会话 ID 和转录代。一次性
自动化行仍会在其老化截止时删除。
已固定会话以及手动、旧版、老化保留、过期仪表板或恢复
归档受用户保护,并豁免自动维护。因达到
maxEntries 而归档的会话会记录该原因,并在物理使用量超过 maxDiskBytes 之前保持可搜索/可恢复;磁盘预算清理随后可能
在更便宜的工件和未引用历史耗尽后删除
最旧的上限归档。没有记录归档原因的会话仍受保护。
在跳过某个历史代或已归档会话后,磁盘预算清理 在考虑另一次删除前会重新检查物理使用量。测量 失败会停止清扫。
后台磁盘预算检查在条目写入时最多每 30 分钟运行一次。
删除和重置操作可以请求更早检查,但重复请求
会合并为每个存储每分钟最多一次强制检查。如果清理耗尽
合格历史且存储仍超预算,自动检查会退避
30 分钟并记录一条警告,直到压力清除或预算变化。
警告建议提高 session.maintenance.maxDiskBytes 或导出
并删除不需要的会话。后续活动会恢复检查;
openclaw sessions cleanup --enforce 仍立即可用。
清理首先尝试截断 WAL,而不等待读者。如果读者 阻止截断,完整的 PASSIVE 检查点就足够:与清理相关 的帧必须已到达主数据库,即使 WAL 文件仍保持分配。 保留的 WAL 字节仍计入物理预算。成功清理 会记录一条结果,包含前后字节数和移除数量。
不完整的 SQLite WAL 检查点是单独的延迟。清理会保留
归档和历史,而不是删除被阻塞检查点后面的更多数据。
结果会记录 deferredReason: "checkpoint-incomplete"、前后 WAL 字节
以及检查点结果。自动和手动预算通道保持
延迟,直到检查点所有者在待处理清理工作后记录完成。
并发写入产生的较新帧不会擦除该完成。每次 SQLite 清理
删除或 vacuum 提交都需要新的完成才能进一步修剪,因此
固定这些更改的读者仍会延迟清理。排序使用单调时间;
经过时间、预算变化或系统时钟校正无法释放门控。
正常周期性检查点继续,后续活动可在恢复后恢复清理。
在 Gateway 日志中查找 session history disk budget deferred until a completed WAL checkpoint is observed。其检查点字段包括显式跟踪的读取器的有界操作名称、连接和线程 ID,以及开放事务标志。收集这些事实不会保持连接打开,也不会更改工作进程退役。它们不能证明哪个连接持有阻塞的 SQLite 读标记。显式读取器跟踪之外的原始原生语句、其他工作进程和其他进程可能仍无法识别。不包含转录内容、SQL 文本或绑定值。
如果你之前使用过 DM 隔离,后来将 session.dmScope 恢复为 main,请使用 openclaw sessions cleanup --dry-run --fix-dm-scope 预览过期的按 peer 键控的 DM 行。应用相同标志会退役这些旧的直接 DM 行,并将其转录保留为已删除归档。
使用 openclaw sessions cleanup --dry-run 预览任何维护运行。
检查会话¶
| 命令 | 显示内容 |
|---|---|
openclaw status |
会话存储路径和最近活动 |
openclaw sessions --json |
所有会话(使用 --active <minutes> 过滤) |
聊天中的 /status |
上下文使用情况、模型和开关 |
/context list |
系统提示中包含的内容 |
相关¶
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/openclaw