import comfy.utils from ..libs.api.fluxai import fluxaiAPI from ..libs.api.bizyair import bizyairAPI, encode_data from nodes import NODE_CLASS_MAPPINGS as ALL_NODE_CLASS_MAPPINGS class joyCaption2API: API_URL = f"/supernode/joycaption2" @classmethod def INPUT_TYPES(s): return { "required": { "image": ("IMAGE",), "do_sample": ([True, False],), "temperature": ( "FLOAT", { "default": 0.5, "min": 0.0, "max": 2.0, "step": 0.01, "round": 0.001, "display": "number", }, ), "max_tokens": ( "INT", { "default": 256, "min": 16, "max": 512, "step": 16, "display": "number", }, ), "caption_type": ( [ "Descriptive", "Descriptive (Informal)", "Training Prompt", "MidJourney", "Booru tag list", "Booru-like tag list", "Art Critic", "Product Listing", "Social Media Post", ], ), "caption_length": ( ["any", "very short", "short", "medium-length", "long", "very long"] + [str(i) for i in range(20, 261, 10)], ), "extra_options": ( "STRING", { "placeholder": "Extra options(e.g):\nIf there is a person/character in the image you must refer to them as {name}.", "tooltip": "Extra options for the model", "multiline": True, }, ), "name_input": ( "STRING", { "default": "", "tooltip": "Name input is only used if an Extra Option is selected that requires it.", }, ), "custom_prompt": ( "STRING", { "default": "", "multiline": True, }, ), }, "optional":{ "apikey_override": ("STRING", {"default": "", "forceInput": True, "tooltip":"Override the API key in the local config"}), } } RETURN_TYPES = ("STRING",) RETURN_NAMES = ("caption",) FUNCTION = "joycaption" OUTPUT_NODE = False CATEGORY = "EasyUse/API" def joycaption( self, image, do_sample, temperature, max_tokens, caption_type, caption_length, extra_options, name_input, custom_prompt, apikey_override=None ): pbar = comfy.utils.ProgressBar(100) pbar.update_absolute(10) SIZE_LIMIT = 1536 _, w, h, c = image.shape if w > SIZE_LIMIT or h > SIZE_LIMIT: node_class = ALL_NODE_CLASS_MAPPINGS['easy imageScaleDownToSize'] image, = node_class().image_scale_down_to_size(image, SIZE_LIMIT, True) payload = { "image": None, "do_sample": do_sample == True, "temperature": temperature, "max_new_tokens": max_tokens, "caption_type": caption_type, "caption_length": caption_length, "extra_options": [extra_options], "name_input": name_input, "custom_prompt": custom_prompt, } pbar.update_absolute(30) caption = bizyairAPI.joyCaption(payload, image, apikey_override, API_URL=self.API_URL) pbar.update_absolute(100) return (caption,) class joyCaption3API(joyCaption2API): API_URL = f"/supernode/joycaption3" NODE_CLASS_MAPPINGS = { "easy joyCaption2API": joyCaption2API, "easy joyCaption3API": joyCaption3API, } NODE_DISPLAY_NAME_MAPPINGS = { "easy joyCaption2API": "JoyCaption2 (BizyAIR)", "easy joyCaption3API": "JoyCaption3 (BizyAIR)", }