Bài 2/12 trong chuỗi Kinh tế Vibe Coding
Tôi từng nghĩ cộng token trong file nhật ký đơn giản là cộng dồn từng dòng lại — dòng nào cũng cộng cột usage, tưởng vậy là đủ kỹ. Con số ra được là 1,67 tỷ token, và tôi suýt đăng thẳng nó vào bài này. Chỉ đến khi dựng lại phép khử trùng lặp theo requestId, con số thật mới lộ ra: 946.786.932 token — thấp hơn gần một nửa.

Lý do rất đời thường: một lượt gọi API được nhật ký ghi thành nhiều dòng assistant — một dòng cho khối suy nghĩ, rồi mỗi công cụ được gọi lại thêm một dòng riêng — và tất cả các dòng đó chia sẻ chung đúng một khối usage. Cộng theo dòng nghĩa là cộng một hoá đơn nhiều lần. Trên một phiên mẫu, 65 lượt gọi thật sinh ra 118 dòng; 43 trong số đó có nhiều hơn một dòng, và cả 43 đều lặp y nguyên khối usage. Bằng chứng rõ nhất là lượt gọi req_011CeaWxtiSehQsDGwGLJGkA: nó xuất hiện ba lần trong nhật ký, cả ba dòng đều ghi cache_creation_input_tokens: 89.786 — con số y hệt nhau, không phải ba lượt nạp cache riêng biệt.
Bài trong chuỗi này từng trích một bộ số đo sai phạm vi vì đúng lỗi đó — 27 phiên, gộp nhiều dự án, đã cũ. Số đúng và cách tính lại nằm ở bài đừng để agent đọc cả repo; bài đó tôi không nhắc lại số ở đây, vì phạm vi đo của nó hẹp hơn phạm vi của bảng dưới.
Vì sao bài này tồn tại
Chuỗi mười hai bài của Kinh tế Vibe Coding đã từng để mỗi bài tự mang một bộ số riêng. Cách đó có một lỗ hổng: số ở bài này không tự cập nhật khi công cụ đo được vá lỗi, nên hai bài đứng cạnh nhau có thể đọc như đang mâu thuẫn dù cả hai đều từng đúng tại thời điểm viết.
Từ bài này trở đi, đây là nơi DUY NHẤT giữ bảng số gốc của chuỗi. Bài khác cần trích số thì trỏ ilink về đây, không tự mang thêm một bản sao. Nguồn của mọi bảng dưới là SO_LIEU_CHUAN.md trong repo — số giữ nguyên như file đó ghi, không làm tròn lại, không tự tính thêm. Chỉ có đúng một phép tính tôi cộng vào: file gốc ghi tiền bằng đô la Mỹ, còn bài này quy hết sang đồng theo một tỉ giá cố định 26.200 đ một đô, để con số đọc lên là con số người Việt hình dung được ngay.
Cửa sổ dữ liệu, và phần không đo được
Bảng dưới đây đo trên đúng một repo, my-website, không gộp dự án khác:
| Công cụ | Cửa sổ dữ liệu | Phiên | Lượt gọi | Token | Độ tin cậy |
|---|---|---|---|---|---|
| Claude Code | 14/07–02/09/2026 | 62 | 4.794 | 946.786.932 | Đo được |
| Codex | 10/07–30/08/2026 | 29 | 3.188 | 437.691.606 | Đo được |
| Antigravity (Gemini) | 19/08–01/09/2026 | 54 | ~5.874 | 806.459.082 – 1.152.255.588 | Ước tính |
| Tổng đo được | 91 | 7.982 | 1.384.478.538 | ||
| Tổng gồm ước tính | ~145 | ~13.856 | ~2.363.674.338 |
Đơn vị: triệu token. Thanh của Antigravity vẽ ở cận dưới khoảng ước tính, con số bên phải là cả khoảng.
Repo này mở ngày 21/04/2026, 392 lượt commit, nhưng không công cụ nào giữ đủ nhật ký từ ngày đó. Claude Code có cơ chế dọn dẹp mặc định xoá transcript sau 30 ngày, nên phần dữ liệu đầy đủ chỉ còn lại từ khoảng 03/08/2026 — bốn tháng đầu gần như mất trắng, chỉ còn sót lại vài phiên dài từng được mở lại trong tháng 08. Codex và Antigravity không tự xoá nhật ký, nhưng phiên đầu tiên của mỗi công cụ chạm vào repo này muộn hơn: Codex từ 10/07, Antigravity từ 19/08 — ngày cài đặt công cụ.
| Công cụ | Đầy đủ từ | Nguyên nhân thiếu |
|---|---|---|
| Claude Code | ~03/08/2026 | Cơ chế dọn dẹp mặc định 30 ngày xoá transcript |
| Codex | 12/05/2026 | Không xoá nhật ký; phiên đầu chạm my-website là 10/07 |
| Antigravity | 14/08/2026 | Ngày cài đặt; quỹ đạo my-website đầu tiên là 19/08 |
Ước lượng thận trọng cho phần Claude Code đã mất (21/04–02/08, 230 lượt commit), lấy mức tiêu thụ token trung bình mỗi commit đo được ở cửa sổ đầy đủ làm chuẩn: nếu cường độ làm việc bằng một nửa tháng 08 thì khoảng 627 triệu token đã trôi mất không đo lại được; nếu giữ nguyên cường độ thì khoảng 1,253 tỷ. Cộng phần đo được và phần ước tính, toàn vòng đời repo rơi vào khoảng 3,0–3,6 tỷ token — gần một phần ba con số đó là suy đoán, không phải số đo.
Bên trong hoá đơn Claude Code
Đây là bảng quan trọng nhất của cả chuỗi, vì phần lớn kết luận về chi phí trong các bài khác đều bắt nguồn từ đây:
| Loại token | Số lượng | % token | Đơn giá so với input | % chi phí |
|---|---|---|---|---|
| Cache read | 923.581.495 | 97,55% | 0,1x | 61,2% |
| Cache write | 18.101.197 | 1,91% | 2,0x | 23,8% |
| Output | 4.374.498 | 0,46% | 5,0x | 14,5% |
| Input tươi | 729.742 | 0,08% | 1,0x | 0,5% |
| Tổng | 946.786.932 | 100% | — | 100% |
Đọc bảng này là đọc ba con số lệch pha nhau theo đúng kiểu đáng chú ý nhất: cache read chiếm 97,55% khối lượng token nhưng chỉ 61,2% hoá đơn, vì giá của nó chỉ bằng một phần mười giá input. Ngược lại cache write chỉ chiếm 1,91% khối lượng nhưng ăn tới 23,8% hoá đơn, đứng ngay sau cache read và trước cả output — lý do là 100% lượt ghi cache trên repo này rơi vào bậc giá TTL một giờ (gấp đôi giá input), không có lượt nào rơi vào bậc rẻ hơn của TTL năm phút. Tỉ lệ token phía input trên output là 215,4 : 1, trung bình mỗi lượt gọi mang theo 197.494 token, và trong phần output có 941.297 token thuộc khối suy nghĩ (thinking) — khoảng 22% output, tính tiền như output thường.
Chia theo mô hình đã dùng:
| Mô hình | Lượt gọi | Token | Chi phí niêm yết (đồng) |
|---|---|---|---|
| claude-opus-5 | 4.592 | 911.799.495 | 18.868.716 |
| claude-opus-4-8 | 141 | 26.602.856 | 651.070 |
| claude-fable-5 | 25 | 3.356.070 | 193.880 |
| claude-sonnet-5 | 36 | 5.028.511 | 74.146 |
| Tổng | 4.794 | 946.786.932 | 19.787.812 |
Đơn giá thực tế sau khi pha trộn cả bốn mô hình và cả cache: khoảng 20.908 đ mỗi triệu token. Nếu tắt cache hoàn toàn, cùng khối lượng công việc đó tốn 126.310.200 đ — nghĩa là cache đang cắt 84,3% hoá đơn. Trên cửa sổ dữ liệu đầy đủ (03/08–02/09, 162 lượt commit), chi phí Claude Code trung bình mỗi lượt commit là 113.184 đ. Cả ba công cụ trong bài này đều chạy trên gói thuê bao, không phải trả theo API — số tiền ở đây chỉ để so sánh mức tiêu thụ, không phải tiền đã trả thật.
Chi phí niêm yết quy đổi theo tỉ giá cố định 26.200 đ một đô la Mỹ, dùng để so sánh mức tiêu thụ — cả ba công cụ đều chạy trên gói thuê bao, không phải tiền đã trả thật.
Có một quy tắc hành động rút ra thẳng từ hai dòng cache read/cache write ở bảng trên — phần đó tôi để dành cho một bài riêng, vì nó cần không gian để giải thích cho đúng, không nhét gọn trong một bảng được.
Đối chiếu với quy mô cả dự án
Repo my-website không phải toàn bộ khối lượng công việc của từng công cụ — đây là tỉ trọng nó chiếm trong tổng số đo được trên máy:
| Công cụ | Toàn bộ dự án | Riêng my-website | Tỉ trọng |
|---|---|---|---|
| Claude Code — token | 1.730.624.349 | 946.786.932 | 54,7% |
| Codex — token | 2.739.866.428 | 437.691.606 | 16,0% |
| Antigravity — bước mô hình | 9.457 | 5.875 | 62,1% |
Con số "toàn bộ dự án" của Claude Code được khử trùng lặp toàn cục nên thấp hơn tổng cộng dồn từng thư mục dự án lại — hai phép cộng không dùng chung đơn vị đếm nên không so trực tiếp được với nhau.
Một bài khác trong chuỗi đo trên dự án nội bộ aup-sourcing-ai, không phải my-website — bài phối hợp Claude và Gemini ghi rõ phạm vi đó ngay trong bài, số khác nhau vì repo khác nhau, không phải vì mâu thuẫn.
Tự đo cho dự án của bạn
Script sinh lại toàn bộ các bảng trên: npx tsx scripts/analyze-agent-sessions.ts. Nó đọc thư mục ~/.claude/projects/, tự khử trùng lặp theo requestId trước khi cộng — đúng cái bẫy đã mở đầu bài này. Nếu bạn tự viết lại phép đo của riêng mình, nhớ ba việc: khử trùng theo requestId (hoặc uuid nếu bản ghi không có requestId) trước khi cộng bất cứ cột nào, không tin một script tự xưng là "đã đo được" cho tới khi đối chiếu được bằng chứng cụ thể như lượt gọi lặp dòng ở trên, và đừng chờ tới lúc cần số mới nhớ ra transcript đã bị dọn — dọn dẹp mặc định 30 ngày âm thầm ăn mất bốn tháng dữ liệu đầu của chính repo này.
Muốn giữ được số đo cho cả vòng đời một dự án dài hơn 30 ngày, có hai cách: tăng cleanupPeriodDays trong cấu hình trước khi bắt đầu dự án, hoặc định kỳ sao lưu thư mục ~/.claude/projects/ ra chỗ khác. Tôi chỉ biết cách thứ hai sau khi đã mất bốn tháng đầu không lấy lại được.
Điều tôi giữ lại từ lần sửa này
Con số không tự nhiên sai — nó sai vì cách đếm sai, và cách đếm sai lại rất dễ trông như đúng, vì mỗi dòng nhật ký nhìn riêng lẻ đều hợp lệ. Cái duy nhất bắt được lỗi là đối chiếu bằng chứng cụ thể: một requestId lặp lại ba lần với cùng một khối usage, chứ không phải tin vào tổng số đã cộng xong.
Từ giờ mỗi bài trong chuỗi này trích số bằng cách trỏ về bài này, không tự mang một bản sao nữa. Bảng ở đây sẽ còn được cập nhật khi công cụ đo tiến bộ hơn — phần còn lại của chuỗi chỉ cần trỏ đúng chỗ.





