AAYMA
RU
Войти

Career Quest

Веб-приложение на Node.js с кабинетами сотрудника и HR: рассчитывает разрыв навыков до карьерной цели, рекомендует 1–3 активности с объяснением…

Доведённый продукт
Команда «Team Core» 6💬 0 комментариевс 23 сентября 2026 г.

О проекте

Команда: Team Core
Кейс HackAlem.ai: Менеджмент — Halyk Bank · кейс 1
Стадия: Доведённый продукт

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

Суть

Веб-приложение на Node.js с кабинетами сотрудника и HR: рассчитывает разрыв навыков до карьерной цели, рекомендует 1–3 активности с объяснением, ведёт личный план и дополняет каталог практикой, если шагов не хватает.

Как устроено

Сервер загружает сотрудников, навыки, требования к ролям и грейдам, активности и историю, затем считает разрыв до цели или следующего грейда. Детерминированные правила проверяют допуск (роль, грейд, пререквизиты, сессии) и ранжируют кандидатов; LLM (OpenAI с JSON-схемой или локальная Ollama) выбирает 1–3 из допустимых вариантов, а при сбое срабатывает fallback на правила. catalog-repair.js добавляет задания самостоятельной практики там, где каталог не покрывает дефицит. HR видит дефициты команды и покрытие каталога.

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

  • расчёт разрыва навыков
  • ранжирование по правилам
  • LLM выбирает из допустимых кандидатов
  • JSON Schema structured output
  • автодополнение каталога
  • кэш рекомендаций

Метрики

На тестовом датасете после дополнения каталога число сотрудников с дефицитами и без рекомендаций снижено с 30 до 0

Особенности

Проект без сторонних npm-зависимостей. Каталог сам дополняется, когда пути обучения не хватает. Повторные завершения не завышают аналитику. Есть импорт с предпросмотром и полные резервные копии, три языка интерфейса, и в LLM не уходят имена и ID сотрудников.

Стек

Node.js 22 · JavaScript ES modules · HTML/CSS · node:test

Модели

gpt-4.1-mini · Ollama


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

README

README.md

Career Quest

Язык: English (EN) | Русский (RU) | Қазақша (KZ)

Краткое описание

Career Quest — навигатор развития сотрудников для трека Halyk Bank на HackAlem AI. Он помогает сотруднику выбирать обучение с учётом навыков и карьерных целей, а HR — видеть дефициты навыков и сотрудников, которым может пригодиться поддержка.

Проект решает практическую проблему: каталог курсов сам по себе не объясняет, что изучать дальше и хватит ли доступных активностей для достижения цели конкретного сотрудника.

Что реализовано

  • Кабинеты сотрудника и HR с проверкой прав на сервере.
  • Карьерная траектория, текущие и целевые уровни навыков, показатель готовности.
  • Объяснимые рекомендации с учётом дефицитов, критических требований, истории участия, формата и длительности. Подключаемый ИИ выбирает 1–3 активности из допустимых кандидатов.
  • Каталог добровольных активностей, личный план, запись, отказ, завершение и история развития.
  • Автоматическое дополнение каталога заданиями для самостоятельной практики, если доступных шагов обучения недостаточно. Исходные курсы и оценки навыков сохраняются.
  • Аналитика HR, просмотр профилей сотрудников и отчёт о покрытии каталога.
  • Импорт JSON/CSV с предпросмотром, экспорт датасета и полные резервные копии с личными планами.
  • Интерфейс на русском, английском и казахском, сохранение выбранного языка и адреса экранов, например #/activities.

Как работает решение

  1. Сервер загружает профили сотрудников, навыки, требования к ролям, активности и историю участия.
  2. Рассчитывает разрыв до указанной карьерной цели либо до следующего грейда в текущей роли.
  3. Проверяет роль, грейд, предварительные требования, завершённые активности и доступные сессии, затем ранжирует варианты. Если пути обучения не хватает, добавляет шаги самостоятельной практики.
  4. Сотрудник получает рекомендации с расчётными обоснованиями и, при подключённом ИИ, отдельным объяснением модели.
  5. Сотрудник добавляет активность в план и отмечает завершение. Демо обновляет навыки в пределах ограничений активности, рекомендации и показатели HR.

Повторные завершения остаются в истории, но не дают повторного прироста и не завышают аналитику или рейтинг рекомендаций. Для повторяемых активностей учитывается сессия. Автоматически добавленные задания помечены отдельно; само дополнение каталога не повышает навыки.

Технологии

ОбластьРеализация
СерверJavaScript ES modules, Node.js 22+, встроенные HTTP API и работа с файлами
ИнтерфейсHTML, CSS, обычный JavaScript; без фронтенд-фреймворка и этапа сборки
ХранениеЛокальный JSON-файл с атомарной заменой; исходные данные JSON/CSV
РекомендацииЛокальные детерминированные правила; опционально OpenAI или Ollama
OpenAIResponses API с JSON-схемой; модель по умолчанию gpt-4.1-mini, настраивается
OllamaЛокальный /api/chat; модель устанавливает пользователь
ТестыВстроенные node:test и node:assert

В package.json нет сторонних зависимостей. Рекомендации по правилам и дополнение каталога работают без API-ключа.

Архитектура проекта

Браузер: public/ (EN / RU / KZ)
              ↕ HTTP /api/*
server.js — сессии, права, предпросмотр импорта, сохранение
  ├─ lib/domain.js — доступность, ранжирование, прогресс и аналитика HR
  ├─ lib/dataset.js + dataset-loader.js — адаптация данных и пересчёт
  ├─ lib/catalog-repair.js — проверка покрытия и дополнительные задания
  ├─ lib/ai.js — OpenAI / локальная Ollama, резервный режим правил
  └─ data/state.json — рабочее состояние

В public/ находятся страницы и стили, общие компоненты (components.js), маршруты (routes.js) и переводы (i18n.js, language.js, catalog.js). Браузер не обращается к OpenAI напрямую: ключ читает сервер. Рекомендации кешируются по сотруднику, языку и версии данных; сохранение изменений сбрасывает кеш.

Установка и запуск

Нужны Node.js 22+ и Git, если репозиторий клонируется.

  1. Получите проект и откройте его папку:

    git clone https://github.com/BAITC-Hacks/hack-c063abd8-team-core.git
    cd hack-c063abd8-team-core
    
  2. Проверьте версию Node.js и запустите сервер:

    node --version
    npm start
    
  3. Откройте http://127.0.0.1:3000. npm install и сборка не нужны. Если PowerShell блокирует npm, используйте npm.cmd start. Остановка сервера — Ctrl+C.

КабинетЛогинПароль по умолчанию
Сотрудник, профиль E0028employeegrow-together
HRhrsupport-growth

Существующий data/state.json имеет приоритет. Если его нет, сервер загружает data/source/, а при отсутствии исходных данных создаёт демодатасет. При запуске недостающие пути каталога дополняются автоматически.

Необязательная настройка ИИ

Создайте .env рядом с server.js по образцу .env.example, не перезаписывая существующие настройки. Для явного запуска без внешнего ИИ достаточно AI_PROVIDER=rules. Для OpenAI укажите ключ локально:

AI_PROVIDER=openai
OPENAI_API_KEY=your_key_here
OPENAI_MODEL=gpt-4.1-mini

Для уже установленной локальной модели Ollama:

AI_PROVIDER=ollama
OLLAMA_MODEL=your_installed_model
OLLAMA_URL=http://127.0.0.1:11434

После изменения .env перезапустите сервер. Не публикуйте ключ. .env, рабочее состояние и резервные копии исключены из Git. Переменные окружения процесса имеют приоритет над .env. Если провайдер не указан, наличие ключа выбирает OpenAI, иначе настроенной модели — Ollama, иначе используются правила. При ошибке ИИ или тайм-ауте восемь секунд интерфейс показывает резервные рекомендации по правилам.

HOST и PORT задают адрес сервера; по умолчанию — 127.0.0.1:3000. Для привязки к сетевому интерфейсу, отличному от loopback, задайте EMPLOYEE_PASSWORD и HR_PASSWORD. EMPLOYEE_ID выбирает профиль сотрудника; STATE_FILE и DATASET_DIR — пути хранения.

Как проверить решение: сценарий для жюри

  1. Запустите проект без API-ключа и войдите как employee. Выберите RU, EN или KZ.
  2. Откройте Мой путь развития, сравните текущие и целевые уровни навыков.
  3. Нажмите Почему этот шаг? в рекомендации. Посмотрите обоснование и ожидаемый прирост. Автоматически добавленная практика имеет отдельную пометку.
  4. Добавьте активность в план, откройте её и отметьте завершение. Проверьте изменение навыка, историю и новые рекомендации. Это изменяет локальное демосостояние.
  5. Выйдите и войдите как hr. Посмотрите дефициты команды, покрытие каталога и профиль сотрудника.
  6. В Управлении данными выберите fixtures/jury-profiles.json и нажмите Проверить файлы. На исходном датасете добавляются три профиля: 200 → 203. Изучите предпросмотр перед применением; после импорта найдите JURY01.
  7. Скачайте полную резервную копию: она включает прогресс, ручные записи и отказы. Для восстановления выберите её через ту же форму, выполните проверку и нажмите кнопку восстановления. Это заменяет все текущие данные, после чего каталог проверяется на пробелы. Обычный экспорт датасета личные планы не включает.

Автоматические проверки:

npm test
npm run check

Тесты проверяют права, смену файла во время предпросмотра, дубли завершений, резервные копии, ранжирование, дополнение каталога, локализацию и запросы к ИИ. Ответы ИИ имитируются, API-кредиты не расходуются. Тест исходного датасета проверяет снижение числа сотрудников с дефицитами без рекомендаций с 30 до 0 после дополнения, без изменения оценок и истории. Это покрытие каталога в тестовых данных, а не измеренный эффект обучения; тест выполняется при наличии исходного набора.

Данные и интеграции

Синтетический набор в data/source/ содержит 200 сотрудников, 8 ролей, 40 исходных активностей, 60 навыков, 32 профиля требований к роли/грейду и 2743 записи истории. Опорная дата — 2026-10-01. В рабочем каталоге дополнительно появляются автоматически созданные задания.

HR может загрузить вместе employees.json, events.json, skills.json и activity_history.csv либо объединённый JSON. Профили, активности и навыки объединяются по ID; история заменяется для сотрудников, представленных в загруженной истории. Предпросмотр привязан к содержимому, сессии и версии данных. Интерфейс принимает файлы общим объёмом до 7 МБ; лимит запроса сервера — 8 МБ.

Для полной замены датасета вне интерфейса сначала остановите сервер:

npm run import:dataset
npm start

Команда читает data/source/, проверяет данные, дополняет каталог, сохраняет прежнее состояние в data/backups/ и заменяет его. Другую папку можно указать так: npm run import:dataset -- /path/to/dataset.

В режиме OpenAI сервер передаёт роль, грейд, стаж, карьерную цель, формат работы, навыки и сведения о кандидатах на рекомендацию. Имена, ID сотрудников и руководителей, исходная история не передаются. Используется store: false, что не означает гарантии нулевого хранения. Ollama доступна только по локальному адресу. Прямых интеграций с банком, HR-системой или платформой обучения нет.

Ограничения

  • Прототип хакатона: две демоучётные записи, сессии в памяти, локальное JSON-хранилище. Нет SSO, промышленной БД и координации нескольких экземпляров сервера.
  • Завершение отмечает сам пользователь; навыки меняются сразу, даже для выбранной будущей сессии. Посещаемость и практическая компетентность независимо не подтверждаются.
  • Дополнительная практика строится по шаблонам уровней. Это не проверенные внешние курсы, сертификация или занятия с преподавателем.
  • Готовность — ориентир развития, а не решение о повышении. Сигналы поддержки HR основаны на правилах истории, а не на прогнозе эффективности или увольнения.
  • ИИ может ошибаться; скорость и доступность зависят от провайдера. Расчёты используют дату снимка данных, если она задана.
  • Неизвестные тексты из пользовательского импорта остаются на исходном языке. Текущая версия не заявляется готовой к промышленной эксплуатации.

Развёрнутая версия

Подтверждённой ссылки на публично развёрнутую версию в репозитории нет. Для проверки используйте локальный адрес http://127.0.0.1:3000.

Звёзды
⭐ 0
Форки
0
Язык
JavaScript
Последний push
в прошлом месяце
Коммиты
17
Авторы
2
Файлы
43
Ветки
4

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

muxammedp 16kavral 1

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

  • 2026-09-23 17:40readme updatemuxammedp
  • 2026-09-23 17:22employees no statistic fixmuxammedp
  • 2026-09-23 16:47import fixes double input bug fix count fixmuxammedp
  • 2026-09-23 15:56moderate fixes mobile interface,export and review regressionsmuxammedp
  • 2026-09-23 15:21kazakh language fixmuxammedp
  • 2026-09-23 15:20kazakh language fixmuxammedp
  • 2026-09-23 15:11cybersecuritymuxammedp
  • 2026-09-23 14:59Merge pull request #2 from BAITC-Hacks/languages-in-projectmuxammedp
Все коммиты (17)
  • 2026-09-23 14:56multiple languages in projectmuxammedp
  • 2026-09-23 14:33Merge branch 'main' of https://github.com/BAITC-Hacks/hack-c063abd8-team-coremuxammedp
  • 2026-09-23 14:32sourse filesmuxammedp
  • 2026-09-23 14:18Merge pull request #1 from BAITC-Hacks/more-readme-languagesmuxammedp
  • 2026-09-23 14:15readme multiple languagesmuxammedp
  • 2026-09-23 14:01deleting junkmuxammedp
  • 2026-09-23 13:56adding projectmuxammedp
  • 2026-09-23 12:22Create test2kavral
  • 2026-09-23 12:21testmuxammedp
Структура репозитория (43 файлов)
.env.example
.gitignore
README.en.md
README.kz.md
README.md
data/source/README.kz.md
data/source/README.md
data/source/README.ru.md
data/source/activity_history.csv
data/source/employees.json
data/source/events.json
data/source/skills.json
fixtures/jury-profiles.json
lib/ai.js
lib/catalog-repair.js
lib/dataset-loader.js
lib/dataset.js
lib/domain.js
lib/secrets.js
lib/seed.js
package.json
public/app.js
public/catalog.js
public/components.js
public/favicon.svg
public/i18n.js
public/index.html
public/language.js
public/routes.js
public/styles.css
scripts/import-dataset.js
server.js
test/api.test.js
test/catalog-repair.test.js
test/dataset.test.js
test/domain.test.js
test/i18n.test.js
test/import-ui.test.js
test/interface-language.test.js
test/openai.test.js
test/review-regressions.test.js
test/routes.test.js
test/secrets.test.js
Ветки (4)

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

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

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