v2.1.6 · 重复推理循环先截断再自动重试
修复:重复推理循环改为「先截断、再自动重试」
此前 DeepSeek 陷入重复短行推理循环时,网关直接中止请求并返回 upstream_reasoning_loop。用户在思考中途看到回合失败,只能自己重发。
循环是模型行为、不是账号故障,同一个账号再问一次通常就能拿到干净的一轮。现在命中保护后,网关会先在同一账号上重发一次,用户只会看到第二次的成功输出。
- 重发只在客户端还没收到任何字节时进行。流式请求在「只有推理、还没有正文/拒绝/工具进展」的阶段把帧压在内存里,命中时整段丢弃;一旦出现正文、拒绝或工具进展就立即放行,此后命中只能照旧回报错误,因为写出去的收不回。
- 压制有上限:推理累计到 12000 字符、或缓冲达到 256 KiB 时立即放行,正常长推理不会因为保护而延迟显示。
- 被丢弃的那一轮确实已经生成并计费,用量照实累计,并把该请求标记为「用量未完整返回」,不伪装成完整账单。
- 重发没能建立(上游连接失败或直接报错)时,失败会如实写回客户端,回合不会静默结束。
- 非流式请求同样重发一次,客户端在读完前本来也是零字节。
重发固定落在同一账号,不换号、不冷却、不解除已有会话粘性。重发一次后仍循环、或客户端已收到内容时,行为与之前一致:非流式 Chat 与 Responses 返回 422,已开始的流式请求保留 200 并以错误事件收尾。
部署
网关镜像随本 tag 发布,标签 v2.1.6 与 latest 都已推送。线上用热更新完成切换(新进程先接管监听、旧进程把在途请求跑完再退出),当前对话未中断。
cd /opt/workbuddy2api
sudo docker compose pull wb2api
sudo docker compose up -d wb2api已知边界
- 重发上限是一次。持续循环时仍会如实报错,不会无限重试。
- 客户端已经收到正文后命中循环,无法再重发,只能按原有方式报错。
- 保护本身仍是启发式:合法的重复短行可能误报,无换行的循环不在覆盖范围内,业务需要大量重复短行时可关闭对应密钥的开关。