v2.8.0 清空历史真正物理删除 + 请求超时可配修复慢接口被掐断
1. 清空历史=真正清空(不再只是删行留痕): - 清空前先停止所有运行中测试线程,避免其继续写入孤儿数据 - DELETE 后重置自增序列(sqlite_sequence),新测试 ID 从 1 开始 - WAL checkpoint(TRUNCATE) + VACUUM 物理回收文件空间,数据不可恢复 - 单条删除删光时同样重置自增序列 2. 慢接口被掐断修复(预处理/首字耗时过长 Read timed out): - 读取超时默认 300s→1800s(30分钟),连接 60s - 「速度测试配置」新增 请求超时(秒) 输入框(默认1800),测试连接+速度采样共用,按次可调(如3600) - 超时错误改为友好提示:等待响应超时(超过N秒未收到数据),引导调大请求超时,不再裸抛 Read timed out - 测试启动日志打印当前超时配置 - 修复案例: 18008 Qwen3.8-FP8 131072 长上下文预填充被 300s 掐断
This commit is contained in:
+39
-3
@@ -116,7 +116,7 @@ def stream_openai(cfg, prompt, gen, log, should_stop=None):
|
||||
if should_stop and should_stop():
|
||||
raise StopRequested()
|
||||
resp = requests.post(url, json=build_payload(), headers=headers, stream=True,
|
||||
timeout=(config.CONNECT_TIMEOUT, config.STREAM_READ_TIMEOUT))
|
||||
timeout=_timeouts(gen))
|
||||
if resp.status_code == 200:
|
||||
break
|
||||
err = resp.text[:400]
|
||||
@@ -152,6 +152,10 @@ def stream_openai(cfg, prompt, gen, log, should_stop=None):
|
||||
cached_tokens = details.get("cached_tokens") or 0
|
||||
except StopRequested:
|
||||
raise
|
||||
except requests.exceptions.ReadTimeout:
|
||||
raise ProviderError(_read_timeout_err(gen))
|
||||
except requests.exceptions.ConnectTimeout:
|
||||
raise ProviderError(_connect_timeout_err(gen))
|
||||
except Exception as e:
|
||||
raise ProviderError("流式请求异常: %s" % e)
|
||||
finally:
|
||||
@@ -171,6 +175,30 @@ def _bad_stream_options(err: str):
|
||||
or "additional properties" in err)
|
||||
|
||||
|
||||
def _timeouts(gen):
|
||||
"""从测试参数 gen 里取超时配置(秒),未配置则用全局默认。
|
||||
返回 (connect, read) 元组,供 requests timeout 使用。"""
|
||||
try:
|
||||
connect = float(gen.get("connect_timeout") or config.CONNECT_TIMEOUT)
|
||||
except (TypeError, ValueError):
|
||||
connect = config.CONNECT_TIMEOUT
|
||||
try:
|
||||
read = float(gen.get("read_timeout") or config.STREAM_READ_TIMEOUT)
|
||||
except (TypeError, ValueError):
|
||||
read = config.STREAM_READ_TIMEOUT
|
||||
return (max(connect, 5), max(read, 10))
|
||||
|
||||
|
||||
def _read_timeout_err(gen):
|
||||
"""读超时的友好报错:提示这是等待数据超时,可调大请求超时"""
|
||||
return ("等待响应超时:超过 %.0f 秒未收到数据(接口预处理/首字耗时过长或网络过慢),"
|
||||
"请在「速度测试配置」中调大“请求超时(秒)”" % _timeouts(gen)[1])
|
||||
|
||||
|
||||
def _connect_timeout_err(gen):
|
||||
return "连接超时:超过 %.0f 秒未建立连接(请检查地址/网络)" % _timeouts(gen)[0]
|
||||
|
||||
|
||||
def _iter_json(resp):
|
||||
"""解析 SSE data: 行,逐个返回 JSON 对象"""
|
||||
for raw in resp.iter_lines(decode_unicode=True):
|
||||
@@ -206,7 +234,7 @@ def stream_anthropic(cfg, prompt, gen, log, should_stop=None):
|
||||
if should_stop and should_stop():
|
||||
raise StopRequested()
|
||||
resp = requests.post(url, json=payload, headers=headers, stream=True,
|
||||
timeout=(config.CONNECT_TIMEOUT, config.STREAM_READ_TIMEOUT))
|
||||
timeout=_timeouts(gen))
|
||||
if resp.status_code != 200:
|
||||
err = resp.text[:400]
|
||||
resp.close()
|
||||
@@ -233,6 +261,10 @@ def stream_anthropic(cfg, prompt, gen, log, should_stop=None):
|
||||
output_tokens = usage.get("output_tokens") or output_tokens
|
||||
except StopRequested:
|
||||
raise
|
||||
except requests.exceptions.ReadTimeout:
|
||||
raise ProviderError(_read_timeout_err(gen))
|
||||
except requests.exceptions.ConnectTimeout:
|
||||
raise ProviderError(_connect_timeout_err(gen))
|
||||
except Exception as e:
|
||||
raise ProviderError("流式请求异常: %s" % e)
|
||||
finally:
|
||||
@@ -272,7 +304,7 @@ def stream_google(cfg, prompt, gen, log, should_stop=None):
|
||||
if should_stop and should_stop():
|
||||
raise StopRequested()
|
||||
resp = requests.post(url, params=params, json=payload, headers=headers, stream=True,
|
||||
timeout=(config.CONNECT_TIMEOUT, config.STREAM_READ_TIMEOUT))
|
||||
timeout=_timeouts(gen))
|
||||
if resp.status_code != 200:
|
||||
err = resp.text[:400]
|
||||
resp.close()
|
||||
@@ -299,6 +331,10 @@ def stream_google(cfg, prompt, gen, log, should_stop=None):
|
||||
cached_tokens = um.get("cachedContentTokenCount") or 0
|
||||
except StopRequested:
|
||||
raise
|
||||
except requests.exceptions.ReadTimeout:
|
||||
raise ProviderError(_read_timeout_err(gen))
|
||||
except requests.exceptions.ConnectTimeout:
|
||||
raise ProviderError(_connect_timeout_err(gen))
|
||||
except Exception as e:
|
||||
raise ProviderError("流式请求异常: %s" % e)
|
||||
finally:
|
||||
|
||||
Reference in New Issue
Block a user