大家好,我是飞哥,一个Java转AI应用的开发者。
下午三点多,一个线上 bug 改到一半,Claude Code 停住了:额度用完,几晚上8点恢复。
回想上午:读了一遍没看过的模块,跑了两轮测试,顺手整理了几次提交说明。单看都不重,加起来,把下午最要紧的那一小时赔进去了
这事碰多了,我干脆把它当成一个工程问题来拆:额度是怎么算的,怎么提前知道要撞,撞了以后怎么走代价最小

服务方只给你三个数
据我理解,常见的额度有三种算法,各有各的撞法:
| 计量方式 | 怎么重置 | 什么时候容易撞 | 据我理解谁在用 |
|---|---|---|---|
| 短窗口(如 5 小时) | 从第一条消息起算,到点整体清零 | 连续密集调用两三个小时后 | Claude Code、Codex 的会话窗口 |
| 长周期(周、月) | 固定周期清零,有的还按模型单独限 | 前几天用狠了,后面干等 | Claude Code、Codex 的周限额;Cursor 按月 |
| 按请求数(日) | 每天固定次数,按模型分桶 | 一句一问、小步快跑 | Gemini CLI |
短窗口常被叫作「滚动窗口」,但它和限流里的滑动窗口不是一回事:滑动窗口的起点每秒都在挪,这里的起点在你发第一条消息时就定了。记住这一点,后面的预热就靠它
服务方能告诉你的,少得可怜:
ts
// 示意:一个额度窗口,各家字段名不同,内容大致就这几样
interface UsageWindow {
kind: 'session' | 'weekly' | 'monthly' | 'daily'
model: string | null // 按模型单独限额时才有
usedPercent: number // 已用百分比
windowMinutes: number // 窗口长度
resetsAt: number | null // 下次重置的时间
}
没有 token,没有钱,只有百分比和时间。后面所有判断,都只能靠这两个量
节奏:比两个比例
判断偏快只要比两个数:窗口时间过去了多少,额度用掉了多少

用掉的明显跑在时间前面,就是偏快:照这个速度外推,耗尽点落在重置之前,中间那段就是你要干等的时间。反过来,窗口只剩四分之一、额度还剩一大半,这部分到点清零,等于白扔
落到代码里,我用的是这几条阈值,可以按自己的习惯调:
- 预计用到 110% 以上,算偏快
- 剩不到四分之一的时间、预计至少 25% 用不上,算用不完
- 窗口过去不到 10% 不判断:开头读个大模块,10% 的时间用掉 30% 很正常
还有个更隐蔽的坑:外推要用最近的速度,别用整个窗口的平均

上午两小时闲着,最近一小时在猛跑。平均速度告诉你刚好够,最近的速度告诉你 48 分钟后就没了
那能不能干脆让模型来判断?
不划算:问它一句「我还剩多少」本身就花额度,同样的输入两次回答还可能不一样。这种事,写死的规则就够了
偏快时:先换模型,别急着换 Agent
偏快还有操作空间,最便宜的动作是换模型。按模型分限额的服务上,大模型的周限额往往先到头,而起标题、写提交说明、翻译注释这类轻活,本来就用不着它
会话不动,上下文不动,只是下一轮换个脑子
换 Agent 最贵。Claude Code 这个会话里读过的文件、聊过的方案,Codex 一概不知道,得重新喂一遍
撞了以后:等、换号、换 Agent

- 等:短窗口离重置不到一小时,就等。别干等,把消息预约到额度恢复后自动发出去,人去干别的
- 换号:同一个 Agent 的第二个订阅。两个账号共享会话历史的话,换过去原会话原样恢复(后面讲怎么做到)
- 换 Agent:任务不依赖原来的上下文,或者几句话能说清,就移交过去。移交时上下文怎么带,系列第 3 篇单独讲
最容易误判的是这个场景:5 小时窗口撞了,离重置只剩四十分钟,人一急就移交给了另一个 Agent,上下文丢了一半。等四十分钟能原样接着的事,变成了重讲一遍前因
撞的是周窗口,才需要动换号和换 Agent
预热:把重置挪到饭点
短窗口从第一条消息起算,那窗口什么时候开始,其实由你定

10:00 才开工,窗口是 10:00 到 15:00,重置落在你正干活的时候。8:00 先发一条最小请求,就有两个完整窗口:上午一个,下午一个,重置落在午饭
另一种是「窗口一重置就预热」:上一个窗口到期就发一条,让下一个窗口立刻计时,首尾相接,不用等你坐下来才开始
几个提醒:
- 预热不加总量,只挪边界。作息不固定的人,预热只是多花一条请求
- 对周、月限额和按请求数的额度没用,它们跟「什么时候开始」无关
- 据我理解,有的服务方会给闲置的窗口挪重置时间,预热之后要留冷却期,不然会反复触发,白白花额度
多账号:只换钥匙,不换屋子
Claude Code、Codex 这类 CLI 把登录态和会话历史放在同一个配置目录里,用哪个目录由环境变量决定(CLAUDE_CONFIG_DIR、CODEX_HOME)。所以换号,就是换它启动时读的目录

麻烦在于两个目录各管各的,会话历史不互通,换过去等于换了个不认识你的人。办法是把历史目录软链到同一处,只让凭据各自独立
这里有两处容易撞墙:
settings.json不能软链:CLI 写它是先写新文件再改名,软链会被换成普通文件。只能每次启动前复制一份- 路径要一字不差:Claude Code 2.1 起在 macOS 钥匙串里按配置目录路径的原文给凭据起名,同一个目录换个写法,就找不到登录了
另外,一个人开多个订阅号符不符合服务方条款,得自己核对
落成了什么
这篇讲的做法,我放进了自己在做的 Antumi:状态栏常驻各 Agent 的用量和恢复时间,按上面的规则判断偏快还是用不完,没号可换就等恢复后自动继续;预热可以按每日时点或窗口重置后触发。
它是一个开源的多 Agent 工作台,Agent 照常用,窗口之间复制粘贴的活交给它:
Github :𝗳𝗹𝘆𝗵𝗲𝗿𝗼/𝗮𝗻𝘁𝘂𝗺𝗶