Lovelab
Challenge Hub: бизнес описывает проблему, LLM задаёт 3–5 уточняющих вопросов, из ответов собирается редактируемая карточка с прозрачным рейтингом…
О проекте
Команда: Трек мияги 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 превращает короткое описание бизнес-проблемы в задачу, с которой студенческая команда может начать работу. Уточняющие вопросы помогают заполнить карточку, прозрачный рейтинг показывает её готовность, а открытый каталог соединяет бизнес и команды.
Проект создан для кейса 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–39 | 40–69 | 70–89 | 90–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.
Авторы коммитов
История коммитов
- 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
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.