Career Quest
Карьерный навигатор для Halyk: gap-анализ навыков сотрудника относительно целевой роли и грейда, подбор мероприятий с объяснением и AI-план развития.
О проекте
Команда: 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
Career Quest
Сайт проекта: hackathon.wezeso.me
Мы сделали Career Quest для первого кейса Halyk на HackAlem. Сотрудник выбирает карьерную цель, видит, каких навыков ему не хватает, и получает подходящие варианты обучения. Руководитель согласует заявки, а результат обучения меняет профиль навыков.
Что есть в проекте
- Личный кабинет с навыками, карьерной целью, историей обучения и прогрессом до нужного грейда.
- Подбор мероприятий с объяснением, почему они подходят сотруднику.
- ИИ-помощник, который составляет план развития и обновляет его при изменении цели или нагрузки.
- Три встроенных курса: коммуникация, SQL и документация. Внутри есть видео, конспекты и экзамены.
- Кабинет руководителя для работы с командой и согласования заявок.
- HR-кабинет с аналитикой, созданием мероприятий, проверкой результатов, импортом данных и моделированием роста.
- Календарь с экспортом в
.ics, Google Календарь и Outlook. Экспорт разовый, без синхронизации. - Переключение интерфейса между русским и казахским языками.
Скриншоты
Экран входа:

HR-дашборд:

Как мы реализовали логику
Сначала берём навыки из профиля и добавляем результаты обучения после последней оценки. Затем сравниваем их с требованиями к целевой роли и грейду. Если цель не задана, используем следующий грейд текущей роли, а для Lead оставляем текущий. Процент готовности показывает, какая доля требуемых уровней навыков уже закрыта.
Перед подбором проверяем роль, грейд, входные требования, доступные даты и историю участия. Пройденные активности повторно не предлагаем, кроме регулярного клуба. Текущие заявки блокируют повторы. Обязательное обучение учитываем отдельно.
Оставшиеся варианты оцениваем по понятным правилам: закрытие одного уровня критичного навыка даёт 12 баллов, другого целевого навыка даёт 4. Длительность, прошлые пропуски и неудобный формат снижают оценку. Ограничения по времени и формату дополнительно учитываем в плане помощника. Расчёт находится в backend/model.go.
Дальше есть два сценария:
- Обычное мероприятие: сотрудник отправляет заявку, руководитель согласует, сотрудник описывает результат, HR проверяет его. После подтверждения начисляем прирост навыков.
- Встроенный курс: после согласования сотрудник проходит уроки и сдаёт экзамен. В нём четыре типа заданий: короткий ответ, выбор варианта, эссе и файл. Сервер проверяет выбор варианта, ИИ оценивает письменные ответы. Проходной балл 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, который собирает сервер и интерфейс в один образ.
-
Подключите репозиторий в Dokploy, выберите сборку через
Dockerfileи контекст.. -
Направьте DNS домена
hackathon.wezeso.meна сервер. В Dokploy добавьте этот домен, порт контейнера3000и HTTPS. -
Укажите переменные окружения:
APP_ORIGIN=https://hackathon.wezeso.me COOKIE_SECURE=true AGENT_PROVIDER=off EXAM_AI_PROVIDER=off ALLOW_EXTERNAL_AI=false -
Выберите хранилище. Для CSV задайте
STORAGE_BACKEND=csv, подключите постоянный том к/app/dataи оставьте одну реплику с порядком обновленияstop-first. Для Supabase задайтеSTORAGE_BACKEND=supabaseиDATABASE_URL. Новую базу сначала заполните SQL-экспортом черезnpm run db:exportпо инструкции переноса. -
Запустите деплой и проверьте 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 пока нет.
Авторы коммитов
История коммитов
- 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
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.