快速结论:在 Celery 任务中调用 OpenAI Python SDK 时,如果 SoftTimeLimitExceeded 恰好发生在 API 请求过程中,会被 SDK 内部的宽泛 except Exception 捕获并当作可重试的连接错误处理,导致任务的清理逻辑收不到异常。优先确认发生在请求期间的异常类型,并检查 SDK 重试逻辑是否会吞掉应用级异常。
适用环境:Linux;Python v3.11;openai v2.7.1;Celery soft time limit 场景;涉及 openai-python/src/openai/_base_client.py 中的重试逻辑。
最快修复方案:Issue 中评论提到已有修复 PR(#2956、#3867),将重试捕获范围从 except Exception 收窄为捕获网络相关异常,例如 except (httpx.TransportError, OSError),使 Celery 的 SoftTimeLimitExceeded 立即向上抛出而不被重试。该修复以官方合并版本为准;如果你无法立即升级,暂无确认的一步修复方案。
注意事项:修复依赖 SDK 版本更新,需确认安装版本已包含对应改动;收窄异常捕获可能影响非网络类临时错误的既有重试行为,升级后应观察正常请求的重试表现是否变化。
问题场景
用户在 Celery 任务中使用 OpenAI Python SDK 请求 API,并设置了较短的 soft time limit(例如 5–10 秒)。任务中编写了针对 SoftTimeLimitExceeded 的清理或优雅退出逻辑,但当 soft time limit 在 OpenAI API 请求进行期间触发时,清理逻辑没有被执行。
报错原文
OpenAI client intercepts Celery SoftTimeLimitExceeded exception if it happens during API call
except Exception as err:
log.debug("Encountered Exception", exc_info=True)
if remaining_retries > 0:
self._sleep_for_retry(
retries_taken=retries_taken,
max_retries=max_retries,
options=input_options,
response=None,
)
continue
log.debug("Raising connection error")
raise APIConnectionError(request=request) from err
原因分析
根据 Issue 描述,SoftTimeLimitExceeded 是 Exception 的子类。SDK 在 _base_client.py 中使用宽泛的 except Exception 捕获请求过程中的异常,因此会把这个应用级终止信号当作可重试的连接错误处理:在 max_retries > 0 时进行重试并继续循环;在 max_retries=0 时抛出 APIConnectionError。两种情况下,异常都没有原样传播回用户代码,Celery 任务的清理逻辑因此被跳过。评论中提出的修复方向是将重试捕获范围收窄到网络相关异常,例如 httpx.TransportError 和 OSError。
环境排查
- 确认 Python 版本是否为 Issue 中的 v3.11。
- 确认 openai 库版本是否为 v2.7.1,或升级到包含修复 PR 的版本。
- 确认是否在 Linux 上运行,以及是否使用 Celery 并配置了 soft time limit。
- 确认任务中
max_retries的取值:大于 0 时会表现为不断重试,等于 0 时会表现为APIConnectionError。 - 检查
_base_client.py中重试相关的异常捕获范围是否仍为except Exception,还是已收窄为网络相关异常。
解决步骤
- 先确认当前使用的 openai 库版本,并对照包含修复 PR(#2956、#3867)的版本说明,判断你的版本是否仍存在该问题。
- 如果版本受影响,可优先尝试升级 openai 库到已包含修复的版本;Issue 评论提到该修复将重试捕获范围收窄为网络相关异常(如
except (httpx.TransportError, OSError)),从而让SoftTimeLimitExceeded原样向上传播。 - 在无法升级的情况下,可优先尝试避免在 Celery soft time limit 触发窗口内长时间停留在 OpenAI 请求上,例如缩短单次请求耗时或调整任务结构,使清理逻辑有机会执行;但这只是绕行思路,未在 Issue 中被确认。
- 升级后重新运行复现步骤:创建带短 soft time limit 的 Celery 任务,写入打印 “cleanup” 的清理逻辑,在任务中对 OpenAI API 发请求,并分别在
max_retries=5和max_retries=0下观察行为。
验证方法
当 soft time limit 在 API 请求期间触发时,Celery 任务应能收到 SoftTimeLimitExceeded,任务中的清理逻辑(例如打印 “cleanup”)能够被执行。若 max_retries=0,不应再被转换为 APIConnectionError;若 max_retries>0,也不应因该异常再次进入重试。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。


