mirror of
https://github.com/Wei-Shaw/claude-relay-service.git
synced 2026-04-19 12:58:39 +00:00
Merge pull request #966 from TyrantLucifer/fix-cluade-opus-limit
fix: update the claude model limit logic
This commit is contained in:
@@ -9,7 +9,7 @@ const ClientValidator = require('../validators/clientValidator')
|
|||||||
const ClaudeCodeValidator = require('../validators/clients/claudeCodeValidator')
|
const ClaudeCodeValidator = require('../validators/clients/claudeCodeValidator')
|
||||||
const claudeRelayConfigService = require('../services/claudeRelayConfigService')
|
const claudeRelayConfigService = require('../services/claudeRelayConfigService')
|
||||||
const { calculateWaitTimeStats } = require('../utils/statsHelper')
|
const { calculateWaitTimeStats } = require('../utils/statsHelper')
|
||||||
const { isClaudeFamilyModel } = require('../utils/modelHelper')
|
const { isOpusModel } = require('../utils/modelHelper')
|
||||||
|
|
||||||
// 工具函数
|
// 工具函数
|
||||||
function sleep(ms) {
|
function sleep(ms) {
|
||||||
@@ -1256,7 +1256,7 @@ const authenticateApiKey = async (req, res, next) => {
|
|||||||
const model = requestBody.model || ''
|
const model = requestBody.model || ''
|
||||||
|
|
||||||
// 判断是否为 Claude 模型
|
// 判断是否为 Claude 模型
|
||||||
if (isClaudeFamilyModel(model)) {
|
if (isOpusModel(model)) {
|
||||||
const weeklyOpusCost = validation.keyData.weeklyOpusCost || 0
|
const weeklyOpusCost = validation.keyData.weeklyOpusCost || 0
|
||||||
|
|
||||||
if (weeklyOpusCost >= weeklyOpusCostLimit) {
|
if (weeklyOpusCost >= weeklyOpusCostLimit) {
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ const config = require('../../config/config')
|
|||||||
const redis = require('../models/redis')
|
const redis = require('../models/redis')
|
||||||
const logger = require('../utils/logger')
|
const logger = require('../utils/logger')
|
||||||
const serviceRatesService = require('./serviceRatesService')
|
const serviceRatesService = require('./serviceRatesService')
|
||||||
const { isClaudeFamilyModel } = require('../utils/modelHelper')
|
const { isOpusModel } = require('../utils/modelHelper')
|
||||||
|
|
||||||
const ACCOUNT_TYPE_CONFIG = {
|
const ACCOUNT_TYPE_CONFIG = {
|
||||||
claude: { prefix: 'claude:account:' },
|
claude: { prefix: 'claude:account:' },
|
||||||
@@ -1649,7 +1649,7 @@ class ApiKeyService {
|
|||||||
async recordOpusCost(keyId, ratedCost, realCost, model, accountType) {
|
async recordOpusCost(keyId, ratedCost, realCost, model, accountType) {
|
||||||
try {
|
try {
|
||||||
// 判断是否为 Claude 系列模型(包含 Bedrock 格式等)
|
// 判断是否为 Claude 系列模型(包含 Bedrock 格式等)
|
||||||
if (!isClaudeFamilyModel(model)) {
|
if (!isOpusModel(model)) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ const redis = require('../models/redis')
|
|||||||
const logger = require('../utils/logger')
|
const logger = require('../utils/logger')
|
||||||
const pricingService = require('./pricingService')
|
const pricingService = require('./pricingService')
|
||||||
const serviceRatesService = require('./serviceRatesService')
|
const serviceRatesService = require('./serviceRatesService')
|
||||||
const { isClaudeFamilyModel } = require('../utils/modelHelper')
|
const { isOpusModel } = require('../utils/modelHelper')
|
||||||
|
|
||||||
function pad2(n) {
|
function pad2(n) {
|
||||||
return String(n).padStart(2, '0')
|
return String(n).padStart(2, '0')
|
||||||
@@ -151,7 +151,7 @@ class WeeklyClaudeCostInitService {
|
|||||||
}
|
}
|
||||||
const keyId = match[1]
|
const keyId = match[1]
|
||||||
const model = match[2]
|
const model = match[2]
|
||||||
if (!isClaudeFamilyModel(model)) {
|
if (!isOpusModel(model)) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
matchedClaudeKeys++
|
matchedClaudeKeys++
|
||||||
|
|||||||
@@ -188,6 +188,22 @@ function isOpus45OrNewer(modelName) {
|
|||||||
return false
|
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 系列模型。
|
* 判断某个 model 名称是否属于 Anthropic Claude 系列模型。
|
||||||
*
|
*
|
||||||
@@ -237,5 +253,6 @@ module.exports = {
|
|||||||
getEffectiveModel,
|
getEffectiveModel,
|
||||||
getVendorType,
|
getVendorType,
|
||||||
isOpus45OrNewer,
|
isOpus45OrNewer,
|
||||||
|
isOpusModel,
|
||||||
isClaudeFamilyModel
|
isClaudeFamilyModel
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user