AI Sana — каталог практических бизнес-задач
Next.js MVP: бизнес описывает задачу, получает уточняющие AI-вопросы, редактирует карточку с живым рейтингом и публикует её в каталог; студенты…
О проекте
Команда: MBA Team
Кейс HackAlem.ai: Образование — AI Sana
Стадия: Рабочий MVP
Задача кейса: Challenge Hub: превратить задачу бизнеса в задание для студенческих команд
Суть
Next.js MVP: бизнес описывает задачу, получает уточняющие AI-вопросы, редактирует карточку с живым рейтингом и публикует её в каталог; студенты откликаются, бизнес вручную выбирает или отклоняет.
Как устроено
POST /api/clarify отправляет описание в OpenAI Responses (gpt-4.1-mini) и получает по JSON Schema ≥3 вопроса и предложенные поля карточки, при ошибке — демо-fallback, лимит 12 запросов/10 мин на IP. Рейтинг считается одной формулой на клиенте и сервере (7 критериев, 0–100), фразы вроде «нет данных» не засчитываются. Задачи, команды и отклики хранятся в SQLite через better-sqlite3.
Ключевые решения
- structured output по JSON Schema
- формула рейтинга готовности
- rate limiting
- rule-based fallback
Стек
Next.js · React · TypeScript · SQLite (better-sqlite3) · Playwright
Модели
gpt-4.1-mini
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-a7c0158c-mba-team.
README
README.mdAI Sana — каталог практических бизнес-задач
MVP по кейсу HackAlem AI. Представитель бизнеса описывает задачу, получает уточняющие вопросы, редактирует карточку и вручную подтверждает публикацию. Студенческие команды видят общий каталог, отправляют предложения, а бизнес сам выбирает или отклоняет каждое из них.
Что работает
- Черновик задачи, уточняющие вопросы и редактируемая карточка с подтверждением публикации; ИИ помогает разобрать описание и предложить поля карточки.
- Предпросмотр рейтинга и подсказок при редактировании; сохранённую карточку можно изменить после публикации.
- Общий каталог с сортировкой по рейтингу и фильтрами по отрасли и уровню готовности.
- Форма отклика, статус предложения, экран бизнес-решений; бизнес вручную выбирает или отклоняет отклики.
- Пять синтетических описаний для демонстрации, пять карточек задач, пять профилей команд и пять примеров откликов.
- Обмен бизнес-данными через SQLite на сервере. Старые записи из
localStorageавтоматически переносятся при открытии приложения.
Стек и хранение
- Next.js App Router, React и TypeScript.
- SQLite через
better-sqlite3. Бизнес-данные и таблицы авторизации находятся вdata/ai-sana.db; файл создаётся автоматически и исключён из Git. - Браузер получает задачи, команды и отклики через API. Браузеры, обращающиеся к одному серверу с постоянным диском, видят общие данные.
- Для MVP используется один Node.js-сервер с постоянным локальным диском. Эфемерная файловая система serverless-хостинга и несколько независимых инстансов не подходят для такого SQLite-хранилища без отдельной общей базы.
Установка и запуск
Требуется Node.js 20.9 или новее.
npm ci
Скопируйте .env.example в .env.local. В PowerShell:
Copy-Item .env.example .env.local
Для настоящего AI-уточнения добавьте OPENAI_API_KEY только в .env.local. Если ключ не задан или API недоступен, используются демонстрационные вопросы. Не отправляйте реальные персональные или конфиденциальные данные в AI.
npm run dev
Откройте http://localhost:3000. Перед показом на другом устройстве запустите приложение на сервере, доступном обоим устройствам; localhost на телефоне указывает на сам телефон, а не на компьютер.
Проверочный сценарий для demo
- На странице «Создать задачу» выберите короткий синтетический пример из списка и нажмите «Найти, чего не хватает».
- Просмотрите не менее трёх вопросов, ответьте на них и перейдите к карточке.
- Меняйте, например, поле «Данные и материалы»: рейтинг и подсказки должны меняться сразу. Формулировки «пока не предоставлены» и «нет данных» не получают баллы за доступные данные.
- Подтвердите публикацию, откройте карточку в каталоге и проверьте рейтинг. Измените её через раздел «Отклики» → «Изменить карточку» и убедитесь, что сохранённый рейтинг и позиция обновились.
- Откройте каталог в другом браузере или на другом устройстве, отправьте отклик и обновите экран откликов бизнеса. Выберите или отклоните предложение вручную.
Для быстрого показа можно использовать опубликованные синтетические задачи и отклики; конструктор предоставляет пять отдельных синтетических черновых описаний.
Формула рейтинга
Баллы начисляются за заполненные поля: контекст и потребность — 20 (по 10 за каждое поле), данные и материалы — 20, ожидаемый результат — 15, критерии успеха — 15, ограничения — 10, пользователи — 10, связь с бизнесом — 10 (по 5 за контакт и формат взаимодействия).
- 0–39 — черновик.
- 40–69 — рабочая.
- 70–89 — готовая.
- 90–100 — приоритетная.
Расчёт одинаков на клиенте и сервере, сервер пересчитывает баллы при создании и редактировании карточки. Явные ответы о недоступности сведений, например «нет данных», «не предоставлены», «пока не определили», считаются незаполненными. Это простая проверка известных формулировок, а не полноценная оценка смысла текста; перед публикацией карточку проверяет человек.
AI и внешние сервисы
POST /api/clarify использует серверный OPENAI_API_KEY, Responses API и по умолчанию модель gpt-4.1-mini. Приложение передаёт исходное описание задачи внешнему API OpenAI и просит вернуть три или более вопросов и предложенные поля карточки по JSON Schema. Ответ валидируется; при ошибке, недоступном API или некорректном JSON возвращается демонстрационный fallback. API-ключ не передаётся в браузер и не должен попадать в GitHub. Маршрут ограничен 12 запросами за 10 минут на клиентский IP.
Доступ и ограничения MVP
- Для короткого demo вход не требуется, отдельного разделения ролей бизнеса и студентов нет. API карточек и решений доступен клиентам приложения; это не система с производственными правами доступа.
- Основной поток предназначен для синтетических или разрешённых к публикации данных. Не загружайте секреты, персональные и конфиденциальные сведения.
- Ограничение частоты запросов — базовая защита для демонстрации, а не защита от целенаправленного злоупотребления.
- Авторизация и подтверждение контакта существуют отдельно, но не обязательны для demo-сценария и не связывают карточки с владельцем.
- Текущие карточки и отклики в одном серверном SQLite доступны всем клиентам этой демонстрации; для публичной эксплуатации потребуются роли, проверка владения, общая управляемая база данных, резервное копирование и защита от злоупотреблений.
- Успешная отправка отклика не назначает команду автоматически; бизнес может выбрать несколько предложений, отклонить их или оставить без решения.
Основные маршруты
/business/new— конструктор задачи./business/tasks/{taskId}/edit— повторное редактирование опубликованной карточки./catalog— общий каталог./catalog/{taskId}/respond— отправка предложения./business/tasks/{taskId}/responses— решения по откликам.src/features/tasks/scoring.ts— общая формула рейтинга.src/lib/app-db.ts— SQLite-хранилище бизнес-данных.
Авторы коммитов
История коммитов
- 2026-09-23 17:57Final projectSeeuagaen
- 2026-09-23 17:28Prepare MVP for submission with live readiness scoring and API limitsBekmuratY
- 2026-09-23 17:13docs: expand README for catalog MVPMyrza
- 2026-09-23 16:46merge: sync latest main into team responsesBekmuratY
- 2026-09-23 16:46Merge remote-tracking branch 'origin/main' into codex/architecture-mvpMyrza
- 2026-09-23 16:43style: improve text contrast and task stepsSeeuagaen
- 2026-09-23 16:43merge: sync MVP demo stabilizationBekmuratY
- 2026-09-23 16:38merge: stabilize MVP demo flowBekmuratY
Все коммиты (35)
- 2026-09-23 16:33chore: finalize HackAlem MVPBekmuratY
- 2026-09-23 16:32feat: stabilize MVP demo flowBekmuratY
- 2026-09-23 15:58fix: polish catalog filters and scoringMyrza
- 2026-09-23 15:37merge: integrate participant one particle interfaceBekmuratY
- 2026-09-23 15:35feat: add particle theme and mobile layoutSeeuagaen
- 2026-09-23 15:29merge: integrate latest catalog and business dashboardBekmuratY
- 2026-09-23 15:27merge: integrate catalog improvementsBekmuratY
- 2026-09-23 15:27merge: integrate interface animationsBekmuratY
- 2026-09-23 15:22feat: add business responses dashboardBekmuratY
- 2026-09-23 15:14fix: harden authentication and protected actionsBekmuratY
- 2026-09-23 15:11Improve catalog scoring and scope stylesMyrza
- 2026-09-23 15:09feat: add cohesive interface animationsSeeuagaen
- 2026-09-23 14:55Merge main into codex/architecture-mvpMyrza
- 2026-09-23 14:50merge: integrate complete HackAlem MVPBekmuratY
- 2026-09-23 14:48fix: restore desktop styles after mergeBekmuratY
- 2026-09-23 14:48merge: preserve all MVP flows with latest UIBekmuratY
- 2026-09-23 14:46feat: polish AI Sana landing and business flowSeeuagaen
- 2026-09-23 14:41Merge remote-tracking branch 'origin/feature/rating-catalog' into codex/architecture-mvpMyrza
- 2026-09-23 14:39feat: add database-backed password authBekmuratY
- 2026-09-23 14:35feat: add email and phone auth entryBekmuratY
- 2026-09-23 14:28feat: connect task catalog with proposalsBekmuratY
- 2026-09-23 14:28merge: integrate business task flowBekmuratY
- 2026-09-23 14:27merge: integrate catalog and readiness scoringBekmuratY
- 2026-09-23 14:27feat: add proposals and business decisionsBekmuratY
- 2026-09-23 14:24feat: implement business task clarification flowSeeuagaen
- 2026-09-23 14:24Implement readiness scoring and task catalogMyrza
- 2026-09-23 13:56Scaffold HackAlem MVP project structureBekmuratY
Структура репозитория (53 файлов)
.env.example .gitignore AGENTS.md CLAUDE.md README.md docs/DEMO.md next.config.ts package-lock.json package.json playwright.config.ts src/app/api/auth/request/route.ts src/app/api/auth/verify/route.ts src/app/api/clarify/route.ts src/app/api/proposals/[proposalId]/route.ts src/app/api/proposals/route.ts src/app/api/tasks/[taskId]/route.ts src/app/api/tasks/route.ts src/app/api/teams/route.ts src/app/auth/page.tsx src/app/business/layout.tsx src/app/business/new/page.tsx src/app/business/responses/page.tsx src/app/business/tasks/[taskId]/edit/page.tsx src/app/business/tasks/[taskId]/responses/page.tsx src/app/catalog/[taskId]/layout.tsx src/app/catalog/[taskId]/respond/page.tsx src/app/catalog/[taskId]/responses/[proposalId]/page.tsx src/app/catalog/catalog.module.css src/app/catalog/catalog.tsx src/app/catalog/page.tsx src/app/globals.css src/app/layout.tsx src/app/page.tsx src/components/ParticleBackground.tsx src/features/demo/DemoDataInitializer.tsx src/features/proposals/BusinessResponsesDashboard.tsx src/features/proposals/ProposalForm.tsx src/features/proposals/ProposalStatus.tsx src/features/proposals/ResponseManager.tsx src/features/proposals/types.ts src/features/tasks/TaskEditor.tsx src/features/tasks/TaskFieldsEditor.tsx src/features/tasks/TaskReadinessPreview.tsx src/features/tasks/scoring.ts src/features/tasks/types.ts src/lib/app-db.ts src/lib/auth-db.ts src/lib/demo-data.ts src/lib/storage.ts src/lib/use-shared-collection.ts src/types/particles-js.d.ts tests/submission.spec.ts tsconfig.json
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.