openclaw20260213已经有188k星星 但是还是太新问题太多 居然连上下文压缩没有做好–一次艰难的排错记录
作者:三局两胜
时间:2026-02-13
这篇是我这两天和机器人一起硬啃出来的一次完整排错记录。结论先放前面:
- “空回复”不是模型不可用,也不是QQ插件单点故障。
- 根因是会话上下文失控膨胀后,触发了 silent overflow(
output=0)。 - OpenClaw 当前版本在这个场景下确实存在“无提示、无自动恢复”的问题(官方已有 issue/PR)。
一、故障现象(我遇到的真实情况)
我这边出现的是:
- QQ 群里机器人突然开始“空回复”(看起来像没回,或只记录了 assistant turn 但内容为空)。
- TG 同期看起来又是正常的,造成错觉“是不是QQ插件坏了”。
- WebUI 能看到会话在继续写日志,但用户侧没有有效文本。
最开始排查非常混乱,因为同一时段里还夹杂了:
- 文件发送链路问题(NapCat rich media)
- 群触发词/艾特逻辑
- 管理员与黑名单配置
这些问题会互相干扰观测,让“空回复”的根因不容易被第一时间抓住。
二、排查路径(按时间顺序)
1) 先确认不是 API 全挂
- 我先验证了上游 API(newapi/cpa)在其他客户端可用。
- 再看 OpenClaw 本地会话日志,发现并不是请求失败,而是出现了典型记录:
usage.input非常大(20万~30万级)usage.output = 0content = []
这一步很关键:说明不是“发不出去”,而是“模型端返回了空输出”。
2) 对比 QQ 与 TG 会话体积
我把关键会话文件都拉出来看:
- QQ 群会话:
cb77ecdc-6d64-489f-8aa1-d63a92d67ce7.jsonl - TG 私聊会话:
9c1c29b4-b309-4b71-a1bd-5a7fd8541679.jsonl
结果非常直观:
- QQ 会话历史非常大,且多次出现
input≈260k~282k。 - TG 同时段大概
input≈36k~38k,回复正常。
3) 精确定位“哪一次突然膨胀”
在 QQ 群会话里,膨胀拐点对应一次“搜索任务”:
- 连续写入了多条超长
toolResult(SearchResults) - 单条长度约几十 KB(例如 48k / 38k / 24k)
- 之后输入 token 立刻跳到 282k,并出现连续空回复
也就是说,不是某一句用户普通聊天把上下文炸掉,而是工具结果被完整写入会话,把本来已经很大的会话推过了临界点。
4) 验证“TG 搜索是否进上下文”
我特意做了对照:
- TG 也会写入
toolResult(同样会进上下文) - 但 TG 会话基数小,所以没马上爆
这一步打破了误区:
- 不是“TG不进上下文,QQ才进”
- 而是“两边都进,谁先到上限谁先炸”
5) 做强制实验(证明不是错觉)
我做了两轮实验:
- 先改会话指向(TG 指向 QQ 会话)
- 再做文件级覆盖实验(把 QQ 大会话内容复制到 TG 会话文件)
最终确认:只要让 TG 吃到那份超大历史,也会出现空回复。这个验证把根因进一步坐实了。
三、最终根因结论
根因可以概括为三句话:
- 会话历史过大(尤其包含大量 toolResult/raw 搜索内容)。
- 请求达到/超过模型有效上下文窗口后,返回
stopReason=length + output=0。 - 当前 OpenClaw 在这个“silent overflow”分支上恢复策略不足,用户侧表现就是“机器人像死了一样空回复”。
四、为什么这个问题体感这么差
因为它有三个“反直觉点”:
- 不是报错:很多时候不会直接抛明显错误,而是“看起来成功结束但没内容”。
- 不是立刻复现:往往是长会话积累后突然触发。
- 不是单平台限定:QQ/TG 都可能中,只是先后与会话体积有关。
五、我这边临时止血方案(可落地)
- 遇到空回复先 /newsession 或切新会话键,不要在已膨胀会话里硬聊。
- 减少大段工具原文入库,尤其是搜索结果和长网页正文。
- 把“上下文过重预警”做在插件层(比如 input 超阈值就提示重开会话)。
- 群场景建议用“测试小群(双人群)”做运维观测,便于快速确认机器人状态。
六、官方现状:已有 Issue/PR,但问题还在修复中
1) 官方 issue(同类问题)
-
Issue #14064
Session exceeding context window produces silent empty replies — no compaction triggered
[Bug]: Session exceeding context window produces silent empty replies — no compaction triggered · Issue #14064 · openclaw/openclaw · GitHub -
Issue #5771
Context overflow error
[Bug]: Context overflow error · Issue #5771 · openclaw/openclaw · GitHub
2) 对应修复 PR(核心思路)
- PR #14157
fix(agents): detect silent context overflow (stopReason=length,output=0)
fix(agents): detect silent context overflow (stopReason=length, output=0) by 0xRaini · Pull Request #14157 · openclaw/openclaw · GitHub
这条 PR 的关键思路是:
- 识别“silent overflow”这个分支
- 把它纳入 overflow recovery(触发 compaction/retry),而不是当成正常完成
我认为这条思路是对的,至少比“用户手动删会话文件”靠谱得多。
七、我这边额外做过的相关改造(插件侧)
这次排错期间,我这边还落地了一批配套修复(避免把别的问题混进来):
- 修复 QQ 私聊/群聊会话键隔离,避免跨通道串线。
/newsession从“表面命令”修成“真实清会话”。- 增加空回复兜底提示,避免用户感知为彻底失联。
- 修复忙碌后缀重复叠加(避免
昵称(输入中)(输入中))。
但要强调:这些只能改善体验,真正的“超大上下文 silent overflow”仍需要内核层处理。
八、给后来者的建议
如果你也遇到“日志看起来在跑,但就是空回复”:
- 先查对应 session 的
usage.input/output。 - 看到
output=0且 input 巨大,优先怀疑上下文溢出。 - 立即开新会话验证,不要在旧会话里反复试。
- 检查是否把大 toolResult(搜索/网页)无裁剪写入会话。
- 关注官方 #14064 / #14157 的合并进展。
这次确实是一次“很艰难但很值”的排错。
OpenClaw 很强,但也还很新,边用边补是常态。
希望这份记录能让后来人少走弯路。
— 三局两胜