Technical Guide

12. Sessions:会话、历史和状态怎么保存

区分 OpenClaw 的 agent、session、workspace 和状态目录,理解跨渠道连续对话如何保存。

这篇解决什么问题

OpenClaw 是多渠道助手。用户可能从 Telegram 发一句,又从 CLI 发一句,还可能有不同 agent 和不同 workspace。

这就需要 session 模型。

状态目录里的 session

官方 runtime workflow 文档提到:

agents/<agentId>/sessions/
agents/<agentId>/sessions/sessions.json
sessions/     # legacy paths may exist

也就是说,session 是按 agent 组织的。

相关源码目录

src/agents/sessions/
src/config/sessions.ts
src/config/sessions/
src/gateway/
src/channels/turn/

src/agents/sessions/ 不只是历史记录,还涉及 extension loading、resource discovery、skills、prompts、themes、TUI-backed tool renderers。

agent 和 session 不一样

可以这样区分:

agent:一个助手身份和配置边界
session:一次或一组连续对话历史
workspace:这个 agent/session 操作的文件空间
channel thread:平台上的聊天上下文

这些概念会被路由绑定在一起,但不是同一个东西。

为什么 session 持久化重要

因为 Agent 需要知道:

  • 前面聊过什么;
  • 之前工具调用结果是什么;
  • 当前任务是否已经压缩过;
  • 这个 channel/thread 属于哪个 session;
  • 用户发 /reset/new 时要改哪个 session。

什么时候该删 session

官方 workflow 文档给了 reset 思路:如果只想重置 sessions,删除对应 agent 的:

agents/<agentId>/sessions/

如果要保留模型认证,不要删:

agents/<agentId>/agent/auth-profiles.json

这点很实用。很多时候你只想清历史,不想重配全部 provider。

常见误区

以为换 channel 就换 session

不一定。具体取决于 routing policy 和绑定规则。

以为清 workspace 就清会话

workspace 是文件空间,session 是对话历史,两者不同。

以为删 ~/.openclaw 最省事

这会把配置、凭证、sessions、workspace 都清掉。除非你明确要重置全部,否则不要这么做。

实践:Session 隔离练习

不要直接删状态目录。先在一个测试会话里发送:

请记住本次测试代号:blue-731。只在当前会话使用。

接着在同一会话追问:

刚才的测试代号是什么?

然后使用 /new 新建会话,再问一次相同问题。

完成标准

  • 同一会话内能够回答 blue-731
  • 新会话不会把旧对话当成当前上下文;
  • 两次对话对应不同的 session 记录;
  • 你能在状态目录中找到 session 索引与历史文件;
  • 认证配置没有因新建会话而变化;
  • 你能区分 session、workspace 和 channel thread。

如果新会话仍然知道这个代号,先判断它来自长期记忆、系统提示词还是 Session 路由,不要直接删除整个 ~/.openclaw

多走一步

在另一个已接入 Channel 做同样的测试,记录它是复用了原 Session,还是创建了新的 Session。再回到 routing policy 和绑定规则中解释这个结果。

下一篇看什么

下一篇看 Cron。