TaskForge
Платформа AI Sana: бизнес превращает описание проблемы в структурированную задачу с рейтингом готовности, студенческие команды откликаются, проходят…
О проекте
Команда: bezdarri
Кейс HackAlem.ai: Образование — AI Sana
Стадия: Доведённый продукт
Задача кейса: Challenge Hub: превратить задачу бизнеса в задание для студенческих команд
Суть
Платформа AI Sana: бизнес превращает описание проблемы в структурированную задачу с рейтингом готовности, студенческие команды откликаются, проходят этапы, сдают результат и получают XP и отзывы.
Как устроено
Бизнес вводит описание, модуль «Развилка» предлагает 3 трактовки результата через AI или локальные шаблоны. gpt-4o-mini через Structured Outputs формирует карточку и задаёт 3–5 уточняющих вопросов, результат проверяется локально на выдуманные числа, контакты и ссылки. Readiness Score 0–100 считается по рубрике (контекст 20, данные 20, результат 15, критерии 15, ограничения 10, пользователи 10, контакт 10) чек-листом или AI-оценкой. Дальше идут каталог, ручной выбор команд, два этапа по +10 XP, приёмка и отзыв 1–5 с XP. Данные хранятся в JSON.
Ключевые решения
- OpenAI Structured Outputs
- рубрика Readiness Score
- уточняющие вопросы
- AI-сравнение ожиданий и definition of done
- XP-геймификация
Особенности
«Развилка» до генерации карточки явно показывает несколько трактовок расплывчатого запроса бизнеса. Ответ AI проверяется на новые числа, контакты и ссылки, которых не было в исходных данных. После ручной правки AI-оценка помечается устаревшей. Приложение развёрнуто на Render.
Стек
Python · Streamlit · OpenAI API · JSON-хранилище · Render
Модели
gpt-4o-mini
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-96c2791a-bezdarri.
README
README.mdTaskForge — AI Task Gamification Platform
Ссылка на сайт: https://bezzdari.onrender.com/
TaskForge — Streamlit MVP для хакатона AI Sana. Бизнес превращает короткое описание проблемы в понятную задачу, согласует результат со студенческими командами и оценивает выполненную работу. Несколько команд могут независимо решать одну задачу; их репутация складывается из подтверждённого прогресса и отзывов бизнеса.
Описание → «Развилка» → уточнение и рейтинг задачи → публикация → предложения команд → ручной выбор → выполнение → приёмка → отзыв и XP.
Что работает
| Страница | Возможности |
|---|---|
| Обзор | Стартовая страница: выбор роли, объяснение пути задачи, пример для первого запуска и текущие показатели пространства. |
| Создать задачу | Три трактовки задачи, AI-анализ, уточняющие вопросы, редактируемая карточка, рейтинг готовности, подтверждение фактов, публикация и выгрузка JSON. |
| Каталог задач | Поиск, фильтры по отрасли и готовности, сортировка, полная карточка и предложение от команды. |
| Кабинет бизнеса | Сравнение ожиданий, выбор нескольких команд, подтверждение этапов, возврат на доработку, приёмка и итоговый отзыв. |
| Кабинет команды | Профиль команды, предложения и статусы, два этапа с доказательствами прогресса, сдача результата и история версий. |
| Команды и рейтинг | Таблица лидеров, поиск команд и навыков, профили, принятые проекты, отзывы и история XP. |
AI помогает сформулировать и сравнить ожидания. Публикацию, выбор команды, подтверждение этапа, приёмку и оценку выполняет человек.
Запуск
Нужен Python 3.10 или новее. В PowerShell из папки проекта:
python -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r requirements.txt
if (-not (Test-Path -LiteralPath .env)) { Copy-Item -LiteralPath .env.example -Destination .env }
.\.venv\Scripts\python.exe -m streamlit run app.py
Откройте http://localhost:8501. Если окружение и зависимости уже установлены, достаточно последней команды.
Приложение открывается на странице Обзор. Бизнес может сразу перейти к созданию задачи, команда — в каталог. Кнопка Попробовать на примере открывает редактор с демонстрационным описанием, если черновик ещё пуст; существующий черновик сохраняется. На странице создания также доступна кнопка Подставить пример. Все шесть разделов доступны через боковую навигацию.
Для AI-функций заполните OPENAI_API_KEY в своём .env. Модель задаётся переменной OPENAI_MODEL; по умолчанию — gpt-4o-mini. Ключ используется серверной частью.
Без ключа доступны ручные карточки, «Развилка» с локальными шаблонами, каталог, сравнение по локальному чек-листу и весь цикл работы команд. Кнопки AI требуют настроенного ключа и доступа к модели. При ошибке появляется сообщение; локальный режим выбирается явно.
«Развилка»: договориться о результате
Запрос «Хотим AI для анализа отзывов» допускает разные решения: дашборд с темами отзывов, помощник для подготовки ответов или уведомления о срочных жалобах. В разделе Создать задачу раскройте «Развилку»:
- Предложить 3 варианта с AI — модель предлагает три варианта из описания бизнеса.
- Посмотреть варианты без AI — локальные шаблоны с пометкой Guided templates. Это сценарий обсуждения без API, а не AI-анализ.
Каждый вариант содержит возможный результат, действие пользователя и вопрос о проверке результата. Это гипотезы: бизнес выбирает направление кнопкой Выбрать этот результат или описывает свой вариант.
Выбор заполняет только поле Что нужно получить (expected_result). Данные, контакт, сроки и критерии успеха нужно указать отдельно. Выбранный текст остаётся редактируемым; перед публикацией бизнес подтверждает карточку целиком.
Команда заполняет поле «Мы считаем задачу выполненной, когда…» (definition_of_done). В разделе Кабинет бизнеса рядом отображаются ожидание бизнеса, критерии приёмки и понимание команды:
- Проверить по чек-листу проверяет пропуски и точные совпадения текста, предлагает вопросы. Этот локальный чек-лист не определяет смысловую эквивалентность разных формулировок.
- Сравнить с AI сравнивает ожидаемый результат и критерии бизнеса с определением готовности и планом команды; возвращает возможные совпадения, пробелы и вопросы.
Сравнение не выбирает победителя, не ранжирует предложения и не начисляет очки. Неуказанное требование остаётся поводом для уточнения.
Карточка и Readiness Score
Карточка содержит заголовок, контекст, потребность, пользователей, данные и материалы, ограничения, ожидаемый результат, критерии успеха и Контакт и формат общения. В последнем поле указываются контакт и способ общения, например почта и еженедельная встреча. Отрасль необязательна.
Рейтинг 0–100 относится к готовности задачи и отделён от XP команды.
| Критерий | Максимум |
|---|---|
| Контекст и потребность бизнеса | 20 |
| Данные и материалы | 20 |
| Ожидаемый результат | 15 |
| Критерии успеха | 15 |
| Ограничения | 10 |
| Пользователи | 10 |
| Контакт и формат взаимодействия | 10 |
| Итого | 100 |
| Балл | Уровень |
|---|---|
| 0–39 | Черновик (Draft) |
| 40–69 | Нужны уточнения (Working) |
| 70–89 | Можно начинать (Ready) |
| 90–100 | Подробная задача (Priority) |
Источники рейтинга подписаны:
- Чек-лист заполненности — ручной режим и исходные демонстрационные задачи. Непустое поле получает весь свой вес, пустое — 0; контекст и потребность дают по 10 баллов. Оценка обновляется при редактировании и отражает заполненность, не качество текста.
- AI-оценка качества — модель оценивает содержательность по той же рубрике, может начислить часть баллов и объясняет каждую категорию. Приложение проверяет структуру, границы, сумму и уровень. После ручного изменения карточки оценка помечается устаревшей; публикация требует Обновить AI-оценку.
После уточнения отображается изменение AI-оценки. Опубликованная AI-карточка хранит оценку конкретной версии. В каталоге доступны разбивка, недостающие поля и рекомендации.
Для публикации нужны заголовок и подтверждение фактов. Низкий балл не блокирует публикацию или отклики. Повторная публикация той же версии в текущем сеансе блокируется; Новый черновик начинает новый черновик. Черновик и опубликованную карточку можно скачать как JSON.
AI и уточняющие вопросы
Сформировать с AI передаёт описание и выбранное направление. Учесть ответы учитывает историю ответов и текущую карточку. Обновить AI-оценку оценивает отредактированную карточку, сохраняя её поля.
При первом анализе с тремя и более недостающими или слабыми полями требуются 3–5 вопросов. Для почти полной карточки вопросов может быть меньше. После ответов допускается 0–5 дополнительных вопросов: новые вопросы не обязательны, когда существенные уточнения уже получены.
Используются Structured Outputs и локальная проверка JSON, полей, вопросов и рубрики. Дополнительно проверяются новые числа, контакты и ссылки относительно переданных источников. Эти проверки ограничивают выдуманные детали, но не заменяют проверку смысла человеком.
Невалидный ответ, отказ модели или ошибка API сохраняют текущий черновик и предыдущий результат. Запросы выполняются по нажатию соответствующей кнопки, с store=False. Ключ не добавляется в карточки и не показывается в интерфейсе.
Каталог, предложения и выбор команд
Поиск работает по заголовку, контексту, потребности и ожидаемому результату. Есть фильтры по отрасли и готовности; пустая отрасль отображается как Other. По умолчанию задачи идут по убыванию рейтинга, при равных баллах — более новые выше. Доступны обратный порядок рейтинга и Newest first; старые записи без даты сохраняют исходный порядок среди равных.
Новое предложение содержит название команды, идею, план, definition of done, срок и необязательную ссылку на прототип. Разрешены ссылки http:// и https://. Существующая команда определяется по названию без учёта регистра; новое название создаёт профиль.
Предложение получает статус Ждёт решения (Pending). Бизнес вручную нажимает Пригласить команду или Отклонить предложение: выбрать можно одну, несколько или ни одной команды. Статусы сохраняются как Accepted или Rejected. Рядом показаны XP, средняя оценка и количество оценённых проектов. Отсутствие отзывов отображается как Новая команда.
После начала работы отклонение принятого предложения блокируется, чтобы сохранить историю. Результат можно вернуть на доработку. Повторные предложения одной команды на ту же задачу используют общую историю работы и не дают дополнительных отзывов или XP.
Выполнение, приёмка и отзывы
- Выбранная команда открывает Кабинет команды. При первом действии сохраняется согласованная основа: ожидаемый результат, критерии успеха и определение готовности команды.
- Команда может отправить до двух этапов с названием и доказательствами прогресса. Отправка не даёт XP.
- Бизнес подтверждает каждый этап отдельно: +10 XP. Повторное подтверждение не начисляет очки снова.
- Команда сдаёт описание итогового результата и необязательную ссылку. Этапы необязательны для сдачи.
- Бизнес принимает результат либо возвращает с обязательным комментарием о доработке. Повторная сдача создаёт новую версию; предыдущий результат и замечания сохраняются.
- После приёмки бизнес публикует один окончательный отзыв с оценкой 1–5 и обязательным комментарием. При 1–2 звёздах нужно отдельно объяснить, какой согласованный критерий не выполнен.
Принятый результат больше не редактируется. Итоговый отзыв нельзя заменить или переоценить. Неподтверждённые к моменту финального отзыва этапы остаются в истории без XP. Каждая команда проходит цикл независимо от остальных.
Team XP и рейтинг команд
| Событие | Изменение XP |
|---|---|
| Подтверждённый этап, максимум два на команду и задачу | +10 |
| Итоговая оценка 1 ★ | −20 |
| Итоговая оценка 2 ★ | −10 |
| Итоговая оценка 3 ★ | 0 |
| Итоговая оценка 4 ★ | +20 |
| Итоговая оценка 5 ★ | +40 |
XP вычисляется по событиям в порядке записи. После каждого события баланс ограничивается снизу нулём; отрицательного долга нет. Например, 1 ★ при балансе 10 уменьшает его до 0, а следующая награда +40 даёт 40 XP. История показывает номинальное и фактически применённое изменение, а также новый баланс.
Подтверждения этапов остаются в истории; отзыв меняет общий баланс отдельным событием. Максимум за задачу — 60 XP: два этапа и 5 звёзд. Демонстрационные команды начинают без начисленных XP. Повторные нажатия и повторные предложения той же команды не создают новые награды.
Команды и рейтинг сортирует команды по XP, затем по числу завершённых задач, затем по названию. Профиль содержит описание, навыки, интересы, среднюю оценку, число отзывов, активные и завершённые задачи, принятые результаты и историю XP. Завершённой считается задача с принятым результатом; число отзывов считается отдельно, поэтому принятый проект может ещё ожидать оценку.
Поиск работает по названию, описанию, навыкам и интересам. Рейтинг помогает сравнить опыт; окончательный выбор команды остаётся ручным.
Демонстрация на пять минут
Сценарий работает без ключа; AI-кнопки можно показать отдельно при настроенном доступе.
- 0:00–1:00 — выбрать результат. На странице «Обзор» нажмите Попробовать на примере или в редакторе введите «Хотим AI для анализа отзывов», нажмите Посмотреть варианты без AI, выберите уведомления. Покажите, что заполняется только ожидаемый результат.
- 1:00–2:00 — подготовить задачу. Укажите пользователей, пример доступных отзывов, ограничения, проверку уведомлений и контакт с форматом общения. Покажите рост чек-листа, подтвердите карточку и опубликуйте.
- 2:00–3:00 — сравнить предложения. В «Каталоге задач» отправьте предложения двух команд с разными определениями готовности. В «Кабинете бизнеса» откройте Проверить по чек-листу и пригласите обе команды.
- 3:00–4:00 — показать выполнение. От первой команды отправьте этап; подтвердите его в «Кабинете бизнеса»: +10 XP. Сдайте результат, верните на доработку и отправьте новую версию.
- 4:00–5:00 — показать репутацию. Примите исправленный результат и поставьте 5 ★ с отзывом. В «Командах и рейтинге» покажите 50 XP, один завершённый и оценённый проект и историю наград. Вторая команда продолжает свою работу независимо.
Для демонстрации штрафа завершите работу второй команды с низкой оценкой и объяснением невыполненного критерия. Баланс не станет отрицательным; отзыв и причина появятся в профиле.
Структура и хранение
app.py # навигация, создание задачи, каталог, предложения
requirements.txt # зависимости Python
.env.example # шаблон настроек AI
.streamlit/config.toml # настройки Streamlit
ui/
overview.py # стартовая страница, маршруты по ролям и обзор пространства
components.py # общие стили, заголовки, статусы и навигация
local_copy.py # русские тексты фиксированных локальных подсказок
styles.css # общая светлая тема и оформление компонентов
business_page.py # сравнение, выбор команд, этапы, приёмка, отзывы
team_pages.py # рабочее место команды, профили, таблица лидеров
services/
ai.py # анализ карточки, вопросы, проверка оценки и ответа AI
briefs.py # «Развилка» и сравнение: AI и локальные шаблоны
scoring.py # ручной чек-лист и сохранённые AI-оценки
workflow.py # этапы, версии результатов, отзывы, XP и профили
storage.py # JSON, блокировка записи, атомарная замена файлов
data/
tasks.json # опубликованные задачи
teams.json # команды и профили
proposals.json # предложения и решения бизнеса
engagements.json # работа, отзывы и XP для каждой пары команда/задача
tests/ # сервисы и сквозные сценарии Streamlit
engagements.json создаётся при первом сохранении работы. Изменение этапа или отзыва и соответствующее XP-событие сохраняются одной атомарной записью. Блокировка защищает операции в пределах одного процесса. Повреждённый JSON вызывает ошибку, а не заменяется пустыми данными.
Это локальная демонстрационная среда без авторизации и разграничения прав. Переключение страниц и выбор команды показывают роли, но не удостоверяют пользователя: любой участник этого экземпляра может открыть бизнес-панель или профиль команды. Черновик хранится в сеансе Streamlit; опубликованные данные — в JSON. Для публичного сервиса понадобятся учётные записи, проверка прав и хранилище для нескольких процессов.
Проверка
.\.venv\Scripts\python.exe -m unittest discover -s tests -v
Тесты работают на временных данных и подменяют обращения к OpenAI: ключ и расходы API не нужны. Проверяются ответы AI, «Развилка», сравнение ожиданий, создание и публикация задач, каталог, предложения нескольких команд, этапы, версии результатов, приёмка, отзывы, расчёт XP, повторные действия, конкурентные записи и страницы команд.
Проверки не подтверждают качество ответов живой модели; его оценивают отдельно на демонстрационных запросах с настроенным ключом. Рабочие JSON-файлы не изменяются.
Авторы коммитов
История коммитов
- 2026-09-23 17:43Fix website link formatting in READMEYerdaulet Akhanov
- 2026-09-23 17:43Fix website link in READMEYerdaulet Akhanov
- 2026-09-23 17:39Polish readiness display and stylingSyrym Shadiyarbek
- 2026-09-23 17:38Merge remote-tracking branch 'origin/main'Syrym Shadiyarbek
- 2026-09-23 17:36Final projectSyrym Shadiyarbek
- 2026-09-23 17:15Update README with project link and descriptionYerdaulet Akhanov
- 2026-09-23 17:13Complete AI Sana gamification MVP and demo workflowYerdauletAkhanov
- 2026-09-23 16:55readme fixedSyrym Shadiyarbek
Все коммиты (19)
- 2026-09-23 16:47Merge pull request #2 from BAITC-Hacks/taskforge-ui-polish-20260923SyrymSh
- 2026-09-23 16:13Merge pull request #1 from BAITC-Hacks/rawSyrymSh
- 2026-09-23 16:13Merge branch 'main' into rawSyrymSh
- 2026-09-23 16:07Document hackathon MVP concept and evaluation flowSyrym Shadiyarbek
- 2026-09-23 14:45readme planSyrym Shadiyarbek
- 2026-09-23 14:07initial commitSyrym Shadiyarbek
- 2026-09-23 17:29Redesign TaskForge UI and add English Russian Kazakh language switchZhanibek Zhurgen
- 2026-09-23 16:45Polish TaskForge UI and finalize AI clarification safeguardsZhanibek Zhurgen
- 2026-09-23 15:59Complete AI analysis and clarification flowZhanibek Zhurgen
- 2026-09-23 15:56Build initial end-to-end MVPZhanibek Zhurgen
- 2026-09-23 14:03Update READMEZhanibek Zhurgen
Структура репозитория (28 файлов)
.env.example .gitignore .streamlit/config.toml README.md app.py data/proposals.json data/tasks.json data/teams.json requirements.txt services/__init__.py services/ai.py services/briefs.py services/scoring.py services/storage.py services/workflow.py tests/test_ai.py tests/test_briefs.py tests/test_journey_features.py tests/test_mvp.py tests/test_team_pages.py tests/test_workflow.py ui/__init__.py ui/business_page.py ui/components.py ui/local_copy.py ui/overview.py ui/styles.css ui/team_pages.py
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.