AAYMA
RU
Войти

Tubi

Платформа, где бизнес с помощью AI-уточняющих вопросов превращает описание задачи в карточку с рейтингом готовности 0–100 и публикует её.

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

О проекте

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

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

Суть

Платформа, где бизнес с помощью AI-уточняющих вопросов превращает описание задачи в карточку с рейтингом готовности 0–100 и публикует её. Студенческие команды откликаются, бизнес выбирает команду вручную и начисляет баллы за этапы.

Как устроено

Бизнес вводит описание, сервер генерирует минимум 3 вопроса по незаполненным полям. Через OpenAI Responses API с Pydantic Structured Outputs собирается редактируемая карточка; неизвестные поля остаются null. Рейтинг считается прозрачной формулой полноты полей (контекст, данные, результат, критерии и т. д. с весами), AI баллы не начисляет. Всё хранится в SQLite, без ключа работает шаблонный деморежим.

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

  • OpenAI Responses Structured Outputs
  • Pydantic schemas
  • rule-based readiness scoring
  • template fallback
  • SQLite

Особенности

Контракт API (openapi.json, types.ts, fixtures) определён заранее, поэтому трое участников работали параллельно на заглушках. Рейтинг детерминированный, человек подтверждает карточку перед публикацией.

Стек

Python · FastAPI · Uvicorn · SQLite · React · TypeScript · Vite · Vitest

Модели

gpt-4o-mini


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

README

README.md

Tubi — задачи бизнеса и студенческие команды

Рабочий каркас для 5-часового AI-хакатона. Бизнес уточняет задачу, подтверждает карточку и публикует её. Студенты сами отправляют предложения; бизнес вручную выбирает команду.

Что уже работает

  • Конструктор: описание → минимум 3 вопроса → ответы → редактируемая карточка.
  • Рейтинг 0–100 с разбивкой, подсказками и пересчётом после редактирования.
  • Подтверждение человеком, сохранение черновика, публикация и повторное редактирование.
  • Каталог, поиск, фильтры, сортировка; низкий рейтинг не скрывает задачу.
  • Пять демонстрационных команд, отправка откликов и ручной выбор бизнеса.
  • Подтверждение выполненного этапа: 50 баллов выбранной команде, без повторного начисления.
  • SQLite сохраняет данные после перезапуска. При первом запуске создаются 5 карточек и 5 откликов; в seed-файле также есть 5 слабых описаний.

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

Нужны Node.js 22.12+ и Python 3.11+. Репозиторий содержит package-lock.json; для frontend используйте npm ci.

Windows PowerShell

Из папки проекта запустите ./start.ps1. Скрипт устанавливает зависимости, собирает frontend и запускает приложение на http://127.0.0.1:8000. Остановить сервер: Ctrl+C.

Если политика PowerShell запрещает скрипт, используйте команды вручную (менять системную политику не требуется):

py -3 -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r server/requirements.txt
cd web
npm ci
npm run build
cd ..
.\.venv\Scripts\python.exe -m uvicorn app.main:app --app-dir server --host 127.0.0.1 --port 8000

macOS / Linux

python3 -m venv .venv
.venv/bin/python -m pip install -r server/requirements.txt
cd web
npm ci
npm run build
cd ..
.venv/bin/python -m uvicorn app.main:app --app-dir server --host 127.0.0.1 --port 8000

Разработка двумя терминалами

Backend: команда uvicorn выше, при разработке добавьте --reload. Frontend: cd web → npm run dev → http://127.0.0.1:5173. Vite перенаправляет /api на порт 8000. После изменения production frontend нужен новый npm run build и перезагрузка страницы. API-документация: http://127.0.0.1:8000/docs. Проверка состояния: /api/health.

OpenAI и деморежим

Скопируйте server/.env.example в server/.env, задайте OPENAI_API_KEY и при необходимости OPENAI_MODEL, затем перезапустите backend. По умолчанию указана gpt-4o-mini; модель должна быть доступна вашему API-проекту и поддерживать Structured Outputs. API использует отдельный ключ и биллинг.

Без ключа приложение полностью проходит демонстрационный сценарий на локальных шаблонах: вопросы выбираются по незаполненным полям, ответы переносятся в карточку. Интерфейс явно показывает деморежим. Это заглушка, а не работающая генерация OpenAI.

С ключом сервер использует Responses API и Pydantic для структурированного результата. Инструкция запрещает выдумывать факты; неизвестные сведения остаются null. Формат проверяется, но смысл всё равно подтверждает человек. При отказе, ошибке, таймауте или неправильном формате включается обозначенный fallback. Таймаут — 20 секунд; автоматические повторы API отключены. Ключ и сырые ответы провайдера не выводятся в логи. Живой API без ключа не проверяется.

Архитектура и разделение команды

ВладелецПапкиОтветственность
Участник 1web/src/features/business/, web/src/shared/, web/src/App.tsx, настройки frontendКонструктор, общий интерфейс и подключение экранов
Участник 2web/src/features/marketplace/Каталог, карточка, отклики и решение бизнеса
Участник 3 — backendserver/, contracts/, READMEAPI, SQLite, AI, рейтинг и контракт

contracts/api.md — договор, contracts/types.ts — типы frontend, contracts/fixtures.json — примеры для независимой работы. Все экранные запросы находятся в api.ts своего модуля. Главный интерфейс использует настоящий локальный backend. Для работы на заглушках импортируйте примеры из fixtures в адаптер своего модуля. Общие зависимости и контракт изменяйте согласованно.

Backend: schemas.py — входные модели, rating.py — формула, ai.py — AI и fallback, db.py — SQLite, main.py — маршруты и раздача собранного сайта. База по умолчанию: server/data/tubi.sqlite3; путь можно изменить через TUBI_DB_PATH.

Формула рейтинга

КатегорияВесПроверка
Контекст и потребность2010 за context, 10 за need
Данные20data
Результат15expected_result
Критерии успеха15success_criteria
Ограничения10constraints
Пользователи10users
Связь с бизнесом105 за contact, 5 за interaction_format

Засчитывается текст длиной от 3 символов, содержащий буквы/цифры. Пустые значения и явно заданные заглушки («не знаю», «не указано», «тест» и др.) дают 0. Это прозрачная проверка полноты MVP, а не семантическая экспертиза качества. Перечень правил находится в rating.py. AI баллы не начисляет.

0–39 — нужно уточнение; 40–69 — рабочая; 70–89 — готова; 90–100 — приоритетная. Черновик публикации скрыт до подтверждения, но опубликованная задача с любым рейтингом видна и принимает отклики. При сохранении изменённых сведений сервер заново считает рейтинг. Выбор команды не зависит от рейтинга и не автоматизируется.

Проверки

.\.venv\Scripts\python.exe -m pip install -r server/requirements-dev.txt
$env:PYTHONPATH='server'
.\.venv\Scripts\python.exe -m unittest discover -s server/tests -v
cd web
npm run build

На macOS/Linux: PYTHONPATH=server .venv/bin/python -m unittest discover -s server/tests -v. API-проверки используют временную БД, не меняют демонстрационные данные и не вызывают OpenAI. Они проверяют полный сценарий, видимость задач с низким рейтингом, пересчёт, валидацию URL, независимость решений по откликам и защиту от повторного начисления баллов.

Перегенерация примеров и OpenAPI: python scripts/export_contracts.py из корня с активным окружением проекта.

Демонстрация за 5 минут

  1. Каталог: покажите разные уровни готовности и фильтры.
  2. В роли «Бизнес» нажмите «Создать задачу», затем «Попробовать пример».
  3. Ответьте на три вопроса, соберите карточку; покажите текущие баллы.
  4. Добавьте пользователей, измеримый критерий успеха и контакт; покажите рост рейтинга.
  5. Подтвердите сведения и опубликуйте задачу.
  6. Переключитесь в «Команда», найдите задачу и отправьте предложение.
  7. Вернитесь в «Бизнес», откройте отклики и вручную выберите команду.
  8. При наличии времени покажите подтверждение выполненного этапа.

Ограничения каркаса

Это локальная демонстрация: переключатель ролей не является авторизацией, данные бизнеса общие. Нужны настоящая аутентификация и проверки владельца перед использованием реальных данных или публичным размещением. Сервер по умолчанию слушает только 127.0.0.1. Чат, регистрация и проектный трекер не входят в MVP. Шрифт Manrope загружается из Google Fonts; без сети используется системный шрифт.

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

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

Temirlan Konysbay 10lazitab 10BulagenZ 2

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

  • 2026-09-23 17:58Add prominent jury instructions for the final submission branchTemirlan Konysbay
  • 2026-09-23 17:53Polish warm bilingual marketplace and harden frontend navigationTemirlan Konysbay
  • 2026-09-23 17:48Update README.mdTemirlan Konysbay
  • 2026-09-23 17:40Add team reviews after confirmed workTemirlan Konysbay
  • 2026-09-23 17:34Document hackathon deliverables, installation, data and limitationsTemirlan Konysbay
  • 2026-09-23 17:29Complete business UI flow and integrate verified backendTemirlan Konysbay
  • 2026-09-23 17:03Prepare jury README and fix backend demo reliabilityTemirlan Konysbay
  • 2026-09-23 16:52Update README.mdBulagenZ
Все коммиты (22)
  • 2026-09-23 16:51Integrate localized business UI and simplify application shelllazitab
  • 2026-09-23 16:50Build guided business task flow with confirmation and rating feedbacklazitab
  • 2026-09-23 16:50Apply warm shared styles and localized HTTP requestslazitab
  • 2026-09-23 16:50Configure shared Vitest tools for frontend moduleslazitab
  • 2026-09-23 16:49Add shared React Testing Library setuplazitab
  • 2026-09-23 16:48Add Russian Kazakh and English business interface copylazitab
  • 2026-09-23 16:48Add shared locale store and language selectorlazitab
  • 2026-09-23 15:52Add new line with 'ддд' to READMElazitab
  • 2026-09-23 15:31Strengthen backend lifecycle, localized AI grounding and contractsTemirlan Konysbay
  • 2026-09-23 14:41Add working Tubi MVP with React, FastAPI and team scaffoldTemirlan Konysbay
  • 2026-09-23 14:38Add new line with 'sss' to README.mdlazitab
  • 2026-09-23 14:00Update README with additional contentlazitab
  • 2026-09-23 14:00Update README.mdBulagenZ
  • 2026-09-23 13:59Update README.mdTemirlan Konysbay
Структура репозитория (39 файлов)
.gitignore
AGENTS.md
README.md
contracts/api.md
contracts/fixtures.json
contracts/openapi.json
contracts/types.ts
scripts/export_contracts.py
server/.env.example
server/app/__init__.py
server/app/ai.py
server/app/db.py
server/app/main.py
server/app/rating.py
server/app/schemas.py
server/data/seed.json
server/requirements-dev.txt
server/requirements.txt
server/tests/test_flow.py
start.ps1
web/index.html
web/package-lock.json
web/package.json
web/public/favicon.svg
web/src/App.tsx
web/src/features/business/BusinessPage.tsx
web/src/features/business/RatingPanel.tsx
web/src/features/business/TaskEditor.tsx
web/src/features/business/api.ts
web/src/features/business/business.css
web/src/features/marketplace/Marketplace.tsx
web/src/features/marketplace/api.ts
web/src/features/marketplace/marketplace.css
web/src/main.tsx
web/src/shared/constants.ts
web/src/shared/http.ts
web/src/shared/styles.css
web/tsconfig.json
web/vite.config.ts
Ветки (3)

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

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

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