Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 247f9e2165 |
36
app.py
36
app.py
@@ -177,10 +177,17 @@ def get_provider_for_model(model_name):
|
|||||||
return None, None
|
return None, None
|
||||||
|
|
||||||
|
|
||||||
def get_available_provider_for_auto(auto_name='auto'):
|
def get_available_provider_for_auto(auto_name='auto', exclude_providers=None):
|
||||||
"""获取auto模式下的可用提供商(支持自定义auto配置)"""
|
"""获取auto模式下的可用提供商(支持自定义auto配置)
|
||||||
|
|
||||||
|
Args:
|
||||||
|
auto_name: auto配置名称
|
||||||
|
exclude_providers: 要排除的提供商名称列表(已尝试过的)
|
||||||
|
"""
|
||||||
refresh_config()
|
refresh_config()
|
||||||
|
|
||||||
|
exclude_providers = exclude_providers or []
|
||||||
|
|
||||||
# 获取auto配置
|
# 获取auto配置
|
||||||
profile = _cached_auto_profiles.get(auto_name, _cached_auto_profiles.get('auto', {}))
|
profile = _cached_auto_profiles.get(auto_name, _cached_auto_profiles.get('auto', {}))
|
||||||
|
|
||||||
@@ -194,6 +201,8 @@ def get_available_provider_for_auto(auto_name='auto'):
|
|||||||
for provider in sorted_providers:
|
for provider in sorted_providers:
|
||||||
if not provider['enabled']:
|
if not provider['enabled']:
|
||||||
continue
|
continue
|
||||||
|
if provider['name'] in exclude_providers:
|
||||||
|
continue
|
||||||
if not provider_status.get(provider['name'], {}).get('available', True):
|
if not provider_status.get(provider['name'], {}).get('available', True):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
@@ -448,26 +457,27 @@ def chat_completions():
|
|||||||
increment_stats(model, provider['name'], success=True, tokens=request_tokens)
|
increment_stats(model, provider['name'], success=True, tokens=request_tokens)
|
||||||
return jsonify(result)
|
return jsonify(result)
|
||||||
|
|
||||||
elif response.status_code == 429:
|
else:
|
||||||
# 速率限制,尝试下一个提供商
|
# 任何非200响应都尝试下一个提供商
|
||||||
mark_provider_error(provider['name'], "Rate limit")
|
error_info = response.json() if response.headers.get('content-type', '').startswith('application/json') else {"error": response.text}
|
||||||
|
last_error = error_info
|
||||||
|
logger.warning(f"Provider {provider['name']} returned {response.status_code}: {error_info}")
|
||||||
|
mark_provider_error(provider['name'], f"HTTP {response.status_code}")
|
||||||
tried_providers.append(provider['name'])
|
tried_providers.append(provider['name'])
|
||||||
|
|
||||||
# 尝试下一个提供商
|
# 尝试下一个提供商
|
||||||
next_provider, next_model = get_available_provider_for_auto('auto')
|
next_provider, next_model = get_available_provider_for_auto('auto', exclude_providers=tried_providers)
|
||||||
if next_provider and next_provider['name'] not in tried_providers:
|
if next_provider and next_provider['name'] not in tried_providers:
|
||||||
|
logger.info(f"Switching to next provider: {next_provider['name']}")
|
||||||
provider = next_provider
|
provider = next_provider
|
||||||
resolved_model = next_model
|
resolved_model = next_model
|
||||||
request_provider = provider['name']
|
request_provider = provider['name']
|
||||||
|
time.sleep(RETRY_CONFIG['retry_delay'])
|
||||||
continue
|
continue
|
||||||
|
|
||||||
increment_stats(model, provider['name'], success=False, error='Rate limit')
|
# 所有提供商都尝试过了,返回最后一个错误
|
||||||
return jsonify(response.json()), response.status_code
|
|
||||||
|
|
||||||
else:
|
|
||||||
last_error = response.json() if response.headers.get('content-type', '').startswith('application/json') else {"error": response.text}
|
|
||||||
increment_stats(model, provider['name'], success=False, error=str(last_error))
|
increment_stats(model, provider['name'], success=False, error=str(last_error))
|
||||||
return jsonify(last_error), response.status_code
|
return jsonify(error_info), response.status_code
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
last_error = str(e)
|
last_error = str(e)
|
||||||
@@ -475,7 +485,7 @@ def chat_completions():
|
|||||||
tried_providers.append(provider['name'])
|
tried_providers.append(provider['name'])
|
||||||
|
|
||||||
# 尝试下一个提供商
|
# 尝试下一个提供商
|
||||||
next_provider, next_model = get_available_provider_for_auto('auto')
|
next_provider, next_model = get_available_provider_for_auto('auto', exclude_providers=tried_providers)
|
||||||
if next_provider and next_provider['name'] not in tried_providers:
|
if next_provider and next_provider['name'] not in tried_providers:
|
||||||
provider = next_provider
|
provider = next_provider
|
||||||
resolved_model = next_model
|
resolved_model = next_model
|
||||||
|
|||||||
Reference in New Issue
Block a user