chat_controller.go 2.6 KB

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