CareerFlow — AI-карьерный навигатор в формате Telegram Mini App. Диагностика навыков, 197 профессий, интерактивные тесты-сценарии, AI-анализ и рекомендации.
- Что умеет
- Архитектура
- Быстрый старт
- Структура проекта
- Backend API
- База данных
- Фронтенд
- Сервисы
- Telegram бот
- Деплой
- Переменные окружения
- Troubleshooting
- 10 вопросов — определение подходящих категорий и ролей
- Автоматический скоринг по 30 категориям (IT, дизайн, финансы и др.)
- Рекомендация топ-12 профессий из базы 197 ролей
- 197 ролей с уникальными вопросами и ситуациями
- Мгновенный rule-based скоринг (< 50ms)
- Фоновый AI-анализ результатов (сильные/слабые стороны, рекомендации)
- Уровни: Junior / Middle
- Ежедневная ситуация для прокачки
- AI-оценка ответа
- Streak-система (серия дней подряд)
- 16 бейджей: первый шаг, streak 3/7/30 дней, перфекционист, отличник и др.
- Автоматическая разблокировка
- Поиск реальных вакансий через
api.hh.ru - Матчинг с навыками пользователя
- Зарплатные вилки, недостающие навыки
- Персональные ответы о карьере с учётом профиля
- Сохранение истории чата (контекст 5 сообщений)
- Онбординг: образование, опыт, навыки, интересы, цели
- Рейтинг пользователей по среднему баллу
- Перетест с кулдауном 7 дней
┌─────────────────────────────────────────────────────────────┐
│ Telegram Mini App │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Frontend │◄──►│ React + │◄──►│ Vite Dev │ │
│ │ (SPA) │ │ Vite │ │ Server :5173 │ │
│ └──────┬───────┘ └──────────────┘ └──────────────┘ │
│ │ HTTP/JSON │
│ ▼ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Backend │◄──►│ FastAPI │◄──►│ Uvicorn │ │
│ │ API │ │ :8000 │ │ Server │ │
│ └──────┬───────┘ └──────────────┘ └──────────────┘ │
│ │ │
│ ┌────┴────┬────────────┬──────────┐ │
│ ▼ ▼ ▼ ▼ │
│ ┌──────┐ ┌──────┐ ┌──────────┐ ┌──────────┐ │
│ │SQLite│ │Open- │ │ HH.ru │ │ Telegram │ │
│ │ DB │ │Router│ │ API │ │ Bot API │ │
│ └──────┘ └──────┘ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────────────────────┘
cp .env.example .env # или создать .env вручнуюЗаполнить .env (см. раздел Переменные окружения).
Backend:
pip install -r requirements.txtFrontend:
cd frontend
npm install| Терминал | Команда | Порт |
|---|---|---|
| Backend | cd backend && uvicorn main:app --reload --port 8000 |
8000 |
| Frontend | cd frontend && npm run dev |
5173 |
| Bot (опционально) | cd bot && python bot.py |
— |
# Backend health
curl http://localhost:8000/api/health
# → {"status": "ok", "service": "CareerFlow"}
# Diagnostic questions
curl http://localhost:8000/api/onboarding/questions
# → {"questions": [...], "count": 10}
# Frontend
open http://localhost:5173c:\vscode\elkincode\
├── .env # Секретные ключи (НЕ коммитить!)
├── .gitignore
├── amvera.yml # Конфиг деплоя на Amvera
├── main.py # Точка входа для деплоя (backend + bot)
├── requirements.txt # Python зависимости
├── README.md # Этот файл
├── DEV_DOCS.md # Полная документация разработчика
│
├── backend/ # FastAPI сервер
│ ├── main.py # FastAPI приложение (CORS, роуты, startup)
│ ├── server.py # Unified: FastAPI + Telegram бот в одном процессе
│ ├── bot.py # Telegram бот (автономный запуск)
│ ├── api/ # API роутеры (11 штук)
│ │ ├── __init__.py
│ │ ├── user.py # Профиль, онбординг, статистика
│ │ ├── career.py # AI анализ карьеры
│ │ ├── vacancies.py # HH.ru вакансии
│ │ ├── chat.py # AI чат-наставник
│ │ ├── scenarios.py # Сценарии, лидерборд, перетест
│ │ ├── roles.py # Rule-based матчинг, скоринг, AI-анализ
│ │ ├── onboarding.py # Диагностика, вопросы, рекомендации
│ │ ├── daily_challenge.py # Ежедневные челленджи, streak
│ │ ├── achievements.py # Бейджи/достижения
│ │ └── telegram_api.py # Telegram WebApp auth, валидация, аватар
│ ├── database/
│ │ └── db.py # SQLite async (12 таблиц)
│ ├── models/
│ │ └── models.py # Pydantic модели
│ ├── services/ # Бизнес-логика
│ │ ├── __init__.py
│ │ ├── ai_service.py # OpenRouter AI (основная + fallback)
│ │ ├── role_matcher.py # Rule-based матчинг ролей (0-100 баллов)
│ │ ├── scenario_scorer.py # Скоринг сценариев (ситуация + тест)
│ │ ├── diagnostic_scorer.py # Диагностический скоринг (10 вопросов)
│ │ ├── daily_challenge_service.py # AI-генерация daily challenge
│ │ ├── achievement_service.py # Система бейджей (16 штук)
│ │ ├── hh_service.py # HH.ru API клиент с кэшем
│ │ ├── matching_service.py # Матчинг вакансий (AI + simple)
│ │ ├── async_analyzer.py # Фоновый AI-анализ сценариев
│ │ └── telegram_auth.py # HMAC-SHA256 валидация initData
│ ├── data/ # Статические данные
│ │ ├── roles_database.json # 197 ролей в 30 категориях
│ │ ├── diagnostic_questions.json # 10 вопросов с баллами
│ │ ├── scenarios_primary.json # Первичные сценарии
│ │ ├── scenarios_from_hh.json # Сценарии из HH.ru
│ │ └── hh_requirements.json # Требования из HH.ru
│ └── scripts/
│ ├── roles_data.py # Исходные данные 300+ ролей
│ └── generate_roles_db.py # Генератор roles_database.json
│
├── frontend/ # React SPA (Vite)
│ ├── index.html # Точка входа + Telegram WebApp SDK
│ ├── package.json # Node зависимости
│ ├── vite.config.js # Dev-сервер + прокси /api
│ └── src/
│ ├── main.jsx # Точка входа React
│ ├── App.jsx # Роутинг + Telegram Context
│ ├── index.css # Стили (тёмная тема + MTS дизайн)
│ ├── api/
│ │ └── client.js # API клиент (~35 методов)
│ ├── hooks/
│ │ └── useTelegramAuth.js # Хук авторизации
│ ├── components/
│ │ └── BottomNav.jsx # Нижняя навигация (4 вкладки)
│ └── pages/
│ ├── DiagnosticTest.jsx # Диагностика (10 вопросов)
│ ├── ScenarioRunner.jsx # Тест-сценарий
│ ├── CareerPath.jsx # Карьерный путь + результаты
│ ├── RoleSelection.jsx # Выбор ролей
│ ├── Onboarding.jsx # Упрощённый онбординг (3 шага)
│ ├── Dashboard.jsx # Профиль + daily + достижения
│ ├── Vacancies.jsx # Поиск вакансий HH.ru
│ └── Chat.jsx # AI-наставник
│
└── bot/
└── bot.py # Telegram бот (/start, /help, daily reminders)
GET /api/health
→ {"status": "ok", "service": "CareerFlow"}
| Метод | Endpoint | Описание |
|---|---|---|
| POST | /api/user/onboarding |
Сохранение данных онбординга |
| GET | /api/user/profile/{telegram_id} |
Получение профиля |
| GET | /api/user/stats/{telegram_id} |
Статистика профиля |
| Метод | Endpoint | Описание |
|---|---|---|
| GET | /api/onboarding/questions |
10 диагностических вопросов |
| POST | /api/onboarding/diagnostic |
Запуск диагностики |
| GET | /api/onboarding/diagnostic-result/{telegram_id} |
Результат диагностики |
| POST | /api/onboarding/save-profile |
Сохранение профиля |
| Метод | Endpoint | Описание |
|---|---|---|
| POST | /api/roles/match |
Матчинг ролей для пользователя |
| GET | /api/roles/all |
Все 197 ролей |
| GET | /api/roles/search?q= |
Поиск ролей |
| GET | /api/roles/scenario/{role_id}?level= |
Сценарий для роли |
| POST | /api/roles/score |
Скоринг ответов (rule-based, < 50ms) |
| GET | /api/roles/ai-analysis/{telegram_id} |
Фоновый AI-анализ |
| Метод | Endpoint | Описание |
|---|---|---|
| GET | /api/scenarios/my-scenarios/{telegram_id} |
Результаты пользователя |
| GET | /api/scenarios/leaderboard |
Топ по среднему баллу |
| GET | /api/scenarios/retest-status/{telegram_id} |
Статус перетеста |
| POST | /api/scenarios/retest-start/{telegram_id} |
Начало перетеста |
| POST | /api/scenarios/retest-complete/{telegram_id} |
Завершение перетеста |
| POST | /api/scenarios/scenarios/save-answers |
Сохранение ответов |
| Метод | Endpoint | Описание |
|---|---|---|
| POST | /api/career/analyze |
AI анализ карьеры |
| GET | /api/career/result/{telegram_id} |
Результат анализа |
| POST | /api/career/quick-match |
Быстрый матчинг |
| Метод | Endpoint | Описание |
|---|---|---|
| GET | /api/vacancies/search?profession=&location=&limit= |
Поиск на HH.ru |
| POST | /api/vacancies/match |
Матчинг вакансий |
| GET | /api/vacancies/mts |
Вакансии МТС |
| Метод | Endpoint | Описание |
|---|---|---|
| POST | /api/chat/message |
Сообщение в AI-чат |
| GET | /api/chat/history/{telegram_id} |
История чата |
| Метод | Endpoint | Описание |
|---|---|---|
| GET | /api/daily/challenge?telegram_id= |
Ситуация дня |
| POST | /api/daily/answer |
Ответ на ситуацию |
| GET | /api/daily/streak?telegram_id= |
Текущая серия |
| Метод | Endpoint | Описание |
|---|---|---|
| GET | /api/achievements/list?telegram_id= |
Список достижений |
| Метод | Endpoint | Описание |
|---|---|---|
| POST | /api/telegram/auth |
Авторизация через initData |
| GET | /api/telegram/avatar/{telegram_id} |
Аватар через Bot API |
| GET | /api/telegram/profile/{telegram_id} |
Профиль Telegram |
Движок: SQLite (async через aiosqlite)
Файл: career_navigator.db (создаётся автоматически)
| Таблица | Описание |
|---|---|
users |
Профиль пользователя |
career_analyses |
AI-анализы карьеры |
vacancy_matches |
Матчинг вакансий |
chat_history |
История чата с AI |
scenario_results |
Результаты сценариев |
retest_cooldowns |
Кулдаун перетеста (7 дней) |
scenario_answers |
Сырые ответы (ждут AI-анализа) |
generated_scenarios |
Кэш AI-сценариев |
ai_analyses |
AI-анализы результатов сценариев |
daily_challenges |
Ежедневные челленджи + ответы |
user_achievements |
Разблокированные бейджи |
diagnostic_results |
Результаты диагностики |
| Путь | Компонент | BottomNav |
|---|---|---|
/ |
→ /diagnostic |
— |
/diagnostic |
DiagnosticTest |
— |
/onboarding |
Onboarding |
— |
/role-selection |
RoleSelection |
— |
/scenario-runner |
ScenarioRunner |
— |
/career |
CareerPath |
✅ |
/dashboard |
Dashboard |
✅ |
/vacancies |
Vacancies |
✅ |
/chat |
Chat |
✅ |
import { api } from '../api/client'
// Примеры
const questions = await api.getDiagnosticQuestions()
const result = await api.runDiagnostic(answers)
const roles = await api.matchRoles()
const scenario = await api.getScenario('python_dev', 'junior')
const score = await api.scoreScenario('python_dev', 'junior', answers)
const vacancies = await api.searchVacancies('Python', 'Москва')- Тёмная тема — фон
#18181B, карточки#27272A - MTS Red
#E30611— акцентный цвет - Градиенты, красное свечение, адаптив для мобильных
10 вопросов → баллы по 30 категориям → топ-5 → маппинг на 197 ролей → топ-12 рекомендаций.
Скоринг 0-100: навыки (0-30) + поле (0-30) + интересы (0-20) + опыт (0-20). Порог: 10 баллов.
Rule-based: каждый вариант = 0-20 баллов. Процент = (сумма / макс) × 100. Уровни: ≥80 «Отличный», ≥60 «Хороший», ≥40 «Средний», <40 «Нужно подтянуть».
Фоновый AI-анализ после скоринга. Не блокирует ответ (< 50ms rule-based). Сохраняет: strengths, weaknesses, recommendations, next_role.
OpenRouter AI с fallback:
- Основная:
qwen/qwen3.6-plus:free - Fallback:
stepfun/step-3.5-flash:free - Автопереключение при ошибках + демо-данные при недоступности.
Поиск вакансий через api.hh.ru. Кэш городов (TTL 1ч), кэш результатов (TTL 5мин), retry при 429.
AI-генерация ситуации дня, оценка ответа, streak-система.
16 бейджей: first_diagnostic, first_test, high_avg, streak_3, streak_7, streak_30, test_5, test_10, perfectionist и др.
HMAC-SHA256 валидация initData (официальный алгоритм Telegram). Fallback non-strict для разработки.
| Команда | Описание |
|---|---|
/start |
Приветствие + кнопка «Открыть CareerFlow» |
/help |
Инструкция по использованию |
Ежедневная рассылка в 10:00 всем пользователям из БД.
- Вместе с API —
python server.py(бот в daemon-потоке) - Отдельно —
python bot.py(polling в async loop) - Для деплоя —
python main.pyиз корня (alias наserver.py)
amvera.yml:
meta:
environment: python
toolchain:
name: pip
version: 3.13
build:
requirementsPath: requirements.txt
run:
scriptName: main.py
persistenceMount: /data
containerPort: 8000Деплой:
git push amvera mainEnvironment Variables
OPENROUTER_API_KEY=sk-or-v1-...
OPENROUTER_MODEL=qwen/qwen3.6-plus:free
OPENROUTER_MODEL_FALLBACK=stepfun/step-3.5-flash:free
TG_BOT_TOKEN=123456789:ABC...
HH_USER_AGENT=CareerFlow/1.0
DATABASE_PATH=/data/career_navigator.db
BACKEND_URL=https://your-app.amvera.io
FRONTEND_URL=https://your-frontend.vercel.app
WEBAPP_URL=https://your-frontend.vercel.app
cd frontend
npm run build
vercel --prodEnvironment Variable:
VITE_API_URL=https://your-backend.amvera.io/api
URL бэкенда жёстко прописан в
frontend/src/api/client.js— обновить при смене домена.
| Переменная | Обязательна | Описание | Пример |
|---|---|---|---|
OPENROUTER_API_KEY |
✅ | Ключ OpenRouter AI | sk-or-v1-... |
OPENROUTER_MODEL |
Основная модель | qwen/qwen3.6-plus:free |
|
OPENROUTER_MODEL_FALLBACK |
Резервная модель | stepfun/step-3.5-flash:free |
|
TG_BOT_TOKEN |
✅ | Токен Telegram бота | 123456:ABC... |
HH_USER_AGENT |
✅ | User-Agent для HH.ru | CareerFlow/1.0 (email@example.com) |
BACKEND_URL |
URL бэкенда | https://app.amvera.io |
|
FRONTEND_URL |
URL фронтенда | https://app.vercel.app |
|
WEBAPP_URL |
✅ | URL Mini App (из бота) | https://app.vercel.app |
DATABASE_PATH |
Путь к SQLite БД | /data/career_navigator.db |
| Сервис | URL | Стоимость |
|---|---|---|
| OpenRouter | https://openrouter.ai/keys | Бесплатно, без карты |
| Telegram Bot | @BotFather → /newbot |
Бесплатно |
| HH.ru | Не требует ключа | Бесплатно |
| Технология | Версия | Назначение |
|---|---|---|
| Python | 3.10+ | Язык |
| FastAPI | 0.115+ | REST API |
| Uvicorn | 0.30+ | ASGI сервер |
| AsyncOpenAI | 1.50+ | OpenRouter AI |
| HTTPX | 0.27+ | Асинхронные HTTP |
| AioSQLite | 0.20+ | Async SQLite |
| Pydantic | 2.10+ | Валидация |
| python-dotenv | 1.0+ | Загрузка .env |
| python-telegram-bot | 21.6+ | Telegram бот |
| Технология | Версия | Назначение |
|---|---|---|
| React | 18.3+ | UI |
| Vite | 5.4+ | Сборка + dev сервер |
| React Router | 6.26+ | Роутинг |
| Telegram WebApp SDK | 7.0+ | Интеграция |
# Windows
netstat -ano | findstr :8000
taskkill /F /PID <PID>- Убедиться, что директория
/dataсуществует (Amvera создаёт автоматически черезpersistenceMount) - Локально:
DATABASE_PATH=career_navigator.db(без/data/)
- Проверить
API_BASEвfrontend/src/api/client.js - Убедиться, что CORS настроен (
allow_origins=["*"]) curl http://localhost:8000/api/health→{"status": "ok"}
- Проверить токен:
python -c "import os; from dotenv import load_dotenv; load_dotenv(); print(os.getenv('TG_BOT_TOKEN'))" - Убедиться, что бот активен через @BotFather
- Логи:
python bot.py→ «🤖 Бот запущен!»