ASAR
Веб-платформа: бизнес описывает задачу своими словами, AI задаёт уточняющие вопросы и собирает структурированную карточку, backend считает рейтинг…
О проекте
Команда: Barni
Кейс HackAlem.ai: Образование — AI Sana
Стадия: Рабочий MVP
Задача кейса: Challenge Hub: превратить задачу бизнеса в задание для студенческих команд
Суть
Веб-платформа: бизнес описывает задачу своими словами, AI задаёт уточняющие вопросы и собирает структурированную карточку, backend считает рейтинг готовности 0–100, задача публикуется в каталог, студенческие команды подают предложения, бизнес вручную принимает или отклоняет их.
Как устроено
Черновик уходит в POST /api/ai/analyze-draft: OpenAI со Structured Outputs извлекает известные факты, находит пустые поля и задаёт не меньше 3 вопросов. Затем /api/ai/build-card собирает карточку. Ответ модели проходит валидацию Pydantic и проверку grounding (модель не должна придумывать факты), при невалидном выводе делается один повтор, при недоступности API включается шаблонный fallback с заголовком X-AI-Fallback. Рейтинг считает детерминированная функция (веса полей 10/10/20/15/15/10/10/5/5), данные хранятся в PostgreSQL, фронтенд на React ведёт пользователя по шагам.
Ключевые решения
- OpenAI Structured Outputs
- Pydantic validation
- grounding validation
- детерминированный скоринг полей
- human-in-the-loop
- Alembic migrations
Особенности
Рейтинг готовности намеренно не генерируется LLM: его считает прозрачная backend-функция с видимой разбивкой по полям. У AI есть явный режим деградации (заголовок X-AI-Fallback), поэтому fallback не выдаётся за ответ модели. Есть smoke-тест всей демо-цепочки и проверка, что данные сохраняются после перезапуска контейнеров.
Стек
Python · FastAPI · Pydantic v2 · SQLAlchemy 2 · Alembic · PostgreSQL · React · TypeScript · Vite · Tailwind CSS · nginx · Docker Compose · pytest
Модели
OpenAI API (модель через OPENAI_MODEL)
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-7bc108f9-barni.
README
README.md
ASAR
AI-платформа для подготовки бизнес-задач и открытого выбора студенческих команд
HackAlem AI / AI Sana · Education Track
Бизнес формулирует задачу своими словами → AI помогает уточнить детали → система собирает структурированную карточку и рассчитывает прозрачный рейтинг готовности → задача попадает в общий каталог → студенческие команды самостоятельно отправляют предложения → бизнес вручную принимает или отклоняет их.
Что решает ASAR
Хорошая учебная практика начинается не с красивого интерфейса, а с понятной задачи.
На практике бизнес часто описывает запрос слишком общо: без данных, ограничений, критериев успеха или ожидаемого результата. Из-за этого студенческим командам сложно оценить объём работы и предложить реалистичное решение.
ASAR превращает такое описание в готовую к работе карточку:
- AI анализирует исходный текст;
- определяет, каких сведений не хватает;
- задаёт уточняющие вопросы;
- формирует структурированную карточку без выдумывания фактов;
- бизнес вручную проверяет и подтверждает информацию;
- backend рассчитывает рейтинг готовности
0–100; - опубликованные задачи попадают в общий каталог;
- студенческие команды отправляют предложения;
- финальное решение по команде всегда остаётся за бизнесом.
AI помогает сформулировать задачу, но не принимает бизнес-решения за человека.
Сквозной сценарий
Слабое описание задачи
↓
AI-анализ
↓
Недостающие сведения + уточняющие вопросы
↓
Ответы бизнеса
↓
AI формирует карточку
↓
Ручное редактирование и подтверждение
↓
Прозрачный рейтинг готовности 0–100
↓
Публикация в общем каталоге
↓
Студенческая команда выбирает задачу
↓
Команда отправляет предложение
↓
Бизнес вручную принимает / отклоняет отклик
Интерфейс и сценарий работы
1. Старт: бизнес описывает задачу
Пользователь начинает с обычного свободного описания. На этом этапе не требуется заранее заполнять длинную форму: достаточно выбрать тему и объяснить задачу своими словами.
Что демонстрирует экран:
- низкий порог входа для бизнеса;
- один понятный CTA — «Уточнить задачу с AI»;
- переход от неструктурированного запроса к управляемому процессу;
- возможность быстро загрузить демонстрационный пример.
2. AI задаёт только недостающие вопросы
После анализа черновика AI выделяет известные факты и формирует уточняющие вопросы по недостающим сведениям.
Вопросы направлены на конкретные поля будущей карточки: текущий процесс, доступные данные, ограничения, ожидаемый результат, критерии успеха и другие важные детали.
Принцип: модель не должна придумывать сведения за пользователя. Если факта нет во входных данных — он остаётся неизвестным.
3. AI собирает редактируемую карточку
После ответов система формирует структурированную карточку.
Бизнес видит все поля и может вручную изменить любое значение перед подтверждением. Это сохраняет human-in-the-loop: AI структурирует информацию, а человек отвечает за её корректность.
Карточка включает:
- название;
- тему;
- контекст и текущую ситуацию;
- потребность;
- пользователей;
- доступные данные и материалы;
- ограничения;
- ожидаемый результат;
- критерии успеха;
- контакт;
- формат взаимодействия.
4. Прозрачный рейтинг готовности
После подтверждения backend рассчитывает рейтинг задачи от 0 до 100.
Рейтинг не генерируется моделью. Это детерминированная backend-функция: пользователь видит, за какие поля начислены баллы и что ещё можно улучшить.
Формула рейтинга
| Поле | Баллы |
|---|---|
| Контекст | 10 |
| Потребность | 10 |
| Данные и материалы | 20 |
| Ожидаемый результат | 15 |
| Критерии успеха | 15 |
| Ограничения | 10 |
| Пользователи | 10 |
| Контакт | 5 |
| Формат взаимодействия | 5 |
| Всего | 100 |
Уровни готовности
| Баллы | Уровень |
|---|---|
| 0–39 | Черновик |
| 40–69 | Рабочая |
| 70–89 | Готовая |
| 90–100 | Приоритетная |
Низкий рейтинг не блокирует публикацию. Его задача — показать, каких сведений не хватает и где есть потенциал роста.
5. Публикация задачи
После подтверждения карточки и рейтинга бизнес публикует задачу.
На экране сразу видны:
- итоговый рейтинг;
- уровень готовности;
- сохранённый
task_id; - переход к опубликованной задаче;
- переход в общий каталог.
После публикации карточка становится доступна студенческим командам.
6. Общий каталог задач
Каталог — единая точка входа для студенческих команд.
Поддерживаются:
- сортировка по рейтингу;
- фильтрация по теме;
- фильтрация по уровню готовности;
- просмотр количества недостающих полей;
- переход к полной карточке.
Рейтинг влияет на порядок отображения, но не скрывает задачи с низкой готовностью.
7. Полная карточка задачи
Перед отправкой предложения команда может изучить подробную карточку и увидеть:
- бизнес-контекст;
- потребность;
- пользователей;
- доступные материалы;
- ограничения;
- ожидаемый результат;
- критерии успеха;
- текущий рейтинг;
- недостающие сведения.
Это позволяет принять решение осознанно, а не ориентироваться только на заголовок задачи.
8. Предложение студенческой команды
Студенческая команда самостоятельно выбирает задачу и отправляет предложение.
Предложение содержит:
- идею решения;
- план реализации;
- предполагаемый срок;
- ссылку на прототип — опционально.
Новое предложение получает статус pending.
Далее бизнес вручную принимает или отклоняет отклик. Автоматического назначения команды нет.
Архитектура
flowchart LR
FE["React + TypeScript<br/>Create / Catalog / Task"]
API["FastAPI<br/>Task API · Proposal API<br/>Rating · Validation · AI Service"]
DB[("PostgreSQL<br/>tasks · teams · proposals")]
AI["OpenAI API<br/>Structured Outputs"]
FE -->|HTTP / JSON| API
API --> DB
API --> AI
Ответственность компонентов
- AI — извлекает предоставленные сведения, определяет пробелы, задаёт вопросы и формирует структурированную карточку.
- Backend — валидирует данные, хранит сущности, рассчитывает рейтинг, публикует и сортирует задачи.
- Frontend — проводит пользователя через единый пошаговый сценарий.
- Человек — редактирует и подтверждает карточку, а также принимает решение по предложениям команд.
Технологии
Backend
- Python 3.12
- FastAPI
- Pydantic v2
- SQLAlchemy 2
- psycopg 3
- Alembic
- PostgreSQL
- OpenAI Python SDK
- pytest
Frontend
- React
- TypeScript
- Vite
- React Router
- Native Fetch
- Tailwind CSS
Infrastructure
- Docker Compose
- GitHub
- Codex
Быстрый запуск
1. Переменные окружения
Создайте локальный .env на основе .env.example:
cp .env.example .env
Минимально необходимо настроить:
OPENAI_API_KEY=
DATABASE_URL=postgresql+psycopg://postgres:postgres@postgres:5432/hackalem
VITE_API_URL=http://localhost:5137/create
OPENAI_MODEL задаётся через .env / .env.example проекта.
Секреты не должны попадать в Git.
2. Запуск Docker Compose
docker compose up --build
После запуска доступны:
- frontend;
- backend;
- PostgreSQL.
Проверка backend:
GET /health
Ожидаемый ответ:
{
"status": "ok"
}
Остановка:
docker compose down
AI-функциональность
В MVP используются две содержательные AI-операции.
Анализ черновика
POST /api/ai/analyze-draft
AI:
- извлекает только известные сведения;
- определяет недостающие поля;
- формирует минимум три уточняющих вопроса;
- возвращает структурированный результат.
Формирование карточки
POST /api/ai/build-card
AI получает первоначальный draft и ответы пользователя и формирует карточку задачи.
Все поля остаются доступными для ручного редактирования.
Grounding: AI не выдумывает бизнес-факты
Ключевое правило AI-модуля:
Использовать только информацию, явно предоставленную пользователем.
Модель не должна самостоятельно придумывать:
- данные и датасеты;
- пользователей;
- сроки;
- технологии;
- ограничения;
- контакты;
- числовые показатели;
- ожидаемые результаты;
- критерии успеха.
Если сведений недостаточно, поле остаётся null.
Перед публикацией карточка всегда проходит ручную проверку и подтверждение человеком.
Structured Outputs
AI-модуль использует официальный OpenAI Python SDK и Structured Outputs.
Обработка ответа:
OpenAI
↓
Structured Output
↓
Pydantic validation
↓
Grounding validation
↓
API response
Сырой ответ модели не передаётся напрямую во frontend.
При невалидном structured output выполняется не более одного повторного запроса.
AI fallback
Для анализа черновика предусмотрен локальный fallback.
Если OpenAI API временно недоступен, система может вернуть шаблонные вопросы по незаполненным полям, не пытаясь придумывать новые бизнес-факты.
Режим можно определить по header:
X-AI-Fallback: true
Реальный ответ модели:
X-AI-Fallback: false
Fallback — режим деградации и не считается успешным live-тестом AI.
Каталог и предложения
Все опубликованные задачи доступны всем студенческим командам.
Команда может:
- открыть каталог;
- применить фильтры;
- изучить карточку;
- самостоятельно выбрать задачу;
- отправить предложение.
Бизнес видит поступившие предложения и вручную выполняет одно из действий:
accepted
rejected
Можно принять одну, несколько или ни одной команды.
API
Ключевые endpoints:
GET /health
POST /api/ai/analyze-draft
POST /api/ai/build-card
GET /api/meta
GET /api/teams
POST /api/tasks
GET /api/tasks/{task_id}
PUT /api/tasks/{task_id}/confirm
POST /api/rating/preview
Расширенный контракт и примеры запросов находятся в:
docs/api-contract.md
docs/api-examples.md
Тестирование
Тесты backend можно запускать без реального OpenAI API:
python -m pytest -c backend/pytest.ini backend/tests -q
Live AI tests запускаются отдельно и используют API-квоту.
Проверяются в том числе:
- слабое описание → вопросы → карточка;
- отсутствие выдуманных фактов;
- сохранение отрицаний вроде «данных нет»;
- отсутствие повторных вопросов по уже предоставленной информации;
nullдля отсутствующих значений;- Structured Outputs через реальные FastAPI endpoints.
Демонстрационный сценарий
Для защиты достаточно пройти один целостный сценарий:
1. Бизнес вводит слабое описание задачи.
2. AI возвращает минимум 3 уточняющих вопроса.
3. Бизнес отвечает.
4. AI формирует структурированную карточку.
5. Бизнес вручную редактирует поле.
6. Карточка подтверждается.
7. Backend рассчитывает рейтинг.
8. Показывается breakdown и потенциал роста.
9. Задача публикуется.
10. Она появляется в каталоге.
11. Роль переключается на студенческую команду.
12. Команда открывает задачу.
13. Команда отправляет предложение.
14. Роль переключается обратно на бизнес.
15. Бизнес вручную принимает или отклоняет предложение.
Ограничения MVP
В рамках хакатона намеренно не реализуются избыточные production-функции:
- полноценная регистрация и восстановление пароля;
- сложный RBAC;
- realtime chat;
- уведомления;
- календарь;
- файловое хранилище;
- RAG / vector database;
- обучение собственной ML-модели;
- multi-agent framework;
- полноценная LMS;
- production infrastructure;
- полный project tracker.
Основной фокус — один законченный сквозной сценарий.
Использование Codex
Codex использовался как обязательный инструмент разработки.
Работа разбивалась на небольшие изолированные задачи, в частности:
- AI schemas;
- Structured Outputs;
- grounding validation;
- fallback-механизм;
- unit и live AI tests;
- обработка edge cases;
- анализ интеграционных ошибок;
- улучшение системного prompt;
- проверка структуры и качества кода.
Сгенерированные изменения проверялись разработчиками и автоматическими тестами.
Definition of Done
После:
docker compose up --build
без изменения исходного кода должен выполняться полный сценарий:
✓ открыть frontend
✓ создать черновик
✓ получить AI-вопросы
✓ ответить на вопросы
✓ получить карточку
✓ отредактировать карточку
✓ подтвердить сведения
✓ получить рейтинг 0–100
✓ опубликовать задачу
✓ увидеть её в каталоге
✓ открыть задачу от лица студенческой команды
✓ отправить предложение
✓ принять или отклонить предложение от лица бизнеса
✓ сохранить данные после перезапуска
ASAR
Чёткая задача → прозрачный рейтинг → самостоятельный выбор команды → решение остаётся за человеком.
Авторы коммитов
История коммитов
- 2026-09-23 17:56Update README.mdAlisher Seitkadyr
- 2026-09-23 17:49Docs: переименовать скриншот под ссылку в README (Requestprocessing.png)alisherseitkadyr
- 2026-09-23 17:48Merge remote-tracking branch 'origin/main' into alishalisherseitkadyr
- 2026-09-23 17:48updKuvernoori
- 2026-09-23 17:46Docker: в конце запуска выводить адрес приложенияalisherseitkadyr
- 2026-09-23 17:34scrKuvernoori
- 2026-09-23 17:24Git: игнорировать output/playwright в любой папкеalisherseitkadyr
- 2026-09-23 17:24Merge remote-tracking branch 'origin/main' into alishalisherseitkadyr
Все коммиты (57)
- 2026-09-23 17:24Git: убрать новые снимки Playwright (.playwright-cli, output/playwright) из репозиторияalisherseitkadyr
- 2026-09-23 17:22Merge branch 'main' of https://github.com/BAITC-Hacks/hack-7bc108f9-barniOmiromir
- 2026-09-23 17:22feat: add ambient background component and initial Playwright page structureOmiromir
- 2026-09-23 17:19Git: убрать frontend/.playwright-cli из репозитория, добавить в .gitignorealisherseitkadyr
- 2026-09-23 17:18Frontend: API через nginx-прокси (/api, /health), FRONTEND_PORT, без вшитого адреса бэкендаalisherseitkadyr
- 2026-09-23 17:17Merge branch 'main' of https://github.com/BAITC-Hacks/hack-7bc108f9-barniKuvernoori
- 2026-09-23 17:17upd modelKuvernoori
- 2026-09-23 17:11Merge remote-tracking branch 'origin/main' into alishalisherseitkadyr
- 2026-09-23 17:05Smoke: задачи с префиксом [smoke], удаляются после прогона, каталог не меняетсяalisherseitkadyr
- 2026-09-23 17:00Scripts: reset_demo.sh — очистить задачи и предложения, заново загрузить seedalisherseitkadyr
- 2026-09-23 16:59Seed: загрузка data/seed.json при старте, если нет опубликованных задачalisherseitkadyr
- 2026-09-23 16:59Add multiple YAML configuration files for task management interfaceOmiromir
- 2026-09-23 16:56Docker: фронтенд в compose (nginx, SPA-фолбэк, VITE_* как build args, реальный API)alisherseitkadyr
- 2026-09-23 16:39Merge pull request #2 from BAITC-Hacks/frontendOmiromir
- 2026-09-23 16:39Merge branch 'main' into frontendOmiromir
- 2026-09-23 16:37feat: enhance product entry and rating featuresOmiromir
- 2026-09-23 16:25Merge branch 'alish'alisherseitkadyr
- 2026-09-23 16:21Docker: бэкенд ждёт Postgres при старте и после restart, restart: unless-stoppedalisherseitkadyr
- 2026-09-23 16:10Docs: publish, каталог и предложения в контракте; api-examples пересняты с чистой базыalisherseitkadyr
- 2026-09-23 16:08Scripts: restart_check.sh — данные переживают перезапуск контейнеровalisherseitkadyr
- 2026-09-23 16:08Merge branch 'ai'Kuvernoori
- 2026-09-23 16:07Smoke: полная демо-цепочка tz.md §20alisherseitkadyr
- 2026-09-23 16:06Tests: публикация, каталог, предложения на отдельной тестовой БД; пустой prototype_url больше не даёт 500alisherseitkadyr
- 2026-09-23 16:04seedKuvernoori
- 2026-09-23 16:04Proposals: создание, списки по задаче и команде, PATCH accepted/rejectedalisherseitkadyr
- 2026-09-23 16:02Tasks: каталог GET /api/tasks с фильтрами и сортировкойalisherseitkadyr
- 2026-09-23 16:01Tasks: POST /api/tasks/{id}/publishalisherseitkadyr
- 2026-09-23 16:01Rating: поле засчитывается от 3 слов, contact от 5 символовalisherseitkadyr
- 2026-09-23 15:48feat(api): implement httpApi for task management and proposalsOmiromir
- 2026-09-23 15:38AI: поле source в ответах, topic только slugalisherseitkadyr
- 2026-09-23 15:38Rating: calculate_score, PUT confirm, POST rating/preview, proposals_countalisherseitkadyr
- 2026-09-23 15:38Docs: контракт пуша 1, api-examples с реальными ответами, smoke-тест confirm/preview/AIalisherseitkadyr
- 2026-09-23 15:33AGENTS.md: rating_service → №1, source/topic в schemas/ai.pyalisherseitkadyr
- 2026-09-23 15:22Merge branch 'main' of https://github.com/BAITC-Hacks/hack-7bc108f9-barniKuvernoori
- 2026-09-23 15:20feat: add backend requirements and ruff configurationOmiromir
- 2026-09-23 15:17readmeKuvernoori
- 2026-09-23 15:04Merge remote-tracking branch 'origin/main' into alishalisherseitkadyr
- 2026-09-23 15:01prepared api endpointsalisherseitkadyr
- 2026-09-23 14:43Merge branch 'ai'Kuvernoori
- 2026-09-23 14:42small chKuvernoori
- 2026-09-23 14:41Merge pull request #1 from BAITC-Hacks/frontendOmiromir
- 2026-09-23 14:25mergealisherseitkadyr
- 2026-09-23 14:17filealisherseitkadyr
- 2026-09-23 14:10Update README.mdAlisher Seitkadyr
- 2026-09-23 14:09Revoked +apiKuvernoori
- 2026-09-23 14:00feat: add TaskPage component for task management and proposal submissionOmiromir
- 2026-09-23 13:53AI basic + envKuvernoori
- 2026-09-23 12:18Fix README formattingAlisher Seitkadyr
- 2026-09-23 12:18Add 'change' note to READMEAlisher Seitkadyr
Структура репозитория (89 файлов)
.env.example .gitignore AGENTS.md README.md backend/.dockerignore backend/AI.md backend/Dockerfile backend/alembic.ini backend/alembic/env.py backend/alembic/script.py.mako backend/alembic/versions/.gitkeep backend/alembic/versions/0001_initial.py backend/app/api/ai.py backend/app/api/meta.py backend/app/api/proposals.py backend/app/api/rating.py backend/app/api/tasks.py backend/app/db.py backend/app/main.py backend/app/models/__init__.py backend/app/models/proposal.py backend/app/models/task.py backend/app/models/team.py backend/app/repositories/proposals.py backend/app/repositories/tasks.py backend/app/repositories/teams.py backend/app/schemas/ai.py backend/app/schemas/proposal.py backend/app/schemas/task.py backend/app/seed.py backend/app/services/ai_prompts.py backend/app/services/ai_service.py backend/app/services/rating_service.py backend/examples/analyze-draft.json backend/examples/build-card.json backend/pytest.ini backend/requirements-dev.txt backend/requirements.txt backend/ruff.toml backend/tests/conftest.py backend/tests/test_ai_live.py backend/tests/test_ai_validation.py backend/tests/test_api_flow.py backend/tests/test_rating.py backend/tests/test_seed.py data/seed.json docker-compose.yml docs/api-contract.md docs/api-examples.md docs/screenshots/Card.png docs/screenshots/Main.png docs/screenshots/QuestionsAI.png docs/screenshots/Rating.png docs/screenshots/Requestprocessing.png docs/screenshots/Tasks.png docs/screenshots/proposion.png docs/screenshots/publish.png frontend/.dockerignore frontend/.env.example frontend/.gitignore frontend/99-print-url.sh frontend/BACKEND_CONTRACT.md frontend/Dockerfile frontend/PROGRESS.md frontend/index.html frontend/nginx.conf frontend/package-lock.json frontend/package.json frontend/public/asar-logo.png frontend/src/App.tsx frontend/src/api/client.ts frontend/src/api/httpApi.ts frontend/src/components/AmbientBackground.tsx frontend/src/components/ProductIntro.tsx frontend/src/components/ScorePanel.tsx frontend/src/components/TaskCardEditor.tsx frontend/src/main.tsx frontend/src/pages/CatalogPage.tsx frontend/src/pages/CreatePage.tsx frontend/src/pages/TaskPage.tsx frontend/src/product-entry.css frontend/src/styles.css frontend/src/types.ts frontend/tsconfig.json frontend/vite.config.ts scripts/reset_demo.sh scripts/restart_check.sh scripts/smoke_test.sh tz.md
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.