怎么在 Node.js 环境下实现 DeepSeek 接口的 SSE 流式响应接收

📅 2026/7/12 9:34:26 👁️ 阅读次数 📝 编程学习
怎么在 Node.js 环境下实现 DeepSeek 接口的 SSE 流式响应接收

在 Node.js 中接收 DeepSeek 接口的 SSE 流式响应,最稳妥的方式是使用兼容 OpenAI 协议的官方 SDK,或者通过原生 fetch API 配合 ReadableStream 手动解析。

先说结论:优先选用 openai 官方 SDK 的 Node 版本,配置 baseURL 即可,手动解析流仅建议在无法安装依赖的特殊环境使用。

  • 适合:需要快速集成、希望减少维护成本的 Node.js 服务项目
  • 先看:DeepSeek 开放平台关于 API 兼容性的说明及密钥权限
  • 建议:在生产环境做好异常捕获,避免流中断导致进程崩溃

命令速用版

npm install openai

如果不想安装额外依赖,Node.js 18+ 环境原生支持 fetch,可直接使用。

为什么会这样

DeepSeek 的 API 设计兼容 OpenAI 格式,这意味着返回的数据结构和服务端发送事件(SSE)的协议与 OpenAI 基本一致。SSE 是一种允许服务器向浏览器或客户端推送实时更新的技术,在 Node.js 中表现为一个持续可读的数据流。

使用官方 SDK 的好处是它已经处理好了流式数据的拼接、错误重试和协议解析。手动处理则需要你理解 HTTP 流式响应如何分块传输,以及如何处理 data: 前缀和 [DONE] 结束标记。

分步处理

步骤 1:准备环境

确保 Node.js 版本在 18 以上,以便原生支持 fetch 和顶层 await(可选)。安装 SDK:

npm install openai

步骤 2:配置客户端

创建实例时指定 baseURL 为 DeepSeek 的地址,apiKey 从控制台获取。

const OpenAI = require('openai');const client = new OpenAI({apiKey: process.env.DEEPSEEK_API_KEY,baseURL: 'https://api.deepseek.com'
});

步骤 3:发起流式请求

调用 chat.completions.create 时设置 stream: true

async function main() {const stream = await client.chat.completions.create({model: 'deepseek-chat',messages: [{ role: 'user', content: '你好' }],stream: true,});for await (const chunk of stream) {process.stdout.write(chunk.choices[0]?.delta?.content || '');}
}

步骤 4:手动解析方案(无 SDK)

如果使用原生 fetch,需要处理 ReadableStream 和 TextDecoder。

const response = await fetch('https://api.deepseek.com/v1/chat/completions', {method: 'POST',headers: {'Content-Type': 'application/json','Authorization': `Bearer ${process.env.DEEPSEEK_API_KEY}`},body: JSON.stringify({model: 'deepseek-chat',messages: [{ role: 'user', content: '你好' }],stream: true})
});const reader = response.body.getReader();
const decoder = new TextDecoder();while (true) {const { done, value } = await reader.read();if (done) break;const chunk = decoder.decode(value);// 这里需要自行分割 data: 行并解析 JSONconsole.log(chunk);
}

怎么验证是否生效

1. 控制台输出检查

运行脚本后,观察终端是否逐字吐出内容,而不是等待全部完成后一次性显示。如果是流式,你会看到文字像打字机一样出现。

2. 网络面板抓包

如果在本地调试,可以使用抓包工具或查看请求耗时。流式请求的响应头通常包含 Content-Type: text/event-stream

3. 错误日志监控

故意传入错误的 API Key 或模型名称,确认程序能捕获到 401 或 400 错误,而不是卡死不动。

常见坑

1. 环境变量泄露

不要把 API Key 硬编码在代码里提交到 Git 仓库,务必使用 .env 文件或环境变量管理。

2. 流中断处理

网络波动可能导致流提前结束。SDK 通常有重试机制,但手动实现 fetch 时需要检查 done 标志和响应状态码,避免把半截数据当成完整结果。

3. 编码问题

中文字符在流式传输中可能涉及多字节切分。使用 TextDecoder 时建议开启 { stream: true } 选项,防止汉字被截断显示为乱码。

4. 超时设置

长文本生成耗时较久,确保你的 HTTP 客户端或网关没有设置过短的超时时间,否则连接会被强制切断。

参考来源

  • DeepSeek 开放平台:https://platform.deepseek.com
  • OpenAI Node SDK: https://github.com/openai/openai-node
  • MDN Fetch API 文档:https://developer.mozilla.org/zh-CN/docs/Web/API/Fetch_API

原文链接:https://www.zjcp.cc/ask/10643.html