AAYMA
RU
Войти

Lovelab

Challenge Hub: бизнес описывает проблему, LLM задаёт 3–5 уточняющих вопросов, из ответов собирается редактируемая карточка с прозрачным рейтингом…

Доведённый продукт
Команда «Трек мияги i got love» 17💬 0 комментариевс 23 сентября 2026 г.

О проекте

Команда: Трек мияги i got love
Кейс HackAlem.ai: Образование — AI Sana
Стадия: Доведённый продукт

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

Суть

Challenge Hub: бизнес описывает проблему, LLM задаёт 3–5 уточняющих вопросов, из ответов собирается редактируемая карточка с прозрачным рейтингом 0–100. Задача публикуется в каталоге, команды откликаются, бизнес вручную выбирает команду и подтверждает этапы (+10 баллов).

Как устроено

Описание → LLM-провайдер через QUESTION_PROMPT возвращает JSON с 3–5 вопросами по разным полям, при ошибке или отсутствии ключа используются локальные вопросы → карточка собирается дословно из ответов, неизвестные поля остаются пустыми → детерминированный рейтинг по весам полей (контекст 20, данные 20, результат 15, критерии 15, ограничения 10, пользователи 10, связь 10) начисляется только после подтверждения → каталог с фильтрами → отклики → ручной выбор → баллы команде. Хранение в SQLite, FastAPI и React в одном порту.

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

  • генерация уточняющих вопросов LLM
  • валидация JSON-ответа
  • детерминированный взвешенный рейтинг
  • локальный fallback

Особенности

Рейтинг и баллы разведены: рейтинг задачи отражает полноту подтверждённого описания, баллы команды отражают фактический прогресс. AI не выставляет оценок и не придумывает поля, только задаёт вопросы. Есть CI и e2e-тест полного сценария на Playwright.

Стек

React 19 · TypeScript · Vite · FastAPI · Python · SQLite · Playwright · GitHub Actions


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

README

README.md

lovelab — От бизнес-задачи к командному результату

Проверки проекта React 19 TypeScript strict FastAPI SQLite

Бизнес формулирует задачу. Команды предлагают решения. Результат подтверждает человек.

Запустить · Возможности · Сценарий демо · Архитектура · Проверки

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

Проект создан для кейса AI Sana / HackAlem. Сквозной сценарий работает в приложении: от первого описания до отклика, ручного выбора команды и начисления баллов.

Как это работает

flowchart LR
    A[Описание потребности] --> B[3–5 уточняющих вопросов]
    B --> C[Редактируемая карточка]
    C --> D[Подтверждение бизнеса]
    D --> E[Рейтинг 0–100]
    E --> F[Открытый каталог]
    F --> G[Предложения команд]
    G --> H[Ручной выбор бизнеса]
    H --> I[Подтверждённый этап · +10]
Для бизнесаДля команды
Описать проблему своими словами и получить вопросыНайти задачу по теме, уровню и поисковому запросу
Сохранить черновик и вернуться к нему позжеПрочитать полную карточку и увидеть недостающие сведения
Увидеть разбивку рейтинга и дополнить карточкуПредложить идею, план, срок и ссылку на прототип
Сравнить отклики, выбрать несколько команд или отклонить предложенияПолучить 10 баллов после подтверждённого этапа
Уточнить опубликованную задачу с пересчётом рейтингаВидеть накопленные баллы в профиле команды

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

Интерфейс

Каталог с прозрачным рейтингом

Каталог задач: фильтры, уровни готовности и действия

Конструктор: карточка, подтверждение и расшифровка баллов

Конструктор задачи и подтверждённый рейтинг

Отклики: сравнение идей и ручной выбор команд

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

Скриншоты сняты с работающего приложения на синтетической базе. Интерфейс также доступен на узком экране; адрес выбранной задачи сохраняется в URL, а незавершённый ввод конструктора — в браузере.

Быстрый запуск

Нужны Node.js 22.12+ и Python 3.10+. Внешний AI-ключ необязателен: без него доступны локальные вопросы и весь демонстрационный сценарий. Для установки зависимостей нужен интернет.

macOS / Linux

git clone https://github.com/BAITC-Hacks/hack-6d4719b0-i-got-love.git
cd hack-6d4719b0-i-got-love

npm ci
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -r requirements.txt

npm run demo

Windows · PowerShell

git clone https://github.com/BAITC-Hacks/hack-6d4719b0-i-got-love.git
cd hack-6d4719b0-i-got-love

npm ci
py -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install -r requirements.txt

npm run demo

Если PowerShell блокирует активацию окружения, можно обойтись без неё:

.\.venv\Scripts\python.exe -m pip install -r requirements.txt
npm run build
.\.venv\Scripts\python.exe scripts/demo.py

Откройте http://127.0.0.1:8000. Команда собирает интерфейс, готовит демонстрационные данные и запускает интерфейс вместе с API на одном порту. Повторный запуск сохраняет задачи, решения и баллы. Остановка — Ctrl+C.

АдресЧто находится
/Приложение Lovelab
/#builderКонструктор и сохранённые задачи
/#proposals?task=7Пять демонстрационных откликов
/docsИнтерактивная документация FastAPI
/api/healthПроверка доступности API и базы

Для другого порта после сборки: python scripts/demo.py --port 8080.

Для проверки с устройств друзей в той же локальной сети:

python scripts/demo.py --host 0.0.0.0 --port 8000

На другом устройстве откройте http://<локальный-IP-вашего-компьютера>:8000. Компьютер с сервером должен оставаться включённым; адрес localhost на телефоне указывает на сам телефон.

Режим разработки

После установки зависимостей и активации .venv подготовьте данные:

python -m backend.seed
python -m backend.team_proposals

В первом терминале с активным Python-окружением:

npm run dev:api

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

npm run dev

Vite покажет адрес интерфейса и перенаправит /api на 127.0.0.1:8000. Работайте из корня репозитория — он объединяет все модули. pnpm также поддерживается: замените npm ci на pnpm install --frozen-lockfile, остальные команды — на pnpm run ….

Демо за пять минут

ВремяДействиеЧто показать
0:00–0:40Конструктор → «Новая задача». Ввести: «Менеджеры долго отвечают на обращения клиентов»Исходная потребность без придуманных деталей
0:40–1:30Получить вопросы, ответить, создать черновик и указать названиеНе менее трёх вопросов; ответы переносятся дословно
1:30–2:15Сохранить, подтвердить карточку, открыть разбивку рейтингаБаллы начисляются за подтверждённые поля; виден список пробелов
2:15–2:45Опубликовать и перейти в каталогЗадача доступна, включая низкий рейтинг; работают фильтры
2:45–3:40Откликнуться: команда, идея, план, срок и ссылкаРеальное предложение сохраняется в базе
3:40–4:20Выбрать команду и подтвердить этапКоманда получает +10; после обновления баллы сохраняются
4:20–5:00Отредактировать опубликованную задачу и подтвердить дополнениеРейтинг меняется, задача и отклики остаются доступны

Для быстрого заполнения можно взять ответы:

ПолеПример
ПотребностьСократить время первого ответа
ПользователиОператоры поддержки
РезультатПрототип распределения обращений по темам
Критерии успехаПервый ответ в течение 10 минут
ДанныеОбезличенная история обращений
НазваниеБыстрая поддержка

Вместе с исходным контекстом эти поля дают 80 / 100 после подтверждения. Добавьте ограничения — получите 90 / 100. Контакт и формат взаимодействия доведут карточку до 100 / 100.

Чтобы сразу сравнить пять предложений, выберите в «Откликах» задачу Shorten support replies (#7). Можно выбрать несколько команд, отклонить одну или оставить все решения на рассмотрении. Ссылки example.com в исходных предложениях — демонстрационные.

Рейтинг: за что начисляются баллы

Формула находится в backend/rating.py. В MVP непустое поле после удаления пробелов получает свой вес. Оценка полноты детерминирована: AI не выставляет баллы и не оценивает достоверность обещаний бизнеса.

КритерийМаксимумНачисление
Контекст и потребность20По 10 за каждое поле
Данные и материалы20Доступные данные, примеры или источники
Ожидаемый результат15Что команда должна подготовить
Критерии успеха15По чему бизнес примет результат
Ограничения10Сроки, технологии, доступы и другие границы
Пользователи10Для кого создаётся решение
Связь с бизнесом10Контакт — 5, формат взаимодействия — 5
Итого100Только подтверждённые сведения
0–3940–6970–8990–100
ЧерновикРабочаяГотоваяПриоритетная

Уровень «Черновик» — характеристика полноты, а статус draft — состояние публикации. Опубликованная задача может иметь уровень «Черновик» и оставаться доступной всем командам.

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

AI: вопросы без выдуманных фактов

Сервер отправляет провайдеру только введённое описание и системный промпт. Ответ должен содержать 3–5 вопросов по различным полям. Карточка собирается из исходного контекста и ответов пользователя; неизвестные сведения остаются пустыми.

{
  "questions": [
    { "field": "need", "text": "Какую потребность бизнеса нужно закрыть?" },
    { "field": "users", "text": "Кто будет пользоваться результатом?" },
    { "field": "success_criteria", "text": "Как вы измерите успех?" }
  ]
}

Полный промпт QUESTION_PROMPT, формат запроса и проверка ответа доступны в task_builder/server.py. Ввод API: POST /api/task-builder/questions с телом {"description":"…"}. Ответ включает questions, source (external или local) и warning.

При отсутствии настроек, таймауте, сетевой ошибке, некорректном JSON или неправильных полях сервер возвращает пять локальных вопросов. Интерфейс явно сообщает о переходе к локальным вопросам; сценарий продолжается.

Для внешнего провайдера задайте переменные в окружении сервера:

ПеременнаяНазначение
AI_API_URLПолный URL endpoint с форматом Chat Completions
AI_API_KEYСекретный ключ провайдера
AI_MODELНазвание доступной модели
APP_DB_PATHНеобязательный путь к SQLite; по умолчанию backend/app.db

См. .env.example. Файл .env не загружается автоматически: экспортируйте значения в оболочке или передайте процессу сервера. Не используйте префикс VITE_ для секретов. Реальный AI-вызов требует вашего провайдера; автоматические проверки используют локальный fallback.

Архитектура

flowchart TB
    UI[React + TypeScript · общая навигация]
    UI --> Builder[Конструктор]
    UI --> Catalog[Каталог]
    UI --> Teams[Команды и отклики]
    Builder --> API[FastAPI · backend.integration]
    Catalog --> API
    Teams --> API
    API --> Rating[Детерминированный рейтинг]
    API --> DB[(SQLite)]
    API --> AI[Серверный AI endpoint]
    AI -. ошибка или нет ключа .-> Local[Локальные вопросы]
src/                           Общая оболочка, команды и отклики
frontend/src/                  Каталог, фильтры и полные карточки
task_builder/frontend/src/     Конструктор и восстановление ввода
task_builder/server.py         Черновики, подтверждение, публикация, AI
backend/
  integration.py               Единый API, health и раздача сборки
  db.py · schema.sql           Хранилище и схема SQLite
  rating.py · main.py          Рейтинг и API каталога
  team_proposals.py            Команды, решения и начисление баллов
  seed.py                      Синтетические задачи
scripts/                       Запуск демо и изолированного тестового API
tests/                         Браузерные сценарии Playwright
docs/                          Обложка и реальные скриншоты

Task хранит описание, статус и подтверждение; Proposal связывает задачу и команду; Team хранит профиль и накопленные баллы. Ограничения внешних ключей включены. Подтверждение этапа и изменение баллов выполняются в одной SQLite-транзакции с блокировкой записи: повторные и одновременные запросы не удваивают награду.

Основные маршруты, тела запросов и ответы описаны в API_CONTRACT.md; живую OpenAPI-схему можно открыть на /docs.

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

Свежая демонстрационная база содержит 5 черновиков, 5 опубликованных задач, 5 команд и 5 откликов. Рейтинги начальных карточек: 0, 30, 50, 75, 100. Данные синтетические; подготовка не перезаписывает существующие таблицы с данными.

Это общее демо-пространство: регистрации и разграничения прав нет, действия бизнеса и команд доступны в одном интерфейсе. Для публичного многопользовательского развёртывания нужна отдельная авторизация. Чат, уведомления, файловое хранилище и автоматическое назначение команд не входят в кейс.

У выбранного отклика один подтверждаемый этап. Принятое решение нельзя поменять на другое; подтверждённые баллы нельзя отозвать через интерфейс. Текущие правки конструктора сохраняются в localStorage этого браузера, а сохранённые карточки и отклики — в SQLite.

Для новой демонстрации используйте новый путь APP_DB_PATH, сохранив текущую базу:

# macOS / Linux, при активном .venv
APP_DB_PATH=backend/fresh-demo.db python scripts/demo.py
# Windows PowerShell, при активном .venv
$env:APP_DB_PATH = "backend/fresh-demo.db"
python scripts/demo.py

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

Проверки

# Активируйте .venv перед Python-командами
python -m pip install -r requirements-dev.txt
python -m unittest discover -v
npm run build

# Реальный браузер + API + отдельная временная база
npx playwright install chromium
npm run test:e2e

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

Тесты используют временные базы и не изменяют backend/app.db. GitHub Actions повторяет Python-проверки, сборку и браузерные сценарии на каждом push и pull request. Для обновления скриншотов в macOS/Linux: CAPTURE_DOCS=1 npm run test:e2e.

Если что-то не запустилось
СимптомЧто проверить
No module named fastapi / uvicornАктивирован ли .venv, выполнена ли установка Python-зависимостей
python: command not foundСоздайте окружение через python3, затем активируйте .venv
Главная страница возвращает 503Выполните npm run build, затем перезапустите API, либо используйте npm run demo
Порт 8000 занятЗапустите python scripts/demo.py --port 8080
Пустые команды или каталог в режиме разработкиВыполните обе команды подготовки: backend.seed и backend.team_proposals
Конструктор сохраняет в другую базуУберите старую переменную TASK_BUILDER_DB_PATH; для общего приложения используйте только APP_DB_PATH
Показаны локальные вопросыНормальный режим без AI-ключа; для внешнего AI проверьте три серверные переменные
Playwright не находит браузерВыполните npx playwright install chromium

Команда и история интеграции

УчастникОбластьИсходный PR
Zhanb6Конструктор задач и AI#2
defjavadevСхема данных, рейтинг и каталог#1
aldaiq1234Команды, отклики и ручное решение бизнеса#3

Исходные PR объединены с сохранением авторских коммитов. Договорённости и критерии готовности — в TEAM_PLAN.md.

Звёзды
⭐ 0
Форки
0
Язык
TypeScript
Последний push
в прошлом месяце
Коммиты
24
Авторы
4
Файлы
63
Ветки
5

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

Zhanb6 9aldaiq1234 6Zhanibek 5defjavadev 4

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

  • 2026-09-23 18:00Add educational briefs backed by verified open dataZhanb6
  • 2026-09-23 17:58Add accounts, guided onboarding, and validated task ratingsZhanb6
  • 2026-09-23 17:29Polish Russian interface and connect local question generationZhanb6
  • 2026-09-23 16:59Merge pull request #4 from BAITC-Hacks/feat/complete-lovelab-demoZhanibek
  • 2026-09-23 16:57Complete Lovelab demo workflow and project documentationZhanb6
  • 2026-09-23 16:25Merge pull request #3 from BAITC-Hacks/feat/team-proposalsZhanibek
  • 2026-09-23 16:25Merge pull request #2 from BAITC-Hacks/feat/task-builder-aiZhanibek
  • 2026-09-23 16:23Merge pull request #1 from BAITC-Hacks/feat/catalog-ratingZhanibek
Все коммиты (24)
  • 2026-09-23 16:05Integrate builder, catalog, and team proposal APIaldaiq1234
  • 2026-09-23 15:47Merge remote-tracking branch 'origin/feat/task-builder-ai' into feat/team-proposalsaldaiq1234
  • 2026-09-23 15:47Merge remote-tracking branch 'origin/feat/catalog-rating' into feat/team-proposalsaldaiq1234
  • 2026-09-23 15:40refactor: align proposal ids with shared schemaaldaiq1234
  • 2026-09-23 15:39Export builder screen for shared navigationZhanb6
  • 2026-09-23 15:38Merge latest main into catalog branchdefjavadev
  • 2026-09-23 15:38Scope catalog styles for shared app integrationdefjavadev
  • 2026-09-23 15:30feat: add team proposal decision flowaldaiq1234
  • 2026-09-23 15:24Connect task confirmation to shared ratingZhanb6
  • 2026-09-23 15:16feat: scaffold team proposal interfacealdaiq1234
  • 2026-09-23 15:14Define team progress awardZhanb6
  • 2026-09-23 15:13Prepare task builder for shared databaseZhanb6
  • 2026-09-23 15:04Implement task rating and published catalogdefjavadev
  • 2026-09-23 14:55Build task creation and confirmation flowZhanb6
  • 2026-09-23 14:43Add shared SQLite schema and catalog API contractdefjavadev
  • 2026-09-23 14:20Add team implementation planZhanibek
Структура репозитория (63 файлов)
.env.example
.github/workflows/ci.yml
.gitignore
API_CONTRACT.md
README.md
TEAM_PLAN.md
backend/__init__.py
backend/db.py
backend/integration.py
backend/main.py
backend/rating.py
backend/schema.sql
backend/seed.py
backend/team_proposals.py
backend/test_catalog.py
backend/test_integration.py
backend/test_team_proposals.py
docs/banner.svg
docs/screenshots/builder.png
docs/screenshots/catalog.png
docs/screenshots/proposals.png
frontend/index.html
frontend/package-lock.json
frontend/package.json
frontend/src/Catalog.tsx
frontend/src/main.tsx
frontend/src/styles.css
frontend/tsconfig.json
frontend/vite.config.ts
index.html
package-lock.json
package.json
playwright.config.ts
pnpm-lock.yaml
requirements-dev.txt
requirements.txt
scripts/demo.py
scripts/test_server.py
src/App.tsx
src/data/teamProposals.ts
src/main.tsx
src/screens/BuilderScreen.tsx
src/screens/CatalogScreen.tsx
src/screens/ProposalsScreen.tsx
src/screens/TeamsScreen.tsx
src/styles.css
task_builder/.gitignore
task_builder/README.md
task_builder/__init__.py
task_builder/frontend/index.html
task_builder/frontend/package-lock.json
task_builder/frontend/package.json
task_builder/frontend/src/TaskBuilder.tsx
task_builder/frontend/src/main.tsx
task_builder/frontend/src/style.css
task_builder/frontend/tsconfig.json
task_builder/frontend/vite.config.ts
task_builder/requirements.txt
task_builder/server.py
task_builder/test_server.py
tests/workflow.spec.ts
tsconfig.json
vite.config.ts
Ветки (5)

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

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

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