Files
gooseek/docs/architecture/01-perplexity-analogue-design.md
home cd6b7857ba feat: default locale Russian, geo determines language for other countries
- 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>
2026-02-23 15:10:38 +03:00

39 KiB
Raw Blame History

Архитектура аналога 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-сводка каждой новости/блока
Обновление Фоновая задача каждые 1530 мин
Кэш 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 25 мин

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 124 ч

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 515 мин

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 35 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 12 Create (таблицы, дашборды), экспорт, image generation
audit-svc Node.js 1 Audit logs для Enterprise (query, answer, model, user)
notifications-svc Node.js 12 Web Push, Email, напоминания; очереди задач
cache-worker Node.js 12 Cron: pre-compute discover, finance, travel inspiration

3.3 K3s манифесты (базовая структура)

# 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} 124 ч On first request
Media Images/Videos query media:{type}:{query_hash} 1 ч On first request
Widgets Погода, акции widget:{type}:{key} 515 мин 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 — Ядро

  1. chat-svc с Mastra (Classifier → parallel actions → Writer)
  2. search-svc (SearXNG, actions)
  3. cache-worker + Redis стратегия
  4. Кэш для search по query_hash

Фаза 2 — Discover + Finance

  1. discover-svc + cache-worker pre-compute
  2. finance-svc + cache-worker
  3. Клиент: Discover, Finance страницы

Фаза 3 — Travel

  1. travel-svc, Tripadvisor, Selfbook
  2. Inspiration Cards (cache-worker), Stepper UI
  3. Answer Mode: Travel

Фаза 4 — Проекты, Collections, Library, биллинг

  1. projects-svc, upload-svc, Collections (Popular Spaces по категориям)
  2. library-svc (история для аккаунтов)
  3. billing-svc, ЮKassa
  4. Клиент: Spaces UI, Library, Profile, Billing, My Connectors

Фаза 5 — Memory, Create, Finance+, Patents, Enterprise

  1. memory-svc (персональная память, Enterprise Memory)
  2. create-svc (таблицы, дашборды, экспорт, image generation)
  3. finance-svc: Analyst ratings, SEC links, ETF Holdings, heatmap hover, stock graphs
  4. Patents page: search-svc + patents API, /patents
  5. audit-svc (Enterprise audit logs)
  6. Enterprise: domain sign-up, usage guidelines, granular feature access
  7. Step-by-step Learning, Response preferences, Input bar «+»

Фаза 6 — Клиенты и образование

  1. Desktop app (Electron/Tauri)
  2. iOS / Android (React Native/Capacitor), voice search
  3. Chrome extension
  4. Step-by-step Learning UI, Quizzes/Flashcards
  5. Education Pro тариф

Фаза 7 — Export, Notifications, PWA, Model Council, Background

  1. Export thread: POST /library/threads/:id/export (PDF, MD)
  2. PWA: Service worker (Workbox), manifest, offline fallback
  3. notifications-svc: Web Push (VAPID), email, напоминания
  4. Model Council (Max): параллельный запуск 3 моделей, синтез
  5. Background Assistant (Max): POST /tasks, queue, push при готовности

Фаза 8 — Оптимизация

  1. Pre-warm популярных запросов в cache-worker
  2. CDN для статики
  3. Мониторинг, алерты, SLO

7. Латенси по сценариям (пользователь)

Сценарий Ожидаемое время Cold / промах кэша
Discover / Finance (кэш) <500 ms 530 с
Finance редкий тикер 1020 с (cold fill)
Travel itinerary 1560 с
Pro/Deep Search 30120 с
Загрузка файла (эмбеддинги) 30300 с
Медиа (Images/Videos) 310 с

8. Оценка нагрузки (10k DAU)

Метрика Оценка Решение
RPS пиковый ~50100 HPA, 35 реплик chat-svc
LLM вызовов/день ~30k (3 на юзера) Кэш снижает до ~10k
Redis memory ~48 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