AAYMA
RU
Войти

Задачник

Веб-платформа, где ИИ задаёт бизнесу уточняющие вопросы и превращает черновик в карточку задачи с рейтингом готовности 0–100.

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

О проекте

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

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

Суть

Веб-платформа, где ИИ задаёт бизнесу уточняющие вопросы и превращает черновик в карточку задачи с рейтингом готовности 0–100. Опубликованные задачи попадают в каталог, студенческие команды подают заявки, бизнес выбирает команду вручную.

Как устроено

Черновик отправляется в OpenAI Responses API со Structured Outputs (схемы на zod): модель раскладывает текст по 9 полям карточки и задаёт 3–6 вопросов, затем собирает карточку из ответов. Рейтинг считает детерминированная функция evaluate() по 7 критериям с весами, баллы засчитываются только за поля, подтверждённые человеком. Guard отменяет поля с числами или латинскими названиями, которых нет в тексте бизнеса; при ошибке схемы делается повтор, затем включается локальный fallback на правилах. Next.js ↔ Express REST ↔ PostgreSQL через Prisma.

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

  • Structured Outputs
  • zod-валидация
  • проверка фактов
  • формула рейтинга с весами
  • rule-based fallback
  • подсказки командам на правилах

Особенности

LLM не выставляет баллы: рейтинг считает прозрачная формула из 7 пунктов с разбивкой («+5 · Указан срок») и историей изменений. Guard против выдумок отбрасывает числа и названия, которых не было в словах бизнеса. Промпты и JSON-схемы открыто показаны на странице /ai.

Стек

TypeScript · Next.js · React · Express · Prisma · PostgreSQL · Docker · zod · pnpm

Модели

OpenAI gpt-5.6-terra


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

README

README.md

Задачник

1. Название проекта

«Задачник» — рейтинг готовности бизнес-задач и открытый выбор студенческих команд. Решение кейса AI Sana «Рейтинг качества бизнес задач и открытый выбор команд» (HackAlem AI).

2. Краткое описание

Бизнес часто приходит к студентам с задачей в одну строку: «курьеры опаздывают, нужна какая-то система». Команде с такой задачей не с чем работать, а бизнес не понимает, чего не хватает.

«Задачник» помогает представителю бизнеса превратить черновик в полноценную карточку задачи: ИИ задаёт уточняющие вопросы, формула считает рейтинг готовности от 0 до 100 и показывает, какие сведения его повысят. Опубликованная задача встаёт в открытый каталог на место по своему рейтингу. Любая студенческая команда откликается идеей, планом, сроком и ссылкой на прототип, а бизнес сам решает, с кем работать.

Для кого: представители бизнеса, которые хотят отдать задачу студентам, и студенческие команды, которые ищут реальную задачу.

3. Что реализовано

Бизнес

  • Ввод черновика задачи свободным текстом и выбор отрасли.
  • ИИ разбирает черновик по полям карточки и задаёт от 3 до 6 уточняющих вопросов по недостающим пунктам.
  • Ответы редактируются и сохраняются сами. Табло пересчитывает предварительный рейтинг, уровень и место в таблице, мини-таблица показывает, как задача поднимается выше.
  • ИИ собирает карточку из черновика и ответов. Карточка редактируется: все 9 полей, название, тема.
  • Баллы засчитываются только после ручного подтверждения. До подтверждения видно, сколько добавят правки и какое место займёт задача.
  • Рейтинг с расшифровкой: каждый из 7 пунктов формулы разбит на проверки, пустые отрезки подсказывают, что добавить («+5 · Указан срок»).
  • История рейтинга: каждое подтверждение пишет запись (было → стало, причина).
  • Публикация подтверждённой версии в каталог.
  • Кабинет: профиль компании (редактируется), список своих задач с баллами, уровнем, местом и числом заявок.
  • Заявки команд по каждой задаче: идея, план, срок, ссылка на прототип. Действия «Выбрать команду», «Отклонить», «Отменить выбор». Можно выбрать одну, несколько или ни одной команды — автоматического назначения нет.

Студенческая команда

  • Профиль команды: название, число участников, интересы, навыки, технологии.
  • Таблица задач: все опубликованные задачи по рейтингу, зоны уровней готовности, фильтры по уровню и теме, сортировка «по очкам» и «сначала новые». Задачи с низким рейтингом остаются в таблице с пометкой «Мало сведений».
  • Страница задачи со всеми полями, рейтингом и разбором по пунктам.
  • Форма заявки (идея, план, срок, ссылка) с валидацией. Число заявок не ограничено.
  • Список своих заявок с решением бизнеса.
  • Подсказка «Подходит команде»: совпадения интересов, навыков и технологий с текстом задачи. Работает на правилах, без ИИ, предлагает только задачи от 40 баллов и не сужает таблицу.

Прозрачность ИИ

  • Страница «Как работает ИИ» (/ai): системные промпты, пример входа, JSON-схемы ответа, обработка некорректного ответа.

4. Как работает решение

  1. Черновик. Бизнес пишет, например: «Курьеры часто опаздывают, клиенты жалуются. Нужна какая-то система, чтобы это исправить.»
  2. Разбор. POST /api/tasks отправляет черновик в OpenAI. Модель раскладывает сказанное по полям карточки и задаёт 3–6 вопросов о пустых пунктах. Контакт подставляется из профиля компании. Проверка фактов отменяет всё, чего нет в черновике.
  3. Уточнение. Бизнес отвечает. Каждый ответ сохраняется (PUT /api/tasks/:id/answers), сервер считает предварительный рейтинг и место. На демо-черновике рейтинг растёт примерно с 19 до 85–95.
  4. Карточка. POST /api/tasks/:id/structure: модель собирает карточку из черновика и ответов. Результат ждёт подтверждения человеком.
  5. Рейтинг. Бизнес правит поля и нажимает «Подтвердить». PATCH /api/tasks/:id сохраняет поля, пересчитывает рейтинг формулой и пишет запись в историю.
  6. Каталог. POST /api/tasks/:id/publish: задача появляется в таблице на месте, соответствующем рейтингу.
  7. Выбор студентов. Команда находит задачу в таблице и отправляет заявку (POST /api/tasks/:id/proposals).
  8. Выбор бизнеса. Бизнес видит заявку в кабинете и вручную выбирает или отклоняет команду (PUT /api/tasks/:id/selections/:teamId).

Формула рейтинга

Чистая функция evaluate() в backend/src/scoring/scoring.ts, без ИИ и без обращения к БД. Покрыта тестами. Баллы начисляются только за подтверждённые поля; неподтверждённые правки показываются отдельно.

ПунктВесПроверки
Контекст и потребность20описана текущая ситуация (8) · есть подробности: где, когда, как часто (6) · понятно, что нужно изменить (6)
Данные и материалы20перечислены доступные данные (10) · указан объём, формат или источник (10)
Ожидаемый результат15описан результат работы команды (10) · назван формат: прототип, отчёт, модель (5)
Критерии успеха15есть признак приёмки (8) · признак измерим: число, доля или срок (7)
Ограничения10указан срок (5) · названы технологии, доступы или иные границы (5)
Пользователи10понятно, для кого решение (10)
Связь с бизнесом10есть контактное лицо (5) · описан формат консультаций и обратной связи (5)

Уровни: 0–39 черновик (виден в каталоге с пометкой «требует уточнения») · 40–69 рабочая · 70–89 готовая · 90–100 приоритетная (строка выделена в таблице).

Правила каталога

  • В таблице все опубликованные задачи. Низкий рейтинг задачу не скрывает и отклик не запрещает.
  • Место — порядок по рейтингу; при равенстве выше та, что опубликована раньше. Фильтры не меняют место задачи.
  • Таблица разбита на зоны уровней; приоритетные задачи выделены цветом.
  • Подсказки для команды предлагают только задачи от 40 баллов («Рабочая» и выше) и не фильтруют таблицу.
  • Число заявок не ограничено. Решение по команде принимает только бизнес.

ИИ: промпты, вход и выход, обработка ошибок

  • Промпты: backend/src/ai/prompts.ts. Их же отдаёт GET /api/ai/info, и они показаны на странице /ai.
  • Вход: отрасль, компания и черновик; на втором шаге — ещё текущие поля и пары «вопрос — ответ».
  • Выход: Structured Outputs через OpenAI Responses API. Схемы описаны на zod в backend/src/ai/schemas.ts: шаг 1 — { title, fields{9 полей}, questions[{criterion, field, question, why}] }, шаг 2 — { title, fields }.
  • Обработка некорректного ответа (backend/src/ai/openai.ts, service.ts):
    1. ответ дополнительно проверяется zod; при ошибке — один повтор с описанием проблемы;
    2. ошибка сети, таймаут, отказ модели или повторная ошибка схемы — срабатывают локальные правила (backend/src/ai/fallback.ts), интерфейс показывает, кто составил вопросы;
    3. если модель задала меньше трёх вопросов, недостающие добавляются из шаблонов по самым весомым пустым пунктам;
    4. проверка фактов (backend/src/ai/guard.ts): число или латинское название, которого нет в словах бизнеса, отменяет поле — остаётся текст самого бизнеса;
    5. если сжатая моделью формулировка теряет баллы, остаётся формулировка бизнеса.
  • Без ключа OpenAI приложение работает целиком на локальных правилах.

5. Технологии

  • Языки: TypeScript, SQL (миграции Prisma).
  • Фронтенд: Next.js 16.3 (App Router), React 19.2, собственные CSS-стили, шрифты Sofia Sans и Sofia Sans Extra Condensed через next/font.
  • Бэкенд: Node.js, Express 5, zod 4, cors, запуск через tsx.
  • База данных: PostgreSQL 17 (Docker), Prisma ORM 7 с адаптером @prisma/adapter-pg.
  • ИИ: OpenAI API через официальный SDK openai, Responses API со Structured Outputs. Модель задаётся в .env (OPENAI_MODEL, по умолчанию gpt-5.6-terra, уровень рассуждений low).
  • Тесты: встроенный node:test через tsx --test.
  • Пакетный менеджер: pnpm.

6. Архитектура

./
├── docker-compose.yml   # один сервис: postgres
├── .env.example         # все переменные окружения
├── backend/             # Express REST API + Prisma
│   ├── prisma/          # schema.prisma, миграции, seed.ts, data/*.json
│   └── src/
│       ├── scoring/     # формула рейтинга и тесты
│       ├── ai/          # промпты, схемы, OpenAI, проверка фактов, локальные правила
│       ├── routes/      # tasks, catalog, businesses, teams, meta
│       └── lib/         # DTO задач, место в каталоге, подсказки для команд
└── frontend/            # Next.js
    ├── app/             # страницы: /, /catalog, /catalog/[id], /team, /business, /business/new, /business/tasks/[id], /business/tasks/[id]/clarify, /ai
    ├── components/      # табло, разбор очков, формы, кабинет
    └── lib/             # API-клиент, типы, выбор компании или команды

Взаимодействие: браузер ↔ Next.js (серверные компоненты загружают данные, клиентские — формы и живой пересчёт) ↔ Express REST API ↔ PostgreSQL через Prisma. Express обращается к OpenAI только на двух шагах: разбор черновика и сборка карточки. Рейтинг всегда считает формула на сервере.

Модель данных (backend/prisma/schema.prisma): Business, Task (поля карточки, score, readinessLevel, status, JSON с вопросами и ответами), ScoreEvent (история рейтинга), TeamProfile, Proposal, Selection (решение бизнеса: выбрана или отклонена; нет записи — на рассмотрении).

Основные маршруты API (префикс /api): GET /meta, POST /score/preview, GET /ai/info, POST /tasks, GET /tasks/:id, POST /tasks/:id/analyze, PUT /tasks/:id/answers, POST /tasks/:id/structure, PATCH /tasks/:id, POST /tasks/:id/publish, GET|POST /tasks/:id/proposals, PUT /tasks/:id/selections/:teamId, GET /catalog, GET /catalog/:id, GET|PATCH /businesses/:id, GET /businesses/:id/tasks, GET|PATCH /teams/:id, GET /teams/:id/recommendations, GET /teams/:id/proposals.

Регистрации нет (вне рамок кейса): компания или команда выбирается в шапке, выбор хранится в cookie.

7. Установка и запуск

Нужны Node.js 22+ (проверено на 24.12), pnpm 10+ (проверено на 11.18) и Docker.

git clone https://github.com/BAITC-Hacks/hack-5bd8445b-talgat.git
cd hack-5bd8445b-talgat

# 1. Переменные окружения: вставьте свой OPENAI_API_KEY (без ключа сработают локальные правила)
cp .env.example .env

# 2. PostgreSQL в Docker (порт 5433 на хосте, чтобы не мешать локальному PostgreSQL)
docker compose up -d

# 3. Бэкенд: зависимости, миграции, демо-данные, запуск API на http://localhost:4000
cd backend
pnpm install
pnpm db:deploy
pnpm db:seed
pnpm dev

Во втором терминале:

cd frontend
pnpm install
pnpm dev

Откройте http://localhost:3000.

Полезные команды бэкенда: pnpm test — тесты формулы и ИИ-защиты, pnpm db:seed — перезалить демо-данные (очищает таблицы), pnpm db:migrate — миграции в режиме разработки, pnpm build && pnpm start — сборка и запуск без watch.

8. Как проверить решение

Сценарий на сидовом черновике компании «Жетісу Логистик»:

  1. Откройте http://localhost:3000 и нажмите «Выставить задачу». В шапке выбрана компания «Жетісу Логистик».
  2. Нажмите «демо: вставить слабый черновик» — появится текст «Курьеры часто опаздывают, клиенты жалуются. Нужна какая-то система, чтобы это исправить.» — и «Разобрать черновик». Тот же черновик лежит в кабинете как «Курьеры часто опаздывают, клиенты жалуются».
  3. На экране «Разбор черновика» будет от 3 до 6 вопросов и рейтинг около 19 («Черновик»). Отвечайте своими словами или кнопками «демо: подставить ответ». После каждого ответа растут очки, меняется уровень, задача поднимается в мини-таблице справа.
  4. Нажмите «Собрать карточку». Проверьте поля, при желании допишите, например, формат встреч. Табло покажет, сколько добавят неподтверждённые правки.
  5. Нажмите «Подтвердить и опубликовать». Уведомление покажет место в таблице; в «Истории рейтинга» появятся записи.
  6. Переключитесь на «Команда» (выбрана Byte Batyrs), откройте «Таблицу задач»: задача стоит на месте по рейтингу. Попробуйте фильтры «Уровень» и «Тема».
  7. Откройте задачу, отправьте пустую форму заявки — появятся подсказки по полям. Заполните идею, план, срок, ссылку и отправьте.
  8. Вернитесь в «Бизнес» → «Кабинет»: заявка видна в блоке «Заявки на …». Нажмите «Выбрать команду» или «Отклонить».

Дополнительно: cd backend && pnpm test — 14 тестов формулы и защиты ИИ; страница http://localhost:3000/ai — промпты и схемы.

9. Данные и интеграции

  • Синтетические данные — в backend/prisma/data/*.json, загружаются одной командой pnpm db:seed:
    • 10 компаний;
    • 5 черновиков разной полноты с отраслью (drafts.json);
    • 7 опубликованных карточек со всеми полями, текущим рейтингом от 18 до 95 и историей (cards.json);
    • 5 профилей команд (teams.json);
    • 8 заявок, в том числе с решениями «выбрана» и «отклонена» (proposals.json).
  • OpenAI API — разбор черновика и сборка карточки. Ключ берётся из OPENAI_API_KEY в .env. В репозиторий ключ не попадает: .env в .gitignore.
  • PostgreSQL — основное хранилище, поднимается через docker-compose.yml.
  • Google Fonts — шрифты загружаются при сборке через next/font.
  • Других внешних сервисов нет.

10. Ограничения

  • Нет регистрации, авторизации и ролей: компания и команда выбираются в шапке (по условиям кейса это вне рамок MVP).
  • Нет чата, уведомлений, календаря и файлового хранилища; прототип передаётся ссылкой.
  • Этап «Результат» из кейса (баллы выбранной команде за фактический прогресс) не реализован — MVP заканчивается решением бизнеса по заявке.
  • Подсказки для команд работают на совпадении ключевых слов, без ИИ.
  • Проверки формулы оценивают наличие и конкретность сведений (длина, числа, ключевые слова), а не смысл текста.
  • Проверка фактов ловит новые числа и латинские названия; перефразирование без новых чисел и названий она не отличит.
  • Интерфейс рассчитан на десктоп; мобильная адаптация по кейсу вне рамок.
  • Продакшн-сборки и деплоя нет.

11. Ссылка на deployed-версию

Развёрнутой версии нет — проект запускается локально по инструкции выше.

Звёзды
⭐ 0
Форки
0
Язык
TypeScript
Последний push
в прошлом месяце
Коммиты
11
Авторы
1
Файлы
79
Ветки
1

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

Adilhan Taizhan 11

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

  • 2026-09-23 17:37docs: README with setup, scoring formula, catalog rules and demo scenarioAdilhan Taizhan
  • 2026-09-23 17:37fix(frontend): show AI card score preview on first renderAdilhan Taizhan
  • 2026-09-23 17:29feat(frontend): business flow from draft to team selectionAdilhan Taizhan
  • 2026-09-23 17:29feat(frontend): task table, task page, team profile and AI pageAdilhan Taizhan
  • 2026-09-23 17:29feat(frontend): design system, app shell and role switcherAdilhan Taizhan
  • 2026-09-23 17:29fix(backend): longer transaction wait for slow database connectionsAdilhan Taizhan
  • 2026-09-23 17:02feat(db): initial migration and synthetic seed dataAdilhan Taizhan
  • 2026-09-23 17:02feat(backend): REST API for tasks, catalog, teams and proposalsAdilhan Taizhan
Все коммиты (11)
  • 2026-09-23 17:02feat(backend): AI clarification with OpenAI structured outputs and local fallbackAdilhan Taizhan
  • 2026-09-23 16:38feat(backend): prisma schema and readiness scoring functionAdilhan Taizhan
  • 2026-09-23 16:38chore: scaffold Next.js frontend, Express backend and Postgres composeAdilhan Taizhan
Структура репозитория (79 файлов)
.env.example
.gitignore
README.md
backend/package.json
backend/pnpm-lock.yaml
backend/pnpm-workspace.yaml
backend/prisma.config.ts
backend/prisma/data/businesses.json
backend/prisma/data/cards.json
backend/prisma/data/drafts.json
backend/prisma/data/proposals.json
backend/prisma/data/teams.json
backend/prisma/migrations/20260923115931_init/migration.sql
backend/prisma/migrations/migration_lock.toml
backend/prisma/schema.prisma
backend/prisma/seed.ts
backend/src/ai/ai.test.ts
backend/src/ai/fallback.ts
backend/src/ai/guard.ts
backend/src/ai/openai.ts
backend/src/ai/prompts.ts
backend/src/ai/schemas.ts
backend/src/ai/service.ts
backend/src/app.ts
backend/src/db.ts
backend/src/domain.ts
backend/src/env.ts
backend/src/index.ts
backend/src/lib/http.ts
backend/src/lib/recommend.ts
backend/src/lib/tasks.ts
backend/src/routes/businesses.ts
backend/src/routes/catalog.ts
backend/src/routes/meta.ts
backend/src/routes/tasks.ts
backend/src/routes/teams.ts
backend/src/scoring/scoring.test.ts
backend/src/scoring/scoring.ts
backend/tsconfig.json
docker-compose.yml
frontend/.gitignore
frontend/AGENTS.md
frontend/app/ai/page.tsx
frontend/app/business/new/page.tsx
frontend/app/business/page.tsx
frontend/app/business/tasks/[id]/clarify/page.tsx
frontend/app/business/tasks/[id]/page.tsx
frontend/app/catalog/[id]/page.tsx
frontend/app/catalog/page.tsx
frontend/app/error.tsx
frontend/app/globals.css
frontend/app/icon.svg
frontend/app/layout.tsx
frontend/app/loading.tsx
frontend/app/not-found.tsx
frontend/app/page.tsx
frontend/app/team/page.tsx
frontend/components/Header.tsx
frontend/components/ProposalForm.tsx
frontend/components/TeamProfileForm.tsx
frontend/components/Toast.tsx
frontend/components/business/BusinessProfile.tsx
frontend/components/business/CardEditor.tsx
frontend/components/business/ClarifyView.tsx
frontend/components/business/DraftForm.tsx
frontend/components/business/ProposalsPanel.tsx
frontend/components/motion.tsx
frontend/components/ui.tsx
frontend/eslint.config.mjs
frontend/lib/actor-client.ts
frontend/lib/actor.ts
frontend/lib/api.ts
frontend/lib/format.ts
frontend/lib/types.ts
frontend/next.config.ts
frontend/package.json
frontend/pnpm-lock.yaml
frontend/pnpm-workspace.yaml
frontend/tsconfig.json

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

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

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