API Seedream 5.0 Pro : générer des images avec Python
Un seul POST avec model Dola-Seedream-5.0-pro crée la tâche image. Voici le code de la requête, le comportement des tailles et du libellé que nous avons observé, et les deux images produites le 29 octobre 2026.
Sur cette page
- Quel id de modèle et quelles opérations
- Le code de la requête
- Les tailles et formats exécutés, et ce qui est revenu
- Le libellé, et comment le désactiver
- Erreurs et limites
- Seedream ou GPT Image 2.5 pour travailler avec l'API ?
- FAQ
- Quel id de modèle passer à l'API ?
- Pourquoi mon image porte-t-elle un libellé « AI generated » ?
- Quelles tailles l'API accepte-t-elle ?
- Puis-je obtenir du PNG au lieu du JPEG ?
- Puis-je retoucher une image existante avec Seedream ?
Envoyez un POST à https://api.omniakey.com/v1/media/tasks avec model défini sur Dola-Seedream-5.0-pro et l'opération generate, puis interrogez l'id de la tâche jusqu'à ce que le statut soit succeeded et téléchargez assets[0].url. Par défaut, l'image porte un libellé « AI generated » dans un coin. Le 29 octobre 2026, nous avons exécuté cette requête et une retouche en 1024x1024, et les deux fichiers sont revenus en PNG 1024×1024.
Vous trouverez ensuite l'id et les deux opérations, le code de requête exécuté tel quel, une liste des tailles demandées face aux pixels relevés dans chaque fichier, le libellé, le réglage qui le désactive (non exécuté) et les deux erreurs qui bloquent un appel de création. Les deux images sont celles réalisées ce jour-là.
Quel id de modèle et quelles opérations
Utilisez Dola-Seedream-5.0-pro, l'id de la page du modèle Seedream 5.0 Pro (vérifiée le 29 octobre 2026). La page liste deux opérations : texte vers image et retouche d'image. Elle indique aussi que la génération et la retouche partagent un même tarif, et que ni la taille choisie ni les images de référence jointes ne l'augmentent. Les tarifs actuels figurent sur la page des tarifs.
Ces champs déterminent la forme d'une requête, avant même le prompt.
model:Dola-Seedream-5.0-prooperation:generateoueditparameters.size:1K,1.5K,2K, ouwidthxheightavec unxoutput_format:pngoujpeg, etjpegpar défaut
Les champs de taille et de format se placent dans parameters. La sortie s'arrête à 2K : la page du modèle (vérifiée le 29 octobre 2026) ne liste aucune taille 4K. Seedream attend un x minuscule entre les côtés, alors que Qwen et Wan attendent un astérisque ; gardez les deux formes distinctes dans un client qui appelle les deux. Nos exécutions ont utilisé la forme widthxheight en 1024x1024 avec PNG, et les trois paliers sont restés hors de nos essais.
ByteDance vend le même modèle sur BytePlus ModelArk sous un autre id, dola-seedream-5-0-pro-260628. Celui-ci appartient à BytePlus, donc une requête vers OmniaKey demande l'id ci-dessus.
Le code de la requête
Le script est celui que nous avons exécuté le 29 octobre 2026, sans modification : deux fonctions utilitaires, un appel de génération, un appel de retouche, uniquement la bibliothèque standard de Python. Il lit votre clé dans OMNIAKEY_API_KEY et écrit chaque PNG dans le dossier depuis lequel vous le lancez. La documentation de l'API image décrit les mêmes trois étapes.
import base64
import json
import os
import time
import urllib.error
import urllib.request
import uuid
API = "https://api.omniakey.com/v1/media/tasks"
KEY = os.environ["OMNIAKEY_API_KEY"]
MODEL = "Dola-Seedream-5.0-pro"
def request(method, url, body=None, extra_headers=None):
headers = {"Authorization": f"Bearer {KEY}", "User-Agent": "omniakey-example/1"}
data = None
if body is not None:
headers["Content-Type"] = "application/json"
data = json.dumps(body).encode()
headers.update(extra_headers or {})
req = urllib.request.Request(url, data=data, headers=headers, method=method)
with urllib.request.urlopen(req, timeout=120) as resp:
return json.load(resp)
def poll(url, attempts=5):
for attempt in range(attempts):
try:
return request("GET", url)
except urllib.error.HTTPError as err:
if err.code < 500 or attempt == attempts - 1:
raise
except urllib.error.URLError:
if attempt == attempts - 1:
raise
time.sleep(5 * (attempt + 1))
def run_task(body, out_path):
task = request("POST", API, body, {"Idempotency-Key": str(uuid.uuid4())})["id"]
print("task", task, flush=True)
for _ in range(150):
time.sleep(4)
state = poll(f"{API}/{task}")
if state["status"] not in ("queued", "processing"):
break
if state["status"] != "succeeded":
raise RuntimeError(state.get("error") or state["status"])
asset_url = state["assets"][0]["url"] # signed link: short-lived, so download now
req = urllib.request.Request(asset_url, headers={"User-Agent": "omniakey-example/1"})
with urllib.request.urlopen(req, timeout=120) as resp, open(out_path, "wb") as f:
f.write(resp.read())
return task
def generate_image(prompt, out_path, size="1024x1024"):
body = {
"model": MODEL,
"type": "image",
"operation": "generate",
"input": {"prompt": prompt},
"parameters": {"size": size, "output_format": "png"},
}
return run_task(body, out_path)
def edit_image(source_path, prompt, out_path, size="1024x1024"):
with open(source_path, "rb") as f:
image = base64.b64encode(f.read()).decode()
body = {
"model": MODEL,
"type": "image",
"operation": "edit",
"input": {"prompt": prompt, "image": {"data": image, "mime_type": "image/jpeg"}},
"parameters": {"size": size, "output_format": "png"},
}
return run_task(body, out_path)
if __name__ == "__main__":
task = generate_image(
"A glass bottle of cold-pressed orange juice on a pale stone counter, morning light from the left, "
"a single orange slice beside it, shallow depth of field, no text, no logos.",
"juice-bottle.png",
)
print("generate task", task)
task = edit_image(
"cafe-base.jpg",
"Change the red bicycle to matte black. Keep everything else exactly the same: "
"the table, the cup, the window frame and the daylight. Photorealistic, no text, no logos.",
"cafe-edited.png",
)
print("edit task", task)
Les trois étapes se trouvent dans run_task : créer la tâche avec une clé d'idempotence neuve, interroger l'URL de la tâche jusqu'à ce que le statut quitte queued et processing, puis télécharger l'URL du premier asset. L'appel de création répond HTTP 202 avec un id qui commence par task_, et le statut démarre à queued (documentation, vérifiée le 29 octobre 2026). Une tâche qui finit en failed lève l'erreur de la réponse, si bien que la raison s'affiche dans votre terminal.
Les tailles et formats exécutés, et ce qui est revenu
Les deux exécutions ont demandé la même chaîne de taille et le même format, et les deux fichiers sont revenus en PNG 1024×1024.
- Génération — Taille demandée:
1024x1024; Pixels du fichier: 1024×1024; Format: PNG; Date: 2026-10-29 - Retouche — Taille demandée:
1024x1024; Pixels du fichier: 1024×1024; Format: PNG; Date: 2026-10-29
Lisez la taille en pixels dans le fichier téléchargé. La chaîne de taille est ce que vous avez demandé ; le fichier est ce que vous avez obtenu. Nous avons ouvert chaque PNG, mesuré sa largeur et sa hauteur, et regardé l'image à côté du prompt qui l'a produite.
La retouche est l'exécution la plus intéressante. Nous avons envoyé un JPEG 1024×683 d'une fenêtre de café avec une seule consigne, et une image carrée est revenue. Le vélo est désormais sombre, la table, la tasse et la plante restent dans l'image et, comme la sortie est carrée, la fenêtre et le bord de la table sont cadrés différemment de la source.
Change the red bicycle to matte black. Keep everything else exactly the same: the table, the cup, the window frame and the daylight. Photorealistic, no text, no logos.

Le libellé, et comment le désactiver
Selon la page du modèle (vérifiée le 29 octobre 2026), chaque sortie porte un libellé « AI generated » dans un coin, sauf si vous mettez watermark à false dans parameters. La page place le libellé dans le coin inférieur droit, et c'est là qu'il se trouve dans la sortie par défaut ci-dessous : discret et petit. Laissez watermark hors de la requête et vous obtenez le libellé.
A glass bottle of cold-pressed orange juice on a pale stone counter, morning light from the left, a single orange slice beside it, shallow depth of field, no text, no logos.
Voici cette sortie, produite avec les réglages par défaut.

Le réglage qui met le watermark à false n'a pas été exécuté : le plafond de dépense par exécution de l'outil du blog a arrêté cet appel avant l'envoi.
Erreurs et limites
Deux en-têtes décident si un appel de création passe : le jeton bearer et un Idempotency-Key.
| Ce que vous envoyez | Ce qui revient |
|---|---|
| Appel de création sans clé d'idempotence | 400 missing_idempotency_key |
| Même clé et même corps, à nouveau | 200 avec la tâche existante, rien de facturé en plus |
| Même clé, corps modifié | 409 idempotency_key_reused |
La même clé avec le même corps est la nouvelle tentative souhaitée : la tâche existante revient et rien de nouveau n'est facturé. La même clé avec un prompt ou une taille modifiés renvoie 409, créez donc une nouvelle clé pour chaque nouvelle requête. La clé peut compter jusqu'à 255 caractères (documentation, vérifiée le 29 octobre 2026).
Gardez le corps de la requête sous 1 MiB, image en Base64 comprise, et réduisez une grande photo source avant de l'envoyer. Quand une tâche réussit, l'URL de téléchargement de la réponse est un lien signé valable environ une heure, selon la documentation ; récupérez donc le fichier tout de suite ou interrogez à nouveau la tâche pour obtenir un lien neuf.
Un en-tête nous a surpris le 29 octobre 2026. Un POST envoyé avec le User-Agent par défaut d'urllib de Python a renvoyé HTTP 403 avec le corps error code: 1010 de Cloudflare. Notre propre en-tête User-Agent a atteint l'API, et rien n'a été facturé.
User-Agent, par exemple omniakey-example/1. Celui de Python par défaut a reçu le 403 ci-dessus le 29 octobre 2026.Seedream ou GPT Image 2.5 pour travailler avec l'API ?
Le travail décide. Dans notre retouche, Seedream 5.0 Pro a changé le seul objet que nous avions nommé, le vélo, et a conservé l'essentiel de la scène, même si le cadre a changé. Les photos de produit n'ont pas été testées ici. L'appel est un corps avec operation sur generate ou edit, et la source peut être une URL publique ou du Base64 en ligne (documentation, vérifiée le 29 octobre 2026).
Pour un résultat avec le même prompt à côté de GPT Image 2, la comparaison Seedream 5.0 Pro et GPT Image 2 montre les deux sorties d'un même prompt. Pour la même forme générer-et-retoucher sur un autre modèle, le tutoriel de l'API GPT Image 2.5 détaille sa requête et ses tailles. Exécutez votre prompt le plus difficile sur le candidat avant de basculer un pipeline, puis vérifiez les tarifs.
FAQ
Quel id de modèle passer à l'API ?
Dola-Seedream-5.0-pro, l'id de la requête d'exemple de la page du modèle (vérifiée le 29 octobre 2026). Le dola-seedream-5-0-pro-260628 de ByteDance appartient à BytePlus ModelArk, et OmniaKey prend l'id ci-dessus.
Pourquoi mon image porte-t-elle un libellé « AI generated » ?
Chaque sortie de Seedream 5.0 Pro porte le libellé dans le coin inférieur droit, sauf si vous mettez watermark à false, selon la page du modèle (vérifiée le 29 octobre 2026). Notre exécution avec les réglages par défaut du 29 octobre 2026 le portait.
Quelles tailles l'API accepte-t-elle ?
Les paliers 1K, 1.5K et 2K, ou la forme widthxheight avec un x minuscule entre les côtés (page du modèle, vérifiée le 29 octobre 2026). La sortie s'arrête à 2K, et nos deux exécutions ont demandé 1024x1024.
Puis-je obtenir du PNG au lieu du JPEG ?
Oui. output_format accepte png ou jpeg, et JPEG est la valeur par défaut (documentation, vérifiée le 29 octobre 2026). Lors des deux exécutions, nous avons demandé du PNG et reçu du PNG.
Puis-je retoucher une image existante avec Seedream ?
Oui : envoyez operation sur edit avec le prompt et l'image source, soit en Base64 en ligne avec son type mime, soit comme URL publique. La retouche de la fenêtre de café figure dans la section sur les tailles.
Modèles cités dans cet article
Articles similaires
Seedream 5.0 Pro vs GPT Image 2 : test avec le même prompt et prix
Six travaux, les mêmes prompts, trois modèles : ce que chacun a produit et ce qu'il a coûté.
API GPT Image 2.5 : générer et modifier des images en Python
Un POST crée la tâche, un GET en lit le résultat. Voici le code de la requête, les tailles testées le 29 octobre 2026 et une modification avec l'avant et l'après.
API Kling 3.0 : code de requête texte-vidéo et clips réels
Une tâche texte-vidéo tient en un seul POST avec le modèle kling-3.0. Voici le code de la requête, les champs attendus et deux clips de 5 secondes que nous avons créés et mesurés le 29 octobre 2026.
Articles récents
- Clapping Cat Meme AI : faites applaudir votre animal avec l'image-vers-vidéo
- Utiliser les API Claude et GPT dans DeepSeek Harness
- Alternative à l'API FLUX Kontext : retoucher des images avec GPT Image 2
- Guide des prompts Kling 3.0 : structure, exemples et vrais clips
- Guide des prompts MiniMax H3 : structure, exemples et vrais clips