OpenClaw Session 与会话管理:Main、Group、Per-Sender 作用域

在多租户、跨渠道的 AI Agent 场景中,会话隔离(Session Isolation)是数据安全的最后防线。OpenClaw 通过细粒度的作用域策略与智能的会话路由机制,实现了"单用户连贯体验"与"多用户安全隔离"的精妙平衡。本文深度拆解其 Session Key 设计、作用域层级与生命周期管理机制。

一、Session 体系架构概览

OpenClaw 的会话系统采用"逻辑隔离 + 物理持久化"双层架构。每个对话上下文(Context)都映射到一个唯一的 Session Key,Gateway 通过该 Key 实现消息路由、状态隔离与持久化存储。

1.1 核心概念映射

概念 说明 典型应用场景
Session Key 唯一标识符,格式为 agent:<id>:<scope>:<type>:<id> 路由消息到正确的上下文
Main Session 私聊共享上下文,跨设备连续性 个人助理、单用户多终端
Group Session 群组隔离上下文,成员共享 团队协作、群聊机器人
Session Lane 会话级串行处理队列 防止并发消息导致的状态竞态
Identity Link 跨渠道用户身份关联 同一用户多平台身份归一

1.2 系统架构图

±------------------+ ±------------------+ ±------------------+
| 消息接入层 | | Session 路由层 | | 持久化存储层 |
| (Telegram/Discord/|------->| (Gateway Core) |------->| (File System/ |
| WhatsApp/Webhook)| | | | Vector DB) |
±-------±---------+ ±--------±--------+ ±--------±--------+
| | |
v v v
±-------±---------+ ±--------±--------+ ±--------±--------+
| 消息标准化 | | Session Key 生成 | | sessions.json |
| (Intake) | | - scope 判定 | | MEMORY.md |
| | | - 隔离策略应用 | | Workspace files |
±------------------+ ±------------------+ ±------------------+

二、Session Key 生成规则与路由逻辑

Session Key 是 OpenClaw 路由系统的核心,其生成遵循严格的层级命名规范,确保全局唯一性与可预测性。

2.1 Key 结构规范

Session Key 采用冒号分隔的层级结构,从左至右依次为:Agent 命名空间 → 渠道标识 → 会话类型 → 唯一标识。

格式:agent:<agentId>:<channel>:<type>:<id>[:topic:<threadId>]

示例解析:
┌──────────┬──────────┬──────────┬──────────────┬──────────────────┐
│  Prefix  │ AgentID  │ Channel  │     Type     │       ID         │
├──────────┼──────────┼──────────┼──────────────┼──────────────────┤
│  agent:  │   main   │   main   │   (折叠)     │       main       │ → Main Session
│  agent:  │   main   │telegram  │     dm       │  123456789       │ → 私聊(per-channel-peer)
│  agent:  │   main   │ discord  │    group     │  9876543210      │ → 群聊
│  agent:  │   main   │telegram  │    group     │  -1001234567890  │ → 群组(Topic)
│  agent:  │   main   │telegram  │    group     │  xxx:topic:456   │ → 群组话题
│  cron:   │   job1   │   -      │      -       │       -          │ → 定时任务
│  hook:   │  uuid    │   -      │      -       │       -          │ → Webhook
└──────────┴──────────┴──────────┴──────────────┴──────────────────┘

2.2 私聊(DM)路由策略

私聊的 Session Key 生成受 dmScope 配置严格控制,该配置决定了"谁与谁共享上下文"这一关键安全问题。
四种作用域模式对比:

模式 Key 格式 隔离粒度 适用场景 安全风险
main (默认) agent:<id>:main 无隔离,所有 DM 共享 单用户个人助理 极高 - 多用户场景数据泄露
per-peer agent:<id>:dm:<peerId> 按发送者 ID 全局隔离 跨渠道统一身份 中 - 同一渠道多账户混淆
per-channel-peer (推荐) agent:<id>:<channel>:dm:<peerId> 按渠道+发送者隔离 多用户共享收件箱 低 - 推荐生产配置
per-account-channel-peer agent:<id>:<acc>:<channel>:dm:<peerId> 按账户+渠道+发送者隔离 多账户运营场景 极低 - 最严格隔离

路由决策流程:

±------------------+
| 收到 DM 消息 |
±--------±--------+
|
v
±--------±--------+
| 检查 dmScope 配置 |
±--------±--------+
|
±—±—±--------±------------+
| | | |
v v v v
±—±–+ ±–±–+ ±–±—+ ±-----±----+
| main | |per- | |per- | |per-account |
| | |peer | |channel | | -channel |
| | | | |-peer | |-peer |
±–±—+ ±–±–+ ±–±—+ ±-----±----+
| | | |
v v v v
Key:main Key:dm: Key:chan: Key:acc:chan:
globalId dm:peerId dm:peerId

安全警告:若多人可向同一个 Bot 发送 DM,必须使用 per-channel-peer 或更严格的模式。默认的 main 模式会导致所有用户共享同一会话上下文,Alice 的敏感信息可能被 Bob 检索到。

2.3 群组与会话隔离

群组(Group)和频道(Channel)天然隔离,每个群聊都有独立的 Session Key:

群组 Key:agent:<agentId>:<channel>:group:<groupId>
话题 Key:agent:<agentId>:<channel>:group:<groupId>:topic:<threadId>

特殊场景 - Matrix 双人"群":
Matrix 协议中,成员数为 2 的房间会被视为 DM 处理,即便用户主观上认为是"群组"。这会导致多个双人房间被路由到同一个 Session Key(当使用 per-channel-peer 时),这是协议层的限制。

三、作用域策略(Scope)深度对比

OpenClaw 提供两级作用域配置:session.scope 控制群组行为,session.dmScope 控制私聊行为。

3.1 群组作用域:session.scope

行为 适用场景
per-sender (默认) 每个发送者在群组中有独立上下文 群聊中保持个人历史连贯性
global 群内所有人共享同一上下文 协作白板、群共享记忆

选择建议:

  • 客户服务群:使用 per-sender,每个用户的咨询历史独立,避免信息混淆
  • 项目管理群:使用 global,团队共享项目上下文,便于协作

3.2 身份链接(Identity Links)
当同一用户在多个渠道(如 Telegram + Discord)联系 Bot 时,可通过 identityLinks 将其会话合并,实现跨渠道连续性:

{
  session: {
    dmScope: "per-channel-peer",
    identityLinks: {
      alice: [
        "telegram:123456789",
        "discord:987654321012345678",
        "whatsapp:15555550123"
      ]
    }
  }
}

链接效果:
无论 Alice 从哪个渠道发送消息,都会被路由到同一个 alice 会话命名空间,保持跨平台的记忆连贯性。

四、会话生命周期与状态机

OpenClaw 的会话遵循严格的生命周期管理,从创建到归档有明确的状态转换规则。

4.1 生命周期状态图

+-----------+     +------------+     +------------+     +-------------+
|   Start   |---->|  Active    |---->|  Compaction|---->|   Expiry    |
| (Created) |     | ( chatting)|     | (Context   |     | (Reset/     |
|           |     |            |     |  Management)|     |  Archive)   |
+-----------+     +------+-----+     +------------+     +------+------+
                         |                                      |
                         |                                      |
                         v                                      v
                  +------------+                       +-------------+
                  |   Idle     |                       |   Restart   |
                  |  (waiting) |                       |  (Gateway   |
                  |            |                       |   restart)  |
                  +------+-----+                       +------+------+
                         |                                      |
                         |                                      |
                         +--------------->+---------------------+
                                          |
                                          v
                                   +-------------+
                                   |  Recovery   |
                                   | (Reload from|
                                   |  sessions.  |
                                   |  json)      |
                                   +-------------+

4.2 关键阶段说明

  1. 创建(Start)
    会话在收到首条消息时惰性创建,无需预配置。创建时初始化:
    Session Key 计算
    系统提示词(System Prompt)注入
    工具集(Tools)绑定
  2. 激活(Active)
    会话处于消息交互状态,此时:
    Agent Loop 持续运转
    工具调用结果实时注入上下文
    消息追加写入 sessions.json
  3. 压缩(Compaction)
    当对话历史接近模型上下文窗口上限时,自动触发 Compaction:
    早期消息被摘要(Summarization)替代
    保留关键决策节点与工具调用结果
    用户可通过配置 reserveTokensFloor 控制保留阈值
  4. 过期(Expiry)
    会话过期有三种触发机制:
机制 配置项 说明
定时重置 reset.mode: "daily" 每天 4:00 AM(可配置 atHour)自动清理
空闲超时 reset.idleMinutes 无消息交互后自动过期,先到先执行
手动触发 /new, /reset 用户主动重置,立即生效

分类型重置策略:

{
  session: {
    resetByType: {
      thread: { mode: "daily", atHour: 4 },     // 话题每日清理
      dm: { mode: "idle", idleMinutes: 240 },   // 私聊4小时无活动清理
      group: { mode: "idle", idleMinutes: 120 } // 群聊2小时无活动清理
    },
    resetByChannel: {
      discord: { mode: "idle", idleMinutes: 10080 } // Discord 7天超长保留
    }
  }
}

4.3 断点续传机制

OpenClaw 的持久化设计支持长时间任务的断点续传:

场景:Agent 正在执行一个耗时 30 分钟的代码分析任务
      中途 Gateway 因系统维护重启

+-------------------+        +-------------------+        +-------------------+
|   Task Running    |        |  Gateway Restart  |        |   Task Resume     |
|  (Session Active) |   -->  |  (State Saved to  |   -->  |  (Reload Session  |
|                   |        |   sessions.json)  |        |   from Disk)      |
+-------------------+        +-------------------+        +-------------------+
          |                            |                            |
          v                            v                            v
+---------+---------+        +---------+---------+        +---------+---------+
|  工具执行中状态    |        |  自动序列化会话    |        |  恢复执行上下文    |
|  - 代码块执行进度  |        |  - 消息历史        |        |  - 继续未完成的    |
|  - 中间变量       |        |  - 工具调用栈      |        |    文件分析        |
|  - 临时文件句柄   |        |  - 待办事项列表    |        |  - 保留中间结果    |
+-------------------+        +-------------------+        +-------------------+

实现原理:

  • 每条消息和工具调用结果实时追加写入 sessions.json(Append-only)
  • Gateway 重启后,从磁盘加载最后状态重建 Session 对象
  • 若任务涉及外部状态(如沙箱容器),需配合幂等性设计

五、会话持久化与存储机制

5.1 存储路径与格式

默认存储位置遵循 XDG 规范:

~/.openclaw/agents/{agentId}/sessions/sessions.json

文件格式:JSON Lines(每行一个 JSON 对象),便于追加写入与流式读取。
单条记录结构:

{
  "timestamp": "2026-03-09T14:23:01.123Z",
  "role": "assistant",
  "content": "分析完成...",
  "tool_calls": [...],
  "session_key": "agent:main:telegram:dm:123456789"
}

5.2 高可用与备份策略

生产环境建议实施以下策略:

  • 实时同步:使用 inotify 监听 sessions.json 变更,实时同步至对象存储(如 B2、S3)
  • Compaction 前备份:在 Compaction 触发前(可能丢失早期上下文)自动创建快照
  • 跨机迁移:新机器首次启动时,从备份自动恢复完整状态(含会话历史与记忆)

六、生产环境配置建议

基于多租户安全与运维经验,推荐以下配置模板:

{
  session: {
    // 安全隔离(多用户场景必需)
    dmScope: "per-channel-peer",
    scope: "per-sender",
    
    // 身份归一(可选)
    identityLinks: {
      // "user1": ["telegram:xxx", "discord:yyy"]
    },
    
    // 生命周期管理
    reset: {
      mode: "daily",
      atHour: 4,
      idleMinutes: 240  // 4小时无活动清理
    },
    resetByType: {
      dm: { mode: "idle", idleMinutes: 60 },      // 私聊1小时超时
      group: { mode: "daily", atHour: 4 }         // 群聊每日清理
    },
    resetTriggers: ["/new", "/reset", "/clear"],
    
    // 存储配置
    store: "~/.openclaw/agents/{agentId}/sessions/sessions.json",
    
    // 发送策略(可选限流)
    sendPolicy: {
      rules: [
        { action: "deny", match: { chatType: "group", channel: "telegram" } }
      ],
      default: "allow"
    }
  }
}

七、总结

OpenClaw 的 Session 管理体系通过分层 Key 设计(Agent → Channel → Type → ID)实现了精细化的作用域控制,per-channel-peer 模式为多用户场景提供了必需的安全隔离。其事件溯源式持久化(Append-only JSONL)与惰性加载机制,既保证了 Gateway 重启后的状态恢复,又支持长时间任务的断点续传。
对于架构师而言,理解 dmScope 与 scope 的矩阵组合(2×2=4 种隔离模式)是设计安全多租户系统的关键。在团队协作场景中,务必避免使用默认的 main 模式,防止会话上下文跨用户泄露。

本文章基于OpenClaw官方文档学习撰写。仅供学习参考,请勿用于商业用途。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐