Thème
Langue

Génération d’images (OpenAI Images API)

Génération d’images synchrone au format OpenAI Images API : paramètres, attente pouvant aller jusqu’à 300 secondes, facturation uniquement pour une image terminée, configuration de Cherry Studio. La modification passe par la génération asynchrone via /api/media/generate.

POST /v1/images/generations génère des images au format OpenAI Images API : vous envoyez une requête et recevez l’image dans la même réponse. Il s’agit d’un adaptateur utilisant la même file d’attente que POST /api/media/generate : les modèles, le prix, la vérification du solde, le basculement vers un autre fournisseur et la facturation sont partagés ; une même génération coûte donc le même prix sur les deux adresses.

POSThttps://getvibeapi.com/v1/images/generations
curl https://getvibeapi.com/v1/images/generations \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"nano-banana","prompt":"a red bicycle on a bridge","n":1,"size":"1024x1024"}'

Réponse (HTTP 200) :

{
  "created": 1792706400,
  "data": [{ "url": "https://getvibeapi.com/media/r/…/0.png" }]
}

Transmettez la clé sous la forme Authorization: Bearer sk-pv-… ou x-api-key. Le SDK officiel OpenAI fonctionne tel quel :

from openai import OpenAI

client = OpenAI(base_url="https://getvibeapi.com/v1", api_key="sk-pv-...", timeout=600)
image = client.images.generate(model="nano-banana", prompt="a red bicycle on a bridge", size="1024x1024")
print(image.data[0].url)

Paramètres du corps

ParamètreTypeDescription
modelreq.stringUn id de modèle d’image provenant de /api/media-catalog (kind: "image"), par exemple nano-banana, gpt-image-2, flux-2. Un id préfixé par le fournisseur (google/nano-banana) et une variante épinglée (gpt-image-2:network) sont également acceptés. Les modèles vidéo et audio sont refusés ici avec 400.
promptreq.stringDescription de l’image.
nnumberUniquement 1 : chaque génération est une tâche distincte avec son propre prix. Pour plusieurs images, envoyez plusieurs requêtes.
sizestringInterprétée comme un ratio d’aspect : 1024x1024 → 1:1, 1792x1024 → 16:9, 1024x1792 → 9:16, 1536x1024 → 3:2, 1024x1536 → 2:3 ; les autres valeurs sont réduites exactement (1920x1080 → 16:9). Un ratio que le modèle ne propose pas est refusé avec la liste des tailles prises en charge — aucun remplacement par la correspondance la plus proche n’est effectué. « auto » ou l’absence de champ signifie que la valeur par défaut du modèle est utilisée.
qualitystringUniquement pour les modèles dont le catalogue contient un paramètre de qualité ; une valeur non prise en charge est refusée. « auto » omet ce paramètre.
response_format"url" | "b64_json"url par défaut. b64_json renvoie le fichier dans le corps de la réponse (jusqu’à 20 MB).
userstringAccepté et ignoré.

Les champs inconnus ainsi que background, style, output_format, output_compression, moderation, stream et partial_images sont refusés avec le code 400, champ par champ, plutôt que d’être ignorés silencieusement — sinon vous paieriez pour une image que vous n’avez pas demandée. Les modèles qui nécessitent une image source (édition, mise à l’échelle, inpainting) ne fonctionnent pas à cette adresse, car il n’est pas possible d’y transmettre une image ; utilisez POST /api/media/generate.

Attente et délai d’expiration

La requête reste ouverte jusqu’à la fin de la tâche, pendant 300 secondes au maximum. Le temps médian est de 15 à 85 secondes selon le modèle ; les générations individuelles sur les modèles les plus lents prennent 3–4 minutes. Définissez le délai d’expiration de votre client à au moins 300 secondes (la valeur par défaut du SDK OpenAI est de 600).

  • Chaque réponse, y compris les erreurs survenant après la création de la tâche, contient l’en-tête x-pv-media-job-id avec l’id de la tâche.
  • Si la tâche n’est pas terminée dans les 300 secondes, la réponse est 504 avec cause: image_generation_timeout et l’id de la tâche dans le message. La génération continue de s’exécuter : récupérez-la depuis GET /api/media/jobs/{id}.
  • Si la connexion est interrompue (délai d’expiration de l’application, réseau), la tâche est tout de même menée à son terme. GET /v1/images/generations?limit=20 (jusqu’à 100) répertorie les images récentes de cette clé avec leur statut, leurs liens et le montant facturé cost_rub.

Facturation

Rien n’est facturé lors de la soumission. Seule une génération terminée avec succès est facturée, au même prix que dans /api/media-catalog et dans le devis POST /api/media/price. Une génération échouée renvoie 502 en indiquant « Rien n’a été facturé » et ne coûte rien. Le montant facturé est renvoyé dans l’en-tête x-pv-cost-rub. Si le solde ne permet pas de couvrir la génération, la réponse est 402 avant le démarrage de toute tâche.

Les liens de data[].url pointent vers notre domaine et restent actifs pendant 7 jours après la fin de la génération, puis renvoient 410 media_result_expired. Enregistrez les fichiers de votre côté.

Erreurs

ParamètreTypeDescription
400invalid_request_errorInvalid body: unknown_parameter, unsupported_parameter, unsupported_n, unsupported_size, unsupported_quality, unsupported_model_kind. Fix the request.
401 / 403authentication_error / permission_errorClé non valide ou IP appelante ne figurant pas dans la liste d’autorisation de la clé.
402insufficient_quotaSolde insuffisant pour cette génération. Aucune tâche n’a été créée.
404not_found_errormodel_not_found — aucun modèle d’image de ce nom. Consultez /api/media-catalog.
429rate_limit_errorLimite de débit multimédia ; réessayez après Retry-After.
502upstream_errorLa génération a échoué. Rien n’a été facturé ; vous pouvez réessayer.
503upstream_errorLe modèle est actuellement indisponible chez tous les fournisseurs. Aucune tâche n’a été créée ; réessayez plus tard ou choisissez un autre modèle.
504upstream_errorimage_generation_timeout — la tâche est toujours en cours d’exécution ; récupérez-la à l’aide de l’identifiant indiqué dans x-pv-media-job-id.

Applications de bureau (Cherry Studio et autres)

Toute application capable de générer des images via un fournisseur compatible avec OpenAI fonctionne. Exemple avec Cherry Studio :

  1. Ajoutez un fournisseur de type OpenAI avec l’adresse d’API https://getvibeapi.com (l’application ajoute elle-même /v1) et votre clé sk-pv-….
  2. Ajoutez le modèle manuellement, en utilisant un id de https://getvibeapi.com/api/media-catalog (uniquement les entrées avec kind: "image"), par exemple nano-banana ou gpt-image-2. La liste des modèles de l’application affiche les modèles de texte ; les modèles multimédias n’y figurent pas.
  3. Générez l’image depuis la fonctionnalité de dessin / de génération d’images de l’application, et non depuis le chat ordinaire. Le chat envoie la requête à /v1/chat/completions, où les modèles d’image ne fonctionnent pas.
  4. Si l’application vous permet de définir un délai d’expiration de la requête, définissez-le à au moins 300 secondes. Une image abandonnée par l’application est répertoriée à GET /v1/images/generations. Relancer depuis l’application crée une nouvelle génération, facturée séparément.

Le mode qui modifie une image téléversée dans de telles applications s’appelle /v1/images/edits ; il est également pris en charge (voir ci-dessous).

Editing: /v1/images/edits

POST /v1/images/edits prend en charge la requête du SDK OpenAI (multipart/form-data : le fichier dans image, ou plusieurs fichiers dans image[], avec prompt, model, size, quality et response_format) ou le JSON avec images: [{"image_url": "…"}]. Il fonctionne comme la génération ci-dessus : la même réponse, le même délai d’attente, les mêmes x-pv-media-job-id et le même prix que POST /api/media/generate avec une image source ; une modification échouée n’est pas facturée. Le mode de modification du modèle est sélectionné dans le catalogue. Un mask est refusé avec 400 unsupported_parameter, et un modèle qui n’accepte aucune image source avec model_cannot_edit. Pour une modification masquée, utilisez POST /api/media/generate et interrogez GET /api/media/jobs/{id} — consultez le guide de génération asynchrone. Les vidéos ne sont pas générées de manière synchrone : /v1/video/generations et /v1/videos renvoient également 410 (détails).

Identifiant Nano Banana Pro

Dans le catalogue et dans tout nouveau code, utilisez nano-banana-pro. Pour migrer des clients asynchrones existants, la valeur gemini-3-pro-image est encore acceptée uniquement dans le champ model de la requête /api/media/generate et correspond au même modèle public. Elle n’est pas publiée dans la découverte ni dans les tarifs.

Génération d’images avec GetVibe API — Images API compatible avec OpenAI | GetVibe API