From 5febbd24d57d120704b4eced150915625d4e2be9 Mon Sep 17 00:00:00 2001 From: Lizandro Guarnizo <77708265+lizandrogd@users.noreply.github.com> Date: Thu, 13 Aug 2026 09:52:28 -0500 Subject: [PATCH] =?UTF-8?q?fix:=20no=20guarda=20ni=20reenv=C3=ADa=20turnos?= =?UTF-8?q?=20vac=C3=ADos=20del=20asistente=20en=20el=20historial?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Una sesión de widget que pegó contra un bug ya arreglado (ej. el thought_signature de Gemini) podía quedar con un turno "assistant" vacío guardado en umind_mensajes — como el widget mantiene la misma session_id en sessionStorage mientras no se cierra la pestaña, cada mensaje nuevo reenviaba ese historial roto y el modelo volvía a responder vacío en cascada. El chat de prueba del panel no lo sufría porque arranca session_id nueva en cada carga de página. Dos cambios: no se guarda un mensaje "assistant" con contenido vacío de acá en más, y al armar el prompt se descartan los que ya hayan quedado guardados así — una sesión vieja rota se autorepara sola en el próximo mensaje, sin que el visitante tenga que abrir una pestaña nueva. Co-Authored-By: Claude Sonnet 5 --- pkg/services/umind_agent_service.go | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/pkg/services/umind_agent_service.go b/pkg/services/umind_agent_service.go index b154629..c0b9b56 100644 --- a/pkg/services/umind_agent_service.go +++ b/pkg/services/umind_agent_service.go @@ -258,6 +258,15 @@ func ProcessWidgetMessage(agente *models.UmindAgente, sessionID, userText string historial, _ := models.GetUmindHistorial(agente.ID, sessionID, 6) messages := []agentMessage{{Role: "system", Content: umindSystemPrompt(agente, tenant.Nombre)}} for _, h := range historial { + // Sesiones que pegaron contra un bug ya arreglado (ej. el thought_signature + // de Gemini) pueden tener quedado un turno "assistant" vacío guardado — si + // se reenvía tal cual, el modelo se confunde y vuelve a responder vacío en + // cascada. Se descarta al armar el prompt, así una sesión vieja rota se + // autorepara sola en el próximo mensaje, sin que el visitante tenga que + // abrir una pestaña nueva para conseguir una session_id limpia. + if h.Role == "assistant" && strings.TrimSpace(h.Content) == "" { + continue + } messages = append(messages, agentMessage{Role: h.Role, Content: h.Content}) } messages = append(messages, agentMessage{Role: "user", Content: userText}) @@ -286,7 +295,9 @@ func ProcessWidgetMessage(agente *models.UmindAgente, sessionID, userText string log.Printf("[UMIND] Respuesta del AI sin texto usable (agente %d) round %d: %s", agente.ID, round, string(aiMsg.Raw)) } finalResponse = content - _ = models.SaveUmindMensaje(agente.ID, sessionID, "assistant", content) + if strings.TrimSpace(content) != "" { + _ = models.SaveUmindMensaje(agente.ID, sessionID, "assistant", content) + } break }