Настройка инструментов

Batch pipeline генерации изображений, который не выйдет за бюджет

Batch-эндпоинта не существует. На обоих public image routes один admitted request возвращает ровно один candidate image, поэтому production batch pipeline — это ваша собственная durable queue перед Nano Banana 2 (gemini-3.1-flash-image) или GPT Image 2: bounded workers, per-asset attempt budget, сверка terminal usage и lifetime spending limit ключа как последняя денежная граница.

·

Один admitted call — один candidate

Ни один public image route не принимает count, манифест или папку промптов. Вызов generateContent для gemini-3.1-flash-image возвращает один candidate, чьё изображение передаётся как base64 в inlineData; OpenAI-compatible POST /v1/images/generations для gpt-image-2 возвращает массив data из одного элемента с b64_json. Модель никогда не видит «сделай 500 вариаций» — размер batch определяется вашей queue, а не запросом.

// gemini-3.1-flash-image → one candidate, image as base64 inlineData
{
  "candidates": [
    { "content": { "parts": [ { "inlineData": { "mimeType": "image/png", "data": "<base64>" } } ] } }
  ],
  "usageMetadata": { "promptTokenCount": 24, "candidatesTokenCount": 1120, "totalTokenCount": 1144 }
}

// gpt-image-2 → single-element data array, image as b64_json
{
  "created": 1754800000,
  "data": [ { "b64_json": "<base64>" } ],
  "usage": { "input_tokens": 38, "output_tokens": 4096, "total_tokens": 4134 }
}

Спроектируйте хранение обоих форматов заранее: декодируйте base64 один раз, посчитайте checksum байтов и сохраните их рядом с job. URL-формат ответа, если route его возвращает, — это отдельная fetch-задача со своим сроком жизни, а не durable asset.

Читайте также: Как на самом деле устроена цена API генерации изображений

Один durable job на ассет, а не на prompt

  1. 01Создайте stable asset ID и immutable brief — prompt, references, protected traits — до того, как что-либо попадёт в queue.
  2. 02Зафиксируйте в job payload model, protocol, output size и maximum attempts, чтобы retry воспроизводил то же решение, а не принимал новое.
  3. 03Дайте каждому worker ограниченный срез queue и резервируйте один provider request на один candidate; не просите модель о внутреннем batch.
  4. 04Атомарно сохраняйте request ID, terminal usage, output checksum и validation verdict вместе с версией ассета.
  5. 05Завершайте job только после того, как storage и downstream publication подтвердили одну и ту же версию ассета.
{
  "asset_id": "catalog/sku-1042/hero-v3",
  "idempotency_key": "sku-1042:hero-v3:attempt-1",
  "model": "gemini-3.1-flash-image",
  "size": "1K",
  "max_attempts": 2,
  "spending_key": "image-production"
}

Математика цены для прогона на 500 SKU

У Nano Banana 2 опубликованы фиксированные image-output составляющие: 1K — это 1 120 image tokens, официально $0.0672 и $0.0336 для обычного B2C; после той же политики 50% 2K стоит $0.0504, а 4K — $0.0756. У GPT Image 2 нет честной константы за картинку: image output тарифицируется по $15 за 1M tokens для обычного B2C, а итог определяет terminal usage. Считайте пример по фиксированной составляющей — это единственная часть, известная до прогона.

СтрокаЗначение
Ассеты в кампании500 SKU
Candidates на ассет2
Admitted calls1 000
Image output за 1K candidate (обычный B2C)$0.0336
Базовый image-output spend1 000 × $0.0336 = $33.60
Бюджет retry: 10% ассетов, одна extra attempt+$3.36
Худший случай image-output spend$36.96

Это только image-output составляющая. Text/image input, возможный text/thinking output и grounding добавляются из terminal usage. Скидка 50% для B2C делит official usage пополам, но не ограничивает произведение assets × candidates × retries × resolution — его границы задаёте вы.

Ставки за tokens, на которых строится этот расчёт batch

Ограничьте каждый множитель, а не только цену

МножительGuardrail
AssetsЯвная queue length и campaign budget
VariantsMaximum candidates per asset
RetriesТолько proven not-started; total deadline
ResolutionDefault 1K; повышение по delivery rule
ReferencesТолько нужные brief файлы
ConcurrencyНебольшой worker ceiling с 429 cooling

Lifetime spending limit ключа — последняя денежная граница, если откажут все application-level guardrails. Ставьте его равным бюджету кампании плюс измеренный запас, а не балансу аккаунта.

Правила retry, cooling и observability

  • Никогда не делайте retry после доставки image bytes или complete provider response — такой retry оплачивает второй candidate, а не восстановление.
  • Ambiguous timeout — это reconciliation: сверьте request ID с charge в дашборде, прежде чем решить, что billable generation не было.
  • На 429 соблюдайте Retry-After, provider cooling и jitter в пределах total deadline; немедленный fan-out усиливает capacity event.
  • Считайте attempts, accepted assets, settled nanoUSD и причины validation failures; не допускайте prompts и keys в metrics.
  • Алертьте на cost per accepted asset и failure share, а не только на HTTP success rate — полностью зелёный batch может оказаться дорогим.

Settled cost per accepted asset — реальная unit economics batch: она складывает token price, resolution, retries и quality rejects в единственное число, которое бизнес действительно покупает.

Изолируйте batch lane отдельным ключом и бюджетом

Запускайте batch worker на dedicated key с lifetime spending limit и expiration date: тогда баг в queue потратит максимум бюджет кампании, но не аккаунт. Новый аккаунт через Google или GitHub получает $5 platform bonus credit — этого хватит, чтобы проверить pipeline end-to-end до первого пополнения; дальше баланс пополняется на любую целую сумму в долларах банковской картой или криптовалютой, например USDT или BTC. Prepaid balance не сгорает, а подписки, которую нужно подбирать по объёму, нет.

  • Один ключ на workload: batch generation никогда не делит ключ с interactive или editing трафиком.
  • Сверяйте каждый settled charge с его request ID до закрытия кампании.
  • Перепроверяйте lifetime spending limit перед каждой новой кампанией, а не один раз при настройке.

Prepaid-тарифы без сгорания: вносите ровно бюджет кампании

Частые вопросы

Можно ли сгенерировать весь batch одним API request?

Нет, не на published routes. Один admitted call возвращает один candidate image; параметра count, который его умножает, нет. Размер, порядок и concurrency batch принадлежат вашей durable queue — именно там бюджет проверяется до того, как потрачены деньги.

Сколько стоит batch из 1 000 изображений?

Для Nano Banana 2 в 1K фиксированная image-output составляющая — 1 120 tokens на candidate, то есть $0.0336 для обычного B2C: 1 000 candidates стоят $33.60 image output плюс input и возможный grounding из terminal usage. GPT Image 2 тарифицирует image output по $15 за 1M tokens для обычного B2C без фиксированной цены картинки, поэтому итог batch известен только по settled usage.

Как остановить runaway image batch?

Скомбинируйте dedicated key с lifetime spending limit, явную queue length, bounded workers, per-asset maximum attempts и total campaign budget. Каждый слой отказывает независимо, а key-level limit — граница, которая держится, даже если все остальные сломались.

Нужно ли немедленно retry 429?

Нет. Соблюдайте Retry-After и provider cooling, добавляйте jitter и держите total deadline на job. Немедленный fan-out во время capacity event превращает замедление в outage, который вы сами оплатили.

Хранить base64 payload или URL?

Ответ API — это транспорт, а не хранилище. Декодируйте base64 один раз, посчитайте checksum и сохраните байты в собственном object storage, затем публикуйте оптимизированные WebP/AVIF derivatives; сырый payload API нельзя отдавать как storefront asset.

Скидка 50% действует на каждый call в batch?

Для обычных B2C — да, на official usage каждого admitted call, generation или edit. У B2B действует согласованная политика, а OpenKeys тарифицируются 1:1 по официальной цене. Скидка никогда не доказывает, что модель сейчас доступна конкретному ключу.

Создайте аккаунт через Google или GitHub и протестируйте шлюз с бонусом $5 на балансе платформы.