diff --git a/open-sse/handlers/chatCore.js b/open-sse/handlers/chatCore.js index cd774630bfe..dee1c18b04b 100644 --- a/open-sse/handlers/chatCore.js +++ b/open-sse/handlers/chatCore.js @@ -194,8 +194,18 @@ function translateNonStreamingResponse(responseBody, targetFormat, sourceFormat) function extractUsageFromResponse(responseBody, provider) { if (!responseBody || typeof responseBody !== 'object') return null; + // Claude format - check first to avoid conflict with OpenAI check + if (responseBody.usage && typeof responseBody.usage === 'object' && responseBody.usage.input_tokens !== undefined) { + return { + prompt_tokens: responseBody.usage.input_tokens || 0, + completion_tokens: responseBody.usage.output_tokens || 0, + cache_read_input_tokens: responseBody.usage.cache_read_input_tokens, + cache_creation_input_tokens: responseBody.usage.cache_creation_input_tokens + }; + } + // OpenAI format - if (responseBody.usage && typeof responseBody.usage === 'object') { + if (responseBody.usage && typeof responseBody.usage === 'object' && responseBody.usage.prompt_tokens !== undefined) { return { prompt_tokens: responseBody.usage.prompt_tokens || 0, completion_tokens: responseBody.usage.completion_tokens || 0, @@ -204,16 +214,6 @@ function extractUsageFromResponse(responseBody, provider) { }; } - // Claude format - if (responseBody.usage && typeof responseBody.usage === 'object' && (responseBody.usage.input_tokens !== undefined || responseBody.usage.output_tokens !== undefined)) { - return { - prompt_tokens: responseBody.usage.input_tokens || 0, - completion_tokens: responseBody.usage.output_tokens || 0, - cache_read_input_tokens: responseBody.usage.cache_read_input_tokens, - cache_creation_input_tokens: responseBody.usage.cache_creation_input_tokens - }; - } - // Gemini format if (responseBody.usageMetadata && typeof responseBody.usageMetadata === 'object') { return { @@ -723,6 +723,14 @@ export async function handleChatCore({ body, modelInfo, credentials, log, onCred } } + // Log provider response (raw response from provider) + reqLogger.logProviderResponse( + providerResponse.status, + providerResponse.statusText, + providerResponse.headers, + responseBody + ); + // Notify success - caller can clear error status if needed if (onRequestSuccess) { await onRequestSuccess(); @@ -758,6 +766,9 @@ export async function handleChatCore({ body, modelInfo, credentials, log, onCred translatedResponse.usage = filterUsageForFormat(buffered, sourceFormat); } + // Log converted response (final response to client) + reqLogger.logConvertedResponse(translatedResponse); + const totalLatency = Date.now() - requestStartTime; const requestDetail = { provider: provider || "unknown",