package flow import ( "context" sessionDao "ai-agent/workflow/dao/session" sessionDto "ai-agent/workflow/model/dto/session" wsCommon "gitea.redpowerfuture.com/red-future/common/websocket" "github.com/gogf/gf/v2/net/ghttp" ) // SessionWsService 会话 WebSocket 服务器:普通对话与工作流共用一条连接, // 首次连接仅升级,后续按消息 type 路由到对话/工作流处理器 // (对话处理器在 react_ws_exec.go 注册,工作流处理器在 flow_ws_exec.go 注册)。 var SessionWsService = wsCommon.NewWsServer( wsCommon.WithConnKeyPrefix("ws:session:"), ) // WsConnect 控制器统一入口:升级 WebSocket(普通对话/工作流均由消息 type 区分,此处不区分) func WsConnect(ctx context.Context, r *ghttp.Request, req *sessionDto.WebSocketConnectReq) error { _, err := SessionWsService.Upgrade(ctx, r, req.SessionId) return err } // ensureSession 解析前端 sessionId 并确保会话存在:命中已存在会话则复用其 id,否则按 name 新建。 // 普通对话(react_ws_exec.go)与工作流(flow_ws_exec.go)共用。 func ensureSession(ctx context.Context, sessionId string, name string) error { exist, err := sessionDao.SessionDao.GetById(ctx, sessionId) if err != nil { return err } if exist != nil { return nil } if r := []rune(name); len(r) > 128 { // session_name VARCHAR(128) name = string(r[:128]) } _, err = sessionDao.SessionDao.Insert(ctx, &sessionDto.CreateSessionReq{SessionId: sessionId, SessionName: name}) return err }