AI Sana Challenge Hub
Платформа, где OpenAI анализирует описание бизнес-проблемы, задаёт не менее трёх уточняющих вопросов и формирует Task Card с Readiness Score.
О проекте
Команда: 3 da gang
Кейс HackAlem.ai: Образование — AI Sana
Стадия: Рабочий MVP
Задача кейса: Challenge Hub: превратить задачу бизнеса в задание для студенческих команд
Суть
Платформа, где OpenAI анализирует описание бизнес-проблемы, задаёт не менее трёх уточняющих вопросов и формирует Task Card с Readiness Score. Затем идут каталог задач, предложения студенческих команд, Accept/Reject и план пилота.
Как устроено
FastAPI-бэкенд вызывает OpenAI через AsyncOpenAI.responses.parse (Structured Outputs и Pydantic) для анализа недостающих полей, вопросов, карточки, AI Review, Proposal Coach и Pilot Assistant. Каждое поле карточки принимается только вместе с дословной цитатой, которая проверяется на присутствие в исходном описании или ответах; иначе поле становится null. Readiness Score считается Python-логикой по взвешенным критериям на 100 баллов с уровнями draft, working, ready и priority. Статусы карточки: draft, confirmed, published; правка откатывает к draft. Фронт на React и Vite, БД с миграциями Alembic.
Ключевые решения
- OpenAI Structured Outputs
- проверка дословных цитат-источников
- детерминированный readiness score
- state machine статусов
- Playwright e2e
Особенности
Защита от галлюцинаций: поле без подтверждающей цитаты из текста пользователя обнуляется. Тексты самих AI-вопросов не считаются источником фактов. Изменение задачи или предложения помечает пилот как outdated.
Стек
Python · FastAPI · Pydantic · Alembic · React · TypeScript · Vite · Playwright · pytest · Docker Compose · PowerShell
Модели
OpenAI gpt-4.1-mini · Ollama
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-81f437ae-3-da-gang.
README
README.md🚀 AI Sana Challenge Hub
AI-платформа, которая превращает сырую бизнес-проблему в структурированную, измеримую и готовую к работе задачу для студенческих команд.
Проект разработан в рамках HackAlem / AI Sana Challenge.
🎯 Что решает проект
У бизнеса может быть реальная проблема, но не готовое техническое задание.
Например:
«Хотим с помощью ИИ уменьшить очереди в нашей клинике».
Такого описания недостаточно, чтобы студенческая команда сразу начала работу:
- непонятно, где именно возникает проблема;
- неизвестно, кто будет пользоваться решением;
- неизвестно, какие данные доступны;
- не определены ограничения;
- отсутствует измеримый ожидаемый результат;
- отсутствуют критерии успеха.
AI Sana Challenge Hub помогает бизнесу пройти путь от такой идеи до полноценной карточки задачи.
💡 Как работает решение
Основной пользовательский сценарий:
Бизнес описывает проблему
↓
OpenAI анализирует описание
↓
Определяет недостающую информацию
↓
Генерирует ≥ 3 уточняющих вопросов
↓
Бизнес отвечает
↓
AI формирует структурированную карточку
↓
Бизнес проверяет и редактирует её
↓
Человек подтверждает карточку
↓
Рассчитывается Readiness Score 0–100
↓
Задача публикуется
↓
Попадает в каталог
↓
Студенческие команды предлагают решения
↓
Бизнес сравнивает предложения
↓
Accept / Reject
↓
Для принятой команды можно подготовить план пилота
AI помогает структурировать информацию, но не принимает финальные решения вместо человека.
✨ Возможности
Для бизнеса
Бизнес может:
- создать черновик задачи;
- получить AI-анализ;
- получить минимум 3 уточняющих вопроса;
- ответить на вопросы;
- получить структурированную карточку;
- проверить источники AI-полей;
- вручную изменить любое поле;
- получить AI-разбор качества карточки;
- увидеть Readiness Score;
- увидеть недостающую информацию;
- получить рекомендации по улучшению;
- подтвердить карточку;
- опубликовать задачу;
- просматривать предложения команд;
- сравнивать предложения;
- принять одну или несколько команд;
- отклонить предложения;
- подготовить и подтвердить план пилота;
- открыть печатную версию карточки/пилота.
Для студенческой команды
Команда может:
- открыть каталог задач;
- фильтровать задачи;
- сортировать задачи по готовности;
- открыть полную карточку;
- подготовить предложение;
- использовать AI-помощника для идеи и плана;
- самостоятельно отредактировать предложение;
- отправить предложение бизнесу.
🤖 Где используется AI
В проекте используется реальный OpenAI API.
AI применяется там, где требуется работа с естественным языком и неполной информацией.
1. Анализ первоначального описания
AI определяет, какой информации недостаточно.
Например:
Хотим автоматизировать работу склада.
Система может определить отсутствие:
users
data_and_materials
constraints
success_criteria
expected_result
2. Уточняющие вопросы
AI генерирует минимум три различных вопроса.
Например:
Кто будет основным пользователем системы?
Какие данные о работе склада уже доступны?
По каким показателям будет измеряться успех решения?
Backend дополнительно проверяет, чтобы вопросы действительно отличались друг от друга.
3. Формирование Task Card
После получения ответов AI структурирует предоставленные сведения.
AI не должен придумывать отсутствующие факты.
4. AI Review
Для уже сформированной карточки AI может найти:
- расплывчатые формулировки;
- пропущенные сведения;
- потенциальные противоречия;
- места, которые стоит дополнительно уточнить.
5. Proposal Coach
AI помогает студенческой команде подготовить:
- идею решения;
- план реализации;
- вопросы бизнесу.
При этом AI самостоятельно не назначает:
- название команды;
- сроки;
- prototype URL.
Финальное предложение отправляет человек.
6. Pilot Assistant
После ручного принятия команды AI может предложить:
- этапы пилота;
- открытые вопросы.
Фактические данные пилота берутся обычной логикой приложения из карточки задачи и предложения команды.
🛡 Защита от выдуманных AI-фактов
При генерации карточки AI возвращает:
значение
+
дословную цитату-источник
Backend принимает значение только если:
- AI предоставил цитату;
- цитата действительно присутствует в первоначальном описании или ответах пользователя;
- значение прошло проверку.
Если подтверждения нет:
field = null
Тексты самих AI-вопросов не считаются источниками фактов.
После генерации карточку всё равно проверяет человек.
Механизм снижает риск выдуманных фактов, но окончательная смысловая проверка остаётся за пользователем.
🧠 Structured Outputs
Backend не пытается разбирать произвольный текст LLM.
Используются:
- OpenAI Structured Outputs;
AsyncOpenAI.responses.parse;- Pydantic.
Пример AI-ответа:
{
"missing_fields": [
"users",
"data_and_materials",
"success_criteria"
],
"questions": [
"Кто будет пользоваться решением?",
"Какие данные уже доступны?",
"Как будет измеряться успех?"
]
}
Это позволяет backend работать с предсказуемой структурой данных.
🔐 OpenAI
Конфигурация находится в:
backend/app/core/config.py
Используются environment variables:
OPENAI_API_KEY=
OPENAI_MODEL=gpt-4.1-mini
API key:
- хранится только локально;
- не передаётся frontend;
- не хранится в исходном коде;
- не должен попадать в Git;
- не выводится в логи.
OpenAI-запросы выполняются с:
store=False
При ошибке API или невалидном ответе выполняется одна повторная попытка.
Если запрос всё равно не выполнен, пользователь получает понятную ошибку и может продолжить заполнение карточки вручную.
Скрытого mock AI fallback в рабочем приложении нет.
🏆 Readiness Score
Каждая задача получает рейтинг готовности:
0 ───────────────────────────────── 100
Он показывает насколько задача заполнена и готова к работе со студенческой командой.
Он не оценивает:
- ценность компании;
- коммерческий потенциал;
- качество идеи;
- достоверность предоставленных данных.
Формула
| Критерий | Баллы |
|---|---|
| Контекст | 10 |
| Потребность | 10 |
| Данные и материалы | 20 |
| Ожидаемый результат | 15 |
| Критерии успеха | 15 |
| Ограничения | 10 |
| Пользователи | 10 |
| Контакт + формат взаимодействия | 10 |
| Всего | 100 |
Рейтинг вычисляется обычной Python business logic.
LLM рейтинг не определяет.
Backend возвращает:
{
"score": 75,
"level": "ready",
"missing": [],
"improvements": []
}
Уровни
| Score | Level |
|---|---|
| 0–39 | draft |
| 40–69 | working |
| 70–89 | ready |
| 90–100 | priority |
Низкий рейтинг не запрещает публикацию.
🎮 Геймификация
Пользователь видит:
- текущий score;
- уровень;
- недостающие сведения;
- рекомендации;
- изменение рейтинга после редактирования.
Логика:
Более полная задача
↓
Выше Readiness Score
↓
Выше уровень готовности
↓
Выше позиция в каталоге
Это мотивирует бизнес улучшать качество постановки задачи.
📝 Task Card
Карточка содержит:
title
topic
context
need
users
data_and_materials
constraints
expected_result
success_criteria
contact
interaction_format
Также хранятся:
id
status
readiness_score
created_at
updated_at
Статусы
draft
↓
confirmed
↓
published
Если пользователь изменяет уже подтверждённую карточку:
confirmed → draft
После этого требуется повторное подтверждение и публикация.
Это предотвращает незаметное изменение уже подтверждённой задачи.
📚 Каталог
Каталог показывает опубликованные задачи.
Доступны:
- сортировка по Readiness Score;
- фильтр по topic;
- фильтр по readiness level;
- просмотр полной карточки.
Высокий рейтинг влияет на позицию задачи, но низкий рейтинг не скрывает её.
👨💻 Team Proposal
Команда может отправить:
team_name
solution_idea
plan
estimated_time
prototype_url
Количество предложений не ограничивается.
🤝 Business Decision
Бизнес просматривает предложения и самостоятельно принимает решение:
[ Accept ]
[ Reject ]
Можно:
- принять одну команду;
- принять несколько;
- отклонить все.
Автоматического AI-назначения команды нет.
📊 Сравнение предложений
Для бизнеса доступны два представления:
Cards
Каждое предложение показывается отдельной карточкой.
Comparison Table
Предложения можно сравнить между собой по основным параметрам.
🧪 Pilot Plan
После принятия предложения бизнес может подготовить план пилота.
Документ содержит:
- цель;
- ожидаемый результат;
- критерии успеха;
- данные;
- ограничения;
- обязанности сторон;
- сроки;
- этапы;
- открытые вопросы.
Фактические поля копируются обычной Python-логикой.
AI предлагает только:
этапы
+
открытые вопросы
Правила Pilot Plan
AI-генерация сама ничего не сохраняет.
Сохранение ручных изменений снимает подтверждение.
Если исходная задача или предложение изменились:
Pilot → outdated
Перед подтверждением должны быть заполнены обязательные поля и существовать хотя бы один этап.
Для отклонённой команды нельзя сохранить или подтвердить pilot.
Подтверждение бизнеса не означает автоматического согласия команды.
🏗 Архитектура
USER
│
▼
┌────────────────────┐
│ React + TypeScript │
│ Frontend │
└─────────┬──────────┘
│
HTTP / JSON
│
▼
┌──────────────┐
│ FastAPI │
│ Backend │
└──────┬───────┘
│
┌──────────┴──────────┐
│ │
▼ ▼
┌───────────────┐ ┌──────────────┐
│ OpenAI API │ │ PostgreSQL │
│ Structured AI │ │ Persistent DB│
└───────────────┘ └──────────────┘
Backend:
api/
↓
business_logic/
↓
data_access/
↓
PostgreSQL
🛠 Технологии
Frontend
- React
- TypeScript
- Vite
- Tailwind CSS
- React Router
Backend
- Python
- FastAPI
- Pydantic
- SQLAlchemy Async
- Alembic
Database
- PostgreSQL
AI
- OpenAI API
- OpenAI Python SDK
- Structured Outputs
Development
- Git
- GitHub
- Codex
- Pytest
📁 Структура
.
├── backend/
│ ├── app/
│ │ ├── api/
│ │ ├── business_logic/
│ │ ├── core/
│ │ └── data_access/
│ │
│ ├── alembic/
│ └── tests/
│
├── frontend/
│ ├── src/
│ └── public/
│
├── scripts/
│ ├── start-local.ps1
│ ├── stop-local.ps1
│ └── check_secrets.py
│
├── docs/
│ └── AUDIT.md
│
├── .env.example
├── .gitignore
├── docker-compose.yml
└── README.md
🗄 Database
Основные сущности:
BusinessTask
TeamProposal
Используются:
- UUID;
- Foreign Keys;
- cascade delete;
- timestamps;
- indexes;
- status constraints;
- rating constraints.
Данные сохраняются в настоящей PostgreSQL.
🔄 Alembic
В проекте используются миграции:
0001
→ BusinessTask + TeamProposal
0002
→ Pilot document storage
Применение:
alembic upgrade head
🌱 Demo Data
Seed создаёт:
5 бизнес-задач
5 предложений команд
Задачи имеют разную степень заполненности, чтобы показать различные значения Readiness Score.
Seed является идемпотентным: повторный запуск не создаёт дубликаты.
🚀 Быстрый запуск на Windows
Для текущего development environment предусмотрен автоматический PowerShell-скрипт.
Из корня проекта:
powershell -ExecutionPolicy Bypass -File scripts/start-local.ps1
Скрипт:
- запускает локальный PostgreSQL;
- задаёт
DATABASE_URL; - применяет Alembic migrations;
- запускает seed;
- запускает FastAPI;
- запускает frontend;
- ожидает готовности сервисов.
После запуска:
Frontend
http://localhost:5173
Backend / Swagger
http://127.0.0.1:8000/docs
Local PostgreSQL
127.0.0.1:55432
🛑 Остановка
powershell -ExecutionPolicy Bypass -File scripts/stop-local.ps1
Скрипты проверяют процессы перед остановкой, чтобы случайно не завершить чужой процесс с повторно использованным PID.
⚙️ Стандартный запуск
Также проект можно запускать без portable development environment.
Потребуются:
- Python;
- Node.js;
- PostgreSQL либо Docker.
1. Clone
git clone <REPOSITORY_URL>
cd <REPOSITORY_NAME>
2. Environment
Создайте:
.env
на основе:
.env.example
Минимально:
OPENAI_API_KEY=your_key_here
OPENAI_MODEL=gpt-4.1-mini
DATABASE_URL=postgresql+asyncpg://postgres:postgres@localhost:5432/hackalem
Никогда не коммитьте .env.
3. Backend
cd backend
python -m venv .venv
Windows:
.venv\Scripts\activate
Linux/macOS:
source .venv/bin/activate
Установка:
pip install -r requirements.txt
Миграции:
alembic upgrade head
Запуск:
uvicorn app.main:app --reload
4. Frontend
В отдельном терминале:
cd frontend
npm install
npm run dev
❤️ Health Check
Backend предоставляет:
GET /api/health
Health endpoint проверяет не только FastAPI, но и доступность таблиц PostgreSQL.
🔌 Основные API
AI / Tasks
POST /api/tasks/analyze
POST /api/tasks/generate
POST /api/tasks/generate-with-sources
POST /api/tasks/preview
POST /api/tasks/review
Frontend использует:
POST /api/tasks/generate-with-sources
Ответ:
{
"card": {},
"sources": {}
}
Tasks
GET /api/tasks
POST /api/tasks
GET /api/tasks/{id}
PUT /api/tasks/{id}
POST /api/tasks/{id}/confirm
POST /api/tasks/{id}/publish
Business
GET /api/business/tasks
Proposals
POST /api/proposals/{task_id}
GET /api/business/tasks/{task_id}/proposals
PATCH /api/business/proposals/{proposal_id}
Proposal AI Coach
POST /api/tasks/{id}/proposal-coach
Pilot
GET /api/business/proposals/{id}/pilot
PUT /api/business/proposals/{id}/pilot
POST /api/business/proposals/{id}/pilot/generate
POST /api/business/proposals/{id}/pilot/confirm
🎭 Роли
В интерфейсе есть переключатель:
Я бизнес
Я команда
Он используется
Авторы коммитов
История коммитов
- 2026-09-23 17:43Update README.mdaslan
- 2026-09-23 17:43feat: deliver final AI Sana Challenge Hub MVPAslan
- 2026-09-23 16:54feat: add business and team registrationEraseak
- 2026-09-23 16:26feat: add Ollama adapter, task cards and contextual questionsFAKE419767
- 2026-09-23 16:22Revise README for improved clarity and organizationaslan
- 2026-09-23 16:18Implement functional MVP from initial mockAslan
- 2026-09-23 15:32feat: add standalone LLM module with mock providerFAKE419767
- 2026-09-23 15:15Add initial AI flow documentationAslan
Все коммиты (11)
- 2026-09-23 15:13feat: scaffold TaskUp hackathon prototypeEraseak
- 2026-09-23 15:12Revert "feat: scaffold TaskUp hackathon prototype"Eraseak
- 2026-09-23 15:10feat: scaffold TaskUp hackathon prototypeEraseak
Структура репозитория (59 файлов)
.env.example .gitignore README.md backend/alembic.ini backend/alembic/env.py backend/alembic/versions/0001_initial.py backend/alembic/versions/0002_pilot.py backend/app/__init__.py backend/app/api/__init__.py backend/app/api/routes.py backend/app/api/schemas.py backend/app/api/workbench.py backend/app/api/workbench_schemas.py backend/app/business_logic/__init__.py backend/app/business_logic/ai.py backend/app/business_logic/pilots.py backend/app/business_logic/rating.py backend/app/business_logic/tasks.py backend/app/business_logic/workbench_ai.py backend/app/core/__init__.py backend/app/core/config.py backend/app/data_access/__init__.py backend/app/data_access/database.py backend/app/data_access/models.py backend/app/data_access/repository.py backend/app/main.py backend/app/seed.py backend/pytest.ini backend/requirements.lock.txt backend/requirements.txt backend/tests/test_ai.py backend/tests/test_errors.py backend/tests/test_flow.py backend/tests/test_rating.py backend/tests/test_secrets.py backend/tests/test_workbench.py docker-compose.yml docs/AUDIT.md frontend/index.html frontend/package-lock.json frontend/package.json frontend/playwright.config.ts frontend/src/api.ts frontend/src/main.tsx frontend/src/roles.tsx frontend/src/styles.css frontend/src/workbench.tsx frontend/tests/demo.spec.ts frontend/tests/live.spec.ts frontend/tests/workbench.spec.ts frontend/tsconfig.json frontend/vite.config.ts hello.py scripts/check_secrets.py scripts/live_ai_smoke.py scripts/live_workbench_smoke.py scripts/local-services.ps1 scripts/start-local.ps1 scripts/stop-local.ps1
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.