|
|
|
|
|
|
| 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):
|
| p = {"prompt": prompt, "client_id": client_id}
|
| data = json.dumps(p).encode('utf-8')
|
| req = urllib.request.Request("http://{}/prompt".format(server_address), data=data)
|
| return json.loads(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 = 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": {
|
| "class_type": "KSampler",
|
| "inputs": {
|
| "cfg": 8,
|
| "denoise": 1,
|
| "latent_image": [
|
| "5",
|
| 0
|
| ],
|
| "model": [
|
| "4",
|
| 0
|
| ],
|
| "negative": [
|
| "7",
|
| 0
|
| ],
|
| "positive": [
|
| "6",
|
| 0
|
| ],
|
| "sampler_name": "euler",
|
| "scheduler": "normal",
|
| "seed": 8566257,
|
| "steps": 20
|
| }
|
| },
|
| "4": {
|
| "class_type": "CheckpointLoaderSimple",
|
| "inputs": {
|
| "ckpt_name": "v1-5-pruned-emaonly.safetensors"
|
| }
|
| },
|
| "5": {
|
| "class_type": "EmptyLatentImage",
|
| "inputs": {
|
| "batch_size": 1,
|
| "height": 512,
|
| "width": 512
|
| }
|
| },
|
| "6": {
|
| "class_type": "CLIPTextEncode",
|
| "inputs": {
|
| "clip": [
|
| "4",
|
| 1
|
| ],
|
| "text": "masterpiece best quality girl"
|
| }
|
| },
|
| "7": {
|
| "class_type": "CLIPTextEncode",
|
| "inputs": {
|
| "clip": [
|
| "4",
|
| 1
|
| ],
|
| "text": "bad hands"
|
| }
|
| },
|
| "8": {
|
| "class_type": "VAEDecode",
|
| "inputs": {
|
| "samples": [
|
| "3",
|
| 0
|
| ],
|
| "vae": [
|
| "4",
|
| 2
|
| ]
|
| }
|
| },
|
| "9": {
|
| "class_type": "SaveImage",
|
| "inputs": {
|
| "filename_prefix": "ComfyUI",
|
| "images": [
|
| "8",
|
| 0
|
| ]
|
| }
|
| }
|
| }
|
| """
|
|
|
| prompt = json.loads(prompt_text)
|
|
|
| prompt["6"]["inputs"]["text"] = "masterpiece best quality man"
|
|
|
|
|
| prompt["3"]["inputs"]["seed"] = 5
|
|
|
| ws = websocket.WebSocket()
|
| ws.connect("ws://{}/ws?clientId={}".format(server_address, client_id))
|
| images = get_images(ws, prompt)
|
| ws.close()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|