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

696 lines
39 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Архитектура аналога 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 манифесты (базовая структура)
```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}` | 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 — Ядро
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 (кэш) | &lt;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