模型流式接口返回 200,为什么还要检查结束状态?
更新于 2026-09-29。依据本站当前公开文档编写,SDK 示例已完成本地模拟响应验证;本次没有执行真实模型调用。
流式输出可以让用户逐步看到模型回答,但连接建立成功和回答完整结束是两件不同的事。服务开始输出后发生错误,HTTP 状态也可能仍然是 200。
Chat Completions 要检查什么
设置 stream=True,并请求 stream_options={"include_usage": True}。使用 SDK 解析 SSE,避免自己把每个网络数据块当成完整 JSON。
import os
from openai import OpenAI
usage = None
finish_reason = None
with OpenAI(
api_key=os.environ["API302_KEY"],
base_url="https://api.302api.com/v1",
max_retries=0,
timeout=210.0,
) as client:
stream = client.chat.completions.create(
model="gpt-6-astra",
messages=[{"role": "user", "content": "请用一句话解释什么是 API。"}],
max_completion_tokens=256,
stream=True,
stream_options={"include_usage": True},
)
try:
for chunk in stream:
if chunk.usage is not None:
usage = chunk.usage
for choice in chunk.choices:
if choice.delta.content:
print(choice.delta.content, end="", flush=True)
if choice.finish_reason is not None:
finish_reason = choice.finish_reason
finally:
stream.close()
print("\n结束原因:", finish_reason)
print("用量:", usage)
if finish_reason != "stop" or usage is None:
raise RuntimeError("未确认完整文本结束及用量;先核对记录,不自动重试")
最终 usage 帧的 choices 可能是空列表,不能忽略它。SDK 会消费原始流里的 [DONE] 标记。这个示例只处理单条文本结果,不执行工具;length、tool_calls 等需要分别处理。
已显示出来的部分回答也可能是不完整结果。生产应用应先显示“生成中”,收到结束信息后再更新状态。
Responses 不能复用 Chat 的事件解析
| 项目 | Chat Completions | Responses |
|---|---|---|
| 文本增量 | choices[].delta.content |
response.output_text.delta |
| 用量 | chunk 的 usage |
完成事件里的 response.usage |
| 结束检查 | finish_reason 与流结束 |
response.completed |
| 非正常结束 | 异常、缺少结束或用量等 | response.failed、response.incomplete、error 等 |
Responses 不应发送 Chat 的 stream_options.include_usage。完整示例见 本站接入文档。
出错后先做什么
| 情况 | 处理 |
|---|---|
| 400 | 检查 JSON、模型、接口路径及输出上限;原样重试不能修复参数 |
| 401 | 检查 Key、Bearer 格式和密钥状态 |
| 402 | 检查账户余额、Key 额度和请求所需预占 |
| 403 | 结合 error.code 检查模型可用性;不要仅凭状态判定为网络问题 |
| 404 / 405 | 检查路径拼接与请求方法 |
| 429 | 区分频率限制和日额度;读取 Retry-After,它不保证重试安全 |
| 5xx、超时、连接中断 | 请求可能已经执行;先看调用记录和结算状态 |
只有确定请求未执行、且错误可以重试时,才采用有次数上限的退避。本文示例默认关闭 SDK 自动重试。
图片请求另有 Idempotency-Key 去重规则;它会拒绝重复任务,并不重放图片结果。不要把该规则当作普通文本接口的保证。
给支持人员的信息
提供请求时间及其时区、模型 ID、路径、HTTP 状态、错误码、客户端版本,以及本站请求编号(有返回时)。不要公开 API Key、Authorization、Cookie、完整对话或私密图片。