コストトラッキング は何をしますか?
このスキルを使用すると、ECCのstop:cost-trackerフックが書き込むメトリクスログから、Claude Codeのコストと使用履歴を分析できます。
データの保存場所
トラッカーは、セッション停止ごとに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- 繰り返されるトークン支出を削減するためのコンテキスト圧縮。