dan92 commited on
Commit
d889236
·
verified ·
1 Parent(s): fe84018

Upload app.py

Browse files
Files changed (1) hide show
  1. app.py +35 -23
app.py CHANGED
@@ -311,41 +311,56 @@ class MultiAuthManager:
311
  self._rotation_interval = 300 # 5分钟轮转间隔
312
  self.last_successful_index = 0 # 记录上次成功的账号索引
313
  self.last_success_date = datetime.now().date() # 记录上次成功的日期
 
314
 
315
  def ensure_valid_token(self, model):
316
- """改进的token验证方法,优先使用上次成功的账号"""
317
- # 首先尝试使用上次成功的账号
318
- auth_manager = self.auth_managers[self.last_successful_index]
319
- if auth_manager.is_model_available(model) and auth_manager.ensure_valid_token():
320
- return auth_manager
321
-
322
- # 如果上次成功的账号不可用,才尝试其他账号
323
- start_index = (self.last_successful_index + 1) % len(self.auth_managers)
324
- current = start_index
 
 
325
 
326
- while current != self.last_successful_index:
327
- auth_manager = self.auth_managers[current]
328
  if auth_manager.is_model_available(model) and auth_manager.ensure_valid_token():
329
- self.last_successful_index = current # 更新最后成功的账号索引
330
- self.last_success_date = datetime.now().date()
331
  return auth_manager
332
- current = (current + 1) % len(self.auth_managers)
333
 
334
- # 如果所有账号都不可用,检查是否是新的一天
 
 
 
335
  if datetime.now().date() > self.last_success_date:
336
  self.reset_all_model_status()
337
  self.last_success_date = datetime.now().date()
 
 
338
  # 重新尝试第一个账号
339
  auth_manager = self.auth_managers[0]
340
  if auth_manager.ensure_valid_token():
341
- self.last_successful_index = 0
 
342
  return auth_manager
343
 
344
  return None
345
 
 
 
 
 
 
346
  def reset_all_model_status(self):
 
347
  for auth_manager in self.auth_managers:
348
  auth_manager.reset_model_status()
 
349
 
350
  def require_auth(func: Callable) -> Callable:
351
  """装饰器,确保在调用API之前有有效的token。"""
@@ -552,7 +567,7 @@ def handle_non_stream_response(response, model, prompt_tokens):
552
  raise
553
 
554
  def generate_stream_response(response, model, prompt_tokens):
555
- """生��流式 HTTP 响应。"""
556
  total_completion_tokens = 0
557
 
558
  for chunk in stream_notdiamond_response(response, model):
@@ -774,7 +789,7 @@ def build_payload(request_data, model_id):
774
  return payload
775
 
776
  def make_request(payload, auth_manager, model_id):
777
- """发送请求并处理可能的认证刷新和模型特定错误。"""
778
  global multi_auth_manager
779
  max_retries = 3
780
  retry_delay = 1
@@ -799,12 +814,10 @@ def make_request(payload, auth_manager, model_id):
799
  tried_accounts = set()
800
 
801
  while len(tried_accounts) < len(multi_auth_manager.auth_managers):
802
- # 使用 ensure_valid_token 替代 get_next_auth_manager
803
  auth_manager = multi_auth_manager.ensure_valid_token(model_id)
804
  if not auth_manager:
805
  break
806
 
807
- # 如果这个账号已经尝试过,继续下一个
808
  if auth_manager._email in tried_accounts:
809
  continue
810
 
@@ -816,7 +829,6 @@ def make_request(payload, auth_manager, model_id):
816
  url = get_notdiamond_url()
817
  headers = get_notdiamond_headers(auth_manager)
818
 
819
- # 使用超时参数
820
  response = executor.submit(
821
  requests.post,
822
  url,
@@ -829,8 +841,8 @@ def make_request(payload, auth_manager, model_id):
829
  if response.status_code == 200 and response.headers.get('Content-Type') == 'text/event-stream':
830
  logger.info(f"请求成功,使用账号 {auth_manager._email}")
831
  current_index = multi_auth_manager.auth_managers.index(auth_manager)
832
- multi_auth_manager.last_successful_index = current_index # 直接更新索引
833
- multi_auth_manager.last_success_date = datetime.now().date() # 更新日期
834
  return response
835
 
836
  headers_cache.clear()
 
311
  self._rotation_interval = 300 # 5分钟轮转间隔
312
  self.last_successful_index = 0 # 记录上次成功的账号索引
313
  self.last_success_date = datetime.now().date() # 记录上次成功的日期
314
+ self.model_usage = {} # 记录每个模型最后使用的成功账号
315
 
316
  def ensure_valid_token(self, model):
317
+ """改进的token验证方法,优先使用上次成功的模型特定账号"""
318
+ # 首先尝试使用该模型上次成功的账号
319
+ if model in self.model_usage:
320
+ last_index = self.model_usage[model]
321
+ auth_manager = self.auth_managers[last_index]
322
+ if auth_manager.is_model_available(model) and auth_manager.ensure_valid_token():
323
+ return auth_manager
324
+
325
+ # 如果该模型没有成功记录或上次的账号不可用,从当前位置开始尝试
326
+ start_index = self.current_index
327
+ tried_count = 0
328
 
329
+ while tried_count < len(self.auth_managers):
330
+ auth_manager = self.auth_managers[self.current_index]
331
  if auth_manager.is_model_available(model) and auth_manager.ensure_valid_token():
332
+ # 更新该模型的成功账号记录
333
+ self.model_usage[model] = self.current_index
334
  return auth_manager
 
335
 
336
+ self.current_index = (self.current_index + 1) % len(self.auth_managers)
337
+ tried_count += 1
338
+
339
+ # 如果是新的一天,重置所有状态
340
  if datetime.now().date() > self.last_success_date:
341
  self.reset_all_model_status()
342
  self.last_success_date = datetime.now().date()
343
+ self.model_usage.clear() # 清除所有模型的使用记录
344
+
345
  # 重新尝试第一个账号
346
  auth_manager = self.auth_managers[0]
347
  if auth_manager.ensure_valid_token():
348
+ self.current_index = 0
349
+ self.model_usage[model] = 0
350
  return auth_manager
351
 
352
  return None
353
 
354
+ def update_model_success(self, model, index):
355
+ """更新模型成功使用的账号索引"""
356
+ self.model_usage[model] = index
357
+ self.last_success_date = datetime.now().date()
358
+
359
  def reset_all_model_status(self):
360
+ """重置所有账号的状态和模型使用记录"""
361
  for auth_manager in self.auth_managers:
362
  auth_manager.reset_model_status()
363
+ self.model_usage.clear()
364
 
365
  def require_auth(func: Callable) -> Callable:
366
  """装饰器,确保在调用API之前有有效的token。"""
 
567
  raise
568
 
569
  def generate_stream_response(response, model, prompt_tokens):
570
+ """生流式 HTTP 响应。"""
571
  total_completion_tokens = 0
572
 
573
  for chunk in stream_notdiamond_response(response, model):
 
789
  return payload
790
 
791
  def make_request(payload, auth_manager, model_id):
792
+ """改进的请求处理,添加超时控制"""
793
  global multi_auth_manager
794
  max_retries = 3
795
  retry_delay = 1
 
814
  tried_accounts = set()
815
 
816
  while len(tried_accounts) < len(multi_auth_manager.auth_managers):
 
817
  auth_manager = multi_auth_manager.ensure_valid_token(model_id)
818
  if not auth_manager:
819
  break
820
 
 
821
  if auth_manager._email in tried_accounts:
822
  continue
823
 
 
829
  url = get_notdiamond_url()
830
  headers = get_notdiamond_headers(auth_manager)
831
 
 
832
  response = executor.submit(
833
  requests.post,
834
  url,
 
841
  if response.status_code == 200 and response.headers.get('Content-Type') == 'text/event-stream':
842
  logger.info(f"请求成功,使用账号 {auth_manager._email}")
843
  current_index = multi_auth_manager.auth_managers.index(auth_manager)
844
+ # 更新模型特定的成功记录
845
+ multi_auth_manager.update_model_success(model_id, current_index)
846
  return response
847
 
848
  headers_cache.clear()