Node.js接入DeepSeek實(shí)現(xiàn)流式對(duì)話功能
準(zhǔn)備工作
1. 獲取API Key
首先,您需要在DeepSeek官網(wǎng)注冊(cè)賬號(hào)并創(chuàng)建一個(gè)項(xiàng)目來(lái)獲取API Key。這個(gè)Key將用于驗(yàn)證您的請(qǐng)求。
2. 安裝依賴
確保你的Node.js環(huán)境已準(zhǔn)備就緒,并安裝以下npm包:
npm install axios express http
實(shí)現(xiàn)步驟
1. 創(chuàng)建Express服務(wù)器
我們將使用Express框架快速搭建一個(gè)HTTP服務(wù)器。以下是基本設(shè)置代碼片段:
const express = require('express'); const app = express(); app.use(express.json()); // 定義主機(jī)名和端口 const hostname = '127.0.0.1'; const port = 3002;
2. 配置CORS中間件
為了允許跨域請(qǐng)求,我們需要添加CORS支持:
app.all('*', function (req, res, next) { // CORS headers setup... res.header('Access-Control-Allow-Origin', '*'); // 允許任意域名發(fā)起跨域請(qǐng)求 res.header('Access-Control-Allow-Headers', 'Content-Type, Content-Length, Authorization, Accept, X-Requested-With'); // 允許指定的頭部字段 res.header('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS'); // 允許指定的 HTTP 方法 res.header('X-Powered-By', '3.2.1'); // 添加自定義頭部信息 if ('OPTIONS' == req.method) { // 如果請(qǐng)求方法是 OPTIONS,則直接返回成功響應(yīng) res.send(200); } else { // 否則繼續(xù)處理請(qǐng)求 next(); } });
3. 定義路由處理函數(shù)
接下來(lái),定義處理/chat/completions
請(qǐng)求的路由,這里我們采用流式響應(yīng)方式處理數(shù)據(jù)返回:
router.get('/chat/completions', async (req, res) => { let messages = [{ role: "user", content: req.query.mesage}] let { config } = await createChatCompletion(messages) let response = await axios(config) res.setHeader('Content-Type', 'text/event-stream'); res.setHeader('Cache-Control', 'no-cache'); res.setHeader('Connection', 'keep-alive'); // 處理流式響應(yīng) response.data.on('data', async (chunk) => { const lines = chunk.toString().split('\n'); // 將數(shù)據(jù)塊轉(zhuǎn)換為字符串并按行分割 for (const line of lines) { if (line.trim() === '') continue; // 跳過(guò)空行 if (line.trim() === 'data: [DONE]') continue; // 跳過(guò)結(jié)束標(biāo)記 if (line.startsWith('data:')) { // 檢查是否以 "data: " 開(kāi)頭 try { const json = JSON.parse(line.slice(6)); // 去掉前綴 "data: " 并解析 JSON if (json.choices[0].delta.content) { // 檢查是否有內(nèi)容 let contents = [] let index = 0 contents.push(json.choices[0].delta.content) for (let i = 0; i < contents.length; i++) { setTimeout(() => { res.write(`data: ${JSON.stringify({ content: contents[index] })}\n\n`); index++ }, 200); } } } catch (e) { continue; // 如果解析失敗,繼續(xù)處理下一行 } } } }); // 處理邏輯... });
4. 調(diào)用DeepSeek API
編寫輔助函數(shù)createChatCompletion
來(lái)構(gòu)造請(qǐng)求參數(shù)并調(diào)用DeepSeek API:
async function createChatCompletion(messages) { const data = JSON.stringify({ "messages": messages, "model": "deepseek-reasoner", "response_format": {"type":"text"}, "stream": true, }); let config = { method: 'post', url: 'https://api.deepseek.com/chat/completions', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer YOUR_API_KEY`, }, responseType: "stream", data: data }; return {config}; }
請(qǐng)記得替換YOUR_API_KEY
為您的實(shí)際API密鑰。
5. 啟動(dòng)服務(wù)器
最后,啟動(dòng)Express服務(wù)器監(jiān)聽(tīng)指定端口:
app.listen(PORT, HOSTNAME, () => { console.log(`Server running at http://${HOSTNAME}:${PORT}/`); });
前端處理
Server-Sent Events(SSE)是一種用于實(shí)現(xiàn)服務(wù)器向客戶端單向推送數(shù)據(jù)的技術(shù)。使用了 SSE 來(lái)實(shí)現(xiàn)客戶端與服務(wù)器之間的實(shí)時(shí)通信。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Server-Sent Events Example</title> </head> <body> <h1>與deepseek聊天</h1> <div> <textarea id="userInput" placeholder="輸入你的消息..." rows="4" cols="50"></textarea><br /> <button onclick="sendMessage()">發(fā)送消息</button> </div> <div id="messages"> <!-- 服務(wù)器返回的消息將顯示在這里 --> </div> <script> function sendMessage () { const responseArea = document.getElementById('messages'); const userInput = document.getElementById('userInput').value; let p = document.createElement('p') const div = document.createElement('div') div.classList = 'title' div.innerHTML = userInput responseArea.appendChild(div) if (!userInput) return; // 創(chuàng)建一個(gè)新的 EventSource 對(duì)象 const eventSource = new EventSource(`http://127.0.0.1:3002/chat/completions?mesage=${userInput}`); // 監(jiān)聽(tīng) 'message' 事件,每當(dāng)服務(wù)器推送一條新消息時(shí)觸發(fā) eventSource.onmessage = function (event) { try { const json = JSON.parse(event.data); updateResponseArea(json.content, p); } catch (e) { console.error('Error parsing JSON:', e); } }; // 監(jiān)聽(tīng) 'open' 事件,表示連接已成功打開(kāi) eventSource.onopen = function () { console.log('Connection to server opened.'); }; // 監(jiān)聽(tīng) 'error' 事件,處理任何錯(cuò)誤或連接中斷的情況 eventSource.onerror = function (error) { if (eventSource.readyState === EventSource.CLOSED) { console.log('Connection was closed by the server.'); } else { console.error('EventSource failed:', error); } eventSource.close(); // 手動(dòng)關(guān)閉連接 }; // 更新頁(yè)面上的響應(yīng)區(qū)域 function updateResponseArea (message, p) { p.classList = 'back' p.innerHTML += `<span>${message}</span>`; responseArea.appendChild(p) } } </script> </body> </html>
結(jié)論
通過(guò)以上步驟,您已經(jīng)成功地使用Node.js集成了DeepSeek的聊天完成API。這不僅能夠增強(qiáng)應(yīng)用程序的功能性,還能提供更加智能化的用戶體驗(yàn)。希望這篇指南能幫助您順利接入DeepSeek服務(wù),開(kāi)啟探索AI之旅!
效果
由于無(wú)法放置視頻,流式效果無(wú)法展現(xiàn)
請(qǐng)注意,上述代碼示例基于您提供的代碼進(jìn)行了簡(jiǎn)化和抽象,旨在提供一個(gè)清晰的流程說(shuō)明。實(shí)際開(kāi)發(fā)時(shí),請(qǐng)根據(jù)自己的需求進(jìn)行調(diào)整和優(yōu)化。
以上就是Node.js接入DeepSeek實(shí)現(xiàn)流式對(duì)話功能的詳細(xì)內(nèi)容,更多關(guān)于Node.js DeepSeek流式對(duì)話的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
整理幾個(gè)關(guān)鍵節(jié)點(diǎn)深入理解nodejs
這篇文章主要介紹了整理幾個(gè)關(guān)鍵節(jié)點(diǎn)深入理解nodejs,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,需要的小伙伴可以參考一下,需要的小伙伴可以參考一下2022-07-07Node.js 文件夾目錄結(jié)構(gòu)創(chuàng)建實(shí)例代碼
下面小編就為大家?guī)?lái)一篇Node.js 文件夾目錄結(jié)構(gòu)創(chuàng)建實(shí)例代碼。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-07-07三分鐘教你用Node做一個(gè)微信哄女友神器(面向小白)
這篇文章主要介紹了三步教你用Node做一個(gè)微信哄女友神器(面向小白),用node和wechaty微信網(wǎng)頁(yè)接口開(kāi)發(fā)的一款小工具,可以定時(shí)給女朋友發(fā)每天的天氣情況,天氣提醒,每日一句,通過(guò)配置機(jī)器人api后還可以實(shí)現(xiàn)微信機(jī)器人自動(dòng)陪女朋友聊天,需要的朋友可以參考下2019-06-06Nodejs爬蟲(chóng)進(jìn)階教程之異步并發(fā)控制
這篇文章主要介紹了Nodejs爬蟲(chóng)進(jìn)階教程之異步并發(fā)控制的相關(guān)資料,需要的朋友可以參考下2016-02-02手把手教你實(shí)現(xiàn) Promise的使用方法
這篇文章主要介紹了手把手教你實(shí)現(xiàn) Promise的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09NodeJS 實(shí)現(xiàn)多語(yǔ)言的示例代碼
這篇文章主要介紹了NodeJS 實(shí)現(xiàn)多語(yǔ)言的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-09-09Node.js API詳解之 dns模塊用法實(shí)例分析
這篇文章主要介紹了Node.js API詳解之 dns模塊用法,結(jié)合實(shí)例形式分析了Node.js API中dns模塊基本功能、相關(guān)函數(shù)與使用技巧,需要的朋友可以參考下2020-05-05node.js利用mongoose獲取mongodb數(shù)據(jù)的格式化問(wèn)題詳解
這篇文章主要給大家介紹了關(guān)于node.js利用mongoose獲取mongodb數(shù)據(jù)的格式化問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)把。2017-10-10