Files

841 lines
43 KiB
Markdown
Raw Permalink 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.
# VoIdeaAI — Финальная спецификация проекта
**Роль:** ты — старший архитектор ПО и продуктовый аналитик. Твоя задача — зафиксировать полное описание, промпты, архитектуру и все функциональные связи продукта VoIdeaAI.
**Цель:** голосовой AI-ассистент для генерации, проработки и сохранения идей с помощью группового ИИ-анализа. Пользователь говорит или печатает — система через оркестратора (Дирижёр) направляет запрос специализированному ролевому агенту, верифицирует ответ и возвращает результат с оценкой уверенности.
---
## 1. Общая архитектура
```
Browser (PWA — React + TypeScript + Tailwind)
│ Web Speech API (распознавание) / SpeechSynthesis (озвучивание)
│ HTTPS
Nginx (reverse proxy, SSL termination, Let's Encrypt)
FastAPI (Python 3.12+, async)
├── StaticFiles — /assets, /icons, SPA fallback
├── SecurityHeadersMiddleware — CSP, HSTS, X-Frame-Options и др.
├── CORSMiddleware — whitelist origins
├── Limiter (slowapi) — rate limiting на все endpoints
├── API v1 (/api/v1)
│ ├── /auth — регистрация, логин, OAuth, сброс пароля
│ ├── /voice — транскрибация, чат, сессии, рейтинг
│ ├── /users — профиль, настройки
│ ├── /ideas — CRUD идей
│ ├── /agents — список и управление агентами
│ ├── /admin — панель управления
│ └── /sync — синхронизация
├── ConductorAgent (Дирижёр) — оркестратор, точка входа
│ ├── → 13 Role Agents (ролевые)
│ └── Верификация (confidence 0-100%)
├── AgentRegistry — 12 Dev/Ops агентов (автоматизация)
├── LLM Service — OpenAI-compatible (OpenAI / YandexGPT / GigaChat)
├── Whisper Service — транскрибация аудио
├── Email Service — SMTP (Jinja2), password reset
├── Crypto Service — AES-256 Fernet (PBKDF2 600k итераций)
└── PostgreSQL — 8 таблиц (asyncpg)
```
**Ключевые принципы:**
- **PostgreSQL только** — единый `DATABASE_URL`, без SQLite
- **No Docker** — systemd + venv напрямую на VPS (Ubuntu)
- **Single-page app** — FastAPI StaticFiles раздаёт фронтенд
- **Агенты имеют прямой доступ к БД** — через переданную async-сессию
---
## 2. Технологический стек
| Компонент | Технология |
|-----------|-----------|
| Бэкенд | Python 3.12+, FastAPI, Uvicorn |
| Фронтенд | React 18, TypeScript, Tailwind CSS, Vite |
| PWA | manifest.json, service worker, иконки всех размеров |
| База данных | PostgreSQL 15+, asyncpg, SQLAlchemy 2.0 (async), Alembic |
| Аутентификация | JWT (HS256), bcrypt (passlib), OAuth 2.0 |
| ИИ-модели | OpenAI API (gpt-4o-mini), YandexGPT, GigaChat (fallback chain) |
| Распознавание речи | Web Speech API (браузер) → Whisper API (OpenAI, fallback) |
| Синтез речи | SpeechSynthesis API (браузер, русский голос) |
| Шифрование | AES-256-CBC + HMAC-SHA256 (Fernet), PBKDF2 |
| Rate limiting | slowapi (60/min default, 10/min auth, 3/min forgot-password) |
| Защита заголовков | CSP, HSTS, X-Frame-Options, X-Content-Type-Options, X-XSS-Protection |
| Почта | aiosmtplib + Jinja2 (HTML-шаблоны) |
| Мониторинг | Prometheus + Grafana (VPS) |
| Развёртывание | systemd + venv, Nginx + certbot (Let's Encrypt) |
---
## 3. Аутентификация и OAuth
### 3.1 Email + пароль
- Регистрация: `POST /api/v1/auth/register` — email, пароль (8+ символов), имя
- Логин: `POST /api/v1/auth/login` — email + пароль
- JWT access token (60 мин) + refresh token (30 дней) с ротацией
- bcrypt для хешей паролей
- Brute-force защита: 5 неудачных попыток → блокировка на 15 минут (in-memory, в проде — Redis)
- Rate limit: 10/min на login, 5/min на register, 3/min на forgot-password
### 3.2 Яндекс OAuth
- 7 scopes: `login:email`, `login:info`, `login:avatar`, `cloud_api:disk.write`, `cloud_api:disk.app_folder`, `cloud_api:disk.read`, `cloud_api:disk.info`
- Папка на Диске: `/VoIdeaAI/`
- Методы: `upload_file()`, `ensure_app_folder()`, `get_disk_info()`
- Redirect URI настраивается через `OAUTH_YANDEX_REDIRECT_URI`
### 3.3 Google OAuth
- Scopes: `userinfo.email`, `userinfo.profile`, `drive.file`
- Папка на Диске: `/VoIdeaAI/`
- Активируется когда `OAUTH_GOOGLE_ID` не пуст
- Redirect: `http://localhost:8020/auth/google/callback`
**Пример запроса:**
```python
from app.integrations.oauth.google import is_available, get_authorize_url, exchange_code, get_user_info, upload_file
if is_available():
url = await get_authorize_url()
token = await exchange_code(code)
user = await get_user_info(token["access_token"])
await upload_file(token["access_token"], "idea.txt", content)
```
### 3.4 Apple OAuth
- Sign in with Apple через `appleid.apple.com`
- Активируется когда `OAUTH_APPLE_ID` не пуст
- Redirect: `http://localhost:8020/auth/apple/callback`
- iCloud Drive через CloudKit API
### 3.5 Password Reset
- JWT reset token с отдельным секретом (`JWT_RESET_SECRET_KEY`), 1 час
- HTML-письмо с кнопкой сброса (Jinja2-шаблон)
- Если SMTP не настроен — лог в консоль
- Rate limit: 3/min на forgot-password
### 3.6 2FA (TOTP)
- Включается через `ENABLE_2FA=true`
- PyOTP + QR-код для настройки
- Подтверждение кода при входе после пароля/OAuth
---
## 4. Голосовой ввод / вывод
### 4.1 Распознавание речи
**Цепочка приоритетов:**
1. **Web Speech API** (браузер, `SpeechRecognition`) — основной, бесплатный, работает онлайн
2. **MediaRecorder → Whisper API** (OpenAI `whisper-1`, `language=ru`) — fallback если Web Speech недоступен
3. Если ключ OpenAI не задан — возвращается ошибка
**Компонент VoiceInput (`webui/src/components/VoiceInput.tsx`):**
- Кнопка-микрофон с визуальной индикацией записи
- `onMouseDown/onTouchStart` — начало записи
- `onMouseUp/onTouchEnd` — остановка и отправка
- Автоматическая остановка через 5 секунд (MediaRecorder)
- Подавление шума через confidence ≥ 0.5
### 4.2 Текстовый ввод
- Поле ввода рядом с микрофоном, отправка по Enter
- Пользователь может говорить ИЛИ печатать
- Чекбокс «Озвучивать ответ» отключает TTS
### 4.3 Синтез речи (TTS)
- **SpeechSynthesis API** браузера (бесплатно, без серверной нагрузки)
- Язык: `ru-RU`, скорость: 0.9
- Автоматическое озвучивание ответов (кроме `needs_clarification`)
- Кнопка «Стоп» для прерывания
### 4.4 Голосовые команды
Фоновый `SpeechRecognition` (continuous mode) слушает команды:
| Команда | Действие |
|---------|----------|
| «Стоп» | Остановить TTS |
| «Повтори» | Повторить последний ответ |
| «Уточнить» | Открыть диалог уточнения запроса |
- Отключается при отсутствии сообщений в чате
- Confidence ≥ 0.5 для фильтрации шума
---
## 5. Оркестрация: Дирижёр
**Файл:** `app/agents/conductor_agent.py`
Дирижёр — единственная точка входа для пользовательских запросов. Полный pipeline:
```
User Input (текст/голос)
┌─ 0. Авто-создание сессии ─────────────────┐
│ Если session_id не передан → создаётся │
│ новая сессия + LLM генерирует title │
└────────────────────────────────────────────┘
┌─ 1. Сбор контекста ───────────────────────┐
│ • Недавние обсуждения пользователя (5) │
│ • Похожие успешные кейсы (word overlap) │
│ • История текущей сессии │
└────────────────────────────────────────────┘
┌─ 2. Маршрутизация (LLM) ──────────────────┐
│ "Определи лучшего агента для ответа" │
│ temperature=0.3, max_tokens=64 │
│ Ответ ТОЛЬКО именем агента │
└────────────────────────────────────────────┘
┌─ 3. Генерация ответа ─────────────────────┐
│ Выбранный RoleAgent + system_prompt │
│ temperature=0.7, max_tokens=1536 │
└────────────────────────────────────────────┘
┌─ 4. Верификация ──────────────────────────┐
│ Проверка: галлюцинации, противоречия, │
│ логические ошибки, пропущенные детали │
│ temperature=0.2, max_tokens=1024 │
│ Ответ JSON: confidence, issues, corrected │
└────────────────────────────────────────────┘
┌─ 5. Confidence scoring ───────────────────┐
│ ≥ 80% → verified (зелёный) │
│ 50-79% → warning (жёлтый) │
│ < 50% → needs_clarification (красный) │
│ issues_found → ответ скорректирован │
└────────────────────────────────────────────┘
┌─ 6. Логирование + самообучение ───────────┐
│ ConductorInteraction: input, output, │
│ confidence, agent, время, session_id │
└────────────────────────────────────────────┘
Response { response, agent_name, confidence,
verification_status, session_id,
interaction_id }
```
**Пример ответа:**
```json
{
"response": "Идея стартапа по экологии имеет ROI 150%...",
"agent_name": "Бизнес-аналитик",
"agent_description": "Оценивает идею с точки зрения бизнес-показателей",
"confidence": 85,
"verification_status": "verified",
"processing_time_ms": 2340.5,
"interaction_id": "a1b2c3d4-...",
"session_id": "e5f6g7h8-..."
}
```
---
## 6. Ролевые агенты (13 шт)
Все агенты описаны в `app/agents/role_agents.py`. Каждый имеет `name`, `description` и `system_prompt`.
| # | Агент | Описание | System prompt |
|---|-------|----------|--------------|
| 1 | **Бизнес-аналитик** | Оценивает идею: ROI, окупаемость, ЦА, конкуренты | *«Ты — Бизнес-аналитик. Дай оценку по критериям: ROI (%), срок окупаемости (месяцы), целевая аудитория (тыс. чел.), конкурентные преимущества...»* |
| 2 | **Организатор задач** | Разбивает на шаги, план реализации | *«Разбей идею на 5-7 шагов. Для каждого: название, срок, ответственный...»* |
| 3 | **Юрист** | Проверяет на законы РФ (152-ФЗ, 44-ФЗ и др.) | *«Проанализируй на соответствие законодательству РФ. Правовые риски, способы минимизации...»* |
| 4 | **Финансовый консультант** | Бюджет, прогноз доходов, точка безубыточности | *«Составь смету: разработка, маркетинг, поддержка. Прогноз дохода за год...»* |
| 5 | **Архитектор решений** | 2 варианта архитектуры (монолит / микросервисы) | *«Предложи 2 варианта. Вариант A — монолит, B — микросервисы. Технологии, сложность...»* |
| 6 | **Тестировщик** | Тест-кейсы (позитивные/негативные), инструменты | *«5-10 тест-кейсов. Шаги, ожидаемый результат, инструменты автоматизации...»* |
| 7 | **UI-дизайнер** | 2 варианта дизайна, цвета, шрифты, UX | *«2 варианта главного экрана. Цветовая схема, шрифты, расположение элементов...»* |
| 8 | **SMM-специалист** | Контент-план на месяц, платформы, хештеги | *«Контент-план: платформы (ВК, Telegram), форматы, частота, 3-4 примера постов...»* |
| 9 | **Лайф-коуч** | SMART-цели, квартальные этапы, метрики | *«Помоги сформулировать цель по SMART. Q1-Q4, 3 метрики прогресса...»* |
| 10 | **Эксперт по доступности** | Инклюзивность, WCAG 2.1 (AA) | *«Слабовидящие, глухие, моторные нарушения, когнитивные — доработки для WCAG 2.1...»* |
| 11 | **Критик** | Конструктивный разбор: подводные камни, улучшения | *«Что НЕ учтено? Подводные камни, улучшения. Тон — доброжелательный коллега...»* |
| 12 | **Копирайтер** | Продающий текст, сторителлинг | *«Упакуй идею в яркий текст: заголовки, метафоры, сторителлинг. Для инвесторов и команды...»* |
| 13 | **Хранитель** | Сохраняет идею в БД (название, описание, теги) | *«Оформи для сохранения: Название, Описание, Теги. Строгий формат...»* |
**Агенты 11-13** (Критик, Копирайтер, Хранитель) добавлены дополнительно к базовым 10 из оригинальной спецификации.
---
## 7. Dev/Ops агенты (12 шт)
Зарегистрированы в `app/agents/registry.py`. Используются через `AgentRegistry.run_agent()` для автоматизации разработки и поддержки.
| # | Агент | Описание |
|---|-------|----------|
| 1 | **DocAgent** | Генерация документации по коду |
| 2 | **BacklogAgent** | Управление бэклогом задач |
| 3 | **SpecAgent** | Написание спецификаций |
| 4 | **AuditAgent** | Аудит кода и безопасности |
| 5 | **ObserverAgent** | Мониторинг и наблюдаемость |
| 6 | **EvolutionAgent** | Предложения по эволюции кода |
| 7 | **SecurityAgent** | Проверки безопасности |
| 8 | **QATesterAgent** | Автоматическое тестирование |
| 9 | **FixAgent** | Исправление типовых ошибок |
| 10 | **UITestAgent** | UI-тестирование |
| 11 | **RolloutAgent** | Развёртывание и релизы |
| 12 | **ConductorAgent** | Дирижёр (в registry для Dev/Ops контекста) |
---
## 8. Связи агентов
```
┌──────────────────┐
│ Пользователь │
│ (голос / текст) │
└────────┬─────────┘
┌──────────────────┐
│ Дирижёр │ ←── AgentRegistry
│ (Conductor) │ (Dev/Ops)
└────────┬─────────┘
│ маршрутизация (LLM)
┌──────────────────────────────┐
│ 13 Role Agents │
│ │
│ Бизнес-аналитик │
│ Организатор задач │
│ Юрист │
│ Финансовый консультант │
│ Архитектор решений │
│ Тестировщик │
│ UI-дизайнер │
│ SMM-специалист │
│ Лайф-коуч │
│ Эксперт по доступности │
│ Критик │
│ Копирайтер │
│ Хранитель │
└──────────────┬───────────────┘
│ response
┌──────────────────┐
│ Верификация │
│ (внутри Дирижёра)│
│ confidence 0-100 │
└────────┬─────────┘
┌──────────────────┐
│ Пользователь │
│ + лог в БД │
└──────────────────┘
```
**Ключевые правила:**
- Дирижёр — **единственная точка входа** для пользователя
- Верификация выполняется **внутри Дирижёра** (не отдельный агент) — быстрее, меньше загрузки LLM
- Dev/Ops агенты вызываются через `/api/v1/agents/` (не через Дирижёр)
- 26 агентов всего: 1 Дирижёр + 13 ролевых + 12 dev/ops
- Все ролевые агенты имеют прямой доступ к БД через переданную `db: AsyncSession`
---
## 9. Самообучение
### 9.1 Рейтинг (1-5)
После каждого ответа пользователь может поставить оценку:
- Звёзды 1-5 в интерфейсе
- `POST /api/v1/voice/rate` — сохраняет `user_rating` в `ConductorInteraction`
- Используется для фильтрации успешных кейсов
### 9.2 Похожие кейсы (word overlap)
При обработке запроса:
1. Выборка успешных interaction (rating ≥ 4, confidence ≥ 70) за последние 7 дней
2. Сравнение через `_text_similarity()` — пересечение множеств слов
3. Если overlap > 30% — кейс подмешивается в контекст LLM
Пример:
```
Было: "придумай идею для стартапа в экологии"
Ответ: "Идея: переработка пластика..." (rating: 5)
```
Подмешивается в контекст похожего запроса.
### 9.3 Динамические команды
- Хранятся в таблице `voice_commands` (привязка к `user_id`)
- Если фраза сработала 3+ раза — система предлагает добавить как команду
- Поля: `phrase`, `action`, `agent_name`, `count`, `is_active`
### 9.4 ConductorInteraction (таблица логов)
| Поле | Описание |
|------|----------|
| `user_id` | FK → users |
| `session_id` | FK → sessions |
| `input_text` | Запрос пользователя |
| `detected_intent` | Распознанное намерение |
| `selected_agent` | Какой агент отвечал |
| `response_text` | Ответ агента |
| `user_rating` | 1-5 (заполняется позже) |
| `confidence_score` | 0-100 |
| `verification_status` | verified / warning / needs_clarification / issues_found |
| `processing_time_ms` | Время обработки |
| `context` | JSON с деталями верификации |
---
## 10. Сессии
**Модель:** `app/models/session.py`, таблица `sessions`
- **1 сессия = 1 обсуждение идеи**
- Авто-создание при первом сообщении без `session_id`
- Дирижёр формирует заголовок через LLM (до 7 слов) на основе первого запроса
- Статусы: `active`, `archived`
- Привязка к `idea_id` (когда идея сохранена)
**API:**
- `GET /api/v1/voice/sessions` — список сессий пользователя
- `GET /api/v1/voice/sessions/{id}` — детали сессии
- `GET /api/v1/voice/sessions/{id}/history` — история взаимодействий
- `DELETE /api/v1/voice/sessions/{id}` — удалить сессию
**UI:**
- Сайдбар слева со списком сессий
- Кнопка «Новый чат» → сброс текущей сессии
- Активная сессия подсвечена
- Кнопка удаления с confirm-диалогом
---
## 11. Интеграции с дисками
Единый интерфейс для облачных хранилищ. Все провайдеры создают папку `/VoIdeaAI/` и загружают файлы туда.
### 11.1 Яндекс.Диск (реализован)
`app/integrations/oauth/yandex.py`:
- `get_authorize_url()` → URL авторизации
- `exchange_code(code)` → токен
- `get_user_info(token)` → профиль
- `ensure_app_folder(token)` → создаёт /VoIdeaAI/
- `upload_file(token, local_path, remote_name)` → загружает файл
- `get_disk_info(token)` → квота
### 11.2 Google Drive
`app/integrations/oauth/google.py`:
- Активируется при непустом `OAUTH_GOOGLE_ID`
- `is_available()` → bool
- Те же методы: `get_authorize_url`, `exchange_code`, `get_user_info`, `ensure_app_folder`, `upload_file`, `get_disk_info`
- Использует `https://www.googleapis.com/drive/v3`
### 11.3 Apple iCloud Drive
`app/integrations/oauth/apple.py`:
- Активируется при непустом `OAUTH_APPLE_ID`
- `is_available()` → bool
- Те же методы (через CloudKit API)
- Требует дополнительной настройки entitlements в Apple Developer Console
---
## 12. Безопасность
### 12.1 Криптография
| Компонент | Метод |
|-----------|-------|
| Пароли | bcrypt (passlib, 12 раундов) |
| JWT Access Token | HS256, 60 мин, отдельный secret |
| JWT Refresh Token | HS256, 30 дней, ротация при каждом использовании |
| JWT Reset Token | HS256, 1 час, отдельный secret (`JWT_RESET_SECRET_KEY`) |
| Шифрование данных | AES-256-CBC + HMAC-SHA256 (Fernet), PBKDF2 600k итераций |
| Шифруются: идеи, ответы ConductorInteraction, логи |
### 12.2 Rate Limiting
| Endpoint | Лимит |
|----------|-------|
| `/login` | 10/min |
| `/register` | 5/min |
| `/refresh` | 10/min |
| `/forgot-password` | 3/min |
| `/reset-password` | 5/min |
| `/oauth/*` | 10/min |
| `/health` | 30/min |
| Все остальные | 60/min |
### 12.3 Security Headers
Все ответы содержат:
- `X-Content-Type-Options: nosniff`
- `X-Frame-Options: DENY`
- `X-XSS-Protection: 1; mode=block`
- `Strict-Transport-Security: max-age=31536000; includeSubDomains`
- `Content-Security-Policy: default-src 'self'; script-src 'self'; ...`
### 12.4 Brute Force
- 5 неудачных попыток логина за 15 минут → временная блокировка email
- In-memory (TODO: Redis в production)
- Не блокирует другие аккаунты с того же IP
### 12.5 Дополнительно
- CORS whitelist (настраивается)
- Токены в `localStorage` (с предупреждением о XSS)
- SQLAlchemy ORM (параметризованные запросы — защита от SQL injection)
- Pydantic-валидация всех входящих данных
- `is_active` check на каждом запросе
- `require_admin` dependency для админ-роутов
---
## 13. База данных (PostgreSQL)
### 13.1 Схема
```sql
-- 8 таблиц, все с UUID первичными ключами + created_at/updated_at
users
id UUID PRIMARY KEY
email VARCHAR(255) UNIQUE NOT NULL
password_hash VARCHAR(255) NULLABLE
display_name VARCHAR(255) NOT NULL
avatar_url VARCHAR(512) NULLABLE
is_active BOOLEAN DEFAULT true
is_superuser BOOLEAN DEFAULT false
oauth_provider VARCHAR(50) NULLABLE
oauth_id VARCHAR(255) NULLABLE
ideas
id UUID PRIMARY KEY
user_id UUID FK users(id) ON DELETE CASCADE
title VARCHAR(255) NOT NULL
description TEXT
tags TEXT
status VARCHAR(20) DEFAULT 'draft'
agent_configs
id UUID PRIMARY KEY
agent_name VARCHAR(100) NOT NULL
user_id UUID FK users(id) ON DELETE CASCADE
model VARCHAR(100)
enabled BOOLEAN DEFAULT true
backlog_tasks
id UUID PRIMARY KEY
title VARCHAR(255) NOT NULL
description TEXT
priority INTEGER DEFAULT 0
status VARCHAR(20) DEFAULT 'pending'
log_entries
id UUID PRIMARY KEY
level VARCHAR(10) NOT NULL
message TEXT NOT NULL
agent VARCHAR(100)
user_id UUID FK users(id) ON DELETE SET NULL
conductor_interactions
id UUID PRIMARY KEY
user_id UUID FK users(id) ON DELETE SET NULL
session_id UUID FK sessions(id) ON DELETE SET NULL
input_text TEXT NOT NULL
detected_intent VARCHAR(100)
selected_agent VARCHAR(100)
response_text TEXT
user_rating INTEGER NULLABLE
confidence_score INTEGER DEFAULT 80
verification_status VARCHAR(20) DEFAULT 'verified'
was_auto_routed BOOLEAN DEFAULT true
processing_time_ms FLOAT
context TEXT (JSON)
sessions
id UUID PRIMARY KEY
user_id UUID FK users(id) ON DELETE CASCADE
title VARCHAR(255) DEFAULT 'Новое обсуждение'
status VARCHAR(20) DEFAULT 'active'
idea_id UUID FK ideas(id) ON DELETE SET NULL
voice_commands
id UUID PRIMARY KEY
user_id UUID FK users(id) ON DELETE CASCADE
phrase VARCHAR(255) NOT NULL
action VARCHAR(50) NOT NULL
agent_name VARCHAR(100) NULLABLE
count INTEGER DEFAULT 0
is_active BOOLEAN DEFAULT true
```
### 13.2 Индексы
- `users.email` — UNIQUE
- `users(oauth_provider, oauth_id)` — для OAuth lookup
- `conductor_interactions(user_id)` — история пользователя
- `conductor_interactions(session_id)` — история сессии
- `sessions(user_id, status)` — список сессий
- `voice_commands(user_id)` — команды пользователя
---
## 14. Фронтенд (PWA)
### 14.1 Страницы и маршруты
| Маршрут | Страница | Описание |
|---------|----------|----------|
| `/` | Главная | SPA entry point |
| `/login` | LoginPage | Email + Яндекс OAuth + ссылка «Забыли пароль?» |
| `/register` | RegisterPage | Регистрация email+password |
| `/forgot-password` | ForgotPasswordPage | Форма ввода email |
| `/reset-password?token=` | ResetPasswordPage | Новый пароль |
| `/oauth/callback` | OAuthCallback | Обработка OAuth callback |
| `/voice` | VoiceChat | Голосовой ассистент с сайдбаром |
| `/ideas` | IdeaList | Список идей |
| `/ideas/new` | IdeaCreate | Новая идея |
| `/ideas/:id` | IdeaEdit | Редактирование идеи |
### 14.2 Ключевые компоненты
- **VoiceChat** — основной интерфейс: сайдбар сессий, список сообщений, confidence badge, звёзды рейтинга, кнопка «Уточнить», голосовые команды
- **VoiceInput** — кнопка микрофона, Web Speech API → Whisper fallback
- **VoiceCommands** — хук `useVoiceCommands` для фоновых команд «Стоп»/«Повтори»/«Уточнить»
- **AuthContext** — контекст аутентификации: `login()`, `register()`, `logout()`, `refreshToken()`
- **Layout** — навигация, пункт «Голос»
- **OAuthCallback** — обработка кода авторизации
- **ForgotPasswordPage / ResetPasswordPage** — сброс пароля
### 14.3 PWA
- manifest.json с иконками всех размеров (16, 32, 192, 512, apple-touch-icon)
- favicon.ico + SVG fallback
- service worker (Vite PWA plugin)
- Тёмная тема (Tailwind `dark:` классы)
- Адаптивный дизайн (mobile-first)
---
## 15. API Reference
### 15.1 Auth (`/api/v1/auth`)
| Метод | Endpoint | Тело | Ответ |
|-------|----------|------|-------|
| POST | `/register` | `{email, password, display_name}` | `TokenResponse` |
| POST | `/login` | `{email, password}` | `TokenResponse` |
| POST | `/refresh` | `{refresh_token}` | `TokenResponse` (ротация) |
| GET | `/oauth/yandex` | — | `{url, provider}` |
| POST | `/oauth/yandex/callback` | `{code}` | `TokenResponse` |
| GET | `/oauth/google` | — | `{url, provider}` |
| POST | `/oauth/google/callback` | `{code}` | `TokenResponse` |
| GET | `/oauth/apple` | — | `{url, provider}` |
| POST | `/oauth/apple/callback` | `{code}` | `TokenResponse` |
| POST | `/forgot-password` | `{email}` | `{message}` |
| POST | `/reset-password` | `{token, new_password}` | `{message}` |
### 15.2 Voice (`/api/v1/voice`)
| Метод | Endpoint | Тело / Параметры | Ответ |
|-------|----------|-------------------|-------|
| POST | `/transcribe` | `file: UploadFile` (audio) | `{text}` |
| POST | `/chat` | `{text, session_id?}` | `ChatResponse` |
| POST | `/rate` | `{interaction_id, rating}` | `{status}` |
| GET | `/agents` | — | `[{name, description}]` |
| GET | `/sessions` | `?status=` | `[SessionResponse]` |
| GET | `/sessions/{id}` | — | `SessionResponse` |
| GET | `/sessions/{id}/history` | — | `[{interactions}]` |
| DELETE | `/sessions/{id}` | — | `{status}` |
### 15.3 Ideas (`/api/v1/ideas`)
| Метод | Endpoint | Описание |
|-------|----------|----------|
| GET | `/` | Список идей |
| POST | `/` | Создать идею |
| GET | `/{id}` | Детали идеи |
| PUT | `/{id}` | Обновить идею |
| DELETE | `/{id}` | Удалить идею |
### 15.4 Admin (`/api/v1/admin`)
Под защитой `require_admin`:
- `GET /users` — список пользователей
- `GET /logs` — просмотр логов
- `GET /agents` — статус агентов
---
## 16. Фазы реализации
- **Фаза 0: База данных** — Модели (8 таблиц), миграция Alembic, SQLAlchemy async, UUID primary keys
- **Фаза 1: Сессии** — Авто-создание сессии, авто-title (LLM), сайдбар, история, удаление
- **Фаза 2: Сохранение идей** — Хранитель (Keeper Agent), кнопка «Сохранить», экспорт на Яндекс.Диск / Google Drive / iCloud
- **Фаза 3: Команды + самообучение** — Встроенные и динамические голосовые команды, VoiceHelpPage, docs/voice-commands.md
- **Фаза 4: UI/анимация** — Dark-стили VoiceChat, анимированная волна микрофона, микро-анимации переходов
- **Фаза 5: Multi-сессия** — BroadcastChannel API, параллельные обсуждения, переключение между сессиями без потери контекста
- **Фаза 6: Rate limit** — Применение slowapi ко всем auth endpoints, настройка лимитов
- **Фаза 7: Security hardening** — Security headers middleware, brute force (5 попыток), refresh token rotation, отдельный reset secret
- **Фаза 8: 2FA (TOTP)** — PyOTP + QR-код, подтверждение кода при входе, настройка через профиль
- **Фаза 9: VPS deploy** — Nginx + certbot (Let's Encrypt) + systemd + Alembic upgrade + production .env + мониторинг
- **Фаза 10: Google/Apple OAuth** — Активация роутов авторизации, Drive клиенты, полная интеграция с дисками
---
## 17. Ключевые архитектурные решения
| Решение | Обоснование |
|---------|-------------|
| **PostgreSQL-only** | Единый `DATABASE_URL`. Никакого SQLite. Дев и прод на одном PostgreSQL |
| **systemd (no Docker)** | Прямое управление процессом, простота деплоя на Ubuntu VPS |
| **FastAPI StaticFiles** | Фронтенд раздаётся бэкендом — не нужен отдельный сервер для SPA |
| **Дирижёр = единственная точка входа** | Верификация внутри Дирижёра (не отдельный агент) — быстрее, меньше загрузки LLM |
| **Confidence scoring** | ≥80% OK, 50-79% warning, <50% уточнение. Прозрачность для пользователя |
| **Web Speech → Whisper** | Бесплатный браузерный API как primary, Whisper API как fallback |
| **SpeechSynthesis (TTS)** | Браузерный API — бесплатно, без серверной нагрузки |
| **Пустой OAuth ID = флаг** | `bool(oauth_google_id)` — естественный gate, не может быть рассинхрона |
| **Отдельный JWT reset secret** | Reset token не может быть использован как access/refresh и наоборот |
| **Refresh token rotation** | Каждый refresh выдаёт новую пару — старый токен становится недействительным |
| **Brute force in-memory** | Достаточно для MVP. В проде — Redis с TTL |
| **Агенты имеют прямой доступ к БД** | Все внутренние агенты работают через переданную async-сессию |
---
## 18. Примеры использования
### Пример 1: Пользователь придумывает стартап
**Запрос:** «Придумай идею для стартапа в сфере экологии»
**Pipeline:**
1. Дирижёр создаёт сессию «Стартап в экологии»
2. Маршрутизация → Бизнес-аналитик
3. Бизнес-аналитик генерирует: ROI, окупаемость, ЦА, конкуренты
4. Верификация: confidence 92%, verified
5. Ответ + звёзды рейтинга
**UI:**
```
┌─────────────────────────────────────┐
│ ← Стартап в экологии [85%] │
│ │
│ Придумай идею для стартапа... │
│ ─────────────────────────────────── │
│ Бизнес-аналитик [92%] │
│ Идея: переработка пластика... │
│ ★ ★ ★ ★ ☆ │
└─────────────────────────────────────┘
```
### Пример 2: Пользователь уточняет
**Запрос:** «А какие юридические риски?»
1. Дирижёр определяет: нужен Юрист
2. Юрист анализирует: 152-ФЗ, ответственность за экологию
3. Confidence: 73% → warning
4. Пользователь может уточнить или поставить оценку
### Пример 3: Сохранение идеи
**Команда:** «Сохрани идею»
1. Дирижёр → Хранитель
2. Хранитель формулирует: название, описание, теги
3. Идея сохраняется в БД + экспорт на Яндекс.Диск (если OAuth подключён)
---
## 19. Файловая структура (ключевые файлы)
```
voidea/
├── app/
│ ├── api/v1/
│ │ ├── auth.py — аутентификация + OAuth + password reset
│ │ ├── voice.py — транскрибация, чат, сессии, рейтинг
│ │ ├── ideas.py — CRUD идей
│ │ ├── admin.py — админ-панель
│ │ └── agents.py — управление агентами
│ ├── agents/
│ │ ├── conductor_agent.py — Дирижёр (оркестратор)
│ │ ├── role_agents.py — 13 ролевых агентов + верификация
│ │ ├── conductor_storage.py — логирование, рейтинг, похожие кейсы
│ │ ├── registry.py — 12 dev/ops агентов
│ │ └── base.py — базовый класс агента
│ ├── core/
│ │ ├── config.py — настройки (.env)
│ │ ├── security.py — JWT, bcrypt, хеши
│ │ ├── middleware.py — SecurityHeadersMiddleware
│ │ ├── limiter.py — shared slowapi limiter
│ │ ├── dependencies.py — get_db, get_current_user
│ │ └── database.py — async SQLAlchemy engine
│ ├── models/
│ │ ├── user.py, idea.py, session.py, conductor.py
│ │ ├── voice_command.py, agent.py, backlog.py, log.py
│ ├── services/
│ │ ├── auth_service.py — логин, регистрация, OAuth, brute force
│ │ ├── session_service.py — CRUD сессий
│ │ ├── whisper_service.py — OpenAI Whisper API
│ │ ├── llm_service.py — единый LLM-клиент
│ │ ├── email_service.py — SMTP + Jinja2
│ │ ├── password_reset_service.py — JWT reset token
│ │ └── crypto_service.py — AES-256 Fernet
│ └── integrations/oauth/
│ ├── yandex.py — Яндекс OAuth + Disk (работает)
│ ├── google.py — Google OAuth + Drive (stub, ждёт OAuth)
│ └── apple.py — Apple OAuth + iCloud (stub, ждёт OAuth)
├── webui/
│ ├── src/
│ │ ├── components/
│ │ │ ├── VoiceChat.tsx — чат + сайдбар + text input
│ │ │ ├── VoiceInput.tsx — микрофон (Speech → Whisper)
│ │ ├── pages/
│ │ │ ├── LoginPage.tsx, RegisterPage.tsx
│ │ │ ├── ForgotPasswordPage.tsx, ResetPasswordPage.tsx
│ │ │ ├── OAuthCallback.tsx
│ │ └── hooks/
│ │ └── useVoiceCommands.ts — голосовые команды
│ ├── public/
│ │ ├── favicon.ico / .svg / .png
│ │ ├── apple-touch-icon.png
│ │ ├── site.webmanifest
│ │ └── icons/ (192, 512, android-chrome)
│ └── index.html
├── alembic/versions/
│ └── 001_create_all_tables.py
├── docs/
│ ├── full.md ← данный файл (финальная спецификация)
│ ├── architecture.md — архитектурная документация
│ └── decision-log.md — лог ключевых решений
├── .env.example
└── requirements.txt
```
---
*VoIdeaAI — идеи рождаются вслух, решения приходят мгновенно!*
*Документ финальной спецификации. Версия 1.0.0.*