dan92 commited on
Commit
08b0ffa
·
verified ·
1 Parent(s): 5883b89

Upload app.py

Browse files
Files changed (1) hide show
  1. app.py +57 -51
app.py CHANGED
@@ -309,42 +309,43 @@ class MultiAuthManager:
309
  self.current_index = 0
310
  self._last_rotation = time.time()
311
  self._rotation_interval = 300 # 5分钟轮转间隔
312
- self.last_successful_index = 0 # 新增:记录上一次成功的账号索引
313
- self.daily_rotation_triggered = False # 新增:标记是否触发过每日轮询
314
 
315
  def get_next_auth_manager(self, model):
316
- """改进的账号选择逻辑,从上一次成功的账号开始"""
317
- # 如果当前账号可用,直接返回
318
- current_auth = self.auth_managers[self.last_successful_index]
319
- if current_auth.is_model_available(model) and current_auth._should_attempt_auth():
320
- return current_auth
321
-
322
- # 如果当前账号不可用,且未触发每日轮询,则等待到第二天
323
- if not self.daily_rotation_triggered:
324
- return None
325
-
326
- # 进行账号轮询
 
 
 
 
 
 
327
  start_index = (self.last_successful_index + 1) % len(self.auth_managers)
328
- current_index = start_index
329
 
330
- while True:
331
- auth_manager = self.auth_managers[current_index]
332
  if auth_manager.is_model_available(model) and auth_manager._should_attempt_auth():
333
- self.last_successful_index = current_index
334
  return auth_manager
335
-
336
- current_index = (current_index + 1) % len(self.auth_managers)
337
- if current_index == start_index:
338
- break
339
-
340
  return None
341
 
342
- def set_successful_account(self, auth_manager):
343
- """记录成功使用的账号索引"""
344
- for i, manager in enumerate(self.auth_managers):
345
- if manager._email == auth_manager._email:
346
- self.last_successful_index = i
347
- break
348
 
349
  def ensure_valid_token(self, model):
350
  for _ in range(len(self.auth_managers)):
@@ -747,7 +748,7 @@ def handle_request():
747
  }), 500
748
 
749
  def build_payload(request_data, model_id):
750
- """构建请求有效负载,确保保持完整的上下文。"""
751
  messages = request_data.get('messages', [])
752
 
753
  # 检查是否已经存在系统消息
@@ -821,9 +822,6 @@ def make_request(payload, auth_manager, model_id):
821
  while len(tried_accounts) < len(multi_auth_manager.auth_managers):
822
  auth_manager = multi_auth_manager.get_next_auth_manager(model_id)
823
  if not auth_manager:
824
- if not multi_auth_manager.daily_rotation_triggered:
825
- logger.info("当前账号不可用,等待至次日重试")
826
- raise Exception("当前账号不可用,请等待至次日重试")
827
  break
828
 
829
  # 如果这个账号已经尝试过,继续下一个
@@ -847,7 +845,9 @@ def make_request(payload, auth_manager, model_id):
847
 
848
  if response.status_code == 200 and response.headers.get('Content-Type') == 'text/event-stream':
849
  logger.info(f"请求成功,使用账号 {auth_manager._email}")
850
- multi_auth_manager.set_successful_account(auth_manager) # 记录成功的账号
 
 
851
  return response
852
 
853
  headers_cache.clear()
@@ -883,43 +883,49 @@ def make_request(payload, auth_manager, model_id):
883
  raise Exception("所有账号均不可用,且注册新账号失败")
884
 
885
  def health_check():
886
- """改进的健康检查函数,每次只检查一个账号"""
887
  check_index = 0
888
- last_check_time = time.time()
889
- last_date = datetime.now().date()
890
 
891
  while True:
892
  try:
893
  if multi_auth_manager:
894
- current_time = time.time()
895
  current_date = datetime.now().date()
896
 
897
- # 检查是否是新的一天
898
- if current_date > last_date:
899
- multi_auth_manager.daily_rotation_triggered = True
900
- multi_auth_manager.reset_all_model_status()
901
- logger.info("New day started - Reset model status for all accounts")
902
- last_date = current_date
903
-
904
- # 每60秒检查一个账号
905
- if current_time - last_check_time >= 60:
906
  auth_manager = multi_auth_manager.auth_managers[check_index]
 
907
 
908
  if auth_manager._should_attempt_auth():
909
  if not auth_manager.ensure_valid_token():
910
- logger.warning(f"Auth token validation failed during health check for {auth_manager._email}")
911
  auth_manager.clear_auth()
912
  else:
913
- logger.info(f"Health check passed for {auth_manager._email}")
 
 
914
 
915
- # 更新检查索引和时间
916
  check_index = (check_index + 1) % len(multi_auth_manager.auth_managers)
917
- last_check_time = current_time
 
 
 
 
 
918
 
919
  except Exception as e:
920
  logger.error(f"Health check error: {e}")
921
 
922
- sleep(1) # 降低CPU使用率
923
 
924
  # 为了兼容 Flask CLI 和 Gunicorn,修改启动逻辑
925
  if __name__ != "__main__":
 
309
  self.current_index = 0
310
  self._last_rotation = time.time()
311
  self._rotation_interval = 300 # 5分钟轮转间隔
312
+ self.last_successful_index = 0 # 记录上次成功的账号索引
313
+ self.last_success_date = datetime.now().date() # 记录上次成功的日期
314
 
315
  def get_next_auth_manager(self, model):
316
+ """改进的账号选择逻辑,优先使用上次成功的账号"""
317
+ current_date = datetime.now().date()
318
+
319
+ # 如果是新的一天,重置状态并从第一个账号开始
320
+ if current_date > self.last_success_date:
321
+ self.current_index = 0
322
+ self.last_successful_index = 0
323
+ self.last_success_date = current_date
324
+ self.reset_all_model_status()
325
+ return self.auth_managers[0] if self.auth_managers else None
326
+
327
+ # 优先使用上次成功的账号
328
+ auth_manager = self.auth_managers[self.last_successful_index]
329
+ if auth_manager.is_model_available(model) and auth_manager._should_attempt_auth():
330
+ return auth_manager
331
+
332
+ # 如果上次成功的账号不可用,才开始轮询其他账号
333
  start_index = (self.last_successful_index + 1) % len(self.auth_managers)
334
+ current = start_index
335
 
336
+ while current != self.last_successful_index:
337
+ auth_manager = self.auth_managers[current]
338
  if auth_manager.is_model_available(model) and auth_manager._should_attempt_auth():
339
+ self.last_successful_index = current
340
  return auth_manager
341
+ current = (current + 1) % len(self.auth_managers)
342
+
 
 
 
343
  return None
344
 
345
+ def update_last_successful(self, index):
346
+ """更新最后一次成功使用的账号索引"""
347
+ self.last_successful_index = index
348
+ self.last_success_date = datetime.now().date()
 
 
349
 
350
  def ensure_valid_token(self, model):
351
  for _ in range(len(self.auth_managers)):
 
748
  }), 500
749
 
750
  def build_payload(request_data, model_id):
751
+ """构建请求有���负载,确保保持完���的上下文。"""
752
  messages = request_data.get('messages', [])
753
 
754
  # 检查是否已经存在系统消息
 
822
  while len(tried_accounts) < len(multi_auth_manager.auth_managers):
823
  auth_manager = multi_auth_manager.get_next_auth_manager(model_id)
824
  if not auth_manager:
 
 
 
825
  break
826
 
827
  # 如果这个账号已经尝试过,继续下一个
 
845
 
846
  if response.status_code == 200 and response.headers.get('Content-Type') == 'text/event-stream':
847
  logger.info(f"请求成功,使用账号 {auth_manager._email}")
848
+ # 更新最后成功使用的账号索引
849
+ current_index = multi_auth_manager.auth_managers.index(auth_manager)
850
+ multi_auth_manager.update_last_successful(current_index)
851
  return response
852
 
853
  headers_cache.clear()
 
883
  raise Exception("所有账号均不可用,且注册新账号失败")
884
 
885
  def health_check():
886
+ """改进的健康检查函数,每60秒只检查一个账号"""
887
  check_index = 0
888
+ last_check_date = datetime.now().date()
 
889
 
890
  while True:
891
  try:
892
  if multi_auth_manager:
 
893
  current_date = datetime.now().date()
894
 
895
+ # 如果是新的一天,重置检查索引
896
+ if current_date > last_check_date:
897
+ check_index = 0
898
+ last_check_date = current_date
899
+ logger.info("New day started, resetting health check index")
900
+ continue
901
+
902
+ # 只检查一个账号
903
+ if check_index < len(multi_auth_manager.auth_managers):
904
  auth_manager = multi_auth_manager.auth_managers[check_index]
905
+ email = auth_manager._email
906
 
907
  if auth_manager._should_attempt_auth():
908
  if not auth_manager.ensure_valid_token():
909
+ logger.warning(f"Auth token validation failed during health check for {email}")
910
  auth_manager.clear_auth()
911
  else:
912
+ logger.info(f"Health check passed for {email}")
913
+ else:
914
+ logger.info(f"Skipping health check for {email} due to rate limiting")
915
 
916
+ # 更新检查索引
917
  check_index = (check_index + 1) % len(multi_auth_manager.auth_managers)
918
+
919
+ # 在每天午夜重置所有账号的模型使用状态
920
+ current_time_local = time.localtime()
921
+ if current_time_local.tm_hour == 0 and current_time_local.tm_min == 0:
922
+ multi_auth_manager.reset_all_model_status()
923
+ logger.info("Reset model status for all accounts")
924
 
925
  except Exception as e:
926
  logger.error(f"Health check error: {e}")
927
 
928
+ sleep(60) # 每60秒检查一个账号
929
 
930
  # 为了兼容 Flask CLI 和 Gunicorn,修改启动逻辑
931
  if __name__ != "__main__":