AI character sheet with turnaround and expressions via API

Build a character sheet with front, side, back and expression views: pick one anchor image, then feed it back as a reference per view on gpt-image-2.5.

5 min readSume
All posts

The reliable way to get a character sheet is one call per view, not one call for the whole sheet: generate and choose a single anchor image, then send that anchor as an input_reference for the front, side, back and each expression, repeating the same keep-list in every prompt. Assemble the sheet yourself in Pillow so the labels and the grid are exact.

Asking for the whole sheet in one image is cheaper in calls but gives the model the job of keeping five faces the same inside one canvas. One call per view keeps each view at full size.

Step 1: the anchor

Call openai/gpt-image-2.5 with a text prompt and n set to the range your catalog lists. Choose the take you like, then copy it to a public HTTPS URL of your own: Sume's Media inputs page rejects signed and private URLs as inputs, and generated results are returned as Sume-hosted signed URLs.

Step 2: one request per view

Each view is the same request with a different pose line. The reference carries the identity; the prompt carries the pose.

import json

ANCHOR = "https://example.com/anchor.png"
KEEP = "Keep the face, hairstyle, jacket and colours exactly as in the reference."
views = ["front view, neutral", "side view, facing left", "back view", "three-quarter view, smiling"]

requests_to_send = [
    {
        "model": "openai/gpt-image-2.5",
        "prompt": f"Character model sheet panel: {view}, full body, plain white background. {KEEP}",
        "input_references": [{"type": "image_url", "image_url": {"url": ANCHOR}}],
        "aspect_ratio": "auto",
    }
    for view in views
]
print(json.dumps(requests_to_send[0], indent=2))
print(len(requests_to_send), "requests")

Choosing the panel size

If you do ask for several views in one image, the canvas has to be a legal gpt-image-2.5 size. The docs and OpenAI's guide agree on the custom rule: both edges multiples of 16, a maximum edge of 3840, aspect ratio at most 3:1, and 655,360 to 8,294,400 pixels.

Sheet canvas sizes against the custom-size rule (read 2026-10-04)
CanvasPixelsLegal
1536x10241,572,864yes
2880x960 (3:1)2,764,800yes
3000x1000 (3:1)3,000,000no: 3000 is not a multiple of 16
3840x1152 (10:3)4,423,680no: wider than 3:1

Cost shape

Four views at the default high quality is four calls; each is billed at its endpoint pricing line, and a failed call is not billed. Run them with an Idempotency-Key per view so a retry after a timeout does not pay twice.

Sources

Related posts

More in Use cases

All Use cases posts

Written by Sume