流式解析里写 text += chunk.choices[0].delta.content,遇到首块只有 role 或工具调用块时 content 为 null,Python 抛 TypeError,前端回答里还混进了 None 字样。

把日志和配置对完,能解释这个现象的基本就这几处。首块的 delta 只有 role,content 为 null;工具调用块的 delta 里只有 tool_calls;个别网关会把空 delta 也发出来;没做类型判断就直接做字符串拼接。

上来先打印首块结构确认字段

python stream_dump.py --first-block

拼接前判空并区分工具分支

python stream_parse.py --safe

随后用 getattr 兜底避免属性不存在

python -c "d={'role':'assistant'};print(getattr(type('X',(),d)(),'content',None))"

等前面都确认过,再用带工具的请求验证两种块都覆盖

python stream_test.py --with-tools

改之前我把相关日志按时间截了一段存着,事后对时间线用得上。

中途换过一次思路,把范围缩到最小的那一层,反而快了。

恢复的判定其实很直接。首块与工具块都不再抛异常,文本内容里不出现 None,工具调用参数能完整拼出来。

流式响应的每个块字段都是可选的,把 delta 当固定结构用,迟早会在工具调用或空块上出事。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。

作者 9823189