AAYMA
RU
Войти

ASAR

Веб-платформа: бизнес описывает задачу своими словами, AI задаёт уточняющие вопросы и собирает структурированную карточку, backend считает рейтинг…

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

О проекте

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

ASAR

AI-платформа для подготовки бизнес-задач и открытого выбора студенческих команд

HackAlem AI / AI Sana · Education Track

Бизнес формулирует задачу своими словами → AI помогает уточнить детали → система собирает структурированную карточку и рассчитывает прозрачный рейтинг готовности → задача попадает в общий каталог → студенческие команды самостоятельно отправляют предложения → бизнес вручную принимает или отклоняет их.


Что решает ASAR

Хорошая учебная практика начинается не с красивого интерфейса, а с понятной задачи.

На практике бизнес часто описывает запрос слишком общо: без данных, ограничений, критериев успеха или ожидаемого результата. Из-за этого студенческим командам сложно оценить объём работы и предложить реалистичное решение.

ASAR превращает такое описание в готовую к работе карточку:

  • AI анализирует исходный текст;
  • определяет, каких сведений не хватает;
  • задаёт уточняющие вопросы;
  • формирует структурированную карточку без выдумывания фактов;
  • бизнес вручную проверяет и подтверждает информацию;
  • backend рассчитывает рейтинг готовности 0–100;
  • опубликованные задачи попадают в общий каталог;
  • студенческие команды отправляют предложения;
  • финальное решение по команде всегда остаётся за бизнесом.

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


Сквозной сценарий

Слабое описание задачи
        ↓
AI-анализ
        ↓
Недостающие сведения + уточняющие вопросы
        ↓
Ответы бизнеса
        ↓
AI формирует карточку
        ↓
Ручное редактирование и подтверждение
        ↓
Прозрачный рейтинг готовности 0–100
        ↓
Публикация в общем каталоге
        ↓
Студенческая команда выбирает задачу
        ↓
Команда отправляет предложение
        ↓
Бизнес вручную принимает / отклоняет отклик

Интерфейс и сценарий работы

1. Старт: бизнес описывает задачу

ASAR — создание задачи

Пользователь начинает с обычного свободного описания. На этом этапе не требуется заранее заполнять длинную форму: достаточно выбрать тему и объяснить задачу своими словами.

Что демонстрирует экран:

  • низкий порог входа для бизнеса;
  • один понятный CTA — «Уточнить задачу с AI»;
  • переход от неструктурированного запроса к управляемому процессу;
  • возможность быстро загрузить демонстрационный пример.

2. AI задаёт только недостающие вопросы

ASAR — AI вопросы

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

Вопросы направлены на конкретные поля будущей карточки: текущий процесс, доступные данные, ограничения, ожидаемый результат, критерии успеха и другие важные детали.

Принцип: модель не должна придумывать сведения за пользователя. Если факта нет во входных данных — он остаётся неизвестным.


3. AI собирает редактируемую карточку

ASAR — карточка задачи

После ответов система формирует структурированную карточку.

Бизнес видит все поля и может вручную изменить любое значение перед подтверждением. Это сохраняет human-in-the-loop: AI структурирует информацию, а человек отвечает за её корректность.

Карточка включает:

  • название;
  • тему;
  • контекст и текущую ситуацию;
  • потребность;
  • пользователей;
  • доступные данные и материалы;
  • ограничения;
  • ожидаемый результат;
  • критерии успеха;
  • контакт;
  • формат взаимодействия.

4. Прозрачный рейтинг готовности

ASAR — рейтинг готовности

После подтверждения backend рассчитывает рейтинг задачи от 0 до 100.

Рейтинг не генерируется моделью. Это детерминированная backend-функция: пользователь видит, за какие поля начислены баллы и что ещё можно улучшить.

Формула рейтинга

ПолеБаллы
Контекст10
Потребность10
Данные и материалы20
Ожидаемый результат15
Критерии успеха15
Ограничения10
Пользователи10
Контакт5
Формат взаимодействия5
Всего100

Уровни готовности

БаллыУровень
0–39Черновик
40–69Рабочая
70–89Готовая
90–100Приоритетная

Низкий рейтинг не блокирует публикацию. Его задача — показать, каких сведений не хватает и где есть потенциал роста.


5. Публикация задачи

ASAR — публикация задачи

После подтверждения карточки и рейтинга бизнес публикует задачу.

На экране сразу видны:

  • итоговый рейтинг;
  • уровень готовности;
  • сохранённый task_id;
  • переход к опубликованной задаче;
  • переход в общий каталог.

После публикации карточка становится доступна студенческим командам.


6. Общий каталог задач

ASAR — каталог задач

Каталог — единая точка входа для студенческих команд.

Поддерживаются:

  • сортировка по рейтингу;
  • фильтрация по теме;
  • фильтрация по уровню готовности;
  • просмотр количества недостающих полей;
  • переход к полной карточке.

Рейтинг влияет на порядок отображения, но не скрывает задачи с низкой готовностью.


7. Полная карточка задачи

ASAR — детальная карточка задачи

Перед отправкой предложения команда может изучить подробную карточку и увидеть:

  • бизнес-контекст;
  • потребность;
  • пользователей;
  • доступные материалы;
  • ограничения;
  • ожидаемый результат;
  • критерии успеха;
  • текущий рейтинг;
  • недостающие сведения.

Это позволяет принять решение осознанно, а не ориентироваться только на заголовок задачи.


8. Предложение студенческой команды

ASAR — предложение команды

Студенческая команда самостоятельно выбирает задачу и отправляет предложение.

Предложение содержит:

  • идею решения;
  • план реализации;
  • предполагаемый срок;
  • ссылку на прототип — опционально.

Новое предложение получает статус 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:

  1. извлекает только известные сведения;
  2. определяет недостающие поля;
  3. формирует минимум три уточняющих вопроса;
  4. возвращает структурированный результат.

Формирование карточки

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.


Каталог и предложения

Все опубликованные задачи доступны всем студенческим командам.

Команда может:

  1. открыть каталог;
  2. применить фильтры;
  3. изучить карточку;
  4. самостоятельно выбрать задачу;
  5. отправить предложение.

Бизнес видит поступившие предложения и вручную выполняет одно из действий:

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

ASAR

Чёткая задача → прозрачный рейтинг → самостоятельный выбор команды → решение остаётся за человеком.

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

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

alisherseitkadyr 31Kuvernoori 11Omiromir 7Alisher Seitkadyr 4Omiromir 3Kuvernoori 1

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

  • 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
Ветки (4)

Обсуждение 0 комментариев

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

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