简介
本文将介绍如何使用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 安装依赖
在项目目录下打开命令行,执行:
#安装项目依赖npminstall#如果出现权限问题,可以尝试:sudonpminstall#Linux/Mac#或npminstall--force#Windows
此命令会安装 package.json 中定义的所有依赖项:
axios: 用于发送 HTTP 请求
moment: 用于时间格式化
如果安装过程中遇到网络问题,可以尝试使用国内镜像:
#设置淘宝镜像npmconfigsetregistryhttps://registry.npmmirror.com#然后重新安装npminstall
1.4 运行程序
安装完依赖后,使用以下命令启动程序:
#使用npm启动npmstart#或者直接使用nodenodemain.js
如果遇到权限问题:
#Linux/Macsudonpmstart#Windows(以管理员身份运行命令提示符)npmstart
2. 完整代码实现
2.1 package.json
{\"name\":\"deepseek-chat\",\"version\":\"1.0.0\",\"description\":\"DeepSeekAPIchatimplementationinNode.js\",\"main\":\"main.js\",\"scripts\":{\"start\":\"nodemain.js\"},\"dependencies\":{\"axios\":\"^1.6.2\",\"moment\":\"^2.29.4\"}}
2.2 main.js
constfs=require(\'fs\').promises;constreadline=require(\'readline\');constaxios=require(\'axios\');constmoment=require(\'moment\');classDeepSeekChat{constructor(){this.url=\'https://api.siliconflow.cn/v1/chat/completions\';this.apiKey=\'YOUR_API_KEY\';//替换为你的APIKeythis.logFile=\'conversation.txt\';}asyncsaveToFile(content,isQuestion=false){consttimestamp=moment().format(\'YYYY-MM-DDHH:mm:ss\');consttext=isQuestion?`\\n[${timestamp}]Question:\\n${content}\\n\\n[${timestamp}]Answer:\\n`:content;awaitfs.appendFile(this.logFile,text);}asyncchat(){//创建命令行接口constrl=readline.createInterface({input:process.stdin,output:process.stdout});//使用Promise封装问题输入constquestion=(prompt)=>newPromise((resolve)=>rl.question(prompt,resolve));try{while(true){constuserInput=awaitquestion(\'\\n请输入您的问题(输入q退出):\');if(userInput.trim().toLowerCase()===\'q\'){console.log(\'程序已退出\');break;}//保存问题awaitthis.saveToFile(userInput,true);//准备请求数据constdata={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{//发送流式请求constresponse=awaitaxios({method:\'post\',url:this.url,data:data,headers:{\'Content-Type\':\'application/json\',\'Authorization\':`Bearer${this.apiKey}`},responseType:\'stream\'});//处理流式响应response.data.on(\'data\',async(chunk)=>{constlines=chunk.toString().split(\'\\n\');for(constlineoflines){if(line.trim()===\'\')continue;if(line.trim()===\'data:[DONE]\')continue;if(line.startsWith(\'data:\')){try{constjson=JSON.parse(line.slice(6));if(json.choices[0].delta.content){constcontent=json.choices[0].delta.content;process.stdout.write(content);awaitthis.saveToFile(content);}}catch(e){continue;}}}});//等待响应完成awaitnewPromise((resolve)=>{response.data.on(\'end\',async()=>{console.log(\'\\n----------------------------------------\');awaitthis.saveToFile(\'\\n----------------------------------------\\n\');resolve();});});}catch(error){consterrorMsg=`请求错误:${error.message}\\n`;console.error(errorMsg);awaitthis.saveToFile(errorMsg);}}}finally{rl.close();}}}//运行程序asyncfunctionmain(){constchatbot=newDeepSeekChat();awaitchatbot.chat();}main().catch(console.error);
3. 代码详解
3.1 类结构
DeepSeekChat
: 主类,封装所有功能constructor
: 构造函数,初始化配置saveToFile
: 异步保存对话记录chat
: 主对话循环
3.2 关键功能
文件操作
asyncsaveToFile(content,isQuestion=false){consttimestamp=moment().format(\'YYYY-MM-DDHH:mm:ss\');consttext=isQuestion?`\\n[${timestamp}]Question:\\n${content}\\n\\n[${timestamp}]Answer:\\n`:content;awaitfs.appendFile(this.logFile,text);}
流式处理
response.data.on(\'data\',async(chunk)=>{constlines=chunk.toString().split(\'\\n\');for(constlineoflines){if(line.startsWith(\'data:\')){constjson=JSON.parse(line.slice(6));if(json.choices[0].delta.content){constcontent=json.choices[0].delta.content;process.stdout.write(content);awaitthis.saveToFile(content);}}}});
3.3 参数说明
model
: 使用的模型名称stream
: 启用流式输出max_tokens
: 最大输出长度 (2048)temperature
: 控制随机性 (0.7)top_p
,top_k
: 采样参数frequency_penalty
: 重复惩罚系数
4.错误处理
代码包含完整的错误处理机制:
网络请求错误处理
JSON 解析错误处理
文件操作错误处理
优雅退出处理
5. 使用方法
5.1 安装依赖
在项目目录下打开命令行,执行:
#安装项目依赖npminstall#如果出现权限问题,可以尝试:sudonpminstall#Linux/Mac#或npminstall--force#Windows
此命令会安装 package.json 中定义的所有依赖项:
axios: 用于发送 HTTP 请求
moment: 用于时间格式化
如果安装过程中遇到网络问题,可以尝试使用国内镜像:
#设置淘宝镜像npmconfigsetregistryhttps://registry.npmmirror.com#然后重新安装npminstall
5.2 修改配置
在main.js
中替换YOUR_API_KEY
为你的实际 API Key。
5.3 运行程序
安装完依赖后,使用以下命令启动程序:
#使用npm启动npmstart#或者直接使用nodenodemain.js
如果遇到权限问题:
#Linux/Macsudonpmstart#Windows(以管理员身份运行命令提示符)npmstart
5.4 交互方式
输入问题进行对话
输入 ‘q’ 退出程序
查看 conversation.txt 获取对话记录
6. 性能优化建议
内存管理
使用流式处理大数据
及时清理事件监听器
避免内存泄漏
错误处理
实现重试机制
添加超时处理
优雅降级策略
并发控制
限制并发请求数
实现请求队列
添加速率限制
总结
本文详细阐述了如何利用Node.js技术调用DeepSeek API,并实现一个流式对话的聊天机器人。教程从创建命令行交互接口开始,逐步介绍了如何接收用户输入、通过axios库与DeepSeek API进行通信、实时处理API返回的流式数据,并将对话内容记录到日志文件中。文章不仅提供了完整的代码实现,还深入讲解了每个步骤的逻辑和关键细节,如错误处理、配置灵活性等。通过本教程,读者可以掌握使用Node.js调用API实现流式对话的基本方法,为开发自己的聊天机器人或对话系统打下坚实基础。