长会话省额度
Claude Code 每一步都带着整段会话发出去。了解缓存怎么计费、什么时候会失效,以及怎样换新会话接着做,不丢进度也不多花钱。
Claude Code 每发一次请求,都会把整段会话一起发给模型:你说的话、它的回复、每一次工具调用和输出。
会话越长,每一步的输入就越多。
提示缓存让重复的那部分按低价计费,但缓存会过期。过期后的第一条消息,整段会话要按写入价重新算一遍。
缓存怎么计费
以 claude-opus-5 为例,按模型价格里的输入单价,一次请求的输入分三种状态计费:
| 状态 | 什么时候出现 | 按输入单价的倍数 |
|---|---|---|
| 缓存命中 | 和上一步前缀相同,缓存还没过期 | 0.1 |
| 缓存写入(5 分钟档) | 第一次发送,或缓存已经过期 | 1.25 |
| 缓存写入(1 小时档) | 同上,开了 1 小时缓存时 | 2 |
用令牌接入时,Claude Code 的缓存默认只保留 5 分钟。 通过 VibeAPI 使用就是这种情况;订阅账号是 1 小时。
也就是说,离开 5 分钟以上再回来,下一条消息会把整段会话重新写入一遍。
以一个 30 万 token 的会话为例:
| 回来时 | 下一步的输入相当于 |
|---|---|
| 5 分钟内 | 3 万 token 的输入价 |
| 超过 5 分钟 | 37.5 万 token 的输入价,是前者的 12.5 倍 |
auto 分组的令牌没有提示缓存
Claude 系模型只有在「Claude 官方满血版」分组上才有提示缓存。auto 分组的 usage 里不返回缓存字段,见 Messages · 分组差异。
在 auto 上,长会话的每一步都按全价计算整段上下文,下面的做法对你更重要。
第 1 步:看清现在的会话
在 Claude Code 里运行两个命令:
/context:当前上下文占了多少 token,哪些部分占得多。/usage:本次会话的用量。Session 一栏里有一行Prompt cache (main),需要 Claude Code v2.1.251 及以上。
Prompt cache (main) 这一行会告诉你:
- 命中率:多少输入是从缓存读的
- 缓存失效(miss)了几次,最近一次重写了多少 token
- 缓存现在是否还有效(warm / cold)
示例:
Prompt cache (main): 14 requests · 91% of input tokens from cache · 2 misses (last 6m 10s ago, 310.2k tokens re-cached) · warm (5m TTL, last activity 40s ago)在控制台 · 使用日志里,每条请求也能看到缓存读、缓存写的 token 数。
缓存写得多、读得少,说明缓存经常失效。
第 2 步:按顺序调整
换一件事,就开新会话
一件事做完,下一件和它关系不大时,运行 /clear 开始新会话。
旧会话不会删除,想回去用 /resume。
为什么要清?旧会话里留着上一件事的工具输出。这些内容对新任务没有用,却会在之后的每一步里跟着发出去。
会话很长又放了一阵,开新会话接着做
满足这两条时,不要回原会话接着发:
- 会话已经很长,比如
/context显示超过 20 万 token - 离开的时间超过了缓存有效期
开一个新会话,在同一个项目目录里,把下面这段话发给它:
接着做这个项目上一个会话没做完的事:
1. 在 ~/.claude/projects 下找到这个目录对应的文件夹,按修改时间找到上一个会话的记录(不是你自己这个)。
2. 只读其中用户和助手的文字,不读工具调用和工具输出。
3. 用 git status、git log 和项目里的文件核对现在的状态。
4. 然后接着做。手上有旧会话 ID 的,把「上一个会话」换成这个 ID。
这样做为什么省?
- 会话记录里大部分是工具调用和输出,人和助手说的话只占一小部分。
- 只读文字,新会话花几万 token 就能补上背景,比把几十万 token 的旧会话整段重写便宜得多。
- 旧的工具输出是当时的快照。现在的状态以
git status和文件为准,反而更可靠。
经常离开半小时左右再回来,改成 1 小时缓存
在 ~/.claude/settings.json 里加一行,需要 Claude Code v2.1.242 及以上:
{
"promptCacheTtl": "1h"
}怎么选:
- 改成 1 小时:写入单价是 5 分钟档的 1.6 倍(2 对 1.25),适合经常停下来想一想、看一眼再回来的用法。
- 保持默认:一次做完、不中途离开的,5 分钟档更省。
开启 1 小时缓存后还要注意一点:终端里的会话超过 20 万 token、闲置约 54 分钟时,Claude Code 会趁缓存没过期自动压缩一次。回来时会看到:
Compacted while idle, before the prompt cache expired打算按上一节的做法换新会话、不需要摘要的,在同一个文件里关掉它:
{
"promptCacheTtl": "1h",
"idleCompaction": false
}不要用 /compact 给长会话续命
/compact 会先把整段会话读一遍再写摘要:
- 压缩一个大会话,本身就是一次大请求。
- 缓存已经过期时,这一遍还要按写入价算。
- 摘要保留哪些内容,由不得你决定。
想保留进度,用上面「开新会话接着做」的做法;不需要保留,直接 /clear。
新会话靠什么接得上
新会话能顺利接手,靠的是旧会话留在项目里的内容:
- 提交说明写清改了什么、为什么。 新会话第一件事就是看
git log。 - 定下来的约定写进
CLAUDE.md。 Codex 是AGENTS.md。新会话启动时会自动读这个文件,不要只留在聊天里。 - 做到一半的状态写进文件,比如一份待办清单。
这几样都在,换会话几乎没有损失。
确认省下来了
调整一两天后再看一次:
/usage里Prompt cache (main)的命中率更高,misses 更少。- 控制台使用日志里,缓存写的 token 数占比下降。
- 同样的工作量,控制台的消耗曲线更平,不再有回到旧会话时的尖峰。
最后更新于