| from .sdxl_prompt_styler import SDXLPromptStyler, SDXLPromptStylerAdvanced |
| from .prompt_parser import parse_workflow |
| import typing as t |
|
|
|
|
| class BaseNode: |
| CATEGORY = "copilot" |
|
|
| @classmethod |
| def INPUT_TYPES(cls): |
| pass |
|
|
|
|
| class EagleImageNode(BaseNode): |
| """ |
| A example node |
| |
| Class methods |
| ------------- |
| INPUT_TYPES (dict): |
| Tell the main program input parameters of nodes. |
| |
| Attributes |
| ---------- |
| RETURN_TYPES (`tuple`): |
| The type of each element in the output tulple. |
| RETURN_NAMES (`tuple`): |
| Optional: The name of each output in the output tulple. |
| FUNCTION (`str`): |
| The name of the entry-point method. For example, if `FUNCTION = "execute"` then it will run Example().execute() |
| OUTPUT_NODE ([`bool`]): |
| If this node is an output node that outputs a result/image from the graph. The SaveImage node is an example. |
| The backend iterates on these output nodes and tries to execute all their parents if their parent graph is properly connected. |
| Assumed to be False if not present. |
| CATEGORY (`str`): |
| The category the node should appear in the UI. |
| execute(s) -> tuple || None: |
| The entry point method. The name of this method must be the same as the value of property `FUNCTION`. |
| For example, if `FUNCTION = "execute"` then this method's name must be `execute`, if `FUNCTION = "foo"` then it must be `foo`. |
| """ |
|
|
| def __init__(self): |
| pass |
|
|
| @classmethod |
| def INPUT_TYPES(s): |
| """ |
| Return a dictionary which contains config for all input fields. |
| Some types (string): "MODEL", "VAE", "CLIP", "CONDITIONING", "LATENT", "IMAGE", "INT", "STRING", "FLOAT". |
| Input types "INT", "STRING" or "FLOAT" are special values for fields on the node. |
| The type can be a list for selection. |
| |
| Returns: `dict`: |
| - Key input_fields_group (`string`): Can be either required, hidden or optional. A node class must have property `required` |
| - Value input_fields (`dict`): Contains input fields config: |
| * Key field_name (`string`): Name of a entry-point method's argument |
| * Value field_config (`tuple`): |
| + First value is a string indicate the type of field or a list for selection. |
| + Secound value is a config for type "INT", "STRING" or "FLOAT". |
| """ |
| return { |
| "required": { |
| "image": ("IMAGE",), |
| "int_field": ( |
| "INT", |
| { |
| "default": 0, |
| "min": 0, |
| "max": 4096, |
| "step": 64, |
| }, |
| ), |
| "float_field": ( |
| "FLOAT", |
| {"default": 1.0, "min": 0.0, "max": 10.0, "step": 0.01}, |
| ), |
| "print_to_screen": (["enable", "disable"],), |
| "string_field": ( |
| "STRING", |
| { |
| "multiline": False, |
| |
| "default": "Hello World!", |
| }, |
| ), |
| }, |
| "hidden": {"prompt": "PROMPT", "extra_pnginfo": "EXTRA_PNGINFO"}, |
| } |
|
|
| RETURN_TYPES = () |
| |
|
|
| FUNCTION = "do_saving" |
|
|
| def do_saving( |
| self, |
| image, |
| string_field, |
| int_field, |
| float_field, |
| print_to_screen, |
| prompt=None, |
| extra_pnginfo=None, |
| ): |
| print("--->imgae", "prompt", prompt, "extra", extra_pnginfo) |
| if print_to_screen == "enable": |
| print( |
| f"""Your input contains: |
| string_field aka input text: {string_field} |
| int_field: {int_field} |
| float_field: {float_field} |
| """ |
| ) |
| |
| a = parse_workflow(prompt) |
| print(a) |
|
|
|
|
| TResolution = t.Literal[ |
| "Square (1024x1024)", |
| "Cinematic (1536x640)", |
| "Cinematic (640x1536)", |
| "Widescreen (1344x768)", |
| "Widescreen (768x1344)", |
| "Photo (1216x832)", |
| "Photo (832x1216)", |
| "Portrait (1152x896)", |
| ] |
|
|
|
|
| class SDXLResolutionPresets(BaseNode): |
| RESOLUTIONS: list[TResolution] = [ |
| "Square (1024x1024)", |
| "Cinematic (1536x640)", |
| "Cinematic (640x1536)", |
| "Widescreen (1344x768)", |
| "Widescreen (768x1344)", |
| "Photo (1216x832)", |
| "Photo (832x1216)", |
| "Portrait (1152x896)", |
| ] |
|
|
| @classmethod |
| def INPUT_TYPES(cls): |
| return { |
| "required": { |
| "resolution": (cls.RESOLUTIONS, {"default": "Square (1024x1024)"}), |
| }, |
| } |
|
|
| RETURN_TYPES = ("INT", "INT",) |
| RETURN_NAMES = ("width", "height",) |
| FUNCTION = "get_value" |
|
|
| def get_value(self, resolution: TResolution, ) -> tuple[int, int]: |
| if resolution == "Cinematic (1536x640)": |
| return 1536, 640 |
| if resolution == "Cinematic (640x1536)": |
| return 640, 1536 |
| if resolution == "Widescreen (1344x768)": |
| return 1344, 768 |
| if resolution == "Widescreen (768x1344)": |
| return 768, 1344 |
| if resolution == "Photo (1216x832)": |
| return 1216, 832 |
| if resolution == "Photo (832x1216)": |
| return 832, 1216 |
| if resolution == "Portrait (1152x896)": |
| return 1152, 896 |
| if resolution == "Portrait (896x1152)": |
| return 896, 1152 |
| if resolution == "Square (1024x1024)": |
| return 1024, 1024 |
|
|
|
|
| |
| |
| NODE_CLASS_MAPPINGS = { |
| "EagleImageNode": EagleImageNode, |
| "SDXLResolutionPresets": SDXLResolutionPresets, |
| "SDXLPromptStyler": SDXLPromptStyler, |
| "SDXLPromptStylerAdvanced": SDXLPromptStylerAdvanced, |
|
|
| } |
|
|
| |
| NODE_DISPLAY_NAME_MAPPINGS = { |
| "EagleImageNode": "Eagle Image Node for PNGInfo", |
| "SDXLResolutionPresets": "SDXL Resolution Presets (ws)", |
| "SDXLPromptStyler": "SDXL Prompt Styler", |
| "SDXLPromptStylerAdvanced": "SDXL Prompt Styler Advanced", |
| } |
|
|