fix: no guarda ni reenvía turnos vacíos del asistente en el historial

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 <noreply@anthropic.com>
This commit is contained in:
Lizandro Guarnizo
2026-08-13 09:52:28 -05:00
co-authored by Claude Sonnet 5
parent 7c4bb8713b
commit 5febbd24d5
+12 -1
View File
@@ -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
}