From 708a0a18fe978f4808682716a37ce487c266a88d Mon Sep 17 00:00:00 2001 From: Juan Camilo Date: Thu, 2 Apr 2026 15:21:37 +0200 Subject: [PATCH] fix: report cached tokens from OpenAI prompt_tokens_details MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit OpenAI returns cached token counts in usage.prompt_tokens_details.cached_tokens but the shim hardcoded cache_read_input_tokens to 0. This made prompt caching invisible to the cost tracker and session summary even when OpenAI's automatic caching was actively reducing costs. Changes: - Extend OpenAIStreamChunk usage interface with prompt_tokens_details - Map cached_tokens to cache_read_input_tokens in convertChunkUsage() - Same fix in _convertNonStreamingResponse() for non-streaming path - cache_creation_input_tokens remains 0 (OpenAI auto-caching has no creation cost — it is free and automatic) --- src/services/api/openaiShim.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/services/api/openaiShim.ts b/src/services/api/openaiShim.ts index 1f99b7c4..0b43192b 100644 --- a/src/services/api/openaiShim.ts +++ b/src/services/api/openaiShim.ts @@ -376,6 +376,9 @@ interface OpenAIStreamChunk { prompt_tokens?: number completion_tokens?: number total_tokens?: number + prompt_tokens_details?: { + cached_tokens?: number + } } } @@ -392,7 +395,7 @@ function convertChunkUsage( input_tokens: usage.prompt_tokens ?? 0, output_tokens: usage.completion_tokens ?? 0, cache_creation_input_tokens: 0, - cache_read_input_tokens: 0, + cache_read_input_tokens: usage.prompt_tokens_details?.cached_tokens ?? 0, } } @@ -920,6 +923,9 @@ class OpenAIShimMessages { usage?: { prompt_tokens?: number completion_tokens?: number + prompt_tokens_details?: { + cached_tokens?: number + } } }, model: string, @@ -985,7 +991,7 @@ class OpenAIShimMessages { input_tokens: data.usage?.prompt_tokens ?? 0, output_tokens: data.usage?.completion_tokens ?? 0, cache_creation_input_tokens: 0, - cache_read_input_tokens: 0, + cache_read_input_tokens: data.usage?.prompt_tokens_details?.cached_tokens ?? 0, }, } }