Career Quest
Локальное веб-приложение: HR загружает данные о сотрудниках, навыках и мероприятиях.
О проекте
Команда: JassAI
Кейс HackAlem.ai: Менеджмент — Halyk Bank · кейс 1
Стадия: Доведённый продукт
Задача кейса: «Career Quest»: AI-навигатор, связывающий навыки сотрудника с шагами развития
Суть
Локальное веб-приложение: HR загружает данные о сотрудниках, навыках и мероприятиях. Сотрудник выбирает карьерную цель, видит дефициты навыков, получает 1–3 объяснимых шага от AI и проходит активности. Прогресс оформлен как игра (XP, квесты, гардероб) с 3D-спутником, снежным барсом.
Как устроено
Сервер на FastAPI с SQLite считает уровни навыков и покрытие цели по оценке и завершённым активностям. OpenAI Responses API выбирает 1–3 допустимых шага и приводит не меньше трёх факторов объяснения. Обязательные и недоступные мероприятия исключены, ответ проверяется сервером и данных не меняет. Потоковый чат-коуч работает через OpenAI или NVIDIA. Фронтенд написан на vanilla JS и Three.js с GLB-моделью барса. Windows-launcher ставит закреплённые uv и Python и хранит ключ через DPAPI.
Ключевые решения
- расчёт покрытия навыков цели
- валидация AI-рекомендаций сервером
- streaming chat
- геймификация XP/квесты
- Three.js GLB-анимации
- Windows DPAPI
Метрики
225 Python-тестов и 93 JS-теста пройдены; демо: навык 2→4, покрытие цели 55,6%→77,8%, +40 XP
Особенности
Приложение запускается одним launcher.cmd на Windows без предустановленного Python. Стартовый набор: 200 сотрудников, 60 навыков, 40 мероприятий. Награды приватные и выключены по умолчанию; простые объяснения генерируются локально, и их не выдают за ответ LLM.
Стек
Python · FastAPI · Pydantic · SQLite · uv · JavaScript · Three.js · Blender · pytest · node:test
Модели
OpenAI (Responses API) · NVIDIA (опционально)
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-9be09345-jassai.
README
README.mdCareer Quest — ИИ-навигатор развития сотрудника
Кейс 1 Halyk Bank, HackAlem AI · команда JassAI.
Локальное веб-приложение: HR загружает данные и создаёт доступ; сотрудник выбирает карьерную цель, получает рекомендации, проходит активности и видит прогресс. 3D-спутник — снежный барс — связывает навыки с личными квестами и заработанными предметами.
Устройство и технологии
Браузер: интерфейс + Three.js → FastAPI → правила развития → SQLite
→ AI-провайдер → проверка ответа
launcher.cmd → uv + Python → scripts/launcher.py → локальный сервер
| Часть | Содержимое |
|---|---|
| app/ | Python 3.12.14, FastAPI, Pydantic, Uvicorn; авторизация HR/employee, импорт, расчёты навыков и активности |
| app/ai/, app/companion_chat.py | OpenAI Responses API через httpx; рекомендации и потоковый чат. Чат также поддерживает NVIDIA при ручной настройке сервера |
| app/gamification.py, app/companion.py | XP, квесты, гардероб и древо навыков; состояние сохраняется в SQLite |
| frontend/ | HTML/CSS, JavaScript ES modules, Three.js 0.170.0; без сборки Node.js и CDN |
| assets/snow_leopard/ | GLB, Blender-исходник и две циклические анимации: дыхание 5 секунд и оглядывание 8 секунд |
| scripts/, tests/, uv.lock | Launcher, проверки, pytest и Node test runner, закреплённые Python-зависимости |
Навыки рассчитывает сервер по оценке и завершённым активностям. AI выбирает 1–3 допустимых шага и минимум три разных фактора объяснения; обязательные и недоступные мероприятия исключены. Ответ проверяется сервером и не изменяет данные. Простые объяснения спутника формируются локально и не выдаются за LLM.
Запуск
Windows 10/11 x64, браузер и интернет для первой установки. Python, Git, Node.js, Blender и права администратора для обычного запуска не нужны. Для 3D требуется WebGL; при его отсутствии текстовые функции доступны.
- На GitHub выбрать main → Code → Download ZIP и полностью распаковать архив. Перед запуском новой копии остановить старую через Ctrl+C в её launcher.
- Дважды нажать launcher.cmd. Он загрузит закреплённые uv/Python, проверит SHA-256 uv, установит зависимости и откроет приложение на
127.0.0.1со свободным портом. - Подключение OpenAI можно пропустить. Для облачных рекомендаций и свободного чата настройка выполняется в launcher; ключ хранится через Windows DPAPI. Без настройки работают каталог, прогнозы, локальные ответы и награды.
- Создать первый аккаунт HR с собственным логином и паролем от 10 символов. Одноразовый токен launcher передаёт автоматически.
- На пустой базе автоматически загрузится starter-data/: 200 сотрудников, 60 навыков, 32 профиля роли/грейда, 40 мероприятий и 2 743 записи истории. Все люди и компании вымышлены. Существующие данные не перезаписываются.
- В «Сотрудники» → «Создать доступ» выбрать E0001, задать логин и пароль. Выйти из HR и войти этим логином; раздел «Спутник» доступен сотруднику. ID профиля не является логином.
Окно launcher оставить открытым; Ctrl+C останавливает сервер. Закрытие вкладки его не останавливает. При повторном запуске аккаунты, прогресс и экипировка сохраняются.
Данные и логи: %LOCALAPPDATA%\CareerQuest\instances\hack-9be09345-jassai\. SQLite находится в careerquest.sqlite3, диагностика — в logs/launcher.log и logs/server.stderr.log. При ошибке установки проверить доступ к GitHub/PyPI и повторить запуск.
Параметры: launcher.cmd /configure-ai — настройка OpenAI после остановки сервера; /disable-ai — удаление AI-настроек; /help — справка. Переменные ручного запуска описаны в .env.example; .env автоматически не читается. NVIDIA через launcher не подключается.
Основной сценарий
- HR видит частые дефициты навыков, сотрудников без следующего шага и участие в активностях; создаёт доступ сотруднику. Дополнительные данные загружаются через «Импорт данных» → «Проверить файлы» → «Применить изменения»; проверка сама по себе ничего не записывает.
- Сотрудник открывает «Мой путь», выбирает цель, изучает дефициты навыков и прогноз активности. При настроенном OpenAI запрашивает объяснимую рекомендацию.
- В «Спутник» смотрит древо навыков, задаёт вопрос и по желанию нажимает «Включить награды», затем выбирает личный квест.
- В «Активности» начинает доступное мероприятие; в «История» нажимает «Отметить выполнение». Навыки, покрытие цели и награды пересчитываются.
- В «Гардероб» примеряет и явно надевает открытый предмет. Обновление страницы и перезапуск сохраняют результат. Кнопки «Оглянуться» и «Пауза» управляют анимацией барса.
Награды выключены по умолчанию и видны только сотруднику. Импорт, обязательные активности и повторное завершение XP не дают. Закрытую вещь можно примерить, но нельзя надеть. Покрытие требований не означает повышение грейда; завершение в прототипе подтверждает сотрудник, внешняя LMS не подключена.
Воспроизведение результата
Для точного сценария на малом наборе остановить приложение и выполнить в PowerShell из корня проекта:
$env:CAREERQUEST_DATA_DIR = Join-Path $env:LOCALAPPDATA ('CareerQuest\demo-check-' + [guid]::NewGuid().ToString('N'))
$env:CAREERQUEST_SEED_DATA_DIR = 'off'
.\launcher.cmd
Это отдельная пустая база. Создать HR, импортировать из demo/ employees.json, events.json, skills.json, activity_history.csv и создать доступ для DEMO_E001. Войти его логином. Дата расчётов — 2026-10-01 из данных, независимо от часов компьютера.
- Проверить цель Инженер → Senior: «Проектирование сервисов» — уровень 2, покрытие 55,6%.
- В «Спутник» → «Включить награды» выбрать личный квест «Практика проектирования сервисов (демо)»,
DEMO_EV_DESIGN, и нажать «Выбрать». - Начать эту активность и отметить выполнение. Результат: навык 2 → 4, покрытие 55,6% → 77,8% (API: 55,56% → 77,78%), +40 XP, завершённый квест.
- Проверить три новых предмета: кепка первого шага, блокнот открытий, шапка личного квеста. Надеть предмет, обновить страницу и проверить сохранение.
Для проверки перезапуска повторить только .\launcher.cmd в том же окне: повтор всего блока создаст ещё одну пустую базу. После завершения закрыть это окно PowerShell; обычный запуск продолжит использовать основной каталог данных.
Автоматические проверки
.\launcher.cmd /check
/check проверяет установку, готовность сервера, выдачу HTML/JavaScript и ресурса GLB, затем останавливает созданный проверочный сервер. Это не проверка всего пользовательского интерфейса; браузер и AI-запросы не запускаются.
Для полного набора нужны uv в PATH и Node.js. Из корня проекта:
uv sync --locked
uv run pytest -q
node --test tests/*.test.mjs
uv run python scripts/check_dataset.py starter-data
uv run python scripts/check_dataset.py demo
Результат: 225 Python-тестов и 93 теста JavaScript прошли. Проверяются импорт и сохранение данных, роли/CSRF, расчёты, повторные завершения, приватность наград, экипировка и контракты AI. AI-транспорт в автоматических тестах заменён синтетическими ответами; платные API не вызываются. check_dataset.py использует временную БД и проверяет импорт, дополнительный профиль, завершение, права и перезапуск.
На Windows проверены запуск из ZIP, стартовый набор, повторный /check с UV_OFFLINE=1; в браузере — сценарий +40 XP, сохранение одежды, обе анимации и экран 390 px. Это проверка на рабочем ПК, не отдельной чистой виртуальной машине. Автоматические тесты не оценивают качество и задержку живых моделей; без облачного подключения свободный AI-диалог недоступен, локальные объяснения остаются.
Авторы коммитов
История коммитов
- 2026-09-23 17:58docs: explain HR setup, four-file import and Irbis featuresLucky-271
- 2026-09-23 17:48docs: simplify jury README and define friendly Irbis instructionsAliaskar
- 2026-09-23 17:46chore(B): upload unchanged cloud AI source snapshotnariman0812q-lab
- 2026-09-23 17:31merge: preserve latest C branch history in integrated deliveryAliaskar
- 2026-09-23 17:30docs: consolidate seeded startup and reproducible jury checksAliaskar
- 2026-09-23 17:26merge: include latest seeded dataset and additive HR importsAliaskar
- 2026-09-23 17:26feat: finish Irbis companion integration and harden offline launcherAliaskar
- 2026-09-23 17:25Merge pull request #4 from BAITC-Hacks/mainAliaskar
Все коммиты (32)
- 2026-09-23 17:21Merge pull request #3 from BAITC-Hacks/codex/companion-gamificationAliaskar
- 2026-09-23 17:17feat(data): preload organizer dataset and support additive HR importsLucky-271
- 2026-09-23 17:14merge: integrate companion UI and career coach with A B C deliveryAliaskar
- 2026-09-23 17:14feat: add rigged snow leopard with two verified idle animationsAliaskar
- 2026-09-23 16:54feat: add skill-tree companion, earned wardrobe and streaming career coachLucky-271
- 2026-09-23 16:35feat: ship Windows jury launcher, demo data and consolidated READMEAliaskar
- 2026-09-23 16:12fix(ui): align forecast rounding and history order with backendAliaskar
- 2026-09-23 16:01merge: preserve latest AI launcher integration in Halyk redesignLucky-271
- 2026-09-23 15:55feat(ui): implement Halyk redesign with forecasts and preserve personal questsLucky-271
- 2026-09-23 15:53fix: integrate AI launcher and UI with verified Windows startupAliaskar
- 2026-09-23 15:42Merge remote-tracking branch 'origin/feat/b-ai-launcher' into codex/gamificationAliaskar
- 2026-09-23 15:42feat: add opt-in personal quests XP and private achievementsAliaskar
- 2026-09-23 15:39docs(b): document launcher, AI contract and verification limitsnariman0812q-lab
- 2026-09-23 15:38test(b): cover AI validation, privacy, deadline and launcher contractnariman0812q-lab
- 2026-09-23 15:37feat(b): add bounded fact-based AI recommendation providernariman0812q-lab
- 2026-09-23 15:37feat(b): create AI provider packagenariman0812q-lab
- 2026-09-23 15:33feat(b): add protected AI setup and pinned Windows launchernariman0812q-lab
- 2026-09-23 15:32feat(b): add Windows launcher entrypointnariman0812q-lab
- 2026-09-23 14:40fix(ui): show completion result immediately and distinguish empty trajectoryLucky-271
- 2026-09-23 14:38feat(ui): integrate backend A workflows and verify real browser importsLucky-271
- 2026-09-23 14:21feat: implement backend data import progress and role-based accessAliaskar
- 2026-09-23 14:20feat(ui): add employee and HR workflows with dual-provider settingsLucky-271
- 2026-09-23 13:50docs: focus README on architecture setup and verificationAliaskar
- 2026-09-23 13:45docs: define Career Quest scope architecture and delivery planAliaskar
Структура репозитория (107 файлов)
.env.example .gitignore .python-version README.md app/__init__.py app/__main__.py app/activities.py app/ai/__init__.py app/ai/provider.py app/auth.py app/companion.py app/companion_chat.py app/config.py app/db.py app/domain.py app/gamification.py app/imports.py app/main.py app/models.py app/seed.py assets/snow_leopard/Irbis_SnowLeopard.blend assets/snow_leopard/Irbis_SnowLeopard.glb assets/snow_leopard/Open_Model.cmd assets/snow_leopard/model_info.json assets/snow_leopard/previews/Idle_Breathe.gif assets/snow_leopard/previews/Idle_Breathe.mp4 assets/snow_leopard/previews/Idle_LookAround.gif assets/snow_leopard/previews/Idle_LookAround.mp4 assets/snow_leopard/previews/Irbis_back.png assets/snow_leopard/previews/Irbis_front.png assets/snow_leopard/previews/Irbis_portrait.png assets/snow_leopard/previews/Irbis_side.png assets/snow_leopard/previews/clips.json assets/snow_leopard/source/animation.py assets/snow_leopard/source/build_character.py assets/snow_leopard/source/export_character.py assets/snow_leopard/source/materials.py assets/snow_leopard/source/render_previews.py assets/snow_leopard/textures/materials_preview.png assets/snow_leopard/textures/snow_leopard_coat_basecolor.png assets/snow_leopard/textures/snow_leopard_fur_basecolor.png assets/snow_leopard/textures/snow_leopard_muzzle_basecolor.png assets/snow_leopard/textures/snow_leopard_sweater_basecolor.png assets/snow_leopard/textures/snow_leopard_trim_basecolor.png assets/snow_leopard/textures/snow_leopard_trousers_basecolor.png assets/snow_leopard/validation.json demo/activity_history.csv demo/employees.json demo/events.json demo/skills.json docs/IRBIS_SYSTEM_PROMPT.md frontend/api.js frontend/app.js frontend/assets/MANROPE_LICENSE.txt frontend/assets/login-team.jpg frontend/assets/manrope.ttf frontend/backend.js frontend/companion-chat.css frontend/companion-chat.js frontend/companion-preview.js frontend/companion.css frontend/companion.js frontend/domain.js frontend/gamification.js frontend/icons.js frontend/index.html frontend/mascot-assets.json frontend/mascot-renderer.js frontend/package.json frontend/preview.js frontend/styles.css frontend/tokens.css frontend/ui.js frontend/views-hr.js frontend/views.js launcher.cmd pyproject.toml scripts/check_dataset.py scripts/launcher.py scripts/preview_ui.py scripts/uv-manifest.json starter-data/activity_history.csv starter-data/employees.json starter-data/events.json starter-data/skills.json tests/__init__.py tests/ai-integration-ui.test.mjs tests/companion-preview.test.mjs tests/companion-stream.test.mjs tests/companion-ui.test.mjs tests/conftest.py tests/domain.test.mjs tests/frontend-import.test.mjs tests/frontend-redesign.test.mjs tests/frontend.test.mjs tests/gamification-ui.test.mjs tests/mascot-renderer.test.mjs tests/test_b_integration.py tests/test_b_provider.py tests/test_backend.py tests/test_companion.py tests/test_companion_chat.py tests/test_demo_dataset.py tests/test_gamification.py tests/test_launcher_windows.py tests/test_seed.py uv.lock
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.