Практика
Платформа по кейсу Challenge Hub: AI-помощник превращает запрос бизнеса в карточку задания для студенческих команд с рейтингом заполненности, а…
О проекте
Команда: Sloppy-team
Кейс HackAlem.ai: Образование — AI Sana
Стадия: Рабочий MVP
Задача кейса: Challenge Hub: превратить задачу бизнеса в задание для студенческих команд
Суть
Платформа по кейсу Challenge Hub: AI-помощник превращает запрос бизнеса в карточку задания для студенческих команд с рейтингом заполненности, а студенты откликаются через каталог.
Как устроено
Бизнес вводит черновик, помощник на FastAPI задаёт 3 уточняющих вопроса и через OpenAI gpt-4o со Structured Outputs составляет редактируемую карточку; в demo-режиме вопросы фиксированы. Детерминированный скоринг без AI выставляет рейтинг заполненности 0–100 по весам полей и порогам длины и присваивает статус. Next.js Route Handlers отвечают за авторизацию (scrypt, HttpOnly cookie), права владельца, каталог с фильтрами и отклики команд, данные хранятся в PostgreSQL через Prisma. Владелец принимает или отклоняет отклики вручную.
Ключевые решения
- clarifying questions flow
- OpenAI Structured Outputs
- deterministic completeness scoring
- scrypt password hashing
- Prisma migrations
Особенности
Рейтинг задания считается прозрачной формулой, а не LLM, и тесты проверяют все 6561 сочетание полей. Полный цикл «бизнес → карточка → отклики студентов → выбор команды» работает на двух ролях с реальной авторизацией и PostgreSQL.
Стек
TypeScript · React 19 · Next.js 16 · Node.js · PostgreSQL · Prisma 7 · Python · FastAPI · Uvicorn · Pydantic 2
Модели
gpt-4o
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-30765277-sloppy-team.
README
README.mdПрактика
Платформа для задач бизнеса и студенческих команд. Проект команды Sloppy-team по кейсу AI Sana.
1. Какую проблему решаем
Бизнесу бывает сложно превратить идею в понятное техническое задание, а студентам — найти задачу для практики. «Практика» помогает уточнить потребность, оформить карточку и собрать предложения команд. Бизнес выбирает исполнителей самостоятельно.
2. Что реализовано
- Регистрация и вход по email и паролю; личный кабинет с задачами владельца.
- Помощник: черновик → три уточняющих вопроса → редактируемая карточка.
- Рейтинг заполненности 0–100, расшифровка и подсказки по улучшению задания.
- Публикация и редактирование после явного подтверждения пользователем.
- Открытый каталог, поиск, фильтры по направлению, статусу и баллам, сортировка по готовности или дате.
- Отклики с названием команды, идеей, планом, сроком и необязательной ссылкой на прототип.
- Ручное принятие или отклонение откликов владельцем задачи. Можно выбрать несколько команд.
- Сохранение аккаунтов, задач, рейтингов и откликов в PostgreSQL.
- Настоящий AI через OpenAI и отдельный демонстрационный режим без ключа.
3. Как работает решение
- Бизнес регистрируется и вводит описание своей потребности.
- Помощник задаёт три вопроса и на основе ответов составляет карточку задания.
- Пользователь проверяет текст, дополняет поля, видит рейтинг и подтверждает публикацию.
- Студент входит в свой аккаунт, находит задачу и отправляет предложение команды.
- Владелец задачи рассматривает предложения и принимает или отклоняет их.
Результат — опубликованное задание и сохранённые решения по откликам. Само студенческое решение платформа не разрабатывает. Низкий рейтинг не закрывает задачу для откликов.
4. Технологии
| Часть | Технологии |
|---|---|
| Интерфейс | TypeScript, React 19, Next.js 16, CSS, Lucide React |
| Сервер приложения | Next.js Route Handlers, Node.js 22.12+ |
| База данных | PostgreSQL, Prisma 7, драйвер pg |
| AI и рейтинг | Python 3.11+, FastAPI, Uvicorn, Pydantic 2 |
| Внешний AI | OpenAI API, модель gpt-4o, OpenAI Python SDK 2, Structured Outputs через Chat Completions |
| Настройки и проверки | dotenv / python-dotenv, HTTPX, unittest, node:test, tsx, TypeScript |
Зависимости зафиксированы в frontend/package.json, frontend/package-lock.json и backend/requirements.txt.
5. Архитектура
flowchart TD
Browser[Браузер: бизнес или студент] --> Next[Next.js: интерфейс и API]
Next --> Auth[Вход и проверка владельца]
Next --> Store[Prisma / pg]
Store --> DB[(PostgreSQL)]
Next --> Python[FastAPI: AI и рейтинг]
Python --> Score[Расчёт рейтинга без AI]
Python --> Assistant[Помощник]
Assistant --> OpenAI[OpenAI gpt-4o: режим openai]
Assistant --> Demo[Фиксированные вопросы: режим demo]
frontend/components/— каталог, регистрация, создание и редактирование карточек, отклики.frontend/app/api/[...path]/route.ts— запросы браузера, проверка входных данных и прав.frontend/lib/auth.ts— хеширование паролей через scrypt и подписанная HttpOnly cookie на семь дней.frontend/lib/task-service.ts,store.ts— работа с задачами и откликами;prisma/— схема, миграции и демонстрационные данные.frontend/lib/backend-client.ts— связь Next.js с Python, обработка ошибок и таймаутов.backend/main.py,schemas.py— Python API и схемы данных.backend/ai_service.py— вопросы и карточки;scoring.py— единая формула рейтинга.
Браузер обращается к Next.js. Только сервер Next.js обращается к Python, а Python — к OpenAI. Ключ не передаётся в браузер. Каталог читает сохранённые баллы из PostgreSQL; создание, редактирование и расшифровка рейтинга требуют Python.
Рейтинг — оценка заполненности, а не качества идеи. Контекст и данные дают до 20 баллов каждый, результат и критерии успеха — до 15, ограничения и аудитория — до 10, контакт и формат консультаций — до 5 каждый. Поле короче 10 символов даёт 0; 10–29 символов — половину с округлением вниз; от 30 — максимум. Пробелы по краям не учитываются.
| Баллы | Статус |
|---|---|
| 0–39 | Требует уточнения |
| 40–69 | В проработке |
| 70–89 | Готова к работе |
| 90–100 | В приоритете |
6. Установка и запуск
Нужны Git, Node.js 22.12+, npm, Python 3.11+ и работающий PostgreSQL. Ниже команды для Windows PowerShell. Для первого знакомства используйте деморежим: ключ OpenAI не нужен.
Шаг 1. Скачайте проект и создайте базу
git clone https://github.com/BAITC-Hacks/hack-30765277-sloppy-team.git
cd hack-30765277-sloppy-team
psql -U postgres -h localhost -c "CREATE DATABASE praktika;"
PostgreSQL запросит пароль пользователя postgres. Если psql не добавлен в PATH, создайте пустую базу praktika через pgAdmin. Если база уже существует, повторно создавать её не нужно.
Шаг 2. Настройте окружение
Из корня проекта скопируйте примеры, сохранив существующие настройки:
if (!(Test-Path backend/.env)) { Copy-Item backend/.env.example backend/.env }
if (!(Test-Path frontend/.env)) { Copy-Item frontend/.env.example frontend/.env }
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
Последняя команда создаёт случайную строку для SESSION_SECRET. Откройте .env в текстовом редакторе и заполните:
| Файл | Переменная | Что указать |
|---|---|---|
backend/.env | AI_MODE | demo для проверки без внешнего AI |
backend/.env | OPENAI_API_KEY | В demo можно оставить пустой |
frontend/.env | DATABASE_URL | postgresql://postgres:YOUR_PASSWORD@localhost:5432/praktika?schema=public, заменив пароль своим |
frontend/.env | SESSION_SECRET | Сгенерированную строку, не менее 32 символов |
frontend/.env | AI_BACKEND_URL | http://127.0.0.1:8000 |
Спецсимволы пароля в URL нужно URL-кодировать. .env загружается автоматически; уже заданные переменные окружения имеют приоритет. Секреты исключены из Git. Не добавляйте ключ в исходники или NEXT_PUBLIC_*.
Шаг 3. Запустите Python
Первый терминал из корня проекта:
cd backend
python -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r requirements.txt
.\.venv\Scripts\python.exe -m uvicorn main:app --host 127.0.0.1 --port 8000
Оставьте его открытым.
Шаг 4. Запустите интерфейс
Второй терминал из корня проекта:
cd frontend
npm ci
npm run db:migrate
npm run db:seed
npm run dev
Seed добавляет шесть учебных задач, не перезаписывая существующие. Python должен работать: он рассчитывает их рейтинг. Для обновления базы используйте миграции; не запускайте migrate reset на базе с нужными данными.
Откройте каталог. Проверка связи с Python показывает режим и наличие настройки ключа, но не его действительность или баланс. Документация Python API доступна отдельно.
Как включить настоящий AI
В backend/.env задайте AI_MODE=openai и свой OPENAI_API_KEY, затем перезапустите Python. Используется gpt-4o. Для проверки из папки backend:
.\.venv\Scripts\python.exe smoke_openai.py
Скрипт делает два оплачиваемых запроса на учебном примере: вопросы и карточку. В demo запросов к OpenAI нет; вопросы фиксированы, ответы переносятся в поля. При ошибке настоящего AI автоматической подмены на demo нет.
После изменения настроек перезапускайте соответствующий сервер. Если меняете порт Python, измените и AI_BACKEND_URL. Для production предусмотрены npm run build и npm start; для входа в этом режиме нужен HTTPS из-за Secure cookie. Для локальной демонстрации используйте npm run dev.
7. Как проверить решение жюри
Запустите приложение в demo. Нужны два разных аккаунта: бизнес и студент. Их можно открыть в обычном и приватном окнах браузера. Переключатель роли меняет интерфейс, но не заменяет вход и не даёт права владельца.
-
Нажмите «Войти» → «Регистрация». Создайте аккаунт бизнеса с паролем 12–128 символов.
-
Выберите «Бизнес» → «Создать задачу». Введите «Нужно разобраться в продажах» и нажмите «Уточнить задачу».
-
Ответьте на вопросы:
Поле Учебный ответ Результат Дашборд продаж с фильтрами по дням и товарам Данные Обезличенные таблицы продаж за последние шесть месяцев Приёмка Суммы в отчёте совпадают с исходными таблицами -
Нажмите «Сформировать карточку». Ожидается 60/100; контакт, ограничения и аудитория остаются пустыми. Посмотрите расшифровку и рекомендации.
-
Назовите задачу «Пилот: дашборд продаж кофейни», подтвердите проверку и опубликуйте. Найдите её через поиск.
-
В другом аккаунте выберите «Студент», откройте эту задачу и отправьте отклик: команда Альфа, идея «Дашборд динамики продаж», план «Проверка данных → расчёты → интерфейс → проверка с бизнесом», срок «Четыре недели». Ссылку можно оставить пустой.
-
В аккаунте бизнеса откройте «Кабинет бизнеса» и отклики своей задачи. Примите Альфу. После перезагрузки решение сохраняется; другие команды всё ещё могут откликаться.
-
Отредактируйте карточку: удалите «Данные и материалы» и подтвердите изменение. Рейтинг снизится с 60 до 40. Верните прежний текст — снова 60. После каждой правки подтверждение требуется повторно.
Демонстрационные карточки без владельца подходят для просмотра, но для полного сценария создайте собственную задачу. На свою задачу откликнуться нельзя. Чужой аккаунт не может редактировать карточку или просматривать её отклики. В режиме OpenAI формулировки и итоговый рейтинг могут отличаться.
Автоматические проверки
После установки зависимостей, из корня проекта:
cd backend
.\.venv\Scripts\python.exe -m unittest discover -s tests -v
cd ../frontend
npm run typecheck
npm test
npm run build
Python-тесты проверяют схемы, ошибки AI и рейтинг, включая 6561 сочетание полей; внешние AI-ответы подставные. Без TEST_DATABASE_URL сквозной тест PostgreSQL пропускается. Для его запуска нужна отдельная тестовая схема с префиксом pilot_test_, применённые миграции и Python в режиме demo:
# В отдельном терминале frontend. Замените USER, PASSWORD и TEST_DB своими значениями.
$env:TEST_DATABASE_URL = "postgresql://USER:PASSWORD@localhost:5432/TEST_DB?schema=pilot_test_integration"
$env:DATABASE_URL = $env:TEST_DATABASE_URL
$env:AI_BACKEND_URL = "http://127.0.0.1:8000"
npm run db:migrate
npm test
Не используйте рабочую базу для тестирования. Сквозной тест проверяет вход, права, публикацию, сохранение рейтинга, отклики и одновременное принятие нескольких команд. Автотесты не заменяют оценку качества живой модели или нагрузочную проверку.
8. Данные и интеграции
- Источники — описания и ответы бизнеса, ручные правки и предложения команд.
- Шесть начальных карточек из
frontend/lib/domain.ts— синтетические примеры. Seed не создаёт готовые аккаунты и отклики. - PostgreSQL хранит аккаунты с хешами паролей, задачи и предложения. Старый
.data/store.jsonавтоматически не импортируется. - OpenAI получает черновик, а при сборке карточки также вопросы и ответы. В demo эти данные не отправляются во внешний AI.
- Ссылки на материалы и прототипы вводятся пользователем; загрузки файлов и автоматического импорта по ссылкам нет.
- Интеграций с CRM, вузовскими системами и внешними датасетами нет.
9. Ограничения
- Рейтинг основан на длине текста и не гарантирует качества или выполнимости задания. AI-карточку нужно проверять вручную.
- Нет подтверждения этапов выполнения, баллов студентов, полноценных профилей и состава команд, автоматического подбора, чата и уведомлений.
- Отклик хранит название команды, но не отдельный профиль команды, связанный с аккаунтом.
- Нет автосохранения незавершённой формы и защиты от дублирования публикации/отклика после обрыва связи.
- Принятый отклик нельзя отклонить, отклонённый — принять; повтор того же решения допустим.
- Нет сброса паролей, индивидуального серверного отзыва сессий и ограничения частоты запросов.
- Python не проверяет пользовательские сессии; права проверяет Next.js. Для публичного запуска Python должен быть закрыт от прямого внешнего доступа; также нужны HTTPS, настройка CORS, лимиты расходов AI и резервное копирование БД.
10. Развёрнутая версия
Подтверждённая ссылка на публичную deployed-версию в репозитории не указана. Для проверки используйте локальный запуск выше.
11. Проверка интеграции — 23 сентября 2026
- Разрешены конфликты объединения AI/scoring и PostgreSQL. Сохранены регистрация, проверка владельца, ручное подтверждение, редактирование и выбор нескольких команд.
- Все 6 миграций применены к отдельному PostgreSQL 18, схема
pilot_test_integration. Рабочая база пользователя не изменялась; подключение к ней нужно указать вfrontend/.env. - Прошли 12 Python-тестов, включая 6561 комбинацию полей и ошибки OpenAI, и 5 TypeScript-тестов без пропусков, включая полный сценарий с реальной тестовой БД, проверку прав и конкурентное принятие двух команд. TypeScript и production-сборка прошли.
- В браузере проверены регистрация, карточка 60 → 100, подтверждение и публикация, отклик другого аккаунта, ручное принятие и сохранение решения после перезагрузки. Исправлен ложный запрет локальной регистрации из-за нормализации Host в Next.js.
- Настоящий gpt-4o проверен с предоставленным локальным ключом: отдельно через
smoke_openai.pyи через мастер в браузере. Получены три вопроса и редактируемая карточка. После уточнения промпта повторный smoke-тест подтвердил перенос явно заданного условия приёмки в критерии успеха; отсутствующие контакты и ограничения остались null. Один пример не гарантирует качество модели на любых данных: требуется проверка человеком. .env, ключи, pgpass, тестовый кластер и выгрузки исключены из Git. Проверка текущих файлов на распространённые форматы секретов не нашла ключей. История Git не аудировалась.
Формат ответов модели: официальная документация OpenAI Structured Outputs.
Авторы коммитов
История коммитов
- 2026-09-23 17:43Merge PostgreSQL storage with validated AI pilot integrationbakzhanzhappar-create
- 2026-09-23 16:56chore: sync complete project stateBekish-Kakish
- 2026-09-23 16:49Integrate pilot frontend with AI backend and validate end-to-end workflowsbakzhanzhappar-create
- 2026-09-23 16:23Replace JSON storage with PostgreSQL and Prisma, add migrations and integration testsbakzhanzhappar-create
- 2026-09-23 15:29Update AI branch instructions for backend directorybakzhanzhappar-create
- 2026-09-23 15:28Move Python backend modules and tests into backend directorybakzhanzhappar-create
- 2026-09-23 15:22Ignore local secrets credentials and sensitive databakzhanzhappar-create
- 2026-09-23 15:22Implement AI business core and deterministic task scoringbakzhanzhappar-create
Все коммиты (14)
- 2026-09-23 15:13Ignore local secrets credentials and sensitive databakzhanzhappar-create
- 2026-09-23 15:00Implement AI business core and deterministic task scoringbakzhanzhappar-create
- 2026-09-23 16:08Ignore local Node build artifactsRasulBat
- 2026-09-23 16:06Integrate frontend with backend and secure task workflowsRasulBat
- 2026-09-23 15:11Merge pull request #1 from BAITC-Hacks/codex/rasul-frontendRasulBat
- 2026-09-23 15:09Add frontend app for task marketplaceRasulBat
Структура репозитория (48 файлов)
.gitignore README.md backend/.env.example backend/ai_service.py backend/main.py backend/requirements.txt backend/schemas.py backend/scoring.py backend/smoke_openai.py backend/tests/test_core.py frontend/.env.example frontend/.gitignore frontend/AGENTS.md frontend/CLAUDE.md frontend/app/[[...slug]]/page.tsx frontend/app/api/[...path]/route.ts frontend/app/globals.css frontend/app/layout.tsx frontend/components/auth-panel.tsx frontend/components/card-editor.tsx frontend/components/create-task.tsx frontend/components/workspace.tsx frontend/lib/api.ts frontend/lib/auth.ts frontend/lib/backend-client.ts frontend/lib/domain.ts frontend/lib/errors.ts frontend/lib/prisma.ts frontend/lib/store.ts frontend/lib/task-service.ts frontend/lib/validation.ts frontend/next.config.mjs frontend/package-lock.json frontend/package.json frontend/prisma.config.ts frontend/prisma/migrations/20260923000000_init/migration.sql frontend/prisma/migrations/20260923000001_one_accepted_team/migration.sql frontend/prisma/migrations/20260923000002_backend_card_fields/migration.sql frontend/prisma/migrations/20260923000003_backend_scoring/migration.sql frontend/prisma/migrations/20260923000004_users_and_task_owners/migration.sql frontend/prisma/migrations/20260923000005_pilot_integration/migration.sql frontend/prisma/migrations/migration_lock.toml frontend/prisma/schema.prisma frontend/prisma/seed.ts frontend/tests/api.test.ts frontend/tests/domain.test.ts frontend/tsconfig.json package-lock.json
Ветки (3)
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.