Tubi
Платформа, где бизнес с помощью AI-уточняющих вопросов превращает описание задачи в карточку с рейтингом готовности 0–100 и публикует её.
О проекте
Команда: 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.mdTubi — задачи бизнеса и студенческие команды
Рабочий каркас для 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 без ключа не проверяется.
Архитектура и разделение команды
| Владелец | Папки | Ответственность |
|---|---|---|
| Участник 1 | web/src/features/business/, web/src/shared/, web/src/App.tsx, настройки frontend | Конструктор, общий интерфейс и подключение экранов |
| Участник 2 | web/src/features/marketplace/ | Каталог, карточка, отклики и решение бизнеса |
| Участник 3 — backend | server/, contracts/, README | API, 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.
Формула рейтинга
| Категория | Вес | Проверка |
|---|---|---|
| Контекст и потребность | 20 | 10 за context, 10 за need |
| Данные | 20 | data |
| Результат | 15 | expected_result |
| Критерии успеха | 15 | success_criteria |
| Ограничения | 10 | constraints |
| Пользователи | 10 | users |
| Связь с бизнесом | 10 | 5 за 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 минут
- Каталог: покажите разные уровни готовности и фильтры.
- В роли «Бизнес» нажмите «Создать задачу», затем «Попробовать пример».
- Ответьте на три вопроса, соберите карточку; покажите текущие баллы.
- Добавьте пользователей, измеримый критерий успеха и контакт; покажите рост рейтинга.
- Подтвердите сведения и опубликуйте задачу.
- Переключитесь в «Команда», найдите задачу и отправьте предложение.
- Вернитесь в «Бизнес», откройте отклики и вручную выберите команду.
- При наличии времени покажите подтверждение выполненного этапа.
Ограничения каркаса
Это локальная демонстрация: переключатель ролей не является авторизацией, данные бизнеса общие. Нужны настоящая аутентификация и проверки владельца перед использованием реальных данных или публичным размещением. Сервер по умолчанию слушает только 127.0.0.1. Чат, регистрация и проектный трекер не входят в MVP. Шрифт Manrope загружается из Google Fonts; без сети используется системный шрифт.
Авторы коммитов
История коммитов
- 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
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.