iT邦幫忙

2026 iThome 鐵人賽

DAY 13
0
Vibe Coding

一個 Vibe Coding 專案從原型到有人在用系列 第 13 篇

測試全綠的算錢程式,一對帳少算四成多

  • 分享至 

  • xImage
  •  

8 月 27 日晚上,usage(我做的小工具)的檢查指令 --doctor 印出這一行:

claude cost: official $2.49, usage $1.37, difference 44.7%

同一段 Claude Code 對話,usage 算出來花了 1.37 美元,標著 official 的那個數字是 2.49 美元,差了四成多(44.7% 是拿沒四捨五入的原始數字算的)。

算錢的那段程式,測試是全綠的。

你叫 AI 寫過算錢、算數量、算時間的程式嗎?測試全過的時候,你怎麼知道算出來的數字是對的?

標著 official 的 2.49,是誰算的

usage 是我做的開源小工具,顯示 Claude Code、Codex 等 AI 工具的用量。其中一項是:這段對話大概花了多少錢。

usage 的算法是讀 Claude Code 留在電腦上的對話紀錄,每一輪用了多少 token(AI 計算文字量的單位)都寫在裡面,再乘上 usage 自己內建的價目表單價,加起來。

Claude Code 自己也會估一個數字。它會把一些資料交給狀態列(終端機底下那一行資訊)顯示,其中一個欄位是 cost.total_cost_usd,官方文件的說明是:Claude Code 在你電腦上照牌價估的這段對話費用,可能跟實際帳單不同。

所以 2.49 不是帳單,也是估的。可是它跟 usage 的 1.37 是兩套程式各自算出來的。兩個獨立算出來的數字差了四成,至少有一邊錯了。

8 月 23 日,commit 替差距寫了一個原因

這個比對是 8 月 23 日加的。usage 有一個 --doctor 指令,會把幾項設定檢查一遍,印成一張清單。那天加了一項:拿 usage 自己算的費用,跟 Claude Code 估的費用比,差超過兩成、又超過 1 美元,就警告。

當晚交代這件事的工作單(交給 AI 的任務說明),寫得很清楚:

也就是說:差距的根因尚未查明,不是「模型查無」造成的。
只做檢查與呈現,不要修價格、不要改 calculate_cost()、不要猜係數去湊官方數字。

「模型查無」是指價目表裡查不到這個模型。calculate_cost() 就是 usage 算錢的那段程式。這張工作單要的是讓差距被看見,不是讓它消失。

同一晚,Claude Code 把這次改動存進版本紀錄,commit 訊息(每次存檔附的說明)也是它寫的。那天測的是另一段對話,不是開頭那段。訊息裡寫了測到的差距,也寫了原因:

本機實測差 46.4%,根因是價格表的 claude-opus-5 單價只有實際的一半。

隔天發的新版,更新說明也照這句寫給使用者看。

可是那時 usage 價目表上的 claude-opus-5,是每百萬 token 輸入 5 美元、輸出 25 美元,跟 Anthropic 官方價格頁的標準價一樣。價格表沒有標成一半。

同一晚,工作單說根因還沒查明,commit 訊息卻寫了一個根因。差距被看見了,原因寫錯了。

8 月 27 日,少算的 1.12 美元在哪

8 月 27 日,開頭那一行出現了。這次工作單派給 Codex 去查,規定只准讀、不准改。查出來,1.37 跟 2.49 之間差的 1.12 美元,拆成兩塊:

約 0.40 美元:1 小時快取的寫入費算錯
0.72 美元:advisor 那一輪完全沒算

https://ithelp.ithome.com.tw/upload/images/20260927/20183178EPBTUuIciD.png

第一塊,快取。 Claude Code 會把前面講過的內容先存在 Anthropic 那邊,下一輪就不用全價重送,這叫快取。存進去要付一筆寫入費:存 5 分鐘的,是輸入單價的 1.25 倍;存 1 小時的,是 2 倍。對話紀錄裡,快取寫入分開記了存 5 分鐘和存 1 小時的 token 數。

這段對話用的 claude-opus-5,輸入每百萬 token 5 美元,所以存 1 小時的寫入費是每百萬 10 美元,存 5 分鐘的是 6.25 美元。這段對話幾乎都是存 1 小時,到那時為止寫入了十萬多 token;usage 一律照 5 分鐘的價錢算,每百萬 token 少算 3.75 美元,加起來約 0.4 美元。

第二塊,advisor。 Claude Code 做事做到一半,可以另外找一個模型把整段對話讀一遍、給建議,這個功能叫 advisor。那一輪的 token,記在對話紀錄的另一個位置。

我把那段對話的原始紀錄翻出來,找到 advisor 出現的那一筆。只留幾個欄位,長這樣:

"input_tokens": 4,
"output_tokens": 625,
"iterations": [
  { "type": "message",         "input_tokens": 2,      "output_tokens": 157 },
  { "type": "advisor_message", "input_tokens": 104982, "output_tokens": 7883 },
  { "type": "message",         "input_tokens": 2,      "output_tokens": 468 }
]

外面那兩行是這一筆的總數,iterations 裡面是分成三輪的明細。

對一下:外面的 4,是 2 加 2;外面的 625,是 157 加 468。總數只加了兩個 message,中間那個 advisor_message 的十萬多 token,不在總數裡。

https://ithelp.ithome.com.tw/upload/images/20260927/20183178i6nJiLFkX8.png

advisor 的官方說明也是這樣寫的:外層的用量只算主要那個模型,advisor 的 token 不併進去,因為它照 advisor 模型的單價另外算。usage 只讀外層的總數,這十萬多 token 就從來沒算過。

紀錄裡這一輪的模型寫的是 claude-opus-5,照它的單價算一次:輸入 104982 個 token,每百萬 5 美元;輸出 7883 個,每百萬 25 美元;加起來是 0.72 美元。

修之前,測試是綠的

修之前那一版推上 GitHub,CI(每次推上去就自動跑的一輪檢查)是綠的。

我去翻修之前的測試資料。分輪明細的欄位 iterations、1 小時快取的欄位 ephemeral_1h,連 advisor 這個字,在整個測試資料夾裡一次都沒出現。

測試裡餵的對話紀錄,只有外層的總數,快取也沒分 5 分鐘和 1 小時。程式照這樣算,測試照這樣對,當然全綠。真正的對話紀錄裡多了兩樣東西,程式不知道,測試也不知道。

這種錯,照同一份理解多寫幾個測試,也抓不到。測試拿程式去對自己的預期,預期本身漏了,兩邊就一起漏。

抓到這兩處漏算的,是 Claude Code 估的那個 2.49:一個不是這段程式算出來的數字。

修完之後,測試資料補上了那兩種欄位

修正的 commit 做了兩件事:1 小時快取照 2 倍算,advisor 那一輪另外記成一筆、照它自己的單價算。測試資料也補上了這兩種欄位。

這次推上去,CI 一樣是綠的。差別是這一次,綠燈旁邊還有一個能拿來對的數字。

找一個不是這段程式算的數字

回頭看,這件事能被抓到,靠的不是測試,是 --doctor 那一行:一個數字是 usage 自己算的,另一個是 Claude Code 算的。兩套程式、兩份理解,同時漏掉同一個欄位的機會小得多。

所以驗收算數字的程式,工作單裡要多一條:找一個不是這段程式算出來的數字,拿來對。可以是官方後台的數字、另一個工具的數字,也可以是你拿一筆真實資料手算的結果。

8 月 23 日那次也提醒一件事:兩個數字對不上時,AI 寫出來的原因也要查。那次的原因寫得很具體,有模型名稱、有「一半」,讀起來很像查過。可是對一下價格表,就知道不是。

翻出你的 AI 算過的一個數字

現在就可以做一件事:找一個你叫 AI 寫的程式算出來的數字,錢、數量、時間都可以。

然後找一個不是它算的來源:官方後台、別的工具,或挑一筆資料自己用計算機按一次。

兩個數字對上了,至少那一筆是對的。對不上,先別急著接受 AI 給的原因,拿原因去對一次資料。

今天可以帶走的

工作單裡有一格「做完怎麼算對」,Day 4、Day 8 到 Day 12 各在這格加了幾行。今天再加一行:

做完怎麼算對:
- (Day 4、Day 8 到 Day 12 加的幾行)
- 算數字的功能:拿一筆真實資料,跟一個不是這段程式算的數字對(官方數字、別的工具、手算),回報兩邊的值和差距;差距的原因要附證據,不准只寫推測

今天的數字,是拿程式去對程式外面的數字。明天看另一種:程式自己說成功了。8 月 28 日修掉的一個問題,usage setup 印出「✓ Codex status_line 已配置」,Codex 的設定檔卻一個字都沒變。

參考資料

  • usage 專案:https://github.com/aqua5230/usage
  • 8 月 23 日加上成本對帳的改動:https://github.com/aqua5230/usage/commit/15df18f
  • 8 月 27 日修正成本計算的改動:https://github.com/aqua5230/usage/commit/ba66338cb2a4f7556682f7f7abb7da3e4b4f3270
  • Claude Code 狀態列的 cost.total_cost_usd 欄位說明:https://docs.claude.com/en/docs/claude-code/statusline
  • Anthropic 價格頁(Claude Opus 5 單價、快取寫入 1.25 倍與 2 倍):https://docs.claude.com/en/docs/about-claude/pricing
  • advisor 的用量與計費說明:https://docs.claude.com/en/docs/agents-and-tools/tool-use/advisor-tool

上一篇
AI 回報 99 個測試通過,工作單要的是 1468 個
下一篇
安裝指令印了 ✓,設定檔一個字都沒變
系列文
一個 Vibe Coding 專案從原型到有人在用 共 17 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言