Browse Source

✨ feat: 新增AI对话接口

Pchen. 2 months ago
parent
commit
0464ae5307
2 changed files with 115 additions and 0 deletions
  1. 71 0
      apis/AI/AIChat.js
  2. 44 0
      apis/AI/GetAIChatMessages.js

+ 71 - 0
apis/AI/AIChat.js

@@ -0,0 +1,71 @@
+const API = require("../../lib/API")
+const AccessControl = require("../../lib/AccessControl")
+const { BaseStdResponse } = require("../../BaseStdResponse")
+const db = require("../../plugin/DataBase/db")
+const axios = require("axios")
+const { core_url } = require("../../config.json")
+
+class AIChat extends API {
+    constructor() {
+        super()
+        this.setMethod("POST")
+        this.setPath("/AI/Chat")
+    }
+
+    async onRequest(req, res) {
+        const { uuid, session, message } = req.query
+
+        // 参数校验
+        if (!uuid || !session || !message) {
+            return res.json({ ...BaseStdResponse.MISSING_PARAMETER })
+        }
+
+        // session 校验
+        const sessionValid = await AccessControl.checkSession(uuid, session)
+        if (!sessionValid) {
+            return res.status(401).json({ ...BaseStdResponse.ACCESS_DENIED })
+        }
+
+        const userTime = new Date().getTime() // 用户消息发送时间
+
+        try {
+            const endpoint = `${core_url}/ai/chat`
+            const aiResponse = await axios.post(endpoint, { uuid, message })
+            console.log(aiResponse.data)
+
+            const aiData = aiResponse?.data?.loc[0]
+            if (!aiData || !aiData.msg) {
+                throw new Error("AI响应格式错误")
+            }
+
+            const aiContent = aiData.msg
+            const aiTime = new Date().getTime()
+
+            res.json({
+                ...BaseStdResponse.OK,
+                data: aiData
+            })
+
+            // 异步写入数据库
+            const insertUserMessage = db.query(
+                'INSERT INTO messages (uuid, content, time, type) VALUES (?, ?, ?, "user")',
+                [uuid, message, userTime]
+            )
+
+            const insertAIMessage = db.query(
+                'INSERT INTO messages (uuid, content, time, type) VALUES (?, ?, ?, "ai")',
+                [uuid, aiContent, aiTime]
+            )
+
+            await Promise.all([insertUserMessage, insertAIMessage])
+        } catch (error) {
+            this.logger.error("消息发送失败:" + error.stack)
+            res.json({
+                ...BaseStdResponse.ERR,
+                msg: "消息发送失败,请稍后再试"
+            })
+        }
+    }
+}
+
+module.exports.AIChat = AIChat

+ 44 - 0
apis/AI/GetAIChatMessages.js

@@ -0,0 +1,44 @@
+const API = require("../../lib/API")
+const db = require("../../plugin/DataBase/db")
+const AccessControl = require("../../lib/AccessControl")
+const { BaseStdResponse } = require("../../BaseStdResponse")
+
+class GetAIChatMessages extends API {
+    constructor() {
+        super()
+
+        this.setPath('/AI/GetAIChatMessages')
+        this.setMethod('GET')
+    }
+
+    async onRequest(req, res) {
+        let { uuid, session} = 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
+            })
+
+        let sql = 'SELECT content, time, type, read FROM messages WHERE uuid = ?'
+        let rows = await db.query(sql, [uuid])
+
+        if (!rows || rows.length === 0)
+            return res.json({
+                ...BaseStdResponse.OK,
+                data: []
+            })
+
+        res.json({
+            ...BaseStdResponse.OK,
+            data: rows
+        })
+
+    }
+}
+
+module.exports.GetAIChatMessages = GetAIChatMessages