AAYMA
RU
Войти

Career Quest

Карьерный навигатор для Halyk: gap-анализ навыков сотрудника относительно целевой роли и грейда, подбор мероприятий с объяснением и AI-план развития.

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

О проекте

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

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

Суть

Карьерный навигатор для Halyk: gap-анализ навыков сотрудника относительно целевой роли и грейда, подбор мероприятий с объяснением и AI-план развития. Есть кабинеты руководителя (согласование) и HR (аналитика, моделирование роста), встроенные курсы с экзаменами.

Как устроено

Навыки профиля плюс результаты обучения сравниваются с требованиями целевой роли и грейда, процент готовности считается как доля закрытых уровней. Кандидатные активности фильтруются по роли, грейду, датам и истории, затем скорятся по правилам: +12 за уровень критичного навыка, +4 за другой целевой навык, штрафы за длительность, пропуски и формат (backend/model.go). Агент на Ollama или Gemini получает допустимые активности, проверяет план серверными инструментами и сохраняет 1–3 шага. Письменные ответы экзамена оценивает ИИ с проходным баллом 70/100, после чего начисляется прирост навыков. HR-индекс внимания считается как сумма объяснимых факторов.

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

  • skill gap analysis
  • rule-based скоринг активностей
  • агент с серверными инструментами
  • AI-проверка экзаменов
  • экспорт в .ics

Особенности

Прозрачные числовые веса подбора и замкнутый цикл: заявка → согласование руководителя → результат → проверка HR → прирост навыков, с защитой от повторного начисления. Встроенные курсы с четырьмя типами заданий, письменные ответы проверяет AI. Интерфейс на казахском и русском.

Стек

Go 1.25 · Next.js 16 · React 19 · TypeScript · Kumo UI · PostgreSQL/Supabase · CSV · Docker · Dokploy

Модели

Ollama · Gemini


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

README

README.md

HackAlem Wezeso | Career Quest

Career Quest

Сайт проекта: hackathon.wezeso.me

Мы сделали Career Quest для первого кейса Halyk на HackAlem. Сотрудник выбирает карьерную цель, видит, каких навыков ему не хватает, и получает подходящие варианты обучения. Руководитель согласует заявки, а результат обучения меняет профиль навыков.

Что есть в проекте

  • Личный кабинет с навыками, карьерной целью, историей обучения и прогрессом до нужного грейда.
  • Подбор мероприятий с объяснением, почему они подходят сотруднику.
  • ИИ-помощник, который составляет план развития и обновляет его при изменении цели или нагрузки.
  • Три встроенных курса: коммуникация, SQL и документация. Внутри есть видео, конспекты и экзамены.
  • Кабинет руководителя для работы с командой и согласования заявок.
  • HR-кабинет с аналитикой, созданием мероприятий, проверкой результатов, импортом данных и моделированием роста.
  • Календарь с экспортом в .ics, Google Календарь и Outlook. Экспорт разовый, без синхронизации.
  • Переключение интерфейса между русским и казахским языками.

Скриншоты

Экран входа:

Экран входа в Career Quest

HR-дашборд:

HR-дашборд с аналитикой обучения и прогресса команды

Как мы реализовали логику

Сначала берём навыки из профиля и добавляем результаты обучения после последней оценки. Затем сравниваем их с требованиями к целевой роли и грейду. Если цель не задана, используем следующий грейд текущей роли, а для Lead оставляем текущий. Процент готовности показывает, какая доля требуемых уровней навыков уже закрыта.

Перед подбором проверяем роль, грейд, входные требования, доступные даты и историю участия. Пройденные активности повторно не предлагаем, кроме регулярного клуба. Текущие заявки блокируют повторы. Обязательное обучение учитываем отдельно.

Оставшиеся варианты оцениваем по понятным правилам: закрытие одного уровня критичного навыка даёт 12 баллов, другого целевого навыка даёт 4. Длительность, прошлые пропуски и неудобный формат снижают оценку. Ограничения по времени и формату дополнительно учитываем в плане помощника. Расчёт находится в backend/model.go.

Дальше есть два сценария:

  1. Обычное мероприятие: сотрудник отправляет заявку, руководитель согласует, сотрудник описывает результат, HR проверяет его. После подтверждения начисляем прирост навыков.
  2. Встроенный курс: после согласования сотрудник проходит уроки и сдаёт экзамен. В нём четыре типа заданий: короткий ответ, выбор варианта, эссе и файл. Сервер проверяет выбор варианта, ИИ оценивает письменные ответы. Проходной балл 70 из 100, после него начисляем навыки без отдельной проверки HR.

Прирост ограничен условиями мероприятия и шкалой до 5. Повторное подтверждение не начисляет его второй раз. Права и переходы между этапами проверяем на сервере. Грейд автоматически не повышаем.

Помощник использует Ollama или Gemini. Он получает допустимые активности, проверяет план через серверные инструменты и сохраняет от одного до трёх шагов. Заявки создаются после подтверждения сотрудника. Если модель недоступна, показываем расчётный план с соответствующей пометкой. Для проверки письменных заданий экзамена нужна работающая модель.

В HR-аналитике есть индекс внимания по истории обучения, пропускам и просрочкам. Это сумма объяснимых факторов для разговора с сотрудником. Данных об увольнениях для обучения модели в датасете нет.

Стек и данные

Интерфейс написали на Next.js 16, React 19 и TypeScript, использовали Kumo UI. Сервер написали на Go 1.25. Запросы из браузера идут через Next.js в Go API.

Без настройки базы храним состояние в data/state.csv. При заданном DATABASE_URL используем PostgreSQL через Supabase. Пароли храним в виде хешей, доступ проверяем по серверным сессиям и ролям. Ключи ИИ и базы остаются на сервере.

Исходный датасет синтетический: 200 сотрудников, 40 мероприятий, 60 навыков, 32 профиля ролей и 2743 записи истории. В расчётах используем дату среза 2026-10-01. Три демо-курса добавляются отдельно. Формат исходных данных описан в README.ru.md.

Локальный запуск

Нужны Node.js 22+ и Go 1.25+. Из корня проекта:

npm start

Скрипт установит зависимости интерфейса, соберёт Go API и запустит приложение на localhost:3000.

Для настройки скопируйте .env.example в .env. При первом запуске в режиме CSV создаются логины employee, manager, hr и colleague. Пароль для всех аккаунтов: [скрыто]. При запуске сервера этот пароль применяется ко всем существующим аккаунтам в CSV и Supabase. Переменная DEMO_PASSWORD позволяет задать другой общий пароль.

Для запуска без ИИ укажите в .env:

AGENT_PROVIDER=off
EXAM_AI_PROVIDER=off

Для локальной модели выберите ollama и задайте OLLAMA_URL и OLLAMA_MODEL. Для Gemini нужны GEMINI_API_KEY, провайдер gemini и ALLOW_EXTERNAL_AI=true. Внешнюю модель включайте только для данных, которые разрешено передавать. Настройки есть в .env.example, подробности в документации помощника и курсов.

Деплой

Я бы деплоил через Dokploy: в корне уже есть Dockerfile, который собирает сервер и интерфейс в один образ.

  1. Подключите репозиторий в Dokploy, выберите сборку через Dockerfile и контекст ..

  2. Направьте DNS домена hackathon.wezeso.me на сервер. В Dokploy добавьте этот домен, порт контейнера 3000 и HTTPS.

  3. Укажите переменные окружения:

    APP_ORIGIN=https://hackathon.wezeso.me
    COOKIE_SECURE=true
    AGENT_PROVIDER=off
    EXAM_AI_PROVIDER=off
    ALLOW_EXTERNAL_AI=false
    
  4. Выберите хранилище. Для CSV задайте STORAGE_BACKEND=csv, подключите постоянный том к /app/data и оставьте одну реплику с порядком обновления stop-first. Для Supabase задайте STORAGE_BACKEND=supabase и DATABASE_URL. Новую базу сначала заполните SQL-экспортом через npm run db:export по инструкции переноса.

  5. Запустите деплой и проверьте hackathon.wezeso.me/api/health. После перезапуска данные должны сохраниться.

В этой конфигурации работает расчётный помощник. Для ИИ и проверки экзаменов отдельно подключите модель. Настройки томов, базы и разбор ошибок собраны в docs/DOKPLOY.md.

Проверки и структура

npm test
npm run build

Тесты проверяют подбор, права доступа, согласование, начисление навыков, помощника, курсы и календарь. Проверки PostgreSQL включаются отдельно через TEST_DATABASE_URL с адресом тестовой базы.

ПутьЧто внутри
frontend/Интерфейс, компоненты и переводы
backend/API, подбор, агент, курсы, хранение данных и тесты
scripts/Запуск, проверки и перенос данных
data/Локальное состояние и SQL для переноса
fixtures/Дополнительные профили для проверки
docs/Документация по функциям и настройке
public/Шапка README и скриншоты интерфейса
third_party/Лицензии и сведения об использованном коде

Проект сделан для демонстрации на хакатоне. Интеграций с MyHalyk, корпоративной LMS и SSO пока нет.

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

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

Timur Ryabov 8

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

  • 2026-09-23 17:59mainTimur Ryabov
  • 2026-09-23 17:56mainTimur Ryabov
  • 2026-09-23 17:47mainTimur Ryabov
  • 2026-09-23 17:13design basic demoTimur Ryabov
  • 2026-09-23 16:18design basic demoTimur Ryabov
  • 2026-09-23 15:21design basic demoTimur Ryabov
  • 2026-09-23 14:10new mainTimur Ryabov
  • 2026-09-23 14:02md files lolTimur Ryabov
Структура репозитория (161 файлов)
.dockerignore
.env.example
.env.supabase.example
.gitignore
Dockerfile
README.kz.md
README.md
README.ru.md
activity_history.csv
backend/agent.go
backend/agent_artifacts.go
backend/agent_autopilot.go
backend/agent_model.go
backend/agent_test.go
backend/ai.go
backend/ai_config_test.go
backend/atomic_unix.go
backend/atomic_windows.go
backend/auth.go
backend/course_examples.json
backend/courses.go
backend/courses_ai.go
backend/courses_model.go
backend/courses_test.go
backend/deployment_test.go
backend/go.mod
backend/go.sum
backend/hr.go
backend/hr_test.go
backend/import.go
backend/locale.go
backend/locale_test.go
backend/main.go
backend/main_test.go
backend/migrate.go
backend/migrations/001_supabase.sql
backend/migrations/002_agent.sql
backend/migrations/003_courses.sql
backend/migrations/004_course_examples.sql
backend/migrations/verify.sql
backend/model.go
backend/password_test.go
backend/pointer_windows.go
backend/postgres.go
backend/postgres_test.go
backend/startup.go
backend/store.go
data/courses-supabase.sql
data/demo.csv
docs/AGENT-QA.md
docs/AGENT.md
docs/ARCHITECTURE.md
docs/CALENDAR.md
docs/CASE1.md
docs/CHARACTERS.md
docs/COURSES.md
docs/DATASET.md
docs/DOKPLOY.md
docs/HOME-REDESIGN.md
docs/HR-WORKSPACE.md
docs/LOCALIZATION.md
docs/QA.md
docs/RUNBOOK.md
docs/SUPABASE.md
docs/TECHNICAL_SPECIFICATION.txt
docs/team-illustrations.md
employees.json
events.json
fixtures/activity_history.csv
fixtures/employees.json
frontend/AGENTS.md
frontend/CLAUDE.md
frontend/app/globals.css
frontend/app/icon.svg
frontend/app/layout.tsx
frontend/app/page.tsx
frontend/app/pixel-workspace.css
frontend/app/responsive.css
frontend/app/states.css
frontend/app/workspace.css
frontend/components/AgentPanel.module.css
frontend/components/AgentPanel.tsx
frontend/components/AppBadge.tsx
frontend/components/AuthStory.module.css
frontend/components/AuthStory.tsx
frontend/components/Avatar.tsx
frontend/components/CalendarExport.tsx
frontend/components/CalendarPanel.module.css
frontend/components/CalendarPanel.tsx
frontend/components/CandidateCard.module.css
frontend/components/CandidateCard.tsx
frontend/components/CharacterCard.tsx
frontend/components/CoursePlayer.module.css
frontend/components/CoursePlayer.tsx
frontend/components/EmployeeSkillsDialog.tsx
frontend/components/Feedback.tsx
frontend/components/HREventBuilder.tsx
frontend/components/HRSimulator.tsx
frontend/components/HRWorkspace.module.css
frontend/components/HRWorkspace.tsx
frontend/components/HistoryPanel.module.css
frontend/components/HistoryPanel.tsx
frontend/components/Home.module.css
frontend/components/Home.tsx
frontend/components/LanguageSwitcher.tsx
frontend/components/PixelArt.tsx
frontend/components/PixelMosaic.tsx
frontend/components/RequestsPanel.tsx
frontend/components/TeamPanel.module.css
frontend/components/TeamPanel.tsx
frontend/components/TeamPixelArt.tsx
frontend/components/UI.tsx
frontend/lib/api.ts
frontend/lib/calendar-locale.ts
frontend/lib/calendar.ts
frontend/lib/character.ts
frontend/lib/hr.ts
frontend/lib/i18n-core.ts
frontend/lib/i18n.tsx
frontend/lib/locales/catalog.json
frontend/lib/locales/courses-kk.json
frontend/lib/locales/kk.json
frontend/lib/locales/server-kk.json
frontend/lib/types.ts
frontend/next-env.d.ts
frontend/next.config.ts
frontend/package-lock.json
frontend/package.json
frontend/postcss.config.mjs
frontend/public/halyk.svg
frontend/public/illustrations/conversation.png
frontend/public/illustrations/decisions.png
frontend/public/illustrations/team.png
frontend/tsconfig.json
package.json
public/Frame 3.png
public/hr.png
public/reg.png
scripts/api.test.mjs
scripts/calendar.test.mjs
scripts/character.test.mjs
scripts/course-sql.mjs
scripts/create-jury-fixtures.mjs
scripts/db.mjs
scripts/i18n.test.mjs
scripts/start-production.mjs
scripts/start.mjs
scripts/supabase-sql.mjs
scripts/test.mjs
skills.json
supabase/README.md
supabase/schema.sql
supabase/upgrade.sql
supabase/verify.sql
third_party/BloubBot.vue
third_party/Kumo-LICENSE
third_party/Manrope-LICENSE
third_party/NOTICE.md
third_party/bloub-LICENSE
third_party/bloub-README.md
third_party/bloub-tree.json
Ветки (2)

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

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

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