initial commit
This commit is contained in:
203
generations.py
Normal file
203
generations.py
Normal file
@@ -0,0 +1,203 @@
|
||||
import argparse
|
||||
import os
|
||||
import sys
|
||||
import webbrowser
|
||||
import tkinter as tk
|
||||
from tkinter import messagebox
|
||||
|
||||
import openai
|
||||
from openai import OpenAI
|
||||
|
||||
def api(prompt, model, n, quality, response_format, size, style, user):
|
||||
OPENAI_API_KEY = os.environ.get('OPENAI_API_KEY')
|
||||
client = OpenAI(api_key=OPENAI_API_KEY)
|
||||
|
||||
response = client.images.generate(
|
||||
prompt=prompt,
|
||||
model=model,
|
||||
n=n,
|
||||
quality=quality,
|
||||
response_format=response_format,
|
||||
size=size,
|
||||
style=style,
|
||||
user=user
|
||||
)
|
||||
return response
|
||||
|
||||
class CLI:
|
||||
def run_cli():
|
||||
parser = argparse.ArgumentParser(description='Generate images using OpenAI.')
|
||||
parser.add_argument('-p', '--prompt', type=str, help='A text description of the desired image.')
|
||||
parser.add_argument('-m', '--model', type=str, default='dall-e-2', choices=['dall-e-2', 'dall-e-3'], help='The model to use for image generation.')
|
||||
parser.add_argument('-n', type=int, default=1, choices=range(1, 11), help='The number of images to generate.')
|
||||
parser.add_argument('-q', '--quality', type=str, default='standard', choices=['standard', 'hd'], help='The quality of the image.')
|
||||
parser.add_argument('-rf', '--response_format', type=str, default='url', choices=['url', 'b64_json'], help='The format in which the images are returned.')
|
||||
parser.add_argument('-s', '--size', type=str, default='1024x1024', choices=['256x256', '512x512', '1024x1024', '1792x1024', '1024x1792'], help='The size of the generated images.')
|
||||
parser.add_argument('-st', '--style', type=str, default='vivid', choices=['vivid', 'natural'], help='The style of the generated images.')
|
||||
parser.add_argument('-u', '--user', type=str, default='', help='A unique identifier representing your end-user.')
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
result = api(
|
||||
args.prompt,
|
||||
args.model,
|
||||
args.n,
|
||||
args.quality,
|
||||
args.response_format,
|
||||
args.size,
|
||||
args.style,
|
||||
args.user
|
||||
)
|
||||
print(result)
|
||||
|
||||
class GUI:
|
||||
def __init__(self, root):
|
||||
self.root = root
|
||||
self.setup_gui()
|
||||
|
||||
def setup_gui(self):
|
||||
self.root.title("OpenAI Image Generator")
|
||||
|
||||
self.root.grid_columnconfigure(1, weight=1)
|
||||
|
||||
self.prompt_text = self.create_text("Prompt:", 0)
|
||||
self.model_var, self.model_option_menu = self.create_option_menu("Model:", "dall-e-2", ["dall-e-2", "dall-e-3"], row=1)
|
||||
self.n_spinbox = self.create_spinbox("Number of Images:", 1, 10, "readonly", 2)
|
||||
self.quality_var, self.quality_option_menu = self.create_option_menu("Quality:", "standard", ["standard", "hd"], row=3)
|
||||
self.response_format_var, self.response_format_option_menu = self.create_option_menu("Response Format:", "url", ["url", "b64_json"], row=4)
|
||||
self.size_var, self.size_option_menu = self.create_option_menu("Size:", "1024x1024", ["256x256", "512x512", "1024x1024", "1024x1792", "1792x1024"], row=5)
|
||||
self.style_var, self.style_option_menu = self.create_option_menu("Style:", "vivid", ["vivid", "natural"], row=6)
|
||||
self.user_entry = self.create_entry("User:", 7)
|
||||
self.generate_button = self.create_button("Generate Image:", self.generate_images, 8)
|
||||
|
||||
self.prompt_text.bind("<KeyRelease>", self.check_prompt)
|
||||
self.model_var.trace_add("write", self.update_gui_based_on_model)
|
||||
|
||||
self.check_prompt()
|
||||
self.update_gui_based_on_model()
|
||||
|
||||
def create_text(self, text, row):
|
||||
tk.Label(self.root, text=text).grid(row=row, column=0, sticky='e')
|
||||
text = tk.Text(self.root, height=10, width=50)
|
||||
text.grid(row=row, column=1, pady=10, sticky='nsew', columnspan=2)
|
||||
return text
|
||||
|
||||
def create_option_menu(self, text, default, options, row):
|
||||
tk.Label(self.root, text=text).grid(row=row, column=0, sticky='e')
|
||||
var = tk.StringVar(value=default)
|
||||
option_menu = tk.OptionMenu(self.root, var, *options)
|
||||
option_menu.grid(row=row, column=1, pady=10, sticky='w')
|
||||
return var, option_menu
|
||||
|
||||
def create_spinbox(self, text, from_, to, state, row):
|
||||
tk.Label(self.root, text=text).grid(row=row, column=0, sticky='e')
|
||||
spinbox = tk.Spinbox(self.root, from_=from_, to=to, state=state, width=15)
|
||||
spinbox.grid(row=row, column=1, pady=10, sticky='w')
|
||||
return spinbox
|
||||
|
||||
def create_entry(self, text, row):
|
||||
tk.Label(self.root, text=text).grid(row=row, column=0, sticky='e')
|
||||
entry = tk.Entry(self.root)
|
||||
entry.grid(row=row, column=1, pady=10, sticky='w')
|
||||
return entry
|
||||
|
||||
def create_button(self, text, command, row):
|
||||
button = tk.Button(self.root, text=text, command=command)
|
||||
button.grid(row=row, column=0, pady=10, columnspan=2)
|
||||
return button
|
||||
|
||||
def check_prompt(self, *event):
|
||||
prompt_content = self.prompt_text.get("1.0", "end-1c").strip()
|
||||
if prompt_content:
|
||||
self.generate_button.config(state=tk.NORMAL)
|
||||
else:
|
||||
self.generate_button.config(state=tk.DISABLED)
|
||||
|
||||
def update_gui_based_on_model(self, *args):
|
||||
model = self.model_var.get()
|
||||
|
||||
model_configs = {
|
||||
"dall-e-2": {
|
||||
"n_values": range(1, 11),
|
||||
"quality": ("standard", ["standard"], ["hd"]),
|
||||
"size": ("1024x1024", ["256x256", "512x512", "1024x1024"], ["1024x1792", "1792x1024"]),
|
||||
"style": ("vivid", ["vivid"], ["natural"]),
|
||||
"response_format": ("url", ["url"], ["b64_json"])
|
||||
},
|
||||
"dall-e-3": {
|
||||
"n_values": (1,),
|
||||
"quality": ("standard", ["hd"], []),
|
||||
"size": ("1024x1024", ["1024x1792", "1792x1024"], ["256x256", "512x512"]),
|
||||
"style": ("vivid", ["natural"], []),
|
||||
"response_format": ("url", ["url"], ["b64_json"])
|
||||
}
|
||||
}
|
||||
|
||||
def apply_config(config_key, config_value):
|
||||
if config_key in ["quality", "size", "style", "response_format"]:
|
||||
var, enabled, disabled = config_value
|
||||
self.__dict__[f"{config_key}_var"].set(var)
|
||||
for option in enabled:
|
||||
self.__dict__[f"{config_key}_option_menu"]['menu'].entryconfig(option, state="normal")
|
||||
for option in disabled:
|
||||
self.__dict__[f"{config_key}_option_menu"]['menu'].entryconfig(option, state="disabled")
|
||||
elif config_key == "n_values":
|
||||
self.n_spinbox.config(values=tuple(config_value))
|
||||
|
||||
config = model_configs.get(model)
|
||||
for key, value in config.items():
|
||||
apply_config(key, value)
|
||||
|
||||
def generate_images(self):
|
||||
try:
|
||||
result = api(
|
||||
self.prompt_text.get("1.0", "end-1c"),
|
||||
self.model_var.get(),
|
||||
int(self.n_spinbox.get()),
|
||||
self.quality_var.get(),
|
||||
self.response_format_var.get(),
|
||||
self.size_var.get(),
|
||||
self.style_var.get(),
|
||||
self.user_entry.get()
|
||||
)
|
||||
|
||||
urls = []
|
||||
revised_prompts = []
|
||||
|
||||
for item in result.data:
|
||||
urls.append(item.url)
|
||||
if hasattr(item, 'revised_prompt') and item.revised_prompt:
|
||||
revised_prompts.append(item.revised_prompt)
|
||||
|
||||
for url in urls:
|
||||
webbrowser.open(url)
|
||||
|
||||
if revised_prompts:
|
||||
all_revised_prompts = "\n\n".join(revised_prompts)
|
||||
messagebox.showinfo("Success", f"Image(s) generated successfully. \n\nRevised prompt(s):\n\n{all_revised_prompts}")
|
||||
else:
|
||||
prompt = self.prompt_text.get("1.0", "end-1c")
|
||||
messagebox.showinfo("Success", f"Image(s) generated successfully.\n\nPrompt:\n\n{prompt}")
|
||||
|
||||
except Exception as e:
|
||||
messagebox.showerror("Error", e)
|
||||
|
||||
def run_gui():
|
||||
root = tk.Tk()
|
||||
GUI(root)
|
||||
root.mainloop()
|
||||
|
||||
def main():
|
||||
if len(sys.argv) > 1:
|
||||
try:
|
||||
CLI.run_cli()
|
||||
except Exception as e:
|
||||
print(f"Failed to start CLI mode: {e}")
|
||||
else:
|
||||
try:
|
||||
GUI.run_gui()
|
||||
except Exception as e:
|
||||
print(f"Failed to start GUI mode: {e}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user