Was macht Kosten-Tracking?
Verwende diese Fähigkeit, um die Kosten- und Nutzungshistorie von Claude Code aus dem Metrik-Log zu analysieren, das ECCs stop:cost-tracker-Hook schreibt.
Wo die Daten leben
Der Tracker hängt ein JSON-Objekt pro Sitzungsende an ~/.claude/metrics/costs.jsonl an. Jede Zeile ist ein kumulativer Snapshot für diese Sitzung. Um die Gesamtausgaben zu ermitteln, nimm die letzte Zeile pro session_id und summiere über alle Sitzungen hinweg – das Summieren jeder Zeile würde Mehrfachzählungen verursachen.
Zeilen-Schema:
| Feld | Bedeutung |
|---|---|
timestamp | ISO-Zeitstempel des Snapshots |
session_id | Claude Code Sitzungskennung |
transcript_path | Pfad zum Sitzungsprotokoll |
model | Verwendetes Modell |
input_tokens / output_tokens | Token-Anzahlen |
cache_write_tokens / cache_read_tokens | Prompt-Cache-Token-Anzahlen |
estimated_cost_usd | Vorberechnete kumulative Kosten in USD für die Sitzung |
Bevorzuge estimated_cost_usd gegenüber manueller Preisberechnung – Modell- und Cache-Preise ändern sich, und der Tracker ist die Quelle der Wahrheit.
Wann zu verwenden
- Der Benutzer fragt: „Wie viel habe ich ausgegeben?“, „Was hat diese Sitzung gekostet?“ oder „Wie hoch ist mein Token-Verbrauch?“
- Der Benutzer erwähnt Budgets, Ausgabenlimits, Überschreitungen oder Kostenkontrollen.
- Der Benutzer möchte eine Kostenaufschlüsselung nach Modell, Sitzung oder Datum oder einen CSV-Export.
Wie es funktioniert
Überprüfe zunächst, ob das Log existiert (verwende node, nicht sqlite3 – der Tracker schreibt JSONL, und node ist plattformübergreifend):
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)?"Kostenlog gefunden":"Kostenlog nicht gefunden: "+f)'
Wenn das Log fehlt, erfinde keine Nutzungsdaten. Teile dem Benutzer mit, dass das Kosten-Tracking nach der ersten beendeten Sitzung mit aktiviertem stop:cost-tracker-Hook befüllt wird.
Beispiel – Zusammenfassung, nach Modell, letzte 7 Tage
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("Kostenlog nicht gefunden: "+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("heute: "+f4(sum(latest.filter(r=>day(r)===today)))+" | gestern: "+f4(sum(latest.filter(r=>day(r)===yest)))+