xiaoyukkkk commited on
Commit
bae1a33
·
verified ·
1 Parent(s): 25c4291

Upload 10 files

Browse files
Files changed (1) hide show
  1. core/account.py +30 -14
core/account.py CHANGED
@@ -132,16 +132,21 @@ class AccountManager:
132
  raise
133
 
134
  def should_retry(self) -> bool:
135
- """检查账户是否可重试(429错误10分钟后恢复,普通错误永久禁用)"""
136
  if self.is_available:
137
  return True
138
 
139
  current_time = time.time()
140
 
141
- # 检查429冷却期(10分钟后自动恢复)
142
  if self.last_429_time > 0:
143
  if current_time - self.last_429_time > self.rate_limit_cooldown_seconds:
144
- return True # 冷却期已过,可以重试
 
 
 
 
 
145
  return False # 仍在冷却期
146
 
147
  # 普通错误永久禁用
@@ -278,7 +283,7 @@ class MultiAccountManager:
278
  logger.info(f"[MULTI] [ACCOUNT] 添加账户: {config.account_id}")
279
 
280
  async def get_account(self, account_id: Optional[str] = None, request_id: str = "") -> AccountManager:
281
- """获取账户 (轮询或指定) - 优化锁粒度减少竞争"""
282
  req_tag = f"[req_{request_id}] " if request_id else ""
283
 
284
  # 如果指定了账户ID(无需锁)
@@ -290,27 +295,38 @@ class MultiAccountManager:
290
  raise HTTPException(503, f"Account {account_id} temporarily unavailable")
291
  return account
292
 
293
- # 轮询选择可用账户(无锁读取账户列表
294
- available_accounts = [
295
- acc_id for acc_id in self.account_list
296
- if self.accounts[acc_id].should_retry()
297
- and not self.accounts[acc_id].config.is_expired()
298
- and not self.accounts[acc_id].config.disabled
299
- ]
 
 
 
 
300
 
301
  if not available_accounts:
302
  raise HTTPException(503, "No available accounts")
303
 
 
 
 
304
  # 只在更新索引时加锁(最小化锁持有时间)
305
  async with self._index_lock:
306
  if not hasattr(self, '_available_index'):
307
  self._available_index = 0
308
 
309
- account_id = available_accounts[self._available_index % len(available_accounts)]
310
- self._available_index = (self._available_index + 1) % len(available_accounts)
 
 
 
 
311
 
312
  account = self.accounts[account_id]
313
- logger.info(f"[MULTI] [ACCOUNT] {req_tag}选择账户: {account_id}")
314
  return account
315
 
316
 
 
132
  raise
133
 
134
  def should_retry(self) -> bool:
135
+ """检查账户是否可重试(429错误冷却期自动恢复,普通错误永久禁用)"""
136
  if self.is_available:
137
  return True
138
 
139
  current_time = time.time()
140
 
141
+ # 检查429冷却期(冷却期后自动恢复)
142
  if self.last_429_time > 0:
143
  if current_time - self.last_429_time > self.rate_limit_cooldown_seconds:
144
+ # 冷却期已过,自动恢复账户用性
145
+ self.is_available = True
146
+ self.last_429_time = 0.0
147
+ self.error_count = 0 # 重置错误计数
148
+ logger.info(f"[ACCOUNT] [{self.config.account_id}] 429冷却期已过,账户已自动恢复")
149
+ return True
150
  return False # 仍在冷却期
151
 
152
  # 普通错误永久禁用
 
283
  logger.info(f"[MULTI] [ACCOUNT] 添加账户: {config.account_id}")
284
 
285
  async def get_account(self, account_id: Optional[str] = None, request_id: str = "") -> AccountManager:
286
+ """获取账户 (智能选择或指定) - 优先选择健康账户提升响应速度"""
287
  req_tag = f"[req_{request_id}] " if request_id else ""
288
 
289
  # 如果指定了账户ID(无需锁)
 
295
  raise HTTPException(503, f"Account {account_id} temporarily unavailable")
296
  return account
297
 
298
+ # 智能选择可用账户(优先健康账户,提升响应速度
299
+ available_accounts = []
300
+ for acc_id in self.account_list:
301
+ account = self.accounts[acc_id]
302
+ # 检查账户是否可用(会自动恢复429冷却期后的账户)
303
+ if (account.should_retry() and
304
+ not account.config.is_expired() and
305
+ not account.config.disabled):
306
+ # 计算账户健康度(error_count越低越健康)
307
+ health_score = -account.error_count # 负数,越大越健康
308
+ available_accounts.append((acc_id, health_score))
309
 
310
  if not available_accounts:
311
  raise HTTPException(503, "No available accounts")
312
 
313
+ # 按健康度排序(优先选择error_count最低的账户)
314
+ available_accounts.sort(key=lambda x: x[1], reverse=True)
315
+
316
  # 只在更新索引时加锁(最小化锁持有时间)
317
  async with self._index_lock:
318
  if not hasattr(self, '_available_index'):
319
  self._available_index = 0
320
 
321
+ # 在健康账户中轮询(只在前50%健康账户中选择)
322
+ healthy_count = max(1, len(available_accounts) // 2)
323
+ healthy_accounts = [acc_id for acc_id, _ in available_accounts[:healthy_count]]
324
+
325
+ account_id = healthy_accounts[self._available_index % len(healthy_accounts)]
326
+ self._available_index = (self._available_index + 1) % len(healthy_accounts)
327
 
328
  account = self.accounts[account_id]
329
+ logger.info(f"[MULTI] [ACCOUNT] {req_tag}选择账户: {account_id} (健康度: {account.error_count}错误)")
330
  return account
331
 
332