Коротко
- Графа в OpenClaw нет, и в планах Swarm его тоже нет. Шаги связывает сам агент через субагентов, программа на JavaScript в Swarm или линейный пайплайн Lobster с одобрениями.
- Выбирайте не по форме потока, а по тому, где сохранится место работы при сбое. Lobster держит его на точках одобрения. Swarm сохраняет результаты детей, но сам скрипт рестарт не переживает. Субагенты сохраняют завершения, а что делать дальше, решает родитель.
- Если процесс идёт днями, должен продолжиться с упавшего шага и сам повторять внешние вызовы, берите движок с сохранением состояния: Temporal, LangGraph с постоянным чекпойнтером или n8n.
Вы собираете цепочку: найти материалы, проверить их, отправить отчёт. Рука тянется нарисовать граф с узлами и стрелками, а в OpenClaw рисовать его негде. Документация Swarm говорит прямо: «There is no graph DSL and no separate workflow format. The program is the orchestration». То есть графового языка нет, оркестрацией служит сама программа. Мы разобрали по документации три способа связать шаги и вывели правило выбора: граф нужен не для того, чтобы рисовать поток, а для того, чтобы продолжить с места сбоя. Если перезапуск с нуля дешёв и безопасен, граф вам не нужен.
Три способа связать шаги
DSL (domain-specific language) здесь означает отдельный язык описания потока: узлы, рёбра, условия. В OpenClaw такой язык один, Lobster, и он линейный. Схема выбора:
Кто решает, какой шаг следующий?
├─ модель, по ходу работы ──────────────► (а) субагенты: sessions_spawn → отчёт родителю
├─ ваш код, много похожих детей ────────► (б) Swarm: скрипт Code Mode, agents.run + schema
└─ порядок известен заранее,
есть отправка или удаление ──────────► (в) Lobster: steps, condition, approval, resume
Перезапуск с нуля дорог или опасен, ждать нужно днями? ─► Temporal / LangGraph / n8n
(а) Субагенты: граф живёт в голове модели
sessions_spawn запускает фоновый прогон в отдельной сессии и сразу возвращает { status: "accepted", runId, childSessionKey }, не дожидаясь конца. Когда ребёнок закончит, его результат придёт запросившему на проверку. Опрашивать статус в цикле документация запрещает: завершение приходит само, а ждать его помогает sessions_yield.
Следующий шаг здесь выбирает модель родителя, опираясь на свою задачу и AGENTS.md. Другие файлы личности ребёнок не получает. По умолчанию дерево агентов уходит на глубину до 5, у одной сессии не больше 5 активных детей и не больше 8 одновременно работающих. Документация советует этот путь для одного или нескольких детей.
(б) Swarm: граф — это ваш JavaScript
Swarm запускает много субагентов из скрипта Code Mode, режима, в котором модель пишет короткую программу на JavaScript вместо череды отдельных вызовов инструментов. Ветвления и циклы пишутся обычными if, while и Promise.all. Swarm добавляет к программе детей, которых можно дождаться (agents.run), ответы по JSON-схеме, лимиты и прогресс в чате (phase, log). Цикл с решением о следующем проходе, сокращённо по документации:
// из docs: tools/swarm.md, «Loop on a decision gate» (схема gateSchema опущена)
let pass = 0;
let decision = { ready: false, reason: "Not checked", nextAction: "Review" };
while (!decision.ready && pass < 4) {
pass += 1;
phase(`Decision pass ${pass}`);
decision = await agents.run(
`Check whether the release evidence is complete. Previous decision: ${JSON.stringify(decision)}`,
{ label: `release-gate-${pass}`, schema: gateSchema },
);
log(decision.reason);
}
Что гарантировано. С schema ребёнок сдаёт ответ через служебный инструмент structured_output. На невалидный ответ он получает одну подсказку исправиться. Если не исправился, упал, был убит или вышел по времени, промис отклоняется с ошибкой SwarmAgentError, где есть runId, status и message. Лимиты по умолчанию: 32 ребёнка одновременно, 50 живых в группе, 200 за всю жизнь группы. Последнее число документация называет страховкой от разбегания, а не заменой условия остановки.
Чего нет. Дети одноразовые: многоходового работника с состоянием нет, запуск только на локальном Gateway. Режим сборщиков (collector), в котором работает Swarm, не поддерживает ACP, то есть Claude Code и Codex в роли детей, а также видимые и постоянные сессии. И главное: «Saved workflow definitions and a graph DSL are not part of Swarm’s current direction». Сохранённых описаний потока и графового языка у Swarm нет и не планируется.
Условия запуска. agents.run появляется, только если включён Code Mode и политика разрешает родной sessions_spawn. Одноимённый MCP-инструмент не подходит. Code Mode экспериментальный, а что будет при отсутствии ключа, две страницы docs описывают по-разному. Поэтому пропишите tools.codeMode явно.
(в) Lobster: граф записан заранее, но без петель
Lobster — отдельно устанавливаемый плагин @openclaw/lobster. Он выполняет многошаговый пайплайн одним детерминированным вызовом инструмента и останавливается на точках одобрения или ввода. Документация сама называет его «small, constrained DSL»: маленький язык с намеренно узкой грамматикой, чтобы пайплайн оставался данными, которые легко логировать, сравнивать и ревьюить. Обзор автоматизации на вопрос «нужны многошаговые потоки?» отвечает одним словом: Lobster. Task Flow, который раньше закрывал часть этих задач, в ветке 10.x удалён.
Файл пайплайна из документации:
# из docs: tools/lobster.md, «Workflow files (.lobster)»
name: inbox-triage
steps:
- id: collect
command: inbox list --json
- id: categorize
command: inbox categorize --json
stdin: $collect.stdout
- id: approve
command: inbox apply --approve
stdin: $categorize.stdout
approval: required
- id: execute
command: inbox apply --execute
stdin: $categorize.stdout
condition: $approve.approved
Поля файла: name, args, steps, env, condition, approval. Ветвиться можно через condition, а конструкции цикла в описанном формате нет. Если нужен «повторяй, пока проверка не пройдёт», это Swarm или ваш скрипт внутри шага. Шаг — это команда CLI, вызвать можно любую программу.
Что гарантировано. На точке одобрения вызов возвращает needs_approval и токен, после approve: true пайплайн продолжается без повтора ранних шагов. Процесс, который ждал бы ответа, не висит: состояние лежит маленькими JSON-файлами в ~/.lobster/state.
Что каждый способ держит при сбое
| Субагенты | Swarm | Lobster | |
|---|---|---|---|
| Кто выбирает следующий шаг | модель родителя | ваш JavaScript | файл пайплайна |
| Циклы | на усмотрение модели | while/for с вашим пределом; страховка 200 детей на группу |
нет; только condition |
| Упавший шаг | прерванный ребёнок не перезапускается, родитель получает отметку о прерывании | промис отклоняется; docs: упавшее автоматически не перезапускать | openclaw.invoke после отправки не повторяется; превышение timeoutMs (по умолчанию 20 с) прерывает прогон |
| Рестарт Gateway | записи субагентов и принятые передачи результатов сохраняются в SQLite; продолжение решает родитель | ячейка со скриптом не переживает; результаты детей сохраняются; store() переживает |
состояние паузы в файлах; что с шагом, который шёл в момент рестарта, docs не пишут |
| Где человек | читает отчёт родителя | только в конце: одобрения внутри детей сразу дают отказ | approval и input с токеном продолжения |
| Где состояние | транскрипты сессий | переменные скрипта и store() до 1 МиБ на сессию |
вывод шагов ($step.json) и файлы паузы |
Строка про рестарт решает больше всего. По документации: «After a Gateway restart, the parent owns continuation of the user’s task». Прерванный ребёнок завершается с отметкой о прерывании, и проверить, что он успел сделать наполовину, должен родитель. Повторное использование сессии ребёнка возвращает ему контекст, но прерванную команду не повторяет.
Почему графа нет и почему обычно не надо
Графовый движок даёт две вещи. Первая — видимый порядок шагов. Вторая — сохранённое место, с которого можно продолжить после сбоя.
Видимость OpenClaw даёт и без графа. Пайплайн Lobster — файл, который можно положить в git и сравнить с прошлой версией. Скрипт Swarm — короткая программа, а phase и log показывают этапы в виджете прогресса.
Сохранённого места OpenClaw даёт меньше, и это честная граница. Но утренний разбор почты, исследование с проверкой или пачка ревью — это минуты работы: если Gateway перезапустился посреди них, дешевле запустить задачу заново, чем держать отдельный движок. Опасен перезапуск, только когда шаг меняет мир: отправляет, публикует, удаляет. Для этого у Lobster есть точка одобрения перед побочным эффектом. А в Swarm такие действия лучше вынести из детей вовсе: одобрить их ребёнок не сможет.
Отсюда различение для выбора. Спросите не «какой формы мой поток?», а «что будет, если он оборвётся на середине?».
- Ничего страшного, запущу заново — хватит субагентов или Swarm.
- Нельзя повторять уже сделанное, но шаги короткие — Lobster с одобрением перед побочным эффектом.
- Часы работы пропадут, или шаг нельзя выполнить дважды, а ждать нужно днями — это задача для движка.
Промежуточный вариант внутри OpenClaw есть. Скрипт Swarm может сохранять ход работы через store(): значения до 256 КиБ, всего до 1 МиБ на сессию, переживают рестарт Gateway. Записи становятся видны другим ячейкам, только когда ячейка завершилась успешно. В restartSafe и фоновых (headless) ячейках store недоступен. Продолжать после рестарта всё равно придётся новой ячейкой, которую напишете вы или агент. Сам OpenClaw её не перезапустит.
Где стоит человек
- Субагенты. Результат по умолчанию возвращается запросившему «for review», на проверку. Если запросивший — вы, вы и решаете, что дальше.
- Swarm. Внутри детей человека нет. «Collector approvals fail closed»: ребёнок не открывает запрос на одобрение, действие отклоняется, а ребёнок может сообщить об отказе в результате. Человек видит прогресс в чате и может нажать Stop. Если Stop завершился по таймауту или отменил не всех детей, документация советует найти оставшихся через
subagentsсaction: "list"и отменить их повторно. - Lobster. Человек стоит на точках
approvalиinput. Есть две особенности. Плагин не показывает список ожидающих точек, токен нужно сохранить самому. И токен не привязан к пользователю или сессии: продолжить может любой, кому разрешён инструмент.
Что стоит
Своих замеров у нас нет: на живом OpenClaw мы такие пайплайны не гоняем. Документация называет источники расхода:
- у каждого субагента свой контекст и свой расход токенов; для повторяющихся задач советуют дешёвую модель через
agents.defaults.subagents.model; - в Swarm каждый работающий ребёнок занимает поток модели и изолят Code Mode; для детей можно завести отдельного агента с дешёвой моделью (встроенного
workerнет); - Lobster заменяет «many round-trip tool calls, with the model orchestrating every step» одним вызовом; шаги — команды CLI, модель работает только там, где шаг её вызывает.
Как считать самим: низкоуровневый agents_wait возвращает по каждому ребёнку usage с inputTokens и outputTokens. agents.run() по сигнатуре отдаёт только текст или структурированный ответ, так что для учёта токенов по детям нужен низкоуровневый путь. Потолка по токенам в документации этих трёх механизмов нет: лимиты Swarm считают детей, а не токены.
Где ломается
Promise.allтеряет работу. Он отклоняется на первом сбое и не собирает остальные исходы. БеритеPromise.allSettledи сообщайте об упавших ветках.- Цикл без предела. Без условия остановки скрипт упрётся в 200 детей на группу. Ставьте явный счётчик проходов, как в примере выше.
- Рестарт посреди скрипта. Ячейка Code Mode пропадёт, результаты детей останутся. Документация просит не повторять успешные запуски и не перезапускать упавшее автоматически. Храните
runIdи ход работы вstore(). - Долгий шаг в Lobster.
timeoutMsпо умолчанию 20 000 мс на весь прогон. Поднимите его или разбейте пайплайн. - Шаг с моделью внутри Lobster. Во встроенном раннере вызов
openclaw.invoke --tool llm-taskдокументация называет ненадёжным. Пока советуют звать llm-task напрямую, вне Lobster, или обходиться шагами безopenclaw.invoke. - Песочница. В песочнице инструмент Lobster отключён целиком, а
cwdдолжен лежать внутри рабочего каталога Gateway. - Claude Code или Codex в роли детей Swarm. Режим сборщиков ACP не поддерживает. Для них нужен обычный
sessions_spawn.
Когда граф или durable-движок всё-таки нужен
Durable-движок, то есть движок с долговечным исполнением, сохраняет состояние процесса после каждого шага и продолжает с места сбоя сам. Ниже три таких инструмента, по их официальной документации.
| Признак задачи | Инструмент | Что он даёт | Цена |
|---|---|---|---|
| Процесс идёт дни или недели, внешние вызовы надо повторять по правилам, повтор уже сделанного недопустим | Temporal | выполнение «effectively once and to completion», хоть секунды, хоть годы; после сбоя продолжает с последнего события в Event History; упавшие Activity по умолчанию повторяются | код Workflow обязан быть детерминированным, вызовы API и LLM выносятся в Activities; отдельный сервис |
| Агентный цикл с общим состоянием, пауза на человека в любом месте, продолжение с последнего успешного шага | LangGraph | чекпойнт на каждом шаге графа (super-step); успешные узлы при продолжении не перезапускаются; interrupt() ждёт ответа сколько угодно |
нужен постоянный чекпойнтер: InMemorySaver теряет всё при рестарте процесса; нужен thread_id |
| Цепочка интеграций между сервисами, где сбои разбирают и перезапускают из истории выполнений | n8n | повтор выполнения продолжает с сохранённого состояния, завершённые узлы не повторяются; Retry On Fail у узла; error workflow при сбое | упавший узел заново обрабатывает все свои элементы, поэтому нужны операции «вставить или обновить» |
OpenClaw при этом можно оставить пультом. Внешний сервис запускает агента через вебхук, а агент разбирает результат и пишет вам в мессенджер. Долговечную часть держит движок, суждение и разговор остаются агенту.
Как выбрать за минуту
- Шагов один-три, следующий шаг зависит от того, что нашлось, — субагенты.
- Пять и больше похожих детей, нужен ответ по схеме или цикл с условием — Swarm. Пропишите
tools.codeModeявно и поставьте предел проходов. - Порядок известен заранее, в конце отправка, публикация или удаление — Lobster с
approval: requiredперед этим шагом. - Обрыв посередине стоит часов работы или повторяет необратимое, а ждать нужно днями — Temporal, LangGraph с постоянным чекпойнтером или n8n.
Куда дальше
Swarm в деле — в «Враждебной проверке»: исследователи, критики на другой модели и цикл со шлюзом. Пайплайн по расписанию разобран в «Редакции по расписанию», работа на несколько дней — в статье о долгой задаче. Насколько зрелы Code Mode и автоматизации, — в «Зрелости без иллюзий».
Проверено по документации OpenClaw 2026.10.8 и официальной документации LangGraph, Temporal и n8n, 29 октября 2026.