From c24b2f5fe32c33cbbef0b315ba19d2f2e6501118 Mon Sep 17 00:00:00 2001 From: Vinlic Date: Tue, 7 May 2024 15:36:00 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=A0=E5=85=A5=E5=BC=82=E6=AD=A5=E9=94=81?= =?UTF-8?q?=EF=BC=8C=E7=A1=AE=E4=BF=9D=E6=AF=8F=E6=AC=A1=E8=B0=83=E7=94=A8?= =?UTF-8?q?=E6=8B=A5=E6=9C=89=E5=B9=B2=E5=87=80=E7=9A=84=E4=B8=8A=E4=B8=8B?= =?UTF-8?q?=E6=96=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/controllers/chat.ts | 102 ++++++++++++++++++++---------------- 1 file changed, 56 insertions(+), 46 deletions(-) diff --git a/src/api/controllers/chat.ts b/src/api/controllers/chat.ts index 2e4c2d0..bfd60c4 100644 --- a/src/api/controllers/chat.ts +++ b/src/api/controllers/chat.ts @@ -41,6 +41,9 @@ const accessTokenMap = new Map(); // access_token请求队列映射 const accessTokenRequestQueueMap: Record = {}; +// 聊天异步锁 +const chatLock = new AsyncLock(); + /** * 请求access_token * @@ -160,30 +163,33 @@ async function createCompletion( return (async () => { logger.info(messages); - // 清除上下文 - await clearContext(model, refreshToken); - // 请求流 - const token = await acquireToken(refreshToken); - const result = await axios.post( - "https://chat.deepseek.com/api/v0/chat/completions", - { - message: messagesPrepare(messages), - stream: true, - model_preference: null, - model_class: "deepseek_chat", - temperature: 0 - }, - { - headers: { - Authorization: `Bearer ${token}`, - ...FAKE_HEADERS + // 确保当前请求有干净上下文 + const result = await chatLock.acquire(refreshToken, async () => { + // 清除上下文 + await clearContext(model, refreshToken); + // 请求流 + const token = await acquireToken(refreshToken); + return await axios.post( + "https://chat.deepseek.com/api/v0/chat/completions", + { + message: messagesPrepare(messages), + stream: true, + model_preference: null, + model_class: "deepseek_chat", + temperature: 0 }, - // 120秒超时 - timeout: 120000, - validateStatus: () => true, - responseType: "stream", - } - ); + { + headers: { + Authorization: `Bearer ${token}`, + ...FAKE_HEADERS + }, + // 120秒超时 + timeout: 120000, + validateStatus: () => true, + responseType: "stream", + } + ); + }); if (result.headers["content-type"].indexOf("text/event-stream") == -1) { result.data.on("data", buffer => logger.error(buffer.toString())); @@ -235,30 +241,34 @@ async function createCompletionStream( ) { return (async () => { logger.info(messages); - // 清除上下文 - await clearContext(model, refreshToken); - // 请求流 - const token = await acquireToken(refreshToken); - const result = await axios.post( - "https://chat.deepseek.com/api/v0/chat/completions", - { - message: messagesPrepare(messages), - stream: true, - model_preference: null, - model_class: "deepseek_chat", - temperature: 0 - }, - { - headers: { - Authorization: `Bearer ${token}`, - ...FAKE_HEADERS + + const result = await chatLock.acquire(refreshToken, async () => { + // 清除上下文 + await clearContext(model, refreshToken); + // 请求流 + const token = await acquireToken(refreshToken); + return await axios.post( + "https://chat.deepseek.com/api/v0/chat/completions", + { + message: messagesPrepare(messages), + stream: true, + model_preference: null, + model_class: "deepseek_chat", + temperature: 0 }, - // 120秒超时 - timeout: 120000, - validateStatus: () => true, - responseType: "stream", - } - ); + { + headers: { + Authorization: `Bearer ${token}`, + ...FAKE_HEADERS + }, + // 120秒超时 + timeout: 120000, + validateStatus: () => true, + responseType: "stream", + } + ); + }); + if (result.headers["content-type"].indexOf("text/event-stream") == -1) { logger.error( `Invalid response Content-Type:`,