马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
简介
本文将先容如何使用 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: [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('
- ----------------------------------------');
- 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[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 交互方式
- 输入问题进行对话
- 输入 ‘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企服之家,中国第一个企服评测及商务社交产业平台。 |