Skip to content

ADR-009: Three sheets of four figures, rendered at 2K

Developers and the owner — read this before changing SHEET_LAYOUT or the sheet resolution to save money.

  • SHEET_LAYOUT=3x4: three square sheets with four figures each (2×2), generated in parallel.
  • Sheets are 2K; single-figure regenerations and the anchor are 1K.
  • Status: accepted. 2x6 remains available as a setting.

With two sheets of six figures the cells are small and figures often touch the sheet border or each other. Every such defect meant regenerating a sheet or a figure, which costs time and money. A sheet is also where most of the pack’s cost is.

A live A/B run compared the two layouts on the same photo and two outfits, two runs each (HANDOFF.md, consistency section, item 10):

Metric 3x4 2x6
Invalid sheets 0 0
Figures at the sheet edge 9 20
Visible edge cuts left in the pack 0 2
Regenerations 9 16
Average time per pack 121.7 s 126.5 s
Estimated cost per pack about $0.325 about $0.345

These times were measured on a laptop under load; server timings are lower — see Performance.

  • 3x4 became the default. The sticker number equals the pose number; the mapping of poses to sheets lives in bot/catalog.py.
  • Sheets stay at 2K. A 1K sheet has enough pixels on paper, but a live 1K render produced a green fringe between fingers and a stair-stepped contour. The saving would have been about $0.10 per pack.
  • All image requests of a process share one semaphore, AI_MAX_PARALLEL_IMAGES (default 9). A stress run of three packs at once — nine sheets in flight — produced no rate-limit answers.
Alternative Why not
2x6 (two sheets of six) Twice as many figures at the edge and more regenerations.
1K sheets Visible quality loss at the edges for a small saving.
Twelve single images About twelve 1K images instead of three 2K sheets: far more expensive and slower.
  • A pack needs at least four image requests (anchor plus three sheets) in consistency mode, and three sheets must be cut at the same time, which sets the memory peak — see Capacity.
  • The daily image quota is consumed at about 4.3–4.4 requests per pack (load test, COST_HISTORY.md).
  • Commits 21810a0, 6ef2e1e; bot/config.py (sheet_layout, ai_max_parallel_images).

Last verified: 2026-11-13 against ai-sticker-pack@b715418 and ai-stickers-landing@e350ff5.