Автоматичне дослідження реклами конкурента на Google Ads Transparency Center. Вихід — звіт з кропами + маркетинговим аналізом кожного креативу.
Stage 1 (Collector) Stage 2 (Analyzer)
┌──────────────────────────┐ ┌──────────────────────────┐
│ Gemini 2.5 Computer Use │ PNGs │ Gemini 2.5 Pro Vision │
│ (browser agent) │ ──────► │ (structured JSON) │
│ │ │ │
│ • Playwright Chromium │ │ • Per-screenshot analysis│
│ • Navigates Transparency │ │ • Bbox → PIL crop │
│ • Screenshots за кроками │ │ • Dedup by headline │
│ • History truncation │ │ • Markdown report │
└──────────────────────────┘ └──────────────────────────┘
↓ ↓
/tmp/cu-poc/<brand>/step-*.png /srv/reports/assets/<slug>/
/srv/reports/<slug>.md
→ http://31.131.26.203/reports/<slug>.md
collector.py — Stage 1: browser-агент, збирає PNGanalyzer.py — Stage 2: Gemini Pro Vision, кропи + звітreferences/ — еталонні приклади, pricing, prompt recipes# Stage 1 — browser agent збирає скріни
cd /tmp && python3 /srv/wiki/skills/competitor-ad-research/collector.py
# → /tmp/cu-poc/perla/step-*.png (1–20 кроків залежно від складності)
# Stage 2 — аналіз + звіт
python3 /srv/wiki/skills/competitor-ad-research/analyzer.py \
--input-dir /tmp/cu-poc/perla \
--brand "Perla Helsa" \
--region "Україна" \
--output-dir /srv/reports/assets/perla-helsa-2026-04-22 \
--report-path /srv/reports/perla-helsa-creative-review-2026-04-22.md
# → http://31.131.26.203/reports/perla-helsa-creative-review-2026-04-22.md
У collector.py є рядок task = "...". Треба:
?region=UA у стартовому URL)OUTDIR = Path("/tmp/cu-poc/<brand-slug>")Все інше (truncation, screenshot loop, safety acknowledgement) універсальне.
Вимірювання по Perla Helsa (UA, колаген, 13 скрінів → 22 унікальні креативи):
| Stage | Модель | Input tok | Output tok | Cost |
|---|---|---|---|---|
| 1. Collector | gemini-2.5-computer-use-preview |
115 027 | 3 651 | $0.18 |
| 2. Analyzer | gemini-2.5-pro (vision + JSON) |
~REFILL~ | ~REFILL~ | $REFILL |
| Total | $REFILL |
Stage 1 основна стаття витрат — браузерні скріни великі, мультимодальний input товстий.
Оптимізація: truncate_history(keep=4 turns) зрізає input токени в ~4× vs keep-all.
Якщо регіон не віддає результатів за 20 кроків (ліміт MAX_STEPS) — collector завершується і Stage 2 пропускається.
Ключова частина — structured JSON output з фіксованим списком полів:
id, bbox_norm, format, topic, headline, body_text, url_shown,
visual_description, angle, hook, cta, promo, funnel_position, marketing_review
angle і funnel_position — закриті enum'и, щоб потім можна було робити meta-зрізи (таблиця "angle × кількість креативів").
safety_acknowledgement: "true" у function response./srv/wiki/skills/ppc-ad-copy/SKILL.md — коли треба написати власні оголошення на основі дослідження/srv/reports/ — всі згенеровані звіти, доступні за лінком через Reports Hub