Select
Streamlit-приложение: подбирает до трёх подрядчиков под город, дату, формат, категорию и бюджет, исключает занятых, объясняет каждую рекомендацию и…
О проекте
Команда: Select
Кейс HackAlem.ai: Креативные индустрии — Firebird
Стадия: Рабочий MVP
Задача кейса: «#79-lite»: подобрать до 3 подрядчиков для мероприятия и объяснить выбор
Суть
Streamlit-приложение: подбирает до трёх подрядчиков под город, дату, формат, категорию и бюджет, исключает занятых, объясняет каждую рекомендацию и честно сообщает, если вариантов мало.
Как устроено
Каталог contractors.csv (66 анонимизированных профилей) фильтруется в matcher.py по календарю занятости и условиям допуска, затем сортируется в устойчивом порядке. explanations.py собирает проверяемые факты и конкретную деталь из описания. По явному согласию пользователя OpenAI gpt-4.1-mini может выбрать один из заранее проверенных фрагментов описания, но на отбор и порядок не влияет; при ошибке API используется локальное объяснение.
Ключевые решения
- детерминированная фильтрация по ограничениям
- проверка календаря занятости
- устойчивая сортировка
- шаблонные объяснения по фактам
- LLM выбирает фрагмент из проверенных вариантов
Особенности
LLM ограничен выбором из заранее проверенных фрагментов, поэтому не может выдумать факт или изменить ранжирование. Интерфейс показывает, когда выбор модели совпал с локальным. В README есть демо-таблица краевых случаев: редкая категория, нет категории, не проходит бюджет, смена даты.
Стек
Python · Streamlit · pytest
Модели
gpt-4.1-mini
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-bfb0fc74-select.
README
README.mdSelect — подбор подрядчиков для событий
Select выбирает до трёх подрядчиков под город, дату, формат, категорию и бюджет. Он исключает занятых, объясняет каждую рекомендацию и честно сообщает, если вариантов мало или их нет. Решение кейса #79-lite, трек 06 HackAlem AI.

Запуск
Нужен Python 3.11+ и интернет для первой установки пакетов. Откройте терминал в корне репозитория.
| macOS / Linux | Windows PowerShell |
|---|---|
python3 -m venv .venv | py -3 -m venv .venv |
./.venv/bin/python -m pip install -r requirements.txt | .\.venv\Scripts\python.exe -m pip install -r requirements.txt |
./.venv/bin/python -m streamlit run app.py | .\.venv\Scripts\python.exe -m streamlit run app.py |
Откройте локальный адрес из терминала. .env и API-ключ не нужны: без них Select использует локальные объяснения. Чистый запуск только с requirements.txt, без OpenAI SDK и ключа, проверен отдельно.
Демо за две минуты
Во всех строках формат — свадьба. Для сравнения дат оставайтесь в одной вкладке и каждый раз нажимайте «Подобрать подрядчиков».
| Сценарий | Город · категория | Дата | Бюджет | Результат |
|---|---|---|---|---|
| Плотная категория | Алматы · Ведущий | 10.10.2026 | 2 000 000 ₸ | 3 карточки |
| Смена только даты | Алматы · Ведущий | 11.10.2026 | 2 000 000 ₸ | другая тройка и пояснение занятости |
| Редкая категория | Алматы · Флорист | 10.10.2026 | 300 000 ₸ | 1 карточка и причина нехватки |
| Категории нет | Астана · Декоратор | 10.10.2026 | 3 000 000 ₸ | сообщение об отсутствии категории |
| Не проходит бюджет | Алматы · Ведущий | 10.10.2026 | 100 000 ₸ | объяснение пустой выдачи |
Для проверки площадок: Алматы · Банкетный зал · 14.11.2026 · 6 000 000 ₸. Язык и длительность задаются в «Дополнительных условиях». Повтор того же запроса сохраняет порядок.

Что внутри
| Часть | Задача |
|---|---|
app.py · Streamlit 1.64.0 | форма, превью города, карточки и пустые состояния |
matcher.py · Python | календарь, условия допуска и устойчивый порядок |
explanations.py | проверяемые факты и конкретная деталь описания |
data/contractors.csv | 66 анонимизированных профилей, 13 полей; даты 23.09–31.12.2026 |
Цена показана «от» за мероприятие; свободная дата в каталоге не подтверждает бронирование. Синтетические профили и заполненные при подготовке город/цена помечаются. Бронирования, заявок и уведомлений нет.
OpenAI необязателен: модель выбирает один из проверенных фрагментов описания, но не меняет отбор и порядок. Её выбор иногда совпадает с локальным — интерфейс это показывает. При ошибке API работают локальные объяснения. Для AI отдельно установите requirements-ai.txt и задайте OPENAI_API_KEY в окружении или локальном .env; модель по умолчанию — gpt-4.1-mini. Не добавляйте ключ в Git. NVIDIA API приложению не нужен.
В разработке участвовали AI-агенты Codex: отдельные задачи по подбору, объяснениям и интерфейсу были интегрированы и проверены вместе. При запуске отдельный агентный сервис не нужен.
Конфигурация развёртывания
Публичной версии нет: жюри может запустить проект локально. Если понадобится Streamlit Community Cloud, официальная инструкция предлагает выбрать репозиторий, ветку и входной файл:
| Настройка | Для Select |
|---|---|
| Ветка / входной файл | main / app.py |
| Python / зависимости | 3.12 / корневой requirements.txt |
| Тема | .streamlit/config.toml |
| Секреты базового режима | не нужны |
Для AI в облаке дополнительно нужен openai==2.54.0 в зависимостях окружения и корневой OPENAI_API_KEY в Secrets, а не в Git. См. зависимости и секреты. Деплой не выполнялся.
Проверки и ограничения
./.venv/bin/python -m pip install -r requirements-dev.txt
./.venv/bin/python -m pytest -q
На Windows используйте .\.venv\Scripts\python.exe. Даты вне окна каталога нельзя считать свободными; пустой max_hours означает услугу без фиксированного времени на площадке. Подробный контракт — в MVP_CONTRACT.md.
Авторы коммитов
История коммитов
- 2026-09-23 17:58Document keyless launch and add project screenshotsAndn1ght
- 2026-09-23 17:45Clarify optional AI explanation outcomesAndn1ght
- 2026-09-23 17:29Clarify optional AI role against hackathon briefAndn1ght
- 2026-09-23 17:15Record validated live AI demo resultAndn1ght
- 2026-09-23 17:13Harden AI excerpt choices and disclose sent dataAndn1ght
- 2026-09-23 16:57Require explicit opt-in before OpenAI explanationsAndn1ght
- 2026-09-23 16:54Fix matching evidence and date comparison clarityAndn1ght
- 2026-09-23 16:34Enable secure local OpenAI configurationAndn1ght
Все коммиты (14)
- 2026-09-23 16:06Record final Select QA outcomeAndn1ght
- 2026-09-23 16:03Polish Select interface and city previewsAndn1ght
- 2026-09-23 16:00Verify matching reasons and improve explanationsAndn1ght
- 2026-09-23 14:46Refine explanations and complete MVP QAAndn1ght
- 2026-09-23 14:35Record completed MVP handoff statusAndn1ght
- 2026-09-23 14:32Build contractor matching MVP for HackAlem AIAndn1ght
Структура репозитория (26 файлов)
.env.example .gitignore .streamlit/config.toml HACKATHON_CONTEXT.md INTEGRATION_PLAN.md MVP_CONTRACT.md README.md app.py assets/cities/abroad.png assets/cities/almaty.png assets/cities/astana.png assets/readme/form.png assets/readme/results.png config.py data/contractors.csv explanations.py matcher.py models.py requirements-ai.txt requirements-dev.txt requirements.txt tests/conftest.py tests/test_config.py tests/test_explanations.py tests/test_matcher.py tests/test_mvp_flow.py
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.