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

A API de geração de imagens `gpt-image-1` da OpenAI oferece tanto geração text-to-image quanto edição image-to-image com capacidades de orientação por texto.\
Antes de usar esta API, certifique-se de ter o pacote OpenAI mais recente instalado executando `pip install -U openai`.

### Observações Importantes

<Warning>
  * Uma vez que uma chamada da API é enviada, **você será cobrado independentemente de quaisquer interrupções ou falhas** durante o processo de geração
  * Nomes de artistas vivos (como "Hayao Miyazaki", "Makoto Shinkai", etc.) acionarão um erro `moderation_blocked`, **causando falha na geração**. Você pode contornar isso usando termos não sensíveis como "Ghibli" ou "estilo anime japonês moderno brilhante". O mesmo se aplica a imagens com roupas reveladoras ou conteúdo sugestivo.
  * Geralmente, referenciar "estilos" é mais seguro do que nomear "artistas" - por exemplo, "Pixar" é suportado.
  * Uma abordagem mais confiável é usar artistas falecidos ou seus estilos correspondentes, como "Van Gogh" ou "Mona Lisa"
</Warning>

### Modelo e Preços

| Model       | Quality | 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>
  Observação: Os tokens de texto de entrada são cobrados separadamente a \$5 por milhão de tokens.
</Info>

### Uso da API

**Endpoints**

1. Geração de imagem: `https://aihubmix.com/v1/images/generations`
2. Edição de imagem: `https://aihubmix.com/v1/images/edits`

**Exemplos em 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 mais detalhes sobre os parâmetros, consulte a [documentação oficial da OpenAI](https://platform.openai.com/docs/api-reference/images/create)

### Exemplos de Saída

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

### Cenários de Rejeição

Mensagem de erro quando uma requisição é rejeitada:

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

Ao solicitar 2-10 imagens em uma única geração, se o sistema detectar que a requisição viola as políticas da plataforma, o conteúdo sinalizado não será gerado. Isso pode resultar em menos imagens geradas do que o número originalmente solicitado. Não entanto, nenhum erro `moderation_blocked` será lançado na geração de múltiplas imagens.
Portanto, recomenda-se evitar proativamente possíveis problemas de propriedade intelectual (PI) ou direitos autorais para minimizar o risco de rejeição do sistema e garantir uma geração tranquila.

**✍️ Recomendações principais:**

* Evite o uso direto de personagens com direitos autorais, logos, semelhanças de celebridades, etc.
* Considere usar "inspiração de estilo", "reinterpretação criativa" ou "descrições generalizadas" em vez disso
* Se referenciar elementos específicos, verifique se eles estão em domínio público

### Dicas Práticas

<Tip>
  * Suporta todos os idiomas. Texto em chinês funciona de forma confiável, mas não recomendamos gerar grandes quantidades de texto em qualquer idioma
  * O parâmetro size não suporta passar explicitamente size="auto" - auto é o padrão
  * As proporções podem ser especificadas no prompt (suporta 2:3, 3:2, 1:1) ou definidas via parâmetro size
  * O parâmetro `moderation` controla a sensibilidade, mas mesmo definido como "low", requisições ainda podem ser rejeitadas (por exemplo, se a Vênus estiver muito reveladora)
  * O endpoint de edits não suporta o parâmetro `moderation`
  * Combinar descrições de texto com imagens de referência produz resultados mais precisos
  * Comprimir imagens enviadas como pré-processamento pode melhorar a velocidade
  * Fundos transparentes são suportados (sem necessidade de recortes manuais) — basta adicionar este requisito ao seu prompt
</Tip>
