Grok Streaming API
更新于:
Grok 流式输出可在生成过程中立即向用户显示答案,无需等待完整响应。Streaming API 通过 Server-Sent Events(SSE)传输文本和服务事件。
如果需要一个完整的响应对象,请使用 Messages API.
流式响应如何工作
HTTP 连接会保持打开,并按顺序发送事件,直到响应完成或客户端取消。
在请求正文中启用流式输出
"stream": true01
传输
在单个 HTTP 响应上使用 SSE,无需 WebSocket 握手。
02
数据
每个事件表示生命周期变化或一小段文本 delta。
03
结果
将 delta 追加到 UI,并从 completed 事件读取最终状态和 usage。
启动流式响应
curl -N https://api.llm-gate.tech/v1/responses \
-H "Authorization: Bearer $GROK_API_DEV_KEY" \
-H "Content-Type: application/json" \
-H "Accept: text/event-stream" \
-d '{
"model": "grok-4.5",
"input": "用两句话解释二分查找",
"stream": true
}'事件类型
监听流时,客户端会收到不同类型的事件。下面列出了当前事件及其用途。
| 事件 | 处理方式 |
|---|---|
| response.created | 保存 response ID,并将请求标记为处理中。 |
| response.output_item.added | 新增类型化 output,可能是文本、工具调用或其他项目。 |
| response.content_part.added | 输出消息中开始了新的 content 部分。 |
| response.output_text.delta | 按顺序把 delta 追加到可见答案。 |
| response.output_text.done | 当前文本部分已结束。 |
| response.completed | 提交最终答案并读取状态和 usage。 |
| error | 停止渲染并显示安全的错误状态。 |
事件流示例
1
response.created{"response":{"id":"resp_01abc","status":"in_progress"}}2
response.output_text.delta{"delta":"Binary"}3
response.output_text.delta{"delta":" search"}4
response.completed{"response":{"status":"completed","usage":{"input_tokens":18,"output_tokens":42,"total_tokens":60}}}流式处理代码示例
import json
import os
import httpx
with httpx.stream(
"POST",
"https://api.llm-gate.tech/v1/responses",
headers={
"Authorization": f"Bearer {os.environ['GROK_API_DEV_KEY']}",
"Accept": "text/event-stream",
},
json={
"model": "grok-4.5",
"input": "用两句话解释二分查找",
"stream": True,
},
timeout=3600.0,
) as response:
response.raise_for_status()
for line in response.iter_lines():
if not line.startswith("data:"):
continue
data = line.removeprefix("data:").strip()
if not data or data == "[DONE]":
continue
event = json.loads(data)
if event.get("type") == "response.output_text.delta":
print(event["delta"], end="", flush=True)错误处理
SSE 前的 HTTP 错误
响应状态不是 2xx 时,解析普通 JSON 错误正文。
连接后的 error 事件
收到 error 类型事件后,流可能停止。保留部分输出、标记为未完成并记录 response ID。
连接提前关闭
连接在 response.completed 前关闭时,应将答案视为未完成。重试会生成新答案,不要自动拼接到已收到的文本。
429 或临时 5xx
仅在尚未提交有效结果时,使用带 jitter 且次数受限的指数退避。