OpenAI client intercepts Celery SoftTimeLimitExceeded exception if it happens during API call

在 Celery 任务中调用 OpenAI Python SDK 时,如果 SoftTimeLimitExceeded 恰好发生在 API 请求过程中,会被 SDK 内部的宽泛 except Exception 捕获并当作可重试的连接错误处理,导致任务的清理逻辑收不到异常。优先确认发生在请求期间的异

快速结论:在 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 描述,SoftTimeLimitExceededException 的子类。SDK 在 _base_client.py 中使用宽泛的 except Exception 捕获请求过程中的异常,因此会把这个应用级终止信号当作可重试的连接错误处理:在 max_retries > 0 时进行重试并继续循环;在 max_retries=0 时抛出 APIConnectionError。两种情况下,异常都没有原样传播回用户代码,Celery 任务的清理逻辑因此被跳过。评论中提出的修复方向是将重试捕获范围收窄到网络相关异常,例如 httpx.TransportErrorOSError

环境排查

  • 确认 Python 版本是否为 Issue 中的 v3.11。
  • 确认 openai 库版本是否为 v2.7.1,或升级到包含修复 PR 的版本。
  • 确认是否在 Linux 上运行,以及是否使用 Celery 并配置了 soft time limit。
  • 确认任务中 max_retries 的取值:大于 0 时会表现为不断重试,等于 0 时会表现为 APIConnectionError
  • 检查 _base_client.py 中重试相关的异常捕获范围是否仍为 except Exception,还是已收窄为网络相关异常。

解决步骤

  1. 先确认当前使用的 openai 库版本,并对照包含修复 PR(#2956、#3867)的版本说明,判断你的版本是否仍存在该问题。
  2. 如果版本受影响,可优先尝试升级 openai 库到已包含修复的版本;Issue 评论提到该修复将重试捕获范围收窄为网络相关异常(如 except (httpx.TransportError, OSError)),从而让 SoftTimeLimitExceeded 原样向上传播。
  3. 在无法升级的情况下,可优先尝试避免在 Celery soft time limit 触发窗口内长时间停留在 OpenAI 请求上,例如缩短单次请求耗时或调整任务结构,使清理逻辑有机会执行;但这只是绕行思路,未在 Issue 中被确认。
  4. 升级后重新运行复现步骤:创建带短 soft time limit 的 Celery 任务,写入打印 “cleanup” 的清理逻辑,在任务中对 OpenAI API 发请求,并分别在 max_retries=5max_retries=0 下观察行为。

验证方法

当 soft time limit 在 API 请求期间触发时,Celery 任务应能收到 SoftTimeLimitExceeded,任务中的清理逻辑(例如打印 “cleanup”)能够被执行。若 max_retries=0,不应再被转换为 APIConnectionError;若 max_retries>0,也不应因该异常再次进入重试。

参考来源

openai/openai-python #2737

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 23845

发表回复

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