docs: add full project documentation

- Architecture: overview, 7 ADR, tech stack
- Principles: code-style, git-workflow, security
- API contracts: auth, profile, tests, admin endpoints
- Database schema: tables, relationships, indexes
- LLM strategy: prompts, fallback, validation, Qwen 2.5 14B
- Onboarding: setup, Docker, .env template
- Progress: roadmap, changelog
- Agents: context, backend instructions

Made-with: Cursor
This commit is contained in:
Anton
2026-03-04 12:07:17 +03:00
commit 99cd8ae727
21 changed files with 3763 additions and 0 deletions

View File

@@ -0,0 +1,45 @@
# ADR-005: Абстракция LLM через LlmService
## Статус
Принято
## Контекст
Приложение использует LLM для генерации вопросов, проверки ответов и рекомендаций. Нужна возможность менять провайдера без изменения бизнес-логики.
## Решение
Весь доступ к LLM только через `LlmService`. Конфигурация провайдера — через переменные окружения:
```
LLM_BASE_URL=http://localhost:11434/v1 # Ollama (runtime для backend)
LLM_MODEL=qwen2.5:14b
LLM_API_KEY= # пустой для локального
LLM_TIMEOUT_MS=15000
LLM_MAX_RETRIES=1
```
### Стратегия провайдеров
1. **Dev/test** — локальный LLM (Ollama, LM Studio, vLLM) с OpenAI-совместимым API
2. **Production** — облачный API (OpenAI, Anthropic и др.)
3. Переключение — замена переменных в `.env`, код приложения не меняется
### Интерфейс LlmService
- `generateQuestions(stack, level, count, type)` → structured JSON
- `verifyAnswer(question, userAnswer)` → boolean + explanation
- `getHint(question)` → string
- `getRecommendations(weakTopics)` → string[]
### Fallback
Если LLM недоступен или таймаут — берём вопросы из `question_bank` (предварительно наполненного через тот же LLM и провалидированного вручную).
## Последствия
- Бизнес-код не зависит от конкретного провайдера
- Замена LLM — изменение одного `.env` файла
- Нужен минимальный банк вопросов для fallback до запуска
- Все ответы LLM валидируются по JSON-схеме перед использованием