Todos los recursos

LangGraph modela un agente como un grafo dirigido con estado compartido y tipado: los nodos son pasos, las aristas son decisiones, y los bucles y reintentos quedan a la vista en vez de escondidos dentro del prompt. Aquí va qué es, cuándo vale la pena la ceremonia frente al SDK directo, cómo montar uno en unos minutos y las concesiones sin maquillaje, incluida la trampa de los reducers que se come tu historial de mensajes sin avisar.

LangGraph: grafos de agentes con estado que sí puedes depurar

En resumen

  • LangGraph es un runtime de grafos para agentes: cada nodo modifica un estado compartido y tipado, y las aristas (incluidas las condicionales) deciden hacia dónde sigue el control.
  • Échale mano cuando necesitas control de flujo de verdad (bucles que reintentan hasta dar la calidad, aprobaciones con un humano de por medio, un supervisor que reparte trabajo a sub-agentes), no cuando basta con mandar un prompt y recibir respuesta.
  • El checkpointing es la función estrella: una corrida puede pausarse, guardar su estado y retomar, y eso es lo que vuelve prácticos los agentes largos, interrumpibles y con un humano que da el visto bueno.
  • La trampa más grande es el reducer del estado: el estado se fusiona, no se reemplaza, así que un return parcial sin reducer pisa sin avisar los campos que van acumulando, como las listas de mensajes.
  • Es una capa de control de flujo, no un modelo ni un almacén de memoria: se combina con el SDK de Claude y tu propia persistencia; no esperes que les haga el trabajo a esos.

La mayoría de los agentes empiezan como un bucle «while» alrededor de una llamada al modelo, y ese bucle funciona de maravilla hasta que necesitas que reintente cuando falla un control de calidad, que espere a que un humano apruebe un paso, o que le pase el trabajo a un sub-agente y vuelva. En ese punto, el control de flujo que estaba implícito en tu prompt, "sigue hasta que termines", se vuelve la parte más difícil de ver del sistema y la más fácil de romper. La apuesta de LangGraph es que escribas ese control de flujo como un grafo explícito y tipado en vez de enterrarlo en prosa, y a cambio te llevas checkpointing, corridas que se reanudan solas y corridas que de verdad puedes trazar. Aquí va qué es la herramienta, cuándo se gana su ceremonia, un quickstart que puedes copiar y pegar, y las concesiones que nadie pone en el README.

Nota

LangGraph es una capa de control de flujo, no un modelo ni un almacén de memoria. Orquesta llamadas a Claude (o a cualquier modelo) y guarda el estado del grafo entre pasos, pero el razonamiento sigue saliendo de tus prompts y la memoria de largo plazo sigue saliendo de tu propia base de datos. Júzgalo por si te deja claro el control de flujo, no por si reemplaza el resto de tu stack.

01 · Qué es en realidad

LangGraph modela un agente como un grafo dirigido sobre un único objeto de estado compartido. Declaras la forma de ese estado una sola vez, registras nodos (funciones normales que leen el estado y devuelven una actualización parcial) y los conectas con aristas. Las aristas pueden ser incondicionales ("después de planear, siempre actúa") o condicionales, una función de routing mira el estado actual y devuelve el nombre del siguiente nodo. Ese es todo el modelo mental: los nodos hacen el trabajo, las aristas deciden y el estado carga todo lo que va en medio.

Dos cosas lo vuelven algo más que un «if/else» con más adornos:

  • El estado es tipado y compartido. Cada nodo ve el mismo objeto de estado y le aporta una actualización parcial. No estás pasando argumentos por una pila de llamadas; estás leyendo y escribiendo campos sobre una sola estructura que maneja el runtime.
  • El grafo tiene checkpoints. Cuando compilas con un checkpointer, el runtime guarda el estado después de cada nodo. Una corrida identificada por un thread id puede detenerse, porque llegó a un interrupt, se cayó o mataste el proceso, y más tarde retomar justo donde se quedó, con el estado intacto.

Esa segunda propiedad es la verdadera razón para usarlo. Un bucle común sabe ramificar y reintentar; lo que no hace fácil es pausarse un día entero esperando a un humano, sobrevivir a un deploy y retomar a mitad de corrida sin rehacer todo.

02 · Cuándo usarlo (y cuándo no)

Usa LangGraph cuando tu agente necesita control de flujo de verdad, ese que de otro modo estarías armando a mano y te quedaría mal:

  • Un bucle de investigación o generación que reintenta hasta pasar un control de calidad, genera, critica, decide "ya está bien o va otra vez", con un tope duro de iteraciones.
  • Un paso con humano de por medio: el grafo llega a un nodo de aprobación, hace interrupt y espera, quizá minutos o días, hasta que un humano retoma el thread con una decisión.
  • Un patrón de supervisor: un nodo reparte trabajo a sub-agentes especializados (buscar, programar, resumir) y junta sus resultados antes de decidir qué sigue.
  • Cualquier cosa larga o interrumpible, donde aguantar un reinicio y retomar a media corrida es un requisito, no un lujo.

No lo uses cuando la tarea es mandar un prompt y recibir respuesta, o un bucle corto de uso de tools sin ninguna ramificación que te importe. Envolver una llamada de una sola pasada en un grafo te suma un esquema de estado, un paso de compile y un checkpointer a cambio de cero beneficio, eso es ceremonia, no arquitectura.

Consejo

Una prueba útil: si no puedes dibujar el agente como cajas y flechas en una servilleta, todavía no entiendes su control de flujo lo suficiente como para construirlo, con ninguna herramienta. Si lo puedes dibujar y las flechas incluyen un regreso o una espera, lo más seguro es que LangGraph valga la pena. Si es una línea recta, usa el SDK directo.

Cómo se compara

  • vs. el SDK de Claude en un bucle: el SDK es el punto de partida correcto para agentes simples y no te da nada contra qué pelear. Das el salto a LangGraph cuando el bucle gana ramas, esperas y la necesidad de retomar.
  • vs. un motor de workflows genérico (n8n, Temporal): esos orquestan sistemas y jobs durables; LangGraph orquesta los pasos de razonamiento de un agente, sobre un estado con forma de modelo. Otro nivel. Es común tener a n8n disparando una corrida de LangGraph, no reemplazándola.
  • vs. armar tu propia máquina de estados: puedes, y para un grafo diminuto quizá deberías. LangGraph se gana su lugar cuando quieres checkpointing, depuración con viaje en el tiempo e interrupts con humano de por medio sin escribir tú mismo la capa de persistencia.

03 · Quickstart

Instálalo junto al SDK de modelo que ya estés usando:

pip install langgraph

La forma mínima es un tipo de estado, un par de nodos y una arista condicional que cierra un bucle. Aquí va un bucle plan/act que reintenta hasta que un router decide que ya terminó, con checkpointing activado para que la corrida se pueda reanudar:

from typing import Annotated, TypedDict
from operator import add
from langgraph.graph import StateGraph, START, END
from langgraph.checkpoint.memory import MemorySaver

class State(TypedDict):
    task: str
    # messages ACUMULA — fíjate en el reducer
    messages: Annotated[list, add]
    attempts: int

def plan(state: State) -> dict:
    return {"messages": [f"plan para: {state['task']}"]}

def act(state: State) -> dict:
    # ... aquí llamas a tu modelo ...
    return {"messages": ["hice la tarea"], "attempts": state.get("attempts", 0) + 1}

def route(state: State) -> str:
    return "done" if state["attempts"] >= 3 else "again"

g = StateGraph(State)
g.add_node("plan", plan)
g.add_node("act", act)
g.add_edge(START, "plan")
g.add_edge("plan", "act")
g.add_conditional_edges("act", route, {"again": "plan", "done": END})

app = g.compile(checkpointer=MemorySaver())

# El thread id es lo que vuelve reanudable una corrida.
config = {"configurable": {"thread_id": "run-1"}}
result = app.invoke({"task": "resumir el repo", "attempts": 0}, config)

Cambia MemorySaver por un checkpointer respaldado en base de datos (Postgres, por ejemplo) y el mismo grafo se vuelve durable aunque el proceso se reinicie, el thread id es lo único que necesitas para retomar.

04 · La trampa de los reducers

Esto es lo que muerde a todo el mundo, así que se gana su propia sección. Entre nodos, LangGraph fusiona las actualizaciones de estado campo por campo, no reemplaza el objeto entero. Para un campo escalar es intuitivo: devuelves un «attempts» nuevo y pisa al viejo. La trampa está en los campos que se supone que acumulan, como una lista de mensajes.

Si declaras «messages: list» y un nodo devuelve una lista parcial, la fusión reemplaza la lista anterior con la nueva, tu historial se esfumó, sin avisar y sin ningún error. El arreglo es anotar el campo con un reducer que le diga al runtime cómo combinar las actualizaciones. En el quickstart de arriba, «Annotated[list, add]» dice "agrega, no reemplaces", así que los mensajes de cada nodo se concatenan en vez de pisarse entre sí.

Atención

Cualquier campo que va creciendo a lo largo de la corrida (historial de mensajes, documentos acumulados, notas de scratchpad) necesita un reducer explícito. Sin él, gana el último nodo que escribe ese campo y todo lo anterior desaparece. Así salen agentes que "olvidan" a media corrida sin razón aparente. Lee la doc de channels/reducers antes de armar algo con muchas ramas, no después de quemarte una tarde depurando historial que se esfumó.

Un segundo detalle relacionado: los nodos deben devolver actualizaciones parciales, no el estado completo. Devolver el objeto de estado entero funciona, pero te tienta a pisar sin querer un campo con reducer al pasarle de vuelta su valor viejo. Devuelve solo las claves que el nodo de verdad cambió.

05 · Concesiones honestas

LangGraph es la herramienta correcta para toda una clase de problema, pero no sale gratis:

  • Es una dependencia real con su curva de aprendizaje. Esquemas de estado, reducers, aristas condicionales y checkpointers son conceptos que tienes que llevar en la cabeza. Para un agente simple, eso es carga extra que vas a terminar odiando.
  • La abstracción puede esconderte el costo. Un bucle que "reintenta hasta pasar calidad" es un bucle que puede llamar al modelo un montón de veces. Pon un tope duro de iteraciones en cada ciclo y vigila tu gasto de tokens. El grafo vuelve el bucle fácil de escribir y, justo igual, fácil de que se te descontrole.
  • El estado con checkpoints es estado que ahora te toca administrar a ti. Los threads persistidos se van acumulando; necesitas un plan para expirarlos o limpiarlos, y para decidir qué es seguro guardar. Trata el almacenamiento de checkpoints como cualquier otra base de datos, incluida la parte de que puede terminar guardando datos intermedios sensibles.
  • Que sea fácil de depurar es la recompensa, pero solo si la aprovechas. Toda la razón de pagar la ceremonia es que las aristas explícitas y el estado persistido vuelven trazable una corrida. Si no te apoyas en el tracing ni en el viaje en el tiempo, te quedaste con el costo y sin el beneficio.

Yo me apoyo mucho en el pensamiento de grafos en Agent Orchestra, hacer explícitas las aristas es justo lo que convierte una corrida multi-agente de "el modelo hizo algo" en algo que puedo recorrer paso a paso, repetir y entender. Ese es el trato: más estructura por adelantado, muchísimo menos misterio cuando una corrida se va de lado.

LangGraph rinde cuando el control de flujo es la parte difícil de tu agente y ya te cansaste de que sea invisible. Échale mano en cuanto tu bucle gane una espera o una rama real que te importe, mantén un tope de iteraciones en cada ciclo y respeta la regla del reducer desde el día uno. Sáltatelo para llamadas de una sola pasada. Ahí el SDK directo es la respuesta honesta, y meterle un grafo sería pura ceremonia.

Puntos clave

  • LangGraph convierte el control de flujo implícito de un agente en un grafo explícito y tipado: los nodos trabajan, las aristas deciden y el estado compartido carga el resto.
  • Échale mano en bucles de reintento, esperas con humano de por medio, supervisores y corridas reanudables. Sáltatelo en llamadas de una sola pasada, donde gana el SDK directo.
  • El checkpointing es la función estrella: guarda el estado por thread id para que una corrida pueda detenerse, aguantar un deploy y retomar justo donde se quedó.
  • Agrega un reducer a cada campo que acumula, o las fusiones se comen tu historial sin avisar, este es el primer bug con el que todos se topan.
  • Pon un tope a las iteraciones de cada bucle y trata el almacenamiento de checkpoints como una base de datos de verdad; la abstracción te esconde tanto el costo de tokens como el estado guardado.

Preguntas frecuentes

¿Necesito LangChain para usar LangGraph?

No. LangGraph es su propio paquete y corre sin problemas sobre funciones normales que llaman directo a cualquier SDK de modelo, incluido el SDK de Claude. Comparte ecosistema y algunas integraciones opcionales con LangChain, pero el runtime de grafos no te obliga a adoptar las chains ni las abstracciones de LangChain. Si ya de por sí no te gustan las capas pesadas de framework, puedes usar LangGraph solo como motor de control de flujo y dejar tus llamadas al modelo como código del SDK directo dentro de los nodos.

¿Cuándo LangGraph es demasiado?

Cuando tu agente solo manda un prompt y recibe respuesta, o es un bucle corto de uso de tools sin ninguna rama que de verdad te importe y sin necesidad de pausar ni retomar. En esos casos el esquema de estado, el compile y el checkpointer son pura ceremonia, pagas los conceptos y no recibes nada a cambio. La jugada honesta ahí es el SDK directo en un bucle pequeño. Da el salto a LangGraph en cuanto aparezca una rama real, una espera o la necesidad de retomar.

¿Por qué desapareció mi historial de mensajes entre nodos?

Casi seguro te falta un reducer. LangGraph fusiona el estado campo por campo, así que un nodo que devuelve una lista parcial para un campo declarado como un «list» a secas pisa el valor anterior en vez de agregarle, sin avisar, sin ningún error. Anota cualquier campo que acumule con un reducer (para una lista, «Annotated[list, add]») para que las actualizaciones se concatenen en vez de pisarse. Este es el bug más común de LangGraph, y por eso la doc de channels/reducers es lectura obligatoria antes de armar algo con muchas ramas.

¿Cómo maneja el checkpointing los pasos con humano de por medio?

El grafo llega a un punto de interrupt, el runtime guarda el estado completo bajo el thread id de la corrida y la ejecución se detiene. Nada queda esperando en memoria, el proceso puede cerrarse por completo. Cuando el humano ya está listo, retomas el mismo thread id y la corrida arranca desde el estado guardado, con la entrada del humano ya incorporada. Con un checkpointer respaldado en base de datos esto aguanta reinicios y deploys, que es justo lo que vuelve prácticos los pasos de aprobación que se toman un día entero, en vez de una espera frágil en memoria.

¿Cómo evito que un bucle de reintento queme tokens?

Pon un tope duro de iteraciones en el estado y revísalo en la función de routing, nunca confíes en que un control de calidad va a cortar solo. Lleva un contador «attempts», increméntalo en el nodo que actúa y haz que el router mande la corrida a END en cuanto cruce un techo, pase o no el control. LangGraph vuelve triviales los bucles, así que la disciplina tiene que venir de ti: un bucle sin tope es una factura abierta. Registra las llamadas al modelo por corrida para que cuando algo se descontrole lo veas tú antes que la cuenta.

¿Reemplaza a un motor de workflows como n8n o Temporal?

No, son otro nivel. n8n y Temporal orquestan sistemas, integraciones y jobs durables entre servicios; LangGraph orquesta los pasos de razonamiento dentro de un agente, sobre un estado con forma de modelo. Se combinan en vez de competir: es común tener a n8n disparando una corrida de LangGraph por agenda o por webhook, dejar que el grafo haga la parte agéntica y devolver el resultado. Usa el motor para el punto donde se unen los sistemas y usa LangGraph para el control de flujo dentro del agente.

Abrir recurso (abre en pestaña nueva)

¿Prefieres que lo hagamos por ti?

Esto mismo lo construimos para negocios como el tuyo. La primera conversación es gratis y sin compromiso.

Escríbenos por WhatsApp

Escríbenos por WhatsApp

Escanéalo con tu teléfono para escribirnos por WhatsApp.

Escanéalo con tu teléfono para escribirnos por WhatsApp.

¿Estás desde el teléfono y no puedes escanear? Escríbenos a info@ilustrari.com

Primera conversación gratis. Te responde el fundador.

Recursos relacionados

GuíaClaude Code

Diseñar un sistema multiagente que no se derrumbe

La mayoría de los proyectos 'multiagente' deberían ser un solo agente con buenas herramientas. En esta guía aprendes a decidir cuándo de verdad necesitas varios agentes, a elegir una topología, a conectarlos con contratos tipados y a ponerles los topes de turnos, los desempates y los presupuestos que evitan que un panel se enrede discutiendo en círculos o te infle la factura sin que te des cuenta.

30 abr 202613 min de lectura
PromptClaude

Prompt orquestador-enrutador: descompón y enruta en vez de una sola llamada sobrecargada

Un prompt gigante que 'lo hace todo' se va degradando a medida que la tarea crece: el contexto se llena de detalles que no vienen al caso y la calidad se cae justo en el medio. Este es el prompt orquestador, listo para copiar y pegar, que está detrás de Agent Orchestra: un planificador ligero que parte una petición en las subtareas independientes más pequeñas posibles, manda cada una a un solo especialista y se niega a resolver nada por su cuenta. Te llevas la plantilla, las variables que tienes que rellenar, variantes para trabajo secuencial vs. paralelo, un esquema de cómo conectarlo y las trampas que terminan convirtiendo un enrutador de vuelta en un bloque que lo hace todo.

12 abr 202612 min de lectura
ToolTypeScript

Playwright: automatización de navegador confiable para scraping y agentes

Las páginas renderizadas con JavaScript rompen los fetch HTTP simples, y la solución de siempre, un navegador headless, va filtrando memoria sin avisar hasta que te tumba el host. Playwright es la base confiable que resuelve el primer problema; esto es cómo usarlo sin caer en el segundo. Sales sabiendo cuándo lanzar un navegador, cuándo no, y cómo manejarlo con un pool para que un scraper sobreviva en un solo VPS.

7 abr 202612 min de lectura