Career Quest
Full-stack MVP: сотрудник получает 1–3 объяснимых шага развития под карьерную цель с прогнозом прироста навыков и готовности.
О проекте
Команда: Tebiren team
Кейс HackAlem.ai: Менеджмент — Halyk Bank · кейс 1
Стадия: Доведённый продукт
Задача кейса: «Career Quest»: AI-навигатор, связывающий навыки сотрудника с шагами развития
Суть
Full-stack MVP: сотрудник получает 1–3 объяснимых шага развития под карьерную цель с прогнозом прироста навыков и готовности. HR видит распространённые разрывы навыков, участие и сотрудников без следующего шага.
Как устроено
Backend на FastAPI загружает JSON/CSV (200 сотрудников, 40 активностей, 60 навыков, 2743 записи участия). Он определяет цель (указанную или следующий грейд), фильтрует допустимые активности (роль, грейд, даты, повторы, без обязательных HR-мероприятий) и ранжирует их по покрытию разрывов, критичности навыков, истории и ожидаемому приросту. Готовность считается как покрытие требований (вес 1.5 для критичных навыков). OpenAI только выбирает порядок разрешённых фактов для объяснения, при сбое остаются алгоритмические объяснения. Выполнение активности пересчитывает навыки и начисляет значки.
Ключевые решения
- rule-based eligibility + скоринг
- взвешенная готовность (критичные 1.5)
- ограниченное LLM-объяснение с fallback
- геймификация (значки)
Особенности
Явные коды причин отсутствия рекомендации (no_target, target_met, no_eligible_activity). Прогноз и выполнение используют одну формулу прироста, повторное выполнение не начисляет прогресс дважды. README на трёх языках (ru/kk/en).
Стек
Python · FastAPI · SQLite · React · TypeScript · Vite · Tailwind CSS
Модели
gpt-4o-mini
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-ee7243a5-tebiren-team.
README
README.mdCareer Quest
Понятный следующий шаг в карьере
HackAlem AI · команда Tebiren · работающий full-stack MVP
Career Quest превращает профиль сотрудника, требования целевой роли и историю обучения в 1–3 объяснимых шага развития. Сотрудник видит, что делать дальше и какие навыки это улучшит; HR — где команде нужна поддержка.

Реальный интерфейс на синтетическом стартовом наборе. Скриншоты сняты с отдельным backend и чистой локальной базой, без изменения рабочего демо.
Быстрый запуск · Как работает AI · Демо для жюри · Проверки · Документация
Зачем это нужно
Каталог курсов сам по себе не отвечает на вопрос: «Что поможет именно мне перейти на следующий уровень?» Рекомендация только по самому слабому навыку тоже не учитывает карьерную цель, критичность навыка и прошлое участие.
Career Quest связывает эти данные в один сценарий:
Профиль → карьерная цель → разрывы навыков → следующий шаг → выполнение → обновлённый прогресс.
Рекомендации предназначены для поддержки развития. Показатель готовности не является решением о повышении, оценкой ценности сотрудника или прогнозом его увольнения.
Как работает решение
- Входные данные: профиль сотрудника и оценки навыков, требования целевой роли, каталог активностей и история участия из JSON/CSV.
- Пользователь: входит в приложение; сотрудник открывает свой профиль, HR может выбрать другой профиль или импортировать новые данные.
- Подбор: по кнопке Find my next step backend проверяет ограничения, сопоставляет навыки с целью и выбирает до трёх полезных активностей.
- Результат: интерфейс показывает основания рекомендации, ожидаемый прирост навыков и текущую готовность к цели; при доступном OpenAI добавляется AI-объяснение.
- Обратная связь: после симуляции выполнения backend сохраняет историю, пересчитывает навыки и достижения; HR видит обновлённые агрегаты участия.
Что уже работает
| Для сотрудника | Для HR |
|---|---|
| Текущая роль, грейд и карьерная цель | Поиск и просмотр профилей сотрудников |
| Разрывы навыков и прозрачный расчёт готовности | Наиболее распространённые разрывы навыков |
| До трёх подходящих активностей с основаниями | Участие по всем 40 активностям и шести статусам |
| Прогноз изменения навыков до выполнения | Список сотрудников без следующего шага с причинами |
| Симуляция выполнения, история и сохранение прогресса | Атомарный импорт сотрудников и истории из JSON/CSV |
| Два значка за завершённые активности | Сброс демо с подтверждением |
Реальные API и сохранение в SQLite. Обычный запуск не использует frontend-моки. Сотрудник видит только себя, HR — все профили демо.
Геймификация, связанная с действиями
- First step — завершена хотя бы одна добровольная активность.
- Building momentum — завершены три разные добровольные активности.
- После выполнения — короткая анимация и фактическое изменение навыков и готовности.
- Значки учитывают сохранённую историю. Повторы одной активности и обязательное HR-обучение не увеличивают счётчик; игровые бонусы не подменяют реальные расчёты.
Посмотреть достижения в интерфейсе

HR: общая картина и конкретные профили

Отсутствие следующего шага не интерпретируется как отсутствие мотивации: это может быть отсутствие цели, уже выполненные требования или ограничение каталога.
Быстрый запуск
Требования
- Node.js 22.12+ и npm; проверено на Node.js 24.14.1.
- Python 3.11+; проверено на Python 3.12.14.
- Git. Интернет нужен для первоначальной установки зависимостей; OpenAI — необязательная интеграция.
Команды ниже — для Windows / PowerShell. Выполняйте их из корня репозитория, где находится package.json.
1. Получить проект и зависимости
git clone https://github.com/BAITC-Hacks/hack-ee7243a5-tebiren-team.git
cd hack-ee7243a5-tebiren-team
npm ci
py -3 -m venv backend/.venv
& .\backend\.venv\Scripts\python.exe -m pip install -r backend/requirements.txt
Если репозиторий уже склонирован, повторное клонирование не нужно.
2. Создать локальные аккаунты
npm run setup:demo
Настройка попросит ID сотрудника (Enter → E0002) и два пароля длиной не менее 12 символов с подтверждением.
| Логин | Доступ | Пароль |
|---|---|---|
hr | HR-панель, все профили, импорт | Задаётся при настройке |
employee | Только выбранный профиль сотрудника | Задаётся при настройке |
Общих опубликованных паролей нет. В базе сохраняются солёные хеши. Повторная настройка с подтверждением заменяет пароли и отзывает прежние сессии.
3. Запустить приложение
npm run dev
| Сервис | Адрес |
|---|---|
| Приложение | http://127.0.0.1:5173 |
| Проверка backend | http://127.0.0.1:8000/api/health |
| Swagger / OpenAPI | http://127.0.0.1:8000/docs |
Одна команда запускает frontend и backend. Ctrl+C останавливает созданные ею процессы. Если порт занят, сначала проверьте: возможно, приложение уже работает. Не запускайте второй экземпляр на тех же портах.
Другие порты и Linux / macOS
Свободные порты в текущем PowerShell:
$env:CQ_FRONTEND_PORT="5179"
$env:CQ_BACKEND_PORT="8010"
npm run dev
Для Linux / macOS после клонирования:
npm ci
python3 -m venv backend/.venv
backend/.venv/bin/python -m pip install -r backend/requirements.txt
npm run setup:demo
npm run dev
Скрипт запуска поддерживает эти пути, но чистая установка на Linux/macOS в рамках текущей проверки не выполнялась.
Как работает AI
В MVP используется алгоритмический подбор + ограниченное AI-объяснение. Карьерные требования, числа и допустимость активности остаются проверяемыми.
- Цель. Backend использует указанную карьерную цель или следующий грейд текущей роли.
- Допустимость. Проверяет роль, грейд, необходимые навыки, даты сессий, историю и возможность повторного участия. Обязательные HR-мероприятия исключены из персонального подбора.
- Ранжирование. Оценивает покрытие разрывов, критичные навыки, похожую историю участия и ожидаемый прирост.
- Объяснение. OpenAI выбирает порядок разрешённых фактов и акцент; backend собирает дополнительный текст из проверенных оснований.
- Защита от сбоев. При отсутствии ключа, ошибке, недопустимом ответе или таймауте сохраняются алгоритмические рекомендации и объяснения.
AI не создаёт новые задания, не меняет рейтинг активностей, навыки или грейд и не принимает кадровых решений. Каталог содержит заранее описанные активности; формы добавления новых активностей для HR пока нет.
Подключение OpenAI — необязательно
Создайте локальный backend/.env по образцу backend/.env.example, не перезаписывая существующие настройки:
OPENAI_API_KEY=your_private_key_here
OPENAI_MODEL=gpt-4o-mini
Перезапустите приложение. Ключ читает только backend; не добавляйте его в переменные VITE_..., исходники или коммиты. Локальные .env исключены из Git.
Без ключа это по-прежнему реальный backend, а не mock-режим. Общий бюджет ожидания AI-объяснения — 7 секунд. openai_enabled=true в health подтверждает наличие конфигурации, но не успешный запрос к модели.
Отдельная live-проверка использует API и может расходовать средства:
npm run check:openai
Настройка ключа через приватный файл, таймауты и детали расчётов — в руководстве.
Данные и интеграции
200 сотрудников · 40 активностей · 60 навыков · 2 743 записи участия.
Это синтетический набор хакатона. Все расчёты привязаны к дате снимка 2026-10-01, а не к текущим часам компьютера.
Исходные файлы: employees.json, skills.json, events.json и activity_history.csv. Документация набора находится в dataset, backend загружает свою копию из backend/data.
Из внешних сервисов используются OpenAI API для необязательного объяснения и Google Fonts для шрифтов интерфейса. Подключений к реальной кадровой системе или корпоративной LMS нет. Примеры в examples/jury — локальные синтетические проверки, не скрытые данные жюри.
- Прогноз и выполнение используют одну формулу прироста; потолок курса не может снизить уже достигнутый уровень.
- Готовность отражает покрытие требований цели: критичные навыки имеют вес 1.5, остальные — 1.
Complete activity— демо-симуляция, не подтверждение посещения курса или независимая оценка знаний.- Импорт, выполнения, аккаунты и сессии сохраняются в
backend/var/career-quest.sqlite3; исходные файлы набора не изменяются. - Повтор одного запроса выполнения не начисляет прогресс дважды. База рассчитана на один процесс backend.
Почему иногда нет следующего шага?
| Причина API | Значение |
|---|---|
no_target | Карьерная цель не определена |
target_met | Требования целевой роли уже выполнены |
no_eligible_activity | Разрывы остались, но в каталоге нет допустимой активности с полезным приростом |
Это предусмотренные состояния, а не случайные заглушки. Повторный поиск без изменения данных не создаёт новый курс.
Демо для жюри
Ориентир — 3–5 минут, на отдельной или заранее подготовленной локальной базе.
- Войти как HR. На исходном наборе выбрать E0002: показать карьерную цель, готовность и критичные разрывы.
- Нажать Find my next step. Объяснить, почему возвращённая активность подходит, и показать прогноз навыков.
- Выполнить один действительно предложенный шаг. Сопоставить прогноз с фактическими изменениями, показать историю и достижения.
- Открыть HR overview: общие разрывы, участие и причины отсутствия следующего шага.
- При необходимости импортировать проверочные профили: E9001 — критичные разрывы и пропуски, E9002 — переход в другую роль, E9003 — отсутствие цели.
- Войти как employee, чтобы показать доступ только к собственному профилю.
Если на вашем E0002 активности уже выполнены, выберите другой профиль с рекомендациями или заранее подготовьте отдельную БД. Не сбрасывайте рабочее демо ради показа без резервной копии. Значки за исходную историю могут быть открыты сразу; для показа первого открытия нужен профиль без завершённых добровольных активностей.
Импорт поддерживает employees.json и activity_history.csv; добавление новых курсов через импорт пока не реализовано. Ошибка любой записи отменяет весь импорт, существующие ID не перезаписываются.
Архитектура
flowchart LR
UI["React + TypeScript<br/>Сотрудник / HR"] -->|"same-origin /api"| API["FastAPI<br/>Сессия, права, валидация"]
API --> Engine["Подбор и расчёт прогресса"]
Engine --> Catalog["Синтетический каталог<br/>Роли, навыки, активности"]
API <-->|"История, импорт, аккаунты"| DB[("SQLite")]
Engine -->|"Разрешённые факты"| AI["OpenAI · optional"]
AI -->|"Проверяемый план объяснения"| Engine
| Слой | Технологии |
|---|---|
| Интерфейс | React, TypeScript, Vite, React Router, Recharts, CSS / SVG |
| API и бизнес-логика | Python, FastAPI, Pydantic |
| Хранение | SQLite, транзакции и идемпотентные выполнения |
| AI | OpenAI Python SDK / API; gpt-4o-mini в примере конфигурации, выбор через OPENAI_MODEL; проверка результата и fallback |
| Проверки | pytest, Node.js test runner, TypeScript, проверки браузера |
src/ React UI, API-клиент, достижения
backend/app/ API, авторизация, подбор, прогресс и хранение
backend/data/ Исходный набор для backend
backend/tests/ Автоматические тесты и отдельный fault-стенд
tests/ Frontend-проверки логики геймификации
dataset/ Стартовый набор и документация хакатона
examples/jury/ Синтетические профили для демонстрации импорта
scripts/ Единый запуск и настройка локальных аккаунтов
docs/ ТЗ, отчёты проверки, руководство и скриншоты
Проверки
Последний локальный прогон 23 сентября 2026:
| Проверка | Результат |
|---|---|
npm run test:backend | 57 passed |
npm run test:frontend | 11 passed |
npm run build | TypeScript и production-сборка проходят |
| Проверки браузера | Профиль, выполнение, импорт, HR, роли, сохранение и достижения |
npm run test:backend
npm run test:frontend
npm run build
Тесты изолированы от рабочей базы и не выполняют платных AI-запросов. Проверки браузера описаны в отчётах; это не полный автоматический E2E-набор. В pytest есть одно предупреждение о будущем изменении тестового транспорта Starlette; тесты проходят.
Ранее отдельно проверен настоящий вызов OpenAI: три объяснения с источником openai, без изменения рангов, фактов и прогноза. Это результат конкретного прогона, а не гарантия доступности провайдера. Подробности: основная проверка и проверка геймификации.
Границы MVP и следующие шаги
Сейчас: локальная демонстрация на синтетических данных, англоязычный desktop-first интерфейс, две роли и два значка. Сессии используют HttpOnly-cookie, изменяющие запросы защищены CSRF; секреты и локальная база не входят в репозиторий.
Ещё не реализовано:
- создание и редактирование активностей через HR-панель;
- изменение карьерной цели через интерфейс;
- интеграция с LMS/HRIS и подтверждение реального прохождения обучения;
- SSO, production-развёртывание, поддержка нескольких backend-процессов;
- игровая экономика, XP, магазин наград и рейтинги сотрудников.
Первый следующий шаг — управление каталогом для HR, чтобы расширять доступные маршруты без изменения файлов данных. Текущая версия не заявляется как готовая промышленная кадровая система.
Развёрнутая версия
Ссылка на публично развёрнутую версию в репозитории не указана. Подтверждённый способ проверки — локальный запуск по инструкции выше: Career Quest на 127.0.0.1:5173. Этот адрес доступен только на компьютере, где запущено приложение; это не публичное демо.
Документация
- Локальная разработка: команды, доступ, OpenAI, формулы, резервные копии
- Основное ТЗ и отчёт проверки
- ТЗ мини-геймификации и отчёт проверки
- Backend и API
- Описание стартового набора
- Примеры импорта для демонстрации
Tebiren · HackAlem AI
Карьерная цель становится понятнее, когда виден следующий конкретный шаг.
Авторы коммитов
История коммитов
- 2026-09-23 17:53docs: add Kazakh and English README translationsAmir Amanbekov
- 2026-09-23 17:41Add mini gamification and jury-ready README with screenshotsdestinesia
- 2026-09-23 17:12Implement Career Quest core readinessdestinesia
- 2026-09-23 15:49Add Career Quest backendAmir Amanbekov
- 2026-09-23 15:22Adapt frontend to backend APIdestinesia
- 2026-09-23 14:47Build Career Quest frontenddestinesia
Структура репозитория (98 файлов)
.env.example .gitignore README.en.md README.kk.md README.md backend/.env.example backend/.gitignore backend/README.md backend/app/__init__.py backend/app/auth.py backend/app/config.py backend/app/data_loader.py backend/app/main.py backend/app/recommendation/__init__.py backend/app/recommendation/engine.py backend/app/recommendation/explainer.py backend/app/recommendation/scoring.py backend/app/schemas.py backend/app/services/development.py backend/app/services/hr.py backend/app/services/import_service.py backend/app/services/progress.py backend/app/services/runtime_state.py backend/app/setup_demo.py backend/check_openai.py backend/data/README.kz.md backend/data/README.md backend/data/README.ru.md backend/data/activity_history.csv backend/data/employees.json backend/data/events.json backend/data/skills.json backend/requirements.lock backend/requirements.txt backend/tests/__init__.py backend/tests/conftest.py backend/tests/test_api.py backend/tests/test_core.py backend/tests/test_development.py backend/tests/test_readiness.py backend/tests/ui_harness.py dataset/README.kz.md dataset/README.md dataset/README.ru.md dataset/activity_history.csv dataset/employees.json dataset/events.json dataset/skills.json docs/CORE_ACCEPTANCE.md docs/LOCAL_DEVELOPMENT.md docs/MINI_GAMIFICATION_ACCEPTANCE.md docs/TZ_CORE_READINESS.md docs/TZ_MINI_GAMIFICATION.md docs/images/achievements.png docs/images/employee-journey.png docs/images/hr-overview.png examples/jury/README.md examples/jury/activity_history.csv examples/jury/employees.json index.html package-lock.json package.json postcss.config.js scripts/dev.mjs src/App.tsx src/api/client.ts src/api/types.ts src/components/common/Badge.tsx src/components/common/Icons.tsx src/components/common/Modal.tsx src/components/common/States.tsx src/components/employee/Achievements.tsx src/components/employee/ActivityHistory.tsx src/components/employee/CareerPath.tsx src/components/employee/CompletionCelebration.tsx src/components/employee/EmployeeHeader.tsx src/components/employee/EmployeeSelector.tsx src/components/employee/ProgressIndicator.tsx src/components/employee/RecommendationCard.tsx src/components/employee/SkillGapList.tsx src/components/employee/gamification.css src/components/import/ImportDialog.tsx src/components/layout/AppShell.tsx src/components/layout/Topbar.tsx src/gamification/achievements.ts src/main.tsx src/mock/mockApi.ts src/pages/EmployeePage.tsx src/pages/HRPage.tsx src/readiness.css src/styles.css src/vite-env.d.ts tailwind.config.js tests/gamification.test.mjs tsconfig.app.json tsconfig.json tsconfig.node.json vite.config.ts
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.