El problema
Un agente que usa herramientas externas (APIs, calculadoras, buscadores) acaba en código espagueti si lo implemento con bucles a mano. El modelo tiene que decidir solo cuándo seguir ejecutando funciones, cuándo parar y cómo pausar para pedir confirmación al usuario sin perder los datos de la sesión.
La solución
Si hay llamadas a herramientas, bifurca a ToolNode; si no, finaliza en END.
Ejecución externa
Control interactivo
Memoria de sesión
En los 5 laboratorios de LangGraph Essentials construí la base para enlazar modelos con herramientas reales dentro del ciclo de razonamiento ReAct:
- Construcción y compilación del grafo. Ensamblo el grafo con
StateGraphyMessagesState, añado nodos (builder.add_node) y aristas estándar (START,END), y compilo el flujo. - Ciclo ReAct y aristas condicionales:
- Convierto funciones de Python en herramientas del modelo con el decorador
@toolyllm.bind_tools([tool]). tools_conditionbifurca solo: el grafo mira si el LLM emitiótool_callsy manda el flujo alToolNodecorrespondiente, o termina.
- Convierto funciones de Python en herramientas del modelo con el decorador
- Memoria de conversación (
MemorySaver). Aísla cada conversación porthread_id, de modo que varios usuarios tienen contextos independientes en la misma aplicación. Esta memoria es volátil. - Human-in-the-Loop nativo. Con
interrupt()el agente se detiene antes de una acción irreversible y espera a que el usuario confirme o edite. Después se reanuda conCommand(resume=...). - Asistente de correo (EmailAgent). Combino salidas tipadas (
with_structured_output) para el triaje semántico y para guiar la generación de respuestas.
Stack desglosado
- Orquestación: LangGraph (
StateGraph,ToolNode,tools_condition). - Memoria:
MemorySavery gestión de hilos porthread_id. - Estructuración: Pydantic y
with_structured_output(). - Lenguajes: Implementaciones equivalentes en Python y TypeScript / JavaScript.
Resultados y aprendizajes
Lo que funcionó fue la sencillez de tools_condition y ToolNode. Si las herramientas son nodos del grafo, añadir una capacidad nueva al agente es registrar una función de Python decorada.
Lo que aprendí: el ciclo ReAct es la pieza base de cualquier agente más avanzado. Entender bien los mensajes de herramientas y la bifurcación condicional es lo que evita los bucles infinitos.