ccusage を使ってセッション単位での AI 使用料金を調べる

ブログ

ai-cost-ccusage.avif

やりたいこと

Claude Code を日常的に使っていると、「今月結局どのセッションでどれくらいコストがかかっているのか」を把握したくなります。特に複数のプロジェクトやタスクを並行して進めていると、月次の合計金額だけを見ても「どの作業が高くついたのか」がわからず、コストの内訳を振り返って改善につなげることができません。

そこで、ccusage を使ってセッション単位で使用料金を可視化する方法を探ることにしました。

ccusage の標準出力だけでは足りなかった点

ccusage はそのままでも十分便利なツールで、日次・月次・セッション単位の集計を CLI から確認できます。

ccusageで月ごとの使用量を見るコマンド

npx ccusage@latest monthly

ただし今回欲しかったのは、次のような情報を横断的に、かつスクリプトなどで再利用しやすい形で一覧にすることでした。

  • セッションごとの入力/出力/キャッシュ作成/キャッシュ読み込みトークン数
  • セッションごとの合計コスト
  • セッションの開始時刻・終了時刻(日本時間で)
  • そのセッションに Claude Code 側で付けたカスタムタイトル

特に最後の「カスタムタイトル」は ccusage の JSON 出力には含まれておらず、Claude Code が ~/.claude/projects 配下に保存している セッションログ (.jsonl) の中の custom-title イベントからしか取得できません。つまり ccusage の出力とローカルのセッションログを突き合わせる処理が別途必要でした。

シェルスクリプトで作成

試行錯誤の結果、以下のシェル関数に落ち着きました。.zshrc や .bashrc に登録しておき、ccu と打つだけでセッション単位のコスト一覧がタイトル付きで表示されます。

ccu() {
  bunx ccusage claude session --json |
    jq -r '
      .sessions |
      sort_by(.lastActivity) |
      (
        ["Session", "Name", "Models", "Input", "Output", "Cache Create", "Cache Read", "Total", "Cost", "Start", "End"]
        | @tsv
      ),
      (.[] | [
        .sessionId,
        .sessionId,
        (.modelsUsed | join(", ")),
        .inputTokens,
        .outputTokens,
        .cacheCreationTokens,
        .cacheReadTokens,
        .totalTokens,
        (.totalCost * 100 | round / 100 | "$" + tostring),
        (.firstActivity
          | sub("\\.[0-9]+Z$"; "")
          | strptime("%Y-%m-%dT%H:%M:%S")
          | mktime
          | . + 32400
          | strftime("%Y-%m-%d %H:%M:%S")),
        (.lastActivity
          | sub("\\.[0-9]+Z$"; "")
          | strptime("%Y-%m-%dT%H:%M:%S")
          | mktime
          | . + 32400
          | strftime("%Y-%m-%d %H:%M:%S"))
      ] | @tsv)
    ' |
    while IFS=$'\t' read -r session name models input output cache_create cache_read total cost start end; do
      if [ "$session" = "Session" ]; then
        printf '%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n' \
          "$session" "$name" "$models" "$input" "$output" "$cache_create" "$cache_read" "$total" "$cost" "$start" "$end"
        continue
      fi

      title=$(find ~/.claude/projects \
        -name "$session.jsonl" \
        -type f \
        -print -quit |
        xargs -r jq -r '
          select(.type == "custom-title") |
          .customTitle
        ' 2>/dev/null |
        head -1)

      [ -z "$title" ] && title="-"

      printf '%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n' \
        "$session" "$title" "$models" "$input" "$output" \
        "$cache_create" "$cache_read" "$total" "$cost" "$start" "$end"
    done |
    column -t -s $'\t'
}

これで、ccu と打つだけで各セッションのコストと内容をひと目で振り返れるようになりました。

ccuコマンドの実行結果

このような結果が表示されます

ccusage-result.avif
一覧へ戻る