#31594 [Bug]: cost_breakdown missing cache_read_cost/cache_creation_cost for DeepSeek / OpenAI-compatible
### Check for existing issues
- [x] I have searched the existing issues and checked that my issue is not a duplicate.
### What happened?
When prompting DeepSeek **directly**, the API response includes cache token information in `usage.prompt_tokens_details.cached_tokens`. For example, a cache-hit response from DeepSeek looks like:
```json { "usage": { "prompt_tokens": 136153, "completion_tokens": 418, "prompt_tokens_details": { "cached_tokens": 135936 } } } ```
When routing the **same request through LiteLLM Proxy**, the spend log's `cost_breakdown` only shows `input_cost`, `output_cost`, and `total_cost` β **no `cache_read_cost` field appears**, even though the proxy already applied the correct cache discount to the total. The breakdown is opaque: there's no way to see how much of `input_cost` came from cache hits vs cache misses.
The `completion_cost()` function only checks `usage.cache_read_input_tokens` (Anthropic convention). DeepSeek (OpenAI-compatible) returns cache tokens as `usage.prompt_tokens_details.cached_tokens`. The `Usage` Pydantic model does **not** have a direct `cache_read_input_tokens` field β so `getattr(obj, "cache_read_input_toβ¦