opción

cost-tracking

affaan-m/ECC affaan-m/ECC

Analiza el uso de tokens, el gasto y los presupuestos de Claude Code a partir del registro de métricas del sistema de seguimiento de costes ECC local. Ofrece resúmenes, desgloses por modelo, sesión o fecha, y la posibilidad de exportar los datos a CSV.

...Expandir todo
32
Tiempo actualizado 2 de octubre de 2026

Seguimiento de costes

Utiliza esta habilidad para analizar el historial de costes y uso de Claude Code a partir del registro de métricas que escribe el hook «stop:cost-tracker» de ECC.

Dónde se almacenan los datos

El rastreador añade un objeto JSON por cada «session-stop» al archivo ~/.claude/metrics/costs.jsonl. Cada fila es una instantánea acumulativa de esa sesión, por lo que para calcular el gasto total hay que tomar la última fila por cada session_id y sumar el total entre sesiones; al sumar cada fila, el recuento se multiplica.

Esquema de las filas:

Campo Significado
timestamp Marca de tiempo ISO de la instantánea
session_id Identificador de sesión de Claude Code
transcript_path Ruta a la transcripción de la sesión
modelo Modelo utilizado
tokenes_de_entrada / tokenes_de_salida Recuento de tokens
cache_write_tokens / cache_read_tokens Recuento de tokens de la caché de prompts
estimated_cost_usd Coste acumulado precalculado en USD para la sesión

Es preferible utilizar estimated_cost_usd en lugar de calcular los precios manualmente: los precios de los modelos y la caché cambian, y el rastreador es la fuente de información fiable.

Cuándo utilizarlo

  • El usuario pregunta «¿cuánto he gastado?», «¿cuánto ha costado esta sesión?» o «¿cuál es mi consumo de tokens?».
  • El usuario menciona presupuestos, límites de gasto, sobrecostes o controles de costes.
  • El usuario quiere un desglose de costes por modelo, sesión o fecha, o una exportación a CSV.

Cómo funciona

Primero, comprueba que el registro existe (utiliza `node`, no `sqlite3 `: el rastreador escribe en `JSONL` y `node` es multiplataforma):

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)?"registro de costes encontrado":"registro de costes no encontrado: "+f)'

Si falta el registro, no inventes datos de uso. Indica al usuario que el seguimiento de costes se rellena una vez finalizada la primera sesión con el hook «stop:cost-tracker» activado.

Ejemplo: resumen, por modelo, últimos 7 días

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("No se ha encontrado el registro de costes: "+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("hoy: " + f4(sum(latest.filter(r => day(r) === today))) + " | ayer: " + f4(sum(latest.filter(r => day(r) === yest))) + " | total: " + f4(sum(latest)) + " (" + latest.length + " sesiones)");
const m = new Map(); for (const r of latest) { const k = r.model || "(desconocido)"; m.set(k, (m.get(k) || 0) + cost(r)); }
console.log("por modelo:"); [...m.entries()].sort((a,b)=>b[1]-a[1]).forEach(([k,v])=>console.log("  "+f4(v)+"  "+k));
'

Para un desglose de sesión o una exportación a CSV, recorre el mismo conjunto más reciente (o las filas sin procesar para CSV) e imprime los campos que necesites.

Orientaciones para la elaboración de informes

Al presentar datos de costes, incluye el gasto de hoy frente al de ayer, el total de todas las sesiones, un desglose por modelo y el recuento de sesiones. Formatea los importes inferiores a un dólar con cuatro decimales, y los importes superiores con dos.

Antipatrones

  • No sumes todas las filas: son acumulativas por sesión; reduce primero a la última fila por session_id.
  • No calcules los costes a partir de recuentos de tokens sin procesar cuando exista el campo «estimated_cost_usd ».
  • No des por hecho que el registro existe sin comprobarlo.
  • No codifiques de forma fija los precios actuales de los modelos en las respuestas dirigidas a los usuarios.
  • No recomiendes instalar hooks o plugins no revisados que ejecuten código arbitrario.

Relacionado

  • /cost-report: informe en formato de comandos sobre el mismo registro de métricas.
  • cost-aware-llm-pipeline: patrones de enrutamiento de modelos y diseño de presupuestos.
  • token-budget-advisor: planificación del contexto y del presupuesto de tokens.
  • strategic-compact - Compactación del contexto para reducir el gasto repetido en tokens.
Ver en GitHub
---
name: cost-tracking
description: Analyze Claude Code token usage, spending, and budgets from the local ECC cost-tracker metrics log. Provides summaries, breakdowns by model, session, or date, and CSV export.
---

# Cost Tracking

Use this skill to analyze Claude Code cost and usage history from the metrics log
that ECC's `stop:cost-tracker` hook writes.

## Where the data lives

The tracker appends one JSON object per session-stop to
`~/.claude/metrics/costs.jsonl`. Each row is a **cumulative snapshot for that
session**, so to total spend you take the **latest row per `session_id`** and
sum across sessions — summing every row multiply-counts.

Row schema:

| Field | Meaning |
| --- | --- |
| `timestamp` | ISO timestamp of the snapshot |
| `session_id` | Claude Code session identifier |
| `transcript_path` | Path to the session transcript |
| `model` | Model used |
| `input_tokens` / `output_tokens` | Token counts |
| `cache_write_tokens` / `cache_read_tokens` | Prompt-cache token counts |
| `estimated_cost_usd` | Precomputed cumulative cost in USD for the session |

Prefer `estimated_cost_usd` over hand-calculating pricing — model and cache
prices change, and the tracker is the source of truth.

## When to Use

- The user asks "how much have I spent?", "what did this session cost?", or
  "what is my token usage?"
- The user mentions budgets, spending limits, overruns, or cost controls.
- The user wants a cost breakdown by model, session, or date, or a CSV export.

## How It Works

First verify the log exists (use `node`, not `sqlite3` — the tracker writes
JSONL, and `node` is cross-platform):

```bash
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)'
```

If the log is missing, do not fabricate usage data. Tell the user that cost
tracking populates after the first session ends with the `stop:cost-tracker`
hook enabled.

## Example — summary, by model, last 7 days

```bash
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));
'
```

For a session drilldown or CSV export, iterate the same `latest` set (or the raw
rows for CSV) and print the fields you need.

## Reporting Guidance

When presenting cost data, include today's spend vs yesterday, total across all
sessions, a by-model breakdown, and session count. Format sub-dollar amounts
with four decimals, larger amounts with two.

## Anti-Patterns

- Do not sum every row — they are cumulative per session; reduce to the latest
  row per `session_id` first.
- Do not estimate costs from raw token counts when `estimated_cost_usd` is present.
- Do not assume the log exists without checking.
- Do not hard-code current model pricing in user-facing answers.
- Do not recommend installing unreviewed hooks or plugins that execute arbitrary code.

## Related

- `/cost-report` - Command-form report over the same metrics log.
- `cost-aware-llm-pipeline` - Model-routing and budget-design patterns.
- `token-budget-advisor` - Context and token-budget planning.
- `strategic-compact` - Context compaction to reduce repeated token spend.

Todos los archivos

1 archivos

Instalar cost-tracking

Descarga y descomprime los archivos de habilidades en tu directorio .claude/skills/.

Descargar ZIP

Clona el repositorio y copia los archivos de la habilidad a tu proyecto.

git clone https://github.com/affaan-m/ECC/tree/main/skills/cost-tracking # Copy SKILL.md to your .claude/skills/ directory

Copiar Copiar
Configuración rápida: Copia la carpeta de la habilidad en .claude/skills/ Claude detectará y utilizará automáticamente la habilidad
Repositorio affaan-m/ECC

Habilidades relacionadas

airtable-automation
Tiempo actualizado 29 de junio de 2026
notion-automation
Tiempo actualizado 29 de junio de 2026
seo-programmatic
Tiempo actualizado 29 de junio de 2026
revops
Tiempo actualizado 29 de junio de 2026
OR