or malformed SSE response). 模型服务调用未成功。常见原因:API Key 失效或不在模型权限范围、网络/服务不可达。请到 设置 → ...
错误信息
API call failed after 3 retries: Provider returned an empty stream with no finish_reason (possible upstream error or malformed SSE response).
模型服务调用未成功。常见原因:API Key 失效或不在模型权限范围、网络/服务不可达。请到 设置 → 模型 检查后重试。
AI 解决方案
🔍 报错分析
1. 🌐 错误翻译
原文:API call failed after 3 retries: Provider returned an empty stream with no finish_reason (possible upstream error or malformed SSE response).
译文:API 调用在3次重试后失败:提供方返回了一个空的流,且没有 finish_reason(可能是上游错误或格式错误的 SSE 响应)。
2. 🎯 原因分析
3. 💡 解决方案
- 检查API Key状态:首先按照附带信息的建议,到
设置 → 模型中检查当前使用的 API Key 是否有效、是否具备目标模型的访问权限。若发现异常,请立即更新为正确的 Key。 - 排查网络环境:确保你的网络连接稳定,没有防火墙或代理阻止对API域名的访问。
- 执行代码重试:在代码中增加指数退避重试机制,对于暂时性的网络或服务波动,通过重试有很大概率可以恢复。以下是基于指数退避的Python代码示例:
import time
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
def make_api_call_with_retry(api_url, api_key, max_retries=5):
"""
带指数退避策略的API调用函数
"""
session = requests.Session()
# 配置重试策略:对网络错误和5xx状态码进行重试
retry_strategy = Retry(
total=max_retries,
backoff_factor=1, # 指数退避因子,重试间隔为 1, 2, 4, 8, 16 秒
status_forcelist=[429, 500, 502, 503, 504],
allowed_methods=["POST"]
)
adapter = HTTPAdapter(max_retries=retry_strategy)
session.mount("http://", adapter)
session.mount("https://", adapter)
headers = {"Authorization": f"Bearer {api_key}"}
for i in range(max_retries + 1):
try:
response = session.post(api_url, headers=headers, stream=True)
# 确保响应状态码正常
response.raise_for_status()
# 检查流是否为空
content = b"".join(response.iter_content(chunk_size=0))
if not content:
raise Exception("Empty stream received from provider")
# 如果成功,处理响应并返回
return content
except (requests.exceptions.RequestException, Exception) as e:
# 在最终重试时仍然失败,抛出异常
if i == max_retries:
raise Exception(f"API call failed after {max_retries} retries: {e}")
# 非最终重试,打印日志并等待
wait_time = (2 ** i) # 指数退避:1, 2, 4, 8...
print(f"Attempt {i+1} failed: {e}. Retrying in {wait_time} seconds...")
time.sleep(wait_time)
# 使用示例
# api_url = "https://api.yourprovider.com/v1/chat/completions"
# api_key = "your-api-key"
# try:
# result = make_api_call_with_retry(api_url, api_key)
# print("API call succeeded!")
# except Exception as e:
# print(f"Final failure: {e}")