OpenAI Responses API 长篇写作后台任务怎么处理
生成长文章或批量改稿时,直接等待请求返回会让编辑页面难以保持响应。Responses API 的 background 参数可以把响应交给后台处理,应用随后使用响应 ID 查询结果;只有确认任务完成、…
准备
先准备 OpenAI 客户端、模型 ID、文章输入和一个持久化任务表。任务表至少保存业务任务 ID、response_id、当前状态、原始输入、结果内容、错误信息和更新时间。response_id 不要只放在浏览器内存中,否则页面刷新或服务重启后无法继续查询。
建议把生成内容写入草稿字段,把发布状态单独保存。关于响应字段和文章结果的程序化检查,可以参考OpenAI Responses API 写作结果怎么做结构化检查,本文重点处理后台任务的创建、查询和取消。
分步操作
- 创建后台任务。调用
client.responses.create时设置background=True,同时传入model、instructions、input和必要的max_output_tokens。创建成功后立即保存返回对象的id,不要把整份响应当作唯一凭据。 - 记录任务初始状态。将本地任务标记为
queued或running等应用状态,并保存接口返回的状态值。状态名称应以实际响应和当前接口文档为准,不要仅凭前端显示文字判断是否完成。 - 轮询响应。服务端按逐渐变长的间隔调用
client.responses.retrieve(response_id),每次更新本地状态和更新时间。查询失败时保留上一次状态,并记录错误;达到轮询上限后将任务标记为需要人工处理。 - 只处理已完成结果。当返回状态明确表示完成后,再读取输出文本,检查正文是否为空、结构是否符合约定、长度是否达到业务要求。未完成、失败或取消的响应都不能直接进入发布队列。
- 保存版本并触发审核。将 response_id、请求参数摘要、完整输出和校验结果写入草稿版本。审核通过后才把发布状态改为可发布,避免轮询接口时误把中间结果展示成最终稿。
- 取消异常任务。确认该响应创建时使用了
background=True后,调用client.responses.cancel(response_id)。取消结果仍要写回任务表,并停止后续轮询;如果任务不允许取消,应保留接口错误并转人工处理。
可复制模板或示例
下面的 Python 示例展示了核心流程。save_task、update_task 和 save_draft 需要替换为你的数据库操作;状态集合也应按你的业务规则调整。
import time
from openai import OpenAI
client = OpenAI()
response = client.responses.create(
model='your-model-id',
background=True,
instructions='根据输入资料写成结构清晰的中文文章。资料没有说明的内容不要补写。',
input='主题:AI 写作后台任务\n要求:输出标题、导语和分节正文。',
max_output_tokens=6000,
)
response_id = response.id
save_task(response_id=response_id, status=response.status)
for attempt in range(12):
current = client.responses.retrieve(response_id)
update_task(response_id, status=current.status)
if current.status == 'completed':
text = current.output_text or ''
if text.strip() and validate_draft(text):
save_draft(response_id, text)
break
update_task(response_id, status='review_required', error='正文为空或未通过检查')
break
if current.status in {'failed', 'cancelled'}:
update_task(response_id, status='stopped', error='后台响应未完成')
break
time.sleep(min(5 * (attempt + 1), 30))
else:
update_task(response_id, status='timeout', error='轮询次数达到上限')
# 仅对仍在后台处理中的任务执行取消
client.responses.cancel(response_id)这个模板有两个关键边界:第一,响应 ID 创建后马上落库;第二,发布动作放在完成和验收之后。若你的服务支持重试,还应使用业务任务 ID 做幂等判断,避免网络超时后重复创建相同文章。
翻车怎么改
- 故障:页面显示生成中,但服务重启后任务无法找回。原因:只在前端保存了响应 ID,后端没有持久化任务记录。修正:创建响应后立即保存 response_id,并让独立的轮询 worker 根据本地状态继续查询。
- 故障:未完成的半截正文被推送到发布队列。原因:把 output_text 是否存在当成完成条件。修正:先判断接口返回的 status,再执行正文、字段和长度检查;未完成响应只能进入草稿缓冲区。
- 故障:取消请求返回错误。原因:目标响应创建时没有设置
background=True,而取消方法只允许取消后台响应。修正:检查任务记录中的创建参数;无法取消时停止本地轮询并记录异常,不要无限重试。
完成前检查
- 发布前验收:任务状态明确为完成,正文非空,标题、分节和必需字段均通过校验。
- 确认已保存 response_id、请求时间、模型参数摘要和最终草稿版本。
- 确认失败、取消、超时任务不会进入发布队列,并且有人工处理入口。
- 确认轮询有最大次数和最大等待时间,服务重启后可以从数据库恢复。
下一步
把这篇的方法练一遍
提示词和步骤可以带到创作里直接试做一版。