记录一下那天晚上的排查过程。把 Text Generation WebUI 当 OpenAI 兼容服务用,SDK 指向 /v1,非流式能通,开 stream 后解析报错,返回的行里没有 data: 前缀,finish_reason 也取不到。

刚开始盯着「请求里没带 stream_options,usage 缺失」,折腾了半个多小时,排掉了。

原因不止一个,得分开看。该服务的流式接口是自定义格式,不是标准 SSE。少数情况下是兼容层版本较旧,只实现了非流式。

另外,反向代理开了压缩,多行被合并成一块。

直接抓原始流看行格式

curl -N http://127.0.0.1:5000/v1/chat/completions -d @stream_req.json | head -5

再往下改用它的原生流式接口

curl -N http://127.0.0.1:5000/api/v1/chat/stream -d @native_req.json

接着在中间加一层协议转换

python proxy_sse.py --upstream native --listen 8000

等前面都确认过,再用 SDK 复测确认可用

python smoke_stream.py --base-url http://127.0.0.1:8000/v1

我习惯把每一步的执行时间和结果记在一边,后面复盘省事。

别只看报错消失,验证要多做一步。SDK 能逐块收到 delta,usage 与 finish_reason 正确,前端不再报解析错误。

补一句。自称兼容 OpenAI 的服务通常只兼容非流式,上线前一定用流式请求验一遍。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189