第 7 章:理解 Session 和会话管理 💬
每一段对话,都是一个"Session"。它什么时候开始、什么时候结束、记得什么、忘记什么,都有一套精密的规则。
7.1 什么是 Session?
在 OpenClaw 里,Session(会话) 是指一段连续的对话。
当你发出一条消息,AI 回复,你再回复——这一来一回构成一个 Session。Session 就是 OpenClaw 用来组织对话的基本单位。
可以把 Session 想象成一个聊天窗口:
- 你打开和朋友的聊天窗口 → Session 创建
- 你们聊了 50 条消息 → Session 持续
- 你关闭窗口,第二天再打开 → 可能继续用同一个 Session,也可能新建
OpenClaw 的 Session 也是这样,但它更智能——会主动管理什么时候换到新会话。
7.2 Session 的生命周期
一个 Session 完整的生命周期是这样的:
创建 → 活跃 → 压缩 → 过期/重置
① 创建(Creation)
Session 在以下情况被创建:
- 你给 Agent 发送第一条私信
- 你在群里 @Agent 第一次聊天
- 定时任务执行时创建一个临时 Session
- Webhook 触发时创建一个新的 Session
② 活跃(Active)
Session 进入活跃状态,你和 Agent 可以有来有回地聊天。所有消息都被记录到会话记录中。
③ 压缩(Compaction)
当对话太长,接近模型上下文窗口的上限时,OpenClaw 会做压缩(Compaction)——把以前的对话内容总结成一个摘要,腾出空间给新的对话。
压缩后:
- 旧对话变成一段摘要(保存到磁盘)
- 最近的消息保持原样
- Agent 仍然可以查阅压缩前的完整记录
在聊天中输入
/compact可以手动触发压缩。
④ 过期或重置(Expire/Reset)
Session 不是永恒的。它会在以下情况结束:
- 每日重置:默认每天凌晨 4 点自动新建 Session
- 空闲超时:一段时间不说话后自动重置
- 手动重置:输入
/new或/reset - 手动切换模型:
/model xxx也会创建新 Session 上下文
重置之后,之前的对话历史仍然保存在磁盘上,Agent 可以用 memory_search 查回来。
7.3 上下文窗口与 Token 控制
什么是上下文窗口?
每个 AI 模型都有上下文窗口(Context Window)——它能"看到"的最大信息量。
打个比方:
- 你和一个朋友聊天
- 你说了 50 句话 → 他能记住
- 你说了 50000 句话 → 他只能记住最近的一些
- 你说了 100000 句话 → 他需要"总结"前面的内容才能继续
AI 模型也一样。Claude 的上下文窗口是 200K token,GPT 系列各有不同。
OpenClaw 怎么管理上下文?
OpenClaw 使用三层策略来管理上下文:
第一层:会话修剪(Session Pruning)
修剪掉过长的工具输出结果,只保留关键信息。这是最轻量级的策略。
第二层:自动压缩(Auto-Compaction)
当对话接近上下文窗口上限时,自动把前面的内容总结成摘要:
[摘要] 用户问了关于 API 设计的问题,讨论了 REST 和 GraphQL 的对比,
最终选择了 GraphQL,因为小团队更灵活...
第三层:手动重置
如果压缩还不够,用户手动 /new 开始全新的 Session。
查看上下文使用情况
在聊天中输入:
/status
你会看到:
📊 Session Status
🧹 Model: anthropic/claude-sonnet-4-6
📐 Context: 45321 / 200000 tokens (22.6%)
🧹 Compactions: 2
7.4 Session 隔离:不同频道不同会话
OpenClaw 最强大的功能之一:不同频道的对话互相隔离。
默认隔离规则
| 消息来源 | Session 行为 |
|---|---|
| 私信(DM) | 共享一个 Session(默认) |
| 群组聊天 | 每个群组独立 Session |
| 频道/Room | 每个频道独立 |
| Cron 任务 | 每次执行新建临时 Session |
| Webhook | 每次触发独立 |
为何需要隔离?
默认情况下,所有人的私信都在同一个 Session 里。如果你一个人用,这没问题。
但如果你和家人都用同一个 Telegram Bot,就不希望爸爸问的问题被妈妈看到!
解决方案:开启 DM 隔离
{
session: {
dmScope: "per-channel-peer",
},
}
这样每个人的私信都有自己的 Session,互相看不见。
可选的隔离级别
{
session: {
dmScope: "main", // 所有 DM 共享(默认)
// dmScope: "per-peer", // 按发送者隔离(跨频道)
// dmScope: "per-channel-peer", // 按频道+发送者隔离 ✅ 推荐
// dmScope: "per-account-channel-peer", // 按账号+频道+发送者隔离
},
}
身份链接
如果你同一个人从多个频道找你(比如 WhatsApp 和 Telegram),可以用身份链接让它们共享同一个 Session:
{
session: {
identityLinks: [
{ identities: ["whatsapp:+15551234567", "telegram:123456789"] },
],
},
}
7.5 ASCII 图解:Session 路由
你发了一条消息
│
▼
消息从哪个频道来?
│
├── WhatsApp DM ──→ 按手机号分配 Session
├── Telegram 群 ──→ 按群组 ID 分配 Session
├── Discord 频道 ─→ 按频道 ID 分配 Session
└── Cron 任务 ────→ 新建临时 Session
│
▼
读取 Session 历史
│
▼
AI 开始推理 → 回复
7.6 查看和管理 Session
查看所有会话
openclaw sessions --json
openclaw sessions --active 60 # 只看最近 60 分钟内活跃的
查看状态
openclaw status # 运行状态
openclaw sessions --json # 会话详情
在聊天中操作
/new # 开始全新会话
/reset # 同上
/compact # 手动压缩当前会话
/compact 重点在API设计 # 带指示的压缩
/status # 查看当前会话状态
/model 3 # 切换模型(同时重置会话上下文)
/context list # 查看系统提示词里有什么
Session 存储位置
所有 Session 数据存在 Gateway 端:
~/.openclaw/agents/main/sessions/
├── sessions.json # 会话元数据
└── <session-id>.jsonl # 完整对话记录
sessions.json 记录了每个 Session 的三个关键时间戳:
| 时间戳 | 含义 |
|---|---|
sessionStartedAt |
当前 Session 开始时间(每日重置看这个) |
lastInteractionAt |
最后一次用户交互时间(空闲重置看这个) |
updatedAt |
最后更新时间 |
7.7 Session 维护和清理
自动清理
OpenClaw 默认会自动清理过期会话:
{
session: {
maintenance: {
mode: "enforce", // enforce 执行清理 | warn 只报告不清理
pruneAfter: "30d", // 保留 30 天的会话
maxEntries: 500, // 最多保留 500 个会话记录
},
},
}
手动清理
openclaw sessions cleanup # 执行清理
openclaw sessions cleanup --dry-run # 预览:哪些会被清理
openclaw sessions cleanup --enforce # 强制执行
7.8 常见场景问答
Q:每天自动重置会不会丢失重要对话?
A:不会。对话记录仍然保存在 sessions.jsonl 中。Agent 可以用 memory_search 找回之前的对话。而且,如果在压缩前发生了"记忆闪存"(Memory Flush),重要信息会自动存入 MEMORY.md。
Q:能不能关掉每日重置?
A:可以。配置 session.reset 来调整策略:
{
session: {
reset: {
mode: "off", // 关掉自动重置
// mode: "daily", // 每日重置
// mode: "idle", // 空闲超时重置
atHour: 4, // 每天凌晨 4 点
idleMinutes: 120, // 空闲 2 小时重置
},
},
}
Q:压缩之后 Agent 还会记得之前的事吗?
A:压缩会创建一个摘要,但完整的对话记录仍在磁盘上。Agent 可以用 memory_search 工具搜索和查找历史信息。另外,在压缩之前会运行"记忆闪存"——自动提醒 Agent 把重要内容存到磁盘文件里。
当当老师 🐾 笔记: Session 是 AI 对话的"幕后导演"。理解它的生命周期,你就知道 Agent 什么时候记得、什么时候忘记、什么时候该手动干预了。记住:
/new是你的朋友,/compact也是!
系统教程,帮你把工具用好,再回到任务中。 浏览任务方案 →