| | |
| | |
| |
|
| | import websocket |
| | import uuid |
| | import json |
| | import urllib.request |
| | import urllib.parse |
| |
|
| | server_address = "127.0.0.1:8188" |
| | client_id = str(uuid.uuid4()) |
| |
|
| | def queue_prompt(prompt, prompt_id): |
| | p = {"prompt": prompt, "client_id": client_id, "prompt_id": prompt_id} |
| | data = json.dumps(p).encode('utf-8') |
| | req = urllib.request.Request("http://{}/prompt".format(server_address), data=data) |
| | urllib.request.urlopen(req).read() |
| |
|
| | def get_image(filename, subfolder, folder_type): |
| | data = {"filename": filename, "subfolder": subfolder, "type": folder_type} |
| | url_values = urllib.parse.urlencode(data) |
| | with urllib.request.urlopen("http://{}/view?{}".format(server_address, url_values)) as response: |
| | return response.read() |
| |
|
| | def get_history(prompt_id): |
| | with urllib.request.urlopen("http://{}/history/{}".format(server_address, prompt_id)) as response: |
| | return json.loads(response.read()) |
| |
|
| | def get_images(ws, prompt): |
| | prompt_id = str(uuid.uuid4()) |
| | queue_prompt(prompt, prompt_id) |
| | output_images = {} |
| | while True: |
| | out = ws.recv() |
| | if isinstance(out, str): |
| | message = json.loads(out) |
| | if message['type'] == 'executing': |
| | data = message['data'] |
| | if data['node'] is None and data['prompt_id'] == prompt_id: |
| | break |
| | else: |
| | |
| | |
| | |
| | continue |
| |
|
| | history = get_history(prompt_id)[prompt_id] |
| | for node_id in history['outputs']: |
| | node_output = history['outputs'][node_id] |
| | images_output = [] |
| | if 'images' in node_output: |
| | for image in node_output['images']: |
| | image_data = get_image(image['filename'], image['subfolder'], image['type']) |
| | images_output.append(image_data) |
| | output_images[node_id] = images_output |
| |
|
| | return output_images |
| |
|
| | prompt_text = """ |
| | { |
| | "3": { |
| | "inputs": { |
| | "seed": 473371463840349, |
| | "steps": 8, |
| | "cfg": 1, |
| | "sampler_name": "lcm", |
| | "scheduler": "beta", |
| | "denoise": 1, |
| | "model": [ |
| | "12", |
| | 0 |
| | ], |
| | "positive": [ |
| | "10", |
| | 0 |
| | ], |
| | "negative": [ |
| | "7", |
| | 0 |
| | ], |
| | "latent_image": [ |
| | "16", |
| | 0 |
| | ] |
| | }, |
| | "class_type": "KSampler", |
| | "_meta": { |
| | "title": "KSampler" |
| | } |
| | }, |
| | "4": { |
| | "inputs": { |
| | "ckpt_name": "novaFurryXL_illustriousV110.safetensors" |
| | }, |
| | "class_type": "CheckpointLoaderSimple", |
| | "_meta": { |
| | "title": "Cargar Punto de Control" |
| | } |
| | }, |
| | "7": { |
| | "inputs": { |
| | "text": "Xx_NEGPROMPT_xX", |
| | "clip": [ |
| | "11", |
| | 1 |
| | ] |
| | }, |
| | "class_type": "CLIPTextEncode", |
| | "_meta": { |
| | "title": "Codificar Texto CLIP (Prompt)" |
| | } |
| | }, |
| | "8": { |
| | "inputs": { |
| | "samples": [ |
| | "3", |
| | 0 |
| | ], |
| | "vae": [ |
| | "4", |
| | 2 |
| | ] |
| | }, |
| | "class_type": "VAEDecode", |
| | "_meta": { |
| | "title": "Decodificación VAE" |
| | } |
| | }, |
| | "9": { |
| | "inputs": { |
| | "filename_prefix": "Fast", |
| | "images": [ |
| | "8", |
| | 0 |
| | ] |
| | }, |
| | "class_type": "SaveImage", |
| | "_meta": { |
| | "title": "Guardar Imagen" |
| | } |
| | }, |
| | "10": { |
| | "inputs": { |
| | "text": "Xx_PROMPT_xX", |
| | "clip": [ |
| | "11", |
| | 1 |
| | ] |
| | }, |
| | "class_type": "CLIPTextEncodeWithBreak", |
| | "_meta": { |
| | "title": "CLIPTextEncode with BREAK syntax" |
| | } |
| | }, |
| | "11": { |
| | "inputs": { |
| | "lora_name": "dmd2_sdxl_4step_lora_fp16.safetensors", |
| | "strength_model": 1, |
| | "strength_clip": 1, |
| | "model": [ |
| | "4", |
| | 0 |
| | ], |
| | "clip": [ |
| | "4", |
| | 1 |
| | ] |
| | }, |
| | "class_type": "LoraLoader", |
| | "_meta": { |
| | "title": "Cargar LoRA" |
| | } |
| | }, |
| | "12": { |
| | "inputs": { |
| | "block_number": 3, |
| | "downscale_factor": 2, |
| | "start_percent": 0, |
| | "end_percent": 0.5, |
| | "downscale_after_skip": true, |
| | "downscale_method": "bicubic", |
| | "upscale_method": "bicubic", |
| | "model": [ |
| | "11", |
| | 0 |
| | ] |
| | }, |
| | "class_type": "PatchModelAddDownscale", |
| | "_meta": { |
| | "title": "PatchModelAddDownscale (Kohya Deep Shrink)" |
| | } |
| | }, |
| | "16": { |
| | "inputs": { |
| | "width": 1024, |
| | "height": 1024, |
| | "batch_size": 1 |
| | }, |
| | "class_type": "EmptyLatentImage", |
| | "_meta": { |
| | "title": "Imagen Latente Vacía" |
| | } |
| | } |
| | } |
| | """ |
| |
|
| | prompt = json.loads(prompt_text) |
| | |
| | prompt["10"]["inputs"]["text"] = "masterpiece best quality man" |
| |
|
| | |
| | prompt["7"]["inputs"]["text"] = "worst quailty" |
| |
|
| | |
| | prompt["3"]["inputs"]["seed"] = 5345435 |
| |
|
| | ws = websocket.WebSocket() |
| | ws.connect("ws://{}/ws?clientId={}".format(server_address, client_id)) |
| | images = get_images(ws, prompt) |
| | ws.close() |
| | |
| |
|
| | for node_id in images: |
| | for image_data in images[node_id]: |
| | from PIL import Image |
| | import io |
| | image = Image.open(io.BytesIO(image_data)) |
| | image.show() |
| |
|
| |
|