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

## gpt-image-1 API

OpenAI's `gpt-image-1` image generation API offers both text-to-image generation and image-to-image editing with text guidance capabilities.\
Before using this API, please ensure you have the latest OpenAI package installed by running `pip install -U openai`.

### Important Notes

<Warning>
  * Once an API call is sent, **you will be charged regardless of any interruptions or failures** during the generation process
  * Names of living artists (such as "Hayao Miyazaki", "Makoto Shinkai", etc.) will trigger a `moderation_blocked` error, **causing generation to fail**. You can work around this by using non-sensitive terms like "Ghibli" or "bright modern Japanese anime style" instead. The same applies to images with revealing clothing or suggestive content.
  * Generally, referencing "styles" is safer than naming "artists" - for example, "Pixar" is supported.
  * A more reliable approach is to use deceased artists or their corresponding styles, such as "Van Gogh" or "Mona Lisa"
</Warning>

### Model and Pricing

| 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>
  Note: The input text tokens are billed separately at \$5 per million tokens.
</Info>

### API Usage

**Endpoints**

1. Image generation: `https://aihubmix.com/v1/images/generations`
2. Image editing: `https://aihubmix.com/v1/images/edits`

**Python Examples:**

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

For more parameter details, please refer to the [OpenAI official documentation](https://platform.openai.com/docs/api-reference/images/create)

### Output Examples

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

### Rejection Scenarios

Error message when a request is rejected:

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

When requesting 2-10 images in a single generation, if the system detects that the request violates platform policies, the flagged content will not be generated. This may result in fewer images generated than the number originally requested. however, no `moderation_blocked` error will be thrown in multi-image generation.
Therefore, it’s recommended to proactively avoid potential intellectual property (IP) or copyright issues to minimize the risk of system rejection and ensure smooth generation.

**✍️ Key recommendations:**

* Avoid direct use of copyrighted characters, logos, celebrity likenesses, etc.
* Consider using "style inspiration", "creative reinterpretation", or "generalized descriptions" instead
* If referencing specific elements, check whether they fall within the public domain

### Practical Tips

<Tip>
  * Supports all languages. Chinese text works reliably, though we don't recommend generating large amounts of text in any language
  * The size parameter doesn't support explicitly passing size="auto" - auto is the default
  * Aspect ratios can be specified in the prompt (supports 2:3, 3:2, 1:1) or set via the size parameter
  * The `moderation` parameter controls sensitivity, but even with it set to "low," requests might still be rejected (e.g., if Venus is too revealing)
  * The edits endpoint doesn't support the `moderation` parameter
  * Combining text descriptions with reference images produces more accurate results
  * Compressing uploaded images as pre-processing can improve speed
  * Transparent backgrounds are supported (no need for manual cutouts) — just add this requirement to your prompt
</Tip>
