Appearance
OpenClaw assistant 返回 content=[] 且 usage=0 导致用户收不到任何回复
问题
使用 DeepSeek、Qwen 或自托管 OpenAI-compatible API 时,对话偶发性地产生完全静默——用户发送消息后没有任何响应,也没有错误提示。
查看 Gateway 日志可发现形如以下的事件:
json
{
"type": "message",
"message": {
"role": "assistant",
"content": [],
"usage": { "input": 0, "output": 0, "totalTokens": 0 },
"stopReason": "stop"
}
}stopReason 为 stop(合法终止原因),但 content 为空数组、usage.totalTokens === 0,OpenClaw 直接将此视为空消息转发给渠道,最终用户侧静默。
根本原因:shouldPreemptivelyCompactBeforePrompt 检测到 session 提示词超过 token 预算上限后,设置 skipPromptSubmission = true 并跳过提交,但未向用户发送任何通知;部分自托管模型在 token 预算耗尽时也会直接返回空 content,OpenClaw 未做重试或 fallback 处理。
此问题在 session 体积约 380KB / 200+ 条 JSONL 时复现率显著升高。
解决方案
方案一:主动压缩 session(缓解 token 预算耗尽)
当 session 积累了大量上下文时,提前触发压缩:
bash
# 查看当前 session token 占用
openclaw memory status
# 手动触发 session 压缩
openclaw compact配置自动压缩阈值(防止无声跳过):
json5
{
"runner": {
"compactionThreshold": 0.85,
"compactionStrategy": "summarize"
}
}方案二:为 assistant 空回复添加 fallback(AGENTS.md)
在工作区 AGENTS.md 中增加规则,指示 agent 检测空回复场景:
markdown
### 空回复检测规则
若模型返回 content=[] 或纯空字符串,立即向用户发送:
"⚠️ 模型本轮未返回内容,可能原因:上下文超限触发压缩跳过、模型内部错误。请重新发送消息。"方案三:启用详细日志定位根因
bash
openclaw gateway restart --log-level debug
openclaw logs --follow | grep -E "skipPromptSubmission|shouldCompact|bootstrap-context"若日志中出现 skipPromptSubmission = true,说明是 token 预算问题;若未出现,则是模型侧返回了空回复。
方案四:等待官方修复
官方正在处理此问题(#63689),修复方向是检测 content=[] + usage=0 条件并在发送前自动重试。关注:GitHub #63689
常见问题
Q: 这个问题每天只发生几次,但非常影响体验,有没有快速的应急措施?
A: 最简单的缓解方式是减小 session 体积——在每次长对话结束后执行 openclaw compact,防止 session 积累到触发跳过阈值。另外,将 compactionThreshold 设为 0.75 可更早触发自动压缩。
Q: 为什么 DeepSeek/Qwen 比 Claude/GPT 更常出现这个问题?
A: 这些自托管或兼容 API 在处理超长上下文时,有时会直接返回空响应而不是报错,OpenClaw 目前未对这种情况做特殊处理(官方 API 则通常返回明确的 context_length_exceeded 错误)。
Q: 出现静默后,session 状态会损坏吗?
A: 不会。session JSONL 文件记录了 empty-stop 事件,数据完整,可重新发送消息继续对话。若连续静默,建议先执行 openclaw compact 再重试。