1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- 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")
- class AIChat extends API {
- constructor() {
- super()
- this.setMethod("POST")
- this.setPath("/AI/Chat")
- }
- async onRequest(req, res) {
- const { uuid, session, message } = req.body
- // 参数校验
- 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() // 用户消息发送时间
- 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)
- throw new Error("AI响应格式错误")
- const aiTime = new Date().getTime()
- await Redis.set(`message:${msgid}`, aiData, {
- EX: 600
- })
- // 异步写入数据库
- 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, aiData, aiTime]
- )
- await Promise.all([insertUserMessage, insertAIMessage])
- } catch (error) {
- this.logger.error("消息发送失败:" + error.stack)
- await Redis.set(`message:${msgid}`, '消息发送失败,请稍后再试', {
- EX: 600
- })
- }
- }
- }
- module.exports.AIChat = AIChat
|