Node.js 调用 DeepSeek API 完整指南

海哥  论坛元老 | 2025-2-15 20:17:52 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1594|帖子 1594|积分 4782

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
简介

本文将先容如何使用 Node.js 调用 DeepSeek API,实现流式对话并生存对话记录。Node.js 版本使用现代异步编程方式实现,支持流式处理和错误处理。
1. 环境准备

1.1 系统要求



  • Node.js 14.0 或更高版本
  • npm 包管理器
1.2 项目结构

  1. deepseek-project/
  2. ├── main.js           # 主程序
  3. ├── package.json      # 项目配置文件
  4. └── conversation.txt  # 对话记录文件
复制代码
1.3 安装依靠

在项目目录下打开命令行,执行:
  1. # 安装项目依赖
  2. npm install
  3. # 如果出现权限问题,可以尝试:
  4. sudo npm install  # Linux/Mac
  5. # 或
  6. npm install --force  # Windows
复制代码
此命令会安装 package.json 中界说的所有依靠项:


  • axios: 用于发送 HTTP 请求
  • moment: 用于时间格式化
如果安装过程中遇到网络问题,可以尝试使用国内镜像:
  1. # 设置淘宝镜像
  2. npm config set registry https://registry.npmmirror.com
  3. # 然后重新安装
  4. npm install
复制代码
1.4 运行程序

安装完依靠后,使用以下命令启动程序:
  1. # 使用 npm 启动
  2. npm start
  3. # 或者直接使用 node
  4. node main.js
复制代码
如果遇到权限问题:
  1. # Linux/Mac
  2. sudo npm start
  3. # Windows (以管理员身份运行命令提示符)
  4. npm start
复制代码
2. 完整代码实现

2.1 package.json

  1. {
  2.   "name": "deepseek-chat",
  3.   "version": "1.0.0",
  4.   "description": "DeepSeek API chat implementation in Node.js",
  5.   "main": "main.js",
  6.   "scripts": {
  7.     "start": "node main.js"
  8.   },
  9.   "dependencies": {
  10.     "axios": "^1.6.2",
  11.     "moment": "^2.29.4"
  12.   }
  13. }
复制代码
2.2 main.js

  1. const fs = require('fs').promises;
  2. const readline = require('readline');
  3. const axios = require('axios');
  4. const moment = require('moment');
  5. class DeepSeekChat {
  6.     constructor() {
  7.         this.url = 'https://api.siliconflow.cn/v1/chat/completions';
  8.         this.apiKey = 'YOUR_API_KEY';  // 替换为你的 API Key
  9.         this.logFile = 'conversation.txt';
  10.     }
  11.     async saveToFile(content, isQuestion = false) {
  12.         const timestamp = moment().format('YYYY-MM-DD HH:mm:ss');
  13.         const text = isQuestion
  14.             ? `
  15. [${timestamp}] Question:
  16. ${content}
  17. [${timestamp}] Answer:
  18. `
  19.             : content;
  20.         
  21.         await fs.appendFile(this.logFile, text);
  22.     }
  23.     async chat() {
  24.         // 创建命令行接口
  25.         const rl = readline.createInterface({
  26.             input: process.stdin,
  27.             output: process.stdout
  28.         });
  29.         // 使用 Promise 封装问题输入
  30.         const question = (prompt) => new Promise((resolve) => rl.question(prompt, resolve));
  31.         try {
  32.             while (true) {
  33.                 const userInput = await question('
  34. 请输入您的问题 (输入 q 退出): ');
  35.                
  36.                 if (userInput.trim().toLowerCase() === 'q') {
  37.                     console.log('程序已退出');
  38.                     break;
  39.                 }
  40.                 // 保存问题
  41.                 await this.saveToFile(userInput, true);
  42.                 // 准备请求数据
  43.                 const data = {
  44.                     model: 'deepseek-ai/DeepSeek-V3',
  45.                     messages: [
  46.                         {
  47.                             role: 'user',
  48.                             content: userInput
  49.                         }
  50.                     ],
  51.                     stream: true,
  52.                     max_tokens: 2048,
  53.                     temperature: 0.7,
  54.                     top_p: 0.7,
  55.                     top_k: 50,
  56.                     frequency_penalty: 0.5,
  57.                     n: 1,
  58.                     response_format: {
  59.                         type: 'text'
  60.                     }
  61.                 };
  62.                 try {
  63.                     // 发送流式请求
  64.                     const response = await axios({
  65.                         method: 'post',
  66.                         url: this.url,
  67.                         data: data,
  68.                         headers: {
  69.                             'Content-Type': 'application/json',
  70.                             'Authorization': `Bearer ${this.apiKey}`
  71.                         },
  72.                         responseType: 'stream'
  73.                     });
  74.                     // 处理流式响应
  75.                     response.data.on('data', async (chunk) => {
  76.                         const lines = chunk.toString().split('
  77. ');
  78.                         for (const line of lines) {
  79.                             if (line.trim() === '') continue;
  80.                             if (line.trim() === 'data: [DONE]') continue;
  81.                             if (line.startsWith('data: ')) {
  82.                                 try {
  83.                                     const json = JSON.parse(line.slice(6));
  84.                                     if (json.choices[0].delta.content) {
  85.                                         const content = json.choices[0].delta.content;
  86.                                         process.stdout.write(content);
  87.                                         await this.saveToFile(content);
  88.                                     }
  89.                                 } catch (e) {
  90.                                     continue;
  91.                                 }
  92.                             }
  93.                         }
  94.                     });
  95.                     // 等待响应完成
  96.                     await new Promise((resolve) => {
  97.                         response.data.on('end', async () => {
  98.                             console.log('
  99. ----------------------------------------');
  100.                             await this.saveToFile('
  101. ----------------------------------------
  102. ');
  103.                             resolve();
  104.                         });
  105.                     });
  106.                 } catch (error) {
  107.                     const errorMsg = `请求错误: ${error.message}
  108. `;
  109.                     console.error(errorMsg);
  110.                     await this.saveToFile(errorMsg);
  111.                 }
  112.             }
  113.         } finally {
  114.             rl.close();
  115.         }
  116.     }
  117. }
  118. // 运行程序
  119. async function main() {
  120.     const chatbot = new DeepSeekChat();
  121.     await chatbot.chat();
  122. }
  123. main().catch(console.error);
复制代码
3. 代码详解

3.1 类结构



  • DeepSeekChat: 主类,封装所有功能
  • constructor: 构造函数,初始化设置
  • saveToFile: 异步生存对话记录
  • chat: 主对话循环
3.2 关键功能

文件操作

  1. async saveToFile(content, isQuestion = false) {
  2.     const timestamp = moment().format('YYYY-MM-DD HH:mm:ss');
  3.     const text = isQuestion
  4.         ? `
  5. [${timestamp}] Question:
  6. ${content}
  7. [${timestamp}] Answer:
  8. `
  9.         : content;
  10.    
  11.     await fs.appendFile(this.logFile, text);
  12. }
复制代码
流式处理

  1. response.data.on('data', async (chunk) => {
  2.     const lines = chunk.toString().split('
  3. ');
  4.     for (const line of lines) {
  5.         if (line.startsWith('data: ')) {
  6.             const json = JSON.parse(line.slice(6));
  7.             if (json.choices[0].delta.content) {
  8.                 const content = json.choices[0].delta.content;
  9.                 process.stdout.write(content);
  10.                 await this.saveToFile(content);
  11.             }
  12.         }
  13.     }
  14. });
复制代码
3.3 参数说明



  • model: 使用的模型名称
  • stream: 启用流式输出
  • max_tokens: 最大输出长度 (2048)
  • temperature: 控制随机性 (0.7)
  • top_p, top_k: 采样参数
  • frequency_penalty: 重复惩罚系数
4. 错误处理

代码包含完整的错误处理机制:


  • 网络请求错误处理
  • JSON 分析错误处理
  • 文件操作错误处理
  • 优雅退出处理
5. 使用方法

5.1 安装依靠

在项目目录下打开命令行,执行:
  1. # 安装项目依赖
  2. npm install
  3. # 如果出现权限问题,可以尝试:
  4. sudo npm install  # Linux/Mac
  5. # 或
  6. npm install --force  # Windows
复制代码
此命令会安装 package.json 中界说的所有依靠项:


  • axios: 用于发送 HTTP 请求
  • moment: 用于时间格式化
如果安装过程中遇到网络问题,可以尝试使用国内镜像:
  1. # 设置淘宝镜像
  2. npm config set registry https://registry.npmmirror.com
  3. # 然后重新安装
  4. npm install
复制代码
5.2 修改设置

在 main.js 中替换 YOUR_API_KEY 为你的实际 API Key。
5.3 运行程序

安装完依靠后,使用以下命令启动程序:
  1. # 使用 npm 启动
  2. npm start
  3. # 或者直接使用 node
  4. node main.js
复制代码
如果遇到权限问题:
  1. # Linux/Mac
  2. sudo npm start
  3. # Windows (以管理员身份运行命令提示符)
  4. npm start
复制代码
5.4 交互方式


  • 输入问题进行对话
  • 输入 ‘q’ 退出程序
  • 查察 conversation.txt 获取对话记录
6. 性能优化建议


  • 内存管理

    • 使用流式处理大数据
    • 及时清算事件监听器
    • 制止内存泄漏

  • 错误处理

    • 实现重试机制
    • 添加超时处理
    • 优雅降级计谋

  • 并发控制

    • 限制并发请求数
    • 实现请求队列
    • 添加速率限制

总结

Node.js 版本的 DeepSeek API 实现充分利用了异步编程特性,提供了流通的对话体验和完善的错误处理机制。代码结构清晰,易于维护和扩展。
立即体验

想要体验 DeepSeek 的强大功能?现在就开始吧!
快来体验 DeepSeek:https://cloud.siliconflow.cn/i/vnCCfVaQ
快来体验 DeepSeek:https://cloud.siliconflow.cn/i/vnCCfVaQ
快来体验 DeepSeek:https://cloud.siliconflow.cn/i/vnCCfVaQ

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

海哥

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表