From 247f9e2165a7109b0a754ae946ff351e5034f1d5 Mon Sep 17 00:00:00 2001 From: hubian <908234780@qq.com> Date: Fri, 10 Apr 2026 01:51:36 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=AB=98=E4=BC=98?= =?UTF-8?q?=E5=85=88=E7=BA=A7=E6=8F=90=E4=BE=9B=E5=95=86=E5=A4=B1=E8=B4=A5?= =?UTF-8?q?=E6=97=B6=E8=87=AA=E5=8A=A8=E5=88=87=E6=8D=A2=E5=88=B0=E5=A4=87?= =?UTF-8?q?=E7=94=A8=E6=8F=90=E4=BE=9B=E5=95=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 任何非200响应(400、429、500等)都会触发切换 - 增加 exclude_providers 参数排除已尝试的提供商 - 避免重复尝试失败的提供商 - 添加切换日志便于调试 --- app.py | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/app.py b/app.py index a03dc32..0396292 100644 --- a/app.py +++ b/app.py @@ -177,10 +177,17 @@ def get_provider_for_model(model_name): return None, None -def get_available_provider_for_auto(auto_name='auto'): - """获取auto模式下的可用提供商(支持自定义auto配置)""" +def get_available_provider_for_auto(auto_name='auto', exclude_providers=None): + """获取auto模式下的可用提供商(支持自定义auto配置) + + Args: + auto_name: auto配置名称 + exclude_providers: 要排除的提供商名称列表(已尝试过的) + """ refresh_config() + exclude_providers = exclude_providers or [] + # 获取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: if not provider['enabled']: continue + if provider['name'] in exclude_providers: + continue if not provider_status.get(provider['name'], {}).get('available', True): continue @@ -448,26 +457,27 @@ def chat_completions(): increment_stats(model, provider['name'], success=True, tokens=request_tokens) return jsonify(result) - elif response.status_code == 429: - # 速率限制,尝试下一个提供商 - mark_provider_error(provider['name'], "Rate limit") + else: + # 任何非200响应都尝试下一个提供商 + 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']) # 尝试下一个提供商 - 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: + logger.info(f"Switching to next provider: {next_provider['name']}") provider = next_provider resolved_model = next_model request_provider = provider['name'] + time.sleep(RETRY_CONFIG['retry_delay']) 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)) - return jsonify(last_error), response.status_code + return jsonify(error_info), response.status_code except Exception as e: last_error = str(e) @@ -475,7 +485,7 @@ def chat_completions(): 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: provider = next_provider resolved_model = next_model