AAYMA
RU
Войти

Intentive (Career Quest)

Next.js-приложение Career Quest: личный маршрут развития, карта навыков, подбор до 3 активностей с AI-наставником, демо прохождения с пересчётом…

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

О проекте

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

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

Суть

Next.js-приложение Career Quest: личный маршрут развития, карта навыков, подбор до 3 активностей с AI-наставником, демо прохождения с пересчётом навыков, личная геймификация и HR-обзор по отделам.

Как устроено

Сервер загружает и валидирует датасет (Zod), чистые функции core/ восстанавливают уровни навыков, сравнивают их с требованиями цели и ранжируют доступные активности. По кнопке сервер заново вычисляет кандидатов и запускает LangGraph-цепочку prepare → choose → validate на OpenAI Responses API со Structured Outputs; допустимость выбранных ID проверяется. Числа покрытия и прироста всегда считает ядро, при сбое OpenAI остаётся базовый подбор.

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

  • LangGraph
  • Structured Outputs
  • server-side candidate revalidation
  • Zod validation
  • rule-based ranking
  • achievements gamification

Особенности

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

Стек

TypeScript · Next.js 16 · React 19 · Tailwind CSS 4 · shadcn/ui · Zustand 5 · Zod 4 · Node.js test runner

Модели

OpenAI gpt-6-luna


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

README

README.md

Intentive

Career Quest — прототип персонального развития сотрудников для хакатона. Он помогает понять, какие навыки нужны для карьерной цели, выбрать доступное обучение и увидеть, почему предложен каждый следующий шаг.

Сотруднику обычно приходится самостоятельно сопоставлять требования к роли, свои навыки и каталог мероприятий. Intentive собирает эти данные в одном маршруте. Расчётное ядро определяет доступные и полезные активности, а AI-наставник по запросу объясняет выбор понятным языком. Текущая версия рассчитана на демонстрацию на синтетических данных.

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

  • Личный маршрут. Текущая роль и грейд, карьерная цель, покрытие требований и навыки, на которых стоит сосредоточиться. Если цель не задана, система показывает предварительное направление и помечает его как таковое.
  • Карта навыков. Сравнение текущих уровней с требованиями выбранной цели и текущей роли. Приоритетные разрывы показаны крупными карточками; остальные и уже освоенные навыки сгруппированы отдельно.
  • Подбор активностей. До трёх вариантов из каталога с учётом целевых навыков, доступности, истории похожего обучения, интересов, формата и желаемого темпа. Жёсткие условия участия проверяются отдельно от предпочтений.
  • AI-наставник. По нажатию кнопки OpenAI выбирает и упорядочивает допустимые варианты, пишет общий разбор маршрута, объяснение для каждой активности и совет, с чего начать. Текст AI отделён от расчётных уровней и прогноза. При ошибке остаётся базовый подбор с понятной причиной сбоя.
  • Демо прохождения. Начатые активности видны отдельно от каталога. Каталог состоит из карточек с поиском, фильтром по формату, датой, ожидаемым приростом и явным действием. Доступную активность можно начать и завершить; навыки, разрывы и рекомендации пересчитываются. Самостоятельное начало обязательного обучения и запись на будущую очную сессию ограничены правилами данных.
  • Личная геймификация. Счётчик завершённых добровольных активностей и достижения за 1, 5 и 10 завершений. Нет рейтинга сотрудников и наград за обязательное обучение.
  • Переключение профиля и настройка цели. В настройках можно выбрать одного из тестовых сотрудников и изменить направление, интересы, формат и недельный бюджет обучения.
  • Локализация. Страницы развития, навыков, активностей и HR, навигация и настройки доступны на русском и английском. Язык переключается в Settings → Personalization → Interface language (или Настройки → Персонализация → Язык интерфейса), сохраняется в браузере после перезагрузки и учитывается при генерации AI-объяснений. По умолчанию выбран английский.
  • Обзор HR. Для синтетического HR-профиля доступна сводка по выбранному отделу, роли и грейду: среднее покрытие целей, критичные разрывы, участие в обучении за последние 365 дней и мероприятия, которые доступны группе и сокращают разрывы. Экран показывает агрегаты без списка или рейтинга сотрудников.

Разделы демо: главная «Моё развитие» (/), «Карта навыков» (/trajectory), «Мои активности» (/activities) и «Обзор команды» (/hr) для HR-профиля.

Также есть рекламно-информационные страницы проекта: «О проекте» (/about) и «Возможности» (/features), а также справка (/help).

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

  1. Сервер загружает четыре файла Career Quest Dataset и проверяет схемы, уникальность ID и связи между сотрудниками, навыками, ролями, мероприятиями и историей.
  2. Для выбранного сотрудника расчётное ядро восстанавливает актуальные уровни навыков после последней оценки, определяет цель и сравнивает уровни с требованиями роли.
  3. Ядро исключает недоступные или бесполезные для цели мероприятия и ранжирует остальные. Этот результат виден сразу, без OpenAI.
  4. После нажатия «Подобрать шаг с AI» сервер заново вычисляет допустимых кандидатов и передаёт модели ограниченный контекст и выбранный язык. LangGraph выполняет цепочку prepare → choose → validate; модель возвращает структурированный выбор и персональный текст. Сервер проверяет допустимость выбранных ID и форму ответа.
  5. На экране появляются общий комментарий AI, причины выбора и первый практический шаг для каждой активности на выбранном языке. Числа покрытия и ожидаемого прироста по-прежнему вычисляет ядро. После начала или завершения активности подбор можно запросить снова.

AI может выбрать те же мероприятия, что и базовый алгоритм: в этом случае меняется содержательный разбор. Ответ модели не гарантирует повышение и не заменяет оценку сотрудника или HR.

Технологии

ЧастьИспользуется
ПриложениеTypeScript 6, Next.js 16.3.5, React 19.2.8
ИнтерфейсTailwind CSS 4, компоненты shadcn/ui на Base UI, Lucide
Клиентское состояниеZustand 5; данные и предпочтения хранятся в памяти демосессии, выбранный язык — в localStorage
ЛокализацияРусский и английский для рабочих страниц и настроек; форматирование дат через Intl.DateTimeFormat
Данные и правилаJSON/CSV, Zod 4, чистые функции расчёта навыков, доступности и ранжирования
AILangGraph, OpenAI Responses API, Structured Outputs; модель по умолчанию — gpt-6-luna
ПроверкиВстроенный тестовый раннер Node.js, TypeScript, production-сборка Next.js

OpenAI — единственный внешний сервис, который вызывается в основном сценарии. Ключ используется только на сервере. Базовый подбор работает и без него.

Архитектура

career_quest_dataset (JSON/CSV)
          ↓
server/repositories/dataset → core/dataset (проверка данных)
                                  ↓
                     core/skills, trajectory, activities,
                     recommendations (правила и расчёты)
                                  ├→ core/hr/overview → страница HR
                                  ↓
                     Zustand store → страницы сотрудника
                          (язык RU/EN, демосессия)
                                  ↕ по нажатию кнопки
                     POST /api/recommendations
                                  ↓
                     server/ai: LangGraph → OpenAI → проверка ответа

core/ не зависит от интерфейса и модели. Политики формирования цели и ранжирования вынесены в core/config.ts и связанные модули: их можно менять без перестройки страниц и Zustand. core/hr/overview.ts агрегирует расчёты по выбранной группе; features/hr/ отображает их без передачи индивидуальных результатов в компонент. stores/ хранит выбранный профиль, предпочтения, локальную историю действий, язык интерфейса и состояние AI-запроса; сохраняется между перезагрузками только язык. Переводы интерфейса находятся в components/settings/i18n.ts и текстах рабочих страниц, а язык AI-ответа передаётся через контракт запроса на сервер. Серверный маршрут воспроизводит допустимые действия на исходном наборе данных и не принимает от браузера готовые оценки навыков или список кандидатов. При сбое OpenAI возвращается расчётный результат.

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

Нужны Node.js 22.18+, npm и, для AI-функции, ключ OpenAI API с доступом к выбранной модели. Проект проверялся на Node.js 26.7.0. Команды ниже приведены для Windows PowerShell.

npm install
if (-not (Test-Path -LiteralPath .env.local)) {
  Copy-Item -LiteralPath .env.example -Destination .env.local
}

В .env.local заполните OPENAI_API_KEY. Остальные значения можно оставить из шаблона. Если файл уже существовал, проверьте AI_TIMEOUT_MS=25000. Затем запустите:

npm run dev

Откройте http://localhost:3000. После изменения .env.local перезапустите dev-сервер. Без ключа интерфейс и базовые рекомендации работают; кнопка AI покажет причину отсутствия подключения. Пошаговое создание ключа и настройка модели описаны в гайде OpenAI. Запросы к модели могут расходовать баланс API.

Для локального запуска через npm run build и npm run start AI-маршрут дополнительно требует AI_DEMO_ENABLED=true в .env.local; для npm run dev этот флаг не нужен. Публично разворачивать демо с этим флагом до реализации авторизации не следует.

Как проверить решение за несколько минут

Интерфейс по умолчанию английский. Чтобы пройти шаги с русскими названиями кнопок, сначала откройте Settings → Personalization → Interface language и выберите Русский. Обновите страницу: русский язык останется выбранным.

  1. Откройте главную страницу: по умолчанию выбран синтетический профиль E0001. Посмотрите карьерный ориентир, покрытие требований и блок «Навыки в фокусе».
  2. Перейдите в «Карта навыков» и сравните требования карьерной цели и текущей роли. Вернитесь на главную.
  3. В блоке «AI-наставник» сначала виден «Базовый подбор». Нажмите «Подобрать шаг с AI». При настроенном ключе появятся общий разбор, объяснение каждого варианта и совет «С чего начать». Если AI выберет те же карточки, сравните именно текстовые объяснения.
  4. Нажмите «Открыть активность» у рекомендации. В разделе «Мои активности» можно начать мероприятие, доступное сегодня или в своём темпе. После завершения вернитесь на главную: расчётные навыки и подбор обновятся.
  5. Откройте «Моя цель» на главной, измените предпочтения или цель и повторите подбор. Через Настройки → Аккаунт можно выбрать другой синтетический профиль.
  6. Для HR-демо выберите в Настройки → Аккаунт профиль сотрудника с ролью HR или отделом Human Resources, затем откройте «Обзор команды» (/hr). Поменяйте отдел, роль и грейд: показатели, разрывы навыков и подбор мероприятий пересчитаются для новой группы.

Для проверки без ключа достаточно шагов 1, 2 и 4: расчётное ядро работает независимо от OpenAI. Для проверки подключения без данных сотрудников есть npm run diagnose:ai: команда отправляет один нейтральный тестовый запрос, выводит статус и длину текстовых полей, но не сам ответ или ключ. Она тоже может расходовать баланс API.

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

npm test
npm run build

Тесты проверяют импорт, расчёт всех 200 профилей, пересчёт после активности, ограничения подбора, AI-контракт, HR-агрегаты и резервный сценарий без внешних платных запросов. Отдельно HR-расчёты проверяет npm run test:hr. После сборки можно запустить npm run test:ai-route для проверки страниц и API без ключа.

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

Исходные данные находятся в career_quest_dataset/: 200 вымышленных сотрудников, 60 навыков, 8 ролей × 4 грейда, 40 мероприятий и 2 743 записи участия. Дата среза — 1 октября 2026 года; именно она считается «сегодня» для расчётов и расписания, независимо от системной даты. Люди и компании в наборе вымышлены. Формат и ограничения описаны в README датасета.

Реализован программный импорт дополнительных профилей и истории в том же формате с проверкой связей. Загрузки файлов через UI и постоянного сохранения пока нет. OpenAI получает ограниченные сведения о роли, цели, разрывах навыков, доступных вариантах и релевантной истории; имя и ID сотрудника не отправляются в модель. Поле интересов передаётся как введено пользователем. Запрос использует store: false; фактическая политика хранения у провайдера определяется его условиями.

Ограничения текущей версии

  • Нет базы данных и учётных записей. Начатые активности, предпочтения и достижения существуют только в памяти текущей страницы и сбрасываются при её перезагрузке. Исключение — выбранный язык интерфейса, который хранится в localStorage браузера. Дополнительные профили можно импортировать программно, но AI-маршрут использует исходный серверный набор.
  • Прогноз ограничен данными. Процент покрытия означает соответствие навыков требованиям, а не вероятность повышения. Для части старой истории известна дата участия, но нет отдельной точной даты завершения.
  • Текст AI требует проверки человеком. Сервер проверяет структуру и допустимость выбранных мероприятий, но не может доказать истинность каждой свободной фразы модели. При таймауте, ошибке API или некорректном ответе остаётся расчётный подбор.
  • Это демо, не production-система. До публичного запуска нужны серверная идентификация сотрудников и HR, разграничение доступа к данным, постоянное хранение и распределённые лимиты запросов.
Звёзды
⭐ 0
Форки
0
Язык
TypeScript
Последний push
в прошлом месяце
Коммиты
8
Авторы
1
Файлы
133
Ветки
2

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

Adil Mamadiyarov 8

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

  • 2026-09-23 17:59README updateAdil Mamadiyarov
  • 2026-09-23 17:54UX settings improvementsAdil Mamadiyarov
  • 2026-09-23 17:47Site LocalizationAdil Mamadiyarov
  • 2026-09-23 17:07UI/UX updateAdil Mamadiyarov
  • 2026-09-23 16:26AI implementationAdil Mamadiyarov
  • 2026-09-23 15:34core policiesAdil Mamadiyarov
  • 2026-09-23 15:20project coreAdil Mamadiyarov
  • 2026-09-23 14:28Initial commit, project sctructureAdil Mamadiyarov
Структура репозитория (133 файлов)
.env.example
.gitignore
AGENTS.md
CLAUDE.md
README.md
app/about/page.tsx
app/activities/page.tsx
app/api/recommendations/route.ts
app/favicon.ico
app/features/page.tsx
app/globals.css
app/help/page.tsx
app/hr/page.tsx
app/layout.tsx
app/page.tsx
app/trajectory/page.tsx
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
components.json
components/app-shell.tsx
components/app-sidebar.tsx
components/hr-route-guard.tsx
components/layout/footer.tsx
components/layout/header.tsx
components/providers/user-store-provider.tsx
components/settings/i18n.ts
components/settings/index.ts
components/settings/settings-config.ts
components/settings/settings-dialog.tsx
components/settings/tabs/account-tab.tsx
components/settings/tabs/personalization-tab.tsx
components/settings/tabs/preferences-tab.tsx
components/settings/types.ts
components/themes/dusk.css
components/themes/harbor.css
components/themes/theme-provider.tsx
components/themes/theme-toggle.tsx
components/ui/accordion.tsx
components/ui/attachment.tsx
components/ui/avatar.tsx
components/ui/badge.tsx
components/ui/bubble.tsx
components/ui/button-group.tsx
components/ui/button.tsx
components/ui/card.tsx
components/ui/carousel.tsx
components/ui/checkbox.tsx
components/ui/combobox.tsx
components/ui/dialog.tsx
components/ui/drawer.tsx
components/ui/dropdown-menu.tsx
components/ui/input-group.tsx
components/ui/input.tsx
components/ui/marker.tsx
components/ui/message-scroller.tsx
components/ui/message.tsx
components/ui/navigation-menu.tsx
components/ui/progress.tsx
components/ui/select.tsx
components/ui/separator.tsx
components/ui/sheet.tsx
components/ui/sidebar.tsx
components/ui/skeleton.tsx
components/ui/switch.tsx
components/ui/table.tsx
components/ui/tabs.tsx
components/ui/textarea.tsx
components/ui/toast.tsx
components/ui/tooltip.tsx
core/activities/availability.ts
core/activities/complete.ts
core/activities/start.ts
core/ai/contracts.ts
core/config.ts
core/dataset/csv.ts
core/dataset/errors.ts
core/dataset/import.ts
core/dataset/indexes.ts
core/dataset/validate.ts
core/development.ts
core/domain/schemas.ts
core/hr/overview.ts
core/policies/goal.ts
core/recommendations/policy.ts
core/recommendations/recommend.ts
core/skills/calculate.ts
core/trajectory/calculate.ts
docs/OPENAI_SETUP.md
eslint.config.mjs
features/activities/activities-workspace.tsx
features/dashboard-language.ts
features/development/ai-coach.tsx
features/development/dashboard.tsx
features/development/development-workspace.tsx
features/development/presentation.ts
features/development/skill-meter.tsx
features/development/trajectory-workspace.tsx
features/hr/hr-workspace.tsx
hooks/use-mobile.ts
lib/employees.ts
lib/utils.ts
next.config.ts
package-lock.json
package.json
postcss.config.mjs
public/vercel.svg
scripts/diagnose-ai.mjs
server/ai/config.ts
server/ai/context.ts
server/ai/errors.ts
server/ai/graph.ts
server/ai/openai-transport.ts
server/ai/provider.ts
server/repositories/dataset.ts
stores/ai-actions.ts
stores/career-store.ts
stores/selectors.ts
stores/types.ts
stores/user-store.ts
tests/ai.test.mjs
tests/dataset.test.mjs
tests/development.test.mjs
tests/hr.test.mjs
tests/recommendations.test.mjs
tests/register-typescript.mjs
tests/smoke-ai-route.mjs
tests/store.test.mjs
tsconfig.json
Ветки (2)

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

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

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