Images API
Deux endpoints : génération (texte → image), édition (image + texte → image). Les réponses suivent toutes la structure standard OpenAI data[0].b64_json.
| Ce que vous voulez faire | Endpoint | Modèles pris en charge |
|---|---|---|
| Générer une image à partir de texte | POST /v1/images/generations | openai/gpt-image-2, google/gemini-3.1-flash-image, bailian/qwen-image-3.0-pro |
| Téléverser une image et la modifier via une consigne | POST /v1/images/edits | OpenAI / Azure uniquement : openai/gpt-image-2, openai/gpt-image-1.5 |
Deux exceptions pour l’image-vers-image : la série Qwen passe par le champ input_images de generations, et non par edits ; la série Gemini ne peut éditer sur aucun des deux endpoints de cette page — utilisez le protocole natif Gemini.
Épingler un fournisseur
provider.type épingle la requête à un fournisseur. Cela n’a de sens que pour les modèles servis par plusieurs d’entre eux — aujourd’hui openai/gpt-image-2 (azure_foundry et openai). Désigner un fournisseur qui ne sert pas le modèle renvoie 400 provider_type_unavailable.
| Fournisseur | Description | Modération du contenu |
|---|---|---|
azure_foundry | Hébergé sur Microsoft Azure | Plus stricte |
openai | API officielle d’OpenAI | Plus permissive |
Les deux fournisseurs d’openai/gpt-image-2 n’appliquent pas la même sévérité : azure_foundry est plus stricte, openai plus permissive. Épinglez explicitement provider.type: "openai" si une invite est refusée à répétition — sans cela, la répartition pondérée peut vous placer sur azure_foundry.
Référence complète : API · Routage des fournisseurs.
Texte vers image — /v1/images/generations
/v1/images/generations reçoit un corps JSON : le champ du corps comme l’en-tête fonctionnent.
Python
resp = client.images.generate(
model="openai/gpt-image-2",
prompt="A simple red apple on a white table",
size="1024x1024",
extra_body={"extra_body": {"provider": {"type": "openai"}}},
)Avec les SDK OpenAI officiels, extra_body doit être présent comme clé littérale dans le corps de la requête. Le SDK TypeScript l’envoie tel qu’il est écrit dans l’objet de paramètres. L’argument extra_body= du SDK Python fusionne son contenu à la racine du corps : la clé doit donc être imbriquée un niveau plus profond, ou transmise via un en-tête.
Édition d’image — /v1/images/edits
/v1/images/edits est un envoi multipart — il n’y a pas de corps JSON où imbriquer extra_body, donc seul l’en-tête fonctionne ici. Passer extra_body en champ de formulaire est ignoré et la requête part sans contrainte.
curl https://api.ofox.io/v1/images/edits \
-H "Authorization: Bearer $OFOX_API_KEY" \
-H "X-OfoxAI-Provider-Type: openai" \
-F "model=openai/gpt-image-2" \
-F "prompt=..." \
-F "image=@input.png"Sur /v1/images/edits, un extra_body envoyé en champ de formulaire est ignoré silencieusement — l’image est générée sans la contrainte. Utilisez X-OfoxAI-Provider-Type.
Générer des images
POST https://api.ofox.io/v1/images/generationsParamètres
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
model | string | ✅ | openai/gpt-image-2, google/gemini-3.1-flash-image, bailian/qwen-image-3.0-pro |
prompt | string | ✅ | Description en langage naturel |
quality | string | ✅ | auto / low / medium / high / standard / hd |
n | number | — | 1–10, par défaut 1. Non pris en charge par les modèles Gemini |
size | string | — | auto / 1024x1024 / 1536x1024 / 1024x1536 / 256x256 / 512x512 / 1792x1024 / 1024x1792 |
input_images | string[] | — | Tableau d’images de référence (URL ou base64), 1 à 3, pris en charge par les modèles d’images Qwen ; lorsqu’il s’applique, la réponse contient usage.num_input_images |
output_format | string | — | png / jpeg / webp |
background | string | — | transparent / opaque / auto |
stream | boolean | — | Par défaut false |
extra_body.provider.type | string | — | Épingle la requête à un fournisseur. Utile uniquement pour les modèles portés par plusieurs fournisseurs (sur cet endpoint, aujourd’hui openai/gpt-image-2) ; l’en-tête X-OfoxAI-Provider-Type est équivalent |
Réponse
{
"created": 1777385517,
"data": [
{ "b64_json": "<Image en Base64>", "index": 0 }
],
"model": "openai/gpt-image-2",
"size": "1024x1024",
"quality": "low",
"usage": {
"input_tokens": 14,
"input_tokens_details": { "text_tokens": 14 },
"output_tokens": 208,
"total_tokens": 222
}
}L’image se trouve dans data[0].b64_json ; décodez-la en base64 puis enregistrez-la.
Série OpenAI (gpt-image-2)
Python
import base64
from openai import OpenAI
client = OpenAI(api_key="YOUR_OFOX_API_KEY", base_url="https://api.ofox.io/v1")
resp = client.images.generate(
model="openai/gpt-image-2",
prompt="A simple red apple on a white table",
size="1024x1024",
quality="low",
output_format="png",
# Optionnel : épingler un fournisseur. Sans ce champ, la plateforme route pour vous
# extra_body={"extra_body": {"provider": {"type": "openai"}}},
)
with open("output.png", "wb") as f:
f.write(base64.b64decode(resp.data[0].b64_json))Résultat réel :

Série Gemini (gemini-3.1-flash-image)
Le même endpoint accepte également les modèles d’images Gemini. Ne passez pas n — la passerelle mappe par erreur n vers le champ numberOfImages et renvoie 400. Une seule image est générée à chaque appel.
Python
import base64
from openai import OpenAI
client = OpenAI(api_key="YOUR_OFOX_API_KEY", base_url="https://api.ofox.io/v1")
resp = client.images.generate(
model="google/gemini-3.1-flash-image",
prompt="A simple red apple on a white table, photorealistic",
size="1024x1024",
quality="low",
output_format="png",
)
with open("output.png", "wb") as f:
f.write(base64.b64decode(resp.data[0].b64_json))Résultat réel :

Série Qwen (qwen-image-3.0-pro)
Les modèles d’images Qwen comme bailian/qwen-image-3.0-pro acceptent des images de référence pour l’image-vers-image et l’édition directement sur cet endpoint (1 à 3 images), via le champ input_images (chaque élément est une URL d’image ou une chaîne base64) :
curl -X POST 'https://api.ofox.io/v1/images/generations' \
-H 'Authorization: Bearer YOUR_OFOX_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"model": "bailian/qwen-image-3.0-pro",
"prompt": "Rends la pomme bleue, laisse le reste inchangé",
"size": "1024x1024",
"input_images": ["https://example.com/ref-apple.png"]
}'Lorsque les images de référence sont prises en compte, la réponse usage contient num_input_images (le nombre d’images en entrée) — de quoi vérifier par programme que le modèle les a bien lues.
Le champ doit s’appeler input_images. Les autres graphies comme image_urls, image ou images sont silencieusement ignorées et la requête se réduit à du texte-vers-image (le HTTP reste 200).
Éditer des images
POST https://api.ofox.io/v1/images/editsmultipart/form-data, vous devez téléverser un fichier image.
Cet endpoint ne prend en charge que les modèles OpenAI / Azure OpenAI. Un appel avec google/gemini-3.1-flash-image renverra Image editing is not supported for model — passez plutôt par l’édition d’images via le protocole natif Gemini.
Paramètres
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
model | string | ✅ | Recommandé : openai/gpt-image-2 |
image | file | ✅ | Fichier PNG / JPEG |
prompt | string | ✅ | Instruction d’édition |
quality | string | ✅ | low / medium / high |
n | number | — | Par défaut 1 |
size | string | — | auto correspond à la taille originale |
X-OfoxAI-Provider-Type | en-tête | — | Épingle la requête à un fournisseur. Cet endpoint est un envoi multipart : seul l’en-tête fonctionne, un champ de formulaire extra_body est silencieusement ignoré |
Réponse
Identique à la génération :
{
"created": 1777385669,
"data": [
{ "b64_json": "<Image éditée en Base64>", "index": 0 }
],
"model": "openai/gpt-image-2",
"size": "auto",
"quality": "low",
"usage": {
"input_tokens": 1041,
"input_tokens_details": { "image_tokens": 1024, "text_tokens": 17 },
"num_input_images": 1,
"output_tokens": 358,
"total_tokens": 1399
}
}usage.input_tokens_details.image_tokens correspond aux tokens consommés par l’image en entrée et num_input_images au nombre d’images en entrée.
Pour les modèles pris en charge et leurs tarifs, consultez le catalogue des modèles .
Appel
Python
import base64
from openai import OpenAI
client = OpenAI(api_key="YOUR_OFOX_API_KEY", base_url="https://api.ofox.io/v1")
with open("apple.png", "rb") as f:
resp = client.images.edit(
model="openai/gpt-image-2",
image=f,
prompt="Change la pomme en vert, ne touche à rien d'autre",
size="auto",
quality="low",
# Optionnel : épingler un fournisseur. Cet endpoint est multipart, seul l'en-tête fonctionne
# extra_headers={"X-OfoxAI-Provider-Type": "openai"},
)
with open("apple_edited.png", "wb") as out:
out.write(base64.b64decode(resp.data[0].b64_json))Le champ image attend un chemin de fichier local (préfixe @ en cURL), pas une URL.
Comparaison réelle :
| Image originale | Après édition |
|---|---|
![]() | ![]() |
