From 7b745018c54110eed28500ec7441d566a1f05610 Mon Sep 17 00:00:00 2001 From: hhs <386998068@qq.com> Date: Sun, 14 Jun 2026 17:56:33 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20Phase=208.4=20=E2=80=94=20=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=20LoadSession=20=E5=92=8C=20LoadSessionFromDB?= =?UTF-8?q?=EF=BC=8C=E6=94=AF=E6=8C=81=E4=BB=8E=20PostgreSQL=20=E6=81=A2?= =?UTF-8?q?=E5=A4=8D=E4=BC=9A=E8=AF=9D=E5=88=B0=E5=86=85=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/internal/session/memory.go | 42 ++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/backend/internal/session/memory.go b/backend/internal/session/memory.go index be8da3c..bc300a3 100644 --- a/backend/internal/session/memory.go +++ b/backend/internal/session/memory.go @@ -307,6 +307,48 @@ func generateTitle(firstMessage string) string { return firstMessage } +// LoadSession 从外部存储加载会话到内存热存储。 +// 用于 conversation_id 恢复场景:WS 连接时会话不在内存中,从 PostgreSQL 加载。 +// 若会话已在内存中,返回 nil(幂等)。 +func (m *MemoryManager) LoadSession(sess *models.Session, messages []models.Message) error { + m.mu.Lock() + defer m.mu.Unlock() + + if _, ok := m.sessions[sess.ID]; ok { + return nil // 已在内存中,无需重复加载 + } + + m.sessions[sess.ID] = &sessionEntry{ + session: *sess, + history: messages, + lastActive: time.Now(), + } + + logger.Log.Debugw("session loaded from DB", "session", sess.ID, "messages", len(messages)) + return nil +} + +// LoadSessionFromRepo 从 MessageRepository 加载会话消息并注册到内存。 +// 适用于已注入 MessageRepository 的场景,调用方只需传入 session 元数据。 +func (m *MemoryManager) LoadSessionFromRepo(ctx context.Context, sess *models.Session) error { + if m.msgRepo == nil { + return m.LoadSession(sess, nil) + } + + // 从冷存储加载全部消息(limit=0 表示全量) + stored, err := m.msgRepo.GetMessages(ctx, sess.ID, 0, 0) + if err != nil { + return err + } + + messages := make([]models.Message, len(stored)) + for i, s := range stored { + messages[i] = models.Message{Role: s.Role, Content: s.Content} + } + + return m.LoadSession(sess, messages) +} + // SetActiveRequest 标记当前正在处理的请求 ID。 func (m *MemoryManager) SetActiveRequest(_ context.Context, sessionID string, requestID string) error { m.mu.Lock()