问题描述
在与 AI 机器人进行长时间对话时,你可能遇到以下错误:
[openclaw:gateway] Error: Context length exceeded. Model maximum: 128000 tokens, requested: 135842 tokens.
或者自动压缩功能失败的日志:
[openclaw:gateway] Context compaction triggered (usage: 92%)
[openclaw:gateway] Error during context compaction: Model returned empty summary
[openclaw:gateway] Falling back to truncation strategy
还有一种情况是用户看到的表现:
机器人回复:抱歉,对话历史过长,我无法继续处理。请发送 /reset 清除对话历史。
OpenClaw 为每个用户维护一份对话上下文,包含历史消息和系统提示词。当对话过长时,上下文的 token 数量会超过所使用 AI 模型的最大上下文窗口限制。
工作原理
OpenClaw 的上下文管理流程如下:
- 每条用户消息和 AI 回复都会追加到上下文中
- 发送 API 请求前,OpenClaw 计算当前上下文的 token 数量
- 当 token 使用率超过配置的阈值(默认 85%)时,触发自动压缩
- 压缩过程会将旧的对话历史发送给 AI 模型进行摘要总结
- 压缩后的摘要替换原始的旧消息,释放上下文空间
诊断步骤
查看当前用户的上下文状态:
openclaw context list
这会显示所有活跃会话及其 token 使用情况:
Channel User ID Tokens Model Max Usage
telegram 12345678 98500 128000 77%
whatsapp 8612345 125000 128000 98% ⚠️
检查压缩日志:
DEBUG=openclaw:context* openclaw start
查看配置中的上下文管理设置:
cat ~/.openclaw/openclaw.json | grep -A 20 context
解决方案
方案一:调整自动压缩配置
在 ~/.openclaw/openclaw.json 中优化压缩策略:
{
"context": {
"compaction": {
"enabled": true,
"triggerThreshold": 0.75,
"targetUsage": 0.5,
"strategy": "summarize",
"summaryModel": "gpt-4o-mini",
"summaryPrompt": "请将以下对话历史压缩为简洁的摘要,保留关键信息和用户偏好:",
"maxRetries": 3
}
}
}
关键参数说明:
triggerThreshold:触发压缩的使用率阈值,降低此值可以更早触发压缩,避免临界溢出targetUsage:压缩后目标使用率,设为 0.5 表示压缩后上下文应占用不超过 50% 的容量summaryModel:用于生成摘要的模型,建议使用成本较低的模型如gpt-4o-minimaxRetries:压缩失败时的重试次数
方案二:手动清理上下文
当自动压缩失败时,可以手动处理特定用户的上下文:
# 查看指定用户的上下文详情
openclaw context show --channel telegram --user 12345678
# 手动压缩指定用户的上下文
openclaw context compact --channel telegram --user 12345678
# 重置指定用户的对话历史(清空所有上下文)
openclaw context reset --channel telegram --user 12345678
用户也可以在聊天中直接发送 /reset 命令来清空自己的对话历史。
方案三:切换到支持更大上下文的模型
如果你的使用场景需要长时间持续对话,考虑使用支持更大上下文窗口的模型:
{
"models": {
"default": {
"provider": "anthropic",
"model": "claude-sonnet-4-20250514",
"maxContextTokens": 200000
}
}
}
Claude 系列模型支持 200K token 的上下文窗口,GPT-4o 支持 128K,Gemini 1.5 Pro 支持高达 1M。选择适合你需求的模型。
方案四:配置截断策略作为后备
当压缩失败时,配置截断策略确保系统不会崩溃:
{
"context": {
"compaction": {
"enabled": true,
"strategy": "summarize",
"fallback": {
"strategy": "truncate",
"keepSystemPrompt": true,
"keepRecentMessages": 10
}
}
}
}
截断策略会保留系统提示词和最近的 N 条消息,直接丢弃更早的消息。虽然这会损失历史上下文,但能确保对话可以继续进行。
方案五:限制单条消息长度
防止用户发送超长消息导致上下文快速增长:
{
"context": {
"maxMessageTokens": 4000,
"truncateMessage": true
}
}
超过 maxMessageTokens 限制的单条消息会被截断,并提示用户消息过长。
监控与预防
配置上下文使用告警,在接近阈值时提前收到通知:
{
"context": {
"alerts": {
"warningThreshold": 0.7,
"criticalThreshold": 0.9,
"webhook": "https://your-webhook-url.com/alerts"
}
}
}
定期清理不活跃的会话上下文以释放内存:
# 清除超过7天未活跃的会话
openclaw context cleanup --inactive-days 7
这样可以防止长期不活跃的会话占用系统资源。