AAYMA
RU
Войти

AI Sana Challenge Hub

Полноценный Challenge Hub: конструктор задачи с уточняющими вопросами, подтверждение и публикация снимка карточки, каталог, отклики команд, кабинеты…

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

О проекте

Команда: 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.md

AI Sana Challenge Hub

От короткого запроса бизнеса — к понятной задаче и результату студенческой команды.

Проект ARC Team, трек «Образование», кейс AI Sana на HackAlem AI. Объединённая версия включает API 0.4.0, конструктор, публичный каталог, кабинет бизнеса, кабинет команды, достижения и таблицу лидеров.

Проблема и решение

Бизнес часто описывает запрос слишком кратко: «нужно автоматизировать учёт». Студентам непонятны доступные данные, ожидаемый результат, ограничения и критерии успеха. Платформа помогает уточнить запрос вопросами, собрать проверяемую карточку и опубликовать её для команд. Команды предлагают подход, бизнес сравнивает предложения и вручную выбирает исполнителей.

AI помогает формулировать задачу. Сведения подтверждает человек; рейтинг вычисляется сервером; решения о выборе команды и приёмке результата принимает бизнес.

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

ВозможностьРезультат
КонструкторИсходное описание, уточняющие вопросы, ответы, редактируемая карточка
Режимы AIOpenAI Responses API либо явно обозначенные локальные шаблоны без внешних вызовов
ГотовностьБалл 0–100, семь категорий, начисления по полям и недостающие сведения
Подтверждение и публикацияБизнес проверяет карточку; каталог получает отдельный опубликованный снимок
КаталогПоиск, тема, готовность, сортировка, полная страница и сохранение фильтров
ОткликиИдея, план, сроки, необязательные прототип и вопросы; локальный черновик и отправка
Кабинет бизнесаСвои задачи, редактор, сравнение предложений, выбор одной/нескольких команд или отклонение
Кабинет командыСвои отклики, решения бизнеса, сдача результатов выбранными командами
Этапы и баллыРезультат проверяется бизнесом; подтверждённый этап приносит 10 баллов, без повторного начисления
ГеймификацияСемь шагов улучшения карточки, три достижения команды и рейтинг по подтверждённым результатам
СохранностьSQLite, восстановление локального ввода, явные ошибки и защита от повторных запросов
Soft RetroЕдиная навигация, светлая палитра, формы и статусы для обеих ролей

Каталог показывает реальные опубликованные записи из SQLite. Он не использует catalog-demo.json и не подменяет ошибки демонстрационными карточками. Seed создаёт профили и черновики: первая публикация появляется после действия бизнеса.

Основной сценарий

Описание → вопросы → карточка → подтверждение → рейтинг → публикация → отклики → выбор команды → результат → приёмка и баллы.

  1. Бизнес описывает проблему и отвечает на вопросы. Неизвестное можно оставить пустым.
  2. Проверяет и редактирует карточку, подтверждает сведения и отдельно публикует её.
  3. Команды находят задачу в каталоге и отправляют свои предложения.
  4. Бизнес сравнивает предложения; выбирает одну, несколько команд или никого.
  5. Выбранная команда сдаёт этап с описанием и необязательной ссылкой.
  6. Бизнес подтверждает результат; команда видит принятый этап и начисленные баллы.

Правки рабочей карточки не меняют публичную версию до нового подтверждения и публикации. Баллы команды не меняют рейтинг готовности задачи.

Геймификация

Категория готовностиМаксимум
Контекст и потребность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

Интерфейс · Swagger · Health.

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.

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

  1. Откройте /ui#builder, роль «Бизнес», профиль магазина.
  2. Введите: «Кладовщику нужен список товаров с остатком ниже 5. Есть тестовый CSV». Получите вопросы, ответьте о результате, данных, сроках и обратной связи.
  3. Сформируйте карточку, проверьте поля, поставьте отметку проверки, нажмите «Сохранить и подтвердить», затем «Опубликовать задачу».
  4. Перейдите в каталог: опубликованная карточка доступна независимо от рейтинга.
  5. Откройте её, выберите роль команды и ByteTeam. Заполните идею, план и сроки, отправьте отклик. Повторите для DataCrew, чтобы проверить сравнение.
  6. В роли бизнеса откройте «Мои задачи», выберите публикацию, отметьте два отклика и сравните их. Выберите ByteTeam (при желании — обе команды).
  7. В роли ByteTeam откройте «Мои отклики»: статус «Команда выбрана». Отправьте описание результата; до подтверждения баллов нет.
  8. Бизнес в своей задаче нажимает «Подтвердить этап». Обновите кабинет команды: видны принятый этап и 10 баллов. Обновление страницы сохраняет результат.
  9. Откройте «Лидеры команд»: у 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 · Готовность · Конструктор · Кабинет бизнеса · Каталог · Отклик · Кабинет команды · Геймификация · Интеграция · План развития.

Звёзды
⭐ 0
Форки
0
Язык
Python
Последний push
в прошлом месяце
Коммиты
40
Авторы
5
Файлы
71
Ветки
11

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

RuslanSat 20Nalatka 11Codex 5RuslanSat 2SADOW 2

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

  • 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
Ветки (11)

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

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

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