Intentive (Career Quest)
Next.js-приложение Career Quest: личный маршрут развития, карта навыков, подбор до 3 активностей с AI-наставником, демо прохождения с пересчётом…
О проекте
Команда: 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.mdIntentive
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).
Как работает решение
- Сервер загружает четыре файла Career Quest Dataset и проверяет схемы, уникальность ID и связи между сотрудниками, навыками, ролями, мероприятиями и историей.
- Для выбранного сотрудника расчётное ядро восстанавливает актуальные уровни навыков после последней оценки, определяет цель и сравнивает уровни с требованиями роли.
- Ядро исключает недоступные или бесполезные для цели мероприятия и ранжирует остальные. Этот результат виден сразу, без OpenAI.
- После нажатия «Подобрать шаг с AI» сервер заново вычисляет допустимых кандидатов и передаёт модели ограниченный контекст и выбранный язык. LangGraph выполняет цепочку
prepare → choose → validate; модель возвращает структурированный выбор и персональный текст. Сервер проверяет допустимость выбранных ID и форму ответа. - На экране появляются общий комментарий 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, чистые функции расчёта навыков, доступности и ранжирования |
| AI | LangGraph, 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 и выберите Русский. Обновите страницу: русский язык останется выбранным.
- Откройте главную страницу: по умолчанию выбран синтетический профиль
E0001. Посмотрите карьерный ориентир, покрытие требований и блок «Навыки в фокусе». - Перейдите в «Карта навыков» и сравните требования карьерной цели и текущей роли. Вернитесь на главную.
- В блоке «AI-наставник» сначала виден «Базовый подбор». Нажмите «Подобрать шаг с AI». При настроенном ключе появятся общий разбор, объяснение каждого варианта и совет «С чего начать». Если AI выберет те же карточки, сравните именно текстовые объяснения.
- Нажмите «Открыть активность» у рекомендации. В разделе «Мои активности» можно начать мероприятие, доступное сегодня или в своём темпе. После завершения вернитесь на главную: расчётные навыки и подбор обновятся.
- Откройте «Моя цель» на главной, измените предпочтения или цель и повторите подбор. Через Настройки → Аккаунт можно выбрать другой синтетический профиль.
- Для 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, разграничение доступа к данным, постоянное хранение и распределённые лимиты запросов.
Авторы коммитов
История коммитов
- 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
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.