Spaces:
Sleeping
Sleeping
| # Ads Automation Hackathon Implementation Plan | |
| > **For agentic workers:** REQUIRED: Use the `subagent-driven-development` agent (recommended) or `executing-plans` agent to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. | |
| **Goal:** Build a Google Ads recommendation dashboard for a preschool that monitors campaign performance, generates AI-powered recommendations using MiniCPM5-1B, and allows a human to review, approve, or reject recommendations. Deploy as a Gradio app on a Hugging Face Space (CPU) with SQLite as the source of truth. | |
| **Architecture:** Single Gradio application. Google Ads metrics are imported into SQLite. A deterministic rule engine identifies opportunities and issues. MiniCPM5 generates human-readable explanations for recommendations. Recommendations are displayed in a dashboard where users can approve or reject them. No automatic ad changes are performed. | |
| **Tech Stack:** Python 3.10+, Gradio, SQLAlchemy, google-ads, pandas, llama-cpp-python, pytest, python-dotenv. | |
| --- | |
| ### Task 1: Scaffold Project Layout | |
| **Files:** | |
| * Create: `app/__init__.py` | |
| * Create: `app/main.py` | |
| * Create: `app/ads/connector.py` | |
| * Create: `app/db/models.py` | |
| * Create: `app/db/repo.py` | |
| * Create: `app/recs/rules.py` | |
| * Create: `app/recs/generate.py` | |
| * Create: `app/models/llm.py` | |
| * Create: `app/ui/dashboard.py` | |
| * Create: `app/ui/recommendations.py` | |
| * Create: `scripts/seed_demo.py` | |
| * Create: `requirements.txt` | |
| * Create: `README.md` | |
| * [ ] Step 1: Create repository structure and install dependencies. | |
| Requirements: | |
| ```text | |
| gradio | |
| sqlalchemy | |
| google-ads | |
| pandas | |
| llama-cpp-python | |
| pytest | |
| python-dotenv | |
| requests | |
| ``` | |
| Verify: | |
| ```bash | |
| python -m venv .venv | |
| pip install -r requirements.txt | |
| ``` | |
| Expected: all packages install successfully. | |
| * [ ] Step 2: Verify imports. | |
| ```bash | |
| python -c "import app; print('scaffold ok')" | |
| ``` | |
| Expected: | |
| ```text | |
| scaffold ok | |
| ``` | |
| --- | |
| ### Task 2: SQLite Models | |
| **Files:** | |
| * Modify: `app/db/models.py` | |
| * Modify: `app/db/repo.py` | |
| * [ ] Step 1: Create `Campaign` model. | |
| Fields: | |
| ```python | |
| id | |
| google_campaign_id | |
| name | |
| budget | |
| spend | |
| clicks | |
| impressions | |
| ctr | |
| leads | |
| cpl | |
| last_synced | |
| ``` | |
| * [ ] Step 2: Create `Recommendation` model. | |
| Fields: | |
| ```python | |
| id | |
| campaign_id | |
| recommendation_type | |
| action | |
| reason | |
| status | |
| created_at | |
| ``` | |
| Status values: | |
| ```text | |
| Pending | |
| Approved | |
| Rejected | |
| ``` | |
| * [ ] Step 3: Create database initialization helper. | |
| Verify: | |
| ```bash | |
| python -c "from app.db.repo import init_db; init_db(); print('db ok')" | |
| ``` | |
| Expected: | |
| ```text | |
| db ok | |
| ``` | |
| --- | |
| ### Task 3: Google Ads Read-Only Connector | |
| **Files:** | |
| * Modify: `app/ads/connector.py` | |
| * [ ] Step 1: Implement: | |
| ```python | |
| list_campaigns() | |
| ``` | |
| Returns: | |
| ```python | |
| [ | |
| { | |
| "id": "...", | |
| "name": "...", | |
| "budget": ... | |
| } | |
| ] | |
| ``` | |
| * [ ] Step 2: Implement: | |
| ```python | |
| get_campaign_metrics() | |
| ``` | |
| Returns: | |
| ```python | |
| [ | |
| { | |
| "campaign_id": "...", | |
| "spend": ..., | |
| "clicks": ..., | |
| "impressions": ..., | |
| "ctr": ..., | |
| "leads": ..., | |
| "cpl": ... | |
| } | |
| ] | |
| ``` | |
| * [ ] Step 3: Add mock tests for connector responses. | |
| Expected: | |
| ```bash | |
| $env:PYTHONPATH="." | |
| pytest | |
| ``` | |
| passes. | |
| --- | |
| ### Task 4: Rule Engine | |
| **Files:** | |
| * Modify: `app/recs/rules.py` | |
| * [ ] Step 1: Implement High CPL Rule. | |
| Condition: | |
| ```text | |
| CPL > Target CPL × 1.5 | |
| ``` | |
| Recommendation: | |
| ```text | |
| Reduce budget allocation | |
| ``` | |
| * [ ] Step 2: Implement Strong Campaign Rule. | |
| Condition: | |
| ```text | |
| CPL < Target CPL × 0.8 | |
| ``` | |
| Recommendation: | |
| ```text | |
| Increase budget allocation | |
| ``` | |
| * [ ] Step 3: Implement Low CTR Rule. | |
| Condition: | |
| ```text | |
| CTR < 2% | |
| ``` | |
| Recommendation: | |
| ```text | |
| Review ad copy and keywords | |
| ``` | |
| * [ ] Step 4: Return structured recommendation objects. | |
| Example: | |
| ```json | |
| { | |
| "campaign":"Preschool Search", | |
| "type":"high_cpl", | |
| "action":"reduce_budget" | |
| } | |
| ``` | |
| --- | |
| ### Task 5: MiniCPM5 Recommendation Generator | |
| **Files:** | |
| * Modify: `app/models/llm.py` | |
| * Modify: `app/recs/generate.py` | |
| * [ ] Step 1: Load MiniCPM5 GGUF using `llama-cpp-python`. | |
| Implement: | |
| ```python | |
| load_model() | |
| ``` | |
| * [ ] Step 2: Generate explanations from recommendation payloads. | |
| Input: | |
| ```json | |
| { | |
| "campaign":"Preschool Search", | |
| "cpl":42, | |
| "target_cpl":20, | |
| "action":"reduce_budget" | |
| } | |
| ``` | |
| Output: | |
| ```text | |
| This campaign's cost per lead is significantly above target. Consider reducing budget allocation until conversion efficiency improves. | |
| ``` | |
| * [ ] Step 3: Validate output and provide fallback text if model response fails. | |
| * [ ] Step 4: Add mocked tests. | |
| --- | |
| ### Task 6: Dashboard UI | |
| **Files:** | |
| * Modify: `app/main.py` | |
| * Modify: `app/ui/dashboard.py` | |
| * Modify: `app/ui/recommendations.py` | |
| * [ ] Step 1: Build Campaign Dashboard. | |
| Display: | |
| | Campaign | Spend | Leads | CPL | CTR | | |
| | -------- | ----- | ----- | --- | --- | | |
| * [ ] Step 2: Add dashboard summary cards. | |
| Examples: | |
| ```text | |
| Total Spend | |
| Total Leads | |
| Average CPL | |
| Active Campaigns | |
| ``` | |
| * [ ] Step 3: Add Recommendations Page. | |
| Display: | |
| | Campaign | Recommendation | Status | | |
| | -------- | -------------- | ------ | | |
| * [ ] Step 4: Add Approve button. | |
| Updates: | |
| ```text | |
| Pending → Approved | |
| ``` | |
| * [ ] Step 5: Add Reject button. | |
| Updates: | |
| ```text | |
| Pending → Rejected | |
| ``` | |
| Verification: | |
| ```bash | |
| python app/main.py | |
| ``` | |
| Expected: | |
| Dashboard loads successfully. | |
| --- | |
| ### Task 7: Demo Data | |
| **Files:** | |
| * Modify: `scripts/seed_demo.py` | |
| * [ ] Step 1: Generate sample campaigns. | |
| Create: | |
| ```text | |
| 5 campaigns | |
| ``` | |
| * [ ] Step 2: Generate synthetic metrics. | |
| Create: | |
| ```text | |
| 30 days of data | |
| ``` | |
| * [ ] Step 3: Generate recommendations. | |
| Ensure dashboard always contains examples. | |
| Verification: | |
| ```bash | |
| python scripts/seed_demo.py | |
| ``` | |
| Expected: | |
| Database populated with demo content. | |
| --- | |
| ### Task 8: End-to-End Testing | |
| **Files:** | |
| * Create: `tests/test_e2e.py` | |
| * [ ] Step 1: Seed demo data. | |
| * [ ] Step 2: Run rule engine. | |
| * [ ] Step 3: Generate MiniCPM explanations using mocked model. | |
| * [ ] Step 4: Verify recommendations appear in database. | |
| Expected: | |
| ```bash | |
| pytest | |
| ``` | |
| passes. | |
| --- | |
| ### Task 9: Hugging Face Space Deployment | |
| **Files:** | |
| * Modify: `README.md` | |
| * Modify: `requirements.txt` | |
| * [ ] Step 1: Add deployment instructions. | |
| * [ ] Step 2: Document model download procedure. | |
| * [ ] Step 3: Document local development workflow. | |
| Example: | |
| ```bash | |
| pip install -r requirements.txt | |
| python scripts/seed_demo.py | |
| python app/main.py | |
| ``` | |
| Expected: | |
| Developer can run locally and deploy to HF Spaces. | |
| --- | |
| ## Self-Review Checklist | |
| 1. Google Ads metrics can be viewed. | |
| 2. Rule engine generates recommendations. | |
| 3. MiniCPM generates explanations. | |
| 4. Recommendations can be approved/rejected. | |
| 5. Dashboard works with seeded demo data. | |
| 6. No automatic campaign modifications. | |
| 7. No scheduler required. | |
| 8. No Google Sheets integration required. | |
| 9. Deployable on Hugging Face Spaces. | |
| --- | |
| ## Handoff / Execution Choices | |
| Plan complete. Two execution options: | |
| 1. Subagent-Driven (recommended) — run `subagent-driven-development` task-by-task. | |
| 2. Inline Execution — implement tasks sequentially in a single session. | |
| Recommended for hackathon: **subagent-driven-development**. | |