AI Sana Challenge Hub
Полноценный Challenge Hub: конструктор задачи с уточняющими вопросами ИИ, редактируемая карточка из 10 полей, рейтинг 0–100, открытый каталог…
О проекте
Команда: iBilim
Кейс HackAlem.ai: Образование — AI Sana
Стадия: Доведённый продукт
Задача кейса: Challenge Hub: превратить задачу бизнеса в задание для студенческих команд
Суть
Полноценный Challenge Hub: конструктор задачи с уточняющими вопросами ИИ, редактируемая карточка из 10 полей, рейтинг 0–100, открытый каталог, отклики команд, подтверждение этапов (+10 баллов) и панель показателей программы. Развёрнут на Railway.
Как устроено
Черновик бизнеса отправляется в OpenAI (gpt-5-mini, Structured Outputs со строгой JSON-схемой), модель выделяет сведения дословными цитатами и задаёт не меньше 3 вопросов. Из ответов собирается карточка, JSON проверяется локально, при ошибке запрос повторяется, затем подставляется заглушка. Рейтинг считает код по 7 категориям со штрафами за отписки, бессмыслицу, повторы и наборы ключевых слов. Каталог сортируется по подтверждённому баллу. Рекомендации задач командам строятся по совпадению слов с навыками. Перед отправкой в модель ИИН и номера карт маскируются.
Ключевые решения
- Structured Outputs (strict JSON schema)
- сопоставление цитат (≥80% слов)
- anti-gaming штрафы и детекция бессмыслицы
- маскирование ИИН/карт с проверкой контрольных цифр
- keyword-matching рекомендации
- проверка карточки «ИИ-студентом»
Особенности
Защита персональных данных: ИИН и карты с корректными контрольными цифрами маскируются до отправки в LLM. Защита от накрутки рейтинга: штрафы за бессмысленный текст и повторы. Отдельный экран «Как работает ИИ» с промптами и контрактами (GET /api/ai/spec). Есть помощник формулировок, который предлагает текст для слабых полей и показывает прирост балла. Разработка шла с разделением зон между агентами (AGENTS.md, CLAUDE.md).
Стек
Python · FastAPI · Pydantic · SQLite · React 18 · Vite 5 · Docker · Railway · pytest
Модели
gpt-5-mini (OpenAI)
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-627b67cd-ibilim.
README
README.mdAI Sana Challenge Hub
Публичная версия: challenge-hub-production.up.railway.app · Исходное ТЗ
Демо-видео (4 мин 47 с): от черновика до принятого отклика · русские субтитры · описание записи
Проблема
Короткое описание бизнес-задачи часто не даёт студенческой команде понять, какие данные доступны, что нужно сделать и по каким критериям принимать результат. AI Sana Challenge Hub помогает бизнесу уточнить такую задачу, показывает готовность карточки к работе и открывает её командам. Команда сама предлагает решение, а бизнес выбирает, с кем продолжить работу. Проект создан для кейса AI Sana на HackAlem AI.
Что реализовано
- Конструктор задачи: свободный черновик, не менее трёх уточняющих вопросов, редактируемая карточка из десяти полей, ручное подтверждение и публикация.
- Рейтинг 0–100: расшифровка начислений, подсказки по недостающим сведениям, история изменения балла и прогноз места в каталоге. Официальный балл обновляется при подтверждении карточки.
- Открытый каталог: сортировка по подтверждённому рейтингу, фильтры по отрасли и уровню готовности. Низкий рейтинг не скрывает опубликованную задачу и не запрещает отклик.
- Отклики и выбор: команда отправляет идею, план, срок и ссылку; бизнес сравнивает предложения и вручную принимает или отклоняет их. Число откликов не ограничено.
- Дополнительные инструменты: рекомендации задач командам по совпадению интересов и навыков; помощник формулировок карточки; проверка карточки «ИИ-студентом»; подтверждение выполненного этапа с начислением команде 10 баллов; панель общих показателей программы.
- Проверка данных: ИИ подбирает полные исходные фразы бизнеса с сохранением отрицаний и условий; свободный пересказ отбрасывается. Контакты можно извлечь дословно. Структура JSON проверяется локально: неверный ответ вызывает повтор, затем заглушку. ИИН и номера банковских карт с корректными контрольными цифрами маскируются до сохранения и отправки в модель; для других упоминаний персональных данных выводится предупреждение.
Как работает решение
Черновик бизнеса → вопросы → ответы → редактируемая карточка
→ рейтинг и подсказки → подтверждение → общий каталог
→ отклик команды → ручное решение бизнеса → подтверждённый этап → баллы команде
Бизнес вводит описание и отрасль. Система выделяет имеющиеся сведения, задаёт вопросы о пробелах и собирает карточку из черновика и ответов. Бизнес может исправить текст, видит предварительный балл и подтверждает карточку. После публикации задача занимает место в каталоге по подтверждённому баллу. Команда выбирает её сама и отправляет предложение. Бизнес может принять несколько предложений или не принять ни одного; автоматического назначения нет.
Рейтинг считает код, а не модель. Максимум — 100 баллов; сумма частей уменьшается при отписках, бессмысленном тексте, повторах и наборах ключевых слов:
| Показатель | Правило начисления | Макс. |
|---|---|---|
| Контекст и потребность | Контекст 6 + потребность 6 + числовая конкретика в каждом поле по 4 | 20 |
| Данные и материалы | Описание 8 + источник 6 + формат 3 + объём или период 3 | 20 |
| Ожидаемый результат | Описание 8 + подробность 4 + число 3 | 15 |
| Критерии успеха | Описание 5 + числовая цель 7 + метрика 3 | 15 |
| Ограничения | Описание 5 + числовая граница 3 + вид ограничения 2 | 10 |
| Пользователи | Названы 6 + роль уточнена 4 | 10 |
| Связь с бизнесом | Контакт 6 + формат взаимодействия 4 | 10 |
Уровни: 0–39 — черновик, 40–69 — рабочая, 70–89 — готовая, 90–100 — приоритетная. Каталог сортируется по официальному баллу по убыванию, при равенстве — по времени публикации (новые выше). Фильтр темы реализован через отрасль. Рекомендации доступны для опубликованных задач от уровня «рабочая» и основаны на совпадении слов в задаче с интересами, навыками и технологиями команды. Подробная формула — в docs/03-rating.md.
Технологии и архитектура
| Слой | Используется |
|---|---|
| Веб | JavaScript/JSX, React 18, Vite 5, собственный CSS; запросы через fetch к /api |
| API | Python 3.11–3.14, FastAPI, Pydantic, Uvicorn, python-dotenv |
| Хранение | SQLite через стандартный модуль Python sqlite3; синтетические JSON-файлы в seed/ |
| ИИ | OpenAI API через официальный SDK; модель по умолчанию — gpt-5-mini (настраивается OPENAI_MODEL); Structured Outputs со строгой JSON-схемой |
| Проверка API | pytest и httpx |
| Публичный хостинг | Railway, один Docker-сервис для API и собранного веб-интерфейса |
Браузер (web/: React + Vite)
│ fetch /api
▼
FastAPI (backend/app/main.py) ── backend/app/db.py ── SQLite
├── tasks.py: жизненный цикл карточки
├── rating.py + catalog.py: баллы, место, рекомендации
├── proposals.py + stats.py: отклики, этапы, показатели
├── privacy.py: маскирование и предупреждения
└── ai.py → llm.py → OpenAI API (если задан ключ)
FastAPI раздаёт /api/* и собранные файлы web/dist с одного адреса. В разработке Vite проксирует /api на локальный FastAPI. Все вызовы модели проходят через backend/app/llm.py. Промпты, форматы входа и выхода и обработка неверного ответа показаны на странице «Как работает ИИ» (#/ai) и в GET /api/ai/spec. Контракт API — docs/02-api.md.
Установка и запуск
Нужны Python 3.11–3.14, Node.js 18+ и npm, а также доступ к реестрам пакетов при первой установке. Если репозиторий ещё не склонирован, скопируйте его адрес со страницы проекта и замените URL_РЕПОЗИТОРИЯ в команде:
git clone "URL_РЕПОЗИТОРИЯ" ai-sana-challenge-hub
cd ai-sana-challenge-hub
Если клон уже есть, откройте терминал в его корневой папке.
Быстрый запуск на macOS, Linux или в WSL:
./run.sh
Откройте http://localhost:8000. Состояние API доступно по http://localhost:8000/api/health.
Ручной запуск на macOS/Linux из корня репозитория:
python3 -m venv .venv
.venv/bin/python -m pip install -r backend/requirements.txt
[ -f .env ] || cp .env.example .env
(cd web && npm ci && npm run build)
cd backend
../.venv/bin/python -m app.db
../.venv/bin/python -m uvicorn app.main:app --port 8000
Ручной запуск на Windows (PowerShell) из корня репозитория:
python -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r backend\requirements.txt
if (-not (Test-Path .env)) { Copy-Item .env.example .env }
Set-Location web
npm ci
npm run build
Set-Location ..\backend
..\.venv\Scripts\python.exe -m app.db
..\.venv\Scripts\python.exe -m uvicorn app.main:app --port 8000
run.sh выполняет те же шаги автоматически и создаёт .env только при отсутствии файла. Команда python -m app.db и скрипт run.sh пересоздают локальную базу backend/hub.db. Ключ OpenAI не требуется для основного сценария: без OPENAI_API_KEY используется локальная заглушка. Для вызовов модели заполните OPENAI_API_KEY в .env; OPENAI_MODEL позволяет сменить модель, DEMO_MODE=1 принудительно включает заглушку.
На публичном Railway-сайте при проверке 23.09.2026 ответ /api/health показывал "llm":"llm": сервер настроен на вызовы OpenAI API. Чтобы проверить работу без ключа, запустите чистый клон локально с пустым OPENAI_API_KEY или задайте DEMO_MODE=1 в .env; тогда /api/health покажет "llm":"stub".
Для отдельной разработки интерфейса после запуска API можно открыть второй терминал:
cd web
npm install
npm run dev
Vite откроет адрес, указанный в терминале, и направит запросы /api на порт 8000.
Как проверить решение
На публичной ссылке или локально пройдите один сценарий. Регистрация не нужна: в шапке есть переключатель демонстрационных ролей и профилей.
- Бизнес: выберите ТОО «Агро Север» → «Новая задача», отрасль «Агро». Введите: «Хотим понимать, какие поля скоро потребуют полива». Проверьте, что появились минимум три вопроса.
- Ответы: сообщите о цели сократить расход воды на 20% за сезон, выгрузке датчиков влажности за 2 года в CSV, дашборде с прогнозом на 7 дней и критерии точности не ниже 80%. В собранной карточке дополните название, пользователей, ограничения, контакт и формат общения. Сохраните правки; проверьте рост и расшифровку рейтинга.
- Публикация: нажмите «Подтвердить карточку», затем «Опубликовать». Переключитесь на команду «DataCats» и найдите задачу в каталоге; её место определяется подтверждённым рейтингом.
- Отклик: откройте задачу от имени команды и заполните идею, план, срок и URL прототипа. Отправьте отклик.
- Решение: вернитесь к бизнесу → «Мои задачи» → «Отклики». Примите предложение DataCats; в роли команды проверьте статус «Принят» в «Мои отклики». Бизнес также может отклонить предложение.
- Результат: переключитесь обратно на бизнес ТОО «Агро Север» → «Мои задачи» → «Отклики» у созданной задачи. У принятого отклика в блоке «Подтвердить этап работы» введите название выполненного этапа и нажмите «Подтвердить этап · +10 баллов». Откройте «Панель программы» по ссылке из сообщения об успехе и проверьте, что у DataCats стало на 10 баллов больше.
Дополнительно можно изменить уже опубликованную карточку: предварительный балл изменится сразу, а официальный балл и место в каталоге — после повторного подтверждения. Команда до этого видит прежний подтверждённый текст и рейтинг (GET /api/catalog/{id}). Полный сценарий демонстрации с текстами — в docs/04-demo.md.
Для проверки API после установки зависимостей запустите из каталога backend:
../.venv/bin/python -m pytest
На Windows используйте ..\.venv\Scripts\python.exe -m pytest. Набор в backend/tests/ покрывает рейтинг, ИИ и его заглушку, маскирование данных, жизненный цикл задачи, каталог, отклики, статистику и сквозной сценарий; отдельно запустить последний можно командой ../.venv/bin/python -m pytest tests/test_scenario.py.
Данные и интеграции
В seed/ находятся 5 синтетических профилей бизнеса, 5 примеров черновиков, 5 опубликованных карточек, 5 профилей команд и 5 откликов. Примеры черновиков показываются через GET /api/meta; карточки, команды и отклики загружаются в SQLite при инициализации. Рейтинг начальных карточек пересчитывается тем же модулем, что и рейтинг новых задач. Внешний набор данных проект не загружает.
Единственный внешний AI-сервис — OpenAI API при наличии ключа. Без ключа локальная заглушка сохраняет путь от черновика до решения бизнеса; помощник формулировок без живой модели не предлагает текст. Railway используется для публикации веба и API по одной ссылке.
Ограничения текущей версии
- Роли выбираются в интерфейсе без регистрации и проверки личности; это демонстрационный режим.
- На Railway SQLite лежит в контейнере (
/tmp/hub.db): при новом деплое данные и действия посетителей сбрасываются к синтетическому сиду. - Рекомендации основаны на совпадении слов, без обученной модели или векторного поиска.
- Подтверждение этапа — ручное действие бизнеса по названию выполненной работы. Загрузка доказательств и защита от повторного начисления баллов за один этап не реализованы.
- Помощник карточки требует доступа к OpenAI API. Локальная заглушка обеспечивает основной сценарий, но не создаёт предложения помощника.
Раскрытие подготовленного кода
До начала соревновательной части были подготовлены структура репозитория, общий каркас FastAPI и тестовая фикстура. Схема БД, синтетические данные, рейтинг, ИИ-сценарий, каталог, отклики и интерфейс созданы после публикации кейса. Сторонние библиотеки и сервисы перечислены в разделе «Технологии и архитектура».
Авторы коммитов
История коммитов
- 2026-09-23 17:55Clarify role switch before confirming milestoneasset
- 2026-09-23 17:52Complete judge walkthrough and clone instructionsasset
- 2026-09-23 17:47Fix confirmed task views and validate AI responsesArslan
- 2026-09-23 17:31Clarify demo records are temporary after redeployasset
- 2026-09-23 17:27Link demo video and subtitles from READMEasset
- 2026-09-23 17:24demo video of the full scenario with subtitlesArslan
- 2026-09-23 17:23Clarify manual setup and AI modes in READMEasset
- 2026-09-23 17:14Document current Challenge Hub for hackathon judgesasset
Все коммиты (48)
- 2026-09-23 17:07Focus README on evaluator setup and case criteriaasset
- 2026-09-23 16:55Remove obsolete project name from deployment guideasset
- 2026-09-23 16:54Document case flow and expose confirmed team milestonesasset
- 2026-09-23 16:24Add card writing assistant to task editorasset
- 2026-09-23 16:17Add card assistant step W9 to web planasset
- 2026-09-23 16:16Link contact methods on team task viewasset
- 2026-09-23 16:16card assistant: ready-made wording for weak fields with quotes and score gainArslan
- 2026-09-23 16:16seed: текущий балл у синтетических карточек (ТЗ §6)Arslan
- 2026-09-23 16:05Tuck AI diagnostics away and stack mobile rating historyasset
- 2026-09-23 16:04Show task titles in team proposalsasset
- 2026-09-23 16:03Fix proposal count wording in catalogasset
- 2026-09-23 16:00Update web status after 16:00 deployasset
- 2026-09-23 15:57Update web status and add gamification step W8asset
- 2026-09-23 15:54Add AI Sana program statistics screenasset
- 2026-09-23 15:50stats-ready seed history, gibberish detection, README featuresArslan
- 2026-09-23 15:42Improve task card rating and student reviewasset
- 2026-09-23 15:31Refine clarification screen and privacy feedbackasset
- 2026-09-23 15:30AI student check and AI Sana program statsArslan
- 2026-09-23 15:28ai: tolerant quote matching — paraphrased quotes accepted if ≥80% of words are in user textArslan
- 2026-09-23 15:07anti-gaming penalties, personal data guard (IIN, cards), improvement payoff and audienceArslan
- 2026-09-23 14:50Refine new task entry screenasset
- 2026-09-23 14:36Stabilize header selector and business task layoutasset
- 2026-09-23 14:22Add AI transparency screenasset
- 2026-09-23 14:21Build business task and proposal review screensasset
- 2026-09-23 14:20Build team catalog and proposal screensasset
- 2026-09-23 14:17Add rating timeline and publish flowasset
- 2026-09-23 14:15Build draft and clarification screensasset
- 2026-09-23 14:15Add answer flow and live card ratingasset
- 2026-09-23 14:09gamification: catalog position and next level in task, team skills in proposals; split agent docs by zoneArslan
- 2026-09-23 14:09Fix blank page: compile JSX with automatic runtimeasset
- 2026-09-23 14:03Add single-service Docker deploymentasset
- 2026-09-23 14:03Update web deployment instructionsasset
- 2026-09-23 14:01Build Challenge Hub web scaffold and stateful mocksasset
- 2026-09-23 13:57README for AI Sana Challenge Hub, one-command launch, e2e demo test, tuned AI promptsArslan
- 2026-09-23 13:46agents: each owner commits own zone hourly; web plan for frontend agentasset
- 2026-09-23 13:34pivot to AI Sana Challenge Hub: contract, schema, AI draft analysis, task lifecycleArslan
- 2026-09-23 12:06claude.md entry point and project status in agents.mdArslan
- 2026-09-23 11:49optional task: class roster import from csvArslan
- 2026-09-23 11:48project context, docs and backend skeletonArslan
- 2026-09-23 11:48partner handoff docs: start here, api copy, tasks, screens, demoArslan
Структура репозитория (87 файлов)
.dockerignore .env.example .gitignore AGENTS.md CLAUDE.md Dockerfile README.md backend/AGENTS.md backend/app/__init__.py backend/app/ai.py backend/app/catalog.py backend/app/db.py backend/app/errors.py backend/app/llm.py backend/app/main.py backend/app/privacy.py backend/app/proposals.py backend/app/rating.py backend/app/schema.sql backend/app/stats.py backend/app/tasks.py backend/pytest.ini backend/requirements.txt backend/tests/conftest.py backend/tests/test_ai.py backend/tests/test_catalog.py backend/tests/test_llm.py backend/tests/test_privacy.py backend/tests/test_proposals.py backend/tests/test_rating.py backend/tests/test_scenario.py backend/tests/test_student_stats.py backend/tests/test_tasks.py demo-artifacts/ai-sana-demo.mp4 demo-artifacts/ai-sana-demo.srt demo-artifacts/О видео.md docs/01-case.md docs/02-api.md docs/03-rating.md docs/04-demo.md partner/00-START-HERE.md partner/01-api.md run.sh seed/businesses.json seed/cards.json seed/drafts.json seed/fixtures/.gitkeep seed/proposals.json seed/teams.json web/.gitignore web/AGENTS.md web/DEPLOY.md web/index.html web/package-lock.json web/package.json web/src/App.jsx web/src/api.js web/src/components/AiWarnings.jsx web/src/components/CardAssist.jsx web/src/components/ContactLinks.jsx web/src/components/ErrorBox.jsx web/src/components/LevelBadge.jsx web/src/components/Loader.jsx web/src/components/PagePlaceholder.jsx web/src/components/PrivacyNotice.jsx web/src/components/RatingPanel.jsx web/src/components/RatingTimeline.jsx web/src/components/RoleSwitch.jsx web/src/components/StudentCheck.jsx web/src/flow.css web/src/main.jsx web/src/mocks.js web/src/router.js web/src/screens/AiSpec.jsx web/src/screens/CardEditor.jsx web/src/screens/Catalog.jsx web/src/screens/Clarify.jsx web/src/screens/MyProposals.jsx web/src/screens/MyTasks.jsx web/src/screens/NewTask.jsx web/src/screens/ProgramStats.jsx web/src/screens/ProposalForm.jsx web/src/screens/TaskProposals.jsx web/src/state.js web/src/stats.css web/src/styles.css web/vite.config.js
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.