什么是会话
在 OpenClaw 中,会话(Session) 是智能体与用户之间的一次完整对话。每个会话拥有独立的上下文——智能体在一个会话中记住的内容不会自动出现在另一个会话中。 你可以把会话想象成聊天软件里的"对话窗口": - 每个对话窗口有自己的聊天记录 - 切换窗口后,之前的对话内容不会混在一起 - 关闭窗口后,聊天记录仍然保存在本地 会话是 OpenClaw 上下文管理的基本单位。理解会话机制,能帮助你更好地控制智能体的行为和资源消耗。会话存储位置
OpenClaw 将所有会话数据存储在本地文件系统中,使用 JSONL(JSON Lines)格式。存储目录结构
``
~/.openclaw/agents//sessions/
├── .jsonl
├── .jsonl
├── .jsonl
└── ...
`
每个 .jsonl 文件就是一个会话,文件中的每一行是一条消息记录(JSON 格式)。
查看会话文件
`bash
查看会话目录
ls ~/.openclaw/agents/default/sessions/
查看某个会话的内容(每行一条消息)
cat ~/.openclaw/agents/default/sessions/.jsonl
统计会话数量
ls ~/.openclaw/agents/default/sessions/ | wc -l
`
JSONL 格式说明
每条消息记录包含以下关键字段:
`json
{
"role": "user",
"content": "你好,帮我写一个 Python 脚本",
"timestamp": "2025-01-15T10:30:00Z"
}
`
`json
{
"role": "assistant",
"content": "好的,我来帮你写一个 Python 脚本...",
"timestamp": "2025-01-15T10:30:05Z",
"tokens": { "input": 150, "output": 320 }
}
`
JSONL 格式的优势:
- 追加写入:新消息直接追加到文件末尾,不需要重写整个文件
- 流式读取:可以逐行读取,不需要一次性加载整个会话
- 易于调试:纯文本格式,可以直接用文本编辑器查看
会话 ID 和路由
会话 ID 的生成规则
会话 ID 由渠道(Channel) 和联系人(Contact) 的组合决定:
`
会话 ID = 渠道类型 + 渠道标识 + 联系人标识
`
例如:
- Telegram 用户 @alice 的会话 → telegram:bot123:alice
- WhatsApp 用户 +86138xxxx 的会话 → whatsapp:myphone:8613800001111
- WebChat 匿名用户的会话 → webchat:default:anonymous-abc123
路由机制
当一条消息到达 Gateway 时,OpenClaw 按以下步骤确定会话:
1. 识别渠道:消息来自哪个渠道(Telegram、WhatsApp、WebChat 等)
2. 识别联系人:消息来自哪个用户(用户 ID、手机号等)
3. 查找会话:根据渠道 + 联系人组合查找已有会话
4. 创建或复用:如果找到已有会话则继续对话,否则创建新会话
这意味着:
- 同一个用户在同一个渠道上,始终使用同一个会话
- 同一个用户在不同渠道上,使用不同的会话
- 不同用户在同一个渠道上,各自有独立的会话
多智能体路由
如果你配置了多个智能体,会话路由还会考虑 Bindings 规则:
`json
{
"agents": {
"list": [
{
"id": "work-agent",
"bindings": [
{ "channel": "telegram", "peer": "@alice" }
]
},
{
"id": "personal-agent",
"bindings": [
{ "channel": "whatsapp" }
]
}
]
}
}
`
在这个配置中:
- Telegram 上 @alice 的消息路由到 work-agent
- WhatsApp 上所有消息路由到 personal-agent
- 每个智能体有自己独立的会话目录
会话压缩(Compaction)
为什么需要压缩
每次智能体回复时,都需要把整个会话历史发送给 AI 模型。随着对话越来越长,会出现两个问题:
1. 超出上下文窗口:模型有 Token 上限(如 128K),超长对话会被截断
2. 成本增加:发送的 Token 越多,API 费用越高
会话压缩(Compaction)就是解决这个问题的机制——当对话太长时,自动将早期对话总结为一段摘要,释放上下文空间。
压缩的工作原理
`
压缩前:
[消息1] [消息2] [消息3] ... [消息50] [消息51] [消息52]
↑ 上下文快满了
压缩后:
[摘要:消息1-50的总结] [消息51] [消息52]
↑ 上下文空间充足
`
压缩过程:
1. OpenClaw 检测到上下文使用率超过阈值(通常 70-80%)
2. 自动将早期消息发送给模型,生成一段总结摘要
3. 用摘要替换原始消息,大幅减少 Token 数量
4. 最近的消息保持原样,确保对话连贯性
压缩配置
在 ~/.openclaw/openclaw.json 中配置压缩行为:
`json
{
"compaction": {
"enabled": true,
"threshold": 0.75,
"keepRecent": 10
}
}
`
| 参数 | 说明 | 默认值 |
|------|------|--------|
| enabled | 是否启用自动压缩 | true |
| threshold | 上下文使用率触发阈值 | 0.75(75%) |
| keepRecent | 压缩时保留最近的消息数 | 10 |
压缩的影响
压缩后,智能体对早期对话的记忆会变成"概括性"的:
- ✅ 记得讨论过什么主题
- ✅ 记得关键的结论和决定
- ❌ 可能忘记具体的措辞和细节
- ❌ 可能忘记中间的推理过程
如果你需要智能体记住某些重要信息,建议使用 Memory 系统(长期记忆)而不是依赖会话历史。
会话修剪(Pruning)
为什么需要修剪
随着时间推移,会话文件会越来越多,占用磁盘空间。会话修剪(Pruning)用于删除旧的、不再需要的会话文件。
修剪策略
OpenClaw 支持按时间修剪会话:
`bash
删除 30 天前的会话
openclaw sessions prune --older-than 30d
删除 7 天前的会话
openclaw sessions prune --older-than 7d
预览将被删除的会话(不实际删除)
openclaw sessions prune --older-than 30d --dry-run
`
修剪注意事项
- 修剪是不可逆的,删除后无法恢复
- 建议先用 --dry-run 预览,确认无误后再执行
- 修剪不会影响正在进行的会话
- 如果某些会话很重要,可以手动备份 .jsonl 文件
`bash
备份重要会话
cp ~/.openclaw/agents/default/sessions/important-session.jsonl ~/backup/
`
CLI 会话管理命令
OpenClaw 提供了一组 CLI 命令来管理会话。
查看会话列表
`bash
列出所有会话
openclaw sessions list
列出指定智能体的会话
openclaw sessions list --agent work-agent
以表格形式显示
openclaw sessions list --format table
`
输出示例:
`
Session ID Agent Channel Last Active
telegram:bot123:alice default telegram 2 hours ago
whatsapp:myphone:8613800001111 default whatsapp 1 day ago
webchat:default:anonymous-abc123 default webchat 3 days ago
`
查看会话历史
`bash
查看某个会话的对话历史
openclaw sessions history
只看最近 20 条消息
openclaw sessions history --limit 20
以 JSON 格式输出
openclaw sessions history --format json
`
修剪旧会话
`bash
删除 30 天前的会话
openclaw sessions prune --older-than 30d
预览将被删除的会话
openclaw sessions prune --older-than 30d --dry-run
删除指定智能体的旧会话
openclaw sessions prune --older-than 14d --agent work-agent
`
会话统计
`bash
查看会话统计信息
openclaw sessions stats
输出示例:
Total sessions: 42
Active (last 7 days): 8
Disk usage: 12.3 MB
Oldest session: 2024-12-01
`
多渠道会话隔离
OpenClaw 的会话是按渠道 + 联系人隔离的。这意味着同一个人在不同渠道上与智能体的对话是完全独立的。
隔离示例
假设用户 Alice 同时使用 Telegram 和 WhatsApp 与你的智能体对话:
`
Telegram 会话(telegram:bot123:alice):
Alice: 帮我分析这份销售报告
Agent: 好的,我来看看这份报告...
WhatsApp 会话(whatsapp:myphone:alice):
Alice: 今天天气怎么样?
Agent: 让我查一下天气...
`
两个会话完全独立:
- Telegram 会话中的"销售报告"上下文不会出现在 WhatsApp 会话中
- WhatsApp 会话中的"天气"话题不会影响 Telegram 会话
- 两个会话可以同时进行,互不干扰
隔离的好处
1. 上下文清晰:每个渠道的对话主题不会混淆
2. 隐私保护:不同渠道的对话内容互相隔离
3. 灵活使用:可以在不同渠道处理不同类型的任务
跨渠道共享信息
如果你希望智能体在不同渠道之间共享某些信息,可以使用 Memory 系统:
`
在 Telegram 中
Alice: 记住我的邮箱是 alice@example.com
智能体将信息写入 MEMORY.md(长期记忆)
在 WhatsApp 中
Alice: 我的邮箱是什么?
智能体从 MEMORY.md 中读取,跨渠道获取信息
`
Memory 是跨会话、跨渠道的持久化存储,而会话只在单个渠道内有效。
/new 和 /reset 命令
/new — 开始新会话
在任何渠道中发送 /new 命令,可以结束当前会话并开始一个全新的会话:
`
用户: /new
Agent: 好的,已开始新会话。之前的对话上下文已清除。
`
使用场景:
- 当前话题已经结束,想聊一个全新的话题
- 会话上下文太长,想从头开始
- 智能体"记混了",想重置上下文
/new 的效果:
- 创建一个新的会话 ID
- 旧会话的 .jsonl 文件保留在磁盘上
- 新会话从空白上下文开始(但 Memory 和 SOUL.md 仍然生效)
/reset — 重置当前会话
/reset 与 /new 类似,但有细微区别:
`
用户: /reset
Agent: 会话已重置。
`
/reset 的效果:
- 清除当前会话的对话历史
- 保持同一个会话 ID
- 相当于"清空聊天记录"
/new vs /reset 对比
| 特性 | /new | /reset |
|------|------|--------|
| 会话 ID | 创建新 ID | 保持原 ID |
| 旧对话记录 | 保留在磁盘 | 被清除 |
| 上下文 | 全新开始 | 全新开始 |
| Memory | 仍然生效 | 仍然生效 |
| SOUL.md | 仍然生效 | 仍然生效 |
一般来说:
- 想保留旧对话记录用 /new
- 想彻底清理用 /reset
实用技巧
1. 定期修剪旧会话
设置一个定时任务,自动清理旧会话:
`bash
添加 cron 任务,每周日凌晨清理 30 天前的会话
openclaw cron add "0 0 * * 0" "openclaw sessions prune --older-than 30d"
`
2. 监控会话磁盘使用
`bash
查看会话目录大小
du -sh ~/.openclaw/agents/*/sessions/
查看最大的会话文件
ls -lhS ~/.openclaw/agents/default/sessions/ | head -10
`
3. 导出重要会话
`bash
导出会话为可读格式
openclaw sessions history --format json > my-session-backup.json
`
4. 调整压缩阈值
如果你发现智能体经常"忘记"之前的对话内容,可以提高压缩阈值:
`json
{
"compaction": {
"threshold": 0.85,
"keepRecent": 20
}
}
`
这会让压缩更晚触发,保留更多原始消息,但会增加 Token 消耗。
小结
会话是 OpenClaw 上下文管理的核心机制:
- 每个对话是一个独立的会话,存储为 JSONL 文件
- 会话 ID 由渠道 + 联系人组合决定,确保多渠道隔离
- 压缩(Compaction)自动总结长对话,释放上下文空间
- 修剪(Pruning)删除旧会话,释放磁盘空间
- /new 开始新会话,/reset` 重置当前会话
- 跨渠道信息共享需要使用 Memory 系统
理解会话机制,能帮助你更好地控制智能体的上下文、优化 Token 消耗、管理磁盘空间。
#会话管理 #Session #压缩机制 #会话隔离 #龙虾技能库