AAYMA
RU
Войти

Campaign Cockpit

Агент тарифных кампаний для телеком-оператора: сам проводит адаптивные пилоты и отдаёт план до 10 кампаний (сегмент, тариф, канал) на максимальный…

Доведённый продукт
Команда «andreidev» 20💬 0 комментариевс 23 сентября 2026 г.

О проекте

Команда: andreidev
Кейс HackAlem.ai: Телеком — Beeline
Стадия: Доведённый продукт

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

Суть

Агент тарифных кампаний для телеком-оператора: сам проводит адаптивные пилоты и отдаёт план до 10 кампаний (сегмент, тариф, канал) на максимальный чистый прирост ARPU при лимитах бюджета, охвата и пилотов. К агенту есть веб-кокпит и десктоп-приложение.

Как устроено

Портфель экспертов (исторические данные и опционально LLM на агрегатах ячеек) предлагает гипотезы. По байесовским апостериорам и expected improvement или VOI выбираются пилоты в среде организаторов. Затем кампании отбираются по LCB и жадно укладываются в план под ограничения. Устойчивость проверяется на стресс-мирах, а в лаборатории версий настроек изменения проходят gate. Опционально подключается CatBoost-prior. Результат выгружается в submission.csv, аналитику доступен UI с объяснением решений.

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

  • байесовские апостериоры
  • expected improvement
  • VOI-gated pilots
  • LCB-отбор
  • жадный план под лимиты
  • портфель экспертов
  • стресс-тестирование
  • CatBoost prior (опционально)

Метрики

local_eval: PASS, net ≈ 4,4M, пилотов 20 из 20; 10 прогонов из 10 в плюс

Особенности

Сочетание активного экспериментирования (пилоты по EI/VOI) с консервативным LCB-отбором. LLM видит только агрегаты ячеек, строки абонентов ему не передаются, а гипотезы только от LLM сначала проходят пилот. Лаборатория самоулучшения с gate по худшему стресс-миру. Офлайн-приложение на Tauri для macOS и Windows.

Стек

Python · pandas · numpy · FastAPI · Uvicorn · fastapi-users · SQLAlchemy · PostgreSQL 17 · React 19 · HeroUI v3 · Vite 8 · TypeScript · Docker Compose · Tauri v2 (Rust) · PyInstaller · SQLite · GitHub Actions

Модели

gpt-4o-mini (OpenRouter/OpenAI)


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

README

README.md

Агент тарифных кампаний

agent.py: портфель экспертов (история + LLM) предлагает гипотезы → адаптивные пилоты → жадный план под лимиты. pandas/numpy + stdlib. Без LLM-ключа (OPENROUTER_API_KEY / OPENAI_API_KEY) детерминирован.

Назначение. Агент для телеком-оператора: сам проводит пилоты на аудитории и отдаёт план до 10 кампаний (кому, какой тариф, какой канал), чтобы чистый прирост ARPU был максимальным при лимитах бюджета, охвата и числа пилотов. Пользователь — аналитик маркетинга. Для него есть веб-интерфейс Campaign Cockpit: видно, почему агент принял каждое решение. Для менеджера — упрощённый экран «сформировать план → CSV».

Быстрый старт (проверка с чистого клона)

Требования: Python 3.13 (на нём проверено), для UI — Node 22 или Docker.

  1. Положить пакет среды и данных в корень репо. В git он не коммитится (.gitignore). Нужны файлы: local_eval.py, make_submission.py, environment.py, mock_environment.py, scoring_core.py, customer_profile.csv, feature_dictionary.csv, tariff_dictionary.csv и папка data/ (change_tariff.csv, traffic.csv, arpu_monthly.csv, dict_tariff.csv). Копия пакета лежит в релизе participant-pkg этого репо:
    gh release download participant-pkg -p participant-pkg.tar.gz && tar xzf participant-pkg.tar.gz && rm participant-pkg.tar.gz
    
  2. Установить зависимости агента:
    pip install -r requirements.txt
    
  3. Проверить основной сценарий:
    python local_eval.py              # ожидается «Статус: PASS», net ≈ 4.4M, «Пилотов проведено: 20 из 20», нет строк «отброшена»
    python local_eval.py --runs 10    # устойчивость: все 10 прогонов в плюс
    python make_submission.py         # пересобирает submission.csv; должен совпасть с закоммиченным (git diff пуст)
    
  4. UI (по желанию): см. «Сборка и запуск UI» ниже. Есть и офлайн-приложение для macOS и Windows — «Десктоп-приложение».

LLM-ключ не обязателен: без него LLM-эксперт выключается, и агент работает на истории и пилотах. Ключи и прочие настройки кладутся в .env в корне репо (см. docs/configuration.md):

OPENROUTER_API_KEY=...        # или OPENAI_API_KEY=...
LLM_MODEL=openai/gpt-4o-mini

Сборка и запуск UI (Campaign Cockpit)

Пакет среды должен лежать в корне репо (шаг 1 быстрого старта): в образ он попадает из рабочей копии.

Docker — одной командой (Postgres + API + собранный фронт на одном порту):

docker compose up --build     # сборка образа и запуск → http://localhost:8000
docker compose down           # остановить; данные остаются в томах pgdata и uploads

Локально для разработки (hot reload фронта):

pip install -r requirements.txt fastapi uvicorn "fastapi-users[sqlalchemy]" "psycopg[binary]"
docker compose up -d db                           # только Postgres на 127.0.0.1:5432
AUTH_DEMO=1 uvicorn server:app --port 8000        # API из корня репо
cd web && npm ci && npm run dev                   # http://localhost:5173, /api проксируется на :8000

Локально со сборкой фронта (собранный фронт отдаёт сам API; Postgres и pip-зависимости — как в блоке выше):

cd web && npm ci && npm run build && cd ..        # tsc + vite build → web/dist
AUTH_DEMO=1 uvicorn server:app --port 8000        # http://localhost:8000

Swagger: http://localhost:8000/api/docs. Self-check'и и тесты — docs/testing.md.

Десктоп-приложение (macOS и Windows)

Кокпит собирается в офлайн-приложение на Tauri: без Docker, Postgres и Python у пользователя. Внутри лежат сервер (PyInstaller), фронт, агент и данные, хранилище — SQLite. Можно собрать версии и для macOS (.dmg, Apple Silicon), и для Windows (.exe-установщик и .msi).

bash desktop/build.sh     # на маке → desktop/src-tauri/target/release/bundle/dmg/*.dmg; на Windows (Git Bash) → bundle/nsis/*.exe, bundle/msi/*.msi

Нужны Python 3.13, Node 22, Rust и пакет среды в корне. Обе версии разом собирает GitHub Actions: Actions → desktop → Run workflow (или тег v*), установщики лежат в артефактах прогона. Вход — те же демо-пользователи. Каталог данных, .env для LLM-ключа и ограничения описаны в docs/desktop.md: promote лаборатории и CatBoost в десктопе недоступны, сборка не подписана.

Вход

При пустой таблице пользователей и AUTH_DEMO=1 (по умолчанию в docker compose) заводятся демо-пользователи, пароль равен роли:

РольEmailПарольЧто видит
manager[email protected]manager«Сформировать план» → таблица кампаний → CSV
analyst[email protected]analystвесь кокпит без лаборатории
admin[email protected]adminкокпит + лаборатория версий и загрузка базовых выгрузок

Свой пользователь или смена пароля и роли:

python3 auth.py add [email скрыт] 'пароль' manager

На стенде демо-пароли не используйте: задайте в .env AUTH_DEMO=0, AUTH_USERS="email:пароль:роль,..." и AUTH_SECRET. Без AUTH_USERS и AUTH_DEMO=1 сервер на пустой таблице не стартует. Подробнее — SECURITY.md.

Архитектура

пакет среды (env, data/) ──▶ agent.py ──▶ план кампаний ──▶ make_submission.py ──▶ submission.csv
                                       │  ▲
                        агрегаты ячеек ▼  │ до 2 target на ячейку
                                 LLM (OpenRouter / OpenAI, опционально)

web/ (React) ──/api──▶ server.py (FastAPI) ──▶ agent.py в мок- или стресс-мире
                            │                  lab.py: версии настроек, матрица тестов, gate
                            ▼
                        Postgres (db.py, auth.py): пользователи, сессии, версии, аудит LLM
  • agent.py — агент (Agent.act(env)). От БД и UI не зависит.
  • stress_eval.py — локальный стенд: искажённые и жёсткие миры для проверки устойчивости.
  • lab.py — лаборатория версий настроек агента (цикл самоулучшения с gate).
  • server.py, auth.py, db.py, web/ — Campaign Cockpit: API, роли, хранилище, фронтенд.

Все модули и поток данных — docs/architecture.md.

Технологии

  • Агент: Python, pandas, numpy, stdlib (urllib для LLM); CatBoost — только в опциональном режиме PRIOR_MODEL=catboost_*. Байесовские апостериоры, expected improvement для выбора пилотов, LCB-отбор и жадный план.
  • LLM: OpenAI-совместимый API — OpenRouter (по умолчанию openai/gpt-4o-mini) или OpenAI (gpt-4o-mini).
  • Бэкенд UI: FastAPI, Uvicorn, fastapi-users (SQLAlchemy), psycopg, PostgreSQL 17.
  • Фронтенд: React 19, HeroUI v3, Vite 8, TypeScript.
  • Запуск: Docker, Docker Compose; десктоп — Tauri v2 (Rust) + PyInstaller, SQLite вместо Postgres.

Документация

ДокументО чём
Архитектурамодули, поток данных, файлы пакета среды, структура фронтенда
Как работает агентключевое наблюдение, prior, эксперты, EI-пилоты, план, fallback, честная игра
Настройкипеременные окружения и константы agent.py
CatBoost-priorопциональный ML-prior: зачем, как устроен, как включить, почему выключен
Данные и экспериментычто показали данные, стресс-миры, ablation, отброшенные идеи
Проверкаlocal_eval, stress_eval, self-check'и кокпита
Campaign Cockpitэкраны, роли и доступ к API, Swagger, хранилище
Новые данныебаза знаний, CSV итогов кампаний, базовые выгрузки
Лаборатория версийматрица тестов, детекторы, ремедиация, gate, promote, privacy gateway
Десктоп-приложениесборка под macOS и Windows, GitHub Actions, каталог данных, ограничения
Безопасностьзащита API и UI, чек-лист выкладки

Сторонние компоненты

Использованы:

  • внешний пакет среды и данных (в git не входит, это не наш код): среда environment.py / mock_environment.py, scoring_core.py, local_eval.py, make_submission.py, синтетические данные;
  • open-source библиотеки по их лицензиям: pandas, numpy (BSD), CatBoost (Apache 2.0), FastAPI, fastapi-users, Uvicorn (MIT / BSD), SQLAlchemy, psycopg (MIT / LGPL), React, Vite, HeroUI (MIT), PostgreSQL (PostgreSQL License); для десктопа — Tauri v2 (MIT / Apache 2.0), PyInstaller (GPL с исключением для сборок), aiosqlite (MIT), SQLite (public domain). Полный список фронтенда — в web/package.json, Rust-зависимостей — в desktop/src-tauri/Cargo.toml;
  • внешняя модель: gpt-4o-mini через OpenAI или OpenRouter — только как эксперт-источник гипотез; в неё уходят агрегаты по ячейкам, без строк абонентов;
  • AI-ассистенты при разработке.
Звёзды
⭐ 0
Форки
0
Язык
TypeScript
Последний push
в прошлом месяце
Коммиты
32
Авторы
1
Файлы
74
Ветки
2

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

Andrei Eronin 32

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

  • 2026-09-23 17:57Remove duplicate ENV_FILE row in docs/configuration.mdAndrei Eronin
  • 2026-09-23 17:55Add docs/catboost.md: CatBoost prior purpose, design, how to run, resultsAndrei Eronin
  • 2026-09-23 17:50Neutral project wording in docs, UI texts and commentsAndrei Eronin
  • 2026-09-23 17:48Point README quickstart to participant package releaseAndrei Eronin
  • 2026-09-23 17:47List desktop build components in README third-party sectionAndrei Eronin
  • 2026-09-23 17:45Exclude desktop/ and .github/ from Docker build contextAndrei Eronin
  • 2026-09-23 17:45Fix dead switches and use HeroUI Select for dropdownsAndrei Eronin
  • 2026-09-23 17:40Package Campaign Cockpit as offline desktop app for macOS and Windows (Tauri)Andrei Eronin
Все коммиты (32)
  • 2026-09-23 17:28Add build, run and login instructions to READMEAndrei Eronin
  • 2026-09-23 17:25Point README references in agent.py and Guide to docs/Andrei Eronin
  • 2026-09-23 17:23Move detailed README sections into docs/Andrei Eronin
  • 2026-09-23 17:15Harden auth, uploads and lab API; add SECURITY.md and security_check.pyAndrei Eronin
  • 2026-09-23 17:07Add knowledge base from pilots and campaign results, CSV uploadsAndrei Eronin
  • 2026-09-23 17:07Add /api/run response schema to SwaggerAndrei Eronin
  • 2026-09-23 16:52Add quickstart, architecture, stack, env vars and third-party components to READMEAndrei Eronin
  • 2026-09-23 16:52Add optional CatBoost prior for tariff-switch arms (off by default)Andrei Eronin
  • 2026-09-23 16:38Move demo credentials from login form to READMEAndrei Eronin
  • 2026-09-23 16:35Rename login and logout in Swagger to RussianAndrei Eronin
  • 2026-09-23 16:33Add onboarding wizard, button tooltips and in-app docsAndrei Eronin
  • 2026-09-23 16:31Add Swagger docs at /api/docs with endpoint descriptionsAndrei Eronin
  • 2026-09-23 16:26Add manager view, role-based login and Postgres storageAndrei Eronin
  • 2026-09-23 16:10Add Docker: one-command run of API and built web UIAndrei Eronin
  • 2026-09-23 16:06Add VOI-gated pilots, pilot reach cap, LLM gate and post-pilot LCB flagsAndrei Eronin
  • 2026-09-23 16:05Add 10-minute deadline, structural stress worlds, fix fair-play READMEAndrei Eronin
  • 2026-09-23 15:47Add OpenRouter provider and per-run LLM model selectorAndrei Eronin
  • 2026-09-23 15:43Gate on the worst harsh world instead of counting negative runsAndrei Eronin
  • 2026-09-23 15:42Add strategy lab: versions, test matrix, issue detectors, gated remediationAndrei Eronin
  • 2026-09-23 15:09Add Campaign Cockpit UI (FastAPI + React/HeroUI) and flatten repo layoutAndrei Eronin
  • 2026-09-23 14:49Gate LLM-only arms behind a pilot, record live LLM ablationAndrei Eronin
  • 2026-09-23 14:38Add expert portfolio with LLM proposer to the agentAndrei Eronin
  • 2026-09-23 14:25fixAndrei Eronin
  • 2026-09-23 14:15Add Beeline tariff campaign agentAndrei Eronin
Структура репозитория (74 файлов)
.claude/launch.json
.dockerignore
.github/workflows/desktop.yml
.gitignore
Dockerfile
README.md
SECURITY.md
agent.py
auth.py
datasets.py
db.py
desktop/build.sh
desktop/cockpit_server.py
desktop/splash/index.html
desktop/src-tauri/Cargo.lock
desktop/src-tauri/Cargo.toml
desktop/src-tauri/build.rs
desktop/src-tauri/icons/128x128.png
desktop/src-tauri/icons/[email protected]
desktop/src-tauri/icons/32x32.png
desktop/src-tauri/icons/icon.icns
desktop/src-tauri/icons/icon.ico
desktop/src-tauri/src/main.rs
desktop/src-tauri/tauri.conf.json
docker-compose.yml
docs/agent.md
docs/architecture.md
docs/catboost.md
docs/cockpit.md
docs/configuration.md
docs/data.md
docs/desktop.md
docs/experiments.md
docs/lab.md
docs/testing.md
lab.py
requirements.txt
security_check.py
server.py
stress_eval.py
submission.csv
web/.gitignore
web/.oxlintrc.json
web/index.html
web/package-lock.json
web/package.json
web/public/favicon.svg
web/src/App.tsx
web/src/Auth.tsx
web/src/Guide.tsx
web/src/Manager.tsx
web/src/api.ts
web/src/index.css
web/src/lab/Compare.tsx
web/src/lab/Fixes.tsx
web/src/lab/Issues.tsx
web/src/lab/Runs.tsx
web/src/lab/Versions.tsx
web/src/lab/useLab.ts
web/src/main.tsx
web/src/tabs/Audience.tsx
web/src/tabs/Command.tsx
web/src/tabs/Data.tsx
web/src/tabs/Hypotheses.tsx
web/src/tabs/Pilots.tsx
web/src/tabs/Plan.tsx
web/src/tabs/Privacy.tsx
web/src/tabs/Rules.tsx
web/src/tabs/Strategies.tsx
web/src/ui.tsx
web/tsconfig.app.json
web/tsconfig.json
web/tsconfig.node.json
web/vite.config.ts
Ветки (2)

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

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

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