From 7aa3db4c68be5fd195842f03cd8b0db92bbedcdc Mon Sep 17 00:00:00 2001 From: thefux Date: Fri, 24 Jul 2026 15:43:01 +0000 Subject: [PATCH] fix: use direct assignment instead of setdefault in _inject_cost_into_usage Per Claude Code review (PR #30 comment #3039): setdefault would silently keep stale upstream-provided cost values and drop routstr's authoritative msats breakdown. Switch to direct assignment so routstr's calculated cost data always takes precedence. --- routstr/upstream/base.py | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/routstr/upstream/base.py b/routstr/upstream/base.py index 96b8f450..4c519ba5 100644 --- a/routstr/upstream/base.py +++ b/routstr/upstream/base.py @@ -94,23 +94,22 @@ def _inject_cost_into_usage( usage = response_json.get("usage") if not isinstance(usage, dict): return - cost_obj = usage.get("cost") - if not isinstance(cost_obj, dict): - cost_obj = {} - cost_obj.setdefault("base_msats", cost_data.base_msats) - cost_obj.setdefault("input_msats", cost_data.input_msats) - cost_obj.setdefault("output_msats", cost_data.output_msats) - cost_obj.setdefault("total_msats", cost_data.total_msats) - cost_obj.setdefault( - "cache_read_input_tokens", cost_data.cache_read_input_tokens - ) - cost_obj.setdefault( - "cache_creation_input_tokens", cost_data.cache_creation_input_tokens - ) - cost_obj.setdefault("cache_read_msats", cost_data.cache_read_msats) - cost_obj.setdefault("cache_creation_msats", cost_data.cache_creation_msats) + # Direct assignment (not setdefault) so routstr's authoritative cost + # data always overwrites any upstream-provided cost values. Using + # setdefault would silently keep stale upstream values and drop our + # calculated msats breakdown. + cost_obj = { + "base_msats": cost_data.base_msats, + "input_msats": cost_data.input_msats, + "output_msats": cost_data.output_msats, + "total_msats": cost_data.total_msats, + "cache_read_input_tokens": cost_data.cache_read_input_tokens, + "cache_creation_input_tokens": cost_data.cache_creation_input_tokens, + "cache_read_msats": cost_data.cache_read_msats, + "cache_creation_msats": cost_data.cache_creation_msats, + } if cost_data.total_usd: - cost_obj.setdefault("total_usd", cost_data.total_usd) + cost_obj["total_usd"] = cost_data.total_usd usage["cost"] = cost_obj usage["cost_sats"] = cost_data.total_msats // 1000