| name | genpark-marketing-banner-agent-skill |
| description | AI agent skill for managing GenPark seasonal promotional web banners with automated scheduling and layout matching |
| triggers | ["set up GenPark marketing banner automation","schedule seasonal promotional banners","configure banner rotation for GenPark campaigns","automate marketing banner deployment","manage promotional banner layouts","create seasonal banner schedule","update GenPark promo banners","integrate banner agent with marketing calendar"] |
GenPark Marketing Banner Agent Skill
Skill by ara.so — Marketing Skills collection.
This skill enables AI coding agents to work with the GenPark Marketing Banner Agent, a Python-based system for automating seasonal promotional web banner deployment. The agent matches banner layouts to scheduled campaigns, handles rotation logic, and integrates with marketing calendars.
What It Does
GenPark Marketing Banner Agent provides:
- Automated banner scheduling based on seasonal campaigns and promotional periods
- Layout matching to ensure banners fit designated webpage slots
- Banner rotation with priority and timing controls
- Integration hooks for CMS and marketing automation platforms
- A/B testing support for banner variants
Installation
git clone https://github.com/alphaparkinc/genpark-marketing-banner-agent-skill.git
cd genpark-marketing-banner-agent-skill
pip install -r requirements.txt
pip install genpark-banner-agent
Dependencies
Common dependencies include:
pyyaml - Configuration management
schedule - Job scheduling
pillow - Image processing
requests - API integrations
python-dateutil - Date/time handling
Quick Start
from genpark_banner import BannerAgent, BannerSchedule, Layout
agent = BannerAgent(
config_path="config/banners.yaml",
assets_dir="assets/banners"
)
schedule = BannerSchedule(
campaign_name="summer_sale_2026",
start_date="2026-07-01",
end_date="2026-07-31",
priority=1
)
agent.add_banner(
schedule=schedule,
banner_path="assets/banners/summer_sale.png",
layout=Layout.HERO_WIDE,
target_pages=["home", "products"]
)
agent.run()
Configuration
YAML Configuration
Create config/banners.yaml:
agent:
check_interval: 300
timezone: "America/New_York"
auto_deploy: true
layouts:
hero_wide:
width: 1920
height: 600
slots: ["home_hero", "landing_hero"]
sidebar:
width: 300
height: 600
slots: ["product_sidebar", "blog_sidebar"]
banner_strip:
width: 1200
height: 120
slots: ["top_strip", "promo_strip"]
campaigns:
- name: "summer_sale_2026"
start: "2026-07-01T00:00:00"
end: "2026-07-31T23:59:59"
priority: 1
banners:
- asset: "summer_sale_hero.png"
layout: "hero_wide"
pages: ["home"]
- asset: "summer_sale_sidebar.png"
layout:
[, ]
[, ]
Environment Variables
BANNER_API_ENDPOINT=https://cms.genpark.com/api/v1/banners
BANNER_API_TOKEN=your_api_token_here
BANNER_ASSETS_DIR=/var/www/banners
BANNER_LOG_LEVEL=INFO
Core API
BannerAgent Class
from genpark_banner import BannerAgent
agent = BannerAgent(
config_path="config/banners.yaml",
assets_dir="assets/banners",
log_level="INFO"
)
agent.schedule_banner(
campaign="holiday_sale",
asset="holiday_hero.png",
layout="hero_wide",
start_date="2026-12-01",
end_date="2026-12-25",
pages=["home", "gifts"],
priority=1
)
active = agent.get_active_banners(page="home")
print(active)
agent.update_now(page="home")
agent.remove_banner(campaign="holiday_sale")
Layout Matching
from genpark_banner import Layout, BannerMatcher
custom_layout = Layout(
name="custom_hero",
width=1440,
height=500,
aspect_ratio="16:9",
allowed_formats=["png", "jpg", "webp"]
)
matcher = BannerMatcher()
is_match = matcher.validate(
banner_path="assets/promo.png",
layout=custom_layout,
auto_resize=True
)
if not is_match:
resized_path = matcher.resize_to_layout(
banner_path="assets/promo.png",
layout=custom_layout,
output_path="assets/promo_resized.png"
)
Scheduling Patterns
from genpark_banner import BannerSchedule, RecurrenceRule
schedule = BannerSchedule(
campaign_name="flash_sale",
start_date="2026-07-15T10:00:00",
end_date="2026-07-15T18:00:00",
priority=1
)
weekly_schedule = BannerSchedule(
campaign_name="weekend_deals",
recurrence=RecurrenceRule(
frequency="weekly",
days=["saturday", "sunday"],
start_time="00:00:00",
end_time="23:59:59"
),
start_date="2026-07-01",
end_date="2026-12-31"
)
agent.add_schedule(weekly_schedule)
A/B Testing
from genpark_banner import ABTest
ab_test = ABTest(
campaign="summer_sale",
variants=[
{
"name": "variant_a",
"asset": "summer_hero_a.png",
"weight": 50
},
{
"name": "variant_b",
"asset": "summer_hero_b.png",
"weight": 50
}
],
tracking_param="banner_variant"
)
agent.add_ab_test(
test=ab_test,
layout="hero_wide",
pages=["home"],
start_date="2026-07-01",
end_date="2026-07-07"
)
stats = agent.get_ab_stats(campaign="summer_sale")
print(f"Variant A CTR: {stats['variant_a']['ctr']}")
print(f"Variant B CTR: {stats['variant_b']['ctr']}")
Deployment Integration
API Deployment
from genpark_banner import APIDeployer
deployer = APIDeployer(
endpoint=os.getenv("BANNER_API_ENDPOINT"),
auth_token=os.getenv("BANNER_API_TOKEN")
)
deployer.deploy(
banner_path="assets/summer_sale.png",
slot="home_hero",
metadata={
"campaign": "summer_sale_2026",
"start": "2026-07-01T00:00:00",
"end": "2026-07-31T23:59:59",
"link_url": "https://genpark.com/summer-sale"
}
)
S3 Deployment
from genpark_banner import S3Deployer
s3_deployer = S3Deployer(
bucket=os.getenv("S3_BANNER_BUCKET"),
region=os.getenv("AWS_REGION"),
access_key=os.getenv("AWS_ACCESS_KEY_ID"),
secret_key=os.getenv("AWS_SECRET_ACCESS_KEY")
)
s3_deployer.upload(
banner_path="assets/summer_sale.png",
s3_key="banners/active/home_hero.png",
cache_control="max-age=3600"
)
Common Patterns
Automated Seasonal Rotation
from genpark_banner import BannerAgent, SeasonalTemplate
agent = BannerAgent(config_path="config/banners.yaml")
seasons = SeasonalTemplate(
spring={"start": "03-20", "end": "06-19", "asset": "spring_banner.png"},
summer={"start": "06-20", "end": "09-21", "asset": "summer_banner.png"},
fall={"start": "09-22", "end": "12-20", "asset": "fall_banner.png"},
winter={"start": "12-21", "end": "03-19", "asset": "winter_banner.png"}
)
agent.apply_seasonal_template(
template=seasons,
layout="hero_wide",
pages=["home"]
)
agent.run()
Priority Override
agent.schedule_banner(
campaign="standard_promo",
asset="standard.png",
priority=3,
start_date="2026-07-01",
end_date="2026-07-31"
)
agent.schedule_banner(
campaign="flash_sale",
asset="flash_sale.png",
priority=1,
start_date="2026-07-15T10:00:00",
end_date="2026-07-15T18:00:00"
)
Banner Preview & Testing
from genpark_banner import BannerPreview
preview = BannerPreview(agent=agent)
upcoming = preview.preview_date(
date="2026-07-15",
page="home"
)
print(f"Active banner: {upcoming['campaign']}")
print(f"Asset: {upcoming['asset']}")
print(f"Priority: {upcoming['priority']}")
conflicts = preview.check_conflicts(
start_date="2026-07-01",
end_date="2026-07-31",
page="home",
layout="hero_wide"
)
if conflicts:
print(f"Warning: {len(conflicts)} scheduling conflicts detected")
for conflict in conflicts:
print(f" - {conflict['campaign']} (priority {conflict['priority']})")
CLI Commands
Start the Agent
python -m genpark_banner run
python -m genpark_banner run --config config/production.yaml
python -m genpark_banner run --dry-run
python -m genpark_banner run --once
Schedule Management
python -m genpark_banner list --active
python -m genpark_banner list --all
python -m genpark_banner add \
--campaign "summer_sale" \
--asset "assets/summer.png" \
--layout "hero_wide" \
--start "2026-07-01" \
--end "2026-07-31" \
--pages "home,products"
python -m genpark_banner remove --campaign "summer_sale"
python -m genpark_banner preview --date "2026-07-15" --page "home"
Validation
python -m genpark_banner validate --config config/banners.yaml
python -m genpark_banner check-assets
python -m genpark_banner test-deploy
Troubleshooting
Banner Not Deploying
import logging
logging.basicConfig(level=logging.DEBUG)
agent = BannerAgent(config_path="config/banners.yaml", log_level="DEBUG")
status = agent.get_deployment_status()
print(f"Last deployment: {status['last_deployment']}")
print(f"Status: {status['status']}")
print(f"Errors: {status['errors']}")
Layout Mismatch
from genpark_banner import BannerMatcher
matcher = BannerMatcher()
result = matcher.validate_detailed(
banner_path="assets/banner.png",
layout=Layout.HERO_WIDE
)
if not result['valid']:
print("Validation failed:")
for error in result['errors']:
print(f" - {error}")
if result['can_auto_fix']:
fixed_path = matcher.auto_fix(
banner_path="assets/banner.png",
layout=Layout.HERO_WIDE,
output_path="assets/banner_fixed.png"
)
print(f"Fixed banner saved to: {fixed_path}")
Schedule Conflicts
conflicts = agent.find_schedule_conflicts(
page="home",
layout="hero_wide"
)
for conflict in conflicts:
print(f"Conflict between:")
print(f" {conflict['schedule_a']['campaign']} (priority {conflict['schedule_a']['priority']})")
print(f" {conflict['schedule_b']['campaign']} (priority {conflict['schedule_b']['priority']})")
print(f" Overlap: {conflict['overlap_start']} to {conflict['overlap_end']}")
API Connection Issues
from genpark_banner import APIDeployer
deployer = APIDeployer(
endpoint=os.getenv("BANNER_API_ENDPOINT"),
auth_token=os.getenv("BANNER_API_TOKEN"),
timeout=30,
retry_attempts=3
)
try:
deployer.test_connection()
print("API connection successful")
except Exception as e:
print(f"Connection failed: {e}")
Best Practices
- Use priority levels wisely: Reserve priority 1 for urgent/flash campaigns
- Test layouts before deployment: Use
BannerMatcher to validate dimensions
- Monitor deployment logs: Enable INFO or DEBUG logging in production
- Use environment variables: Never hardcode API tokens or endpoints
- Preview schedules: Check for conflicts before adding new campaigns
- Implement rollback: Keep previous banner versions for quick rollback
- Cache assets: Use CDN or caching for frequently accessed banners
This skill enables AI coding agents to effectively work with GenPark's marketing banner automation system, handling scheduling, layout matching, deployment, and troubleshooting for seasonal promotional campaigns.