コスト追跡 は何をしますか?
このスキルを使用して、Claude Codeのコストと使用量の履歴を、ECCのstop:cost-trackerフックが書き込むメトリクスログから分析します。
データの保存場所
トラッカーは、セッション停止ごとに1つのJSONオブジェクトを~/.claude/metrics/costs.jsonlに追記します。各行はそのセッションの累積スナップショットです。したがって、総支出を計算するには、session_idごとに最新の行を取得し、それらをセッション間で合計します。すべての行を合計すると多重カウントになります。
行のスキーマ:
| フィールド | 意味 |
|---|---|
timestamp | スナップショットのISOタイムスタンプ |
session_id | Claude Codeセッション識別子 |
transcript_path | セッショントランスクリプトへのパス |
model | 使用されたモデル |
input_tokens / output_tokens | トークン数 |
cache_write_tokens / cache_read_tokens | プロンプトキャッシュのトークン数 |
estimated_cost_usd | セッションの事前計算された累積コスト(USD) |
estimated_cost_usdを、手動での価格計算よりも優先してください。モデルやキャッシュの価格は変動するため、トラッカーが信頼できる情報源です。
使用するタイミング
- ユーザーが「いくら使った?」「このセッションのコストは?」「トークン使用量は?」と尋ねたとき
- ユーザーが予算、支出制限、超過、コスト管理について言及したとき
- ユーザーがモデル、セッション、日付ごとのコスト内訳やCSVエクスポートを希望したとき
仕組み
まずログが存在することを確認します(sqlite3ではなくnodeを使用してください。トラッカーはJSONLを書き込み、nodeはクロスプラットフォームです):
node -e 'const fs=require("fs"),os=require("os"),p=require("path");const f=p.join(os.homedir(),".claude","metrics","costs.jsonl");console.log(fs.existsSync(f)?"cost log found":"cost log not found: "+f)'
ログがない場合、使用データを捏造してはいけません。stop:cost-trackerフックが有効な状態で最初のセッションが終了した後にコスト追跡が有効になることをユーザーに伝えてください。
例 — サマリー、モデル別、過去7日間
node -e '
const fs=require("fs"),os=require("os"),path=require("path");
const f=path.join(os.homedir(),".claude","metrics","costs.jsonl");
if(!fs.existsSync(f)){console.log("cost log not found: "+f);process.exit(0);}
const rows=fs.readFileSync(f,"utf8").split(/\r?\n/).filter(Boolean).map(l=>{try{return JSON.parse(l)}catch{return null}}).filter(Boolean);
const bySession=new Map();
for(const r of rows){const k=r.session_id||r.transcript_path||r.timestamp;const p=bySession.get(k);if(!p||String(r.timestamp)>String(p.timestamp))bySession.set(k,r);}
const latest=[...bySession.values()];
const cost=r=>Number(r.estimated_cost_usd)||0, day=r=>String(r.timestamp||"").slice(0,10), sum=a=>a.reduce((s,r)=>s+cost(r),0), f4=n=>"$"+n.toFixed(4);
const today=new Date().toISOString().slice(0,10), yest=new Date(Date.now()-864e5).toISOString().slice(0,10);
console.log("today: "+f4(sum(latest.filter(r=>day(r)===today)))+" | yesterday: "+f4(sum(latest.filter(r=>day(r)===yest)))+" | total: "+f4(sum(latest))+" ("+latest.length+" sessions)");
const m=new Map();for(const r of latest){const k=r.model||"(unknown)";m.set(k,(m.get(k)||0)+cost(r));}
console.log("by model:");[...m.entries()].sort((a,b)=>b[1]-a[1]).forEach(([k,v])=>console.log(" "+f4(v)+" "+k));
'
セッションの詳細表示やCSVエクスポートについては、同じlatestセット(またはCSVの場合は生の行)を反復処理し、必要なフィールドを出力します。
報告ガイダンス
コストデータを提示する際は、今日の支出と昨日の比較、全セッションの合計、モデル別の内訳、セッション数を含めてください。1ドル未満の金額は小数点以下4桁、大きな金額は小数点以下2桁でフォーマットします。
アンチパターン
- すべての行を合計しないでください。各行はセッションごとの累積です。まず
session_idごとに最新の行に絞り込んでください。 estimated_cost_usdが存在する場合は、生のトークン数からコストを推定しないでください。- ログが存在することを確認せずに仮定しないでください。
- ユーザー向けの回答で現在のモデル価格をハードコードしないでください。
- 未レビューのフックや任意のコードを実行するプラグインをインストールすることを推奨しないでください。
関連情報
/cost-report- 同じメトリクスログに対するコマンド形式のレポート。cost-aware-llm-pipeline- モデルルーティングと予算設計のパターン。token-budget-advisor- コンテキストとトークン予算の計画。strategic-compact- 繰り返されるトークン消費を削減するためのコンテキスト圧縮。