schroneko's picture
fix
398b4b3
import gradio as gr
from openai import OpenAI
from PIL import Image
import requests
from io import BytesIO
import logging
import re
import os
logging.basicConfig(level=logging.INFO)
def sanitize_filename(prompt):
sanitized = re.sub(r"[^\w\-]", "_", prompt)
sanitized = re.sub(r"_+", "_", sanitized)
sanitized = sanitized.strip("_")
return sanitized[:50]
def generate_image(api_key, prompt, file_format, image_size):
if not api_key:
raise gr.Error("API key is required. Please enter your OpenAI API key.")
if not prompt or prompt.strip() == "":
raise gr.Error(
"Prompt cannot be empty. Please enter a description for the image you want to generate."
)
client = OpenAI(api_key=api_key)
try:
logging.info(f"Attempting to generate image with prompt: {prompt}")
response = client.images.generate(
model="dall-e-3",
prompt=prompt,
size=image_size,
quality="standard",
n=1,
)
logging.info("API call successful")
image_url = response.data[0].url
logging.info(f"Image URL received: {image_url}")
image_response = requests.get(image_url)
img = Image.open(BytesIO(image_response.content))
filename = f"{sanitize_filename(prompt)}.{file_format}"
img_path = os.path.join("output", filename)
os.makedirs("output", exist_ok=True)
img.save(img_path, format=file_format.upper())
logging.info(f"Image successfully generated and saved as {img_path}")
return img_path
except Exception as e:
logging.error(f"Error occurred: {str(e)}")
if "invalid_api_key" in str(e):
raise gr.Error(
"Invalid API key. Please check your OpenAI API key and try again."
)
else:
raise gr.Error(f"An error occurred: {str(e)}")
with gr.Blocks() as demo:
gr.Markdown("""
# DALL-E 3 Image Generation
Generate images using OpenAI's DALL-E 3 model.
**Important:** You need an OpenAI API key to use this application. You can obtain one from [https://platform.openai.com/api-keys](https://platform.openai.com/api-keys).
**Warning:** Your API key is sensitive information. This application does not store your key, but please handle it with care and do not share it with others.
**Please Note:**
1. Image generation typically takes around 30 seconds per image.
2. Pricing varies based on image size. For the most up-to-date pricing information, please visit the [OpenAI Pricing Page](https://openai.com/api/pricing/).
3. We are not responsible for any failures in image generation. Use this application at your own risk.
""")
with gr.Row():
with gr.Column(scale=1):
api_key_input = gr.Textbox(label="OpenAI API Key", type="password")
prompt_input = gr.Textbox(
label="Enter your prompt", placeholder="e.g., a white siamese cat"
)
file_format = gr.Radio(["webp", "png"], label="File Format", value="webp")
image_size = gr.Radio(
["1024x1024", "1024x1792", "1792x1024"],
label="Image Size",
value="1024x1024",
)
submit_button = gr.Button("Generate Image")
with gr.Column(scale=1):
image_output = gr.Image(label="Generated Image")
submit_button.click(
generate_image,
inputs=[api_key_input, prompt_input, file_format, image_size],
outputs=image_output,
)
gr.Examples(
examples=[
"A white siamese cat",
"A futuristic cityscape at night",
"A serene mountain lake at sunrise",
"An abstract painting inspired by jazz music",
],
inputs=prompt_input,
)
if __name__ == "__main__":
demo.launch()