OpenAI Responses API 后台任务完成后如何取回结果
来源:17golang原创
时间:2026-09-14 10:05:50 314浏览 收藏
把一个耗时较长的请求交给 OpenAI Responses API 后,服务端不会把完整结果一直挂在创建请求上。正确做法是让请求使用 background=true,先保存返回的 response.id,再通过 Responses 的取回接口读取状态和结果。只要状态仍是 queued 或 in_progress,就继续等待;离开这两个状态后,才进入成功、失败、取消或不完整的处理分支。
官方地址:https://developers.openai.com/api/docs/guides/background
- 后台任务的关键凭据是 Response ID,而不是创建请求的连接。
- 轮询条件只覆盖
queued和in_progress,终态不能继续盲轮询。 - 只有
completed才适合读取正常输出,其他终态要保留error或incomplete_details。
先把后台响应拆成三个可保存的字段
创建请求返回的是一个 Response 对象,其中最重要的是 id、status 和后续可取回的输出。业务队列至少应保存 response_id、创建时间和本地任务编号;不要把 Python SDK 对象直接塞进缓存。取回接口是 GET /v1/responses/{response_id},每次返回的状态都应当被视为新的事实。

| 字段或状态 | 用途 | 处理判断 |
|---|---|---|
id | 后续取回的唯一标识 | 创建成功后立即持久化 |
queued / in_progress | 任务仍未结束 | 等待后再次 retrieve |
completed | 结果可用 | 读取 output_text 或输出项 |
| 其他终态 | 失败、取消或不完整 | 记录诊断,不当作成功 |
用 SDK 按状态取回结果
下面的最小写法把轮询封装成一个函数。创建阶段只负责拿到 ID;取回阶段只在两个进行态内等待,这样可以避免任务已经结束后继续制造无意义请求。
import os
import time
from openai import OpenAI
def wait_for_response(response_id, timeout_seconds=600):
# 复用同一个客户端,并给后台任务设置本地总超时。
client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])
deadline = time.monotonic() + timeout_seconds
response = client.responses.retrieve(response_id)
while response.status in {"queued", "in_progress"}:
# 固定间隔足够演示;生产环境可改为带上限的退避。
if time.monotonic() >= deadline:
raise TimeoutError(f"后台响应轮询超时: {response_id}")
time.sleep(2)
response = client.responses.retrieve(response_id)
if response.status != "completed":
# 非成功终态也要带回服务端诊断,便于重试或人工处理。
detail = response.error or response.incomplete_details
raise RuntimeError(f"后台响应结束于 {response.status}: {detail}")
return response
client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])
created = client.responses.create(
model="gpt-6-astra",
input="整理这份任务的三条执行建议。",
background=True,
)
result = wait_for_response(created.id)
print(result.output_text)
这里的关键不是把 sleep(2) 当成固定最佳值,而是把“进行态”和“终态”分开。若你使用结构化输出,取回时仍要根据终态判断数据是否完整;不要只判断对象存在就强行解析。
终态处理决定任务是否真的完成
completed 表示可以按成功路径读取输出。failed 应记录 error,incomplete 应检查 incomplete_details,cancelled 则说明任务被取消。把所有非进行态都当成成功,是后台任务最隐蔽的逻辑错误:队列会显示完成,但用户拿不到可用答案。

如果任务需要人工取消,官方指南还提供了 POST /v1/responses/{response_id}/cancel。取消动作应与本地任务状态一起记录,避免取消请求尚未被服务端确认时就把业务单标成成功。
生产轮询要补上超时与保存边界
第一,给每个任务设置本地总超时,超时后进入待重试或人工检查,而不是无限循环。第二,对大量任务采用指数退避并设置最大间隔,减少短时间内的集中取回。第三,响应 ID、当前状态和最后一次错误要落到可靠存储中,进程重启后从 ID 恢复,而不是重新创建任务。
后台响应的保存策略也要看项目配置。官方说明指出,ZDR 项目的后台响应会为异步执行和轮询临时保存大约 10 分钟;在启用 Modified Abuse Monitoring 的项目中,若希望轮询窗口后仍保留后台响应,需要显式设置 store=true。因此,长于这个窗口的业务不要把 Responses 当作永久任务数据库,应该及时取回并写入自己的结果存储。
常见问题
为什么创建请求返回后不能直接读取最终答案?
因为后台模式先返回任务对象,生成仍可能处于 queued 或 in_progress。必须使用同一个 ID 取回到终态。
轮询什么时候停止?
当状态不再是 queued 或 in_progress 时停止,再按终态分支处理。
拿不到 output_text 时先查什么?
先看 status,然后检查 error 和 incomplete_details;不要用空字符串掩盖失败原因。
一句话记忆:创建阶段保存 ID,进行态阶段轮询,终态阶段判定结果,成功输出和失败诊断走不同的数据路径。
-
371 收藏
-
494 收藏
-
Golang · Go教程 | 2星期前 | JSON · go · 接口开发 · 安全编程 · Go encoding/json DisallowUnknownFields Decoder API参数校验487 收藏
-
458 收藏
-
Golang · Go问答 | 2星期前 | 性能优化 · Context · go并发 · 故障排查 · 接口开发 · Go goroutine泄漏 context.WithCancel 请求生命周期 defer cancel427 收藏
-
科技周边 · 人工智能 | 31分钟前 | 人工智能 · openai api · 检索增强生成 · 文件搜索 · OpenAI Attributes 元数据过滤 Responses API File Search vector store426 收藏
-
345 收藏
-
115 收藏
-
171 收藏
-
科技周边 · 人工智能 | 1天前 | 人工智能 · 性能排查 · 提示词工程 · Hugging Face · 模型推理 · KV Cache · 提示词缓存动态字段 DynamicCache KV缓存 Transformers缓存 past_key_values use_cache StaticCache397 收藏
-
科技周边 · 人工智能 | 1天前 | 人工智能 · 模型量化 · 校准数据 · ONNX Runtime · GPTQ · 推理优化 · 量化校准数据 模型量化配置 代表性校准集 ONNX静态量化 GPTQ校准数据 AI模型精度排查276 收藏
-
221 收藏
-
387 收藏
-
264 收藏
-
447 收藏
-
388 收藏
-
147 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习