Cuando el agente caía en "dame un poco más de detalle", esa respuesta no se guardaba. En Conversaciones quedaban las preguntas del visitante una tras otra sin ninguna respuesta, así que el dueño no tenía forma de enterarse de que su agente estaba fallando — justo la pantalla donde debería verlo. Lo grave es lo otro: ese historial se le reenvía al modelo en cada turno. Un modelo que ve cuatro preguntas seguidas y ninguna respuesta lee una conversación rota, se confunde y vuelve a fallar. El primer error se perpetuaba solo, y por eso una vez que empezaba ya no salía más. Ahora se guarda siempre lo que el visitante recibió, sea la respuesta buena o la genérica. Las sesiones que ya quedaron con el historial roto se normalizan solas: la ventana es de 6 mensajes, así que después de un par de intercambios buenos los huecos salen de contexto. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
43 lines
1.4 KiB
Go
43 lines
1.4 KiB
Go
package services
|
|
|
|
import (
|
|
"os"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
// Todo lo que ve el visitante tiene que quedar guardado, incluido el mensaje
|
|
// genérico de cuando algo falla. Sin eso pasaban dos cosas, y la segunda es la
|
|
// grave:
|
|
//
|
|
// 1. En Conversaciones se veían las preguntas sin ninguna respuesta, así que
|
|
// el dueño no se enteraba de que su agente estaba fallando.
|
|
// 2. Ese historial roto se le reenviaba al modelo en el turno siguiente. Un
|
|
// modelo que ve cuatro preguntas seguidas sin una sola respuesta se
|
|
// confunde y vuelve a fallar: el primer error se perpetuaba solo.
|
|
func TestLaRespuestaAlVisitanteSiempreQuedaGuardada(t *testing.T) {
|
|
b, err := os.ReadFile("umind_agent_service.go")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
fuente := string(b)
|
|
|
|
// El bloque del fallback tiene que guardar.
|
|
i := strings.Index(fuente, `if finalResponse == "" {`)
|
|
if i < 0 {
|
|
t.Fatal("no encontré el bloque de fallback")
|
|
}
|
|
bloque := fuente[i:]
|
|
if j := strings.Index(bloque, "\n\treturn finalResponse"); j > 0 {
|
|
bloque = bloque[:j]
|
|
}
|
|
if !strings.Contains(bloque, "SaveUmindMensaje") {
|
|
t.Error("el mensaje genérico no se guarda: la conversación queda con preguntas sin respuesta y el historial roto se reenvía al modelo")
|
|
}
|
|
|
|
// Y el mensaje del visitante también, desde antes del bucle.
|
|
if !strings.Contains(fuente, `SaveUmindMensaje(agente.ID, sessionID, "user", userText)`) {
|
|
t.Error("no se guarda el mensaje del visitante")
|
|
}
|
|
}
|