From 314554ded7821f84fb4563b73828d3eebc121d1e Mon Sep 17 00:00:00 2001 From: hhs <386998068@qq.com> Date: Sat, 13 Jun 2026 16:14:20 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20Phase=205.2=20-=20=E5=AE=9E=E7=8E=B0=20?= =?UTF-8?q?query=20=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 创建可取消的 context 并存储 cancel func - 获取对话历史并传递给 orchestrator - 启动 orchestrator.ProcessQuery goroutine 处理查询 - 请求完成后自动清理 cancel func 和活跃请求标记 --- backend/internal/ws/handler.go | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/backend/internal/ws/handler.go b/backend/internal/ws/handler.go index 4c77ff6..52f90e5 100644 --- a/backend/internal/ws/handler.go +++ b/backend/internal/ws/handler.go @@ -170,19 +170,43 @@ func serveWS(c *gin.Context, sessionMgr session.Manager, orch orchestrator.Orche logger.Log.Infow("query received", "session", sessionID, "request", msg.RequestID) // 刷新会话 TTL - if err := sessionMgr.Touch(context.Background(), sessionID); err != nil { + if err := client.sessionMgr.Touch(context.Background(), sessionID); err != nil { logger.Log.Warnw("touch session failed", "session", sessionID, "error", err) } // 标记活跃请求 - if err := sessionMgr.SetActiveRequest(context.Background(), sessionID, msg.RequestID); err != nil { + if err := client.sessionMgr.SetActiveRequest(context.Background(), sessionID, msg.RequestID); err != nil { logger.Log.Warnw("set active request failed", "session", sessionID, "error", err) } - // 获取对话历史(供后续 Orchestrator 使用) - _, _ = sessionMgr.GetHistory(context.Background(), sessionID, 20) + // 获取对话历史 + history, _ := client.sessionMgr.GetHistory(context.Background(), sessionID, 20) - // TODO: 解码 audio Base64 → 启动 orchestrator.ProcessQuery goroutine + // 创建可取消的 context + ctx, cancel := context.WithCancel(context.Background()) + client.mu.Lock() + client.cancelFuncs[msg.RequestID] = cancel + client.mu.Unlock() + + // 创建 sender + sender := &WSClient{client: client, requestID: msg.RequestID} + + // 启动 orchestrator 处理 goroutine + go func() { + defer func() { + // 清理 cancel func + client.mu.Lock() + delete(client.cancelFuncs, msg.RequestID) + client.mu.Unlock() + cancel() + // 清除活跃请求 + _ = client.sessionMgr.ClearActiveRequest(context.Background(), sessionID) + }() + + if err := client.orchestrator.ProcessQuery(ctx, sessionID, msg, history, sender); err != nil { + logger.Log.Errorw("process query failed", "session", sessionID, "request", msg.RequestID, "error", err) + } + }() case "config": var msg models.WsConfig