当前位置: 首页 > news >正文

OpenClaw从入门到应用——Agent:会话管理

通过OpenClaw实现副业收入:《OpenClaw赚钱实录:从“养龙虾“到可持续变现的实践指南》

会话管理

OpenClaw 将每个智能体的一个直接聊天会话视为主要会话。直接聊天会折叠为agent::(默认为main),而群组/频道聊天则拥有各自的键。session.mainKey设置会被尊重。

使用session.dmScope来控制**私信(Direct Messages, DM)**的分组方式:

  • main(默认):所有私信共享主会话,以保持上下文连续性。
  • per-peer:按发送者 ID 跨频道隔离。
  • per-channel-peer:按频道 + 发送者隔离(推荐用于多用户收件箱)。
  • per-account-channel-peer:按账户 + 频道 + 发送者隔离(推荐用于多账户收件箱)。
    使用session.identityLinks将带有提供商标识前缀的对端 ID 映射到一个规范身份,以便在使用per-peerper-channel-peerper-account-channel-peer时,同一个人在不同频道上的私信会话可以共享。

安全私信模式(推荐用于多用户设置)

安全警告:如果您的智能体可以接收来自多个用户的私信,您应强烈考虑启用安全私信模式。如果不启用,所有用户将共享相同的对话上下文,这可能导致用户间的私人信息泄露。

默认设置下问题的示例:

  • Alice(``)向您的智能体发送了一条关于私人话题的消息(例如,一次医疗预约)
  • Bob(``)向您的智能体询问:“我们刚才在聊什么?”
  • 由于两条私信共享同一个会话,模型可能会使用 Alice 之前的上下文来回答 Bob。

解决方案:设置dmScope以按用户隔离会话:

// ~/.openclaw/openclaw.json { session: { // 安全私信模式:按频道 + 发送者隔离私信上下文。 dmScope: "per-channel-peer", }, }

何时应启用此功能:

  • 您已为多个发送者启用了配对批准
  • 您的私信白名单包含多个条目
  • 您设置了dmPolicy: "open"
  • 多个电话号码或账户可以向您的智能体发送消息

注意事项:

  • 默认值为dmScope: "main",以保证连续性(所有私信共享主会话)。这对于单用户设置是合适的。
  • 本地 CLI 引导流程在未设置时默认写入session.dmScope: "per-channel-peer"(已存在的显式值会被保留)。
  • 对于同一频道上的多账户收件箱,建议使用per-account-channel-peer
  • 如果同一个人通过多个频道联系您,请使用session.identityLinks将其私信会话合并到一个规范身份下。
  • 您可以通过openclaw security audit命令验证您的私信设置(参见 https://blog.csdn.net/hy592070616/article/details/81707766)。

网关是唯一数据源

所有会话状态均由网关(“主” OpenClaw 实例)持有。UI 客户端(macOS 应用、WebChat 等)必须向网关查询会话列表和令牌计数,而不是读取本地文件。

  • 远程模式下,您关心的会话存储位于远程网关主机上,而非您的 Mac 上。
  • UI 中显示的令牌计数来自网关存储中的字段(inputTokensoutputTokenstotalTokenscontextTokens)。客户端不会解析 JSONL 转录文件来“修正”总计数。

状态存储位置

  • 网关主机上:
    • 存储文件:~/.openclaw/agents//sessions/sessions.json(每个智能体一份)。
  • 转录文件:~/.openclaw/agents//sessions/.jsonl(Telegram 话题会话使用.../-topic-.jsonl)。
  • 存储是一个sessionKey -> { sessionId, updatedAt, ... }的映射。删除条目是安全的;它们会在需要时被重新创建。
  • 群组条目可能包含displayNamechannelsubjectroomspace,以便在 UI 中为会话添加标签。
  • 会话条目包含origin元数据(标签 + 路由提示),以便 UI 可以解释会话的来源。
  • OpenClaw不会读取旧版 Pi/Tau 会话文件夹。

维护

OpenClaw 会对会话存储执行维护操作,以确保sessions.json和转录文件随时间推移保持在合理范围内。

默认值

  • session.maintenance.mode:warn
  • session.maintenance.pruneAfter:30d
  • session.maintenance.maxEntries:500
  • session.maintenance.rotateBytes:10mb
  • session.maintenance.resetArchiveRetention: 默认为pruneAfter(30d)
  • session.maintenance.maxDiskBytes: 未设置(禁用)
  • session.maintenance.highWaterBytes: 在启用磁盘预算时,默认为maxDiskBytes80%

工作原理

维护操作在会话存储写入期间运行,您也可以通过openclaw sessions cleanup命令按需触发。

  • mode: "warn":报告将被清理的内容,但不修改条目/转录文件。
  • mode: "enforce":按以下顺序应用清理:
    1. 清理早于pruneAfter的过期条目
    2. 将条目数量限制在maxEntries以内(优先清理最旧的)
    3. 为已移除且不再被引用的条目归档转录文件
    4. 根据保留策略清除旧的*.deleted.*.reset.归档
    5. sessions.json大小超过rotateBytes时进行轮转
    6. 如果设置了maxDiskBytes,则根据highWaterBytes执行磁盘预算(优先清理最旧的制品,然后是最旧的会话)

大型存储的性能注意事项

在高流量环境中,大型会话存储很常见。维护工作是在写入路径上执行的,因此非常大的存储可能会增加写入延迟。

最增加成本的因素:

  • 非常高的session.maintenance.maxEntries
  • 较长的pruneAfter窗口,导致过期条目长期保留
  • ~/.openclaw/agents//sessions/目录中存在大量转录/归档制品
  • 在没有合理修剪/上限限制的情况下启用磁盘预算(maxDiskBytes

应对措施:

  • 在生产环境中使用mode: "enforce",以便自动限制增长
  • 同时设置时间和数量限制(pruneAfter+maxEntries),而非仅设置其中之一
  • 在大型部署中为会话目录设置maxDiskBytes+highWaterBytes以建立硬性上限
  • 保持highWaterBytes明显低于maxDiskBytes(默认为 80%)
  • 在更改配置后,运行openclaw sessions cleanup --dry-run --json以在强制执行前验证预计影响
  • 对于频繁活动的会话,在手动清理时传递--active-key参数

自定义示例

使用保守的强制策略:

{ session: { maintenance: { mode: "enforce", pruneAfter: "45d", maxEntries: 800, rotateBytes: "20mb", resetArchiveRetention: "14d", }, }, }

为会话目录启用硬性磁盘预算:

{ session: { maintenance: { mode: "enforce", maxDiskBytes: "1gb", highWaterBytes: "800mb", }, }, }

为大型安装进行调优(示例):

{ session: { maintenance: { mode: "enforce", pruneAfter: "14d", maxEntries: 2000, rotateBytes: "25mb", maxDiskBytes: "2gb", highWaterBytes: "1.6gb", }, }, }

从 CLI 预览或强制执行维护:

openclaw sessions cleanup --dry-run openclaw sessions cleanup--enforce

会话修剪

OpenClaw 默认会在 LLM 调用之前,从内存上下文中修剪旧的工具结果
不会重写 JSONL 历史记录。参见 https://blog.csdn.net/hy592070616/article/details/81707766。

预压缩内存刷新

当会话接近自动压缩时,OpenClaw 可以执行一次静默内存刷新
提醒模型将持久性笔记写入磁盘。此操作仅在工作区可写时运行。参见 https://blog.csdn.net/hy592070616/article/details/81707766 和 https://blog.csdn.net/hy592070616/article/details/81707766。

传输层到会话键的映射

  • 直接聊天遵循session.dmScope(默认为main)。
    • main:agent::(跨设备/频道的连续性)。
      • 多个电话号码和频道可以映射到同一个智能体主键;它们作为传输层进入同一个对话。
    • per-peer:agent::direct:
    • per-channel-peer:agent:::direct:
    • per-account-channel-peer:agent::::direct:(accountId 默认为default)。
    • 如果session.identityLinks匹配了一个带有提供商标识前缀的对端 ID(例如telegram:123),规范键将替换 ``,以便同一个人在不同频道上共享同一个会话。
  • 群组聊天隔离状态:agent:::group:(房间/频道使用agent:::channel:)。
    • Telegram 论坛话题会在群组 ID 后附加:topic:以实现隔离。
    • 旧版group:键仍被识别以支持迁移。
  • 入站上下文可能仍使用group:;频道从Provider推断并规范化为标准的agent:::group:形式。
  • 其他来源:
    • 定时任务:cron:(隔离)或自定义session:(持久)
    • Webhook:hook:(除非由 webhook 显式设置)
    • 节点运行:node-

生命周期

  • 重置策略:会话在过期前会被重复使用,过期评估在下一条入站消息到达时进行。
  • 每日重置:默认为网关主机本地时间凌晨 4:00。一旦会话的最后更新时间早于最近一次每日重置时间,该会话即被视为过期。
  • 空闲重置(可选):idleMinutes添加一个滑动空闲窗口。当同时配置了每日和空闲重置时,先到期的条件将触发新会话。
  • 旧版仅空闲模式:如果您设置了session.idleMinutes但没有任何session.reset/resetByType配置,OpenClaw 将出于向后兼容性保持在仅空闲模式。
  • 按类型覆盖(可选):resetByType允许您为directgroupthread会话覆盖策略(thread = Slack/Discord 线程、Telegram 话题、连接器提供的 Matrix 线程)。
  • 按频道覆盖(可选):resetByChannel为特定频道覆盖重置策略(适用于该频道的所有会话类型,并优先于reset/resetByType)。
  • 重置触发器:精确的/new/reset(以及resetTriggers中的任何额外项)会启动一个新的会话 ID 并传递消息的其余部分。/new接受模型别名、provider/model或提供者名称(模糊匹配)来设置新会话模型。如果单独发送/new/reset,OpenClaw 会运行一个简短的“你好”问候回合以确认重置。
  • 手动重置:从存储中删除特定键或移除 JSONL 转录文件;下一条消息将重新创建它们。
  • 隔离的定时任务每次运行都会生成一个新的sessionId(不进行空闲复用)。

发送策略(可选)

阻止特定会话类型的投递,而无需列出单个 ID。

{ session: { sendPolicy: { rules: [ { action: "deny", match: { channel: "discord", chatType: "group" } }, { action: "deny", match: { keyPrefix: "cron:" } }, // 匹配原始会话键(包括 `agent::` 前缀)。 { action: "deny", match: { rawKeyPrefix: "agent:main:discord:" } }, ], default: "allow", }, }, }

运行时覆盖(仅限所有者):

  • /send on→ 允许此会话
  • /send off→ 拒绝此会话
  • /send inherit→ 清除覆盖并使用配置规则
    将这些作为独立消息发送以便注册生效。

配置(可选重命名示例)

// ~/.openclaw/openclaw.json { session: { scope: "per-sender", // 保持群组键分离 dmScope: "main", // 私信连续性(为共享收件箱设置 per-channel-peer/per-account-channel-peer) identityLinks: { alice: ["telegram:123456789", "discord:987654321012345678"], }, reset: { // 默认值:mode=daily, atHour=4(网关主机本地时间)。 // 如果同时设置了 idleMinutes,则先到期的条件生效。 mode: "daily", atHour: 4, idleMinutes: 120, }, resetByType: { thread: { mode: "daily", atHour: 4 }, direct: { mode: "idle", idleMinutes: 240 }, group: { mode: "idle", idleMinutes: 120 }, }, resetByChannel: { discord: { mode: "idle", idleMinutes: 10080 }, }, resetTriggers: ["/new", "/reset"], store: "~/.openclaw/agents/{agentId}/sessions/sessions.json", mainKey: "main", }, }

检查

  • openclaw status— 显示存储路径和最近的会话。
  • openclaw sessions --json— 转储所有条目(使用--active过滤)。
  • openclaw gateway call sessions.list --params '{}'— 从运行中的网关获取会话(使用--url/--token访问远程网关)。
  • 在聊天中发送/status作为独立消息,以查看智能体是否可达、会话上下文的使用量、当前的思考/快速/详细切换状态,以及 WhatsApp Web 凭据上次刷新的时间(有助于发现需要重新链接的情况)。
  • 发送/context list/context detail以查看系统提示和注入的工作区文件内容(以及最大的上下文贡献者)。
  • 发送/stop(或独立的中止短语如stopstop actionstop runstop openclaw)以中止当前运行、清除该会话的排队后续操作,并停止从中派生的任何子智能体运行(回复中包含已停止的数量)。
  • 发送/compact(可选指令)作为独立消息,以总结较旧的上下文并释放窗口空间。参见 https://blog.csdn.net/hy592070616/article/details/81707766。
  • JSONL 转录文件可以直接打开以审查完整的交互回合。

提示

  • 将主键专用于 1:1 流量;让群组保持各自的键。
  • 在自动化清理时,删除单个键而不是整个存储,以保留其他地方的上下文。

会话来源元数据

每个会话条目都会在origin中记录其来源(尽力而为):

  • label:人类可读标签(从对话标签 + 群组主题/频道解析而来)
  • provider:标准化的频道 ID(包括扩展)
  • from/to:入站信封中的原始路由 ID
  • accountId:提供者账户 ID(用于多账户时)
  • threadId:当频道支持时的线程/话题 ID
    这些来源字段会为直接消息、频道和群组填充。如果
    连接器仅更新投递路由(例如,为了保持 DM 主会话的新鲜度),
    它仍应提供入站上下文,以便会话保留其解释性元数据。扩展可以通过在入站
    上下文中发送ConversationLabel
    GroupSubjectGroupChannelGroupSpaceSenderName并调用recordSessionMetaFromInbound(或向updateLastRoute传递相同的上下文)来实现这一点。
    `
http://www.jsqmd.com/news/728363/

相关文章:

  • 第16章:OpenClaw的故障排查与问题解决
  • STM32CubeMX实战:用TIM6/TIM7基本定时器实现精准微秒级延时(附完整代码)
  • 百度网盘下载加速终极指南:BaiduPCS-Web让你的下载速度飞起来
  • python pydocstyle
  • 2026年当下,小型压力蒸汽灭菌器优质供应商深度解析与推荐 - 2026年企业推荐榜
  • 3分钟掌握Wallpaper Engine创意工坊下载器:免费获取海量动态壁纸的终极指南
  • 为什么企业做 AI Agent Harness Engineering 必须先做数据治理
  • Dify权限策略热更新失效?揭秘企业级场景下策略编译延迟<50ms的C++策略引擎替换实践(含性能压测对比数据)
  • 【限时解禁】Dify私有化部署下的跨域集成密钥库:TLS双向认证+SPI扩展点注入的6重安全加固方案(仅开放72小时)
  • 全平台智能资源下载工具:res-downloader 完整使用教程
  • 如何快速免费解密网易云音乐NCM文件:ncmdump工具完整指南
  • 第15章:一人公司实战案例(内容创作!社群运营)
  • 2026重庆450分左右可靠高中排行:重庆450分可以读什么普高,重庆450分可以读什么高中,优选指南! - 优质品牌商家
  • 从TTL到eDP:嵌入式工程师选屏接口的实战避坑指南(附信号实测对比)
  • ComfyUI-AnimateDiff-Evolved终极指南:从零开始创建专业AI动画
  • 2026年现阶段辽宁地区检查井模具采购指南:为何保定卓阳模具制造有限公司值得关注 - 2026年企业推荐榜
  • 2026 HTTP请求走私全栈指南:从协议底层到HackerOne百万赏金实战
  • 深度解析RyzenAdj:锐龙处理器的专业功耗调优指南
  • 使用 Taotoken CLI 工具一键配置团队开发环境
  • 3分钟极速导出:YaeAchievement带你告别原神成就手动记录
  • python darglint
  • 医学实体识别技术与临床决策支持系统实践
  • 劲爆!豆包说爱因斯坦对原子弹贡献只有一个公式
  • MPC-BE:基于DirectShow架构的专业级开源媒体播放解决方案
  • 2026年近期智能色粉机实力供应商推荐:聚焦宁波恒域智能科技有限公司 - 2026年企业推荐榜
  • 如何在老旧电脑上安装Windows 11:5分钟掌握MediaCreationTool.bat终极指南
  • 实测 Taotoken 多模型路由的响应延迟与稳定性体感
  • 睡眠质量资产量化程序,颠覆健康无收益,睡眠数据脱敏上链,可用于健康研究并获得奖励。
  • 使用curl命令直接测试Taotoken的OpenAI兼容接口连通性
  • 如何用Blender处理MMD模型:MMD Tools插件的完整解决方案