AAYMA
RU
Войти

Career Quest

HR-дашборд карьерного развития: каталог сотрудников, профиль и готовность к целевому грейду, топ-3 рекомендованных активностей с AI-объяснением…

Рабочий MVP
Команда «q-tokbasy» 3💬 0 комментариевс 23 сентября 2026 г.

О проекте

Команда: q-tokbasy
Кейс HackAlem.ai: Менеджмент — Halyk Bank · кейс 1
Стадия: Рабочий MVP

Задача кейса: «Career Quest»: AI-навигатор, связывающий навыки сотрудника с шагами развития

Суть

HR-дашборд карьерного развития: каталог сотрудников, профиль и готовность к целевому грейду, топ-3 рекомендованных активностей с AI-объяснением, отметка выполнения квеста и HR-сводка по дефицитам навыков.

Как устроено

Датасет кейса (employees, skills, events, activity_history) загружается в FastAPI. Целевой грейд берётся из career_goal или как следующий грейд роли, разрыв считается как gap = max(target − current, 0), готовность — как процент покрытия требований. События фильтруются по аудитории, пререквизитам, обязательности и реальному приросту с учётом max_level. Оставшиеся оцениваются многофакторно до 100 баллов: серьёзность разрыва 35, релевантность грейду 25, реализуемый прирост 20, история участия 10 с учётом давности и статусов, соответствие цели 5, допуск 5. OpenAI (Responses API, strict JSON) лишь поясняет проверенный топ-3, при сбое используется детерминированное объяснение. complete-quest обновляет навыки в памяти и пересчитывает рекомендации.

Ключевые решения

  • multi-factor scoring
  • skill gap analysis
  • recency-weighted participation signal
  • structured outputs
  • deterministic fallback

Особенности

LLM не определяет рекомендации: она получает только разрешённый набор фактов без имени и полного профиля, а её ответ вложен в поле explanation и не может изменить ID события или балл. Прирост навыка считается с учётом ограничения max_level. Объяснения выдаются на ru, kk и en.

Стек

Python · FastAPI · React · Vite · OpenAI SDK · unittest

Модели

gpt-4.1-mini


Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-3dc8cc4f-q-tokbasy.

README

README.md

Career Quest

Career Quest is an HR career development dashboard. It uses the provided synthetic employee, skill, event, and activity datasets to present a searchable team directory, employee development profiles, career readiness, and deterministic activity recommendations.

Run the backend

python -m venv venv
source venv/bin/activate
pip install -r backend/requirements.txt
uvicorn main:app --app-dir backend --reload

The API is available at http://localhost:8000; interactive documentation is at http://localhost:8000/docs.

Run the frontend

cd frontend
npm install
npm run dev

Open http://localhost:5173. To use a different API address, set VITE_API_URL in a local .env file.

API endpoints

  • GET /health
  • GET /api/employees
  • GET /api/employees/{employee_id}
  • GET /api/employees/{employee_id}/career-gap
  • GET /api/employees/{employee_id}/recommendations
  • GET /api/employees/{employee_id}/ai-recommendations
  • POST /api/employees/{employee_id}/complete-quest with {"event_id": "EV_005"}
  • GET /api/events
  • GET /api/skills
  • GET /api/hr/dashboard

HR Dashboard

Switch to HR in the application header to see common target-grade competency gaps, employees without a recommended next step, and aggregate participation and completion statistics. The dashboard uses the same deterministic career-gap logic and in-memory runtime state as the employee experience, so completed quests are reflected immediately.

Recommendation Engine

The recommendation pipeline uses only the supplied Career Quest dataset:

Employee Profile → Target Grade → Skill Gap Analysis → Candidate Events → Participation History → Multi-factor Scoring → Top 3 Recommendations

The employee's explicit career_goal selects the target role and grade when present. Otherwise, the engine derives the next grade from the ordered role profiles in skills.json (a Lead remains at Lead). For every required target skill, it calculates gap = max(target_level - current_level, 0). Career readiness is the percentage of total required proficiency already met:

100 × sum(min(current level, required level)) / sum(required levels)

Mandatory events, events outside the target role and current/target-grade audiences, events whose prerequisites are unmet, previously completed non-recurring events, and events that cannot actually improve a required skill are excluded. Actual improvement always observes the catalog cap:

possible new level = min(current level + event gain, event max_level)
actual gain = possible new level - current level

Each eligible, useful event receives up to 100 points:

FactorPointsCalculation
Target-grade gap severity35Weighted mean of gap / 5 across affected skills
Grade relevance2585% × weighted target-level strength + 15% × useful-gap breadth
Realizable skill gain20Weighted mean of actual_gain / catalog event gain
Participation history105 × (history signal + 1), mapping -1…1 to 0…10
Explicit career-goal relevance5Awarded when the event audience matches the explicit target role
Audience and prerequisite eligibility5Awarded after strict eligibility filtering

Critical target skills have weight 1.5; other required skills have weight 1.0. The history signal is a recency-weighted average for activities of the same real event type. Status weights are: completed +1.0, in progress +0.25, overdue -0.5, dropped -0.6, declined -0.65, and no-show -0.75. Recent records receive more weight, while a person with no similar history gets a neutral five history points. Scores are capped at 100, rounded to one decimal, and ties are broken by event ID.

This is more reliable than recommending the employee's numerically weakest skill because a low skill might not be required by the target role, an event might be capped below the employee's current level, prerequisites or audience may make it unsuitable, or participation patterns may favor another equally useful format. Every output includes its score components, exact skill impacts, event gain/cap, history counts and signal, and factual reasons. There is no randomness, LLM, or external service, so identical data always yields identical recommendations.

AI Career Coach

The optional coach adds a concise, personalized explanation to each of the top three verified recommendations:

Employee Profile → Skill Gap Analysis → Multi-factor Recommendation Engine → Verified Top Recommendations → OpenAI Explanation Layer → Employee-facing Career Coach

The LLM is not the recommendation source of truth. The deterministic engine continues to calculate eligibility, rankings, score components, history signals, and exact skill impacts. OpenAI receives a small allow-listed fact object and only makes those verified results easier to understand. Its response is nested under explanation, so it cannot replace an event ID, score, or skill gain.

Copy the example environment file or set these variables in the backend process (never commit a real key):

OPENAI_API_KEY=
OPENAI_MODEL=gpt-4.1-mini

The configured model defaults to the cost-efficient gpt-4.1-mini. The integration uses the official Python SDK's Responses API with strict structured JSON output. For each recommendation, it sends only role, current/target grade, career goal, preferred language, event ID/title, deterministic score, exact skill impacts, history signal, and deterministic reasons. It does not send names, the full employee record, other employees, or the complete datasets.

Each explanation has this dashboard-oriented shape:

{
  "source": "openai",
  "headline": "Build your System Design skills for Senior",
  "summary": "This quest addresses a verified target-grade skill gap.",
  "why_this_quest": ["It can move System Design from level 2 to level 3."],
  "expected_impact": "System Design: 2 → 3, target 4",
  "career_connection": "This is a concrete step toward the Senior requirement.",
  "history_insight": "Your participation history was included in the score."
}

If the key or SDK is missing, or the API fails, times out, exhausts quota, or returns invalid output, the same endpoint returns a deterministic explanation with "source": "deterministic". The employee dashboard therefore does not depend on OpenAI availability. English (en), Russian (ru), and Kazakh (kk) preferences are passed as output-language instructions; all underlying facts remain unchanged.

Quest Completion and Progress Updates

Iteration 4 adds the complete feedback loop to every recommended quest:

Recommended Quest → Employee completes activity → Apply event gain/max_level → Update runtime skills → Recalculate career readiness → Recalculate recommendations → Refresh AI explanations

POST /api/employees/{employee_id}/complete-quest accepts an event_id, checks that the employee and event exist, and verifies that the deterministic engine currently considers the event eligible and useful. For each skill listed in the real events.json effect, the backend applies min(current level + gain, event max_level, 5) and reports the actual gain, including zero. It records the completion in recent activity and rejects a second completion of a non-recurring event. The profile, gap, deterministic recommendation, and AI-coach endpoints all read the updated state immediately.

The original hackathon JSON and CSV dataset files are never modified. Runtime employee skills and activity history are held only in memory for this demo. Restarting the backend resets all quest completions and progress changes to the original dataset snapshot.

Validation

Run the dataset-backed unit assertions without additional packages:

PYTHONPATH=backend python -m unittest discover -s backend -p 'test_*.py' -v
Звёзды
⭐ 0
Форки
0
Язык
Python
Последний push
в прошлом месяце
Коммиты
13
Авторы
2
Файлы
26
Ветки
6

Авторы коммитов

dariga 11zhanik 2

История коммитов

  • 2026-09-23 17:57Merge pull request #5 from BAITC-Hacks/z99zku-codex/add-hr-dashboard-functionalitydariga
  • 2026-09-23 17:57Add HR dashboard aggregates and viewdariga
  • 2026-09-23 17:05Merge pull request #4 from BAITC-Hacks/ps160e-codex/add-quest-completion-and-progress-updatedariga
  • 2026-09-23 17:05Add runtime quest completion and progress updatesdariga
  • 2026-09-23 15:53Merge pull request #3 from BAITC-Hacks/8ie71l-codex/add-openai-explanation-layer-to-recommendationsdariga
  • 2026-09-23 15:52Use supported low-cost OpenAI modeldariga
  • 2026-09-23 15:21Merge pull request #2 from BAITC-Hacks/codex-n56jaldariga
  • 2026-09-23 15:20Build deterministic career recommendation enginedariga
Все коммиты (13)
  • 2026-09-23 14:24Merge pull request #1 from BAITC-Hacks/codexdariga
  • 2026-09-23 14:18Build Career Quest MVP dashboarddariga
  • 2026-09-23 14:03Add files via uploaddariga
  • 2026-09-23 12:12frontendzhanik
  • 2026-09-23 12:11backendzhanik
Структура репозитория (26 файлов)
.gitignore
README.md
backend/.env.example
backend/ai_service.py
backend/data_loader.py
backend/main.py
backend/recommendation_engine.py
backend/requirements.txt
backend/test_ai_service.py
backend/test_hr_dashboard.py
backend/test_quest_completion.py
backend/test_recommendation_engine.py
career_quest_dataset/README.kz.md
career_quest_dataset/README.md
career_quest_dataset/README.ru.md
career_quest_dataset/activity_history.csv
career_quest_dataset/employees.json
career_quest_dataset/events.json
career_quest_dataset/skills.json
frontend/index.html
frontend/package-lock.json
frontend/package.json
frontend/src/App.jsx
frontend/src/main.jsx
frontend/src/styles.css
frontend/vite.config.js
Ветки (6)

Обсуждение 0 комментариев

Войдите, чтобы комментировать

Пока нет комментариев — будьте первым.