Beeline Tariff Marketing Campaign Agent
Агент планирует кампании смены тарифа для 23 441 синтетического абонента: запускает пилоты, учитывает их результаты и выбирает до 10 кампаний…
О проекте
Команда: SapaTech
Кейс HackAlem.ai: Телеком — Beeline
Стадия: Рабочий MVP
Задача кейса: Агент, который решает, каким абонентам какой тариф предложить (чистый прирост ARPU)
Суть
Агент планирует кампании смены тарифа для 23 441 синтетического абонента: запускает пилоты, учитывает их результаты и выбирает до 10 кампаний (сегмент, тариф, канал) при ограничениях бюджета и охвата; результат пишется в submission.csv.
Как устроено
Агент реализует официальный интерфейс Agent.act(env), читает профили абонентов, справочник тарифов и историю переходов change_tariff.csv. Модуль strategy/ строит кандидатов по текущему тарифу и ARPU-сегменту, уточняет исторические оценки результатами до 20 пилотов (сначала дешёвые push-пилоты, затем повторные проверки перспективных кандидатов) и собирает портфель кампаний под лимиты: 15 000 контактов, бюджет 100 000, до 5 000 абонентов на кампанию. Отдельный набор evals/ проверяет сырой ответ, соблюдение лимитов, влияние обратной связи от пилотов и воспроизводимость.
Ключевые решения
- отбор портфеля кампаний под ограничения бюджета и контактов
- оценки по истории переходов тарифов
- обновление оценок по результатам пилотов
- проверка устойчивости на множестве seed
- изолированное сравнение версий агента
Метрики
seed 42: net +253 392, 7 кампаний + 20 пилотов, 11 558 контактов, бюджет 99 998/100 000; 100 seed: средний net +629 492 против +286 701 у прежней версии, убыточных прогонов 5 против 27; 10 прогонов: медиана +622 922
Особенности
Строгая экспериментальная дисциплина: версии стратегии сравниваются на одних и тех же 100 seed в изолированных процессах, а в README честно сказано, что на демо-seed результат новой версии ниже. Работа команды разбита на задачи через папку coordination/ (задачи T-xx, инбоксы, промпты для AI-агентов, квитанции о передаче) — хороший пример организованной AI-assisted разработки.
Стек
Python · pandas · NumPy · unittest
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-6e2e5c8b-sapatech.
README
README.mdBeeline Tariff Marketing Campaign Agent
SapaTech · HackAlem AI 2026 · трек 04 «Телекоммуникации»
Агент планирует кампании смены тарифа для 23 441 синтетического абонента: изучает профиль и историю переходов, проводит пилоты, учитывает их результаты и выбирает до 10 кампаний. Цель — максимизировать прирост ARPU за вычетом стоимости контактов, соблюдая ограничения бюджета и охвата.
Основной пользователь — маркетинговый аналитик, планирующий кампании на
следующий месяц. На входе — аудитория и история смены тарифов; на выходе —
план с целевыми сегментами, тарифами и каналами коммуникации в submission.csv.
Решение запускается в терминале и реализует официальный интерфейс
Agent.act(env) -> list[dict]. Используется локальная статистическая стратегия;
ключи API, внешние модели, GPU и веб-сервер не требуются.
Технологии и данные
- Python 3.11+ — агент, управление пилотами и проверки.
- pandas 3.0.1 — чтение CSV и обработка профилей и истории переходов.
- NumPy 2.3.5 — численные расчёты оценок и портфеля кампаний.
- unittest из стандартной библиотеки — автоматические тесты.
Версии сторонних библиотек зафиксированы в requirements.txt.
Официальная среда предоставляет профиль из customer_profile.csv, тарифы из
data/dict_tariff.csv и параметры каналов. Агент отдельно читает
data/change_tariff.csv для исторических оценок. Все эти данные поставляются
организаторами в ZIP кейса; внешние источники данных и API не используются.
Что нужно для запуска
- Git и доступ к этому репозиторию.
- Python 3.11 или новее с поддержкой
venvиpip; проверен Python 3.13.7 на macOS. - Интернет для клонирования и установки зависимостей. После установки агент работает локально.
- Официальный
beeline_case_participants.zipот организаторов. В нём находятся данные, среда, evaluator и генератор CSV. Эти файлы не хранятся в Git. Судьям нужен исходный пакет кейса Beeline; если его нет, запросите его у организаторов.
Клонируйте полный репозиторий, включая папку strategy/. Файлы
strategy/__init__.py и strategy/core.py нужны для запуска командной стратегии;
evals/ и scripts/ — для описанных ниже проверок и установки материалов.
Передачи одного agent.py недостаточно для воспроизведения нашего результата:
при отсутствии strategy/ он использует резервный шаблон организаторов,
который генерирует другой CSV.
Используйте новый клон: команда make_submission.py заново создаст в нём
submission.csv. Установщик перенесёт из ZIP только 13 необходимых файлов
без изменения их содержимого. В командах ниже замените путь к архиву на свой;
кавычки позволяют использовать путь с пробелами. Запускайте команды по порядку
из корня клона и переходите к следующей только после успешного завершения предыдущей.
Официальный интерфейс проверки
По ТЗ проверка выполняется через python local_eval.py, а CSV создаётся через
python make_submission.py. Оба скрипта из пакета организаторов импортируют
Agent из agent.py и вызывают Agent().act(env) с подготовленной средой.
Этот интерфейс используется и для работы агента со скрытой средой судейства.
Самостоятельный запуск python agent.py в текущей версии не проводит оценку:
используйте последовательность ниже. После установки Agent.act(env) работает
без интернета и не устанавливает зависимости.
Запуск на macOS / Linux
Убедитесь, что python3 --version показывает Python 3.11+.
Если установлено несколько версий, используйте подходящую команду, например
python3.13, вместо python3 при создании окружения. Активация venv не нужна.
git clone https://github.com/BAITC-Hacks/hack-6e2e5c8b-sapatech.git beeline_check
cd beeline_check
git switch main
python3 --version
python3 -m venv .venv
.venv/bin/python -m pip install -r requirements.txt
.venv/bin/python scripts/prepare_case.py '/absolute/path/to/beeline_case_participants.zip'
.venv/bin/python -m unittest scripts.test_agent strategy.tests.test_core strategy.tests.test_robustness evals.test_contract_checks evals.test_compare_isolated -v
.venv/bin/python local_eval.py
.venv/bin/python evals/check_agent.py --agent agent.py --package .
.venv/bin/python evals/check_agent.py --agent agent.py --package . --feedback-check
.venv/bin/python make_submission.py
git diff --exit-code --ignore-space-at-eol -- submission.csv
Запуск на Windows / PowerShell
Убедитесь, что py -3 --version показывает Python 3.11+.
Команды используют Python Launcher (py); если его нет, используйте python
вместо py -3, предварительно проверив версию. Активация venv и изменение
ExecutionPolicy не нужны.
git clone https://github.com/BAITC-Hacks/hack-6e2e5c8b-sapatech.git beeline_check
cd beeline_check
git switch main
py -3 --version
py -3 -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r requirements.txt
.\.venv\Scripts\python.exe scripts/prepare_case.py 'C:\path\to\beeline_case_participants.zip'
.\.venv\Scripts\python.exe -m unittest scripts.test_agent strategy.tests.test_core strategy.tests.test_robustness evals.test_contract_checks evals.test_compare_isolated -v
.\.venv\Scripts\python.exe local_eval.py
.\.venv\Scripts\python.exe evals/check_agent.py --agent agent.py --package .
.\.venv\Scripts\python.exe evals/check_agent.py --agent agent.py --package . --feedback-check
.\.venv\Scripts\python.exe make_submission.py
git diff --exit-code --ignore-space-at-eol -- submission.csv
Полный чистый запуск подтверждён на macOS. Для Linux и Windows приведены соответствующие команды; в последней независимой проверке эти ОС не запускались.
Как понять, что проверка прошла
| Шаг | Ожидаемый результат |
|---|---|
| Установка ZIP | Installed 13 unchanged files |
| Unit-тесты | Ran 54 tests, затем OK |
local_eval.py | Статус: PASS, чистый результат около +253 392 на seed 42 |
check_agent.py | "errors": [], 7 финальных кампаний и 20 пилотов |
--feedback-check | "feedback_changes_campaigns": true; errors пуст в обоих сценариях |
make_submission.py | submission.csv с 7 строками кампаний и заголовком |
Последний git diff | Нет вывода и код завершения 0: CSV совпал с версией в Git с учётом различий LF/CRLF |
На seed 42 суммарно используются 11 558 контактов и 99 998 из 100 000
единиц бюджета. Выполнение Agent.act в проверке на macOS заняло около 2 секунд.
Строка evaluator «Кампаний: 27» включает 20 пилотов и 7 финальных кампаний.
Предупреждения о cap 5 000, частичном охвате и повторных контактах допустимы;
проверка исходного ответа через check_agent.py должна завершиться без ошибок.
Проверка на нескольких сценариях
После установки выполните:
.venv/bin/python local_eval.py --runs 10
В PowerShell используйте .\.venv\Scripts\python.exe local_eval.py --runs 10.
В независимой проверке все 10 прогонов завершились: 9 прибыльных, 1 убыточный;
медиана +622 922, минимум −70 362, максимум +1 349 809.
Текущая версия включает стратегию T-10. На одинаковых проверочных seed 100–199 она сравнивалась с предыдущей версией в отдельных процессах и каталогах:
| Показатель, 100 прогонов | Предыдущая версия | Текущая T-10 |
|---|---|---|
| Средний net | +286 700.61 | +629 492.15 |
| Убыточных прогонов | 27 | 5 |
| Худший net | −742 519.79 | −389 787.24 |
Независимое повторение на macOS подтвердило все 200 результатов, отсутствие
ошибок исходного ответа, нарушений лимитов и перехода на резервный шаблон.
T-10 лучше в 76 из 100 пар. На демонстрационном seed 42 результат снизился
с +327 917.04 до +253 391.73; улучшение на каждом запуске не гарантируется.
Подробности и воспроизводимые данные: отчёт T-10
и результаты по seed.
Старые отчёты T-04/T-05 и аудиты в docs/planning/ относятся к прежней стратегии.
Данные синтетические и не описывают реальных клиентов или показатели Beeline. Mock-среда проверяет механику, но её эффекты отличаются от скрытого судейства: эти числа не предсказывают итоговый балл и не гарантируют прибыль.
Как работает решение
agent.pyчитает публичные данные и историю, управляет пилотами, временем и ресурсами, проверяет формат финального ответа.strategy/строит кандидатов по текущему тарифу и ARPU-сегменту, уточняет исторические оценки по результатам пилотов и выбирает портфель кампаний. После восьми пилотов приоритет получают повторные проверки перспективных кандидатов. Наблюдения объединяются по каналу; повторные push-пилоты снижают шум измерений, сохраняя неопределённость переноса на платные каналы.evals/проверяет исходный ответ до исправлений официального evaluator, соблюдение лимитов, влияние обратной связи и воспроизводимость.- Официальный
make_submission.pyзапускает агента на seed 42 и создаёт CSV.
Ограничения: 1–10 финальных кампаний, до 5 000 абонентов на кампанию,
15 000 контактов и 100 000 бюджета вместе с пилотами; до 20 пилотов
с запросом 10–200 абонентов. Каналы: push, sms, digital_ads, call.
Один абонент даёт только лучший эффект, но повторные контакты расходуют ресурсы.
История переходов не доказывает причинный эффект кампании. Перенос оценок бесплатных push-пилотов на платные каналы — приближение без прямой проверки пилотами на этих каналах. Подробнее: описание стратегии и разбор рисков.
Если запуск не удался
| Сообщение / ситуация | Что проверить |
|---|---|
Repository not found при клонировании | Доступ вашей учётной записи GitHub к командному репозиторию |
| Ошибка установки numpy/pandas | Версию Python (3.11+), наличие pip и доступ к PyPI; используйте зафиксированный requirements.txt |
Не найден local_eval.py, mock_environment или CSV | Успешно ли выполнен scripts/prepare_case.py; текущий каталог должен быть корнем клона |
FileNotFoundError при установке ZIP | Заменён ли пример пути на существующий архив |
KeyError при установке ZIP | Используется ли исходный ZIP кейса: установщик ожидает официальную структуру файлов |
Refusing to overwrite different file | Используйте новый клон: установщик сохраняет уже существующие отличающиеся файлы |
Авторы коммитов
История коммитов
- 2026-09-23 17:41docs(delivery): synchronize judge instructions with robust strategy [T-10]Bauyrzhan Myrzagaliyev
- 2026-09-23 17:39feat(integration): adopt verified robust strategy [T-10]Bauyrzhan Myrzagaliyev
- 2026-09-23 17:31docs(strategy): record canonical source hash for delivery [T-10]Нурсултан Нурмухамет
- 2026-09-23 17:30docs(security): record dependency license and runtime audit [T-11]Нурсултан Нурмухамет
- 2026-09-23 17:29feat(strategy): improve pilot confirmation and channel uncertainty [T-10]Нурсултан Нурмухамет
- 2026-09-23 17:29test(evals): compare strategy revisions in isolated processes [T-10]Нурсултан Нурмухамет
- 2026-09-23 17:19docs(readme): document runtime contract and required modules [T-09]Bauyrzhan Myrzagaliyev
- 2026-09-23 16:47docs(readme): clarify judge setup and verification [T-09]Bauyrzhan Myrzagaliyev
Все коммиты (63)
- 2026-09-23 16:22docs(evaluation): align demo with verified baseline [T-09]Erlan Mereev
- 2026-09-23 16:21docs(evaluation): verify baseline setup and update README [T-09]Erlan Mereev
- 2026-09-23 16:17docs(evaluation): acknowledge ER-002 round [T-09]Erlan Mereev
- 2026-09-23 16:05docs(delivery): preserve baseline package and rehearse demo [T-08]Нурсултан Нурмухамет
- 2026-09-23 16:00docs(coordination): start bounded delivery round before 17:00 [T-08]Нурсултан Нурмухамет
- 2026-09-23 15:52docs(planning): publish audit and next-round role plans [T-07]Bauyrzhan Myrzagaliyev
- 2026-09-23 15:22docs(coordination): record final stop confirmations [T-03]Нурсултан Нурмухамет
- 2026-09-23 15:21docs(review): confirm T-06 scheduler deletion [T-06]Bauyrzhan Myrzagaliyev
- 2026-09-23 15:19docs(review): record T-06 stop pending scheduler deletion [T-06]Bauyrzhan Myrzagaliyev
- 2026-09-23 15:19docs(strategy): record T-04 stop state [T-04]Bauyrzhan Myrzagaliyev
- 2026-09-23 15:18docs(evaluation): record Erlan stop and scheduler deletion [T-05]Erlan Mereev
- 2026-09-23 15:16feat(delivery): finalize artifact and request team stop [T-03]Нурсултан Нурмухамет
- 2026-09-23 15:12docs(integration): preserve public channel-risk evidence [T-03]Нурсултан Нурмухамет
- 2026-09-23 15:11docs(coordination): accept exact dependency setup review [T-03]Нурсултан Нурмухамет
- 2026-09-23 15:10docs(strategy): analyze seed 21 channel risk [T-04]Bauyrzhan Myrzagaliyev
- 2026-09-23 15:08docs(review): verify exact Beeline install [T-06]Bauyrzhan Myrzagaliyev
- 2026-09-23 15:05docs(coordination): confirm replacement scheduler and runbook acceptance [T-03]Нурсултан Нурмухамет
- 2026-09-23 15:03docs(integration): merge verified Windows runbook [T-03]Нурсултан Нурмухамет
- 2026-09-23 15:02docs(coordination): assign bounded risk and setup reviews [T-03]Нурсултан Нурмухамет
- 2026-09-23 15:00docs(evaluation): document verified Windows run [T-05]Erlan Mereev
- 2026-09-23 14:56docs(coordination): verify transfer and accept team reports [T-03]Нурсултан Нурмухамет
- 2026-09-23 14:52chore(integration): merge verified short-pilot checks [T-03]Нурсултан Нурмухамет
- 2026-09-23 14:51docs(review): publish independent Agent.act audit [T-06]Bauyrzhan Myrzagaliyev
- 2026-09-23 14:50docs(coordination): accept core audit and record scheduler blocker [T-03]Нурсултан Нурмухамет
- 2026-09-23 14:49docs(integration): accept repeated-contact audit [T-03]Нурсултан Нурмухамет
- 2026-09-23 14:49docs(evaluation): hand off ER-001 revision 2 [T-05]Erlan Mereev
- 2026-09-23 14:47fix(evaluation): distinguish pilot requests and actual reach [T-05]Erlan Mereev
- 2026-09-23 14:46docs(strategy): audit marginal value of repeated contacts [T-04]Bauyrzhan Myrzagaliyev
- 2026-09-23 14:44docs(coordination): acknowledge Erlan scheduled task claim [T-03]Нурсултан Нурмухамет
- 2026-09-23 14:42docs(coordination): accept recheck and resolve CSV hash difference [T-03]Нурсултан Нурмухамет
- 2026-09-23 14:42docs(evaluation): claim ER-001 verification [T-05]Erlan Mereev
- 2026-09-23 14:42docs(integration): accept Erlan history-fix recheck [T-03]Нурсултан Нурмухамет
- 2026-09-23 14:36feat(coordination): add scheduled task inboxes and stop protocol [T-03]Нурсултан Нурмухамет
- 2026-09-23 14:31test(evaluation): recheck integrated agent after history fix [T-05]Erlan Mereev
- 2026-09-23 14:29docs(integration): preserve strategy robustness evidence [T-03]Нурсултан Нурмухамет
- 2026-09-23 14:25fix(integration): accept official caps and verified team metrics [T-03]Нурсултан Нурмухамет
- 2026-09-23 14:23docs(strategy): record robustness comparison [T-04]Bauyrzhan Myrzagaliyev
- 2026-09-23 14:23docs(evaluation): record integrated ten-seed results [T-05]Erlan Mereev
- 2026-09-23 14:23fix(evaluation): classify official campaign caps correctly [T-05]Erlan Mereev
- 2026-09-23 14:22docs(integration): include Erlan five-minute demo [T-03]Нурсултан Нурмухамет
- 2026-09-23 14:20fix(agent): load history from the official package directory [T-03]Нурсултан Нурмухамет
- 2026-09-23 14:17test(integration): add raw audit and isolated CSV verification [T-03]Нурсултан Нурмухамет
- 2026-09-23 14:16docs(evaluation): prepare five-minute Beeline demo [T-05]Erlan Mereev
- 2026-09-23 14:15test(evaluation): audit raw output across seeds [T-05]Erlan Mereev
- 2026-09-23 14:12docs(evaluation): record template baseline and verification commands [T-05]Erlan Mereev
- 2026-09-23 14:11feat(integration): connect Bauyrzhan strategy core [T-03]Нурсултан Нурмухамет
- 2026-09-23 14:11test(integration): include Erlan contract checks [T-03]Нурсултан Нурмухамет
- 2026-09-23 14:09feat(strategy): implement pilot-aware campaign core [T-04]Bauyrzhan Myrzagaliyev
- 2026-09-23 14:08feat(agent): guard public pilot orchestration and fallback [T-03]Нурсултан Нурмухамет
- 2026-09-23 14:07test(evaluation): verify raw campaigns and pilot feedback [T-05]Erlan Mereev
- 2026-09-23 14:03chore(setup): measure official Beeline baseline locally [T-03]Нурсултан Нурмухамет
- 2026-09-23 13:56docs(coordination): complete named team plan and prompts [T-02]Нурсултан Нурмухамет
- 2026-09-23 13:52docs(coordination): hand off strategy core to Bauyrzhan [T-02]Нурсултан Нурмухамет
- 2026-09-23 13:41docs(coordination): record T-01 handoff [T-01]Bauyrzhan Myrzagaliyev
- 2026-09-23 13:40docs(hackathon): select Beeline telecom case [T-01]Bauyrzhan Myrzagaliyev
Структура репозитория (84 файлов)
.env.example .gitignore AGENTS.md HACKATHON.md PLAN.md README.md agent.py controller/README.md coordination/CONTROL.md coordination/MAILBOX.md coordination/README.md coordination/RECEIPTS.md coordination/decisions.md coordination/inbox/BAUYRZHAN_CORE.md coordination/inbox/BAUYRZHAN_REVIEW.md coordination/inbox/ERLAN.md coordination/people/BAUYRZHAN.md coordination/people/ERLAN.md coordination/people/NURSULTAN.md coordination/prompts/BAUYRZHAN_CORE.md coordination/prompts/BAUYRZHAN_REVIEW.md coordination/prompts/ERLAN.md coordination/tasks/T-01.md coordination/tasks/T-02.md coordination/tasks/T-03.md coordination/tasks/T-04.md coordination/tasks/T-05.md coordination/tasks/T-06.md coordination/tasks/T-07.md coordination/tasks/T-09.md coordination/tasks/T-10.md coordination/tasks/T-11.md coordination/tasks/TEMPLATE.md demo_data/README.md deploy/README.md docs/contracts.md docs/evaluation/ER-001-r1.md docs/evaluation/ER-001-r2.md docs/evaluation/ER-001-r3.md docs/evaluation/ER-002-r1.md docs/evaluation/T-11-security-license.md docs/evaluation/baseline.md docs/evaluation/demo.md docs/evaluation/integrated-f95a8e3.md docs/evaluation/recheck-9f782f1.md docs/planning/next_round_2026_09_23/README.md docs/planning/next_round_2026_09_23/bauyrzhan_plan_ru.md docs/planning/next_round_2026_09_23/erlan_plan_ru.md docs/planning/next_round_2026_09_23/evidence/baseline_100.json docs/planning/next_round_2026_09_23/evidence/candidate_100.json docs/planning/next_round_2026_09_23/evidence/feedback_summary.json docs/planning/next_round_2026_09_23/evidence/multi_seed_summary.json docs/planning/next_round_2026_09_23/evidence/official_seed42.log docs/planning/next_round_2026_09_23/evidence/resilience_checks.json docs/planning/next_round_2026_09_23/evidence/submission_check.json docs/planning/next_round_2026_09_23/evidence/unit_tests.log docs/planning/next_round_2026_09_23/nursultan_plan_ru.md docs/planning/next_round_2026_09_23/project_actual_audit_2026_09_23_ru.md evals/README.md evals/check_agent.py evals/check_submission.py evals/compare_agents.py evals/compare_isolated.py evals/contract_checks.py evals/public_stub.py evals/test_compare_isolated.py evals/test_contract_checks.py executor/README.md jobs/.gitkeep requirements.txt scripts/prepare_case.py scripts/test_agent.py strategy/README.md strategy/__init__.py strategy/core.py strategy/reports/B1-001-r1.md strategy/reports/B1-002-r1.md strategy/reports/T-10-evidence.json strategy/reports/T-10-robustness.md strategy/tests/official_smoke.py strategy/tests/test_core.py strategy/tests/test_robustness.py submission.csv web/README.md
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.