默认情况下,当您向 OpenAI API 发出请求时,我们会在将模型的整个输出生成完毕后,通过单个 HTTP 响应发送回来。当生成长输出时,等待响应可能需要很长时间。流式响应允许您在模型继续生成完整响应的同时,开始打印或处理模型输出的开头部分。
本指南重点介绍通过服务器发送事件 (SSE) 进行的 HTTP 流式传输 (stream=true)。如需通过以下方式进行的持久 WebSocket 传输和增量输入: previous_response_id,请参见 Responses API WebSocket 模式.
启用流式传输
要开始流式传输响应,请在向 Responses 端点发出的请求中设置 stream=True 在对 Responses 端点的请求中:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from openai import OpenAI
client = OpenAI()
stream = client.responses.create(
model="gpt-5.5",
input=[
{
"role": "user",
"content": "Say 'double bubble bath' ten times fast.",
},
],
stream=True,
)
for event in stream:
print(event)Responses API 使用语义事件进行流式传输。每个事件都使用预定义的 schema 进行类型定义,因此您可以监听自己关心的事件。
有关事件类型的完整列表,请参阅 流式传输的 API 参考。以下是一些示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
type StreamingEvent =
| ResponseCreatedEvent
| ResponseInProgressEvent
| ResponseFailedEvent
| ResponseCompletedEvent
| ResponseOutputItemAdded
| ResponseOutputItemDone
| ResponseContentPartAdded
| ResponseContentPartDone
| ResponseOutputTextDelta
| ResponseOutputTextAnnotationAdded
| ResponseTextDone
| ResponseRefusalDelta
| ResponseRefusalDone
| ResponseFunctionCallArgumentsDelta
| ResponseFunctionCallArgumentsDone
| ResponseFileSearchCallInProgress
| ResponseFileSearchCallSearching
| ResponseFileSearchCallCompleted
| ResponseCodeInterpreterInProgress
| ResponseCodeInterpreterCallCodeDelta
| ResponseCodeInterpreterCallCodeDone
| ResponseCodeInterpreterCallInterpreting
| ResponseCodeInterpreterCallCompleted
| Error流式传输 Chat Completions 相当简单。不过,我们建议在调用 Chat Completions 或旧版 Completions 端点时,使用 流式传输的 Responses API,因为我们在设计时就考虑了流式处理。Responses API 使用语义事件进行流式传输,并且是类型安全的。
流式传输聊天补全
To stream completions, set stream=True 。这会返回一个对象,该对象以纯数据服务器发送事件的形式流式传回响应。
响应通过事件流以数据块的形式增量发回。您可以使用 for 循环遍历事件流,如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from openai import OpenAI
client = OpenAI()
stream = client.chat.completions.create(
model="gpt-5",
messages=[
{
"role": "user",
"content": "Say 'double bubble bath' ten times fast.",
},
],
stream=True,
)
for chunk in stream:
print(chunk)
print(chunk.choices[0].delta)
print("****************")读取响应
如果您使用我们的 SDK,则每个事件都是类型化的实例。您也可以使用事件的 type 属性来识别单个事件。
一些关键的生命周期事件只会发出一次,而其他事件则会在生成响应的过程中多次发出。流式传输文本时常见的事件包括:
- `response.created`
- `response.output_text.delta`
- `response.completed`
- `error`有关您可以监听的事件的完整列表,请参阅 流式传输的 API 参考.
当您流式传输聊天补全时,响应包含 delta 字段,而不是 message 字段。 delta 字段可以容纳角色 token、内容 token 或者为空。
{ role: 'assistant', content: '', refusal: null }
****************
{ content: 'Why' }
****************
{ content: " don't" }
****************
{ content: ' scientists' }
****************
{ content: ' trust' }
****************
{ content: ' atoms' }
****************
{ content: '?\n\n' }
****************
{ content: 'Because' }
****************
{ content: ' they' }
****************
{ content: ' make' }
****************
{ content: ' up' }
****************
{ content: ' everything' }
****************
{ content: '!' }
****************
{}
****************要仅流式传输聊天补全的文本响应,您的代码如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from openai import OpenAI
client = OpenAI()
stream = client.chat.completions.create(
model="gpt-5",
messages=[
{
"role": "user",
"content": "Say 'double bubble bath' ten times fast.",
},
],
stream=True,
)
for chunk in stream:
if chunk.choices[0].delta.content is not None:
print(chunk.choices[0].delta.content, end="")高级用例
对于更高级的用例(如流式传输工具调用),请查看以下专用指南:
审核风险
请注意,在生产应用中流式传输模型的输出会使审核补全内容变得更加困难,因为部分补全可能更难评估。这可能会对已批准的使用场景产生影响。