
1. 200K 窗口跑 400K 任务Claude Code 上下文压缩到底在压什么Claude Code 上下文压缩机制是 Claude Code 在固定上下文窗口下处理超长编码任务的核心能力。简单说它能让一个只有 200K token 窗口的模型跑完累计消耗 400K 甚至更多 token 的会话而且思路不断线。适合谁看用 Claude Code 写代码、好奇它内部怎么腾挪空间的开发者以及自己做 Agent、需要设计上下文工程的工程师。先把问题摆清楚。200K 窗口不是全部给你聊天的。系统提示词加工具定义大概吃掉 20K 到 25K token这是雷打不动的固定开销。每轮对话还会注入系统提醒200 到 2000 token 不等。真正留给对话历史的大约 175K。你读一个三千行的文件、跑几条 grep、让它改几轮代码每次工具调用往台面上堆 2K 到 8K token不处理迟早撑爆。更微妙的是撑爆之前质量就已经下滑了。这和电脑内存一个道理用到 95% 时最后那点空间会被换页和 GC 吃掉程序反而卡。LLM 也一样那块空着的上下文不是浪费是模型用来规划、权衡、评估改动的思考空间。窗口越满推理余地越小。所以 Claude Code 的目标不是把窗口用满而是在台面变乱的过程中持续清理始终给推理留余量。它用的是一条五级渐进式压缩流水线核心哲学一句话最便宜的手段先上最重的手段最后用。前四层几乎零成本、基本无损或可回滚只有最后一层 AutoCompact 会真正调一次 LLM 做摘要那才是有损不可逆的。实测下来绝大多数对话根本走不到最后一层。这条流水线在源码里位于src/services/compact/约 3960 行 TypeScript横跨 5 个文件。关键函数包括autoCompactIfNeeded、shouldAutoCompact、calculateTokenWarningState、trySessionMemoryCompaction、compactConversation、microcompactMessages、projectView。下面逐层拆。2. TaoToken 前置把 Claude Code 接到可用通道上在拆压缩逻辑之前得先让 Claude Code 能跑起来。Claude Code 本身是个命令行 Agent它需要一个兼容 Anthropic 接口的服务端。TaoToken 提供的就是这个接入层官网在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 端点是 https://taotoken.net/api 。这里要强调一点TaoToken 是正常的 API 接入服务不是任何形式的非法中转配置方式就是标准的 Base URL 加 Key 加 Model ID 三件套。你把它当成一个兼容 Anthropic 协议的模型服务端点来用就行。先拿 Key。打开控制台 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 登录后在 API Keys 页面创建一个新 Key复制出来。这个 Key 只显示一次丢了就得重建。创建入口在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。拿到 Key 之后Claude Code 的接入有两种常见方式。一种是直接设环境变量另一种是写进配置文件。环境变量方式最直接export ANTHROPIC_BASE_URLhttps://taotoken.net/api export ANTHROPIC_API_KEYsk-你的Key export ANTHROPIC_MODELclaude-sonnet-4-20250514三行分别对应 Base URL、Key、Model ID。Model ID 要填服务端实际支持的模型名填错了会直接报模型不存在。设完之后在当前终端里跑claude就能进交互界面。如果你用的是 Claude Code 的配置文件方式路径通常在用户目录下的.claude/settings.json。这个文件同时也能配压缩相关的环境变量后面第三节会展开。这里先把接入部分写全{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: sk-你的Key, ANTHROPIC_MODEL: claude-sonnet-4-20250514 } }注意ANTHROPIC_BASE_URL结尾不要带/v1Claude Code 会自己拼路径。带了反而会拼成/v1/v1/messages这种直接 404。这是我自己踩过的坑第一次配的时候多写了个/v1排查了十几分钟。配好之后验证一下能不能通。最简单的办法是发一条消息claude -p 回复 ok 两个字如果返回ok说明 Base URL、Key、Model ID 三件套都对。如果报 401多半是 Key 错了或者没生效如果报连接失败检查 Base URL 有没有写错。这一步过了再往下看压缩机制才有意义因为压缩的触发和 token 统计都依赖服务端正常返回 usage 字段。关于模型选择如果你要长期跑编码任务、频繁触发压缩可以考虑 Coding Plan入口在 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。它更适合长时间、多轮次的 Agent 场景压缩流水线在这种场景下才会被真正压到极限。3. 可复制配置压缩阈值与 AutoCompact 触发参数这一节给可直接复制的配置片段。Claude Code 的压缩行为受一组环境变量和内部阈值控制虽然部分阈值写死在源码里但你能通过环境变量影响它的触发时机。先看 AutoCompact 的阈值设计以 200K 窗口为例。系统会保留约 20000 token 给写摘要本身用再保留约 13000 token 作为缓冲所以当有效窗口只剩约 13K 时触发自动压缩。另外还有 3000 token 的手动压缩缓冲只剩这么多时新请求会被阻塞提示你手动/compact。这些数字对应的配置项可以写进settings.json{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: sk-你的Key, ANTHROPIC_MODEL: claude-sonnet-4-20250514, CLAUDE_CODE_AUTO_COMPACT: true, MAX_MCP_OUTPUT_TOKENS: 25000 } }CLAUDE_CODE_AUTO_COMPACT控制是否启用自动压缩默认开启。MAX_MCP_OUTPUT_TOKENS限制单个 MCP 工具返回的 token 上限设小一点能减少大块工具结果涌入上下文间接降低压缩频率。如果你用 Codex 的auth.json风格配置结构类似核心还是三件套{ base_url: https://taotoken.net/api, api_key: sk-你的Key, model: claude-sonnet-4-20250514 }注意base_url同样不带/v1。Model ID 必须和服务端支持的列表一致不确定的话可以在模型对话页面先试一条 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite 确认模型名能正常返回再写进配置。再给一个 Cline MCP 场景的配置如果你在 VS Code 里用 Cline 接 Claude Code 的 MCP 服务{ mcpServers: { claude-code: { command: claude, args: [mcp, serve], env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: sk-你的Key, ANTHROPIC_MODEL: claude-sonnet-4-20250514 } } } }这里三件套同样齐全Base URL、Key、Model ID。少任何一个MCP 服务启动后调用都会失败。关于压缩阈值本身源码里的关键判断在calculateTokenWarningState。它接收当前 token 数和窗口大小返回一个警告状态。你可以通过/context命令实时查看各部分占用/context输出会列出 system prompt、tools、memory、messages 以及 autocompact 缓冲各占多少 token。把这里的实测值和上面说的 20K 固定开销、13K 触发缓冲对上号你就能判断当前会话离压缩还有多远。还有一个值得配的参数是会话记忆。trySessionMemoryCompaction会优先用后台攒好的会话记忆来压能省掉一次昂贵的 LLM 调用。相关开关在配置里体现为{ env: { CLAUDE_CODE_SESSION_MEMORY: true } }开启后压缩会先尝试会话记忆路径失败才退回传统 LLM 摘要。这个顺序很重要因为它直接决定了你花不花那次 API 调用。4. 验证请求观察压缩前后 token 变化与任务完成度配置写完得验证压缩真的发生了而且压缩后任务还能继续。这一节给一套可跟做的验证步骤。第一步起一个会触发压缩的长任务。找一个真实项目让 Claude Code 读多个文件并改代码。比如claude -p 读取 src 目录下所有 .ts 文件统计每个文件的行数然后找出最长的三个文件并说明它们的作用这个任务会触发多次 Read 和 Grep工具结果累积很快。跑的过程中用/context观察 messages 部分的 token 增长。第二步等它接近阈值。当 messages 占用接近窗口上限减去 13K 缓冲时AutoCompact 会触发。你会在输出里看到压缩相关的提示或者通过日志确认autoCompactIfNeeded被调用。触发后 messages 会从一大堆缩成一条摘要加少量近期消息。第三步对比压缩前后的 token。压缩前/context里 messages 可能显示 150K 以上压缩后通常掉到 20K 以内。这个落差就是压缩回收的空间。同时注意 autocompact 缓冲那一项它反映的是留给摘要生成的余量。第四步验证任务完成度。压缩后继续追问claude -p 刚才你统计的最长文件是哪个它有多少行如果它能答出来说明摘要保留了关键信息。摘要的提示词强制保留三类内容完成了什么、当前状态、做过的关键决策。所以它应该记得统计结果和文件作用。第五步看 transcript。压缩前的完整对话保存在.transcripts/目录下。你可以ls -la .transcripts/找到对应会话的文件确认原始消息都在。这是事后回溯用的Agent 平时不会主动翻但需要时能还原。如果你想更精细地观察可以在压缩前后各跑一次带 usage 的请求对比input_tokens字段。压缩后单次请求的 input token 会明显下降因为历史被摘要替代了。还有一个验证点是反应式压缩。故意构造一个超大工具结果比如让 Claude Code 读一个几 MB 的日志文件看它是否触发 413 兜底。如果触发了hasAttemptedReactiveCompact守卫会保证只重试一次不会死循环。你会在日志里看到 Reactive Compact 的记录。整套验证下来你应该能亲眼看到200K 窗口怎么通过分层压缩把 400K 的累计任务塞进去而且任务还能接着做。这比只读源码有体感得多。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth配 Claude Code 加 TaoToken 的过程中有几类报错特别常见。这一节逐个对照。401 Unauthorized。最常见。原因通常是 Key 没生效、Key 复制时带了空格、或者环境变量没被 Claude Code 读到。排查顺序先echo $ANTHROPIC_API_KEY确认变量存在且无多余字符再确认settings.json里的 Key 和终端环境变量没冲突最后去控制台确认 Key 没过期没被删。如果 Key 是对的还报 401检查 Base URL 是不是写成了https://taotoken.net/api/v1多写的/v1会导致鉴权路径错位。local proxy failed。这个报错通常出现在你本地配了某种转发但没启动或者端口被占。Claude Code 本身不需要本地转发如果你看到这个错先检查有没有残留的代理环境变量比如HTTP_PROXY、HTTPS_PROXY。把它们清掉unset HTTP_PROXY HTTPS_PROXY ALL_PROXY然后重试。TaoToken 的接入是直连 API 端点不需要任何本地中间层。reading choices 相关报错。这类错误一般出现在响应解析阶段提示读取choices字段失败。原因是服务端返回的结构和客户端预期不一致常见于 Model ID 填错、或者 Base URL 指向了不兼容的端点。确认ANTHROPIC_MODEL是服务端支持的模型名Base URL 是https://taotoken.net/api。如果还报用模型对话页面单独发一条请求看返回结构是否正常。OAuth 相关报错。Claude Code 某些版本会尝试 OAuth 流程如果你用的是 API Key 模式OAuth 不该被触发。看到 OAuth 报错检查配置里有没有混入 OAuth 相关的字段或者环境里有没有残留的 token 文件。清掉~/.claude/下的认证缓存重新用 API Key 配置。压缩不触发。如果你跑了很久没看到压缩先/context看 messages 占用。没到阈值就不会触发。另外确认CLAUDE_CODE_AUTO_COMPACT没被设成false。还有一种情况是开了 Context Collapse此时主动 AutoCompact 会被禁用压缩以折叠形式进行表现不一样。压缩后任务断线。如果压缩后 Claude Code 忘了之前做的事说明摘要质量不够。可以手动/compact并附带指令比如/compact 重点保留认证相关的工作。手动压缩能指定保留重点比自动压缩更可控。熔断器触发。连续压缩失败 3 次后autoCompactIfNeeded会直接放弃避免反复烧钱。如果你看到压缩停止且没有恢复检查服务端是否稳定返回。恢复后重启会话即可重置失败计数。排查的核心思路是先确认三件套Base URL、Key、Model ID正确再看网络层有没有多余代理最后看压缩阈值和开关。大部分问题出在前两步。6. 语义一致 CTA把压缩机制用起来拆完这五层你会发现 Claude Code 的上下文压缩不是简单的满了就总结而是一条分层降级的流水线。便宜的先上有损的压到最后能可逆就绝不不可逆。这套设计对做 Agent 的人很有参考价值分层降级、优先可逆、接受不完美但准备恢复路径、结构化保留关键信息。想自己动手验证先把接入配好。API Key 在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。配好之后跑一次长任务用/context对照本文的阈值看 system prompt、tools、memory、messages 和 autocompact 缓冲各占多少。如果你要长期跑编码和 Agent 任务压缩会被频繁触发Coding Plan 更合适入口在 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。想先确认模型行为可以在模型对话页面发几条测试 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite 。最后留一个实用技巧在真实会话里跑一次/context把实测 token 分布和本文的 20K 固定开销、13K 触发缓冲对上号。理论对实测比只读源码更有体感。压缩不等于记忆会话内的整洁度和跨会话的长期知识是两套互补系统别用一个硬扛另一个的活。