按行读流式返回再 json.loads,第一行就抛 JSONDecodeError,原文是 data: {"id":"chatcmpl-8"。碰到这种情况,我一般先确认改动有没有真的生效。
原因不复杂,SSE 每行都带 data: 前缀,空行是分隔符,最后还有 data: [DONE]。按纯 JSON 解析第一行必然失败。
「流式响应解析」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。
python -c "print(open('stream.txt').readline().removeprefix('data: '))"
wc -l stream.txt
权限不要一口气开到最大,先加到够用再往上试,范围小才好收。把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。
改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。
具体做法是,按行读取 先去掉 data: 前缀再解析;跳过空行和 [DONE] 结束标记;单行解析失败记录原文继续读下一行;用真实响应存成文件做回归。
最后用这个标准收尾,解析脚本能跑完全部行 chunks 数量和日志一致 不再抛 JSONDecodeError。
