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

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

  • 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