AAYMA
RU
Войти

Alem

Платформа бизнес-задач для студенческих команд: AI-аналитик, интервьюер и редактор собирают карточку из 10 полей с оценкой полноты 0–100.

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

О проекте

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

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

Суть

Платформа бизнес-задач для студенческих команд: AI-аналитик, интервьюер и редактор собирают карточку из 10 полей с оценкой полноты 0–100. Дальше каталог, отклики, ручной выбор команды и +25 баллов за подтверждённый этап.

Как устроено

Сервер на Node.js (node:http, без зависимостей) хранит состояние в JSON-файле. ai.mjs последовательно вызывает три роли с разными промптами: аналитик извлекает поля, интервьюер задаёт 3–7 вопросов, редактор собирает карточку. Вызовы идут через Chat Completions со строгой JSON Schema. Рейтинг считает domain.mjs по фиксированным весам заполненных полей. provider.mjs выбирает OpenAI, Groq или NVIDIA. Без ключа работает демо-режим с шаблонными вопросами.

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

  • три LLM-роли (analyst/interviewer/editor)
  • strict JSON Schema
  • мультипровайдерный адаптер
  • лимит AI-операций в час
  • рейтинг заполненности полей

Особенности

Ни одной npm-зависимости: всё на встроенных модулях Node. Для каждой AI-роли можно задать отдельную модель и провайдера.

Стек

Node.js · JavaScript · HTML/CSS · JSON storage · Render

Модели

gpt-4.1-mini · qwen/qwen3.8-27b (Groq) · nvidia/nemotron-3-nano-30b-a3b · nvidia/nvidia-nemotron-nano-9b-v2 · nvidia/llama-3.3-nemotron-super-49b-v1.5


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

README

README.md

Alem — от бизнес-задачи к совместному результату

MVP для HackAlem AI: платформа сотрудничества бизнеса и студенческих команд с AI-помощником для подготовки задач.

1. Какую проблему решает проект

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

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

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

  • Главная страница с объяснением платформы и переходами для бизнеса и команд.
  • Конструктор задачи: описание, уточняющие вопросы AI, редактирование десяти полей, подсказки, счётчик заполнения и предпросмотр.
  • Публикация и редактирование карточки после явного подтверждения пользователем.
  • Оценка полноты задачи от 0 до 100 с разбивкой по критериям.
  • Каталог: поиск по полям карточки, фильтры по теме и готовности, сортировка по готовности, числу откликов или названию.
  • Избранное в localStorage браузера. Навигация, фильтры и незавершённые формы сохраняются в sessionStorage текущей вкладки.
  • Отклики команд: идея, план, срок и ссылка на прототип.
  • Ручной выбор или отклонение команды. Можно выбрать несколько команд.
  • Подтверждение одного этапа по отклику: +25 баллов однократно.
  • Рейтинг команд с общими местами при равных баллах и выделением призовых позиций.
  • AI-студия с описанием ролей и настроенного провайдера.
  • Адаптивный интерфейс, обновление данных без ухода с текущей страницы.
  • Локальный деморежим без API-ключа и сохранение серверных данных между перезапусками.

Как рассчитывается готовность

Это оценка заполненности полей, а не качества идеи или достоверности текста. Непустое поле приносит фиксированные баллы.

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

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

3. Основной пользовательский сценарий

  1. Бизнес вводит описание проблемы в разделе «Создать задачу».
  2. Аналитик выделяет известные сведения, интервьюер задаёт 3–7 уточняющих вопросов.
  3. Пользователь отвечает; редактор собирает карточку. Пользователь проверяет и дополняет поля вручную.
  4. После подтверждения карточка публикуется в каталоге с рассчитанным рейтингом.
  5. Команда находит задачу и отправляет идею, план, срок и ссылку на прототип.
  6. Бизнес рассматривает предложения и выбирает исполнителя вручную.
  7. После подтверждения этапа команда получает 25 баллов, а рейтинг команд обновляется.

AI не публикует задачи, не выбирает исполнителей и не подтверждает выполнение работ.

4. Технологии и AI

КомпонентРеализация
ИнтерфейсHTML, CSS, JavaScript, ES-модули; без UI-фреймворка
СерверNode.js, встроенный node:http
ХранениеJSON-файл, встроенный node:fs
Вызовы AIВстроенный fetch, серверные HTTP-запросы
Тестыnode:test, node:assert/strict
Внешние npm-зависимостиОтсутствуют

Основная конфигурация в .env.example: OpenAI, gpt-4.1-mini для всех трёх ролей. Используется Chat Completions API и строгая JSON Schema. Это три роли приложения с разными промптами, а не три автономных сервиса или Agents SDK.

РольНазначение
АналитикИзвлекает известные поля из исходного описания
ИнтервьюерФормирует 3–7 разных уточняющих вопросов
РедакторСобирает карточку из описания, существующих полей и ответов

Адаптер также поддерживает Groq и NVIDIA. Идентификаторы ниже взяты из кода и конфигурации; наличие адаптера не гарантирует доступность модели у провайдера.

ПровайдерAPIМодели в конфигурации
OpenAIhttps://api.openai.com/v1/chat/completionsgpt-4.1-mini
Groqhttps://api.groq.com/openai/v1/chat/completionsqwen/qwen3.8-27b
NVIDIAhttps://integrate.api.nvidia.com/v1/chat/completionsАналитик: nvidia/nemotron-3-nano-30b-a3b; интервьюер: nvidia/nvidia-nemotron-nano-9b-v2; редактор: nvidia/llama-3.3-nemotron-super-49b-v1.5 из .env.example

Если AI_PROVIDER не задан, адаптер выбирает Groq; штатный запуск через start.mjs использует .env.example, где выбран OpenAI. Автоматического переключения между провайдерами при ошибке нет.

5. Архитектура

Браузер: public/index.html + app.js + style.css
  │  fetch /api/*
  ▼
server.mjs — HTTP API, проверка запросов, сохранение
  ├── domain.mjs — рейтинг, правила выбора и подтверждения этапа
  ├── seed.mjs → data/db.json — начальные и текущие данные
  └── ai.mjs — последовательные вызовы AI-ролей
        └── provider.mjs → API выбранного провайдера

domain.mjs используется и сервером, и интерфейсом для одинакового расчёта рейтинга. Сервер читает JSON при запуске, держит состояние в памяти и сохраняет изменения через временный файл с переименованием.

public/             Интерфейс приложения
server.mjs          HTTP-сервер и API
start.mjs           Проверка Node.js и загрузка .env
provider.mjs        Выбор провайдера, ключа и моделей
ai.mjs              Промпты, вызовы и обработка ответов AI
domain.mjs          Бизнес-правила и проверки карточек
seed.mjs            Синтетические начальные данные
test/               Автоматические проверки
.env.example        Пример конфигурации без ключей
.gitignore          Исключение секретов, данных и логов
START-WINDOWS.cmd   Запуск в Windows
render.yaml         Конфигурация размещения на Render
DEPLOY.md           Дополнительная инструкция по размещению

Основные маршруты:

МетодПутьНазначение
GET/api/healthПроверка работы сервера
GET/api/stateЗадачи, команды, отклики и публичная конфигурация AI
POST/api/ai/analyzeАнализ описания и вопросы
POST/api/ai/composeСборка карточки
POST/api/tasksПубликация или изменение задачи
POST/api/proposalsОтправка отклика
POST/api/decisionРешение по отклику
POST/api/completeПодтверждение этапа

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

Требования

  • Node.js 22.9 или новее; для приведённого ниже режима тестирования рекомендуется Node.js 24.
  • Современный браузер.
  • Для реального AI — интернет, ключ выбранного провайдера, доступ к модели и доступная квота API.

Локальный запуск

  1. Склонируйте репозиторий команды или распакуйте исходный архив.
  2. Откройте терминал в папке, где находится package.json.
  3. Проверьте Node.js и запустите приложение:
node --version
node start.mjs

Установка пакетов и сборка не нужны. Альтернатива при наличии npm: npm start. В Windows можно открыть START-WINDOWS.cmd.

При первом запуске start.mjs создаёт .env из .env.example. Если базы ещё нет, сервер создаёт data/db.json с демонстрационными данными.

  1. Откройте http://localhost:3210.
  2. Оставьте процесс сервера работающим. Для остановки нажмите Ctrl+C в терминале.

Открытие public/index.html двойным щелчком не запускает сервер. Одной статической публикации на GitHub Pages для этого приложения недостаточно.

Подключение OpenAI

В созданном .env задайте:

AI_PROVIDER=openai
OPENAI_API_KEY=ваш_ключ
OPENAI_MODEL=gpt-4.1-mini
PORT=3210

Замените ваш_ключ действительным ключом только локально, затем перезапустите node start.mjs. .env не должен попадать в GitHub. Ключ хранится на сервере и не включается в /api/state.

Статус «Ключ настроен» означает наличие значения в конфигурации, а не успешную проверку ключа у провайдера. Проверка доступа происходит при AI-запросе.

Переменные окружения

ПеременнаяНазначение
AI_PROVIDERopenai, groq или nvidia
OPENAI_API_KEY, GROQ_API_KEY, NVIDIA_API_KEYКлюч выбранного провайдера
OPENAI_MODELОбщая модель OpenAI
OPENAI_MODEL_ANALYST, OPENAI_MODEL_INTERVIEWER, OPENAI_MODEL_EDITORОтдельные модели OpenAI; имеют приоритет над общей
AI_MODEL_ANALYST, AI_MODEL_INTERVIEWER, AI_MODEL_EDITORПереопределение моделей для Groq/NVIDIA; не для OpenAI
NVIDIA_MODEL_ANALYST, NVIDIA_MODEL_INTERVIEWER, NVIDIA_MODEL_EDITORМодели NVIDIA, если не заданы соответствующие AI_MODEL_*
PORTПорт, по умолчанию 3210
HOSTАдрес прослушивания; обычно 127.0.0.1, при RENDER=true — 0.0.0.0
DATA_DIRКаталог JSON-базы; по умолчанию папка data рядом с сервером
PUBLIC_ORIGINРазрешённый публичный origin для POST-запросов, например адрес HTTPS-туннеля
AI_HOURLY_LIMITОбщий лимит AI-операций на процесс за час; по умолчанию 30

Операция анализа делает два последовательных обращения к провайдеру, сборка карточки — одно. Лимит считает операции API приложения, а не отдельные обращения к модели.

Работа без ключа

Оставьте ключ выбранного провайдера пустым. Приложение явно покажет деморежим: вернёт шесть шаблонных вопросов, перенесёт описание в контекст и предложит заполнить карточку вручную. Реальных AI-запросов не будет; автоматического переноса ответов в карточку в этом режиме нет.

7. Как проверить решение жюри

Сценарий воспроизводится без платного API. На чистой базе есть 5 задач, 5 команд и 5 откликов; у команд по 0 баллов. В существующей базе числа могут отличаться.

  1. Откройте «Создать задачу». Введите: Магазин ведёт остатки в Excel. Нужно сократить ошибки учёта товаров. Нажмите «Задать вопросы».

  2. Проверьте появление вопросов. Без ключа это шаблоны; с ключом — ответ выбранного провайдера. Для проверки реального AI ответьте на вопросы и нажмите «Составить карточку из ответов».

  3. Для предсказуемого рейтинга вручную оставьте только эти значения, очистив остальные поля карточки:

    ПолеЗначение
    НазваниеУчёт остатков магазина
    КонтекстМагазин ведёт остатки в Excel.
    ПотребностьНужно сократить ошибки учёта товаров.
    Данные и материалыСинтетическая CSV-таблица с примерами товаров.
  4. Предварительная готовность должна быть 40/100. Подтвердите сведения и опубликуйте карточку. Найдите её в каталоге через поиск.

  5. Выберите «Я — команда», откройте задачу, выберите команду и заполните отклик: идея — Веб-интерфейс учёта; план — Изучить CSV, собрать прототип, проверить сценарии; срок — 14 дней; ссылка — https://example.com (тестовый адрес, не настоящий прототип).

  6. Отправьте предложение. Переключитесь на «Я — бизнес», выберите эту команду и подтвердите этап.

  7. В разделе «Команды» проверьте увеличение баллов выбранной команды на 25. Повторное начисление за тот же отклик недоступно.

  8. Перезапустите сервер: созданная задача, отклик и баллы должны сохраниться в JSON-базе.

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

node --test

В средах, где запрещён запуск дочерних процессов, на Node.js 24:

node --test --test-isolation=none

Тесты проверяют шкалу рейтинга, отклонение некорректных AI-данных, однократное начисление баллов, запросы адаптеров и обработку ошибок, сквозной HTTP-сценарий с сохранением после перезапуска. HTTP-тест использует временную базу и порт 3211, который должен быть свободен. Внешние AI-запросы в тестах заменены заглушками; тесты не подтверждают доступность реальных моделей.

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

  • Начальные задачи, команды, описания и отклики генерируются в seed.mjs. Это синтетические демонстрационные данные, а не реальные клиенты или участники.
  • Упоминание CSV в примерах — текст карточки. Загрузка файлов, чтение CSV и интеграция с Excel не реализованы.
  • Пользовательские задачи, отклики и баллы сохраняются локально в data/db.json.
  • Описание, поля и ответы передаются выбранному AI-провайдеру только при нажатии соответствующих AI-кнопок.
  • Ссылки на прототипы открываются как внешние ссылки. Сервер проверяет HTTP/HTTPS-схему, но не наличие или качество прототипа.
  • Автоматическая синхронизация с GitHub, CRM, университетскими системами и внешними базами отсутствует.

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

  • Нет регистрации, авторизации и серверного разграничения прав. Переключатель «бизнес/команда» — демонстрационный режим, а не защита доступа. Пользователи общего демо могут менять общие данные.
  • Команды предзаданы; создание и редактирование профилей команд не реализованы.
  • JSON-хранилище рассчитано на один серверный процесс. Нет полноценной СУБД, межпроцессной синхронизации и встроенного резервного копирования.
  • В отклике можно подтвердить только один демонстрационный этап. Нет полноценного трекера проекта, чата, уведомлений и проверки фактического выполнения работы.
  • Рейтинг задачи оценивает наличие текста, а не его содержание.
  • AI-поля проверяются на совпадение с точными фрагментами исходных данных. Это ограничивает выдуманные сведения, но может отклонить корректный пересказ. Проверка не гарантирует фактическую истинность текста.
  • AI зависит от доступности провайдера, модели и квоты. Таймаут отдельного вызова — 60 секунд; анализ содержит два последовательных вызова. Ошибки выводятся пользователю.
  • Лимит AI общий для процесса и сбрасывается при перезапуске; это не полноценная защита публичного сервиса от злоупотреблений.
  • Избранное хранится только в конкретном браузере, черновики — в текущей вкладке; синхронизации между устройствами нет.
  • В коде есть проверка origin, типов запросов и ограниченная раздача статических файлов, но они не заменяют авторизацию.
  • На хостинге с непостоянной файловой системой JSON-данные могут теряться при перезапуске или повторном развёртывании.

10. Размещение и демонстрационная версия

В репозитории есть render.yaml и DEPLOY.md, но наличие этих файлов не подтверждает выполненное развёртывание. Постоянный публичный адрес в конфигурации исходного проекта не закреплён.

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

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

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

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

azmmiras 14baarniee 2tleubayev17 1

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

  • 2026-09-23 17:10Rename scenario.test.mjs to test/scenario.test.mjsazmmiras
  • 2026-09-23 17:10Rename openai.test.mjs to test/openai.test.mjsazmmiras
  • 2026-09-23 17:09Rename domain.test.mjs to test/domain.test.mjsazmmiras
  • 2026-09-23 17:09Rename style.css to public/style.cssazmmiras
  • 2026-09-23 17:08Rename index.html to public/index.htmlazmmiras
  • 2026-09-23 17:08Rename app.js to public/app.jsazmmiras
  • 2026-09-23 17:05finalazmmiras
  • 2026-09-23 17:01Delete domain.mjsazmmiras
Все коммиты (17)
  • 2026-09-23 17:01Delete seed.mjsazmmiras
  • 2026-09-23 17:00Delete .gitignoreazmmiras
  • 2026-09-23 16:58finished(?)azmmiras
  • 2026-09-23 15:52Add files via uploadtleubayev17
  • 2026-09-23 14:54Добавить рабочий MVP в разработкеazmmiras
  • 2026-09-23 14:52Update README.mdbaarniee
  • 2026-09-23 14:51Update README.mdbaarniee
  • 2026-09-23 14:43Update README.mdazmmiras
  • 2026-09-23 14:40Create mainazmmiras
Структура репозитория (21 файлов)
.env.example
.gitignore
DEPLOY.md
README.md
START-HERE.txt
START-WINDOWS.cmd
ai.mjs
domain.mjs
main
package.json
provider.mjs
public/app.js
public/index.html
public/style.css
render.yaml
seed.mjs
server.mjs
start.mjs
test/domain.test.mjs
test/openai.test.mjs
test/scenario.test.mjs

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

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

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