背景:一条永远不原谅你的线
AIUsage 是我在做的一个 macOS 菜单栏小工具,显示 Claude 订阅的 5 小时 / 7 天额度,核心是一个叫 pace 的概念:假设你想在窗口重置那一刻正好用到 99%,那么”匀速”到现在应该用了多少,和实际用了多少差多少。菜单栏里就是一个 7d 42% ▲9 这样的东西——42% 用掉了,比匀速预算高 9 个点。
用了几周之后发现这条线有一个毛病:它永远不原谅你。周二就把一周额度烧掉 60%,菜单栏会显示 7d 60% ▲32,然后一直到周日都差不多是这个数——不管你后面怎么省。数字是对的,但它在几天前就已经不再是”建议”了:你没法回到周一重来,而它也不回答你现在最想知道的问题——从此刻起,剩下的 39% 撑到周日够不够?
想法:从现在开始平均
解决办法其实是财务里很老的做法:re-forecast。已经花掉的算沉没成本,只对剩下的钱和剩下的时间重新做预算。
落到产品上就是 7 天那一行多一个按钮 Re-pace from now / 从现在开始平均。按下去的瞬间记一个检查点 (t₀, used₀)——当前时间和当前用量——之后:
- 预算线不再从 (0, 窗口开始) 出发,而是从 (used₀, t₀) 出发,匀速走到 (99%, 重置时刻)。
- 差值、预计到达、耗尽时间、菜单栏的 ▲▼ 标记、超速通知,全部改成相对这条新线。
- 进度条上留下三条刻度:一条淡的,是原预算线现在应该在的位置(整体上超了多少还看得见);一条虚线,是检查点,不动;一条实线,是新预算,随时间前进。
- 检查点绑定在这一个窗口实例上,窗口重置自动失效;也可以手动清除。
按下之后菜单栏会从 7d 60% ▲32 变成 7d 60% ○(刚开始,还看不出节奏),一小时后变成 7d 63% ● 或者 ▲2——一个你真的可以照着调整的数字。
公式
好处是数学上什么都没变,只是把原点挪了一下。原来的 pace:
elapsed = (now − start) / (reset − start)
budget = 99 × elapsed
delta = used − budget
projected = used / elapsed
runsOut = start + (now − start) × (99 / used)
Re-pace 之后,把 (0, start) 换成 (base, origin):
origin = checkpoint.time
base = checkpoint.used
remaining = 99 − base
progress = (now − origin) / (reset − origin)
consumed = used − base
budget = base + remaining × progress
delta = used − budget
projected = base + consumed / progress
runsOut = origin + (now − origin) × (remaining / consumed)
“刚开始不投影”的规则也跟着原点走:刚按下按钮的时候 consumed ≈ 0,除以一个很小的 progress 没有意义,所以头一段时间只显示差值,不显示预计。这个等待时间按窗口定:5 小时窗口 15 分钟,7 天窗口 1 小时(最初用的是”窗口长度的 5%”,对 7 天窗口就是八个多小时,自己用了一下发现等不了那么久,改成了固定时长)。
一个退化情形要处理:检查点在重置之后、或者按下时已经 ≥ 99%,这时候”余量”是零或负数,直接忽略检查点回退到普通 pace,而不是算出一堆奇怪的数。
为什么不做拖动
最初的设想还包括让用户拖那条线,选”从哪一刻开始平均”。想了一下放弃了,原因不是难做,是没有语义:AIUsage 只有当前快照,没有用量历史。把线拖到”周二中午”的时候,我不知道周二中午用了多少,凑不出一个 (t₀, used₀);拖百分比也一样,缺时间那一半。“现在”是唯一一个同时知道时间和用量的时刻。等以后攒了用量历史(那本身也在计划里,可以画趋势),拖动就顺理成章了。
顺便:它是通用的
实现上检查点挂在 PaceWindow 这个抽象上,而不是 Claude 的 7 天窗口上。5 小时窗口、DeepSeek 的月预算都是同一个类型,加个按钮就能用。目前只在 7 天那一行放了按钮——那是”早期用超会折磨你好几天”的地方;5 小时窗口反正很快就过去了。
链接
- 官网上的说明和示意图:aiusage.cogflux.io/#repace
- 源码(MIT):github.com/CogFlux/aiusage,核心在
Sources/AIUsageCore/PaceCalculator.swift,公式和失效规则写在docs/data-contract.md - 功能进入 AIUsage 0.2.2(2026 年 9 月)