From b3e27e9f154038a9dbf8ba7f0a9ce9d01d5e87a0 Mon Sep 17 00:00:00 2001 From: John Doe Date: Sat, 6 Dec 2025 23:00:54 +0300 Subject: [PATCH] [fix] Add cache token capture for Droid OpenAI endpoint MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The _parseOpenAIUsageFromSSE method was not capturing cache-related tokens (cache_read_input_tokens, cache_creation_input_tokens) from OpenAI format responses, while the Anthropic endpoint correctly captured them. This fix adds extraction of: - cached_tokens from input_tokens_details - cache_creation_input_tokens from both input_tokens_details and top-level usage object This ensures proper cache statistics tracking and cost calculation for OpenAI models (like GPT-5/Codex) when using the Droid provider. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- src/services/droidRelayService.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/services/droidRelayService.js b/src/services/droidRelayService.js index c44871d4..f2f7e455 100644 --- a/src/services/droidRelayService.js +++ b/src/services/droidRelayService.js @@ -737,6 +737,14 @@ class DroidRelayService { currentUsageData.output_tokens = 0 } + // Capture cache tokens from OpenAI format + currentUsageData.cache_read_input_tokens = + data.usage.input_tokens_details?.cached_tokens || 0 + currentUsageData.cache_creation_input_tokens = + data.usage.input_tokens_details?.cache_creation_input_tokens || + data.usage.cache_creation_input_tokens || + 0 + logger.debug('📊 Droid OpenAI usage:', currentUsageData) } @@ -758,6 +766,14 @@ class DroidRelayService { currentUsageData.output_tokens = 0 } + // Capture cache tokens from OpenAI Response API format + currentUsageData.cache_read_input_tokens = + usage.input_tokens_details?.cached_tokens || 0 + currentUsageData.cache_creation_input_tokens = + usage.input_tokens_details?.cache_creation_input_tokens || + usage.cache_creation_input_tokens || + 0 + logger.debug('📊 Droid OpenAI response usage:', currentUsageData) } } catch (parseError) {