build_usage in apis/src/anthropic/to_openai/response.rs sets Anthropic
input_tokens to OpenAI prompt_tokens (which includes cached tokens),
then separately sets cache_read_input_tokens. In Anthropic's API contract,
input_tokens excludes cached tokens.
Downstream parse_anthropic in token_usage/providers.rs sums
input_tokens + cache_read_input_tokens, double-counting cached tokens.
Clients receiving this transformed response also see inflated input_tokens.
Impact: Incorrect token counts in billing dashboards and cost tracking
for Anthropic-translated responses.
Fix: Subtract cached_tokens from prompt_tokens when building
input_tokens:
let input_tokens = if let Some(cached) = cache_read {
prompt_tokens.saturating_sub(cached)
} else {
prompt_tokens
};
build_usageinapis/src/anthropic/to_openai/response.rssets Anthropicinput_tokensto OpenAIprompt_tokens(which includes cached tokens),then separately sets
cache_read_input_tokens. In Anthropic's API contract,input_tokensexcludes cached tokens.Downstream
parse_anthropicintoken_usage/providers.rssumsinput_tokens + cache_read_input_tokens, double-counting cached tokens.Clients receiving this transformed response also see inflated
input_tokens.Impact: Incorrect token counts in billing dashboards and cost tracking
for Anthropic-translated responses.
Fix: Subtract
cached_tokensfromprompt_tokenswhen buildinginput_tokens: