Cookbook
Storylines · for AI agents

Параллельные шаги — выполнение нескольких действий, затем продолжение

AND-соединение: несколько подпроцессов выполняются в любом порядке, каждый со своими проверками; продолжение только после завершения всех.

MCP tools:create_storylinevalidate_storyline

Некоторые шаги — это не одна линия, а «сделайте всё это, в любом порядке, каждый со своими собственными последующими шагами, и продолжайте только тогда, когда всё завершено». Классический пример — подача заявления на визу: паспорт, выписка из банка и приглашение требуют сбора и различного рассмотрения, но вы не можете подать документы, пока все три не пройдут проверку. Это параллельный узел (разветвление / AND-соединение), полноценный тип узла — вам не нужно вручную программировать флаги завершения.

Как это работает

Узел parallel объявляет несколько обязательных ветвей, каждая из которых указывает на вход в свой собственный подпроцесс. Движок предлагает незавершенные ветви в качестве вариантов, отслеживает завершение нативно (вход в ветвь фиксирует это; возврат к параллельному узлу помечает её как завершенную) и автоматически переходит по выходу соединения узла — первому выходу с to_node_keyавтоматически, как только все ветви завершены. Вам не нужно самостоятельно оценивать это условие; метка предназначена только для людей. Каждая ветвь может быть полноценным многоузловым подпроцессом со своими проверками и циклами; её последний шаг просто выполняет обычный выход обратно к параллельному узлу.

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": []}
  ]}
)

Заявитель может предоставить три документа в любом порядке; каждый возвращается к collect, когда проходит проверку. submit недоступен, пока не будут завершены все три ветви — движок переходит по выходу соединения только тогда.

Давайте каждой ветви столько собственного потока, сколько ей нужно — паспорт, срок действия которого истекает, может проходить цикл через узел «продлить и загрузить снова», прежде чем вернуться; ветвь банка может запросить выписку с пополнением. Сохраняйте уникальность key ветвей. Затем вызовите validate_storyline перед публикацией — она отметит параллельный узел без ветвей, ветвь, указывающую на отсутствующий узел, или отсутствие выхода соединения.