AAYMA
RU
Войти

Qadam

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

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

О проекте

Команда: 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.md

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

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

Проект создан для хакатонного кейса AI Sana. AI Sana — постановщик кейса, Qadam — название решения.

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

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

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

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

  • Открытый каталог с поиском, фильтрами по направлению и готовности, сортировкой.
  • Переключение между бизнесом и пятью подготовленными студенческими командами.
  • Конструктор: описание → AI-вопросы → редактируемая карточка из 16 полей.
  • Динамические вопросы через OpenAI и предложения полей на основании ответов.
  • Голосовой ввод описания и ответов: запись → расшифровка → редактирование текста.
  • Чат Qadam AI с контекстом страницы и доступной пользователю задачи.
  • Прогноз готовности и отдельный подтверждённый рейтинг от 0 до 100.
  • Приватные черновики, сохранение в PostgreSQL, подтверждение и публикация.
  • Предложения команд: идея, план, срок и ссылка на прототип.
  • Ручное принятие или отклонение предложений; можно выбрать несколько команд.
  • Передача результата этапа и однократное начисление 10 баллов команде после подтверждения бизнесом.
  • Проверки прав выбранной демо-роли, конфликтов версий и источников AI-предложений.

Рейтинг задачи отражает полноту подтверждённого описания, а не качество идеи. Низкий рейтинг не запрещает публикацию или отклик. Баллы команды начисляются за подтверждённый результат, а не за отправку предложения.

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

  1. Заказчик выбирает роль бизнеса и вводит описание текстом или голосом.
  2. AI задаёт 3–5 вопросов по конкретному описанию.
  3. Ответы превращаются в предложения для карточки. Значения проверяются на наличие в исходном тексте; неподтверждённые предложения отбрасываются.
  4. Заказчик редактирует карточку, подтверждает сведения и публикует задачу. Go рассчитывает рейтинг подтверждённого снимка.
  5. Команда находит задачу и отправляет своё предложение.
  6. Бизнес вручную выбирает команду. Команда передаёт результат этапа со ссылкой, бизнес подтверждает его — начисляются баллы.

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

Технологии

КомпонентРеализация
FrontendVue 3, Composition API, TypeScript, Vite, Pinia, Vue Router
ИнтерфейсСобственный CSS, Lucide, локальный шрифт Manrope
Запись голосаBrowser MediaRecorder API
BackendGo 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.

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

  1. Откройте каталог без роли: изучите подготовленные задачи, поиск и фильтры.

  2. Выберите «Бизнес Qadam» → «Разместить задачу». Название: «Планирование закупок магазина». Введите описание:

    Магазину нужен список закупок. Продажи и остатки хранятся в CSV. Управляющий тратит час на расчёт вручную. Нужен веб-прототип за 14 дней, который готовит список за 10 минут.

  3. Нажмите «Получить AI-вопросы», ответьте и перейдите к карточке. Проверьте предложенные поля. Если AI недоступен, выберите ручное заполнение.

  4. Для проверки голоса запишите короткую русскую фразу и убедитесь, что расшифровка появляется в редактируемом поле. Браузер запросит разрешение микрофона.

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

  6. Выберите студенческую команду в шапке, откройте задачу и отправьте идею, план, срок и ссылку на прототип. Для локальной проверки можно использовать http://127.0.0.1:5173/demo/prototype.html — это явно обозначенный демонстрационный макет.

  7. Вернитесь в роль бизнеса → «Мои задачи» → «Отклики» → выберите команду.

  8. От роли команды передайте результат этапа со ссылкой. От роли бизнеса подтвердите результат. Проверьте появление 10 баллов и сохранение состояния после перезагрузки.

  9. Откройте эмблему 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.

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

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

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

bekasyl jaksylyk 7C45-p3R 7gTurboflex 2Zhaksylyk Bekassyl 1gTurboflex 1

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

  • 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 комментариев

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

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