Сборка агентов как в dbt: декларативный подход с zymi

Сборка агентов как в dbt: декларативный подход с zymi

Я пришёл в разработку агентов из дата-инженерии, и, в очередной раз собирая типовую структуру на LangGraph, заскучал по декларативному подходу — тому самому, который хорошо знаком по dbt. Там вы описываете, что хотите сделать с данными, а не как. Это навело меня на мысль: а почему бы не создать фреймворк для агентов, предлагающий такой же принцип?

Особенно раздражал мутабельный State в мультиагентных системах на LangGraph. Он быстро превращается в неуправляемую свалку в памяти, требует аккуратного обновления, а при ошибках — ручного поиска проблем через принты. Возможно, я что-то делаю не так, но для меня это — постоянная трата внимания. В поисках решения я познакомился с event-driven, а затем — event-sourced архитектурой. Ключевым источником стала научная работа «ESAA: Event Sourcing for Autonomous Agents in LLM-Based Software Engineering» (Brito dos Santos Filho, 2026). На её основе я создал свой фреймворк — zymi. Расскажу обо всём по порядку.

Фреймворк написан на Rust — его преимущества, думаю, не нужно лишний раз перечислять. Разработка велась с помощью Claude Code. Можно по-разному относиться к вайб-кодингу и генерации кода, но я понял одну важную вещь: если хочешь создать что-то актуальное, другого выбора нет. Я начал проект в разгар шумихи вокруг OpenClaw, а сейчас пишу эту статью, отдавая команды Claude Code со своего iPhone. Если бы писал всё сам, закончил бы только при бесплатном и повсеместно доступном AGI — то есть, никогда.

Из-за скорости разработки возникло и название. Сначала проект назывался zumi — отсылка к «зумису» у собак, когда они внезапно начинают носиться по дому. Но уже на второй неделе появилось приложение с эмпатичным AI-питомцем под тем же именем. Я поменял одну букву, чтобы избежать путаницы.

Декларативность

Суть dbt — в том, что движок берёт на себя всю логику выполнения. Вы декларируете желаемое: пишете SQL и YAML-конфиги, а dbt сам решает, как это реализовать. Я пошёл по тому же пути.

Установка zymi:

Инициализация встроенного примера — агента-исследователя:

Структура проекта по умолчанию:

Пайплайн состоит из двух агентов — исследователя и писателя. Вот как они описываются:

Так выглядит описание инструмента для поиска в интернете, например, через Tavily:

Агенты собираются в единый пайплайн:

Готово — простая мультиагентная система создана. Её можно сразу запустить из консоли:

Помимо удобства и скорости — субъективных факторов — есть и более важное преимущество: генеративные модели отлично генерируют код, но YAML по строгой JSON-схеме даётся им ещё проще. У меня запланирован эксперимент: попросить Claude и Codex создать один и тот же пайплайн на LangGraph и на zymi. Ставлю на то, что zymi потребует меньше итераций и токенов.

Декларативный конфиг — только внешний интерфейс. Под капотом zymi отличается от LangGraph: вместо общего мутабельного состояния всё общение строится через единую шину данных.

Event-sourced архитектура

В zymi каждое событие — это иммутабельная запись в БД с hash-chain верификацией. Все взаимодействия происходят через события в шине данных. Коннекторы, агенты и инструменты читают и пишут в эту шину — она является единственным источником правды. В результате получается не просто лог, а криптографически связанная цепочка всех действий агента. Это делает каждый запуск из коробки прослеживаемым и воспроизводимым.

Зачем нужна криптография? Можно провести аналогию с dbt: лог событий — это lineage (как в dbt docs), а намерения и их верификация — уверенность в корректности (как в dbt test).

Теперь мы знаем не только что сделал агент, но и почему. Вместо прямого изменения состояния агент выражает намерение. Это намерение записывается в шину, откуда его получает монитор. На основе своих правил он решает — можно ли выполнить действие или стоит запросить подтверждение у пользователя. Например, в событиях 49–50 видно, как монитор заблокировал запись в директорию за пределами разрешённой и запросил подтверждение у человека.

Посмотреть лог запуска

Заключение

zymi пока сыроват — это альфа-версия, но он уже может помочь в прототипировании и экспериментах с агентами. В бэклоге — много идей:

  • Переезд на libsql — векторная память, нативная асинхронность и edge-реплики
  • Поддержка PostgreSQL в качестве шины данных
  • Добавление Python-инструментов в декларативном режиме
  • Реализация проекций диалогов для идемпотентных перезапусков
  • Стриминг ответов LLM и многое другое

Интересно, найдёт ли дата-инженерный подход отклик в мире AI-агентов. Буду рад любой обратной связи — заходите в комментарии и репозиторий проекта.

И да пребудет с вами иммутабельность!

Читать оригинал