Career Quest
Веб-приложение на Node.js с кабинетами сотрудника и HR: рассчитывает разрыв навыков до карьерной цели, рекомендует 1–3 активности с объяснением…
О проекте
Команда: 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.mdCareer Quest
Язык: English (EN) | Русский (RU) | Қазақша (KZ)
Краткое описание
Career Quest — навигатор развития сотрудников для трека Halyk Bank на HackAlem AI. Он помогает сотруднику выбирать обучение с учётом навыков и карьерных целей, а HR — видеть дефициты навыков и сотрудников, которым может пригодиться поддержка.
Проект решает практическую проблему: каталог курсов сам по себе не объясняет, что изучать дальше и хватит ли доступных активностей для достижения цели конкретного сотрудника.
Что реализовано
- Кабинеты сотрудника и HR с проверкой прав на сервере.
- Карьерная траектория, текущие и целевые уровни навыков, показатель готовности.
- Объяснимые рекомендации с учётом дефицитов, критических требований, истории участия, формата и длительности. Подключаемый ИИ выбирает 1–3 активности из допустимых кандидатов.
- Каталог добровольных активностей, личный план, запись, отказ, завершение и история развития.
- Автоматическое дополнение каталога заданиями для самостоятельной практики, если доступных шагов обучения недостаточно. Исходные курсы и оценки навыков сохраняются.
- Аналитика HR, просмотр профилей сотрудников и отчёт о покрытии каталога.
- Импорт JSON/CSV с предпросмотром, экспорт датасета и полные резервные копии с личными планами.
- Интерфейс на русском, английском и казахском, сохранение выбранного языка и адреса экранов, например
#/activities.
Как работает решение
- Сервер загружает профили сотрудников, навыки, требования к ролям, активности и историю участия.
- Рассчитывает разрыв до указанной карьерной цели либо до следующего грейда в текущей роли.
- Проверяет роль, грейд, предварительные требования, завершённые активности и доступные сессии, затем ранжирует варианты. Если пути обучения не хватает, добавляет шаги самостоятельной практики.
- Сотрудник получает рекомендации с расчётными обоснованиями и, при подключённом ИИ, отдельным объяснением модели.
- Сотрудник добавляет активность в план и отмечает завершение. Демо обновляет навыки в пределах ограничений активности, рекомендации и показатели HR.
Повторные завершения остаются в истории, но не дают повторного прироста и не завышают аналитику или рейтинг рекомендаций. Для повторяемых активностей учитывается сессия. Автоматически добавленные задания помечены отдельно; само дополнение каталога не повышает навыки.
Технологии
| Область | Реализация |
|---|---|
| Сервер | JavaScript ES modules, Node.js 22+, встроенные HTTP API и работа с файлами |
| Интерфейс | HTML, CSS, обычный JavaScript; без фронтенд-фреймворка и этапа сборки |
| Хранение | Локальный JSON-файл с атомарной заменой; исходные данные JSON/CSV |
| Рекомендации | Локальные детерминированные правила; опционально OpenAI или Ollama |
| OpenAI | Responses 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, если репозиторий клонируется.
-
Получите проект и откройте его папку:
git clone https://github.com/BAITC-Hacks/hack-c063abd8-team-core.git cd hack-c063abd8-team-core -
Проверьте версию Node.js и запустите сервер:
node --version npm start -
Откройте http://127.0.0.1:3000.
npm installи сборка не нужны. Если PowerShell блокируетnpm, используйтеnpm.cmd start. Остановка сервера — Ctrl+C.
| Кабинет | Логин | Пароль по умолчанию |
|---|---|---|
Сотрудник, профиль E0028 | employee | grow-together |
| HR | hr | support-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 — пути хранения.
Как проверить решение: сценарий для жюри
- Запустите проект без API-ключа и войдите как
employee. Выберите RU, EN или KZ. - Откройте Мой путь развития, сравните текущие и целевые уровни навыков.
- Нажмите Почему этот шаг? в рекомендации. Посмотрите обоснование и ожидаемый прирост. Автоматически добавленная практика имеет отдельную пометку.
- Добавьте активность в план, откройте её и отметьте завершение. Проверьте изменение навыка, историю и новые рекомендации. Это изменяет локальное демосостояние.
- Выйдите и войдите как
hr. Посмотрите дефициты команды, покрытие каталога и профиль сотрудника. - В Управлении данными выберите fixtures/jury-profiles.json и нажмите Проверить файлы. На исходном датасете добавляются три профиля: 200 → 203. Изучите предпросмотр перед применением; после импорта найдите
JURY01. - Скачайте полную резервную копию: она включает прогресс, ручные записи и отказы. Для восстановления выберите её через ту же форму, выполните проверку и нажмите кнопку восстановления. Это заменяет все текущие данные, после чего каталог проверяется на пробелы. Обычный экспорт датасета личные планы не включает.
Автоматические проверки:
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.
Авторы коммитов
История коммитов
- 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
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.