From a552f3bb60607c4835743e53d48096763f3dc86d Mon Sep 17 00:00:00 2001 From: Tony Tran Date: Tue, 14 Jul 2026 09:25:44 +0700 Subject: [PATCH] add Gemini, Anthropic --- usage-dashboard/usage-dashboard.py | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/usage-dashboard/usage-dashboard.py b/usage-dashboard/usage-dashboard.py index 165b5a4..158cc19 100644 --- a/usage-dashboard/usage-dashboard.py +++ b/usage-dashboard/usage-dashboard.py @@ -254,6 +254,24 @@ def insert_usage(raw_items): ts_utc = parse_rfc3339(payload.get("timestamp")) ts_local = ts_utc.astimezone(LOCAL_TZ) tokens = payload.get("tokens") or {} + # Handle different token field naming conventions across providers + # OpenAI/Codex: input_tokens, output_tokens, total_tokens, reasoning_tokens, cached_tokens + # Gemini/Google: prompt_tokens, completion_tokens, total_tokens + # Anthropic: input_tokens, output_tokens + # Generic fallback: try multiple possible field names + def get_token_int(*keys, default=0): + for k in keys: + v = tokens.get(k) + if v is not None: + return int(v) + return default + + input_tokens = get_token_int("input_tokens", "prompt_tokens") + output_tokens = get_token_int("output_tokens", "completion_tokens") + reasoning_tokens = get_token_int("reasoning_tokens") + cached_tokens = get_token_int("cached_tokens") + total_tokens = get_token_int("total_tokens") + api_key = payload.get("api_key") or "" api_hash = hashlib.sha256(api_key.encode()).hexdigest()[:12] if api_key else "" values = { @@ -272,11 +290,11 @@ def insert_usage(raw_items): "api_key_hash": api_hash, "failed": 1 if payload.get("failed") else 0, "latency_ms": int(payload.get("latency_ms") or 0), - "input_tokens": int(tokens.get("input_tokens") or 0), - "output_tokens": int(tokens.get("output_tokens") or 0), - "reasoning_tokens": int(tokens.get("reasoning_tokens") or 0), - "cached_tokens": int(tokens.get("cached_tokens") or 0), - "total_tokens": int(tokens.get("total_tokens") or 0), + "input_tokens": input_tokens, + "output_tokens": output_tokens, + "reasoning_tokens": reasoning_tokens, + "cached_tokens": cached_tokens, + "total_tokens": total_tokens, "raw_json": raw, } try: