AI Sana Challenge Hub
Полноценный Challenge Hub: конструктор задачи с уточняющими вопросами, подтверждение и публикация снимка карточки, каталог, отклики команд, кабинеты…
О проекте
Команда: Arc Team
Кейс HackAlem.ai: Образование — AI Sana
Стадия: Доведённый продукт
Задача кейса: Challenge Hub: превратить задачу бизнеса в задание для студенческих команд
Суть
Полноценный Challenge Hub: конструктор задачи с уточняющими вопросами, подтверждение и публикация снимка карточки, каталог, отклики команд, кабинеты бизнеса и команды, приёмка этапов (10 баллов), достижения и таблица лидеров.
Как устроено
Один процесс FastAPI обслуживает UI на vanilla JS, API и Swagger. Данные в SQLite с транзакциями и миграциями. Вопросы и карточку генерирует OpenAI Responses API со структурированным JSON (gpt-4o-mini) либо явно помеченные локальные шаблоны (AI_MODE=local). Рейтинг готовности считает сервер по 7 категориям с весами 20/20/15/15/10/10/10, заглушки баллов не дают. Бизнес вручную выбирает одну или несколько команд, начисление баллов идемпотентно.
Ключевые решения
- OpenAI Responses API structured JSON
- deterministic readiness scoring
- published snapshot versioning
- gamification (missions, achievements, leaderboard)
- idempotent point awarding
Особенности
Сквозной браузерный прогон обеих ролей на отдельной SQLite и 119 pytest + 6 JS-тестов. Правки рабочей карточки не меняют опубликованную версию до повторного подтверждения. Конструктор подсказывает поле с наибольшим недостающим весом.
Стек
Python · FastAPI · Uvicorn · Pydantic · SQLite · HTTPX · python-dotenv · HTML · CSS · JavaScript · pytest · Node.js
Модели
gpt-4o-mini
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-4484d2b6-arc-team.
README
README.mdAI Sana Challenge Hub
От короткого запроса бизнеса — к понятной задаче и результату студенческой команды.
Проект ARC Team, трек «Образование», кейс AI Sana на HackAlem AI. Объединённая версия включает API 0.4.0, конструктор, публичный каталог, кабинет бизнеса, кабинет команды, достижения и таблицу лидеров.
Проблема и решение
Бизнес часто описывает запрос слишком кратко: «нужно автоматизировать учёт». Студентам непонятны доступные данные, ожидаемый результат, ограничения и критерии успеха. Платформа помогает уточнить запрос вопросами, собрать проверяемую карточку и опубликовать её для команд. Команды предлагают подход, бизнес сравнивает предложения и вручную выбирает исполнителей.
AI помогает формулировать задачу. Сведения подтверждает человек; рейтинг вычисляется сервером; решения о выборе команды и приёмке результата принимает бизнес.
Что реализовано
| Возможность | Результат |
|---|---|
| Конструктор | Исходное описание, уточняющие вопросы, ответы, редактируемая карточка |
| Режимы AI | OpenAI Responses API либо явно обозначенные локальные шаблоны без внешних вызовов |
| Готовность | Балл 0–100, семь категорий, начисления по полям и недостающие сведения |
| Подтверждение и публикация | Бизнес проверяет карточку; каталог получает отдельный опубликованный снимок |
| Каталог | Поиск, тема, готовность, сортировка, полная страница и сохранение фильтров |
| Отклики | Идея, план, сроки, необязательные прототип и вопросы; локальный черновик и отправка |
| Кабинет бизнеса | Свои задачи, редактор, сравнение предложений, выбор одной/нескольких команд или отклонение |
| Кабинет команды | Свои отклики, решения бизнеса, сдача результатов выбранными командами |
| Этапы и баллы | Результат проверяется бизнесом; подтверждённый этап приносит 10 баллов, без повторного начисления |
| Геймификация | Семь шагов улучшения карточки, три достижения команды и рейтинг по подтверждённым результатам |
| Сохранность | SQLite, восстановление локального ввода, явные ошибки и защита от повторных запросов |
| Soft Retro | Единая навигация, светлая палитра, формы и статусы для обеих ролей |
Каталог показывает реальные опубликованные записи из SQLite. Он не использует catalog-demo.json и не подменяет ошибки демонстрационными карточками. Seed создаёт профили и черновики: первая публикация появляется после действия бизнеса.
Основной сценарий
Описание → вопросы → карточка → подтверждение → рейтинг → публикация → отклики → выбор команды → результат → приёмка и баллы.
- Бизнес описывает проблему и отвечает на вопросы. Неизвестное можно оставить пустым.
- Проверяет и редактирует карточку, подтверждает сведения и отдельно публикует её.
- Команды находят задачу в каталоге и отправляют свои предложения.
- Бизнес сравнивает предложения; выбирает одну, несколько команд или никого.
- Выбранная команда сдаёт этап с описанием и необязательной ссылкой.
- Бизнес подтверждает результат; команда видит принятый этап и начисленные баллы.
Правки рабочей карточки не меняют публичную версию до нового подтверждения и публикации. Баллы команды не меняют рейтинг готовности задачи.
Геймификация
| Категория готовности | Максимум |
|---|---|
| Контекст и потребность | 20 |
| Данные | 20 |
| Ожидаемый результат | 15 |
| Критерии успеха | 15 |
| Ограничения | 10 |
| Пользователи | 10 |
| Связь с бизнесом | 10 |
Уровни: 0–39 — черновик, 40–69 — рабочая, 70–89 — готовая, 90–100 — приоритетная. Публикация и отклики разрешены даже при 0 баллов. Оценка показывает полноту описания, а не достоверность сведений или качество идеи. Пустые поля и распознаваемые заглушки не дают баллов. Правила.
Для команды действует отдельная механика: 10 баллов за подтверждённый бизнесом этап. Отправка результата без подтверждения баллов не даёт. Повтор запроса не создаёт второе начисление.
Конструктор показывает семь шагов готовности и предлагает уточнить поле с наибольшим недостающим весом. Баллы меняются только после подтверждения бизнесом. На странице «Лидеры команд» доступны достижения «Первый результат», «Довели до результата» и «Разный опыт».
Место команды определяется числом уникальных задач с хотя бы одним подтверждённым этапом. Это не означает завершение всего проекта. Равные результаты дают одинаковое место; достижения не добавляют баллов. Правила геймификации.
Технологии и архитектура
- Python 3.12+, FastAPI 0.141.1, Uvicorn 0.53.0, Pydantic 2.13.5.
- SQLite: постоянное хранение, транзакции, миграции и внешние ключи.
- HTML, CSS, обычный JavaScript; локальные SVG и стиль Soft Retro.
- OpenAI Responses API, структурированный JSON; модель из OPENAI_MODEL, значение по умолчанию в коде — gpt-4o-mini.
- HTTPX 0.28.1, python-dotenv 1.2.3; pytest 9.1.1.
- Node.js нужен только для дополнительных JavaScript-тестов, не для запуска сайта.
Один процесс FastAPI обслуживает UI, API и Swagger. AI обрабатывается на сервере; ключи не передаются браузеру. Клиент отображает серверные статусы и баллы.
flowchart LR
B[Бизнес: конструктор и кабинет] --> API[FastAPI]
T[Команда: каталог и отклики] --> API
API --> AI[OpenAI / локальные правила]
API --> R[Repository: права, состояния, транзакции]
R --> S[Детерминированный рейтинг]
R --> DB[(SQLite)]
Код: app/main.py — маршруты; app/models.py — схемы; app/ai.py — AI; app/repository.py — операции; app/scoring.py — рейтинг; app/db.py и schema.sql — БД; app/templates и app/static — интерфейс. Контракт: API.md.
Установка и запуск
Нужны Git и Python 3.12+. Получите основную ветку:
git clone https://github.com/BAITC-Hacks/hack-4484d2b6-arc-team.git
cd hack-4484d2b6-arc-team
Windows PowerShell:
python -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r requirements-dev.txt
if (-not (Test-Path .env)) { Copy-Item .env.example .env }
.\.venv\Scripts\python.exe -X utf8 seed.py
.\.venv\Scripts\python.exe -m uvicorn app.main:app --host 127.0.0.1 --port 8000
Linux/macOS:
python3 -m venv .venv
.venv/bin/python -m pip install -r requirements-dev.txt
if [ ! -f .env ]; then cp .env.example .env; fi
.venv/bin/python seed.py
.venv/bin/python -m uvicorn app.main:app --host 127.0.0.1 --port 8000
Seed добавляет два бизнеса, пять команд и пять синтетических черновиков; повторный запуск не стирает существующие записи. SQLite по умолчанию: data/challenge_hub.sqlite3. После обновления кода перезапустите сервер; не удаляйте рабочую БД. Статический http.server не заменяет FastAPI.
Подключение AI
По умолчанию .env.example использует AI_MODE=local. Это шаблоны и правила, не внешняя языковая модель; такой режим позволяет воспроизвести демо без ключей.
Для OpenAI укажите в локальном .env:
AI_MODE=openai
OPENAI_API_KEY=ваш_ключ
OPENAI_MODEL=gpt-4o-mini
AI_TIMEOUT_SECONDS=20
Перезапустите сервер и выберите OpenAI в конструкторе. Ошибка провайдера не стирает ввод; повтор в локальном режиме выполняется явно. Ключи и .env исключены из Git. NVIDIA в текущем коде не подключена. Подробности AI.
Как проверить решение
- Откройте /ui#builder, роль «Бизнес», профиль магазина.
- Введите: «Кладовщику нужен список товаров с остатком ниже 5. Есть тестовый CSV». Получите вопросы, ответьте о результате, данных, сроках и обратной связи.
- Сформируйте карточку, проверьте поля, поставьте отметку проверки, нажмите «Сохранить и подтвердить», затем «Опубликовать задачу».
- Перейдите в каталог: опубликованная карточка доступна независимо от рейтинга.
- Откройте её, выберите роль команды и ByteTeam. Заполните идею, план и сроки, отправьте отклик. Повторите для DataCrew, чтобы проверить сравнение.
- В роли бизнеса откройте «Мои задачи», выберите публикацию, отметьте два отклика и сравните их. Выберите ByteTeam (при желании — обе команды).
- В роли ByteTeam откройте «Мои отклики»: статус «Команда выбрана». Отправьте описание результата; до подтверждения баллов нет.
- Бизнес в своей задаче нажимает «Подтвердить этап». Обновите кабинет команды: видны принятый этап и 10 баллов. Обновление страницы сохраняет результат.
- Откройте «Лидеры команд»: у ByteTeam одна задача с подтверждённым этапом, 10 баллов и достижение «Первый результат».
Демонстрация не требует реального CSV или внешних контактов. Используйте синтетические примеры. После переключения роли выбирается именно демопрофиль, а не выполняется настоящая авторизация.
Проверки качества
.\.venv\Scripts\python.exe -m pytest -q
node --test tests/team_api.test.cjs
В итоговой интеграции прошли 119 pytest-тестов и 6 JavaScript-тестов. Все JS-модули прошли node --check. Проверены хранение, права демопрофилей, границы рейтинга, низкая готовность, несколько выбранных команд, повторы запросов, однократное начисление баллов и совместная блокировка смены роли.
Сквозной браузерный прогон выполнен через реальные интерфейсы обеих ролей на отдельной тестовой SQLite, без фиктивных workflow-ответов. Пройдены создание, публикация, три отклика, сравнение, выбор двух команд, отклонение третьей, сдача этапа, подтверждение и отображение 10 баллов после обновления страницы. Вызов платного OpenAI в этой проверке не выполнялся. Отчёт интеграции · Серверные проверки.
Данные, интеграции и ограничения
- fixtures/demo.json — синтетические профили и черновики; catalog-demo.json — историческая тестовая фикстура, текущий каталог её не читает.
- Содержание карточки поступает от бизнеса. В режиме OpenAI рабочие материалы передаются провайдеру с store=false; в local внешних AI-вызовов нет.
- Проект не подключён к реальным базам компаний/университетов и не импортирует CSV. Ссылка на данные или прототип — часть описания, не серверная загрузка файла.
- Демопрофили и заголовки X-Demo-Business-Id / X-Demo-Team-Id не являются production-авторизацией. Любой посетитель демо может выбрать доступный профиль.
- Готовность оценивает заполненность, а не качество/достоверность. AI и содержание карточки требуют проверки человеком.
- Решение по отклику окончательное; редактирование/отзыв отправленного предложения и удаление этапа в текущем API не реализованы.
- Списки обновляются при входе и кнопкой, без фоновых уведомлений.
- Черновики браузера привязаны к устройству и origin. Если localStorage недоступен, они остаются только в памяти вкладки; интерфейс предупреждает об этом.
- Нет настоящих аккаунтов, платежей или промышленного развёртывания.
- Таблица лидеров не имеет сезонов и пагинации; её правила рассчитаны на MVP.
Развёрнутая версия и документация
Подтверждённой публичной deployed-ссылки пока нет. localhost доступен только на машине, где запущен сервер.
API · Backend · AI · Готовность · Конструктор · Кабинет бизнеса · Каталог · Отклик · Кабинет команды · Геймификация · Интеграция · План развития.
Авторы коммитов
История коммитов
- 2026-09-23 17:45Merge full product integration: business, teams and gamificationRuslanSat
- 2026-09-23 17:44docs: describe and verify unified product with gamificationRuslanSat
- 2026-09-23 17:41merge: synchronize latest team workspace historyRuslanSat
- 2026-09-23 17:41merge: include final business documentation updatesRuslanSat
- 2026-09-23 17:41merge: include readiness missions and team gamificationRuslanSat
- 2026-09-23 17:37fix(integration): coordinate roles and verify complete challenge workflowRuslanSat
- 2026-09-23 17:32Merge branch 'main' into feat/team-proposal-formNalatka
- 2026-09-23 17:31Merge pull request #6 from BAITC-Hacks/feat/gamificationNalatka
Все коммиты (40)
- 2026-09-23 17:29feat: add readiness missions team achievements and leaderboardNalatka
- 2026-09-23 17:28merge: integrate team proposals results and public catalogRuslanSat
- 2026-09-23 17:28docs: align Russian README with verified branch capabilitiesCodex
- 2026-09-23 17:27merge: integrate backend workflow and acceptance checksRuslanSat
- 2026-09-23 17:27merge: integrate business dashboard and team decisionsRuslanSat
- 2026-09-23 17:20Merge remote-tracking branch 'origin/feat/backend-workflow' into feat/gamificationNalatka
- 2026-09-23 17:14feat(business-ui): complete owner dashboard and workflow integrationCodex
- 2026-09-23 17:08docs(team-ui): record latest backend compatibility checksRuslanSat
- 2026-09-23 17:07feat(team-ui): complete public catalog and team workflowRuslanSat
- 2026-09-23 17:05docs: refresh Russian README for main and hackathon juryNalatka
- 2026-09-23 16:52test(backend): complete step 5 acceptance checks and QA reportNalatka
- 2026-09-23 16:46feat(backend): add catalog proposals decisions and milestone pointsNalatka
- 2026-09-23 16:42Merge remote-tracking branch 'origin/main' into feat/team-proposal-formRuslanSat
- 2026-09-23 16:41feat(team-ui): add local proposal drafts in Soft Retro task viewRuslanSat
- 2026-09-23 16:40Merge pull request #4 from BAITC-Hacks/feat/business-uiSADOW
- 2026-09-23 16:39feat(business-ui): add confirmed readiness and publication controlsCodex
- 2026-09-23 16:23Merge remote-tracking branch 'origin/feat/backend-scoring' into fix/completed-steps-integrationRuslanSat
- 2026-09-23 16:22fix(integration): align completed team steps and verify publication flowRuslanSat
- 2026-09-23 16:19docs: write Russian product README with verified demo walkthroughNalatka
- 2026-09-23 16:17Merge remote-tracking branch 'origin/feat/team-task-detail' into fix/completed-steps-integrationRuslanSat
- 2026-09-23 16:15Merge remote-tracking branch 'origin/feat/backend-scoring' into fix/completed-steps-integrationRuslanSat
- 2026-09-23 16:03feat(backend): add confirmed scoring and publicationNalatka
- 2026-09-23 16:01Merge pull request #3 from BAITC-Hacks/feat/business-uiSADOW
- 2026-09-23 16:00feat(business-ui): connect task constructor to backend APICodex
- 2026-09-23 15:54feat(tasks): add full Soft Retro task page and preserve catalog filtersRuslanSat
- 2026-09-23 15:41feat(backend): add validated AI constructor with explicit local modeNalatka
- 2026-09-23 15:16Merge pull request #1 from BAITC-Hacks/feat/team-uiRuslanSat
- 2026-09-23 15:13feat(catalog): add Soft Retro catalog preview with search and filtersRuslanSat
- 2026-09-23 15:07merge: combine backend skeleton and Soft Retro shellRuslanSat
- 2026-09-23 14:54feat(ui): add shared Soft Retro shell and demo navigationCodex
- 2026-09-23 14:35feat(backend): add FastAPI SQLite storage skeletonNalatka
- 2026-09-23 13:58docs: add AI Sana Challenge Hub four-hour development planRuslanSat
Структура репозитория (71 файлов)
.env.example .gitignore DEVELOPMENT_PLAN.md README.md app/__init__.py app/ai.py app/config.py app/db.py app/main.py app/models.py app/repository.py app/schema.sql app/scoring.py app/static/builder.css app/static/builder.js app/static/business-api.js app/static/business.css app/static/business.js app/static/catalog-demo.json app/static/catalog.css app/static/catalog.js app/static/favicon.svg app/static/gamification.css app/static/gamification.js app/static/icons.svg app/static/proposal-form.css app/static/proposal-form.js app/static/role-lock.js app/static/shell.js app/static/styles.css app/static/task-detail.css app/static/task-detail.js app/static/team-api.js app/static/team-workspace.css app/static/team-workspace.js app/templates/base.html docs/AI.md docs/API.md docs/BACKEND.md docs/BUSINESS_DASHBOARD.md docs/BUSINESS_UI.md docs/GAMIFICATION.md docs/INTEGRATION.md docs/PROPOSAL_FORM.md docs/QA.md docs/SCORING.md docs/TASK_DETAIL.md docs/TEAM_WORKSPACE.md docs/ai-examples.json docs/api-examples.json docs/scoring-examples.json docs/workflow-examples.json fixtures/demo.json pytest.ini requirements-dev.txt requirements.txt seed.py tests/browser_builder.py tests/browser_business.py tests/browser_business_workflow.py tests/browser_readiness.py tests/business_api_fixture.py tests/team_api.test.cjs tests/test_ai.py tests/test_integration.py tests/test_publication.py tests/test_scoring.py tests/test_storage.py tests/test_task_detail.py tests/test_ui.py tests/test_workflow.py
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.