Spaces:
Paused
Paused
Upload app.py
Browse files
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 |
-
|
| 319 |
-
|
| 320 |
-
|
| 321 |
-
|
| 322 |
-
|
| 323 |
-
|
| 324 |
-
|
|
|
|
|
|
|
| 325 |
|
| 326 |
-
while
|
| 327 |
-
auth_manager = self.auth_managers[
|
| 328 |
if auth_manager.is_model_available(model) and auth_manager.ensure_valid_token():
|
| 329 |
-
|
| 330 |
-
self.
|
| 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.
|
|
|
|
| 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 |
-
"""
|
| 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 |
-
|
| 833 |
-
multi_auth_manager.
|
| 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()
|