-
Notifications
You must be signed in to change notification settings - Fork 0
Context Recovery
22024735 edited this page Jul 11, 2026
·
1 revision
预算不只统计 messages[].content,还包括 system、tools、嵌套工具结果和预留输出。图片 Base64 使用有界占位估算,避免图片编码本身把 Token 估算撑爆。
safe output budget = hardLimit - safetyMargin - estimated input
默认发布配置使用较保守的阈值:
-
compactThreshold: 90,000 -
hardLimit: 130,000 -
responseReserve: 12,000 -
safetyMargin: 8,000 -
toolResultClearTrigger: 80,000 -
toolResultClearTarget: 65,000
这些值是代理的安全阈值,不代表模型真实 context window 只有 130k。
Agent 请求含有 tools、tool_use、tool_result、function_call 或对应输出。通用摘要会改变角色、消息位置和 ID 配对,所以 Agent 请求只允许:
- 保持所有消息位置和工具 ID。
- 将旧
tool_result.content替换成明确占位文本。 - 保留最近配置数量的工具结果。
- 交给 Claude 原生 compact。
flowchart TD
Error[上游 context limit 400] --> Parse[解析 limit input output]
Parse --> Type{Agent 请求}
Type -->|否| Compact[压缩普通消息]
Compact --> Reduce[重新计算并降低输出预算]
Reduce --> Retry[重试一次]
Type -->|是| ClearOld[阶段一 清除旧工具结果 保留最新一条]
ClearOld --> Fit{已达到目标预算}
Fit -->|是| Retry
Fit -->|否| TrimLatest[阶段二 裁剪最新结果中段]
TrimLatest --> Preserve[保留头部 尾部 tool use id 和位置]
Preserve --> Retry
Retry --> Done{成功}
Done -->|是| Return[返回恢复后的响应]
Done -->|否| Replay[返回上游错误 不再循环]
最新结果中的提示明确要求模型利用保留的头尾,不要仅因为中段被裁剪就重复调用同一工具。
只有不含 Agent 工具协议的请求可以通用分块。每个块都必须低于 hard cap;所有块完成后生成一个不重新注入完整原始消息的 synthesis request。综合阶段同样支持一次上下文错误恢复。
compactMode=warn 会在支持的 JSON 或 SSE 响应末尾加入 /compact 提醒。当前 SSE 实现会先读取完整流再改写,功能正确但会损失实时输出,这是生产级路线图中的待改进项。