from prodiapy import Custom from prodiapy.util import load from PIL import Image from threading import Thread from utils import image_to_base64 import gradio as gr import gradio_user_history as gr_user_history import os pipe = Custom(os.getenv("PRODIA_API_KEY")) def txt2img(prompt, negative_prompt, model, steps, sampler, cfg_scale, width, height, seed, batch_count, profile: gr.OAuthProfile | None): total_images = [] threads = [] def generate_one_image(): result = pipe.create( "/sd/generate", prompt=prompt, negative_prompt=negative_prompt, model=model, steps=steps, cfg_scale=cfg_scale, sampler=sampler, width=width, height=height, seed=seed ) job = pipe.wait_for(result) total_images.append(job['imageUrl']) for x in range(batch_count): t = Thread(target=generate_one_image) threads.append(t) t.start() for t in threads: t.join() for image in total_images: gr_user_history.save_image(label=prompt, image=Image.open(load(image)), profile=profile) return gr.update(value=total_images, preview=False) def img2img(input_image, denoising, prompt, negative_prompt, model, steps, sampler, cfg_scale, width, height, seed, batch_count): if input_image is None: return total_images = [] threads = [] def generate_one_image(): result = pipe.create( "/sd/transform", imageData=image_to_base64(input_image), denoising_strength=denoising, prompt=prompt, negative_prompt=negative_prompt, model=model, steps=steps, cfg_scale=cfg_scale, sampler=sampler, width=width, height=height, seed=seed ) job = pipe.wait_for(result) total_images.append(job['imageUrl']) for x in range(batch_count): t = Thread(target=generate_one_image) threads.append(t) t.start() for t in threads: t.join() return gr.update(value=total_images, preview=False) def upscale(image, scale, profile: gr.OAuthProfile | None): if image is None: return job = pipe.create( '/upscale', imageData=image_to_base64(image), resize=scale ) image = pipe.wait_for(job)['imageUrl'] gr_user_history.save_image(label=f'upscale by {scale}', image=Image.open(load(image)), profile=profile) return image