Spaces:
Sleeping
Sleeping
Upload 10 files
Browse files- 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错误
|
| 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 |
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 |
-
|
| 296 |
-
|
| 297 |
-
|
| 298 |
-
|
| 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 |
-
|
| 310 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
|