海哥 发表于 2025-2-15 20:17:52

Node.js 调用 DeepSeek API 完整指南

简介

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

1.1 系统要求



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

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

在项目目录下打开命令行,执行:
# 安装项目依赖
npm install

# 如果出现权限问题,可以尝试:
sudo npm install# Linux/Mac
# 或
npm install --force# Windows
此命令会安装 package.json 中界说的所有依靠项:


[*]axios: 用于发送 HTTP 请求
[*]moment: 用于时间格式化
如果安装过程中遇到网络问题,可以尝试使用国内镜像:
# 设置淘宝镜像
npm config set registry https://registry.npmmirror.com

# 然后重新安装
npm install
1.4 运行程序

安装完依靠后,使用以下命令启动程序:
# 使用 npm 启动
npm start

# 或者直接使用 node
node main.js
如果遇到权限问题:
# Linux/Mac
sudo npm start

# Windows (以管理员身份运行命令提示符)
npm start
2. 完整代码实现

2.1 package.json

{
"name": "deepseek-chat",
"version": "1.0.0",
"description": "DeepSeek API chat implementation in Node.js",
"main": "main.js",
"scripts": {
    "start": "node main.js"
},
"dependencies": {
    "axios": "^1.6.2",
    "moment": "^2.29.4"
}
}
2.2 main.js

const fs = require('fs').promises;
const readline = require('readline');
const axios = require('axios');
const moment = require('moment');

class DeepSeekChat {
    constructor() {
      this.url = 'https://api.siliconflow.cn/v1/chat/completions';
      this.apiKey = 'YOUR_API_KEY';// 替换为你的 API Key
      this.logFile = 'conversation.txt';
    }

    async saveToFile(content, isQuestion = false) {
      const timestamp = moment().format('YYYY-MM-DD HH:mm:ss');
      const text = isQuestion
            ? `
[${timestamp}] Question:
${content}

[${timestamp}] Answer:
`
            : content;
      
      await fs.appendFile(this.logFile, text);
    }

    async chat() {
      // 创建命令行接口
      const rl = readline.createInterface({
            input: process.stdin,
            output: process.stdout
      });

      // 使用 Promise 封装问题输入
      const question = (prompt) => new Promise((resolve) => rl.question(prompt, resolve));

      try {
            while (true) {
                const userInput = await question('
请输入您的问题 (输入 q 退出): ');
               
                if (userInput.trim().toLowerCase() === 'q') {
                  console.log('程序已退出');
                  break;
                }

                // 保存问题
                await this.saveToFile(userInput, true);

                // 准备请求数据
                const data = {
                  model: 'deepseek-ai/DeepSeek-V3',
                  messages: [
                        {
                            role: 'user',
                            content: userInput
                        }
                  ],
                  stream: true,
                  max_tokens: 2048,
                  temperature: 0.7,
                  top_p: 0.7,
                  top_k: 50,
                  frequency_penalty: 0.5,
                  n: 1,
                  response_format: {
                        type: 'text'
                  }
                };

                try {
                  // 发送流式请求
                  const response = await axios({
                        method: 'post',
                        url: this.url,
                        data: data,
                        headers: {
                            'Content-Type': 'application/json',
                            'Authorization': `Bearer ${this.apiKey}`
                        },
                        responseType: 'stream'
                  });

                  // 处理流式响应
                  response.data.on('data', async (chunk) => {
                        const lines = chunk.toString().split('
');
                        for (const line of lines) {
                            if (line.trim() === '') continue;
                            if (line.trim() === 'data: ') continue;

                            if (line.startsWith('data: ')) {
                              try {
                                    const json = JSON.parse(line.slice(6));
                                    if (json.choices.delta.content) {
                                        const content = json.choices.delta.content;
                                        process.stdout.write(content);
                                        await this.saveToFile(content);
                                    }
                              } catch (e) {
                                    continue;
                              }
                            }
                        }
                  });

                  // 等待响应完成
                  await new Promise((resolve) => {
                        response.data.on('end', async () => {
                            console.log('
----------------------------------------');
                            await this.saveToFile('
----------------------------------------
');
                            resolve();
                        });
                  });

                } catch (error) {
                  const errorMsg = `请求错误: ${error.message}
`;
                  console.error(errorMsg);
                  await this.saveToFile(errorMsg);
                }
            }
      } finally {
            rl.close();
      }
    }
}

// 运行程序
async function main() {
    const chatbot = new DeepSeekChat();
    await chatbot.chat();
}

main().catch(console.error);
3. 代码详解

3.1 类结构



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

文件操作

async saveToFile(content, isQuestion = false) {
    const timestamp = moment().format('YYYY-MM-DD HH:mm:ss');
    const text = isQuestion
      ? `
[${timestamp}] Question:
${content}

[${timestamp}] Answer:
`
      : content;
   
    await fs.appendFile(this.logFile, text);
}
流式处理

response.data.on('data', async (chunk) => {
    const lines = chunk.toString().split('
');
    for (const line of lines) {
      if (line.startsWith('data: ')) {
            const json = JSON.parse(line.slice(6));
            if (json.choices.delta.content) {
                const content = json.choices.delta.content;
                process.stdout.write(content);
                await this.saveToFile(content);
            }
      }
    }
});
3.3 参数说明



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

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


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

5.1 安装依靠

在项目目录下打开命令行,执行:
# 安装项目依赖
npm install

# 如果出现权限问题,可以尝试:
sudo npm install# Linux/Mac
# 或
npm install --force# Windows
此命令会安装 package.json 中界说的所有依靠项:


[*]axios: 用于发送 HTTP 请求
[*]moment: 用于时间格式化
如果安装过程中遇到网络问题,可以尝试使用国内镜像:
# 设置淘宝镜像
npm config set registry https://registry.npmmirror.com

# 然后重新安装
npm install
5.2 修改设置

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

安装完依靠后,使用以下命令启动程序:
# 使用 npm 启动
npm start

# 或者直接使用 node
node main.js
如果遇到权限问题:
# Linux/Mac
sudo npm start

# Windows (以管理员身份运行命令提示符)
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企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Node.js 调用 DeepSeek API 完整指南