AI wall art above the sofa: preview a print in your living room

Preview a framed print on the wall above your sofa: your room photo first, the artwork second, one Sume image edit call, and a prompt that fixes frame size.

4 min readSume
All posts

A room photo and the artwork file

Before buying a large print, you want to know whether it works above the sofa. Take a straight-on photo of the wall, keep the artwork file you are considering, and let one edit call hang it.

Send the room photo first and the artwork second in input_references, then describe the frame in words. For a mask over the empty wall area, mask_url is available on ChatGPT Image 2.5 only.

Sume Image API docs list ChatGPT Image 2.5 as openai/gpt-image-2.5 (Flare) and openai/gpt-image-2.5-sunburst. OpenAI's guide says to choose Sunburst where editing precision matters most and Flare for fast everyday generation, so these edits use Sunburst.

Give the frame a size and a position

Say how wide the frame is compared with the sofa, such as about two thirds of the sofa width, and where it hangs, such as centered, 20 cm above the backrest. Ask for a thin oak frame with a white mat, and say that furniture, rug and lighting must not change.

import os
import requests

REFS = [
    "https://example.com/living-room.jpg",
    "https://example.com/print.jpg",
]
resp = requests.post(
    "https://api.sume.com/v1/images",
    headers={"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"},
    json={
        "model": "openai/gpt-image-2.5-sunburst",
        "prompt": "Image 1 is a living room photo, image 2 is a framed art "
                  "print. Hang image 2 centered above the sofa, about two "
                  "thirds of the sofa width, in a thin oak frame. Keep "
                  "furniture, rug and lighting unchanged.",
        "aspect_ratio": "auto",
        "input_references": [
            {"type": "image_url", "image_url": {"url": u}} for u in REFS
        ],
    },
    timeout=60,
)
print(resp.status_code)
print(resp.json())

Decide the size with a table, not a guess

Ask for two or three sizes in separate calls and pick by eye. Keep everything but the size sentence the same.

Frame size options to test (example prompts; model limits per Sume docs, read 2026-10-03)
OptionWidth vs sofaFrame
SmallAbout halfThin black
MediumAbout two thirdsThin oak, white mat
LargeAbout full widthNone, canvas edge

Measure the real wall afterwards

The render is not to scale. Measure the real wall and sofa, then convert your favorite option to centimeters before ordering. Also check the render did not redraw the artwork itself: compare it with the file at full size.

Inputs Sume checks before it spends anything

Reference and mask URLs must be public HTTPS; localhost, private-network and non-HTTPS URLs are rejected. Sume also checks every field against the model's catalog entry, so a field the model does not list returns 400 unsupported_parameter instead of being dropped without a word.

If you are unsure which fields a model accepts, GET /v1/images/models lists them, and GET /v1/images/models/{id}/endpoints returns the per-endpoint capabilities and pricing.

Cost, retries and slow calls

Each edit is one billed image when it completes, and nothing when it fails. Sume's docs say the amount in usage.cost is what the wallet is charged, with the 1.25 multiplier on provider list price already applied. That makes a retry cheap to reason about: a failed attempt costs zero.

Slow settings, such as 4K output, high quality or a large n, can push a call past the 30-second wait. Then the response is 202 with a job envelope rather than the image, and you fetch the result from the job endpoints.

Sources

Related posts

More in Use cases

All Use cases posts

Written by Sume