task-catalog
Каталог бизнес-задач для студенческих команд: AI задаёт уточняющие вопросы по черновику бизнеса и собирает карточку задания с рейтингом полноты…
О проекте
Команда: WW TEAM
Кейс HackAlem.ai: Образование — AI Sana
Стадия: Рабочий MVP
Задача кейса: Challenge Hub: превратить задачу бизнеса в задание для студенческих команд
Суть
Каталог бизнес-задач для студенческих команд: AI задаёт уточняющие вопросы по черновику бизнеса и собирает карточку задания с рейтингом полноты, студенты откликаются, бизнес выбирает команду.
Как устроено
Бизнес вводит потребность, /api/clarify генерирует уточняющие вопросы, /api/build-card собирает структурированную карточку из 7 полей. askAI последовательно пробует OpenAI gpt-4o-mini, затем NVIDIA NIM llama-3.1-8b-instruct (таймаут 8 с у каждого), затем локальную заглушку по ключевым словам. Рейтинг считается как сумма весов заполненных полей (контекст 20, данные 20, результат 15 и т. д.), статус от draft до priority, пересчёт на сервере. Отклики и выбор команды хранятся в SQLite через Prisma и обрабатываются транзакцией.
Ключевые решения
- LLM provider fallback chain
- clarifying questions generation
- weighted completeness scoring
- JSON response validation
Особенности
Цепочка резервных провайдеров OpenAI → NVIDIA NIM → заглушка, источник ответа показывается в интерфейсе. Рейтинг прозрачно считается как заполненность полей, и тесты проверяют все 128 комбинаций заполнения.
Стек
Next.js 14 · React 18 · TypeScript · Tailwind CSS · Prisma 6 · SQLite
Модели
gpt-4o-mini · meta/llama-3.1-8b-instruct (NVIDIA NIM)
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-d8295458-ww-team.
README
README.mdtask-catalog
Каталог бизнес-задач для студенческих команд: черновик → уточнения → карточка → рейтинг → публикация → отклик → выбор команды.
Как запустить
Установите зависимости:
npm install
Скопируйте .env.example в .env:
DATABASE_URL="file:./dev.db"
OPENAI_API_KEY=""
NVIDIA_API_KEY=""
API-ключи опциональны: без них сценарий работает с локальной заглушкой. Ключи доступны только серверу. После изменения .env перезапустите сервер.
npx prisma migrate dev
npx prisma db seed
npm run dev
Откройте http://localhost:3000/catalog. В PowerShell при блокировке скриптов используйте npm.cmd и npx.cmd. Если клиент Prisma не сгенерирован, выполните npx prisma generate.
Seed создаёт 5 неподтверждённых черновиков, 5 подтверждённых карточек и 5 откликов — по одному на подтверждённую карточку. Демо-контакты и ссылки используют example.com. Черновики различаются подробностью rawDraft, но структурированные поля ещё пусты: рейтинг 0. Подтверждённые карточки имеют все семь полей рейтинга: 100 баллов.
Повторный seed не создаёт дубликаты: используются фиксированные ID seed-draft-*, seed-card-*, seed-proposal-*. Он восстанавливает содержимое демозаписей, сохраняя статус выбранного бизнесом отклика. Пользовательские записи не удаляются. База хранится в prisma/dev.db; база и .env исключены из Git. После seed обновите открытую вкладку каталога.
Архитектура
Стек: Next.js 14 (App Router), React 18, TypeScript, Tailwind CSS 3, Prisma 6, SQLite. Seed запускается через tsx.
prisma/
schema.prisma BusinessTask и Proposal
migrations/ SQL-миграции
seed.ts Демоданные с пересчётом рейтинга
src/
app/
business/ Пошаговое создание задачи
catalog/ Каталог и /catalog/[id] для редактирования
admin/ Временный список для проверки
api/clarify/ Уточняющие вопросы
api/build-card/ Подготовка карточки
api/tasks/ Публикация и PATCH /api/tasks/[id]
actions.ts Отправка отклика и выбор команды
components/ Формы, рейтинг, навигация
lib/
ai.ts askAI(systemPrompt, userText)
task-ai.ts Промпты и проверка ответа AI
task-card.ts Заглушки stubQuestions, stubCard и валидация
rating.ts calculateScore, getStatus, withRating
tasks.ts Запись задач с пересчётом рейтинга
prisma.ts Общий Prisma Client
tests/ Тесты и интеграционный сценарий
askAI последовательно пробует OpenAI (gpt-4o-mini), NVIDIA NIM (meta/llama-3.1-8b-instruct), затем возвращает null. У каждого провайдера таймаут 8 секунд через AbortController. Источник логируется на сервере и показывается у вопросов и карточки: OpenAI / NVIDIA (резерв) / Заглушка.
Заглушка без сети выбирает четыре вопроса по ключевым словам и переносит ответы в карточку. При недоступности AI или некорректном JSON форма показывает пояснение и позволяет продолжить с локальным результатом. До подтверждения карточка в БД не записывается. Публикация требует непустые title и rawDraft; отклик — название команды, idea и plan. Пробельные строки считаются пустыми.
Формула рейтинга задачи
Рейтинг — сумма весов непустых структурированных полей. null, пустые и пробельные строки дают 0. rawDraft и title сами по себе баллов не добавляют.
| Поле | Описание | Вес |
|---|---|---|
context | Контекст и потребность | 20 |
dataMaterials | Данные и материалы | 20 |
expectedResult | Ожидаемый результат | 15 |
successCriteria | Критерии успеха | 15 |
constraints | Ограничения | 10 |
users | Пользователи | 10 |
contact | Контакт и формат связи | 10 |
| Итого | 100 |
| Баллы | Статус | Уровень готовности |
|---|---|---|
| 0–39 | draft | Черновик |
| 40–69 | working | В работе |
| 70–89 | ready | Готова |
| 90–100 | priority | Приоритетная |
calculateScore возвращает { score, breakdown, missing }, getStatus определяет статус. Рейтинг измеряет заполненность, а не качество формулировок. При публикации и сохранении правок сервер пересчитывает баллы и статус; присланные клиентом значения игнорируются. В форме расчёт виден сразу при вводе. Подтверждение (confirmed) независимо от рейтинга: можно подтвердить неполную карточку.
Правила каталога
- Задачи отсортированы по
createdAtпо убыванию: новые сверху. Отклики внутри задачи — также новые сверху. - Каталог показывает все задачи, включая неподтверждённые черновики. Фильтры по статусу, подтверждению и баллам пока не реализованы. Рейтинг не влияет на сортировку.
- «Открыть и редактировать» ведёт на
/catalog/[id]. После сохранения рейтинг обновляется в БД и интерфейсе. - Отклик создаётся со статусом
pending. В разделе «Отклики» кнопка «Выбрать команду» переводит выбранный отклик вaccepted, остальные отклики этой задачи — вrejected. - Повторный выбор заменяет предыдущий в одной транзакции. Новые отклики после выбора получают
pending, пока бизнес не сделает новый выбор. Выбор команды не меняет рейтинг задачи. - После действий используются
revalidatePathиrouter.refresh(). Кнопки блокируются и показывают «Загрузка...».
Это локальное демо без авторизации: редактирование и выбор команды доступны всем посетителям. Перед публичным размещением нужны роли и права доступа. На момент установки npm audit сообщил о 9 уязвимостях (8 high, 1 critical), включая Next.js 14; перед публикацией следует обновить зависимости и повторить аудит.
Тестовые сценарии
- Создание и публикация. На
/businessвведите потребность, нажмите «Продолжить», ответьте на вопросы. Без ключей появится бейдж «Заглушка». В карточке заполните семь полей: рейтинг станет 100. Подтвердите — задача появится в каталоге. Пустые название или черновик не должны публиковаться. - Редактирование рейтинга. Откройте подтверждённую демозадачу в каталоге. Очистите контекст: рейтинг изменится со 100 на 80, статус — на «Готова», появится подсказка. Сохраните, вернитесь в каталог и проверьте результат после обновления страницы.
- Отклик и выбор бизнеса. Отправьте отклик с командой, идеей и планом. Он должен появиться без ручной перезагрузки. Выберите команду, затем другую: только один отклик должен быть принят. Без идеи или плана отправка блокируется.
Автоматические проверки:
npm test
npm run typecheck
npm run lint
npm run build
Тесты проверяют переключение провайдеров и таймауты с подменённым fetch, обработку JSON, обязательные поля, состояния формы, все 128 комбинаций заполнения и границы статусов. Реальные AI-запросы не выполняются.
При запущенном dev-сервере выполните node tests/scenario.cjs: сценарий проверяет API, SQLite, отклики и выбор/замену команды. Он удаляет только свои тестовые записи. Это интеграционная проверка без браузера.
//Karibaev Bekzat
Авторы коммитов
История коммитов
- 2026-09-23 17:48Add comment in package-lock.jsonzhanibekibr01arthas-hub
- 2026-09-23 17:48Update tsconfig.jsonzhanibekibr01arthas-hub
- 2026-09-23 16:36MVP task-catalogK1pow
- 2026-09-23 17:49Update README with integration test instructionsBekzz47
Структура репозитория (42 файлов)
.env.example .eslintrc.json .gitignore README.md next-env.d.ts next.config.mjs package-lock.json package.json postcss.config.mjs prisma/migrations/20260923101343_init/migration.sql prisma/migrations/migration_lock.toml prisma/schema.prisma prisma/seed.ts src/app/actions.ts src/app/admin/page.tsx src/app/api/build-card/route.ts src/app/api/clarify/route.ts src/app/api/tasks/[id]/route.ts src/app/api/tasks/route.ts src/app/business/page.tsx src/app/catalog/[id]/page.tsx src/app/catalog/page.tsx src/app/globals.css src/app/layout.tsx src/app/page.tsx src/components/business-wizard.tsx src/components/forms.tsx src/components/navigation.tsx src/components/task-editor.tsx src/components/task-rating.tsx src/lib/ai.ts src/lib/labels.ts src/lib/prisma.ts src/lib/rating.ts src/lib/task-ai.ts src/lib/task-card.ts src/lib/tasks.ts tailwind.config.ts tests/proposal-form.test.cjs tests/scenario.cjs tests/task-flow.test.cjs tsconfig.json
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.