Ошибки нод

Когда нода падает, у движка ровно два сценария. Либо у ноды нарисована ветка ошибки — тогда управление уходит в неё, и запуск продолжается. Либо ветки нет — тогда всё, что стояло ниже по этой ветви, пропускается с причиной «все пути сюда оборвались из-за ошибки выше», а соседние параллельные ветви доигрывают до конца.

Включить ветку ошибки

  1. Откройте настройки ноды и включите поле Выход ошибки (expose_error_output).
  2. На карточке появится выход on_error.
  3. Протяните из него ребро в ноду, которая обработает сбой.

Поле есть почти у всех нод-шагов; у большинства оно выключено по умолчанию, у http_request — включено. Ребро из on_error без включённого поля валидатор отбивает ошибкой: порт, которого нода не показывает, означает неподключённую ветку.

Когда ветка есть и сработала, запуск остаётся завершённым: ошибка считается обработанной. Успешная ветка той же ноды при этом мертва — из двух её выходов в одном запуске срабатывает ровно один, поэтому обе ветви могут спокойно сходиться в общую ноду или в общий exit.

HTTP-запрос
Успех
Обработка ошибки
Выход
  • Исполнение + данные
Выход успеха и выход ошибки одной ноды взаимоисключающие — они могут сойтись в один exit.

Что приходит в ветку ошибки

Ребро on_error доставляет в целевую ноду объект — на тот вход, в который вы его завели. Читается он как обычное значение: {{ inputs.input.message }}.

Поле Что содержит
message Короткое описание сбоя для вас — и, если сервис ваш, слова самого сервиса.
error_code Машинный код (см. ниже) или INTERNAL, если платформа не смогла отнести сбой ни к чему конкретному.
exception_type Всегда пустая строка. Поле осталось ради совместимости старых графов.
failed_node_id Идентификатор упавшей ноды.
failed_node_type Тип упавшей ноды.

Ветвиться нужно по error_code: он стабилен, а message — фраза для чтения, и она меняется вместе с формулировками платформы и стороннего сервиса.

Коды ошибок

Код делит все сбои на два мира, и от этого зависит, будет ли повтор.

Детерминированные — сбой является свойством самого запроса, повтор ничего не изменит и только потратит деньги:

VALIDATION, INVALID_PATH, NOT_FOUND, ACCESS_DENIED, SIZE_LIMIT, CONFLICT, PRECONDITION_FAILED.

Временные — следующая попытка вполне может пройти:

PROVIDER_ERROR, CONNECTION, TIMEOUT, RATE_LIMIT.

Отдельно стоят два кода про доступ и деньги — оба детерминированные, потому что повтор их не лечит, а платный вызов повторяется за ваш счёт: AUTH (сервис отверг сам ключ) и BILLING (у аккаунта за ключом кончились средства или квота).

Повторы

Повтор возможен, только если тип ноды объявил бюджет повторов; сколько их было, видно в карточке ноды в поле Повторы. Даже при ненулевом бюджете движок не повторяет детерминированные коды и ошибки программирования — они летят наверх сразу. Сетевые сбои самого обращения к модели повторяет клиент провайдера, ещё внутри вызова.

У ноды есть и потолок по времени — по умолчанию 10 минут. Ноды, которые исполняют внутри себя другие ноды (циклы, суб-воркфлоу, агенты), из него исключены: их время складывается из времени детей, а каждый ребёнок ограничен сам. Общий потолок запуска действует в любом случае.

Ноды без ветки ошибки

  • entry — вход запуска, ему нечему падать посередине графа.
  • wf_tool — воркфлоу-как-инструмент: его ошибка уходит либо модели, либо по обычному пути упавшей ветки.
  • Ноды-инструменты, которые вызывает агент: их сбой возвращается модели текстом, и она решает, что делать дальше.
  • Конфигурационные ноды (llm, память, хранилища): они подтягиваются лениво, поэтому ошибка всплывает у той ноды, которая их использует.