| import node_helpers
|
| import comfy.utils
|
|
|
| class CLIPTextEncodeFlux:
|
| @classmethod
|
| def INPUT_TYPES(s):
|
| return {"required": {
|
| "clip": ("CLIP", ),
|
| "clip_l": ("STRING", {"multiline": True, "dynamicPrompts": True}),
|
| "t5xxl": ("STRING", {"multiline": True, "dynamicPrompts": True}),
|
| "guidance": ("FLOAT", {"default": 3.5, "min": 0.0, "max": 100.0, "step": 0.1}),
|
| }}
|
| RETURN_TYPES = ("CONDITIONING",)
|
| FUNCTION = "encode"
|
|
|
| CATEGORY = "advanced/conditioning/flux"
|
|
|
| def encode(self, clip, clip_l, t5xxl, guidance):
|
| tokens = clip.tokenize(clip_l)
|
| tokens["t5xxl"] = clip.tokenize(t5xxl)["t5xxl"]
|
|
|
| return (clip.encode_from_tokens_scheduled(tokens, add_dict={"guidance": guidance}), )
|
|
|
| class FluxGuidance:
|
| @classmethod
|
| def INPUT_TYPES(s):
|
| return {"required": {
|
| "conditioning": ("CONDITIONING", ),
|
| "guidance": ("FLOAT", {"default": 3.5, "min": 0.0, "max": 100.0, "step": 0.1}),
|
| }}
|
|
|
| RETURN_TYPES = ("CONDITIONING",)
|
| FUNCTION = "append"
|
|
|
| CATEGORY = "advanced/conditioning/flux"
|
|
|
| def append(self, conditioning, guidance):
|
| c = node_helpers.conditioning_set_values(conditioning, {"guidance": guidance})
|
| return (c, )
|
|
|
|
|
| class FluxDisableGuidance:
|
| @classmethod
|
| def INPUT_TYPES(s):
|
| return {"required": {
|
| "conditioning": ("CONDITIONING", ),
|
| }}
|
|
|
| RETURN_TYPES = ("CONDITIONING",)
|
| FUNCTION = "append"
|
|
|
| CATEGORY = "advanced/conditioning/flux"
|
| DESCRIPTION = "This node completely disables the guidance embed on Flux and Flux like models"
|
|
|
| def append(self, conditioning):
|
| c = node_helpers.conditioning_set_values(conditioning, {"guidance": None})
|
| return (c, )
|
|
|
|
|
| PREFERED_KONTEXT_RESOLUTIONS = [
|
| (672, 1568),
|
| (688, 1504),
|
| (720, 1456),
|
| (752, 1392),
|
| (800, 1328),
|
| (832, 1248),
|
| (880, 1184),
|
| (944, 1104),
|
| (1024, 1024),
|
| (1104, 944),
|
| (1184, 880),
|
| (1248, 832),
|
| (1328, 800),
|
| (1392, 752),
|
| (1456, 720),
|
| (1504, 688),
|
| (1568, 672),
|
| ]
|
|
|
|
|
| class FluxKontextImageScale:
|
| @classmethod
|
| def INPUT_TYPES(s):
|
| return {"required": {"image": ("IMAGE", ),
|
| },
|
| }
|
|
|
| RETURN_TYPES = ("IMAGE",)
|
| FUNCTION = "scale"
|
|
|
| CATEGORY = "advanced/conditioning/flux"
|
| DESCRIPTION = "This node resizes the image to one that is more optimal for flux kontext."
|
|
|
| def scale(self, image):
|
| width = image.shape[2]
|
| height = image.shape[1]
|
| aspect_ratio = width / height
|
| _, width, height = min((abs(aspect_ratio - w / h), w, h) for w, h in PREFERED_KONTEXT_RESOLUTIONS)
|
| image = comfy.utils.common_upscale(image.movedim(-1, 1), width, height, "lanczos", "center").movedim(1, -1)
|
| return (image, )
|
|
|
|
|
| class FluxKontextMultiReferenceLatentMethod:
|
| @classmethod
|
| def INPUT_TYPES(s):
|
| return {"required": {
|
| "conditioning": ("CONDITIONING", ),
|
| "reference_latents_method": (("offset", "index", "uxo/uno"), ),
|
| }}
|
|
|
| RETURN_TYPES = ("CONDITIONING",)
|
| FUNCTION = "append"
|
| EXPERIMENTAL = True
|
|
|
| CATEGORY = "advanced/conditioning/flux"
|
|
|
| def append(self, conditioning, reference_latents_method):
|
| if "uxo" in reference_latents_method or "uso" in reference_latents_method:
|
| reference_latents_method = "uxo"
|
| c = node_helpers.conditioning_set_values(conditioning, {"reference_latents_method": reference_latents_method})
|
| return (c, )
|
|
|
| NODE_CLASS_MAPPINGS = {
|
| "CLIPTextEncodeFlux": CLIPTextEncodeFlux,
|
| "FluxGuidance": FluxGuidance,
|
| "FluxDisableGuidance": FluxDisableGuidance,
|
| "FluxKontextImageScale": FluxKontextImageScale,
|
| "FluxKontextMultiReferenceLatentMethod": FluxKontextMultiReferenceLatentMethod,
|
| }
|
|
|