AAYMA
RU
Войти

task-catalog

Каталог бизнес-задач для студенческих команд: AI задаёт уточняющие вопросы по черновику бизнеса и собирает карточку задания с рейтингом полноты…

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

О проекте

Команда: 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.md

task-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–39draftЧерновик
40–69workingВ работе
70–89readyГотова
90–100priorityПриоритетная

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; перед публикацией следует обновить зависимости и повторить аудит.

Тестовые сценарии

  1. Создание и публикация. На /business введите потребность, нажмите «Продолжить», ответьте на вопросы. Без ключей появится бейдж «Заглушка». В карточке заполните семь полей: рейтинг станет 100. Подтвердите — задача появится в каталоге. Пустые название или черновик не должны публиковаться.
  2. Редактирование рейтинга. Откройте подтверждённую демозадачу в каталоге. Очистите контекст: рейтинг изменится со 100 на 80, статус — на «Готова», появится подсказка. Сохраните, вернитесь в каталог и проверьте результат после обновления страницы.
  3. Отклик и выбор бизнеса. Отправьте отклик с командой, идеей и планом. Он должен появиться без ручной перезагрузки. Выберите команду, затем другую: только один отклик должен быть принят. Без идеи или плана отправка блокируется.

Автоматические проверки:

npm test
npm run typecheck
npm run lint
npm run build

Тесты проверяют переключение провайдеров и таймауты с подменённым fetch, обработку JSON, обязательные поля, состояния формы, все 128 комбинаций заполнения и границы статусов. Реальные AI-запросы не выполняются.

При запущенном dev-сервере выполните node tests/scenario.cjs: сценарий проверяет API, SQLite, отклики и выбор/замену команды. Он удаляет только свои тестовые записи. Это интеграционная проверка без браузера. //Karibaev Bekzat

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

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

zhanibekibr01arthas-hub 2Bekzz47 1K1pow 1

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

  • 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 комментариев

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

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