Alem Practice
Django-платформа, в которой бизнес через пошаговый конструктор из 9 блоков с AI-подсказками превращает краткое описание проблемы в карточку задачи с…
О проекте
Команда: AndreySolo
Кейс HackAlem.ai: Образование — AI Sana
Стадия: Рабочий MVP
Задача кейса: Challenge Hub: превратить задачу бизнеса в задание для студенческих команд
Суть
Django-платформа, в которой бизнес через пошаговый конструктор из 9 блоков с AI-подсказками превращает краткое описание проблемы в карточку задачи с рейтингом качества, публикует её в каталоге, принимает отклики студенческих команд и подтверждает результаты этапов.
Как устроено
Монолит на Django и SQLite с ролями «Бизнес» и «Студенческая команда»; права роли и владельца проверяются на сервере. На каждом блоке OpenAI (gpt-5.4-mini, Structured Outputs + Pydantic) возвращает до трёх уточнений, а отдельная AI-проверка отсеивает подсказки не по текущему блоку и повторные вопросы. Рейтинг поля: 0% веса для пустого или бессодержательного текста, 50% без AI-проверки, 50 + floor(50 × закрытые/все уточнения) частично, 100% если проверка подтвердила полноту. Закрытие уточнения подтверждается цитатой из текущего текста поля, а хеши проверенных текстов инвалидируют оценку при правке. За подтверждённый этап команда получает 25 баллов.
Ключевые решения
- OpenAI Structured Outputs
- Pydantic-схемы
- пошаговый конструктор из 9 блоков
- AI-проверка закрытия уточнений по цитатам
- хеширование проверенных текстов
- ролевой доступ
Особенности
Рейтинг оценивает не только заполненность, но и качество текста: закрытие уточнения засчитывается, только если в поле есть подтверждающая цитата. Поэтому полностью заполненная карточка без AI-проверок получает лишь 49/100.
Стек
Python · Django 5.2 · SQLite · Django Templates · JavaScript · OpenAI Python SDK · Pydantic
Модели
gpt-5.4-mini
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-6fec9f63-andreysolo.
README
README.mdAlem Practice
Платформа для подготовки бизнес-задач и совместной работы со студенческими командами. MVP по кейсу HackAlem: от краткого описания проблемы до понятной карточки, открытого каталога, откликов и подтверждённого результата.
1. Какую проблему решает проект
Первоначальное описание бизнес-задачи часто не содержит достаточно сведений, чтобы студенты могли предложить решение: непонятны текущий процесс, доступные данные, ограничения или критерии успеха.
Alem Practice помогает представителю бизнеса постепенно дополнить описание с помощью ИИ. Рейтинг показывает готовность карточки к работе и влияет на её позицию в каталоге. Студенческие команды самостоятельно выбирают задачи и предлагают решения, а бизнес вручную принимает решение о сотрудничестве.
Основная геймификация направлена на качество постановки задачи: баллы зависят от заполнения полей и устранения пробелов, найденных при AI-проверке. Команды отдельно получают баллы за подтверждённый бизнесом этап работы.
2. Что реализовано
Пользователи и доступ
- Бизнес: создание, редактирование и публикация своих задач, просмотр откликов, выбор команд, подтверждение результатов.
- Студенческая команда: просмотр каталога, отправка предложений и передача результата после выбора бизнесом. Размещать задачи нельзя.
- Тип не назначен: доступ к открытому каталогу; для рабочих действий администратор должен назначить тип.
- Проверки роли и владельца выполняются на сервере. Недоступные действия также скрыты в интерфейсе.
- Вход и выход через стандартную авторизацию Django; административная панель для управления данными.
Конструктор и AI-помощник
- Первоначальный ввод названия, темы и свободного описания.
- Девять последовательных блоков: о задаче, контекст, потребность, пользователи, данные, ограничения, ожидаемый результат, критерии успеха, связь с бизнесом.
- Пояснение перед каждым полем и уточнения непосредственно под соответствующим полем.
- Анализ текущего текста перед переходом дальше. Подсказки предлагают дополнить единое описание: «Уточните…», «Опишите…», «Добавьте…».
- Отдельная AI-проверка принадлежности подсказок текущему блоку и отсутствия повторных вопросов о уже сообщённых фактах.
- Повторная проверка дополнений, возврат назад, итоговый просмотр карточки и предварительного рейтинга.
- Резервные локальные подсказки при отсутствии ключа или ошибке API.
Каталог, предложения и результаты
- Каталог всех опубликованных задач, поиск по названию и потребности, фильтры по теме и уровню готовности.
- Сортировка по убыванию рейтинга, затем по времени изменения задачи.
- Отклик с идеей, планом, сроком и необязательной ссылкой на прототип.
- Ручное принятие и отклонение предложений без перезагрузки всей страницы. Статусы: серый — на рассмотрении, зелёный — выбрана, красный — отклонена.
- Возможность выбрать несколько команд. Автоматического назначения нет.
- Передача выбранной командой текстового результата этапа; подтверждение бизнесом даёт 25 баллов один раз за отклик.
- Кабинет бизнеса со своими задачами и кабинет команды с предложениями и баллами.
3. Как работает решение
- Представитель бизнеса входит и вводит краткое описание проблемы. Создаётся непубличный черновик; исходный текст переносится в поле контекста.
- Пользователь заполняет очередной блок и нажимает «Далее · уточнить с ИИ». OpenAI анализирует текст и возвращает до трёх подсказок по текущему блоку. Если существенных уточнений нет, список может быть пустым.
- Пользователь дополняет текст. Можно повторно проверить уточнения или нажать «Продолжить», в том числе без дополнений. Этот выбор учитывается при оценке качества.
- После всех блоков система показывает карточку и предварительные баллы с причинами. «Подтвердить и сохранить» сохраняет изменения и пересчитывает рейтинг.
- Бизнес отдельно нажимает «Опубликовать». Задача появляется в общем каталоге; низкий рейтинг не запрещает отклики.
- Команда входит в свой аккаунт, находит задачу и отправляет предложение.
- Бизнес принимает или отклоняет отклик. Выбранная команда передаёт результат этапа; бизнес подтверждает его, после чего команде начисляются баллы.
Промежуточные изменения конструктора и история уточнений хранятся в серверной сессии. До итогового подтверждения они не изменяют сохранённую карточку и её рейтинг. Перезагрузка страницы сама по себе не повторяет AI-запрос.
Как считается рейтинг
Суммарный максимум — 100 баллов. Веса разделов:
- Контекст и потребность — 20, по 10 за каждое поле.
- Данные и материалы — 20.
- Ожидаемый результат — 15.
- Критерии успеха — 15.
- Ограничения — 10.
- Пользователи — 10.
- Контакт и формат взаимодействия — 10, по 5 за каждое поле.
Название и тема входят в конструктор, но отдельных баллов не дают.
Для каждого оцениваемого поля:
- 0% веса: поле пустое, карточка ещё не подтверждена либо AI-проверка признала текст бессодержательным.
- 50% веса: поле заполнено, но актуальной AI-проверки нет, API недоступен или пользователь продолжил без устранения уточнений.
- Частичная оценка: после проверки доля рассчитывается как
50 + floor(50 × закрытые уточнения / все уточнения). Новые существенные пробелы также учитываются. - 100% веса: AI-проверка подтвердила содержательность текста и отсутствие существенных пробелов либо закрытие всех уточнений.
Например, если закрыто одно из двух уточнений, поле получает 75% своего веса. Наличие изменённого текста само по себе не считается ответом: проверяется цитата из текущего поля и её соответствие уточнению. Для контакта, который не отправляется в API, проверяется только признак наличия.
Баллы суммируются внутри каждого раздела и округляются вниз. Поэтому полностью заполненная карточка без AI-проверок получает 49/100. Отсутствие подсказок после фильтрации не даёт максимум автоматически: полнота проверяется отдельно.
Оценки, причины, уточнения, подтверждающие цитаты и хеши проверенных текстов сохраняются в Task.quality_reviews. Изменение текста делает прежнюю оценку этого поля неприменимой. Старые карточки без истории AI-проверок пересчитываются на базовый уровень.
Уровни готовности:
- 0–39: черновик.
- 40–69: рабочая.
- 70–89: готовая.
- 90–100: приоритетная.
Уровень «черновик» в рейтинге не равен статусу публикации: подтверждённую задачу с низким баллом можно опубликовать.
4. Технологии
- Python, Django 5.2.17 — серверная логика, формы, ORM, миграции, сессии, авторизация и административная панель.
- SQLite — локальная база
db.sqlite3. - Django Templates, HTML, CSS — серверный интерфейс с адаптивными стилями.
- JavaScript и Fetch API — асинхронные действия с откликами и индикация ожидания в конструкторе.
- OpenAI Python SDK 3.19.0, Responses API, Structured Outputs — генерация уточнений, проверка их смысла и оценка дополнений.
- Pydantic 2.13.5 — схемы структурированных ответов модели.
- python-dotenv 1.2.3 — загрузка настроек из
.env.
Модель по умолчанию — gpt-5.4-mini. Она указана в .env.example и используется кодом, если OPENAI_MODEL пуст. Другую доступную модель можно задать через переменную окружения; она должна поддерживать используемый API и структурированные ответы.
Версии прямых зависимостей закреплены в requirements.txt. Отдельная сборка фронтенда и Node.js для запуска не нужны.
5. Архитектура проекта
Это Django-монолит: браузер получает HTML со страницами, отправляет формы на сервер, а сервер работает с SQLite и при необходимости вызывает OpenAI. Для решений по откликам тот же сервер возвращает JSON, которым JavaScript обновляет статус на странице.
Браузер: формы и JavaScript
|
v
Django: маршруты → проверка роли/владельца → представления
| |
v v
SQLite: пользователи, OpenAI Responses API:
задачи, отклики, сессии подсказки и проверка качества
|
v
Карточка, рейтинг, каталог, решение по отклику
Основные компоненты:
config/— настройки приложения, корневые маршруты и WSGI.projects/models.py—Account(тип пользователя),Task(карточка и рейтинг),Team(профиль команды),Proposal(отклик и результат этапа). Учётные записи — стандартная модель пользователя Django.projects/views.py,projects/urls.py,projects/forms.py— пользовательские действия, маршрутизация и проверка ввода.projects/roles.py— ограничения по типу пользователя и данные для отображения роли в интерфейсе.projects/wizard.py— порядок блоков конструктора и пояснения к полям.projects/ai.py,projects/question_scopes.py— генерация подсказок, границы блоков, проверка смысла и локальный резервный режим.projects/quality.py— AI-проверка дополнений, проверка цитат и оценка отдельных полей;projects/services.py— суммирование рейтинга по разделам.templates/,static/— шаблоны страниц, стили, скрипты конструктора и действий с откликами.projects/migrations/— схема БД и миграции существующих ролей и рейтингов.projects/management/commands/— демонстрационные данные и проверки подключения AI.projects/tests.py,projects/test_*.py— автоматические тесты.
6. Установка и запуск
Подготовка
Для воспроизведения локального запуска используйте Python 3.12, pip и Git. Для AI-функций нужны интернет, API-ключ OpenAI и доступ к выбранной модели. Без ключа приложение запускается с локальными подсказками и базовым рейтингом.
git clone https://github.com/BAITC-Hacks/hack-6fec9f63-andreysolo.git
cd hack-6fec9f63-andreysolo
Если проект уже скачан, достаточно перейти в его корневую папку, где находится manage.py.
Windows PowerShell
Создайте окружение, установите зависимости и подготовьте файл настроек:
python -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r requirements.txt
Copy-Item .env.example .env
.\.venv\Scripts\python.exe -c "import secrets; print(secrets.token_urlsafe(48))"
Скопируйте выведенный случайный секрет в DJANGO_SECRET_KEY внутри .env. Если .env уже существует, не копируйте шаблон поверх него.
Linux / macOS
python3 -m venv .venv
.venv/bin/python -m pip install -r requirements.txt
cp .env.example .env
.venv/bin/python -c "import secrets; print(secrets.token_urlsafe(48))"
Аналогично перенесите сгенерированный секрет в .env; сохраните существующий файл, если он уже настроен.
Настройки .env
DJANGO_DEBUG=1
DJANGO_SECRET_KEY=вставьте_сгенерированный_секрет
DJANGO_ALLOWED_HOSTS=localhost,127.0.0.1,[::1]
OPENAI_API_KEY=
OPENAI_MODEL=gpt-5.4-mini
DJANGO_DEBUG=1включает режим локальной разработки;0отключает его.DJANGO_SECRET_KEY— секрет Django, отдельный от API-ключа.DJANGO_ALLOWED_HOSTS— разрешённые имена хостов через запятую.OPENAI_API_KEY— ключ для настоящих AI-запросов. Оставьте пустым для резервного режима.OPENAI_MODEL— идентификатор модели.
.env автоматически читается при запуске и исключён из Git. Уже заданные системные переменные окружения имеют приоритет. После изменения настроек перезапустите сервер. Не публикуйте ключи в README или репозитории.
База данных и сервер
Windows:
.\.venv\Scripts\python.exe manage.py migrate
.\.venv\Scripts\python.exe manage.py seed_demo
.\.venv\Scripts\python.exe manage.py runserver 127.0.0.1:8000
Linux / macOS:
.venv/bin/python manage.py migrate
.venv/bin/python manage.py seed_demo
.venv/bin/python manage.py runserver 127.0.0.1:8000
Откройте локальное приложение. Остановка сервера — Ctrl+C.
Демоаккаунты
После seed_demo доступны:
business— представитель бизнеса.team1— Steppe Coders.team2— Data Nomads.team3— Qadam.team4— Green Stack.team5— Jas AI.
Пароль всех созданных демоаккаунтов: AlemDemo2026!. Это общедоступные демонстрационные реквизиты для локального показа.
При первом запуске на пустой БД команда создаёт пять опубликованных задач с исходными описаниями, пять команд и пять откликов. Повторный запуск не сбрасывает существующие пароли и не заменяет созданные карточки; для пары «задача–команда» новый демоотклик создаётся только при отсутствии отклика.
Администрирование
.\.venv\Scripts\python.exe manage.py createsuperuser
В Linux/macOS используйте .venv/bin/python. Вход в административную панель — под созданным суперпользователем.
Для нового рабочего аккаунта создайте пользователя и профиль Account с типом business или student. Для студенческого аккаунта также создайте Team. Сам по себе статус суперпользователя не назначает бизнес-роль в пользовательском интерфейсе.
7. Как проверить решение жюри
Сквозной сценарий
- Войдите как
business. Нажмите «Разместить задачу». Укажите название «Учёт заказов кофейни», тему «Ритейл» и исходное описание: «Заказы на торты приходят в два мессенджера и иногда теряются». - Пройдите конструктор. На каждом блоке нажмите «Далее · уточнить с ИИ», прочитайте подсказки и дополните описание либо продолжите без дополнений. При работающем API источник подсказок — OpenAI; при ошибке явно отображается резервный режим.
- Для демонстрационной карточки можно использовать следующие сведения:
- Контекст: администратор вручную переносит заказы из двух мессенджеров в тетрадь, часть обращений пропускается.
- Потребность: собирать заявки в единый список и отслеживать их выполнение.
- Пользователи: администратор оформляет заказ, кондитер видит состав и отмечает готовность.
- Данные: 30 синтетических примеров заявок в CSV; никаких реальных контактов клиентов.
- Ограничения: прототип за две недели без платных внешних сервисов.
- Результат: веб-прототип со списком, поиском и сменой статуса заказа, инструкция запуска.
- Критерии успеха: все 30 примеров отображаются; заказ находится по номеру; смена статуса сохраняется после обновления страницы.
- Связь:
[email protected], одна встреча в неделю, результат принимает администратор кофейни.
- На итоговом экране рассмотрите рейтинг и причины. Подтвердите сведения, сохраните карточку и нажмите «Опубликовать». Убедитесь, что задача видна в каталоге и находится через поиск.
- Выйдите и войдите как
team1. Кнопки создания задачи быть не должно. Откройте задачу и отправьте предложение: идея «Единый журнал заказов», план «Макет → реализация → проверка на CSV», срок «2 недели». Ссылку на прототип можно оставить пустой. - Под
businessоткройте отклик. Нажмите «Принять»: статус должен стать зелёным без перезагрузки страницы. Можно проверить отклонение: статус станет красным; затем снова принять предложение до подтверждения этапа. - Под
team1в кабинете нажмите «Передать результат этапа» и опишите выполненную демонстрационную работу. Подbusinessподтвердите этап. В кабинете команды счёт увеличится на 25; повторное подтверждение не должно добавлять баллы ещё раз.
Для демонстрации качества рейтинга сначала продолжите один блок без ответа на уточнение, затем повторно отредактируйте карточку и добавьте недостающие сведения. Посмотрите, изменились ли оценка и причины. Конкретные подсказки и итоговый балл не фиксированы: они зависят от текста и ответа модели; рост до 100 не гарантируется.
Перед выходом из аккаунта подтвердите карточку: незавершённые изменения конструктора привязаны к текущей сессии.
Автоматические проверки
.\.venv\Scripts\python.exe manage.py check
.\.venv\Scripts\python.exe manage.py test
.\.venv\Scripts\python.exe manage.py makemigrations --check --dry-run
В Linux/macOS замените путь интерпретатора на .venv/bin/python.
Тесты покрывают сквозной сценарий, публикацию после подтверждения, ограничения ролей и владельцев, рейтинг и подтверждающие цитаты, резервные AI-ответы, шаги конструктора, JSON-действия с откликами, CSRF и защиту от повторного начисления баллов. В автоматических тестах AI-вызовы подменяются или используется режим без ключа.
Для отдельной проверки настоящего API предусмотрены команды на синтетических данных, не создающие карточки в БД:
.\.venv\Scripts\python.exe -X utf8 manage.py check_openai --field context --cattle
.\.venv\Scripts\python.exe -X utf8 manage.py check_quality
Первая проверяет уточнения по блоку, вторая сравнивает оценку до и после дополнения. Нужен действующий API-ключ; команды отправляют реальные, потенциально платные запросы. Результаты модели могут различаться, а диагностическая команда может завершиться ошибкой, если проверка не пройдена.
8. Данные и интеграции
Источники данных: текст, введённый бизнесом; профили и предложения команд; результаты этапов; синтетический набор из seed_demo. Демозадачи относятся к кофейне, велопрокату, стажировкам, теплице и мастерской. Ссылки example.com/demo в демооткликах — заглушки, не готовые прототипы.
Внешняя интеграция: OpenAI Responses API на https://api.openai.com/v1. Приложение вызывает его только с сервера. Модель помогает уточнять постановку и оценивать полноту; она не выполняет саму бизнес-задачу, не строит прогнозы по файлам и не назначает команды.
При генерации отправляются текстовые поля карточки, включая исходное описание. В оценке используются поля карточки и история уточнений, а при проверке цитат — уточнения и цитаты. Отдельное поле contact заменяется признаком наличия контакта. Данные, вписанные в другие поля, автоматически не обезличиваются. Контакт из опубликованной карточки виден её посетителям.
В запросах указано store=False; это параметр API-запроса, а не гарантия отсутствия обработки данных у внешнего провайдера. Ключ берётся из окружения. У клиента установлен таймаут 30 секунд на запрос, автоматические повторы отключены. Генерация с проверкой смысла может использовать два запроса; оценка дополнений с проверкой цитат — ещё до двух.
Для генерации ограничен размер входного JSON до 24 000 символов; для оценки качества — до 30 000. При превышении лимита либо сбое используется базовый режим. Импорт CSV/JSON, загрузка файлов и интеграции с системами бизнеса не реализованы: упоминания CSV в карточках — описания доступных материалов.
9. Ограничения текущей версии
- Это демонстрационный MVP, а не готовая производственная платформа. Используются SQLite и стандартный сервер разработки Django; готовой конфигурации публичного размещения нет.
- Нет самостоятельной регистрации, интерфейса восстановления пароля и управления участниками команды. Один профиль команды связан с одним аккаунтом.
- Нет чата, уведомлений, календаря, загрузки файлов, персональных рекомендаций задач или автоматического подбора команд.
- Один подтверждаемый этап на отклик. Отдельного проектного трекера нет; подтверждённый этап нельзя отклонить.
- Незавершённый конструктор хранится в сессии. Выход из аккаунта завершает её; одновременное редактирование одной задачи в нескольких вкладках не поддерживается, устаревшие шаги отклоняются.
- AI-оценка вероятностная: возможны лишние уточнения, пропуски, неточная оценка полноты. Проверяется качество описания, а не истинность фактов и не реализуемость решения. Максимальный рейтинг не является гарантией результата проекта.
- Без доступного API заполненные поля получают только базовые баллы; смысловая проверка не имитируется как успешная.
- AI-запросы синхронные и могут занимать заметное время. Пользовательских лимитов частоты и бюджета запросов, фоновой очереди и кэширования ответов нет.
- Нет отдельного журнала аудита решений и механизма скрытия контактов опубликованных задач.
DEBUGвключён по умолчанию, демопароли общедоступны. Для публичного запуска нужны отдельные секреты, HTTPS, настройки cookies, обслуживание статики, производственный сервер и дополнительные эксплуатационные настройки. Демоданные не следует выдавать за реальные заявки бизнеса.
10. Развёрнутая версия
Подтверждённая ссылка на публично развёрнутую версию в репозитории отсутствует.
Для демонстрации предусмотрен локальный адрес http://127.0.0.1:8000/ после запуска по инструкции. Он доступен на компьютере, где запущен сервер, и не является публичным деплоем.
Авторы коммитов
История коммитов
- 2026-09-23 16:31readmeAndreyRalko
- 2026-09-23 16:25query_statusAndreyRalko
- 2026-09-23 15:35correct_ratingAndreyRalko
- 2026-09-23 15:06answers_upgradeAndreyRalko
- 2026-09-23 14:23first_comitAndreyRalko
Структура репозитория (47 файлов)
.env.example .gitignore README.md config/__init__.py config/settings.py config/urls.py config/wsgi.py manage.py projects/__init__.py projects/admin.py projects/ai.py projects/forms.py projects/management/__init__.py projects/management/commands/__init__.py projects/management/commands/check_openai.py projects/management/commands/check_quality.py projects/management/commands/seed_demo.py projects/migrations/0001_initial.py projects/migrations/0002_task_quality_reviews.py projects/migrations/0003_recalculate_quality_scores.py projects/migrations/0004_account.py projects/migrations/0005_assign_account_roles.py projects/migrations/__init__.py projects/models.py projects/quality.py projects/question_scopes.py projects/roles.py projects/services.py projects/test_ai.py projects/test_proposal_actions.py projects/test_quality.py projects/test_roles.py projects/tests.py projects/urls.py projects/views.py projects/wizard.py requirements.txt static/app.css static/proposals.js static/wizard.js templates/base.html templates/projects/catalog.html templates/projects/detail.html templates/projects/form.html templates/projects/wizard.html templates/projects/workspace.html templates/registration/login.html
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.