AI gift basket product photo from six item photos: 16 references

GPT Image 2.5 on Sume takes up to 16 reference images, so six item photos can go into one gift basket scene; and the billed price is in usage.cost.

5 min readSume
All posts

To make a gift basket product photo from six item photos, send all six as input_references to openai/gpt-image-2.5, which accepts up to 16 references on Sume, and describe the basket and the arrangement in the prompt. Price depends on size and quality, so read usage.cost on the response, which is the billed list times 1.25.

Gift baskets are bought in the next six weeks, and a seller with 40 baskets cannot shoot each combination. Facts here come from Sume's Image API page and the catalog source, read on 2026-10-05. The honest limit: a generated basket shows items placed by a model, so use it as a mockup unless the contents match what you ship.

How many references can a basket use?

Most edit-capable rows take up to 10 references; the two ChatGPT Image 2.5 rows take 16. References must be public HTTPS URLs; Sume rejects localhost, private-network and non-HTTPS URLs before submission.

Reference limits relevant to a gift basket (read 2026-10-05)
Model on SumeReference limitNotes
openai/gpt-image-2.516Also mask_url and background
openai/gpt-image-2.5-sunburst16Same limits and price
Most other edit rows10For example Nano Banana 2
ideogram/ideogram-v4.55First image is the source

How do I send six items?

List the items in the prompt in the same order as the references so the model knows which photo is which.

import os, requests

body = {
    "model": "openai/gpt-image-2.5",
    "prompt": "A wicker gift basket on a kitchen table holding the six items from the reference photos in order: jam jar, tea tin, shortbread box, candle, soap bar, wool socks. Keep each item's label and shape. Soft daylight, no added text.",
    "aspect_ratio": "4:5",
    "input_references": [
        {
            "type": "image_url",
            "image_url": {
                "url": "https://example.com/item-1.jpg"
            }
        },
        {
            "type": "image_url",
            "image_url": {
                "url": "https://example.com/item-2.jpg"
            }
        },
        {
            "type": "image_url",
            "image_url": {
                "url": "https://example.com/item-3.jpg"
            }
        },
        {
            "type": "image_url",
            "image_url": {
                "url": "https://example.com/item-4.jpg"
            }
        },
        {
            "type": "image_url",
            "image_url": {
                "url": "https://example.com/item-5.jpg"
            }
        },
        {
            "type": "image_url",
            "image_url": {
                "url": "https://example.com/item-6.jpg"
            }
        }
    ]
}
r = requests.post(
    "https://api.sume.com/v1/images",
    headers={"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"},
    json=body,
    timeout=60,
)
if r.status_code == 200:
    out = r.json()
    for img in out["data"]:
        print(img["url"])
    print("billed USD:", out["usage"]["cost"])
elif r.status_code == 202:
    print("still running, poll:", r.json()["data"]["status_url"])
else:
    print(r.status_code, r.text)

What should I check?

  • Count the items; a missing sock means regenerate.
  • Zoom into each label; the model may redraw printed text, so use the real item photo for a listing.
  • If usage.cost is higher than expected, the size or quality is above the 1024 high default.
  • Use mask_url to fix one region after the first pass instead of regenerating the basket.

Sources

Related posts

More in Models

All Models posts

Written by Sume