5. 爆干货!Claude Code超强上下文。上下文管理做了什么
核心目标:在有限的 token 窗口内,让 Claude Code 尽可能长时间地保持有效对话,同时控制 API 成本。
整体可以分为 4 个层次:
第一层:感知 —— 知道窗口用了多少
context.ts 解析每个模型的实际窗口大小(200k / 1M,支持环境变量覆盖)
analyzeContext.ts 把窗口占用拆解到每个来源(系统提示、工具定义、记忆文件、历史消息……),带颜色标识,可视化成网格
contextSuggestions.ts 基于占用率给出具体优化建议(哪个工具结果太大、记忆文件膨胀等)
第二层:轻量瘦身 —— 不调 LLM,直接裁
微压缩(microCompact) 有三条路径,按优先级互斥:
时间触发:距上次对话 >60min,服务端 prompt cache 已过期,直接把旧工具结果内容替换成 [Old tool result content cleared],无任何 API 调用
Cached MC(ant-only):不改本地消息,通过 API 的 cache_edits 机制在服务端删除,客户端零感知
API 侧 context_management:通过 Anthropic 原生字段 clear_tool_uses_20250919 / clear_thinking_20251015 让服务端自己管
第三层:重量压缩 —— 调 LLM 生成摘要
触发阈值:contextWindow - 20000(摘要预留)- 13000(缓冲),约在 93% 左右。
两条路径,SM 压缩优先:
Session Memory 压缩:不调 LLM,直接用已有的 session memory 内容作摘要,替换旧消息段
LLM 摘要压缩:调模型生成 9 章节标准摘要(Primary Request Files Errors / Pending Tasks 等),替换历史消息
压缩后统一执行 postCompactCleanup,清除 10+ 项缓存(文件缓存、系统提示缓存、分类器缓存等),确保状态一致。
第四层:请求级控制 —— 防止单次无限续写
tokenBudget.ts 的 BudgetTracker 在每次 callModel() 后检查:
连续 2 次增量 60min 空闲时,服务端 prompt cache 的 1h TTL 已过期,缓存本来就失效了,这时清除旧工具结果内容不会带来任何额外损失,但能显著减少下次请求的 token 数。利用了 cache TTL 的自然边界,零成本瘦身。
4. 压缩边界标记(boundaryMarker)
每次压缩后插入边界标记,query.ts 每次只取最近边界之后的消息,历史压缩结果不会被重复处理,也不会被再次压缩。
5. 状态清理的完整性
postCompactCleanup 清理了 10+ 项缓存,包括文件内容缓存、系统提示分段缓存、分类器审批缓存等。特别注意不清除 sentSkillNames(技能列表压缩后仍需保留,避免重复注入 ~4K tokens),体现了对细节的精细控制。
6. 子 Agent 隔离
Cached MC 和 Context Collapse 等有状态操作只对 repl_main_thread 前缀生效,防止子 Agent 污染全局压缩状态。#agent #claude #claudecode #源码分享