chat_controller.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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. // ChatConnect @Title 知识库问答创建对话连接
  25. // @Description 知识库问答创建对话连接
  26. // @Success 101 {object} response.ListResp
  27. // @router /chat/connect [get]
  28. func (cc *ChatController) ChatConnect() {
  29. if !ws.Allow(cc.SysUser.AdminId, ws.CONNECT_LIMITER) {
  30. utils.FileLog.Error("WebSocket连接太频繁,主动拒绝链接")
  31. cc.Ctx.ResponseWriter.WriteHeader(http.StatusTooManyRequests)
  32. return
  33. }
  34. wsCon, err := webSocketHandler(cc.Ctx.ResponseWriter, cc.Ctx.Request)
  35. if err != nil {
  36. utils.FileLog.Error("WebSocket连接失败:", err)
  37. cc.Ctx.ResponseWriter.WriteHeader(http.StatusBadRequest)
  38. return
  39. }
  40. facade.AddSession(cc.SysUser.AdminId, wsCon)
  41. }
  42. // upGrader 用于将HTTP连接升级为WebSocket连接
  43. var upGrader = websocket.Upgrader{
  44. ReadBufferSize: 1024,
  45. WriteBufferSize: 1024,
  46. CheckOrigin: func(r *http.Request) bool {
  47. return true
  48. },
  49. }
  50. // WebSocketHandler 处理WebSocket连接
  51. func webSocketHandler(w http.ResponseWriter, r *http.Request) (conn *websocket.Conn, err error) {
  52. conn, err = upGrader.Upgrade(w, r, nil)
  53. if err != nil {
  54. utils.FileLog.Error("升级协议失败:WebSocket:%s", err.Error())
  55. return
  56. }
  57. // 获取底层 TCP 连接并设置保活
  58. if tcpConn, ok := conn.NetConn().(*net.TCPConn); ok {
  59. _ = tcpConn.SetKeepAlive(true)
  60. _ = tcpConn.SetKeepAlivePeriod(90 * time.Second)
  61. utils.FileLog.Info("TCP KeepAlive 已启用")
  62. }
  63. _ = conn.SetReadDeadline(time.Now().Add(ws.ReadTimeout))
  64. return
  65. }