OpenAI Images API: до 10 за виклик — sync burst проти Batch API для bulk-каталогів у Bubble з BIAIG
Параметр n≤10 дає кілька варіантів одного промпта, а не десять SKU в одному HTTP-запиті. Матриця: коли sync burst у Bubble, коли Batch через JSONL (~−50%, до 24 год), і як не з’їсти WU на base64, upload і polling.
З чого почалось
Я тягнув bulk-каталог у Bubble через OpenAI Images API і спочатку плутав n до 10 з «десятьма SKU одним запитом». Ні. Синхронні POST /v1/images/generations і POST /v1/images/edits на GPT Image приймають n від 1 до 10 — це кілька зображень з одного промпта в одному виклику. DALL·E 3 — лише n=1. Каталог-scale — це багато окремих запитів: багато sync-викликів або Batch JSONL, де один рядок = один underlying request. Поруч із цим: OpenArt Bulk Create (500 CSV.
GPT Image за замовчуванням віддає base64, не ephemeral URL. У no-code я часто бачив, що дорожче за сам inference — збереження, upload у storage, мій Image Flow (generate → store).
З docs зараз: gpt-image-2.5-flare (швидкі щоденні генерації), gpt-image-2.5-sunburst (точніше editing), gpt-image-2 лишається задокументованим. Batch підтримує /v1/images/generations і /v1/images/edits. Міграція: gpt-image-1 — shutdown 2026-10-23; gpt-image-1-mini, gpt-image-1.5, chatgpt-image-latest — 2026-12-01; заміни — Flare або Sunburst. Якщо в Bubble-плагіні або workflow прошиті старі model ID — це технічний борг з датою. Про це окремо: Flare, Sunburst і WaveSpeedAI: маршрутизація.
NB2→NB2.1 у брифі я не зіставив з офіційними model ID у цьому пакеті — перевіряйте рядки моделі в action, не внутрішні скорочення.
BIAIG у тексті — редакційна/внутрішня мітка для Bubble-інtegrації з batch + image (публічний listing Chakor «OpenAI ChatGPT & GPT-4» згадує batch і images; окремого авторитетного doc під акронімом BIAIG Scout не знайшов). Поруч із цим: OpenAI Batch API для images.
Матриця рішень (рядок / SKU)
| Сценарій | Режим | Чому |
|---|---|---|
| Прев’ю в UI, «ще 3 варіанти того ж промпта», A/B одного copy | Sync, n 2–10 |
Latency секунди; один prompt → кілька output |
| ≤10 SKU, кожен з своїм промптом, терміново | Sync, n=1 × N викликів |
Batch не встигне; рахуйте rate limits sync-пулу |
| Сотні–тисячі рядків spreadsheet-каталогу, distinct prompts | Batch JSONL | ~50% дешевше vs sync, окремий rate-limit pool; SLA до 24 год (часто швидше) |
| Редагування з reference photo per SKU | Batch /v1/images/edits або sync |
Слідкуйте за 200 MB на файл; для великих edit-batch краще URL, не base64 у JSONL |
| Flare vs Sunburst | Окремий вибір моделі | Це quality/speed/editing, не «Batch vs sync»; one model per batch file |
Правило великого пальця: n≤10 — variant burst одного intent; bulk-каталог — JSONL + custom_id = ваш row/SKU id, зазвичай n=1 на рядок, якщо не робите свідомо multi-variant на SKU.
Batch у цифрах (з docs)
- Формат: JSONL, до 50 000 requests і 200 MB на batch, без streaming.
- Вихідний порядок не гарантований — зшивка лише через
custom_id. - Прострочений batch: оплачується виконане, решта відпадає — ризик partial catalog.
- Chunking операційно: ~500 рядків на job — зручні rerun, менший blast radius, легше дебажити один зламаний промпт.
Bubble: unit economics beyond tokens
OpenAI Batch економить ~50% на inference; у Bubble я рахую повну ціну як WU + час:
- Submit batch — один backend/API action (BIAIG або plugin batch action).
- Polling — scheduled backend workflows до terminal status (
completed/failed/ expired). Кожен poll = WU; без cap/backoff/максимуму ітерацій я вже бачив, як роздувається scheduled volume (forum patterns). - Download output file + parse JSONL — ще WU і runtime.
- Base64 → binary → upload у storage / оновлення Thing — часто дорожче за tokens, особливо на sync burst з
n>1.
Як я роблю: sync burst — для інтерактиву; каталог — Batch + рідкий poll (наприклад, кожні N хвилин, не кожні 10 с) + idempotent «already processed batch_id». По грошах: batch-знижка може не бути очевидною у token-oriented usage views — я звіряю billed spend, не лише tokens (community anecdote, не official policy).
Checklist перед запуском каталогу
- Model string → Flare / Sunburst /
gpt-image-2, не sunsetgpt-image-1*. - Кожен JSONL line: endpoint, model,
custom_id= spreadsheet row id,n=1unless multi-variant задум. - Розбиття на chunks (~500) + окремий batch file per model.
- Reconciliation job: map output → SKU; алерт на missing
custom_id. - Оцінка WU: poll interval × expected hours + upload per image.
- Plan B: sync
n=1lane для термінових рядків поза batch.
Джерела (Scout packet)
OpenAI API reference (generate), Image generation guide, Batch guide & FAQ, Pricing, Flare/Sunburst model pages, Deprecations; Bubble plugin listing (Chakor); Forum — scheduled backend polling.
Стаття для внутрішнього digest; не публікувати зовні.