AAYMA
RU
Войти

импульс.

MVP-маркетплейс задач: AI уточняет описание бизнес-задачи, сервер считает рейтинг готовности карточки, задача публикуется в каталог, команды…

Рабочий MVP
Команда «противостояние святого» 8💬 0 комментариевс 23 сентября 2026 г.

О проекте

Команда: противостояние святого
Кейс HackAlem.ai: Образование — AI Sana
Стадия: Рабочий MVP

Задача кейса: Challenge Hub: превратить задачу бизнеса в задание для студенческих команд

Суть

MVP-маркетплейс задач: AI уточняет описание бизнес-задачи, сервер считает рейтинг готовности карточки, задача публикуется в каталог, команды отправляют отклики, бизнес вручную выбирает исполнителей и подтверждает этапы (+10 баллов).

Как устроено

Бизнес вводит короткое описание → OpenAI Responses API (gpt-4.1-mini, JSON Schema) возвращает минимум три уточняющих вопроса и предложения по 12 полям; без ключа вопросы генерируются локальными шаблонами. Рейтинг 0–100 считает backend/scoring.py по 7 группам только за подтверждённые поля. Публикация создаёт отдельный снимок подтверждённых значений; SQLite хранит задачи, команды, отклики и этапы, есть обнаружение устаревшей версии при правке.

Ключевые решения

  • OpenAI Responses API
  • JSON Schema structured output
  • детерминированный скоринг по группам полей
  • снимок публикации
  • обнаружение конфликтов версий
  • шаблонный фолбэк без ключа

Особенности

Запросы к OpenAI через чистый urllib без SDK; разделение черновика и публичного снимка задачи; AGENTS.md в каждом модуле для распределения работы с AI-ассистентами; фронтенд без сборки на ES-модулях.

Стек

Python · FastAPI · Pydantic · SQLite · JavaScript · HTML/CSS · Docker

Модели

OpenAI Responses API · gpt-4.1-mini


Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-4d63cc53-team.

README

README.md

импульс.

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

импульс. помогает бизнесу подготовить задачу с помощью AI, оценить полноту описания и выбрать исполнителей. Команды находят опубликованные проекты, предлагают решения и получают баллы за подтверждённый прогресс.

HackAlem · MVP · FastAPI + SQLite · OpenAI Responses · Docker

Для полноценной работы AI-помощника нужен OpenAI API key: задайте OPENAI_API_KEY и AI_MODE=auto на сервере. Локально это можно сделать в .env в корне проекта, а при размещении — в переменных окружения хостинга. Без ключа сайт продолжит работать с шаблонными вопросами в резервном режиме. См. настройки AI.

Для бизнесаДля командыДля жюри
Уточнить задачу и увидеть, чего не хватаетНайти проект и предложить план работыПовторить весь путь от описания до подтверждённого этапа

Серверные маршруты marketplace и пять экранов подключены к общей навигации. Экраны используют общий HTTP-клиент и также доступны в автономной странице. Шаги 1.5–1.6 завершены: бизнес-сценарий, навигация и marketplace проверены в Edge 23.09.2026; результаты и границы проверки — в отчёте браузерной приёмки.

Быстрый маршрут: запустить проект → повторить сценарий → посмотреть тесты и отчёты.

Оглавление

Проблема и аудитория

Проект посвящён подготовке бизнес-задач для студенческих команд. Его исходный сценарий — неполное описание, в котором нужно уточнить контекст, пользователей, данные, ограничения и критерии успеха. Цель и требования к этому сценарию зафиксированы в плане разработки.

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

Кому предназначен прототип:

  • представителям бизнеса, которым нужно сформулировать прикладную задачу;
  • студенческим командам, ищущим проекты с понятными ожиданиями;
  • жюри и организаторам, которым нужно увидеть путь от описания до результата в одном интерфейсе.

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

ВозможностьЧто получает пользователь
AI-помощникАнализ описания, минимум три уточняющих вопроса и предложения по заполнению карточки
Редактируемая карточка12 полей с отдельными отметками «Подтверждаю»; все предложения AI можно изменить
Рейтинг готовностиБалл 0–100, расшифровка весов, уровень готовности и список недостающих сведений
Черновик и публикацияСохранение рабочей версии и отдельный публичный снимок подтверждённых значений
КаталогСортировка по рейтингу, фильтры темы и готовности, выделение приоритетных задач
Профили командНазвание, интересы, навыки, технологии и накопленные баллы за этапы
ОткликиИдея, план, срок и необязательная HTTP(S)-ссылка на прототип
Решение бизнесаРучной выбор одной или нескольких команд, отказ либо отсутствие решения
Подтверждённые этапыСохранение результата и отдельное подтверждение с однократными +10 команде
Сохранение и конфликтыSQLite, восстановление данных после перезапуска и обнаружение устаревшей версии при редактировании
3.4 — демоданныеГотово: 5 описаний/карточек, 5 команд, 5 откликов; баллы 0/40/70/90/100; отдельная демо-БД
3.5 — тесты marketplaceГотово: фикстура исправлена, 5/5 серверных тестов
3.6 — интеграция и браузерОбщая оболочка подключена; сценарии каталога, откликов, выбора команд и этапов пройдены в браузерной приёмке участника 1 от 23.09.2026
3.7 — READMEГотово: актуальные запуск, архитектура, контракты и проверки
3.8 — защитаМатериалы готовы; общая репетиция ещё не проведена

Как устроен рейтинг

Баллы начисляются сервером за непустые подтверждённые поля. Каждая группа даёт полный вес, если выполнены все её условия; иначе — 0. Формула реализована в backend/scoring.py.

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

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

ГруппаУсловиеБаллы
Контекст и потребностьОба поля заполнены и подтверждены20
ДанныеОписаны доступные материалы или источники20
Ожидаемый результатУказано, что команда должна передать бизнесу15
Критерии успехаОписано, как проверить результат15
ОграниченияУказаны границы задачи10
ПользователиОписано, для кого создаётся решение10
Связь с бизнесомПодтверждены контакт, формат взаимодействия и обратная связь10
ВсегоСумма семи выполненных групп100

Тема и название не добавляют баллов. Название нужно подтвердить для публичного заголовка, тему — для её отображения и фильтрации в каталоге.

БаллыУровеньКод API
0–39Черновикdraft
40–69Рабочаяworking
70–89Готоваяready
90–100Приоритетнаяpriority

Даже опубликованная задача с 0 баллами видна в каталоге и принимает отклики. Уровень «Черновик» характеризует полноту описания; отсутствие публикации — отдельное состояние.

Две независимые оценки: рейтинг задачи показывает готовность её описания. Баллы команды растут на +10 за каждый этап, подтверждённый бизнесом после выбора команды. Отклик сам по себе баллов не даёт; повторное подтверждение того же этапа не удваивает начисление.

Сценарий для демонстрации

Вход: короткое описание бизнес-проблемы и ответы на уточнения. Результат: опубликованная карточка, предложения команд, ручное решение заказчика и сохранённый подтверждённый этап.

Описание бизнеса → вопросы AI → ответы и редактирование
       → подтверждение → рейтинг → публикация
       → отклик команды → выбор бизнеса → этап → +10 команде
  1. Бизнес описывает проблему. Например: «Хотим сократить очереди в кафе в обед».
  2. AI помогает уточнить задачу. Возвращает вопросы и предложения по полям; неизвестные сведения должны оставаться пустыми. В резервном режиме вопросы формируются локально.
  3. Человек проверяет содержание. Редактирует карточку и подтверждает выбранные поля. Сервер пересчитывает полноту описания.
  4. Бизнес публикует задачу. В каталог попадает снимок подтверждённых значений; последующие правки черновика не меняют его до новой публикации.
  5. Команда предлагает решение. Находит задачу, выбирает профиль и отправляет идею, план и срок.
  6. Бизнес принимает решение. Выбирает одну или несколько команд либо отклоняет предложения. Автоматического назначения нет.
  7. Прогресс подтверждается отдельно. Создаётся этап с описанием результата; после подтверждения выбранная команда получает +10 один раз за этот этап.

Ниже — готовые значения и точные кнопки для повторения этого сценария.

Технологии

СлойТехнологииНазначение
ИнтерфейсHTML5, CSS, JavaScript ES modulesОболочка, редактор задачи и marketplace; отдельная сборка frontend не требуется
Среда сервераPython 3.10+; в Docker — Python 3.13 slimВыполнение серверного приложения
HTTP APIFastAPI 0.115.0, Uvicorn 0.30.6REST API, Swagger UI, раздача статических файлов
ВалидацияPydantic 2.13.5Проверка типов, полей и ограничений запросов
ДанныеSQLite, стандартный модуль sqlite3Задачи, публикации, команды, отклики и этапы
AIOpenAI Platform, Responses API, модель gpt-4.1-mini по умолчаниюУточнение бизнес-задачи; модель меняется через OPENAI_MODEL
HTTP к AIСтандартные urllib.request и json, JSON SchemaСерверный запрос к OpenAI и проверка структурированного ответа; отдельный OpenAI SDK не используется
Конфигурацияpython-dotenv 1.2.3, переменные окруженияЛокальная конфигурация и ключ API
ЗапускDockerfile, Docker Compose, Windows BAT, macOS/Linux SHПовторяемая сборка и запуск
ПроверкиPython unittest, Node.js node:testCore, HTTP/repository и модульные JS-регрессии

Версии рабочих Python-зависимостей зафиксированы в backend/requirements.txt. Node.js нужен только для JS-тестов; React, npm-сборка и отдельный сервер frontend для MVP не требуются.

Архитектура и структура

В стандартной конфигурации интерфейс и API обслуживает один сервис FastAPI. Он отдаёт статические файлы и принимает запросы /api/...; сервис задач и marketplace используют общий SQLite-файл.

flowchart LR
    UI["Браузер<br/>Бизнес / Команда"] -->|"REST / JSON"| API["FastAPI<br/>backend/app.py"]
    API -->|"HTML / CSS / JS"| UI
    API --> TASKS["Задачи и версии<br/>TaskService"]
    TASKS --> SCORE["Рейтинг<br/>scoring.py"]
    TASKS --> REPO["Задачи и публикации<br/>TaskRepository"]
    REPO --> DB[("SQLite")]
    API --> MARKET["Маршруты marketplace<br/>Каталог, команды, отклики, этапы"]
    MARKET -->|"Публичные снимки"| REPO
    MARKET --> MREPO["MarketplaceRepository"]
    MREPO --> DB
    API --> AI["AI-адаптер<br/>Проверка JSON"]
    AI -->|"auto + ключ"| OPENAI["OpenAI Responses API"]
    AI -->|"fallback / нет ключа / ошибка"| LOCAL["Локальные вопросы"]
    SEED["Синтетический JSON<br/>data.seed_demo"] --> TASKS
    SEED --> MREPO
    classDef client fill:#e9f3d6,stroke:#587b39,color:#213618
    classDef core fill:#e8f1ed,stroke:#2f6650,color:#193c2d
    classDef external fill:#f3efe4,stroke:#8a7545,color:#473d26
    class UI client
    class API,TASKS,SCORE,REPO,MARKET,MREPO,DB core
    class OPENAI,LOCAL,SEED,AI external

Правила взаимодействия

  • Подтверждение и публикация — отдельные действия. В опубликованном снимке неподтверждённые значения пустые. Каталог читает снимки через TaskRepository.list_published_tasks().
  • Редактирование снимает подтверждение изменённых полей. Рабочий рейтинг пересчитывается, а старая публикация сохраняется до следующей публикации.
  • Запись требует актуальную версию. PATCH, подтверждение и публикация получают expectedRevision; при конфликте сервер возвращает 409 и текущую задачу. Интерфейс сохраняет ввод и предлагает выбрать версию.
  • Этапы сохраняются отдельно от начисления. SQLite-транзакция проверяет выбор команды и факт предыдущего подтверждения, чтобы повторный запрос не добавлял баллы.
ПутьСодержимое
frontend/index.html, frontend/styles.cssОбщая оболочка, стили и навигация
frontend/app.jsТекущий сценарий бизнеса, редактор, рейтинг, переключение ролей и подключение экранов
frontend/business/Выделенная зона участника 1; сейчас содержит правила, код сценария находится в app.js
frontend/shared/api.jsОбщий HTTP-клиент и обработка ошибок API
frontend/marketplace/Каталог, профили, отклики, этапы, отдельная демо-страница и JS-тесты
backend/app.pyСборка FastAPI, маршруты ядра, подключение marketplace и статики
backend/tasks.py, backend/scoring.py, backend/db.py, backend/schemas.pyЖизненный цикл задач, рейтинг, SQLite и схемы данных
backend/ai.py, backend/config.pyAI-адаптер, резервный режим и настройки
backend/marketplace/Собственные маршруты, схемы и репозиторий команд, откликов и этапов
backend/tests/core/, backend/tests/marketplace/Серверные тесты
data/marketplace-seed.json, data/seed_demo.pyДемоданные и загрузчик через сервис задач и marketplace-репозиторий
Dockerfile, compose.yaml, start.bat, start.shСпособы запуска
backend/runtime/Локальная SQLite и временные файлы; исключены из Git
DEVELOPMENT_PLAN.md, docs/PARTICIPANT_2.mdРазделение работ, контракты и подробный отчёт проверок

Установка и запуск

Получить исходники

Скачайте архив репозитория и распакуйте его либо используйте Git:

git clone https://github.com/BAITC-Hacks/hack-4d63cc53-team.git
cd hack-4d63cc53-team

Все дальнейшие команды выполняются из корня проекта. Выберите один способ: Docker, start.bat для Windows, start.sh для macOS/Linux или ручной запуск. Команды PowerShell и терминала macOS/Linux приведены отдельно; команды docker compose одинаковы для всех трёх ОС. Для Docker локальный Python не нужен; для остальных вариантов нужен Python 3.10+ и интернет при первой установке зависимостей. Node.js для запуска сайта не требуется.

Вариант 1. Docker Compose

Нужно: установленный и запущенный Docker с Compose, свободный порт 8000 и интернет при первой сборке. На Windows/macOS можно использовать Docker Desktop с Linux-контейнерами, на Linux — Docker Engine с плагином Compose либо Docker Desktop.

  1. Создайте файл настроек, если его ещё нет.

    Windows, PowerShell:

    if (-not (Test-Path .env)) { Copy-Item .env.example .env }
    

    macOS/Linux, терминал:

    [ -f .env ] || cp .env.example .env
    
  2. Для повторяемого демо добавьте или установите в .env строку AI_MODE=fallback. Существующий ключ сохраняется, но в этом режиме не используется. Для настоящего OpenAI см. настройки интеграции.

  3. Соберите и запустите приложение:

    docker compose up -d --build
    docker compose ps
    
  4. Откройте http://127.0.0.1:8000/. Статус контейнера после запуска должен стать healthy.

ДействиеКоманда
Повторный запускdocker compose up -d
Обновить после изменения кодаdocker compose up -d --build
Посмотреть логиdocker compose logs -f app
Остановить приложениеdocker compose stop

Пакеты устанавливаются при сборке в отдельный слой перед копированием кода. При неизменных зависимостях, базовом образе и сохранённом кэше Docker использует этот слой повторно. При запуске контейнера pip install не выполняется.

SQLite находится в томе app_runtime по пути /app/backend/runtime/app.sqlite3. Он сохраняется после обычной остановки, пересборки и пересоздания контейнера. Это отдельная база от локальной backend/runtime/app.sqlite3; данные автоматически между ними не копируются. Команда docker compose down -v удаляет том вместе с данными — для обычной остановки используйте команду из таблицы.

Вариант 2. Windows — двойной щелчок

Запустите start.bat двойным щелчком либо из PowerShell:

.\start.bat

Скрипт находит установленный Python 3.10+, создаёт отсутствующую .venv, копирует .env.example только при отсутствии .env, устанавливает зависимости и запускает сервер. Браузер открывается после успешной проверки /api/health; существующий ключ не перезаписывается. При ошибке окно остаётся открытым с пояснением. Для остановки нажмите Ctrl+C.

Вариант 3. macOS/Linux — start.sh

В терминале выполните:

sh start.sh

start.sh сам переходит в папку проекта, находит Python 3.10+ (python3 либо python), создаёт .venv при её отсутствии и устанавливает зависимости из backend/requirements.txt. Готовое совместимое окружение используется повторно, существующий .env сохраняется; при первом запуске настройки копируются из .env.example. После проверки /api/health сервер попробует открыть браузер. Если браузер не открылся, перейдите на http://127.0.0.1:8000/ вручную. Остановка — Ctrl+C в том же терминале.

Вместо sh start.sh можно один раз выдать право на выполнение и затем запускать файл напрямую:

chmod +x start.sh
./start.sh

Не переносите .venv между Windows, macOS и Linux: создавайте окружение на каждой машине отдельно. Если скрипт обнаружит несовместимую или повреждённую .venv, он остановится с пояснением и сохранит её. Используйте отдельный клон или вручную пересоздайте только виртуальное окружение. В Debian/Ubuntu для создания окружения может потребоваться пакет python3-venv.

Вариант 4. Python вручную

Windows, PowerShell:

if (-not (Test-Path .venv\Scripts\python.exe)) { py -3 -m venv .venv }
if (-not (Test-Path .env)) { Copy-Item .env.example .env }
.\.venv\Scripts\python.exe -m pip install -r backend/requirements.txt
.\.venv\Scripts\python.exe -m uvicorn backend.app:app --host 127.0.0.1 --port 8000

macOS/Linux, терминал:

[ -d .venv ] || python3 -m venv .venv
[ -f .env ] || cp .env.example .env
.venv/bin/python -m pip install -r backend/requirements.txt
.venv/bin/python -m uvicorn backend.app:app --host 127.0.0.1 --port 8000

Используйте .venv, созданную на этой ОС. Откройте основной адрес вручную; остановка — Ctrl+C. Для автоматического открытия браузера замените последнюю команду на .\.venv\Scripts\python.exe -m backend.launch в PowerShell или .venv/bin/python -m backend.launch на macOS/Linux. Для разработки Uvicorn поддерживает --reload.

Проверка start.sh, 23.09.2026: скрипт запущен в Linux-контейнере с Python 3.13.15. Проверены создание чистой .venv и установка зависимостей, запуск из другой рабочей папки по пути с пробелами, доступность сайта и API, резервный AI без внешнего запроса, остановка через SIGINT (Ctrl+C), немедленный повторный запуск с сохранением .env и ошибочный запуск при занятом порте. Синтаксис проверен в sh и bash; три регрессионных теста TCP-порта прошли в Linux. Для повторного запуска исправлен захват порта в backend/launch.py на POSIX-системах. Непосредственный запуск на macOS и автоматическое открытие графического браузера в этой проверке не проверялись; контейнер работал без графической среды.

Адреса после запуска

АдресНазначение
Основной интерфейсВесь пользовательский сценарий
Отдельное демо marketplaceКаталог, команды, отклики и этапы вне основной оболочки
Проверка сервераJSON {"status":"ok"}
Swagger UIИнтерактивная документация API
OpenAPI JSONМашиночитаемая схема API

Если запуск не получается

СимптомЧто проверить
Порт 8000 занятОстановить предыдущий запуск через BAT/SH/Uvicorn или Docker-контейнер; использовать один способ запуска
Docker не соединяется с движкомЗапустить Docker Desktop либо службу Docker Engine на Linux и дождаться её готовности
Python 3.10 or newer was not foundУстановить Python 3.10+; на macOS/Linux проверить python3 --version
Не удалось создать .venvПроверить возможность записи в папку и наличие модуля venv; в Debian/Ubuntu может понадобиться python3-venv
.venv/bin/python is unavailableИспользовать окружение для текущей ОС; start.sh не перезаписывает Windows или повреждённую .venv
Браузер не открылся автоматическиОткрыть http://127.0.0.1:8000/ вручную после сообщения о готовности сервера
Вместо OpenAI показан резервный режимПроверить AI_MODE, наличие ключа в .env именно этого сервера и причину в интерфейсе; после изменения настроек перезапустить сервер
Нет связи с серверомОткрывать страницу через http://127.0.0.1:8000/, а не двойным щелчком по HTML
После смены настроек ничего не изменилосьПерезапустить BAT/SH/Uvicorn; для Compose повторить docker compose up -d

Повторяемая проверка для жюри

Основной маршрут: одна новая задача от идеи до +10

Подготовка: до запуска установите AI_MODE=fallback в .env, затем запустите проект любым способом выше. Так демонстрация не зависит от ключа или внешнего сервиса; если сервер уже работает, перезапустите его после изменения настройки. Пример использует синтетические сведения. Новую задачу назовём «Предзаказ кафе — демо», новую команду — «Flow Makers Demo». На протяжении всего маршрута открывайте именно эту карточку.

1. Получить вопросы и заполнить карточку

В режиме «Бизнес» нажмите «Создать задачу». Введите:

Хотим сократить очереди в кафе в обед.

Нажмите «Проанализировать». Появятся минимум три уточняющих вопроса и явная отметка резервного режима. Можно ответить: нужно сократить ожидание; пользователи — гости и кассиры; доступны обезличенные времена заказов. Нажмите «Перейти к карточке» и заполните поля:

ПолеГотовое значение для демонстрации
ТемаКафе
НазваниеПредзаказ кафе — демо
КонтекстВ будни с 12:00 до 14:00 гости долго ждут у кассы
ПотребностьСократить время ожидания заказа
ПользователиГости кафе и кассиры
ДанныеОбезличенные времена заказа и выдачи за две недели
ОграниченияВеб-прототип за две недели, без изменения кассы и интеграции с оплатой
Ожидаемый результатПрототип предзаказа и отчёт о пилоте
Критерии успехаСреднее ожидание на тестовой выборке сократилось на 20%
КонтактДемо-менеджер кафе
Формат взаимодействияСозвон по вторникам на 15 минут
Обратная связьМенеджер проверяет прототип и отвечает в течение двух рабочих дней

Это условия демонстрационной задачи, а не заявленный достигнутый экономический эффект проекта.

2. Показать рост рейтинга и опубликовать

  1. Отметьте «Подтверждаю» только у темы, названия, контекста, потребности и данных.
  2. Нажмите «Сохранить и пересчитать». Ожидаемый рейтинг — 40/100: контекст/потребность дают 20, данные — ещё 20.
  3. Подтвердите остальные заполненные поля и снова нажмите «Сохранить и пересчитать». Ожидаемый рейтинг — 100/100.
  4. Нажмите «Опубликовать задачу». Появится подтверждение публикации; задача доступна в каталоге как приоритетная.

3. Отправить предложение команды

Переключитесь на «Команда» → «Команды». Создайте профиль:

ПолеЗначение
НазваниеFlow Makers Demo
ИнтересыСервисы для кафе, UX
НавыкиJavaScript, исследование пользователей
ТехнологииHTML, CSS

Нажмите «Создать профиль», затем «Каталог проектов». Найдите «Предзаказ кафе — демо» (можно использовать тему «кафе» и готовность «Приоритет»), нажмите «Открыть задачу».

В форме отклика вручную выберите Flow Makers Demo в списке команд — создание профиля не выбирает его автоматически. Заполните:

ПолеЗначение
ИдеяЭкран предварительного заказа обедов для гостей кафе
ПланПровести интервью, собрать макет и проверить его на пяти гостях
СрокДве недели
Прототипhttps://example.com/cafe-prototype — демонстрационная ссылка, необязательное поле

Нажмите «Отправить предложение». Отклик сохранится в статусе ожидания решения; баллы команды пока 0.

4. Выбрать команду и подтвердить этап

  1. Переключитесь на «Бизнес» → «Мои задачи». У «Предзаказ кафе — демо» нажмите «Отклики».
  2. У предложения Flow Makers Demo нажмите «Выбрать». Статус станет «Выбрана».
  3. В верхнем списке выбранных команд укажите Flow Makers Demo и нажмите «+ Зафиксировать этап».
  4. В поле «Что сделано» введите Подготовлен и показан прототип предзаказа. В поле «Ссылка или описание результата» — Демонстрация пяти сценариев заказа на встрече с демо-менеджером.
  5. Нажмите «Зафиксировать этап». Этап сохранится, но баллы ещё не начислены.
  6. Нажмите «Подтвердить и начислить +10». Этап станет подтверждённым, а баллы этой команды увеличатся до 10. Рейтинг задачи останется 100.
  7. Перезагрузите страницу. Снова откройте отклики и этапы, затем профиль команды: выбор, подтверждённый этап и баллы сохраняются. Кнопки повторного подтверждения этого этапа больше нет.

Результат показа: жюри видит подготовку задачи, объяснимый рост 40 → 100, публикацию, самостоятельный отклик, решение бизнеса и подтверждённый прогресс команды.

Дополнительные проверки

ДействиеОжидаемый результат
Изменить поле «Данные» и сохранить черновикПодтверждение этого поля снимается; рабочий рейтинг становится 80. В каталоге остаётся прежняя публикация до отдельного обновления
Отправить отклики от разных командБизнес может выбрать несколько, отклонить остальные либо оставить без решения
Открыть опубликованную seed-задачу кафе с 0 балламиОна видна и принимает отклики наравне с другими опубликованными задачами
Одновременно редактировать задачу в двух вкладкахУстаревшее сохранение получает конфликт; интерфейс сохраняет ввод и предлагает выбрать версию

Готовые данные для каталога и повторной репетиции

Основной маршрут выше можно пройти на пустой базе. Для быстрого обзора разных уровней готовности есть готовый seed-набор.

Docker, добавить данные в текущую контейнерную базу:

docker compose exec app python -m data.seed_demo

Команда добавляет 5 задач, 5 команд и 5 откликов; повторный вызов добавит ещё один набор. Она не очищает том и не выполняет AI-запросы.

Python, отдельная новая база для чистой репетиции: сначала подготовьте .venv по инструкции ручного запуска и остановите другой сервер на порту 8000.

.\.venv\Scripts\python.exe -m data.seed_demo --database backend/runtime/jury-demo.sqlite3
$env:DATABASE_PATH = 'backend/runtime/jury-demo.sqlite3'
$env:AI_MODE = 'fallback'
.\.venv\Scripts\python.exe -m uvicorn backend.app:app --host 127.0.0.1 --port 8000

Параметр --database откажет, если файл уже существует, сохранив его содержимое. Для следующей репетиции выберите новое имя и задайте тот же путь в DATABASE_PATH. Уже запущенный сервер не переключит базу из-за изменения переменной в другом терминале.

Данные и интеграции

Настройки

ПеременнаяНазначение
DATABASE_PATHSQLite-файл; по умолчанию backend/runtime/app.sqlite3
AI_MODEauto по умолчанию или fallback для явного локального режима
OPENAI_API_KEYКлюч только на сервере, задаётся в локальном .env
OPENAI_MODELМодель адаптера; значение в коде по умолчанию — gpt-4.1-mini
CORS_ORIGINSРазрешённые origin через запятую для отдельного frontend

Настройки запуска задавайте в .env. Переменные процесса имеют приоритет над файлом: если раньше задавали их вручную, используйте чистый терминал без этих значений. Для демо без внешнего запроса задайте AI_MODE=fallback; отдельная конфигурация демо описана ниже. Compose передаёт ключ, модель, собственный путь БД и AI_MODE из .env с учётом приоритета окружения; если AI_MODE не задана или пуста, используется auto. Без ключа контейнер также использует fallback.

Демоданные и восстановление демо

Набор — data/marketplace-seed.json, загрузчик — data/seed_demo.py. Он создаёт задачи через обычный core-сервис, подтверждает поля, вычисляет баллы и публикует снимки, затем связывает команды и отклики по фактическим новым ID. AI не вызывается.

Для воспроизводимой демонстрации создайте в корне отдельный файл .env.demo со следующим содержимым. Корневой .env сохраняется. Файлы .env.* уже исключены из Git, кроме .env.example.

DATABASE_PATH=backend/runtime/demo-new.sqlite3
AI_MODE=fallback
OPENAI_API_KEY=

Затем создайте новую базу и запустите сервер с конфигурацией из этого файла:

.\.venv\Scripts\python.exe -m data.seed_demo --database backend/runtime/demo-new.sqlite3
.\.venv\Scripts\python.exe -m uvicorn backend.app:app --host 127.0.0.1 --port 8000 --env-file .env.demo

--env-file поддерживается установленным Uvicorn; python-dotenv зафиксирован в backend/requirements.txt. Запускайте команды в чистом терминале, если ранее задавали DATABASE_PATH, AI_MODE или OPENAI_API_KEY как переменные процесса: они имеют приоритет и над .env.demo. Пустой ключ и AI_MODE=fallback в файле задают локальный анализ без OpenAI API. Перед запуском остановите другой сервер на порту 8000.

При активированном окружении: python -m data.seed_demo --database backend/runtime/demo-new.sqlite3. Запускать следует модулем из корня, не командой python data/seed_demo.py.

Если файл базы существует, --database откажет и сохранит его содержимое. Для повторной репетиции выберите новый путь, например backend/runtime/demo-rehearsal-2.sqlite3, укажите его в параметре --database и в DATABASE_PATH файла .env.demo, затем запустите сервер заново. Старую базу удалять не нужно. Уже работающий сервер не перечитывает настройки при изменении .env.demo.

Источники данных

ИсточникЧто используется
Ввод бизнесаИсходное описание, ответы на вопросы, содержимое карточки и ручные подтверждения
Ввод командыПрофиль, идея, план, срок и ссылка на прототип
Решение бизнесаСтатус отклика и подтверждение результата этапа
Синтетический набор5 описаний/карточек, 5 команд и 5 откликов для воспроизводимого показа
OpenAI PlatformОтвет на серверный запрос анализа в режиме auto при наличии ключа

Реальные выгрузки компаний, CRM, университетские базы и внешние каталоги команд не подключены. Контакты, ссылки и метрики в демонстрационном наборе условные. Упоминание технологий в профилях seed-команд не означает, что эти библиотеки используются приложением.

ДемозадачаБаллыУровень
Кафе — очереди в обед0Черновик
Магазин — аналитика возвратов40Рабочая
Склад — проверка комплектации70Готовая
Образование — запись на консультации90Приоритетная
Сервис — маршрутизация обращений100Приоритетная

При загрузке набора публикуются все пять задач. Один seed-отклик получает статус selected, четыре — pending; этапы заранее не создаются. Загрузчик проходит обычные правила подтверждения, расчёта и публикации, затем связывает сущности по фактическим ID.

Как используется AI

Внешний вызов выполняется только сервером: POST https://api.openai.com/v1/responses. Модель по умолчанию — gpt-4.1-mini.

  • Вход: description и answers. В режиме внешнего AI этот введённый текст передаётся OpenAI.
  • Выход провайдера: JSON с fields, questions и missingFields. Сервер добавляет mode и reason для интерфейса.
  • Промпт: требует минимум три разных уместных вопроса на русском, не выдумывать неизвестные контакты, сроки, метрики и источники; пользовательский текст рассматривается как данные.
  • Проверка: строгая JSON Schema, завершённость ответа, точные ключи и типы, все 12 полей, допустимые длины, минимум три непустых уникальных вопроса.
  • Параметры запроса: таймаут 15 секунд, max_output_tokens: 1600, store: false. Это настройки адаптера, а не гарантия достоверности содержания.
  • Резервный режим: AI_MODE=fallback, отсутствие ключа, ошибка сети, таймаут или некорректный ответ приводят к локальным вопросам с явным объяснением причины. Шаблонные вопросы не выдаются за результат внешней модели.

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

Настройки

backend/config.py читает переменные окружения и локальный .env из корня репозитория. Переменные процесса имеют приоритет над .env. Ключ используется серверным AI-адаптером. Локальный .env исключён правилами .gitignore и .dockerignore из обычного добавления в Git и контекста Docker-сборки.

ПеременнаяЗначение / назначение
AI_MODEauto по умолчанию; fallback явно запрещает внешний AI-вызов. Другие значения не принимаются
OPENAI_API_KEYКлюч OpenAI Platform, заданный локально; при отсутствии работает fallback
OPENAI_MODELgpt-4.1-mini по умолчанию
DATABASE_PATHПо умолчанию backend/runtime/app.sqlite3; Compose задаёт /app/backend/runtime/app.sqlite3
CORS_ORIGINSРазрешённые origin через запятую для отдельного frontend; в обычном запуске интерфейс и API имеют один адрес

Для настоящего AI установите AI_MODE=auto и укажите свой ключ в OPENAI_API_KEY в .env в корне проекта или в переменных окружения хостинга. В примере замените your_openai_api_key_here на свой ключ; не добавляйте реальный ключ в Git и не вставляйте его во frontend.

AI_MODE=auto
OPENAI_API_KEY=your_openai_api_key_here
OPENAI_MODEL=gpt-4.1-mini

После изменения настроек перезапустите сервер или перезапустите приложение на хостинге. Для Compose выполните docker compose up -d: ключ, модель и AI-режим передаются в контейнер при его создании. Другим участникам нужен собственный локальный .env или доступ к настроенному серверу: секретный файл через Git не передаётся.

Основные HTTP-маршруты

Точные схемы запросов и ответов доступны в Swagger UI и OpenAPI JSON после запуска.

Метод и путьНазначение
GET /api/healthДоступность сервера
POST /api/analyzeАнализ описания и ответов
GET /api/tasks, POST /api/tasksСписок рабочих задач и создание
GET /api/tasks/{id}, PATCH /api/tasks/{id}Чтение и изменение полей
POST /api/tasks/{id}/confirmПодтверждение выбранных полей
POST /api/tasks/{id}/publishПубликация отдельного снимка
GET /api/catalog?topic=кафе&readiness=draftКаталог с необязательными фильтрами
GET /api/teams, POST /api/teamsПрофили команд
POST /api/proposals, GET /api/tasks/{id}/proposalsСоздание и просмотр предложений
PATCH /api/proposals/{id}Ручной статус selected или rejected
POST /api/milestones, GET /api/tasks/{id}/milestonesСоздание и просмотр этапов
POST /api/milestones/{id}/confirmПодтверждение этапа; повтор возвращает awarded: false

Типовые ответы: 201 при создании, 200 при успешном чтении/изменении, 404 для отсутствующей сущности, 422 при неверном запросе, 409 при конфликте версии либо попытке начислить баллы невыбранной команде. expectedRevision обязателен для изменения, подтверждения и публикации задачи; берите его из последнего ответа сервера.

Проверки проекта

До выступления создайте отдельную демо-БД и откройте основной экран http://127.0.0.1:8000/. Проверьте пять баллов и режим AI. Общая навигация уже объединяет бизнес-сценарий и marketplace: используйте переключатель «Бизнес / Команда». Для выбора нескольких команд заранее добавьте ещё два отклика разных команд на исходную задачу кафе: seed уже содержит один отклик на неё. Подробный сценарий первых 90 секунд — в памятке участника 1.

Как запустить тесты

После установки Python-зависимостей выполните из корня проекта в отдельном PowerShell-терминале:

.\.venv\Scripts\python.exe -m unittest discover -s backend/tests/marketplace -p 'test_*.py' -v

После установки Python-зависимостей выполните из корня проекта в отдельном PowerShell-терминале:

$env:AI_MODE = 'auto'
.\.venv\Scripts\python.exe -m unittest discover -s backend/tests/core -p 'test_*.py' -v
.\.venv\Scripts\python.exe -m unittest discover -s backend/tests/marketplace -p 'test_*.py' -v

AI_MODE=auto нужен тестам ветки OpenAI: они подставляют ответы транспорта и не выполняют платные запросы. Тесты используют временные базы; настройка процесса не меняет режим уже работающего сервера. После проверки закройте этот тестовый терминал, чтобы его переменные не влияли на последующий запуск демо.

Выполненная проверкаРезультат
Core unittest20/20: рейтинг, подтверждения, версии, снимки, SQLite, API и AI с заглушками
Marketplace unittest6/6: каталог, решения, этапы, целостность seed-данных и входные данные
JS marketplace11/11 в тестовой DOM-среде: формы, фильтры, выбор команды, этапы и сообщения
Реальный Uvicorn, временная БД, свободный портHTTP smoke пройден: основной HTML, demo/static, docs, каталог/фильтр, отклик на низкий рейтинг, две выбранные команды/отказ, этап +10 один раз, пробельные тела 422
Перезапуск с той же БДРешения, этап и баллы сохранены; рейтинг задачи не изменился
Seed CLI5/5/5, баллы 0/40/70/90/100; отказ для существующего файла сохранил его байты
Браузерная приёмка 23.09.2026Пройдена в Edge: создание и подтверждение карточки, публикация и снимки, навигация, каталог, отклики, выбор команд, этапы, конфликты вкладок и потеря связи; подробный отчёт
Общий HTTP-клиент, 23.09.20268 проверок с подменой API пройдены; синтаксис оболочки и клиента проверен. В тот же проход повторно пройдены 20 backend-тестов
Реальный AIВ этом проходе не вызывался

Последний локальный автоматический прогон прошёл 20 core-, 6 marketplace- и 21 JavaScript-тест (10 подсказок рейтинга и 11 marketplace), всего 47/47. В нём также прошли проверки синтаксиса frontend/app.js, frontend/business/rating-guide.js, frontend/marketplace/marketplace.js и git diff --check. Реальный AI, браузерный сценарий, Docker, HTTP smoke, чистый запуск на другом компьютере и общая репетиция в этом прогоне не выполнялись; сохранённые результаты этих отдельных проверок относятся к датированным отчётам выше.

При наличии Node.js можно проверить JS-модуль и синтаксис:

node --test frontend/business/rating-guide.test.mjs
node --test frontend/marketplace/marketplace.test.mjs
node --check frontend/app.js
node --check frontend/shared/api.js
node --check frontend/marketplace/marketplace.js
node --check frontend/marketplace/demo.js

Что проверяют тесты в репозитории

НаборОбъявлено тестовПредмет проверкиИсходники
Core20Рейтинг, версии, подтверждения, публикации, SQLite, API и AI с подменой транспортаtest_core.py
Marketplace backend6Каталог, валидация запросов, целостность seed-сценария, ручные решения и однократные баллы за этапtest_marketplace.py, test_http.py
Подсказки рейтинга JavaScript10Выбор следующего шага, условия группы, подтверждения, несохранённые изменения и отсутствие мутацийrating-guide.test.mjs
Marketplace JavaScript11Формы, фильтры, выбор команды, этапы и сообщения; используются подставные DOM и fetchmarketplace.test.mjs
Всего47Число объявленных тестов, без отдельного подсчёта subTest

Количество объявленных тестов не означает, что все они проходят. JS-наборы проверяют отдельные модули и не заменяют проверку интерфейса в браузере.

Проверка улучшения рейтинга

При проверке этой доработки 23.09.2026 прошли 10/10 тестов подсказок рейтинга, проверки синтаксиса frontend/app.js и frontend/business/rating-guide.js, а также git diff --check. В Chrome на отдельной временной SQLite и с AI_MODE=fallback проверены переходы 85 → 100 после подтверждения и 100 → 80 после удаления данных и сохранения. Для группы из двух полей проверены поочерёдный фокус подтверждений, переход к кнопке сохранения без автоматического действия и отсутствие повторного сообщения о приросте. Блок помещается в экран шириной 390 px; у существующего индикатора этапов на этой ширине остаётся горизонтальное переполнение.

JS-набор marketplace теперь проходит 11/11: тестовая имитация браузера дополнена window.dispatchEvent, который требуется общему HTTP-клиенту для события доступности API. Утверждения тестов не ослаблялись. В том же локальном прогоне прошли 20/20 core- и 6/6 marketplace Python-тестов; это автоматическая проверка модулей, а не повторная браузерная приёмка.

Сохранённые отчёты

В отчёте участника 2 описан прогон от 23.09.2026 на ревизии 8e3eace: автоматические тесты, сценарии Chrome и Docker. Более поздние отметки участников находятся в плане разработки. Указанные там результаты относятся к описанным проходам; для оценки текущей рабочей копии выполните команды и демонстрационный маршрут выше.

Ограничения MVP

ОграничениеЧто это означает
Нет регистрации и серверного разграничения ролей«Бизнес / Команда» переключает демонстрационные экраны. Все профили доступны для выбора; это не авторизация
AI и рейтинг требуют участия человекаМодель может ошибаться. Формула показывает полноту подтверждённого описания, а не качество идеи или доказанную пользу решения
Исходное описание существующей задачи не обновляетсяAPI изменяет поля карточки; при правке rawDescription интерфейс предупреждает, что исходный текст на сервере остаётся прежним
Этапы упрощеныЕсть описание/evidence и подтверждение. Нет полноценного трекера, независимой проверки результата и приёмки файлов
Нет чата, уведомлений, платежей и файлового хранилищаВзаимодействие представлено полями карточки и откликами; ссылка на прототип ведёт на внешний ресурс
Локальная конфигурация запускаОсновной клиент по умолчанию обращается к API на порту 8000. Для другого адреса нужен window.API_BASE; Compose публикует порт только на 127.0.0.1
Демоданные условныеCRM, внешние базы компаний и реальные каталоги студенческих команд не подключены
Проверки имеют ограниченный охватВ сохранённых отчётах не приведены результаты нагрузочного тестирования, проверки других браузеров и чистого запуска на компьютере другого участника; повторная визуальная проверка последних изменений отмечена как незавершённая

Текущая версия предназначена для демонстрации сценария хакатона. Публичное размещение потребует отдельно подготовить управление доступом, конфигурацию сервера и эксплуатацию данных.

Развёрнутая версия

Публичный URL в репозитории не указан. Для оценки используйте локальный запуск по инструкции выше. Адрес http://127.0.0.1:8000/ доступен на компьютере, где запущен проект.

Звёзды
⭐ 1
Форки
0
Язык
JavaScript
Последний push
в прошлом месяце
Коммиты
39
Авторы
3
Файлы
56
Ветки
1

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

Rezeks 19Nazar Baktykereiuly 13tilg4051-source 7

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

  • 2026-09-23 17:51Update README.mdRezeks
  • 2026-09-23 17:35Merge branch 'main' of https://github.com/BAITC-Hacks/hack-4d63cc53-teamRezeks
  • 2026-09-23 17:35Добавление macos/linuxRezeks
  • 2026-09-23 17:28доработка исправленияtilg4051-source
  • 2026-09-23 17:21Финалный проверкаNazar Baktykereiuly
  • 2026-09-23 17:152hRezeks
  • 2026-09-23 16:58бRezeks
  • 2026-09-23 16:49бRezeks
Все коммиты (39)
  • 2026-09-23 16:48финалныйNazar Baktykereiuly
  • 2026-09-23 16:31Merge branch 'main' of https://github.com/BAITC-Hacks/hack-4d63cc53-teamNazar Baktykereiuly
  • 2026-09-23 16:29технический прогон интерфейсаNazar Baktykereiuly
  • 2026-09-23 16:28Update README.mdRezeks
  • 2026-09-23 16:023,6tilg4051-source
  • 2026-09-23 15:57тестыRezeks
  • 2026-09-23 15:44Merge branch 'main' of https://github.com/BAITC-Hacks/hack-4d63cc53-teamNazar Baktykereiuly
  • 2026-09-23 15:44frontend:Исправил найденные ошибки:Nazar Baktykereiuly
  • 2026-09-23 15:27Merge branch 'main' of https://github.com/BAITC-Hacks/hack-4d63cc53-teamtilg4051-source
  • 2026-09-23 15:27Update DEVELOPMENT_PLAN.mdtilg4051-source
  • 2026-09-23 15:26frontened:Подключить экраны marketplace к навигацииNazar Baktykereiuly
  • 2026-09-23 15:203,4tilg4051-source
  • 2026-09-23 14:59Update README.mdRezeks
  • 2026-09-23 14:58Merge branch 'main' of https://github.com/BAITC-Hacks/hack-4d63cc53-teamRezeks
  • 2026-09-23 14:58добавил докер файл для образаRezeks
  • 2026-09-23 14:58Настроил режим через локальныйNazar Baktykereiuly
  • 2026-09-23 14:47запуск окруженияRezeks
  • 2026-09-23 14:34Update DEVELOPMENT_PLAN.mdRezeks
  • 2026-09-23 14:18Update README.mdRezeks
  • 2026-09-23 14:14обновление ядраRezeks
  • 2026-09-23 14:13frontend:Изменения: [app.js](C:/Users/nazar/OneDrive/Документы/GitHub/hack-4d63cc53-team/frontend/app.js), [index.html](C:/Users/nazar/OneDrive/Документы/GitHub/hack-4d63cc53-team/frontend/index.html)Nazar Baktykereiuly
  • 2026-09-23 14:02Merge branch 'main' of https://github.com/BAITC-Hacks/hack-4d63cc53-teamNazar Baktykereiuly
  • 2026-09-23 14:02frontened:интерфейс бизнеса участникаNazar Baktykereiuly
  • 2026-09-23 14:00Merge branch 'main' of https://github.com/BAITC-Hacks/hack-4d63cc53-teamtilg4051-source
  • 2026-09-23 14:00добавлениеtilg4051-source
  • 2026-09-23 13:51обновление правил и добавление тестовRezeks
  • 2026-09-23 13:47чисткаRezeks
  • 2026-09-23 13:43Merge branch 'main' of https://github.com/BAITC-Hacks/hack-4d63cc53-teamNazar Baktykereiuly
  • 2026-09-23 13:43Добавить UI для создания задач бизнесаNazar Baktykereiuly
  • 2026-09-23 13:43разделениеRezeks
  • 2026-09-23 13:19development plan to startRezeks
Структура репозитория (56 файлов)
.dockerignore
.env.example
.gitattributes
.gitignore
AGENTS.md
DEVELOPMENT_PLAN.md
Dockerfile
README.md
backend/AGENTS.md
backend/__init__.py
backend/ai.py
backend/app.py
backend/config.py
backend/db.py
backend/launch.py
backend/marketplace/AGENTS.md
backend/marketplace/__init__.py
backend/marketplace/repository.py
backend/marketplace/router.py
backend/marketplace/schemas.py
backend/requirements.txt
backend/schemas.py
backend/scoring.py
backend/tasks.py
backend/tests/core/AGENTS.md
backend/tests/core/test_core.py
backend/tests/core/test_launch.py
backend/tests/marketplace/AGENTS.md
backend/tests/marketplace/test_http.py
backend/tests/marketplace/test_marketplace.py
compose.yaml
data/AGENTS.md
data/marketplace-seed.json
data/seed_demo.py
docs/PARTICIPANT_2.md
frontend/AGENTS.md
frontend/app.js
frontend/business/ACCEPTANCE.md
frontend/business/AGENTS.md
frontend/business/DEMO.md
frontend/business/REQUIREMENTS.md
frontend/business/rating-guide.js
frontend/business/rating-guide.test.mjs
frontend/business/text-quality.js
frontend/index.html
frontend/marketplace/AGENTS.md
frontend/marketplace/demo.html
frontend/marketplace/demo.js
frontend/marketplace/marketplace.css
frontend/marketplace/marketplace.js
frontend/marketplace/marketplace.test.mjs
frontend/shared/AGENTS.md
frontend/shared/api.js
frontend/styles.css
start.bat
start.sh

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

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

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