AAYMA
RU
Войти

SkillArena AI

Платформа, где бизнес с помощью AI превращает проблему в карточку задачи с рейтингом полноты брифа, публикует её, а студенческие команды откликаются…

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

О проекте

Команда: Magnesium
Кейс HackAlem.ai: Образование — AI Sana
Стадия: Рабочий MVP

Задача кейса: Challenge Hub: превратить задачу бизнеса в задание для студенческих команд

Суть

Платформа, где бизнес с помощью AI превращает проблему в карточку задачи с рейтингом полноты брифа, публикует её, а студенческие команды откликаются и получают XP за принятые этапы.

Как устроено

Бизнес вводит описание, Fastify-сервер отправляет его и текущие поля в OpenAI Responses API (gpt-4o-mini, структурированный JSON), который возвращает уточняющие вопросы; при сбое используются шаблонные вопросы. Карточка из 9 полей редактируется и подтверждается, сервер считает рейтинг 0–100 по весам полей и уровни (черновик, рабочая, готовая, приоритетная). Команды отправляют предложения, бизнес вручную выбирает и принимает этапы (+100 XP без двойного начисления). Данные в SQLite (node:sqlite, WAL), контракты описаны в TypeBox/OpenAPI.

Ключевые решения

  • OpenAI Responses API structured output
  • шаблонный fallback
  • весовой рейтинг полноты
  • идемпотентные запросы
  • разрешение конфликтов версий
  • TypeBox/JSON Schema/OpenAPI

Особенности

Хорошо проработана надёжность данных: черновик отделён от опубликованной версии, конфликтующие версии сравниваются, повторы создания задач и откликов после потери ответа безопасны, начисление XP идемпотентно. Есть CI на GitHub Actions и интеграционные HTTP-тесты.

Стек

TypeScript · Next.js 16 · React 19 · Fastify 5 · SQLite (node:sqlite) · TypeBox · Swagger · GitHub Actions · Docker · pnpm

Модели

GPT-4o-mini


Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-fe7f2d61-magnesium.

README

README.md

SkillArena AI · HackAlem

Платформа, на которой бизнес превращает проблему в понятную задачу, а студенческие команды предлагают решения и получают XP за принятый результат. Проект команды Magnesium для хакатона HackAlem.

Проблема и аудитория

Бизнесу бывает сложно описать задачу так, чтобы команда могла приступить к работе: не хватает данных, критериев успеха и ожидаемого результата. Студенческим командам нужны практические задачи с понятными условиями и обратной связью.

SkillArena помогает бизнесу уточнить описание с помощью AI, опубликовать задачу и выбрать исполнителей. Команды находят проекты, отправляют предложения и накапливают подтверждённый прогресс. Текущая версия — работающий MVP с демонстрационными ролями «Бизнес» и «Команда».

Что реализовано

  • Каталог задач: поиск, фильтры по теме и готовности, сортировка по рейтингу полноты брифа. Низкий рейтинг не запрещает откликаться.
  • Конструктор задачи: исходное описание, уточняющие вопросы AI, редактируемая карточка из девяти полей, ручное подтверждение и публикация.
  • Прозрачный рейтинг: отдельно отображаются предварительный балл, подтверждённый балл черновика и рейтинг опубликованной версии.
  • Черновики и публикации: сохранение правок в черновике не меняет карточку в каталоге до повторного подтверждения и публикации.
  • Предложения команд: идея, план, срок и ссылка на прототип; бизнес вручную выбирает или отклоняет предложения, может выбрать несколько команд.
  • Прогресс и XP: за принятый бизнесом этап начисляется 100 XP. Повторное подтверждение того же этапа не удваивает награду.
  • Демонстрационные команды: переключение команды в интерфейсе, отдельные отклики и XP. Выбранная команда запоминается в текущей вкладке.
  • Сохранение данных: задачи, предложения, решения и принятые этапы хранятся на сервере в SQLite и остаются после перезапуска с той же базой.
  • Обработка ошибок: предупреждение об уходе из несохранённой формы, сравнение конфликтующих версий, сохранение независимых правок, безопасные повторы создания задач и откликов после потери ответа.
  • Резервный режим AI: при отсутствии ключа или сбое провайдера используются вопросы по шаблону с явной отметкой в интерфейсе.

Как считается рейтинг

Баллы начисляются за заполненные и подтверждённые сведения. Изменение карточки снимает подтверждение версии.

ПолеБаллы
Контекст10
Потребность10
Данные и материалы20
Ожидаемый результат15
Критерии успеха15
Ограничения10
Пользователи10
Контакт5
Формат взаимодействия5
Всего100

Уровни: 0–39 — черновик, 40–69 — рабочая, 70–89 — готовая, 90–100 — приоритетная. Здесь «черновик» — также название уровня готовности: опубликованная задача с таким рейтингом доступна командам. Неопубликованные черновики видит бизнес.

Рейтинг отражает полноту описания, а XP — принятые этапы работы команды. Это разные показатели.

Как работает решение

  1. Бизнес вводит описание проблемы, например: «У магазина падают повторные покупки. Нужен анализ причин».
  2. Сервер отправляет описание и текущие поля карточки в AI, который возвращает уточняющие вопросы. Без доступного провайдера сервер использует подготовленные вопросы.
  3. Бизнес отвечает, редактирует карточку, проверяет сведения и подтверждает публикацию. Сервер рассчитывает рейтинг.
  4. Команда находит опубликованную задачу и отправляет свой подход, план, срок и ссылку на прототип.
  5. Бизнес рассматривает предложения и вручную выбирает команду или несколько команд.
  6. После проверки результата бизнес отдельно принимает этап. Сервер записывает принятие и начисляет XP команде.

AI помогает уточнить задачу; подтверждение сведений, выбор исполнителей и принятие результата остаются за человеком.

Технологии

ОбластьИспользуется в проекте
ЯзыкTypeScript; JavaScript для вспомогательных скриптов; CSS для оформления
ИнтерфейсNext.js 16.3.6, React 19.3.0, Lucide React
СерверNode.js 24+, Fastify 5
ХранилищеSQLite через встроенный модуль node:sqlite, режим WAL
Контракты и документация APITypeBox, JSON Schema, OpenAPI, Swagger UI
AIOpenAI Responses API, структурированный JSON-ответ; модель по умолчанию gpt-4o-mini
Проверкиnode:test, node:assert, TypeScript, tsx, интеграционные HTTP-тесты
Инструментыpnpm 11.19.0 для frontend, npm для backend, Prettier, GitHub Actions

Модель и адрес AI-провайдера задаются настройками сервера. Совместимый провайдер должен поддерживать Responses API и структурированные ответы; одной совместимости с Chat Completions недостаточно.

Архитектура

flowchart LR
    U[Браузер: Next.js и React] --> A[Frontend-адаптеры и типизированный API-клиент]
    A --> P[Next.js: прокси /api/*]
    P --> B[Fastify: проверка запросов и бизнес-правила]
    B --> D[(SQLite)]
    B --> I[AI-модуль]
    I --> O[OpenAI Responses API]
    I --> F[Резервные вопросы по шаблону]

Браузер обычно обращается к API через тот же адрес, на котором открыт интерфейс. Next.js перенаправляет /api/* на Fastify. Сервер проверяет входные данные, версии карточек и демонстрационную принадлежность операций, рассчитывает рейтинг и XP, сохраняет результат в SQLite. Ключ AI используется только сервером.

ПутьНазначение
app/, components/Страницы и компоненты интерфейса
lib/workspace-api.tsОперации с сервером, преобразование данных для интерфейса, обработка повторных запросов
lib/brief-api.ts, lib/editor.tsКлиент анализа брифа и объединение изменений карточки
backend/src/app.tsHTTP-маршруты, валидация, CORS и Swagger
backend/src/service.ts, backend/src/rating.tsБизнес-правила, решения, рейтинг и прогресс
backend/src/store.ts, backend/src/seed.tsSQLite и начальные демонстрационные данные
backend/src/ai.tsПромпт, схема AI-ответа, вызов провайдера и резервный режим
backend/src/contracts.ts, backend/src/client.tsОбщие API-контракты и типизированный клиент
tests/, backend/test/Проверки frontend, API и интеграции
scripts/dev.mjsСовместный локальный запуск двух приложений

Установка и запуск

1. Подготовьте окружение

Нужны Git, Node.js 24 или новее с npm и pnpm 11.19.0.

node --version
npm install -g [email protected]

2. Получите проект и установите зависимости

git clone https://github.com/BAITC-Hacks/hack-fe7f2d61-magnesium.git
cd hack-fe7f2d61-magnesium
pnpm setup

Если проект уже скачан, перейдите в его корневую папку и выполните pnpm setup. Команда запускает pnpm install --frozen-lockfile и npm ci --prefix backend.

3. При необходимости подключите настоящий AI

Для запуска без внешнего AI настройки не обязательны: приложение работает с демо-вопросами.

Чтобы включить провайдера, скопируйте backend/.env.example в backend/.env (если своего файла ещё нет):

cp backend/.env.example backend/.env

В PowerShell используйте Copy-Item backend/.env.example backend/.env. В новом файле задайте OPENAI_API_KEY; модель по умолчанию — gpt-4o-mini. Не заменяйте уже настроенный .env и не публикуйте ключ в репозитории или переменных NEXT_PUBLIC_*.

Основные настройки backend:

ПеременнаяЗначение по умолчанию / назначение
OPENAI_API_KEYНе задана; без ключа используются демо-вопросы
OPENAI_MODELgpt-4o-mini
OPENAI_BASE_URLhttps://api.openai.com/v1
AI_TIMEOUT_MS12000 — время ожидания AI-ответа в миллисекундах
DATABASE_PATH./data/skillarena.sqlite, относительно рабочего каталога backend
SEED_DEMOtrue — создание начальных примеров при первом запуске базы
HOST / PORT127.0.0.1 / 3001 для отдельного запуска API
CORS_ORIGINSРазрешённые адреса frontend при прямых запросах к API; см. backend/.env.example

4. Запустите оба приложения

Из корня репозитория:

pnpm dev

После сообщений Ready от frontend и Server listening от backend откройте интерфейс в браузере. Команда продолжает работать, пока запущены серверы: ждать её завершения не нужно. Оставьте терминал открытым; Ctrl+C останавливает оба сервиса.

Если этот проект уже запущен, откройте адрес из его терминала. Для перезапуска остановите прежний запуск через Ctrl+C в том же терминале, затем выполните pnpm dev. После обновления исходников перед показом также перезапустите приложение. Next.js допускает только один dev-сервер для этой папки проекта: смена порта не позволит запустить второй экземпляр.

Если порт занят другим приложением, выберите свободные порты. В macOS/Linux:

FRONTEND_PORT=3100 BACKEND_PORT=3101 pnpm dev

В PowerShell:

$env:FRONTEND_PORT='3100'
$env:BACKEND_PORT='3101'
pnpm dev

В этом случае интерфейс открывается на http://127.0.0.1:3100. Общий запуск использует BACKEND_PORT для API и автоматически настраивает прокси.

Сборка и запуск собранной версии

pnpm build:all

Затем в двух терминалах из корня проекта:

# Терминал 1
npm start --prefix backend
# Терминал 2
pnpm start

Если API находится по другому адресу, задайте BACKEND_URL при сборке Next.js; пример настройки есть в .env.example. Для стандартного локального запуска frontend-переменные не нужны. npm start --prefix backend использует собранный каталог backend/dist, поэтому после изменения серверного кода требуется новая сборка.

Как проверить решение: сценарий для жюри

Сценарий занимает около 5 минут. Достаточно одного браузера: роли переключаются в интерфейсе. На существующей базе XP могут быть уже начислены — запомните начальное значение выбранной команды.

ШагДействиеОжидаемый результат
1Откройте каталог, измените поиск или фильтр готовностиСписок задач обновляется; задача с низким рейтингом остаётся доступной для отклика
2Нажмите «Я представляю бизнес» → «Подставить»В форме появляется пример исходной проблемы
3Нажмите «Улучшить задачу с AI»Появятся уточняющие вопросы; интерфейс явно покажет ответ модели или демо-режим
4Ответьте на вопросы либо используйте «Заполнить ответами из демо-примера», если кнопка доступна; нажмите «Собрать карточку»Откроется редактируемая карточка; задайте уникальное название и заполните оставшиеся поля
5Проверьте девять полей, поставьте галочку подтверждения и нажмите «Опубликовать задачу»Карточка появится в каталоге; при заполнении и подтверждении всех полей рейтинг равен 100
6Переключитесь на «Команда», выберите Data Nomads, откройте свою задачу → «Предложить решение»; заполните демо-примером и отправьтеПредложение поступит бизнесу на рассмотрение; XP ещё не изменятся
7В «Кабинете бизнеса» откройте задачу и нажмите «Выбрать команду»Предложение отмечено выбранным; XP пока не начислены
8Для демонстрации представьте, что результат сдан: «Подтвердить этап» → «Да, результат принят»Выбранная команда получит +100 XP за принятый этап
9Переключитесь обратно на Data Nomads, откройте «Моя команда» и обновите страницуПринятый этап и XP сохранятся; повторное принятие того же этапа недоступно

В live-режиме вопросы могут меняться. Статус «AI · готов к запросу» означает только наличие ключа; успешный вызов подтверждают «AI · ответ получен» и «AI-АНАЛИЗ». Если показаны «Демо-вопросы», используется резервный режим — это не ответ внешней модели.

Дополнительно можно изменить опубликованную задачу и сохранить черновик: каталог сохранит прежнюю публикацию. При редактировании одной карточки в двух вкладках устаревшее сохранение вызовет сравнение версий, позволяющее выбрать нужный текст.

Подробный сценарий: docs/DEMO.md.

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

pnpm check       # тесты frontend, backend, HTTP-интеграция и проверка TypeScript
pnpm build:all   # production-сборки обоих приложений

Тесты используют отдельные тестовые хранилища и не затрагивают пользовательскую базу. Они проверяют рейтинг, публикации и черновики, конфликты версий, ручной выбор, однократное начисление XP, повторы запросов и обработку AI-ответов. Эти команды также выполняются в GitHub Actions для main, frontend, backend и Pull Request.

Результаты предыдущих проверок и границы ручного тестирования записаны в docs/QA.md.

Данные и интеграции

  • Демонстрационные данные создаются из backend/src/seed.ts: 5 опубликованных задач, 5 отдельных черновиков, 5 команд и 5 предложений. Примеры синтетические, а ссылки example.test — демонстрационные адреса. Упомянутые в карточках CSV и материалы не загружаются из внешних источников.
  • Пользовательские данные вводятся в интерфейсе и сохраняются в backend/data/skillarena.sqlite при стандартном запуске. Начальное заполнение не повторяется при каждом перезапуске той же базы.
  • OpenAI — необязательная внешняя интеграция. При настроенном ключе сервер отправляет описание и поля брифа провайдеру через Responses API с store: false. Для запроса нужен интернет; без него сервер может перейти к демо-вопросам. Собственное обучение модели в проекте не реализовано.
  • Собственный REST API обслуживает каталог, черновики, команды, предложения, принятие этапов и анализ брифа. Контракт: backend/openapi.json; описание: backend/README.md.
  • Ссылки на прототипы сохраняются как часть предложения. Их наличие не означает автоматическую проверку работоспособности прототипа.

Ограничения текущей версии

  • Нет регистрации и полноценной авторизации. Переключение ролей и заголовки X-Business-Id / X-Team-Id служат демонстрационными идентификаторами. Это не защита для публичной эксплуатации.
  • Принятие результата выполняет бизнес вручную. AI не назначает команды, не проверяет качество прототипа и не выдаёт XP самостоятельно. Рейтинг полноты не гарантирует достоверность сведений или качество выполненной работы.
  • В интерфейсе используется один демонстрационный принимаемый этап на предложение; полноценное управление многоэтапным проектом не реализовано.
  • Нет мгновенных серверных push-обновлений: данные перечитываются, в том числе при возврате фокуса на страницу.
  • Несохранённый текст защищён предупреждением, но не записывается в постоянное хранилище браузера. Старые данные локального frontend-демо автоматически не импортируются.
  • Для размещения backend нужен постоянный диск под SQLite. Текущий вариант рассчитан на один экземпляр сервиса, а не на эфемерные serverless-функции или распределённое развёртывание.
  • Демо-режим AI использует шаблоны. Доступность настоящей модели зависит от ключа, сети и провайдера.

Развёрнутая версия

Подтверждённая ссылка на публичную deployed-версию в репозитории не указана. Для проверки используйте локальный запуск по инструкции выше. Адрес http://127.0.0.1:3000 доступен на компьютере, где запущен проект, и не является публичным демо.

Документация для команды

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

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

theAis-ops 9Codex 2

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

  • 2026-09-23 17:10fix: prevent backend restarts on dependency changestheAis-ops
  • 2026-09-23 16:44docs: add Russian project guide for hackathon jurytheAis-ops
  • 2026-09-23 16:20merge: integrate frontend updates and preserve conflict recoverytheAis-ops
  • 2026-09-23 16:17merge: integrate backend demo verificationtheAis-ops
  • 2026-09-23 16:14fix(frontend): finish demo teams, draft recovery and AI statusCodex
  • 2026-09-23 16:00docs: verify live AI demo and document local restarttheAis-ops
  • 2026-09-23 15:51docs: define shared branch workflow and integration rulestheAis-ops
  • 2026-09-23 15:43merge: connect frontend and backend with persistent full-stack workflowtheAis-ops
Все коммиты (11)
  • 2026-09-23 15:24merge: integrate backendtheAis-ops
  • 2026-09-23 15:19feat(frontend): build SkillArena business-task demoCodex
  • 2026-09-23 15:11feat(backend): add AI task builder, readiness catalog and proposalstheAis-ops
Структура репозитория (71 файлов)
.env.example
.gitattributes
.github/workflows/backend.yml
.github/workflows/integration.yml
.gitignore
AGENTS.md
BRANCH_RULES.md
CLAUDE.md
README.md
app/arena.css
app/globals.css
app/icon.svg
app/layout.tsx
app/page.tsx
backend/.dockerignore
backend/.env.example
backend/.gitignore
backend/Dockerfile
backend/README.md
backend/openapi.json
backend/package-lock.json
backend/package.json
backend/scripts/demo.mjs
backend/scripts/export-openapi.ts
backend/src/ai.ts
backend/src/app.ts
backend/src/client.ts
backend/src/contracts.ts
backend/src/errors.ts
backend/src/rating.ts
backend/src/seed.ts
backend/src/server.ts
backend/src/service.ts
backend/src/store.ts
backend/test/ai.test.ts
backend/test/client.test.ts
backend/test/database-fixture.ts
backend/test/dev-watch.test.ts
backend/test/idempotency.test.ts
backend/test/rating.test.ts
backend/test/seed.test.ts
backend/test/workflow.test.ts
backend/tsconfig.build.json
backend/tsconfig.json
components/arena.tsx
components/discard-dialog.tsx
components/proposals.tsx
components/task-builder.tsx
components/task-detail.tsx
components/ui.tsx
components/use-unsaved-changes.ts
docs/DEMO.md
docs/FRONTEND_HANDOFF.md
docs/QA.md
docs/backend-design.md
docs/frontend-integration.md
docs/superpowers/plans/2026-09-23-backend.md
lib/brief-api.ts
lib/domain.ts
lib/editor.ts
lib/fixtures.ts
lib/workspace-api.ts
next-env.d.ts
next.config.ts
package.json
pnpm-lock.yaml
pnpm-workspace.yaml
scripts/dev.mjs
tests/domain.test.ts
tests/integration/workspace.test.ts
tsconfig.json
Ветки (3)

Обсуждение 0 комментариев

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

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