AAYMA
RU
Войти

Агент для тарифных маркетинговых кампаний

Агент выбирает, каким сегментам абонентов предложить смену тарифа.

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

О проекте

Команда: temka
Кейс HackAlem.ai: Телеком — Beeline
Стадия: Рабочий MVP

Задача кейса: Агент, который решает, каким абонентам какой тариф предложить (чистый прирост ARPU)

Суть

Агент выбирает, каким сегментам абонентов предложить смену тарифа. Сначала он запускает до 20 пробных кампаний (пилотов), затем по их результатам выбирает 1–10 финальных кампаний в рамках бюджета и лимита контактов. Результат показывает локальный Flask-сайт.

Как устроено

Входные данные: ARPU по месяцам, история смен тарифа, словарь тарифов, трафик и профили клиентов, плюс заранее отобранный shortlist кандидатов (candidate_prior.csv). В mock-среде с синтетическими эффектами агент проводит адаптивные пилоты и консервативно выбирает финальные кампании: тариф, канал и фильтр аудитории. Ограничения: 100 000 бюджета, 15 000 контактов, до 5 000 клиентов на кампанию. Сайт по seed запускает оценку и показывает чистый результат после расходов, затраты и таблицу кампаний.

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

  • adaptive pilot experiments
  • budget-constrained campaign selection
  • candidate shortlist / prior
  • seeded mock environment evaluation

Особенности

Используется механика «пилот, затем финальный выбор»: агент тратит часть бюджета на эксперименты и только после них масштабирует кампании. README предупреждает, что положительный результат в mock-среде не гарантирует результата на скрытой проверке. LLM в расчёте не используется.

Стек

Python · Flask · pandas · numpy · unittest · PowerShell


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

README

README.md

Агент для тарифных маркетинговых кампаний

Проект помогает выбрать, каким группам клиентов предложить другой тариф. Агент проводит небольшие пробные кампании — пилоты, оценивает результат и выбирает финальные кампании с учётом бюджета и доступных контактов.

Сайт — локальная демонстрация агента. Введите seed, запустите расчёт и получите показатели и таблицу кампаний. Расчёт выполняется на вашем компьютере в тестовой mock-среде с синтетическими эффектами.

Если проект уже установлен

Откройте PowerShell в папке проекта, где лежат этот README и папка .venv-web, и выполните:

.\.venv-web\Scripts\python.exe -m webapp.app

Затем откройте http://127.0.0.1:8000 в браузере.

Терминал оставьте открытым. Для остановки сервера нажмите Ctrl+C. Если сервер уже работает, запускать второй не нужно — просто откройте сайт.

Если папки .venv-web ещё нет, выполните установку ниже.

1. Что понадобится для первого запуска

  • Компьютер с Windows и PowerShell — инструкции ниже написаны для них.
  • Python с модулями pip и venv.
  • Git — если скачиваете проект командой git clone.
  • Браузер.
  • Интернет для скачивания проекта и первоначальной установки библиотек.

Проверенная конфигурация: Windows 11, Python 3.14.3, Flask 3.1.3. Другие версии и операционные системы отдельно не проверялись.

Для работы сайта не нужны Node.js, Docker, ключи API, платные сервисы или запущенная языковая модель. После установки сам расчёт не использует интернет.

Откройте терминал PowerShell. В VS Code: меню Терминал → Создать терминал. Проверьте Python:

python --version

Если команда не найдена, попробуйте py --version. Если работает только py, используйте его вместо python при создании окружения ниже. Если не работает ни одна команда, установите Python с pip и venv, добавьте его в PATH и заново откройте терминал.

Копируйте только команды из блоков. Строку приглашения вроде PS C:\...> копировать не нужно. Выполняйте команды по очереди; если появилась ошибка, исправьте её до следующего шага.

2. Откройте папку с общей сборкой

Если проект ещё не скачан

Из папки, в которой хотите сохранить проект, выполните:

git clone --branch main https://github.com/BAITC-Hacks/hack-b177ad85-temka.git hack-web-demo
Set-Location -LiteralPath ".\hack-web-demo"

Здесь выбрана main — ветка опубликованной общей сборки. Если GitHub запросит авторизацию, используйте свою учётную запись с доступом к репозиторию. Не добавляйте токены в файлы.

Если папка hack-web-demo уже существует, не удаляйте её: используйте существующую копию или выберите другое имя для нового клонирования.

Если проект уже есть на компьютере

Перейдите в его папку. Замените пример ниже своим настоящим путём:

Set-Location -LiteralPath "C:\путь\к\папке\проекта"

Название папки может быть любым. Важно, чтобы внутри находились requirements-web.txt, start_web.ps1, webapp и данные проекта.

Проверьте расположение и ветку:

Get-Location
Test-Path .\requirements-web.txt
Test-Path .\webapp\app.py
git branch --show-current
git status --short

Обе команды Test-Path должны показать True. Для этой сборки используется ветка main; в отдельной ветке проверки должен быть код общей сборки. Если нужных файлов нет, не продолжайте установку из неправильной папки.

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

3. Установите зависимости — один раз

Рекомендуемый ручной способ не требует активации окружения, прав администратора или изменения политики PowerShell.

Создайте отдельное окружение Python

Из корня проекта:

python -m venv .venv-web

Если .venv-web уже создана для этой копии проекта, пропустите эту команду. Не удаляйте существующее окружение. Папка хранит библиотеки отдельно от глобального Python и не добавляется в Git.

Установите библиотеки

.\.venv-web\Scripts\python.exe -m pip install -r requirements-web.txt

Дождитесь завершения. Файл подключает зависимости агента из requirements.txt и Flask для сайта.

Проверьте установку

.\.venv-web\Scripts\python.exe -m pip check

Ожидаемый ответ: No broken requirements found. При ошибке установки не переходите к запуску — сохраните текст ошибки.

4. Запустите сервер и откройте сайт

Из той же папки выполните:

.\.venv-web\Scripts\python.exe -m webapp.app

При успешном запуске в терминале появится:

Running on http://127.0.0.1:8000
Press CTRL+C to quit

Откройте в браузере http://127.0.0.1:8000.

  • Используйте http, не https.
  • Это адрес на вашем компьютере, а не ссылка для публичного доступа.
  • Терминал занят сервером — это нормально. Другие команды вводите в новом терминале.
  • Предупреждение This is a development server не означает ошибку. Этот режим подходит для локальной демонстрации, но не для публичного размещения.

5. Проверьте работу сайта

  1. Введите 42 в поле seed.
  2. Нажмите кнопку запуска оценки.
  3. Дождитесь завершения расчёта, не отправляя много запросов подряд.
  4. Проверьте, что появились метрики и таблица финальных кампаний.
  5. Повторите запуск с тем же seed, затем попробуйте, например, 7.

Seed — целое число от 0 до 2147483647, задающее случайность тестовой среды. При одинаковом seed, версии кода и окружении результаты воспроизводимы; время выполнения может отличаться.

На сайте отображаются:

  • чистый результат после расходов;
  • общие расходы и контакты, включая пилоты;
  • число пилотов и финальных кампаний;
  • выбранные тарифы, каналы и фильтры аудитории;
  • предупреждения, если они возникли.

В одном экземпляре сервера одновременно выполняется одна оценка. Ответ 409 означает, что предыдущая оценка ещё идёт: дождитесь её завершения.

6. Остановка и повторный запуск

Для остановки нажмите Ctrl+C в терминале сервера. Закрытие вкладки браузера само по себе сервер не останавливает.

В следующий раз достаточно перейти в папку проекта и выполнить:

.\.venv-web\Scripts\python.exe -m webapp.app

Заново создавать окружение и устанавливать библиотеки каждый раз не нужно. После изменения зависимостей повторите установку из раздела 3.

Альтернатива: запуск скриптом

Вместо ручной установки и запуска можно использовать:

.\start_web.ps1

Скрипт создаёт отсутствующую .venv-web, устанавливает зависимости при первом запуске и запускает сервер её Python. Он также работает из другой папки, если вызвать его полным путём в кавычках.

После изменения зависимостей:

.\start_web.ps1 -Reinstall

Если Windows запрещает запуск ps1, используйте ручной способ из разделов 3–4. Менять глобальную ExecutionPolicy не требуется.

Частые ошибки

Что произошлоЧто делать
python не найден или открывается магазинПроверьте py --version. Если Python отсутствует, установите его и заново откройте терминал.
requirements-web.txt не найденВы находитесь не в корне общей сборки. Проверьте Get-Location и раздел 2.
Путь к python.exe не найденПроверьте наличие .venv-web и точное написание команды: она начинается с .\.venv-web, не с ..venv-web.
No module named flask / numpy / pandasУстановите requirements-web.txt через Python именно из .venv-web.
No module named webappПерейдите в корень проекта и запускайте -m webapp.app, а не файл app.py напрямую.
running scripts is disabledИспользуйте ручной запуск без ps1 и без активации окружения.
Port 8000 is already in use / WinError 10048Возможно, ваш сервер уже запущен. Проверьте его терминал. Останавливайте только свой сервер через Ctrl+C; не завершайте неизвестные процессы.
Браузер пишет «Не удаётся получить доступ»Убедитесь, что сервер ещё работает, адрес — http://127.0.0.1:8000, и в терминале нет ошибки.
Ответ 400Проверьте seed: нужен целый неотрицательный номер в допустимом диапазоне.
Ответ 409Оценка уже выполняется. Подождите и повторите запрос.
Ответ 500 / EVALUATION_FAILEDСохраните seed и полный текст ошибки из терминала. Не исправляйте данные или скоринг наугад.
fatal: not a git repositoryПерейдите в саму папку репозитория, а не в её родительскую папку.

Для диагностики занятости порта можно выполнить:

Get-NetTCPConnection -LocalPort 8000 -State Listen

Эта команда только показывает слушающий процесс, не останавливая его.

Проверки для разработчиков

Обычному пользователю сайта запускать тесты не обязательно. Для проверки сборки откройте второй терминал в корне проекта:

.\.venv-web\Scripts\python.exe -m pip check
.\.venv-web\Scripts\python.exe -X utf8 -m unittest discover -s tests -v

В конце тестов должно быть OK. Часть тестов специально имитирует ошибки; смотрите итоговый статус, а не только отдельный traceback в журнале.

Для проверки агента без сайта:

.\.venv-web\Scripts\python.exe -X utf8 local_eval.py

Для серии из 10 прогонов:

.\.venv-web\Scripts\python.exe -X utf8 local_eval.py --runs 10

Перед оценкой прочитайте .codex/skills/hackathon-eval/SKILL.md. Эти команды приведены как инструкции: фактически выполненные проверки и их результаты перечислены в docs/HANDOFF_INTEGRATION.md. HTTP-тесты и тестовый клиент Flask не заменяют проверку сайта в браузере.

Ограничения и официальная сдача

  • До 20 пилотов, 15 000 контактов и 100 000 бюджета.
  • От 1 до 10 финальных кампаний, до 5 000 клиентов на каждую.
  • Пилоты тоже расходуют бюджет и контакты. Например, 22 записи в отчёте могут означать 20 пилотов и 2 финальные кампании, а не нарушение лимита.
  • Mock-среда использует синтетические эффекты. Положительный локальный результат не гарантирует результат скрытой проверки организаторов.
  • Веб-приложение не создаёт и не обновляет submission.csv.
  • Официальная сдача — отдельный процесс по PARTICIPANT_GUIDE.md. make_submission.py не входит в запуск сайта; его выполняют отдельно при подготовке сдачи, учитывая, что он обновляет артефакт submission.

Команда и документы

Все участники равноправно пишут код, тестируют и коммитят изменения.

УчастникЗона координации
НаурызбайСерверная часть, подключение агента и интеграция.
АсанИнтерфейс и браузерные проверки.
СултаналиУстановка, запуск и автоматические проверки.
  • AGENTS.md — правила работы с репозиторием.
  • PROJECT_STATE.md — текущее состояние и следующие задачи.
  • docs/WEB_CONTRACT.md — договор компонентов и формат API.
  • docs/HANDOFF_INTEGRATION.md — источники сборки, проверки и ограничения.
  • docs/LOCAL_WEB.md — дополнительные технические инструкции.
  • PARTICIPANT_GUIDE.md — правила кейса и официальной сдачи.

Перед изменениями проверьте git status и git log -3 --oneline. Не удаляйте чужую работу, не применяйте force-push, не коммитьте окружения, секреты, кэш или логи. Не меняйте одновременно одни и те же файлы. Каждый обновляет отчёт своего направления; PROJECT_STATE — интегратор. История участников сохраняется обычными merge. Объединение в main — отдельное согласованное действие после общей проверки.

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

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

Наурызбай 11Assan 8rkhmtlsltn-cloud 6

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

  • 2026-09-23 17:40release: merge verified agent and web app with reproducible submissionНаурызбай
  • 2026-09-23 17:38fix(web): validate campaign fields and verify real browser integrationAssan
  • 2026-09-23 17:37merge(qa): include independent final verification reportНаурызбай
  • 2026-09-23 17:36docs: simplify Russian setup guide and record final checksНаурызбай
  • 2026-09-23 17:23docs(qa): record final web integration verificationrkhmtlsltn-cloud
  • 2026-09-23 17:10merge(web): integrate Sultanali QA and document verified applicationНаурызбай
  • 2026-09-23 16:57merge(web): integrate Asan frontend with evaluation backendНаурызбай
  • 2026-09-23 16:39test(web): align API checks with shared contractrkhmtlsltn-cloud
Все коммиты (25)
  • 2026-09-23 16:24fix(web): align campaign filters with backend API contractAssan
  • 2026-09-23 16:16docs(web): record backend handoff statusrkhmtlsltn-cloud
  • 2026-09-23 16:14feat(web): add Russian evaluation frontend and browser fixture checksAssan
  • 2026-09-23 16:09feat(web): add local web quality tooling and testsrkhmtlsltn-cloud
  • 2026-09-23 16:09feat(web): add local evaluation backend and service testsНаурызбай
  • 2026-09-23 15:36docs(qa): record independent evaluation and release checklistrkhmtlsltn-cloud
  • 2026-09-23 15:28docs: prepare Asan defense notes for agent 4c3d89bAssan
  • 2026-09-23 15:09feat(agent): adopt Asan's validated candidate shortlistYour Name
  • 2026-09-23 15:05docs: finalize candidate handoff with audience ARPU and experiment planAssan
  • 2026-09-23 14:35feat(agent): add adaptive pilots and conservative campaign selectionYour Name
  • 2026-09-23 14:27docs: add candidate handoffAssan
  • 2026-09-23 14:23docs: add role instructions for teamYour Name
  • 2026-09-23 14:18docs: add baseline evaluation reportAssan
  • 2026-09-23 14:11docs: refresh project stateYour Name
  • 2026-09-23 14:09Add candidate analysisrkhmtlsltn-cloud
  • 2026-09-23 14:02commit for commitYour Name
  • 2026-09-23 13:48Add Beeline tariff campaign starter kitAssan
Структура репозитория (43 файлов)
.codex/skills/hackathon-eval/SKILL.md
.codex/skills/hackathon-eval/agents/openai.yaml
.gitignore
AGENTS.md
PARTICIPANT_GUIDE.md
PARTICIPANT_GUIDE.pdf
PROJECT_STATE.md
README.md
agent.py
agent_template.py
candidate_analysis.md
candidate_prior.csv
customer_profile.csv
data/arpu_monthly.csv
data/change_tariff.csv
data/dict_tariff.csv
data/traffic.csv
docs/HANDOFF_BACKEND.md
docs/HANDOFF_FRONTEND.md
docs/HANDOFF_INTEGRATION.md
docs/HANDOFF_WEB_QA.md
docs/LOCAL_WEB.md
docs/WEB_CONTRACT.md
environment.py
eval_report.md
feature_dictionary.csv
local_eval.py
make_submission.py
mock_environment.py
requirements-web.txt
requirements.txt
scoring_core.py
start_web.ps1
submission.csv
tariff_dictionary.csv
tests/test_web_api.py
tests/test_web_service.py
webapp/__init__.py
webapp/app.py
webapp/service.py
webapp/static/app.js
webapp/static/styles.css
webapp/templates/index.html
Ветки (11)

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

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

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