
🚩 2026 年「术哥无界」系列实战文档 X 篇原创计划 第 61 篇,OpenClaw 最佳实战「2026」系列第 31 篇 大家好,欢迎来到 术哥无界 | ShugeX | 运维有术。 我是术哥,一名专注于 AI 编程、AI 智能体、Agent Skills、MCP、云原生、AIOps、Milvus 向量数据库的技术实践者与开源布道者! Talk is cheap, let's explore。无界探索,有术而行。

图 1:OpenClaw 会话管理核心架构
在搭建 AI Agent 系统时,会话管理是绕不开的核心问题。如果你遇到过这些情况:
这些问题的根源都在于:没有理解会话管理的底层机制。
OpenClaw 提供了一套完整的会话管理方案:从多用户隔离、状态持久化,到基于 TTL 的智能修剪。本文将从底层原理出发,解析这套机制的设计思想。
OpenClaw 将每个 Agent 的直接聊天会话视为核心单元。会话是 Agent 记忆的载体,承载着对话历史、上下文状态和令牌计数等关键信息。
直接聊天会话的键格式为:
agent:<agentId>:<mainKey>
默认 mainKey 为 main。群组和频道聊天拥有独立的键,遵循不同的命名规则。
会话从创建到过期经历以下阶段:
pruneAfter 时间未活跃会话被重用直到过期,过期评估在下一个入站消息时进行。这意味着会话不是每次消息都新建,而是复用已有会话直到它不再有效。
OpenClaw 默认在 gateway 主机本地时间凌晨 4:00 执行每日重置。
此外,还可以配置 空闲重置(idleMinutes)——添加滑动空闲窗口。当同时配置每日和空闲重置时,先到期的强制创建新会话。
{
session: {
reset: {
daily: "04:00",
idleMinutes: 60, // 空闲 60 分钟后重置
},
},
}

图 2:会话生命周期状态机
session.dmScope 控制直接消息的分组方式,提供 4 种隔离模式:
模式 | 键格式 | 适用场景 |
|---|---|---|
main | agent:<agentId>:<mainKey> | 单用户场景,所有 DM 共享主会话 |
per-peer | agent:<agentId>:direct:<peerId> | 按发送者隔离 |
per-channel-peer | agent:<agentId>:<channel>:direct:<peerId> | 多用户收件箱(推荐) |
per-account-channel-peer | agent:<agentId>:<channel>:<accountId>:direct:<peerId> | 多账户收件箱 |
安全警告:如果 Agent 可以接收来自多人的 DM,必须启用安全 DM 模式。否则所有用户共享相同的对话上下文,可能导致用户之间的私人信息泄露。
问题场景:
解决方案:设置 dmScope 隔离每个用户的会话:
{
session: {
dmScope: "per-channel-peer",
},
}

图 3:4 种 dmScope 隔离模式对比
群组聊天的会话键格式为:
agent:<agentId>:<channel>:group:<id>
Telegram 论坛主题附加 :topic:<threadId>,形成更细粒度的隔离。
来源类型 | 键格式 |
|---|---|
Cron jobs | cron:<job.id> |
Webhooks | hook:<uuid> |
Node runs | node-<nodeId> |
使用 session.identityLinks 将提供商前缀的对等 ID 映射到规范身份,这样同一个人在使用 per-peer、per-channel-peer 或 per-account-channel-peer 时可以跨频道共享 DM 会话。
{
session: {
dmScope: "per-peer",
identityLinks: {
"discord:123456": "user:alice",
"slack:U789": "user:alice",
},
},
}
上面的配置让 Alice 在 Discord 和 Slack 上都使用同一个会话。
所有会话状态由 gateway("master" OpenClaw)拥有。这是一个关键的设计决策:
Gateway 是真理之源,UI 客户端(macOS 应用、WebChat 等)必须向 gateway 查询会话列表和令牌计数,而不是读取本地文件。
在 gateway 主机上的存储结构:
~/.openclaw/agents/<agentId>/sessions/
├── sessions.json # 会话索引:sessionKey -> { sessionId, updatedAt, ... }
└── <SessionId>.jsonl # 转录文件
sessions.json 是 sessionKey -> { sessionId, updatedAt, ... } 的映射。删除条目是安全的——它们会在需要时重新创建。

图 4:Gateway 状态存储架构
Session pruning 在每次 LLM 调用前从内存上下文中修剪旧的工具结果。
关键点:
*.jsonl)mode: "cache-ttl" 且该会话的最后一次 Anthropic 调用远于 ttlAnthropic prompt caching 仅在 TTL 内有效。如果会话空闲超过 TTL,下一次请求会重新缓存完整提示,除非先修剪它。
修剪的优势:
cacheWrite 大小内容类型 | 是否可修剪 |
|---|---|
toolResult 消息 | ✅ 可修剪 |
用户消息 | ❌ 从不修改 |
助手消息 | ❌ 从不修改(受保护) |
保护机制:
keepLastAssistants 个助手消息受保护软修剪(soft-trim):
...硬清除(hard-clear):
hardClear.placeholder 替换整个工具结果{
session: {
pruning: {
mode: "cache-ttl",
ttl: "5m",
keepLastAssistants: 3,
softTrimRatio: 0.3,
hardClearRatio: 0.5,
minPrunableToolChars: 50000,
},
},
}
参数 | 默认值 | 说明 |
|---|---|---|
ttl | 5m | 缓存过期时间 |
keepLastAssistants | 3 | 保护的最近助手消息数 |
softTrimRatio | 0.3 | 触发软修剪的大小比例 |
hardClearRatio | 0.5 | 触发硬清除的大小比例 |
minPrunableToolChars | 50000 | 最小可修剪字符数 |

图 5:Session Pruning 决策流程
{
session: {
maintenance: {
mode: "warn",
pruneAfter: "30d",
maxEntries: 500,
rotateBytes: "10mb",
},
},
}
维护在会话存储写入期间运行,也可以通过 openclaw sessions cleanup 手动触发。
当 mode: "enforce" 时,按以下顺序应用清理:
pruneAfter 的条目maxEntries(最旧的优先)sessions.json 超过 rotateBytes 时maxDiskBytes增加成本的因素:
maxEntries 值pruneAfter 窗口优化建议:
mode: "enforce"pruneAfter + maxEntries)maxDiskBytes + highWaterBytes 作为硬上限OpenClaw 提供了 4 个 Session Tools,让 Agent 可以操作会话:
列出会话,支持多种过滤条件:
{
"kinds": ["main", "group"],
"limit": 50,
"activeMinutes": 60,
"messageLimit": 10
}
返回字段包括:key、kind、channel、displayName、updatedAt、sessionId、model、contextTokens、totalTokens。
获取指定会话的历史消息:
{
"sessionKey": "agent:my-agent:main",
"limit": 100,
"includeTools": false
}
向另一个会话发送消息,实现 Agent 间通信:
{
"sessionKey": "agent:another-agent:main",
"message": "请处理这个任务",
"timeoutSeconds": 60
}
行为特点:
timeoutSeconds = 0:入队并返回 { runId, status: "accepted" }timeoutSeconds > 0:等待最多 N 秒完成生成子 Agent 运行任务:
{
"task": "分析这段代码的性能问题",
"label": "code-analysis",
"agentId": "specialized-agent",
"model": "claude-3-sonnet",
"thinking": "high",
"runTimeoutSeconds": 300,
"mode": "run",
"cleanup": "delete"
}
生成的子 Agent 会话键格式:agent:<agentId>:subagent:<uuid>
重要限制:
sessions_spawn(防止无限递归)通过 tools.sessions.visibility 控制会话可见范围:
模式 | 说明 |
|---|---|
self | 仅当前会话键 |
tree | 当前会话 + 由当前会话生成的会话(默认) |
agent | 属于当前 Agent ID 的任何会话 |
all | 任何会话 |
{
session: {
// 多用户隔离
dmScope: "per-channel-peer",
// 会话维护
maintenance: {
mode: "enforce",
pruneAfter: "14d",
maxEntries: 200,
rotateBytes: "5mb",
maxDiskBytes: "500mb",
highWaterBytes: "400mb",
},
// 智能修剪
pruning: {
mode: "cache-ttl",
ttl: "5m",
keepLastAssistants: 3,
},
// 发送策略
sendPolicy: {
rules: [
{ match: { channel: "discord", chatType: "group" }, action: "deny" }
],
default: "allow",
},
},
}
CLI 命令:
openclaw status:显示存储路径和最近会话openclaw sessions --json:转储所有条目openclaw sessions cleanup --dry-run:预览清理操作openclaw sessions cleanup --enforce:强制清理聊天命令:
/status:查看会话状态/context list:查看系统提示和注入的工作区文件/compact:压缩旧上下文/new 或 /reset:启动新会话~/.openclaw/agents/<agentId>/sessions/ 目录大小openclaw sessions --json 定期检查--dry-run 预览清理操作OpenClaw 的会话管理体现了几个关键设计理念:
如果你正在搭建多用户 AI Agent 系统,会话管理是不可忽视的基础设施。理解这些底层机制,能帮助你做出更合理的架构决策。
相关资源
官方文档 - Session Management:https://docs.openclaw.ai/concepts/session
官方文档 - Session Pruning:https://docs.openclaw.ai/concepts/session-pruning
官方文档 - Session Tool:https://docs.openclaw.ai/concepts/session-tool
好啦,谢谢你观看我的文章,如果喜欢可以点赞转发给需要的朋友,我们下一期再见!敬请期待!