chat_controller.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. package rag
  2. import (
  3. "eta/eta_api/controllers"
  4. "eta/eta_api/models/system"
  5. "eta/eta_api/services/llm/facade"
  6. "eta/eta_api/utils"
  7. "eta/eta_api/utils/ws"
  8. "github.com/gorilla/websocket"
  9. "net"
  10. "net/http"
  11. "time"
  12. )
  13. type ChatController struct {
  14. controllers.BaseAuthController
  15. }
  16. func (cc *ChatController) Prepare() {
  17. cc.SysUser = cc.Ctx.Input.GetData("admin").(*system.Admin)
  18. if cc.SysUser == nil || cc.SysUser.AdminId == 0 {
  19. utils.FileLog.Error("用户信息不存在")
  20. cc.Ctx.ResponseWriter.WriteHeader(http.StatusBadRequest)
  21. return
  22. }
  23. }
  24. //// ChatTest @Title 测试知识库问答
  25. //// @Description 测试知识库问答
  26. //// @Success 101 {object} response.ListResp
  27. //// @router /chat/chat_test [post]
  28. //func (kbctrl *KbController) ChatTest() {
  29. // br := new(models.BaseResponse).Init()
  30. // defer func() {
  31. // if br.ErrMsg == "" {
  32. // br.IsSendEmail = false
  33. // }
  34. // kbctrl.Data["json"] = br
  35. // kbctrl.ServeJSON()
  36. // }()
  37. // sysUser := kbctrl.SysUser
  38. // if sysUser == nil {
  39. // br.Msg = "请登录"
  40. // br.ErrMsg = "请登录,SysUser Is Empty"
  41. // br.Ret = 408
  42. // return
  43. // }
  44. // var req facade.LLMKnowledgeChat
  45. // err := json.Unmarshal(kbctrl.Ctx.Input.RequestBody, &req)
  46. // if err != nil {
  47. // br.Msg = "参数解析异常!"
  48. // br.ErrMsg = "参数解析失败,Err:" + err.Error()
  49. // return
  50. // }
  51. // searchResp, err := facade.LLMKnowledgeBaseChat(req)
  52. // if err != nil {
  53. // br.Msg = "知识库问答"
  54. // br.ErrMsg = "知识库问答:" + err.Error()
  55. // return
  56. // }
  57. // br.Data = searchResp
  58. // br.Ret = 200
  59. // br.Success = true
  60. // br.Msg = "知识库问答成功"
  61. //}
  62. // ChatConnect @Title 知识库问答创建对话连接
  63. // @Description 知识库问答创建对话连接
  64. // @Success 101 {object} response.ListResp
  65. // @router /chat/connect [get]
  66. func (cc *ChatController) ChatConnect() {
  67. if !ws.Allow(cc.SysUser.AdminId, ws.CONNECT_LIMITER) {
  68. utils.FileLog.Error("WebSocket连接太频繁,主动拒绝链接")
  69. cc.Ctx.ResponseWriter.WriteHeader(http.StatusTooManyRequests)
  70. return
  71. }
  72. wsCon, err := webSocketHandler(cc.Ctx.ResponseWriter, cc.Ctx.Request)
  73. if err != nil {
  74. utils.FileLog.Error("WebSocket连接失败:", err)
  75. cc.Ctx.ResponseWriter.WriteHeader(http.StatusBadRequest)
  76. return
  77. }
  78. facade.AddSession(cc.SysUser.AdminId, wsCon)
  79. }
  80. // upGrader 用于将HTTP连接升级为WebSocket连接
  81. var upGrader = websocket.Upgrader{
  82. ReadBufferSize: 1024,
  83. WriteBufferSize: 1024,
  84. CheckOrigin: func(r *http.Request) bool {
  85. return true
  86. },
  87. }
  88. // WebSocketHandler 处理WebSocket连接
  89. func webSocketHandler(w http.ResponseWriter, r *http.Request) (conn *websocket.Conn, err error) {
  90. conn, err = upGrader.Upgrade(w, r, nil)
  91. if err != nil {
  92. utils.FileLog.Error("升级协议失败:WebSocket:%s", err.Error())
  93. return
  94. }
  95. // 获取底层 TCP 连接并设置保活
  96. if tcpConn, ok := conn.NetConn().(*net.TCPConn); ok {
  97. _ = tcpConn.SetKeepAlive(true)
  98. _ = tcpConn.SetKeepAlivePeriod(90 * time.Second)
  99. utils.FileLog.Info("TCP KeepAlive 已启用")
  100. }
  101. _ = conn.SetReadDeadline(time.Now().Add(ws.ReadTimeout))
  102. return
  103. }