AI Sana MVP
Streamlit-MVP Challenge Hub: бизнес с помощью ИИ превращает описание проблемы в карточку задачи с рейтингом полноты, студенческие команды…
О проекте
Команда: QyzCode
Кейс HackAlem.ai: Образование — AI Sana
Стадия: Рабочий MVP
Задача кейса: Challenge Hub: превратить задачу бизнеса в задание для студенческих команд
Суть
Streamlit-MVP Challenge Hub: бизнес с помощью ИИ превращает описание проблемы в карточку задачи с рейтингом полноты, студенческие команды откликаются, бизнес вручную выбирает команды и подтверждает этапы.
Как устроено
Бизнес вводит проблему, OpenAI Responses API задаёт минимум три уточняющих вопроса (с валидацией схемы и резервными отраслевыми вопросами без ключа), ответы переносятся в поля карточки без генерации фактов. Детерминированный рейтинг полноты (контекст+потребность 20, данные 20, результат 15, критерии 15, ограничения 10, пользователи 10, контакт 10) определяет уровень готовности, каталог сортируется по рейтингу. SQLite хранит задачи, профили, отклики и подтверждённые этапы (+10 баллов команде, повторное начисление заблокировано).
Ключевые решения
- LLM-уточняющие вопросы со строгой схемой
- резервные шаблонные вопросы
- детерминированный рейтинг полноты
- ручное подтверждение карточки
Особенности
Сценарий защиты расписан поминутно на 5 минут; интеграция трёх веток (backend, AI, frontend) с миграцией схем БД; Streamlit AppTest проходит полный путь через формы.
Стек
Python · Streamlit · SQLite · unittest
Модели
OpenAI Responses API
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-2819b8c3-qyzcode.
README
README.mdAI Sana — единый MVP
Бизнес описывает проблему, уточняет сведения, подтверждает карточку и публикует её. Студенты выбирают задачи и отправляют предложения. Бизнес вручную выбирает команды.
Стек: Python 3.10+, Streamlit, SQLite. Тёмно-синий интерфейс с голубыми акцентами.
Запуск на Windows
Откройте папку общего проекта в VS Code. Один раз выполните:
py -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r requirements.txt
Для запуска:
.\.venv\Scripts\python.exe -m streamlit run app.py
Активация окружения не нужна. Откройте адрес, который напечатает Streamlit.
SQLite-файл ai_sana.db создаётся автоматически рядом с кодом; его не нужно добавлять в Git.
Если старое окружение осталось в родительской папке, используйте соответствующий путь
..\.venv\Scripts\python.exe, но только если тот Python запускается.
Как показать MVP за 5 минут
- 0:00–0:40. «Бизнес» → «Создать задачу». Введите: «У магазина много списаний». Нажмите «Уточнить с ИИ». Покажите минимум три вопроса и текущий режим ИИ.
- 0:40–1:30. Ответьте на вопросы, перенесите ответы в карточку. Проверьте, что ответы появились в правильных полях. Введите название, контекст и потребность. При пустых остальных полях подтвердите карточку — 20 баллов.
- 1:30–2:10. Добавьте пользователей — 30 баллов; данные — 50. Остальные поля доведут карточку до 100. Каждый раз подтвердите и сохраните: номер задачи не меняется.
- 2:10–2:40. Опубликуйте сохранённую карточку. Перейдите в каталог, покажите сортировку по рейтингу и фильтры. Даже задача с 20 баллами доступна для отклика.
- 2:40–3:40. Переключите режим на «Команда». Добавьте профиль, выберите задачу, введите идею, план, срок, ссылку на прототип и отправьте предложение.
- 3:40–4:30. «Бизнес» → «Кабинет бизнеса». Сравните отклики, вручную выберите одну или несколько команд либо отклоните все. Автоматического назначения нет.
- 4:30–5:00. Для выбранной команды опишите проверенный результат этапа и поставьте галочку подтверждения. Покажите начисление 10 баллов за этап, а не за сам отклик.
Для наполнения каталога есть кнопка «Данные для защиты → Загрузить демопримеры»
в боковом меню. Она добавляет по пять синтетических задач, команд и предложений.
Записи отмечены [Демо], существующие задачи сохраняются, повторное нажатие не создаёт
дубликаты. Ссылки example.com являются демонстрационными, не настоящими прототипами.
Полный набор для организаторов: examples/demo_data.json (включая пять черновиков).
Альтернатива кнопке: python seed_demo.py.
Архитектура и интеграция команды
| Файл | Ответственность |
|---|---|
| app.py | Интерфейс Streamlit, вопросы, подтверждение, каталог, отклики и решения |
| backend.py | Формула рейтинга, get_catalog(topic, level) |
| database.py | SQLite: задачи, профили, предложения, подтверждённые этапы |
| integration.py | Согласование полей бэкенда и AI, перенос ответов без генерации фактов |
| task_ai/ | Модуль AI-участника: Responses API, валидация, резервные вопросы |
| styles.css, .streamlit/config.toml | Общая тема интерфейса |
| seed_demo.py | Явная загрузка синтетического набора без удаления пользовательских данных |
| tests/ | Изолированные тесты AI, БД, интеграции и интерфейса |
Интегрированы исходные изменения коллег:
backendна коммите16a0f49c7dbaa65600f7f3980bcd830f3b2ff27b;ai/task-clarificationна коммитеff23d692a96ce22f2bf1a9238b4af1e370e8fb22;frontendна коммите91478634a7c3a2ac710b481d97a0b84876b526b4.
Общая версия находится в main. Merge-коммит сохраняет историю всех трёх веток.
HTTP-сервер API отдельно не требуется: Streamlit вызывает Python-функции напрямую.
При первом запуске init_db() автоматически дополняет старую базу из любой ветки.
Сохраняются задачи, отклики, команды и баллы. Статус выбора команды унифицирован
как accepted; старый selected преобразуется автоматически. API бэкенда
create_proposal, set_proposal_status, confirm_stage, confirm_task сохранены;
функции интерфейса используют ту же базу и правила. Баллы считаются по completed_stages.
Скрипты check_*.py из backend также включены; запускайте их только на тестовой базе,
поскольку они создают примеры. Автоматические тесты ниже используют временные базы.
Единые поля: title, topic, context, need, users, data, constraints,
result, success_criteria, contact, interaction, description, confirmed.
Старые industry и success поддерживаются адаптером. AI получает только поля
task_ai.FIELDS и исходное описание — без id, статуса, темы или готового рейтинга.
Ответы пользователя добавляются к существующим сведениям, а подтверждение сбрасывается.
Тему при необходимости указывайте также словами в исходном описании для ИИ.
Рейтинг и правила каталога
| Раздел | Баллы |
|---|---|
| Контекст и потребность (оба поля) | 20 |
| Данные и материалы | 20 |
| Ожидаемый результат | 15 |
| Критерии успеха | 15 |
| Ограничения | 10 |
| Пользователи | 10 |
| Контакт и формат взаимодействия (оба поля) | 10 |
Баллы группы начисляются только при заполнении всех её полей и ручном подтверждении. Рейтинг измеряет полноту, не достоверность текста. Достоверность проверяет человек. Уровни: 0–39 — черновик; 40–69 — рабочая; 70–89 — готовая; 90–100 — приоритетная. Статус публикации и уровень готовности — разные вещи: опубликованная задача уровня «Черновик» видна всем и принимает неограниченное число откликов. Каталог сортируется по убыванию рейтинга; фильтры добровольны.
Редактирование по id обновляет запись без дубликатов. Сохранение неподтверждённого черновика снимает задачу с публикации. После подтверждения можно опубликовать её снова. Любое сохранение изменений снимает публикацию. После проверки подтвердите карточку и опубликуйте её снова. Остальные поля и уже полученные отклики сохраняются. Рейтинг на странице относится к последней сохранённой версии, не к неотправленному вводу.
Решение по одному отклику не меняет другие. За отклик или выбор баллы не начисляются. Бизнес может один раз подтвердить этап выбранного предложения: +10 баллов команде. Повторное начисление блокируется в БД. Уже заработанные баллы сохраняются при последующем изменении решения бизнеса.
ИИ и ключ API
Без ключа приложение работает с явно обозначенной локальной заглушкой. Она задаёт
отраслевые шаблонные вопросы, а не выполняет полноценный семантический анализ.
Для настоящего API скопируйте .env.example в .env и настройте ключ локально.
Streamlit читает только OPENAI_API_KEY, OPENAI_MODEL, OPENAI_TIMEOUT_SECONDS;
окружение процесса имеет приоритет. Не отправляйте .env и ключи на GitHub.
Снимите галочку «Использовать резервные вопросы без API», чтобы запросить модель.
API вызывается только кнопкой, а не при перерисовке страницы. Ошибка API приводит
к резервным вопросам с пояснением. ИИ не подтверждает карточку и не выбирает команду.
Промпт и схема находятся в task_ai/prompts.py и task_ai/schema.py.
Полный контракт: docs/AI_INTEGRATION.md.
Проверки
.\.venv\Scripts\python.exe -m unittest discover -s tests -v
Тесты используют временные базы и подменённый HTTP-транспорт. Они проверяют: вопросы и ошибки AI, отсутствие выдуманных полей, перенос ответов, ручное подтверждение, рост рейтинга, сортировку и старые темы, публикацию и редактирование без дубликатов, отклик на задачу с низким рейтингом, несколько выбранных команд, отклонение, этап и блокировку повторного начисления. Streamlit AppTest проходит весь путь через формы. Демоданные проверяются на повторную загрузку без потери существующих задач. Проверяется перенос обеих схем базы (из backend и frontend): номера задач и откликов, выбранные команды и ранее начисленные баллы сохраняются, повторное начисление запрещено.
Проверка настоящего API с вашим ключом выполняется отдельно; успешные тесты с подменой не доказывают доступность модели или квоты. Для интеграционных проверок платные запросы не выполнялись.
Ограничения MVP
Нет регистрации и разграничения доступа: переключатель «Бизнес / Команда» служит демонстрации, все бизнес-задачи доступны в кабинете. Для общего публичного размещения нужна авторизация. До этого используйте приложение локально с синтетическими данными. Один этап на предложение; чата, уведомлений и загрузки файлов нет. Перед сменой раздела сохраните форму. Несохранённые правки при навигации могут потеряться. SQLite хранит сохранённые задачи между перезапусками приложения.
Авторы коммитов
История коммитов
- 2026-09-23 16:45docs: document full AI Sana setup architecture and demoaluwoee
- 2026-09-23 16:41Объединить backend, AI и frontend в единый MVP AI SanaAruzhanSeitkhan
- 2026-09-23 16:25Добавить демоданные и инструкцию запуска AI SanaAruzhanSeitkhan
- 2026-09-23 16:14Проверен сквозной сценарий: 24 теста, закрытие SQLite и защита повторного начисленияAruzhanSeitkhan
- 2026-09-23 16:13docs(ai): explain setup architecture rating and demo checksaluwoee
- 2026-09-23 16:12Добавлен тёмно-синий интерфейс: вопросы ИИ, каталог, отклики и кабинет бизнесаAruzhanSeitkhan
- 2026-09-23 16:10Добавить профили команд и баллы за подтвержденный этапAyaulym
- 2026-09-23 16:07Соединены бэкенд и AI-уточнения, добавлены хранение откликов и обновление задачAruzhanSeitkhan
Все коммиты (21)
- 2026-09-23 16:05Добавить редактирование и повторное подтверждение задачAyaulym
- 2026-09-23 15:59Добавить ручной выбор и отклонение командAyaulym
- 2026-09-23 15:50Добавить создание и просмотр откликов командAyaulym
- 2026-09-23 15:40test(ai): verify API failures and document backend integrationaluwoee
- 2026-09-23 15:39Подключены рейтинг задачи и сохранение в SQLiteAruzhanSeitkhan
- 2026-09-23 15:37Добавить фильтры каталога по теме и готовностиAyaulym
- 2026-09-23 15:33Подключены рейтинг задачи и сохранение в SQLiteAruzhanSeitkhan
- 2026-09-23 15:27Добавить публикацию задач и каталог по рейтингуAyaulym
- 2026-09-23 15:13Добавлена форма карточки задачи с подтверждениемAruzhanSeitkhan
- 2026-09-23 15:08Добавить сохранение и чтение задач в SQLiteAyaulym
- 2026-09-23 15:06feat(ai): add OpenAI task clarification with validated fallbackaluwoee
- 2026-09-23 14:54Добавлена первая форма AI SanaAruzhanSeitkhan
- 2026-09-23 14:42Добавить карточку задачи и расчет рейтингаAyaulym
Структура репозитория (33 файлов)
.env.example .gitignore .streamlit/config.toml README.md app.py backend.py check_catalog.py check_edit.py check_filters.py check_progress.py check_proposals.py check_selection.py database.py docs/AI_INTEGRATION.md docs/AI_MODULE.md examples/ai_input.json examples/ai_output_offline.json examples/demo_data.json integration.py requirements.txt seed_demo.py styles.css task_ai/__init__.py task_ai/__main__.py task_ai/fallback.py task_ai/prompts.py task_ai/schema.py task_ai/service.py tests/test_app.py tests/test_demo.py tests/test_integration.py tests/test_merge_compatibility.py tests/test_task_ai.py
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.