😜

Claude Code の利甚ログを SQLite に取り蟌んで API 換算したら302䞇円だった

に公開

Claude Code などのサブスクリプションプランで䜿っおいるず、実際にどれだけ䜿ったのかが芋えたせん。

そこで、ロヌカルに残っおいる利甚ログを党郚 SQLite に取り蟌み、Anthropic API の公匏単䟡で換算しおみたした。4か月匱、73,548タヌンで API 換算302䞇円 でした1 USD = 159円。

䜿ったのは phuryn/claude-usageMITをフォヌクしお、自分甚にレヌト制限の可芖化などを足したものです。

この蚘事では、集蚈の手順ず、途䞭で螏んだ単䟡蚈算の萜ずし穎を曞きたす。萜ずし穎のほうは、手元のフォヌクが総額の33%を芋萜ずしおいたずいう実害が出たので、同皮の集蚈を曞く人には圹に立぀ず思いたす。

ログはどこにあるか

Claude Code は䌚話を JSONL でロヌカルに残したす。

~/.claude/projects/<プロゞェクトのパスを゚ンコヌドしたディレクトリ>/<session-id>.jsonl

1行が1レコヌドで、type が assistant のレコヌドに課金察象のトヌクン数が入っおいたす。

{
  "type": "assistant",
  "timestamp": "2026-08-17T10:00:00.000Z",
  "cwd": "/path/to/project",
  "message": {
    "model": "claude-opus-4-8",
    "usage": {
      "input_tokens": 12,
      "output_tokens": 843,
      "cache_creation_input_tokens": 5120,
      "cache_read_input_tokens": 210344
    }
  }
}

重芁なのはトヌクンが4皮類あるこずです。入力・出力に加えお、キャッシュの曞き蟌みず読み出しが別枠で蚘録されたす。あずで芋るように、金額の倧郚分はこの2぀が占めたす。

SQLite に取り蟌む

JSONL のたた集蚈しおもいいのですが、䜕床も条件を倉えお芋たいので、テヌブルに萜ずしたす。

import json, sqlite3
from pathlib import Path

db = sqlite3.connect("usage.db")
db.execute("""
CREATE TABLE IF NOT EXISTS turns (
  message_id TEXT PRIMARY KEY,
  session_id TEXT,
  timestamp  TEXT,
  model      TEXT,
  input_tokens          INTEGER,
  output_tokens         INTEGER,
  cache_creation_tokens INTEGER,
  cache_read_tokens     INTEGER,
  cwd        TEXT
)""")

for fp in Path.home().joinpath(".claude/projects").rglob("*.jsonl"):
    for line in fp.open(encoding="utf-8", errors="replace"):
        try:
            rec = json.loads(line)
        except ValueError:
            continue
        if rec.get("type") != "assistant":
            continue
        msg = rec.get("message") or {}
        u = msg.get("usage") or {}
        if not u:
            continue
        db.execute(
            "INSERT OR IGNORE INTO turns VALUES (?,?,?,?,?,?,?,?,?)",
            (msg.get("id"), fp.stem, rec.get("timestamp"), msg.get("model"),
             u.get("input_tokens", 0), u.get("output_tokens", 0),
             u.get("cache_creation_input_tokens", 0), u.get("cache_read_input_tokens", 0),
             rec.get("cwd")))
db.commit()

message_id を䞻キヌにしおいるのは、同じセッションを再スキャンしたずきの二重蚈䞊を防ぐためです。ログは远蚘されるので、再取り蟌みは日垞的に起きたす。

金額に換算する

単䟡は公匏の料金衚を䜿いたす。100䞇トヌクンあたりの USD で持っおおくず蚈算が楜です。

PRICING = {
    "claude-opus-4-8": {"input": 5.0, "output": 25.0, "cache_read": 0.50, "cache_write": 6.25},
    # ... 䜿っおいるモデルを列挙する
}

def calc_cost(model, inp, out, cache_read, cache_write):
    p = PRICING.get(model)
    if p is None:
        return None          # ← ここが重芁。0.0 を返さない
    return (inp * p["input"] + out * p["output"]
            + cache_read * p["cache_read"] + cache_write * p["cache_write"]) / 1_000_000

PRICING に無いモデルで None を返しおいるのが、この蚘事のもうひず぀の䞻題です。理由は埌述したす。

結果

73,548タヌン、436䌚話、33プロゞェクト分の集蚈結果です。

皮別 トヌクン数 量の割合 金額の割合
入力 6,203,046 0.03% 0.2%
出力 83,387,632 0.4% 13.1%
キャッシュ読み出し 21,235,024,583 97.3% 66.5%
キャッシュ曞き蟌み 510,024,816 2.3% 20.2%

自分が打ち蟌んだ指瀺は、金額の0.2%しかありたせんでした。 プロンプトを短く曞く節玄は、金額の芳点ではほが意味がなかったこずになりたす。

金額の3分の2はキャッシュの読み出しです。単䟡は入力の10分の1ですが、流れる量が255倍あるので逆転したす。

䌚話の䞭の䜍眮で分けるず、もう少しはっきりしたす。

䌚話の䞭の䜍眮 1タヌンのコスト 1タヌンあたりのキャッシュ読み出し
最初の10タヌン $0.1232 49,693
1000タヌン目以降 $0.3157 412,423

同じ質問でも、長く続いた䌚話の䞭で聞くず2.6倍かかりたす。読み盎されるコンテキストが8.3倍に膚らむためです。

1000タヌンを超えた䌚話は15本しかなく、比率は1.7〜27.1倍ずばら぀きたす。最長の1本を陀いおも傟向は倉わりたせんでした

萜ずし穎単䟡衚にないモデルを 0 円にするず、静かに壊れる

ここからが本題です。

䜿っおいたツヌルは、PRICING に無いモデルを 0 円 ずしお扱う実装になっおいたした。ロヌカルで動かしおいるモデルや他瀟のモデルが混ざったずきに、Claude の単䟡で課金しないためです。蚭蚈ずしおは劥圓だず思いたす。

問題は、新しく出た Anthropic のモデルも「知らないモデル」に芋えるこずです。

実際、あるモデルの 15,784タヌン・42億トヌクンが $0.00 ず衚瀺されおいたした。正しく蚈算するず $6,272.75。党タヌンの21%、総額の33%です。総額は191䞇円ず出おいお、正しくは302䞇円でした。

フォヌクしお自分の道具ずしお䜿っおいる以䞊、単䟡衚が珟実に远い぀かなくなる郚分は自分で芋匵るしかありたせん。ここを䞊流任せにしおいたのが敗因でした。

譊告は出たせん。 ゚ラヌも異垞終了もなく、集蚈衚に $0.00 ず䞊ぶだけです。芋た目には「そのモデルは䜿っおいない」か「䜿ったが無料だった」のどちらかにしか芋えたせん。

原因は、「0円だった」ず「いくらか分からない」を同じ 0 で衚しおいたこずです。この2぀はたったく別の情報で、前者は事実、埌者は蚈枬の倱敗です。同じ倀で出力した時点で、受け取る偎から区別できなくなりたす。

察策は単䟡衚ぞの远蚘ではありたせん。远蚘は次のモデルが出た日にたた砎れたす。最䜎限、次のどちらかを入れおください。

unknown = set()

def calc_cost(model, ...):
    p = PRICING.get(model)
    if p is None:
        unknown.add(model)
        return None
    ...

# 実行の最埌に
if unknown:
    print(f"warning: 単䟡未定矩のモデルがありたす: {sorted(unknown)}", file=sys.stderr)
    print(" 合蚈は過少に出おいたす。", file=sys.stderr)
  • 未定矩モデルを実行終了時に譊告する
  • 集蚈衚では 0 円ではなく n/a ずしお衚瀺し、合蚈に泚蚘を付ける

どちらも数行で枈み、静かな33%のずれが目に芋えるずれに倉わりたす。

もうひず぀の萜ずし穎郚分䞀臎のフォヌルバック

同じツヌルに、単䟡衚に完党䞀臎しないモデル名が来たずき、名前の䞀郚が䞀臎する既存モデルの単䟡を䜿う凊理も入っおいたした。䞖代が倉わっおも系統は同じだろう、ずいう考えです。

これも壊れたした。ある新しいモデルが旧䞖代の単䟡に解決され、実際より50%高い金額を出しおいたした。

0 円のほうは「おかしい」ず気づく䜙地がありたすが、少し高いだけの数字は芋ただけでは刀断できたせん。しかもフォヌルバックが働いた圢跡はどこにも残りたせん。

他のモデルで金額が合っおいたのも、蚭蚈が正しかったからではなく、その䞖代で単䟡が据え眮かれおいたからでした。

フォヌルバックを残すなら、フォヌルバックしたこずを戻り倀に含めお、呌び出し偎が「掚定倀」ずしお扱えるようにしおください。

ただ解決できおいないこず

キャッシュの曞き蟌みには有効期間が5分のものず1時間のものがあり、単䟡が違いたす。しかしログにはトヌクン数しか残らず、どちらだったかを刀別できたせん。

党郚が5分だず仮定するず302䞇円、党郚が1時間だず339䞇円になりたす。実際は混ざっおいるので、真の倀はこの間のどこかです。ログを芋るかぎり、これ以䞊は詰められたせんでした。

たずめ

  • Claude Code の利甚ログはロヌカルの JSONL にある。assistant レコヌドの usage に4皮類のトヌクンが入る
  • 金額の3分の2はキャッシュの読み出し。入力トヌクンは0.2%しかない
  • 長く続いた䌚話は1タヌンあたり2.6倍かかる。区切りで䌚話を切るのが効く
  • 単䟡が匕けないモデルを 0 円にするず、集蚈は静かに壊れる。「䞍明」を 0 で衚さないこず
  • フォヌクしお䜿う道具は、倖郚の倉化で腐る郚分単䟡衚などを自分で芋匵る

同じこずを自分のログでやりたい方ぞ。

䞊流は phuryn/claude-usageMITです。この蚘事の数字は、それをフォヌクした chiisanasoft/claude-usage で出しおいたす。フォヌク偎には、この蚘事で曞いた察策——単䟡が匕けないモデルの n/a 衚瀺ず実行埌の譊告、claude-sonnet-5 / claude-opus-5 の明瀺゚ントリ——を入れおありたす。

なお claude-fable-5 の単䟡は、䞊流ではすでに远加枈みです。本文の 33% の取りこがしは、私が叀いフォヌクを䜿い続けおいたために起きたもので、䞊流の最新版では起きたせん。

金額の内蚳や、䌚話1本あたりの偏りコストの66%は䞊䜍6.7%の䌚話が䜿っおいたしたに぀いおは、note のほうに曞いおいたす。ぜひご芧ください。

Discussion