diff --git a/litellm/litellm_core_utils/llm_cost_calc/utils.py b/litellm/litellm_core_utils/llm_cost_calc/utils.py index 983c8f3736a..13da1bb648c 100644 --- a/litellm/litellm_core_utils/llm_cost_calc/utils.py +++ b/litellm/litellm_core_utils/llm_cost_calc/utils.py @@ -208,10 +208,9 @@ def _parse_above_token_threshold(key: str) -> float: def _get_effective_prompt_tokens_for_tiered_pricing(usage: Usage) -> float: """Return the total effective input tokens for tier-threshold comparisons. - Some providers (Anthropic direct, Bedrock) roll cache_creation and cache_read - tokens into prompt_tokens before constructing the Usage object, while others - (Vertex AI) keep them separate. When prompt_tokens_details is present we can - derive the true total from its per-category fields and avoid double-counting. + Some providers report cache tokens inside prompt_tokens, while others keep + them separate. When prompt_tokens_details is present, prefer the category + fields so the threshold check can avoid double-counting cache tokens. """ if usage.prompt_tokens_details is not None: details = usage.prompt_tokens_details @@ -231,7 +230,7 @@ def _get_effective_prompt_tokens_for_tiered_pricing(usage: Usage) -> float: text_tokens = float(raw_text_tokens or 0) return text_tokens + cached_tokens + cache_creation - # No prompt_tokens_details — add explicit cache fields only if they are + # No prompt_tokens_details. Add explicit cache fields only if they are # not already rolled into prompt_tokens (determined by their presence). prompt_tokens = float(getattr(usage, "prompt_tokens", 0) or 0) cache_read_tokens = float(getattr(usage, "cache_read_input_tokens", 0) or 0)