See Dollar · AI Token Speedtest

你要交出去的,只有一张表

一份 See Dollar 报告就是一张表:哪天、哪个工具、哪个模型、几个 token。 这一页先让你看清它长什么样,再给你拿到它的路 —— 以及今天哪条真的走得通。

先看清楚:提交的到底是什么

整份文件由这样的行组成,一天、一个工具、一个模型,一行:

{
  "date": "2026-08-12",
  "tool": "claude-code",
  "model_raw": "claude-opus-5",
  "tokens": { "input": 5100000, "output": 306000, "cache_read": 209100000,
              "cache_creation": 2040000, "reasoning": null },
  "sessions": null,
  "client_cost_usd": null
}

一行真实报告行的样子(数字取自公开测试样本)

每一行里的 client_cost_usd 是 ccusage 自己按公开牌价估的金额(美元);ccusage 给了就是一个数,会跟着交上来 (服务端另按自己的定价快照重算,排名不看它)。除了这些行,整份文件还有:这些行的合计(含金额)、一个 30 天窗口和采集日期、 一个 schema 版本(0.3.0)、检测到的工具列表、采集器与剥洗器的名字和版本、 一个随机的报告编号和生成日期、一个内容指纹。没有了。

不在里面的东西

这不是一句承诺,是结构上放不进去:报告有键名白名单,不在白名单里的键一律拒收; 生成器写出文件之前还要过一遍隐私扫描 —— 任何含 / 或 \ 的字符串、 任何像邮箱或密钥的字符串、任何超过 64 字符的字符串,命中一条就中止,连文件都不会写出来。

榜单只按一个整数排序,而那个整数也是从上面这些行加出来的: rankable_token_volume_v1 = 归一化后的未缓存 input + output + cache_read。 怎么算的 →

三条路,以及今天哪条通

路你要做什么今天能走吗
A · 自己跑一条命令,把输出拖进来 跑一条公开命令,把原始输出拖到首页 —— 剥洗在你自己的浏览器里发生 ✓ 能
B · 交给 Agent 把一段话粘给你的编码 Agent:它跑命令、跑本站的剥洗器、把摘要给你看,被要求等你点头才交 —— 报告里的数字由剥洗器产出,它被要求原样提交 ✓ 能
C · 终端里自己跑剥洗器 从本站下载一个单文件(先核 sha256),node 一条命令产出报告文件,再拖进来或交给 Agent 提交 ✓ 能
D · 装一个 npm 包,一条命令连采带交 —— ✗ 不做
D 那条是决定不做,不是「还没排上」。
剥洗本身不需要分发 —— 它是一个纯函数,同一份代码打包成了两个站点资源:网页里跑的那一份(A), 和一个给终端 / Agent 的单文件(B、C)。两份都随网站一起部署、一起更新;单文件每次用之前重新下载、 按 /llms.txt 核一次 sha256,就永远是当前版本。 所以一个 npm 包能多给的,只是「省掉一次下载」;而它一旦发出去,就多一条跨机器的版本契约: 上游采集器或 schema 一升级,装着旧版本的人交上来的报告会被直接拒收。拿这个换一次下载,不划算。
我们也因此不在这一页给任何一条装包的命令 —— 写一条 npx 开头的 See Dollar 命令在这里, 只会让你在终端里撞一个 404。
真在 CI / 无浏览器环境里要自动提交? C 那个单文件在 CI 里一样能跑;想自己实现也行 —— /llms.txt 里有完整规格(端点、字段、鉴权、 content_sha256 的算法与自检向量、错误码),照着打 API 就行,几十行的事。

A · 最简单的一条:跑一条命令,把输出拖进来

先跑这个。它读的是你本机的用量记录,不提交任何东西。但它不是完全不联网: 第一次运行时 npx 要从 npm 下载 ccusage 这个工具,ccusage 计价时也可能联网取一次价目表 —— 出去的是请求,你的用量数据不会被发出去。剥洗和生成报告在你自己的浏览器(或你自己的终端)里完成,原始输出不上传:

npx ccusage@20.0.19 daily --json --by-agent > usage.json

ccusage 是公开的 npm 包,不是我们的东西。版本钉死在 20.0.19,不要用 @latest —— 上游改字段名会静默污染数据。

在 Windows 上用这一行(PowerShell 或 cmd 里都能直接粘):PowerShell 5.1 的 > 会把文件存成 UTF-16, 网页读不出来;包一层 cmd /c 写出的是原样字节。macOS / Linux 就用上面那一行。

cmd /c "npx ccusage@20.0.19 daily --json --by-agent > usage.json"

然后把跑出来的 usage.json 拖到首页那个投递台(拖到页面任何位置都算)。接下来发生的事:

  1. 剥洗在你的浏览器里进行 —— 原始输出不会发到任何地方。 我们不知道也不想知道它里面有什么。
  2. 页面弹出一屏明文全文:那不是摘要,就是将要 POST 出去的那份 JSON, 可以滚、可以选中、可以复制。
  3. 旁边一排账目告诉你:多少行进了报告、多少行会真的算进排名、 本地估算的排名量是多少、剥洗时丢了多少行。
  4. 你点「就交这一份」,才会发出去。点「取消」就什么都没发生。
两个窗口不是一回事,页面会当场告诉你差多少。
报告窗口 = 你数据里最后 30 个日历日;排名窗口 = 真实今天往前 30 天。 数据要是两周前采的,报告里就有一大半行落在排名窗口之外 —— 那些行照收不误,只是不计入。 复核面板里「行 · 算进排名」那一格如果小于总行数,就是在说这件事;重新跑一遍 ccusage 就全回来了。

B · 交给 Agent

Read https://seedollar.studio/llms.txt and submit my last 30 days of coding-agent token usage to See Dollar.
Every number must come from the tools, never from you:
  1. run: npx ccusage@20.0.19 daily --json --by-agent > usage.json
  2. download seedollar-scrub.mjs from the URL in llms.txt, check its sha256, then run: node seedollar-scrub.mjs usage.json -o seedollar-report.json
  3. show me the summary it prints and the report file, then wait for my OK;
  4. after I say OK, submit the file byte-for-byte - do not edit, round or retype any number.
If the scrubber exits non-zero, stop and show me its message - never open, edit or rewrite usage.json and never write a report yourself.
Never upload or paste usage.json anywhere. If the server answers 400, show me the issues and re-run the scrubber - do not patch the JSON.

粘给 Claude Code / Codex CLI / 任何能读网页又能跑命令的编码 Agent

这段话的核心是一句:每个数字都来自工具,不来自它。它会做这几件事:

  1. 读 /llms.txt —— 那是给机器看的完整规格,端点、字段、鉴权、错误码都在里面
  2. 在你的机器上跑上面那条 ccusage 命令(第一次运行会从 npm 下载这个工具;计价时可能联网取一次价目表)
  3. 从本站下载剥洗器单文件 seedollar-scrub.mjs,先核对 sha256,再在你的机器上跑它 —— 和网页里的剥洗器是同一份代码;它自己不联网,不把原始输出发到任何地方;产出一份 schema 0.3.0 的报告
  4. 把剥洗器打印的摘要和报告文件给你看,等你说 OK。剥洗器要是报错、没写出报告,它被要求停下、把报错原样给你看 —— 不许自己去改 usage.json、不许手写报告
  5. 你点头之后,领一张一次性票据(10 分钟过期、用一次作废),把那个文件原样交上去
  6. 轮询到名次算出来,把结果链接给你

为什么不让它自己写报告? 以前的说明让 Agent 读原始输出、自己拼一份报告。 LLM 抄错一个数、漏一行、顺手四舍五入,服务端都查不出来 —— 它重算的内容指纹也是按改过的数算的,当然对得上。 现在报告由确定性代码产出,Agent 只负责跑命令、给你看、按你的确认原样提交。 这些是三件套对它的要求,我们在技术上强制不了:报告文件在它手里、提交也是它执行,它读得到 usage.json; 所以摘要请自己看一眼,提交后再核一次下面那行指纹。 它挡不住存心改数的人:有人改了文件、再把指纹重算一遍,服务端照样分不出来。 你能自己核对的是:剥洗器摘要里那行 content_sha256,和结果页上印的那一行应该一模一样。

在这台浏览器上测过?让成绩归到同一个身份

Agent 自己领票,每次都会新建一个匿名身份 —— 同一个人就会以好几个身份上榜。 去 /me 点「给我的 Agent 一张提交票」,把它显示的那段话粘给 Agent: 那张票绑定你现在的身份,Agent 用它交上来的成绩归到你名下。票 10 分钟内有效、只能用一次, 读不了你的身份,也不是长期凭证。

已经自己跑过 ccusage 了、只想让它做剥洗和提交,用这段:

I ran: npx ccusage@20.0.19 daily --json --by-agent > usage.json
Read https://seedollar.studio/llms.txt. Download seedollar-scrub.mjs from the URL there, check its sha256, and run: node seedollar-scrub.mjs usage.json -o seedollar-report.json
Show me the summary it prints and the file. Submit the file unchanged only after I say OK - do not write or edit any number yourself.

采集你已经看过了,这段只让它跑剥洗器、给你看、点头后原样提交

它产出的 seedollar-report.json 也可以你自己拖进投递台,不必让它替你交。 三条路写进的是同一份数据,只有来源标签(VIA)不同, 而两行来源标签都不参与排序。

C · 在终端里自己跑剥洗器

不想开浏览器、也不想交给 Agent?同一个剥洗器有一个单文件形态:Node 20 以上就能跑,零依赖、不联网, 读 usage.json、写出 seedollar-report.json、在终端里打一份摘要,自己不提交任何东西。 用之前先核对 sha256 —— 下面这个值和 /llms.txt 里的一样,都是服务端对正在下发的那份文件现算的:

curl -fsSL -o seedollar-scrub.mjs "https://seedollar.studio/assets/seedollar-scrub.mjs?v=dcef6944"
node -e "const h=require('crypto').createHash('sha256').update(require('fs').readFileSync('seedollar-scrub.mjs')).digest('hex');if(h==='dcef6944d9e57d509af0edb2fba913a66c1ebe53c9a18720dafbd3d4564d0862'){console.log('sha256 ok')}else{console.error('sha256 MISMATCH '+h);process.exit(1)}"
node seedollar-scrub.mjs usage.json -o seedollar-report.json

seedollar-scrub 0.3.0 · sha256 dcef6944d9e57d509af0edb2fba913a66c1ebe53c9a18720dafbd3d4564d0862。Windows(cmd / PowerShell)下载那行换成 curl.exe -fsSL -o seedollar-scrub.mjs "https://seedollar.studio/assets/seedollar-scrub.mjs?v=dcef6944" —— PowerShell 5.1 里裸写 curl 是另一个命令,原样跑会失败;报告用 -o 写(PowerShell 5.1 的 > 会把文件存成 UTF-16)。

同一份输入、同一天,写出来的文件和网页复核面板里那屏明文除报告编号外逐字节相同 (report_id 每次随机,不参与内容指纹);两边的 content_sha256 一样。剥洗器报错时整份不写出,终端里会告诉你原因。 拖进首页投递台,或者按 /llms.txt 用一张票交上去。

sha256 防什么、不防什么。
它防的是下载不完整、拿到缓存里的旧版本、拿到别处来的副本。它防不了本站本身被攻破 —— 文件和 hash 来自同一个地方。对那一层,我们能给的只有「可审」:这个文件没有压缩、零依赖、构建时扫描过联网原语, 打开就能从头读到尾。URL 里的 ?v= 只是缓存键,真正把内容钉死的是 sha256。

被拒了怎么办

失败时服务端回的是一个明确的 error,外加一个 issues 数组逐条说哪里不对。 下面这张表里的每一行都是对着真实响应逐个试出来的,不是照源码抄的:

你会看到什么时候怎么修
400 error:"validation"
issues[0] 提到 content_sha256
内容指纹对不上。用了剥洗器还出现,说明文件在它写出之后被改过; 自己实现的,多半是哈希算错了。响应里会同时给出你声明的 hex 和服务端重算的 hex。 用剥洗器的:重跑它,原样交它写出的那个文件,别手改。 自己实现的:回 /llms.txt 把那条自检向量跑通再来。 十有八九是两件事之一:window 的键名忘了从 start/end 改成 from/to,或者把整份报告拿去哈希了 —— 参与哈希的只是一个白名单子集。
注意它不叫 content_sha256_mismatch:那个名字在服务端内部存在,但 HTTP 上到不了你手里。
400 error:"schema" 字段缺了、类型不对,或者违反了跨字段规则 —— 包括窗口必须含首含尾恰好 30 天、 每一行的日期都必须落在窗口内。 用剥洗器的:别手改 JSON —— 重新下载剥洗器(核一次 sha256)再跑一遍;自己实现的:照着 issues 逐条改。
401 error:"unauthorized"
reason 说是哪一种
no_credential 没带 Authorization 头 · already_used 这张票已经成功用过一次 · expired 超过 10 分钟 · not_your_test 票不是你的。 重新 POST /v1/tests 领一张;票是从 /me 领给 Agent 的,就回 /me 再点一次 (别让 Agent 自己领 —— 那会是另一个身份)。票据一次性、10 分钟有效。
429 error:"rate_limited" 无凭据领票超过了每小时 6 次。 等下一个小时。这个限流只短暂看一眼来源 IP,不落任何业务表; 手里已经有凭据的回头客不受它影响。

前两种失败都不消耗票据。 重跑剥洗器(或改好你自己的实现)之后,用同一张票在 10 分钟内重交就行 —— 不用重新领。这一条对 Agent 尤其要紧:重领票要走限流,而从 /me 领的票重领一次就得再麻烦你一次。

窗口外的行不会让提交失败。
排名窗口锚定在真实今天往前 30 天,不是你报告里声明的那个窗口。 落在窗口外的行照收不误,只是不计入那个整数 —— 一份两个月前的报告会拿到 202 和一个 0, 存下了,但不进榜。这不是错误,是「最近 30 天」该有的行为。

还想再往下