Initial commit: VoIdeaAI - voice-first AI idea assistant
This commit is contained in:
@@ -0,0 +1,144 @@
|
||||
# Decision Log
|
||||
|
||||
Лёгкий трекер решений. В отличие от ADR (фиксируют архитектуру), фиксирует **контекст** — почему сделан тот или иной выбор.
|
||||
|
||||
## Когда создавать запись
|
||||
|
||||
- Выбрали технологию (БД, провайдер, фреймворк)
|
||||
- Отложили функциональность
|
||||
- Изменили подход
|
||||
- Архитектурный компромисс
|
||||
|
||||
---
|
||||
|
||||
## 2026-05-11: Структура документации — адаптация template
|
||||
|
||||
**Контекст:** Рядом с кодом появился template/ — универсальный стартовый набор документации. В проекте была собственная структура, частично пересекающаяся с template.
|
||||
|
||||
**Решение:** Взять template за основу, адаптировать под VoIdea. Старые файлы перемещены в /old/. Созданы 27 файлов: инфраструктура, 12 документов, 5 чеклистов, 4 runbook, CI/CD.
|
||||
|
||||
**Альтернативы:** Оставить как есть — дублирование. Полностью перейти на template — потеря уникальных docs/blocks/.
|
||||
|
||||
**Статус:** действует
|
||||
|
||||
---
|
||||
|
||||
## 2026-05-11: PostgreSQL-only + systemd (без Docker)
|
||||
|
||||
**Контекст:** Ранее проект планировался с Docker для деплоя, но целевая среда — VPS с Ubuntu и PostgreSQL. Docker добавляет сложность без необходимости.
|
||||
|
||||
**Решение:**
|
||||
- PostgreSQL на всех этапах (dev + prod)
|
||||
- Единый `DATABASE_URL` в env (вместо 5 полей)
|
||||
- systemd + venv для запуска на VPS
|
||||
- FastAPI StaticFiles для раздачи фронтенда
|
||||
- Dockerfile и docker-compose.yml перемещены в /old/
|
||||
|
||||
**Альтернативы:** Docker — удобно, но лишний слой абстракции для одного сервиса.
|
||||
|
||||
**Статус:** действует
|
||||
|
||||
---
|
||||
|
||||
## 2026-05-11: Все 11 агентов зарегистрированы
|
||||
|
||||
**Контекст:** 5 из 11 агентов (SecurityAgent, QATesterAgent, FixAgent, UITestAgent, RolloutAgent) существовали в коде, но не были подключены к registry и __init__.py.
|
||||
|
||||
**Решение:** Добавлены все 5 в registry.py и __init__.py. Все 11 агентов доступны через API.
|
||||
|
||||
**Статус:** действует
|
||||
|
||||
---
|
||||
|
||||
## 2026-05-11: Rate limiting, crypto, email, sync — инфраструктурные сервисы
|
||||
|
||||
**Контекст:** Проекту требовались базовые сервисы: защита от перегрузок (rate limiting), шифрование данных (crypto), отправка писем (email), синхронизация данных (sync).
|
||||
|
||||
**Решение:**
|
||||
- slowapi (30/min health, 60/min default) через конфиг
|
||||
- AES-256 (Fernet via PBKDF2) — graceful degradation без ключа
|
||||
- aiosmtplib + Jinja2 (welcome, notification шаблоны)
|
||||
- Sync service с pull (updated_at) + push (конфликт по timestamp)
|
||||
|
||||
**Статус:** действует
|
||||
|
||||
---
|
||||
|
||||
## 2026-05-11: Переименование проекта VoIdea → VoIdeaAI
|
||||
|
||||
**Контекст:** Потребовалось единое имя для всех компонентов. VoIdeaAI точнее отражает AI-составляющую (агенты, Whisper).
|
||||
|
||||
**Решение:** Переименованы config.py, main.py, .env.example, webui (index.html, vite.config.ts PWA, LoginPage, RegisterPage), docs/architecture.md. Слоган: «Идеи рождаются вслух, решения приходят мгновенно!»
|
||||
|
||||
**Статус:** действует
|
||||
|
||||
---
|
||||
|
||||
## 2026-05-11: Phase 2-4 — endpoint wiring (OAuth, password reset, voice)
|
||||
|
||||
**Контекст:** Сервисы для Yandex OAuth (+Disk API), password recovery и Whisper были написаны, но не интегрированы в API и фронтенд.
|
||||
|
||||
**Решение:**
|
||||
- **AuthService.oauth_or_register_login** — регистрация/логин через OAuth (поиск по oauth_id, затем по email, затем создание)
|
||||
- **POST /auth/oauth/yandex** (URL) + **POST /auth/oauth/yandex/callback** (обмен code → токены) — настоящий OAuth-флоу
|
||||
- **POST /auth/forgot-password** + **POST /auth/reset-password** — восстановление пароля через email
|
||||
- **POST /voice/transcribe** — загрузка аудио, транскрибация через Whisper API
|
||||
- **LoginPage.tsx** — поле email (вместо username), кнопка «Войти через Яндекс», ссылка «Забыли пароль?»
|
||||
- **RegisterPage.tsx** — поле имени (display_name), авто-логин после регистрации
|
||||
- **OAuthCallback.tsx** — обработка callback от Яндекса (чтение code → POST на бэкенд → токены → редирект)
|
||||
- **VoiceInput.tsx** — MediaRecorder + Web Speech API с fallback на Whisper API
|
||||
- **AuthContext.tsx** — исправлена сигнатура login(email, password) и register(email, password, display_name)
|
||||
- **App.tsx** — маршрут /oauth/callback
|
||||
- **app/api/v1/voice.py** — новый роутер voice
|
||||
- **config.py** — oauth_yandex_redirect_uri по умолчанию http://localhost:3000/oauth/callback
|
||||
|
||||
**Статус:** действует
|
||||
|
||||
---
|
||||
|
||||
## 2026-05-11: Phase 2-4 — завершение (openai_key, SMTP fallback, forgot/reset pages, VoiceInput, migration)
|
||||
|
||||
**Контекст:** После первой волны Phase 2-4 оставались неприкрытые края: whisper_service использовал неправильный ключ, при отключённом SMTP письма просто не отправлялись (без лога), отсутствовали страницы сброса пароля, голосовой ввод не был встроен в формы, не было миграции.
|
||||
|
||||
**Решение:**
|
||||
- **config.py / whisper_service** — добавлено поле `openai_api_key`, whisper_service пробует его первым, затем `ai_yandex_key` как fallback
|
||||
- **email_service.py** — при отключённом SMTP письмо логируется в консоль (logging.info) вместо возврата False
|
||||
- **ForgotPasswordPage.tsx** — форма ввода email, POST /auth/forgot-password, сообщение об отправке
|
||||
- **ResetPasswordPage.tsx** — чтение `?token=` из URL, форма нового пароля, POST /auth/reset-password
|
||||
- **VoiceInput в IdeaCreate/IdeaEdit** — иконка микрофона рядом с полем «Описание», вставка распознанного текста в textarea
|
||||
- **alembic/versions/001_create_all_tables.py** — ручная initial migration (5 таблиц: users, ideas, agent_configs, log_entries, backlog_tasks)
|
||||
- **.env.example** — добавлен OPENAI_API_KEY
|
||||
- **App.tsx** — маршруты /forgot-password и /reset-password
|
||||
|
||||
**Статус:** действует
|
||||
|
||||
---
|
||||
|
||||
## 2026-05-11: Дирижёр, 13 ролевых агентов, верификация, голосовые команды
|
||||
|
||||
**Контекст:** Проекту требовался голосовой AI-ассистент, который понимает пользователя, выбирает нужного эксперта, проверяет ответ и позволяет управлять голосом.
|
||||
|
||||
**Решение:**
|
||||
- **Дирижёр (ConductorAgent)** — оркестратор: выбирает агента → генерация → верификация → пользователь. Самообучение через историю + рейтинг + похожие кейсы.
|
||||
- **13 ролевых агентов** — Бизнес-аналитик, Организатор задач, Юрист, Финансовый консультант, Архитектор решений, Тестировщик, UI-дизайнер, SMM-специалист, Лайф-коуч, Эксперт по доступности, Критик, Копирайтер, Хранитель. Каждый с уникальным system prompt из таблицы.
|
||||
- **Верификация ответов** — встроена в Дирижёра: LLM проверяет ответ (галлюцинации, противоречия, ошибки) → confidence (0-100) → автокоррекция / предупреждение / запрос уточнения.
|
||||
- **Рейтинг от пользователя** — POST /voice/rate, 5 звёзд на фронтенде, сохранение в БД.
|
||||
- **Голосовые команды (useVoiceCommands)** — фоновый SpeechRecognition (continuous) слушает «Стоп», «Повтори», «Уточнить». Работает параллельно с TTS.
|
||||
- **Confidence badge** — зелёный/жёлтый/красный индикатор на каждом ответе.
|
||||
- **Обновлены модели** — ConductorInteraction (confidence_score, verification_status).
|
||||
- **Обновлена миграция** — +2 колонки в conductor_interactions.
|
||||
|
||||
**Статус:** действует
|
||||
|
||||
---
|
||||
|
||||
## Формат записи
|
||||
|
||||
```markdown
|
||||
## YYYY-MM-DD: Название
|
||||
|
||||
**Контекст:** Почему встал вопрос
|
||||
**Решение:** Что выбрали
|
||||
**Альтернативы:** Что рассматривали
|
||||
**Статус:** действует | пересмотреть через N | заменено
|
||||
```
|
||||
Reference in New Issue
Block a user