抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

Claude 订阅的 5 小时与每周额度仅在 claude.ai 的用量页呈现。Claude Usage Widget 是一个 macOS 原生桌面小组件(Swift / SwiftUI),将两类额度(已用百分比与重置倒计时)、按模型的每周额度、类似 GitHub 的每日使用热力图,以及本机 Claude Code 的 token 用量与估算费用常驻于桌面;四档尺寸的卡片大小、圆角与网格吸附均与系统小组件一致。最新发布版本为 v1.0.0(2026-10-13),以 MIT 协议开源:Yu-Xiang-Yang/claude-usage-widget。该项目为独立项目,与 Anthropic 无隶属关系,开发过程借助 Claude Code 完成。

1 背景与动机

使用 Claude Code 时,需要掌握当前所处的额度窗口:5 小时窗口剩余多少、每周额度已消耗多少、何时重置。获取这些信息存在三方面不便:

  • 可见性:额度百分比与重置时间仅出现在用量页,读取需离开当前工作窗口;
  • 数据来源分离:额度百分比由服务端计算,本机日志不含该信息;token 数与费用则只能由本机日志推得。两类数据须分别获取后合并显示;
  • 历史不可回溯:Claude Code 会清理旧会话日志,仅依赖日志无法保留长期的使用趋势,需由组件自行保存每日汇总。

Claude Usage Widget 的目标是将上述数据合并为一张常驻桌面的卡片,并使其外观与交互遵循系统小组件的规范。

2 功能概述

特大尺寸界面(模拟数据):三类额度、热力图、汇总与模型占比

图 1 特大尺寸(704 × 344 pt)界面(模拟数据,由 --demo 模式渲染,不对应真实账户)。左栏为 5 小时、每周及按模型(Fable)的每周额度,各附本机在该窗口内的 token 数与估算费用;右栏为每日 token 热力图(近 21 周活跃 107 天)、今日 / 近 7 日 / 近 30 日汇总、今日 token 构成与模型占比。

主要功能如下:

功能 说明
订阅额度 5 小时与每周额度的已用百分比、重置倒计时,以及本机日志在该窗口内的用量;套餐含按模型的每周额度时一并显示。已用比例 ≥ 70 % 时进度条为黄色,≥ 90 % 时为红色
使用热力图 每日一格、5 级色阶、周一为每周首日,可按 tokens 或消息数着色;历史由组件自行保存
用量汇总 今日、近 7 日、近 30 日的 tokens 与估算费用;今日 token 构成(输入、输出、缓存写、缓存读)与模型占比
原生尺寸 小、中、大、特大四档,与系统小组件的尺寸、圆角、网格吸附一致;macOS 26 上使用 Liquid Glass 材质,更早的系统回退为毛玻璃背景
中英文界面 语言跟随系统,可在右键菜单中切换
登录项 可选「登录时启动」,以当前路径注册为系统登录项

图 1 的模拟数据中,今日 token 总量为 214.0 M,其中缓存读取 203.5 M,占 95.1 %;输出 820.0 K,占 0.38 %。该构成说明 token 总数主要由缓存读取贡献。按源码价格表,Opus 5.5 的缓存读取单价为输入价的 5 %(0.20 / 4),因此 token 总数与估算费用不成比例,组件并列显示两者。

3 尺寸与界面

3.1 小组件尺寸

尺寸 卡片(pt) 内容
小 164 × 164 5 小时与每周额度
中 344 × 164 两项额度、热力图、今日用量
大(默认) 344 × 344 两项额度(含本机窗口用量与按模型额度)、热力图
特大 704 × 344 大尺寸全部内容;按模型的每周额度各占一行,并显示本机在该窗口内的对应用量;另含近 7 / 30 日汇总、今日 token 构成与模型占比

四档尺寸切换

图 2 四档尺寸(模拟数据)。

大尺寸,浅色外观 大尺寸,深色外观

图 3 大尺寸的浅色与深色外观(模拟数据)。

小尺寸 中尺寸

图 4 小尺寸(左)与中尺寸(右)(模拟数据)。

3.2 应用图标

应用图标:深色圆角方块上的橙色用量圆环与四角星

图 5 应用图标(512 × 512 px)。

图标由 scripts/make-icon.swift 以几何图形绘制,不含第三方或品牌素材:深色圆角方块上,橙色圆环表示用量仪表,环内为四角星。图标显示于访达、启动台、Spotlight 与「登录项」列表。该图标在 main 分支中(Resources/AppIcon.icns,由 build.sh 写入应用包),更新日志将其记为 1.0.1 的新增项,尚未发布,因此 v1.0.0 发布包不含该图标。

4 系统架构

v1.0.0 的全部源码为 9 个 Swift 文件,共 2 389 行,由 build.sh 一并编译,不含 Swift Package 或 Xcode 工程。数据流如下:

Claude Code 日志(*.jsonl)─▶ UsageScanner(增量扫描 30 s,按消息去重)
                                   │
                                   └─▶ HistoryStore(每日汇总,history.json)─┐
                                                                              ├─▶ Snapshot ─▶ WidgetView(SwiftUI,四档尺寸)
claude.ai 用量接口 ─▶ QuotaFetcher(内嵌 WebKit,至多每分钟一次)─▶ QuotaInfo ─┘
                                                    └─ quota.json(重启后立即显示)
文件 作用
Sources/main.swift 入口与命令行模式
Sources/AppController.swift 面板、尺寸、吸附、状态栏图标、登录项
Sources/WidgetView.swift 四档尺寸的 SwiftUI 布局
Sources/UsageStore.swift 日志扫描、定价、聚合
Sources/UsageModel.swift 刷新调度与发布状态
Sources/QuotaFetcher.swift WebKit 取数与登录窗口
Sources/Support.swift 额度解析与缓存、每日历史、尺寸定义
Sources/Localization.swift 语言偏好与格式化
Sources/Demo.swift 截图用的合成数据
Resources/AppIcon.icns 应用图标,由 scripts/make-icon.swift 生成(main 分支,更新日志记为 1.0.1,尚未发布)

采集与展示以 Snapshot 为接口:日志扫描与额度读取各自在后台完成,合并后发布给视图层。额度读取失败不影响本机统计与热力图的更新。

5 本机用量统计

组件读取 Claude Code 的会话日志(~/.claude/projects/**/*.jsonl,以及 ~/.config/claude/projects 与 CLAUDE_CONFIG_DIR 指定的目录),累加每条助手消息的 usage 字段。

5.1 token 的定义

token 总数定义为输入、输出、缓存写入与缓存读取四项之和。缓存写入按 cache_creation 中的 5 分钟与 1 小时 TTL 分别记录;两项之和小于 cache_creation_input_tokens 时,差额计入 5 分钟 TTL。模型标识为 <synthetic> 的记录不计入。

5.2 流式消息的去重

同一条流式消息在日志中被多次写入,各条记录的输出 token 数随生成过程递增。组件以 message.id 与 requestId 的组合为键,对同一键仅保留输出 token 最大的一条(最终条目)。消息与请求标识均缺失时,退而使用记录的 uuid。实测表明,不去重时 token 总数约翻倍。

5.3 费用估算

费用按公布的 API 标价估算,价格表为源码中的 Pricing(Sources/UsageStore.swift),单位为美元 / 百万 token,按模型标识的最长前缀匹配;未匹配的模型按 claude-opus-5-5 的价格计。单条记录的费用为

$$ C = 10^{-6} \left( p_{\mathrm{in}} N_{\mathrm{in}} + p_{\mathrm{out}} N_{\mathrm{out}} + 1.25 \cdot p_{\mathrm{in}} N_{\mathrm{w5m}} + 2 \cdot p_{\mathrm{in}} N_{\mathrm{w1h}} + p_{\mathrm{cr}} N_{\mathrm{cr}} \right) $$

其中 $N_{\mathrm{in}}$、$N_{\mathrm{out}}$、$N_{\mathrm{w5m}}$、$N_{\mathrm{w1h}}$、$N_{\mathrm{cr}}$ 依次为输入、输出、5 分钟缓存写入、1 小时缓存写入与缓存读取的 token 数,$p_{\mathrm{in}}$、$p_{\mathrm{out}}$、$p_{\mathrm{cr}}$ 为对应的输入价、输出价与缓存读取价。缓存写入按输入价的 1.25 倍(5 分钟 TTL)或 2 倍(1 小时 TTL)计。订阅套餐不按 token 计费,该数值仅用于横向比较;价格表需在价格变动时手动更新。

5.4 扫描开销

日志每 30 s 增量扫描一次;700 MB 日志的首次全量扫描约需 2 s。统计范围仅限本机的 Claude Code,claude.ai 网页端对话与其他设备的用量不在其中。

5.5 热力图

热力图每日一格,以周一为每周首日,度量为 tokens 或消息数。色阶共 5 级:无使用记录的日期为最浅一级,其余 4 级的分界取活跃日的 25 %、50 % 与 75 % 分位数。每日汇总保存于 history.json,Claude Code 清理旧会话日志后,已记录的历史仍保留。

6 订阅额度的读取

额度百分比由服务端计算,本机日志不含该信息。组件因此采用与 claude.ai 用量页相同的数据,读取流程如下:

  1. 登录窗口为内嵌的 WebKit 视图,登录态保存于组件自身的 WebKit 数据存储;
  2. 组件至多每分钟在该存储中加载一次 /api/organizations/<组织>/usage。响应中的 limits 列表含 session(5 小时)、weekly_all 与 weekly_scoped(按模型)三类窗口,均含百分比与重置时间;旧字段 five_hour、seven_day 作为后备;
  3. 解析结果缓存于 quota.json,重启后立即显示。

该接口并非公开 API。接口变更或登录失效时,组件回退为按本地日志估算的 5 小时窗口,并显示原因,不显示虚构的百分比。

6.1 登录窗口中的通行密钥问题

本地构建的应用不具备浏览器类应用的通行密钥(passkey)授权。登录页面检测到 WebAuthn 可用时会优先提供通行密钥,随后流程停滞。组件在登录窗口中于文档加载前注入脚本,处理方式如下:

对象 处理
window.PublicKeyCredential 置为 undefined
navigator.credentials.get / create 替换为返回 NotSupportedError 的函数
注入范围 全部框架(forMainFrameOnly: false)

屏蔽后,Google 与 claude.ai 改用密码、设备确认或邮箱验证码。Google 与 Apple 登录在弹出窗口中进行,登录窗口已启用脚本打开窗口的能力。邮件中的登录链接会在默认浏览器中打开,登录态不会进入组件,应使用验证码。

6.2 凭据与网络范围

  • 组件不读取、复制或传输密码、Cookie 与令牌,仅读取用量接口的响应;
  • 唯一的网络目标为 claude.ai;
  • 右键菜单的「清除登录状态」删除 WebKit 数据、已保存的组织标识与 quota.json。

由于接口未公开,其使用应事先核对 Anthropic 的服务条款。

6.3 存储的文件

路径 内容
~/Library/Application Support/ClaudeUsageWidget/history.json 每日汇总(tokens、消息数、费用)
~/Library/Application Support/ClaudeUsageWidget/quota.json 最近一次额度读数
~/Library/WebKit/local.claude-usage-widget/ claude.ai 登录态的 WebKit 数据

7 系统小组件几何的复现

系统小组件是 WidgetKit 扩展,须以开发者证书签名,构建它需要完整 Xcode。本项目不使用 WidgetKit,组件因此是独立的无边框面板,不出现在系统小组件库中;其几何参数取自 macOS 26 上系统小组件的实测值,测量通过窗口列表完成。

项目 实测值
小组件窗口 180 × 180、360 × 180、360 × 360 pt
卡片内缩 窗口内四周各 8 pt
卡片尺寸 164 × 164、344 × 164、344 × 344 pt
圆角 27 pt(对系统卡片的圆弧拟合,轮廓缩进差不超过 3 px)
与屏幕边缘、菜单栏的距离 16 pt
网格间距 180 pt(一个小组件加四周 16 pt 间隔)

上述卡片边长满足 $180n - 16$($n$ 为占用的网格数):$n = 1, 2$ 时分别为 164 与 344 pt。特大尺寸按同一网格推算,宽度取 $n = 4$,得 704 pt,高度取 $n = 2$,得 344 pt;该尺寸未经实测。

窗口行为如下:

  • 吸附:拖动时向屏幕边距、屏幕中线与 180 pt 网格线吸附,阈值为 14 pt,并始终保持在屏幕内;启动与切换尺寸后同样落到网格上;
  • 层级:面板位于桌面图标之上、普通窗口之下,所有空间可见,最大化窗口会将其遮挡,可启用「窗口置顶」改变该行为;
  • 阴影:不绘制投影,与桌面上的系统小组件一致。

8 安装与使用

8.1 安装

方式一:发布包(推荐)。 在最新发布页下载 ClaudeUsageWidget-<版本>-macos.zip(通用二进制,支持 Apple 芯片与 Intel,需 macOS 14 及以上),解压后将 ClaudeUsageWidget.app 移入 /Applications。应用采用临时签名且未经公证,首次启动会被系统拦截,执行一次下列命令移除隔离标记:

xattr -dr com.apple.quarantine /Applications/ClaudeUsageWidget.app

也可在「系统设置 → 隐私与安全性」中选择「仍要打开」。发布页附有 SHA256SUMS.txt,可校验下载文件。

方式二:源码构建。 仅需 Xcode 命令行工具(xcode-select --install),无需完整 Xcode:

git clone https://github.com/Yu-Xiang-Yang/claude-usage-widget.git
cd claude-usage-widget
./build.sh install          # 构建并安装到 /Applications(无写入权限时安装到 ~/Applications)
open /Applications/ClaudeUsageWidget.app

单独执行 ./build.sh 仅生成 build/ClaudeUsageWidget.app。命令行工具的默认 SDK 版本可能高于已安装的编译器(报错 this SDK is not supported by the compiler),脚本因此在存在 macOS 26 SDK 时优先使用它。

8.2 首次使用

  1. 右键小组件,选择「登录 claude.ai…」,在弹出的窗口中登录;读取到额度后窗口自动关闭。
  2. 可在同一菜单中启用「登录时启动」;移动应用位置后需重新启用。

未登录时,组件显示按本地日志估算的 5 小时窗口与「登录」按钮;热力图与本机统计不依赖登录。额度需要 Claude Pro 或 Max 订阅及 claude.ai 登录;本机统计与热力图需要 Claude Code。

8.3 命令行模式

参数 作用
--dump 以 JSON 输出聚合结果
--snapshot out.png [--size …] [--lang zh|en] [--appearance light|dark] [--demo] 渲染指定尺寸的界面图像;--demo 使用合成数据,本文全部截图由此生成
--parse-usage 从标准输入解析额度响应,用于核对解析结果
--show-login 启动时打开登录窗口
--login-item on|off|status 注册、移除或查询登录项
--probe-webauthn 展示屏蔽 WebAuthn 的效果
CLAUDE_USAGE_WIDGET_DIR=/path 改用其他数据目录

9 构建、验证与发布

项目暂无测试套件,验证依赖命令行模式:

变更类型 验证方式
布局与文字 以 --snapshot --demo 渲染全部尺寸与两种语言,比对图像,文字不得被截断
额度接口解析 --parse-usage 输入响应样例,查看解析器提取的字段
日志聚合 --dump 的结果与独立计算比对

持续集成包含两个 GitHub Actions 工作流,均运行于 macos-26 镜像(Liquid Glass 材质需要 macOS 26 SDK):

工作流 触发 步骤
build.yml 推送至 main、拉取请求 执行 ./build.sh;codesign --verify;以样例 JSON 调用 --parse-usage 作冒烟测试
release.yml 推送 v* 标签 以 ARCHS="arm64 x86_64" 构建通用二进制;lipo -info 与 codesign --verify 校验;ditto 打包并生成 SHA256SUMS.txt;gh release create 发布

10 设计取舍

设计 依据
独立面板而非 WidgetKit 扩展 WidgetKit 需完整 Xcode 与开发者证书;代价是不出现在系统小组件库中
复现实测的系统小组件几何 使卡片尺寸、圆角与网格吸附与桌面上的系统小组件一致
额度读取经内嵌 WebKit、由用户自行登录 百分比由服务端计算,本地日志无此信息;组件不接触密码、Cookie 与令牌
额度读取至多每分钟一次,结果缓存 限制请求频率,并使重启后立即有显示
接口失效时回退为本地估算并说明原因 不显示无法核实的百分比
按消息去重、保留输出最大的记录 流式消息被多次记录,不去重时 token 总数约翻倍
每日汇总由组件自行保存 Claude Code 清理旧日志后,热力图的历史不丢失
屏蔽 WebAuthn 本地构建的应用无通行密钥授权,保留该接口会使登录流程停滞
价格表手动维护 订阅不按 token 计费,估算费用仅用于横向比较,未匹配的模型按 claude-opus-5-5 计
应用采用临时签名、未经公证 无需付费的开发者账号;代价是首次启动需移除隔离标记

11 局限与注意事项

  • 本机统计仅覆盖本机的 Claude Code,不含 claude.ai 网页端对话与其他设备的用量;
  • 订阅额度依赖未公开的网页接口与有效的登录态,接口可能变更或失效;
  • 特大尺寸由系统网格推算,未经实测;
  • 菜单栏空间不足时(如刘海屏),系统可能隐藏菜单栏图标,全部功能仍可从小组件的右键菜单使用;
  • 价格变动时需手动更新价格表;
  • 小组件不出现在系统小组件库中,最大化窗口会将其遮挡(可启用「窗口置顶」)。

12 声明与项目地址

本项目为独立项目,与 Anthropic 无隶属、认可或赞助关系;“Claude” 为 Anthropic 的商标。项目借助 Claude Code 开发。

GitHub:https://github.com/Yu-Xiang-Yang/claude-usage-widget(MIT 协议,含中英文 README、更新日志与安全策略)。

评论