> ## Documentation Index
> Fetch the complete documentation index at: https://docs.aihubmix.com/llms.txt
> Use this file to discover all available pages before exploring further.

# GPT Image

## API gpt-image-1

L'API de génération d'images `gpt-image-1` d'OpenAI propose à la fois la génération texte-vers-image et l'édition image-vers-image guidée par texte.\
Avant d'utiliser cette API, assurez-vous d'avoir installé la dernière version du package OpenAI en exécutant `pip install -U openai`.

### Remarques importantes

<Warning>
  * Une fois un appel API envoyé, **vous serez facturé indépendamment des interruptions ou échecs** pendant le processus de génération
  * Le nom d'artistes vivants (comme « Hayao Miyazaki », « Makoto Shinkai », etc.) déclenchera une erreur `moderation_blocked`, **provoquant l'échec de la génération**. Vous pouvez contourner cela en utilisant des termes non sensibles comme « Ghibli » ou « style anime japonais moderne lumineux » à la place. Il en va de même pour les images aux vêtements révélateurs ou au contenu suggestif.
  * En général, référencer un « style » est plus sûr que nommer un « artiste » — par exemple, « Pixar » est pris en charge.
  * Une approche plus fiable consiste à utiliser des artistes décédés ou leurs styles correspondants, comme « Van Gogh » ou « Mona Lisa »
</Warning>

### Modèle et tarification

| Modèle      | Qualité | 1024x1024 | 1024x1536 | 1536x1024 |
| ----------- | ------- | --------- | --------- | --------- |
| gpt-image-1 | low     | \$0.011   | \$0.016   | \$0.016   |
| gpt-image-1 | medium  | \$0.042   | \$0.063   | \$0.063   |
| gpt-image-1 | high    | \$0.167   | \$0.25    | \$0.25    |

<Info>
  Remarque : les jetons de texte d'entrée sont facturés séparément à \$5 par million de jetons.
</Info>

### Utilisation de l'API

**Endpoints**

1. Génération d'images : `https://aihubmix.com/v1/images/generations`
2. Édition d'images : `https://aihubmix.com/v1/images/edits`

**Exemples Python :**

<CodeGroup>
  ```py Generation (Text-to-Image) theme={null}
  from openai import OpenAI
  import base64
  import os

  client = OpenAI(
      api_key="AIHUBMIX_API_KEY", # Replace with your AIHUBMIX Key "sk-***"
      base_url="https://aihubmix.com/v1"
  )

  prompt = """redesign poster of the movie [Black Swan], 3D cartoon, smooth render, bright tone, 2:3 portrait."""

  result = client.images.generate(
      model="gpt-image-1",
      prompt=prompt,
      n=1, # Number of images to generate, maximum 10
      size="1024x1536", # 1024x1024 (square), 1536x1024 (3:2 landscape), 1024x1536 (2:3 portrait), auto (default) 
      quality="high", # high, medium, low, auto (default)
      moderation="low", # low, auto (default) - requires updated openai package 📍
      background="auto", # transparent, opaque, auto (default)
  )

  print(result.usage)

  # Define file name prefix and save directory
  output_dir = "." # You can specify another directory
  file_prefix = "image_gen"

  # Ensure output directory exists
  os.makedirs(output_dir, exist_ok=True)

  # Iterate through all returned image data
  for i, image_data in enumerate(result.data):
      image_base64 = image_data.b64_json
      if image_base64: # Ensure b64_json is not empty
          image_bytes = base64.b64decode(image_base64)

          # --- Handle filename conflict logic ---
          current_index = i
          while True:
              # Create filename with incremental counter
              file_name = f"{file_prefix}_{current_index}.png"
              file_path = os.path.join(output_dir, file_name) # Build complete file path

              # Check if file exists
              if not os.path.exists(file_path):
                  break # No filename conflict, exit loop

              # Filename conflict, increment counter
              current_index += 1

          # Save image to file using unique file_path
          with open(file_path, "wb") as f:
              f.write(image_bytes)
          print(f"Image saved to: {file_path}")
      else:
          print(f"Image data for index {i} is empty, skipping save.")
  ```

  ```py Editing (Image+Text to Image) theme={null}
  from openai import OpenAI
  import base64
  import os

  client = OpenAI(
      api_key="AIHUBMIX_API_KEY", # Replace with your AIHUBMIX Key "sk-***"
      base_url="https://aihubmix.com/v1"
  )

  prompt = """redesign poster of the movie [Black Swan], 3D cartoon, smooth render, bright tone, 2:3 portrait."""

  result = client.images.edit(
      model="gpt-image-1",
      image=open("yourpath/edit.jpg", "rb"), # For multiple reference images, use a [list,]
      n=2, # Number of images to generate
      prompt=prompt,
      size="1024x1536", # 1024x1024 (square), 1536x1024 (3:2 landscape), 1024x1536 (2:3 portrait), auto (default)
      input_fidelity="high", # "low" as default
      # moderation="low", # editing doesn't support moderation
      quality="high" # high, medium, low, auto (default)
  )

  print(result.usage)

  # Define file name prefix and save directory
  output_dir = "." # You can specify another directory
  file_prefix = "image_edit" # Modify file name prefix

  # Ensure output directory exists
  os.makedirs(output_dir, exist_ok=True)

  # --- Iterate through each image returned by the API ---
  for i, image_item in enumerate(result.data):
      image_base64 = image_item.b64_json
      if image_base64 is None:
          print(f"Warning: Image {i+1} has no base64 data, skipping save.")
          continue # If no b64_json data, skip to next image

      image_bytes = base64.b64decode(image_base64)

      # --- Find non-conflicting filename for current image ---
      current_index = 0 # Start checking from 0, or maintain a globally incrementing index
      while True:
          # Create filename with incremental counter
          file_name = f"{file_prefix}_{current_index}.png"
          file_path = os.path.join(output_dir, file_name) # Build complete file path

          # Check if file exists
          if not os.path.exists(file_path):
              break # No filename conflict, exit inner loop

          # Filename conflict, increment counter
          current_index += 1

      # Save current image to file using unique file_path
      try:
          with open(file_path, "wb") as f:
              f.write(image_bytes)
          print(f"Edited image {i+1} saved to: {file_path}")
      except Exception as e:
          print(f"Error saving image {i+1} ({file_path}): {e}")
  ```
</CodeGroup>

Pour plus de détails sur les paramètres, consultez la [documentation officielle d'OpenAI](https://platform.openai.com/docs/api-reference/images/create)

### Exemples de sortie

<CodeGroup>
  ```json Generation theme={null}
  Usage(input_tokens=150, input_tokens_details=UsageInputTokensDetails(image_tokens=0, text_tokens=150), output_tokens=6240, total_tokens=6390)
  Image saved to: ./image_gen_14.png
  ```

  ```json Editing theme={null}
  Usage(input_tokens=992, input_tokens_details=UsageInputTokensDetails(image_tokens=646, text_tokens=346), output_tokens=12480, total_tokens=13472)
  Edited image 1 saved to: ./image_edit_1.png
  Edited image 2 saved to: ./image_edit_2.png
  ```
</CodeGroup>

### Scénarios de rejet

Message d'erreur lorsqu'une requête est rejetée :

```json theme={null}
Error code: 400 - {'error': {'message': 'Your request was rejected as a result of our safety system. Your request may contain content that is not allowed by our safety system.', 'type': 'user_error', 'param': None, 'code': 'moderation_blocked'}}
```

Lors d'une requête de génération de 2 à 10 images, si le système détecte que la requête enfreint les politiques de la plateforme, le contenu signalé ne sera pas généré. Cela peut entraîner un nombre d'images générées inférieur au nombre demandé initialement ; toutefois, aucune erreur `moderation_blocked` ne sera levée lors de la génération multi-images.
Il est donc recommandé d'éviter proactivement les éventuels problèmes de propriété intellectuelle (PI) ou de droits d'auteur pour minimiser le risque de rejet par le système et garantir une génération fluide.

**✍️ Recommandations clés :**

* Évitez l'utilisation directe de personnages protégés par le droit d'auteur, de logos, de ressemblances de célébrités, etc.
* Privilégiez l'« inspiration stylistique », la « réinterprétation créative » ou des « descriptions généralisées »
* Si vous référencez des éléments spécifiques, vérifiez s'ils relèvent du domaine public

### Conseils pratiques

<Tip>
  * Prend en charge toutes les langues. Le texte chinois fonctionne de manière fiable, bien que nous ne recommandions pas de générer de grandes quantités de texte dans n'importe quelle langue
  * Le paramètre size ne prend pas en charge le passage explicite de size="auto" — auto est la valeur par défaut
  * Les rapports d'aspect peuvent être spécifiés dans le prompt (prend en charge 2:3, 3:2, 1:1) ou définis via le paramètre size
  * Le paramètre `moderation` contrôle la sensibilité, mais même réglé sur « low », les requêtes peuvent toujours être rejetées (par exemple, si Vénus est trop dénudée)
  * L'endpoint edits ne prend pas en charge le paramètre `moderation`
  * Combiner des descriptions textuelles avec des images de référence produit des résultats plus précis
  * Compresser les images téléversées en pré-traitement peut améliorer la vitesse
  * Les arrière-plans transparents sont pris en charge (pas besoin de détourer manuellement) — ajoutez simplement cette exigence dans votre prompt
</Tip>
