概述
会话管理是 OpenClaw 的核心机制之一。合理配置会话作用域和重置策略,能确保不同用户、不同频道之间的对话互不干扰,同时在需要时共享上下文。
会话作用域(Session Scope)
session.scope 决定了会话的隔离粒度,OpenClaw 提供三种作用域模式:
per-sender
每个发送者拥有独立会话,无论在哪个频道发消息,同一用户的对话都共享上下文:
// ~/.openclaw/openclaw.json
{
"session": {
"scope": "per-sender"
}
}
适用场景:个人助手模式,用户希望跨频道保持连续对话。
per-channel-peer
按频道和对话对象隔离,同一频道中的不同对话各有独立会话:
{
"session": {
"scope": "per-channel-peer"
}
}
适用场景:客服机器人,需要为每个客户维护独立的对话历史。
per-account-channel-peer
最细粒度的隔离方式,按账号、频道和对话对象三维隔离:
{
"session": {
"scope": "per-account-channel-peer"
}
}
适用场景:多账号运行环境,确保不同机器人账号的会话完全独立。
会话重置策略
session.reset 控制何时清空会话历史并开始新对话。
定时重置(daily)
每天在指定小时自动重置所有会话:
{
"session": {
"reset": {
"policy": "daily",
"hour": 4 // 每天凌晨 4 点重置
}
}
}
适合固定工作周期的场景,例如每日早晨以全新状态开始。
空闲重置(idle-based)
当会话空闲超过指定时间后自动重置:
{
"session": {
"reset": {
"policy": "idle",
"idleMinutes": 30 // 30 分钟无交互后重置
}
}
}
适合临时性对话场景,用户离开后自动清理上下文。
私聊消息合并
在 DM(直接消息)场景中,OpenClaw 将所有私聊消息合并到一个共享主会话中。这意味着用户通过私聊发送的消息不会因为作用域配置而被拆分成多个会话。
用户 A (DM) ──┐
├──> 共享主会话(Main Session)
用户 A (DM) ──┘
这一设计确保私聊场景下的对话体验连贯自然。
群聊隔离
与私聊不同,群聊中的消息始终按照 session.scope 配置进行隔离。每个群组拥有独立的会话上下文:
群组 A ──> 会话 A
群组 B ──> 会话 B
群组 C ──> 会话 C
会话键模式(Session Key Patterns)
OpenClaw 内部使用会话键(Session Key)来唯一标识每个会话。键的格式取决于作用域配置:
| 作用域 | 键模式示例 |
|---|---|
| per-sender | sender:user123 |
| per-channel-peer | channel:discord-general:peer:user123 |
| per-account-channel-peer | account:bot1:channel:discord-general:peer:user123 |
了解键模式有助于在调试时快速定位会话问题。
配置实战示例
以下是一个结合多种配置的完整示例:
{
"session": {
"scope": "per-channel-peer",
"reset": {
"policy": "idle",
"idleMinutes": 60
}
}
}
该配置实现的效果:
- 每个频道中的每个用户拥有独立会话
- 用户 60 分钟不活跃后,会话自动重置
- 私聊消息仍然合并到共享主会话
故障排查
会话内容意外丢失?
- 检查
session.reset策略是否触发了重置 - 确认是否处于 DM 模式(私聊消息会合并到主会话)
不同用户的对话互相串扰?
- 将
session.scope从per-sender切换为per-channel-peer - 使用
openclaw doctor --fix验证配置是否生效
群聊中机器人回复了不相关的内容?
- 检查作用域配置是否正确匹配群聊场景
- 确认群聊会话是否因空闲超时被重置