外观
流式响应
流式响应让应用在模型生成过程中持续接收结果,而不必等待完整响应完成。它适合聊天界面、命令行交互和长文本生成场景。OpenNave 通过 Server-Sent Events(SSE)支持 OpenAI、Anthropic 和 Gemini 格式的流式调用。
启用流式响应
OpenAI 格式
在请求体中设置 stream 为 true。响应以 SSE 形式返回,每个 data: 行包含一个 JSON 数据块。
sh
curl -N https://api.opennave.top/v1/responses \
-H "Authorization: Bearer $OPENNAVE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-5.4",
"input": "写一首关于编程的俳句。",
"stream": true
}'Anthropic 格式
同样在请求体中设置 stream 为 true。Anthropic 协议使用命名事件组织流式响应。
sh
curl -N https://api.opennave.top/v1/messages \
-H "x-api-key: $OPENNAVE_API_KEY" \
-H "Content-Type: application/json" \
-H "anthropic-version: 2023-06-01" \
-d '{
"model": "claude-sonnet-4-6",
"max_tokens": 1024,
"stream": true,
"messages": [
{"role": "user", "content": "写一首关于编程的俳句。"}
]
}'使用 Messages 协议的兼容模型可沿用相同的流式处理方式,只需替换模型名称。
Gemini 格式
Gemini 使用 streamGenerateContent 端点。若需要 SSE 增量事件,添加 alt=sse 查询参数;省略该参数或使用 alt=json 时,服务返回完整 JSON 数组。
sh
curl -N "https://api.opennave.top/v1beta/models/gemini-3.5-flash:streamGenerateContent?alt=sse&key=$OPENNAVE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"contents": [
{"parts": [{"text": "写一首关于编程的俳句。"}]}
]
}'事件格式
OpenAI 事件
OpenAI 格式发送 data: 行,流结束时发送 data: [DONE]。
text
data: {"type":"response.output_item.added",...}
data: {"type":"response.content_part.added",...}
data: {"type":"response.output_text.delta","delta":"你好"}
data: {"type":"response.output_text.delta","delta":"世界"}
data: {"type":"response.output_text.done",...}
data: {"type":"response.completed",...}Anthropic 事件
Anthropic 格式使用 event: 和 data: 字段。
text
event: message_start
data: {"type":"message_start","message":{...}}
event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"你好"}}
event: message_delta
data: {"type":"message_delta","delta":{"stop_reason":"end_turn"},"usage":{"output_tokens":12}}
event: message_stop
data: {"type":"message_stop"}Gemini 事件
Gemini SSE 流同样发送 data: 行,每个数据块带有 candidates 数组。用量一般会出现在最后一个数据块的 usageMetadata 中。
text
data: {"candidates":[{"content":{"parts":[{"text":"你好"}],"role":"model"}}]}
data: {"candidates":[{"content":{"parts":[{"text":"世界"}],"role":"model"},"finishReason":"STOP"}],"usageMetadata":{...}}持续读取至结束事件,不要在收到第一个文本块后中断连接,以便获得完整输出与准确用量。
最佳实践
处理不完整数据块
SSE 数据可能被拆分到多个 TCP 分段。解析器应缓冲传入内容,并按完整的 \n\n 分隔符拆分事件,而不能假设一次网络读取就是完整事件。
设置超时
流式调用连接会持续到生成完成。客户端读取超时建议不低于 5 分钟:
python
import httpx
from openai import OpenAI
client = OpenAI(
base_url="https://api.opennave.top/v1",
api_key="YOUR_OPENNAVE_API_KEY",
timeout=httpx.Timeout(300.0, connect=10.0),
)处理连接中断
捕获连接与超时异常。非幂等请求发生中断时,应保存已接收的部分输出并提示用户;可优先使用 SDK 内置重试能力。
优化界面渲染
在浏览器界面中应缓冲增量文本,并按固定间隔或 requestAnimationFrame 刷新,而不要每收到一个增量事件就重新渲染整个视图。