Skip to content

增加ttft和测速,以及自动重请求防止长任务中断机制

Choose a tag to compare

@LIMTCYT LIMTCYT released this 21 Oct 06:29
· 3 commits to main since this release

v1.2.0 — 增加 TTFT 与测速,以及自动重请求防止长任务中断机制

TTFT 与测速

  • 每次请求输出一行 [ttft] 日志:首字延迟、总耗时、输出 token 数、tok/s。这样能分清是"上游不出首字"还是"出字慢",两者处理方式完全不同。
  • 新增只读接口 GET /stats:返回最近 200 条样本的整体与按模型统计(avg / p50 / p95 / min / max / errors)。p95 比平均值更能反映偶发卡死的真实频率。

自动重请求,防止长任务被上游拖死

上游迟迟不响应时,代理按下面的节奏兜底:

  • 30 秒:先回 200 + SSE,之后每 10 秒发一个心跳,让客户端不要自己超时。
  • 60 秒:另开一条连接把同一请求重发一次,谁先回数据用谁。
  • 120 秒:一直静默的连接判定失败。
  • 30 分钟:一直没有内容产出就主动终止,不再扣 token。

边界说明:重发只在还没向客户端吐过数据之前有效——流式过程中断了无法自动续上,否则会产生重复内容;且重发最多 1 次,不会无限重试。

其他调整

  • UPSTREAM_TIMEOUT 改为可配置,默认 120 秒(原固定 600 秒)。
  • 超时改为立即返回 504 并给出明确错误,不再干等;流式中断会下发 SSE error 事件,而不是静默截断。

环境变量

变量 默认 说明
UPSTREAM_TIMEOUT 120 单条上游连接的静默上限(秒)
HEARTBEAT_AFTER 30 多久后开始发心跳(秒,仅流式请求)
RETRY_AFTER 60 多久后重发一次(秒)
HEARTBEAT_INTERVAL 10 心跳间隔(秒)
CONTENT_IDLE_TIMEOUT 1800 多久没有内容产出就终止(秒,0 关闭)
STATS_WINDOW 200 /stats 聚合的样本窗口

无需第三方依赖,Python 3.6+ 直接运行。升级后如遇长任务被兜底中断,调大 CONTENT_IDLE_TIMEOUT 或设为 0。完整变更见 CHANGELOG.md 。