Compare commits

..
Author SHA1 Message Date
nick 0582d1d869 merge 2024-08-07 20:43:38 -07:00
nick ce073a86c7 block on bad prompt 2024-08-07 20:42:12 -07:00
Emmanuel Morales 3a85a1edf2 feat(text): create node for external text list (#60)
* feat(text): create node for external text list 

This is to send a list of texts to other nodes

* refactor: remove prints and rename variable

* style: update comment

* refactor: remove unused optional inputs
2024-08-06 21:35:46 -06:00
karrix 369c1456a9 add: node focusing function 2024-08-05 00:59:52 +08:00
bennykok 01e323b7e2 fix: excessive log 2024-08-03 22:22:06 -07:00
bennykok db684d044a fix: not yield 2024-08-03 21:56:16 -07:00
BennyKok 8e12803ea1 Retry logic when calling api (#57)
* fix: retry logic, bypass logfire, clean up log

* fix: max_retries and retry_delay_multiplier, do not throw when pass the retry failed
2024-08-01 20:43:21 -07:00
Nick Kao 7585d5049a Merge pull request #58 from GwonHyeok/main
fix: ExternalLoRA node Make downloaded files reusable
2024-08-01 19:50:59 -07:00
GwonHyeok 772bb09240 fix: ExternalLoRA node Make downloaded files reusable 2024-08-02 10:29:24 +09:00
bennykok 9a7e18e651 fix: fe communication 2024-08-01 10:50:08 -07:00
Hmily a02c8d237f fix: Fix request deploy service interface error (#56) 2024-08-01 10:47:45 -07:00
nick 2ba5a0ff3d external lora 2024-08-01 10:43:24 -07:00
5 changed files with 1153 additions and 958 deletions
+19 -5
View File
@@ -4,12 +4,15 @@ import numpy as np
import torch import torch
import folder_paths import folder_paths
class AnyType(str): class AnyType(str):
def __ne__(self, __value: object) -> bool: def __ne__(self, __value: object) -> bool:
return False return False
WILDCARD = AnyType("*") WILDCARD = AnyType("*")
class ComfyUIDeployExternalLora: class ComfyUIDeployExternalLora:
@classmethod @classmethod
def INPUT_TYPES(s): def INPUT_TYPES(s):
@@ -22,6 +25,10 @@ class ComfyUIDeployExternalLora:
}, },
"optional": { "optional": {
"default_lora_name": (folder_paths.get_filename_list("loras"),), "default_lora_name": (folder_paths.get_filename_list("loras"),),
"lora_save_name": ( # if `default_lora_name` is a link to download a file, we will attempt to save it with this name
"STRING",
{"multiline": False, "default": ""},
),
}, },
} }
@@ -32,17 +39,24 @@ class ComfyUIDeployExternalLora:
CATEGORY = "deploy" CATEGORY = "deploy"
def run(self, input_id, default_lora_name=None): def run(self, input_id, default_lora_name=None, lora_save_name=None):
import requests import requests
import os import os
import uuid import uuid
if default_lora_name.startswith("http"): if default_lora_name.startswith("http"):
unique_filename = str(uuid.uuid4()) + ".safetensors" if lora_save_name:
print(unique_filename) existing_loras = folder_paths.get_filename_list("loras")
# Check if lora_save_name exists in the list
if lora_save_name in existing_loras:
print(f"using lora: {lora_save_name}")
return (lora_save_name,)
else:
lora_save_name = str(uuid.uuid4()) + ".safetensors"
print(lora_save_name)
print(folder_paths.folder_names_and_paths["loras"][0][0]) print(folder_paths.folder_names_and_paths["loras"][0][0])
destination_path = os.path.join( destination_path = os.path.join(
folder_paths.folder_names_and_paths["loras"][0][0], unique_filename folder_paths.folder_names_and_paths["loras"][0][0], lora_save_name
) )
print(destination_path) print(destination_path)
print("Downloading external lora - " + input_id + " to " + destination_path) print("Downloading external lora - " + input_id + " to " + destination_path)
@@ -53,7 +67,7 @@ class ComfyUIDeployExternalLora:
) )
with open(destination_path, "wb") as out_file: with open(destination_path, "wb") as out_file:
out_file.write(response.content) out_file.write(response.content)
return (unique_filename,) return (lora_save_name,)
else: else:
print(f"using lora: {default_lora_name}") print(f"using lora: {default_lora_name}")
return (default_lora_name,) return (default_lora_name,)
+43
View File
@@ -0,0 +1,43 @@
import folder_paths
from PIL import Image, ImageOps
import numpy as np
import torch
import json
class ComfyUIDeployExternalTextList:
@classmethod
def INPUT_TYPES(s):
return {
"required": {
"input_id": (
"STRING",
{"multiline": False, "default": 'input_text_list'},
),
"text": (
"STRING",
{"multiline": True, "default": "[]"},
),
}
}
RETURN_TYPES = ("STRING",)
RETURN_NAMES = ("text",)
OUTPUT_IS_LIST = (True,)
FUNCTION = "run"
CATEGORY = "text"
def run(self, input_id, text=None):
text_list = []
try:
text_list = json.loads(text) # Assuming text is a JSON array string
except Exception as e:
print(f"Error processing images: {e}")
pass
return [text_list]
NODE_CLASS_MAPPINGS = {"ComfyUIDeployExternalTextList": ComfyUIDeployExternalTextList}
NODE_DISPLAY_NAME_MAPPINGS = {"ComfyUIDeployExternalTextList": "External Text List (ComfyUI Deploy)"}
+6 -5
View File
@@ -108,7 +108,8 @@ def log_span(name):
if use_logfire: if use_logfire:
with logger.span(name): with logger.span(name):
yield yield
# else: else:
yield
# logger.info(f"Start: {name}") # logger.info(f"Start: {name}")
# yield # yield
# logger.info(f"End: {name}") # logger.info(f"End: {name}")
@@ -348,7 +349,7 @@ async def comfy_deploy_run(request):
status = 200 status = 200
if "node_errors" in res and res["node_errors"]: if "node_errors" in res and res["node_errors"] is not None:
# Even tho there are node_errors it can still be run # Even tho there are node_errors it can still be run
status = 400 status = 400
await update_run_with_output(prompt_id, { await update_run_with_output(prompt_id, {
@@ -386,7 +387,7 @@ async def stream_prompt(data):
workflow_api=workflow_api workflow_api=workflow_api
) )
log('info', "Begin prompt", prompt=prompt) # log('info', "Begin prompt", prompt=prompt)
try: try:
res = post_prompt(prompt) res = post_prompt(prompt)
@@ -409,7 +410,7 @@ async def stream_prompt(data):
status = 200 status = 200
if "node_errors" in res and res["node_errors"]: if "node_errors" in res and res["node_errors"] is not None:
# Even tho there are node_errors it can still be run # Even tho there are node_errors it can still be run
status = 400 status = 400
await update_run_with_output(prompt_id, { await update_run_with_output(prompt_id, {
@@ -453,7 +454,7 @@ async def stream_response(request):
if not comfy_message_queues[prompt_id].empty(): if not comfy_message_queues[prompt_id].empty():
data = await comfy_message_queues[prompt_id].get() data = await comfy_message_queues[prompt_id].get()
log('info', data["event"], data=json.dumps(data)) # log('info', data["event"], data=json.dumps(data))
# logger.info("listener", data) # logger.info("listener", data)
await response.write(f"event: event_update\ndata: {json.dumps(data)}\n\n".encode('utf-8')) await response.write(f"event: event_update\ndata: {json.dumps(data)}\n\n".encode('utf-8'))
await response.drain() # Ensure the buffer is flushed await response.drain() # Ensure the buffer is flushed
+1081 -946
View File
File diff suppressed because it is too large Load Diff
+3 -1
View File
@@ -51,7 +51,9 @@ const createRunRoute = createRoute({
export const registerCreateRunRoute = (app: App) => { export const registerCreateRunRoute = (app: App) => {
app.openapi(createRunRoute, async (c) => { app.openapi(createRunRoute, async (c) => {
const data = c.req.valid("json"); const data = c.req.valid("json");
const origin = new URL(c.req.url).origin; const proto = c.req.headers.get('x-forwarded-proto') || "http";
const host = c.req.headers.get('x-forwarded-host') || c.req.headers.get('host');
const origin = `${proto}://${host}` || new URL(c.req.url).origin;
const apiKeyTokenData = c.get("apiKeyTokenData")!; const apiKeyTokenData = c.get("apiKeyTokenData")!;
const { deployment_id, inputs } = data; const { deployment_id, inputs } = data;