快速结论:当你在 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 中两者均被验证。
- 检查触发请求的查询参数中是否存在显式空字符串标量。
- 确认调用方是否依赖省略参数与空值参数之间的语义差异。
解决步骤
- 查看当前 OpenAI Python SDK 版本,确认是否为 v3.29.0 之前的版本。
- 将 OpenAI Python SDK 升级到 v3.29.0 或更高版本;该修复由 PR #4047 合入并在 v3.29.0 发布。
- 对产生查询字符串的调用进行回归验证,分别覆盖显式空字符串和
None两种取值。 - 同时验证同步与异步 SDK 请求路径,确认两者都保留空字符串查询值。
验证方法
构造查询参数 {"filter": ""} 进行序列化或发起实际请求,确认结果中保留 filter=;再传入 None,确认该参数仍被省略。Issue 中维护者已确认 v3.29.0 下同步与异步路径均表现正确。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。
![[Question]: Variable settings in input does not work in agent](https://www.chat-gpts.plus/wp-content/uploads/2026/10/12458-7a832cbd-768x403.jpg)
![[Question]: After adding the S3 data source, the logs show that it's always on the schedule, even after waiting for half an hour](https://www.chat-gpts.plus/wp-content/uploads/2026/10/11617-71722f09-768x403.jpg)
![[Question]: Fail to load the LLM via vllm](https://www.chat-gpts.plus/wp-content/uploads/2026/10/9856-3287f960-768x403.jpg)