Spaces:
Runtime error
Runtime error
| import requests | |
| import io | |
| import base64 | |
| from PIL import Image, PngImagePlugin | |
| from loguru import logger as log | |
| import pathlib | |
| class A1111Client: | |
| def __init__(self, ip="127.0.0.1", port="7860", use_https=False): | |
| protocol = "https://" if use_https else "http://" | |
| self._url = f"{protocol}{ip}:{port}" | |
| self._endpoints = { | |
| "img2img": "/sdapi/v1/img2img", | |
| "samplers": "/sdapi/v1/samplers", | |
| "models": "/sdapi/v1/sd-models", | |
| "loras": "/sdapi/v1/loras", | |
| "extensions": "/sdapi/v1/extensions", | |
| "interrupt": "/sdapi/v1/interrupt", | |
| "image_info": "/sdapi/v1/png-info", | |
| } | |
| def extensions(self): | |
| response = requests.get( | |
| url=f"{self._url}{self._endpoints['extensions']}", | |
| headers={"Content-Type": "application/json"}, | |
| ) | |
| if response.status_code == 200: | |
| r = response.json() | |
| extensions = {extension["name"]: extension["enabled"] for extension in r} | |
| return extensions | |
| else: | |
| log.error( | |
| f"Request failed with code: {response.status_code} {response.json()}" | |
| ) | |
| return None | |
| def loras(self): | |
| response = requests.get( | |
| url=f"{self._url}{self._endpoints['loras']}", | |
| headers={"Content-Type": "application/json"}, | |
| ) | |
| if response.status_code == 200: | |
| r = response.json() | |
| loras = [lora["name"] for lora in r] | |
| return loras | |
| else: | |
| log.error( | |
| f"Request failed with code: {response.status_code} {response.json()}" | |
| ) | |
| return None | |
| def samplers(self): | |
| response = requests.get( | |
| url=f"{self._url}{self._endpoints['samplers']}", | |
| headers={"Content-Type": "application/json"}, | |
| ) | |
| if response.status_code == 200: | |
| r = response.json() | |
| samplers = [sampler["name"] for sampler in r] | |
| return samplers | |
| else: | |
| log.error( | |
| f"Request failed with code: {response.status_code} {response.json()}" | |
| ) | |
| return None | |
| def models(self): | |
| response = requests.get( | |
| url=f"{self._url}{self._endpoints['models']}", | |
| headers={"Content-Type": "application/json"}, | |
| ) | |
| if response.status_code == 200: | |
| r = response.json() | |
| models = [model["model_name"] for model in r] | |
| return models | |
| else: | |
| log.error( | |
| f"Request failed with code: {response.status_code} {response.json()}" | |
| ) | |
| return None | |
| def img2img_api(self, json_payload): | |
| response = requests.post( | |
| url=f"{self._url}{self._endpoints['img2img']}", | |
| data=json_payload, | |
| headers={"Content-Type": "application/json"}, | |
| ) | |
| if response.status_code == 200: | |
| return response | |
| log.error(f"Request failed with code: {response.status_code} {response.json()}") | |
| return False | |
| def get_image_info(self, b64_image): | |
| png_payload = "data:image/png;base64," + b64_image | |
| response = requests.post( | |
| url=f"{self._url}{self._endpoints['image_info']}", | |
| json=png_payload, | |
| headers={"Content-Type": "application/json"}, | |
| ) | |
| if response.status_code == 200: | |
| return response | |
| log.error(f"Request failed with code: {response.status_code} {response.json()}") | |
| return False | |
| def interrupt(self): | |
| response = requests.post( | |
| url=f"{self._url}{self._endpoints['interrupt']}", | |
| headers={"Content-Type": "application/json"}, | |
| ) | |
| if response.status_code != 200: | |
| log.error( | |
| f"Request failed with code: {response.status_code} {response.json()}" | |
| ) | |
| return False | |
| r = response.json() | |
| log.error(f"Interrupted by user.{r.text}") | |
| return True | |
| def is_extension(self, ext="adetailer"): | |
| extensions = self.extensions | |
| log.debug(f"Found following extensions: {extensions}") | |
| if ext in extensions: | |
| log.info(f"Found {ext} extension.") | |
| if extensions[ext]: | |
| log.info(f"{ext} extension is enabled.") | |
| return True | |
| else: | |
| log.warning(f"Please enable the {ext} extension if you want to use it.") | |
| return False | |
| log.error(f"Could not find {ext} extension") | |
| return False | |
| def setURL(self, url: str): | |
| self._url = url | |
| def getURL(self): | |
| return self._url | |
| def main(): | |
| import utils | |
| file_path = r"D:\Workspace\AI\stable-diffusion-webui\outputs\txt2img-images\2024-04-15\00018-4139222450.png" | |
| file_path = pathlib.Path(file_path) | |
| image_str = utils.raw_b64_img(file_path) | |
| json_body = { | |
| "prompt": "", | |
| "negative_prompt": "", | |
| "styles": [""], | |
| "seed": -1, | |
| "subseed": -1, | |
| "subseed_strength": 0, | |
| "seed_resize_from_h": -1, | |
| "seed_resize_from_w": -1, | |
| "sampler_name": "Euler", | |
| "scheduler": "Automatic", | |
| "batch_size": 1, | |
| "n_iter": 1, | |
| "steps": 50, | |
| "cfg_scale": 7, | |
| "width": 512, | |
| "height": 768, | |
| "restore_faces": False, | |
| "tiling": True, | |
| "do_not_save_samples": False, | |
| "do_not_save_grid": False, | |
| "eta": 0, | |
| "denoising_strength": 0.75, | |
| "s_min_uncond": 0, | |
| "s_churn": 0, | |
| "s_tmax": 0, | |
| "s_tmin": 0, | |
| "s_noise": 0, | |
| "override_settings": {}, | |
| "override_settings_restore_afterwards": True, | |
| "refiner_checkpoint": "", | |
| "refiner_switch_at": 0, | |
| "disable_extra_networks": False, | |
| "firstpass_image": "", | |
| "comments": {}, | |
| "init_images": [""], | |
| "resize_mode": 0, | |
| "image_cfg_scale": 7, | |
| "mask": "string", | |
| "mask_blur_x": 4, | |
| "mask_blur_y": 4, | |
| "mask_blur": 0, | |
| "mask_round": True, | |
| "inpainting_fill": 0, | |
| "inpaint_full_res": True, | |
| "inpaint_full_res_padding": 0, | |
| "inpainting_mask_invert": 0, | |
| "initial_noise_multiplier": 0, | |
| "latent_mask": "string", | |
| "force_task_id": "string", | |
| "sampler_index": "Euler", | |
| "include_init_images": False, | |
| "script_name": "", | |
| "script_args": [], | |
| "send_images": True, | |
| "save_images": False, | |
| "alwayson_scripts": {}, | |
| "infotext": "string", | |
| } | |
| png_payload = "data:image/png;base64," + image_str | |
| json_body["init_images"][0] = png_payload | |
| sd = A1111Client() | |
| response = sd.img2img_api(json_body) | |
| if response == 200: | |
| r = response.json() | |
| for i in r['images']: | |
| image = Image.open(io.BytesIO(base64.b64decode(i.split(",",1)[0]))) | |
| info_response = sd.get_image_info(i) | |
| pnginfo = PngImagePlugin.PngInfo() | |
| pnginfo.add_text("parameters", info_response.json().get("info")) | |
| image.save(f"Output/{file_path.stem}.png", pnginfo=pnginfo) | |
| else: | |
| print(response.json()) | |
| if __name__ == "__main__": | |
| main() | |