Я пришёл в разработку агентов из дата-инженерии, и, в очередной раз собирая типовую структуру на 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-агентов. Буду рад любой обратной связи — заходите в комментарии и репозиторий проекта.
И да пребудет с вами иммутабельность!