WORK 05 · Current
Порталы и платформы · B2B SaaS · generative search / GEO
SEO/AI portal: очереди, провайдеры и биллинг
Снимаемый риск маржи SaaS: очереди, refund, MCP estimate→charge.
Роль: Архитектура платформы и оркестрации
- 9+AI/SERP-контуров
- 2 слоядиспетчер очередей
- MCPагентский API
- refundпри fail провайдера
Задача
Сотни ключей × несколько API, 429 и таймауты плюс монеты. Без оркестрации и границ денег платформа либо встаёт, либо оплачивает эксперименты клиентов со своего кармана.
Результат
Per-provider Celery, двухслойный диспетчер, BillingService с usage log и refund, изоляция /tools/, MCP со scopes и явным согласием на списание.
- Django
- Celery
- Redis
- PostgreSQL
- MCP
Живой сайт
Экраны visibility-платформы
Кабинет, провайдеры, очереди, биллинг, /tools/, MCP и отчёты — контур маржи, не декоративные мокапы.
Платите за результат, не за хаос
Каждый вызов провайдера — квоты и токены. Архитектура либо режет хвост злоупотреблений, либо съедает маржу.
Visibility-портал выигрывает не «ещё одной нейросетью», а дисциплиной статусов и денег. Задачи в БД дают честный UX: queued / running / done / failed — без магического спиннера. Баланс монет на виду: клиент видит, за что платит, до того как сгорит пакет.
Синхронный HTTP на 30–60 сек ответа модели неприемлем. Одна общая очередь на всех провайдеров — недопустима. Публичные lead-tools не ходят в платёжное ядро как кабинет. Покупаете снимаемый риск: не спонсировать чужие эксперименты со своего prepaid.
Ставка простая: платить за успешный результат, честно refund’ить fail провайдера и не смешивать демо с прод-балансом.
- Честные статусы задач в БД — аудит и поддержка
- Баланс и стоимость на экране до списания
- Без синхронных «подождите минуту» на нейросеть
Провайдеры как модули
Новый AI/SERP-контур = сервисный класс и Celery route, не раздутый комбайн.
Отдельные модули на search-LLM, Wordstat, overview, классическую выдачу и соседние контуры. Контракт один: запрос → нормализованный результат или типизированная ошибка. Health и latency на карточке — операционка, не слайд.
Падение или rate limit одного контура не валит остальные: воркеры маршрутизируются per-provider. Ретраи с backoff; после исчерпания — failed, видимый пользователю. Так вы не платите бесконечным ретраям за мёртвый API.
Два слоя очередей
БД (статусы) → Redis-семафор (fair-share) → Celery per-provider.
Диспетчер по расписанию берёт пачку jobs, захватывает семафор между клиентами и ключами, затем отдаёт в Celery. Без fair-share один кабинет с тысячей ключей забивает воркеры и душит остальных.
Глобальные provider-route и user/project-слоты работают вместе: изоляция по вендору плюс договорённый параллелизм на аккаунт. Это и есть цена архитектуры «сейчас» — она отбивается на счетах провайдеров «в месяц».
- Нет одной общей очереди «для простоты»
- Fair-share на пользователя/проект
- Исчерпание ретраев → failed, не вечный retry
Биллинг с refund
Prepaid, таблицы цен, APIUsageLog и транзакции — источник правды для поддержки и маржи.
BillingService списывает за факт работы API или пакет анализа. Критичный паттерн: refund при ошибке провайдера из пути задачи — иначе платформа продаёт воздух и теряет доверие. Промо и рефералка живут рядом, но не в обход usage log.
Цены на модели меняются без переписывания воркеров: воркер рапортует usage, биллинг считает монеты. Прозрачность «сколько спишется» снижает споры после факта. Дашборд расходов — часть продукта, не отчёт «потом».
/tools/ вне прод-баланса
Lead-магниты греют воронку с жёсткими лимитами — без дыры в кассе кабинета.
Fan-out, answer coverage, bot access и аналоги — отдельный контур со своей моделью прогонов. Они не получают прав кабинета с деньгами. Граница режет злоупотребления и случайный «бесплатный» продакшен-скан.
Слой кэша и snapshot видимости рядом: повторный дорогой collect без нужды — прямой убыток. TTL и инвалидация — продуктовый рычаг свежесть против маржи, не деталь инфраструктуры «потом».
MCP: estimate → charge
Scopes, идемпотентность, явная цена до согласия — агент не жжёт бюджет в цикле.
JSON-RPC и stdio-мост. Bearer scopes: read / write / charge / узкие factory-права. Write и charge не выдаются «для удобства» read-only интеграциям. Платные tools: estimate → принятие стоимости → charge; при недостатке баланса — понятный отказ (аналог 402), не тихий partial run.
Идемпотентные ключи защищают баланс от двойных дерганий автоматизаций. Сырые ключи провайдеров наружу не отдаются. Агентный контур — полноценный клиент API с теми же правилами денег, что UI.
- Ротация токенов и аудит вызовов
- Estimate перед charge обязателен
- Нет сырых provider keys в агенте
Collect отдельно от report
Падение рендера KPI не должно перезапускать дорогой сбор у провайдеров.
Сырые ответы и построение отчёта — разные стадии. Снимки и нормализованные сущности позволяют пересчитать витрину дешевле, чем пересканировать все ключи. Это прямая защита COGS на шкале кабинета.
Отчёт «из snapshot» продаёт клиенту скорость и стабильность, а вам — возможность не жечь квоты на каждый F5 дашборда.
Оболочки без ломки ядра
Wizard, factory, hub меняются; задачи, баланс и провайдеры стабильнее моды на UI.
Новые шеллы документируют изоляцию, чтобы онбординг не ломал оплату и статусы. Доменное ядро переживает редизайн — это дешевле, чем микросервисы «по слайду» до независимых команд и SLO.
Сознательно не сваливали все AI-вызовы в одну очередь и не смешивали demo-tools с прод-биллингом. Без лимитеров и refund SaaS спонсирует эксперименты пользователей своими деньгами — этот кейс как раз про отказ от такой модели.
- Не дробили микросервисы ради слайда
- Не одна очередь на всех провайдеров
- Не смешивали demo и прод-баланс
Итог
Итог
Visibility-портал покупают как фундамент очередей и денег: изоляция провайдеров, честный баланс, безопасный агентный контур. На этом уже строят GEO и продуктовые пайплайны — не наоборот.
Без дисциплины SaaS спонсирует чужие сканы. С ней — платите за результат и контролируемую маржу, а не за хаос ретраев и «бесплатных» tools.
Request this case
Соберём архитектуру под вашу задачу
Вакансии не рассматриваю. Создаю галеру. Лично — консультации и проектирование. Форм на сайте нет — пишите в Telegram или на почту.