88 cache_hit_tokens: int = 0,
89 cache_miss_tokens: int = 0,
90 output_tokens: int = 0,
91 reasoning_tokens: int = 0,
93 """Return a USD breakdown for the given token split, or ``None``.
95 Reasoning tokens are billed at the explicit ``reasoning`` rate
96 when present, else at the ``output`` rate (DeepSeek bills
97 reasoning as output). Hit and miss are costed at distinct rates.
99 rates = self.
_lookup(provider, model)
103 def _r(key: str, default: float = 0.0) -> float:
105 return float(rates.get(key, default))
106 except (TypeError, ValueError):
109 per_mtok = 1_000_000.0
110 hit_usd = cache_hit_tokens / per_mtok * _r(
"input_hit")
111 miss_usd = cache_miss_tokens / per_mtok * _r(
"input_miss")
112 reasoning_rate = _r(
"reasoning", _r(
"output"))
113 reasoning_usd = reasoning_tokens / per_mtok * reasoning_rate
115 plain_output = max(0, output_tokens - reasoning_tokens)
116 output_usd = plain_output / per_mtok * _r(
"output")
118 "input_hit_usd": round(hit_usd, 6),
119 "input_miss_usd": round(miss_usd, 6),
120 "output_usd": round(output_usd, 6),
121 "reasoning_usd": round(reasoning_usd, 6),
122 "total_usd": round(hit_usd + miss_usd + output_usd + reasoning_usd, 6),