← 首页 · 怎么生成报告
一份 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 包,一条命令连采带交 | —— | ✗ 不做 |
content_sha256 的算法与自检向量、错误码),照着打 API 就行,几十行的事。
先跑这个。它读的是你本机的用量记录,不提交任何东西。但它不是完全不联网:
第一次运行时 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 拖到首页那个投递台(拖到页面任何位置都算)。接下来发生的事:
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
这段话的核心是一句:每个数字都来自工具,不来自它。它会做这几件事:
seedollar-scrub.mjs,先核对 sha256,再在你的机器上跑它 ——
和网页里的剥洗器是同一份代码;它自己不联网,不把原始输出发到任何地方;产出一份 schema 0.3.0 的报告usage.json、不许手写报告10 分钟过期、用一次作废),把那个文件原样交上去为什么不让它自己写报告? 以前的说明让 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)不同,
而两行来源标签都不参与排序。
不想开浏览器、也不想交给 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.jsonseedollar-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 用一张票交上去。
?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 领的票重领一次就得再麻烦你一次。
202 和一个 0,
存下了,但不进榜。这不是错误,是「最近 30 天」该有的行为。