|
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\d-]", "_", prompt) |
|
return sanitized[:50] |
|
|
|
|
|
def generate_image(api_key, prompt, file_format): |
|
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="1024x1024", |
|
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. Each image generated will be charged at $0.040 per image (1024x1024 resolution, standard quality). |
|
3. For the most up-to-date pricing information, please visit the [OpenAI Pricing Page](https://openai.com/api/pricing/). |
|
4. 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") |
|
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], |
|
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() |
|
|