О проекте
Команда: Vibe Moggers
Кейс HackAlem.ai: Образование — AI Sana
Стадия: Рабочий MVP
Задача кейса: Challenge Hub: превратить задачу бизнеса в задание для студенческих команд
Суть
Платформа, где бизнес с помощью AI превращает свою потребность в структурированную карточку задачи для студенческих команд. Команды откликаются идеей и планом, бизнес выбирает исполнителя, подтверждает результат этапа, и команде начисляются баллы.
Как устроено
Бизнес вводит описание текстом или голосом (расшифровка через OpenAI Transcriptions). LLM задаёт 3–5 уточняющих вопросов, а по ответам предлагает значения для 16 полей карточки. Предложения, которых нет в исходном тексте, отбрасываются. Go-бэкенд считает рейтинг полноты подтверждённого снимка (0–100) и хранит задачи, предложения, этапы и баллы в PostgreSQL. Есть чат Qadam AI с контекстом страницы, демо-роли передаются заголовком X-Demo-Actor.
Ключевые решения
- LLM clarifying questions
- проверка предложений по исходному тексту
- readiness scoring
- voice transcription
- SQL migrations
Особенности
Прогнозный рейтинг готовности отделён от подтверждённого. Баллы начисляются только за подтверждённый бизнесом результат, а не за отклик. AI-предложения полей проверяются на наличие в исходном описании. Голосовой ввод сделан через MediaRecorder и OpenAI Transcriptions. Есть полная Postman-коллекция API.
Стек
Go · net/http · PostgreSQL · Vue 3 · TypeScript · Vite · Pinia · Docker Compose · Vitest · Postman
Модели
GPT-4.1-mini · gpt-4o-mini-transcribe
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-1357219b-vibe-moggers.
README
README.mdQadam — от бизнес-задачи к совместному результату
Qadam помогает бизнесу сформулировать понятную задачу, а студенческим командам — найти проект и предложить решение. AI уточняет описание, рейтинг показывает полноту подтверждённых сведений, а заказчик самостоятельно выбирает исполнителей.
Проект создан для хакатонного кейса AI Sana. AI Sana — постановщик кейса, Qadam — название решения.
Проблема и аудитория
Бизнесу бывает трудно превратить потребность в задание: не хватает описания данных, ожидаемого результата и критериев приёмки. Студенческая команда получает неопределённую задачу и не понимает, с чего начать.
- Бизнес описывает потребность, уточняет детали и проверяет результат работы.
- Студенческая команда выбирает задачу, предлагает план и передаёт результат первого этапа.
Что реализовано
- Открытый каталог с поиском, фильтрами по направлению и готовности, сортировкой.
- Переключение между бизнесом и пятью подготовленными студенческими командами.
- Конструктор: описание → AI-вопросы → редактируемая карточка из 16 полей.
- Динамические вопросы через OpenAI и предложения полей на основании ответов.
- Голосовой ввод описания и ответов: запись → расшифровка → редактирование текста.
- Чат Qadam AI с контекстом страницы и доступной пользователю задачи.
- Прогноз готовности и отдельный подтверждённый рейтинг от 0 до 100.
- Приватные черновики, сохранение в PostgreSQL, подтверждение и публикация.
- Предложения команд: идея, план, срок и ссылка на прототип.
- Ручное принятие или отклонение предложений; можно выбрать несколько команд.
- Передача результата этапа и однократное начисление 10 баллов команде после подтверждения бизнесом.
- Проверки прав выбранной демо-роли, конфликтов версий и источников AI-предложений.
Рейтинг задачи отражает полноту подтверждённого описания, а не качество идеи. Низкий рейтинг не запрещает публикацию или отклик. Баллы команды начисляются за подтверждённый результат, а не за отправку предложения.
Как работает решение
- Заказчик выбирает роль бизнеса и вводит описание текстом или голосом.
- AI задаёт 3–5 вопросов по конкретному описанию.
- Ответы превращаются в предложения для карточки. Значения проверяются на наличие в исходном тексте; неподтверждённые предложения отбрасываются.
- Заказчик редактирует карточку, подтверждает сведения и публикует задачу. Go рассчитывает рейтинг подтверждённого снимка.
- Команда находит задачу и отправляет своё предложение.
- Бизнес вручную выбирает команду. Команда передаёт результат этапа со ссылкой, бизнес подтверждает его — начисляются баллы.
Сохранение рабочих правок само по себе не заменяет публичную карточку: для изменения подтверждённых сведений нужно повторное подтверждение бизнеса.
Технологии
| Компонент | Реализация |
|---|---|
| Frontend | Vue 3, Composition API, TypeScript, Vite, Pinia, Vue Router |
| Интерфейс | Собственный CSS, Lucide, локальный шрифт Manrope |
| Запись голоса | Browser MediaRecorder API |
| Backend | Go 1.23+, net/http, database/sql |
| База данных | PostgreSQL, драйвер lib/pq, встроенные SQL-миграции |
| Конфигурация | .env, godotenv |
| AI-вопросы и чат | OpenAI Responses API, gpt-4.1-mini по умолчанию |
| Расшифровка | OpenAI Audio Transcriptions API, gpt-4o-mini-transcribe по умолчанию; модель настраивается |
| Локальная инфраструктура | Docker Compose; pgAdmin как дополнительный сервис |
| Проверки | Vitest, vue-tsc, Prettier, Go tests, PostgreSQL integration tests |
API-ключ OpenAI находится только на backend.
Архитектура
Браузер: Vue + Pinia
│ REST /api, выбранная демо-роль
▼
Vite proxy → Go API
├── PostgreSQL: задачи, снимки, команды, предложения, этапы, баллы
├── OpenAI Responses: вопросы, карточка, чат
└── OpenAI Audio Transcriptions: голос → текст
frontend/src/pages/— каталог, конструктор, задачи и рабочие пространства.frontend/src/components/— формы, рейтинг, чат и запись голоса.frontend/src/services/— REST-адаптер, преобразование DTO Go и отдельное браузерное демо.backend/internal/tasks/,rating/,offers/,teams/— бизнес-логика и хранение.backend/internal/ai/— AI-запросы, проверка результатов, чат и транскрибация.backend/internal/database/migrations/— миграции PostgreSQL.backend/cmd/api/,seed/,check-ai/— сервер, загрузка демо-данных и проверка AI.docs/— спецификация, данные, сценарии и отчёт интеграции.
По умолчанию frontend работает с реальным Go API. Локальные обозначения ролей преобразуются в X-Demo-Actor: business:UUID / team:UUID. Гость получает только опубликованные снимки. Ошибка API не переключает приложение на вымышленные данные.
Установка и запуск
Требования
- Go 1.23 или новее.
- Node.js 22.12+ и npm.
- Docker Desktop либо Docker Engine с Compose; Docker должен быть запущен.
- Для AI — действующий OpenAI API-ключ с доступом к указанным моделям и квотой.
Команды ниже предназначены для Bash/Zsh. В PowerShell вместо cp -n используйте if (!(Test-Path .env)) { Copy-Item .env.example .env }.
1. Получить проект
git clone https://github.com/BAITC-Hacks/hack-1357219b-vibe-moggers.git
cd hack-1357219b-vibe-moggers
2. Запустить базу и настроить backend
cd backend
docker compose up -d --wait postgres
cp -n .env.example .env
go mod download
В редакторе откройте backend/.env. Для настоящего AI задайте:
OPENAI_API_KEY=ваш_ключ
OPENAI_MODEL=gpt-4.1-mini
OPENAI_TRANSCRIBE_MODEL=gpt-4o-mini-transcribe
AI_MODE=live
DEMO_MODE=true
Остальные значения из .env.example подходят для локального запуска: API на порту 8080, PostgreSQL на 5433. .env исключён из Git. Не помещайте ключ в переменные VITE_*: они попадают в браузер.
Без ключа оставьте AI_MODE=fallback: каталог, ручное заполнение, публикация и работа команд доступны. AI-возможности вернут понятную ошибку; шаблонные вопросы не выдаются за генерацию модели.
3. Загрузить демо-данные и запустить API
Из каталога backend:
go run ./cmd/seed
go run ./cmd/api
Миграции применяются автоматически. Seed добавляет недостающие записи и сохраняет существующие изменения. Проверка сервера: http://127.0.0.1:8080/api/health.
После изменения .env перезапустите Go API. Отдельная проверка ключа и генерации, также из backend:
go run ./cmd/check-ai
4. Запустить frontend
Во втором терминале, из корня проекта:
cd frontend
npm ci
npm run dev
Откройте http://127.0.0.1:5173. Vite проксирует /api на 127.0.0.1:8080. Для другого адреса Go настройте API_PROXY_TARGET по frontend/.env.example и перезапустите Vite.
Для отдельного демо без PostgreSQL установите VITE_DATA_MODE=demo в frontend/.env: данные будут храниться в localStorage. AI-возможности даже в этом режиме требуют работающего Go API.
Как проверить решение жюри
-
Откройте каталог без роли: изучите подготовленные задачи, поиск и фильтры.
-
Выберите «Бизнес Qadam» → «Разместить задачу». Название: «Планирование закупок магазина». Введите описание:
Магазину нужен список закупок. Продажи и остатки хранятся в CSV. Управляющий тратит час на расчёт вручную. Нужен веб-прототип за 14 дней, который готовит список за 10 минут.
-
Нажмите «Получить AI-вопросы», ответьте и перейдите к карточке. Проверьте предложенные поля. Если AI недоступен, выберите ручное заполнение.
-
Для проверки голоса запишите короткую русскую фразу и убедитесь, что расшифровка появляется в редактируемом поле. Браузер запросит разрешение микрофона.
-
Сохраните черновик, подтвердите проверенные сведения и опубликуйте задачу. Сравните прогноз с подтверждённым рейтингом.
-
Выберите студенческую команду в шапке, откройте задачу и отправьте идею, план, срок и ссылку на прототип. Для локальной проверки можно использовать
http://127.0.0.1:5173/demo/prototype.html— это явно обозначенный демонстрационный макет. -
Вернитесь в роль бизнеса → «Мои задачи» → «Отклики» → выберите команду.
-
От роли команды передайте результат этапа со ссылкой. От роли бизнеса подтвердите результат. Проверьте появление 10 баллов и сохранение состояния после перезагрузки.
-
Откройте эмблему Qadam AI, нажмите «Задать вопрос» и спросите: «Какие данные нужны команде для этой задачи?».
Автоматические проверки
Из frontend:
npm test
npm run build
npm run format:check
Из backend, при запущенной PostgreSQL:
go test ./...
TEST_DATABASE_URL='postgres://hackathon:hackathon@localhost:5433/gamified_tasks?sslmode=disable' go test ./... -count=1 -timeout=90s
go vet ./...
go build ./...
В PowerShell переменную задают отдельно: $env:TEST_DATABASE_URL = 'postgres://hackathon:hackathon@localhost:5433/gamified_tasks?sslmode=disable', затем выполняют go test ./... -count=1 -timeout=90s.
Без TEST_DATABASE_URL интеграционные проверки БД пропускаются. С ним тесты используют отдельные временные схемы и не сбрасывают данные приложения. Результаты и границы проверок: docs/INTEGRATION.md.
Данные и интеграции
docs/fixtures/seed.json— синтетические примеры: пять черновиков, пять опубликованных карточек, пять команд и пять предложений. Backend seed и миграции подготавливают локальные данные.- PostgreSQL хранит созданные задачи и результаты действий между перезапусками.
- OpenAI получает описание и ответы для уточнения задачи, доступный контекст для чата и аудиофайл для расшифровки. Текстовые запросы используют
store=false; приложение не сохраняет исходные аудиозаписи. - CSV упоминается в демонстрационном кейсе как материал заказчика. Импорт и обработка бизнес-CSV не реализованы в самой платформе.
- Интеграций с кассами, CRM, оплатой и реальными клиентскими базами нет.
Ограничения текущей версии
- Это хакатонный MVP: нет регистрации, паролей, JWT и производственной аутентификации.
X-Demo-Actor— переключатель для демонстрации, а не подтверждение личности. API слушает127.0.0.1. - AI не выбирает команды, не подтверждает факты и не начисляет баллы. Результаты генерации проверяет пользователь.
- Голос работает по схеме «записать → отправить → получить текст», без непрерывного голосового диалога и озвучки ответов. Запись в браузере ограничена 60 секундами, загрузка на сервер — 15 MiB.
- Русская тестовая запись проверена; точность распознавания зависит от речи и условий записи. Полноценная проверка казахского языка не завершена.
- Для микрофона нужны разрешение браузера и localhost либо HTTPS.
- Доступность и скорость AI зависят от сети, квоты и доступа к моделям. Можно продолжить работу с карточкой вручную.
- Реализован один подтверждаемый этап на предложение; нет платежей, файлового хранилища и полноценного управления проектом.
- Демонстрационные данные и макет прототипа не являются измеренными результатами работы реального бизнеса.
Развёрнутая версия
Подтверждённой ссылки на публично развёрнутую версию в репозитории нет. Для проверки используйте локальный запуск выше. Production-сборка frontend создаётся командой npm run build; её размещение требует отдельно настроенного API и маршрутизации SPA.
Документация
Авторы коммитов
История коммитов
- 2026-09-23 17:50docs: finalize Russian hackathon README and live AI verificationbekasyl jaksylyk
- 2026-09-23 17:33feat: integrate Go API and add AI chat and voice endpointsbekasyl jaksylyk
- 2026-09-23 17:08feat(frontend): add demo roles and voice task flowbekasyl jaksylyk
- 2026-09-23 16:32Merge branch 'main' of https://github.com/BAITC-Hacks/hack-1357219b-vibe-moggersbekasyl jaksylyk
- 2026-09-23 16:27second step on frontbekasyl jaksylyk
- 2026-09-23 16:17Merge branch 'main' of https://github.com/BAITC-Hacks/hack-1357219b-vibe-moggersC45-p3R
- 2026-09-23 16:16completed backendC45-p3R
- 2026-09-23 15:19Merge pull request #3 from BAITC-Hacks/front-devZhaksylyk Bekassyl
Все коммиты (18)
- 2026-09-23 15:14block 2 backendgTurboflex
- 2026-09-23 15:13feat: build Qadam Vue frontend and complete demo workflowbekasyl jaksylyk
- 2026-09-23 14:47Merge pull request #1 from BAITC-Hacks/API-devgTurboflex
- 2026-09-23 14:43Merge pull request #2 from BAITC-Hacks/dev-backendC45-p3R
- 2026-09-23 14:38docs(api): add MVP contract and Postman v3 collectionC45-p3R
- 2026-09-23 13:48feat(backend): set up API and PostgreSQLC45-p3R
- 2026-09-23 13:45first stepbekasyl jaksylyk
- 2026-09-23 13:31chore: got rid of a redundant readmeC45-p3R
- 2026-09-23 13:23chore: scaffold backend structureC45-p3R
- 2026-09-23 12:06text ergungTurboflex
Структура репозитория (160 файлов)
.gitignore DESIGN.md README.md UX-CONTRACT.md backend/.env.example backend/.gitignore backend/README.md backend/cmd/api/main.go backend/cmd/check-ai/main.go backend/cmd/seed/main.go backend/docker-compose.yml backend/docs/.postman/resources.yaml backend/docs/api-request-list.md backend/docs/block2.md backend/docs/postman/README.md backend/docs/postman/collections/Hackathon API/.resources/definition.yaml backend/docs/postman/collections/Hackathon API/01 - Health/.resources/definition.yaml backend/docs/postman/collections/Hackathon API/01 - Health/Health.request.yaml backend/docs/postman/collections/Hackathon API/02 - Business tasks and teams/.resources/definition.yaml backend/docs/postman/collections/Hackathon API/02 - Business tasks and teams/List business tasks.request.yaml backend/docs/postman/collections/Hackathon API/02 - Business tasks and teams/List teams.request.yaml backend/docs/postman/collections/Hackathon API/03 - Task builder/.resources/definition.yaml backend/docs/postman/collections/Hackathon API/03 - Task builder/Confirm card.request.yaml backend/docs/postman/collections/Hackathon API/03 - Task builder/Create draft.request.yaml backend/docs/postman/collections/Hackathon API/03 - Task builder/Edit card.request.yaml backend/docs/postman/collections/Hackathon API/03 - Task builder/Generate card.request.yaml backend/docs/postman/collections/Hackathon API/03 - Task builder/Generate questions.request.yaml backend/docs/postman/collections/Hackathon API/03 - Task builder/Get editable task.request.yaml backend/docs/postman/collections/Hackathon API/03 - Task builder/Publish task.request.yaml backend/docs/postman/collections/Hackathon API/03 - Task builder/Save answers.request.yaml backend/docs/postman/collections/Hackathon API/04 - Catalog and task details/.resources/definition.yaml backend/docs/postman/collections/Hackathon API/04 - Catalog and task details/Browse catalog.request.yaml backend/docs/postman/collections/Hackathon API/04 - Catalog and task details/Get public task.request.yaml backend/docs/postman/collections/Hackathon API/04 - Catalog and task details/Submit proposal.request.yaml backend/docs/postman/collections/Hackathon API/05 - Proposal review/.resources/definition.yaml backend/docs/postman/collections/Hackathon API/05 - Proposal review/Accept proposal.request.yaml backend/docs/postman/collections/Hackathon API/05 - Proposal review/Create second proposal.request.yaml backend/docs/postman/collections/Hackathon API/05 - Proposal review/List proposals.request.yaml backend/docs/postman/collections/Hackathon API/05 - Proposal review/Reject proposal.request.yaml backend/docs/postman/collections/Hackathon API/06 - Verified progress/.resources/definition.yaml backend/docs/postman/collections/Hackathon API/06 - Verified progress/Confirm milestone.request.yaml backend/docs/postman/collections/Hackathon API/06 - Verified progress/Get team points.request.yaml backend/docs/postman/collections/Hackathon API/06 - Verified progress/Submit milestone.request.yaml backend/docs/postman/collections/Hackathon API/07 - Improve readiness/.resources/definition.yaml backend/docs/postman/collections/Hackathon API/07 - Improve readiness/Confirm 95.request.yaml backend/docs/postman/collections/Hackathon API/07 - Improve readiness/Edit to 95.request.yaml backend/docs/postman/collections/Hackathon API/07 - Improve readiness/Priority catalog.request.yaml backend/docs/postman/globals/workspace.globals.yaml backend/docs/verification.md backend/go.mod backend/go.sum backend/internal/ai/.gitkeep backend/internal/ai/ai.go backend/internal/ai/ai_test.go backend/internal/ai/assistant.go backend/internal/ai/assistant_test.go backend/internal/ai/prompt.txt backend/internal/app/app.go backend/internal/app/integration_test.go backend/internal/config/config.go backend/internal/config/config_test.go backend/internal/database/migrate.go backend/internal/database/migrations/001_task_contract.sql backend/internal/database/migrations/002_teams_offers_awards.sql backend/internal/database/migrations/003_task_builder_progress.sql backend/internal/database/postgres.go backend/internal/handlers/.gitkeep backend/internal/httpapi/httpapi.go backend/internal/httpapi/httpapi_test.go backend/internal/models/.gitkeep backend/internal/offers/http.go backend/internal/offers/http_test.go backend/internal/offers/integration_test.go backend/internal/offers/milestones.go backend/internal/offers/proposals.go backend/internal/offers/store.go backend/internal/rating/.gitkeep backend/internal/rating/rating.go backend/internal/rating/rating_test.go backend/internal/repositories/.gitkeep backend/internal/seed/.gitkeep backend/internal/seed/seed.go backend/internal/server/server.go backend/internal/server/server_test.go backend/internal/services/.gitkeep backend/internal/tasks/access.go backend/internal/tasks/http.go backend/internal/tasks/model.go backend/internal/tasks/model_test.go backend/internal/tasks/store.go backend/internal/teams/teams.go backend/internal/testutil/postgres.go backend/scripts/check-postman.cjs backend/scripts/set-openai.ps1 docs/DEMO.md docs/INTEGRATION.md docs/PLAN.md docs/SPEC.md docs/fixtures/seed.json frontend/.env.example frontend/.prettierrc.json frontend/.vite/deps/_metadata.json frontend/.vite/deps/chunk-MVV3MSTN.js frontend/.vite/deps/chunk-MVV3MSTN.js.map frontend/.vite/deps/package.json frontend/.vite/deps/pinia.js frontend/.vite/deps/pinia.js.map frontend/.vite/deps/vue-router.js frontend/.vite/deps/vue-router.js.map frontend/.vite/deps/vue.js frontend/.vite/deps/vue.js.map frontend/AI-CONTRACT.md frontend/API-CONTRACT.md frontend/README.md frontend/index.html frontend/package-lock.json frontend/package.json frontend/public/demo/prototype.html frontend/public/favicon.svg frontend/src/App.vue frontend/src/components/AiAssistant.vue frontend/src/components/AppIcon.vue frontend/src/components/LeaveDialog.vue frontend/src/components/ProposalCard.vue frontend/src/components/ProposalForm.vue frontend/src/components/RoleSwitcher.vue frontend/src/components/ScoreBadge.vue frontend/src/components/ScorePanel.vue frontend/src/components/TaskCard.vue frontend/src/components/VoiceRecorder.vue frontend/src/composables/formControls.ts frontend/src/composables/useTask.ts frontend/src/data/demo.ts frontend/src/domain/scoring.ts frontend/src/domain/types.ts frontend/src/main.ts frontend/src/pages/BusinessTask.vue frontend/src/pages/Catalog.vue frontend/src/pages/HowItWorks.vue frontend/src/pages/NotFound.vue frontend/src/pages/Profile.vue frontend/src/pages/TaskDetails.vue frontend/src/pages/TaskEditor.vue frontend/src/pages/Workspace.vue frontend/src/router.ts frontend/src/services/ai-api.test.ts frontend/src/services/ai-api.ts frontend/src/services/api-contract.test.ts frontend/src/services/api-contract.ts frontend/src/services/demo-api.test.ts frontend/src/services/demo-api.ts frontend/src/services/errors.ts frontend/src/services/http-api.test.ts frontend/src/services/http-api.ts frontend/src/stores/workspace.ts frontend/src/styles.css frontend/tsconfig.json frontend/vite.config.ts main.txt premium-ui.json
Ветки (4)
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.