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。