package services import "testing" // El bucle de herramientas tiene que garantizar que la última vuelta sea sin // herramientas. Si no, un modelo que encadena búsquedas se come todas las // rondas pidiendo tools y nunca redacta: el visitante recibe el mensaje // genérico aunque el agente ya tenga toda la información junta. // // Es exactamente lo que pasaba en producción: tres eventos seguidos de // "se agotaron las rondas" en un agente que respondía bien en el chat de // prueba, donde la conversación era más corta y no encadenaba búsquedas. func TestLaUltimaRondaVaSinHerramientas(t *testing.T) { const maxRondas = 4 hubo := 0 ultimaConHerramientas := false for round := 0; round < maxRondas; round++ { conHerramientas := round != maxRondas-1 hubo++ if round == maxRondas-1 { ultimaConHerramientas = conHerramientas } } if hubo != maxRondas { t.Errorf("se corrieron %d rondas, esperaba %d", hubo, maxRondas) } if ultimaConHerramientas { t.Error("la última ronda ofreció herramientas: el modelo puede volver a pedir una y quedarse sin responder") } if maxRondas < 3 { t.Errorf("con %d rondas no alcanza para buscar y después redactar", maxRondas) } } // Con la última ronda sin herramientas, un modelo que pide búsquedas en todas // las vueltas igual termina respondiendo. func TestUnModeloQuePideBusquedasSiempreIgualResponde(t *testing.T) { const maxRondas = 4 respondio := false for round := 0; round < maxRondas; round++ { hayHerramientas := round != maxRondas-1 // El modelo simulado pide herramienta siempre que pueda. pideHerramienta := hayHerramientas if !pideHerramienta { respondio = true break } } if !respondio { t.Error("el bucle terminó sin respuesta: es el fallback genérico que ve el visitante") } }