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

文章导读
在 Node.js 中接收 DeepSeek 接口的 SSE 流式响应,最稳妥的方式是使用兼容 OpenAI 协议的官方 SDK,或者通过原生 fetch API 配合 ReadableStream 手动解析。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 参考来源
A A

在 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:配置客户端

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

创建实例时指定 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: 行并解析 JSON
  console.log(chunk);
}

怎么验证是否生效

1. 控制台输出检查

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

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

2. 网络面板抓包

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

3. 错误日志监控

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

常见坑

1. 环境变量泄露

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

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

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