AIChat.js 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. const API = require("../../lib/API")
  2. const AccessControl = require("../../lib/AccessControl")
  3. const { BaseStdResponse } = require("../../BaseStdResponse")
  4. const db = require("../../plugin/DataBase/db")
  5. const Redis = require('../../plugin/DataBase/Redis')
  6. const { v4: uuidv4 } = require('uuid')
  7. const axios = require("axios")
  8. const { core_url } = require("../../config.json")
  9. class AIChat extends API {
  10. constructor() {
  11. super()
  12. this.setMethod("POST")
  13. this.setPath("/AI/Chat")
  14. }
  15. async onRequest(req, res) {
  16. const { uuid, session, message } = req.body
  17. // 参数校验
  18. if (!uuid || !session || !message)
  19. return res.json({ ...BaseStdResponse.MISSING_PARAMETER })
  20. // session 校验
  21. const sessionValid = await AccessControl.checkSession(uuid, session)
  22. if (!sessionValid) {
  23. return res.status(401).json({ ...BaseStdResponse.ACCESS_DENIED })
  24. }
  25. const userTime = new Date().getTime() // 用户消息发送时间
  26. const msgid = uuidv4()
  27. res.json({
  28. ...BaseStdResponse.OK,
  29. id: msgid
  30. })
  31. try {
  32. const endpoint = `${core_url}/ai/chat`
  33. const aiResponse = await axios.post(endpoint, { uuid, message })
  34. const aiData = aiResponse?.data?.msg
  35. if (!aiData)
  36. throw new Error("AI响应格式错误")
  37. const aiTime = new Date().getTime()
  38. await Redis.set(`message:${msgid}`, aiData, {
  39. EX: 600
  40. })
  41. // 异步写入数据库
  42. const insertUserMessage = db.query(
  43. 'INSERT INTO messages (uuid, content, time, type) VALUES (?, ?, ?, "user")',
  44. [uuid, message, userTime]
  45. )
  46. const insertAIMessage = db.query(
  47. 'INSERT INTO messages (uuid, content, time, type) VALUES (?, ?, ?, "ai")',
  48. [uuid, aiData, aiTime]
  49. )
  50. await Promise.all([insertUserMessage, insertAIMessage])
  51. } catch (error) {
  52. this.logger.error("消息发送失败:" + error.stack)
  53. await Redis.set(`message:${msgid}`, '消息发送失败,请稍后再试', {
  54. EX: 600
  55. })
  56. }
  57. }
  58. }
  59. module.exports.AIChat = AIChat