Larda
Платформа в духе Challenge Hub: бизнес описывает проблему, ИИ задаёт уточняющие вопросы и готовит карточку задачи, студенческие команды подают…
О проекте
Команда: Larda
Кейс HackAlem.ai: Образование — AI Sana
Стадия: Рабочий MVP
Задача кейса: Challenge Hub: превратить задачу бизнеса в задание для студенческих команд
Суть
Платформа в духе Challenge Hub: бизнес описывает проблему, ИИ задаёт уточняющие вопросы и готовит карточку задачи, студенческие команды подают заявки, бизнес выбирает команду, задаёт этапы и принимает результат, а студенты получают XP и портфолио.
Как устроено
Пошаговый мастер: описание → вопросы ИИ → карточка → оценка готовности → публикация. API на Go (Gin) сохраняет AI-задание в PostgreSQL, воркер в том же процессе вызывает OpenAI Responses API со строгими JSON-схемами Structured Outputs и проверяет ответ, frontend опрашивает статус. Есть явный режим AI_MODE=fallback с детерминированными вопросами. Бизнес-правила (роли, владение, переходы состояний, транзакционное начисление XP без дублей) реализованы по архитектуре ports/adapters.
Ключевые решения
- Structured Outputs JSON Schema
- async DB-backed AI worker
- deterministic fallback
- gamification XP
- hexagonal architecture
Особенности
Асинхронная обработка ИИ через очередь в PostgreSQL без Redis и брокера. Ошибка модели не подменяется fallback незаметно, источник оценки сохраняется.
Стек
Go · Gin · GORM · PostgreSQL 16 · React 19 · React Router 7 · TypeScript · Vite 8 · Docker Compose · nginx · Playwright
Модели
gpt-6-luna · gpt-4o-mini
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-5ab9a461-larda.
README
README.mdLarda — от бизнес-проблемы к подтверждённому опыту
Платформа для хакатона AI Sana / HackAlem, которая соединяет задачи малого и среднего бизнеса со студенческими командами. ИИ помогает подготовить понятную постановку задачи, бизнес контролирует выполнение и принимает результат, а студенты накапливают опыт и портфолио выполненных командных проектов.
Проект — работающий MVP на React, Go и PostgreSQL. Основной сценарий проходит через настоящий API и базу данных. Вход демонстрационный: пользователь выбирает профиль бизнеса, капитана или участника команды.
1. Проблема и аудитория
Бизнесу нужно превратить практическую проблему в задачу с понятным результатом: описать контекст, доступные данные, ограничения и критерии приёмки. Студентам нужны прикладные проекты, в которых можно предложить решение, показать результат и получить подтверждение выполненной работы.
Larda объединяет эти действия в одном процессе:
- Для бизнеса: подготовка задачи с помощью ИИ, предложения команд, согласованные этапы и ручная приёмка.
- Для студентов: каталог задач, подача командной заявки, сдача результата по ссылке, XP, достижения и завершённые проекты.
- Для демонстрации на хакатоне: смена ролей позволяет показать весь цикл в одном браузере.
2. Что реализовано
Кабинет бизнеса
- Отдельные разделы «Рабочий стол», «Мои задачи», «Отклики и проекты».
- Пошаговое создание задачи: описание → уточняющие вопросы → проверка карточки → публикация.
- Асинхронная обработка ИИ: генерация вопросов, подготовка карточки, оценка готовности. Ошибку можно увидеть и повторить обработку явно.
- Редактирование и подтверждение версии карточки. Черновик не попадает в публичный каталог; опубликованные изменения становятся публичными после подтверждения.
- Рассмотрение заявок, выбор и отклонение команд.
- Добавление этапов с описанием результата и наградой, принятие результата или возврат на доработку.
- Очередь результатов на проверке и новых заявок; отдельное завершение работы команды и всей задачи.
Кабинет студента
- Каталог с поиском и фильтрами, включая готовность и открытые для заявок задачи.
- Подача заявки капитаном команды: идея решения, план, срок в днях и необязательная ссылка на прототип.
- Пошаговая форма с кнопкой «Назад» и сохранением ввода между шагами.
- Просмотр заявок, проектов и согласованных этапов; отправка HTTP(S)-ссылки на результат, повторная сдача после доработки.
- «Мой прогресс»: уровень по серверному XP, достижения, навыки профиля и завершённые проекты со ссылками на принятые результаты.
Общие возможности
- Единый адаптивный светлый интерфейс, клавиатурная навигация и поддержка reduced motion.
- Данные сохраняются в PostgreSQL; профиль, раздел и задача отражаются в URL.
- Сервер проверяет роли, владение задачей, членство команды и допустимые переходы состояний.
- Принятие результата и начисление опыта выполняются транзакционно; повторная приёмка не выдаёт награду дважды.
- Низкая готовность карточки не блокирует публикацию или заявку. Готовность постановки и прогресс исполнения — разные показатели.
Правила серверного MVP: принятие заявки начинает работу команды; на задачу допустимы несколько команд, число этапов произвольное. Награда этапа делится между текущими участниками команды. Дополнительные награды и достижения определяются backend. Интерфейс не начисляет XP самостоятельно.
3. Как работает решение
flowchart LR
A[Описание проблемы бизнеса] --> B[ИИ: вопросы и карточка]
B --> C[Проверка фактов и публикация]
C --> D[Заявка студенческой команды]
D --> E[Выбор команды и этапы]
E --> F[Ссылка на результат]
F --> G{Решение бизнеса}
G -->|Доработка| F
G -->|Принято| H[Принятый этап и XP]
H --> I[Завершение проекта и портфолио]
ИИ помогает подготовить постановку. Факты подтверждает бизнес; выбор команды и приёмку также выполняет человек. Ссылка на результат и запись о принятии связывают работу команды с её профессиональным опытом. Подтверждение в MVP — действие выбранного демопрофиля бизнеса, а не внешняя проверка компании.
4. Технологии
| Компонент | Используемые технологии |
|---|---|
| Frontend | TypeScript, React 19, React Router 7, Vite 8, CSS |
| Backend | Go 1.26.8, Gin, GORM, PostgreSQL-драйвер pgx |
| Хранение | PostgreSQL 16, SQL-миграции, транзакции |
| ИИ | OpenAI Responses API, строгие JSON-схемы Structured Outputs, серверная проверка ответа |
| Контейнеризация | Docker Compose, многоэтапные Dockerfile, nginx 1.28; Node.js 22 для сборки frontend |
| Проверки | Playwright, Go testing, интеграционные тесты PostgreSQL, go vet |
Версии frontend-зависимостей зафиксированы в package-lock.json, backend — в go.mod и go.sum.
Модель и режимы ИИ
Модель задаётся через OPENAI_MODEL, адрес API — через OPENAI_BASE_URL. В текущем .env.example указано gpt-6-luna; значение по умолчанию в Go/Compose при отсутствии настройки — gpt-4o-mini. Это параметры конфигурации: для внешнего запуска необходимо указать модель, доступную вашему API-ключу и поддерживающую используемый формат ответа.
AI_MODE=openai— backend вызывает внешний API. Нужны ключ и доступ к сети.AI_MODE=fallback— явный локальный помощник без обращения к модели: детерминированные вопросы, подготовка карточки и проверка заполненности. Он обозначен как демо-режим.
Ошибка OpenAI не переключает систему в fallback автоматически. /api/v1/runtime показывает настроенный режим; источник конкретной оценки сохраняется в задаче. Старый источник fallback не меняется только от перезапуска сервера.
5. Архитектура
flowchart TB
Browser[Браузер: React] --> Web[web: nginx / статическая сборка]
Web -->|/api| API[api: Go / Gin]
API --> UseCases[Сценарии и бизнес-правила]
UseCases --> DB[(db: PostgreSQL)]
Worker[Worker ИИ в процессе Go] --> DB
Worker --> Adapter[AI-адаптер]
Adapter --> OpenAI[OpenAI Responses API]
Adapter --> Fallback[Явный локальный fallback]
API сохраняет запрос на обработку в БД и возвращает управление браузеру. Worker обрабатывает AI-задание, сохраняет результат и статус; frontend опрашивает сервер. Отдельные Redis, брокер сообщений или сервис ИИ для этого не требуются.
| Путь | Назначение |
|---|---|
src/features/connected/ | Основные серверные экраны, пошаговые формы, сдача и приёмка этапов |
src/data/ | HTTP-клиент, загрузка серверных данных и отдельный локальный репозиторий |
src/shared/ | Общие контролы и компоненты анимации |
src/app/, src/domain/ | Маршруты и правила сохранённого локального демо; часть общих вычислений |
cmd/api/ | Запуск API, подключение БД, миграции, seed и worker |
internal/application/, internal/domain/ | Серверные сценарии и бизнес-правила |
internal/ports/, internal/adapters/ | Контракты, HTTP, PostgreSQL и AI-адаптеры |
migrations/ | SQL-миграции схемы |
tests/ | Frontend-, контрактные и сквозные проверки |
docs/openapi.yaml | Контракт REST API |
В разработке Vite проксирует /api на backend. В Compose эту роль выполняет nginx. Ключ модели хранится на backend и не включается в frontend-сборку.
6. Установка и запуск
Через Docker Compose — основной способ для жюри
Нужны Git, Docker Engine или Docker Desktop с Compose и свободные порты. Команды ниже выполняются в Bash/Zsh из корня полученной копии репозитория; Node.js и Go на хосте не требуются.
1. Создайте конфигурацию, если её ещё нет:
Конфигурацию создавать не нужно для удобства тестирования залит env с действующим api ключом
2. Выберите режим в .env:
Для воспроизводимой демонстрации без ключа и внешних запросов:
AI_MODE=fallback
SEED_DEMO=true
Для проверки внешнего ИИ задайте AI_MODE=openai, свой OPENAI_API_KEY и доступный OPENAI_MODEL. Не публикуйте .env и не помещайте ключ в переменные VITE_*.
3. Соберите и запустите весь стек:
WEB_PORT=3001 HTTP_PORT=8081 POSTGRES_PORT=5433 \
docker compose up --build --force-recreate -d --wait
Если на Linux доступ к Docker socket требует sudo, используйте вместо предыдущей команды:
sudo env WEB_PORT=3000 HTTP_PORT=8080 POSTGRES_PORT=5432 \
docker compose up --build --force-recreate -d --wait
Эти порты выбраны для отделения от локальных запусков на 3000/8080. Используйте те же значения при следующем up либо сохраните их в .env. Compose поднимает PostgreSQL, применяет миграции, заполняет пустую БД демонстрационными данными и запускает API и frontend.
4. Откройте http://127.0.0.1:3001. Отдельный npm run dev для Docker не нужен.
5. Проверьте состояние:
docker compose ps
curl http://127.0.0.1:3001/healthz
curl http://127.0.0.1:3001/api/v1/runtime
Ожидается {"status":"ok"} и выбранный ai_mode. У db, api, web предусмотрены healthcheck. Успешный healthcheck не доказывает успешность запроса к модели: дождитесь вопросов и карточки в пользовательском сценарии.
При ошибке:
docker compose logs --tail=100 api web
Для остановки с сохранением данных:
docker compose stop
Если требуется, добавляйте sudo к Docker-командам; curl его не требует. Не используйте down -v, если нужно сохранить БД.
CORS: Compose автоматически разрешает localhost и 127.0.0.1 своего WEB_PORT, а также Vite на 5173. Для другого домена задайте точный origin в CORS_ORIGINS. После изменения конфигурации пересоздайте контейнеры; простой restart не применяет новые переменные.
Разработка frontend
При уже запущенном Docker API на 8080 установите Node.js 22 и выполните:
npm ci
API_PROXY_TARGET=http://127.0.0.1:8080 npm run dev
Откройте адрес из вывода Vite, обычно http://localhost:5173. Сборка: npm run build. Запуск Go вне Docker требует версии из go.mod, доступной PostgreSQL и настроенного DATABASE_URL: подробная инструкция.
7. Как проверить решение: сценарий для жюри
После первого запуска с SEED_DEMO=true доступны профили «Бизнес», «Капитан» и «Студент». Выбирайте их в верхней части страницы. Для заявки и сдачи результата нужен именно капитан.
Пример: учёт списаний в кофейне
-
Бизнес: нажмите «Создать задачу» и введите:
Учебный пример: небольшая кофейня ведёт остатки молока в таблице и хочет видеть причины списаний. Нужен веб-прототип с вводом списания и недельным отчётом. Для демонстрации используем обезличенные тестовые данные.
-
Дождитесь уточнений и ответьте на каждый вопрос. Можно использовать учебные условия: пользователи — менеджеры; данные — тестовая CSV-таблица; результат — прототип; критерий — запись списания появляется в недельном отчёте; срок — две недели; обратная связь — демонстрация после этапа. Если сведений нет, укажите, что их нужно уточнить. Проверьте работу «Назад».
-
Нажмите «Подготовить карточку». Проверьте текст, при необходимости сохраните правки и дождитесь оценки. Отметьте «Я проверил факты в карточке», подтвердите и отдельно опубликуйте задачу.
-
Капитан: найдите задачу в каталоге, нажмите «Подать заявку», выберите команду. Идея: «Веб-прототип учёта списаний». План: «Изучить CSV, сделать форму ввода, добавить недельный отчёт». Срок: 7 дней. Проверьте и отправьте заявку.
-
Бизнес: откройте «Заявки и результаты», выберите команду. Нажмите «Добавить этап»: название — «Рабочий прототип»; критерий — «Запись списания отображается в отчёте за неделю». Сохраните этап.
-
Капитан: во вкладке «Моя команда» нажмите «Сдать этап» и укажите HTTP(S)-ссылку на подготовленный репозиторий, прототип или демонстрационный материал.
-
Бизнес: сначала верните результат на доработку. Капитан: исправьте результат и отправьте ссылку повторно. Бизнес: примите результат, завершите работу команды и подтвердите завершение всей задачи.
-
Капитан: откройте «Мой прогресс». Проверьте XP, завершённый проект и ссылку на принятый результат. Обновите страницу: сохранённые записи остаются в БД.
Ожидаемый результат: опубликованная задача, сохранённая заявка, принятый этап, завершённый проект и серверный опыт команды. Заявка и возвращённый на доработку результат сами по себе не начисляют студенческий XP. Итоговое число баллов зависит от награды этапа, состава команды и уже открытых достижений.
Для быстрого показа без подготовки новой карточки можно открыть одну из начальных опубликованных задач и продолжить с заявками. Начальные записи — синтетические и не подтверждают наличие реального заказчика.
Автоматические проверки
npm ci
npx playwright install chromium
npm run build
npm run test:e2e
go test ./...
go vet ./...
test:e2e покрывает локальные правила и браузерные сценарии, включая HTTP-подмены. Для Go-команд нужен Go из go.mod; PostgreSQL integration tests требуют отдельного TEST_DATABASE_URL.
Сквозной тест с настоящей БД и API запускается отдельно:
API_PROXY_TARGET=http://127.0.0.1:8180 npm run test:live
Перед этим нужен отдельный тестовый API на 8180 с AI_MODE=fallback, своей БД и разрешённым origin http://127.0.0.1:4175. Команда сама API не запускает и создаёт тестовые записи. Не подключайте fallback-worker к БД работающего OpenAI-worker: они читают общую очередь. Оба набора Playwright используют порт 4175, поэтому запускаются последовательно. История фактических проверок — в progress.md.
8. Данные и интеграции
| Источник | Что используется |
|---|---|
| Ввод бизнеса | Описание проблемы, ответы, подтверждённые условия и решения о приёмке |
| Ввод команды | Идея, план, срок и ссылки на результаты |
| PostgreSQL | Пользователи, команды, задачи, заявки, этапы, AI-задания, XP и достижения |
| OpenAI Responses API | Обработка постановки задачи при AI_MODE=openai; описание и ответы передаются настроенному провайдеру |
| Seed | Три демопрофиля, пять команд, пять опубликованных задач с заявками и пять приватных примерных черновиков |
| Внешние ссылки | Артефакты работы; платформа сохраняет URL, а не загружает и не анализирует содержимое файлов |
Seed заполняет пустую пользовательскую БД один раз. Оба студента входят во все пять демонстрационных команд. Примерные черновики не запускают платные AI-задания автоматически: для них предусмотрен явный повтор обработки.
REST API описан в OpenAPI. Полученные Postman-файлы находятся в docs/from backend. Интеграции с CRM, LMS, платёжными системами и автоматический импорт реальных бизнес-задач в текущем сценарии не реализованы.
9. Ограничения текущей версии
- Нет полноценной аутентификации:
X-Demo-User-IDвыбирает профиль. Проверки ролей существуют, но переключатель не подтверждает личность пользователя или компании. - Начальные данные синтетические. Приёмка означает запись решения демопрофиля бизнеса, а не независимый аудит результата.
- Командная награда: сервер не хранит подтверждённый личный вклад каждого студента. Навыки профиля не равны верифицированному владению навыком.
- Расширенные RPG-правила отделены: ранги E–S, фиксированные три этапа, сроки, версии сдачи и персональная атрибуция есть в локальном демо, но не представлены как возможности основного серверного интерфейса.
- Ограниченный UI: нет экранов управления составом команд, загрузки файлов, чата, полноценных уведомлений и управления отменой проектов. Наличие отдельных операций API не означает наличие соответствующего экрана.
- Нет полноценных истории версий результата и комментария при доработке в серверном сценарии: сдаётся ссылка, решение о приёмке — принять или вернуть.
- Каталог в текущем frontend загружает до 100 задач. Несохранённый ввод может потеряться при refresh или уходе в другой раздел.
- ИИ не гарантирует достоверность формулировок или бизнес-эффект. Нужна проверка человеком; доступность внешней модели зависит от настроек, ключа и сети.
- Метрики надёжности, численные уровни навыков, публичный рейтинг участников и финансовый эффект не заявлены как реализованные.
Отдельное локальное демо
npm ci
npm run dev:local
Этот режим работает через sessionStorage, без backend и внешнего ИИ. Он демонстрирует расширенную геймификацию; его записи и правила не синхронизируются с PostgreSQL. При ошибке серверного API приложение не переключается на него автоматически. Подробности: правила геймификации.
10. Развёрнутая версия и документация
Публичный адрес deployed-версии в текущем репозитории не указан. Адрес http://127.0.0.1:3001 доступен только на машине, где выполнен Docker-запуск выше, и не является публичной ссылкой для жюри.
Авторы коммитов
История коммитов
- 2026-09-23 17:57Remove outdated testing instructions from READMEablatieyv
- 2026-09-23 17:56Update README to correct Docker API port and add testing instructionsablatieyv
- 2026-09-23 17:54Update Docker environment variables for consistencyablatieyv
- 2026-09-23 17:50Update .env and README for testing convenienceablatieyv
- 2026-09-23 17:48add env for testing by hackalem staffablatieyv
- 2026-09-23 17:45Fixing bugsdench1k1ng
- 2026-09-23 17:42Update READMEdench1k1ng
- 2026-09-23 17:34fixing creation of task buzinessdench1k1ng
Все коммиты (25)
- 2026-09-23 17:07Testing of MVPdench1k1ng
- 2026-09-23 17:06Merge latest origin/main AI adapter updates into feat/gamification-mvpdench1k1ng
- 2026-09-23 17:05Refactor OpenAI adapter for improved error handling and response validationablatieyv
- 2026-09-23 16:46Merge origin/main backend into feat/gamification-mvpdench1k1ng
- 2026-09-23 16:43update a core of ideadench1k1ng
- 2026-09-23 16:27Refactor code structure for improved readability and maintainabilityablatieyv
- 2026-09-23 16:12Add Postman environment configuration for local demo setupablatieyv
- 2026-09-23 16:03Add more features for prototypedench1k1ng
- 2026-09-23 15:59Refactor code structure for improved readability and maintainabilityablatieyv
- 2026-09-23 15:56feat: add domain rules and evaluation logicablatieyv
- 2026-09-23 15:19Update READMEdench1k1ng
- 2026-09-23 15:09erd of the dbablatieyv
- 2026-09-23 14:59edit READMEablatieyv
- 2026-09-23 14:44Add a prototype of frontenddench1k1ng
- 2026-09-23 14:27Update README: how to run a frontenddench1k1ng
- 2026-09-23 13:53add team membersablatieyv
- 2026-09-23 13:40add Denis name in READMEdench1k1ng
Структура репозитория (130 файлов)
.dockerignore .env .env.example .gitignore AGENTS.md BACKEND.md Dockerfile Dockerfile.frontend ERD.md Larda project task.docx README.md Task.md agent.md cmd/api/main.go compose.test.yaml compose.yaml contextn.md docs/AI_CONNECTION.md docs/BACKEND_INTEGRATION.md docs/DOCKER_QUICKSTART.md docs/ERD_REVIEW.md docs/FRONTEND.md docs/GAMIFICATION.md docs/RUN_INTEGRATED.md docs/from backend/Larda.postman_collection.json docs/from backend/Larda.postman_environment.json docs/from backend/for_frontend (2).md docs/from backend/for_frontend.md docs/from backend/json.md docs/openapi.yaml for_frontend.md go.mod go.sum index.html internal/adapters/ai/errors.go internal/adapters/ai/fallback.go internal/adapters/ai/fallback_test.go internal/adapters/ai/openai.go internal/adapters/ai/openai_test.go internal/adapters/ai/prompts.go internal/adapters/ai/schema.go internal/adapters/httpapi/http.go internal/adapters/httpapi/http_test.go internal/adapters/httpapi/tasks.go internal/adapters/httpapi/workflows.go internal/adapters/postgres/repository.go internal/adapters/postgres/seed.go internal/adapters/postgres/tasks_integration_test.go internal/adapters/postgres/workflows.go internal/adapters/postgres/workflows_integration_test.go internal/application/service.go internal/application/tasks.go internal/application/workflows.go internal/application/workflows_test.go internal/config/config.go internal/config/config_test.go internal/domain/models.go internal/domain/rules.go internal/domain/rules_test.go internal/ports/ports.go json.md migrations/000001_init.down.sql migrations/000001_init.up.sql migrations/000002_ai_and_milestone_approval.down.sql migrations/000002_ai_and_milestone_approval.up.sql migrations/embed.go nginx.conf package-lock.json package.json playwright.config.ts playwright.live.config.ts postman/Larda.postman_collection.json postman/Larda.postman_environment.json progress.md scripts/demo.ps1 src/App.tsx src/app/AppShell.tsx src/app/WorkspaceProvider.tsx src/app/routes.tsx src/data/WorkspaceRepository.ts src/data/backendClient.ts src/data/fixtures.ts src/data/migration.ts src/data/mockRepository.ts src/data/progressionExample.ts src/data/serverWorkspace.ts src/domain/assistant.ts src/domain/businessQueue.ts src/domain/models.ts src/domain/progression.ts src/domain/projectRules.ts src/domain/taskRules.ts src/features/business/BusinessDashboard.tsx src/features/business/BusinessPage.tsx src/features/business/RolePage.tsx src/features/catalog/CatalogPage.tsx src/features/catalog/TaskDetail.tsx src/features/connected/ConnectedPage.tsx src/features/connected/DeliveryPanel.tsx src/features/connected/ProposalWizard.tsx src/features/connected/ServerOverview.tsx src/features/connected/TaskWizard.tsx src/features/connected/useRemoteWorkspace.ts src/features/connected/workspace.css src/features/projects/ProjectPage.tsx src/features/proposals/ResponsesPage.tsx src/features/student/StudentPage.tsx src/features/tasks/TaskBuilder.tsx src/features/tasks/TaskReview.tsx src/main.tsx src/shared/motion/AnimatedProgress.tsx src/shared/motion/ResponseCount.tsx src/shared/motion/SaveConfirmation.tsx src/shared/motion/motion.css src/shared/motion/useReducedMotion.ts src/shared/ui/TaskBrief.tsx src/shared/ui/controls.tsx src/styles.css src/vite-env.d.ts tests/connected-navigation.spec.ts tests/connected.spec.ts tests/domain.spec.ts tests/live-integration.spec.ts tests/progression.spec.ts tests/remote-data.spec.ts tests/student-navigation.spec.ts tests/workspace.spec.ts tsconfig.json tsconfig.node.json vite.config.ts
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.