О проекте
Команда: 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.
- Положить пакет среды и данных в корень репо. В 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 - Установить зависимости агента:
pip install -r requirements.txt - Проверить основной сценарий:
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 пуст) - 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) заводятся демо-пользователи, пароль равен роли:
| Роль | Пароль | Что видит | |
|---|---|---|---|
| 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-ассистенты при разработке.
Авторы коммитов
История коммитов
- 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 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.