Sauron
Платформа Challenge Hub: бизнес создаёт черновик задачи, AI-навигатор задаёт уточняющие вопросы, карточка получает рейтинг готовности 0–100 и…
О проекте
Команда: Sauron
Кейс HackAlem.ai: Образование — AI Sana
Стадия: Рабочий MVP
Задача кейса: Challenge Hub: превратить задачу бизнеса в задание для студенческих команд
Суть
Платформа Challenge Hub: бизнес создаёт черновик задачи, AI-навигатор задаёт уточняющие вопросы, карточка получает рейтинг готовности 0–100 и публикуется в каталоге, где студенческие команды оставляют отклики, а бизнес вручную их принимает или отклоняет.
Как устроено
Django REST API + SPA на React 19/Vite, данные в SQLite (опционально PostgreSQL). Навигатор по умолчанию детерминированный (mock на правилах, учитывает тему черновика и заполненные поля), опционально вызывает OpenAI (gpt-4o-mini) со структурированным ответом из 3–9 вопросов {field, question}; при ошибке или некорректном ответе включается локальный фолбэк. Рейтинг считается сервером по прозрачной формуле из 7 блоков (контекст 20, данные 20, результат 15, критерии 15, ограничения 10, пользователи 10, связь 10) и отсеивает заглушки вроде «TODO» и «не знаю».
Ключевые решения
- rule-based question generation
- structured LLM output with validation
- deterministic readiness scoring
- LLM fallback
Особенности
Честное разделение: рейтинг оценивает только полноту описания, а не компанию, и не скрывает задачи с низким баллом. Правка уже опубликованной карточки требует повторного подтверждения. Ответы LLM проверяются (типы, допустимые поля, отсутствие повторов), а на регрессии есть тесты без платных вызовов.
Стек
Python · Django · Django REST Framework · React · TypeScript · Vite · SQLite · PostgreSQL · Docker Compose · Vitest · Playwright
Модели
GPT-4o-mini
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-a83e1c43-sauron.
README
README.mdSauron — от идеи бизнеса к понятной задаче для команды
MVP команды Sauron для кейса AI Sana Challenge Hub на хакатоне HackAlem AI.
Бизнес описывает проблему, AI-навигатор помогает уточнить детали, а рейтинг показывает полноту карточки. Студенческие команды находят задачи в каталоге и предлагают решения. Бизнес сам выбирает одну, несколько или ни одной команды — автоматического назначения нет.
Зачем нужен Sauron
«Хотим автоматизировать процесс» ещё не объясняет команде, что именно делать. Без контекста, данных и критериев успеха участникам приходится сначала восстанавливать постановку задачи в переписке.
Sauron помогает бизнесу сформулировать потребность, а студентам — оценить, что известно о задаче и какие вопросы остаются открытыми. Геймификация строится вокруг улучшения карточки: бизнес дополняет описание, видит рост баллов и поднимает задачу в каталоге.
Что работает
- Черновик. Бизнес указывает название, направление и описание своими словами.
- Уточнение. Навигатор предлагает не меньше трёх вопросов с учётом описания и заполненных полей.
- Карточка. Человек отвечает на вопросы и редактирует контекст, результат, ограничения и контакты.
- Рейтинг. Интерфейс показывает оценку 0–100, вклад каждого блока и недостающие сведения. При сохранении рейтинг пересчитывает сервер.
- Публикация. После ручного подтверждения задача появляется в каталоге. Есть поиск, фильтры по направлению и готовности, сортировка и закладки.
- Отклик. Команда создаёт профиль, описывает идею, план и сроки. Ссылка на прототип необязательна.
- Решение бизнеса. В рабочем пространстве можно принять несколько откликов или отклонить все. Принятие одного не отклоняет остальные.
Низкий рейтинг не скрывает опубликованную задачу и не мешает отправлять отклики. Это оценка описания задачи, а не репутации компании или способ автоматического подбора исполнителя.
Есть адаптивный интерфейс, редактирование профилей команд, локальное сохранение черновика формы и обработка ошибок сети. Изменение уже опубликованной карточки требует нового подтверждения перед сохранением.
Технологии
| Часть | Реализация |
|---|---|
| Интерфейс | React 19, TypeScript, Vite 7 |
| Backend | Python, Django, Django REST Framework |
| Данные | SQLite по умолчанию; поддерживается PostgreSQL |
| AI-навигатор | Локальный mock на правилах; опциональный OpenAI-провайдер |
| Проверки | Django tests, Vitest, Playwright |
Зависимости: requirements.txt, package.json, package-lock.json.
Быстрый запуск
Нужны Git, Python 3.12+, Node.js 22.12+ и доступ к репозиторию команды. Для локального демо не нужны Docker и ключ внешнего AI.
Windows / PowerShell
git clone https://github.com/BAITC-Hacks/hack-a83e1c43-sauron.git
cd hack-a83e1c43-sauron
python -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r requirements.txt
npm ci
npm run build
$env:AI_PROVIDER = "mock"
.\.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
Если репозиторий уже скачан, начните с перехода в его папку. Активация виртуального окружения не требуется: команды явно используют Python из .venv.
Откройте:
- Главную страницу.
- Каталог задач.
- Проверку API — ожидается
{"status":"ok","service":"hackalem-ai-backend"}.
Django отдаёт готовую сборку из dist/ и API на одном адресе. После изменения файлов в src/ повторите npm run build. Сборка, база и зависимости не хранятся в Git.
Linux / macOS
git clone https://github.com/BAITC-Hacks/hack-a83e1c43-sauron.git
cd hack-a83e1c43-sauron
python3 -m venv .venv
.venv/bin/python -m pip install -r requirements.txt
npm ci
npm run build
export AI_PROVIDER=mock
.venv/bin/python manage.py migrate
.venv/bin/python manage.py seed_demo
.venv/bin/python manage.py runserver 127.0.0.1:8000
Адрес приложения тот же: http://127.0.0.1:8000/.
Разработка с автоперезагрузкой фронта
После установки зависимостей и миграций:
npm start
Скрипт запускает Django и Vite или использует уже запущенные серверы. Фронтенд разработки доступен на http://127.0.0.1:5173/, запросы /api проксируются на порт 8000. На Windows также можно запустить start-sauron.cmd.
Как проверить решение жюри
После seed_demo в общем пространстве есть пять синтетических задач с разной полнотой описания.
- Откройте создание задачи. Укажите название, направление «Образование» и черновик: «Нужно помочь кураторам вовремя замечать студентов, которым сложно продолжать обучение».
- Нажмите «Уточнить с навигатором». Появятся вопросы; в стандартном запуске это явно обозначенный базовый навигатор.
- Заполните часть ответов, затем дополните контекст, результат, критерии успеха и контакты. Проверьте, как меняется предварительный рейтинг и баллы по блокам.
- На шаге обзора нажмите «К публикации». Карточка сохранится, но публикация потребует отдельного подтверждения. Отметьте его и нажмите «Опубликовать задачу».
- Найдите задачу в каталоге. Проверьте поиск, сортировку и фильтры. Задачи с низким баллом тоже доступны.
- В карточке нажмите «Предложить подход». Выберите или создайте команду, заполните идею, план и сроки, отправьте отклик.
- Откройте отклики, найдите предложение и нажмите «Принять» или «Отклонить», затем подтвердите решение.
- Обновите страницу: задача, профиль, отклик и решение сохранятся в базе. Для проверки выбора нескольких команд отправьте ещё один отклик от другого профиля.
В MVP используется общее пространство без регистрации: можно пройти обе стороны сценария в одном браузере. Это не разграничение прав доступа.
Рейтинг готовности
Рейтинг проверяет полноту заполнения карточки по прозрачным правилам. Он не подтверждает достоверность данных, реализуемость проекта или качество будущего решения.
| Блок | Поля | Максимум |
|---|---|---|
| Контекст и потребность | context, need | 20 |
| Данные и материалы | data | 20 |
| Ожидаемый результат | expected_result | 15 |
| Критерии успеха | success_criteria | 15 |
| Ограничения | constraints | 10 |
| Пользователи | users | 10 |
| Связь с бизнесом | business_contact, interaction_format | 10 |
В блоках из двух полей одно заполненное поле даёт половину баллов. Пустой текст, ответы короче трёх букв/цифр, повторы одного символа и известные заглушки вроде test, TODO и «не знаю» баллов не дают.
Уровни: 0–39 — черновая; 40–69 — рабочая; 70–89 — готовая; 90–100 — приоритетная.
Уровень готовности и статус публикации независимы: опубликованная задача с 0 баллов остаётся в каталоге. Формула находится в challenges/scoring.py, предварительный расчёт интерфейса — в src/domain.ts.
AI-навигатор
Навигатор задаёт вопросы, а не пишет факты за бизнес. Ответы вводит человек; они сохраняются в соответствующие поля карточки.
- По умолчанию —
AI_PROVIDER=mock. Это детерминированные локальные правила, не обращение к LLM. Вопросы учитывают тему черновика и уже заполненные поля. Такой режим позволяет показать сценарий без ключа и внешнего API. - Опционально —
AI_PROVIDER=openai. Серверный адаптер запрашивает структурированный ответ внешней модели. Модель задаётся черезOPENAI_MODEL; значение по умолчанию в коде —gpt-4o-mini. - Проверяются количество вопросов, типы данных, допустимые поля и отсутствие повторов. При ошибке провайдера или некорректном ответе используются локальные вопросы, а интерфейс сообщает о переходе.
- AI не публикует задачи, не принимает отклики и не назначает команды.
Вход API:
{
"draft_text": "Нужно помочь кураторам вовремя поддерживать студентов.",
"card": {
"users": "Студенты первого курса и кураторы"
}
}
Ответ содержит provider, draft_text, от 3 до 9 объектов {field, question} в questions и список missing_fields. При резервном режиме добавляются fallback_reason и notice.
Промпт, схема ответа и обработка ошибок: challenges/services/ai.py. Проверки повреждённых ответов и недоступности провайдера: challenges/test_regressions.py. Тесты не отправляют платные запросы внешнему AI.
Настройки окружения
Список переменных находится в .env.example. Django не загружает этот файл автоматически: задавайте переменные в терминале, из которого запускаете сервер, или средствами окружения.
Для внешнего режима нужны AI_PROVIDER=openai и OPENAI_API_KEY; OPENAI_MODEL необязателен. После изменения настроек перезапустите Django. Ключ хранится только на сервере: не добавляйте его в Git или переменные VITE_*, доступные браузеру.
Для PostgreSQL можно использовать сервис из docker-compose.yml и задать DATABASE_URL перед миграциями и запуском. Основной сценарий демо использует SQLite.
Данные и режимы приложения
python manage.py seed_demo создаёт в базе 5 задач с исходными описаниями и карточками, 5 профилей команд и 5 откликов. Данные синтетические. Повторный запуск не затирает ручные правки, решения или названия и не создаёт повторно те же записи.
Источник набора: challenges/management/commands/seed_demo.py.
Не путайте два режима интерфейса:
- Общее пространство — настоящий Django API и база данных. Это основной режим проверки решения.
- «Попробовать на примере» — отдельное демо в
localStorage. Оно включается явно; его данные не отправляются на сервер. Ошибка API сама по себе не переключает приложение в этот режим.
Основные API
Базовый путь: /api/v1/. Все URL заканчиваются /.
| Действие | Запрос |
|---|---|
| Проверить сервис | GET health/ |
| Получить вопросы | POST tasks/analyze/ с draft_text и необязательным card |
| Сохранить черновик | POST tasks/ |
| Изменить карточку | PATCH tasks/{id}/ |
| Опубликовать | POST tasks/{id}/publish/ с {"confirmed": true} |
| Получить каталог | GET tasks/ |
| Получить задачи, включая черновики | GET tasks/?include_drafts=true |
| Создать или изменить профиль | POST teams/ / PATCH teams/{id}/ |
| Получить или отправить отклики к задаче | GET/POST tasks/{id}/proposals/ |
| Получить все отклики | GET proposals/ |
| Принять или отклонить отклик | POST proposals/{id}/decision/ с {"decision": "accepted"} или {"decision": "rejected"} |
Каталог поддерживает industry, readiness_level, min_score и max_score; по умолчанию задачи отсортированы по убыванию рейтинга. Неверные значения фильтров возвращают HTTP 400.
status, score и временные метки не задаются клиентом. При изменении опубликованной карточки в PATCH нужен confirmed: true после проверки человеком; без него прежняя версия остаётся в каталоге.
Проверки
Из корня проекта после установки зависимостей:
npm run build
npm test
.\.venv\Scripts\python.exe manage.py check
.\.venv\Scripts\python.exe manage.py test
Тесты проверяют границы рейтинга, защиту публикации подтверждением, фильтры, обработку ответов AI, отклики, выбор нескольких команд, отказ всем командам и сохранность демо-данных при повторном заполнении.
Полный браузерный прогон на Windows с установленным Microsoft Edge:
$env:RUN_BROWSER_TESTS = "1"
$env:AI_PROVIDER = "mock"
.\.venv\Scripts\python.exe manage.py test challenges.test_frontend
Он сам поднимает тестовый сервер и временную БД: рабочие задачи не изменяются. Четыре сценария охватывают каталог и закладки, путь от черновика до решения бизнеса, мобильные экраны и явное переключение на демо при ошибке сети. Результаты сохраняются локально в artifacts/.
Ограничения MVP и следующие шаги
- Нет авторизации и владельцев записей. API использует
AllowAny; задачи, черновики, команды и решения доступны в общем пространстве. Текущая версия предназначена для локального демо, не для открытого сервиса с реальными данными. - Нет загрузки файлов, чатов и уведомлений. Прототип можно приложить ссылкой.
- Баллы команд за выполненную работу и учёт дальнейшего прогресса пока не реализованы. Это следующий этап, а не часть показанного сценария.
- Нет собственной обученной модели и смысловой проверки качества каждой формулировки.
- Перед публичным запуском нужны серверные права доступа, безопасные настройки развёртывания и работа с персональными данными.
Автоматическое назначение исполнителя не является пропущенной функцией: по правилам продукта команды сами откликаются, а бизнес принимает решение вручную.
Где смотреть код
- src/ — интерфейс и клиент API.
- challenges/ — модели, API, рейтинг, AI-адаптер, демо-данные и тесты.
- config/ — настройки и маршруты Django.
- e2e/ — браузерные сценарии.
- docs/FRONTEND.md — подробности фронтенда и режимов запуска.
Рабочая версия находится в ветке main. Фронтенд команды интегрирован из ветки nurda; запускать отдельный старый лендинг не нужно.
Авторы коммитов
История коммитов
- 2026-09-23 17:45Описать запуск и сценарий проверки SauronAbylaikhaan
- 2026-09-23 17:38Подключить фронтенд к Django и убрать старый лендингAbylaikhaan
- 2026-09-23 17:23Build complete Sauron frontend with Django API integrationNKurmanali
- 2026-09-23 16:02Обновить README для демо хакатонаAbylaikhaan
- 2026-09-23 15:53логоZulkharTheGreat
- 2026-09-23 15:49Add files via uploadNurdi
- 2026-09-23 15:39Merge repository scaffoldAbylaikhaan
- 2026-09-23 15:39Add HackAlem AI backend MVP and demo flowAbylaikhaan
Структура репозитория (62 файлов)
.env.example .gitignore .prettierrc.json README.md challenges/__init__.py challenges/admin.py challenges/apps.py challenges/management/__init__.py challenges/management/commands/__init__.py challenges/management/commands/seed_demo.py challenges/migrations/0001_initial.py challenges/migrations/0002_demo_keys.py challenges/migrations/__init__.py challenges/models.py challenges/scoring.py challenges/serializers.py challenges/services/__init__.py challenges/services/ai.py challenges/test_frontend.py challenges/test_regressions.py challenges/tests.py challenges/urls.py challenges/views.py config/__init__.py config/asgi.py config/settings.py config/urls.py config/wsgi.py docker-compose.yml docs/FRONTEND.md e2e/cleanup.ts e2e/journeys.spec.ts index.html manage.py package-lock.json package.json playwright.config.ts public/favicon.svg requirements.txt scripts/cleanup-e2e.py scripts/start.mjs src/Builder.tsx src/Catalog.tsx src/Detail.tsx src/Home.tsx src/Teams.tsx src/Workspace.tsx src/api.test.ts src/api.ts src/components.tsx src/demo.ts src/domain.test.ts src/domain.ts src/main.tsx src/store.tsx src/styles.css src/types.ts src/vite-env.d.ts start-sauron.cmd tsconfig.json vite.config.ts vitest.config.ts
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.