From 51cb92d395fabb062af5aa1ef778703f5dd71171 Mon Sep 17 00:00:00 2001 From: shaw Date: Tue, 16 Sep 2025 09:01:41 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=80=82=E9=85=8Dgpt-5-codex=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/routes/openaiRoutes.js | 2 +- src/services/pricingService.js | 9 +++++++++ src/utils/costCalculator.js | 10 +++++++++- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/routes/openaiRoutes.js b/src/routes/openaiRoutes.js index d43b09bd..9c13925c 100644 --- a/src/routes/openaiRoutes.js +++ b/src/routes/openaiRoutes.js @@ -139,7 +139,7 @@ const handleResponses = async (req, res) => { let requestedModel = req.body?.model || null // 如果模型是 gpt-5 开头且后面还有内容(如 gpt-5-2025-08-07),则覆盖为 gpt-5 - if (requestedModel && requestedModel.startsWith('gpt-5-') && requestedModel !== 'gpt-5') { + if (requestedModel && requestedModel.startsWith('gpt-5-') && requestedModel !== 'gpt-5-codex') { logger.info(`📝 Model ${requestedModel} detected, normalizing to gpt-5 for Codex API`) requestedModel = 'gpt-5' req.body.model = 'gpt-5' // 同时更新请求体中的模型 diff --git a/src/services/pricingService.js b/src/services/pricingService.js index 43ce2d1a..4f590580 100644 --- a/src/services/pricingService.js +++ b/src/services/pricingService.js @@ -265,6 +265,15 @@ class PricingService { return this.pricingData[modelName] } + // 特殊处理:gpt-5-codex 回退到 gpt-5 + if (modelName === 'gpt-5-codex' && !this.pricingData['gpt-5-codex']) { + const fallbackPricing = this.pricingData['gpt-5'] + if (fallbackPricing) { + logger.info(`💰 Using gpt-5 pricing as fallback for ${modelName}`) + return fallbackPricing + } + } + // 对于Bedrock区域前缀模型(如 us.anthropic.claude-sonnet-4-20250514-v1:0), // 尝试去掉区域前缀进行匹配 if (modelName.includes('.anthropic.') || modelName.includes('.claude')) { diff --git a/src/utils/costCalculator.js b/src/utils/costCalculator.js index 9eef07d2..a8ccec50 100644 --- a/src/utils/costCalculator.js +++ b/src/utils/costCalculator.js @@ -242,6 +242,14 @@ class CostCalculator { * @returns {Object} 定价信息 */ static getModelPricing(model = 'unknown') { + // 特殊处理:gpt-5-codex 回退到 gpt-5(如果没有专门定价) + if (model === 'gpt-5-codex' && !MODEL_PRICING['gpt-5-codex']) { + const gpt5Pricing = MODEL_PRICING['gpt-5'] + if (gpt5Pricing) { + console.log(`Using gpt-5 pricing as fallback for ${model}`) + return gpt5Pricing + } + } return MODEL_PRICING[model] || MODEL_PRICING['unknown'] } @@ -285,7 +293,7 @@ class CostCalculator { * @returns {Object} 节省信息 */ static calculateCacheSavings(usage, model = 'unknown') { - const pricing = this.getModelPricing(model) + const pricing = this.getModelPricing(model) // 已包含 gpt-5-codex 回退逻辑 const cacheReadTokens = usage.cache_read_input_tokens || 0 // 如果这些token不使用缓存,需要按正常input价格计费