1. 从一次「对话突然变傻」说起Compact 到底在压什么如果你用 Claude Code 写过稍大一点的项目大概率遇到过这种场景前面聊得好好的让它改一个文件、跑一次测试、再解释一段报错来回几十轮之后它突然开始「失忆」——不记得你十分钟前定的命名规范也忘了刚才读过的那个配置文件长什么样。这不是模型变笨了而是上下文窗口快满了Claude Code 在背后悄悄做了一次上下文压缩也就是 Compact。Compact 是 Claude Code 里负责「对话历史太长、Token 快溢出」时把历史消息重新整理成摘要的机制。它要解决的核心矛盾很朴素AI 需要历史才能连贯工作但模型的 Context Window 有硬上限不可能无限堆消息而每次压缩都要额外调用一次模型写摘要既花时间又花钱。所以 Claude Code 没有一上来就全量压缩而是设计了一套从轻到重的分层策略能本地清空就不调模型能读缓存就不重新总结。这篇面向想读源码、也想在本地复现压缩行为的开发者。我会沿着src/services/compact/这条路径把触发条件、压缩边界、配置项讲清楚最后给出一份可复制的settings.json骨架和验证动作让你能亲眼看到压缩日志。需要说明的是下面涉及的阈值和字段名以 Claude Code 2.1.88 附近的实现为参考不同版本可能有出入读的时候以你本地源码为准。在动手之前先把「记忆」这件事的边界划清楚否则很容易把 Compact 当成全部。Claude Code 的记忆其实分几块多轮对话由QueryEngine.ts维护 messages 数组Token 超限时交给services/compact/跨会话的结构化记忆在services/SessionMemory/项目级静态说明则是CLAUDE.md这类文件每次会话注入。本篇只聚焦 compact 包也就是「对话历史太长」这一个问题。2. 前置准备用 TaoToken 拿到可调用的 API 入口要复现压缩行为你得先有一个能稳定调用 Claude 系列模型的入口。我这边习惯用 TaoToken 做统一接入它的 API 地址是https://taotoken.net/api兼容 Anthropic 风格的调用方式Claude Code 这类工具配置起来比较顺。官网在https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end注册后在控制台生成 Key 即可。第一步登录后进入控制台找到 API Keys 页面创建一个新 Key。建议按用途分开建比如一个专门给 Claude Code 用方便后面排查额度消耗。创建后立刻复制保存页面刷新后就看不到完整 Key 了。第二步确认你要用的模型名。Claude Code 默认走 Anthropic 的模型标识你在 TaoToken 的模型列表里核对一下当前可用的名称避免配置里写了一个不存在的模型导致请求直接 400。第三步把 Key 和 Base URL 写进环境变量或 Claude Code 的配置。Claude Code 读取的是ANTHROPIC_BASE_URL和ANTHROPIC_API_KEY这类变量指向 TaoToken 的 API 地址即可。这里不要写官网首页地址接口调用必须用/api这个路径。注意Key 属于敏感凭证不要提交到 Git 仓库也不要在截图里露出完整字符串。建议放在本地 shell 的 profile 文件或系统的密钥管理里。如果你还想先验证模型本身通不通可以到模型对话页面手动发一条消息试试如果打算长期跑编码和 Agent 任务Coding Plan 会更划算额度模型和按量调用不一样适合高频使用。3. 可复制配置settings.json 骨架与压缩相关项Claude Code 的行为大量通过settings.json控制压缩相关的开关和阈值也在这里。下面这份骨架你可以直接抄重点看autoCompact和compact两段。字段名以你本地版本为准如果某个键不生效先去源码里搜一下对应的读取位置。{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: sk-你的Key }, autoCompact: { enabled: true, bufferTokens: 13000, maxConsecutiveFailures: 3 }, compact: { keepRecentMinTokens: 10000, keepRecentMaxTokens: 40000, minTextBlockMessages: 5, recentFilesToReinject: 5 }, hooks: { PreCompact: [], PostCompact: [] } }逐项解释一下。autoCompact.enabled控制是否开启自动压缩关掉之后只有你手动敲/compact才会压。bufferTokens对应源码里的AUTOCOMPACT_BUFFER_TOKENS它的作用是给输出预留空间阈值大致等于「上下文窗口减去最大输出 Token再减去这个 buffer」。以 200K 窗口、20K 输出为例有效上下文约 180K再减 13K触发线落在 167K 附近。maxConsecutiveFailures是熔断阈值。压缩本身也可能失败比如要总结的历史太长连压缩请求都超限了。连续失败达到这个次数就停止自动压缩避免陷入「失败—重试—再失败」的死循环。这个设计很像服务治理里的熔断器防止级联故障。compact段控制压缩后保留多少近期消息。keepRecentMinTokens和keepRecentMaxTokens划定保留区间minTextBlockMessages保证至少留下几条有实际文本的消息recentFilesToReinject决定压缩后重新注入几个最近访问的文件内容——这一步很关键否则 AI 压缩完就「忘了」文件长什么样没法继续编辑。hooks段是扩展点。PreCompact在压缩开始前执行可以往摘要里注入项目规范PostCompact在压缩完成后执行适合做通知或清理。它们不修改核心代码就能介入流程类似 Spring 里的 BeanPostProcessor。4. 验证请求观察压缩触发与日志输出配置好之后怎么确认压缩真的发生了最直接的办法是制造一个长对话把 Token 用量顶到阈值附近然后看日志。下面给一个可操作的验证流程。先开一个 Claude Code 会话让它连续读取几个较大的文件比如把一个几千行的日志文件、一个配置文件、一个源码文件依次读进来。每读一个观察 Token 计数往上走。当用量接近触发线时你会看到类似「正在压缩对话历史」的提示压缩完成后通常会显示压缩前后的 Token 对比比如从 160K 降到 25K。如果你想更精确地观察可以在压缩前后各发一条消息让模型复述「刚才读过哪些文件」。压缩前它能列出全部压缩后如果只重新注入了最近 5 个文件它可能只记得其中一部分这正好验证了recentFilesToReinject的效果。日志层面Claude Code 会在压缩时输出边界标记形如一条 System 消息标注压缩发生的时间点。你可以在会话历史里搜这个标记快速定位每次压缩的位置。如果开了调试日志还能看到calculateTokenWarningState()的状态流转normal、warning、error、autoCompact、blocking 五个级别压缩通常发生在 autoCompact 这一级。手动触发也值得试一次。在会话里输入/compact它会走全量压缩流程部分版本支持指定范围对应源码里的from和up_to两种方向——前者压缩从某条消息到最新后者压缩从最旧到某条消息。手动压缩的好处是你能控制时机比如在切换任务前先压一次把无关历史清掉。验证时建议配合一个简单的脚本记录 Token 变化。你可以让 Claude Code 在每次压缩后把preCompactTokenCount和postCompactTokenCount打印出来这两个字段就在CompactionResult里。多跑几次你就能摸清自己项目下压缩的频率和收益。5. 本篇常见错排查压缩不触发、报错与信息丢失压缩一直不触发。先确认autoCompact.enabled是 true再检查 Token 用量是否真的到了阈值。很多人以为聊了很久就该压缩但实际上如果消息里工具结果不多Token 增长很慢可能离触发线还远。另外如果之前连续失败触发了熔断自动压缩会被停掉需要重启会话或手动/compact恢复。压缩请求本身报 Prompt Too Long。这是压缩的经典坑要总结的历史太长加上摘要提示词后总长度反而超限。源码里的处理是truncateHeadForPTLRetry()每次重试丢弃最旧的一组 user-assistant 轮次最多重试 3 次。如果你看到这个报错反复出现说明单次对话积累得太多建议更早手动压缩或者调低bufferTokens让触发更早。压缩后 AI 不记得文件内容。检查recentFilesToReinject是不是设得太小。压缩后上下文重建时会重新注入最近访问的文件数量不够就会导致 AI 编辑文件时「凭印象」改容易出错。把它调到 5 到 8 之间通常够用但注意注入本身也占 Token别设太大。压缩后权限或行为异常。压缩改变了消息结构很多基于消息位置的缓存会失效。源码里有runPostCompactCleanup()专门清理这些缓存包括系统提示词分区、权限检查结果、Token 计数等。如果你用的是较旧版本可能清理不完整表现为压缩后系统提示词用错版本。升级到较新版本一般能解决。Hook 没执行。检查settings.json里PreCompact和PostCompact的路径是否正确以及脚本是否有可执行权限。Hook 执行失败通常不会中断压缩但会在日志里留下错误容易被忽略。6. 继续深入从源码到长期编码实践读 compact 源码最大的收获不是记住那几个阈值而是理解它的分层思路时间触发的微压缩先清掉过期的工具结果缓存感知的微压缩再挑结果型工具下手SessionMemory 压缩尝试用持久化记忆替代实时总结最后才轮到全量压缩调模型写摘要。这套「能不调模型就不调」的哲学直接决定了你的使用成本。如果你想在本地把这条链路跑通建议按这个顺序来先用 TaoToken 的 API Keys 配好入口把settings.json骨架落地再到模型对话页面确认模型可用然后跑一次长对话观察压缩日志。等你对压缩时机有感觉了再考虑用 Coding Plan 支撑长期的编码和 Agent 任务额度模型更适合高频场景。真正上手之后你会发现压缩不是「出问题了才处理」的兜底而是可以主动管理的。在切换任务、结束一个功能模块、准备开新分支之前手动压一次往往比等它自动触发更划算。至于那些阈值别死记去源码里搜常量名结合你实际的上下文窗口算一遍比抄任何配置都靠谱。
企业数字化 ERP 产品动态
相关推荐
安装wordpress注意什么意思最佳实践 新手装WordPress踩坑?3个配置细节对比评测帮你搞定服务器 域名服务器搞不懂?别慌,这确实是新手转行建站最头疼的坑。 很多人以为买个域名、租个服务器就能开工,结果一动手就卡壳。… · 2026/9/27 21:37:22
零后端硬改!LightRAG二次开发全局顶部导航,无缝对接自研第三方业务系统 博主深耕AI本地部署、RAG工程化落地、开源框架二次开发运维实操,专注轻量化智能检索平台私有化适配改造,全程落地可复现,无冗余理论踩坑干货,适配政企内网自研业务全场景集成需求。 📌 写在前面:为什么一定要改 LightRAG 顶部 Header?
很多政企、园区、事业单位技术团… · 2026/9/27 21:37:22
树和二叉树的应用(哈喜老师) 1.哈夫曼树(也称为赫夫曼树)(重点)
1.1:一些与树相关的概念1.2:哈夫曼树的概念1.3:哈夫曼树的构造1.4:哈夫曼树的性质习题1(易)习题2(题目简单,但是问法很新颖)习题3(易错… · 2026/9/27 21:37:22
模型无关设计:OpenClaw 兼容 GPT、Claude 与本地大模型的配置骨架 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 22:01:46
嵌入式c语言编程的一些概念合并或正式提出 最近,我在写stm32单片机程序,有一些概念在前面我总结的文章中没有明确提出来,但是含义已经表达清楚了,今天这篇文章就是对这些概念进行总结合并并正式提出。(1)应用层和驱动层。我以前文章中多次提到&#… · 2026/9/27 22:01:46
OpenClaw 实战避坑:从 gateway 配置到 skill 加载的问题记录与 tips 汇总 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 22:01:46
OpenViking 调研:用 TaoToken 统一 Key 打通配置与验证链路 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 22:01:40
网站建设所要花费的资金一文搞懂:小白避坑指南 网站建设所要花费的资金一文搞懂:小白避坑指南 自己不会代码,想做网站却怕被坑?别慌,这行水深,但底细能摸透。今天咱们不整虚的,直接拆解网站建设所要花费的资金,一文搞懂从域名到上线的每一笔钱花在哪。很多初学者刚入行,对着报价单一头雾水,不知道… · 2026/9/27 22:01:40
科研必备文献工具 Zotero:从入门到高效管理 1. 引言
对于科研工作者来说,文献管理是日常工作中绕不开的一环。从文献的检索、下载、阅读、标注,到论文写作时的引用插入,每一个环节都耗费着大量精力。而 Zotero 作为一款免费、开源、跨平台的文献管理工具,凭借其强大的插件生… · 2026/9/27 22:01:39
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01