AAYMA
RU
Войти

GhostTech

Challenge Hub: AI анализирует черновик бизнеса, задаёт 3–5 вопросов и собирает карточку с прозрачным рейтингом готовности.

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

О проекте

Команда: GhostTech
Кейс HackAlem.ai: Образование — AI Sana
Стадия: Рабочий MVP

Задача кейса: Challenge Hub: превратить задачу бизнеса в задание для студенческих команд

Суть

Challenge Hub: AI анализирует черновик бизнеса, задаёт 3–5 вопросов и собирает карточку с прозрачным рейтингом готовности. Студенческие команды получают рекомендации и откликаются, бизнес вручную принимает отклики. Есть лидерборды сообщества и интерфейс на RU/KZ/EN.

Как устроено

FastAPI + SQLAlchemy + SQLite с миграциями Alembic, фронтенд на ванильном HTML/JS. /api/tasks/analyze и /build-card вызывают OpenAI Chat Completions со строгой JSON-схемой: ответ валидируется, при ошибке формата делается одна повторная попытка, затем включается демо-режим. Промпты запрещают считать баллы и назначать команду. Рейтинг считается в scoring.py по наличию и длине полей (максимум 100) и возвращает breakdown и missing. Лимит AI — 20 запросов на аккаунт в сутки.

Ключевые решения

  • strict JSON schema
  • retry + demo fallback
  • rule-based readiness scoring
  • рекомендации по навыкам команды
  • leaderboard
  • i18n

Особенности

Рейтинг готовности задачи и рейтинг прогресса команд (баллы за подтверждённые этапы 10/20/30) разведены. Сервер исключает неподтверждённые фрагменты из оценки и предупреждает о подозрительных числах, контактах и ссылках. Есть квоты на AI и отдельные проверки безопасности.

Стек

Python · FastAPI · SQLAlchemy · Alembic · SQLite · uv · Make · JavaScript · HTML · CSS

Модели

OpenAI Chat Completions


Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-21886459-ghosttech.

README

README.md

GhostTech — готовность бизнес-задач и открытый выбор команд

Локальный MVP для кейса AI Sana. Предприниматель превращает короткое описание проблемы в редактируемую карточку, получает прозрачную оценку её полноты и публикует задачу. Студенты самостоятельно находят задачи и отправляют предложения; предприниматель вручную принимает одно, несколько или ни одного. Рекомендации не назначают команды и не ограничивают общий каталог.

Исходный код: BAITC-Hacks/hack-21886459-ghosttech.

Запуск

Нужны Python 3.11+, Make и uv. Из корня проекта:

make setup
make seed
make dev

Сайт: http://127.0.0.1:8000/; API: http://127.0.0.1:8000/docs. make setup устанавливает зависимости, создаёт backend/.env из примера, если файла ещё нет, и применяет миграции. make seed загружает демонстрационные данные без сброса существующих записей. Остановка — Ctrl+C. Если порт 8000 занят, запустите сервер на 8001:

uv run --project backend --locked uvicorn app.main:app --app-dir backend --host 127.0.0.1 --port 8001

Тогда откройте http://127.0.0.1:8001/. Для работы cookie-сессии удобнее открывать интерфейс с того же адреса и порта, что и API. Публичного адреса развёрнутого сайта в проекте нет.

Для воспроизводимой демонстрации ИИ укажите AI_MODE=demo в backend/.env. Для реального OpenAI оставьте AI_MODE=auto и добавьте OPENAI_API_KEY в этот файл; ключ не хранится в Git. Без ключа используется локальный деморежим. После изменения .env перезапустите сервер.

Для обновления существующей установки остановите сервер, получите изменения и примените миграции:

git pull
make setup
make dev

При необходимости добавьте примеры командой make seed. Существующая база сохраняется; миграции объединяют аккаунты, лимиты помощника и контакты команд.

Как устроен проект

ЧастьРеализация
Интерфейсfrontend/index.html, styles.css, app.js, api.js: HTML/CSS/JavaScript без сборки
API и доступFastAPI в backend/app/main.py и backend/app/api.py; аккаунты бизнеса и студентов, cookie-сессии и роли — backend/app/auth.py
ДанныеSQLAlchemy-модели в backend/app/models.py, SQLite по умолчанию в backend/data/, миграции Alembic в backend/migrations/
Бизнес-логикаbackend/app/routes.py — задачи, команды, отклики и этапы; backend/app/scoring.py — рейтинг готовности; backend/app/leaderboard.py — отдельный рейтинг сообщества и публичные профили
ПомощникАктивные маршруты backend/app/main.py используют backend/ai.py, backend/schemas_ai.py, backend/ai_demo.py и файлы prompts/analyze.md, prompts/build_card.md
Примерыsample_data/ и команда make seed

Гость может смотреть опубликованные задачи и демо-профили. Для действий зарегистрируйте два разных аккаунта: business создаёт собственные задачи и решает по откликам, student создаёт свою команду и откликается от неё. Демо-профили и их записи служат примерами для просмотра, а не аккаунтами для входа.

Рейтинг готовности задачи

Сервер суммирует баллы из backend/app/scoring.py; название и тема нужны для публикации, но баллов не дают. Пробелы по краям поля удаляются. Шкала основана на наличии и длине текста, а не на известности компании или оценке модели.

ПолеПустоЧастичноПолностью
Контекст и потребность — каждое поле05 при длине от 1010 при длине от 40
Данные и материалы010 при длине от 2020 при длине от 30
Ожидаемый результат07 при длине от 1515 при длине от 30
Критерии успеха010 за непустой текст без цифр и %15 за непустой текст с цифрой или %
Ограничения и пользователи — каждое поле05 при длине от 1010 при длине от 20
Контакт, формат взаимодействия0—по 5 за любое непустое значение

Рейтинг = сумма баллов всех девяти полей; максимум 10 + 10 + 20 + 15 + 15 + 10 + 10 + 5 + 5 = 100. Для текстовых полей короче порога частичного заполнения начисляется 0; длина указана в символах. Уровни: draft — 0–39, working — 40–69, ready — 70–89, priority — 90–100. API возвращает breakdown с баллами по каждому полю и missing с тем, что можно дополнить. Оценка пересчитывается после редактирования; смысл и достоверность сведений проверяет и подтверждает сам предприниматель.

Опубликованная задача с низким рейтингом остаётся в каталоге, помеченная как требующая уточнения. Рейтинг не запрещает отклик на задачу действующего заказчика. Черновик, который владелец ещё не подтвердил к публикации, в общий каталог не попадает.

Каталог, отклики и отдельный рейтинг сообщества

Каталог показывает опубликованные задачи с сортировкой по баллам готовности (по убыванию по умолчанию). Есть поиск, фильтры по теме, уровню, заказчику, типу работы и наличию откликов; доступны также сортировки по дате и числу откликов. Фильтры применяются до постраничной выдачи и кнопки «Показать ещё». Рекомендации для команды основаны на её интересах и навыках и показывают задачи от 40 баллов; остальные опубликованные задачи остаются в общем каталоге.

Студент указывает идею, план, срок и при желании HTTP/HTTPS-ссылку на прототип. Одна команда может откликнуться на одну задачу один раз; число разных команд для задачи не ограничено. Владелец задачи вручную принимает или отклоняет каждый отклик. Демо-задачи и исторические задачи без действующего заказчика остаются в каталоге для просмотра, но отклики на них закрыты; сквозной сценарий выполняется на новой задаче зарегистрированного бизнеса. Баллы команды за подтверждённые этапы составляют 10 за прототип, 20 за проверку с бизнесом и 30 за финальный результат; повторно тот же этап не начисляется. Это баллы команды за прогресс, они не меняют рейтинг готовности самой задачи.

Вкладка «Лидеры» доступна обеим ролям. Она показывает отдельный рейтинг бизнеса и команд за текущий месяц по UTC или всё время и открывает публичные профили с задачами, проектами и контактами. У бизнеса там складываются баллы задач, созданных в выбранный период и опубликованных сейчас, и подтверждённых этапов за период; у команды — баллы подтверждённых этапов, а за всё время также стартовые баллы демонстрационных команд. Этот рейтинг сообщества не влияет на сортировку задач по готовности и не выбирает исполнителей.

ИИ: вход, выход и ограничения

POST /api/tasks/analyze принимает JSON вида {"draft_text":"...","topic":"общепит"} и возвращает summary, предварительную draft_card, 3–5 вопросов {id, field, question}, списки заполненных и недостающих полей, warnings, mode (ai или demo) и серверную предварительную оценку score. POST /api/tasks/build-card принимает исходный текст, тему и до 10 ответов {question_id, field, answer, question?}; ответ — редактируемая card, warnings, mode. Оценка полной карточки доступна через POST /api/tasks/score.

Пример входа анализа:

{
  "draft_text": "В пекарне заказы на торты теряются. Нужно удобнее учитывать заказы.",
  "topic": "общепит"
}

Сокращённый фрагмент ответа (в полном ответе есть все поля карточки, 3–5 вопросов и расшифровка score.breakdown/score.missing):

{
  "summary": "Показана предварительная проверка по ключевым словам. Для анализа смысла описания нужен ответ ИИ.",
  "draft_card": {
    "title": "В пекарне заказы на торты теряются",
    "topic": "общепит",
    "context": "В пекарне заказы на торты теряются. Нужно удобнее учитывать заказы.",
    "need": "Нужно удобнее учитывать заказы."
  },
  "questions": [
    {
      "id": "q1",
      "field": "data",
      "question": "Какие данные или материалы у вас уже есть и в каком виде?"
    }
  ],
  "filled_fields": [
    "need"
  ],
  "missing_fields": [
    "data"
  ],
  "warnings": [
    "Деморежим: вопросы шаблонные, анализ ИИ не выполнялся."
  ],
  "mode": "demo",
  "score": {
    "score": 15,
    "level": "draft"
  }
}

Пример входа сборки карточки:

{
  "draft_text": "В пекарне заказы на торты теряются. Нужно удобнее учитывать заказы.",
  "topic": "общепит",
  "answers": [
    {
      "question_id": "q1",
      "field": "data",
      "answer": "Есть таблица Excel с заказами за последние два месяца."
    },
    {
      "question_id": "q2",
      "field": "expected_result",
      "answer": "Веб-форма создания заказов и список со статусами для сотрудников пекарни."
    }
  ]
}

Сокращённый фрагмент ответа (полный card содержит все поля, а warnings перечисляет незаполненные или спорные сведения):

{
  "card": {
    "title": "В пекарне заказы на торты теряются",
    "topic": "общепит",
    "data": "Есть таблица Excel с заказами за последние два месяца.",
    "expected_result": "Веб-форма создания заказов и список со статусами для сотрудников пекарни."
  },
  "warnings": [
    "Поле «Критерии успеха» не заполнено: сведений нет в описании."
  ],
  "mode": "demo"
}

Промпты в prompts/analyze.md и prompts/build_card.md требуют опираться только на факты заказчика, не считать баллы и не назначать команду. При настроенном ключе используется OpenAI Chat Completions со строгой JSON-схемой; ответ валидируется, при ошибке формата выполняется одна повторная попытка. При недоступном провайдере или повторной ошибке включается локальный деморежим. Сервер исключает неподтверждённые фрагменты из предварительной оценки и предупреждает о подозрительных числах, контактах и ссылках в собранной карточке. Эти проверки не доказывают истинность текста: перед публикацией человек редактирует и подтверждает карточку. Анализ и сборка доступны бизнес-аккаунту; общий лимит — 20 обращений на аккаунт в сутки по UTC (AI_DAILY_LIMIT).

Данные для демонстрации

В sample_data/ находятся 5 исходных текстовых черновиков для показа, 5 карточек, 5 команд и 7 откликов, а также расширенный синтетический набор: 80 задач, 20 команд, 200 откликов, 100 профилей и 104 подтверждённых этапа. На чистой базе после make seed это 85 задач, 25 команд и 207 откликов; черновики остаются файлами для демонстрации, а не отдельными записями БД. Новые задачи распределены по восьми темам: образование, ритейл, общепит, логистика, производство, туризм, услуги, экология. Демо-записи помечены и доступны для просмотра; повторный make seed не перезаписывает данные пользователя.

Сценарий защиты до пяти минут

Перед началом подготовьте локальный сервер и два собственных аккаунта — бизнес и студент. Для точно воспроизводимых оценок включите AI_MODE=demo. Если используется OpenAI, формулировки вопросов и предварительный балл могут отличаться; ориентируйтесь на фактический breakdown на экране.

  1. 0:00–0:50. Войдите как бизнес. Введите тему «общепит» и слабое описание: «В пекарне заказы на торты теряются. Нужно удобнее учитывать заказы.» Нажмите «Проанализировать». В локальном деморежиме предварительная карточка получает 15/100: 10 за контекст и 5 за потребность.
  2. 0:50–2:10. Покажите пять вопросов и ответьте: данные — «Есть таблица Excel с заказами за последние два месяца и перечень постоянных клиентов»; результат — «Веб-форма создания заказов и список со статусами для сотрудников пекарни»; критерий — «Новый заказ фиксируется за 1 минуту, потерянных заказов за неделю — 0»; текущий процесс — «Сейчас менеджер записывает заказы в бумажный журнал, поэтому часть заявок пропадает»; пользователи — «Менеджер и администратор пекарни, которые ежедневно оформляют заказы».
  3. 2:10–2:50. Соберите карточку и вручную уточните потребность: «Нужно хранить все заявки в одном месте и видеть их текущие статусы без бумажного журнала»; ограничения: «Срок — 4 недели; доступ только сотрудникам, без данных клиентов на внешнем сервере»; контакт: [email protected]; формат связи: «Созвон раз в неделю и проверка прототипа в конце второй недели». Контрольная оценка по scoring.py — 100/100. Покажите расшифровку роста 15 → 100, затем подтвердите и опубликуйте задачу.
  4. 2:50–3:40. Выйдите, войдите как студент, найдите задачу в общем каталоге, создайте свою команду и отправьте идею, план, срок и ссылку на прототип.
  5. 3:40–4:30. Вернитесь в бизнес-аккаунт, откройте отклики на свою задачу и вручную примите или отклоните предложение. При желании подтвердите этап прототипа и покажите начисленные команде 10 баллов. Вкладка «Лидеры» показывает эти результаты отдельно от рейтинга готовности задачи.

Оценки 15 и 100 проверены на указанной карточке в локальном деморежиме. При редактировании текста, отличиях ответов модели или неполном заполнении фактические баллы изменятся — используйте показанную сервером расшифровку.

Что проверить перед показом

make test
make check
make test-client

Для make test-client нужен Node.js 20+.

СценарийОжидаемый результат
Слабое описание → пять ответов → редактированиеВ AI_MODE=demo рейтинг растёт с 15 до 100; поля и подсказки видны в расшифровке
Публикация задачи с рейтингом ниже 40Задача видна в каталоге с уровнем «Черновик» и пояснением о необходимости уточнений; оценка не запрещает отклик
Фильтр по теме и уровню, «Показать ещё», сбросУсловия сохраняются при догрузке; сброс возвращает общий список
Студент создаёт команду и отправляет откликОтклик виден бизнесу; повторный отклик той же команды на задачу отклоняется
Бизнес принимает отклик и подтверждает этапРешение выполняет человек; прототип даёт команде 10 баллов, повтор этапа отклоняется
Перезапуск сервераОпубликованная задача, отклик и решение сохраняются в БД
ИИ недоступенПомощник возвращает деморезультат с предупреждением; рейтинг по-прежнему считает сервер
Звёзды
⭐ 0
Форки
0
Язык
Python
Последний push
в прошлом месяце
Коммиты
26
Авторы
2
Файлы
64
Ветки
2

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

daniela kurmanbaeva 16typecoder 10

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

  • 2026-09-23 17:58fix(i18n): display Kazakh month names consistentlydaniela kurmanbaeva
  • 2026-09-23 17:57feat(i18n): add Russian Kazakh and English interface and AI responsesdaniela kurmanbaeva
  • 2026-09-23 17:49style(frontend): match quest-board visual referencedaniela kurmanbaeva
  • 2026-09-23 17:48docs: prepare AI Sana submission README and five-minute demotypecoder
  • 2026-09-23 17:46Merge origin/main: integrate leaderboards with account workflowstypecoder
  • 2026-09-23 17:41feat: add account sessions and owner-scoped workflowstypecoder
  • 2026-09-23 17:40style(frontend): quest-board visual system, medal levels, gamified animationsdaniela kurmanbaeva
  • 2026-09-23 17:31feat: add shared business and team leaderboardsdaniela kurmanbaeva
Все коммиты (26)
  • 2026-09-23 17:25test(security): add isolated site security checkstypecoder
  • 2026-09-23 16:47style(frontend): refined palette, typography and gamified rating visualsdaniela kurmanbaeva
  • 2026-09-23 16:40merge: preserve profile views with contextual task analysistypecoder
  • 2026-09-23 16:39merge: integrate remote AI module and demo UI with profile viewstypecoder
  • 2026-09-23 16:37feat(ai): contextual draft analysis and readiness feedbackdaniela kurmanbaeva
  • 2026-09-23 16:36feat: add demo participants, catalog controls and business/student profilestypecoder
  • 2026-09-23 16:03fix(backend): complete AI validation, retry and demo fallbackdaniela kurmanbaeva
  • 2026-09-23 15:51feat(backend): AI analyze/build-card with validation, retry, demo fallbackdaniela kurmanbaeva
  • 2026-09-23 15:22feat(frontend): demo-path UX — score delta, catalog position, AI states, toastsdaniela kurmanbaeva
  • 2026-09-23 15:08feat: integrate OpenAI agents with live task and team workflowstypecoder
  • 2026-09-23 14:52style(frontend): catalog levels, plurals, focus, wizard steps, match reasonsdaniela kurmanbaeva
  • 2026-09-23 14:44fix(frontend): restore mock data loader after rebasedaniela kurmanbaeva
  • 2026-09-23 14:43feat(frontend): add team recommendations and proposal flowdaniela kurmanbaeva
  • 2026-09-23 14:43feat(frontend): russian rating breakdown with field-specific hintsdaniela kurmanbaeva
  • 2026-09-23 14:43feat(frontend): apply from catalog, prototype link, decision and stage buttonsdaniela kurmanbaeva
  • 2026-09-23 14:36feat: add SQLite-backed API and connect frontend without authenticationtypecoder
  • 2026-09-23 14:01feat(frontend): add task catalog and proposal managementdaniela kurmanbaeva
  • 2026-09-23 13:19chore: Setup FastAPI backend and vanilla frontend with SQLitetypecoder
Структура репозитория (64 файлов)
.gitignore
Makefile
README.md
backend/.env.example
backend/API.md
backend/SECURITY_TESTING.md
backend/ai.py
backend/ai_demo.py
backend/alembic.ini
backend/app/__init__.py
backend/app/ai_agents.py
backend/app/ai_quota.py
backend/app/api.py
backend/app/assistant.py
backend/app/auth.py
backend/app/cli.py
backend/app/config.py
backend/app/database.py
backend/app/leaderboard.py
backend/app/main.py
backend/app/models.py
backend/app/routes.py
backend/app/schemas.py
backend/app/scoring.py
backend/app/seed.py
backend/data/.gitkeep
backend/migrations/env.py
backend/migrations/script.py.mako
backend/migrations/versions/0001_initial_users_tasks_teams_proposals_and_.py
backend/migrations/versions/0002_remove_auth.py
backend/migrations/versions/0003_demo_participants.py
backend/migrations/versions/0004_auth.py
backend/migrations/versions/0004_team_contact.py
backend/migrations/versions/0005_ai_usage.py
backend/migrations/versions/0006_merge.py
backend/openapi.json
backend/pyproject.toml
backend/requirements.txt
backend/schemas_ai.py
backend/security_check.py
backend/tests/test_ai.py
backend/tests/test_ai_agents.py
backend/tests/test_app.py
backend/tests/test_auth_security.py
backend/tests/test_demo_world.py
backend/tests/test_leaderboard.py
backend/tests/test_security_middleware.py
backend/uv.lock
frontend/api.js
frontend/app.js
frontend/index.html
frontend/mock.js
frontend/styles.css
frontend/tests/api.test.cjs
prompts/.gitkeep
prompts/analyze.md
prompts/build_card.md
prompts/field_hints.json
sample_data/.gitkeep
sample_data/cards.json
sample_data/demo_world.json
sample_data/drafts.json
sample_data/proposals.json
sample_data/teams.json
Ветки (2)

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

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

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