- localization-svc: defaultLocale ru, resolveLocale only by geo - web-svc: DEFAULT_LOCALE ru, layout lang=ru, embeddedTranslations fallback ru - countryToLocale: default ru when no country or unknown country Co-authored-by: Cursor <cursoragent@cursor.com>
696 lines
39 KiB
Markdown
696 lines
39 KiB
Markdown
# Архитектура аналога Perplexity.ai — полная спецификация
|
||
|
||
Документ описывает полную архитектуру системы на базе микросервисов K3s с акцентом на:
|
||
- **ВСЕ сервисы в `services/`.** Папка `apps/` удаляется. Микросервисная архитектура: chat, search, discover, finance, travel, auth, library, memory, create, notifications, projects, web (UI), cache-worker.
|
||
- **~10 000 DAU** (ежедневных пользователей)
|
||
- **Клиентская логика** — максимум на клиенте; персональные данные — только для аккаунтов
|
||
- **Предварительная обработка и кэш** — новости, finance, travel, повторяющиеся запросы
|
||
- **Полное совпадение** с Perplexity.ai по страницам и логике
|
||
|
||
---
|
||
|
||
## 1. Карта страниц (URL-структура, 1:1 Perplexity)
|
||
|
||
| URL | Страница | Описание |
|
||
|-----|----------|----------|
|
||
| `/` | Home | Поисковая строка + виджеты discover/новости |
|
||
| `/search`, `/search/new?q=` | Search | Поисковый чат (Quick/Pro/Deep) |
|
||
| `/c/[threadId]` | Chat/Thread | Окно конкретного чата/треда |
|
||
| `/finance` | Finance | Рынок, heatmap, вкладки |
|
||
| `/finance/[ticker]` | Ticker Detail | Детальная страница акции/индекса |
|
||
| `/finance/predictions/[id]` | Predictions | Polymarket prediction markets |
|
||
| `/travel` | Travel | Trending, Inspiration Cards, отели, маршруты |
|
||
| `/discover` | Discover | Новости по темам (или часть Home) |
|
||
| `/library` | Library | История поисков, сохранённые треды |
|
||
| `/spaces` | Spaces | Список проектов/пространств |
|
||
| `/spaces/templates` | Space Templates | Шаблоны Spaces |
|
||
| `/collections/[id]` | Collections | Публичные коллекции (read-only Space) |
|
||
| `/patents` | Patents | Поиск и анализ патентов |
|
||
| Profile/Settings | Account | Профиль, Preferences, Personalize, Billing, My Connectors |
|
||
| — | Desktop app | Electron/Tauri (pplx.ai-аналог) |
|
||
| — | iOS / Android | Нативные приложения, voice search |
|
||
| — | Chrome extension | Расширение для браузера |
|
||
|
||
---
|
||
|
||
## 2. Карта функциональностей
|
||
|
||
### 2.1 Сводная матрица
|
||
|
||
| Категория | Функционал | Клиент | Сервер (обязательно) | Кэш/Фоново |
|
||
|-----------|------------|--------|----------------------|------------|
|
||
| **Поиск** | Quick Search | ✅ UI, локальное состояние | LLM, Researcher | ✅ Кэш по query_hash |
|
||
| **Поиск** | Pro Search | ✅ UI, стриминг | LLM, Mastra workflow | ✅ Кэш по query_hash |
|
||
| **Поиск** | Deep Research | ✅ UI, прогресс | LLM, Mastra | ✅ Кэш по query_hash |
|
||
| **Discover** | Новости по темам | ✅ Рендер | Агрегация | ✅ **Pre-compute + Redis** |
|
||
| **Finance** | Рынок, heatmap, watchlist | ✅ Рендер, watchlist в LS | Агрегация данных | ✅ **Pre-compute + Redis** |
|
||
| **Travel** | Маршруты, отели | ✅ UI stepper | Агрегация, LLM | ✅ **Pre-compute популярных** |
|
||
| **Проекты** | Spaces, файлы | ✅ CRUD UI | Хранение файлов, эмбеддинги | — |
|
||
| **Чат** | Сообщения, история | ✅ localStorage / IndexedDB | Только LLM, без хранения | Опционально: user preference |
|
||
| **Медиа** | Images, Videos | ✅ Рендер | SearXNG proxy | ✅ Кэш по query |
|
||
| **Виджеты** | Погода, акции, калькулятор | ✅ Калькулятор на клиенте | API-прокси | ✅ Погода/акции по ключу |
|
||
| **Профиль** | Account, prefs | ✅ Preferences в LS | Auth только (SSO) | — |
|
||
| **Биллинг** | Тарифы, оплата | ✅ UI | ЮKassa, лимиты | — |
|
||
| **Collections** | Публичные шаблоны | ✅ Рендер | projects-svc | Redis/PostgreSQL |
|
||
| **Library** | История, сохранённое | ✅ UI | library-svc (аккаунты) | PostgreSQL |
|
||
| **Memory** | Персональная память AI | ✅ UI | memory-svc | PostgreSQL + Redis |
|
||
| **Create/Labs** | Дашборды, отчёты, экспорт | ✅ UI | chat-svc + create-svc | — |
|
||
| **Patents** | Поиск патентов | ✅ Рендер | search-svc + patents API | Redis |
|
||
| **Export thread** | Экспорт тредов в PDF/MD | ✅ UI | create-svc / library-svc | — |
|
||
| **Notifications** | Push, email, напоминания | ✅ Клиент + SW | notifications-svc | — |
|
||
| **PWA/Офлайн** | Service worker, установка | ✅ SPA | Static + SW | — |
|
||
| **Model Council** | 3 модели параллельно, синтез | ✅ UI (Max) | chat-svc | — |
|
||
| **Background Assistant** | Фоновые задачи (Max) | ✅ Desktop/Mobile | chat-svc + queue | — |
|
||
|
||
### 2.2 Детальное описание функциональностей
|
||
|
||
#### A. Поисковый чат (Core)
|
||
| Функция | Описание |
|
||
|---------|----------|
|
||
| Quick Search | 1 запрос, базовые модели, без хранения истории |
|
||
| Pro Search | Многошаговый поиск, Mastra workflow, параллельные actions |
|
||
| Deep Research | Расширенный анализ, отчёт, визуализация этапов |
|
||
| **Answer Modes** | Standard, Focus, Academic, Writing + вертикали (Travel, Finance) |
|
||
| **Travel Mode** | Отдельный системный промпт, фокус на отели/маршруты/бронирование |
|
||
| Классификация | Classifier → skipSearch, sources, widgets |
|
||
| Actions | webSearch, academicSearch, socialSearch, scrapeURL, uploadsSearch (параллельно) |
|
||
| Writer | Финальный ответ с цитированием источников |
|
||
| **Step-by-step Learning** | Режим обучения: подсказки, guided questions, уровень сложности |
|
||
| **Response preferences** | Настройки формата/стиля ответов (Preferences) |
|
||
| **Input bar «+»** | Меню: файлы, источники, режимы (Quick/Pro/Deep/Create/Learn) |
|
||
| **Model Council** | Запуск 3 моделей параллельно → сравнение → синтез ответа (Max) |
|
||
|
||
#### B. Discover (Новости)
|
||
| Функция | Описание |
|
||
|---------|----------|
|
||
| Агрегация новостей | По темам: tech, finance, travel, world, science |
|
||
| Суммаризация | LLM-сводка каждой новости/блока |
|
||
| Обновление | Фоновая задача каждые 15–30 мин |
|
||
| Кэш | Redis: `discover:{topic}:{date}` TTL 30 мин |
|
||
|
||
#### C. Finance
|
||
| Функция | Описание |
|
||
|---------|----------|
|
||
| Market Summary | Индексы, futures, VIX |
|
||
| Heatmap S&P 500 | Сектора, gainers/losers |
|
||
| **Вкладки** | Crypto, Earnings, Predictions, Screener, Politicians Watchlist, Watchlist |
|
||
| Recent Developments | Новости с суммаризацией и таймстампами |
|
||
| **Popular Spaces for Finance Research** | Блок коллекций по категории finance (SEC, Buffett, S&P Transcripts) |
|
||
| Standouts | Выделенные акции с кратким LLM-анализом |
|
||
| Watchlist | Клиент: localStorage; сервер: агрегация данных по тикерам |
|
||
| **Analyst ratings** | Рейтинги аналитиков по акциям (FMP, Benzinga и т.п.) |
|
||
| **Auditable financials** | Ссылки на SEC filings в ответах и на странице тикера |
|
||
| **ETF Holdings** | Детали холдингов ETF на странице тикера |
|
||
| **Heatmap hover** | Live-синтез причины движения цены при наведении (LLM on demand) |
|
||
| **Stock graphs** | Графики в ответах чата (мобильный/desktop) |
|
||
| Кэш | Redis: `finance:summary`, `finance:heatmap`, `finance:news:{ticker}` TTL 2–5 мин |
|
||
|
||
#### D. Travel
|
||
| Функция | Описание |
|
||
|---------|----------|
|
||
| Trending Destinations | Карточки с изображениями (pre-compute) |
|
||
| **Inspiration Cards** | Курируемые статьи («Лучшие тропы в Словении», «Лесные отели в Швеции») |
|
||
| Поиск мест, маршруты | Генерация itineraries (LLM) |
|
||
| Отели | Tripadvisor (рейтинги, отзывы, ссылки) |
|
||
| **Партнёрское бронирование** | Tripadvisor, Selfbook (прямое бронирование) |
|
||
| Stepper UI | Поиск → Места → Маршрут → Отели → Билеты |
|
||
| Answer Mode: Travel | Вертикаль чата с фокусом на путешествия |
|
||
| Кэш | Redis: `travel:trending`, `travel:inspiration`, `travel:itinerary:{hash}` TTL 1–24 ч |
|
||
|
||
#### E. Collections (публичные)
|
||
| Функция | Описание |
|
||
|---------|----------|
|
||
| Collections | Публичные read-only Spaces с предзагруженным контекстом |
|
||
| Категории | finance, travel, product, research — для Popular Spaces |
|
||
| Примеры | SEC Findings, Buffett letters, S&P 500 Transcripts |
|
||
| API | `GET /collections?category=finance`, `GET /collections/:id` |
|
||
|
||
#### F. Проекты (Spaces)
|
||
| Функция | Описание |
|
||
|---------|----------|
|
||
| CRUD проектов | Создание, переименование, архивация |
|
||
| Файлы в проекте | Загрузка, парсинг, эмбеддинги |
|
||
| Чаты в проекте | Контекст проекта во всех чатах |
|
||
| Internal Knowledge Search | Поиск по файлам + веб |
|
||
| Space Templates | Шаблоны под финансы, маркетинг, продукт, travel |
|
||
|
||
#### G. Library
|
||
| Функция | Описание |
|
||
|---------|----------|
|
||
| История поисков | Список тредов для авторизованного пользователя |
|
||
| Сохранённое | Saved threads, закладки |
|
||
| **Гости** | Только localStorage/IndexedDB, при закрытии — потеря |
|
||
| **Аккаунты** | Синхронизация на сервере (library-svc, PostgreSQL) |
|
||
|
||
#### H. Медиа
|
||
| Функция | Описание |
|
||
|---------|----------|
|
||
| Search Images | SearXNG, LLM формирует query |
|
||
| Search Videos | SearXNG, LLM формирует query |
|
||
| Кэш | Redis: `media:images:{query_hash}`, `media:videos:{query_hash}` TTL 1 ч |
|
||
|
||
#### I. Виджеты
|
||
| Функция | Описание |
|
||
|---------|----------|
|
||
| Weather | API (Open-Meteo и т.п.) |
|
||
| Stock | Yahoo Finance / Financial Modeling Prep |
|
||
| Calculation | **Полностью на клиенте** (mathjs и т.п.) |
|
||
| Кэш | Погода/акции: Redis по location/ticker TTL 5–15 мин |
|
||
|
||
#### J. Профиль и Connectors
|
||
| Функция | Описание |
|
||
|---------|----------|
|
||
| Account | Аватар, имя, email (только просмотр) |
|
||
| Preferences | Appearance, Language, Autosuggest, Homepage widgets, **Response preferences** |
|
||
| Personalize | Watchlists, настройки персонализации |
|
||
| Billing | Подписка, история платежей |
|
||
| **My Connectors** | Интеграции (Google Drive, Dropbox и т.п.) — Pro/общие пользователи |
|
||
| **App Connectors** | Enterprise: SharePoint, OneDrive, Box — автосинхронизация файлов в Space |
|
||
|
||
#### K. Memory (персональная память AI)
|
||
| Функция | Описание |
|
||
|---------|----------|
|
||
| Хранение | memory-svc, PostgreSQL (user_id, key, value, embedding) |
|
||
| Извлечение | Семантический поиск по памяти при каждом запросе (если Pro/Max) |
|
||
| Формат | Факты, предпочтения, контекст из прошлых тредов |
|
||
| UI | Просмотр/удаление памяти в Profile → Personalize |
|
||
| Enterprise Memory | Организационная память (org_id), доступна всем участникам |
|
||
|
||
#### L. Create / Labs
|
||
| Функция | Описание |
|
||
|---------|----------|
|
||
| Генерация | Таблицы, отчёты, дашборды по запросу (Pro) |
|
||
| Экспорт | .xlsx, .csv, .md, .pdf из ответов |
|
||
| Image generation | Генерация изображений (Pro, DALL·E/Stable Diffusion) |
|
||
| API | `POST /api/v1/create` — тип (table/dashboard/image), prompt |
|
||
|
||
#### M. Patents
|
||
| Функция | Описание |
|
||
|---------|----------|
|
||
| Страница | `/patents` — поиск по USPTO, EPO, патентам РФ |
|
||
| Интеграция | patents API или Google Patents; LLM-суммаризация |
|
||
| Кэш | Redis `patents:{query_hash}` TTL 1 ч |
|
||
|
||
#### N. Enterprise
|
||
| Функция | Описание |
|
||
|---------|----------|
|
||
| **Audit logs** | Логи: query, answer, model, sources, user_id, timestamp (compliance) |
|
||
| **Granular feature access** | Доступ к API, список Spaces, модели по ролям админа |
|
||
| **Domain-based sign-up** | Ограничение регистрации по верифицированным доменам email |
|
||
| **Usage guidelines** | Guidelines организации на homepage для членов |
|
||
| **Enterprise Memory** | Общая память на уровень org |
|
||
|
||
#### O. Клиентские приложения
|
||
| Платформа | Описание |
|
||
|----------|----------|
|
||
| **Desktop** | Electron или Tauri, единый код с web |
|
||
| **iOS / Android** | React Native или Capacitor; **voice search** (Web Speech API / native) |
|
||
| **Chrome extension** | Всплывающее окно, быстрый поиск со страницы |
|
||
| **PWA / Офлайн** | Service worker кэширует статику (JS, CSS, assets); workbox; установка на домашний экран; офлайн-fallback |
|
||
|
||
#### O.1 Export thread
|
||
| Функция | Описание |
|
||
|---------|----------|
|
||
| API | `POST /api/v1/library/threads/:id/export` или `POST /api/v1/export` с `contentType: 'thread'` |
|
||
| Форматы | PDF, Markdown |
|
||
| Реализация | create-svc или library-svc; рендер треда → PDF (puppeteer/jsPDF) или MD (template) |
|
||
| UI | Кнопка Export в окне чата/треда |
|
||
|
||
#### O.2 Notifications
|
||
| Функция | Описание |
|
||
|---------|----------|
|
||
| **Push** | Web Push API (VAPID); уведомление при готовности ответа (Pro/Deep); настройки в Preferences |
|
||
| **Email** | Опция «уведомить по email при завершении» для долгих запросов (Deep Research) |
|
||
| **Напоминания** | «Напомнить через N» — отложенная задача, push/email по расписанию |
|
||
| **Сервис** | notifications-svc; очереди (Redis/Bull) или вызов от chat-svc по событию |
|
||
|
||
#### O.3 Model Council (Max)
|
||
| Функция | Описание |
|
||
|---------|----------|
|
||
| Логика | Запрос → параллельный запуск 3 выбранных моделей (GPT-4, Claude, и др.) |
|
||
| Синтез | Отдельный LLM-вызов для сравнения и сведения в единый ответ |
|
||
| UI | Выбор моделей в input bar; side-by-side или сводный вид |
|
||
| API | `POST /api/v1/chat` с `modelCouncil: true`, `models: ['gpt-4','claude','...']` |
|
||
|
||
#### O.4 Background Assistant (Max)
|
||
| Функция | Описание |
|
||
|---------|----------|
|
||
| Назначение | Выполнение задач в фоне (Desktop/Mobile app), когда приложение свёрнуто |
|
||
| Архитектура | Queue (Redis/Bull); worker подхватывает задачи; push при готовности |
|
||
| Сценарии | «Найди отели в Париже» → фон → уведомление с результатом |
|
||
| API | `POST /api/v1/tasks` (создать фоновую задачу); polling или WebSocket/SSE для статуса |
|
||
|
||
#### P. Образование
|
||
| Функция | Описание |
|
||
|---------|----------|
|
||
| **Step-by-step Learning** | Режим в input bar «+»; ответы с подсказками, guided questions |
|
||
| **Quizzes / Flashcards** | Генерация тестов и карточек по теме (Pro/Education) |
|
||
| **Education Pro** | Тариф со скидкой для студентов/преподавателей (верификация) |
|
||
|
||
---
|
||
|
||
## 3. Микросервисы K3s
|
||
|
||
### 3.1 Карта сервисов
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||
│ CLIENT (SPA / PWA) │
|
||
│ Next.js (SSR для статики) / React SPA — максимум логики, localStorage, IndexedDB │
|
||
└─────────────────────────────────────────────────────────────────────────────────┘
|
||
│
|
||
┌───────────────────┼───────────────────┐
|
||
│ │ │
|
||
▼ ▼ ▼
|
||
┌───────────────────────┐ ┌───────────────────────┐ ┌───────────────────────┐
|
||
│ API Gateway │ │ Auth Service │ │ Web (CDN/Static) │
|
||
│ (Kong / Traefik) │ │ (Keycloak/Supabase) │ │ S3/MinIO + CDN │
|
||
└───────────────────────┘ └───────────────────────┘ └───────────────────────┘
|
||
│
|
||
▼
|
||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||
│ BACKEND MICROSERVICES (K3s) │
|
||
├─────────────────────────────────────────────────────────────────────────────────┤
|
||
│ │
|
||
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
|
||
│ │ chat-svc │ │ search-svc │ │ discover-svc│ │ finance-svc │ │
|
||
│ │ LLM, Mastra │ │ SearXNG, │ │ News feed │ │ Market data │ │
|
||
│ │ Writer │ │ Scraper │ │ Summari-zer│ │ Heatmap │ │
|
||
│ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │
|
||
│ │
|
||
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
|
||
│ │ travel-svc │ │ media-svc │ │ projects-svc│ │ cache-worker│ │
|
||
│ │ Itineraries │ │ Images/Videos│ │ Files, │ │ Pre-compute │ │
|
||
│ │ Tripadvisor │ │ SearXNG │ │ Embeddings │ │ Background │ │
|
||
│ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │
|
||
│ │
|
||
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
|
||
│ │ billing-svc │ │ upload-svc │ │ library-svc │ │ memory-svc │ │
|
||
│ │ ЮKassa │ │ File parse │ │ Threads, │ │ AI Memory, │ │
|
||
│ │ Subscriptions│ │ Embeddings │ │ History │ │ Enterprise │ │
|
||
│ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │
|
||
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ # Create, Audit, Notifications │
|
||
│ │ create-svc │ │ audit-svc │ │notifications│ │
|
||
│ │ Tables, │ │ Query+Answer│ │ Push, Email │ │
|
||
│ │ Dashboards │ │ logging │ │ Reminders │ │
|
||
│ └─────────────┘ └─────────────┘ └─────────────┘ │
|
||
│ │
|
||
└─────────────────────────────────────────────────────────────────────────────────┘
|
||
│
|
||
▼
|
||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||
│ ИНФРАСТРУКТУРА │
|
||
│ Redis (кэш + сессии) │ PostgreSQL (billing, projects) │ MinIO (файлы) │
|
||
│ SearXNG (self-hosted) │ LLM Provider (OpenAI/Ollama) │ Vector DB (optional) │
|
||
└─────────────────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
### 3.2 Описание микросервисов
|
||
|
||
| Сервис | Язык | Replicas (10k DAU) | Назначение |
|
||
|--------|------|--------------------|------------|
|
||
| **api-gateway** | — (Kong/Traefik) | 2 | Роутинг, rate limit, JWT validation |
|
||
| **auth-svc** | Node/Go | 2 | SSO (Google, Apple, Email magic link), JWT |
|
||
| **chat-svc** | Node.js | 3–5 | LLM, Mastra workflow, Writer, streaming |
|
||
| **search-svc** | Node.js | 3 | SearXNG, scrape, Researcher actions |
|
||
| **discover-svc** | Node.js | 2 | Агрегация новостей, суммаризация (фоново) |
|
||
| **finance-svc** | Node.js | 2 | Market data, heatmap, news по тикерам |
|
||
| **travel-svc** | Node.js | 2 | Itineraries, Tripadvisor, trending |
|
||
| **media-svc** | Node.js | 2 | Images/Videos через SearXNG |
|
||
| **projects-svc** | Node.js | 2 | CRUD проектов, файлы, эмбеддинги, **Collections** |
|
||
| **billing-svc** | Node.js | 1 | ЮKassa, subscriptions, лимиты |
|
||
| **upload-svc** | Node.js | 2 | Парсинг PDF/DOCX, embedding, chunking |
|
||
| **library-svc** | Node.js | 2 | История тредов, сохранённое для аккаунтов |
|
||
| **memory-svc** | Node.js | 2 | Персональная память AI, Enterprise Memory, векторный поиск |
|
||
| **create-svc** | Node.js | 1–2 | Create (таблицы, дашборды), экспорт, image generation |
|
||
| **audit-svc** | Node.js | 1 | Audit logs для Enterprise (query, answer, model, user) |
|
||
| **notifications-svc** | Node.js | 1–2 | Web Push, Email, напоминания; очереди задач |
|
||
| **cache-worker** | Node.js | 1–2 | Cron: pre-compute discover, finance, travel inspiration |
|
||
|
||
### 3.3 K3s манифесты (базовая структура)
|
||
|
||
```yaml
|
||
# namespaces
|
||
perplexica-prod
|
||
perplexica-cache
|
||
|
||
# Deployments с HPA
|
||
chat-svc: min 2, max 8, CPU 70%
|
||
search-svc: min 2, max 6
|
||
discover-svc: min 1, max 4
|
||
finance-svc: min 1, max 4
|
||
travel-svc: min 1, max 3
|
||
media-svc: min 1, max 4
|
||
projects-svc: min 1, max 4 (включая Collections)
|
||
upload-svc: min 1, max 4
|
||
library-svc: min 1, max 3
|
||
memory-svc: min 1, max 3
|
||
create-svc: min 1, max 2
|
||
audit-svc: min 1, max 1
|
||
notifications-svc: min 1, max 2
|
||
billing-svc: min 1, max 2
|
||
cache-worker: min 1, max 1 (CronJob)
|
||
auth-svc: min 2, max 4
|
||
```
|
||
|
||
---
|
||
|
||
## 3. Стратегия кэширования и предобработки
|
||
|
||
### 3.1 Ключевой принцип
|
||
|
||
> **Не суммировать и не обрабатывать по запросу то, что можно сделать заранее и переиспользовать.**
|
||
|
||
### 3.2 Кэш-слои
|
||
|
||
| Слой | Что кэширует | Ключ | TTL | Источник |
|
||
|------|--------------|------|-----|----------|
|
||
| **Discover** | Новости по теме + суммаризация | `discover:{topic}` | 30 мин | cache-worker каждые 15 мин |
|
||
| **Finance** | Market summary, heatmap | `finance:summary`, `finance:heatmap` | 5 мин | cache-worker каждые 2 мин |
|
||
| **Finance** | News по тикеру | `finance:news:{ticker}` | 15 мин | cache-worker при обновлении |
|
||
| **Travel** | Trending destinations | `travel:trending` | 6 ч | cache-worker каждые 4 ч |
|
||
| **Travel** | Inspiration Cards | `travel:inspiration` | 6 ч | cache-worker каждые 4 ч |
|
||
| **Travel** | Популярные маршруты | `travel:itinerary:{hash}` | 24 ч | On first request, reuse |
|
||
| **Search** | Идентичные запросы | `search:{query_hash}:{mode}` | 1–24 ч | On first request |
|
||
| **Media** | Images/Videos query | `media:{type}:{query_hash}` | 1 ч | On first request |
|
||
| **Widgets** | Погода, акции | `widget:{type}:{key}` | 5–15 мин | On first request |
|
||
|
||
### 3.4 Cache-worker (фоновые задачи)
|
||
|
||
```
|
||
Cron расписание:
|
||
├── */2 * * * * finance:summary, finance:heatmap
|
||
├── */15 * * * * discover:{topic} для всех тем
|
||
├── 0 */4 * * * travel:trending, travel:inspiration (Inspiration Cards)
|
||
└── 0 * * * * Инвалидация устаревших search cache
|
||
```
|
||
|
||
### 3.5 Логика поискового кэша
|
||
|
||
1. Входящий запрос → `query_hash = sha256(normalize(query) + mode + sources)`
|
||
2. Проверка Redis: `GET search:{query_hash}`
|
||
3. Если есть → отдать из кэша (без LLM)
|
||
4. Если нет → выполнить полноценный flow, сохранить в кэш
|
||
5. Популярные запросы (частота > N/день) → приоритет в cache-worker для pre-warm
|
||
|
||
---
|
||
|
||
## 4. Клиентская архитектура (без хранения данных)
|
||
|
||
### 4.1 Что на клиенте (включая My Connectors UI)
|
||
|
||
| Компонент | Реализация |
|
||
|-----------|------------|
|
||
| UI/UX | React, Next.js (SSR только для статики) |
|
||
| Состояние чата | Zustand/Context — в памяти, при refresh теряется (или опционально IndexedDB) |
|
||
| Preferences | localStorage: theme, language, units |
|
||
| Watchlist (finance) | localStorage |
|
||
| Калькулятор | Полностью локально (mathjs) |
|
||
| Роутинг | Client-side |
|
||
| **PWA / Офлайн** | Service worker (Workbox): кэш static (JS, CSS, assets); offline fallback; manifest для установки |
|
||
|
||
### 4.2 Что храним / не храним
|
||
|
||
**Не храним на сервере (гости):**
|
||
- История чатов — только в памяти/IndexedDB клиента
|
||
- Preferences — только в localStorage
|
||
|
||
**Храним для аккаунтов:**
|
||
- История тредов, сохранённое — library-svc (PostgreSQL)
|
||
- Projects, файлы, подписка — projects-svc, billing-svc
|
||
- Кэш поиска — обезличенный по query_hash, без user_id
|
||
|
||
### 4.3 Режимы пользователя
|
||
|
||
| Режим | Данные | Описание |
|
||
|-------|--------|----------|
|
||
| **Гость** | Всё на клиенте | Чат в памяти, при закрытии — потеря |
|
||
| **Аккаунт** | Auth + billing | Проекты, подписка — в БД; чаты опционально |
|
||
|
||
### 4.4 UI/UX требования
|
||
|
||
| Область | Требование |
|
||
|---------|------------|
|
||
| **Discover, Finance, Travel** | Skeleton/placeholder при cold start; timeout с сообщением; кнопка повтора при ошибке |
|
||
| **Поиск (Pro/Deep)** | Отображение этапов (Classifier → Researcher → Writer); оценка времени ожидания |
|
||
| **Загрузка файлов** | Прогресс по этапам: парсинг → chunking → эмбеддинги; индикация; кнопка Cancel; timeout 300 с |
|
||
| **Гости** | Предупреждение при закрытии: история теряется без аккаунта; CTA «Сохранить в аккаунт» |
|
||
| **Rate limit** | Сообщение при 429; предупреждение при 80% лимита; предложение апгрейда при достижении |
|
||
| **Ошибки** | Сообщение + Retry/Cancel; fallback при частичном сбое (например, виджет не загрузился) |
|
||
| **Travel Stepper** | Сохранение состояния шагов при уходе; скелетон между шагами |
|
||
| **Мобильный** | Адаптивность heatmap, Discover; жесты; SettingsButtonMobile |
|
||
|
||
---
|
||
|
||
## 5. API контракты (основные)
|
||
|
||
### 5.1 Chat/Search
|
||
|
||
```
|
||
POST /api/v1/chat
|
||
Body: { query, mode?, sources?, fileIds?, answerMode?, learningMode?, responsePrefs? }
|
||
answerMode: 'standard' | 'focus' | 'academic' | 'writing' | 'travel' | 'finance'
|
||
learningMode: boolean # Step-by-step Learning
|
||
responsePrefs: { format?, length?, tone? } # из Preferences
|
||
Response: SSE stream
|
||
Cache: Проверка query_hash до вызова LLM
|
||
|
||
POST /api/v1/search/cached
|
||
Query: ?q=...&mode=...
|
||
Response: JSON (если есть в кэше) или 404 → fallback на /chat
|
||
```
|
||
|
||
### 5.2 Discover
|
||
|
||
```
|
||
GET /api/v1/discover?topic=tech|finance|travel|...
|
||
Response: { items: [{ title, summary, source, url }] }
|
||
Source: Redis, refresh от cache-worker
|
||
```
|
||
|
||
### 5.3 Finance
|
||
|
||
```
|
||
GET /api/v1/finance/summary
|
||
GET /api/v1/finance/heatmap
|
||
GET /api/v1/finance/news/:ticker
|
||
GET /api/v1/finance/watchlist?tickers=AAPL,GOOG
|
||
GET /api/v1/finance/analyst-ratings/:ticker # Analyst ratings
|
||
GET /api/v1/finance/sec-filings/:ticker # Ссылки на SEC filings
|
||
GET /api/v1/finance/etf-holdings/:symbol # ETF Holdings
|
||
GET /api/v1/finance/price-context/:ticker # Heatmap hover: LLM-синтез причины движения
|
||
Response: JSON из Redis / live
|
||
```
|
||
|
||
### 5.4 Travel
|
||
|
||
```
|
||
GET /api/v1/travel/trending
|
||
GET /api/v1/travel/inspiration # Inspiration Cards (pre-compute)
|
||
POST /api/v1/travel/itinerary
|
||
Body: { destination, days, preferences }
|
||
Cache: По hash параметров
|
||
```
|
||
|
||
### 5.5 Collections
|
||
|
||
```
|
||
GET /api/v1/collections?category=finance|travel|product|research
|
||
GET /api/v1/collections/:id
|
||
Response: Публичный Space с контекстом (read-only)
|
||
```
|
||
|
||
### 5.6 Library
|
||
|
||
```
|
||
GET /api/v1/library/threads # Для авторизованных
|
||
POST /api/v1/library/threads # Сохранить тред
|
||
DELETE /api/v1/library/threads/:id
|
||
```
|
||
|
||
### 5.7 Auth
|
||
|
||
```
|
||
POST /auth/login/email
|
||
GET /auth/oauth/{provider}
|
||
POST /auth/refresh
|
||
GET /auth/me
|
||
```
|
||
|
||
### 5.8 Connectors
|
||
|
||
```
|
||
GET /api/v1/connectors # Список доступных (Pro)
|
||
POST /api/v1/connectors/:type # Подключить (Google Drive, Dropbox)
|
||
DELETE /api/v1/connectors/:id # Отключить
|
||
```
|
||
|
||
### 5.9 Memory
|
||
|
||
```
|
||
GET /api/v1/memory # Список записей памяти (Pro/Max)
|
||
POST /api/v1/memory # Добавить запись (внутренний вызов от chat-svc)
|
||
DELETE /api/v1/memory/:id # Удалить запись
|
||
```
|
||
|
||
### 5.10 Create / Labs
|
||
|
||
```
|
||
POST /api/v1/create
|
||
Body: { type: 'table' | 'dashboard' | 'image', prompt, context? }
|
||
Response: { url?, data?, imageUrl? }
|
||
|
||
POST /api/v1/export
|
||
Body: { format: 'xlsx' | 'csv' | 'md' | 'pdf', contentId?, contentType?: 'create' | 'thread' }
|
||
Body (thread): { format: 'pdf' | 'md', threadId }
|
||
Response: blob / download URL
|
||
```
|
||
|
||
### 5.10.1 Export thread
|
||
|
||
```
|
||
POST /api/v1/library/threads/:id/export
|
||
Query: ?format=pdf|md
|
||
Response: blob (application/pdf или text/markdown)
|
||
Реализация: create-svc или library-svc + puppeteer/jsPDF для PDF
|
||
```
|
||
|
||
### 5.11 Patents
|
||
|
||
```
|
||
GET /api/v1/patents?q=...
|
||
Response: { patents: [{ title, abstract, filingDate, url, summary }] }
|
||
Source: Google Patents / USPTO API; LLM-суммаризация; Redis кэш
|
||
```
|
||
|
||
### 5.12 Enterprise Audit
|
||
|
||
```
|
||
GET /api/v1/admin/audit-logs?from=&to=&userId=
|
||
Response: [{ query, answerSnippet, model, sources, userId, timestamp }]
|
||
Только для org admin
|
||
```
|
||
|
||
### 5.13 Notifications
|
||
|
||
```
|
||
POST /api/v1/notifications/subscribe # Web Push подписка (VAPID)
|
||
Body: { endpoint, keys: { p256dh, auth } }
|
||
|
||
POST /api/v1/notifications/preferences # Настройки: push при ответе, email, напоминания
|
||
Body: { pushOnAnswer?, emailOnDeepResearch?, reminders?: [...] }
|
||
|
||
POST /api/v1/notifications/remind # «Напомнить через N»
|
||
Body: { threadId?, query?, remindAt: ISO8601 }
|
||
```
|
||
|
||
### 5.14 Model Council (Max)
|
||
|
||
```
|
||
POST /api/v1/chat
|
||
Body: { ..., modelCouncil: true, models: ['gpt-4o','claude-sonnet','...'] }
|
||
Response: SSE с этапами: 3 ответа → синтез
|
||
```
|
||
|
||
### 5.15 Background Assistant (Max)
|
||
|
||
```
|
||
POST /api/v1/tasks # Создать фоновую задачу
|
||
Body: { query, mode?, callback?: 'push' | 'poll' }
|
||
Response: { taskId }
|
||
|
||
GET /api/v1/tasks/:id # Статус задачи
|
||
Response: { status, result?, error? }
|
||
```
|
||
|
||
---
|
||
|
||
## 6. Порядок реализации (best practices)
|
||
|
||
### Фаза 0 — Инфраструктура
|
||
1. K3s кластер, PostgreSQL, Redis, MinIO
|
||
2. API Gateway (Traefik/Kong)
|
||
3. Auth-svc (Keycloak или Supabase Auth)
|
||
|
||
### Фаза 1 — Ядро
|
||
4. chat-svc с Mastra (Classifier → parallel actions → Writer)
|
||
5. search-svc (SearXNG, actions)
|
||
6. cache-worker + Redis стратегия
|
||
7. Кэш для search по query_hash
|
||
|
||
### Фаза 2 — Discover + Finance
|
||
8. discover-svc + cache-worker pre-compute
|
||
9. finance-svc + cache-worker
|
||
10. Клиент: Discover, Finance страницы
|
||
|
||
### Фаза 3 — Travel
|
||
11. travel-svc, Tripadvisor, Selfbook
|
||
12. Inspiration Cards (cache-worker), Stepper UI
|
||
13. Answer Mode: Travel
|
||
|
||
### Фаза 4 — Проекты, Collections, Library, биллинг
|
||
14. projects-svc, upload-svc, **Collections** (Popular Spaces по категориям)
|
||
15. library-svc (история для аккаунтов)
|
||
16. billing-svc, ЮKassa
|
||
17. Клиент: Spaces UI, Library, Profile, Billing, My Connectors
|
||
|
||
### Фаза 5 — Memory, Create, Finance+, Patents, Enterprise
|
||
18. memory-svc (персональная память, Enterprise Memory)
|
||
19. create-svc (таблицы, дашборды, экспорт, image generation)
|
||
20. finance-svc: Analyst ratings, SEC links, ETF Holdings, heatmap hover, stock graphs
|
||
21. Patents page: search-svc + patents API, `/patents`
|
||
22. audit-svc (Enterprise audit logs)
|
||
23. Enterprise: domain sign-up, usage guidelines, granular feature access
|
||
24. Step-by-step Learning, Response preferences, Input bar «+»
|
||
|
||
### Фаза 6 — Клиенты и образование
|
||
25. Desktop app (Electron/Tauri)
|
||
26. iOS / Android (React Native/Capacitor), voice search
|
||
27. Chrome extension
|
||
28. Step-by-step Learning UI, Quizzes/Flashcards
|
||
29. Education Pro тариф
|
||
|
||
### Фаза 7 — Export, Notifications, PWA, Model Council, Background
|
||
30. Export thread: POST /library/threads/:id/export (PDF, MD)
|
||
31. PWA: Service worker (Workbox), manifest, offline fallback
|
||
32. notifications-svc: Web Push (VAPID), email, напоминания
|
||
33. Model Council (Max): параллельный запуск 3 моделей, синтез
|
||
34. Background Assistant (Max): POST /tasks, queue, push при готовности
|
||
|
||
### Фаза 8 — Оптимизация
|
||
35. Pre-warm популярных запросов в cache-worker
|
||
36. CDN для статики
|
||
37. Мониторинг, алерты, SLO
|
||
|
||
---
|
||
|
||
## 7. Латенси по сценариям (пользователь)
|
||
|
||
| Сценарий | Ожидаемое время | Cold / промах кэша |
|
||
|----------|-----------------|--------------------|
|
||
| Discover / Finance (кэш) | <500 ms | 5–30 с |
|
||
| Finance редкий тикер | 10–20 с (cold fill) | — |
|
||
| Travel itinerary | 15–60 с | — |
|
||
| Pro/Deep Search | 30–120 с | — |
|
||
| Загрузка файла (эмбеддинги) | 30–300 с | — |
|
||
| Медиа (Images/Videos) | 3–10 с | — |
|
||
|
||
## 8. Оценка нагрузки (10k DAU)
|
||
|
||
| Метрика | Оценка | Решение |
|
||
|---------|--------|---------|
|
||
| RPS пиковый | ~50–100 | HPA, 3–5 реплик chat-svc |
|
||
| LLM вызовов/день | ~30k (3 на юзера) | Кэш снижает до ~10k |
|
||
| Redis memory | ~4–8 GB | Кэш discover/finance/search |
|
||
| Storage | ~100 GB | Файлы проектов, логи |
|
||
|
||
---
|
||
|
||
## 9. Безопасность и compliance
|
||
|
||
- HTTPS везде
|
||
- JWT с коротким TTL (15 мин), refresh token
|
||
- Rate limiting: 100 req/min на IP, 300 Pro Search/день (Free)
|
||
- Не логировать персональные запросы в plaintext
|
||
- Кэш — только по hash, без привязки к user_id
|