Оформление
Обзор архитектуры
Из каких частей состоит EVA, кто за что отвечает и как эти части связаны между собой.
Что такое EVA
EVA это платформа для работы с языковыми моделями внутри компании. Пользователь ведёт переписку с моделью в браузере, а платформа берёт на себя всё остальное: хранит историю, подключает нужную модель, даёт модели доступ к внешним инструментам, хранит файлы чата, скрывает персональные данные и считает расход.
Платформа не содержит собственной языковой модели. Модели подключаются как внешние сервисы. Инструменты тоже внешние, они подключаются по протоколу MCP и не обязательны для работы.
Три части платформы
EVA состоит из трёх приложений в одном репозитории.
| Часть | Что делает |
|---|---|
| Frontend | Интерфейс в браузере. Одностраничное приложение на Vue 3. |
| API | Управляющий слой. Единственная часть, которая обращается к базе данных. Держит пользователей, права, чаты, файлы, настройки, статистику и внешний API. В production также раздаёт сам интерфейс. |
| Runtime | Исполняющий слой. Ведёт диалог с моделью, распределяет нагрузку и подключается к инструментам MCP. К базе данных не обращается. |
Общая схема
Как читать схему
Пользователь работает только с API. Runtime закрыт и доступен только изнутри: у него нет проверки прав, поэтому его нельзя выставлять в интернет.
Когда пользователь отправляет сообщение, API готовит всё нужное для диалога и передаёт задачу в Runtime. Runtime поднимает рабочий процесс, тот обращается к модели, при необходимости вызывает инструменты и возвращает ответ по частям. API получает эти части, восстанавливает скрытые персональные данные, сохраняет сообщение в базу и отдаёт текст в браузер.
Инструменты MCP работают не с диском напрямую, а через отдельный слой доступа к файлам чата на стороне API. Ключи доступа для них выдаются на короткое время и только на один чат.
Что важно знать сразу
Платформа рассчитана на один экземпляр API. Часть состояния хранится в памяти процесса: кэш прав, счётчики внешнего API, обработчик очереди, модель поиска персональных данных. Запуск нескольких копий API без доработки приведёт к расхождениям.
API и Runtime должны видеть один и тот же каталог с файлами чатов. Runtime получает путь к этому каталогу и читает файлы напрямую.
Объектного хранилища в платформе нет. Файлы лежат в обычном каталоге на диске, а обращения в стиле S3 обслуживает сам API. Подробности в разделе Файлы и слой S3.
Стек
| Слой | Технологии |
|---|---|
| Frontend | Vue 3, PrimeVue 4, Tailwind 4, vue-i18n, chart.js |
| API | Node.js 22, Fastify 5, Drizzle ORM, PostgreSQL 16 |
| Runtime | Node.js 22, Fastify 5, AI SDK, клиент MCP |
| Сборка | pnpm workspace, TypeScript, Vite |