TaskUp
Веб-платформа, где бизнес описывает проблему свободным текстом, AI находит пробелы, задаёт уточняющие вопросы и собирает структурированную карточку…
О проекте
Команда: Meynya craft
Кейс HackAlem.ai: Образование — AI Sana
Стадия: Рабочий MVP
Задача кейса: Challenge Hub: превратить задачу бизнеса в задание для студенческих команд
Суть
Веб-платформа, где бизнес описывает проблему свободным текстом, AI находит пробелы, задаёт уточняющие вопросы и собирает структурированную карточку задачи. Студенческие команды откликаются из каталога, бизнес вручную принимает или отклоняет отклики.
Как устроено
Свободный текст уходит в /api/analyze (OpenAI Responses API), который возвращает пробелы и вопросы. Затем /api/card по тексту и ответам формирует TaskCard, ответ проверяется Zod. Score 0–100 по 7 категориям, уровни Draft/Working/Ready/Priority и подсказки считает детерминированный код без AI (calculateScore), и сумма подсказок равна 100 − score. Состояние хранится в клиентском Zustand, базы данных нет.
Ключевые решения
- OpenAI Responses API
- Zod structured output validation
- deterministic rubric scoring
- Zustand state
Особенности
AI отвечает только за текст (пробелы, вопросы, содержимое карточки), а рейтинг качества считается прозрачной формулой: у каждой подсказки видно, сколько баллов она добавит. Резервный OpenAI-ключ подключается, только когда у основного кончилась квота.
Стек
TypeScript · Next.js 16 · React 19 · Tailwind CSS 4 · shadcn/ui · Zustand · Zod · Framer Motion
Модели
OpenAI (модель через OPENAI_MODEL)
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-b2e7006f-meynya-craft.
README
README.mdTaskUp
TaskUp — платформа, которая помогает бизнесу превратить свободное описание проблемы в понятную задачу для студенческой команды.
Бизнесу часто сложно заранее сформулировать полноценное техническое задание: неизвестно, каких данных и ограничений не хватает, какой результат ожидать и как измерить успех. TaskUp использует AI, чтобы найти такие пробелы, задать уточняющие вопросы и собрать структурированную карточку. Студенты видят опубликованные задачи в общем каталоге, предлагают решение, а бизнес самостоятельно выбирает команду.
Проект предназначен для двух demo-ролей:
- Business — создаёт, улучшает, публикует задачи и рассматривает отклики;
- Student — выбирает опубликованную задачу и отправляет proposal от команды.
Что реализовано
- создание бизнес-задачи из свободного текста;
- AI-анализ недостающей информации;
- динамические уточняющие вопросы по найденным пробелам;
- генерация структурированной
TaskCard; - inline-редактирование всех полей карточки;
- детерминированный рейтинг качества от 0 до 100;
- уровни готовности
Draft,Working,Ready,Priority; - разбивка рейтинга по семи категориям;
- рекомендации, показывающие, сколько баллов и за какое улучшение можно получить;
- явная публикация карточки бизнесом;
- общий каталог опубликованных задач;
- сортировка каталога по score;
- фильтры по теме и уровню готовности;
- полная страница задачи для студента;
- отправка отклика с названием команды, идеей, планом, сроком и необязательной ссылкой;
- просмотр всех откликов бизнесом;
- ручные действия Принять и Отклонить;
- редактирование опубликованной задачи с автоматическим пересчётом score и уровня;
- demo-переключатель ролей Business / Student.
Для одной задачи можно принять только одну команду. После Accept задача получает статус in_progress, исчезает из каталога и больше не принимает отклики. Другие pending-отклики автоматически не отклоняются, но принять ещё одну команду нельзя.
XP и milestones в текущей версии не реализованы.
Как работает решение
Бизнес описывает проблему
↓
AI находит пробелы
↓
AI задаёт уточняющие вопросы
↓
AI формирует структурированную TaskCard
↓
Бизнес редактирует карточку
↓
Детерминированный код рассчитывает score, уровень и hints
↓
Бизнес подтверждает публикацию
↓
Задача появляется в каталоге
↓
Студенческая команда отправляет proposal
↓
Бизнес вручную выбирает Accept или Reject
↓
После Accept задача переходит в статус «В работе»
AI отвечает только за анализ текста, вопросы и содержимое карточки. Score, уровень, статусы, правила публикации, сортировка каталога и решения по откликам выполняются обычным кодом.
Основные маршруты
| Маршрут | Назначение |
|---|---|
/ | Главная страница и вход в сценарии Business / Student |
/create | Описание задачи, AI-анализ, вопросы, карточка и публикация |
/catalog | Каталог опубликованных задач с фильтрами |
/tasks/[id] | Карточка задачи, score и форма отклика команды |
/business | Все задачи бизнеса и количество ожидающих откликов |
/business/[id] | Редактирование, публикация и ручной Accept / Reject |
Технологии
- Next.js 16 и App Router;
- React 19;
- TypeScript;
- Tailwind CSS 4;
- shadcn/ui и Base UI для UI-компонентов;
- Zustand для клиентского состояния MVP;
- Zod для проверки запросов и структурированных AI-ответов;
- OpenAI JavaScript SDK и Responses API;
- Framer Motion для интерфейсных анимаций;
- Lucide React для иконок;
- ESLint для статического анализа.
Конкретная AI-модель в репозитории не зафиксирована. Сервер читает её идентификатор из переменной OPENAI_MODEL.
Архитектура
Frontend UI
↓ fetch
Next.js API Routes: /api/analyze и /api/card
↓
OpenAI Responses API
↓
Zod validation
↓
структурированный TaskCard
↓
Zustand Store
↓
calculateScore / Catalog / Proposals / Business actions
Основные части:
components/create-task/управляет flow Describe → Clarify → Review;app/api/analyzeпринимает исходный текст и возвращает пробелы с вопросами;app/api/cardпринимает текст и ответы, валидирует результат AI и возвращает карточку;lib/ai.tsсодержит AI-инструкции и Zod-схемы;lib/openai.tsсоздаёт серверный OpenAI-клиент и выполняет запрос через Responses API;lib/store.tsхранит задачи и реализует публикацию, редактирование и решения по откликам;lib/score.tsнезависимо от AI рассчитывает рейтинг, уровень и рекомендации;components/tasks/отображает каталог, карточки, score и Business / Student actions.
Состояние MVP хранится в памяти Zustand на клиенте. Серверной базы данных нет.
Установка и запуск
-
Клонируйте репозиторий и перейдите в его директорию.
git clone https://github.com/BAITC-Hacks/hack-b2e7006f-meynya-craft.git cd hack-b2e7006f-meynya-craft -
Установите зависимости из lock-файла.
npm ci -
Создайте
.env.localрядом сpackage.json.OPENAI_API_KEY=ваш_основной_ключ OPENAI_MODEL=идентификатор_доступной_модели # Необязательно: используется только при исчерпании квоты основного ключа OPENAI_API_KEY_BACKUP=ваш_резервный_ключНе используйте префикс
NEXT_PUBLIC_: ключи нужны только серверной части. Реальные ключи нельзя добавлять в Git. -
Запустите development-сервер.
npm run dev -
Откройте http://localhost:3000.
Для production-сборки:
npm run build
npm run start
Как проверить решение за несколько минут
Все действия выполняйте в одной вкладке, не обновляя страницу: состояние MVP хранится клиентски.
-
Откройте
/create. -
Введите намеренно неполное описание:
У нас небольшая кофейня. Администратор записывает заказы на доставку в блокнот, иногда заказы теряются. Хотим уменьшить количество ручной работы.
-
Нажмите «Проанализировать задачу». Проверьте найденные пробелы и перейдите к вопросам.
-
Ответьте на вопросы. Для части неизвестных сведений можно выбрать «Пока не знаю».
-
Сформируйте карточку. На Review-экране проверьте score, уровень, категории и рекомендации.
-
Отредактируйте слабые поля, например:
- пользователи: «Два администратора кофейни, которые принимают и распределяют заказы»;
- критерий успеха: «Сократить среднее время оформления заказа до 2 минут»;
- данные: «Таблица из 500 обезличенных заказов за последние три месяца».
-
Убедитесь, что score пересчитался, затем нажмите «Подтвердить задачу».
-
Перейдите по ссылке в
/catalog, найдите опубликованную карточку и откройте/tasks/[id]. -
Отправьте proposal от первой команды. Через каталог снова откройте ту же задачу и отправьте второй proposal от другой команды.
-
Переключитесь в Business, откройте
/business/[id], отклоните один отклик и примите другой. -
Проверьте, что принятый отклик получил статус «Принят», задача перешла в состояние «В работе», закрылась для новых откликов и исчезла из
/catalog.
Данные и интеграции
OpenAI API
- используются два POST-маршрута:
/api/analyzeи/api/card; - запросы выполняются через OpenAI Responses API с
store: false; - ответы AI проходят Zod-валидацию;
- frontend дополнительно проверяет структуру ответа перед обновлением состояния;
- основной и необязательный резервный API-ключи остаются на сервере;
- резервный ключ используется только при ошибке исчерпания квоты основного ключа;
- конкретная модель задаётся через
OPENAI_MODELи в репозитории не указана.
Synthetic seed data
В lib/seed.ts находятся вымышленные demo-данные:
- 8 задач: 6 опубликованных, 1 черновик и 1 задача в работе;
- 5 студенческих команд;
- 8 откликов: 6 pending, 1 accepted и 1 rejected.
Контакты используют адреса example.com и не относятся к реальным организациям.
На экране создания также есть три готовых demo-описания: Ритейл, Поддержка клиентов и Логистика.
Формула рейтинга
calculateScore() находится в lib/score.ts. Максимальный score — 100 баллов.
Перед расчётом пробелы и повторяющиеся пробелы нормализуются. Пустая строка и значение «Не указано» дают 0 баллов. Короткое заполненное значение получает половину максимума с округлением вниз. Полный балл начисляется при достижении порога длины.
| Категория | Максимум | Фактическое правило |
|---|---|---|
| Context + Need | 20 | context и need по 10; каждое поле получает максимум от 40 символов |
| Data | 20 | data: максимум от 40 символов |
| Expected Result | 15 | expectedResult: максимум от 40 символов |
| Success Criteria | 15 | до 8 баллов за длину и ещё 7 за измеримый числовой показатель |
| Constraints | 10 | constraints: максимум от 40 символов |
| Users | 10 | users: максимум от 40 символов |
| Business Contact | 10 | contact: максимум от 10 символов |
interactionFormat отображается в карточке, но не влияет на score.
Для дополнительных 7 баллов в successCriteria должны одновременно присутствовать:
- хотя бы одна цифра;
- русская или латинская буква;
- не менее четырёх слов.
Уровни готовности:
| Score | Уровень |
|---|---|
| 0–39 | Draft |
| 40–69 | Working |
| 70–89 | Ready |
| 90–100 | Priority |
Hints формируются детерминированно только для недостающих баллов. Каждая рекомендация показывает потенциальную прибавку; сумма всех прибавок равна 100 − score.
Правила каталога
- в каталог попадают только задачи со статусом
published; - черновики и задачи
in_progressне показываются; - задачи сортируются по score по убыванию;
- при одинаковом score используется сортировка по
id; - доступны совместимые фильтры по теме и уровню готовности;
- минимального score для публикации и отклика нет;
- низкий score влияет только на позицию в каталоге и не запрещает отправить proposal;
- после Accept задача переходит в
in_progress, исчезает из каталога и закрывается для новых откликов.
Ограничения MVP
- полноценной авторизации нет;
- Business / Student — интерфейсный demo-переключатель, а не система прав доступа;
- данные Zustand существуют только в памяти текущей вкладки;
- после reload пользовательские задачи, изменения и отклики сбрасываются к seed-данным;
- вкладки и устройства не синхронизируются;
- общей серверной базы данных нет;
- проект демонстрирует продуктовый сценарий и не является production-инфраструктурой.
Структура проекта
app/ страницы App Router: landing, create, catalog, tasks, business
app/api/ серверные POST-маршруты AI-анализа и генерации карточки
components/ create-flow, task UI, landing и переиспользуемые UI-компоненты
lib/ AI, OpenAI client, типы, store, scoring, seed и frontend API adapter
scripts/ автономная проверка backend-контрактов и бизнес-правил
Проверки
# ESLint
npm run lint
# TypeScript без генерации файлов
npx tsc --noEmit
# Production build
npm run build -- --webpack
# Проверка пробельных ошибок в diff
git diff --check
# Backend-контракты без реальных AI-запросов и без расхода кредитов
node scripts/check-backend.mjs
# Дополнительная live-проверка двух запросов к OpenAI; расходует API-кредиты
node --env-file=.env.local scripts/check-backend.mjs --live
Offline backend-check использует реальные Zod-схемы, Zustand-store, scoring, seed, API handlers и AI parsing; транспорт OpenAI в нём подменён. Live-режим требует OPENAI_API_KEY и OPENAI_MODEL.
Авторы коммитов
История коммитов
- 2026-09-23 17:57Revert "fix: ignore meaningless clarification answers"Dariya
- 2026-09-23 17:52fix: ignore meaningless clarification answersDariya
- 2026-09-23 17:24docs: update README for HackAlem AI juryDariya
- 2026-09-23 17:13feat: integrate editorial frontend across task flowsDariya
- 2026-09-23 16:48step 3 and 4Dias
- 2026-09-23 16:26task2Dias
- 2026-09-23 15:58feat: integrate task creation flow with AI backendDariya
- 2026-09-23 15:26style: localize and redesign create task flowDariya
Все коммиты (13)
- 2026-09-23 15:11Implement task scoring and AI integrationDias
- 2026-09-23 15:02feat: add business task creation frontend flowDariya
- 2026-09-23 14:55small changeDariya
- 2026-09-23 13:59delete folder taskupDariya
- 2026-09-23 13:53chore: initialize hackathon project and dependenciesDariya
Структура репозитория (60 файлов)
.gitignore README.md app/api/analyze/route.ts app/api/card/route.ts app/business/[id]/page.tsx app/business/page.tsx app/catalog/page.tsx app/create/layout.tsx app/create/page.tsx app/favicon.ico app/globals.css app/layout.tsx app/page.tsx app/tasks/[id]/page.tsx components.json components/create-task/clarify-step.tsx components/create-task/create-task-error.tsx components/create-task/create-task-flow.tsx components/create-task/create-task-loading.tsx components/create-task/create-task-stepper.tsx components/create-task/demo.ts components/create-task/describe-step.tsx components/create-task/editable-task-field.tsx components/create-task/task-analysis.tsx components/create-task/task-api.ts components/create-task/task-card-review.tsx components/create-task/types.ts components/landing/landing-page.tsx components/tasks/task-detail.tsx components/tasks/task-ui.tsx components/ui/badge.tsx components/ui/button.tsx components/ui/card.tsx components/ui/dialog.tsx components/ui/input.tsx components/ui/progress.tsx components/ui/select.tsx components/ui/separator.tsx components/ui/textarea.tsx components/ui/tooltip.tsx eslint.config.mjs lib/ai.ts lib/api/tasks.ts lib/openai.ts lib/score.ts lib/seed.ts lib/store.ts lib/types.ts lib/utils.ts next.config.ts package-lock.json package.json postcss.config.mjs public/file.svg public/globe.svg public/next.svg public/vercel.svg public/window.svg scripts/check-backend.mjs tsconfig.json
Ветки (2)
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.