介绍
我在使用 openclaw 的时候发现如何通过 openclaw onboard 配置了自定义模型供应商后,再使用 openclaw tui 进行对话时不论我发什么消息都会报错:
Context limit exceeded. I've reset our conversation to start fresh...
To prevent this, increase your compaction buffer by setting
agents.defaults.compaction.reserveTokensFloor to 20000 or higher.
并不是所有情况都会报这个错误,如果是新安装的 openclaw 在配置自定义大模型就不会报这个错误。而与 openclaw 沟通过一段时间后再换自定义大模型就会报这个错误。
从网上查询资料发现这是由于配置了自定义大模型后, openclaw 为自定义大模型配置了一个默认参数 contextWindow=16000 导致的,这个参数用于指定大模型支持的上下文token值大小,当单次请求token数量超过该值后便会抛出异常
{"models": {"providers": {"custom-integrate-api-nvidia-com": {"models": [{"id": "google/gemma-4-31b-it","contextWindow": 16000, // ✅ 应修正:16000 → 128000"maxTokens": 4096}
...
当和 openclaw 对话时间久了以后,导致 openclaw 发起请求时的会话上下文很长,此时就有另外一个配置参数,会判定当会话上下文超过这个值时,便会自动进行会话压缩:
"agents": {"defaults": {"compaction": {"mode": "safeguard","timeoutSeconds": 900,"reserveTokensFloor": 20000 // ✅ 修正:20000 → 40000
...
reserveTokensFloor:在生成或处理文本时要求保留的最小令牌数(下限)。系统会确保在当前输入/输出预算中至少保留这么多令牌,以免耗尽预算导致截断或无足够空间执行后续操作(例如附加指令、后处理、响应拼接)。
当两个默认值 reserveTokensFloor(默认值 20000) > contextWindow(16000) 时,问题便出现了,要求预留的 token 超出了设定的单次上下窗口大小,openclaw 便会拒绝发起请求,并抛出异常错误。
解决方法也很简单,设置 contextWindow > reserveTokensFloor 即可,一般大模型的上下文窗口在 128k ,远远大于默认的 16k,可以参考实际的大模型上下文窗口设置。亦或者调整 reserveTokensFloor 小于 16k ,但这可能会影响会话质量,一般不建议。
参考资料
OpenClaw 上下文超限问题修复
OpenClaw 上下文超限问题修复
