流式响应
通过 Server-Sent Events,逐步接收模型输出。
开启流式
支持流式的 Chat Completions、Responses 或 Messages 请求使用 stream: true。Gemini 使用 streamGenerateContent 与 SSE 格式。先确认当前模型支持该协议的流式能力。
python
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["OCEANWAY_API_KEY"],
base_url="https://console.oceanway.tech/v1",
max_retries=0,
)
stream = client.chat.completions.create(
model=os.environ["OCEANWAY_TEXT_MODEL"],
messages=[{"role": "user", "content": "写一段关于海边日出的描写。"}],
max_tokens=256,
stream=True,
)
try:
for chunk in stream:
if chunk.choices:
print(chunk.choices[0].delta.content or "", end="", flush=True)
finally:
stream.close()按协议解析
SSE 是由事件组成的字节流。一个网络数据块可能包含多个事件,也可能只包含一个事件的一部分。使用 SDK 或正确的 SSE 解析器,按空行分割完整事件,保留事件类型、增量内容、错误和终止信息。
| 协议 | 注意事项 |
|---|---|
| Chat Completions | 读取内容增量和终止信号,部分事件可能没有 choices |
| Responses | 按事件类型处理文本增量、完成与错误事件 |
| Messages | 处理消息与内容块的开始、增量和结束 |
| Gemini | 按 SSE 数据帧读取 candidates 及相应元数据 |
不要只检查 HTTP 200。流已经开始后仍可能返回错误事件,连接关闭也不一定表示生成完整成功。用量字段和出现位置因协议与模型而异,缺失时不要自行填写为零。
取消与计费
流式请求可以由客户端取消,按原生取消行为处理并依据实际费用计费。断开连接不会自动退款;停止读取也不应被当作“本次没有消费”。
非流式请求的行为不同:已开始的原请求在客户端关闭后仍会继续处理,结果和费用仍关联原请求。
部署流式应用
确保你的应用网关允许逐步发送数据,避免将 SSE 全部缓存后才返回。为长连接设置合适的客户端与代理超时。连接中断后,先检查原请求和调用记录,不自动重放生成 POST。