AAYMA
RU
Войти

EventMatch AI

Сервис подбора до трёх подрядчиков для мероприятия из каталога (66 профилей) с объяснением выбора и причины пустой выдачи.

Прототип
Команда «Nebula» 5💬 0 комментариевс 23 сентября 2026 г.

О проекте

Команда: Nebula
Кейс HackAlem.ai: Креативные индустрии — Firebird
Стадия: Прототип

Задача кейса: «#79-lite»: подобрать до 3 подрядчиков для мероприятия и объяснить выбор

Суть

Сервис подбора до трёх подрядчиков для мероприятия из каталога (66 профилей) с объяснением выбора и причины пустой выдачи. Работает детерминированный matcher, агентная часть описана как следующий этап.

Как устроено

Форма (город, дата, формат, категория, бюджет, язык, длительность) вызывает /api/match (Vercel Function или локальный server.js). Он читает CSV, проверяет 13 колонок, строго фильтрует, исключает занятых по дате и сортирует по score, затем цене, затем ID. Отдаёт не больше 3 карточек или причину пустой выдачи (category_not_found, no_match). Целевая схема: агент на NVIDIA Brev извлекает параметры из текста и вызывает инструмент search_contractors. По коммитам NVIDIA Nemotron потом заменили на OpenAI structured responses.

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

  • детерминированные фильтры и ранжирование
  • tool search_contractors
  • OpenAI structured responses

Особенности

Чёткое разделение ответственности: агент только понимает запрос и объясняет, а отбор и порядок определяет детерминированный matcher, что даёт воспроизводимую выдачу. В README честно описан блокер деплоя на Vercel Hobby из приватного org-репозитория.

Стек

JavaScript · Node.js · HTML/CSS · Vercel · NVIDIA Brev

Модели

NVIDIA Nemotron · OpenAI


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

README

README.md

EventMatch AI

Рабочий репозиторий команды Nebula для трека 06 HackAlem AI: «Умный подбор подрядчиков».

Простая идея

Пользователь выбирает город, дату, формат мероприятия, категорию подрядчика и бюджет.

Сервис показывает до трёх подходящих подрядчиков из выданного каталога и объясняет каждый выбор конкретными фактами:

  • подрядчик работает в нужном городе;
  • берёт нужный формат мероприятия;
  • свободен в выбранную дату;
  • его цена «от» укладывается в бюджет;
  • при запросе проверяются язык и длительность.

Если подходящих нет, сервис объясняет причину: такой категории нет в городе или кандидаты не проходят условия.

Границы задачи

В проект не входят бронирование, заявки подрядчикам, платежи и уведомления.

Цена в каталоге является ценой «от». Сервис не обещает окончательную стоимость услуги.

Данные каталога анонимизированы. Поля synthetic, city_imputed и price_imputed должны быть видны в карточке, когда они равны true.

Роли команды

Участник 1 — данные и алгоритм

  • Добавляет исходный CSV в data/.
  • Создаёт загрузчик и проверку структуры данных.
  • Реализует фильтры: город, категория, формат, бюджет, дата, язык и длительность.
  • Создаёт детерминированное ранжирование и объяснение причин пустой выдачи.
  • Готовит тестовые сценарии из ТЗ.

Участник 2 — AI Agent и NVIDIA Brev

  • Поднимает на Brev HTTP-сервис агента и модельный endpoint.
  • Реализует поток: понять запрос на обычном языке → уточнить обязательное поле при необходимости → вызвать инструмент search_contractors → проверить структурированный ответ → объяснить результат.
  • Агент вызывает единый API поиска /api/match; он не придумывает подрядчиков и не меняет порядок ранжирования.
  • Возвращает подтверждённые причины для карточек и причину пустого результата.
  • Настраивает защищённый HTTPS-вызов Brev со стороны Vercel; секреты не попадают в браузер и GitHub.

Участник 3 — generalist, интерфейс и Vercel

  • Доводит форму и карточки до демо-сценария с текстовым запросом.
  • Соединяет интерфейс с API агента и API поиска.
  • Разворачивает приложение в Vercel из GitHub, проверяет Preview и Production URL.
  • Обновляет README, фиксирует демо-запросы и готовит показ жюри.

План разработки

Этап 0. Старт проекта

Статус: сделано

  • Создана структура плана.
  • Зафиксирована задача и распределены роли.
  • Добавлен сайт: index.html, styles.css, app.js.
  • Добавлен контракт подключения данных: data/README.md.
  • Каждый участник делает первый отдельный коммит в свой час работы.

Этап 1. Данные и базовый поиск

Цель: по форме получить корректный список доступных кандидатов.

  • Добавлен исходный CSV как data/contractors.csv.
  • Добавить браузерный checkpoint: проверка 13 обязательных колонок перед подключением CSV.
  • Реализован checkpoint 13 колонок: ID, имя, категории, город, цена, форматы, языки, длительность, занятые даты, описание и флаги.
  • Реализованы строгие фильтры в api/match.js.
  • Занятый подрядчик исключается до ранжирования.
  • API возвращает не более трёх кандидатов.
  • Порядок фиксирован: score → цена → ID.

Готово, когда один и тот же запрос дважды возвращает одни и те же карточки в том же порядке.

Этап 2. Объяснимый подбор

Цель: у каждой карточки есть собственное объяснение, основанное на каталоге.

  • Ввести понятный расчёт ранга: обязательные условия + число дополнительных совпадений.
  • Сформировать для каждой карточки 1–2 конкретных предложения.
  • Упомянуть только подтверждённые поля профиля.
  • Объяснить, почему кандидатов меньше трёх.
  • Считать исключения по причинам: нет формата, выше бюджета, занят, нет языка, недостаточная длительность.

Пример хорошего объяснения: «Свободен 15 октября, ведёт корпоративы, говорит на русском и английском; цена от 1 000 000 ₸ укладывается в ваш бюджет».

Этап 3. AI Agent на NVIDIA Brev

Цель: агент самостоятельно проводит ограниченный цикл поиска с инструментом, сохраняя правила трека.

  • Поднять HTTP endpoint агента на Brev и проверить его доступность для Vercel по HTTPS.
  • Принимать свободный текст; возвращать уточняющий вопрос, если не хватает обязательных полей.
  • Вызвать инструмент search_contractors, связанный с /api/match.
  • Использовать только результаты и причины, которые вернул каталог и matcher.
  • При нулевой выдаче объяснять исключающие условия и предлагать возможные варианты изменения запроса.
  • Не менять фильтры, карточки и порядок выдачи без явного ответа пользователя.
  • Хранить ключ Brev в серверных переменных Vercel/Brev; не коммитить секреты.

Этап 4. Интерфейс

Цель: жюри может самостоятельно выполнить поиск без помощи разработчика.

  • Сделать форму с обязательными полями и понятной валидацией.
  • Показать максимум три карточки.
  • Показать «от» перед ценой.
  • Выделить занятость как причину исключения.
  • Добавить метки synthetic / восстановленный город / восстановленная цена.
  • Сделать ссылку или кнопку для загрузки трёх демо-запросов.

Этап 5. Обязательные демонстрации

  • Плотная категория: Алматы, ведущий, корпоратив, 15.10.2026, бюджет 2 000 000 ₸.
  • Тот же запрос на 25.12.2026: выдача должна измениться из-за занятости.
  • Редкая категория: Алматы, флорист, свадьба, 15.10.2026, бюджет 1 000 000 ₸.
  • В городе нет категории: Астана, декоратор.
  • Кандидат есть, но не проходит условия: Астана, флорист, свадьба, 15.10.2026, бюджет 1 000 000 ₸.
  • Запустить одинаковый запрос дважды и показать одинаковый порядок.

Этап 6. Сдача

  • README содержит архитектуру, установку, запуск и пять демо-запросов.
  • В репозитории есть исходные данные или инструкция их получения.
  • В .env.example описаны необязательные переменные.
  • Проект запускается одной командой без личных аккаунтов проверяющего.
  • В истории GitHub есть прогресс минимум один раз в час.
  • Последний коммит сделан до дедлайна.

Архитектура

Текущий работающий путь:

Форма сайта → Vercel /api/match → официальный CSV
                              → строгие фильтры
                              → детерминированная сортировка
                              → до 3 карточек или причина пустой выдачи

Целевой путь после подключения агента:

Текстовый запрос → Vercel /api/agent → AI Agent + модель на NVIDIA Brev
                                               ↓ search_contractors
Сайт ← объяснение по результатам ← Vercel /api/match ← CSV и правила

Результаты и их порядок принадлежат /api/match. Агент работает с запросом и объяснением, а не заменяет правила доступности.

AI Agent: граница ответственности

Состояние на сейчас: API детерминированного подбора реализован в api/match.js; агентный endpoint на Brev и его подключение к сайту — следующий этап. Пока Brev не подключён, проект следует показывать как работающий matcher с интерфейсом, а не как завершённый агент.

Целевой поток:

Браузер
  → Vercel: сайт и серверный gateway /api/agent
  → Brev: агент и модель
  → инструмент search_contractors
  → Vercel /api/match
  → data/contractors.csv и детерминированные правила
  → карточки и подтверждённое объяснение

Агент может извлечь параметры из текста и задать уточняющий вопрос. Отбор по городу, категории, формату, бюджету, занятости, языку и длительности выполняет matcher. Агент не создаёт карточки, не меняет порядок результатов и не снимает ограничения молча. При пустом результате он показывает фактическую причину и предлагает варианты для следующего запроса.

Секрет доступа к Brev задаётся только в серверных переменных проекта Vercel, например BREV_AGENT_URL и BREV_AGENT_TOKEN. Не добавляйте секрет в app.js, HTML, публичные переменные окружения или коммиты. Для текущего rule-based приложения переменные не требуются.

Деплой в Vercel

GitHub остаётся главным источником кода, Vercel размещает сайт и API. Репозиторий проекта: BAITC-Hacks/hack-86169f09-nebula.

Настройки проекта

  • Root Directory: корень репозитория.
  • Framework Preset: Other (framework: null в vercel.json).
  • Build Command: пустая команда; сайт состоит из HTML/CSS/JS без сборщика.
  • Output Directory: корень репозитория.
  • Vercel Functions: /api/match.js с CSV-каталогом из data/contractors.csv.
  • Переменные окружения: rule-based поиск в /api/match не требует ключей.

server.js нужен для локального запуска. vercel build --yes --target preview локально собирает корректный Build Output: статический интерфейс, Node.js Function /api/match и CSV-каталог.

Текущий статус — 23 сентября 2026

  • Проект eventmatch-ai создан в Vercel, но его workspace использует план Hobby.
  • Vercel заблокировал Preview-деплой с причиной: автор Git-коммита не имеет права создавать deployments для проекта.
  • Репозиторий приватный и находится в GitHub-организации BAITC-Hacks. Vercel Hobby не поддерживает deployments из приватного репозитория GitHub-организации. См. официальные правила Vercel для приватных Git-репозиториев.
  • Production URL, созданный первым неудачным деплоем, пока не работает: запрос к серверу возвращает FUNCTION_INVOCATION_FAILED. Не используйте эту ссылку как демо.

Рабочий публичный URL: пока отсутствует. Не считать деплой завершённым, пока Preview и Production не пройдут проверку.

Что нужно решить для публикации

  1. Сохранить репозиторий приватным и перевести проект в Vercel Pro; затем подключить GitHub-организацию, выдать Vercel доступ к репозиторию и добавить авторов коммитов в команду Vercel.
  2. Открыть репозиторий для всех. Это сделает публичными исходный код и все данные, хранящиеся в GitHub; выбирайте этот вариант только если команда согласна на такую публикацию.

После устранения ограничения создайте Preview deployment, проверьте сайт и /api/match, затем публикуйте Production URL. Проверка API должна показать catalog_profiles: 66 и одно из состояний matched, category_not_found или no_match. Одинаковые запросы должны возвращать карточки в том же порядке.

Дальнейшие изменения

После готовности Brev добавьте BREV_AGENT_URL и BREV_AGENT_TOKEN в Project Settings → Environment Variables Vercel, затем создайте новый deployment. Секреты не добавляйте в README или GitHub. После успешной проверки впишите production URL выше.

Как запустить локально

Нужен Node.js 20 или новее.

node server.js

Откройте http://localhost:3000. Сервер отдаёт интерфейс, CSV и API /api/match без установки библиотек и без личного аккаунта.

Текущая архитектура

  • data/contractors.csv — официальный каталог из 66 профилей.
  • api/match.js — серверный подбор по правилам ТЗ.
  • app.js — интерфейс, который обращается к API; при загрузке своего CSV использует локальный безопасный fallback.
  • server.js — локальный запуск сайта и API одной командой.
  • index.html и styles.css — пользовательский интерфейс.

Технологии

  • Node.js без внешних зависимостей для локального запуска;
  • CSV как единственный источник фактов о подрядчиках;
  • HTML/CSS/JavaScript для интерфейса;
  • NVIDIA Brev — планируемое место запуска AI Agent и модельного сервиса;
  • Vercel — веб-интерфейс, публичный endpoint и серверный gateway к Brev;
  • детерминированный matcher остаётся единственным источником результатов и порядка карточек;
  • если Brev временно недоступен, интерфейс сохраняет обычный поиск по правилам.

Ссылки

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

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

DARKHAN 21Almaz 6

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

  • 2026-09-23 17:58Prevent stale frontend assets after integrated deploymentAlmaz
  • 2026-09-23 17:55Integrate team frontend and CSV with FastAPI and OpenAIAlmaz
  • 2026-09-23 17:39Replace NVIDIA inference with OpenAI structured responsesAlmaz
  • 2026-09-23 16:51docs: clarify Vercel deployment blockerDARKHAN
  • 2026-09-23 16:28fix: serve static site and keep matcher as function on VercelDARKHAN
  • 2026-09-23 16:26Configure Brev proxy binding and document verified deploymentAlmaz
  • 2026-09-23 16:09docs: fix Brev environment variable instructionsDARKHAN
  • 2026-09-23 16:09docs: clarify Vercel import and deployment statusDARKHAN
Все коммиты (27)
  • 2026-09-23 16:05chore: include contractor catalog in Vercel functionDARKHAN
  • 2026-09-23 16:04docs: document Vercel deployment and Brev agent architectureDARKHAN
  • 2026-09-23 15:43Add NVIDIA Nemotron integration and deployment configurationAlmaz
  • 2026-09-23 15:02Add contractor search backend and connect EventMatch UIAlmaz
  • 2026-09-23 14:40chore: protect local secrets and deployment filesDARKHAN
  • 2026-09-23 14:40docs: document catalog API and local startupDARKHAN
  • 2026-09-23 14:40chore: run EventMatch locally without external servicesDARKHAN
  • 2026-09-23 14:39feat: add dependency-free local server and API adapterDARKHAN
  • 2026-09-23 14:39fix: load bundled contractor catalog on startupDARKHAN
  • 2026-09-23 14:38feat: connect interface to catalog API with local fallbackDARKHAN
  • 2026-09-23 14:37chore: configure Vercel development entrypointDARKHAN
  • 2026-09-23 14:37feat: add contractor matching APIDARKHAN
  • 2026-09-23 14:36data: add official hackathon contractor catalogDARKHAN
  • 2026-09-23 14:17docs: record website and dataset checkpoint progressDARKHAN
  • 2026-09-23 14:17docs: add contractor dataset checkpoint contractDARKHAN
  • 2026-09-23 14:16feat: add deterministic contractor search and data checkpointDARKHAN
  • 2026-09-23 14:15feat: add responsive EventMatch AI stylesDARKHAN
  • 2026-09-23 14:13feat: add EventMatch AI search interfaceDARKHAN
  • 2026-09-23 14:10docs: add track 06 delivery plan and team rolesDARKHAN
Структура репозитория (11 файлов)
.gitignore
README.md
api/match.js
app.js
data/README.md
data/contractors.csv
index.html
package.json
server.js
styles.css
vercel.json
Ветки (2)

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

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

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