From 65471d519b87301d14ff47b872792cf17fd4f1ee Mon Sep 17 00:00:00 2001 From: Hitmare Date: Tue, 14 Nov 2023 19:46:55 +0000 Subject: [PATCH] Upload files to "/" --- api.py | 132 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 128 insertions(+), 4 deletions(-) diff --git a/api.py b/api.py index e6edffe..3652d07 100644 --- a/api.py +++ b/api.py @@ -34,6 +34,38 @@ import piexif import piexif.helper from contextlib import closing +''' +Eris Bot API modifier +Eris Promptlog: + Every Prompt that is send from through the API will be saved in a Textfile, with the current date as name, in a folder named "logs" + +Eris Imagelog: + Every generated Images will be saved in the default "outputs" folder + +Eris Consolelog: + Every Prompt that is send from through the API will be displayed in the console/terminal window + +Eris TRTpatch: + Necessary modification for the TRT Plugin to work. + Please refer the Readme on https://nextcloud.hitmare.me/index.php/s/D3BmNDDHRXLdxfL for the full TRTpatch instructions + +Eris Imagelimit: + Will resize every request down to 1024px max on height and width, keeping the aspect ratio. Also reduces Steps down to 35 if the set Steps exceeds 35 + Compatible with the TRTpatch. Please refer the Readme on https://nextcloud.hitmare.me/index.php/s/D3BmNDDHRXLdxfL for the full TRTpatch instructions + + +To activate any modifications, change the "False" to "True". The capital "T" is important +for example: +eris_imagelog = True +''' +# Eris modifier switches + +eris_promtlog = False +eris_imagelog = False +eris_consolelog = False +eris_TRTpatch = False +eris_imagelimit = False + def script_name_to_index(name, scripts): try: @@ -337,6 +369,40 @@ class Api: return script_args def text2imgapi(self, txt2imgreq: models.StableDiffusionTxt2ImgProcessingAPI): + + # Eris TRTpacht + if eris_TRTpatch: + txt2imgreq.width = round(txt2imgreq.width / 64) * 64 + txt2imgreq.height = round(txt2imgreq.height / 64) * 64 + # Eris ______ + + + # Eris imagelimit 1024x1024 35 Steps + if eris_imagelimit: + # Add a check to only resize if the dimensions are larger than 1024 + if txt2imgreq.width > 1024 or txt2imgreq.height > 1024: + # Calculate the aspect ratio + aspect_ratio = txt2imgreq.width / txt2imgreq.height + # Scale down to the maximum allowed dimensions while retaining the aspect ratio + if aspect_ratio > 1: # If the image is wider than it is tall + txt2imgreq.width = 1024 + txt2imgreq.height = round(1024 / aspect_ratio) + else: # If the image is as wide as it is tall or taller + txt2imgreq.height = 1024 + txt2imgreq.width = round(1024 * aspect_ratio) + # Ensure both dimensions are a multiple of 64 (if this is a requirement for your use case) + txt2imgreq.width = round(txt2imgreq.width // 64) * 64 + txt2imgreq.height = round(txt2imgreq.height // 64) * 64 + # Reduce maximum steps + txt2imgreq.steps = min(txt2imgreq.steps, 35) + # Eris ______ + + + + # Eris console prompt log -> writes promts into the console/terminal window + if eris_consolelog: + print('[t2i]', txt2imgreq.width, 'x', txt2imgreq.height, '|', txt2imgreq.prompt) + # Eris ______ script_runner = scripts.scripts_txt2img if not script_runner.scripts: script_runner.initialize_scripts(False) @@ -344,7 +410,10 @@ class Api: if not self.default_script_arg_txt2img: self.default_script_arg_txt2img = self.init_default_script_args(script_runner) selectable_scripts, selectable_script_idx = self.get_selectable_script(txt2imgreq.script_name, script_runner) - + # Eris save generated images -> will be saved in default outputs folder + if eris_imagelog: + txt2imgreq.save_images = True + # Eris ______ populate = txt2imgreq.copy(update={ # Override __init__ params "sampler_name": validate_sampler_name(txt2imgreq.sampler_name or txt2imgreq.sampler_index), "do_not_save_samples": not txt2imgreq.save_images, @@ -362,7 +431,17 @@ class Api: send_images = args.pop('send_images', True) args.pop('save_images', None) - + # Eris Promtlog -> writing daily log file for txt2img into logs folder + if eris_imagelog: + logfolder = "logs" + if not os.path.exists(logfolder): + os.makedirs(logfolder) + apilogtxt2imgfile = open(f"{logfolder}/{datetime.date.today()}-txt2img.txt", "a") + apilogtxt2imgtext = f"[{datetime.datetime.now()}] Prompt: {txt2imgreq.prompt} | Negative prompt: {txt2imgreq.negative_prompt} | Steps: {txt2imgreq.steps} | Size: {txt2imgreq.width}x{txt2imgreq.height} | CFG: {txt2imgreq.cfg_scale}" + #replace newlines and returns to keep the prompt in one line + apilogtxt2imgtext.replace("\n", " ").replace("\r", " ") + apilogtxt2imgfile.write(f"{apilogtxt2imgtext}\n") + # Eris ______ with self.queue_lock: with closing(StableDiffusionProcessingTxt2Img(sd_model=shared.sd_model, **args)) as p: p.is_api = True @@ -387,6 +466,37 @@ class Api: return models.TextToImageResponse(images=b64images, parameters=vars(txt2imgreq), info=processed.js()) def img2imgapi(self, img2imgreq: models.StableDiffusionImg2ImgProcessingAPI): + # Eris TRTpatch + if eris_TRTpatch: + img2imgreq.width = round(img2imgreq.width / 64) * 64 + img2imgreq.height = round(img2imgreq.height / 64) * 64 + # Eris ______ + + # Eris imagelimit 1024x1024 35 Steps + if eris_imagelimit: + # Add a check to only resize if the dimensions are larger than 1024 + if img2imgreq.width > 1024 or img2imgreq.height > 1024: + # Calculate the aspect ratio of the input image + aspect_ratio = img2imgreq.width / img2imgreq.height + # Scale down to the maximum allowed dimensions while retaining the aspect ratio + if aspect_ratio > 1: # If the image is wider than it is tall + img2imgreq.width = 1024 + img2imgreq.height = round(1024 / aspect_ratio) + else: # If the image is as wide as it is tall or taller + img2imgreq.height = 1024 + img2imgreq.width = round(1024 * aspect_ratio) + # Ensure both dimensions are a multiple of 64 (if this is a requirement for your use case) + img2imgreq.width = round(img2imgreq.width / 64) * 64 + img2imgreq.height = round(img2imgreq.height / 64) * 64 + # Reduce maximum steps + img2imgreq.steps = min(img2imgreq.steps, 35) + # Eris ______ + + # Eris console prompt log -> writes promts into the console/terminal window + if eris_consolelog: + print('[i2i]', img2imgreq.width, 'x', img2imgreq.height, '|', img2imgreq.prompt) + # Eris ______ + init_images = img2imgreq.init_images if init_images is None: raise HTTPException(status_code=404, detail="Init image not found") @@ -402,7 +512,10 @@ class Api: if not self.default_script_arg_img2img: self.default_script_arg_img2img = self.init_default_script_args(script_runner) selectable_scripts, selectable_script_idx = self.get_selectable_script(img2imgreq.script_name, script_runner) - + # Eris save generated images -> will be saved in default outputs folder + if eris_imagelog: + img2imgreq.save_images = True + # Eris ______ populate = img2imgreq.copy(update={ # Override __init__ params "sampler_name": validate_sampler_name(img2imgreq.sampler_name or img2imgreq.sampler_index), "do_not_save_samples": not img2imgreq.save_images, @@ -422,7 +535,18 @@ class Api: send_images = args.pop('send_images', True) args.pop('save_images', None) - + # Eris Promtlog -> writing daily log file for txt2img into logs folder + if eris_promtlog: + logfolder = "logs" + if not os.path.exists(logfolder): + os.makedirs(logfolder) + apilogimg2imgfile = open(f"{logfolder}/{datetime.date.today()}-img2img.txt", "a") + apilogimg2imgtext = f"[{datetime.datetime.now()}] Prompt: {img2imgreq.prompt} | Negative prompt: {img2imgreq.negative_prompt} | Steps: {img2imgreq.steps} | Size: {img2imgreq.width}x{img2imgreq.height} | CFG: {img2imgreq.cfg_scale} | Denoising: {img2imgreq.denoising_strength}" + #replace newlines and returns to keep the prompt in one line + apilogimg2imgtext.replace("\n", " ").replace("\r", " ") + apilogimg2imgfile.write(f"{apilogimg2imgtext}\n") + # Eris ______ + with self.queue_lock: with closing(StableDiffusionProcessingImg2Img(sd_model=shared.sd_model, **args)) as p: p.init_images = [decode_base64_to_image(x) for x in init_images]