diff --git a/src/middleware/auth.js b/src/middleware/auth.js index 787a0eb9..126cd4ed 100644 --- a/src/middleware/auth.js +++ b/src/middleware/auth.js @@ -9,7 +9,7 @@ const ClientValidator = require('../validators/clientValidator') const ClaudeCodeValidator = require('../validators/clients/claudeCodeValidator') const claudeRelayConfigService = require('../services/claudeRelayConfigService') const { calculateWaitTimeStats } = require('../utils/statsHelper') -const { isClaudeFamilyModel } = require('../utils/modelHelper') +const { isOpusModel } = require('../utils/modelHelper') // 工具函数 function sleep(ms) { @@ -1256,7 +1256,7 @@ const authenticateApiKey = async (req, res, next) => { const model = requestBody.model || '' // 判断是否为 Claude 模型 - if (isClaudeFamilyModel(model)) { + if (isOpusModel(model)) { const weeklyOpusCost = validation.keyData.weeklyOpusCost || 0 if (weeklyOpusCost >= weeklyOpusCostLimit) { diff --git a/src/services/apiKeyService.js b/src/services/apiKeyService.js index 0ca80b9f..dce98a0b 100644 --- a/src/services/apiKeyService.js +++ b/src/services/apiKeyService.js @@ -4,7 +4,7 @@ const config = require('../../config/config') const redis = require('../models/redis') const logger = require('../utils/logger') const serviceRatesService = require('./serviceRatesService') -const { isClaudeFamilyModel } = require('../utils/modelHelper') +const { isOpusModel } = require('../utils/modelHelper') const ACCOUNT_TYPE_CONFIG = { claude: { prefix: 'claude:account:' }, @@ -1649,7 +1649,7 @@ class ApiKeyService { async recordOpusCost(keyId, ratedCost, realCost, model, accountType) { try { // 判断是否为 Claude 系列模型(包含 Bedrock 格式等) - if (!isClaudeFamilyModel(model)) { + if (!isOpusModel(model)) { return } diff --git a/src/services/weeklyClaudeCostInitService.js b/src/services/weeklyClaudeCostInitService.js index 1268329f..2dfb1470 100644 --- a/src/services/weeklyClaudeCostInitService.js +++ b/src/services/weeklyClaudeCostInitService.js @@ -2,7 +2,7 @@ const redis = require('../models/redis') const logger = require('../utils/logger') const pricingService = require('./pricingService') const serviceRatesService = require('./serviceRatesService') -const { isClaudeFamilyModel } = require('../utils/modelHelper') +const { isOpusModel } = require('../utils/modelHelper') function pad2(n) { return String(n).padStart(2, '0') @@ -151,7 +151,7 @@ class WeeklyClaudeCostInitService { } const keyId = match[1] const model = match[2] - if (!isClaudeFamilyModel(model)) { + if (!isOpusModel(model)) { continue } matchedClaudeKeys++ diff --git a/src/utils/modelHelper.js b/src/utils/modelHelper.js index c3fecc98..91fda718 100644 --- a/src/utils/modelHelper.js +++ b/src/utils/modelHelper.js @@ -188,6 +188,22 @@ function isOpus45OrNewer(modelName) { return false } +/** + * 判断是否为 Opus 模型(任意版本) + * 匹配所有包含 "opus" 关键词的 Claude 模型 + */ +function isOpusModel(modelName) { + if (!modelName || typeof modelName !== 'string') { + return false + } + const { baseModel } = parseVendorPrefixedModel(modelName) + const m = (baseModel || '').trim().toLowerCase() + if (!m) { + return false + } + return m.includes('opus') +} + /** * 判断某个 model 名称是否属于 Anthropic Claude 系列模型。 * @@ -237,5 +253,6 @@ module.exports = { getEffectiveModel, getVendorType, isOpus45OrNewer, + isOpusModel, isClaudeFamilyModel }