Browse Source

🎈 perf: 修改AI消息获取方式为轮询

Pchen. 2 months ago
parent
commit
3933770ef1
2 changed files with 53 additions and 9 deletions
  1. 15 9
      apis/AI/AIChat.js
  2. 38 0
      apis/AI/GetAIChatMessage.js

+ 15 - 9
apis/AI/AIChat.js

@@ -2,6 +2,8 @@ const API = require("../../lib/API")
 const AccessControl = require("../../lib/AccessControl")
 const { BaseStdResponse } = require("../../BaseStdResponse")
 const db = require("../../plugin/DataBase/db")
+const Redis = require('../../plugin/DataBase/Redis')
+const { v4: uuidv4 } = require('uuid')
 const axios = require("axios")
 const { core_url } = require("../../config.json")
 
@@ -16,9 +18,9 @@ class AIChat extends API {
         const { uuid, session, message } = req.body
 
         // 参数校验
-        if (!uuid || !session || !message) 
+        if (!uuid || !session || !message)
             return res.json({ ...BaseStdResponse.MISSING_PARAMETER })
-        
+
 
         // session 校验
         const sessionValid = await AccessControl.checkSession(uuid, session)
@@ -27,20 +29,25 @@ class AIChat extends API {
         }
 
         const userTime = new Date().getTime() // 用户消息发送时间
+        const msgid = uuidv4()
+
+        res.json({
+            ...BaseStdResponse.OK,
+            id: msgid
+        })
 
         try {
             const endpoint = `${core_url}/ai/chat`
             const aiResponse = await axios.post(endpoint, { uuid, message })
 
             const aiData = aiResponse?.data?.msg
-            if (!aiData) 
+            if (!aiData)
                 throw new Error("AI响应格式错误")
 
             const aiTime = new Date().getTime()
 
-            res.json({
-                ...BaseStdResponse.OK,
-                data: aiData
+            await Redis.set(`message:${msgid}`, aiData, {
+                EX: 600
             })
 
             // 异步写入数据库
@@ -57,9 +64,8 @@ class AIChat extends API {
             await Promise.all([insertUserMessage, insertAIMessage])
         } catch (error) {
             this.logger.error("消息发送失败:" + error.stack)
-            res.json({
-                ...BaseStdResponse.ERR,
-                msg: "消息发送失败,请稍后再试"
+            await Redis.set(`message:${msgid}`, '消息发送失败,请稍后再试', {
+                EX: 600
             })
         }
     }

+ 38 - 0
apis/AI/GetAIChatMessage.js

@@ -0,0 +1,38 @@
+const API = require("../../lib/API")
+const db = require("../../plugin/DataBase/db")
+const Redis = require('../../plugin/DataBase/Redis')
+const AccessControl = require("../../lib/AccessControl")
+const { BaseStdResponse } = require("../../BaseStdResponse")
+
+class GetAIChatMessage extends API {
+    constructor() {
+        super()
+
+        this.setPath('/AI/GetAIChatMessage')
+        this.setMethod('GET')
+    }
+
+    async onRequest(req, res) {
+        let { uuid, session, id } = req.query
+        if ([uuid, session].some(value => value === '' || value === null || value === undefined))
+            return res.json({
+                ...BaseStdResponse.MISSING_PARAMETER
+            })
+
+        // 检查 session
+        if (!await AccessControl.checkSession(uuid, session))
+            return res.status(401).json({
+                ...BaseStdResponse.ACCESS_DENIED
+            })
+
+        const data = await Redis.get(`message:${id}`)
+       
+        res.json({
+            ...BaseStdResponse.OK,
+            data
+        })
+
+    }
+}
+
+module.exports.GetAIChatMessage = GetAIChatMessage