Node.js 调用 DeepSeek API 完整指南

news/2025/2/6 14:33:25/

简介

本文将介绍如何使用 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 Keythis.logFile = 'conversation.txt';}async saveToFile(content, isQuestion = false) {const timestamp = moment().format('YYYY-MM-DD HH:mm:ss');const text = isQuestion? `\n[${timestamp}] Question:\n${content}\n\n[${timestamp}] Answer:\n`: 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('\n请输入您的问题 (输入 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('\n');for (const line of lines) {if (line.trim() === '') continue;if (line.trim() === 'data: [DONE]') continue;if (line.startsWith('data: ')) {try {const json = JSON.parse(line.slice(6));if (json.choices[0].delta.content) {const content = json.choices[0].delta.content;process.stdout.write(content);await this.saveToFile(content);}} catch (e) {continue;}}}});// 等待响应完成await new Promise((resolve) => {response.data.on('end', async () => {console.log('\n----------------------------------------');await this.saveToFile('\n----------------------------------------\n');resolve();});});} catch (error) {const errorMsg = `请求错误: ${error.message}\n`;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? `\n[${timestamp}] Question:\n${content}\n\n[${timestamp}] Answer:\n`: content;await fs.appendFile(this.logFile, text);
}
流式处理
response.data.on('data', async (chunk) => {const lines = chunk.toString().split('\n');for (const line of lines) {if (line.startsWith('data: ')) {const json = JSON.parse(line.slice(6));if (json.choices[0].delta.content) {const content = json.choices[0].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 交互方式

  1. 输入问题进行对话
  2. 输入 ‘q’ 退出程序
  3. 查看 conversation.txt 获取对话记录

6. 性能优化建议

  1. 内存管理

    • 使用流式处理大数据
    • 及时清理事件监听器
    • 避免内存泄漏
  2. 错误处理

    • 实现重试机制
    • 添加超时处理
    • 优雅降级策略
  3. 并发控制

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

总结

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


http://www.ppmy.cn/news/1569826.html

相关文章

【Linux】日志设计模式与实现

🔥 个人主页:大耳朵土土垚 🔥 所属专栏:Linux系统编程 这里将会不定期更新有关Linux的内容,欢迎大家点赞,收藏,评论🥳🥳🎉🎉🎉 文章目…

pycharm 中的 Mark Directory As 的作用是什么?

文章目录 Mark Directory As 的作用PYTHONPATH 是什么PYTHONPATH 作用注意事项 Mark Directory As 的作用 可以查看官网:https://www.jetbrains.com/help/pycharm/project-structure-dialog.html#-9p9rve_3 我们这里以 Mark Directory As Sources 为例进行介绍。 这…

rk3506 sd卡启动

1 修改系统配置文件,打开ext4 #SDMMC RK_ROOTFS_TYPE"ext4" RK_ROOTFS_INSTALL_MODULESy RK_WIFIBT_CHIP"AIC8800" # RK_ROOTFS_LOG_GUARDIAN is not set RK_UBOOT_CFG_FRAGMENTS"rk3506_tb" RK_UBOOT_SPLy RK_KERNEL_CFG"rk3506_defconfi…

【办公类-99-01】20250201学具PDF打印会缩小一圈——解决办法:换一个PDF阅读器

背景需求: 2024年1月13日,快要放寒假了,组长拿着我们班的打印好的一叠教案来调整。 “前面周计划下面的家园共育有调整,你自己看批注。” “还有你这个教案部分的模版有问题,太小(窄)了。考虑…

C语言基础系列【2】开发环境搭建

选择合适的编译器 在C语言或者C这种编译型语言开发中,编译器是必不可少的工具。它将C语言源代码转换为机器代码,使程序能够在计算机上运行。 常见的C语言编译器包括GCC(GNU Compiler Collection,GNU编译器套件)、Cla…

JS中Boolean 的妙用

显示转换与隐式转换 为了加深对Boolean的语法理解,我们先回忆一下JavaScript中的显示与隐私转换 显示转换 显示转换是指通过明确的代码,主动江一中数据类型转换为另一种类型,这种方式通常是直观的,可控的。 常见方法&#xff1…

C语言勘破之路-最终篇 —— 预处理(上)

人无完人,持之以恒,方能见真我!!! 共同进步!! 文章目录 一、预定义符号二、#define定义常量三.、#define定义宏四、带有副作用的宏参数五、宏替换的规则六、宏和函数的对比1.宏的优势2.函数的优…

为AI聊天工具添加一个知识系统 之87 详细设计之28 Derivation 统一建模元模型 之1

文本要点 要点 Derivation 统一建模元模型 Derivation 统一建模元模型:意识原型的祖传代码,即支撑 程序框架的 符号学中的 自然和逻辑树。 这棵树的雏形中描述了三种建模工件:语用钩子,语法糖和语义胶水。 三种工件对应的三“…