API Overview

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

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

Model and Pricing

ModelQuality1024x10241024x15361536x1024
gpt-image-1low$0.011$0.016$0.016
gpt-image-1medium$0.042$0.063$0.063
gpt-image-1high$0.167$0.25$0.25

Note: The input text tokens are billed separately at $5 per million tokens.

API Usage

Endpoints

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

Python Examples:

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.")

For more parameter details, please refer to the OpenAI official documentation

Output Examples

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

Rejection Scenarios

Error message when a request is rejected:

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

Practical Tips

  • 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