AI Sana
Платформа Challenge Hub. Бизнес описывает задачу, получает 3–5 уточняющих вопросов и заполняет карточку с рейтингом готовности 0–100, затем…
О проекте
Команда: KemeldenAI
Кейс HackAlem.ai: Образование — AI Sana
Стадия: Доведённый продукт
Задача кейса: Challenge Hub: превратить задачу бизнеса в задание для студенческих команд
Суть
Платформа Challenge Hub. Бизнес описывает задачу, получает 3–5 уточняющих вопросов и заполняет карточку с рейтингом готовности 0–100, затем публикует её. Студенческие команды находят задачу в каталоге с рекомендациями и откликаются, а бизнес вручную выбирает команды и подтверждает этапы (10 баллов прогресса за этап).
Как устроено
FastAPI с SQLAlchemy и PostgreSQL хранит карточки, отклики, решения и прогресс. Помощник запрашивает уточняющие вопросы у OpenAI Chat Completions (gpt-4o-mini), а без ключа работает локальный алгоритм. Подсказки для карточки — только фрагменты исходного текста с указанием источника, и принимает их человек. Рейтинг готовности считается фиксированными правилами по 8 аспектам. Рекомендации задач строятся на совпадении слов, профиле команды и истории кликов. Перед отправкой в LLM из текста удаляются email и телефоны.
Ключевые решения
- rule-based readiness scoring
- grounded suggestions with source fragments
- keyword/profile/click-history recommendations
- PII scrubbing before LLM
- local fallback questions
- TDD (RED/GREEN)
Особенности
Разработка шла двумя параллельными «агентами» (A — API, B — UI) по TDD: коммиты RED/GREEN, 36 тестов на старте. LLM не ставит баллы и ничего не публикует, его предложения опираются на цитаты из ввода. Есть развёрнутая демо-версия.
Стек
Python · FastAPI · Pydantic · SQLAlchemy · PostgreSQL · psycopg · Docker Compose · React · TypeScript · Vite · pytest · Ruff
Модели
gpt-4o-mini
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-4349459c-kemeldenai.
README
README.mdAI Sana — практические задачи для бизнеса и студенческих команд
Краткое описание
AI Sana помогает представителю бизнеса превратить первоначальную идею в понятную практическую задачу, а студенческой команде — найти её и предложить решение. Бизнес видит, какой информации не хватает в карточке, дополняет её и сам решает, с какими командами работать. Это локально запускаемый демонстрационный проект HackAlem.
Что реализовано
- Два демо-сценария: вход от имени представителя бизнеса или одной из подготовленных студенческих команд, с возможностью переключаться между ними.
- Конструктор задачи: описание своими словами, 3–5 уточняющих вопросов, редактируемая карточка, сохранение черновика, подтверждение и публикация. Если ключ OpenAI не задан или запрос не удался, вопросы формируются локально.
- Подсказки по карточке: помощник предлагает фрагменты из исходного описания с указанием текста-источника. Пользователь может изменить, принять или отклонить предложение; оно не записывается в карточку автоматически.
- Рейтинг готовности 0–100: сервер начисляет баллы за наличие содержательной информации о контексте, потребности, данных, результате, критериях успеха, ограничениях, пользователях и взаимодействии с бизнесом. Показаны разбивка и незаполненные пункты. Рейтинг обновляется после подтверждения карточки и не запрещает публикацию задачи с низким баллом.
- Каталог и отклики команд: опубликованные задачи доступны всем демо-командам; есть поиск, фильтры, сохранённые задачи и объяснимые рекомендации по профилю команды и её действиям. Команда отправляет идею, план, срок и HTTP(S)-ссылку на прототип. Черновик отклика сохраняется в этом браузере.
- Решение бизнеса и прогресс: бизнес вручную выбирает, отклоняет или оставляет отклики без решения; можно выбрать несколько команд. Подтверждение одного завершённого этапа выбранной команды начисляет ей 10 баллов прогресса один раз. Команда видит свои отклики, их статусы и ранг, вычисленный в интерфейсе из накопленных баллов.
Как работает решение
- Представитель бизнеса вводит описание задачи. API запрашивает уточняющие вопросы у OpenAI при наличии ключа или использует локальный алгоритм. Сведения, явно содержащиеся в описании, могут появиться как предложения с проверяемым фрагментом-источником.
- Человек отвечает на вопросы и редактирует карточку. Черновик можно сохранить заранее; после подтверждения сервер фиксирует текущую версию и рассчитывает рейтинг по фиксированным правилам. Модель не выставляет баллы и не публикует задачу.
- После публикации карточка появляется в открытом каталоге. Команда изучает условия и отправляет отклик. Рекомендации помогают упорядочить задачи, но не закрывают доступ к остальному каталогу.
- Бизнес просматривает отклики и принимает решение сам. Если выбранная команда завершила этап, бизнес подтверждает результат, а баллы прогресса сохраняются в PostgreSQL. Интерфейс пересчитывает видимый ранг команды по этим баллам.
Технологии
| Часть | Используется |
|---|---|
| Интерфейс | TypeScript, React 19, Vite 8, CSS |
| API | Python 3.11+, FastAPI, Pydantic, SQLAlchemy |
| База данных | PostgreSQL 17 через Docker Compose, драйвер psycopg |
| AI | OpenAI Chat Completions API; модель по умолчанию — gpt-4o-mini. При отсутствии ключа работает локальный сценарий уточнений |
| Проверки | Pytest, Ruff; сборка TypeScript/Vite и тесты логики интерфейса на Node.js |
Рекомендации задач и рейтинг готовности рассчитываются правилами проекта, без обученной модели рекомендаций.
Архитектура
Браузер: React + Vite
├─ интерфейс бизнеса и команды
├─ localStorage: выбранный демо-участник и черновики откликов
└─ запросы /api
↓
FastAPI
├─ карточки, отклики, решения и подтверждённый прогресс
├─ расчёт рейтинга и рекомендаций
├─ помощник задач → OpenAI API (необязательно; есть локальный fallback)
└─ SQLAlchemy → PostgreSQL
Код интерфейса находится в web/, API и логика — в api/app/, запуск базы — в compose.yaml. Контракт API доступен в api/openapi.json; дополнительные решения и результаты проверок — в docs/.
Установка и запуск
Команды ниже рассчитаны на macOS/Linux. Нужны Docker с Compose, Python 3.11+ и Node.js 20.19+ или 22.12+ с npm.
-
Получите репозиторий и создайте локальную конфигурацию:
git clone https://github.com/BAITC-Hacks/hack-4349459c-kemeldenai.git cd hack-4349459c-kemeldenai cp .env.example .envВ
.envзамените учебныйPOSTGRES_PASSWORDи укажите такой же пароль вDATABASE_URL. Не добавляйте.envи API-ключи в Git.OPENAI_API_KEYможно оставить пустым: демонстрация продолжит работать с локальными вопросами. При необходимости изменитеOPENAI_MODEL. -
Запустите PostgreSQL:
docker compose up -d db docker compose psДождитесь состояния
healthyу контейнера базы. Если порт5432занят, поменяйтеPOSTGRES_PORTв.envи порт вDATABASE_URLна одно и то же свободное значение. -
Установите зависимости API, создайте демонстрационные записи и запустите сервер из корня репозитория:
python3 -m venv api/.venv api/.venv/bin/python -m pip install -r api/requirements.txt api/.venv/bin/python -m api.app.seed api/.venv/bin/python -m uvicorn api.app.main:app --host 127.0.0.1 --port 8000API будет доступен на
http://127.0.0.1:8000, интерактивная схема — наhttp://127.0.0.1:8000/docs. Перезапустите API после изменения.env. -
В другом терминале запустите интерфейс:
cd web npm ci npm run devОткройте адрес, напечатанный Vite (обычно
http://127.0.0.1:5173/). В режиме разработки запросы/apiнаправляются на локальный сервер FastAPI.
Для проверки кода из корня репозитория можно выполнить api/.venv/bin/python -m pytest api/tests, api/.venv/bin/ruff check api, а из web/ — npm run build. Тесты логики интерфейса запускаются командой npm test на версии Node.js с поддержкой встроенной обработки TypeScript; в проекте они проверялись на Node.js 25.6.
Как проверить решение
- На экране «Демо-вход» выберите «Войти как бизнес». Введите, например: «Менеджеры вручную обрабатывают 100 заявок в день; нужен общий список заказов».
- Нажмите «Получить вопросы». Убедитесь, что показаны 3–5 вопросов. Без
OPENAI_API_KEYинтерфейс прямо обозначит локальный вариант. Ответьте на вопросы и при желании обновите их: введённые ответы должны сохраниться. - Перенесите ответы в карточку. Проверьте предложенные фрагменты исходного описания: до нажатия «Добавить в карточку» соответствующее поле остаётся пустым. Укажите название задачи, подтвердите карточку и посмотрите рейтинг и разбивку.
- Заполните ещё несколько недостающих полей, например данные и измеримый критерий успеха, затем подтвердите изменения. Рейтинг подтверждённой версии должен измениться. Опубликуйте задачу.
- Нажмите «Сменить участника», войдите как демо-команда Data Nomads и найдите опубликованную задачу в каталоге. Отправьте отклик с идеей, планом, сроком и HTTP(S)-ссылкой на прототип. Для проверки только формы можно использовать тестовый адрес
https://example.com/prototype; это не действующий прототип. - Вернитесь в бизнес-сценарий, откройте «Отклики команд» и вручную выберите полученный отклик. Подтвердите описанный завершённый этап. После переключения обратно на команду в «Мои отклики» будут видны решение и 10 начисленных баллов прогресса. Повторное подтверждение того же этапа баллы не удваивает.
Данные и интеграции
- При первом запуске создаются синтетические данные: пять опубликованных задач с разной готовностью, пять черновиков, пять команд и пять откликов. Повторный запуск заполнения не должен дублировать записи или перезаписывать изменения пользователя.
- Карточки, команды, отклики, решения, подтверждённый прогресс, сохранённые задачи и сигналы рекомендаций хранятся в локальном PostgreSQL. Выбранный демо-участник и черновики откликов сохраняются в браузере; черновики не синхронизируются между устройствами.
- Единственный внешний AI-сервис во время работы — OpenAI API, если серверу передан ключ. Ключ остаётся на сервере. При недоступности API используются локальные вопросы и ограниченный набор предложений из текста пользователя. Реальные бизнес-датасеты для запуска не требуются.
Ограничения
- Демо-вход не является авторизацией. Нет регистрации, паролей, разграничения прав на сервере и личных аккаунтов команд; выбранные демо-профили общие.
- Рейтинг задачи показывает полноту заполнения карточки, а не истинность фактов, качество идеи или вероятность успеха. Ранг команды отражает записанные баллы за подтверждённые этапы, а не независимую оценку её квалификации. Рекомендации основаны на совпадении слов, профиле команды и её действиях; они не понимают все синонимы и не являются обученной моделью.
- Предложения помощника ограничены проверяемыми фрагментами текста. Удаление типичных email-адресов и телефонов перед вызовом OpenAI не является полной анонимизацией. Человек должен проверить AI-ответы перед подтверждением.
- Черновики откликов хранятся только в текущем браузере. Нет синхронизации между устройствами, уведомлений о новых решениях и полноценного трекера выполнения проекта.
- Docker Compose запускает только базу данных; API и интерфейс стартуют отдельно. Текущая инициализация создаёт недостающие таблицы, но не выполняет миграции существующих столбцов для промышленного обновления схемы.
Развёрнутая версия
Авторы коммитов
История коммитов
- 2026-09-23 17:48fix(ui): distinguish catalog list and selected task panesAbylay Kali
- 2026-09-23 17:38merge: include latest main documentation before releaseAbylay Kali
- 2026-09-23 17:38feat(ui): apply graphite and cobalt portal redesignAbylay Kali
- 2026-09-23 17:31docs: add deployed demo linkAbylay Kali
- 2026-09-23 17:27Merge branch 'main' of https://github.com/BAITC-Hacks/hack-4349459c-kemeldenai into codex/portal-flow-auditAbylay Kali
- 2026-09-23 17:26Merge remote-tracking branch 'origin/main'akzholtech
- 2026-09-23 17:26Streamline student catalog and proposal experienceakzholtech
- 2026-09-23 17:24docs: record portal audit and visual directionAbylay Kali
Все коммиты (46)
- 2026-09-23 17:23merge: verify portal fixes with current mainAbylay Kali
- 2026-09-23 17:22fix: preserve portal recovery and normalize demo flowsAbylay Kali
- 2026-09-23 17:16docs: write Russian jury READMEAbylay Kali
- 2026-09-23 17:12merge: integrate remote updates with frontend team ranksakzholtech
- 2026-09-23 17:11feat: show frontend team ranks from confirmed progress pointsakzholtech
- 2026-09-23 17:05merge: integrate verified demo fixes with grounded task assistantAbylay Kali
- 2026-09-23 16:54docs: record completed AI task roundAbylay Kali
- 2026-09-23 16:51feat: ground task assistant questions and card suggestionsAbylay Kali
- 2026-09-23 16:51fix: stabilize clarification, readiness scoring, and demo navigationAbylay Kali
- 2026-09-23 16:42test(ui): cover repeat clarification transfer before helper implementationAbylay Kali
- 2026-09-23 16:36feat: add guided proposal writing with selective draft transferakzholtech
- 2026-09-23 16:24feat: add task summaries, saved proposal drafts, and recommendation controlsakzholtech
- 2026-09-23 16:13merge: integrate remote milestone implementation with student applicationsakzholtech
- 2026-09-23 16:12feat: add team bookmarks and application history with confirmed progressakzholtech
- 2026-09-23 16:09docs: assign future work by taskAbylay Kali
- 2026-09-23 16:02feat(api): persist confirmed milestones and progress pointsAbylay Kali
- 2026-09-23 15:56feat(ui): polish save and publication completion flowsAbylay Kali
- 2026-09-23 15:54feat: confirm selected-team milestones onceAbylay Kali
- 2026-09-23 15:52feat: recommend tasks using team focus and click historyakzholtech
- 2026-09-23 15:32setupakzholtech
- 2026-09-23 15:28docs: record live OpenAI evaluation findingsAbylay Kali
- 2026-09-23 15:27Merge main into UI polish and preserve demo participant flowsAbylay Kali
- 2026-09-23 15:23feat(ui): guide task creation and polish motion feedbackAbylay Kali
- 2026-09-23 15:14docs: assess AI requirements and plan grounded assistantAbylay Kali
- 2026-09-23 15:08feat(api): switch clarification provider to OpenAIAbylay Kali
- 2026-09-23 15:02feat(ui): add demo personas and progress flowAbylay Kali
- 2026-09-23 14:46docs: define next demo role and progress roundAbylay Kali
- 2026-09-23 14:32fix: align proposal flow and document integrated MVPAbylay Kali
- 2026-09-23 14:04merge: agent B frontend implementationAbylay Kali
- 2026-09-23 14:04merge: agent A API and PostgreSQL implementationAbylay Kali
- 2026-09-23 14:01fix(ui): handle nullable scores on unconfirmed draftsAbylay Kali
- 2026-09-23 13:54feat(ui): build task and proposal flowsAbylay Kali
- 2026-09-23 13:53feat: implement Agent A backend (GREEN: 36 tests, PostgreSQL flow)akzholtech
- 2026-09-23 13:49test: reproduce missing Cyrillic topic matches and verify safe database errorsakzholtech
- 2026-09-23 13:46test: specify Russian seeds across readiness bands (RED: uniform English seeds)akzholtech
- 2026-09-23 13:44test: cover partial drafts and API boundaries (RED: missing routes)akzholtech
- 2026-09-23 13:40test: specify Agent A API and clarification behavior (RED: missing backend)akzholtech
- 2026-09-23 13:30docs: define two-agent MVP plan and Postgres setupAbylay Kali
Структура репозитория (89 файлов)
.env.example .gitignore AGENTS.md README.md api/.gitignore api/HANDOFF.md api/IMPLEMENTATION.md api/app/__init__.py api/app/ai.py api/app/applications.py api/app/database.py api/app/main.py api/app/models.py api/app/recommendations.py api/app/scoring.py api/app/seed.py api/examples.json api/openapi.json api/pyproject.toml api/requirements.txt api/tests/conftest.py api/tests/test_ai.py api/tests/test_ai_quality.py api/tests/test_applications.py api/tests/test_backend_audit.py api/tests/test_contract.py api/tests/test_core.py api/tests/test_milestones.py api/tests/test_recommendations.py api/tests/test_scoring_quality.py api/tests/test_seeds.py api/verify_postgres.py compose.yaml docs/AI_REQUIREMENTS.md docs/DEMO_VERIFICATION.md docs/MAIN_TASK.md docs/NEXT_TASK.md docs/PORTAL_AUDIT.md docs/RECOMMENDATIONS.md docs/STUDENT_APPLICATIONS.md docs/TEAM_RANKS.md docs/VISUAL_SYSTEM.md web/.gitignore web/HANDOFF.md web/README.md web/index.html web/package-lock.json web/package.json web/public/favicon.svg web/screenshots/demo-entry-desktop.png web/screenshots/demo-entry-mobile.png web/screenshots/milestone-desktop.png web/screenshots/student-catalog-desktop.png web/screenshots/student-catalog-mobile.png web/src/App.tsx web/src/CompletionDialog.tsx web/src/DemoEntry.tsx web/src/MilestonePanel.tsx web/src/MyApplications.tsx web/src/ProposalAssistant.tsx web/src/Recommendations.tsx web/src/TaskSummary.tsx web/src/TeamRank.tsx web/src/api.ts web/src/bookmarks.ts web/src/catalogTopics.ts web/src/clarificationAnswers.ts web/src/demoSession.ts web/src/main.tsx web/src/motion.ts web/src/proposalAssistance.ts web/src/proposalDraftStorage.ts web/src/scoreReceipt.ts web/src/styles.css web/src/taskRestore.ts web/src/taskSuggestions.ts web/src/teamRanks.ts web/src/types.ts web/src/useProposalDrafts.ts web/tests/catalogTopics.test.mjs web/tests/clarificationAnswers.test.mjs web/tests/proposalAssistance.test.mjs web/tests/proposalDraftStorage.test.mjs web/tests/scoreReceipt.test.mjs web/tests/taskRestore.test.mjs web/tests/taskSuggestions.test.mjs web/tests/teamRanks.test.mjs web/tsconfig.json web/vite.config.ts
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.