← Web App

Стек и чат-оболочка

web app · workzone
Frontend
стек — библиотеки
Каркас и рендер
React Vite TypeScript
Стиль и компоненты
Tailwind CSS shadcn/ui · Base UI
Данные и состояние
TanStack Query SSE-клиент
i18n и маршрутизация
react-i18next client routing → Auth / Security
Чат-оболочка ↓ ниже
assistant-ui
структура — файлы · frontend/src/
frontend/src/
├── routes/      страницы под роутами — /chat · /account
├── components/  UI-примитивы — shadcn на Base UI
├── features/    chat — обёртка assistant-ui + наш слой
├── i18n/        locales — ru · en
└── lib/         API-клиент · SSE-адаптер · хелперы
Почему тонкий клиент
Тяжёлую логику диалога — ход беседы, retrieval, grounding — ведёт Query Engine, единый API на все surface'ы; за Web App остаётся управление беседами (список, retention) и отрисовка. Фронтенд принимает один SSE-поток ответа и одну схему диалога — и рисует их в оболочке.
Чат-оболочка surface'а — готовая
assistant-ui MIT · headless

Web-surface не пишет чат с нуля: тред, история, стриминг и «новый диалог» — зрелая библиотека. Наш домен — кастомные компоненты внутри её треда и тонкий слой управления беседами вокруг, не переписанная оболочка.

от библиотеки
тред композер история стриминг новый диалог авто-скролл markdown a11y
наше — внутри треда
источники [n] grounding-состояния фидбэк /
наше — вокруг треда
управление беседами retention семантика «нового чата»
Два стыка интеграции
SSE → адаптер. Поток Query Engine (StreamingResponse · SSE) принимает ChatModelAdapter на клиенте — библиотека не диктует бэкенд, ключи к LLM остаются у нас.
Скин — наш. Берём headless-примитивы и красим своими shadcn-токенами на @base-ui/react, не готовой Radix-темой библиотеки: вид в house-style, второй набор примитивов не тянем.