From ad672c3c4c255a7810409315e5669bd387095571 Mon Sep 17 00:00:00 2001 From: shaw Date: Thu, 25 Sep 2025 11:31:30 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8Dopenai-respons?= =?UTF-8?q?=E8=AE=A1=E8=B4=B9=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/services/openaiResponsesRelayService.js | 46 +++++++++++++++++---- 1 file changed, 38 insertions(+), 8 deletions(-) diff --git a/src/services/openaiResponsesRelayService.js b/src/services/openaiResponsesRelayService.js index ca84801b..433242e6 100644 --- a/src/services/openaiResponsesRelayService.js +++ b/src/services/openaiResponsesRelayService.js @@ -7,6 +7,32 @@ const unifiedOpenAIScheduler = require('./unifiedOpenAIScheduler') const config = require('../../config/config') const crypto = require('crypto') +// 抽取缓存写入 token,兼容多种字段命名 +function extractCacheCreationTokens(usageData) { + if (!usageData || typeof usageData !== 'object') { + return 0 + } + + const details = usageData.input_tokens_details || usageData.prompt_tokens_details || {} + const candidates = [ + details.cache_creation_input_tokens, + details.cache_creation_tokens, + usageData.cache_creation_input_tokens, + usageData.cache_creation_tokens + ] + + for (const value of candidates) { + if (value !== undefined && value !== null && value !== '') { + const parsed = Number(value) + if (!Number.isNaN(parsed)) { + return parsed + } + } + } + + return 0 +} + class OpenAIResponsesRelayService { constructor() { this.defaultTimeout = config.requestTimeout || 600000 @@ -496,24 +522,26 @@ class OpenAIResponsesRelayService { // 提取缓存相关的 tokens(如果存在) const cacheReadTokens = usageData.input_tokens_details?.cached_tokens || 0 + const cacheCreateTokens = extractCacheCreationTokens(usageData) // 计算实际输入token(总输入减去缓存部分) const actualInputTokens = Math.max(0, totalInputTokens - cacheReadTokens) - const totalTokens = usageData.total_tokens || totalInputTokens + outputTokens + const totalTokens = + usageData.total_tokens || totalInputTokens + outputTokens + cacheCreateTokens const modelToRecord = actualModel || requestedModel || 'gpt-4' await apiKeyService.recordUsage( apiKeyData.id, actualInputTokens, // 传递实际输入(不含缓存) outputTokens, - 0, // OpenAI没有cache_creation_tokens + cacheCreateTokens, cacheReadTokens, modelToRecord, account.id ) logger.info( - `📊 Recorded usage - Input: ${totalInputTokens}(actual:${actualInputTokens}+cached:${cacheReadTokens}), Output: ${outputTokens}, Total: ${totalTokens}, Model: ${modelToRecord}` + `📊 Recorded usage - Input: ${totalInputTokens}(actual:${actualInputTokens}+cached:${cacheReadTokens}), CacheCreate: ${cacheCreateTokens}, Output: ${outputTokens}, Total: ${totalTokens}, Model: ${modelToRecord}` ) // 更新账户的 token 使用统计 @@ -527,7 +555,7 @@ class OpenAIResponsesRelayService { { input_tokens: actualInputTokens, // 实际输入(不含缓存) output_tokens: outputTokens, - cache_creation_input_tokens: 0, // OpenAI没有cache_creation + cache_creation_input_tokens: cacheCreateTokens, cache_read_input_tokens: cacheReadTokens }, modelToRecord @@ -623,23 +651,25 @@ class OpenAIResponsesRelayService { // 提取缓存相关的 tokens(如果存在) const cacheReadTokens = usageData.input_tokens_details?.cached_tokens || 0 + const cacheCreateTokens = extractCacheCreationTokens(usageData) // 计算实际输入token(总输入减去缓存部分) const actualInputTokens = Math.max(0, totalInputTokens - cacheReadTokens) - const totalTokens = usageData.total_tokens || totalInputTokens + outputTokens + const totalTokens = + usageData.total_tokens || totalInputTokens + outputTokens + cacheCreateTokens await apiKeyService.recordUsage( apiKeyData.id, actualInputTokens, // 传递实际输入(不含缓存) outputTokens, - 0, // OpenAI没有cache_creation_tokens + cacheCreateTokens, cacheReadTokens, actualModel, account.id ) logger.info( - `📊 Recorded non-stream usage - Input: ${totalInputTokens}(actual:${actualInputTokens}+cached:${cacheReadTokens}), Output: ${outputTokens}, Total: ${totalTokens}, Model: ${actualModel}` + `📊 Recorded non-stream usage - Input: ${totalInputTokens}(actual:${actualInputTokens}+cached:${cacheReadTokens}), CacheCreate: ${cacheCreateTokens}, Output: ${outputTokens}, Total: ${totalTokens}, Model: ${actualModel}` ) // 更新账户的 token 使用统计 @@ -653,7 +683,7 @@ class OpenAIResponsesRelayService { { input_tokens: actualInputTokens, // 实际输入(不含缓存) output_tokens: outputTokens, - cache_creation_input_tokens: 0, // OpenAI没有cache_creation + cache_creation_input_tokens: cacheCreateTokens, cache_read_input_tokens: cacheReadTokens }, actualModel