SaNa
Развёрнутый веб-MVP Challenge Hub: AI задаёт бизнесу 3–5 уточняющих вопросов, собирает живую карточку задачи с детерминированным рейтингом…
О проекте
Команда: SaNa
Кейс HackAlem.ai: Образование — AI Sana
Стадия: Доведённый продукт
Задача кейса: Challenge Hub: превратить задачу бизнеса в задание для студенческих команд
Суть
Развёрнутый веб-MVP Challenge Hub: AI задаёт бизнесу 3–5 уточняющих вопросов, собирает живую карточку задачи с детерминированным рейтингом готовности 0–100, студенты откликаются, бизнес вручную принимает команду и подтверждает этапы.
Как устроено
/api/analyze через OpenAI Responses API возвращает типизированный JSON: 3–5 вопросов и по три варианта ответа на каждый. /api/build-card собирает карточку, и сервер принимает каждое AI-поле только при точной цитате-доказательстве из ввода пользователя. /api/edit-card-field по команде пользователя точечно меняет поле, изменение применяется после предпросмотра. Рейтинг считается по весам полей (20/20/15/15/10/10/10). Хранение в PostgreSQL/Neon или локальных JSON, при недоступности AI работает fallback.
Ключевые решения
- structured outputs (Pydantic)
- проверка цитат-доказательств
- AI-редактирование выбранного поля
- детерминированный readiness rating
- fallback mode
Особенности
Публичный деплой на Vercel и видео. В живой карточке можно выделить текст и дать AI команду («сократи», «добавь срок») с предпросмотром перед применением. Баллы команде начисляются только после подтверждения результата бизнесом.
Стек
Python · FastAPI · Uvicorn · React 19 · Vite · PostgreSQL · Neon · Vercel · pytest
Модели
gpt-6-astra
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-2036a781-sana.
README
README.mdSaNa — AI-конструктор практических задач
От неструктурированной идеи бизнеса — к проверяемой задаче для студенческой команды.
Открыть работающий сайт · GitHub · Сценарий проверки

Посмотреть мобильную версию
Видео проекта
▶ Открыть короткое Full HD видео SaNa
Коротко: что это за продукт
SaNa — рабочий веб-MVP по кейсу HackAlem AI о геймификации практических заданий и качестве бизнес-задач. Он соединяет две стороны:
- бизнес формулирует реальную проблему, уточняет её вместе с AI, проверяет карточку и вручную публикует задачу;
- студенческие команды видят открытый каталог, выбирают подходящую задачу и отправляют идею решения;
- бизнес сам принимает решение, с какой командой работать — AI ничего не выбирает автоматически.
Главная ценность продукта: человеку не нужно заранее знать, как правильно составлять техническое задание. Достаточно описать проблему обычными словами. SaNa найдёт пробелы, задаст уточняющие вопросы, соберёт карточку и покажет прозрачный рейтинг готовности.
AI помогает формулировать. Факты подтверждает пользователь. Публикация и выбор команды всегда остаются за человеком.
Проблема и решение
| Проблема | Как решает SaNa |
|---|---|
| Бизнес описывает запрос слишком общо | AI задаёт 3–5 контекстных вопросов о результате, данных, пользователях, критериях и ограничениях |
| В задаче появляются неподтверждённые догадки | Карточка собирается только из текста и ответов пользователя; неизвестные поля остаются пустыми |
| Непонятно, готова ли задача для команды | Детерминированный рейтинг 0–100 объясняет каждый балл и показывает, чего не хватает |
| Исправления приходится вносить через длинную форму | В живой карточке можно нажать на блок или выделить текст и дать AI точную команду |
| Слабые задачи исчезают из отбора | Низкий рейтинг не скрывает задачу: весь каталог остаётся открытым |
| Алгоритм может выбрать команду непрозрачно | Команды только предлагают решения, а бизнес принимает или отклоняет их вручную |
| Результаты сложно подтвердить | Команда прикладывает ссылку на результат, баллы начисляются только после подтверждения бизнеса |
Что уже работает
Для бизнеса
- AI-диалог с минимум тремя уточняющими вопросами;
- три примерных варианта ответа на каждый вопрос;
- честный индикатор этапов обработки, пока AI отвечает;
- живая карточка рядом с чатом и возможность свернуть её;
- переключение между визуальной карточкой и обычными полями;
- редактирование блока мышкой или выделением конкретного текста;
- AI-команды вида «сократи», «сделай понятнее», «добавь срок 4 недели»;
- предварительный просмотр AI-изменения перед кнопкой «Применить»;
- автоматический пересчёт рейтинга после изменения полей;
- только ручная публикация;
- повторное редактирование уже опубликованной задачи;
- просмотр, принятие и отклонение предложений команд;
- подтверждение результата этапа и начисление баллов команде;
- профиль бизнеса и перенос защищённого кода доступа на другое устройство.
Для студенческой команды
- профиль с интересами, навыками и технологиями;
- открытый каталог всех опубликованных задач;
- фильтры по теме и уровню готовности, сортировка по рейтингу или дате;
- рекомендации по совпадению с профилем без скрытия остальных задач;
- подробная карточка с условиями и всеми подсказками рейтинга;
- понятная форма предложения: идея, план, срок, ссылка на прототип;
- история своих откликов и отправка результата этапа;
- таблица подтверждённого прогресса.
Пользовательский путь
flowchart LR
A[Бизнес описывает проблему] --> B[SaNa задаёт 3–5 вопросов]
B --> C[Живая карточка]
C --> D[Рейтинг 0–100]
D --> E{Бизнес проверил?}
E -- Нет --> F[Ручное или AI-редактирование]
F --> C
E -- Да --> G[Публикация в каталоге]
G --> H[Команда предлагает решение]
H --> I{Решение бизнеса}
I -- Принять --> J[Работа и отчёт об этапе]
I -- Отклонить --> G
J --> K[Подтверждение и баллы]
Рейтинг готовности
Рейтинг оценивает полноту конкретной задачи, а не компанию и не качество идеи. Формула полностью детерминирована: AI не назначает баллы.
| Показатель | Поля карточки | Баллы |
|---|---|---|
| Контекст и потребность | context, need | 20 |
| Данные и материалы | data_materials | 20 |
| Ожидаемый результат | expected_result | 15 |
| Критерии успеха | success_criteria | 15 |
| Ограничения | constraints | 10 |
| Пользователи | users | 10 |
| Связь с бизнесом | contact, interaction_format | 10 |
| Всего | 100 |
Поле считается заполненным при наличии не менее 15 символов после удаления пробелов. Если показатель состоит из двух полей, одно заполненное поле даёт половину его баллов.
| Баллы | Уровень |
|---|---|
| 0–39 | Нужны уточнения |
| 40–69 | Рабочая |
| 70–89 | Готовая |
| 90–100 | Приоритетная |
Низкий балл влияет только на метку и позицию при сортировке. Он не блокирует публикацию и не запрещает отклик.
Архитектура
flowchart TB
Browser[React 19 · Vite] -->|JSON / HTTPS| API[FastAPI]
API --> Rating[Детерминированный рейтинг]
API --> AI[OpenAI Responses API]
API --> Store{Хранилище}
Store --> Neon[(PostgreSQL / Neon)]
Store --> Local[(Локальные JSON-файлы)]
AI --> Fallback[Безопасный fallback]
API --> Static[Production-сборка app/static]
Как AI работает с данными
/api/analyzeполучает черновик, тему и язык.- Модель возвращает строго типизированный JSON с 3–5 вопросами и тремя вариантами ответа для каждого.
/api/build-cardполучает черновик и ответы.- Каждое AI-поле содержит точную цитату-доказательство из пользовательского ввода. Сервер принимает поле только при совпадении с исходным текстом.
/api/edit-card-fieldизменяет только выбранное поле и только после отдельной команды пользователя.- Перед применением пользователь видит предложенный текст и подтверждает изменение вручную.
- Если ключ отсутствует, сеть недоступна или ответ не прошёл схему, включается локальный fallback.
Промпты находятся в core/prompts.py, AI-логика — в core/ai.py, контракт — в docs/CONTRACT.md.
Технологии
| Слой | Технологии | Назначение |
|---|---|---|
| Frontend | React 19, Vite, CSS | SPA, AI-чат, живая карточка, каталог, профили |
| Backend | Python 3.11+, FastAPI, Uvicorn | API, валидация, права доступа, бизнес-логика |
| AI | OpenAI Python SDK, Responses API, Pydantic-схемы | Вопросы, сборка и точечное редактирование карточки |
| Данные | PostgreSQL/Neon или локальный JSON | Задачи, команды, предложения, этапы |
| Проверки | pytest, httpx | API, рейтинг, AI fallback и полный пользовательский сценарий |
| Деплой | Vercel | Публичная production-версия |
Быстрый запуск
Требования
- Python 3.11+;
- Node.js 20+ и npm;
- OpenAI API key — необязателен: без него работает fallback;
- PostgreSQL/Neon — необязателен: без него данные сохраняются локально.
Windows PowerShell
git clone https://github.com/BAITC-Hacks/hack-2036a781-sana.git
cd hack-2036a781-sana
py -3.11 -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install -r requirements.txt
Copy-Item .env.example .env
npm install
npm run build
python -m uvicorn app.main:app --host 127.0.0.1 --port 8000
Откройте http://127.0.0.1:8000.
macOS / Linux
git clone https://github.com/BAITC-Hacks/hack-2036a781-sana.git
cd hack-2036a781-sana
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -r requirements.txt
cp .env.example .env
npm install
npm run build
python -m uvicorn app.main:app --host 127.0.0.1 --port 8000
Разработка интерфейса
В первом терминале запустите backend:
python -m uvicorn app.main:app --host 127.0.0.1 --port 8000
Во втором терминале запустите Vite:
npm run dev
Production-сборка создаётся командой npm run build и попадает в app/static/.
Переменные окружения
Скопируйте .env.example в .env. Сам .env исключён из Git.
| Переменная | Обязательна | Назначение |
|---|---|---|
OPENAI_API_KEY | Нет | Включает реальные AI-ответы |
OPENAI_MODEL | Нет | Модель; значение проекта по умолчанию — gpt-6-astra |
OPENAI_REASONING_EFFORT | Нет | medium, high, xhigh или max |
OPENAI_MAX_OUTPUT_TOKENS | Нет | Ограничение токенов ответа, по умолчанию 6000 |
REQUEST_TIMEOUT_SECONDS | Нет | Таймаут запроса к AI, максимум 180 секунд |
AI_MODE=fallback | Нет | Гарантированная демонстрация без внешнего AI |
DATABASE_URL | Нет | PostgreSQL/Neon; без неё используется .sana-data/ |
SANA_DATA_DIR | Нет | Другой путь для локальных данных |
APP_PORT | Нет | Документированный порт приложения, по умолчанию 8000 |
Никогда не добавляйте API-ключи и строку подключения к базе в README, исходный код или коммит.
Как проверить за 7 минут
1. Проверить AI-конструктор
- Откройте production-сайт или локальную версию.
- Нажмите «Создать задачу».
- Нажмите «Загрузить пример» или напишите:
Нужно сократить время проверки домашних работ по Python. - Отправьте сообщение и ответьте на уточняющие вопросы. Можно выбирать один из трёх предложенных вариантов.
- Пока AI отвечает, убедитесь, что видны этапы обработки.
2. Проверить живую карточку и AI-редактирование
- После последнего ответа справа появится карточка.
- Нажмите «Карточка» для визуального режима.
- Нажмите мышкой на блок «Проблема» или выделите часть текста.
- Напишите команду:
Сделай короче и понятнее. - Нажмите «Предложить изменение».
- Проверьте результат и только затем нажмите «Применить».
- Переключитесь в режим «Поля», вручную измените текст и проверьте пересчёт рейтинга.
3. Проверить публикацию и каталог
- Нажмите «Подтвердить и опубликовать».
- Откройте «Каталог».
- Проверьте фильтры, сортировку и кнопку «Открыть задачу».
- Убедитесь, что незаполненные данные явно отмечены, а рейтинг показывает все советы.
4. Проверить путь команды
- Переключитесь на роль «Команда».
- Нажмите «Создать команду» — откроется профиль.
- Заполните название, интересы, навыки и технологии.
- Вернитесь в каталог, откройте задачу и нажмите «Предложить решение».
- Укажите идею, план, срок и тестовую ссылку
https://example.org/prototype.
5. Проверить решение бизнеса
- Вернитесь к роли «Бизнес».
- Откройте «Мои задачи».
- Примите или отклоните предложение вручную.
- Для принятой команды отправьте результат этапа, затем подтвердите его бизнесом.
- Проверьте начисление 10 баллов в таблице прогресса.
Надёжная демонстрация без интернета
Перед запуском установите в .env:
AI_MODE=fallback
В этом режиме полный сценарий доступен без OpenAI: используются локальные вопросы, варианты ответов и безопасная сборка карточки из введённых фактов.
Автоматические проверки
python -m pytest -q
Ожидаемый результат:
27 passed
Дополнительные проверки:
npm run build
curl http://127.0.0.1:8000/api/health
Ожидаемый health-check при Neon/PostgreSQL:
{"status":"ok","storage":"postgresql"}
Основные API-методы
| Метод | Endpoint | Что проверяет |
|---|---|---|
GET | /api/health | Состояние сервера и тип хранилища |
POST | /api/analyze | Анализ черновика и уточняющие вопросы |
POST | /api/build-card | Сборка карточки только из пользовательских фактов |
POST | /api/edit-card-field | AI-редактирование выбранного поля |
POST | /api/rating | Детерминированный пересчёт рейтинга |
GET/POST | /api/tasks | Каталог и публикация задач |
PUT | /api/tasks/{id} | Изменение своей задачи по коду владельца |
GET/POST | /api/tasks/{id}/proposals | Предложения команд |
POST | /api/proposals/{id}/decision | Ручное решение бизнеса |
POST | /api/proposals/{id}/progress | Отчёт команды об этапе |
POST | /api/progress/{id}/decision | Подтверждение этапа бизнесом |
Подробные структуры запросов и ответов: docs/CONTRACT.md.
Структура репозитория
Hackalem/
├── app/
│ ├── main.py # FastAPI endpoints и проверка доступа
│ └── static/ # production-сборка React
├── core/
│ ├── ai.py # OpenAI, схемы и fallback
│ ├── prompts.py # системные промпты
│ ├── rating.py # формула рейтинга
│ └── store.py # Neon/PostgreSQL и локальное хранилище
├── frontend/
│ ├── src/App.jsx # интерфейс и пользовательские сценарии
│ └── src/styles.css # адаптивный дизайн SaNa
├── tests/ # 27 автоматических проверок
├── docs/ # контракт, аудит кейса и документация
├── data/ # синтетические примеры, не production-данные
├── api/index.py # входная точка Vercel
├── requirements.txt
├── package.json
└── vercel.json
Хранение и безопасность
- секреты читаются только из переменных окружения;
.env,.sana-data/и локальные данные исключены из Git;- сервер валидирует длину и тип всех входных полей;
- внешние ссылки принимаются только с безопасной схемой
http/https; - коды владельца и команды хранятся на сервере только в виде хеша;
- изменение задач, решений и прогресса требует соответствующий код доступа;
- OpenAI-запросы выполняются с
store=False; - неизвестные факты не должны автоматически попадать в карточку;
- AI-изменение не применяется без явного нажатия пользователя.
Деплой
Рабочая версия: https://sana-hackalem.vercel.app
Vercel выполняет npm run build, публикует React-сборку из app/static/ и направляет API-запросы в api/index.py. Для production необходимо задать OPENAI_API_KEY и DATABASE_URL в переменных окружения проекта Vercel.
Ограничения MVP
- нет полноценной регистрации: права восстанавливаются через личный код доступа;
- при потере кода и очистке браузера доступ автоматически восстановить нельзя;
- локальная версия доступна другим пользователям только пока запущен сервер;
- AI зависит от доступности провайдера, поэтому предусмотрен fallback;
- правила начисления 10 баллов за подтверждённый этап — механика MVP;
- перед реальным использованием нужно добавить мониторинг, резервные копии базы, rate limiting и полноценную авторизацию.
Полезные документы
SaNa — саналы көмекші, сенің білім серігің.
AI помогает. Решение всегда за вами.
Авторы коммитов
История коммитов
- 2026-09-23 17:58Delete ggd_Aisingl_
- 2026-09-23 17:57feat: connect legacy data and AI solution coachAsizxs33
- 2026-09-23 17:52merge: integrate account and delivery workflowAsizxs33
- 2026-09-23 17:48feat: add account roles, team invites and reviewed solution workflowmansurkenma54
- 2026-09-23 17:46docs: add SaNa project videoAsizxs33
- 2026-09-23 17:31docs: create judge-ready project READMEAsizxs33
- 2026-09-23 17:24merge: integrate latest catalog UX updatesAsizxs33
- 2026-09-23 17:19feat: add AI-assisted card editingAsizxs33
Все коммиты (41)
- 2026-09-23 17:18fix: clarify task catalogue and connect team profile navigationmansurkenma54
- 2026-09-23 17:12style: align task sheet with Sana themeAsizxs33
- 2026-09-23 17:10feat: show AI processing progressAsizxs33
- 2026-09-23 17:04feat: add dynamic task sheet previewAsizxs33
- 2026-09-23 17:00merge: add landing page while preserving functionalityAsizxs33
- 2026-09-23 16:56feat: expand chat when live card is collapsedAsizxs33
- 2026-09-23 16:55Revert "feat: restructure live card visual hierarchy"Asizxs33
- 2026-09-23 16:54feat: restructure live card visual hierarchyAsizxs33
- 2026-09-23 16:49feat: introduce Sana landing page with animated mascot and nine-step journeymansurkenma54
- 2026-09-23 16:46feat: toggle live card visibilityAsizxs33
- 2026-09-23 16:43merge: update design while preserving functionalityAsizxs33
- 2026-09-23 16:41fix: render Sana mascot with transparent pixel vectormansurkenma54
- 2026-09-23 16:39fix: set Vercel build outputAsizxs33
- 2026-09-23 16:38chore: configure Vercel deploymentAsizxs33
- 2026-09-23 16:38design: simplify Sana with white sidebar and green-black panelsmansurkenma54
- 2026-09-23 16:34Merge remote-tracking branch 'origin/design/ui-redesign' into feature/functionalityAsizxs33
- 2026-09-23 16:30fix: align Sana identity and typography with supplied referencesmansurkenma54
- 2026-09-23 16:20feat: redesign Sana interface and animated mascotmansurkenma54
- 2026-09-23 16:19feat: add AI answer suggestionsAsizxs33
- 2026-09-23 16:09feat: add Neon PostgreSQL storageAsizxs33
- 2026-09-23 16:04feat: integrate OpenAI Responses APIAsizxs33
- 2026-09-23 15:59feat: strengthen task workflow and team functionalityAsizxs33
- 2026-09-23 15:50feat: rebuild Sana with React AI workspaceAsizxs33
- 2026-09-23 15:39Merge pull request #3 from BAITC-Hacks/codex/sana-final-handoffwiw
- 2026-09-23 15:38docs: align Sana handoff with verified releasewiw
- 2026-09-23 15:33Merge pull request #2 from BAITC-Hacks/codex/sana-working-mvpwiw
- 2026-09-23 15:32feat: secure Sana workflow and live datawiw
- 2026-09-23 15:23Merge pull request #1 from BAITC-Hacks/codex/sana-working-mvpwiw
- 2026-09-23 15:20feat: add Sana multilingual working MVPwiw
- 2026-09-23 15:10vcvxzmansurkenma54
- 2026-09-23 15:00feat: import working FastAPI MVPAsizxs33
- 2026-09-23 14:25Merge remote-tracking branch 'origin/main'Asizxs33
- 2026-09-23 14:25docs: add hackathon plan and agent guidelinesAsizxs33
Структура репозитория (60 файлов)
.codex/skills/pre-commit-check.md .env.example .gitignore AGENTS.md README.md api/index.py app/__init__.py app/account_routes.py app/main.py app/static/assets/index-CM7TN6kB.css app/static/assets/index-CwKI1f8l.js app/static/assets/sana-brand-reference-7QTvPC_q.png app/static/index.html core/__init__.py core/accounts.py core/ai.py core/prompts.py core/rating.py core/store.py core/workflow.py data/demo.json data/drafts.json data/progress.json data/proposals.json data/tasks.json data/teams.json docs/CASE_AUDIT.md docs/CHECKLIST.md docs/CODEX.md docs/CONTRACT.md docs/HACKATHON_PLAN.md docs/IDEA_TOPICS.md docs/INDEX.md docs/PLAN.md docs/ROLE-1-AI.md docs/ROLE-2-UI.md docs/ROLE-3-RATING-QA.md docs/START.md docs/images/sana-home.png docs/images/sana-mobile.png docs/images/sana-video-cover.jpg docs/media/sana-platform-animation.mp4 frontend/index.html frontend/src/AccountUI.jsx frontend/src/App.jsx frontend/src/assets/sana-brand-reference.png frontend/src/assets/sana-character-reference.png frontend/src/main.jsx frontend/src/styles.css frontend/vite.config.js package-lock.json package.json pytest.ini requirements.txt tests/conftest.py tests/test_accounts_workflow.py tests/test_ai.py tests/test_api.py tests/test_rating.py vercel.json
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.