Skip to content

v1.2.1 增加429的重试机制

Latest

Choose a tag to compare

@LIMTCYT LIMTCYT released this 21 Oct 11:40

v1.2.1 — 增加 429 重试机制

上游偶发返回 429(Endpoint is unavailable)会让 Trae 直接报错、中断任务。实测这类 429 基本都是上游网关的瞬时故障——前后请求都正常,中间夹一条两三秒就返回的 429。

本版本在代理层补齐自动重试,让这类瞬时错误对客户端完全透明。

自动重试

只要尚未向客户端吐出任何数据,就自动重发:

  • 覆盖 5xx,以及错误体含 Endpoint is unavailable 的 429
  • 上限 RETRY_ON_5XX_MAX,默认 10 次
  • 真正的限流类 429 与其他 4xx 不重试

同一故障在新旧路由上状态码不同:新路由 /inference/go/v1 报 503,老路由 /zen/go/v1 报 429,错误体一样。所以判断不只看状态码,还看错误体。

指数退避

429 不立即重试,按指数间隔递增,给服务端留恢复窗口:
4s → 8s → 16s → 32s → 64s → 64s ...

可用 RETRY_429_BACKOFFS 自定义。5xx 仍用 1 秒固定退避。退避期间不阻塞主循环,流式请求的心跳保活照常进行。

非流式请求的重试预算

心跳是 SSE 注释行,非流式请求(期望单个 JSON)用不了。因此改由 RETRY_BUDGET(默认 60 秒)兜底:累计等待超预算就放弃重试、原样透传真实状态码,不拖到客户端超时,也不白跑重试。

修复

  • 慢路径下已提前回 200 后不再重试的问题(心跳只是注释、不含内容,重试本应安全)。

其他

  • 控制台配色:响应状态码不是 200 的行整行标黄,一眼可见。

环境变量

变量 默认 说明
RETRY_ON_5XX_MAX 10 自动重试上限(次),0 关闭
RETRY_429_BACKOFFS 4,8,16,32,64 429 退避序列(秒)
RETRY_BUDGET 60 重试总时长预算(秒),仅非流式生效,0 不限

完整变更记录:CHANGELOG.md