AAYMA
RU
Войти

Career Quest

AI-навигатор развития: 1–3 следующих шага к грейду с объяснением минимум по 3 факторам, HR-дашборд с пробелами каталога, AI-чат с tool calling…

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

О проекте

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

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

Суть

AI-навигатор развития: 1–3 следующих шага к грейду с объяснением минимум по 3 факторам, HR-дашборд с пробелами каталога, AI-чат с tool calling, моделирование пути, менторы, геймификация («сад навыков», баллы).

Как устроено

Датасет валидируется Pydantic, навыки пересчитываются с учётом завершений после last_review_date, фильтры доступности отсекают активности, прозрачная формула скоринга даёт бонус за открытие пререквизитов. 6 лучших кандидатов отдаются LLM (gpt-6-sol, параллельно gpt-6-luna как резерв) со Structured Outputs; валидатор проверяет 1–3 шага из списка и ≥3 фактора, при таймауте 8.5 с используется шаблон. Чат-агент вызывает инструменты движка, what-if делает жадное перепланирование до 5 шагов.

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

  • прозрачный скоринг
  • Structured Outputs
  • function calling
  • гонка двух моделей с валидатором
  • жадная симуляция пути
  • бенчмарк на профилях-ловушках
  • HMAC-токены

Метрики

Бенчмарк на 9 профилях-ловушках: 9/9 против 0/9 у правила «самый низкий навык»; 26 тестов; ответ AI 5–7 с (требование ≤10 с)

Особенности

Бенчмарк «ловушек», где наивное правило ошибается, как доказательство качества. Модель может ссылаться только на факторы, реально верные для активности. Сначала мгновенно показывается ответ по правилам, затем он заменяется AI-версией с кэшем по состоянию профиля. Есть HR-сигналы поддержки вместо скрытого «риска увольнения» и расчёт стоимости AI на 40/1000/15000 сотрудников.

Стек

Python · FastAPI · Pydantic · HTML/JavaScript · OpenAI API

Модели

gpt-6-sol · gpt-6-luna · gpt-image-2.5 · OpenRouter / vLLM (настраиваемо)


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

README

README.md

Career Quest — AI-навигатор развития сотрудника

Русский · English · Қазақша

HackAlem AI 2026 · Track 03 · Management · кейс Career Quest (Halyk Bank) — «платформа геймификации жизненного цикла сотрудника». Команда Nyanachi.

Краткое описание

Сотрудник получает карьерные события разрозненными уведомлениями и не видит, куда ведёт каждая активность, поэтому обучение проходится формально. Career Quest показывает сотруднику путь к следующему грейду и предлагает 1–3 следующих шага с объяснением «почему именно это», опираясь на несколько факторов сразу: разрывы в навыках относительно требований следующего грейда, критичность навыка для повышения, историю участия (неявки, отказы, брошенные активности по форматам) и ожидаемый прирост навыка. HR видит, какие навыки отстают чаще всего, у кого нет доступного следующего шага и как проходят активности.

Пользователи: сотрудник со стажем 1–5 лет (основной) и HR / руководитель.

Быстрый старт

git clone https://github.com/BAITC-Hacks/hack-34398b15-nyanachi.git
cd hack-34398b15-nyanachi
./run.sh                 # Python 3.12+; открыть http://127.0.0.1:8000
  • Без API-ключа всё работает в режиме правил; для AI-обоснований — cp .env.example .env и указать OPENAI_API_KEY.
  • Интерфейс открывается на английском; язык KZ / RU / EN переключается справа вверху. Названия кнопок ниже даны по-английски (в RU-интерфейсе: «Подобрать шаги», «Отметить завершённым»).
  • Экран сотрудника: выбрать E0001 → «Recommend next steps» → «Mark as done». Обоснования пишутся на языке сотрудника (preferred_language): у E0001 это казахский, у E0002 — русский.
  • Экран HR: переключатель «View» → «HR», пароль hr-demo (переменная HR_PASSWORD).
  • Проверка: .venv/bin/python -m pytest -q (26 тестов) и .venv/bin/python -m eval.run_benchmark (9/9).

Скриншоты

Экран сотрудника: готовность к цели, навыки, рекомендованные шаги с факторами

Экран HR: готовность команды, что требует внимания, отстающие навыки

Мобильная версия: сотрудник и HR:

Мобильная версия: сотрудник и HR (1) Мобильная версия: сотрудник и HR (2)

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

Обязательные требования кейса:

ТребованиеГде смотреть
Профиль и траектория: роль, грейд, навыки, пройденные активности, доступные шагиЭкран сотрудника: карточка «Career readiness» (процент готовности к цели), «Skills for target» — шкалы «текущий / требуемый», критичные навыки подсвечены
AI-рекомендация 1–3 следующих шаговКнопка «Recommend next steps» (POST /api/employees/{id}/recommend)
Объяснение минимум по 3 факторамТекст обоснования + теги факторов + чипы с числами (разрыв, критичность, прирост, «завершено X из Y в этом формате»)
Обновление прогресса«Mark as done» → прирост навыка с учётом max_level, пересчёт готовности к грейду и рекомендаций
Простой HR-экранОтстающие навыки, сотрудники без рекомендуемого шага (с причиной), участие по активностям
Загрузка дополнительных профилей и истории в формате датасета (минимальный профиль как в примере кейса — employee_id, role, grade, tenure_months, skills — тоже принимается)HR-экран → загрузка employees.json / activity_history.csv (POST /api/data/upload)
Доступные следующие шаги на профилеСписок «Available next steps» с форматом, ближайшей сессией и приростом навыков

Сверх обязательного:

  • AI-навигатор (чат с агентом) — сотрудник спрашивает «почему этот шаг первый?», «кто может быть моим ментором?», «что нужно для Lead?». Агент (gpt-6-sol, function calling) сам вызывает инструменты движка — обзор профиля, рекомендации, варианты по навыку, объяснение активности, моделирование пути, менторы — и отвечает только по их результатам. Инструменты ограничены данными одного вошедшего сотрудника; в интерфейсе видно, какие инструменты использовались.
  • Как считается готовность — раскрывающийся расчёт: засчитанные уровни / требуемые уровни и список недостающих уровней по навыкам.
  • «Не сейчас» с причиной — «неудобный формат», «нет времени», «не интересно». Активность скрывается; причина «формат» снижает вес этого формата в следующих рекомендациях. Без штрафов — участие добровольное.
  • «Почему не очевидный выбор» — объяснение, почему не выбран самый слабый навык (например, «вы трижды пропустили похожие активности, и навык не критичен для Senior»).
  • Цепочки пререквизитов — если ценная активность закрыта пререквизитом, система рекомендует шаг, который её открывает («открывает доступ к Designing High-Load Systems»).
  • Разрывы, которые нечем закрыть — критичные навыки, для которых в каталоге нет доступной активности; сотруднику предлагается обсудить менторство, HR видит пробел в каталоге.
  • Бенчмарк на ловушках — 9 профилей, на которых правило «самый низкий навык» ошибается: базовое правило 0/9, Career Quest 9/9.
  • Обоснования на языке сотрудника (kk / ru / en по preferred_language), интерфейс на KZ / RU / EN; названия 60 навыков, 40 активностей и 8 ролей переведены на казахский и русский (web/i18n_names.json, данные датасета не меняются).

Опциональные пункты кейса:

  • Моделирование перехода на грейд — «Что если»: система берёт лучший шаг, применяет прирост навыков и планирует заново (до 5 шагов) с датами ближайших сессий по порядку. Пример: E0001 — готовность 54.5% → 75.8% к декабрю. Ничего не сохраняется.
  • Расширенный HR-дашборд — фильтр по подразделению и «пробелы каталога»: навыки, нужные сотрудникам для цели, которые не может поднять ни одна доступная активность (например, Leadership нужен 39 сотрудникам и критичен для повышения 37, а курса нет).
  • Менторство — для самых больших разрывов подбираются коллеги того же подразделения уровня Senior/Lead, сильные в этом навыке и готовые менторить (Mentoring ≥ 3 или пройден Mentor Track). Показываются только имя и роль, уровни навыков коллег не раскрываются.
  • Внутренняя валюта и награды — баллы только за добровольные активности (+10 за активность, +10 за каждый поднятый уровень навыка), обязательные обучения баллов не дают; каталог наград и обмен баллов. Баланс видит только сам сотрудник.
  • Личные челленджи — добровольная цель из смоделированного пути («достичь API Design 3 к 23 ноября»), +50 баллов при выполнении.
  • Конструктор активностей для HR — в таблице «пробелы каталога» кнопка «Создать активность»: система заполняет черновик под роли и грейды заблокированных сотрудников (например, Leadership — 39 человек), HR правит и публикует, активность сразу попадает в рекомендации, пробел закрывается.
  • Кому нужна поддержка (вместо «риска увольнения») — HR видит понятные сигналы без скрытого балла: пропуски за год, просроченные обязательные обучения, нет завершённых активностей 6 месяцев, нет карьерной цели, долго Junior — и предложенное действие (спросить о формате, проверить нагрузку, предложить ментора, поговорить о целях). Только для HR.
  • Признание коллег — «Поблагодарить» ментора из своего подразделения: получатель видит благодарность и +15 баллов; не больше 3 благодарностей в день и одной одному и тому же коллеге в неделю; ничего не публикуется.
  • Цель команды — общий прогресс подразделения (завершённые добровольные активности за 90 дней против одной на человека), анонимно и без сравнения людей.
  • Скорость — рекомендации сначала мгновенно в режиме правил, затем заменяются AI-версией; AI-ответ кэшируется по состоянию профиля и заранее подгружается при открытии профиля.
  • Сад навыков и уровень — каждый навык цели показан растением, стадия роста = реальный уровень навыка (0–5); личный уровень (Seedling → Forest keeper) растёт с баллами. Сад можно показать коллегам своего подразделения только по взаимному согласию; рейтингов нет. Изображения растений сгенерированы gpt-image-2.5 во время хакатона.
  • Работа без API-ключа (режим правил) с шаблонными обоснованиями.

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

Как выбирается следующий шаг

  1. Загрузка стартового датасета (data/) и, при необходимости, дополнительных профилей и истории; схема проверяется Pydantic-моделями.
  2. Эффективные навыки. Уровни навыков отражают последнюю аттестацию, поэтому к ним добавляется прирост от активностей, завершённых после last_review_date (с ограничением max_level).
  3. Цель. career_goal, если задана (в том числе в другой роли), иначе следующий грейд текущей роли; у Lead без цели — критичные навыки текущего грейда.
  4. Фильтры доступности. Исключаются обязательные активности, уже пройденные (кроме повторяемой EV_036), активности в процессе, не подходящие по роли/грейду, с невыполненными пререквизитами, без будущих сессий и без оставшегося прироста навыка.
  5. Скоринг каждой доступной активности по прозрачной формуле (ниже) + бонус за открытие ценной активности через пререквизит.
  6. AI-слой. gpt-6-sol получает 6 лучших кандидатов с посчитанными факторами и выбирает 1–3 шага, формулируя обоснование на языке сотрудника (Structured Outputs, строгая JSON-схема). Валидатор проверяет: 1–3 шага, только ID из списка кандидатов, ≥3 фактора на шаг. gpt-6-luna запускается параллельно как запасной вариант; если ни одна модель не ответила корректно за 8.5 с — используются шаблонные обоснования. Типичное время ответа 5–7 с (требование кейса ≤10 с).
  7. Прогресс. «Mark as done» добавляет запись в историю, навыки и готовность пересчитываются.

Надёжность рекомендаций

  • Рекомендуются только полезные шаги — закрывающие разрыв к цели или открывающие такую активность; «1–3» означает до трёх, без заполнения мест бесполезным. Если полезных шагов нет, сотрудник видит «поговорите о менторстве», а HR — этого сотрудника с причиной.
  • Активность, от которой сотрудник дважды отказался, больше не предлагается; повторяемый клуб (EV_036) засчитывается не чаще раза в день.
  • Прирост от завершённых активностей учитывается один раз: отметка «выполнено» не переписывает дату аттестации, поэтому прирост не удваивается.
  • AI может заявлять только факторы, которые действительно верны для активности (например, «критично для грейда» — только если шаг закрывает критичный разрыв). Неподтверждённые факторы отбрасываются; если осталось меньше трёх — используется шаблонное обоснование.
  • Для смены роли (цель в другой роли) подходят базовые активности целевой роли до целевого грейда включительно.
  • AI не может ухудшить выбор движка: в ответе обязан быть шаг с наибольшим score, нельзя выбирать избегаемый формат при наличии альтернативы, и хотя бы один фактор должен быть не производным от разрыва (история, формат, сроки, цель, критичность). Иначе — шаблонное обоснование.
  • «Отметить выполненным» принимает только допустимые активности: повтор пройденной, обязательная, не своя роль/грейд или невыполненные пререквизиты — 422.
  • Активности «в процессе» не рекомендуются заново, а показываются как «завершите начатое».
  • На каждой карточке раскрывается «Why this ranking» — вклад каждой части формулы в итоговый score.
  • 26 тестов; один из них проверяет всех 200 сотрудников и профили-ловушки: шаги допустимы, не обязательные, не повторные, детерминированы и имеют ≥3 подтверждённых фактора.

Формула скоринга

полезный_прирост(навык) = min(новый_уровень, требуемый) − текущий        # новый_уровень = min(текущий + gain, max_level)
очки_разрыва = Σ полезный_прирост × (2, если навык критичен для цели, иначе 1)
надёжность   = 0.7 × доля_завершений(формат) + 0.3 × доля_завершений(тип)   # доля = (завершено+1)/(завершено+пропущено+2)
score = (очки_разрыва + 0.2 × прирост_сверх_требования) × (0.2 + 0.8 × надёжность)
        × 0.6, если формат избегается (≥3 пропуска и 0 завершений)
        × 0.9 / 1.05, если средняя оценка сотрудником такого типа активностей ≤2.5 / ≥4.5
        − 0.25 × max(0, пропуски_похожих − 1) − 0.01 × часы − 0.15, если ближайшая сессия дальше 90 дней
        + 0.5 × score_заблокированной_активности, если шаг открывает её пререквизит
готовность к цели, % = Σ min(уровень, требуемый) / Σ требуемый

Технологии

  • Python 3.12, FastAPI, Pydantic, Uvicorn
  • OpenAI API: gpt-6-sol (основная модель), gpt-6-luna (быстрый запасной вариант), Responses API со Structured Outputs
  • Интерфейс: один файл HTML/CSS/JS без сборки и внешних CDN (работает во внутреннем контуре)
  • pytest

Стоимость AI (оценка)

Токены измерены на реальных вызовах: одна AI-рекомендация ≈ 2 050 входных и ≈ 300 выходных токенов (gpt-6-sol + параллельный запасной gpt-6-luna), один вопрос навигатору ≈ 2 050 / 170 токенов (2–3 вызова модели в цикле инструментов). Цены: gpt-6-sol $2 / $10, gpt-6-luna $0.10 / $0.50 за 1 млн токенов.

На сотрудника в месяц40 сотрудников1 00015 000
Обычное использование: 8 новых AI-рекомендаций + 10 вопросов навигатору≈ $0.12≈ $5≈ $117≈ $1 760
Активное использование (×3)≈ $0.35≈ $14≈ $350≈ $5 270
Только gpt-6-luna (OPENAI_MODEL=gpt-6-luna)≈ $0.006< $1≈ $6≈ $87
Режим правил (без ключа)$0$0$0$0
  • На HR-экране блок «AI budget» пересчитывает эти суммы для любой численности и показывает реально потраченные на этом сервере токены.
  • Повторные просмотры не стоят денег: AI-ответ кэшируется по состоянию профиля, новый вызов — только после «выполнено», «не сейчас» или новой активности.
  • Для закрытого контура: OPENAI_BASE_URL указывает на Qwen в vLLM внутри банка — фиксированная стоимость GPU вместо оплаты за токены, данные не покидают банк.

Архитектура

flowchart LR
    D[data/*.json, *.csv<br/>+ загрузка HR/жюри] --> L[app/data.py<br/>загрузка и валидация]
    L --> E[app/engine.py<br/>эффективные навыки · цель · фильтры · скоринг · цепочки · HR-статистика]
    E --> A[app/agent.py<br/>gpt-6-sol ‖ gpt-6-luna → валидатор → шаблоны]
    E --> API
    A --> API[app/main.py<br/>FastAPI, роли employee / HR]
    API --> W[web/index.html<br/>экран сотрудника · экран HR]
app/config.py   настройки из окружения
app/data.py     модели данных, загрузка и слияние датасета
app/engine.py   детерминированное ядро: все числа, на которые опирается AI; путь к грейду, менторы, баллы, сад
app/agent.py    AI-выбор и обоснование, валидация, запасные варианты
app/chat.py     AI-навигатор: агент с инструментами поверх движка
app/main.py     REST API и разделение прав employee / HR
AGENTS.md       инструкция для AI-агентов (Codex, Claude Code): запуск, проверка, инварианты
web/index.html  интерфейс; web/garden/ — изображения стадий роста растений
eval/           профили-ловушки в формате датасета и бенчмарк
tests/          тесты ядра
data/           стартовый датасет организаторов

Права: POST /api/login выдаёт токен, подписанный HMAC (APP_SECRET). Сотрудник входит по своему ID (в рабочей системе — через SSO банка), HR — по паролю HR_PASSWORD (по умолчанию hr-demo). Каждый персональный эндпоинт требует токен в заголовке Authorization: Bearer <токен> или X-Auth-Token: <токен> (интерфейс использует второй, чтобы не конфликтовать с basic-auth прокси): без токена или с подделанным токеном — 401, сотрудник с чужим профилем или HR-данными — 403. Открыты только каталог (навыки, активности, .ics) и метаданные. Публичных рейтингов нет.

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

Требования: Python 3.12+, Linux/macOS (или WSL), доступ в интернет для установки пакетов.

git clone https://github.com/BAITC-Hacks/hack-34398b15-nyanachi.git
cd hack-34398b15-nyanachi
./run.sh                 # создаёт .venv, ставит зависимости, запускает http://127.0.0.1:8000

Интерфейс: http://127.0.0.1:8000 · документация API: http://127.0.0.1:8000/docs

Экран HR открывается паролем hr-demo (меняется переменной HR_PASSWORD).

Без API-ключа приложение работает в режиме правил. Чтобы включить AI-обоснования:

cp .env.example .env     # и указать OPENAI_API_KEY
./run.sh

Порт и адрес можно поменять: PORT=8080 HOST=0.0.0.0 ./run.sh.

Переменные окружения

ПеременнаяПо умолчаниюНазначение
OPENAI_API_KEYпустоКлюч OpenAI. Пусто — режим правил без AI
OPENAI_MODELgpt-6-solОсновная модель
OPENAI_FAST_MODELgpt-6-lunaЗапасная быстрая модель
AI_TIMEOUT_S8.5Бюджет времени на AI-ответ
DATA_DIR./dataПапка с датасетом
HR_PASSWORDhr-demoПароль HR-экрана
APP_SECRETслучайный при запускеКлюч подписи токенов (задайте, чтобы токены переживали перезапуск)
OPENAI_BASE_URLпустоЛюбой OpenAI-совместимый сервер: OpenRouter или vLLM внутри контура банка. Пусто — api.openai.com
AI_REASONINGnoneУровень рассуждений модели (скорость ответа)
CHAT_TIMEOUT_S20Бюджет времени на ответ навигатора

Зависимости

requirements.txt: fastapi, uvicorn, python-multipart, pydantic, openai, python-dotenv, pytest (версии закреплены).

Как проверить решение

1. Тесты и бенчмарк (без ключа):

.venv/bin/python -m pytest -q                 # 26 тестов
.venv/bin/python -m eval.run_benchmark        # режим правил: Baseline 0/9 · Career Quest 9/9
.venv/bin/python -m eval.run_benchmark --ai   # с AI (нужен ключ): тоже 9/9

2. Сценарий сотрудника в интерфейсе (числа ниже — для только что запущенного сервера: отметки «выполнено» и загрузки хранятся в памяти до перезапуска):

  1. Открыть http://127.0.0.1:8000, режим «Employee», выбрать E0001 (Backend Engineer, Junior → Middle, готовность 54.5%).
  2. Нажать «Recommend next steps». В режиме правил ожидаются System Design Fundamentals (с чипом «Closes a critical gap» и «Unlocks Designing High-Load Systems»), Cloud Certification Prep, Public Speaking Club. С ключом — выбор и формулировки от gpt-6-sol.
  3. Нажать «Mark as done» у первого шага — шкалы System Design и API Design и процент готовности в карточке «Career readiness» растут.

3. Загрузка профилей, как на защите: режим «HR» (пароль hr-demo) → загрузить eval/trap_employees.json и eval/trap_history.csv → выбрать сотрудника E9103 (пропускает офлайн-занятия). Ожидается первым шагом онлайн-активность Architecture Review Circle, а не офлайн-воркшоп по той же теме. Быстрее: HR → «Upload data» → «Load example data» загружает эти же файлы одной кнопкой и показывает кнопки открытия добавленных профилей; там же ссылки на файлы-примеры (GET /api/data/examples/employees.json, .../activity_history.csv).

Форматы загрузки, чтобы файлы жюри принимались как есть: профили — файл стартового набора {"employees": [...]}, список профилей или один объект профиля, как в примере кейса; навыки — по ID (SK_SYSTEM_DESIGN) или по названию (System Design). История — CSV с разделителем , или ;, с BOM из Excel или без; обязательны только employee_id, event_id, date, status. Если загружен изменённый профиль с уже существующим ID (например, E0028 из примера кейса), его история из стартового датасета больше не учитывается — профиль оценивается по загруженной истории (порядок загрузки файлов не важен). Ошибки (неизвестная роль, навык или активность) возвращаются понятным сообщением 422.

Принимается и минимальный профиль, как в примере кейса (остальные поля заполняются значениями по умолчанию), — JSON-список или {"employees": [...]}:

[{"employee_id": "E9999", "role": "Backend Engineer", "grade": "Junior",
  "tenure_months": 14, "skills": {"SK_PYTHON": 2, "SK_SQL": 1}}]

4. Опциональные функции (без ключа): на экране сотрудника E0001 пункты левого меню и вкладки внизу страницы — «What if» (путь к грейду: 54.5% → 75.8% к декабрю), «Mentors», «Points» (принять челлендж, обменять баллы), «Garden» (после «Mark as done» растения растут). На HR-экране (пароль hr-demo) — фильтр подразделения, «Catalogue gaps» с кнопкой «Create activity» и блок «Who may need support». У ментора — «Say thanks».

5. Навигатор (нужен OPENAI_API_KEY): вкладка «Navigator» («Ask your navigator») → «Why is this my first step?». В ответе — ссылки на реальные активности и строка «Checked: …» с вызванными инструментами. Без ключа эндпоинт возвращает 503 с понятным сообщением, остальное приложение работает.

6. Через API (сначала получить токены):

login() { curl -s -X POST http://127.0.0.1:8000/api/login -H "Content-Type: application/json" -d "$1" \
          | python3 -c "import json,sys; print(json.load(sys.stdin)['token'])"; }
EMP=$(login '{"role":"employee","employee_id":"E0001"}')
HR=$(login '{"role":"hr","password":"hr-demo"}')

curl -X POST "http://127.0.0.1:8000/api/employees/E0001/recommend?ai=false" -H "Authorization: Bearer $EMP"
curl -X POST http://127.0.0.1:8000/api/employees/E0001/complete -H "Authorization: Bearer $EMP" \
     -H "Content-Type: application/json" -d '{"event_id":"EV_005"}'
curl http://127.0.0.1:8000/api/employees/E0001/path    -H "Authorization: Bearer $EMP"
curl http://127.0.0.1:8000/api/employees/E0001/mentors -H "Authorization: Bearer $EMP"
curl http://127.0.0.1:8000/api/employees/E0001/wallet  -H "Authorization: Bearer $EMP"
curl http://127.0.0.1:8000/api/employees/E0001/garden  -H "Authorization: Bearer $EMP"
curl -X POST http://127.0.0.1:8000/api/employees/E0001/chat -H "Authorization: Bearer $EMP" \
     -H "Content-Type: application/json" -d '{"message":"Why is this my first step?"}'
curl http://127.0.0.1:8000/api/hr/summary -H "Authorization: Bearer $HR"
curl "http://127.0.0.1:8000/api/hr/summary?department=Sales" -H "Authorization: Bearer $HR"
curl -X POST http://127.0.0.1:8000/api/data/upload -H "Authorization: Bearer $HR" \
     -F employees=@eval/trap_employees.json -F history=@eval/trap_history.csv
curl -o /dev/null -w "%{http_code}\n" http://127.0.0.1:8000/api/hr/summary   # 401 без токена

Бенчмарк на профилях-ловушках

ЛовушкаПравило «самый низкий навык»Career Quest
Самый слабый навык (Public Speaking) трижды пропущен, критичен System Design❌ Public Speaking Club✅ шаг по System Design
Уровень Cloud устарел: сертификация пройдена после аттестации❌ Cloud Certification Prep✅ не тратит шаг на уже закрытый навык
Критичный разрыв в System Design, сотрудник не ходит офлайн❌✅ онлайн Architecture Review Circle
Цель — Data Analyst, а не Senior Backend❌✅ навыки аналитика
Ценные активности закрыты пререквизитом❌✅ System Design Fundamentals как открывающий шаг
Курс упирается в max_level, уровень уже максимальный❌✅ курс без прироста не рекомендуется
Устаревший навык и избегание офлайна одновременно❌✅ онлайн-шаг по System Design, не Cloud
Lead с целью Data Analyst Senior (смена роли)❌✅ Applied Statistics — основа критичного навыка
Нет истории участия вообще❌✅ шаг по критичному разрыву
Итого0/99/9 (и в режиме правил, и с AI)

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

  • data/ — синтетический стартовый датасет организаторов (200 сотрудников, 40 активностей, 60 навыков, 2 743 записи истории, дата среза 2026-10-01). Включён только для проверки решения, не для распространения.
  • eval/ — наши синтетические профили-ловушки в той же схеме.
  • Внешний сервис: OpenAI API (только для формулировки рекомендаций; модель получает профиль одного сотрудника без ФИО и уже посчитанные факторы). Без ключа не используется.
  • Реальные персональные данные не используются.

Deployed-версия (демо)

Демо с настроенным AI-ключом: https://kitan-a.com/careerquest/ — закрыто паролем, так как содержит данные кейса.

Вход на страницу (окно браузера)логин judge, пароль [скрыто]
Экран HR внутри приложенияпароль hr-demo

Ссылки в один клик (логин уже в ссылке; если браузер всё же спросит — judge / [скрыто]):

Те же параметры работают и локально, например http://127.0.0.1:8000/?view=hr&hr=hr-demo. После открытия они убираются из адресной строки.

Демо работает на последнем коммите этого репозитория и перезапускается с чистыми данными датасета; загрузки и отметки «выполнено» хранятся до перезапуска. Для самостоятельной проверки без наших учётных записей достаточно ./run.sh (режим правил) или собственного OPENAI_API_KEY.

Ограничения

  • Вход демо-уровня: сотрудник выбирает свой ID, HR вводит пароль; токены подписаны HMAC. Подключение к SSO банка (Azure AD / Keycloak) — замена эндпоинта /api/login, остальная проверка прав не меняется.
  • Данные хранятся в памяти процесса: загрузки и отметки «выполнено» сбрасываются при перезапуске.
  • Отметка «выполнено» делается самим сотрудником (как требует сценарий кейса); в рабочей системе факт завершения должен приходить из LMS или подтверждаться руководителем, прежде чем начислять баллы.
  • Баллы, челленджи, обмены и настройки «поделиться садом» хранятся в памяти процесса и сбрасываются при перезапуске.
  • Каталог наград и пороги уровней заданы в коде как пример; в реальной системе их настраивает HR.
  • Веса формулы скоринга подобраны вручную на датасете и профилях-ловушках, без обучения на реальных исходах.
  • Интеграций с HRIS и мессенджерами нет; календарь — только экспорт .ics (кнопка «Add to calendar»), без синхронизации.

Использованные компоненты и AI-инструменты

  • Открытые библиотеки из requirements.txt (лицензии MIT/BSD/Apache-2.0).
  • До 13:00 в репозиторий были отправлены только проверка доступа (.gitignore, .env.example), небольшой шаблон-заготовка (Streamlit + пример вызова OpenAI, ~200 строк) и примеры вызова API. Они не относятся к кейсу и удалены после 13:00; вся логика Career Quest (движок, AI-слой, API, интерфейс, тесты) написана во время соревновательной части — это видно по истории коммитов.
  • Разработка с помощью AI-агентов: Claude Code (Anthropic) и Codex (OpenAI); Codex также использовался для черновика интерфейса и тестирования страницы. Иллюстрации (иконки, растения сада, схема пайплайна) сгенерированы gpt-image-2.5 во время хакатона.
Звёзды
⭐ 0
Форки
0
Язык
HTML
Последний push
в прошлом месяце
Коммиты
63
Авторы
1
Файлы
72
Ветки
1

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

vladimiralbrekhtccr 63

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

  • 2026-09-23 17:32Final submission: one-click HR link also works with credentials in the URL (browsers forbid rewriting such URLs)vladimiralbrekhtccr
  • 2026-09-23 17:29Final submission: one-click demo links (?employee=, ?view=hr&hr=, &lang=) and links in README (RU/EN/KZ)vladimiralbrekhtccr
  • 2026-09-23 17:26Final submission: demo credentials for the jury in README (RU/EN/KZ)vladimiralbrekhtccr
  • 2026-09-23 17:23Final submission: Career Quest — AI-навигатор развития сотрудника (HackAlem AI 2026 · Track 03 Management · Halyk Bank)vladimiralbrekhtccr
  • 2026-09-23 16:56Jury round 4: CSV rows with trailing commas, rollback on any upload error, rules mode also skips avoided formats when alternatives exist, weak format history worded as a caveat; README numbers and lanvladimiralbrekhtccr
  • 2026-09-23 16:54AGENTS.md for AI coding agents (run, verify, map, invariants); CLAUDE.md imports itvladimiralbrekhtccr
  • 2026-09-23 16:42README screenshots per language (RU/EN/KZ, desktop and mobile); mobile: language switcher next to the logo, stats as a 2x2 gridvladimiralbrekhtccr
  • 2026-09-23 16:35Rules-mode explanations always name gap vs target, participation history and timing (also for new formats and self-paced activities)vladimiralbrekhtccr
Все коммиты (63)
  • 2026-09-23 16:33AI budget as mode cards with live headcount recalculationvladimiralbrekhtccr
  • 2026-09-23 16:33HR sections redesigned: people lists with names, target and reason pills and open-profile buttons; support signals and suggested actions as chips; catalogue gaps with demand bars; participation as stavladimiralbrekhtccr
  • 2026-09-23 16:29Kazakh and Russian names for skills, activities and roles in the UI and in rules-mode explanations (web/i18n_names.json)vladimiralbrekhtccr
  • 2026-09-23 16:25Navigator explains and disables itself without an API key (ai_enabled in /api/meta); README screenshots of the employee and HR screensvladimiralbrekhtccr
  • 2026-09-23 16:23Jury round 3: all-or-nothing uploads, schema validation (levels 0-5, statuses, dates) with row-level 422s, duplicate rows inside one file, activity latest state (in-progress covers its gaps, clears afvladimiralbrekhtccr
  • 2026-09-23 16:17Jury upload robustness: single profile object (as in the case example), skill names, CSV with ';' / Excel BOM / only employee_id,event_id,date,status; a changed profile under an existing id drops its vladimiralbrekhtccr
  • 2026-09-23 16:11HR overview mirrors the employee page: stats card, team readiness hero (average readiness, people 80%+ ready), needs-attention list, upload and AI budget cardsvladimiralbrekhtccr
  • 2026-09-23 16:09HR page in sections with sidebar: overview with 'Needs attention' actions and clickable KPIs; upload wizard with example files and one-click example data that links to the added profilesvladimiralbrekhtccr
  • 2026-09-23 16:02README: English and Kazakh versions with language switcher; quick start, HR password, minimal upload example, track name, fresh-server note, 26 tests and new reliability rules, .ics-only calendar wordvladimiralbrekhtccr
  • 2026-09-23 15:55UI version B layout: sidebar navigation, stats row, career readiness hero card, skills card, recommendations with garden and mentor cards; mobile layoutvladimiralbrekhtccr
  • 2026-09-23 15:46Jury round 2: no review-date rewrite, profile-aware AI cache, no padding steps, declined-twice and once-per-day rules, history index, kudos pair limit, navigator refuses questions about colleagues + dvladimiralbrekhtccr
  • 2026-09-23 15:43UI version B: header navigation, recommendations first, garden card with illustration, skill readiness card, mentoring chipvladimiralbrekhtccr
  • 2026-09-23 15:36Jury fixes: mark-done only for eligible activities, AI cannot override the engine's top pick or pick avoided formats, factor diversity, minimal profile upload; README accuracyvladimiralbrekhtccr
  • 2026-09-23 15:32Smoother HR page: cached HR summary (1.2 s -> ms, warmed at start), skeleton loading and fade-in transitionsvladimiralbrekhtccr
  • 2026-09-23 15:29Remember login, view and employee across page reloads (per-tab session storage)vladimiralbrekhtccr
  • 2026-09-23 15:25HR AI budget: live cost calculator by headcount and real token usage recorded per callvladimiralbrekhtccr
  • 2026-09-23 15:19UI: summary chips under the name (readiness, level, plants, points, uncovered critical skill) and tabs for navigator, garden, points, path, mentorsvladimiralbrekhtccr
  • 2026-09-23 15:17README: measured AI cost per employee and at 40 / 1,000 / 15,000 employees; nicer pipeline diagramvladimiralbrekhtccr
  • 2026-09-23 15:13UI: generated icon set for activity types and skill categories; recommendation pipeline diagram in READMEvladimiralbrekhtccr
  • 2026-09-23 15:09Fix live demo: UI sends the app token as X-Auth-Token so it does not clash with the proxy's Basic authvladimiralbrekhtccr
  • 2026-09-23 15:05Robust recommendations: useful-only steps, AI may only claim factors true for the activity, career-switch fundamentals, feedback and timing factors, score breakdown per card, finish-what-you-started nvladimiralbrekhtccr
  • 2026-09-23 15:00README: precise disclosure of pre-13:00 commits (access check, small template, API examples; all replaced)vladimiralbrekhtccr
  • 2026-09-23 14:58README: event builder, support signals, peer recognition, team goal, speedvladimiralbrekhtccr
  • 2026-09-23 14:58Peer recognition (thank a colleague, private points, daily limit) and cooperative team goal in the gardenvladimiralbrekhtccr
  • 2026-09-23 14:56HR: who may need support — plain-language signals and suggested supportive actions (no opaque risk score)vladimiralbrekhtccr
  • 2026-09-23 14:54HR event builder: pre-filled activity for a catalogue gap, published straight into recommendationsvladimiralbrekhtccr
  • 2026-09-23 14:52Speed: instant rules results upgraded to AI in place, per-profile-state AI cache, background prefetch on profile openvladimiralbrekhtccr
  • 2026-09-23 14:51Security: signed login tokens (HMAC), HR behind a password, 401 for missing/forged tokens; UI auto-login and HR sign-invladimiralbrekhtccr
  • 2026-09-23 14:43LLM provider is configurable (OPENAI_BASE_URL: OpenRouter or on-prem vLLM); README documents navigator, readiness breakdown, Not-now reasonsvladimiralbrekhtccr
  • 2026-09-23 14:39Not now with a reason (format / time / not interested): hides the activity, format feedback lowers that format; template wording fixvladimiralbrekhtccr
  • 2026-09-23 14:37Explainability: readiness breakdown (counted / required levels, missing levels) in API and UIvladimiralbrekhtccr
  • 2026-09-23 14:37AI navigator chat: tool-calling agent over the engine (overview, recommendations, skill options, activity explanation, path, mentors)vladimiralbrekhtccr
  • 2026-09-23 14:28Fix: page works when opened via a URL with embedded basic-auth credentials (clean base URL)vladimiralbrekhtccr
  • 2026-09-23 14:26Calendar export (.ics) for recommended and planned sessions; mobile layout fixes for HR and gardenvladimiralbrekhtccr
  • 2026-09-23 14:23README: document optional features (path, HR catalogue gaps, mentors, points/rewards/challenges, skill garden)vladimiralbrekhtccr
  • 2026-09-23 14:22Skill garden: plants grow with real skill levels, personal level from points, mutual opt-in sharing within a departmentvladimiralbrekhtccr
  • 2026-09-23 14:19Gamification: private points (voluntary only), rewards catalogue with redemption, opt-in personal challengesvladimiralbrekhtccr
  • 2026-09-23 14:17Mentoring: suggest Senior/Lead colleagues in the same department for the biggest gaps (no skill levels exposed)vladimiralbrekhtccr
  • 2026-09-23 14:16Fix: restore template rationales and path simulation accidentally dropped in the HR dashboard commitvladimiralbrekhtccr
  • 2026-09-23 14:15Extended HR dashboard: department filter and catalogue gaps (skills people need that no activity can raise)vladimiralbrekhtccr
  • 2026-09-23 14:13Must-have audit: list available next steps on the profile; upload keeps jury rows even if record_ids restartvladimiralbrekhtccr
  • 2026-09-23 14:12What-if path to target grade: greedy re-planning simulation with chronological sessions (API + UI panel)vladimiralbrekhtccr
  • 2026-09-23 14:07README: full organiser structure (RU), scoring formula, benchmark table, check scenarios, limitationsvladimiralbrekhtccr
  • 2026-09-23 14:04Web UI: employee path + AI steps + HR overview; unlock chips, readable reasons, relative API pathsvladimiralbrekhtccr
  • 2026-09-23 13:58Trap-profile benchmark (6 traps, baseline 0/6 vs ours 6/6); stronger format-avoidance scoringvladimiralbrekhtccr
  • 2026-09-23 13:54Prerequisite chains: steps that unlock a blocked high-value event get a bonus and an 'unlocks' notevladimiralbrekhtccr
  • 2026-09-23 13:51AI layer: gpt-6-sol/gpt-6-luna race with validator and template fallback; upload APIvladimiralbrekhtccr
  • 2026-09-23 13:42Clean repo: remove API examples, add run.sh, update README and env templatevladimiralbrekhtccr
  • 2026-09-23 13:39Career Quest v0: data loader, recommendation engine, FastAPI API, testsvladimiralbrekhtccr
  • 2026-09-23 12:55README template: judge access via demo link or keyvladimiralbrekhtccr
  • 2026-09-23 12:54Drop NVIDIA Build example; OpenRouter default qwen/qwen3.8-27bvladimiralbrekhtccr
  • 2026-09-23 12:52Add OpenRouter example; Brev instance type from live catalogvladimiralbrekhtccr
  • 2026-09-23 12:42Add API examples: OpenAI, NVIDIA Build, Brev + vLLMvladimiralbrekhtccr
  • 2026-09-23 12:39Project skeleton: Streamlit UI, OpenAI tool-calling loop, README templatevladimiralbrekhtccr
  • 2026-09-23 12:25Add .gitignore and .env.example (repo access check)vladimiralbrekhtccr
Структура репозитория (72 файлов)
.env.example
.gitignore
AGENTS.md
CLAUDE.md
README.en.md
README.kk.md
README.md
app/__init__.py
app/agent.py
app/chat.py
app/config.py
app/data.py
app/engine.py
app/main.py
data/activity_history.csv
data/employees.json
data/events.json
data/skills.json
docs/recommendation_pipeline.png
docs/screens/employee_en.png
docs/screens/employee_kk.png
docs/screens/employee_ru.png
docs/screens/hr_en.png
docs/screens/hr_kk.png
docs/screens/hr_ru.png
docs/screens/mobile_employee_en.png
docs/screens/mobile_employee_kk.png
docs/screens/mobile_employee_ru.png
docs/screens/mobile_hr_en.png
docs/screens/mobile_hr_kk.png
docs/screens/mobile_hr_ru.png
eval/__init__.py
eval/expectations.json
eval/run_benchmark.py
eval/trap_employees.json
eval/trap_history.csv
requirements.txt
run.sh
tests/test_engine.py
web/brand/careerquest-180-v1.png
web/brand/careerquest-192-v1.png
web/brand/careerquest-32-v1.png
web/brand/careerquest-v1.ico
web/garden/banner.jpg
web/garden/stage0.png
web/garden/stage1.png
web/garden/stage2.png
web/garden/stage3.png
web/garden/stage4.png
web/garden/stage5.png
web/i18n_names.json
web/icons/cat_collaboration.png
web/icons/cat_communication.png
web/icons/cat_data.png
web/icons/cat_engineering.png
web/icons/cat_frontend.png
web/icons/cat_hr.png
web/icons/cat_leadership.png
web/icons/cat_personal_effectiveness.png
web/icons/cat_product.png
web/icons/cat_quality.png
web/icons/cat_sales.png
web/icons/cat_support.png
web/icons/cat_thinking.png
web/icons/type_certification.png
web/icons/type_compliance.png
web/icons/type_course.png
web/icons/type_meetup.png
web/icons/type_mentoring.png
web/icons/type_onboarding.png
web/icons/type_workshop.png
web/index.html

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

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

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