Cookbook
Storylines · for AI agents

Pasos en paralelo — hacer varias cosas y luego continuar

Una unión AND: varios sub-flows se ejecutan en cualquier orden, cada uno con sus propias verificaciones; continuar solo cuando todos hayan terminado.

MCP tools:create_storylinevalidate_storyline

Algunos pasos no son una línea — son "haz todo esto, en cualquier orden, cada uno con sus propios pasos siguientes, y continúa solo cuando todos hayan terminado". Una solicitud de visado es el caso clásico: el pasaporte, el extracto bancario y la carta de invitación requieren cada uno su recopilación y una diferente revisión, pero no puedes presentar la solicitud hasta que los tres pasen. Ese es un nodo paralelo (una bifurcación / unión AND), un tipo de nodo de primera clase — no tienes que cablear manualmente las banderas de finalización.

Cómo funciona

Un nodo parallel declara varias ramas obligatorias, cada una apuntando a la entrada de su propio subflujo. El motor presenta las ramas pendientes como opciones, rastrea la finalización de forma nativa (entrar en una rama la registra; volver al nodo paralelo la marca como completada), y toma la salida de unión del nodo — la primera salida con un to_node_keyautomáticamente, una vez que todas las ramas estén completas. No evalúas esa condición tú mismo; la etiqueta es solo para humanos. Cada rama puede ser un subflujo completo de varios nodos con sus propias verificaciones y bucles; su último paso simplemente toma una salida normal de vuelta al nodo paralelo.

create_storyline(
  agent_name="Visa", key="visa-docs", name="Visa documents",
  graph={"nodes": [
    {"node_key": "collect", "title": "Collect all documents", "type": "parallel",
     "flags": {"is_entry": True},
     "parallel": {"branches": [
       {"key": "passport", "label": "Passport",         "to_node_key": "p1"},
       {"key": "bank",     "label": "Bank statement",   "to_node_key": "b1"},
       {"key": "invite",   "label": "Invitation letter","to_node_key": "i1"}
     ]},
     "exits": [{"kind": "ai", "label": "all documents cleared", "to_node_key": "submit",
                "ai_criteria": "all required documents have been checked"}]},
 
    {"node_key": "p1", "title": "Check passport", "task": "Verify validity ≥ 6 months; if not, tell the user what to renew.",
     "exits": [{"kind": "ai", "label": "passport ok", "to_node_key": "collect", "ai_criteria": "passport is valid and legible"}]},
    {"node_key": "b1", "title": "Check bank statement", "task": "Confirm 3 months of history and a sufficient balance.",
     "exits": [{"kind": "ai", "label": "bank ok", "to_node_key": "collect", "ai_criteria": "statement covers 3 months and meets the threshold"}]},
    {"node_key": "i1", "title": "Check invitation", "task": "Confirm host details and dates match the trip.",
     "exits": [{"kind": "ai", "label": "invite ok", "to_node_key": "collect", "ai_criteria": "invitation is consistent with the trip"}]},
 
    {"node_key": "submit", "title": "Submit application", "task": "Package the cleared documents and submit.",
     "flags": {"is_terminal": True}, "exits": []}
  ]}
)

El solicitante puede proporcionar los tres documentos en cualquier orden; cada uno vuelve a collect cuando se aprueba. submit es inaccesible hasta que las tres ramas estén completas — el motor solo toma la salida de unión entonces.

Dale a cada rama tanto de su propio flujo como necesite — un pasaporte que expira puede pasar por un nodo de "renovar y volver a subir" antes de regresar; la rama bancaria puede solicitar un extracto con depósito adicional. Mantén los keys de las ramas únicos. Luego ejecuta validate_storyline antes de publicar — marcará un nodo paralelo sin ramas, una rama que apunta a un nodo inexistente, o la falta de una salida de unión.