ARTICLE

OpenAI Decisions API (preview): classification and routing for Bubble bulk images via BIAIG

Where to gate async bulk images before catalog commit, how to retry only rejected rows onto another bulk route without rerunning the full generation job, and why Batch Moderation is the documented fallback while Decisions remains preview-only.

Context

At DevDay (2026-09-29), OpenAI announced the Decisions API in limited preview (not GA). An OpenAI Developer Community recap describes Luna-backed classification/routing over a developer-defined finite set of predefined answers. TechCrunch (2026-09-30) reports fixed option sets (including image categories) and claimed low latency with image understanding; no public hands-on validation at launch. A closer look: Flare, Sunburst, and WaveSpeedAI: routing. A closer look: Flare, Sunburst, and WaveSpeedAI: routing.

For high-volume batches, that is a plausible layer between generation and catalog publish: policy, NSFW, brand drift—before commit. This note fits the editorial line of async batch + public result URLs; it complements Batch API vs Flare pieces and does not repeat Midjourney/Qwen vendor-risk coverage.

Source honesty: no verified public Decisions API reference at Scout time. Latency (~150 ms in secondary explainers vs ~1.6 s Luna in press), confidence semantics, and Batch support are unverified until OpenAI publishes docs, pricing, and supported batch endpoints.

Bubble + BIAIG: what we can claim

Public biiaImagine™ marketing covers scalable catalog visuals. Scout found no public spec for a Bubble.io ↔ BIAIG pipeline (catalog write contract, idempotency, bulk-route IDs). The placement below is an architecture hypothesis—validate against internal BIAIG/Bubble docs, not shipped fact. A closer look: The ~500-row bulk-tools ceiling in. Worth reading next: ByteDance–MPA guardrails on Seedream/Seedance: bulk.

Where to insert classification

Typical async chain:

  1. Bulk generate (Batch /v1/images/generations or your BIAIG bulk route) → assets at stable public URLs (OpenAI recommends remote image_url for moderation batches).
  2. Classify / moderate in a separate batch or sync gate.
  3. Catalog write only for approved; quarantine / review skips publish.
  4. Regenerate retries for rejected rows only, targeting an alternate bulk route, without a second full JSONL generation job. Same topic: Qwen-Image-2.1 before 28.09 UTC+8: freeze. Same topic: Bubble.io pricing in 2026: which.

OpenAI Community guidance: batch requests are independent; multi-step flows (generate → classify) need app-orchestrated sequential batches (Bubble backend, workflow engine, BIAIG worker).

Decisions (preview), when Batch support exists

If /v1/decisions (or equivalent) lands on the Batch supported endpoints list with image context:

  • Questions with your labels: e.g. approve_catalog | nsfw_block | policy_violation | brand_drift_retry_alt_route | human_review.
  • Input: image_url plus optional metadata (SKU, custom_id, route id).
  • Output (expected from announcements, not contractual): selected answer + confidence—thresholds are yours.

Custom brand drift and policy labels are not covered by OpenAI’s fixed Moderation categories—Decisions (or Structured Outputs / Luna) may fit if preview stabilizes.

Documented fallback today: Batch + Moderation

The Batch API guide includes /v1/moderations with omni-moderation-latest, multimodal image_url, and custom_id per line. Moderation docs expose flagged, categories, and category_scores; the sync endpoint is documented as free—useful for high-volume harm/safety gates.

Limitation: categories are OpenAI-defined, not your brand checklist. Drift detection stays a separate step or human review.

Retry routing without rerunning the full generation batch

Pattern aligned with batch semantics:

Step Action
G1 Generation batch; each line: custom_id = stable catalog key.
C1 Classification/moderation batch; same custom_id; URLs from G1.
Merge Orchestrator state: approved, retry_route_B, quarantine.
G2 New JSONL only for rows marked retry_route_B; different bulk-route id in the request body.
C2 Re-classify G2 outputs only.

Idempotency: do not regenerate successful G1 assets in G2. One catalog write per custom_id after final approved.

Operational risks (Scout): expired/private URLs break classify batches; wrong thresholds → off-brand publish; preview APIs → breaking changes; sequential batches → harder cost accounting.

Practical checklist for Bubble developers

  1. Define the pre-commit catalog contract (internal BIAIG): which fields block publish.
  2. Keep custom_id end-to-end (generate → classify → retry).
  3. Document bulk-route as (provider, model, prompt profile)—retry means route change, not rerunning the entire catalog job.
  4. Production gate now: Batch moderations for NSFW/harm; custom labels via a separate layer + human queue for preview models.
  5. Treat Decisions as pilot traffic until official schema, pricing, and Batch support exist.

Practical checklist for Bubble developers

Open questions (do not treat as settled)

  • Decisions in Batch, image JSONL limits, abstain/unknown behavior.
  • Pricing vs free batch moderations.
  • How Decisions “safety protections” interact with Moderation for custom labels.
  • False positive/negative thresholds at catalog scale and mandatory human review during preview.

Sources: DevDay community recap, TechCrunch, OpenAI Batch/Moderation docs, OpenAI Community (multi-step batch), secondary explainers (The New Stack, Vercel)—treat latency/confidence from the latter as unverified.

← All articles