流式响应
Responses、Chat Completions 和 Messages 均可能返回 SSE。流不是“一个 JSON 响应拆成几段”,而是一串独立事件;应使用 SDK 的流式迭代器,或实现合规的 SSE 解析器。
ts
const response = await fetch('https://ai.tavonilo.com/v1/responses', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.AI_SHOP_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ model: '<MODEL_ID>', input: 'hello', stream: true }),
})
if (!response.ok || !response.body) throw new Error(`request failed: ${response.status}`)
// Use an SSE parser here; do not split arbitrary TCP chunks by newline.生产建议
- 设置连接、首字节和总时长超时,且不要让反向代理缓冲 SSE。
- 只对“请求尚未到达服务端”或有明确幂等语义的场景自动重试;生成请求可能已产生计费。
- 记录状态码、请求 ID、模型与时间,避免记录 API Key、完整隐私提示词或敏感输出。
- 前端取消时使用
AbortController;服务端应处理客户端断开,而不是继续向已关闭连接写入。
TIP
流式 SDK 的事件名称和增量字段由协议决定。Responses 使用 Responses 事件,Chat Completions 使用 choices[].delta,Messages 使用 Anthropic 事件;不要用同一个 JSON 解析器混用三种协议。