【OpenClaw -05】OpenClaw Session 与会话管理:Main、Group、Per-Sender 作用域
在多租户、跨渠道的 AI Agent 场景中,会话隔离(Session Isolation)是数据安全的最后防线。OpenClaw 通过细粒度的作用域策略与智能的会话路由机制,实现了"单用户连贯体验"与"多用户安全隔离"的精妙平衡。本文深度拆解其 Session Key 设计、作用域层级与生命周期管理机制。
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 关键阶段说明
- 创建(Start)
会话在收到首条消息时惰性创建,无需预配置。创建时初始化:
Session Key 计算
系统提示词(System Prompt)注入
工具集(Tools)绑定 - 激活(Active)
会话处于消息交互状态,此时:
Agent Loop 持续运转
工具调用结果实时注入上下文
消息追加写入 sessions.json - 压缩(Compaction)
当对话历史接近模型上下文窗口上限时,自动触发 Compaction:
早期消息被摘要(Summarization)替代
保留关键决策节点与工具调用结果
用户可通过配置 reserveTokensFloor 控制保留阈值 - 过期(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官方文档学习撰写。仅供学习参考,请勿用于商业用途。
更多推荐

所有评论(0)