Cambiar tema

Diseño de máquinas de estado para agentes de IA: por qué un workflow complejo no puede depender solo del prompt

Easton editorial illustration: large Agent state recorder, coral failure beacon, checkpoint rewind handle, recovery status strip
8
Campos de estado clave
state, event, guard, action, checkpoint, retry, compensation, terminal.
4
Objetos de registro
state snapshot, event log, trace, audit log.
3
Acciones de recuperación
resume, retry, compensate.
数据来源: Esta checklist de ingeniería se basa en documentación oficial de LangGraph, Temporal, OpenAI Agents SDK, AWS Step Functions y Stately. Los nombres de API y el comportamiento de producto deben revisarse contra la documentación oficial después de la publicación.

"La documentación de LangGraph Persistence describe los checkpoints como graph state snapshots con alcance de thread y explica que soportan conversation continuity, human-in-the-loop, time travel y fault tolerance."

Un agente de reportes falló justo antes de enviar el e-mail en el paso 5. Operaciones relanzó la tarea. El agente volvió al paso 1, generó un reporte nuevo y sobrescribió la versión que ya había sido aprobada. Se perdió el estado de aprobación. El registro firmado por la persona aprobadora fue reemplazado por el nuevo resultado, y no quedó ningún log que probara que la primera versión había sido aprobada.

No era un rollback de base de datos ni un retry de cola de mensajes. En el prompt solo quedaba la frase “continuar el procesamiento”. El modelo volvió a inferir todo el flujo sin saber que los pasos 1 a 4 ya habían producido efectos externos: llamada a la API de aprobación, generación del reporte y escritura de un archivo temporal. El fallo ocurrió en el paso 5, pero los efectos empezaron en el paso 2.

El problema real no era si el modelo tenía suficiente capacidad. El progreso de la tarea estaba escondido en lenguaje natural dentro del prompt, sin un state snapshot recuperable. Los messages del prompt son contexto para el modelo, no hechos de ejecución.

Para corregir un incidente así, no alcanza con agregar al prompt una frase como “revisar el progreso antes de continuar”. Lo más robusto es escribir el nodo actual, los efectos ya producidos, la siguiente acción y la compensación de fallos en una tabla de estados recuperable.

Puntos clave del incidente

Flujo de ejecución del agente de reportes:

PasoOperaciónEfecto externoIdempotencia
Paso 1Consulta de datosLlama a la base de datos y consulta datos de usuariosIdempotente (lectura)
Paso 2Generación de reporteLlama a la herramienta de reportes y genera un PDFNo idempotente (sobrescribe archivo)
Paso 3Espera de aprobaciónEnvía solicitud de aprobación y espera a una personaIdempotente (la API lo soporta)
Paso 4Aprobación recibidaRecibe el event approveIdempotente (consulta de estado)
Paso 5Enviar e-mailLlama a la API de e-mail y envía el reporteFallo (timeout)

Causa del fallo: el envío de e-mail del paso 5 hizo timeout por rate limiting de la API externa, y la tarea quedó marcada como FAILED.

Lógica de relanzamiento: leer el “progreso actual” desde el prompt. El prompt solo decía “aprobado, continuar”. Ejecución real: empezar otra vez desde el paso 1 -> regenerar el reporte en el paso 2 (sobrescribiendo la versión aprobada) -> pedir aprobación otra vez en el paso 3 -> enviar con éxito en el paso 5.

Impacto de negocio: el reporte aprobado fue reemplazado, el registro de aprobación ya no coincidía con el reporte entregado, el usuario reclamó que el reporte que aprobó no era el que recibió, y el flujo de aprobación se desperdició: se aprobaron dos versiones, pero solo una se envió.

Tabla para detectar anti-patrones

Revisa si tu agente cae en estos anti-patrones:

Anti-patrónCómo se veRiesgo ocultoCorrección
Progreso escrito en el PromptResumen natural como “está en el paso 3”Se pierde tras reinicio, no se recuperaRegistrar el nodo actual en un campo State
Trace tratado como StateTener trace completo se confunde con tener estadoTrace no decide el siguiente pasoState registra qué debe pasar después
Retry sin idempotenciaFallo implica volver al inicioLos efectos externos se ejecutan dos vecesClave de idempotencia + verificación de ya ejecutado
Resume después de approval sin validarContinuar directamenteNo vuelve al punto correctocheckpoint + thread_id

1. Fundamentos de la máquina de estados: State, Event, Transition, Guard, Action

Una máquina de estados no es necesaria para todos los agentes. Un Q&A simple de soporte puede funcionar con un array de messages. Pero una tarea compleja, con varios pasos, approval, llamadas a sistemas externos y recuperación tras fallos, debe hacer explícito el progreso.

1.1 Tabla de términos centrales

Los términos básicos vienen de la documentación de Stately:

TérminoDefiniciónEjemplo en AgentFuente
StateModo en el que está la máquina, con una intención semántica únicaINIT, PLAN_READY, TOOL_RUNNING, APPROVAL_PENDING, FAILED, COMPLETEDStately state machines
EventSeñal externa que dispara un cambio de estadotimeout, approve, reject, retry, resume, task_receivedStately state machines
TransitionRuta permitida entre estados, con mapeo deterministaINIT -> PLAN_READY (event: task_received)Stately state machines
Guard/ConditionCondición previa para entrar en un estadoSolo entrar en TOOL_RUNNING si el presupuesto alcanzaStately state machines
ActionOperación ejecutada durante una transiciónLlamar una herramienta al entrar en TOOL_RUNNINGStately state machines
CheckpointSnapshot de estado usado para recuperarLangGraph checkpointer guarda graph stateLangGraph Persistence

Principio de determinismo: la misma combinación State + Event debería apuntar a un único next state, sin ambigüedad. Conjunto finito de estados: una máquina de estados no es un flowchart infinito, sino un conjunto finito de estados alcanzables más reglas explícitas de transición.

1.2 Comparación Trace vs State vs Audit

Trace, Audit Log y State Snapshot resuelven tres problemas distintos:

ConceptoQué problema resuelve¿Es estado de negocio?¿Decide el siguiente paso?Ejemplo en Agent
TraceObservabilidad y diagnósticoNoNoOpenAI Agents SDK trace (workflow_name, trace_id)
Audit LogRegistro de cumplimiento y auditoríaNoNoCampos de auditoría del modelo de permisos (actor, traceId, action, result)
State SnapshotEstado actual que decide el siguiente pasoLangGraph checkpoint (nodo actual, pasos ejecutados, siguiente acción)

La diferencia importa: un trace ayuda a observar qué pasó, pero no es el estado de negocio. Un audit log deja historial para auditoría. Un state snapshot decide qué debe pasar después y por eso es el núcleo de la recuperación. No son intercambiables: tener trace no significa tener state; tener audit no significa poder recuperar.

2. Cómo LangGraph hace persistencia de estado

Un checkpoint no es un resumen en lenguaje natural dentro del prompt. Es un state snapshot recuperable, inspeccionable y reproducible. La documentación de LangGraph persistence define checkpoint como graph state snapshot e incluye el estado completo y los siguientes nodos a ejecutar.

2.1 Checkpointer y Thread State

Mecanismos centrales (según LangGraph Persistence):

  • Checkpointer: guarda snapshots de estado con alcance de thread (graph state snapshots)
  • Store: guarda datos de largo plazo entre threads (application-defined store)
  • Thread_id: entrada única para recuperar el estado de un thread concreto
  • Cuatro usos: conversation continuity, human-in-the-loop, time travel, fault tolerance

LangGraph persistence pone el estado corto con alcance de thread en checkpointers y los datos de largo plazo entre threads en stores. Un checkpoint incluye state snapshot y application-defined store. Thread_id es la entrada de recuperación: con la misma thread_id se puede continuar desde el punto de pausa.

Un checkpoint de LangGraph contiene graph state, lista de nodos siguientes, checkpoint_id, timestamp y versión. Los datos sensibles no deberían entrar ciegamente en el checkpoint: algunos campos de graph state pueden contener información sensible y requieren configuración explícita para no persistirse.

2.2 Interrupts y mecanismo de recuperación

Mecanismos centrales (según LangGraph Interrupts):

  • interrupt(): pausa dinámicamente la ejecución dentro de un nodo del grafo, guarda graph state y espera input externo
  • Método de recuperación: usar la misma thread_id y Command(resume=…)
  • Patrones comunes: approval, review/edit, tool call review, human input validation
  • Advertencia sobre efectos idempotentes: los efectos antes de interrupt deben ser idempotentes porque, al reanudar, el nodo se ejecuta desde el comienzo del nodo que llamó a interrupt

Una pausa de aprobación debe ser un estado de pausa de la máquina de estados, no una esperanza de que el modelo “recuerde esperar aprobación”. Recuperar requiere el mismo thread cursor.

La recuperación usa la misma thread_id y Command(resume=…). La idempotencia de los efectos es condición previa. Si hay un efecto antes de la aprobación, como una llamada a una API externa, debe ser idempotente; de lo contrario, al reanudar el nodo volverá a llamar la API.

3. Analogía de ingeniería: Temporal Durable Execution

La fiabilidad de tareas largas no es un problema nuevo. Temporal durable execution ofrece una referencia madura.

3.1 Definición de Durable Execution

Conceptos centrales (según Temporal Durable Execution):

  • Durable Execution: workflow execution conserva state/progress ante fallos, caídas o interrupciones de servicio
  • Event History: registra el estado de cada paso para recuperar desde el último evento registrado tras un fallo
  • Tres propiedades: Resumable, Recoverable, Reactive

La fiabilidad de tareas largas viene del event history y de una ejecución recuperable, no de la memoria de un único proceso ni del contexto del prompt. Una máquina de estados para agentes necesita algo parecido: checkpoint/event log + estado de negocio, no solo inferencia nueva del modelo.

El Event History de Temporal y el checkpoint de LangGraph son similares conceptualmente: registran historial de ejecución y permiten recuperar desde el punto de fallo. La diferencia es que Temporal es un motor completo de workflow, mientras LangGraph es un framework de gestión de estado para agentes. La lección es clara: durable execution necesita historial de estado estructurado, no memoria de proceso ni contexto del modelo.

4. Plantilla de tabla de estados: una Agent State Table reutilizable

Los conceptos de máquina de estados son abstractos. Para aterrizarlos, necesitas un modelo de estado concreto. Aquí van tres plantillas: tabla de estados, tabla de eventos y ejemplo derivado del incidente.

4.1 Plantilla de tabla de estados (bloque ejecutable)

Estructura:

StateEventGuardAction obligatoriaNext
INITtask_receivedNingunaInicializar contexto y registrar hora de inicioPLAN_READY
PLAN_READYplan_generatedplan_validGenerar plan de ejecución y registrar secuencia de herramientasTOOL_RUNNING
TOOL_RUNNINGtool_completedbudget_sufficientLlamar herramienta, registrar resultado y actualizar presupuestoAPPROVAL_PENDING o COMPLETED
APPROVAL_PENDINGapproveapproval_requiredEnviar solicitud de aprobación y registrar aprobadorCOMPLETED
APPROVAL_PENDINGrejectNingunaRegistrar motivo de rechazo y notificar al usuarioFAILED
FAILEDretryretry_count < maxRevisar idempotencia y volver al checkpoint previoTOOL_RUNNING o APPROVAL_PENDING
COMPLETEDNingunaNingunaRegistrar hora de finalización y limpiar recursosTerminal

Notas: la columna State define los estados alcanzables (INIT, PLAN_READY, TOOL_RUNNING, APPROVAL_PENDING, FAILED, COMPLETED). Event define los eventos que disparan transitions (task_received, approve, reject, retry). Guard define precondiciones (budget_sufficient, retry_count < max). Action define la operación obligatoria durante la transición. Next define el estado siguiente de forma determinista.

4.2 Plantilla de tabla de eventos (complemento de la tabla de estados)

Estructura:

EventCondición de disparoEstado previo requeridoEstado posterior¿Produce efectos externos?
task_receivedEl usuario envía una tareaINITPLAN_READYNo
plan_generatedEl LLM genera un plan de ejecuciónPLAN_READYTOOL_RUNNINGNo
tool_completedLa herramienta terminaTOOL_RUNNINGAPPROVAL_PENDING o COMPLETEDSí (llamada a API externa)
approveLa persona aprobadora aceptaAPPROVAL_PENDINGCOMPLETEDSí (envía e-mail, descuenta presupuesto)
rejectLa persona aprobadora rechazaAPPROVAL_PENDINGFAILEDNo
retrySolicitud de retry tras falloFAILEDTOOL_RUNNING o APPROVAL_PENDINGRequiere revisión de idempotencia
timeoutTimeout de ejecuciónTOOL_RUNNINGFAILEDNo

Notas: el estado previo requerido deja claro en qué estados puede recibirse cada event. La columna de efectos externos marca qué events necesitan idempotencia o compensación.

4.3 Ejemplo de tabla de estados derivado del incidente de reporte sobrescrito

Ejemplo completo: tabla de estados del agente de reportes derivada del incidente inicial

StateEventGuardActionNextRevisión de idempotencia/compensación
INITtask_receivedNingunaInicializar thread_id y registrar hora de inicioQUERY_RUNNINGNo hace falta
QUERY_RUNNINGquery_completedNingunaConsultar datos y guardar resultado en stateREPORT_GENERATINGNo hace falta
REPORT_GENERATINGreport_generatedNingunaGenerar reporte y guardar report ID en stateAPPROVAL_PENDINGIdempotencia: si el reporte ya existe, saltar generación
APPROVAL_PENDINGapproveNingunaRegistrar aprobador y hora de aprobaciónEMAIL_SENDINGNo hace falta
APPROVAL_PENDINGrejectNingunaRegistrar motivo de rechazoFAILEDNo hace falta
EMAIL_SENDINGemail_sentNingunaEnviar e-mail y registrar email IDCOMPLETEDIdempotencia: si el e-mail ya fue enviado, saltar
EMAIL_SENDINGtimeoutretry_count < 3Registrar fallo y revisar idempotenciaEMAIL_SENDING (retry) o FAILEDClave de idempotencia: email_id + thread_id
FAILEDretryretry_count < maxRevisar idempotencia y recuperar desde el checkpoint anteriorQUERY_RUNNING o REPORT_GENERATING o EMAIL_SENDINGDecidir punto de recuperación según checkpoint
COMPLETEDNingunaNingunaRegistrar hora de finalización y limpiar recursosTerminalNo hace falta

Corrección del incidente: si falla el paso 5 (EMAIL_SENDING -> timeout), se debe recuperar desde EMAIL_SENDING, no desde QUERY_RUNNING. El checkpoint debe registrar el nodo actual (EMAIL_SENDING), los pasos ejecutados (QUERY, REPORT_GENERATED, APPROVAL_APPROVED) y lo siguiente que debe ocurrir (EMAIL_SENDING). La generación de reportes y el envío de e-mails necesitan claves de idempotencia para evitar duplicados.

5. Idempotencia y compensación: recuperar no es solo checkpoint

Tener un checkpoint no significa que todos los efectos externos se recuperen de forma segura. La recuperación también necesita idempotencia, transacciones, compensación y revisión del estado del sistema externo.

5.1 Conceptos de idempotencia y compensación

Definiciones:

  • Idempotente: varias ejecuciones producen el mismo resultado y no crean efectos externos duplicados
  • Compensación: deshacer un efecto externo ya producido y restaurar consistencia
  • Rollback de transacción: operación atómica que se revierte automáticamente al fallar
  • Revisión de estado externo: revisar el sistema externo antes de recuperar para evitar operaciones duplicadas

Tres pilares de consistencia de estado: identidad de idempotencia (action_id + schema_hash), cadena de state snapshots (snapshot + prev_hash + delta) y acción de compensación registrada (undo_op).

5.2 Checklist de idempotencia y compensación

Cómo decidir qué operaciones necesitan idempotencia y cuáles compensación:

Tipo de operación¿Necesita idempotencia?¿Necesita compensación?Diseño de clave de idempotenciaPlan de compensación
Consulta de datos (sin efecto externo)NoNo--
Generación de reporte (sobrescribe archivo)report_id + thread_idBorrar el reporte nuevo y restaurar la versión aprobada
Envío de e-mail (API externa)Difícilemail_id + thread_idEnviar e-mail de corrección o cancelación en algunos casos
Descuento de inventario (base de datos)inventory_id + order_idReponer inventario
Creación de ticket (sistema externo)ticket_id + thread_idCerrar ticket
Descuento de presupuesto (estado interno)budget_id + thread_idReponer presupuesto
Envío de solicitud de aprobación (sin efecto duradero)NoNo--

Lógica: si la operación produce un efecto externo, necesita idempotencia. Si el efecto puede revertirse, necesita compensación. En llamadas entre sistemas, la clave de idempotencia debería incluir un identificador del sistema externo. Las operaciones atómicas pueden apoyarse en rollback de transacción.

La recuperación no es solo checkpoint. También necesita idempotencia, transacciones, compensación y revisión del estado externo. Decir que un checkpoint permite recuperar todos los efectos de forma segura no es exacto.

6. Checklist de estados de tarea Agent: recuperable vs no recuperable

No todo checkpoint permite recuperar. Un terminal state es el estado final de una workflow execution: completado, fallido, con timeout o cancelado. Un terminal state no se reanuda; solo puede volver a ejecutarse o compensarse.

6.1 Tabla de clasificación de estados

Tipo de estado¿Recuperable?Condición de recuperaciónMétodo de recuperaciónEjemplo
Failedretry_count < maxRecuperar desde el checkpoint previoTimeout de llamada a herramienta
RetryRevisión de idempotencia aprobadaReejecutar desde el nodo fallidoFallo al enviar e-mail
CompensationParcialmenteExiste plan de compensaciónEjecutar undo_opFallo al descontar inventario
Approval Pauseevent approve/rejectCommand(resume=…)Espera de aprobación
TerminalNoNingunaSin ruta de recuperaciónCOMPLETED, FAILED (retry_count = max)

Notas: un estado Failed puede recuperarse con retry si retry_count < max. Un estado Retry necesita revisión de idempotencia y reejecuta desde el nodo fallido. Un estado Compensation es parcialmente recuperable si existe un plan. Approval Pause se recupera con event approve/reject. Terminal State no es recuperable, como COMPLETED o FAILED tras alcanzar el máximo de retries.

7. Lecturas relacionadas

El diseño de máquinas de estado es solo el punto de partida. El modelado de estado debe ajustarse al escenario de negocio; cada tarea necesita distinta granularidad y estrategia de recuperación.

ArtículoRelaciónEnlace
Diseño Human-in-the-loop Agent: qué pasos necesitan aprobación humanaDetalles de pausa de aprobación/blog/es/posts/ai/20260707-human-in-the-loop-agent-approval-design/
Control de costos Agent: model routing, presupuesto de herramientas y retry de fallosEstrategia de presupuesto y retry/blog/es/posts/ai/20260707-agent-cost-control-model-routing-tool-budget-cache-retry/
Gestión de estado con LangGraph en la práctica: mejores prácticas de arquitectura Agent 2026Gestión de estado en LangGraph/blog/es/posts/ai/20260424-langgraph-agent-architecture/
Monitoreo, alertas y recuperación de fallos para AI Agent: de logs a máquinas de estadoMonitoreo y recuperación/blog/es/posts/ai/20260527-ai-agent-monitoring-recovery/
LangGraph vs AutoGen State TrackingComparación de frameworks/blog/es/posts/ai/20260526-langgraph-autogen-state-tracking/
Datasets de evaluación Agent y pruebas de regresión: cómo evitar romper todo con un cambioEvaluación y pruebas de regresiónPróximo artículo de la serie

Referencias externas

Fuentes de alta confianza:

FuenteConfianzaTemaEnlace
Documentación LangGraph PersistencehighCheckpointer, Store, Thread State, Checkpointhttps://docs.langchain.com/oss/python/langgraph/persistence
Documentación LangGraph Interruptshighinterrupt(), Command(resume=…), thread_idhttps://docs.langchain.com/oss/python/langgraph/interrupts
Documentación Temporal Durable ExecutionhighEvent History, Durable Execution, Resumable/Recoverablehttps://docs.temporal.io/temporal
Documentación OpenAI Agents SDK TracinghighTrace, Span, workflow_name, trace_idhttps://openai.github.io/openai-agents-python/tracing/
Documentación AWS Step Functions State MachineshighState Machine, Flow State, Task State, StartAt, Nexthttps://docs.aws.amazon.com/step-functions/latest/dg/concepts-statemachines.html
Stately: State machines and statechartsmediumState, Event, Transition, Guard, Action, Hierarchyhttps://stately.ai/docs/state-machines-and-statecharts

Una máquina de estados no es necesaria para todos los agentes, pero las tareas complejas deben hacer explícito su progreso. El siguiente paso no es sumar más frameworks. Es diseñar State, Event, Transition, Guard y Action adecuados para tu escenario de negocio, y mover el progreso de la tarea desde lenguaje natural en el prompt hacia estado estructurado.

Diseñar una máquina de estados para un agente de IA complejo

Divide una tarea compleja de agente de IA en state, event, guard, action, checkpoint, retry, compensation y terminal state para que el progreso no quede oculto solo en el prompt.

⏱️ Estimated time: 45 min

  1. 1

    Step 1: Lista los puntos de riesgo

    Lista los efectos externos, puntos de pausa humana, puntos de fallo y condiciones terminales de la tarea.
  2. 2

    Step 2: Define el conjunto mínimo de estados

    Define un conjunto mínimo de estados, como pending, running, waiting_approval, retrying, compensating, succeeded, failed y cancelled.
  3. 3

    Step 3: Conecta events con next states

    Para cada state, escribe qué events puede recibir y a qué next state conduce cada event.
  4. 4

    Step 4: Agrega condiciones de guard

    Agrega guards a las transitions peligrosas: permisos, presupuesto, approval, clave de idempotencia y estado de recursos externos.
  5. 5

    Step 5: Aísla las acciones de herramientas

    Pon las llamadas a herramientas en la capa action y registra resumen de input, resumen de output, traceId y resultado del efecto externo.
  6. 6

    Step 6: Define políticas de fallo

    Define retry policy, terminal state y compensation policy para cada ruta de fallo.
  7. 7

    Step 7: Persiste la base de recuperación

    Define un checkpoint o event log para recuperar, y trata el prompt como contexto temporal, no como la única fuente de verdad.

FAQ

Si el agente falla en el paso 5, ¿debo volver al paso 1 o continuar desde un checkpoint?
Depende de si los efectos externos son idempotentes y de si el checkpoint alcanza. Sin efectos externos, puedes volver al inicio. Con efectos externos idempotentes, continúa desde el checkpoint. Si no son idempotentes, compensa primero y luego recupera. Sin checkpoint, solo queda empezar de nuevo y asumir el riesgo de duplicar efectos.
¿El estado de la tarea debe vivir en el prompt, en una base de datos, en un checkpoint de LangGraph o en un job de cola?
Para tareas simples, el prompt puede ser contexto temporal. Las tareas complejas necesitan checkpoint o event log más estado de negocio. En producción, suele usarse un checkpoint de LangGraph para thread state y una base de datos de negocio para pedidos, aprobaciones, permisos y facturación. Un job de cola sirve para ejecución asíncrona, pero sigue necesitando gestión de estado.
¿Cuál es la diferencia entre una máquina de estados y un diagrama de workflow?
Una máquina de estados se centra en estados finitos alcanzables, transitions deterministas, guards y actions. Un workflow se centra más en la secuencia de pasos de ejecución. Un agente necesita los conceptos centrales de la máquina de estados, pero no siempre necesita un statechart completo con jerarquía y concurrencia.
¿Cómo garantizo que el agente vuelva al mismo punto de ejecución después de approval?
Usa la misma thread_id y recupera desde un checkpoint, por ejemplo con el patrón Command(resume=...) de la documentación de LangGraph Interrupts. El checkpoint debe registrar el nodo actual, los pasos ya ejecutados y la acción siguiente, y los efectos antes del interrupt deben ser idempotentes.
¿Retry y compensation van en el prompt o en las reglas de transición de estado?
Van en reglas de transición del servidor, no solo en el prompt. retry_count, max retry, claves de idempotencia, undo_op y terminal states deben ser testeables, auditables y recuperables. El prompt puede ayudar a decidir, pero no debe ser el único soporte de las reglas de fiabilidad.
¿Un agente simple de atención al cliente necesita una máquina de estados?
Un bot FAQ de un solo turno normalmente no necesita una máquina de estados pesada. Cuando el agente consulta pedidos, crea tickets, gestiona aprobaciones de reembolso, pagos o APIs externas, necesita estado explícito, checkpoints, idempotencia y compensación.

14 min de lectura · Publicado el: 17 sep 2026

Comentarios

Inicia sesión con GitHub para dejar un comentario

Easton BlogEaston Blog