Тема
Состояние процесса
State хранит этап диалога или процесса между запусками n8n. Например, бот может помнить, что у одного пользователя он ждёт имя, а у другого — подтверждение.
Вместо таблицы и большого набора If workflow отправляет событие в state_transition и получает:
- предыдущее и новое состояние;
- сохранённый context;
- номер версии;
- список effects, которые нужно выполнить дальше.
Повтор одного event_id безопасен: переход не выполнится второй раз. Состояния изолированы по workspace, machine и subject.
Формат machine
Machine — это JSON без исполняемого кода. Переходы лежат в states, а assign обновляет context. Значение {"$path": "event.payload.text"} копирует данные из события; это не строковый шаблон.
json
{
"initial": "waiting_name",
"context": {},
"states": {
"waiting_name": {
"on": {
"text_received": {
"target": "confirming",
"guard": {
"path": "event.payload.text",
"op": "ne",
"value": ""
},
"assign": {
"name": {"$path": "event.payload.text"}
},
"effects": [
{
"type": "show_confirmation",
"name": {"$path": "event.payload.text"}
}
]
}
}
},
"confirming": {
"on": {
"confirm": {"target": "done"},
"edit": {"target": "waiting_name"}
}
},
"done": {"type": "final"}
}
}Пути начинаются с event.* или context.*. Guards поддерживают all, any, not и операции eq, ne, exists, in, gt, gte, lt, lte. Любая логика, которая вызывает API или connector, остаётся в n8n: machine только возвращает массив effects.
Ответ transition
state_transition возвращает previous_state, state, context, effects, transitioned, version и definition_version. Форма ответа и пример также доступны агенту через automation_describe_action.
В dry-run используется отдельная симуляция: переход вычисляется на текущем состоянии, но instance и history в базе не изменяются.
В n8n
Используйте:
- Life OS Trigger для входящего события;
- Life OS Action для перехода состояния и внешних действий;
- обычный Switch для маршрутизации возвращённых effects.
Агент сам создаёт machine, action bindings и event subscription. Ключи Telegram, CRM и других систем в workflow не помещаются.