En la publicación pasada te mostré una conversación donde un usuario compraba un teléfono sin formularios, sin botones, solo hablando naturalmente con un agente. Parecía magia, pero detrás había una arquitectura sólida. Hoy te muestro más detalles de como esta orquestado.
El secreto está en LangGraph: una librería que me permite modelar conversaciones como grafos de estados. Y no, no es solo otra abstracción elegante. Es la diferencia entre un chatbot que funciona a veces y un agente que maneja la complejidad real de los usuarios.
El problema: las conversaciones no son lineales
Intenta recordar tu última conversación importante. Apuesto a que no siguió un guión. Hubo interrupciones, cambios de tema, preguntas fuera de orden. Los humanos no conversamos como máquinas de estados simples.
Los agentes tradicionales fallan aquí. Están diseñados para flujos predecibles: intent → acción → respuesta
. Pero ¿qué pasa cuando el usuario dice "espera, mejor quiero otro color" justo antes de pagar? ¿O cuando abandona la conversación y vuelve tres horas después?
LangGraph resuelve esto modelando la conversación como un grafo donde cada nodo es una capacidad específica (buscar productos, procesar pagos, saludar) y las transiciones representan cómo fluye la lógica conversacional.
Anatomía de un agente real
Mi grafo de ecommerce tiene 8 nodos especializados:
Todo comienza con analyzeIntent
- el único nodo que toma decisiones. Los demás son especialistas: searchProducts
maneja búsquedas, addToCart
gestiona el carrito, collectShippingInfo
recolecta direcciones.
Aquí está lo inteligente: todas las transiciones pasan por routeNext()
. No hay ifs dispersos por el código. Una función centralizada decide qué sigue:
Usuario: "Hola, busco un iPhone"
analyzeIntent → routeNext() → handleGreeting + searchProducts
Usuario: "Me gusta el Pro Max"
analyzeIntent → routeNext() → addToCart
Usuario: "¿Cuánto cuesta el envío?"
analyzeIntent → routeNext() → handleCheckout
Cada nodo es una función pura: recibe RootState
, ejecuta su lógica específica, retorna el nuevo estado. Cero efectos colaterales.
La magia está en el routing centralizado
Fíjate en algo clave: todos los nodos terminan en __end__
. Esto significa que después de cada acción, el flujo regresa al usuario para esperar input. No hay cadenas automáticas de nodos.
¿Por qué? Porque las conversaciones reales no son lineales. El usuario puede interrumpir en cualquier momento:
- Está en searchProducts → "Espera, mejor otro color"
- Está en addToCart → "¿Tienen descuentos?"
- Está en checkout → "Cambié de opinión"
Cada mensaje vuelve a analyzeIntent
, que usa routeNext()
para decidir qué hacer. Es el único punto de decisión en todo el sistema.
El estado compartido: la memoria del agente
Aquí está el verdadero poder de LangGraph: el estado compartido. Imagina que cada nodo del grafo tiene acceso a la misma "memoria" donde se almacena todo lo que ha pasado en la conversación.
Esta memoria no es solo el historial de mensajes. Es un mapa completo del contexto: en qué fase está la conversación, qué productos ha visto el usuario, qué tiene en el carrito, qué información personal ha compartido. Cada parte especializada del agente puede leer y actualizar exactamente lo que necesita.
La magia está en cómo se comporta esta memoria. Cuando el usuario dice "quiero el iPhone Pro Max en azul", el especialista en búsquedas actualiza los resultados de productos. Cuando dice "me gusta", el especialista en carrito puede acceder directamente a esos resultados sin preguntarle al usuario qué producto quería.
Pero aquí está lo inteligente: cada especialista solo toca su área. El que maneja búsquedas no interfiere con el carrito, el que procesa pagos no modifica el historial de búsquedas. Sin embargo, todos pueden leer el contexto completo cuando lo necesitan.
El resultado es que el agente "recuerda" naturalmente. El usuario puede preguntar "¿cuánto llevo gastado?" y el agente sabe exactamente qué hay en su carrito, qué producto está considerando, y puede revisar toda la conversación para entender el contexto. No hay formularios que llenar ni sesiones que se pierden.
En conclusión
La diferencia entre un chatbot tradicional y un agente con LangGraph no es solo técnica, es experiencial. Los usuarios no tienen que adaptarse al sistema; el sistema se adapta a cómo los humanos realmente conversamos.
Con LangGraph, cada nueva situación es simplemente otro camino que el router puede tomar. El sistema crece orgánicamente, sin reescribir toda la lógica.
¿Quieres agregar soporte para devoluciones? Un nodo nuevo y algunas líneas en el router. ¿Necesitas recomendaciones personalizadas? Otro especialista que lee el historial y los productos vistos. La arquitectura escala naturalmente porque cada capacidad es independiente.