Код, интерфейсы и трафик без воды
lawebbox

Разработка мультиагентной песочницы: от прототипа на Python до проблем синхронизации

На Хабре появился пет-проект, который наглядно показывает, как у джуна за ночь рождается и умирает мотивация.

Максим Воронцов, Хардкорный бэкендер и девопс · обновлено 19 сентября 2026 г.

Разработка мультиагентной песочницы: от прототипа на Python до проблем синхронизации

Симулятор жизни на Python + TypeScript + HTML5 Canvas. Проектирование среды и базовой механики агентов

Автор собрал мультиагентную песочницу эволюции на стыке Python, TypeScript и HTML5 Canvas — агенты с простейшими нейросетями выживают по законам жёсткого отбора. История ценна не результатом (его пока нет), а классической цепочкой: прототип на коленке, торжественный перенос бэка на Python и первая синхронизационная яма на 2 Гц.

Стек и архитектурное прозрение

Началось всё с React-странички, по которой бегал «агент» и натыкался на «кустик». Это даже не прототип — это smoke test: рендерится, значит существую. Дальше пришло стандартное прозрение: для нормальной симуляции браузерный JS не тянет, и бэкенд уехал на Python. Выбор языка по учебнику — прагматичный костыль: если источник знаний на Python, не надо параллельно ломать мозг о синтаксисе.

Агент и куст с едой оформлены в классы. Сервер шлёт данные на фронт с частотой 2 Гц — два тика в секунду. Для канвы, где каждый кадр идёт через requestAnimationFrame, это уже красный флаг. Но понимаешь это только потом, обычно ночью.

Крэш: синхронизация и соблазн всё бросить

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

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

Что проверить, прежде чем повторять путь

Если хочется собрать что-то похожее и не лечь в ту же яму:

  • Бэк отдаёт не «позицию сейчас», а траекторию: массив точек с таймстемпами. Клиент сам интерполирует между ними. Частота тика перестаёт быть параметром сети и становится параметром рендера.
  • Если в кадре тысячи агентов — WebSocket + серверный тик на 30–60 Гц с бинарным протоколом. JSON на таких объёмах — костыль, который ляжет первым.
  • Интерполяция — по времени: pos = lerp(a, b, (now - t_a) / (t_b - t_a)). Коэффициенты, выдуманные в четыре утра, не работают никогда.
  • Бэкапы: git remote add origin … — и каждый вечер git push. Джун, забросивший проект из-за синхронизации, через полгода не вспомнит, в какой ветке остался рабочий прототип.

Пет-проекты дохнут не от сложности ИИ, а от двух вещей — дёрганной картинки и отсутствия git remote. Сначала фикс удалёнки, потом уже нейросети.