OpenClaw免费模型在长上下文对话中频繁丢失消息,这一问题近期令众多开发者倍感困扰。究其根本,核心原因在于三个硬性截断机制:模型层的token窗口被静态锁定在16K阈值,会话历史采用先进先出(FIFO)的粗暴淘汰策略且未进行任何摘要压缩,文件加载功能则默认将全文一次性塞入上下文。这三重机制相互叠加,上下文丢失几乎成为必然。举个典型场景:当您正在调试一个包含5个Python文件(约12K tokens)及18轮对话(约6K tokens)的任务时,往往刚进行到第3轮AI响应,早期的消息就被静默清除,系统甚至不会给出任何提示。
模型层token分配不可调整,免费档位仅限16K窗口
打开~/.openclaw/config.yaml,找到llm_config区块,检查max_tokens字段。在免费用户版本中,该字段要么为空,要么被固定设置为16384。这意味着,无论实际对话内容多么简短,模型推理时都会以16K上限切割输入缓冲区。一旦代码文件与对话历史的总tokens超出此数值,底层vLLM引擎会直接丢弃超出的部分,既不报告错误也不发出警告,仿佛一切从未发生过。
这里有一个关键前提:若想修改该数值,必须付费升级至Pro档位。免费账户根本不具备写入该字段的权限;即便手动编辑配置文件并保存,下次启动时也会被自动重置为默认值。
会话历史采用FIFO强制淘汰,毫无摘要压缩机制
验证方法分两步。
首先查看会话缓存策略。进入OpenClaw安装目录,执行cat openclaw/memory/session_manager.py | grep -A5 "def prune_history",输出显示其中仅包含一句del self.messages[0],完全没有调用任何LLM进行摘要压缩的痕迹。历史清理就是纯粹的队列删除——最旧的那条消息直接被物理移除。
其次验证实际行为。开启debug模式:openclaw --debug,连续发送7条带有代码块的消息。当第8条消息发出后,查看日志,一定会出现Dropped message #1 (role=user, len=214 tokens)——第一条用户消息已被彻底清空,再也无法恢复。
文件加载器默认全文解析,完全无视上下文相关性
这第三处截断更为隐蔽。打开openhands/agenthub/codeact_agent/tools/file_read.py,找到read_full_file函数,顺着调用链追踪下去,最终落到file_utils.read_text_content(filepath)。这个函数没有任何行数限制参数,强制读取整个文件。即便您只是询问“修复login.py第42行的空指针”,它也会将2300行的login.py全文塞入上下文。
与收费版对比,差异一目了然。Pro版本在同路径下提供了read_snippet_by_line_range函数实现,而免费版代码中完全找不到该功能。这不是bug,而是故意的功能阉割。
这个操作本身很简单——将文件拖入即可。但免费用户无法通过配置开关切换到片段读取模式,只能手动删减文件内容后再提交。否则,一个300行的配置文件就能吞噬将近5K tokens,对话刚开始便已触及限制。
