
Привет, Хабр. На связи тим-лид разработки Кэмпа.
Это третья статья цикла о релизе нового генератора презентаций в Кэмпе. Ранее разбирали, почему первая версия не взлетела, и что сейчас под капотом. Ниже расскажу, почему мы с командой решили собирать редактор с нуля.
Изначально мы его рассматривали как отдельную часть системы, а не как надстройку поверх генератора.Такой подход выбрали потому, что презентация должна существовать как управляемый документ: с возможностью ручных правок, экспорта в PPTX и дальнейшего расширения логики. Если начать с генератора, редактор неизбежно будет подстраиваться под уже существующие ограничения, а не задавать правила работы документа.
Почему не выбрали готовый редактор
Мы протестировали несколько готовых решений, в том числе сервисы с логикой ИИ-презентаций. Результаты нас не устроили. Проблема оказалась в управляемости.
В готовых редакторах:
ограниченная модель размещения элементов;
слабый контроль над позиционированием;
нестабильность при ручном редактировании;
сложности с корректным экспортом в PPTX.
Для любого пользователя важно спокойно открыть PowerPoint и защитить презентацию. Если после экспорта всё «едет», продукт теряет доверие.
Отсюда первое принципиальное решение: редактор должен проектироваться с учётом экспорта, а не адаптироваться к нему постфактум.
Второе решение — редактор должен быть удобным. Генератор создаёт первоначальный вариант слайдов, но финальный вид презентации формируется в процессе редактирования.
Поэтому мы отказались от идеи дорабатывать чужое решение под свои задачи и решили разработать редактор самостоятельно, учитывая все потребности аудитории.
Почему разработку начали с редактора
Если мы хотим контролировать экспорт, правки и дальнейшее развитие продукта, редактор нельзя делать поверх генератора.
Разработку начали с логики самого редактора: как внутри системы существует документ презентации и как он изменяется. И только когда эта основа была определена, к ней подключили генерацию.
Генерация — это последовательность шагов. Редактор — это состояние документа.
Редактор должен:
хранить изменения;
поддерживать ручные правки;
корректно экспортировать в PPTX;
обеспечивать совместную работу нескольких участников;
обрабатывать команды ИИ-агента через общий слой управления состоянием.
Это полноценная система управления документом. Поэтому редактор изначально закладывался как самостоятельный архитектурный слой, а не как фича поверх генератора.
Редактор как система управления состоянием
Работу начали с прототипа. Первая версия редактора была собрана быстро, чтобы проверить базовую логику.
Дальше мы попробовали несколько альтернативных реализаций на разных библиотеках. Часть решений не подошла из‑за ограничений, поэтому их отбросили. В итоге выбрали библиотечную основу, поверх которой реализовали собственную логику работы редактора.
LLM использовали как инструмент ускорения разработки: для быстрого создания черновых реализаций и проверки гипотез. Это позволило быстрее перебирать варианты, а окончательные архитектурные решения команда принимала и реализовывала вручную.
Ключевая часть — управление состоянием документа. Нужно было обеспечить корректную работу правок, пересборку слайдов и предсказуемый экспорт в PPTX — это оказался очень важный пункт для аудитории, потому что презентацию в итоге открывают и защищают в PowerPoint.
Именно поэтому соответствие формату PPTX стало архитектурным требованием, а не этапом «после генерации». Чтобы файл открывался корректно, нужно было синхронизировать внутреннее состояние редактора с логикой PPTX:
структура данных редактора должна совпадать с логикой PPTX;
стили и позиции должны корректно интерпретироваться вне браузера;
текстовые блоки не должны терять разметку.
Если состояние редактора невозможно однозначно сопоставить с PPTX, экспорт становится недетерминированным. Поэтому соответствие форматов было заложено на уровне проектирования.
С точки зрения алгоритмов задача не требовала исследовательских решений. Основная сложность заключалась в объёме логики и количестве взаимосвязанных состояний внутри редактора.
ИИ-агент как участник документа

Обычно интеграция ИИ в редактор выглядит так: пользователь нажимает кнопку, отправляется запрос к модели, сервер возвращает текст, фронтенд вставляет его в документ. По сути, это внешний вызов LLM, который один раз изменяет содержимое.
Мы изначально закладывали другую логику. ИИ-агент должен работать внутри редактора как участник документа, а не как отдельный запрос.
Это означает, что:
агент подключается к документу через тот же коллаборационный слой, что и пользователь;
изменения вносятся через ту же систему управления состоянием;
агент может продолжать работу независимо от состояния конкретной вкладки или сессии пользователя.
В такой модели ИИ не просто генерирует фрагмент по запросу, а становится полноценным участником процесса редактирования.
Что в итоге получилось
В результате редактор стал не интерфейсом над генератором, а единой точкой контроля состояния презентации. Именно он определяет:
как хранится и изменяется документ;
как изменения синхронизируются между участниками;
как состояние транслируется в формат PPTX без потери структуры;
как к документу подключается ИИ-агент как равноправный участник.
С архитектурной точки зрения ключевым решением стало выделение редактора в отдельный слой, который контролирует состояние, а не зависит от логики генерации. Именно это позволило заложить фундамент для дальнейшего развития, чем мы и продолжаем заниматься сейчас.
