1. 长会话跑到一半突然卡住,问题多半出在 Token 预算
如果你用 Claude Code 做过稍微大一点的重构,大概率遇到过这种场景:前面聊得好好的,突然某次提问返回Prompt is too long,或者界面提示正在压缩上下文,然后你发现它把之前读过的文件全忘了,又得重新@一遍。这不是模型变笨了,而是上下文窗口的 Token 预算被撑爆了。
Claude Code 默认的上下文窗口是 200K tokens,但这个 200K 不是全给你聊天用的。系统提示词、工具定义、CLAUDE.md、git status、输出预留,这些都要从窗口里扣。真正留给对话历史的空间,往往只有 150K 上下。一旦逼近上限,自动压缩(Auto Compact)就会介入,把早期对话摘要化,代价是细节丢失。
这篇要解决的就是这件事:通过settings.json里的预算阈值和窗口参数,把 Token 消耗变成可观测、可控制的量,而不是等它自己爆。适合正在用 Claude Code 做长会话开发、被上下文截断困扰、想建立预算管理习惯的开发者。下面从配置骨架到验证流程,一步步来。
2. 先把 TaoToken 的接入准备好
Claude Code 本身是个客户端,它需要一个兼容 Anthropic 接口的后端来跑模型。TaoToken 提供的就是这个接入层,你可以在官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 了解整体能力,API 入口是 https://taotoken.net/api。
接入前你需要拿到一个 API Key。登录后进入控制台,在 API Keys 页面创建一个新 Key,复制保存。这个 Key 后面会写进 Claude Code 的环境变量里。
关于模型选择,如果你跑的是长上下文场景,建议选支持大窗口的模型。Claude Code 客户端对未知模型有个保守默认值 200K,但实际后端模型可能支持更大窗口。你可以在模型名称里带上窗口标记,比如deepseek-v4-pro[1m]这种写法,客户端会据此调整预算计算。具体支持哪些模型和窗口规格,以控制台和文档为准。
拿到 Key 之后,配置环境变量。在~/.zshrc或~/.bashrc里加两行:
export ANTHROPIC_BASE_URL="https://taotoken.net/api" export ANTHROPIC_API_KEY="你的Key"然后source ~/.zshrc让它生效。这一步是后面所有配置的前提,Key 没通,预算管理无从谈起。
3. settings.json 里的预算阈值与窗口参数配置骨架
Claude Code 的配置分两层:全局的~/.claude/settings.json和项目级的.claude/settings.json。预算相关的参数主要围绕上下文窗口大小、输出预留、自动压缩触发线来设。
先看一个完整的配置骨架:
{ "model": "deepseek-v4-pro[1m]", "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "你的Key", "CLAUDE_CODE_MAX_OUTPUT_TOKENS": "8192", "MAX_THINKING_TOKENS": "4096" }, "autoCompactEnabled": true, "contextWindow": 1000000, "compactThreshold": 0.85 }逐项说明。model字段决定客户端按哪个窗口来算预算,带[1m]标记时客户端会把窗口识别为 1M tokens,而不是默认的 200K。CLAUDE_CODE_MAX_OUTPUT_TOKENS控制单次输出上限,默认实际是 8K,你设成 8192 就是显式锁定。MAX_THINKING_TOKENS是思考链的预算,长会话里建议单独限制,不然思考过程会悄悄吃掉大量窗口。
contextWindow是显式声明窗口大小,和模型名里的标记配合使用。compactThreshold是自动压缩的触发比例,0.85 表示用到窗口的 85% 时开始压缩。这个值不要设太接近 1,因为压缩操作本身也要消耗 Token,留 15% 余量比较稳。
如果你不想用自动压缩,把autoCompactEnabled设为false,但这样你得自己盯着用量手动/compact,长会话里容易忘。建议保留自动压缩,把阈值调好。
项目级配置可以覆盖全局配置,比如某个大仓库你希望窗口开满,就在项目.claude/settings.json里单独写contextWindow。这样切项目时预算策略跟着走,不用每次改全局。
4. 验证一次 Token 消耗,确认预算真的生效
配置写完不算完,得验证它确实按你设的窗口在算。下面走一遍可复现的验证流程。
第一步,启动 Claude Code,在项目目录下运行:
claude进入交互界面后,先看它识别的模型和窗口。输入/status或/config,界面会显示当前模型、上下文窗口大小、已用 Token 数。如果窗口显示的是 1M 而不是 200K,说明model字段的窗口标记生效了。
第二步,制造一次可控的 Token 消耗。让 Claude Code 读一个大文件:
@src/large-file.ts 帮我分析这个文件的依赖关系读完之后,再看/status,已用 Token 数会明显跳一截。记下这个数字,这是你的基线。
第三步,连续追问,观察压缩触发点。反复让它读不同文件、追问细节,每次追问后看已用 Token 数。当用量逼近contextWindow × compactThreshold时,界面会出现压缩提示。以 1M 窗口、0.85 阈值算,大约在 850K 附近触发。如果你设的是 200K 窗口,触发点就在 170K 左右。
第四步,验证压缩后的行为。压缩触发后,再问一个依赖早期上下文的问题,比如「刚才那个 large-file.ts 里导出了哪些函数」。如果它答得出来,说明摘要保留了关键信息;如果答不上来,说明压缩把细节丢了,这时候你就该考虑调低阈值、更早压缩,或者把关键信息写进 CLAUDE.md 让它常驻。
整个验证过程的核心是:每次操作后看/status的 Token 数,把「操作 → 消耗 → 触发」这条链路走通。走通一次,你就有了自己项目的预算基线。
5. 本篇常见错排查
报错一:Prompt is too long但窗口明明没满。这通常是输出预留没算对。输入上限 = 窗口大小 - min(maxOutputTokens, 20K)。如果你把CLAUDE_CODE_MAX_OUTPUT_TOKENS设得很大,输入空间就被压缩了。检查这个值,长会话里 8K 够用,别设成 64K。
报错二:改了contextWindow但/status还是显示 200K。模型名里的窗口标记和contextWindow字段要同时存在才生效。只改一个,客户端可能仍按默认值算。确认model字段带了[1m]之类的标记。
报错三:自动压缩反复触发,对话被切得七零八落。说明compactThreshold设太高,压缩后剩余空间又很快被填满。调低到 0.75 左右,让压缩更早发生、每次压缩后留更多余量。另外检查是不是有工具在疯狂输出,比如Bash跑了find /这种,把工具结果也纳入预算观察。
报错四:压缩后模型完全失忆。这是摘要保真度问题。Claude Code 的压缩提示词目标是信息保真优先于长度压缩,但如果你早期对话里塞了大量低价值内容,摘要也会被稀释。解决办法是把关键约束、文件路径、接口签名写进CLAUDE.md,这些内容在压缩后会重新注入,不依赖摘要保留。
报错五:环境变量没生效,请求打到默认端点。检查ANTHROPIC_BASE_URL是否拼写正确,以及是否在启动 Claude Code 的同一个 shell 里 export 的。用echo $ANTHROPIC_BASE_URL确认一下。
6. 把预算管理变成习惯,从一次验证开始
Token 预算管理不是配一次就完事,它更像看仪表盘。你不需要每次对话都盯着数字,但至少要知道自己项目的基线在哪、压缩在什么水位触发、压缩后哪些信息会丢。
建议的做法是:新项目接入后,先按上面的流程跑一次验证,记下窗口大小、阈值、触发点三个数。之后每隔一段时间,或者感觉对话变慢、开始失忆时,再跑一次/status对一下。如果发现触发点比预期早很多,多半是某个工具在偷偷吃 Token,去查最近的工具调用记录。
接入层面,API Key 和接入文档在 https://taotoken.net/api-keys 和 https://taotoken.net/doc 可以找到。想先验证模型在长上下文下的表现,可以直接用模型对话页面试几轮,看它在接近窗口上限时的召回质量。如果你打算长期跑编码任务或者搭 Agent 工作流,Coding Plan 更适合,预算和窗口策略可以按项目维度管理。把这些配置和验证流程固化下来,长会话失控的概率会低很多。