Claude Opus 5.5 est disponible sur SeedRouter

API GPT Image 2 en Python : un exemple complet

Exemple complet d’API GPT Image 2 en Python : envoyer une requête, interroger la tâche, télécharger les images, retoucher avec références, gérer les erreurs.

Lire en Markdown

Pour utiliser l’API GPT Image 2 en Python, envoyez votre requête en POST à https://api.seedrouter.ai/v1/images/generations avec la bibliothèque requests, conservez l’id de tâche renvoyé, interrogez /v1/tasks/{id} jusqu’à ce que la tâche soit completed, puis téléchargez les URL d’images qu’elle liste. Le script ci-dessous réalise ces quatre étapes en une quarantaine de lignes et enregistre les images sur le disque.

Il fonctionne tel quel dès que SEEDROUTER_API_KEY est défini. Si vous n’avez pas encore de clé, obtenez-en une d’abord.

À quoi ressemble un script GPT Image 2 complet ?

import os
import time
import requests

API = "https://api.seedrouter.ai/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['SEEDROUTER_API_KEY']}"}


def submit(body):
    response = requests.post(f"{API}/images/generations", headers=HEADERS, json=body, timeout=60)
    if response.status_code >= 400:
        error = response.json()["error"]
        raise RuntimeError(f"{response.status_code} {error['code']}: {error['message']}")
    return response.json()["id"]


def wait(task_id, limit_seconds=600):
    deadline = time.monotonic() + limit_seconds
    while time.monotonic() < deadline:
        task = requests.get(f"{API}/tasks/{task_id}", headers=HEADERS, timeout=30).json()
        if task["status"] == "completed":
            return [image["url"] for image in task["output"]["data"]]
        if task["status"] == "failed":
            raise RuntimeError(f"{task['error']['code']}: {task['error']['message']}")
        time.sleep(3)
    raise TimeoutError(f"Still running. Resume polling task {task_id}.")


def download(urls, prefix):
    paths = []
    for index, url in enumerate(urls):
        path = f"{prefix}-{index}.png"
        with open(path, "wb") as file:
            file.write(requests.get(url, timeout=60).content)
        paths.append(path)
    return paths


task_id = submit({
    "model": "gpt-image-2",
    "prompt": "A matte ceramic vase on a sunlit table, soft shadows",
    "size": "1024x1024",
    "quality": "low",
    "n": 2,
})
print("task", task_id)
print(download(wait(task_id), "vase"))

Lancez-le avec python example.py. Il affiche d’abord l’ID de tâche, puis les chemins de deux fichiers PNG, vase-0.png et vase-1.png.

Que fait chaque fonction ?

submit envoie la requête et renvoie l’ID de tâche. Une réponse d’erreur contient toujours un objet error avec un code numérique et un message : l’exception vous dit donc quoi corriger. Un 400 avec le code 20001 et le message « Check the size parameter against the API documentation. », par exemple, signifie que la taille enfreint l’une des règles du guide des paramètres.

wait interroge la tâche toutes les trois secondes jusqu’à ce qu’elle se termine. Un délai limite de votre côté arrête la boucle, pas la tâche : le rendu continue, et vous pouvez reprendre l’interrogation du même ID plus tard. Une tâche qui se termine en failed lève une exception avec son code d’erreur et n’est pas facturée.

download récupère chaque URL renvoyée par la tâche et l’écrit sur le disque. Les URL de résultat servent à la livraison, pas au stockage permanent : enregistrez ce que vous voulez garder. L’exemple utilise requests pour les téléchargements comme pour les appels d’API ; gardez un seul client HTTP de bout en bout plutôt que d’y mêler urllib de la bibliothèque standard.

Comment modifier les réglages de l’image ?

Tout se trouve dans le corps de la requête. Les champs que l’on modifie le plus souvent en premier :

ChampExempleEffet
size"1536x1024"Dimensions de sortie ; auto laisse le modèle choisir
quality"medium"low, medium, high ou auto
n4Nombre d’images, de 1 à 10
output_format"jpeg"png ou jpeg
background"transparent"Nécessite png

Si vous changez output_format, modifiez en conséquence l’extension .png dans download. La liste complète des champs et des limites se trouve dans la référence de l’API GPT Image 2.

Comment retoucher une image en Python ?

Passez les images de référence sous forme d’URL dans le même appel. Il n’existe pas de point de terminaison de retouche séparé : ajouter images fait de la requête une retouche, et un mask limite la modification à une zone :

task_id = submit({
    "model": "gpt-image-2",
    "prompt": "Make the vase deep blue. Keep the table and the light unchanged.",
    "images": [{"image_url": "https://example.com/vase.png"}],
})

Les URL doivent être des liens HTTPS publics vers des fichiers PNG, JPEG ou WebP. Vous pouvez en envoyer jusqu’à 16. Les fichiers locaux et les chaînes base64 sont rejetés : téléversez d’abord l’image sur votre propre stockage et transmettez son URL.

Que doit faire le script quand l’envoi dépasse le délai ?

Ne renvoyez pas la requête tout de suite. Un dépassement de délai sur le POST ne prouve pas que la requête a été rejetée ; la tâche est peut-être déjà en cours et facturée. Vérifiez vos tâches récentes, ou ne réessayez la requête qu’après avoir confirmé qu’aucune tâche n’a été créée. Le guide des tâches explique comment distinguer les deux cas.

L’interrogation, c’est différent : un dépassement de délai pendant l’interrogation est sans conséquence. Rappelez wait avec le même ID.

Questions fréquentes

Puis-je utiliser le SDK Python d’OpenAI à la place ?

Pas directement. Cette API livre les résultats de façon asynchrone via un ID de tâche, alors que l’appel d’image du SDK attend l’image terminée dans la réponse. Quelques lignes de requests, comme ci-dessus, couvrent tout le parcours.

Comment exécuter plusieurs prompts ?

Envoyez chaque prompt, conservez tous les ID de tâche, puis interrogez-les. Le guide de génération par lots présente une version qui survit aux redémarrages sans payer deux fois.

gpt-image-2-official nécessite-t-il un code différent ?

Non. Changez la chaîne model et rien d’autre. Les deux ID acceptent les mêmes champs et renvoient la même réponse de tâche ; seule la facturation diffère.

Conservez l’ID de tâche, le reste n’est que de la tuyauterie

Envoyez, stockez l’ID, interrogez avec un délai limite et téléchargez ce qui revient. Ce schéma constitue toute l’intégration. Essayez un prompt sans code dans le Playground GPT Image 2 avant de l’automatiser.

Guides associés