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 都清掉。除非你明确要重置全部,否则不要这么做。

下一篇看什么

下一篇看 Cron。