Iskra
Веб-платформа, где бизнес описывает проблему, а Gemini за три раунда уточняющих вопросов собирает из неё карточку задачи с рейтингом.
О проекте
Команда: Талас
Кейс HackAlem.ai: Образование — AI Sana
Стадия: Рабочий MVP
Задача кейса: Challenge Hub: превратить задачу бизнеса в задание для студенческих команд
Суть
Веб-платформа, где бизнес описывает проблему, а Gemini за три раунда уточняющих вопросов собирает из неё карточку задачи с рейтингом. Карточку публикуют в каталог, и студенческие команды откликаются на неё со своими решениями.
Как устроено
Пользователь вводит категорию, название и свободное описание. Backend на FastAPI передаёт в Gemini описание вместе с историей ответов и получает JSON: либо вопросы следующего раунда, либо готовую карточку с рейтингом и флагом ready. После проверки и правки черновик публикуется в серверный каталог; хранилище сделано на словарях в памяти. Фронтенд на Next.js показывает поиск, фильтры, разбивку рейтинга и форму отклика команды. Заполненность карточки браузер считает отдельно, по фиксированным весам.
Ключевые решения
- многораундовое уточнение (3 блока вопросов)
- structured JSON output
- рейтинг заполненности по весам
- in-memory storage
Особенности
Честный раздел ограничений: переход с OpenAI на Gemini не завершён, публикация по порогу рейтинга не проверяется, у рейтинга два источника. Даны пошаговые сценарии проверки: с API-ключом и без него, на трёх встроенных карточках.
Стек
Python · FastAPI · Next.js · TypeScript · React · Docker Compose · GitHub Actions · pytest · ruff
Модели
gemini-1.5-flash · gemini-2.5-flash
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-99d4c8fe-team.
README
README.md| POST /api/task-drafts/{draft_id}/answers | Оценка ответов и следующий шаг |
| POST /api/task-drafts/{draft_id}/publish | Публикация готового черновика |
| GET /api/tasks | Получение серверного каталога |
| DELETE /api/tasks/{task_id} | Удаление серверной задачи |
Установка и запуск
Требования
- Git и доступ к репозиторию: на момент анализа репозиторий приватный.
- Node.js 22 и npm; Python 3.12 — версии, используемые в CI.
- Для полного AI-сценария — ключ Gemini API, доступ к указанным в коде моделям и интернет-соединение backend.
Ниже приведены команды для PowerShell. Файлов .env.example в проверенной версии нет, поэтому конфигурация создаётся вручную. Промпты уже находятся в backend/app/services/ai_service.py.
1. Получить проект
git clone https://github.com/BAITC-Hacks/hack-99d4c8fe-team.git
cd hack-99d4c8fe-team
2. Подготовить backend
cd backend
py -3.12 -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r requirements.txt
.\.venv\Scripts\python.exe -m pip install google-genai
Создайте файл backend/.env со следующим содержимым, заменив значение ключа:
GEMINI_API_KEY=YOUR_GEMINI_API_KEY
FRONTEND_ORIGIN=http://localhost:3000
Ключ используется только backend. Не помещайте его в переменные NEXT_PUBLIC_*.
Запустите сервер из каталога backend:
.\.venv\Scripts\python.exe -m uvicorn app.main:app --reload --port 8000
- Проверка процесса: http://localhost:8000/api/health.
- Интерактивная документация API: http://localhost:8000/docs.
Ожидаемый ответ проверки процесса — {"status":"ok"}. Он не проверяет ключ и доступность Gemini.
3. Запустить frontend
Откройте второй терминал в корне клонированного репозитория:
cd frontend
npm ci
Set-Content -Path .env.local -Value 'NEXT_PUBLIC_API_BASE_URL=http://localhost:8000' -Encoding utf8
npm run dev
Откройте http://localhost:3000. После изменения .env.local перезапустите frontend.
Для локального запуска production-сборки frontend вместо npm run dev:
npm run build
npm run start
Backend при этом запускается отдельно.
Режим демонстрации без AI
Для просмотра каталога достаточно запустить frontend. Три встроенные карточки доступны даже при недоступном backend; можно проверить поиск, фильтры и форму предложения команды. Создание новой задачи требует работающего backend и Gemini API.
Как проверить решение
Сценарий A: интерфейс без API-ключа
- Запустите frontend и перейдите в «Каталог задач».
- Найдите задачу «Снизить пищевые отходы в кампусе» через поиск или категорию «Экология».
- Откройте карточку, проверьте описание, поля задачи и расшифровку рейтинга.
- Нажмите «Предложить решение». Укажите команду «Тестовая команда», идею «Вести журнал остатков еды» и план «Собрать данные за неделю и подготовить прототип учёта».
- Отправьте форму: число откликов у карточки должно увеличиться в текущем сеансе.
Это проверка локального интерфейса. Изменения демонстрационных карточек sample-* не сохраняются после перезагрузки страницы; отправка формы не означает доставку отклика другому пользователю.
Сценарий B: от описания до публикации
Требуется настроенный Gemini API с доступом к обеим моделям, указанным в исходном коде.
-
Запустите frontend и backend; убедитесь, что
/api/healthотвечает{"status":"ok"}. -
Нажмите «Создать задачу», выберите «Экология» и введите название «Учёт пищевых остатков в столовой».
-
Вставьте тестовое описание:
В столовой кампуса ежедневно остаётся еда, но объём списаний не фиксируется. Нужен веб-прототип для сотрудников столовой, чтобы записывать остатки по блюдам и видеть недельный отчёт. Для пилота предоставим обезличенную таблицу за неделю. Новое оборудование покупать нельзя. Ожидаемый результат — форма ввода и сводный отчёт. Критерий проверки — сотрудник может внести остатки и получить итоги за выбранную неделю. Контакт: [email protected]. Формат работы — еженедельная встреча с командой.
-
Ответьте на все вопросы каждого из трёх блоков. Формулировки зависят от модели. Если она запросит дополнительные сведения, дополните ответы в третьем блоке.
-
После получения
ready: trueпроверьте итоговый текст и поля, внесите правку и нажмите «Подтвердить и опубликовать». -
Проверьте появление карточки в каталоге и разделе «Мои задачи». В
/api/tasksдолжна появиться серверная запись. -
Удалите созданную тестовую задачу через её карточку и убедитесь, что она исчезла из
/api/tasks.
Конкретный рейтинг и готовность после определённого числа ответов не гарантированы: это результат модели. Если AI-запрос завершается ошибкой, проверьте ключ, доступность моделей и логи backend. Локальной замены AI-ответов в приложении нет.
Автоматические проверки
В каталоге frontend:
npm run format:check
npm run lint
npm run typecheck
npm run build
В каталоге backend, после установки зависимостей выше:
.\.venv\Scripts\python.exe -m pip install -r requirements-dev.txt
.\.venv\Scripts\python.exe -m ruff format --check app tests
.\.venv\Scripts\python.exe -m ruff check app tests
.\.venv\Scripts\python.exe -m pytest -q
Backend-тесты проверяют три раунда, публикацию, каталог, удаление, обработку смоделированной ошибки ключа OpenAI и разбор JSON. AI-вызовы в тестах подменяются; успешный тест не подтверждает работу реального Gemini API. В существующем CI отдельная установка google-genai отсутствует.
Данные и интеграции
- Пользовательский ввод: описание задачи, категория, ответы на уточнения, правки карточки и предложения команд.
- Демонстрационные данные: три карточки в
frontend/src/features/tasks/data.ts— пищевые отходы, стажировки и полив клумб. Указанные в них показатели являются содержанием примеров, а не измеренными результатами проекта. - Gemini API: получает описание, категорию, историю ответов и данные текущего раунда; возвращает JSON с вопросами либо готовой карточкой и рейтингом. Названия моделей заданы непосредственно в
ai_service.py. - Память backend: черновики и опубликованные задачи находятся в словарях
draftsиtasks; перезапуск процесса очищает их. - Браузер: локальные карточки и отклики хранятся под ключом
iskra-tasks-v2. Данные демонстрационных карточек исключаются из сохранения.
Загрузка датасетов, подключение CRM, внешних каталогов задач или системы уведомлений в текущем коде не реализованы. Поле «Данные и материалы» содержит текст; автоматическое получение указанных материалов отсутствует.
Ограничения текущей версии
- Незавершён переход на Gemini. SDK отсутствует в requirements, обработка ошибок backend всё ещё ориентирована на OpenAI. Поэтому ошибки Gemini, включая отсутствие
GEMINI_API_KEY, могут отображаться как общая ошибка HTTP 500. Код допускает резервное чтениеOPENAI_API_KEY, но передаёт это значение клиенту Gemini — ключ OpenAI не заменяет ключ Gemini. - Доступность AI-моделей требует проверки. Репозиторий подтверждает названия
gemini-1.5-flashиgemini-2.5-flash, но не их доступность для конкретного ключа. Переключения модели через.envнет. - Нет постоянного хранилища. После перезапуска backend серверные данные теряются; локальные копии могут оставаться в браузере и расходиться с сервером. Хранилище в памяти также не общее для нескольких процессов backend.
- Нет регистрации, входа и проверки прав. Интерфейс определяет собственную задачу по локальному значению автора «Вы». API удаления не проверяет владельца.
- Отклики и правки не синхронизируются. Для редактирования карточек, отправки предложений и смены их статуса серверных маршрутов нет. Полный сценарий сотрудничества между разными пользователями ещё не реализован.
- Рейтинг имеет два источника. Сервер сохраняет оценку модели, а браузер рассчитывает заполненность полей по фиксированным весам. Эти значения могут различаться; заполненность не доказывает качество или реализуемость задачи.
- Нет ограничения публикации по рейтингу 40/100. Такое условие упомянуто в прежней документации frontend, но в текущем конструкторе и API публикации оно не проверяется. Backend проверяет флаг
ready. - Три раунда — логика обычного интерфейсного сценария. Сервер принимает номер раунда от клиента и не проверяет всю последовательность; дополнительные уточнения отправляются с номером 3.
- Нет подтверждённых результатов эксплуатации. В репозитории не приведены измерения точности AI, нагрузки, числа реальных пользователей или эффективности сотрудничества.
Развёрнутая версия
Подтверждённая ссылка на опубликованное приложение в проверенных файлах репозитория не найдена. Для демонстрации используйте локальный запуск по инструкции выше.
Основание документации
README составлен по исходному коду BAITC-Hacks/hack-99d4c8fe-team, снимок ветки main: 3c650b5.
Ключевые источники: frontend/src/app/page.tsx, компоненты и библиотеки frontend/src/features/tasks/, backend/app/main.py, backend/app/schemas.py, backend/app/services/ai_service.py, файлы зависимостей, тесты и .github/workflows/ci.yml. Инструкции сверены с кодом; запуск приложения и запросы к реальному Gemini API при подготовке README не выполнялись.
Авторы коммитов
История коммитов
- 2026-09-23 17:30lastVsavva
- 2026-09-23 17:21stylesavva
- 2026-09-23 17:14deploysavva
- 2026-09-23 17:52Кo2xygenium
- 2026-09-23 17:48Add files via uploado2xygenium
- 2026-09-23 16:15fix: remove misplaced next-env.d.ts from rootsavva
- 2026-09-23 16:07Replace project structuresavva
- 2026-09-23 14:37First Developmentsavva
Структура репозитория (48 файлов)
.editorconfig .gitattributes .github/workflows/ci.yml .gitignore README.md backend/.dockerignore backend/.env.example backend/.gitignore backend/Dockerfile backend/README.md backend/app/__init__.py backend/app/main.py backend/app/schemas.py backend/app/services/__init__.py backend/app/services/ai_service.py backend/app/services/clarification.py backend/app/services/demo_service.py backend/app/storage.py backend/data/iskra.db backend/pyproject.toml backend/requirements-dev.txt backend/requirements.txt backend/tests/test_task_flow.py backend/uv.lock compose.yaml frontend/.gitignore frontend/.prettierignore frontend/.prettierrc.json frontend/README.md frontend/eslint.config.mjs frontend/next-env.d.ts frontend/next.config.ts frontend/package-lock.json frontend/package.json frontend/postcss.config.mjs frontend/src/app/globals.css frontend/src/app/layout.tsx frontend/src/app/page.tsx frontend/src/features/tasks/components/RatingBreakdown.tsx frontend/src/features/tasks/components/TaskBuilder.tsx frontend/src/features/tasks/components/TaskCard.tsx frontend/src/features/tasks/components/TaskDetails.tsx frontend/src/features/tasks/components/TaskEditor.tsx frontend/src/features/tasks/data.ts frontend/src/features/tasks/lib/api.ts frontend/src/features/tasks/lib/rating.ts frontend/src/features/tasks/types.ts frontend/tsconfig.json
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.