GhostTech
Challenge Hub: AI анализирует черновик бизнеса, задаёт 3–5 вопросов и собирает карточку с прозрачным рейтингом готовности.
О проекте
Команда: 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.mdGhostTech — готовность бизнес-задач и открытый выбор команд
Локальный 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; название и тема нужны для публикации, но баллов не дают. Пробелы по краям поля удаляются. Шкала основана на наличии и длине текста, а не на известности компании или оценке модели.
| Поле | Пусто | Частично | Полностью |
|---|---|---|---|
| Контекст и потребность — каждое поле | 0 | 5 при длине от 10 | 10 при длине от 40 |
| Данные и материалы | 0 | 10 при длине от 20 | 20 при длине от 30 |
| Ожидаемый результат | 0 | 7 при длине от 15 | 15 при длине от 30 |
| Критерии успеха | 0 | 10 за непустой текст без цифр и % | 15 за непустой текст с цифрой или % |
| Ограничения и пользователи — каждое поле | 0 | 5 при длине от 10 | 10 при длине от 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 на экране.
- 0:00–0:50. Войдите как бизнес. Введите тему «общепит» и слабое описание: «В пекарне заказы на торты теряются. Нужно удобнее учитывать заказы.» Нажмите «Проанализировать». В локальном деморежиме предварительная карточка получает 15/100: 10 за контекст и 5 за потребность.
- 0:50–2:10. Покажите пять вопросов и ответьте: данные — «Есть таблица Excel с заказами за последние два месяца и перечень постоянных клиентов»; результат — «Веб-форма создания заказов и список со статусами для сотрудников пекарни»; критерий — «Новый заказ фиксируется за 1 минуту, потерянных заказов за неделю — 0»; текущий процесс — «Сейчас менеджер записывает заказы в бумажный журнал, поэтому часть заявок пропадает»; пользователи — «Менеджер и администратор пекарни, которые ежедневно оформляют заказы».
- 2:10–2:50. Соберите карточку и вручную уточните потребность: «Нужно хранить все заявки в одном месте и видеть их текущие статусы без бумажного журнала»; ограничения: «Срок — 4 недели; доступ только сотрудникам, без данных клиентов на внешнем сервере»; контакт:
[email protected]; формат связи: «Созвон раз в неделю и проверка прототипа в конце второй недели». Контрольная оценка поscoring.py— 100/100. Покажите расшифровку роста 15 → 100, затем подтвердите и опубликуйте задачу. - 2:50–3:40. Выйдите, войдите как студент, найдите задачу в общем каталоге, создайте свою команду и отправьте идею, план, срок и ссылку на прототип.
- 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 баллов, повтор этапа отклоняется |
| Перезапуск сервера | Опубликованная задача, отклик и решение сохраняются в БД |
| ИИ недоступен | Помощник возвращает деморезультат с предупреждением; рейтинг по-прежнему считает сервер |
Авторы коммитов
История коммитов
- 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 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.