from .libs.utils import any_typ from server import PromptServer cache = {} class CacheBackendData: @classmethod def INPUT_TYPES(s): return { "required": { "key": ("STRING", {"multiline": False, "placeholder": "Input data key (e.g. 'model a', 'chunli lora', 'girl latent 3', ...)"}), "tag": ("STRING", {"multiline": False, "placeholder": "Tag: short description"}), "data": (any_typ,), } } RETURN_TYPES = (any_typ,) RETURN_NAMES = ("data opt",) FUNCTION = "doit" CATEGORY = "InspirePack/Backend" OUTPUT_NODE = True def doit(self, key, tag, data): global cache if key == '*': print(f"[Inspire Pack] CacheBackendData: '*' is reserved key. Cannot use that key") cache[key] = (tag, (False, data)) return (data,) class CacheBackendDataNumberKey: @classmethod def INPUT_TYPES(s): return { "required": { "key": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff}), "tag": ("STRING", {"multiline": False, "placeholder": "Tag: short description"}), "data": (any_typ,), } } RETURN_TYPES = (any_typ,) RETURN_NAMES = ("data opt",) FUNCTION = "doit" CATEGORY = "InspirePack/Backend" OUTPUT_NODE = True def doit(self, key, tag, data): global cache cache[key] = (tag, (False, data)) return (data,) class CacheBackendDataList: @classmethod def INPUT_TYPES(s): return { "required": { "key": ("STRING", {"multiline": False, "placeholder": "Input data key (e.g. 'model a', 'chunli lora', 'girl latent 3', ...)"}), "tag": ("STRING", {"multiline": False, "placeholder": "Tag: short description"}), "data": (any_typ,), } } INPUT_IS_LIST = True RETURN_TYPES = (any_typ,) RETURN_NAMES = ("data opt",) OUTPUT_IS_LIST = (True,) FUNCTION = "doit" CATEGORY = "InspirePack/Backend" OUTPUT_NODE = True def doit(self, key, tag, data): global cache if key == '*': print(f"[Inspire Pack] CacheBackendDataList: '*' is reserved key. Cannot use that key") cache[key[0]] = (tag[0], (True, data)) return (data,) class CacheBackendDataNumberKeyList: @classmethod def INPUT_TYPES(s): return { "required": { "key": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff}), "tag": ("STRING", {"multiline": False, "placeholder": "Tag: short description"}), "data": (any_typ,), } } INPUT_IS_LIST = True RETURN_TYPES = (any_typ,) RETURN_NAMES = ("data opt",) OUTPUT_IS_LIST = (True,) FUNCTION = "doit" CATEGORY = "InspirePack/Backend" OUTPUT_NODE = True def doit(self, key, tag, data): global cache cache[key[0]] = (tag[0], (True, data)) return (data,) class RetrieveBackendData: @classmethod def INPUT_TYPES(s): return { "required": { "key": ("STRING", {"multiline": False, "placeholder": "Input data key (e.g. 'model a', 'chunli lora', 'girl latent 3', ...)"}), } } RETURN_TYPES = (any_typ,) RETURN_NAMES = ("data",) OUTPUT_IS_LIST = (True,) FUNCTION = "doit" CATEGORY = "InspirePack/Backend" def doit(self, key): global cache is_list, data = cache[key][1] if is_list: return (data,) else: return ([data],) class RetrieveBackendDataNumberKey(RetrieveBackendData): @classmethod def INPUT_TYPES(s): return { "required": { "key": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff}), } } class RemoveBackendData: @classmethod def INPUT_TYPES(s): return { "required": { "key": ("STRING", {"multiline": False, "placeholder": "Input data key ('*' = clear all)"}), }, "optional": { "signal_opt": (any_typ,), } } RETURN_TYPES = (any_typ,) RETURN_NAMES = ("signal",) FUNCTION = "doit" CATEGORY = "InspirePack/Backend" OUTPUT_NODE = True def doit(self, key, signal_opt=None): global cache if key == '*': cache = {} elif key in cache: del cache[key] else: print(f"[Inspire Pack] RemoveBackendData: invalid data key {key}") return (signal_opt,) class RemoveBackendDataNumberKey(RemoveBackendData): @classmethod def INPUT_TYPES(s): return { "required": { "key": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff}), }, "optional": { "signal_opt": (any_typ,), } } def doit(self, key, signal_opt=None): global cache if key in cache: del cache[key] else: print(f"[Inspire Pack] RemoveBackendDataNumberKey: invalid data key {key}") return (signal_opt,) class ShowCachedInfo: @classmethod def INPUT_TYPES(s): return { "required": { "cache_info": ("STRING", {"multiline": True}), }, "hidden": {"unique_id": "UNIQUE_ID"}, } RETURN_TYPES = () FUNCTION = "doit" CATEGORY = "InspirePack/Backend" OUTPUT_NODE = True def doit(self, cache_info, unique_id): global cache text1 = "---- [String Key Caches] ----\n" text2 = "---- [Number Key Caches] ----\n" for k, v in cache.items(): if v[0] == '': tag = 'N/A(tag)' else: tag = v[0] if isinstance(k, str): text1 += f'{k}: {tag}\n' else: text2 += f'{k}: {tag}\n' text = text1 + "\n" + text2 PromptServer.instance.send_sync("inspire-node-feedback", {"node_id": unique_id, "widget_name": "cache_info", "type": "text", "data": text}) return () @classmethod def IS_CHANGED(cls, **kwargs): return float("NaN") NODE_CLASS_MAPPINGS = { "CacheBackendData //Inspire": CacheBackendData, "CacheBackendDataNumberKey //Inspire": CacheBackendDataNumberKey, "CacheBackendDataList //Inspire": CacheBackendDataList, "CacheBackendDataNumberKeyList //Inspire": CacheBackendDataNumberKeyList, "RetrieveBackendData //Inspire": RetrieveBackendData, "RetrieveBackendDataNumberKey //Inspire": RetrieveBackendDataNumberKey, "RemoveBackendData //Inspire": RemoveBackendData, "RemoveBackendDataNumberKey //Inspire": RemoveBackendDataNumberKey, "ShowCachedInfo //Inspire": ShowCachedInfo, } NODE_DISPLAY_NAME_MAPPINGS = { "CacheBackendData //Inspire": "Cache Backend Data (Inspire)", "CacheBackendDataNumberKey //Inspire": "Cache Backend Data [NumberKey] (Inspire)", "CacheBackendDataList //Inspire": "Cache Backend Data List (Inspire)", "CacheBackendDataNumberKeyList //Inspire": "Cache Backend Data List [NumberKey] (Inspire)", "RetrieveBackendData //Inspire": "Retrieve Backend Data (Inspire)", "RetrieveBackendDataNumberKey //Inspire": "Retrieve Backend Data [NumberKey] (Inspire)", "RemoveBackendData //Inspire": "Remove Backend Data (Inspire)", "RemoveBackendDataNumberKey //Inspire": "Remove Backend Data [NumberKey] (Inspire)", "ShowCachedInfo //Inspire": "Show Cached Info (Inspire)", }