如何将OpenAI流式输出管道传输至HTTP响应?
将OpenAI流式输出管道到HTTP响应的实现方案
假设你使用Node.js + Express这类HTTP框架,以下是具体实现方案:
- 配置HTTP响应头部
流式输出依赖Server-Sent Events(SSE)协议,需先设置对应响应头:
res.setHeader('Content-Type', 'text/event-stream'); res.setHeader('Cache-Control', 'no-cache'); res.setHeader('Connection', 'keep-alive'); res.flushHeaders(); // 立即发送头部,避免前端等待
- 对接OpenAI流式响应并输出到HTTP响应
结合你提供的代码,遍历OpenAI返回的异步迭代器,提取每段内容后写入HTTP响应:
app.post('/chat', async (req, res) => { try { const chat = await openai.chat.completions.create({ messages: [{ role: "user", content: "Say this is a test" }], model: "gpt-3.5-turbo", stream: true, }); // 遍历流式返回的每个chunk for await (const chunk of chat) { const content = chunk.choices[0]?.delta?.content || ''; if (content) { // 按SSE格式输出(适配前端SSE监听),也可直接输出纯文本 res.write(`data: ${JSON.stringify({ content })}\n\n`); // 纯文本输出方式:res.write(content); } } // 所有数据发送完成后结束响应 res.end(); } catch (error) { console.error(error); res.status(500).send('请求失败'); } });
- 核心注意事项
- 必须用
for await...of遍历OpenAI的流式响应,因为它是异步迭代器 - 要处理chunk中可能为空的
delta.content(比如响应开头/结尾的空片段) - 若前端不需要SSE格式,可直接输出纯文本,无需包裹
data:前缀 - 确保响应在所有流式数据发送完成后再关闭,避免截断内容
内容的提问来源于stack exchange,提问作者Henry
相关产品推荐
相关产品推荐

