mirror of
https://github.com/Wei-Shaw/claude-relay-service.git
synced 2026-01-23 21:17:30 +00:00
feat: 适配claude新opus周限规则
This commit is contained in:
@@ -131,6 +131,10 @@ class UnifiedClaudeScheduler {
|
||||
logger.debug(
|
||||
`🔍 Model parsing - Original: ${requestedModel}, Vendor: ${vendor}, Effective: ${effectiveModel}`
|
||||
)
|
||||
const isOpusRequest =
|
||||
effectiveModel && typeof effectiveModel === 'string'
|
||||
? effectiveModel.toLowerCase().includes('opus')
|
||||
: false
|
||||
|
||||
// 如果是 CCR 前缀,只在 CCR 账户池中选择
|
||||
if (vendor === 'ccr') {
|
||||
@@ -161,6 +165,9 @@ class UnifiedClaudeScheduler {
|
||||
boundAccount.status !== 'error' &&
|
||||
this._isSchedulable(boundAccount.schedulable)
|
||||
) {
|
||||
if (isOpusRequest) {
|
||||
await claudeAccountService.clearExpiredOpusRateLimit(boundAccount.id)
|
||||
}
|
||||
logger.info(
|
||||
`🎯 Using bound dedicated Claude OAuth account: ${boundAccount.name} (${apiKeyData.claudeAccountId}) for API key ${apiKeyData.name}`
|
||||
)
|
||||
@@ -313,6 +320,10 @@ class UnifiedClaudeScheduler {
|
||||
// 📋 获取所有可用账户(合并官方和Console)
|
||||
async _getAllAvailableAccounts(apiKeyData, requestedModel = null, includeCcr = false) {
|
||||
const availableAccounts = []
|
||||
const isOpusRequest =
|
||||
requestedModel && typeof requestedModel === 'string'
|
||||
? requestedModel.toLowerCase().includes('opus')
|
||||
: false
|
||||
|
||||
// 如果API Key绑定了专属账户,优先返回
|
||||
// 1. 检查Claude OAuth账户绑定
|
||||
@@ -447,15 +458,27 @@ class UnifiedClaudeScheduler {
|
||||
|
||||
// 检查是否被限流
|
||||
const isRateLimited = await claudeAccountService.isAccountRateLimited(account.id)
|
||||
if (!isRateLimited) {
|
||||
availableAccounts.push({
|
||||
...account,
|
||||
accountId: account.id,
|
||||
accountType: 'claude-official',
|
||||
priority: parseInt(account.priority) || 50, // 默认优先级50
|
||||
lastUsedAt: account.lastUsedAt || '0'
|
||||
})
|
||||
if (isRateLimited) {
|
||||
continue
|
||||
}
|
||||
|
||||
if (isOpusRequest) {
|
||||
const isOpusRateLimited = await claudeAccountService.isAccountOpusRateLimited(account.id)
|
||||
if (isOpusRateLimited) {
|
||||
logger.info(
|
||||
`🚫 Skipping account ${account.name} (${account.id}) due to active Opus limit`
|
||||
)
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
availableAccounts.push({
|
||||
...account,
|
||||
accountId: account.id,
|
||||
accountType: 'claude-official',
|
||||
priority: parseInt(account.priority) || 50, // 默认优先级50
|
||||
lastUsedAt: account.lastUsedAt || '0'
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -665,7 +688,23 @@ class UnifiedClaudeScheduler {
|
||||
// 检查是否限流或过载
|
||||
const isRateLimited = await claudeAccountService.isAccountRateLimited(accountId)
|
||||
const isOverloaded = await claudeAccountService.isAccountOverloaded(accountId)
|
||||
return !isRateLimited && !isOverloaded
|
||||
if (isRateLimited || isOverloaded) {
|
||||
return false
|
||||
}
|
||||
|
||||
if (
|
||||
requestedModel &&
|
||||
typeof requestedModel === 'string' &&
|
||||
requestedModel.toLowerCase().includes('opus')
|
||||
) {
|
||||
const isOpusRateLimited = await claudeAccountService.isAccountOpusRateLimited(accountId)
|
||||
if (isOpusRateLimited) {
|
||||
logger.info(`🚫 Account ${accountId} skipped due to active Opus limit (session check)`)
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
return true
|
||||
} else if (accountType === 'claude-console') {
|
||||
const account = await claudeConsoleAccountService.getAccount(accountId)
|
||||
if (!account || !account.isActive) {
|
||||
@@ -1056,6 +1095,10 @@ class UnifiedClaudeScheduler {
|
||||
}
|
||||
|
||||
const availableAccounts = []
|
||||
const isOpusRequest =
|
||||
requestedModel && typeof requestedModel === 'string'
|
||||
? requestedModel.toLowerCase().includes('opus')
|
||||
: false
|
||||
|
||||
// 获取所有成员账户的详细信息
|
||||
for (const memberId of memberIds) {
|
||||
@@ -1115,15 +1158,29 @@ class UnifiedClaudeScheduler {
|
||||
|
||||
// 检查是否被限流
|
||||
const isRateLimited = await this.isAccountRateLimited(account.id, accountType)
|
||||
if (!isRateLimited) {
|
||||
availableAccounts.push({
|
||||
...account,
|
||||
accountId: account.id,
|
||||
accountType,
|
||||
priority: parseInt(account.priority) || 50,
|
||||
lastUsedAt: account.lastUsedAt || '0'
|
||||
})
|
||||
if (isRateLimited) {
|
||||
continue
|
||||
}
|
||||
|
||||
if (accountType === 'claude-official' && isOpusRequest) {
|
||||
const isOpusRateLimited = await claudeAccountService.isAccountOpusRateLimited(
|
||||
account.id
|
||||
)
|
||||
if (isOpusRateLimited) {
|
||||
logger.info(
|
||||
`🚫 Skipping group member ${account.name} (${account.id}) due to active Opus limit`
|
||||
)
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
availableAccounts.push({
|
||||
...account,
|
||||
accountId: account.id,
|
||||
accountType,
|
||||
priority: parseInt(account.priority) || 50,
|
||||
lastUsedAt: account.lastUsedAt || '0'
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user