Querystring drops explicit empty-string scalar values

当你在 OpenAI Python SDK 的查询字符串序列化中传入显式空字符串标量(如 {"filter": ""} ),旧版本会把该值当作“无值”丢弃,导致查询参数整体消失。排查时应优先确认 SDK 版本,并区分 None 与空字符串的序列化语义。

快速结论:当你在 OpenAI Python SDK 的查询字符串序列化中传入显式空字符串标量(如 {"filter": ""}),旧版本会把该值当作“无值”丢弃,导致查询参数整体消失。排查时应优先确认 SDK 版本,并区分 None 与空字符串的序列化语义。

适用环境:Issue 已确认涉及 OpenAI Python SDK 的 querystring 序列化逻辑,影响同步与异步 SDK 请求路径;Issue 中未给出操作系统、Python 版本、CUDA、显卡或具体依赖版本信息。

最快修复方案:将 OpenAI Python SDK 升级到 v3.29.0 或更高版本(修复来自 PR #4047),显式空字符串查询值即可被保留,None 仍会被忽略。

注意事项:修复版本以 Issue 中维护者确认为准;升级后需同时验证同步和异步调用路径。Issue 未说明 v3.29.0 之前的全部受影响版本范围,也未给出降级或手工覆盖序列化逻辑的官方方案。

问题场景

用户使用 OpenAI Python SDK 发起带查询参数的请求时,通过 Querystring.stringify() 序列化查询字符串。当标量参数的值为显式空字符串,例如 {"filter": ""},期望得到 filter=,但实际输出为空字符串,查询参数被整体丢弃。该问题在数组格式下表现不一致:逗号序列化可能保留空字符串元素。

报错原文

Querystring drops explicit empty-string scalar values

stringify({"filter": ""}) == ""  # current behavior

原因分析

Querystring.stringify() 内部的 _stringify_item() 使用真值判断检查序列化后的值。空字符串在 Python 中为假值,因此被当作“无值”跳过,并与 None 的忽略行为混为一谈。但在 URL 查询语义中,filter= 与完全不出现 filter 参数并不等价,所以这属于序列化逻辑缺陷。该行为在不同数组序列化格式之间也不一致。

环境排查

  • 确认当前安装的 OpenAI Python SDK 版本,重点判断是否低于 v3.29.0。
  • 确认问题出现在同步请求还是异步请求路径,Issue 中两者均被验证。
  • 检查触发请求的查询参数中是否存在显式空字符串标量。
  • 确认调用方是否依赖省略参数与空值参数之间的语义差异。

解决步骤

  1. 查看当前 OpenAI Python SDK 版本,确认是否为 v3.29.0 之前的版本。
  2. 将 OpenAI Python SDK 升级到 v3.29.0 或更高版本;该修复由 PR #4047 合入并在 v3.29.0 发布。
  3. 对产生查询字符串的调用进行回归验证,分别覆盖显式空字符串和 None 两种取值。
  4. 同时验证同步与异步 SDK 请求路径,确认两者都保留空字符串查询值。

验证方法

构造查询参数 {"filter": ""} 进行序列化或发起实际请求,确认结果中保留 filter=;再传入 None,确认该参数仍被省略。Issue 中维护者已确认 v3.29.0 下同步与异步路径均表现正确。

参考来源

openai/openai-python #3837

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 30276

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注