RADAR
Next.js-платформа с кабинетами заказчика и исполнителя: AI оценивает полноту брифа бизнес-задачи (0–100) и задаёт до 4 уточняющих вопросов, студенты…
О проекте
Команда: BOGDAN
Кейс HackAlem.ai: Образование — AI Sana
Стадия: Рабочий MVP
Задача кейса: Challenge Hub: превратить задачу бизнеса в задание для студенческих команд
Суть
Next.js-платформа с кабинетами заказчика и исполнителя: AI оценивает полноту брифа бизнес-задачи (0–100) и задаёт до 4 уточняющих вопросов, студенты откликаются на задачи, отсортированные по рейтингу, есть AI Skill Gap Radar.
Как устроено
Кабинет заказчика отправляет бриф в Route Handler /api/brief/analyze, который вызывает OpenAI Responses API со Structured Outputs. Ответ содержит рейтинг полноты, уровень, резюме, образовательную ценность и вопросы; без ключа работает локальный детерминированный анализ. Задачи, отклики и сессии хранятся в localStorage, а схема Supabase (PostgreSQL, RLS) только подготовлена миграциями.
Ключевые решения
- Structured Outputs
- скоринг полноты брифа
- локальный fallback-анализ
- Skill Gap Radar
Стек
Next.js 16 · React 19 · TypeScript · Tailwind CSS 4 · Supabase · PostgreSQL · Node.js Test Runner
Модели
gpt-4o-mini
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-346a2be1-bogdan.
README
README.mdRADAR — задачи встречают талант
RADAR — образовательная веб-платформа, на которой бизнес размещает реальные задачи, а студенты и молодые специалисты получают практический опыт, усиливают портфолио и видят измеримый рост навыков.
Сервис объединяет две рабочие зоны: кабинет заказчика и кабинет исполнителя. AI-редактор помогает бизнесу превратить черновое описание в понятный бриф, оценивает его полноту и задаёт уточняющие вопросы. Студенты видят наиболее проработанные задачи первыми и заранее понимают, чему научатся во время работы.
Образовательная цель
Проект показывает полный цикл двустороннего цифрового продукта:
- ролевой вход в сервис;
- создание реальной бизнес-задачи;
- AI-проверка и улучшение брифа;
- публикация и ранжирование задач;
- отклик студента;
- выбор исполнителя заказчиком;
- оценка и развитие профессиональных навыков.
Главная идея RADAR: молодой специалист учится не на абстрактном упражнении, а во время выполнения настоящей задачи бизнеса с конкретным результатом для портфолио.
Основной пользовательский сценарий
- Пользователь открывает страницу входа и выбирает роль «Заказчик» или «Исполнитель».
- Заказчик заполняет название задачи, описание, бюджет, срок, необходимые навыки и образовательный результат.
- Серверный AI-анализ оценивает полноту брифа по шкале от 0 до 100 и при необходимости задаёт до четырёх наводящих вопросов.
- После ответов рейтинг пересчитывается, а задача публикуется в рабочем пространстве.
- В кабинете исполнителя задачи располагаются по убыванию рейтинга брифа.
- Студент выбирает задачу, отправляет содержательный отклик и отслеживает его статус.
- Заказчик рассматривает отклики и принимает или отклоняет кандидата.
- В AI Skill Gap Radar студент сравнивает текущие навыки с целевыми и видит приоритеты развития.
Отличительная функция — AI Skill Gap Radar
RADAR не ограничивается подбором задач. Для каждого навыка сервис показывает:
- текущий уровень;
- целевой уровень;
- величину разрыва;
- приоритет развития;
- связь навыка с реальными задачами платформы.
Так студент получает не общий AI-совет, а понятный маршрут: какой навык развивать следующим и в каком проекте его можно применить.
Что уже реализовано
- выразительная страница входа с выбором роли;
- отдельный интерфейс заказчика;
- отдельный интерфейс студента;
- создание и публикация бизнес-задач;
- серверный маршрут
/api/brief/analyzeдля анализа брифа через OpenAI; - локальный алгоритм анализа на случай отсутствия API-ключа;
- наводящие вопросы и пересчёт рейтинга задачи;
- сортировка задач по рейтингу полноты;
- отклики студентов и выбор исполнителя;
- интерактивный Skill Gap Radar;
- локальное сохранение рабочего сценария в браузере;
- SQL-миграции и seed-данные для последующего подключения Supabase.
Технологический стек
- Next.js 16 с App Router;
- React 19;
- TypeScript;
- Tailwind CSS 4;
- ESLint;
- OpenAI Responses API со Structured Outputs;
- Supabase: PostgreSQL, Auth и Row Level Security — схема подготовлена для подключения;
- встроенный Node.js Test Runner.
Структура проекта
Hackaton/
├── public/ # статические файлы
├── src/
│ ├── app/
│ │ ├── api/brief/analyze/ # серверный AI-анализ брифа
│ │ ├── business/ # страница заказчика
│ │ ├── login/ # страница входа
│ │ ├── student/ # страница исполнителя
│ │ └── globals.css # общая визуальная система
│ ├── components/ # интерфейсы и UI-компоненты
│ └── lib/workspace.ts # типы, сессия и локальное хранилище
├── supabase/
│ ├── migrations/ # SQL-миграции базы данных
│ └── seed.sql # демонстрационные данные
├── tests/ # автоматические проверки
├── .env.example # безопасный шаблон переменных
├── .env.local # локальные секреты, не попадают в Git
├── package.json # зависимости и команды
└── README.md # документация проекта
Требования к окружению
- Windows 10 или Windows 11;
- PowerShell;
- Node.js версии 20.9 или новее, рекомендуется LTS;
- npm;
- Git;
- VS Code — необязательно, но удобно.
Проверьте установленные версии:
node --version
npm.cmd --version
git --version
$PSVersionTable.PSVersion
winget --version
Если Node.js или Git отсутствует, откройте PowerShell от имени администратора и установите только недостающий инструмент:
winget install --id OpenJS.NodeJS.LTS --exact
winget install --id Git.Git --exact
После системной установки полностью перезапустите VS Code, чтобы обновился PATH.
В PowerShell запуск
npmможет блокироваться политикой выполнения сценариев. В этом случае используйтеnpm.cmd, как показано во всех командах ниже. Менять системную политику выполнения для запуска проекта не требуется.
Установка на Windows
Вариант 1 — проект уже находится на компьютере
Set-Location "C:\Users\Пользователь\Desktop\Hackaton"
npm.cmd install
if (-not (Test-Path .env.local)) { Copy-Item .env.example .env.local }
npm.cmd run dev
Вариант 2 — запуск после клонирования из GitHub
git clone <URL-РЕПОЗИТОРИЯ>
Set-Location <ПАПКА-РЕПОЗИТОРИЯ>
npm.cmd ci
Copy-Item .env.example .env.local
npm.cmd run dev
После сообщения Ready откройте http://localhost:3000.
Сервер должен оставаться запущенным в терминале. Для остановки нажмите Ctrl+C.
Основные команды
npm.cmd run dev # запуск режима разработки
npm.cmd run lint # проверка ESLint
npm.cmd run typecheck # проверка TypeScript
npm.cmd test # автоматические тесты
npm.cmd run build # production-сборка
npm.cmd run start # запуск готовой production-сборки
npm.cmd run check # lint + typecheck + тесты + build
Настройка .env.local
Откройте файл .env.local в корне проекта и заполните нужные значения:
OPENAI_API_KEY=
OPENAI_MODEL=gpt-4o-mini
NEXT_PUBLIC_SUPABASE_URL=
NEXT_PUBLIC_SUPABASE_ANON_KEY=
SUPABASE_SERVICE_ROLE_KEY=
Назначение переменных:
OPENAI_API_KEY— секретный серверный API-ключ OpenAI;OPENAI_MODEL— модель для анализа брифа; если строка пустая, используетсяgpt-4o-mini;NEXT_PUBLIC_SUPABASE_URL— URL проекта Supabase;NEXT_PUBLIC_SUPABASE_ANON_KEY— публичный anon/publishable key Supabase;SUPABASE_SERVICE_ROLE_KEY— привилегированный серверный ключ Supabase.
Не добавляйте кавычки или пробелы вокруг =. После изменения .env.local остановите сервер через Ctrl+C и снова выполните npm.cmd run dev.
OPENAI_API_KEY и SUPABASE_SERVICE_ROLE_KEY являются серверными секретами. Их нельзя использовать в Client Components, добавлять к ним префикс NEXT_PUBLIC_, возвращать из API, выводить в HTML или логи.
Получение OpenAI API key
- Откройте OpenAI Platform.
- Создайте или выберите API project.
- Настройте API-биллинг и лимит расходов.
- Откройте раздел API keys и создайте новый secret key.
- Сразу вставьте его после
OPENAI_API_KEY=в локальном.env.local. - Никому не отправляйте ключ и не добавляйте его в README или Git.
Подписка ChatGPT и биллинг OpenAI API являются отдельными продуктами. Наличие подписки ChatGPT само по себе не предоставляет API-баланс.
Как работает AI-проверка
Кабинет заказчика отправляет заполненный бриф на серверный Route Handler /api/brief/analyze. Сервер обращается к OpenAI и возвращает:
- рейтинг полноты от 0 до 100;
- уровень полноты
low,mediumилиhigh; - краткое резюме;
- образовательную ценность задачи;
- до четырёх наводящих вопросов.
Ответы заказчика отправляются на повторный анализ. При публикации рейтинг сохраняется вместе с задачей и используется для сортировки студенческой ленты.
Если ключ отсутствует или OpenAI временно недоступен, приложение автоматически использует локальный детерминированный анализ. В интерфейсе будет указано «Локальный анализ» вместо «GPT-анализ».
Создание и настройка Supabase
Supabase не требуется для локальной демонстрации: сейчас интерфейс хранит сессию, задачи и отклики в localStorage. Подготовленная схема нужна для перехода к настоящей многопользовательской базе и авторизации.
Для подключения Supabase:
- Создайте проект в Supabase Dashboard.
- В окне Connect или разделе Project Settings → API скопируйте Project URL.
- Публичный anon/publishable key вставьте в
NEXT_PUBLIC_SUPABASE_ANON_KEY. - Серверный
service_rolekey вставьте вSUPABASE_SERVICE_ROLE_KEY. - Никогда не используйте
service_roleв браузерном коде.
Применение миграций базы
- Откройте созданный проект в Supabase.
- Перейдите в SQL Editor.
- Откройте локальный файл
supabase/migrations/202609230001_initial_schema.sql, скопируйте SQL и выполните его. - Затем выполните
supabase/migrations/202609230002_marketplace.sql. - Проверьте наличие таблиц
profiles,projects,applications,student_skills,assessmentsиskill_gaps. - Убедитесь, что Row Level Security включён и политики созданы.
Supabase CLI для этого не обязателен. Если команда использует CLI, миграции можно применять через supabase db push, но проект не требует глобальной установки этого инструмента.
Загрузка демонстрационных данных
После применения миграций:
- откройте
supabase/seed.sql; - скопируйте его содержимое в Supabase SQL Editor;
- выполните запрос;
- убедитесь, что появилась таблица
demo_skill_gapsс демонстрационными записями.
Seed-скрипт можно запускать повторно. Он не создаёт поддельные учётные записи Supabase Auth.
Запуск без токенов
Для локальной демонстрации можно оставить все значения .env.local пустыми:
npm.cmd run dev
В этом режиме доступны:
- вход как заказчик и исполнитель;
- создание и публикация задач;
- локальная оценка полноты брифа;
- наводящие вопросы;
- сортировка задач по рейтингу;
- отклики и выбор кандидата;
- Skill Gap Radar.
Данные сохраняются только в текущем браузере. Очистка данных сайта или localStorage удалит локальное рабочее пространство.
Проверка проекта
Полная проверка одной командой:
npm.cmd run check
Или по отдельности:
npm.cmd run lint
npm.cmd run typecheck
npm.cmd test
npm.cmd run build
После успешной сборки production-версию можно проверить так:
npm.cmd run start
Демонстрация для жюри
Перед показом выполните npm.cmd run check, затем npm.cmd run dev.
Рекомендуемый сценарий:
- На странице входа выберите роль заказчика.
- Создайте задачу с намеренно коротким описанием.
- Покажите AI-рейтинг и наводящие вопросы.
- Ответьте на вопросы, пересчитайте рейтинг и опубликуйте задачу.
- Выйдите и войдите как исполнитель.
- Покажите сортировку задач, образовательный результат и отправьте отклик.
- Откройте Skill Gap Radar и измените текущий уровень навыка.
- Вернитесь в кабинет заказчика и примите кандидата.
Такой показ демонстрирует весь цикл: бизнес-задача → AI-уточнение → практика студента → измеримый рост навыков.
Подготовка к GitHub
Перед коммитом выполните:
git status --short
git check-ignore -v .env.local
git diff --cached
git grep -n -I -E "(sk-[A-Za-z0-9_-]{20,}|eyJ[A-Za-z0-9_-]{40,})" -- .
npm.cmd run check
.env.local, .next и node_modules не должны находиться среди добавляемых файлов.
Публикация через Source Control в VS Code
- Откройте папку
C:\Users\Пользователь\Desktop\Hackatonв VS Code. - Перейдите в раздел Source Control.
- Просмотрите каждый изменённый файл.
- Убедитесь, что
.env.localотсутствует в списке. - Добавьте нужные файлы в Stage.
- Введите осмысленное сообщение коммита и нажмите Commit.
- Нажмите Publish Branch и выберите видимость репозитория.
- Авторизуйтесь в GitHub, если VS Code запросит вход.
Публикация через GitHub CLI
GitHub CLI устанавливается только при необходимости:
winget install --id GitHub.cli --exact
gh auth login
git add .
git commit -m "feat: prepare RADAR platform"
gh repo create radar --source . --private --push
Замените --private на --public, только если проект действительно должен быть публичным.
Публикация обычными командами Git
Сначала создайте пустой репозиторий на GitHub, не добавляя в него README. Затем выполните:
git add .
git commit -m "feat: prepare RADAR platform"
git branch -M main
git remote add origin https://github.com/<ИМЯ-ПОЛЬЗОВАТЕЛЯ>/<РЕПОЗИТОРИЙ>.git
git push -u origin main
Проект не публикуется автоматически. Удалённый репозиторий создаётся только владельцем проекта.
Безопасная работа с токенами
- храните реальные ключи только в
.env.localили в секретах платформы хостинга; - никогда не отправляйте ключи в чат, почту, issue, скриншоты или логи;
- не добавляйте
.env.localв Git даже для приватного репозитория; - перед коммитом проверяйте
git diff --cached; - используйте в браузере только публичные переменные с префиксом
NEXT_PUBLIC_; - не передавайте
OPENAI_API_KEYиSUPABASE_SERVICE_ROLE_KEYклиентскому коду; - если секрет был опубликован, немедленно отзовите его и создайте новый — простого удаления строки недостаточно.
Известные ограничения текущей версии
- форма входа определяет роль, но пока не выполняет серверную проверку пароля;
- сессия, задачи и отклики сохраняются в
localStorage, поэтому не синхронизируются между браузерами и устройствами; - SQL-схема Supabase подготовлена, но приложение ещё не использует Supabase Auth и базу во время работы;
- серверный AI-маршрут перед публичным размещением необходимо защитить авторизацией и ограничением частоты запросов;
- рейтинг качества брифа является помощником, а не гарантией успешного выполнения задачи;
- отсутствуют административная панель, уведомления и полноценные end-to-end тесты;
- AI-рекомендации требуют проверки человеком.
Лицензия намеренно не добавлена. Перед публичным распространением владелец проекта должен выбрать её отдельно.
Авторы коммитов
История коммитов
- 2026-09-23 17:23remove old flask prototypeBob
- 2026-09-23 17:22Merge branch 'main' of https://github.com/BAITC-Hacks/hack-346a2be1-bogdanBob
- 2026-09-23 17:22Next.js + Supabase projectBob
- 2026-09-23 17:19Merge branch 'main' of https://github.com/BAITC-Hacks/hack-346a2be1-bogdanBob
- 2026-09-23 16:33Add files via uploadBK283
- 2026-09-23 15:38Merge branch 'main' of https://github.com/BAITC-Hacks/hack-346a2be1-bogdanBob
- 2026-09-23 15:12small fixBob
- 2026-09-23 14:44first commitBob
Структура репозитория (37 файлов)
.env.example .env.local .gitignore AGENTS.md CLAUDE.md README.md eslint.config.mjs next-env.d.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 src/app/api/brief/analyze/route.ts src/app/business/page.tsx src/app/favicon.ico src/app/globals.css src/app/layout.tsx src/app/login/page.tsx src/app/page.tsx src/app/student/page.tsx src/components/business-dashboard.tsx src/components/icons.tsx src/components/login-screen.tsx src/components/student-dashboard.tsx src/lib/workspace.ts supabase/migrations/202609230001_initial_schema.sql supabase/migrations/202609230002_marketplace.sql supabase/seed.sql tests/project-setup.test.mjs tsconfig.json tsconfig.tsbuildinfo ui-check-login.png
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.