执行摘要
文档化 reasoning_content 输出移除的客户端破坏性变更
reasoning_content 先被重命名为 reasoning(RFC #27755、PR #27752),随后在 PR #33402 中从输出侧完全移除;但输入侧仍通过 PR #42664 接受 reasoning_content 并规范化为 reasoning。PR body 指出,现有文档的一行警告("To migrate, directly replace reasoning_content with reasoning")低估了影响:读取 delta.reasoning_content 的客户端会静默得到 None,思维链在无任何报错的情况下丢失。作者用实弹数据证明输出侧 0 个 chunk 携带 reasoning_content,并以 tulip-agents(开源 agent 框架)踩坑为例,说明需要把这种不对称性作为破坏性变更显性化。
值得快速阅读(约 5 分钟)。它展示了 API 演进中输入/输出不对称导致兼容性坑的真实案例,以及维护者对“文档该写多详细”的取舍——轻量合入、详细背景留 PR body。对负责 OpenAI 兼容层和维护推理输出的工程师,建议关注 getattr 替代 hasattr 的技术细节(pydantic extra field 陷阱),它在其他未声明字段的场景同样适用。
hmellor 作为 maintainer 提出 4 条 suggestion,核心交锋围绕“这份 breaking change 提示应该写多详细”:
- 用 getattr 而非 hasattr:hmellor 指出 OpenAI SDK 把
reasoning存在 pydantic 的 extra-field storage 中,直接访问delta.reasoning在字段缺失的 chunk(如首个仅含 role 的 chunk)上会抛AttributeError,建议用getattr并补充详细解释。该建议的核心技术细节被采纳,但最终合入的是简短措辞版本,AttributeError场景的详细说明未进入最终文档。 - 建议新增“Client compatibility”小节:hmellor 给出了完整的输入/输出不对称表格和双字段名读取示例文案,主张把静默破坏性变更写得更清楚;最终未合入最终 diff,仅以 warning 内一行提示形式呈现,说明维护者倾向轻量表达,详细背景留给 PR body。
- warning 措辞补充:hmellor 建议在 warning 中明确“必须同时更新客户端代码,否则会静默读到空的
reasoning_content”,已被采纳并成为最终合并的新增行。
参与讨论