<style>.toc-chapters{max-height:none!important}.copy-btn,#sidebar-toggle,#fullscreen-toggle{display:none!important}@media(max-width:768px){.tutorial-app{display:flex;height:auto;overflow:visible;flex-direction:column}.tutorial-main{order:0;overflow:visible}.tutorial-content{overflow:visible}.tutorial-sidebar{order:1;position:static!important;width:100%!important;min-width:0!important;max-height:none!important;display:flex!important;transform:none!important}.sidebar-toc{overflow:visible}}</style>

第 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 也是!


上一章 ← 第 6 章:工作区文件详解 | 下一章 → 第 8 章:工具系统

系统教程,帮你把工具用好,再回到任务中。 浏览任务方案 →