Action-Based Workflow Engine: архитектурный паттерн
Когда строишь агента с несколькими десятками шагов, логика быстро превращается в кашу условий и ветвлений. Action-Based Workflow Engine — это способ структурировать логику агента через набор атомарных действий, который можно оркестрировать в любом порядке.
Паттерн популярен в продуктах вроде n8n, Zapier, GitHub Actions и любых системах автоматизации. В контексте AI-агентов он особенно важен: агент сам решает, какое действие вызвать — но сами действия чётко определены заранее.
Основная идея
Центральная мысль: вся логика системы разбивается на атомарные действия, каждое из которых делает ровно одну вещь. Агент (или оркестратор) выбирает действия из набора и вызывает их по цепочке или параллельно.
Отличие от процедурного подхода (где логика зашита в одном большом скрипте): каждое действие независимо, переиспользуемо и тестируется отдельно.
Структура действия
Каждое действие описывается четырьмя параметрами:
- name — уникальный идентификатор (например:
read_page,send_message,update_status) - description — что делает действие и зачем оно нужно агенту
- parameters — что подаётся на вход (с типами и описаниями)
- handler — функция, которая выполняет логику
Пример на TypeScript:
const actions = {
read_notion_page: {
name: "read_notion_page",
description: "Прочитать страницу Notion по URL",
parameters: {
url: { type: "string", description: "URL страницы Notion" }
},
handler: async ({ url }) => {
return await notionClient.pages.retrieve({ page_id: extractId(url) });
}
},
send_telegram: {
name: "send_telegram",
description: "Отправить сообщение в Telegram",
parameters: {
chat_id: { type: "string" },
text: { type: "string" }
},
handler: async ({ chat_id, text }) => {
return await telegram.sendMessage(chat_id, text);
}
}
};Оркестратор: как агент выбирает действия
Оркестратор — это центральный цикл, который выбирает следующее действие на основе текущего состояния и контекста.
Сценарий выбора действия:
- Агент получает задачу и контекст
- LLM выбирает одно или несколько действий из набора
- Действия выполняются, результат добавляется в контекст
- LLM снова анализирует состояние — подходит ли он для завершения задачи или нужно ещё действие
- Цикл повторяется до завершения или до достижения лимита шагов
Очередь выполнения
Действия могут выполняться по-разному:
- Последовательно (chain): каждое действие запускается только после завершения предыдущего. Простой и предсказуемый поток.
- Параллельно (parallel): несколько действий запускаются одновременно, результаты собираются после. Ускоряет выполнение, но требует аккуратной балансировки нагрузки.
- По условию (conditional): агент выбирает действие в зависимости от результата предыдущего. Например: если парсинг вернул ошибку — попробовать обходной маршрут.
Пример реального пайплайна
Контент-агент, который обрабатывает новые задачи из Notion-инбокса, может использовать пайплайн из десяти действий:
read_inbox_card
→ check_status # проверить, что карточка новая
→ set_status_processing # статус → «В обработке»
→ read_source_url # прочитать исходную страницу
→ classify_content # определить целевую базу
→ write_draft # написать черновик
→ create_page # создать страницу в CMS
→ link_result # привязать результат к инбокс-карточке
→ set_status_done # статус → «Обработан»Каждый шаг — отдельная функция. Если что-то сломалось, легко понять — где именно.
Почему это важно
Инструкция агента с описанием действий работает значительно лучше, чем инструкция в стиле «сделай всё возможное». Агент знает:
- что он умеет делать (набор действий)
- как правильно их сочетать (оркестратор)
- какие параметры передавать (схема действий)
Это делает систему предсказуемой, надёжной и легко расширяемой: добавить новое действие можно, не переписывая всю инструкцию.
Когда использовать
Паттерн оправдан, если агент выполняет более 5–10 разных шагов, разные действия повторяются в разных сценариях или нужна прозрачность в отладке. Если агент делает два-три действия — достаточно простой инструкции.
Есть вопросы по архитектуре AI-агентов или хотите обсудить, как выстроить подобное под ваши задачи — Telegram: t.me/pimenov