AI wine label design via API: artwork from the model, text from code

For a wine label, generate only the artwork with gpt-image-2.5, ask for a clear panel, and set the name, vintage and regulatory lines in code so they are exact.

5 min readSume
All posts

For a wine label, ask the model for the artwork only, with an empty panel left for type, and set the producer name, vintage, region and any regulated wording in code. Exact strings are not what an image model is for, and a wrong digit in a vintage year is a reprint.

Generate at a size the label proportions allow, check the artwork at the printed size, and keep the text layer as a separate file your designer can edit.

What goes where (read 2026-10-04)

Wine label elements: model or code (read 2026-10-04)
ElementWhere to make itWhy
Illustration or patternImage modelThis is what it does well
Producer name, vintage, regionCode (Pillow or HTML)Exact characters, editable
Alcohol content, volume and any legal textCode, from your compliance sourceCheck the rules for your market; this page does not state them
Paper texture or foil lookImage model, as a separate transparent layer if you need itKeeps text sharp on top

A request for the artwork

Ask for the art in a tall label proportion and tell the model to leave the centre clear. 4:5 is a supported ratio in the Sume list, and on gpt-image-2.5 a custom size must keep both edges multiples of 16 within the total pixel range.

{
  "model": "openai/gpt-image-2.5",
  "prompt": "Vineyard hillside at dusk in a flat woodcut style, deep green and gold. Leave the centre third completely empty for a text block. No lettering anywhere.",
  "aspect_ratio": "4:5",
  "quality": "high",
  "n": 4
}

Set the type in code

This script runs as is on a placeholder canvas; swap in the chosen artwork and your font file.

from PIL import Image, ImageDraw, ImageFont

label = Image.new("RGB", (1024, 1280), (24, 52, 38))  # replace with Image.open("art.png")
draw = ImageDraw.Draw(label)
font = ImageFont.load_default()
for y, line in [(560, "DOMAINE EXAMPLE"), (600, "Reserve 2024"), (640, "Example Valley")]:
    draw.text((label.width // 2, y), line, fill=(230, 210, 150), font=font, anchor="mm")
label.save("label.png")
print(label.size)

Proofing

Print the artwork at the label's real size on plain paper before you commit. Check that the empty panel stayed empty, and re-run with n takes if the model drew in the space you reserved.

Sources

Related posts

More in Use cases

All Use cases posts

Written by Sume