乐于分享
好东西不私藏

记忆不丢、任务不断!OpenClaw上下文丢失的根因排查与配置实战

记忆不丢、任务不断!OpenClaw上下文丢失的根因排查与配置实战

本文完整还原了一次真实生产环境下的问题排查与解决过程:从 AI Agent 突然“失忆”、长任务意外中断的现象出发,沿着“现象 → 根因 → 机制 → 方案 → 最佳实践”的主线,逐层拆解,每一步都是来自一线的实战记录,而非纸上推演。如果你也曾遇到或正在被上下文丢失、任务中断等类似问题困扰,相信你能从中找到清晰的诊断思路和落地的解决路径。

一、背景与问题描述

1.1 遇到的典型问题

在使用OpenClaw构建AI Agent团队过程中,我们遇到了一个典型问题:

场景描述:小翼(future-xiaoyi)通过飞书向帧帧(future-zhenzhen)发送视频制作任务

帧帧开始执行任务,调用 FFmpeg 进行视频组装

任务完成,帧帧进入等待状态

约43分钟后,通过 webchat 询问:”你还在继续做吗?”

结果:

  1. 帧帧不记得之前的任何工作,上下文中丢失了任务信息
  2. 在会话重置前,任务已中断执行

上下文丢失的代价:

需要重新描述任务

工作进度丢失

体验断裂

1.2 问题根因分析

经过深入排查,发现上下文丢失问题根源是 OpenClaw 的每日重置机制:

  • 每日重置时间:凌晨 4:00(Gateway 主机当地时间)

  • 重置触发时间:04:06:49(延迟6分钟)

  • 会话生命周期:任务完成于 03:23(实际为中断),重置于 04:06,中间间隔43分钟

长任务中断是因为在执行视频组装时出现超时,触发系统超时机制,强制中断了任务执行。

任务执行至 03:23调用 FFmpeg 进行视频组装时超时。

二、OpenClaw会话管理架构原理

2.1 核心组件关系

  • OpenClaw Gateway 是整个系统的核心,它管理着 Channel、Session 和 Agent Engine 三大组件。

  • Channel(通道):负责与外部消息系统(飞书、微信、Telegram等)的通信

  • Session Manager(会话管理器):管理会话的生命周期,负责会话的创建、切换和重置

  • Agent Engine(引擎):执行 Agent 逻辑,处理消息和任务

  • lossless-claw (LCM):提供会话历史的压缩和摘要功能,确保长对话不会超出 Token 限制

2.2 会话(Session)vs 对话(Conversation)

  • Session(会话):OpenClaw 层面的会话概念,存储在 sessions.json 中,与特定 channel/peer 关联,有唯一 sessionId

  • Conversation(对话/上下文):lossless-claw (LCM) 层面的对话概念,存储在 SQLite 数据库中,有 conversationId,包含完整的消息历史和摘要 DAG

2.3 关键配置文件

openclaw.json 中的 session 配置:

{  "session": {    "dmScope": "per-account-channel-peer",    "maintenance": {      "mode": "enforce",      "pruneAfter": "14d",      "maxEntries": 500    }  },  "agents": {    "defaults": {      "timeoutSeconds": 300,      "heartbeat": {        "every": "30m",        "activeHours": {          "start": "07:00",          "end": "24:00"        }      }    }  }}

三、每日重置机制(Daily Reset)

3.1 机制原理

默认行为:每天凌晨 4:00(Gateway 主机当地时间)自动创建新会话。

重置触发时,LCM 会归档当前会话并创建新会话,所有会话历史被保存但新消息进入新会话。

3.2 每日重置 vs Idle 重置

daily 模式:每天指定时间重置,配置项 atHour: 0-23

idle 模式:空闲指定分钟数后重置,配置项 idleMinutes

3.3 如何配置重置策略

方案一:保持每日重置,调整时间

{  "session": {    "reset": {      "mode": "daily",      "atHour": 6    }  }}

方案二:改成 Idle 模式,会话闲置xxx分钟后重置

{  "session": {    "reset": {      "mode": "idle",      "idleMinutes": 480    }  }}

方案三:重置时间改为无限大,完全由手动重置

{  "session": {    "reset": {      "mode": "idle",      "idleMinutes": 26,298,000    }  }}

3.4 实际影响分析

问题现象的时间线:

03:04 北京时间 — 小翼发送视频制作任务

03:04-03:23 — 帧帧执行任务(调用FFmpeg)

03:23 — 任务完成,帧帧进入等待状态

04:00 — 每日重置触发(凌晨4点)

04:06:49 — LCM 归档会话36,创建会话37

04:06:50 — 用户发消息,进入新会话37

结果:上下文丢失!

四、Tick Timeout 机制

4.1 机制原理

WebSocket 连接使用 Tick 心跳来保持连接:

Tick 间隔:30秒

Tick 超时:60秒

超时代码:4000,”tick timeout”

为什么会被中断?

一个任务可能在以下三个层面超时,而且通常最先到达的那个会触发终止:

  • Cron 任务超时 (Task Timeout) 如果你在创建 Cron 任务时用了 –timeout,或者它有一个默认超时值,一旦任务执行超过这个时间,就会被打上 timed_out 状态并强制终止。

  • Agent 运行超时 (默认为 600 秒) 如果这个长任务是 AI 智能体调用的(比如一个复杂的工具调用链),智能体本身的 agents.defaults.timeout(默认 600 秒,10 分钟)是硬性限制。一旦突破,整个智能体运行会立即停止,后续步骤全部丢失。

  • 后台执行超时 (Background Exec 默认 1800 秒) 对于通过 exec 工具在后台运行的命令,默认超时是 1800 秒(30 分钟)。如果你的任务超过半小时,就会被后台执行器杀掉。

  • 看门狗 (Watchdog) 与卡死检测 即使前三个超时未到,如果任务在某个环节长时间无输出或卡死,Cron 的看门狗和 STUCK_RUN_MS(默认 2 小时)检测也会把它标记为“卡死”并中止。

为什么中断后不再继续执行?

中断后不再执行,是因为默认行为是“失败即停止”,并没有自动断点续传或从步骤中间恢复的机制。除非你额外配置了:

  • 任务重试 (Retry):Cron 任务可以配置重试策略,但重试通常是从头开始重新执行整个任务,而不是从断点续传。

  • 检查点/状态文件:没有外部手段记录“上次执行到第几步”,任务本身也无法从中断处恢复。

因此,一旦超时终止,这个任务的运行实例就会被丢弃,需要人工重新触发或等待下一次 Cron 调度(也是从头开始)。

五、LLM Idle Timeout 机制

5.1 机制原理

LLM 响应有 idle 超时保护,优先级:timeoutSeconds > idleTimeoutSeconds

5.2 默认值

默认 LLM idle window:120秒

可配置项:agents.defaults.timeoutSeconds 或 agents.defaults.llm.idleTimeoutSeconds

5.3 配置建议

{  "agents": {    "defaults": {      "timeoutSeconds": 300,      "llm": {        "idleTimeoutSeconds": 180      }    }  }}

六、lossless-claw 上下文管理详解

6.1 核心架构

用户消息 → SQLite → 叶子摘要 → 凝缩摘要

叶子摘要(4000 tokens)存储原始消息

凝缩摘要提供更高层次的抽象

Summary DAG(有向无环图)管理摘要链

上下文组装器:最新原始消息(tail)+ 摘要链(summaries)+ Token 预算控制

6.2 关键配置

{  "plugins": {    "entries": {      "lossless-claw": {        "enabled": true,        "config": {          "contextThreshold": 0.85,          "freshTailCount": 48,          "leafChunkTokens": 4000,          "reserveTokensFloor": 40000,          "memoryFlush": {            "enabled": true,            "softThresholdTokens": 4000          }        }      }    }  }}

6.3 会话解析逻辑

关键原则:同一个 sessionKey 应该继续同一个 conversation,而不是创建新对话。

  • 根据 sessionKey 查找会话

  • 如果找到但 sessionId 变了 → 更新 sessionId(不新建!)

  • 如果找到且 sessionId 相同 → 继续现有会话

  • 如果没有 sessionKey 匹配 → 用 sessionId 回退查找

  • 如果都没有 → 创建新会话

OpenClaw通过一套严谨的映射规则实现会话解析:

  • 规则一:Key的确定性生成:这是保证逻辑实现的基石。系统会根据渠道、会话范围(dmScope)等元数据,在每次收到消息时通过确定性的算法生成一个唯一的sessionKey。

  • 规则二:基于Key的映射查找:生成sessionKey后,系统会去查询sessions.json这个“通讯录”来查找对应的sessionId,而不是直接创建新对话。

  • 规则三:续写或新建的逻辑:系统根据查询结果决定后续动作:若sessionKey不存在则新建映射关系并分配新sessionId;若sessionKey存在但映射的sessionId发生变化则更新映射;若均一致则直接复用现有的sessionId。

如果你了解了这个机制,若被重置的会话对你非常重要,是可以手工“复活”原会话的(另单独文章详述)。

6.4 压缩触发条件

Token 达到阈值:contextThreshold 比例(默认85%)

软阈值触发:memoryFlush.softThresholdTokens(默认4000)

叶子摘要到期:leafChunkTokens(默认4000 tokens)

七、最佳实践方案

7.1 避免上下文丢失

核心原则:了解并合理配置每日重置机制。

方案一:调整重置时间

{  "session": {    "reset": {      "mode": "daily",      "atHour": 5  // 凌晨5点重置,避开工作时段    }  }}

方案二:改用 Idle 模式

{  "session": {    "reset": {      "mode": "idle",      "idleMinutes": 600  // 10小时空闲后重置    }  }}

7.2 长任务配置建议

{  "agents": {    "defaults": {      "timeoutSeconds": 3600,  // 1小时,适合视频处理等长任务      "llm": {        "idleTimeoutSeconds": 300  // 5分钟      }    }  }}

7.3 LCM 压缩配置优化

平衡方案(压缩效果 vs 质量保留):

{  "plugins": {    "entries": {      "lossless-claw": {        "config": {          "contextThreshold": 0.75,      // 降低到75%,更早压缩          "freshTailCount": 24,          // 减少保留条数          "leafChunkTokens": 3000,       // 更频繁生成摘要          "reserveTokensFloor": 35000,          "memoryFlush": {            "enabled": true,            "softThresholdTokens": 3000          }        }      }    }  }}

八、故障排查案例

8.1 案例:上下文丢失排查全过程

问题描述: 帧帧完成视频任务后,用户询问进度,帧帧不记得任何任务。

排查过程

1. 检查 LCM 数据库openclaw lcm2. 检查会话列表openclaw sessions list# 3. 检查会话详情openclaw sessions history <session-id># 4. 查看 .reset文件时间戳ls -la ~/.openclaw/sessions/*.reset 2>/dev/null# 5. 检查每日重置配置openclaw config get session.reset

发现

  • .reset 文件创建于 04:06:49 北京时间

  • 任务完成于 03:23 北京时间

  • 每日重置默认凌晨 4:00 触发

结论:每日重置导致上下文丢失。

解决:调整 session.reset.atHour 到非工作时段。

8.2 案例:响应变慢排查

问题描述:对话变慢,键盘图标都变卡。

排查过程

1. 检查 Gateway CPUtop -bn1 | grep openclaw2. 检查 Gateway 响应时间openclaw status# 3. 检查 LCM 数据库大小openclaw lcm# 4. 检查会话数量openclaw sessions list | wc -l

发现

  • LCM 数据库正常(4.9MB)

  • 会话数量正常(27个)

  • CPU 略高(17.5%)

可能原因:MiniMax API 响应波动。

解决:等待 API 恢复或重启 Gateway。

九、常用命令参考

9.1 会话管理

查看会话列表openclaw sessions list查看会话历史openclaw sessions history <session-id># 重置当前会话/new# 强制重置/reset# 查看 LCM 状态/lcm# 或/lossless# LCM 健康检查/lossless doctor

9.2 配置管理

#查看当前配置openclaw config get <path>#设置配置openclaw config set <path> --replace <value># 查看所有 agentsopenclaw config get agents.list# 查看特定 agent 配置openclaw config get agents.list.<index>

9.3 gateway管理

#查看状态openclaw status#重启 Gatewayopenclaw gateway restart# 查看日志openclaw logs# 健康检查openclaw doctor

十、总结

10.1 推荐配置

适合24小时持续运行的 Agent 配置

{  "session": {    "reset": {      "mode": "idle",      "idleMinutes": 120  // 2小时空闲后重置    },    "maintenance": {      "pruneAfter": "30d",      "maxEntries": 1000    }  },  "agents": {    "defaults": {      "timeoutSeconds": 600,      "llm": {        "idleTimeoutSeconds": 300      }    }  },  "plugins": {    "entries": {      "lossless-claw": {        "config": {          "contextThreshold": 0.75,          "freshTailCount": 32,          "leafChunkTokens": 3000        }      }    }  }}

10.2 下一步优化方向

监控告警:当 LCM 数据库超过阈值时告警

自动调优:根据会话活跃度动态调整压缩参数

会话持久化:支持跨重置保留关键上下文

分布式会话:支持多节点共享会话状态

——

感谢阅读

真实经历,真诚分享

关注我,一个只分享 AI 实战记录的人类