AI-чат — оптимизация и развитие
Поддержка и развитие большого AI-чат-приложения: десятки моделей, кастомные ассистенты, папки чатов, форматированные сообщения. Работа над производительностью при тысячах сообщений и тяжёлом markdown.
Контекст
Зрелое чат-приложение с большим набором функций: множество AI-моделей, ассистентов, папки чатов, форматирование сообщений. С ростом продукта появились типичные для масштаба проблемы: бандл прибавил в весе, длинные диалоги проседали в рендере, дубли в зависимостях добавляли килобайты и непредсказуемое поведение.
Решение
Виртуализация списка сообщений и списка чатов с поддержкой динамической высоты ячеек — плавная прокрутка на тысячах элементов любых размеров. Разнёс рендер на слои, чтобы виртуализация корректно работала с переменной высотой контента.
Облегчил тяжёлые компоненты в списках: вынес markdown-функции из ячеек, чтобы они не подгружались при каждом ререндере и не утаскивали в чанк лишнее.
Дедупликация зависимостей: убрал три параллельные библиотеки для работы с датами (оставил одну) и почистил остальной package.json от мёртвых и избыточных пакетов, которые тянулись со старых ревизий и в коде уже не использовались. Минус заметная часть бандла. Поправил дубли логики между серверным state и client-стором, разрулил лишние перерендеры.
Эффект печатающей машинки в стриминге ответов модели. Парсинг буфера обмена из Word, Excel и других редакторов — таблицы и форматирование корректно вставляются в инпут чата без потери структуры.
Результат
Бандл стал заметно легче за счёт удаления дублей в зависимостях. Длинные диалоги — тысячи сообщений с разной высотой ячеек — рендерятся плавно благодаря виртуализации. Стрим-печать и парсинг clipboard сделали работу со стримом моделей и документами органичнее.