> ## 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

La API de generación de imágenes `gpt-image-1` de OpenAI ofrece tanto generación de texto a imagen como capacidades de edición de imagen a imagen guiadas por texto.\
Antes de usar esta API, asegúrate de tener instalado el paquete más reciente de OpenAI ejecutando `pip install -U openai`.

### Notas importantes

<Warning>
  * Una vez enviada la llamada a la API, **se te cobrará independientemente de cualquier interrupción o fallo** durante el proceso de generación
  * Los nombres de artistas vivos (como "Hayao Miyazaki", "Makoto Shinkai", etc.) activarán el error `moderation_blocked`, **provocando el fallo de la generación**. Puedes evitarlo utilizando términos no sensibles como "estilo Ghibli" o "estilo de anime japonés moderno y luminoso". Lo mismo ocurre con imágenes que muestren ropa reveladora o contenido sugerente.
  * En general, referirse a "estilos" es más seguro que nombrar a "artistas"; por ejemplo, "Pixar" está admitido.
  * Un enfoque más fiable es utilizar artistas fallecidos o sus estilos correspondientes, como "Van Gogh" o "Mona Lisa"
</Warning>

### Modelo y precios

| Modelo      | Calidad | 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>
  Nota: Los tokens del texto de entrada se facturan por separado a \$5 por millón de tokens.
</Info>

### Uso de la API

**Endpoints**

1. Generación de imágenes: `https://aihubmix.com/v1/images/generations`
2. Edición de imágenes: `https://aihubmix.com/v1/images/edits`

**Ejemplos en 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>

Para más detalles de parámetros, consulta la [documentación oficial de OpenAI](https://platform.openai.com/docs/api-reference/images/create).

### Ejemplos de salida

<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>

### Escenarios de rechazo

Mensaje de error cuando se rechaza una solicitud:

```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'}}
```

Al solicitar de 2 a 10 imágenes en una única generación, si el sistema detecta que la solicitud infringe las políticas de la plataforma, el contenido marcado no se generará. Esto puede resultar en menos imágenes generadas de las solicitadas originalmente; sin embargo, no se lanzará un error `moderation_blocked` en la generación multi-imagen.
Por ello, se recomienda evitar de forma proactiva posibles problemas de propiedad intelectual (IP) o de derechos de autor para minimizar el riesgo de rechazo y asegurar una generación fluida.

**✍️ Recomendaciones clave:**

* Evita el uso directo de personajes con derechos de autor, logotipos, parecidos de famosos, etc.
* Considera utilizar "inspiración de estilo", "reinterpretación creativa" o "descripciones generalizadas"
* Si haces referencia a elementos específicos, verifica si están dentro del dominio público

### Consejos prácticos

<Tip>
  * Compatible con todos los idiomas. El texto en chino funciona de forma fiable, aunque no recomendamos generar grandes cantidades de texto en ningún idioma
  * El parámetro size no admite pasar explícitamente size="auto" — auto es el valor predeterminado
  * Las relaciones de aspecto pueden especificarse en el prompt (admite 2:3, 3:2, 1:1) o establecerse mediante el parámetro size
  * El parámetro `moderation` controla la sensibilidad, pero incluso con él configurado en "low", las solicitudes pueden seguir siendo rechazadas (por ejemplo, si Venus aparece demasiado descubierta)
  * El endpoint de edits no admite el parámetro `moderation`
  * Combinar descripciones de texto con imágenes de referencia produce resultados más precisos
  * Comprimir las imágenes subidas como paso previo puede mejorar la velocidad
  * Se admiten fondos transparentes (sin necesidad de recortes manuales): basta con añadir este requisito a tu prompt
</Tip>
