1. 长会话为什么总在关键节点失忆OpenClaw 上下文截断的真实代价如果你用 OpenClaw 跑过超过两小时的重构任务大概率遇到过这种场景前面三十轮已经把数据库 schema、接口约定、错误码规范全部对齐结果到第四十轮让它接着改一个 service 文件它突然开始用一套完全不同的命名风格甚至把之前明确否掉的方案又提了一遍。这不是模型变笨了而是上下文被截断后早期约定已经从活跃窗口里消失。OpenClaw 内置的压缩机制在窗口接近上限时做一次性摘要把几十轮对话揉成一段几百 Token 的概述原始消息随之丢弃。问题在于摘要是有损的它保留做了什么却很难保留为什么这么做当时否掉了哪些选项哪个字段不能为空。对于需要跨轮次保持一致性的长任务这些细节恰恰是 Agent 不跑偏的关键。Lossless-Claw 这个插件要解决的就是这件事。它基于 LCMLossless Context Management思路用 DAG 结构的摘要系统替代滑动窗口压缩每条原始消息持久化到本地 SQLite旧消息分块生成叶子摘要摘要再逐层浓缩成更高层节点形成有向无环图每轮组装上下文时用高层摘要 最近若干条原始消息喂给模型同时给 Agent 提供搜索和展开历史的能力。适合谁适合那些单次会话轮次多、需要反复引用早期决策、又不想频繁手动 /compact 或开新会话的人。下面按安装、配置、验证、排障的顺序走一遍配置片段可以直接复制。2. 前置准备OpenClaw 版本、ContextEngine 接口与 Lossless-Claw 安装Lossless-Claw 依赖 OpenClaw 的 ContextEngine 插件接口这个接口在 2026.3.7 版本引入提供 bootstrap、ingest、assemble、compact、afterTurn 等生命周期钩子让插件可以接管上下文管理而不改动核心逻辑。所以第一步是确认版本低于这个版本装不上或者装了也不生效。先查版本openclaw --version # 期望输出类似openclaw/2026.3.7 ...如果低于 2026.3.7先升级 OpenClaw 本体再继续。Node.js 需要 18 及以上用node -v确认。这两项是硬门槛别跳过。安装插件本身只有一条命令openclaw plugins install martian-engineering/lossless-claw这条命令会做三件事把插件登记到插件列表、启用它、并自动把 contextEngine 这个 slot 指向 lossless-claw。多数情况下你不需要再手动改 JSON。如果你是从源码跑的 OpenClaw用 pnpm 前缀pnpm openclaw plugins install martian-engineering/lossless-claw本地开发调试时可以用 link 模式指向你 clone 下来的插件目录openclaw plugins install --link /path/to/lossless-claw装完先别急着聊确认插件状态openclaw plugins list # 期望看到 # NAME STATUS SLOT # lossless-claw active contextEngineSTATUS 是 active、SLOT 是 contextEngine这两列对了才算装好。如果 STATUS 显示 installed 但没 active通常是 slot 没绑定下一节的手动配置能解决。这里插一句关于模型接入的说明。OpenClaw 本身是 Agent 框架真正干活的是背后的大模型。如果你还没配好模型通道可以先把 Base URL、API Key、Model ID 三件套准备好。我这边常用的是 TaoToken 的兼容接口Base URL 填https://taotoken.net/apiKey 在控制台生成Model ID 按你实际用的模型填。这三样在后面的配置里会以环境变量或配置文件形式出现先备着。3. 可复制配置openclaw.json 里的 DAG 参数与三件套写法安装命令虽然会自动写配置但你要调参就得知道配置长什么样。OpenClaw 的主配置在~/.openclaw/openclaw.jsonLossless-Claw 相关的部分集中在 plugins 节点下。下面这份是日常助手场景的推荐起始配置可以直接抄{ plugins: { slots: { contextEngine: lossless-claw }, entries: { lossless-claw: { enabled: true, config: { freshTailCount: 32, contextThreshold: 0.75, incrementalMaxDepth: -1 } } } } }三个参数的含义和调法freshTailCount 是新鲜尾部计数保护最近 N 条消息不被压缩。默认 32意思是最近 32 条消息始终以原始形态留在上下文里给模型足够的近期连续性。调小到 16 会更激进地压缩、省 Token但近期细节变少调到 48 适合复杂重构或多步调试近期上下文更完整代价是活跃窗口更拥挤。contextThreshold 是触发压缩的阈值默认 0.75即上下文用到模型窗口的 75% 时启动压缩留 25% 给模型回复。200K 窗口就是 150K 触发。调到 0.6 更早压缩、更省钱但信息更少0.85 保留更多原始信息但回复空间被压缩深度分析场景可用0.9 以上不建议容易没空间生成回复。incrementalMaxDepth 控制 DAG 浓缩深度。0 表示只生成叶子摘要、不再向上浓缩摘要列表会越来越长正整数表示浓缩到指定层数-1 表示无限自动浓缩每次压缩后按需级联到任意深度长期会话和生产环境推荐这个。如果你不想改 JSON可以用环境变量覆盖环境变量优先级高于配置文件export LCM_FRESH_TAIL_COUNT48 export LCM_CONTEXT_THRESHOLD0.80 export LCM_INCREMENTAL_MAX_DEPTH-1 openclaw gateway restart模型三件套如果走配置文件通常写在模型 provider 节点里形如{ models: { providers: { taotoken: { baseUrl: https://taotoken.net/api, apiKey: sk-你的Key, model: 你的ModelID } } } }Base URL、Key、Model ID 三者缺一不可少任何一个都会在请求阶段报错。改完配置统一openclaw gateway restart让配置生效。注意 JSON 里不要留尾逗号这是最常见的低级错误。4. 验证请求从对话确认 DAG 生效与记忆保留效果配置写完重启 Gateway然后进聊天验证。第一步是确认当前上下文引擎openclaw gateway restart然后在对话里直接问你当前使用的是什么上下文管理引擎如果返回类似我正在使用 Lossless Context Management (LCM) 引擎的答复说明插件已经接管。如果它说用的是内置压缩回去检查 slot 绑定和插件状态。第二步是验证持久化和回忆。先聊一段有明确决策的内容比如我们定一下用户表主键用 uuid不用自增 id错误码统一 4 位数字1xxx 是参数错误2xxx 是权限错误。继续聊二三十轮无关内容把早期决策挤出活跃窗口再回头问我们之前定的错误码规则是什么内置压缩下这里大概率得到模糊或错误回答LCM 下 Agent 会调用 lcm_grep 搜索历史从 SQLite 里把原始消息捞出来回答应该精确到1xxx 参数错误、2xxx 权限错误。这一步是判断插件是否真正生效的关键别只看插件列表。第三步看数据库是否在写。LCM 的 SQLite 通常在~/.openclaw/lossless-claw/下ls ~/.openclaw/lossless-claw/ sqlite3 ~/.openclaw/lossless-claw/lcm.db .tables # 期望看到 messages、summaries、conversations 等表 sqlite3 ~/.openclaw/lossless-claw/lcm.db SELECT COUNT(*) FROM messages消息数随对话增长说明持久化正常。查询时只读别手动改表DAG 的链接关系被破坏后修复很麻烦。第四步验证三个 Agent 工具。lcm_grep 负责按关键词搜历史lcm_describe 给出基于摘要层的会话概览lcm_expand 把某个摘要展开成原始对话。你可以直接要求用 lcm_describe 总结一下我们今天做了什么再针对某个阶段展开第二阶段关于查询性能的那段讨论如果它能还原出当时的原始对话而不是摘要说明无损这条链路是通的。实测下来长会话里这三个工具是它和普通压缩拉开差距的地方。5. 常见报错排查401、local proxy failed、reading choices 与 OAuth装完到跑通之间最容易卡在几类报错上逐个说。401 Unauthorized。这是模型通道的鉴权失败和 Lossless-Claw 本身无关。检查三件套Base URL 是否写成https://taotoken.net/api注意不要多加路径、API Key 是否完整复制没有空格、Model ID 是否拼写正确。Key 过期或额度用尽也会返回 401去控制台确认状态。改完记得重启 Gateway。local proxy failed。这个报错通常出现在本地网络或代理配置层面。先确认 OpenClaw Gateway 进程本身在跑openclaw gateway status看一眼再确认配置文件里的地址没有指向一个不存在的本地端口。如果你在容器里跑注意容器内外的地址差异localhost 在容器里指的是容器自己。reading choices 相关报错。这类错误一般出现在模型返回结构不符合预期时常见原因是 Model ID 填了一个不支持当前调用方式的模型或者 Base URL 指向的端点不兼容。换一个确认可用的 Model ID 试或者核对接口路径。LCM 只负责上下文组装不改变请求协议所以这类错基本都在模型通道侧。OAuth 相关报错。如果你用的是需要 OAuth 的模型通道token 过期会报鉴权失败。重新走一遍授权流程或者改用 API Key 方式。注意 OAuth 的 token 有时效长时间挂着的会话中途失效也会触发。插件装了但没生效。先openclaw plugins list看 STATUS 和 SLOT再检查 openclaw.json 里 slots.contextEngine 是否等于 lossless-claw。两者都对但行为还是内置压缩多半是 Gateway 没重启配置没加载。DAG 数据异常。断电或强制终止进程可能导致摘要节点孤立、浓缩层级缺失。LCM 内置了完整性检查和修复逻辑日志里搜 integrity 能看到相关记录grep integrity ~/.openclaw/logs/*.log如果确认损坏优先用插件自带的修复工具不要手写 SQL 去补链接。6. 把长任务交给它接入路径与后续调优跑通之后日常使用其实不需要频繁动参数。我的做法是先用默认值 32 / 0.75 / -1 跑一周观察两类信号一是长会话里 Agent 是否还会忘记早期约定二是 Token 消耗是否明显上涨。前者说明 freshTailCount 可能偏小后者说明 contextThreshold 可以调低一点更早压缩。深度编码会话我会把 freshTailCount 提到 48、contextThreshold 提到 0.80让最近的代码修改和测试结果留得更久Token 敏感的场景反过来freshTailCount 降到 20、阈值降到 0.60上下文始终维持在小体积。小窗口模型8K 到 32K必须更激进freshTailCount 12、阈值 0.65 起步。模型通道这边如果你还没配好可以从模型对话页面先验证 Key 和 Model ID 是否可用确认能正常出结果再写进 OpenClaw 配置。需要生成和管理 Key 就去 API Keys 页面接入细节和字段说明看接入文档。长期跑编码和 Agent 任务的话Coding Plan 在用量和稳定性上更适合持续挂机具体可以按自己的调用量评估。最后提醒一句Lossless-Claw 解决的是上下文管理不替代编辑器也不改变模型本身的能力边界。它的价值在于让长会话里的决策、约定、踩过的坑不因为窗口滚动而消失。把配置调对、把三个回忆工具用起来超长任务里 Agent 的表现会稳定很多。