diff --git a/docs/planning/index.md b/docs/planning/index.md index 387e03a..4927d16 100644 --- a/docs/planning/index.md +++ b/docs/planning/index.md @@ -12,3 +12,5 @@ This folder contains planning, migration, refactoring, and phase completion docu - [Refactoring Analysis](Refactoring_Analysis.md) - [Refactoring Plan](Refactoring_Plan.md) - [V3 Migration Status](V3_MIGRATION_STATUS.md) +- [Node documentation tool plan](node_documentation_tool_plan.md) +- [Node/docs coverage report](node_doc_coverage_report.md) diff --git a/docs/planning/node_doc_coverage_report.md b/docs/planning/node_doc_coverage_report.md new file mode 100644 index 0000000..338213e --- /dev/null +++ b/docs/planning/node_doc_coverage_report.md @@ -0,0 +1,128 @@ +--- +type: Report +title: Node/Docs Coverage Comparison +description: Comparison of Sage Utils nodes in NODE_LIST versus markdown files in js/docs. +tags: [planning, docs, nodes, coverage] +timestamp: 2026-07-01T00:00:00Z +--- + +# Node/Docs Coverage Comparison + +This report compares the current Sage Utils node list in `nodes_v3.py` with the Markdown documentation files under `js/docs/`. + +## Summary + +- `NODE_LIST` contains 113 nodes. +- `js/docs/` contains 55 Markdown files. +- 76 nodes in `NODE_LIST` are missing documentation files. +- 18 `js/docs/` documentation files do not correspond to any node in `NODE_LIST`. + +## Missing documentation files + +The following node IDs appear in `NODE_LIST` but do not have matching `js/docs/.md` files: + +Sage_Ace15AudioEncode +Sage_AceAdvOptions +Sage_AverageConditioning +Sage_CLIPLoaderFromInfo +Sage_CLIPSelector +Sage_ChromaCLIPLoaderFromInfo +Sage_CombineCLIPMultilineTextEncode +Sage_CombineCLIPTextEncode +Sage_CombineConditioning +Sage_ConstructMetadataFlexible +Sage_CropImage +Sage_DualCLIPSelector +Sage_DualCLIPTextEncodeQwen +Sage_DynamicJoinText +Sage_EmptyAceStep15LatentAudio +Sage_ErniePromptEnhancerPrompt +Sage_FlexibleCLIPSelector +Sage_FreeMemory +Sage_FreeU2 +Sage_LLMPromptText +Sage_LLMPromptVision +Sage_LLMPromptVisionRefine +Sage_LoadModelFromInfo +Sage_Load_Dataset_From_Folder +Sage_LoraStackInfoDisplay +Sage_LuminaPromptText +Sage_LuminaSystemPrompt +Sage_ModelInfoDisplay +Sage_ModelShiftOnly +Sage_MultiModelPicker +Sage_MultiSelectorDoubleClip +Sage_MultiSelectorFlexibleClip +Sage_MultiSelectorQuadClip +Sage_MultiSelectorSingleClip +Sage_MultiSelectorTripleClip +Sage_MultiplyConditioningStrength +Sage_NormalizeConditioningStrength +Sage_NumberToStr +Sage_ParseMetadataFlexible +Sage_PercentageToFloat +Sage_PonyRatingv6 +Sage_PonyRatingv7 +Sage_PonyScore +Sage_PonySource +Sage_PonyStyleCluster +Sage_QuadCLIPSelector +Sage_QuickLoraStack +Sage_QuickNineLoraStack +Sage_QuickSixLoraStack +Sage_ReferenceImage +Sage_SamplerInfoNoCFG +Sage_SamplerSelector +Sage_SchedulerSelector +Sage_SetTextWithDynamicPrompts +Sage_SetTextWithNum +Sage_SetTextWithoutComments +Sage_SingleCLIPTextEncode +Sage_SingleCLIPTextImageEncode +Sage_SixLoraStack +Sage_StackLoraStack +Sage_StylePromptFromConfig +Sage_TextRandomLine +Sage_TextSelectLine +Sage_TextSubstitution +Sage_TextSwitch +Sage_TrainingCaptionsToConditioning +Sage_TripleCLIPSelector +Sage_TripleQuickLoraStack +Sage_UNETLoRALoader +Sage_UNETLoaderFromInfo +Sage_UNETSelector +Sage_UnetClipVaeToModelInfo +Sage_VAELoaderFromInfo +Sage_VAESelector +Sage_ViewNotes +Sage_ZeroConditioning + +## Extra documentation files + +The following `js/docs` filenames do not match any node class in `NODE_LIST`: + +SageSetWildcardText +Sage_CacheMaintenance +Sage_CheckpointLoaderRecent +Sage_CheckpointLoaderSimple +Sage_ConditioningZeroOut +Sage_ConstructMetadata +Sage_ConstructMetadataLite +Sage_GetFileHash +Sage_LMStudioLLMPromptText +Sage_LMStudioLLMPromptVision +Sage_LMStudioLLMPromptVisionRefine +Sage_LastLoraInfo +Sage_LoraStackRecent +Sage_ModelReport +Sage_OllamaLLMPromptText +Sage_OllamaLLMPromptVision +Sage_OllamaLLMPromptVisionRefine +Sage_UNETLoader + +## Notes + +- This report is based on the current `NODE_LIST` construction in `nodes_v3.py` and the current files under `js/docs/`. +- The node list is interpreted from module-level arrays in the `nodes/` Python modules. +- If the package should include additional docs by convention, those docs should be added under `js/docs/` with a matching node class name. diff --git a/docs/planning/node_doc_template.md b/docs/planning/node_doc_template.md new file mode 100644 index 0000000..e16ccf5 --- /dev/null +++ b/docs/planning/node_doc_template.md @@ -0,0 +1,40 @@ +--- +type: Template +title: Sage Utils Node Documentation Template +description: Markdown template for automatically generating Sage Utils node documentation in js/docs. +tags: [planning, docs, nodes, template] +timestamp: 2026-07-01T00:00:00Z +--- + +# {{display_name}} + +* **Node ID:** `{{node_id}}` +* **Category:** `{{category}}` + +{{description}} + +## Inputs + +{{#inputs}} +### `{{name}}` — `{{type}}` +- **Name:** `{{display_name}}` +- **Description:** {{description}} +- **Optional:** {{optional}} + +{{/inputs}} + +## Outputs + +{{#outputs}} +### `{{name}}` — `{{type}}` +- **Name:** `{{display_name}}` +- **Description:** {{description}} +- **List output:** {{is_output_list}} + +{{/outputs}} + +## Notes + +- Replace placeholder values with the actual schema values for each node. +- If a node has no inputs or outputs, omit the corresponding section or leave a short note. +- Use this template as the base for generating `js/docs/.md` files. diff --git a/docs/planning/node_documentation_tool_plan.md b/docs/planning/node_documentation_tool_plan.md new file mode 100644 index 0000000..c506a20 --- /dev/null +++ b/docs/planning/node_documentation_tool_plan.md @@ -0,0 +1,170 @@ +# Node Documentation Extraction Tool Plan + +## Goal + +Create a tool that extracts Sage Utils node metadata from the existing `nodes/` implementation and provides: + +- `node_id` +- `display_name` +- `description` +- `category` +- `inputs` with descriptions +- `outputs` with descriptions + +This tool will support two main use cases: + +1. Pull a list of all Sage Utils nodes. +2. Pull detailed metadata for all Sage Utils nodes. + +Later, the output can be used to generate documentation and node reference content. + +## Background + +The Sage Utils node implementation already exposes a complete node list in `nodes_v3.py`. + +- `nodes_v3.py` imports all node modules from `nodes/*.py` +- Each node module defines a module-level array of node classes, such as `AUDIO_NODES`, `TEXT_NODES`, etc. +- `NODE_LIST` is built by concatenating those arrays. + +Each node class includes a `define_schema` classmethod that returns an `io.Schema` object. +The schema contains the node I/O definitions and should be the authoritative source for node metadata. + +## Scope + +The planned tool should operate on the existing Python node definitions and not require manual metadata annotations outside the node classes. + +### Inputs + +- `nodes_v3.py` and its imported node modules +- `NODE_LIST` +- `node.define_schema()` return values + +### Outputs + +For each node, the tool should emit a structured object with: + +- `node_id` — unique identifier for the node (class name or schema name) +- `display_name` — human-readable name if available +- `description` — node description or docstring from the schema +- `category` — node category if present on the schema +- `inputs` — list of input definitions with `name`, `type`, `description`, and fallback values where available +- `outputs` — list of output definitions with `name`, `type`, and `description` + +## Proposed API + +The tool should expose at least two actions: + +1. `list_nodes()` + - Returns the list of Sage Utils node IDs and display names. + +2. `get_node_metadata(node_ids=None)` + - Returns full metadata for the requested nodes. + - If `node_ids` is omitted, return metadata for all nodes. + +## Implementation Plan + +1. Create a tool module in the Sage Utils codebase under `tools/node_metadata_tool.py`. +2. Document the tool in `okf/tools/` by adding an OKF concept entry in `okf/tools/index.md` and describing it in `okf/tools/available_tools.md`. +3. Import `NODE_LIST` from `nodes_v3.py`. +4. Iterate over `NODE_LIST` and inspect each node class. +5. Call `node.define_schema()` and normalize the returned `io.Schema` object: + - extract `node_id`, `display_name`, `description`, and `category` + - extract `inputs` and `outputs` + - preserve input/output descriptions from the schema +6. Build a normalized metadata record for each node. +7. Return structured JSON/dictionary-friendly output. + +## Implementation layout + +The tool module should expose a small public API for extraction and support both list and metadata retrieval. + +Suggested module shape: + +```python +from .nodes_v3 import NODE_LIST +from comfy_api.latest import io + + +def list_nodes() -> list[dict[str, str]]: + """Return a shallow list of all Sage Utils nodes.""" + + +def get_node_metadata(node_ids: list[str] | None = None) -> list[dict[str, Any]]: + """Return full metadata for the requested Sage Utils nodes.""" +``` + +### Tool API contract + +- `list_nodes()` + - returns `[{'node_id': 'Sage_LoadImage', 'display_name': 'Load Image'}]` +- `get_node_metadata(node_ids=None)` + - returns a list of node metadata objects for either the requested nodes or all nodes if none are supplied + +A future wrapper can translate these functions into an AI-run tool interface or a CLI entrypoint. + +## Extraction details + +### Node list source + +- `nodes_v3.py` is the single source of truth for available Sage Utils nodes. +- It already imports every node module and constructs `NODE_LIST`. + +### Schema inspection + +The tool should rely on the `define_schema()` result rather than parsing source files. +This preserves the runtime behavior of nodes and picks up any schema logic expressed in Python. + +### Fallback behavior + +If a node or schema is missing a field: + +- use the class name as `node_id` +- use `title` or `name` as `display_name` +- allow empty `description` +- allow missing `category` + +### Output format + +Each node record should look like: + +```json +{ + "node_id": "Sage_LoadImage", + "display_name": "Load Image", + "description": "Load an image from file or URL.", + "category": "Image", + "inputs": [ + { + "name": "image_path", + "type": "String", + "description": "Path or URL of the image to load." + } + ], + "outputs": [ + { + "name": "image", + "type": "Image", + "description": "The loaded image tensor." + } + ] +} +``` + +## Next steps after the tool is available + +1. Use the tool output to generate node documentation skeletons. +2. Map extracted metadata into `js/docs/` markdown templates. +3. Optionally add automation that updates or validates `js/docs/` content based on the extracted schema. + +## Risks and open questions + +- Some nodes may use schema metadata fields differently; the tool should be robust to missing data. +- If `define_schema()` performs side effects or requires backend resources, the extraction should be sandboxed or invoked in a read-only mode. +- If node names are dynamic or locale-specific, preserve both the class name and schema-provided name. + +## Deliverables + +- `docs/planning/node_documentation_tool_plan.md` +- A tool implementation in Sage Utils that returns node list and node metadata +- A stable JSON output format for downstream documentation generation +- A follow-up plan for markdown generation from extracted metadata diff --git a/js/docs/SageSetWildcardText.md b/js/docs/SageSetWildcardText.md index 05e120f..cd4fd71 100644 --- a/js/docs/SageSetWildcardText.md +++ b/js/docs/SageSetWildcardText.md @@ -1,45 +1,49 @@ -# SageSetWildcardText +--- +type: NodeDoc +title: Text w/ Dynamic Prompts +description: Auto-generated node documentation. +tags: [nodes, docs] +--- -## Description +# Text w/ Dynamic Prompts -A text processing node that supports wildcard functionality for dynamic text generation. This node allows you to use wildcard patterns in text that can be randomly selected or processed to create varied outputs. +* **Node ID:** `SageSetWildcardText` +* **Category:** `Sage Utils/text/input` + +Loads user defined wildcard from the wildcards directory, and applies them to any wildcards in the text using the dynamic prompts library. ## Inputs -### Required +### `str_input` — `STRING` +- **Name:** `str` +- **Description:** Text containing dynamic prompt wildcards. -- **str** (STRING): The input text containing wildcard patterns -- **seed** (INT): Random seed for consistent wildcard selection (default: 0, range: 0 to 4294967295) -- **clean** (BOOLEAN): Whether to clean the output text (default: False) +### `seed` — `INT` +- **Name:** `seed` +- **Description:** Seed for wildcard generation. -### Optional +### `clean` — `BOOLEAN` +- **Name:** `clean` +- **Description:** Remove unwanted whitespace or formatting after prompt generation. + +### `prefix` — `STRING` (optional) +- **Name:** `prefix` +- **Description:** Text to prepend before dynamic prompt expansion. + +### `suffix` — `STRING` (optional) +- **Name:** `suffix` +- **Description:** Text to append after dynamic prompt expansion. -- **prefix** (STRING): Text to add before the main string -- **suffix** (STRING): Text to add after the main string ## Outputs -- **str** (STRING): The processed text with wildcards resolved +### `str_output` — `STRING` +- **Name:** `str` +- **Description:** Output value for str_output. -## Usage - -This node is useful for: - -- Creating varied prompts with random elements -- Dynamic text generation with predefined choices -- Adding randomness to your workflow text outputs -- Supporting wildcard syntax like {option1|option2|option3} - -## Wildcard Syntax - -- Use curly braces to define wildcard groups: `{option1|option2|option3}` -- Separate options with pipe characters `|` -- Can be nested for complex combinations -- Supports file-based wildcards if wildcard files are available ## Notes -- The seed parameter ensures reproducible results when using the same seed value -- Without a seed, wildcards will be randomly selected each time -- This node extends the basic text functionality with wildcard processing capabilities -- Compatible with standard wildcard formats used in other AI art tools + + +Generated from the node schema. diff --git a/js/docs/Sage_Ace15AudioEncode.md b/js/docs/Sage_Ace15AudioEncode.md new file mode 100644 index 0000000..f5b59d9 --- /dev/null +++ b/js/docs/Sage_Ace15AudioEncode.md @@ -0,0 +1,59 @@ +--- +type: NodeDoc +title: Ace Step 1.5 Audio Encode +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Ace Step 1.5 Audio Encode + +* **Node ID:** `Sage_Ace15AudioEncode` +* **Category:** `Sage Utils/audio` + +Encodes an audio clip into a conditioning using the Ace Step 1.5 model. This is used to create a conditioning from an audio reference. + +## Inputs + +### `clip` — `CLIP` +- **Description:** The audio clip to encode into Ace Step 1.5 conditioning. + +### `tags` — `STRING` +- **Description:** Descriptive tags or prompts for the audio encoding. + +### `lyrics` — `STRING` +- **Description:** Lyrics or vocal metadata to include during audio encoding. + +### `seed` — `INT` +- **Description:** Random seed used for encoding determinism. + +### `duration` — `FLOAT` +- **Description:** Target duration of the encoded audio in seconds. + +### `bpm` — `INT` +- **Description:** Beats-per-minute tempo used for audio conditioning. + +### `timesignature` — `COMBO` +- **Description:** Time signature for the encoded audio. + +### `keyscale` — `COMBO` +- **Description:** Musical key and scale for the encoded audio. + +### `generate_audio_codes` — `BOOLEAN` +- **Description:** Enable LLM-generated audio codes for higher-quality audio encoding. + +### `adv_audio_info` — `ADV_AUDIO_INFO` +- **Name:** `Advanced Audio Info` +- **Description:** Advanced audio encoding settings for Ace Step 1.5. + + +## Outputs + +### `None` — `CONDITIONING` +- **Description:** The generated Ace Step 1.5 conditioning for audio. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_AceAdvOptions.md b/js/docs/Sage_AceAdvOptions.md new file mode 100644 index 0000000..6bb93b4 --- /dev/null +++ b/js/docs/Sage_AceAdvOptions.md @@ -0,0 +1,47 @@ +--- +type: NodeDoc +title: Ace Advanced Options +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Ace Advanced Options + +* **Node ID:** `Sage_AceAdvOptions` +* **Category:** `Sage Utils/audio` + +Advanced options for Ace Step 1.5 audio encoding. These options can be used to fine-tune the behavior of the audio encoding process. + +## Inputs + +### `language` — `COMBO` +- **Description:** The language for Ace Step 1.5 audio encoding. + +### `cfg_scale` — `FLOAT` +- **Description:** How strongly the audio encoding should follow the conditioning. + +### `temperature` — `FLOAT` +- **Description:** Sampling temperature for the audio code generation. + +### `top_p` — `FLOAT` +- **Description:** Nucleus sampling probability threshold for audio code generation. + +### `top_k` — `INT` +- **Description:** Top-K sampling limit for audio code generation. + +### `min_p` — `FLOAT` +- **Description:** Minimum allowed probability for audio code sampling. + + +## Outputs + +### `adv_audio_info` — `ADV_AUDIO_INFO` +- **Name:** `Advanced Audio Info` +- **Description:** The configured advanced audio encoding options. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_AdvSamplerInfo.md b/js/docs/Sage_AdvSamplerInfo.md index 35cfdca..d13f94e 100644 --- a/js/docs/Sage_AdvSamplerInfo.md +++ b/js/docs/Sage_AdvSamplerInfo.md @@ -1,34 +1,45 @@ -# Sage_AdvSamplerInfo +--- +type: NodeDoc +title: Adv KSampler Info +description: Auto-generated node documentation. +tags: [nodes, docs] +--- -**Adv Sampler Info** +# Adv KSampler Info -Provides advanced sampler settings for granular control over the sampling process. +* **Node ID:** `Sage_AdvSamplerInfo` +* **Category:** `Sage Utils/sampler` + +Adds more optional values to the KSampler. ## Inputs -- **add_noise** (BOOLEAN, required): Whether to add noise during sampling - - Default: True -- **start_at_step** (INT, required): Step number to start sampling from - - Default: 0, Range: 0 to 10,000 -- **end_at_step** (INT, required): Step number to end sampling at - - Default: 10,000, Range: 0 to 10,000 -- **return_with_leftover_noise** (BOOLEAN, required): Whether to return result with remaining noise - - Default: False +### `add_noise` — `BOOLEAN` +- **Name:** `add_noise` +- **Description:** Whether to add noise during sampling. + +### `start_at_step` — `INT` +- **Name:** `start_at_step` +- **Description:** The first step at which to apply noise. + +### `end_at_step` — `INT` +- **Name:** `end_at_step` +- **Description:** The last step at which to apply noise. + +### `return_with_leftover_noise` — `BOOLEAN` +- **Name:** `return_with_leftover_noise` +- **Description:** Return the extra noise if not fully denoised. + ## Outputs -- **ADV_SAMPLER_INFO**: Dictionary containing advanced sampler parameters +### `adv_sampler_info` — `ADV_SAMPLER_INFO` +- **Name:** `adv_sampler_info` +- **Description:** The advanced sampler settings. -## Usage - -Use when you need granular control over the sampling process beyond basic parameters. Connect to KSampler nodes to enable advanced sampling features like partial denoising, step ranges, and noise control. ## Notes -- Designed to work with Sage_KSampler and related sampler nodes -- `add_noise`: Set to False for img2img workflows where noise should not be added -- `start_at_step` and `end_at_step`: Enable partial sampling for multi-stage workflows -- `return_with_leftover_noise`: Useful for multi-pass sampling or when preserving noise structure -- Step range allows for sampling only specific portions of the denoising process -- Provides functionality similar to ComfyUI's advanced KSampler -- Optional input for sampler nodes - basic functionality works without it + + +Generated from the node schema. diff --git a/js/docs/Sage_AnythingToStr.md b/js/docs/Sage_AnythingToStr.md new file mode 100644 index 0000000..ea01a19 --- /dev/null +++ b/js/docs/Sage_AnythingToStr.md @@ -0,0 +1,33 @@ +--- +type: NodeDoc +title: Anything to String +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Anything to String + +* **Node ID:** `Sage_AnythingToStr` +* **Category:** `Sage Utils/text/conversion` + +Converts any input to a string. + +## Inputs + +### `any` — `*` +- **Name:** `any` +- **Description:** Any input value to convert to a string. + + +## Outputs + +### `str` — `STRING` +- **Name:** `str` +- **Description:** Output value for str. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_AverageConditioning.md b/js/docs/Sage_AverageConditioning.md new file mode 100644 index 0000000..a8b9ea9 --- /dev/null +++ b/js/docs/Sage_AverageConditioning.md @@ -0,0 +1,331 @@ +--- +type: NodeDoc +title: Average Conditioning +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Average Conditioning + +* **Node ID:** `Sage_AverageConditioning` +* **Category:** `Sage Utils/clip/conditioning` + +Averages multiple conditioning inputs into one conditioning. + +## Inputs + +### `conditionings` — `COMFY_AUTOGROW_V3` +- **Description:** Input value for conditionings. + +### `conditioning_0` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_1` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_2` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_3` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_4` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_5` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_6` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_7` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_8` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_9` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_10` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_11` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_12` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_13` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_14` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_15` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_16` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_17` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_18` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_19` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_20` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_21` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_22` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_23` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_24` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_25` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_26` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_27` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_28` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_29` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_30` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_31` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_32` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_33` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_34` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_35` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_36` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_37` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_38` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_39` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_40` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_41` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_42` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_43` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_44` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_45` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_46` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_47` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_48` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_49` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_50` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_51` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_52` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_53` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_54` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_55` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_56` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_57` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_58` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_59` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_60` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_61` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_62` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_63` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_64` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_65` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_66` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_67` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_68` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_69` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_70` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_71` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_72` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_73` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_74` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_75` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_76` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_77` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_78` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_79` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_80` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_81` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_82` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_83` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_84` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_85` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_86` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_87` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_88` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_89` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_90` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_91` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_92` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_93` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_94` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_95` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_96` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_97` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_98` — `CONDITIONING` +- **Description:** A conditioning input to average. + +### `conditioning_99` — `CONDITIONING` +- **Description:** A conditioning input to average. + + +## Outputs + +### `conditioning` — `CONDITIONING` +- **Name:** `conditioning` + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_CLIPLoaderFromInfo.md b/js/docs/Sage_CLIPLoaderFromInfo.md new file mode 100644 index 0000000..36f9f41 --- /dev/null +++ b/js/docs/Sage_CLIPLoaderFromInfo.md @@ -0,0 +1,31 @@ +--- +type: NodeDoc +title: Load CLIP +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Load CLIP + +* **Node ID:** `Sage_CLIPLoaderFromInfo` +* **Category:** `Sage Utils/loader` + +Load the CLIP model component from clip_info. + +## Inputs + +### `clip_info` — `MODEL_INFO` +- **Name:** `clip_info` + + +## Outputs + +### `clip` — `CLIP` +- **Name:** `clip` + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_CLIPSelector.md b/js/docs/Sage_CLIPSelector.md new file mode 100644 index 0000000..905dbe1 --- /dev/null +++ b/js/docs/Sage_CLIPSelector.md @@ -0,0 +1,37 @@ +--- +type: NodeDoc +title: CLIP Selector +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# CLIP Selector + +* **Node ID:** `Sage_CLIPSelector` +* **Category:** `Sage Utils/selector` + +Selects a CLIP model from a list. + +## Inputs + +### `clip_name` — `COMBO` +- **Name:** `clip_name` +- **Description:** Choose a CLIP model to use. + +### `clip_type` — `COMBO` +- **Name:** `clip_type` +- **Description:** Choose the CLIP loader type for this single CLIP model. + + +## Outputs + +### `clip_info` — `MODEL_INFO` +- **Name:** `clip_info` +- **Description:** CLIP model info for the selected model. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_CheckLorasForUpdates.md b/js/docs/Sage_CheckLorasForUpdates.md index d8b85c0..1bc4bea 100644 --- a/js/docs/Sage_CheckLorasForUpdates.md +++ b/js/docs/Sage_CheckLorasForUpdates.md @@ -1,32 +1,44 @@ -# Sage_CheckLorasForUpdates +--- +type: NodeDoc +title: Check LoRAs For Updates +description: Auto-generated node documentation. +tags: [nodes, docs] +--- -**Check Loras for Updates** +# Check LoRAs For Updates -Checks LoRAs in your stack for available updates from Civitai and provides download information. +* **Node ID:** `Sage_CheckLorasForUpdates` +* **Category:** `Sage Utils/lora` + +Check if LoRAs in the stack have updates available on Civitai. ## Inputs -### Required +### `lora_stack` — `LORA_STACK` +- **Name:** `lora_stack` + +### `force` — `BOOLEAN` +- **Name:** `force` +- **Description:** Force a check even if marked up to date. -- **lora_stack** (LORA_STACK): The stack of LoRAs to check for updates -- **force** (BOOLEAN): Force a check for updates, even if the LoRA is up to date (default: False) ## Outputs -- **lora_stack** (LORA_STACK): The original LoRA stack (passed through) -- **path** (STRING): List of local paths for LoRAs that have updates available -- **latest_url** (STRING): List of Civitai URLs for the latest versions of updated LoRAs +### `out_lora_stack` — `LORA_STACK` +- **Name:** `lora_stack` +- **Description:** The original LoRA stack after update checking. -## Usage +### `path` — `STRING` +- **Name:** `path` +- **Description:** Stringified paths for any LoRAs with updates. + +### `latest_url` — `STRING` +- **Name:** `latest_url` +- **Description:** Latest Civitai URLs for LoRAs with updates. -Use to keep your LoRA library up to date with the latest versions. The node doesn't automatically download updates but provides the information needed to manually update. ## Notes -- Checks each LoRA in the stack against Civitai for newer versions -- Only reports LoRAs that have updates available -- Force option will re-check even recently checked LoRAs -- Returns Civitai URLs in format: `https://civitai.com/models/{modelId}?modelVersionId={versionId}` -- Does not automatically download or replace LoRAs -- Useful for maintenance workflows and keeping models current -- Requires LoRAs to have Civitai metadata for update checking + + +Generated from the node schema. diff --git a/js/docs/Sage_CheckpointSelector.md b/js/docs/Sage_CheckpointSelector.md index 71f02a1..01464a2 100644 --- a/js/docs/Sage_CheckpointSelector.md +++ b/js/docs/Sage_CheckpointSelector.md @@ -1,27 +1,33 @@ -# Sage_CheckpointSelector +--- +type: NodeDoc +title: Checkpoint Selector +description: Auto-generated node documentation. +tags: [nodes, docs] +--- -**Checkpoint Selector** +# Checkpoint Selector -Selects a model checkpoint and returns its metadata information without loading the actual model. +* **Node ID:** `Sage_CheckpointSelector` +* **Category:** `Sage Utils/selector` + +Selects a checkpoint from a list. ## Inputs -### Required +### `ckpt_name` — `COMBO` +- **Name:** `ckpt_name` +- **Description:** Choose a checkpoint model to load. -- **ckpt_name** (STRING): The name of the checkpoint (model) to select from available checkpoints ## Outputs -- **model_info** (MODEL_INFO): The model path and hash, all in one output +### `model_info` — `MODEL_INFO` +- **Name:** `model_info` +- **Description:** Model info bundle for the selected checkpoint. -## Usage - -Use to choose which model checkpoint to reference in your workflow without loading it. Useful for metadata workflows or conditional model loading. ## Notes -- Does not load the actual model, only returns metadata -- Automatically calculates and caches the model hash -- Pulls Civitai metadata information for the selected model -- Updates the timestamp for the selected model in the cache -- Useful for workflows that need model information before deciding whether to load + + +Generated from the node schema. diff --git a/js/docs/Sage_ChromaCLIPLoaderFromInfo.md b/js/docs/Sage_ChromaCLIPLoaderFromInfo.md new file mode 100644 index 0000000..8fd5759 --- /dev/null +++ b/js/docs/Sage_ChromaCLIPLoaderFromInfo.md @@ -0,0 +1,32 @@ +--- +type: NodeDoc +title: Load CLIP (w/ Chroma T5 Options) +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Load CLIP (w/ Chroma T5 Options) + +* **Node ID:** `Sage_ChromaCLIPLoaderFromInfo` +* **Category:** `Sage Utils/loader` + +Load the CLIP model component from clip_info, and apply T5 tokenizer options with min padding of 1, and min length of 0. + +## Inputs + +### `clip_info` — `MODEL_INFO` +- **Name:** `clip_info` + + +## Outputs + +### `clip` — `CLIP` +- **Name:** `clip` +- **Description:** The loaded CLIP model component with Chroma T5 tokenizer options applied. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_CleanText.md b/js/docs/Sage_CleanText.md index 2055879..69355b7 100644 --- a/js/docs/Sage_CleanText.md +++ b/js/docs/Sage_CleanText.md @@ -1,19 +1,33 @@ -# Sage_CleanText +--- +type: NodeDoc +title: Clean Text +description: Auto-generated node documentation. +tags: [nodes, docs] +--- -**Clean Text** +# Clean Text -Cleans or normalizes a text string by removing unwanted characters, excess whitespace, and formatting inconsistencies. Useful for preparing text for prompt or metadata processing. +* **Node ID:** `Sage_CleanText` +* **Category:** `Sage Utils/text/helper` + +Cleans up the string given. ## Inputs -### Required +### `str` — `STRING` +- **Name:** `str` +- **Description:** Text input to clean using the configured clean_text utility. -- **str** (STRING): The string to clean and normalize ## Outputs -- **cleaned_string** (STRING): The cleaned and normalized text +### `cleaned_string` — `STRING` +- **Name:** `cleaned string` +- **Description:** Output value for cleaned_string. -## Usage -Use before passing text to prompt or metadata nodes to ensure clean input. This node applies text cleaning functions that remove extra spaces, normalize line breaks, and clean up formatting issues that can interfere with text processing. +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_CollectKeywordsFromLoraStack.md b/js/docs/Sage_CollectKeywordsFromLoraStack.md index 934f364..2a65a2e 100644 --- a/js/docs/Sage_CollectKeywordsFromLoraStack.md +++ b/js/docs/Sage_CollectKeywordsFromLoraStack.md @@ -1,28 +1,32 @@ -# Sage_CollectKeywordsFromLoraStack +--- +type: NodeDoc +title: Collect Keywords From LoRA Stack +description: Auto-generated node documentation. +tags: [nodes, docs] +--- -**Lora Stack → Keywords** +# Collect Keywords From LoRA Stack -Extracts Civitai keywords from a LoRA stack and combines them into a single string. +* **Node ID:** `Sage_CollectKeywordsFromLoraStack` +* **Category:** `Sage Utils/lora` + +Collect keywords from all LoRAs in a stack. ## Inputs -### Required +### `lora_stack` — `LORA_STACK` +- **Name:** `lora_stack` -- **lora_stack** (LORA_STACK): The stack of LoRAs to extract keywords from ## Outputs -- **keywords** (STRING): Combined keywords from all LoRAs in the stack +### `keywords` — `STRING` +- **Name:** `keywords` +- **Description:** Collected keyword string extracted from the LoRA stack. -## Usage - -Use to extract and use keywords for metadata or prompt construction. Place at the end of a LoRA stack, or you won't get keywords for the entire stack. ## Notes -- Goes through each model in the LoRA stack and grabs keywords from Civitai -- Combines all keywords into one string for easy use -- Returns empty string if no LoRA stack is provided -- Must be connected after all LoRAs have been added to the stack -- Useful for automatic prompt enhancement based on LoRA metadata -- Keywords are sourced from Civitai model information + + +Generated from the node schema. diff --git a/js/docs/Sage_CombineCLIPMultilineTextEncode.md b/js/docs/Sage_CombineCLIPMultilineTextEncode.md new file mode 100644 index 0000000..dea9568 --- /dev/null +++ b/js/docs/Sage_CombineCLIPMultilineTextEncode.md @@ -0,0 +1,53 @@ +--- +type: NodeDoc +title: Combine CLIP Multiline Text Encode +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Combine CLIP Multiline Text Encode + +* **Node ID:** `Sage_CombineCLIPMultilineTextEncode` +* **Category:** `Sage Utils/clip/helpers` + +Encodes each non-empty line of multiline text with CLIP and combines them into one conditioning. + +## Inputs + +### `clip` — `CLIP` +- **Name:** `clip` +- **Description:** The CLIP model used for encoding the text. + +### `mode` — `COMBO` +- **Name:** `mode` +- **Description:** How to merge line conditionings. + +### `operation` — `COMFY_DYNAMICCOMBO_V3` +- **Name:** `operation` +- **Description:** Choose whether to scale the per-line conditioning output. + +### `value` — `FLOAT` +- **Name:** `value` +- **Description:** Multiply by this value. + +### `value` — `FLOAT` +- **Name:** `value` +- **Description:** Divide by this value. + +### `text` — `STRING` +- **Name:** `text` +- **Description:** Multiline text where each line is encoded separately. + + +## Outputs + +### `conditioning` — `CONDITIONING` +- **Name:** `conditioning` +- **Description:** A conditioning containing all encoded lines combined. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_CombineCLIPTextEncode.md b/js/docs/Sage_CombineCLIPTextEncode.md new file mode 100644 index 0000000..100513c --- /dev/null +++ b/js/docs/Sage_CombineCLIPTextEncode.md @@ -0,0 +1,348 @@ +--- +type: NodeDoc +title: Combine CLIP Text Encode +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Combine CLIP Text Encode + +* **Node ID:** `Sage_CombineCLIPTextEncode` +* **Category:** `Sage Utils/clip/helpers` + +Encodes multiple text inputs with CLIP and combines them into one conditioning. + +## Inputs + +### `clip` — `CLIP` +- **Name:** `clip` +- **Description:** The CLIP model used for encoding the text. + +### `operation` — `COMFY_DYNAMICCOMBO_V3` +- **Name:** `operation` +- **Description:** Choose whether to scale the combined text conditioning. + +### `value` — `FLOAT` +- **Name:** `value` +- **Description:** Multiply by this value. + +### `value` — `FLOAT` +- **Name:** `value` +- **Description:** Divide by this value. + +### `texts` — `COMFY_AUTOGROW_V3` +- **Description:** Input value for texts. + +### `text_0` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_1` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_2` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_3` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_4` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_5` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_6` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_7` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_8` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_9` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_10` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_11` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_12` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_13` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_14` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_15` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_16` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_17` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_18` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_19` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_20` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_21` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_22` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_23` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_24` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_25` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_26` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_27` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_28` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_29` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_30` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_31` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_32` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_33` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_34` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_35` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_36` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_37` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_38` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_39` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_40` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_41` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_42` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_43` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_44` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_45` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_46` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_47` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_48` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_49` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_50` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_51` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_52` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_53` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_54` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_55` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_56` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_57` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_58` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_59` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_60` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_61` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_62` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_63` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_64` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_65` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_66` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_67` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_68` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_69` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_70` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_71` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_72` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_73` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_74` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_75` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_76` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_77` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_78` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_79` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_80` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_81` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_82` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_83` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_84` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_85` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_86` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_87` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_88` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_89` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_90` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_91` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_92` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_93` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_94` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_95` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_96` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_97` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_98` — `STRING` +- **Description:** A dynamic text prompt input to encode. + +### `text_99` — `STRING` +- **Description:** A dynamic text prompt input to encode. + + +## Outputs + +### `conditioning` — `CONDITIONING` +- **Name:** `conditioning` +- **Description:** A conditioning containing all encoded text prompts combined. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_CombineConditioning.md b/js/docs/Sage_CombineConditioning.md new file mode 100644 index 0000000..f8c1eab --- /dev/null +++ b/js/docs/Sage_CombineConditioning.md @@ -0,0 +1,343 @@ +--- +type: NodeDoc +title: Combine Conditioning +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Combine Conditioning + +* **Node ID:** `Sage_CombineConditioning` +* **Category:** `Sage Utils/clip/conditioning` + +Combines multiple conditionings into a single conditioning. + +## Inputs + +### `operation` — `COMFY_DYNAMICCOMBO_V3` +- **Name:** `operation` +- **Description:** Select how conditioning values should be scaled. + +### `value` — `FLOAT` +- **Name:** `value` +- **Description:** Multiply by this value. + +### `value` — `FLOAT` +- **Name:** `value` +- **Description:** Divide by this value. + +### `conditionings` — `COMFY_AUTOGROW_V3` +- **Description:** Input value for conditionings. + +### `conditioning_0` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_1` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_2` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_3` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_4` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_5` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_6` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_7` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_8` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_9` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_10` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_11` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_12` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_13` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_14` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_15` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_16` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_17` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_18` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_19` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_20` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_21` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_22` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_23` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_24` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_25` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_26` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_27` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_28` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_29` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_30` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_31` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_32` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_33` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_34` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_35` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_36` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_37` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_38` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_39` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_40` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_41` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_42` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_43` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_44` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_45` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_46` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_47` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_48` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_49` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_50` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_51` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_52` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_53` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_54` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_55` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_56` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_57` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_58` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_59` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_60` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_61` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_62` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_63` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_64` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_65` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_66` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_67` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_68` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_69` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_70` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_71` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_72` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_73` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_74` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_75` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_76` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_77` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_78` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_79` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_80` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_81` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_82` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_83` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_84` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_85` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_86` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_87` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_88` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_89` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_90` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_91` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_92` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_93` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_94` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_95` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_96` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_97` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_98` — `CONDITIONING` +- **Description:** A conditioning input to combine. + +### `conditioning_99` — `CONDITIONING` +- **Description:** A conditioning input to combine. + + +## Outputs + +### `conditioning` — `CONDITIONING` +- **Name:** `conditioning` + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_ConstructLLMPrompt.md b/js/docs/Sage_ConstructLLMPrompt.md index 07bcb4a..7d6df03 100644 --- a/js/docs/Sage_ConstructLLMPrompt.md +++ b/js/docs/Sage_ConstructLLMPrompt.md @@ -1,32 +1,73 @@ -# Sage_ConstructLLMPrompt +--- +type: NodeDoc +title: Construct LLM Prompt +description: Auto-generated node documentation. +tags: [nodes, docs] +--- -**Construct LLM Prompt** +# Construct LLM Prompt -Builds a comprehensive prompt for use with LLM nodes based on predefined templates and customizable options. +* **Node ID:** `Sage_ConstructLLMPrompt` +* **Category:** `Sage Utils/LLM` + +Construct a prompt for an LLM based on the provided image and prompt. ## Inputs -### Required +### `prompt` — `COMBO` +- **Name:** `prompt` +- **Description:** The base prompt template to construct. + +### `extra_instructions` — `STRING` +- **Name:** `extra_instructions` +- **Description:** Additional instructions to append to the generated prompt. + +### `only_output_description` — `BOOLEAN` +- **Description:** Only Output Description + +### `avoid_euphemisms` — `BOOLEAN` +- **Description:** Avoid Euphemisms + +### `non_technical` — `BOOLEAN` +- **Description:** Non-technical Terms + +### `be_specific` — `BOOLEAN` +- **Description:** Be Specific + +### `use_vulgar_language` — `BOOLEAN` +- **Description:** Use Vulgar Slang and Profanity + +### `erotic_imagery` — `BOOLEAN` +- **Description:** Erotic Imagery + +### `adult_content` — `BOOLEAN` +- **Description:** Adult Content + +### `exclude_sexual` — `BOOLEAN` +- **Description:** Exclude Sexual Content + +### `only_describe_key_elements` — `BOOLEAN` +- **Description:** Describe Key Elements Only + +### `avoid_flowery_language` — `BOOLEAN` +- **Description:** Avoid Flowery Language + +### `exclude_watermarks` — `BOOLEAN` +- **Description:** Exclude Watermarks + +### `exaggerate_quality` — `BOOLEAN` +- **Description:** Exaggerate Image Quality -- **prompt** (STRING): Base prompt template from available categories (multiline) -- **extra_instructions** (STRING): Additional custom instructions to append (multiline, default: "") -- **Various style/quality/content options** (BOOLEAN): Dynamic options based on available prompt extras (style, quality, content_focus categories) ## Outputs -- **prompt** (STRING): The constructed prompt ready for LLM use +### `out_prompt` — `STRING` +- **Name:** `prompt` +- **Description:** The constructed LLM prompt. -## Usage - -Use to assemble comprehensive prompts for LLM nodes in your workflow. Select from predefined prompt templates and add custom instructions and style options. ## Notes -- **EXPERIMENTAL**: This node is experimental and may change in future versions -- Prompt templates are loaded from llm_prompts.json configuration -- Available prompts are organized by category and shown as "category/prompt_name" -- Style, quality, and content focus options are dynamically generated based on configuration -- Ensures proper sentence-ending punctuation and formatting -- Extra instructions are appended after the base prompt and options -- Boolean options add their associated prompt text when enabled -- Prompt cannot be empty after construction + + +Generated from the node schema. diff --git a/js/docs/Sage_ConstructLLMPromptExtra.md b/js/docs/Sage_ConstructLLMPromptExtra.md index 1977168..aa32b7d 100644 --- a/js/docs/Sage_ConstructLLMPromptExtra.md +++ b/js/docs/Sage_ConstructLLMPromptExtra.md @@ -1,31 +1,84 @@ -# Sage_ConstructLLMPromptExtra +--- +type: NodeDoc +title: Construct LLM Prompt Extra +description: Auto-generated node documentation. +tags: [nodes, docs] +--- -**Construct LLM Prompt Extra** +# Construct LLM Prompt Extra -Builds extra instructions for LLM prompts using advanced options not covered in the main prompt constructor. +* **Node ID:** `Sage_ConstructLLMPromptExtra` +* **Category:** `Sage Utils/LLM` + +Construct extra instructions for an LLM based on the provided options. ## Inputs -### Required +### `extra_instructions` — `STRING` +- **Name:** `extra_instructions` +- **Description:** Extra instruction text to include with the prompt. + +### `include_emphasis_on_details` — `BOOLEAN` +- **Description:** Emphasize Details + +### `include_lighting` — `BOOLEAN` +- **Description:** Include Lighting + +### `include_marks` — `BOOLEAN` +- **Description:** Include Marks + +### `include_camera_details` — `BOOLEAN` +- **Description:** Include Camera Details + +### `describe_mood` — `BOOLEAN` +- **Description:** Describe Mood + +### `describe_actions` — `BOOLEAN` +- **Description:** Describe Actions + +### `describe_setting` — `BOOLEAN` +- **Description:** Describe Setting + +### `include_time_of_day` — `BOOLEAN` +- **Description:** Include Time of Day + +### `include_weather` — `BOOLEAN` +- **Description:** Include Weather + +### `include_materials` — `BOOLEAN` +- **Description:** Include Materials + +### `include_motion` — `BOOLEAN` +- **Description:** Include Motion + +### `include_context` — `BOOLEAN` +- **Description:** Include Context + +### `include_scale` — `BOOLEAN` +- **Description:** Include Scale + +### `include_cultural_references` — `BOOLEAN` +- **Description:** Include Cultural References + +### `include_anomalies` — `BOOLEAN` +- **Description:** Include Anomalies + +### `include_symmetry` — `BOOLEAN` +- **Description:** Include Symmetry + +### `include_reflections` — `BOOLEAN` +- **Description:** Include Reflections -- **extra_instructions** (STRING): Custom extra instructions to include (multiline, default: "") -- **Various advanced options** (BOOLEAN): Dynamic options for categories other than style, quality, and content_focus ## Outputs -- **extra** (STRING): The constructed extra instructions string +### `extra` — `STRING` +- **Name:** `extra` +- **Description:** The generated extra instructions for the LLM. -## Usage - -Use to assemble advanced extra instructions for LLM nodes. This node provides access to additional prompt options not available in the main constructor. ## Notes -- **EXPERIMENTAL**: This node is experimental and may change in future versions -- Complements Sage_ConstructLLMPrompt by handling advanced options -- Options are loaded from llm_prompts.json configuration -- Only shows options NOT in style, quality, or content_focus categories -- Each enabled boolean option adds its associated prompt text -- Custom extra_instructions are prepended to the generated options -- Results can be combined with main prompt outputs -- Automatic formatting with proper line breaks and spacing + + +Generated from the node schema. diff --git a/js/docs/Sage_ConstructMetadataFlexible.md b/js/docs/Sage_ConstructMetadataFlexible.md new file mode 100644 index 0000000..f847d05 --- /dev/null +++ b/js/docs/Sage_ConstructMetadataFlexible.md @@ -0,0 +1,61 @@ +--- +type: NodeDoc +title: Construct Metadata Flexible +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Construct Metadata Flexible + +* **Node ID:** `Sage_ConstructMetadataFlexible` +* **Category:** `Sage Utils/metadata` + +Flexible metadata constructor supporting multiple styles: A1111 Full (with LoRA hashes), A1111 Lite (simplified, only includes models on Civitai), Simple (No models or LoRAs) as well as any others defined in metadata_templates. + +## Inputs + +### `model_info` — `MODEL_INFO` +- **Name:** `model_info` +- **Description:** Model info used to build metadata, such as checkpoint and model details. + +### `positive_string` — `STRING` +- **Name:** `positive_string` +- **Description:** The positive prompt text to include in metadata. + +### `negative_string` — `STRING` +- **Name:** `negative_string` +- **Description:** The negative prompt text to include in metadata. + +### `sampler_info` — `SAMPLER_INFO` +- **Name:** `sampler_info` +- **Description:** Sampler settings used to generate the image. + +### `width` — `INT` +- **Name:** `width` +- **Description:** Image width used in metadata. + +### `height` — `INT` +- **Name:** `height` +- **Description:** Image height used in metadata. + +### `metadata_style` — `COMBO` +- **Name:** `metadata_style` +- **Description:** The metadata style format to produce. + +### `lora_stack` — `LORA_STACK` (optional) +- **Name:** `lora_stack` +- **Description:** Optional LoRA stack information to include in metadata. + + +## Outputs + +### `param_metadata` — `STRING` +- **Name:** `param_metadata` +- **Description:** The generated metadata string. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_CropImage.md b/js/docs/Sage_CropImage.md new file mode 100644 index 0000000..97ab20a --- /dev/null +++ b/js/docs/Sage_CropImage.md @@ -0,0 +1,49 @@ +--- +type: NodeDoc +title: Crop Image +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Crop Image + +* **Node ID:** `Sage_CropImage` +* **Category:** `Sage Utils/image/manipulation` + +Crops an image based on specified coordinates. + +## Inputs + +### `image` — `IMAGE` +- **Name:** `image` +- **Description:** The image to crop. + +### `left` — `INT` +- **Name:** `left` +- **Description:** The left coordinate for cropping. + +### `top` — `INT` +- **Name:** `top` +- **Description:** The top coordinate for cropping. + +### `right` — `INT` +- **Name:** `right` +- **Description:** The right coordinate for cropping. + +### `bottom` — `INT` +- **Name:** `bottom` +- **Description:** The bottom coordinate for cropping. + + +## Outputs + +### `out_image` — `IMAGE` +- **Name:** `image` +- **Description:** The cropped image. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_CubiqImageResize.md b/js/docs/Sage_CubiqImageResize.md index 2f7acb6..619b919 100644 --- a/js/docs/Sage_CubiqImageResize.md +++ b/js/docs/Sage_CubiqImageResize.md @@ -1,66 +1,65 @@ -# Sage_CubiqImageResize +--- +type: NodeDoc +title: Cubiq Image Resize +description: Auto-generated node documentation. +tags: [nodes, docs] +--- -## Advanced Image Resize +# Cubiq Image Resize -An advanced image resizing node based on ComfyUI-Essentials functionality. Provides high-quality image resizing with multiple interpolation methods and precise dimension control. +* **Node ID:** `Sage_CubiqImageResize` +* **Category:** `Sage Utils/image/manipulation` + +Resizes an image using Cubiq interpolation. ## Inputs -### Required +### `image` — `IMAGE` +- **Name:** `image` +- **Description:** The image to resize. + +### `width` — `INT` +- **Name:** `width` +- **Description:** The target width. + +### `height` — `INT` +- **Name:** `height` +- **Description:** The target height. + +### `interpolation` — `COMBO` +- **Name:** `interpolation` +- **Description:** The interpolation method. + +### `method` — `COMBO` +- **Name:** `method` +- **Description:** The resizing method. + +### `condition` — `COMBO` +- **Name:** `condition` +- **Description:** The condition for conditioned resizing. + +### `multiple_of` — `INT` +- **Name:** `multiple_of` +- **Description:** Ensure dimensions are multiples of this value. -- **image** (IMAGE): The input image to resize -- **width** (INT): Target width in pixels (default: 1024, range: 0 to MAX_RESOLUTION) -- **height** (INT): Target height in pixels (default: 1024, range: 0 to MAX_RESOLUTION) -- **interpolation** (COMBO): Interpolation method - "nearest", "bilinear", "bicubic", "area", "nearest-exact", "lanczos", "bislerp" -- **method** (COMBO): Resize method - "stretch", "keep proportion", "fill / crop", "pad" -- **condition** (COMBO): When to resize - "always", "downscale if bigger", "upscale if smaller", "if bigger area", "if smaller area" -- **multiple_of** (INT): Ensure dimensions are multiples of this value (default: 0, range: 0-1024) ## Outputs -- **IMAGE** (IMAGE): The resized image -- **width** (INT): Actual output width -- **height** (INT): Actual output height +### `out_image` — `IMAGE` +- **Name:** `image` +- **Description:** The resized image. -## Resize Methods +### `out_width` — `INT` +- **Name:** `width` +- **Description:** The new width. -- **stretch**: Stretch image to exact dimensions (may distort aspect ratio) -- **keep proportion**: Maintain aspect ratio, fit within target dimensions -- **fill / crop**: Fill target dimensions, crop excess while maintaining aspect ratio -- **pad**: Fit within dimensions and pad with black borders if needed +### `out_height` — `INT` +- **Name:** `height` +- **Description:** The new height. -## Interpolation Options - -- **nearest**: Fastest, pixelated results for pixel art -- **bilinear**: Good balance of speed and quality -- **bicubic**: Higher quality, smoother results -- **area**: Best for downscaling operations -- **nearest-exact**: Precise nearest neighbor -- **lanczos**: Highest quality, best for upscaling -- **bislerp**: ComfyUI's optimized bicubic interpolation - -## Condition Options - -- **always**: Always resize regardless of current size -- **downscale if bigger**: Only resize if image is larger than target -- **upscale if smaller**: Only resize if image is smaller than target -- **if bigger area**: Resize if total pixel area is larger -- **if smaller area**: Resize if total pixel area is smaller - -## Usage - -This node is ideal for: - -- Resizing images for specific model requirements -- Preparing images for different processing stages -- Maintaining or adjusting aspect ratios -- Batch processing images to consistent dimensions ## Notes -- Based on the proven ComfyUI-Essentials resize implementation (MIT license) -- Original author: cubiq (Matteo Spinelli) -- The multiple_of parameter ensures compatibility with models requiring specific dimension alignment -- Conditional resizing prevents unnecessary processing -- Supports both upscaling and downscaling with appropriate quality settings -- Output dimensions are clamped to valid ranges and multiples as specified + + +Generated from the node schema. diff --git a/js/docs/Sage_DualCLIPSelector.md b/js/docs/Sage_DualCLIPSelector.md new file mode 100644 index 0000000..0b0b34d --- /dev/null +++ b/js/docs/Sage_DualCLIPSelector.md @@ -0,0 +1,41 @@ +--- +type: NodeDoc +title: Dual CLIP Selector +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Dual CLIP Selector + +* **Node ID:** `Sage_DualCLIPSelector` +* **Category:** `Sage Utils/selector` + +Selects two CLIP models from a list. + +## Inputs + +### `clip_name_1` — `COMBO` +- **Name:** `clip_name_1` +- **Description:** Choose the first CLIP model for the pair. + +### `clip_name_2` — `COMBO` +- **Name:** `clip_name_2` +- **Description:** Choose the second CLIP model for the pair. + +### `clip_type` — `COMBO` +- **Name:** `clip_type` +- **Description:** Choose the CLIP loader type for this dual CLIP pair. + + +## Outputs + +### `clip_info` — `MODEL_INFO` +- **Name:** `clip_info` +- **Description:** Combined CLIP model info for the selected pair. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_DualCLIPTextEncode.md b/js/docs/Sage_DualCLIPTextEncode.md index f3a95ad..6897724 100644 --- a/js/docs/Sage_DualCLIPTextEncode.md +++ b/js/docs/Sage_DualCLIPTextEncode.md @@ -1,38 +1,57 @@ -# Sage_DualCLIPTextEncode +--- +type: NodeDoc +title: Dual CLIP Text Encode +description: Auto-generated node documentation. +tags: [nodes, docs] +--- -**Dual Prompt Encode** +# Dual CLIP Text Encode -Encodes positive and negative prompts using a CLIP model, returning both conditionings and the input text with optional text cleaning. +* **Node ID:** `Sage_DualCLIPTextEncode` +* **Category:** `Sage Utils/clip/encode/text` + +Turns a positive and negative prompt into conditionings, and passes through the prompts. Saves space over two CLIP Text Encoders, and zeros any input not hooked up. ## Inputs -### Required +### `clip` — `CLIP` +- **Name:** `clip` +- **Description:** The CLIP model used for encoding the text. -- **clip** (CLIP): The CLIP model used for encoding the text -- **clean** (BOOLEAN): Clean up the text, getting rid of extra spaces, commas, etc. (default: False) +### `clean` — `BOOLEAN` +- **Name:** `clean` +- **Description:** Clean up the text, getting rid of extra spaces, commas, etc. -### Optional +### `pos` — `STRING` (optional) +- **Name:** `pos` +- **Description:** The positive prompt's text. + +### `neg` — `STRING` (optional) +- **Name:** `neg` +- **Description:** The negative prompt's text. -- **pos** (STRING): The positive prompt's text (multiline, supports dynamic prompts) -- **neg** (STRING): The negative prompt's text (multiline, supports dynamic prompts) ## Outputs -- **positive** (CONDITIONING): Conditioning containing the embedded positive text used to guide the diffusion model -- **negative** (CONDITIONING): Conditioning containing the embedded negative text. If neg is not connected, it'll be automatically zeroed -- **pos_text** (STRING): The positive prompt text (cleaned if clean=True) -- **neg_text** (STRING): The negative prompt text (cleaned if clean=True) +### `positive` — `CONDITIONING` +- **Name:** `positive` +- **Description:** A conditioning containing the embedded text used to guide the diffusion model. -## Usage +### `negative` — `CONDITIONING` +- **Name:** `negative` +- **Description:** A conditioning containing the embedded text used to guide the diffusion model. + +### `pos_text` — `STRING` +- **Name:** `pos_text` +- **Description:** The positive prompt's text. + +### `neg_text` — `STRING` +- **Name:** `neg_text` +- **Description:** The negative prompt's text. -Use to generate conditioning for both positive and negative prompts in workflows. Saves space over two separate CLIP Text Encoders, and automatically zeros any input not connected. ## Notes -- More efficient than using two separate CLIP Text Encoder nodes -- Automatically handles unconnected inputs by zeroing the conditioning -- Text cleaning removes extra spaces, commas, and formatting issues -- Supports dynamic prompts for both positive and negative inputs -- Progress bar shows encoding progress for both prompts -- Part of "Sage Utils/clip" category for conditioning operations -- Returns both the conditioning tensors and the original text for further processing + + +Generated from the node schema. diff --git a/js/docs/Sage_DualCLIPTextEncodeLumina2.md b/js/docs/Sage_DualCLIPTextEncodeLumina2.md index 4a539ed..b9efd2e 100644 --- a/js/docs/Sage_DualCLIPTextEncodeLumina2.md +++ b/js/docs/Sage_DualCLIPTextEncodeLumina2.md @@ -1,51 +1,61 @@ -# Sage_DualCLIPTextEncodeLumina2 +--- +type: NodeDoc +title: Dual CLIP Text Encode Lumina 2 +description: Auto-generated node documentation. +tags: [nodes, docs] +--- -**Dual Prompt Encode (Lumina 2)** +# Dual CLIP Text Encode Lumina 2 -Encodes positive and negative prompts using a CLIP model with Lumina 2-specific system prompts for enhanced image-text alignment. +* **Node ID:** `Sage_DualCLIPTextEncodeLumina2` +* **Category:** `Sage Utils/clip/encode/text` + +Turns a positive and negative prompt into conditionings, and passes through the prompts. Saves space over two CLIP Text Encoders, and zeros any input not hooked up. ## Inputs -### Required +### `clip` — `CLIP` +- **Name:** `clip` +- **Description:** The CLIP model used for encoding the text. -- **clip** (CLIP): The CLIP model used for encoding the text -- **system_prompt** (STRING): Lumina 2 system prompt type selection -- **clean** (BOOLEAN): Clean up the text, getting rid of extra spaces, commas, etc. (default: False) +### `system_prompt` — `COMBO` +- **Name:** `system_prompt` +- **Description:** Lumina2 provide two types of system prompts: Superior: You are an assistant designed to generate superior images with the superior degree of image-text alignment based on textual prompts or user prompts. Alignment: You are an assistant designed to generate high-quality images with the highest degree of image-text alignment based on textual prompts. -### Optional +### `clean` — `BOOLEAN` +- **Name:** `clean` +- **Description:** Clean up the text, getting rid of extra spaces, commas, etc. + +### `pos` — `STRING` (optional) +- **Name:** `pos` +- **Description:** The positive prompt's text. + +### `neg` — `STRING` (optional) +- **Name:** `neg` +- **Description:** The negative prompt's text. -- **pos** (STRING): The positive prompt's text (multiline, supports dynamic prompts) -- **neg** (STRING): The negative prompt's text (multiline, supports dynamic prompts) ## Outputs -- **pos_cond** (CONDITIONING): Conditioning containing the embedded positive text with system prompt -- **neg_cond** (CONDITIONING): Conditioning containing the embedded negative text with system prompt. If neg is not connected, it'll be automatically zeroed -- **pos_text** (STRING): The positive prompt text with system prompt prefix (cleaned if clean=True) -- **neg_text** (STRING): The negative prompt text with system prompt prefix (cleaned if clean=True) +### `positive` — `CONDITIONING` +- **Name:** `positive` +- **Description:** A conditioning containing the embedded text used to guide the diffusion model. -## System Prompt Options +### `negative` — `CONDITIONING` +- **Name:** `negative` +- **Description:** A conditioning containing the embedded text used to guide the diffusion model. -### Superior +### `pos_text` — `STRING` +- **Name:** `pos_text` +- **Description:** The positive prompt's text. -"You are an assistant designed to generate superior images with the superior degree of image-text alignment based on textual prompts or user prompts." +### `neg_text` — `STRING` +- **Name:** `neg_text` +- **Description:** The negative prompt's text. -### Alignment - -"You are an assistant designed to generate high-quality images with the highest degree of image-text alignment based on textual prompts." - -## Usage - -Use for workflows that require Lumina 2 prompt encoding with specialized system prompts. The system prompts are automatically prepended to your prompts with `` delimiter. ## Notes -- Specifically designed for Lumina 2 model compatibility -- System prompts enhance image-text alignment quality -- Automatically formats prompts as: `{system_prompt} {user_prompt}` -- More efficient than using two separate CLIP Text Encoder nodes -- Automatically handles unconnected inputs by zeroing the conditioning -- Text cleaning removes extra spaces, commas, and formatting issues -- Supports dynamic prompts for both positive and negative inputs -- Progress bar shows encoding progress for both prompts -- Part of "Sage Utils/clip" category for conditioning operations + + +Generated from the node schema. diff --git a/js/docs/Sage_DualCLIPTextEncodeQwen.md b/js/docs/Sage_DualCLIPTextEncodeQwen.md new file mode 100644 index 0000000..bb526d8 --- /dev/null +++ b/js/docs/Sage_DualCLIPTextEncodeQwen.md @@ -0,0 +1,69 @@ +--- +type: NodeDoc +title: Dual CLIP Text Encode Qwen +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Dual CLIP Text Encode Qwen + +* **Node ID:** `Sage_DualCLIPTextEncodeQwen` +* **Category:** `Sage Utils/clip/encode/image` + +Turns a positive and negative prompt into conditionings, and passes through the prompts. Saves space over two Qwen Image Edit Text Encoders, and zeros any input not hooked up. + +## Inputs + +### `clip` — `CLIP` +- **Name:** `clip` +- **Description:** The CLIP model used for encoding the text. + +### `clean` — `BOOLEAN` +- **Name:** `clean` +- **Description:** Clean up the text, getting rid of extra spaces, commas, etc. + +### `vae` — `VAE` (optional) +- **Name:** `vae` +- **Description:** The VAE model used for encoding the reference image. + +### `pos` — `STRING` (optional) +- **Name:** `pos` +- **Description:** The positive prompt's text. + +### `neg` — `STRING` (optional) +- **Name:** `neg` +- **Description:** The negative prompt's text. + +### `pos_image` — `IMAGE` (optional) +- **Name:** `pos_image` +- **Description:** The positive prompt's image. + +### `neg_image` — `IMAGE` (optional) +- **Name:** `neg_image` +- **Description:** The negative prompt's image. + + +## Outputs + +### `positive` — `CONDITIONING` +- **Name:** `positive` +- **Description:** A conditioning containing the embedded text used to guide the diffusion model. + +### `negative` — `CONDITIONING` +- **Name:** `negative` +- **Description:** A conditioning containing the embedded text used to guide the diffusion model. + +### `pos_text` — `STRING` +- **Name:** `pos_text` +- **Description:** The positive prompt's text. + +### `neg_text` — `STRING` +- **Name:** `neg_text` +- **Description:** The negative prompt's text. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_DynamicJoinText.md b/js/docs/Sage_DynamicJoinText.md new file mode 100644 index 0000000..189e879 --- /dev/null +++ b/js/docs/Sage_DynamicJoinText.md @@ -0,0 +1,340 @@ +--- +type: NodeDoc +title: Join Text +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Join Text + +* **Node ID:** `Sage_DynamicJoinText` +* **Category:** `Sage Utils/text/helper` + +Joins multiple strings with a separator. + +## Inputs + +### `strings` — `COMFY_AUTOGROW_V3` +- **Description:** Input value for strings. + +### `str_0` — `STRING` +- **Description:** Each string input to join. + +### `str_1` — `STRING` +- **Description:** Each string input to join. + +### `str_2` — `STRING` +- **Description:** Each string input to join. + +### `str_3` — `STRING` +- **Description:** Each string input to join. + +### `str_4` — `STRING` +- **Description:** Each string input to join. + +### `str_5` — `STRING` +- **Description:** Each string input to join. + +### `str_6` — `STRING` +- **Description:** Each string input to join. + +### `str_7` — `STRING` +- **Description:** Each string input to join. + +### `str_8` — `STRING` +- **Description:** Each string input to join. + +### `str_9` — `STRING` +- **Description:** Each string input to join. + +### `str_10` — `STRING` +- **Description:** Each string input to join. + +### `str_11` — `STRING` +- **Description:** Each string input to join. + +### `str_12` — `STRING` +- **Description:** Each string input to join. + +### `str_13` — `STRING` +- **Description:** Each string input to join. + +### `str_14` — `STRING` +- **Description:** Each string input to join. + +### `str_15` — `STRING` +- **Description:** Each string input to join. + +### `str_16` — `STRING` +- **Description:** Each string input to join. + +### `str_17` — `STRING` +- **Description:** Each string input to join. + +### `str_18` — `STRING` +- **Description:** Each string input to join. + +### `str_19` — `STRING` +- **Description:** Each string input to join. + +### `str_20` — `STRING` +- **Description:** Each string input to join. + +### `str_21` — `STRING` +- **Description:** Each string input to join. + +### `str_22` — `STRING` +- **Description:** Each string input to join. + +### `str_23` — `STRING` +- **Description:** Each string input to join. + +### `str_24` — `STRING` +- **Description:** Each string input to join. + +### `str_25` — `STRING` +- **Description:** Each string input to join. + +### `str_26` — `STRING` +- **Description:** Each string input to join. + +### `str_27` — `STRING` +- **Description:** Each string input to join. + +### `str_28` — `STRING` +- **Description:** Each string input to join. + +### `str_29` — `STRING` +- **Description:** Each string input to join. + +### `str_30` — `STRING` +- **Description:** Each string input to join. + +### `str_31` — `STRING` +- **Description:** Each string input to join. + +### `str_32` — `STRING` +- **Description:** Each string input to join. + +### `str_33` — `STRING` +- **Description:** Each string input to join. + +### `str_34` — `STRING` +- **Description:** Each string input to join. + +### `str_35` — `STRING` +- **Description:** Each string input to join. + +### `str_36` — `STRING` +- **Description:** Each string input to join. + +### `str_37` — `STRING` +- **Description:** Each string input to join. + +### `str_38` — `STRING` +- **Description:** Each string input to join. + +### `str_39` — `STRING` +- **Description:** Each string input to join. + +### `str_40` — `STRING` +- **Description:** Each string input to join. + +### `str_41` — `STRING` +- **Description:** Each string input to join. + +### `str_42` — `STRING` +- **Description:** Each string input to join. + +### `str_43` — `STRING` +- **Description:** Each string input to join. + +### `str_44` — `STRING` +- **Description:** Each string input to join. + +### `str_45` — `STRING` +- **Description:** Each string input to join. + +### `str_46` — `STRING` +- **Description:** Each string input to join. + +### `str_47` — `STRING` +- **Description:** Each string input to join. + +### `str_48` — `STRING` +- **Description:** Each string input to join. + +### `str_49` — `STRING` +- **Description:** Each string input to join. + +### `str_50` — `STRING` +- **Description:** Each string input to join. + +### `str_51` — `STRING` +- **Description:** Each string input to join. + +### `str_52` — `STRING` +- **Description:** Each string input to join. + +### `str_53` — `STRING` +- **Description:** Each string input to join. + +### `str_54` — `STRING` +- **Description:** Each string input to join. + +### `str_55` — `STRING` +- **Description:** Each string input to join. + +### `str_56` — `STRING` +- **Description:** Each string input to join. + +### `str_57` — `STRING` +- **Description:** Each string input to join. + +### `str_58` — `STRING` +- **Description:** Each string input to join. + +### `str_59` — `STRING` +- **Description:** Each string input to join. + +### `str_60` — `STRING` +- **Description:** Each string input to join. + +### `str_61` — `STRING` +- **Description:** Each string input to join. + +### `str_62` — `STRING` +- **Description:** Each string input to join. + +### `str_63` — `STRING` +- **Description:** Each string input to join. + +### `str_64` — `STRING` +- **Description:** Each string input to join. + +### `str_65` — `STRING` +- **Description:** Each string input to join. + +### `str_66` — `STRING` +- **Description:** Each string input to join. + +### `str_67` — `STRING` +- **Description:** Each string input to join. + +### `str_68` — `STRING` +- **Description:** Each string input to join. + +### `str_69` — `STRING` +- **Description:** Each string input to join. + +### `str_70` — `STRING` +- **Description:** Each string input to join. + +### `str_71` — `STRING` +- **Description:** Each string input to join. + +### `str_72` — `STRING` +- **Description:** Each string input to join. + +### `str_73` — `STRING` +- **Description:** Each string input to join. + +### `str_74` — `STRING` +- **Description:** Each string input to join. + +### `str_75` — `STRING` +- **Description:** Each string input to join. + +### `str_76` — `STRING` +- **Description:** Each string input to join. + +### `str_77` — `STRING` +- **Description:** Each string input to join. + +### `str_78` — `STRING` +- **Description:** Each string input to join. + +### `str_79` — `STRING` +- **Description:** Each string input to join. + +### `str_80` — `STRING` +- **Description:** Each string input to join. + +### `str_81` — `STRING` +- **Description:** Each string input to join. + +### `str_82` — `STRING` +- **Description:** Each string input to join. + +### `str_83` — `STRING` +- **Description:** Each string input to join. + +### `str_84` — `STRING` +- **Description:** Each string input to join. + +### `str_85` — `STRING` +- **Description:** Each string input to join. + +### `str_86` — `STRING` +- **Description:** Each string input to join. + +### `str_87` — `STRING` +- **Description:** Each string input to join. + +### `str_88` — `STRING` +- **Description:** Each string input to join. + +### `str_89` — `STRING` +- **Description:** Each string input to join. + +### `str_90` — `STRING` +- **Description:** Each string input to join. + +### `str_91` — `STRING` +- **Description:** Each string input to join. + +### `str_92` — `STRING` +- **Description:** Each string input to join. + +### `str_93` — `STRING` +- **Description:** Each string input to join. + +### `str_94` — `STRING` +- **Description:** Each string input to join. + +### `str_95` — `STRING` +- **Description:** Each string input to join. + +### `str_96` — `STRING` +- **Description:** Each string input to join. + +### `str_97` — `STRING` +- **Description:** Each string input to join. + +### `str_98` — `STRING` +- **Description:** Each string input to join. + +### `str_99` — `STRING` +- **Description:** Each string input to join. + +### `separator` — `STRING` +- **Name:** `separator` +- **Description:** String used to separate joined inputs. + +### `add_separator_to_end` — `BOOLEAN` +- **Name:** `add_separator_to_end` +- **Description:** Add separator to the end of the joined string. + + +## Outputs + +### `str` — `STRING` +- **Name:** `str` +- **Description:** Output value for str. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_EmptyAceStep15LatentAudio.md b/js/docs/Sage_EmptyAceStep15LatentAudio.md new file mode 100644 index 0000000..a072399 --- /dev/null +++ b/js/docs/Sage_EmptyAceStep15LatentAudio.md @@ -0,0 +1,41 @@ +--- +type: NodeDoc +title: Empty Ace Step 1.5 Audio Passthrough +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Empty Ace Step 1.5 Audio Passthrough + +* **Node ID:** `Sage_EmptyAceStep15LatentAudio` +* **Category:** `Sage Utils/audio` + +Creates an empty latent audio tensor for Ace Step 1.5 models. + +## Inputs + +### `seconds` — `FLOAT` +- **Name:** `seconds` +- **Description:** Length of the empty audio tensor in seconds. + +### `batch_size` — `INT` +- **Name:** `batch_size` +- **Description:** Number of audio examples in the batch. + + +## Outputs + +### `latent` — `LATENT` +- **Name:** `latent` +- **Description:** The empty latent audio tensor for Ace Step 1.5. + +### `out_seconds` — `FLOAT` +- **Name:** `seconds` +- **Description:** The duration of the generated audio in seconds. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_EmptyLatentImagePassthrough.md b/js/docs/Sage_EmptyLatentImagePassthrough.md index 4c95db4..c6f0877 100644 --- a/js/docs/Sage_EmptyLatentImagePassthrough.md +++ b/js/docs/Sage_EmptyLatentImagePassthrough.md @@ -1,33 +1,53 @@ -# Sage_EmptyLatentImagePassthrough +--- +type: NodeDoc +title: Empty Latent Image Passthrough +description: Auto-generated node documentation. +tags: [nodes, docs] +--- -**Empty Latent Passthrough** +# Empty Latent Image Passthrough -Creates an empty latent image and passes width/height for easier wiring. Includes a switch for SD3 compatibility. +* **Node ID:** `Sage_EmptyLatentImagePassthrough` +* **Category:** `Sage Utils/image` + +Passes through an empty latent image. ## Inputs -### Required +### `width` — `INT` +- **Name:** `width` +- **Description:** The width of the empty latent image. + +### `height` — `INT` +- **Name:** `height` +- **Description:** The height of the empty latent image. + +### `batch_size` — `INT` +- **Name:** `batch_size` +- **Description:** The number of latent images in the batch. + +### `type` — `COMBO` +- **Name:** `type` +- **Description:** The type of latent to create. 4_channel is for standard latent diffusion models, 16_channel is for SD3 models, and radiance is for Chroma Radiance models. -- **width** (INT): The width of the latent images in pixels (default: 1024, range: 16 to MAX_RESOLUTION, step: 8) -- **height** (INT): The height of the latent images in pixels (default: 1024, range: 16 to MAX_RESOLUTION, step: 8) -- **batch_size** (INT): The number of latent images in the batch (default: 1, range: 1-4096) -- **sd3** (BOOLEAN): Enable for SD3 compatibility - changes latent channels from 4 to 16 (default: False) ## Outputs -- **latent** (LATENT): The empty latent image batch -- **width** (INT): Pass through the image width -- **height** (INT): Pass through the image height +### `latent` — `LATENT` +- **Name:** `latent` +- **Description:** The generated empty latent image tensor. -## Usage +### `out_width` — `INT` +- **Name:** `width` +- **Description:** The width of the output latent image. + +### `out_height` — `INT` +- **Name:** `height` +- **Description:** The height of the output latent image. -Use to generate latent images and pass dimensions to downstream nodes. The passthrough outputs make it easier to wire width/height to other nodes without additional connections. ## Notes -- Creates empty latent tensors on intermediate device for memory efficiency -- SD3 mode uses 16 channels instead of 4 for compatibility with SD3 models -- Latent dimensions are automatically scaled down by factor of 8 (standard for diffusion models) -- Width and height must be multiples of 8 for proper latent space alignment -- Batch size allows creating multiple latent images in a single tensor -- Useful for starting generation workflows with proper dimension tracking + + +Generated from the node schema. diff --git a/js/docs/Sage_ErniePromptEnhancerPrompt.md b/js/docs/Sage_ErniePromptEnhancerPrompt.md new file mode 100644 index 0000000..561389d --- /dev/null +++ b/js/docs/Sage_ErniePromptEnhancerPrompt.md @@ -0,0 +1,41 @@ +--- +type: NodeDoc +title: Ernie Prompt Enhancer Prompt +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Ernie Prompt Enhancer Prompt + +* **Node ID:** `Sage_ErniePromptEnhancerPrompt` +* **Category:** `Sage Utils/text/prompt/ernie` + +Builds a prompt for the Ernie Prompt Enhancer model based on a prompt, image width, and image height. Connect to an LLM mode using native with a clip for Ernie's prompt enhancer, or the TextGenerate node in core. Uses the example prompt. + +## Inputs + +### `prompt` — `STRING` +- **Name:** `prompt` +- **Description:** The base prompt to enhance for Ernie. + +### `width` — `INT` +- **Name:** `width` +- **Description:** The target image width used by the Ernie prompt. + +### `height` — `INT` +- **Name:** `height` +- **Description:** The target image height used by the Ernie prompt. + + +## Outputs + +### `enhanced_prompt` — `STRING` +- **Name:** `enhanced_prompt` +- **Description:** The enhanced prompt generated for the Ernie model. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_FlexibleCLIPSelector.md b/js/docs/Sage_FlexibleCLIPSelector.md new file mode 100644 index 0000000..d956852 --- /dev/null +++ b/js/docs/Sage_FlexibleCLIPSelector.md @@ -0,0 +1,81 @@ +--- +type: NodeDoc +title: Flexible CLIP Selector +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Flexible CLIP Selector + +* **Node ID:** `Sage_FlexibleCLIPSelector` +* **Category:** `Sage Utils/selector` + +Selects a flexible number of CLIP models from a list. + +## Inputs + +### `num_of_clips` — `COMFY_DYNAMICCOMBO_V3` +- **Name:** `num_of_clips` +- **Description:** Choose how many CLIP models to select and configure. + +### `clip_name_1` — `COMBO` +- **Name:** `clip_name_1` +- **Description:** Select a CLIP model to include in the combined clip set. + +### `clip_type` — `COMBO` +- **Name:** `clip_type` +- **Description:** Choose the loader type to use for a single CLIP model. + +### `clip_name_1` — `COMBO` +- **Name:** `clip_name_1` +- **Description:** Select a CLIP model to include in the combined clip set. + +### `clip_name_2` — `COMBO` +- **Name:** `clip_name_2` +- **Description:** Select a CLIP model to include in the combined clip set. + +### `clip_type` — `COMBO` +- **Name:** `clip_type` +- **Description:** Choose the loader type to use for a dual CLIP model pair. + +### `clip_name_1` — `COMBO` +- **Name:** `clip_name_1` +- **Description:** Select a CLIP model to include in the combined clip set. + +### `clip_name_2` — `COMBO` +- **Name:** `clip_name_2` +- **Description:** Select a CLIP model to include in the combined clip set. + +### `clip_name_3` — `COMBO` +- **Name:** `clip_name_3` +- **Description:** Select a CLIP model to include in the combined clip set. + +### `clip_name_1` — `COMBO` +- **Name:** `clip_name_1` +- **Description:** Select a CLIP model to include in the combined clip set. + +### `clip_name_2` — `COMBO` +- **Name:** `clip_name_2` +- **Description:** Select a CLIP model to include in the combined clip set. + +### `clip_name_3` — `COMBO` +- **Name:** `clip_name_3` +- **Description:** Select a CLIP model to include in the combined clip set. + +### `clip_name_4` — `COMBO` +- **Name:** `clip_name_4` +- **Description:** Select a CLIP model to include in the combined clip set. + + +## Outputs + +### `clip_info` — `MODEL_INFO` +- **Name:** `clip_info` +- **Description:** Combined CLIP model info for the selected flexible clip set. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_FreeMemory.md b/js/docs/Sage_FreeMemory.md new file mode 100644 index 0000000..ea4211d --- /dev/null +++ b/js/docs/Sage_FreeMemory.md @@ -0,0 +1,37 @@ +--- +type: NodeDoc +title: Free Memory +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Free Memory + +* **Node ID:** `Sage_FreeMemory` +* **Category:** `Sage Utils/util` + +Unload models, run garbage collection, and empty caches when enabled. + +## Inputs + +### `free_memory` — `BOOLEAN` +- **Name:** `free_memory` +- **Description:** Unload models and clear caches when enabled. + +### `value` — `*` +- **Name:** `value` +- **Description:** Optional value to pass through unchanged. + + +## Outputs + +### `out_value` — `*` +- **Name:** `value` +- **Description:** The passed-through value after optionally freeing memory. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_FreeU2.md b/js/docs/Sage_FreeU2.md new file mode 100644 index 0000000..f841474 --- /dev/null +++ b/js/docs/Sage_FreeU2.md @@ -0,0 +1,49 @@ +--- +type: NodeDoc +title: FreeU v2 +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# FreeU v2 + +* **Node ID:** `Sage_FreeU2` +* **Category:** `Sage Utils/model` + +Get the free_u2 settings to apply to the model. + +## Inputs + +### `freeu_v2` — `BOOLEAN` +- **Name:** `freeu_v2` +- **Description:** Enable FreeU v2 adjustments. + +### `b1` — `FLOAT` +- **Name:** `b1` +- **Description:** FreeU v2 b1 parameter. + +### `b2` — `FLOAT` +- **Name:** `b2` +- **Description:** FreeU v2 b2 parameter. + +### `s1` — `FLOAT` +- **Name:** `s1` +- **Description:** FreeU v2 s1 parameter. + +### `s2` — `FLOAT` +- **Name:** `s2` +- **Description:** FreeU v2 s2 parameter. + + +## Outputs + +### `model_shifts` — `MODEL_SHIFTS` +- **Name:** `model_shifts` +- **Description:** FreeU v2 model settings output for the loader. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_GuessResolutionByRatio.md b/js/docs/Sage_GuessResolutionByRatio.md index bbff617..0d4b622 100644 --- a/js/docs/Sage_GuessResolutionByRatio.md +++ b/js/docs/Sage_GuessResolutionByRatio.md @@ -1,32 +1,39 @@ -# Sage_GuessResolutionByRatio +--- +type: NodeDoc +title: Guess Resolution By Ratio +description: Auto-generated node documentation. +tags: [nodes, docs] +--- -## Guess Resolution by Ratio +# Guess Resolution By Ratio -Analyzes input dimensions and suggests the closest standard resolution from common aspect ratios, rounded to multiples of 64. +* **Node ID:** `Sage_GuessResolutionByRatio` +* **Category:** `Sage Utils/image/res` + +Based on the input width and height, guess a resolution that matches one of the common aspect ratios. The output is rounded to the nearest multiple of 64. ## Inputs -### Required +### `width` — `INT` +- **Description:** The input width. + +### `height` — `INT` +- **Description:** The input height. -- **width** (INT): Input width dimension (range: 64-8192) -- **height** (INT): Input height dimension (range: 64-8192) ## Outputs -- **width** (INT): Suggested width dimension -- **height** (INT): Suggested height dimension +### `new_width` — `INT` +- **Name:** `width` +- **Description:** The guessed width. -## Usage +### `new_height` — `INT` +- **Name:** `height` +- **Description:** The guessed height. -Based on the input width and height, this node guesses a resolution that matches one of the common aspect ratios. The output is rounded to the nearest multiple of 64. ## Notes -- Supports 11 common aspect ratios including 1:1, 5:12, 9:16, 10:16, 5:7, 2:3, 3:4, 4:7, 7:9, 8:10, and 13:19 -- Automatically detects landscape vs portrait orientation -- Finds the closest aspect ratio by comparing input ratio to predefined ratios -- All outputs are rounded to nearest multiple of 64 for optimal AI generation -- Swaps dimensions appropriately to maintain landscape/portrait orientation -- Defaults to 1024x1024 if no close match is found -- Useful for standardizing arbitrary input dimensions to known good ratios -- Optimized for AI image generation workflows requiring specific aspect ratios + + +Generated from the node schema. diff --git a/js/docs/Sage_HiDreamE1_Instruction.md b/js/docs/Sage_HiDreamE1_Instruction.md index 9a17ca2..0e1014d 100644 --- a/js/docs/Sage_HiDreamE1_Instruction.md +++ b/js/docs/Sage_HiDreamE1_Instruction.md @@ -1,26 +1,37 @@ -# Sage_HiDreamE1_Instruction +--- +type: NodeDoc +title: HiDream E1 Instruction +description: Auto-generated node documentation. +tags: [nodes, docs] +--- -**HiDreamE1 Instruction** +# HiDream E1 Instruction -Generates a formatted prompt for HiDream E1 models based on instruction and description inputs. +* **Node ID:** `Sage_HiDreamE1_Instruction` +* **Category:** `Sage Utils/text/prompt/hidream` + +Generates a prompt for HiDream E1 based on the given instruction and description. ## Inputs -- **instruction** (STRING, required): The instruction text for the model -- **description** (STRING, required): The description text for the model +### `instruction` — `STRING` +- **Name:** `instruction` +- **Description:** The instruction text for the HiDream E1 prompt. + +### `description` — `STRING` +- **Name:** `description` +- **Description:** The description text to include in the HiDream E1 prompt. + ## Outputs -- **prompt** (STRING): Formatted prompt combining instruction and description +### `prompt` — `STRING` +- **Name:** `prompt` +- **Description:** The generated HiDream E1 prompt. -## Usage - -Use to create properly formatted prompts for HiDream E1 models. The node takes separate instruction and description inputs and combines them into the specific format expected by HiDream E1. ## Notes -- Both instruction and description inputs are required and cannot be empty -- Text inputs are automatically cleaned (whitespace trimmed, etc.) -- If the instruction doesn't end with a period, one is automatically added -- Output format: "Instruction: {instruction}\nDescription: {description}" -- Designed specifically for HiDream E1 model prompt formatting requirements + + +Generated from the node schema. diff --git a/js/docs/Sage_JoinText.md b/js/docs/Sage_JoinText.md index 6bb226d..f1bfded 100644 --- a/js/docs/Sage_JoinText.md +++ b/js/docs/Sage_JoinText.md @@ -1,22 +1,45 @@ -# Sage_JoinText +--- +type: NodeDoc +title: Join Text (Legacy) +description: Auto-generated node documentation. +tags: [nodes, docs] +--- -**Join Text** +# Join Text (Legacy) -Joins two text strings together with a customizable separator. Useful for building prompts or metadata with controlled formatting. +* **Node ID:** `Sage_JoinText` +* **Category:** `Sage Utils/text/helper` + +Joins two strings with a separator. ## Inputs -### Required +### `separator` — `STRING` +- **Name:** `separator` +- **Description:** Separator string used between inputs. + +### `add_separator_to_end` — `BOOLEAN` +- **Name:** `add_separator_to_end` +- **Description:** Add separator to the end of the joined string. + +### `str1` — `STRING` +- **Name:** `str1` +- **Description:** First string to join. + +### `str2` — `STRING` +- **Name:** `str2` +- **Description:** Second string to join. -- **separator** (STRING): The separator to use between strings (default: ', ') -- **add_separator_to_end** (BOOLEAN): Whether to add separator to the end of the joined string (default: False) -- **str1** (STRING): First string to join -- **str2** (STRING): Second string to join ## Outputs -- **str** (STRING): The joined string with separator +### `str` — `STRING` +- **Name:** `str` +- **Description:** Output value for str. -## Usage -Use to concatenate text for prompts, metadata, or other string fields. The separator parameter allows you to control how the strings are joined (comma, space, newline, etc.), and the add_separator_to_end option lets you append the separator to the final result. +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_KSampler.md b/js/docs/Sage_KSampler.md index 6fa8703..2fb2aab 100644 --- a/js/docs/Sage_KSampler.md +++ b/js/docs/Sage_KSampler.md @@ -1,39 +1,53 @@ -# Sage_KSampler +--- +type: NodeDoc +title: KSampler w/ Sampler Info +description: Auto-generated node documentation. +tags: [nodes, docs] +--- -**KSampler w/ Sampler Info** +# KSampler w/ Sampler Info -A KSampler node designed to work with Sampler Info nodes for streamlined configuration and workflow integration. +* **Node ID:** `Sage_KSampler` +* **Category:** `Sage Utils/sampler` + +Uses the provided model, positive and negative conditioning to denoise the latent image. Designed to work with the Sampler info node. ## Inputs -### Required +### `model` — `MODEL` +- **Name:** `model` +- **Description:** The model used for denoising. -- **model** (MODEL): The model used for denoising the input latent -- **sampler_info** (SAMPLER_INFO): Sampler settings from Sage_SamplerInfo node -- **positive** (CONDITIONING): Conditioning describing attributes to include in the image -- **negative** (CONDITIONING): Conditioning describing attributes to exclude from the image -- **latent_image** (LATENT): The latent image to denoise -- **denoise** (FLOAT): Amount of denoising applied - - Default: 1.0, Range: 0.0 to 1.0, Step: 0.01 +### `sampler_info` — `SAMPLER_INFO` +- **Name:** `sampler_info` +- **Description:** Sampler configuration for the KSampler. -### Optional +### `positive` — `CONDITIONING` +- **Name:** `positive` +- **Description:** Positive conditioning for generation. + +### `negative` — `CONDITIONING` +- **Name:** `negative` +- **Description:** Negative conditioning for generation. + +### `latent_image` — `LATENT` +- **Name:** `latent_image` +- **Description:** The latent image to denoise. + +### `denoise` — `FLOAT` +- **Name:** `denoise` +- **Description:** The denoising strength. -- **advanced_info** (ADV_SAMPLER_INFO): Advanced sampler options from Sage_AdvSamplerInfo node ## Outputs -- **LATENT**: The denoised latent image +### `latent` — `LATENT` +- **Name:** `latent` +- **Description:** The denoised latent output. -## Usage - -Use for workflows that require flexible sampler configuration and metadata integration. Connect a Sage_SamplerInfo node to provide centralized sampler settings, and optionally connect Sage_AdvSamplerInfo for advanced control options. ## Notes -- Designed to work with Sage_SamplerInfo for centralized configuration -- Supports advanced sampling options when Sage_AdvSamplerInfo is connected -- Lower denoise values maintain structure for image-to-image workflows -- Sampler info should be routed to both this node and metadata construction -- Uses ComfyUI's common_ksampler internally for compatibility -- Advanced info enables step ranges, noise control, and leftover noise options -- Streamlines workflow by separating sampler configuration from execution + + +Generated from the node schema. diff --git a/js/docs/Sage_KSamplerAudioDecoder.md b/js/docs/Sage_KSamplerAudioDecoder.md index 3684ab8..f191f20 100644 --- a/js/docs/Sage_KSamplerAudioDecoder.md +++ b/js/docs/Sage_KSamplerAudioDecoder.md @@ -1,43 +1,61 @@ -# Sage_KSamplerAudioDecoder +--- +type: NodeDoc +title: KSampler + Audio Decoder +description: Auto-generated node documentation. +tags: [nodes, docs] +--- -**KSampler + Audio Decoder** +# KSampler + Audio Decoder -A specialized KSampler node designed for audio generation workflows. It performs sampling on latent audio data and automatically decodes it to audio format, outputting both the denoised latent and decoded audio. +* **Node ID:** `Sage_KSamplerAudioDecoder` +* **Category:** `Sage Utils/sampler` + +Uses the provided model, positive and negative conditioning to denoise the latent audio, and generate audio with the provided vae. Designed to work with the Sampler info node. ## Inputs -### Required -- **model** (MODEL): The model used for denoising the input latent -- **sampler_info** (SAMPLER_INFO): Most of the KSampler options. Should be piped both here and to the Construct Metadata node -- **positive** (CONDITIONING): The conditioning describing the attributes you want to include in the audio -- **negative** (CONDITIONING): The conditioning describing the attributes you want to exclude from the audio -- **latent_audio** (LATENT): The latent audio to denoise -- **vae** (VAE): The VAE used for decoding the latent audio -- **denoise** (FLOAT): The amount of denoising applied, lower values will maintain the structure of the initial audio allowing for audio to audio sampling (default: 1.0, range: 0.0-1.0) +### `model` — `MODEL` +- **Name:** `model` +- **Description:** The model used for denoising audio latent. -### Optional +### `sampler_info` — `SAMPLER_INFO` +- **Name:** `sampler_info` +- **Description:** Sampler configuration for the KSampler. + +### `positive` — `CONDITIONING` +- **Name:** `positive` +- **Description:** Positive conditioning for audio generation. + +### `negative` — `CONDITIONING` +- **Name:** `negative` +- **Description:** Negative conditioning for audio generation. + +### `latent_audio` — `LATENT` +- **Name:** `latent_audio` +- **Description:** The latent audio tensor to denoise. + +### `vae` — `VAE` +- **Name:** `vae` +- **Description:** The audio VAE used to decode the denoised latent. + +### `denoise` — `FLOAT` +- **Name:** `denoise` +- **Description:** The denoising strength. -- **advanced_info** (ADV_SAMPLER_INFO): Optional. Adds in the options an advanced KSampler would have ## Outputs -- **LATENT**: The denoised latent -- **AUDIO**: The decoded audio (44.1kHz sample rate with normalized waveform) +### `latent` — `LATENT` +- **Name:** `latent` +- **Description:** The denoised latent audio output. -## Usage +### `audio` — `AUDIO` +- **Name:** `audio` +- **Description:** The decoded audio result. -This node is specifically designed for audio generation workflows using latent diffusion models. It combines the sampling and decoding steps into a single node for convenience. - -Key features: - -- Automatic audio normalization (scales by 5x standard deviation, minimum 1.0) -- Fixed 44.1kHz sample rate output -- Supports advanced sampling options when connected to Sage_AdvSamplerInfo -- Works with the Sage_SamplerInfo node for consistent workflow integration ## Notes -- The audio output includes automatic normalization to prevent clipping -- This node is optimized for audio generation workflows -- Use with audio-specific VAE models for best results -- The latent_audio input should come from audio-compatible latent sources + + +Generated from the node schema. diff --git a/js/docs/Sage_KSamplerTiledDecoder.md b/js/docs/Sage_KSamplerTiledDecoder.md index afd8d4e..57f8904 100644 --- a/js/docs/Sage_KSamplerTiledDecoder.md +++ b/js/docs/Sage_KSamplerTiledDecoder.md @@ -1,44 +1,65 @@ -# Sage_KSamplerTiledDecoder +--- +type: NodeDoc +title: KSampler + Tiled Decoder +description: Auto-generated node documentation. +tags: [nodes, docs] +--- -**KSampler + Tiled Decoder** +# KSampler + Tiled Decoder -A KSampler node with integrated VAE decoder that supports optional tiled decoding for memory-efficient processing of large images. +* **Node ID:** `Sage_KSamplerTiledDecoder` +* **Category:** `Sage Utils/sampler` + +Uses the provided model, positive and negative conditioning to denoise the latent image, and generate an image with the provided vae. Designed to work with the Sampler info node. Will tile if tiling info is provided. ## Inputs -### Required +### `model` — `MODEL` +- **Name:** `model` +- **Description:** The model used for denoising. -- **model** (MODEL): The model used for denoising the input latent -- **sampler_info** (SAMPLER_INFO): Sampler settings from Sage_SamplerInfo node -- **positive** (CONDITIONING): Conditioning describing attributes to include in the image -- **negative** (CONDITIONING): Conditioning describing attributes to exclude from the image -- **latent_image** (LATENT): The latent image to denoise -- **vae** (VAE): The VAE used for decoding the latent image -- **denoise** (FLOAT): Amount of denoising applied - - Default: 1.0, Range: 0.0 to 1.0, Step: 0.01 +### `sampler_info` — `SAMPLER_INFO` +- **Name:** `sampler_info` +- **Description:** Sampler configuration for the KSampler. -### Optional +### `positive` — `CONDITIONING` +- **Name:** `positive` +- **Description:** Positive conditioning for generation. + +### `negative` — `CONDITIONING` +- **Name:** `negative` +- **Description:** Negative conditioning for generation. + +### `latent_image` — `LATENT` +- **Name:** `latent_image` +- **Description:** The latent image to denoise. + +### `vae` — `VAE` +- **Name:** `vae` +- **Description:** The VAE used to decode the denoised latent. + +### `denoise` — `FLOAT` +- **Name:** `denoise` +- **Description:** The denoising strength. + +### `tiling_info` — `TILING_INFO` (optional) +- **Name:** `tiling_info` +- **Description:** Optional tiling parameters for the decoder. -- **tiling_info** (TILING_INFO): Tiling parameters from Sage_TilingInfo node for memory-efficient decoding -- **advanced_info** (ADV_SAMPLER_INFO): Advanced sampler options from Sage_AdvSamplerInfo node ## Outputs -- **LATENT**: The denoised latent image -- **IMAGE**: The decoded image (tiled if tiling_info provided) +### `latent` — `LATENT` +- **Name:** `latent` +- **Description:** The denoised latent output. -## Usage +### `image` — `IMAGE` +- **Name:** `image` +- **Description:** The decoded image generated by the VAE. -Use for workflows that require both sampling and immediate image output with optional memory-efficient tiled decoding. Connect Sage_TilingInfo to enable tiled VAE decoding for large images, and optionally connect Sage_AdvSamplerInfo for advanced sampling control. ## Notes -- Combines sampling and VAE decoding in a single node -- Automatically uses tiled decoding when Sage_TilingInfo is connected -- Tiling enables processing of high-resolution images with limited VRAM -- Supports both spatial and temporal tiling for video content -- Advanced sampling options available through Sage_AdvSamplerInfo -- Automatically adjusts tiling parameters for compatibility -- Handles video batch reshaping for proper output format -- More efficient than separate sampler + decoder nodes -- Essential for high-resolution workflows with VRAM constraints + + +Generated from the node schema. diff --git a/js/docs/Sage_LLMPromptText.md b/js/docs/Sage_LLMPromptText.md new file mode 100644 index 0000000..7d543a9 --- /dev/null +++ b/js/docs/Sage_LLMPromptText.md @@ -0,0 +1,101 @@ +--- +type: NodeDoc +title: LLM Prompt (Text) +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# LLM Prompt (Text) + +* **Node ID:** `Sage_LLMPromptText` +* **Category:** `Sage Utils/LLM` + +Unified provider-switching text generation node for REST/OpenAI and Native CLIP. + +## Inputs + +### `prompt` — `STRING` +- **Name:** `prompt` +- **Description:** The text prompt sent to the selected LLM provider. + +### `provider` — `COMFY_DYNAMICCOMBO_V3` +- **Name:** `provider` +- **Description:** Pick the backend provider and its model/runtime settings. + +### `lmstudio_rest_model` — `COMBO` +- **Name:** `model` +- **Description:** Input value for lmstudio_rest_model. + +### `lmstudio_rest_load_for_seconds` — `INT` +- **Name:** `load_for_seconds` +- **Description:** Compatibility field for LM Studio REST model load duration. + +### `lmstudio_rest_system_prompt` — `STRING` (optional) +- **Name:** `system_prompt` +- **Description:** Optional system instruction prepended as model context. + +### `ollama_rest_model` — `COMBO` +- **Name:** `model` +- **Description:** Input value for ollama_rest_model. + +### `ollama_rest_keep_alive` — `STRING` +- **Name:** `keep_alive` +- **Description:** How long to keep the model loaded after generation (Ollama duration string). + +### `ollama_rest_options` — `OLLAMA_OPTIONS` (optional) +- **Name:** `options` +- **Description:** Optional low-level Ollama generation parameters. + +### `ollama_rest_system_prompt` — `STRING` (optional) +- **Name:** `system_prompt` +- **Description:** Optional system instruction prepended as model context. + +### `openai_model` — `COMBO` +- **Name:** `model` +- **Description:** Input value for openai_model. + +### `openai_system_prompt` — `STRING` (optional) +- **Name:** `system_prompt` +- **Description:** Optional system instruction prepended as model context. + +### `openai_temperature` — `FLOAT` +- **Name:** `temperature` +- **Description:** Input value for openai_temperature. + +### `openai_max_tokens` — `INT` +- **Name:** `max_tokens` +- **Description:** Input value for openai_max_tokens. + +### `native_clip` — `CLIP` +- **Name:** `model` +- **Description:** The native CLIP model used for local LLM generation. + +### `native_max_length` — `INT` +- **Name:** `max_length` +- **Description:** Maximum sequence length for native generation. + +### `native_thinking` — `BOOLEAN` (optional) +- **Name:** `thinking` +- **Description:** Enable model thinking mode if supported by the loaded CLIP model. + +### `native_sampling` — `COMFY_DYNAMICCOMBO_V3` +- **Name:** `sampling` +- **Description:** Choose native sampling settings for the local model. + +### `seed` — `INT` +- **Name:** `seed` +- **Description:** Base seed used by all providers (provider-specific behavior may vary). + + +## Outputs + +### `response` — `STRING` +- **Name:** `response` +- **Description:** The text response returned by the selected provider. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_LLMPromptVision.md b/js/docs/Sage_LLMPromptVision.md new file mode 100644 index 0000000..f7df919 --- /dev/null +++ b/js/docs/Sage_LLMPromptVision.md @@ -0,0 +1,105 @@ +--- +type: NodeDoc +title: LLM Prompt (Vision) +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# LLM Prompt (Vision) + +* **Node ID:** `Sage_LLMPromptVision` +* **Category:** `Sage Utils/LLM` + +Unified provider-switching vision generation node for REST/OpenAI and Native CLIP. + +## Inputs + +### `prompt` — `STRING` +- **Name:** `prompt` +- **Description:** The text prompt for vision-capable LLM providers. + +### `image` — `IMAGE` +- **Name:** `image` +- **Description:** The reference image sent to the vision provider. + +### `provider` — `COMFY_DYNAMICCOMBO_V3` +- **Name:** `provider` +- **Description:** Pick the backend provider and its model/runtime settings. + +### `lmstudio_rest_model` — `COMBO` +- **Name:** `model` +- **Description:** Input value for lmstudio_rest_model. + +### `lmstudio_rest_load_for_seconds` — `INT` +- **Name:** `load_for_seconds` +- **Description:** Compatibility field for LM Studio REST model load duration. + +### `lmstudio_rest_system_prompt` — `STRING` (optional) +- **Name:** `system_prompt` +- **Description:** Optional system instruction prepended as model context. + +### `ollama_rest_model` — `COMBO` +- **Name:** `model` +- **Description:** Input value for ollama_rest_model. + +### `ollama_rest_keep_alive` — `STRING` +- **Name:** `keep_alive` +- **Description:** How long to keep the model loaded after generation (Ollama duration string). + +### `ollama_rest_options` — `OLLAMA_OPTIONS` (optional) +- **Name:** `options` +- **Description:** Optional low-level Ollama generation parameters. + +### `ollama_rest_system_prompt` — `STRING` (optional) +- **Name:** `system_prompt` +- **Description:** Optional system instruction prepended as model context. + +### `openai_model` — `COMBO` +- **Name:** `model` +- **Description:** Input value for openai_model. + +### `openai_system_prompt` — `STRING` (optional) +- **Name:** `system_prompt` +- **Description:** Optional system instruction prepended as model context. + +### `openai_temperature` — `FLOAT` +- **Name:** `temperature` +- **Description:** Input value for openai_temperature. + +### `openai_max_tokens` — `INT` +- **Name:** `max_tokens` +- **Description:** Input value for openai_max_tokens. + +### `native_clip` — `CLIP` +- **Name:** `model` +- **Description:** The native CLIP model used for local LLM generation. + +### `native_max_length` — `INT` +- **Name:** `max_length` +- **Description:** Maximum sequence length for native generation. + +### `native_thinking` — `BOOLEAN` (optional) +- **Name:** `thinking` +- **Description:** Enable model thinking mode if supported by the loaded CLIP model. + +### `native_sampling` — `COMFY_DYNAMICCOMBO_V3` +- **Name:** `sampling` +- **Description:** Choose native sampling settings for the local model. + +### `seed` — `INT` +- **Name:** `seed` +- **Description:** Base seed used by all providers (provider-specific behavior may vary). + + +## Outputs + +### `response` — `STRING` +- **Name:** `response` +- **Description:** The text response returned by the selected vision provider. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_LLMPromptVisionRefine.md b/js/docs/Sage_LLMPromptVisionRefine.md new file mode 100644 index 0000000..bf8d215 --- /dev/null +++ b/js/docs/Sage_LLMPromptVisionRefine.md @@ -0,0 +1,128 @@ +--- +type: NodeDoc +title: LLM Prompt (Vision) Refined +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# LLM Prompt (Vision) Refined + +* **Node ID:** `Sage_LLMPromptVisionRefine` +* **Category:** `Sage Utils/LLM` + +Unified provider-switching vision-refine node that outputs both initial and refined responses. + +## Inputs + +### `prompt` — `STRING` +- **Name:** `prompt` +- **Description:** The text prompt for the initial vision generation pass. + +### `image` — `IMAGE` +- **Name:** `image` +- **Description:** The reference image sent to the vision provider. + +### `seed` — `INT` +- **Name:** `seed` +- **Description:** Seed for the initial generation pass. + +### `refine_prompt` — `STRING` +- **Name:** `refine_prompt` +- **Description:** Instructions used for the second (refinement) pass. + +### `refine_seed` — `INT` +- **Name:** `refine_seed` +- **Description:** Seed for the refinement pass. + +### `provider` — `COMFY_DYNAMICCOMBO_V3` +- **Name:** `provider` +- **Description:** Pick the backend provider and its model/runtime settings. + +### `lmstudio_rest_model` — `COMBO` +- **Name:** `model` +- **Description:** Input value for lmstudio_rest_model. + +### `lmstudio_rest_refine_model` — `COMBO` +- **Name:** `refine_model` +- **Description:** Input value for lmstudio_rest_refine_model. + +### `lmstudio_rest_system_prompt` — `STRING` (optional) +- **Name:** `system_prompt` +- **Description:** Input value for lmstudio_rest_system_prompt. + +### `ollama_rest_model` — `COMBO` +- **Name:** `model` +- **Description:** Input value for ollama_rest_model. + +### `ollama_rest_refine_model` — `COMBO` +- **Name:** `refine_model` +- **Description:** Input value for ollama_rest_refine_model. + +### `ollama_rest_keep_alive` — `STRING` +- **Name:** `keep_alive` +- **Description:** Input value for ollama_rest_keep_alive. + +### `ollama_rest_options` — `OLLAMA_OPTIONS` (optional) +- **Name:** `options` + +### `ollama_rest_system_prompt` — `STRING` (optional) +- **Name:** `system_prompt` +- **Description:** Input value for ollama_rest_system_prompt. + +### `openai_model` — `COMBO` +- **Name:** `model` +- **Description:** Input value for openai_model. + +### `openai_refine_model` — `COMBO` +- **Name:** `refine_model` +- **Description:** Input value for openai_refine_model. + +### `openai_system_prompt` — `STRING` (optional) +- **Name:** `system_prompt` +- **Description:** Input value for openai_system_prompt. + +### `openai_temperature` — `FLOAT` +- **Name:** `temperature` +- **Description:** Input value for openai_temperature. + +### `openai_max_tokens` — `INT` +- **Name:** `max_tokens` +- **Description:** Input value for openai_max_tokens. + +### `native_clip` — `CLIP` +- **Name:** `model` +- **Description:** Input value for native_clip. + +### `native_refine_clip` — `CLIP` (optional) +- **Name:** `refine_model` +- **Description:** Optional second CLIP model used only for the refine pass. + +### `native_max_length` — `INT` +- **Name:** `max_length` +- **Description:** Input value for native_max_length. + +### `native_thinking` — `BOOLEAN` (optional) +- **Name:** `thinking` +- **Description:** Enable model thinking mode if supported by the loaded CLIP model. + +### `native_sampling` — `COMFY_DYNAMICCOMBO_V3` +- **Name:** `sampling` +- **Description:** Choose native sampling settings for the local model. + + +## Outputs + +### `initial_response` — `STRING` +- **Name:** `initial_response` +- **Description:** The initial response generated by the vision provider. + +### `refined_response` — `STRING` +- **Name:** `refined_response` +- **Description:** The refined response generated during the second pass. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_LoadImage.md b/js/docs/Sage_LoadImage.md index a2a6761..0d02d99 100644 --- a/js/docs/Sage_LoadImage.md +++ b/js/docs/Sage_LoadImage.md @@ -1,34 +1,48 @@ -# Sage_LoadImage +--- +type: NodeDoc +title: Load Image +description: Auto-generated node documentation. +tags: [nodes, docs] +--- -**Load Image w/ Size & Metadata** +# Load Image -Loads an image and outputs its size and embedded metadata along with the image and mask. +* **Node ID:** `Sage_LoadImage` +* **Category:** `Sage Utils/image/file` + +Loads an image from a specified file path. ## Inputs -### Required +### `image_name` — `COMBO` +- **Description:** The file path of the image to load. -- **image** (STRING): The image file to load from the input directory (supports image upload) ## Outputs -- **image** (IMAGE): The loaded image -- **mask** (MASK): The alpha channel mask (if present) -- **width** (INT): The image width in pixels -- **height** (INT): The image height in pixels -- **metadata** (STRING): Embedded metadata from the image file +### `image` — `IMAGE` +- **Name:** `image` +- **Description:** The loaded image. -## Usage +### `mask` — `IMAGE` +- **Name:** `mask` +- **Description:** The alpha or mask output for the loaded image, if available. + +### `out_width` — `INT` +- **Name:** `width` +- **Description:** The width of the loaded image. + +### `out_height` — `INT` +- **Name:** `height` +- **Description:** The height of the loaded image. + +### `metadata` — `STRING` +- **Name:** `metadata` +- **Description:** Metadata extracted from the loaded image. -Use to inspect images and extract their metadata for use in workflows. Provides both the image data and useful information about dimensions and embedded metadata. ## Notes -- Automatically scans all files in the ComfyUI input directory -- Supports image upload functionality -- Extracts alpha channel as mask if present -- Metadata includes EXIF data, PNG text chunks, and other embedded information -- File validation ensures only valid image files are processed -- Uses SHA256 hash to detect file changes for cache invalidation -- Supports all common image formats (PNG, JPEG, WebP, etc.) -- Useful for loading reference images and extracting generation parameters +This note was added to test automatic documentation generation from schema metadata. + +Generated from the node schema. diff --git a/js/docs/Sage_LoadModelFromInfo.md b/js/docs/Sage_LoadModelFromInfo.md new file mode 100644 index 0000000..6a75b88 --- /dev/null +++ b/js/docs/Sage_LoadModelFromInfo.md @@ -0,0 +1,43 @@ +--- +type: NodeDoc +title: Load Models +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Load Models + +* **Node ID:** `Sage_LoadModelFromInfo` +* **Category:** `Sage Utils/loader` + +Load model components from model info using GraphBuilder. + +## Inputs + +### `model_info` — `MODEL_INFO` +- **Name:** `model_info` + +### `model_shifts` — `MODEL_SHIFTS` (optional) +- **Name:** `model_shifts` + + +## Outputs + +### `model` — `MODEL` +- **Name:** `model` +- **Description:** The loaded UNet model component. + +### `clip` — `CLIP` +- **Name:** `clip` +- **Description:** The loaded CLIP model component. + +### `vae` — `VAE` +- **Name:** `vae` +- **Description:** The loaded VAE model component. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_Load_Dataset_From_Folder.md b/js/docs/Sage_Load_Dataset_From_Folder.md new file mode 100644 index 0000000..b6a8d0f --- /dev/null +++ b/js/docs/Sage_Load_Dataset_From_Folder.md @@ -0,0 +1,53 @@ +--- +type: NodeDoc +title: Load Dataset From Folder +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Load Dataset From Folder + +* **Node ID:** `Sage_Load_Dataset_From_Folder` +* **Category:** `Sage Utils/train` + +Loads images and paired captions from a folder; applies optional prefix/suffix. + +## Inputs + +### `dataset_path` — `STRING` +- **Name:** `dataset_path` +- **Description:** Path to the folder containing image files and optional caption text files. + +### `prefix` — `STRING` (optional) +- **Name:** `prefix` +- **Description:** Optional text prefix to prepend to each caption. + +### `suffix` — `STRING` (optional) +- **Name:** `suffix` +- **Description:** Optional text suffix to append to each caption. + +### `separator` — `STRING` (optional) +- **Name:** `separator` +- **Description:** Separator used when concatenating prefix/suffix with caption text. + + +## Outputs + +### `images` — `IMAGE` +- **Name:** `images` +- **Description:** Output value for images. + +### `filenames` — `STRING` +- **Name:** `filenames` +- **Description:** Output value for filenames. + +### `captions` — `STRING` +- **Name:** `captions` +- **Description:** Output value for captions. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_LogicalSwitch.md b/js/docs/Sage_LogicalSwitch.md index ba6e398..069b5c7 100644 --- a/js/docs/Sage_LogicalSwitch.md +++ b/js/docs/Sage_LogicalSwitch.md @@ -1,26 +1,41 @@ -# Sage_LogicalSwitch +--- +type: NodeDoc +title: Logical Switch +description: Auto-generated node documentation. +tags: [nodes, docs] +--- -**Switch** +# Logical Switch -Selects between two inputs based on a boolean condition. Useful for conditional logic in workflows. +* **Node ID:** `Sage_LogicalSwitch` +* **Category:** `Sage Utils/util` + +Select between two inputs based on the condition; only the needed branch is evaluated when lazy. ## Inputs -- **condition** (BOOLEAN, required): Boolean value to determine which input to select -- **true_value** (ANY, required): Value to return when condition is true -- **false_value** (ANY, required): Value to return when condition is false +### `condition` — `BOOLEAN` +- **Name:** `condition` +- **Description:** Choose which branch to return. + +### `true_value` — `*` (optional) +- **Name:** `true_value` +- **Description:** Value returned when the condition is true. + +### `false_value` — `*` (optional) +- **Name:** `false_value` +- **Description:** Value returned when the condition is false. + ## Outputs -- **result** (ANY): The selected value based on the condition +### `result` — `*` +- **Name:** `result` +- **Description:** The selected branch value returned by the logical switch. -## Usage - -Use to route data or control flow based on conditions. When the condition is true, the node outputs `true_value`; when false, it outputs `false_value`. This enables conditional branching in workflows. ## Notes -- Accepts any data type for both value inputs (ANY type) -- Simple if-else logic: condition ? true_value : false_value -- Useful for creating conditional workflows and dynamic data routing -- Both value inputs are required even if only one may be used + + +Generated from the node schema. diff --git a/js/docs/Sage_LoraStack.md b/js/docs/Sage_LoraStack.md index 8400035..b39161d 100644 --- a/js/docs/Sage_LoraStack.md +++ b/js/docs/Sage_LoraStack.md @@ -1,34 +1,49 @@ -# Sage_LoraStack +--- +type: NodeDoc +title: Lora Stack +description: Auto-generated node documentation. +tags: [nodes, docs] +--- -**Simple Lora Stack** +# Lora Stack -Builds and manages a stack of LoRAs with toggles and weights. +* **Node ID:** `Sage_LoraStack` +* **Category:** `Sage Utils/lora` + +Choose a lora with weights, and add it to a lora_stack. Compatible with other node packs that have lora_stacks. ## Inputs -### Required +### `enabled` — `BOOLEAN` +- **Name:** `enabled` +- **Description:** Enable or disable this LoRA stack entry. -- **enabled** (BOOLEAN): Whether to add this LoRA to the stack (default: True) -- **lora_name** (STRING): The name of the LoRA from available LoRAs -- **model_weight** (FLOAT): How strongly to modify the diffusion model. This value can be negative (default: 1.0, range: -100.0 to 100.0) -- **clip_weight** (FLOAT): How strongly to modify the CLIP model. This value can be negative (default: 1.0, range: -100.0 to 100.0) +### `lora_name` — `COMBO` +- **Name:** `lora_name` +- **Description:** Choose a LoRA model to add. -### Optional +### `model_weight` — `FLOAT` +- **Name:** `model_weight` +- **Description:** Weight for the LoRA model branch. + +### `clip_weight` — `FLOAT` +- **Name:** `clip_weight` +- **Description:** Weight for the LoRA clip branch. + +### `lora_stack` — `LORA_STACK` (optional) +- **Name:** `lora_stack` +- **Description:** Existing LoRA stack to append to. -- **lora_stack** (LORA_STACK): Existing LoRA stack to add this LoRA to ## Outputs -- **lora_stack** (LORA_STACK): The updated LoRA stack +### `out_lora_stack` — `LORA_STACK` +- **Name:** `lora_stack` +- **Description:** Combined LoRA stack output. -## Usage - -Chain multiple nodes for complex LoRA stacking. Connect to LoRA Stack Loader or metadata nodes. If enabled is False, the LoRA is not added to the stack. ## Notes -- Compatible with other node packs that have lora_stacks -- Negative weights can be used to subtract the LoRA effect -- Each LoRA can be individually enabled/disabled -- Can be chained together to build complex LoRA combinations -- Shows all available LoRAs in the dropdown + + +Generated from the node schema. diff --git a/js/docs/Sage_LoraStackInfoDisplay.md b/js/docs/Sage_LoraStackInfoDisplay.md new file mode 100644 index 0000000..2f7e2a5 --- /dev/null +++ b/js/docs/Sage_LoraStackInfoDisplay.md @@ -0,0 +1,32 @@ +--- +type: NodeDoc +title: LoRA Stack Info Display +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# LoRA Stack Info Display + +* **Node ID:** `Sage_LoraStackInfoDisplay` +* **Category:** `Sage Utils/info` + +Display information for all LoRAs in a lora_stack as formatted markdown with civitai details, weights, and links. + +## Inputs + +### `lora_stack` — `LORA_STACK` +- **Name:** `lora_stack` + + +## Outputs + +### `markdown_display` — `STRING` +- **Name:** `markdown_display` +- **Description:** Formatted markdown text displaying LoRA stack information. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_LoraStackLoader.md b/js/docs/Sage_LoraStackLoader.md index c6ebcf6..c8b4cf9 100644 --- a/js/docs/Sage_LoraStackLoader.md +++ b/js/docs/Sage_LoraStackLoader.md @@ -1,38 +1,52 @@ -# Sage_LoraStackLoader +--- +type: NodeDoc +title: Lora Stack Loader +description: Auto-generated node documentation. +tags: [nodes, docs] +--- -**Lora Stack Loader** +# Lora Stack Loader -Loads all LoRAs in a stack and applies them to the model and CLIP, with optional model shifts. +* **Node ID:** `Sage_LoraStackLoader` +* **Category:** `Sage Utils/loader` + +Accept a lora_stack with Model and Clip, and apply all the loras in the stack at once. ## Inputs -### Required +### `model` — `MODEL` +- **Name:** `model` -- **model** (MODEL): The diffusion model the LoRA will be applied to -- **clip** (CLIP): The CLIP model the LoRA will be applied to +### `clip` — `CLIP` +- **Name:** `clip` +- **Description:** Input value for clip. -### Optional +### `lora_stack` — `LORA_STACK` (optional) +- **Name:** `lora_stack` + +### `model_shifts` — `MODEL_SHIFTS` (optional) +- **Name:** `model_shifts` -- **lora_stack** (LORA_STACK): The stack of LoRAs to load and apply -- **model_shifts** (MODEL_SHIFTS): The model shifts & FreeU2 settings to apply to the model ## Outputs -- **model** (MODEL): The modified diffusion model with LoRAs applied -- **clip** (CLIP): The modified CLIP model with LoRAs applied -- **lora_stack** (LORA_STACK): The stack of LoRAs (passed through) -- **keywords** (STRING): Keywords from the LoRA stack +### `out_model` — `MODEL` +- **Name:** `model` -## Usage +### `out_clip` — `CLIP` +- **Name:** `clip` + +### `out_lora_stack` — `LORA_STACK` +- **Name:** `lora_stack` +- **Description:** Output value for out_lora_stack. + +### `keywords` — `STRING` +- **Name:** `keywords` +- **Description:** Output value for keywords. -Connect to a LoRA stack node to load all LoRAs at once. Supports model shifts for advanced model modifications. ## Notes -- Applies all LoRAs in the stack to both model and CLIP -- Shows progress bar during loading process -- Extracts and returns keywords from all LoRAs in the stack -- Supports model shifts including discrete flow sampling and FreeU v2 -- Model shifts can apply x1 or x1000 multipliers for different model types -- FreeU v2 can be enabled for improved quality with specific parameters -- Compatible with LoRA stacks from other node packs + + +Generated from the node schema. diff --git a/js/docs/Sage_ModelInfo.md b/js/docs/Sage_ModelInfo.md index 7e87d77..fe9cfd8 100644 --- a/js/docs/Sage_ModelInfo.md +++ b/js/docs/Sage_ModelInfo.md @@ -1,31 +1,48 @@ -# Sage_ModelInfo +--- +type: NodeDoc +title: Model Info +description: Auto-generated node documentation. +tags: [nodes, docs] +--- -**Model Info** +# Model Info -Retrieves Civitai model information and metadata based on model info input. +* **Node ID:** `Sage_ModelInfo` +* **Category:** `Sage Utils/info` + +Pull the civitai model info, and return what the base model is, the name with version, the url, the url for the latest version, and a preview image. ## Inputs -- **model_info** (MODEL_INFO, required): Model information containing hash and metadata +### `model_info` — `MODEL_INFO` +- **Name:** `model_info` + ## Outputs -- **base_model** (STRING): The base model type (e.g., SDXL, SD1.5, etc.) -- **name** (STRING): Model name with version information -- **url** (STRING): Civitai URL for the specific model version -- **latest_url** (STRING): Civitai URL for the latest version of the model -- **image** (IMAGE): Preview image from Civitai +### `base_model` — `STRING` +- **Name:** `base_model` +- **Description:** The base model name from the Civitai model metadata. -## Usage +### `name` — `STRING` +- **Name:** `name` +- **Description:** The full model name including version info. + +### `url` — `STRING` +- **Name:** `url` +- **Description:** The Civitai page URL for the model. + +### `latest_url` — `STRING` +- **Name:** `latest_url` +- **Description:** The URL of the latest version of the model. + +### `image` — `IMAGE` +- **Name:** `image` +- **Description:** Preview image for the model from Civitai. -Use to retrieve and display comprehensive model information from Civitai. The node queries Civitai's API using the model hash to fetch metadata, URLs, and preview images for documentation or workflow information display. ## Notes -- Requires internet connection to fetch data from Civitai -- Uses model hash to query Civitai API for model information -- Returns empty strings and blank image if model info is unavailable -- Handles exceptions gracefully by returning empty values -- The "latest_url" provides a link to the most recent version of the model -- Preview image is fetched from Civitai's image URLs -- Useful for model documentation and workflow metadata + + +Generated from the node schema. diff --git a/js/docs/Sage_ModelInfoDisplay.md b/js/docs/Sage_ModelInfoDisplay.md new file mode 100644 index 0000000..caa3a6a --- /dev/null +++ b/js/docs/Sage_ModelInfoDisplay.md @@ -0,0 +1,32 @@ +--- +type: NodeDoc +title: Model Info Display +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Model Info Display + +* **Node ID:** `Sage_ModelInfoDisplay` +* **Category:** `Sage Utils/model/info` + +Display model information in a formatted markdown block with civitai details, base model, name, version, and links. + +## Inputs + +### `model_info` — `MODEL_INFO` +- **Name:** `model_info` + + +## Outputs + +### `markdown_display` — `STRING` +- **Name:** `markdown_display` +- **Description:** Formatted markdown text displaying model information. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_ModelLoraStackLoader.md b/js/docs/Sage_ModelLoraStackLoader.md index ed485b0..7b03767 100644 --- a/js/docs/Sage_ModelLoraStackLoader.md +++ b/js/docs/Sage_ModelLoraStackLoader.md @@ -1,40 +1,51 @@ -# Sage_ModelLoraStackLoader +--- +type: NodeDoc +title: Load Models + Loras +description: Auto-generated node documentation. +tags: [nodes, docs] +--- -**Model + Lora Stack Loader** +# Load Models + Loras -Loads both a checkpoint and a LoRA stack in one node, with optional model shifts. +* **Node ID:** `Sage_ModelLoraStackLoader` +* **Category:** `Sage Utils/loader` + +Load model components from model info using GraphBuilder and apply LoRA stack. ## Inputs -### Required +### `model_info` — `MODEL_INFO` +- **Name:** `model_info` -- **model_info** (MODEL_INFO): The diffusion model info to load. Should be from the checkpoint info node, not a loader node, to avoid loading the model twice +### `lora_stack` — `LORA_STACK` (optional) +- **Name:** `lora_stack` -### Optional +### `model_shifts` — `MODEL_SHIFTS` (optional) +- **Name:** `model_shifts` -- **lora_stack** (LORA_STACK): The stack of LoRAs to load and apply -- **model_shifts** (MODEL_SHIFTS): The model shifts & FreeU2 settings to apply to the model ## Outputs -- **model** (MODEL): The modified diffusion model with LoRAs applied -- **clip** (CLIP): The modified CLIP model with LoRAs applied -- **vae** (VAE): The VAE model from the checkpoint -- **lora_stack** (LORA_STACK): The stack of LoRAs (passed through) -- **keywords** (STRING): Keywords from the LoRA stack +### `model` — `MODEL` +- **Name:** `model` -## Usage +### `clip` — `CLIP` +- **Name:** `clip` + +### `vae` — `VAE` +- **Name:** `vae` + +### `out_lora_stack` — `LORA_STACK` +- **Name:** `lora_stack` +- **Description:** Output value for out_lora_stack. + +### `keywords` — `STRING` +- **Name:** `keywords` +- **Description:** Output value for keywords. -Use to streamline workflows that require both a model and a LoRA stack. Loads the checkpoint and applies all LoRAs in a single efficient operation. ## Notes -- Inherits functionality from Sage_LoraStackLoader -- Loads model, CLIP, and VAE from checkpoint using model_info -- Applies all LoRAs in the stack to the loaded model and CLIP -- Shows progress bar during loading process -- Extracts and returns keywords from all LoRAs in the stack -- Supports model shifts and FreeU v2 settings -- More efficient than separate model loading and LoRA application -- Requires checkpoint model_info (not UNET-only models) -- Part of "Sage Utils/model" category for complete model loading + + +Generated from the node schema. diff --git a/js/docs/Sage_ModelShiftOnly.md b/js/docs/Sage_ModelShiftOnly.md new file mode 100644 index 0000000..725abe2 --- /dev/null +++ b/js/docs/Sage_ModelShiftOnly.md @@ -0,0 +1,37 @@ +--- +type: NodeDoc +title: Model Shift Only +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Model Shift Only + +* **Node ID:** `Sage_ModelShiftOnly` +* **Category:** `Sage Utils/model` + +Get the model shifts to apply to the model. This is used by the model loader node. + +## Inputs + +### `shift_type` — `COMBO` +- **Name:** `shift_type` +- **Description:** The type of shift to apply to the model. x1 for Auraflow and Lumina2, x1000 for other models. + +### `shift` — `FLOAT` +- **Name:** `shift` +- **Description:** How much shift to apply to the model. + + +## Outputs + +### `model_shifts` — `MODEL_SHIFTS` +- **Name:** `model_shifts` +- **Description:** Model shift settings output for the loader. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_ModelShifts.md b/js/docs/Sage_ModelShifts.md index cc3a5e2..2ebdb9a 100644 --- a/js/docs/Sage_ModelShifts.md +++ b/js/docs/Sage_ModelShifts.md @@ -1,36 +1,87 @@ -# Sage_ModelShifts +--- +type: NodeDoc +title: Model Shifts +description: Auto-generated node documentation. +tags: [nodes, docs] +--- -**Model Shifts** +# Model Shifts -Configures model shift parameters and FreeU v2 settings for advanced model modifications. +* **Node ID:** `Sage_ModelShifts` +* **Category:** `Sage Utils/model` + +Get the model shifts and free_u2 settings to apply to the model. This is used by the model loader node. ## Inputs -### Required +### `settings` — `COMFY_DYNAMICCOMBO_V3` + +### `shift_type` — `COMBO` +- **Name:** `shift_type` +- **Description:** The type of shift to apply to the model. x1 for Auraflow and Lumina2, x1000 for other models. + +### `shift` — `FLOAT` +- **Name:** `shift` +- **Description:** How much shift to apply to the model when shift-only mode is selected. + +### `freeu_v2` — `BOOLEAN` +- **Name:** `freeu_v2` +- **Description:** Enable FreeU v2 adjustments. + +### `b1` — `FLOAT` +- **Name:** `b1` +- **Description:** FreeU v2 b1 parameter. + +### `b2` — `FLOAT` +- **Name:** `b2` +- **Description:** FreeU v2 b2 parameter. + +### `s1` — `FLOAT` +- **Name:** `s1` +- **Description:** FreeU v2 s1 parameter. + +### `s2` — `FLOAT` +- **Name:** `s2` +- **Description:** FreeU v2 s2 parameter. + +### `shift_type` — `COMBO` +- **Name:** `shift_type` +- **Description:** The type of shift to apply to the model. x1 for Auraflow and Lumina2, x1000 for other models. + +### `shift` — `FLOAT` +- **Name:** `shift` +- **Description:** How much shift to apply to the model. + +### `freeu_v2` — `BOOLEAN` +- **Name:** `freeu_v2` +- **Description:** Enable FreeU v2 adjustments. + +### `b1` — `FLOAT` +- **Name:** `b1` +- **Description:** FreeU v2 b1 parameter. + +### `b2` — `FLOAT` +- **Name:** `b2` +- **Description:** FreeU v2 b2 parameter. + +### `s1` — `FLOAT` +- **Name:** `s1` +- **Description:** FreeU v2 s1 parameter. + +### `s2` — `FLOAT` +- **Name:** `s2` +- **Description:** FreeU v2 s2 parameter. -- **shift_type** (STRING): The type of shift to apply to the model - "None", "x1", or "x1000" (x1 for most models, x1000 for Auraflow and Lumina2) -- **shift** (FLOAT): The shift value to apply (default: 3.0, range: 0.0-100.0) -- **freeu_v2** (BOOLEAN): Whether to enable FreeU v2 (default: False) -- **b1** (FLOAT): FreeU v2 backbone factor 1 (default: 1.3, range: 0.0-10.0) -- **b2** (FLOAT): FreeU v2 backbone factor 2 (default: 1.4, range: 0.0-10.0) -- **s1** (FLOAT): FreeU v2 skip factor 1 (default: 0.9, range: 0.0-10.0) -- **s2** (FLOAT): FreeU v2 skip factor 2 (default: 0.2, range: 0.0-10.0) ## Outputs -- **model_shifts** (MODEL_SHIFTS): Configuration object containing all shift and FreeU settings +### `model_shifts` — `MODEL_SHIFTS` +- **Name:** `model_shifts` +- **Description:** Settings to apply to the model loader, including shift and FreeU v2 values. -## Usage - -Use in workflows that require dynamic model parameter adjustment. Connect to LoRA Stack Loader or Model LoRA Stack Loader nodes. ## Notes -- Model shifts adjust sampling parameters for different model architectures -- x1 shift type uses 1000.0 multiplier (for most models) -- x1000 shift type uses 1.0 multiplier (for Auraflow and Lumina2) -- FreeU v2 can improve generation quality with proper parameter tuning -- Settings are passed to model loader nodes for application -- "None" shift type disables model shifting -- Used by the model loader node for advanced model modifications -- Part of the "Sage Utils/model" category despite being in lora.py + + +Generated from the node schema. diff --git a/js/docs/Sage_MultiModelPicker.md b/js/docs/Sage_MultiModelPicker.md new file mode 100644 index 0000000..2fec6b6 --- /dev/null +++ b/js/docs/Sage_MultiModelPicker.md @@ -0,0 +1,236 @@ +--- +type: NodeDoc +title: Multi Model Picker +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Multi Model Picker + +* **Node ID:** `Sage_MultiModelPicker` +* **Category:** `Sage Utils/util` + +Select one model_info from a list by index. + +## Inputs + +### `index` — `INT` +- **Name:** `index` +- **Description:** 0-based index into provided model list + +### `model_template` — `COMFY_AUTOGROW_V3` +- **Description:** Input value for model_template. + +### `model_0` — `MODEL_INFO` + +### `model_1` — `MODEL_INFO` + +### `model_2` — `MODEL_INFO` + +### `model_3` — `MODEL_INFO` + +### `model_4` — `MODEL_INFO` + +### `model_5` — `MODEL_INFO` + +### `model_6` — `MODEL_INFO` + +### `model_7` — `MODEL_INFO` + +### `model_8` — `MODEL_INFO` + +### `model_9` — `MODEL_INFO` + +### `model_10` — `MODEL_INFO` + +### `model_11` — `MODEL_INFO` + +### `model_12` — `MODEL_INFO` + +### `model_13` — `MODEL_INFO` + +### `model_14` — `MODEL_INFO` + +### `model_15` — `MODEL_INFO` + +### `model_16` — `MODEL_INFO` + +### `model_17` — `MODEL_INFO` + +### `model_18` — `MODEL_INFO` + +### `model_19` — `MODEL_INFO` + +### `model_20` — `MODEL_INFO` + +### `model_21` — `MODEL_INFO` + +### `model_22` — `MODEL_INFO` + +### `model_23` — `MODEL_INFO` + +### `model_24` — `MODEL_INFO` + +### `model_25` — `MODEL_INFO` + +### `model_26` — `MODEL_INFO` + +### `model_27` — `MODEL_INFO` + +### `model_28` — `MODEL_INFO` + +### `model_29` — `MODEL_INFO` + +### `model_30` — `MODEL_INFO` + +### `model_31` — `MODEL_INFO` + +### `model_32` — `MODEL_INFO` + +### `model_33` — `MODEL_INFO` + +### `model_34` — `MODEL_INFO` + +### `model_35` — `MODEL_INFO` + +### `model_36` — `MODEL_INFO` + +### `model_37` — `MODEL_INFO` + +### `model_38` — `MODEL_INFO` + +### `model_39` — `MODEL_INFO` + +### `model_40` — `MODEL_INFO` + +### `model_41` — `MODEL_INFO` + +### `model_42` — `MODEL_INFO` + +### `model_43` — `MODEL_INFO` + +### `model_44` — `MODEL_INFO` + +### `model_45` — `MODEL_INFO` + +### `model_46` — `MODEL_INFO` + +### `model_47` — `MODEL_INFO` + +### `model_48` — `MODEL_INFO` + +### `model_49` — `MODEL_INFO` + +### `model_50` — `MODEL_INFO` + +### `model_51` — `MODEL_INFO` + +### `model_52` — `MODEL_INFO` + +### `model_53` — `MODEL_INFO` + +### `model_54` — `MODEL_INFO` + +### `model_55` — `MODEL_INFO` + +### `model_56` — `MODEL_INFO` + +### `model_57` — `MODEL_INFO` + +### `model_58` — `MODEL_INFO` + +### `model_59` — `MODEL_INFO` + +### `model_60` — `MODEL_INFO` + +### `model_61` — `MODEL_INFO` + +### `model_62` — `MODEL_INFO` + +### `model_63` — `MODEL_INFO` + +### `model_64` — `MODEL_INFO` + +### `model_65` — `MODEL_INFO` + +### `model_66` — `MODEL_INFO` + +### `model_67` — `MODEL_INFO` + +### `model_68` — `MODEL_INFO` + +### `model_69` — `MODEL_INFO` + +### `model_70` — `MODEL_INFO` + +### `model_71` — `MODEL_INFO` + +### `model_72` — `MODEL_INFO` + +### `model_73` — `MODEL_INFO` + +### `model_74` — `MODEL_INFO` + +### `model_75` — `MODEL_INFO` + +### `model_76` — `MODEL_INFO` + +### `model_77` — `MODEL_INFO` + +### `model_78` — `MODEL_INFO` + +### `model_79` — `MODEL_INFO` + +### `model_80` — `MODEL_INFO` + +### `model_81` — `MODEL_INFO` + +### `model_82` — `MODEL_INFO` + +### `model_83` — `MODEL_INFO` + +### `model_84` — `MODEL_INFO` + +### `model_85` — `MODEL_INFO` + +### `model_86` — `MODEL_INFO` + +### `model_87` — `MODEL_INFO` + +### `model_88` — `MODEL_INFO` + +### `model_89` — `MODEL_INFO` + +### `model_90` — `MODEL_INFO` + +### `model_91` — `MODEL_INFO` + +### `model_92` — `MODEL_INFO` + +### `model_93` — `MODEL_INFO` + +### `model_94` — `MODEL_INFO` + +### `model_95` — `MODEL_INFO` + +### `model_96` — `MODEL_INFO` + +### `model_97` — `MODEL_INFO` + +### `model_98` — `MODEL_INFO` + +### `model_99` — `MODEL_INFO` + + +## Outputs + +### `model_info` — `MODEL_INFO` +- **Name:** `model_info` +- **Description:** Selected model_info output from the provided model list. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_MultiSelectorDoubleClip.md b/js/docs/Sage_MultiSelectorDoubleClip.md new file mode 100644 index 0000000..4a531ce --- /dev/null +++ b/js/docs/Sage_MultiSelectorDoubleClip.md @@ -0,0 +1,53 @@ +--- +type: NodeDoc +title: Multi Selector Double CLIP +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Multi Selector Double CLIP + +* **Node ID:** `Sage_MultiSelectorDoubleClip` +* **Category:** `Sage Utils/selector` + +Selects checkpoint, UNET, VAE, and two CLIP models from lists. + +## Inputs + +### `unet_name` — `COMBO` +- **Name:** `unet_name` +- **Description:** Choose a UNET model to include in the loaded model bundle. + +### `weight_dtype` — `COMBO` +- **Name:** `weight_dtype` +- **Description:** Choose the UNET weight dtype. + +### `clip_name_1` — `COMBO` +- **Name:** `clip_name_1` +- **Description:** Choose the first CLIP model for the loaded bundle. + +### `clip_name_2` — `COMBO` +- **Name:** `clip_name_2` +- **Description:** Choose the second CLIP model for the loaded bundle. + +### `clip_type` — `COMBO` +- **Name:** `clip_type` +- **Description:** Choose the loader type for the dual CLIP pair. + +### `vae_name` — `COMBO` +- **Name:** `vae_name` +- **Description:** Choose a VAE model to include in the loaded model bundle. + + +## Outputs + +### `model_info` — `MODEL_INFO` +- **Name:** `model_info` +- **Description:** Combined model info bundle including UNET, CLIP, and VAE. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_MultiSelectorFlexibleClip.md b/js/docs/Sage_MultiSelectorFlexibleClip.md new file mode 100644 index 0000000..ecaad4f --- /dev/null +++ b/js/docs/Sage_MultiSelectorFlexibleClip.md @@ -0,0 +1,93 @@ +--- +type: NodeDoc +title: Multi Selector Flexible CLIP +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Multi Selector Flexible CLIP + +* **Node ID:** `Sage_MultiSelectorFlexibleClip` +* **Category:** `Sage Utils/selector` + +Selects checkpoint, UNET, VAE, and a flexible number of CLIP models from lists. + +## Inputs + +### `unet_name` — `COMBO` +- **Name:** `unet_name` +- **Description:** Choose a UNET model to include in the combined model bundle. + +### `weight_dtype` — `COMBO` +- **Name:** `weight_dtype` +- **Description:** Choose the dtype used to load the UNET model. + +### `num_of_clips` — `COMFY_DYNAMICCOMBO_V3` +- **Name:** `num_of_clips` +- **Description:** Choose how many CLIP models to include in the combined model bundle. + +### `clip_name_1` — `COMBO` +- **Name:** `clip_name_1` +- **Description:** Select a CLIP model to include in the combined clip set. + +### `clip_type` — `COMBO` +- **Name:** `clip_type` +- **Description:** Choose the loader type to use for a single CLIP model. + +### `clip_name_1` — `COMBO` +- **Name:** `clip_name_1` +- **Description:** Select a CLIP model to include in the combined clip set. + +### `clip_name_2` — `COMBO` +- **Name:** `clip_name_2` +- **Description:** Select a CLIP model to include in the combined clip set. + +### `clip_type` — `COMBO` +- **Name:** `clip_type` +- **Description:** Choose the loader type to use for a dual CLIP model pair. + +### `clip_name_1` — `COMBO` +- **Name:** `clip_name_1` +- **Description:** Select a CLIP model to include in the combined clip set. + +### `clip_name_2` — `COMBO` +- **Name:** `clip_name_2` +- **Description:** Select a CLIP model to include in the combined clip set. + +### `clip_name_3` — `COMBO` +- **Name:** `clip_name_3` +- **Description:** Select a CLIP model to include in the combined clip set. + +### `clip_name_1` — `COMBO` +- **Name:** `clip_name_1` +- **Description:** Select a CLIP model to include in the combined clip set. + +### `clip_name_2` — `COMBO` +- **Name:** `clip_name_2` +- **Description:** Select a CLIP model to include in the combined clip set. + +### `clip_name_3` — `COMBO` +- **Name:** `clip_name_3` +- **Description:** Select a CLIP model to include in the combined clip set. + +### `clip_name_4` — `COMBO` +- **Name:** `clip_name_4` +- **Description:** Select a CLIP model to include in the combined clip set. + +### `vae_name` — `COMBO` +- **Name:** `vae_name` +- **Description:** Choose a VAE model to include in the combined model bundle. + + +## Outputs + +### `model_info` — `MODEL_INFO` +- **Name:** `model_info` +- **Description:** Combined model info bundle including UNET, CLIP, and VAE. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_MultiSelectorQuadClip.md b/js/docs/Sage_MultiSelectorQuadClip.md new file mode 100644 index 0000000..5c509b0 --- /dev/null +++ b/js/docs/Sage_MultiSelectorQuadClip.md @@ -0,0 +1,57 @@ +--- +type: NodeDoc +title: Multi Selector Quad CLIP +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Multi Selector Quad CLIP + +* **Node ID:** `Sage_MultiSelectorQuadClip` +* **Category:** `Sage Utils/selector` + +Selects checkpoint, UNET, VAE, and four CLIP models from lists. + +## Inputs + +### `unet_name` — `COMBO` +- **Name:** `unet_name` +- **Description:** Choose a UNET model to include in the loaded model bundle. + +### `weight_dtype` — `COMBO` +- **Name:** `weight_dtype` +- **Description:** Choose the UNET weight dtype. + +### `clip_name_1` — `COMBO` +- **Name:** `clip_name_1` +- **Description:** Choose the first CLIP model for the loaded bundle. + +### `clip_name_2` — `COMBO` +- **Name:** `clip_name_2` +- **Description:** Choose the second CLIP model for the loaded bundle. + +### `clip_name_3` — `COMBO` +- **Name:** `clip_name_3` +- **Description:** Choose the third CLIP model for the loaded bundle. + +### `clip_name_4` — `COMBO` +- **Name:** `clip_name_4` +- **Description:** Choose the fourth CLIP model for the loaded bundle. + +### `vae_name` — `COMBO` +- **Name:** `vae_name` +- **Description:** Choose a VAE model to include in the loaded model bundle. + + +## Outputs + +### `model_info` — `MODEL_INFO` +- **Name:** `model_info` +- **Description:** Combined model info bundle including UNET, CLIP, and VAE. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_MultiSelectorSingleClip.md b/js/docs/Sage_MultiSelectorSingleClip.md new file mode 100644 index 0000000..da8a000 --- /dev/null +++ b/js/docs/Sage_MultiSelectorSingleClip.md @@ -0,0 +1,49 @@ +--- +type: NodeDoc +title: Multi Selector Single CLIP +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Multi Selector Single CLIP + +* **Node ID:** `Sage_MultiSelectorSingleClip` +* **Category:** `Sage Utils/selector` + +Selects checkpoint, UNET, VAE, and single CLIP models from lists. + +## Inputs + +### `unet_name` — `COMBO` +- **Name:** `unet_name` +- **Description:** Choose a UNET model to include in the loaded model bundle. + +### `weight_dtype` — `COMBO` +- **Name:** `weight_dtype` +- **Description:** Choose the UNET weight dtype. + +### `clip_name` — `COMBO` +- **Name:** `clip_name` +- **Description:** Choose a single CLIP model to include. + +### `clip_type` — `COMBO` +- **Name:** `clip_type` +- **Description:** Choose the loader type for the single CLIP model. + +### `vae_name` — `COMBO` +- **Name:** `vae_name` +- **Description:** Choose a VAE model to include in the loaded model bundle. + + +## Outputs + +### `model_info` — `MODEL_INFO` +- **Name:** `model_info` +- **Description:** Combined model info bundle including UNET, CLIP, and VAE. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_MultiSelectorTripleClip.md b/js/docs/Sage_MultiSelectorTripleClip.md new file mode 100644 index 0000000..c18ebf5 --- /dev/null +++ b/js/docs/Sage_MultiSelectorTripleClip.md @@ -0,0 +1,53 @@ +--- +type: NodeDoc +title: Multi Selector Triple CLIP +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Multi Selector Triple CLIP + +* **Node ID:** `Sage_MultiSelectorTripleClip` +* **Category:** `Sage Utils/selector` + +Selects checkpoint, UNET, VAE, and three CLIP models from lists. + +## Inputs + +### `unet_name` — `COMBO` +- **Name:** `unet_name` +- **Description:** Choose a UNET model to include in the loaded model bundle. + +### `weight_dtype` — `COMBO` +- **Name:** `weight_dtype` +- **Description:** Choose the UNET weight dtype. + +### `clip_name_1` — `COMBO` +- **Name:** `clip_name_1` +- **Description:** Choose the first CLIP model for the loaded bundle. + +### `clip_name_2` — `COMBO` +- **Name:** `clip_name_2` +- **Description:** Choose the second CLIP model for the loaded bundle. + +### `clip_name_3` — `COMBO` +- **Name:** `clip_name_3` +- **Description:** Choose the third CLIP model for the loaded bundle. + +### `vae_name` — `COMBO` +- **Name:** `vae_name` +- **Description:** Choose a VAE model to include in the loaded model bundle. + + +## Outputs + +### `model_info` — `MODEL_INFO` +- **Name:** `model_info` +- **Description:** Combined model info bundle including UNET, CLIP, and VAE. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_MultiplyConditioningStrength.md b/js/docs/Sage_MultiplyConditioningStrength.md new file mode 100644 index 0000000..bf5b642 --- /dev/null +++ b/js/docs/Sage_MultiplyConditioningStrength.md @@ -0,0 +1,45 @@ +--- +type: NodeDoc +title: Multiply Conditioning Strength +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Multiply Conditioning Strength + +* **Node ID:** `Sage_MultiplyConditioningStrength` +* **Category:** `Sage Utils/clip/conditioning` + +Multiplies conditioning strength by a float value. + +## Inputs + +### `conditioning` — `CONDITIONING` +- **Name:** `conditioning` +- **Description:** The conditioning to scale. + +### `operation` — `COMFY_DYNAMICCOMBO_V3` +- **Name:** `operation` +- **Description:** Select how to adjust the conditioning strength. + +### `value` — `FLOAT` +- **Name:** `value` +- **Description:** Multiply by this value. + +### `value` — `FLOAT` +- **Name:** `value` +- **Description:** Divide by this value. + + +## Outputs + +### `conditioning` — `CONDITIONING` +- **Name:** `conditioning` +- **Description:** The scaled conditioning. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_NormalizeConditioningStrength.md b/js/docs/Sage_NormalizeConditioningStrength.md new file mode 100644 index 0000000..f2ff878 --- /dev/null +++ b/js/docs/Sage_NormalizeConditioningStrength.md @@ -0,0 +1,41 @@ +--- +type: NodeDoc +title: Normalize Conditioning Strength +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Normalize Conditioning Strength + +* **Node ID:** `Sage_NormalizeConditioningStrength` +* **Category:** `Sage Utils/clip/conditioning` + +Normalizes conditioning strengths to a target magnitude. + +## Inputs + +### `conditioning` — `CONDITIONING` +- **Name:** `conditioning` +- **Description:** The conditioning to normalize. + +### `norm` — `COMBO` +- **Name:** `norm` +- **Description:** Normalization strategy. + +### `target` — `FLOAT` +- **Name:** `target` +- **Description:** Target normalized magnitude. + + +## Outputs + +### `conditioning` — `CONDITIONING` +- **Name:** `conditioning` +- **Description:** Normalized conditioning. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_NumberToStr.md b/js/docs/Sage_NumberToStr.md new file mode 100644 index 0000000..61dfa68 --- /dev/null +++ b/js/docs/Sage_NumberToStr.md @@ -0,0 +1,40 @@ +--- +type: NodeDoc +title: Number to String +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Number to String + +* **Node ID:** `Sage_NumberToStr` +* **Category:** `Sage Utils/text/conversion` + +Converts a number to a string. + +## Inputs + +### `num_type` — `COMFY_DYNAMICCOMBO_V3` +- **Description:** Choose the numeric type to convert to a string. + +### `num` — `FLOAT` +- **Name:** `num` +- **Description:** Float number to convert to string. + +### `num` — `INT` +- **Name:** `num` +- **Description:** Integer number to convert to string. + + +## Outputs + +### `str` — `STRING` +- **Name:** `str` +- **Description:** Output value for str. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_ParseMetadataFlexible.md b/js/docs/Sage_ParseMetadataFlexible.md new file mode 100644 index 0000000..8636153 --- /dev/null +++ b/js/docs/Sage_ParseMetadataFlexible.md @@ -0,0 +1,105 @@ +--- +type: NodeDoc +title: Parse Metadata Flexible +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Parse Metadata Flexible + +* **Node ID:** `Sage_ParseMetadataFlexible` +* **Category:** `Sage Utils/metadata` + +Parses A1111 Full format metadata string and extracts individual components. Returns parsed values for positive prompt, negative prompt, sampler info (sampler, scheduler, cfg, steps, seed), dimensions (width, height), and attempts to find models and LoRAs by hash in the local cache. + +## Inputs + +### `metadata_string` — `STRING` +- **Name:** `metadata_string` +- **Description:** The metadata string to parse. + +### `default_seed` — `INT` (optional) +- **Name:** `default_seed` +- **Description:** Default seed used when the metadata does not specify one. + +### `default_steps` — `INT` (optional) +- **Name:** `default_steps` +- **Description:** Default steps used when the metadata does not specify them. + +### `default_cfg` — `FLOAT` (optional) +- **Name:** `default_cfg` +- **Description:** Default CFG scale used when the metadata does not specify it. + +### `default_sampler` — `COMBO` (optional) +- **Name:** `default_sampler` +- **Description:** Default sampler to use when the metadata string does not specify one. + +### `default_scheduler` — `COMBO` (optional) +- **Name:** `default_scheduler` +- **Description:** Default scheduler to use when the metadata string does not specify one. + +### `default_width` — `INT` (optional) +- **Name:** `default_width` +- **Description:** Default width used when the metadata does not specify dimensions. + +### `default_height` — `INT` (optional) +- **Name:** `default_height` +- **Description:** Default height used when the metadata does not specify dimensions. + +### `default_model_info` — `MODEL_INFO` (optional) +- **Name:** `default_model_info` +- **Description:** Default model info used when the metadata string does not identify a model. + + +## Outputs + +### `positive_string` — `STRING` +- **Name:** `positive_string` +- **Description:** Extracted positive prompt string. + +### `negative_string` — `STRING` +- **Name:** `negative_string` +- **Description:** Extracted negative prompt string. + +### `seed` — `INT` +- **Name:** `seed` +- **Description:** Extracted seed value. + +### `steps` — `INT` +- **Name:** `steps` +- **Description:** Extracted number of steps. + +### `cfg` — `FLOAT` +- **Name:** `cfg` +- **Description:** Extracted CFG scale. + +### `sampler_name` — `COMBO` +- **Name:** `sampler_name` +- **Description:** Extracted sampler name. + +### `scheduler` — `COMBO` +- **Name:** `scheduler` +- **Description:** Extracted scheduler name. + +### `width` — `INT` +- **Name:** `width` +- **Description:** Extracted image width. + +### `height` — `INT` +- **Name:** `height` +- **Description:** Extracted image height. + +### `model_info` — `MODEL_INFO` +- **Name:** `model_info` +- **Description:** Extracted default model info from metadata, if available. + +### `lora_stack` — `LORA_STACK` +- **Name:** `lora_stack` +- **Description:** Extracted LoRA stack information from the metadata. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_PercentageToFloat.md b/js/docs/Sage_PercentageToFloat.md new file mode 100644 index 0000000..ac96827 --- /dev/null +++ b/js/docs/Sage_PercentageToFloat.md @@ -0,0 +1,33 @@ +--- +type: NodeDoc +title: Percentage To Float +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Percentage To Float + +* **Node ID:** `Sage_PercentageToFloat` +* **Category:** `Sage Utils/util` + +Convert a percentage value (0-100) to a float (0.0-1.0). + +## Inputs + +### `percentage` — `FLOAT` +- **Name:** `percentage` +- **Description:** Percentage value to convert into a normalized float. + + +## Outputs + +### `float_value` — `FLOAT` +- **Name:** `float_value` +- **Description:** Converted normalized float value from the input percentage. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_PonyPrefix.md b/js/docs/Sage_PonyPrefix.md index d196235..88b7b7a 100644 --- a/js/docs/Sage_PonyPrefix.md +++ b/js/docs/Sage_PonyPrefix.md @@ -1,19 +1,49 @@ -# Sage_PonyPrefix +--- +type: NodeDoc +title: Pony Prefix +description: Auto-generated node documentation. +tags: [nodes, docs] +--- -**Add Pony v6 Prefixes** +# Pony Prefix -Creates Pony v6 prefixes for prompt engineering based on score, rating, and source parameters. +* **Node ID:** `Sage_PonyPrefix` +* **Category:** `Sage Utils/text/prompt/pony` + +Generates a prefix for pony-related content. ## Inputs -- **add_score** (boolean, required): Whether to include score prefixes (score_9, score_8_up, etc.) -- **rating** (string, required): Content rating - Options: "none", "safe", "questionable", "explicit" -- **source** (string, required): Content source - Options: "none", "pony", "furry", "anime", "cartoon", "3d", "western", "comic", "monster" +### `add_score` — `BOOLEAN` +- **Name:** `add_score` +- **Description:** Include a generated score string in the prefix. + +### `score_start` — `INT` +- **Name:** `Score Start` +- **Description:** The starting score for the prefix score range. + +### `score_end` — `INT` +- **Name:** `Score End` +- **Description:** The ending score for the prefix score range. + +### `rating` — `COMBO` +- **Name:** `rating` +- **Description:** The rating to include in the prefix. + +### `source` — `COMBO` +- **Name:** `source` +- **Description:** The source type to include in the prefix. + ## Outputs -- **STRING**: Generated prefix string containing the selected score, rating, and source tags +### `str_out` — `STRING` +- **Name:** `string` +- **Description:** The generated Pony prefix string. -## Usage -Use to automatically generate appropriate prefixes for Pony v6 models. The node combines score tags (if enabled), source tags, and rating tags into a properly formatted prefix string that can be prepended to your main prompt. +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_PonyRatingv6.md b/js/docs/Sage_PonyRatingv6.md new file mode 100644 index 0000000..4a8d5ba --- /dev/null +++ b/js/docs/Sage_PonyRatingv6.md @@ -0,0 +1,33 @@ +--- +type: NodeDoc +title: Pony Rating (v6) +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Pony Rating (v6) + +* **Node ID:** `Sage_PonyRatingv6` +* **Category:** `Sage Utils/text/prompt/pony` + +Creates a rating string for pony prompts based on the given rating. (v6 style) + +## Inputs + +### `rating` — `COMBO` +- **Name:** `rating` +- **Description:** The Pony v6 rating level to include. + + +## Outputs + +### `rating_text` — `STRING` +- **Name:** `rating_text` +- **Description:** The generated Pony v6 rating text. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_PonyRatingv7.md b/js/docs/Sage_PonyRatingv7.md new file mode 100644 index 0000000..1416a51 --- /dev/null +++ b/js/docs/Sage_PonyRatingv7.md @@ -0,0 +1,33 @@ +--- +type: NodeDoc +title: Pony Rating (v7) +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Pony Rating (v7) + +* **Node ID:** `Sage_PonyRatingv7` +* **Category:** `Sage Utils/text/prompt/pony` + +Creates a rating string for pony prompts based on the given rating. (v7 style) + +## Inputs + +### `rating` — `COMBO` +- **Name:** `rating` +- **Description:** The Pony v7 rating level to include. + + +## Outputs + +### `rating_text` — `STRING` +- **Name:** `rating_text` +- **Description:** The generated Pony v7 rating text. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_PonyScore.md b/js/docs/Sage_PonyScore.md new file mode 100644 index 0000000..754eaa1 --- /dev/null +++ b/js/docs/Sage_PonyScore.md @@ -0,0 +1,41 @@ +--- +type: NodeDoc +title: Pony Score +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Pony Score + +* **Node ID:** `Sage_PonyScore` +* **Category:** `Sage Utils/text/prompt/pony` + +Creates a score string for pony prompts based on the given start and end scores. + +## Inputs + +### `score_start` — `INT` +- **Name:** `score_start` +- **Description:** The starting score for the Pony score string. + +### `score_end` — `INT` +- **Name:** `score_end` +- **Description:** The ending score for the Pony score string. + +### `up_to` — `BOOLEAN` +- **Name:** `up_to` +- **Description:** If true, adds '_up' to the score string, except for score_9. (v6 uses up, v7 doesn't) + + +## Outputs + +### `score_text` — `STRING` +- **Name:** `score_text` +- **Description:** The generated Pony score string. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_PonySource.md b/js/docs/Sage_PonySource.md new file mode 100644 index 0000000..6d2cd2b --- /dev/null +++ b/js/docs/Sage_PonySource.md @@ -0,0 +1,33 @@ +--- +type: NodeDoc +title: Pony Source +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Pony Source + +* **Node ID:** `Sage_PonySource` +* **Category:** `Sage Utils/text/prompt/pony` + +Creates a source string for pony prompts based on the given source. + +## Inputs + +### `source` — `COMBO` +- **Name:** `source` +- **Description:** Choose the prompt source type for Pony prompts. + + +## Outputs + +### `source_text` — `STRING` +- **Name:** `source_text` +- **Description:** The source text fragment generated for Pony prompts. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_PonyStyle.md b/js/docs/Sage_PonyStyle.md index 39cef01..c9ed8e1 100644 --- a/js/docs/Sage_PonyStyle.md +++ b/js/docs/Sage_PonyStyle.md @@ -1,26 +1,33 @@ -# Sage_PonyStyle +--- +type: NodeDoc +title: Pony Style +description: Auto-generated node documentation. +tags: [nodes, docs] +--- -**Add Pony Style** +# Pony Style -Adds three-letter artist style codes from Pony v6 to prompts. +* **Node ID:** `Sage_PonyStyle` +* **Category:** `Sage Utils/text/prompt/pony` + +Adds the chosen three letter artist styles from Pony v6. ## Inputs -- **style** (multi-select): Choose from hundreds of three-letter artist style codes - - Multi-select dropdown with chip display - - Options include: aav, aax, aba, aca, acb, acl, etc. (extensive list of artist style codes) +### `style` — `COMBO` +- **Name:** `style` +- **Description:** Choose Pony style codes to include in the prompt. + ## Outputs -- **text** (STRING): Comma-separated list of selected style codes +### `styled_text` — `STRING` +- **Name:** `styled_text` +- **Description:** The combined Pony style text generated from selected styles. -## Usage - -Use to add specific artist styles to your Pony v6 prompts. Select one or more three-letter codes that correspond to different artistic styles. The node will output them as a comma-separated string that can be added to your prompt. ## Notes -- Contains hundreds of three-letter artist style codes specific to Pony v6 -- Supports multi-selection for combining multiple artistic influences -- Output is formatted as comma-separated values for easy prompt integration -- Style codes are based on the Pony v6 model's training data and recognized artistic styles + + +Generated from the node schema. diff --git a/js/docs/Sage_PonyStyleCluster.md b/js/docs/Sage_PonyStyleCluster.md new file mode 100644 index 0000000..93defb5 --- /dev/null +++ b/js/docs/Sage_PonyStyleCluster.md @@ -0,0 +1,33 @@ +--- +type: NodeDoc +title: Pony Style Cluster +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Pony Style Cluster + +* **Node ID:** `Sage_PonyStyleCluster` +* **Category:** `Sage Utils/text/prompt/pony` + +Creates a style cluster string for pony prompts based on the given style cluster number. + +## Inputs + +### `style_cluster` — `INT` +- **Name:** `style_cluster` +- **Description:** The Pony style cluster number to generate. + + +## Outputs + +### `style_cluster_text` — `STRING` +- **Name:** `style_cluster_text` +- **Description:** The generated Pony style cluster text. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_PromptText.md b/js/docs/Sage_PromptText.md new file mode 100644 index 0000000..decb6e5 --- /dev/null +++ b/js/docs/Sage_PromptText.md @@ -0,0 +1,37 @@ +--- +type: NodeDoc +title: Prompt Text (Lumina 2) +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Prompt Text (Lumina 2) + +* **Node ID:** `Sage_PromptText` +* **Category:** `Sage Utils/text/prompt/lumina2` + +Combines a system prompt and a user prompt into a single prompt, with between them. + +## Inputs + +### `system` — `STRING` +- **Name:** `system` +- **Description:** The system prompt portion for Lumina 2. + +### `prompt` — `STRING` +- **Name:** `prompt` +- **Description:** The user prompt portion for Lumina 2. + + +## Outputs + +### `combined_prompt` — `STRING` +- **Name:** `combined_prompt` +- **Description:** The combined system and user prompt for Lumina 2. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_QuadCLIPSelector.md b/js/docs/Sage_QuadCLIPSelector.md new file mode 100644 index 0000000..f72047b --- /dev/null +++ b/js/docs/Sage_QuadCLIPSelector.md @@ -0,0 +1,45 @@ +--- +type: NodeDoc +title: Quad CLIP Selector +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Quad CLIP Selector + +* **Node ID:** `Sage_QuadCLIPSelector` +* **Category:** `Sage Utils/selector` + +Selects four CLIP models from a list. + +## Inputs + +### `clip_name_1` — `COMBO` +- **Name:** `clip_name_1` +- **Description:** Choose the first CLIP model for the quad selector. + +### `clip_name_2` — `COMBO` +- **Name:** `clip_name_2` +- **Description:** Choose the second CLIP model for the quad selector. + +### `clip_name_3` — `COMBO` +- **Name:** `clip_name_3` +- **Description:** Choose the third CLIP model for the quad selector. + +### `clip_name_4` — `COMBO` +- **Name:** `clip_name_4` +- **Description:** Choose the fourth CLIP model for the quad selector. + + +## Outputs + +### `clip_info` — `MODEL_INFO` +- **Name:** `clip_info` +- **Description:** Combined CLIP model info for the selected models. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_QuickLoraStack.md b/js/docs/Sage_QuickLoraStack.md new file mode 100644 index 0000000..5dfabff --- /dev/null +++ b/js/docs/Sage_QuickLoraStack.md @@ -0,0 +1,45 @@ +--- +type: NodeDoc +title: Quick Lora Stack +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Quick Lora Stack + +* **Node ID:** `Sage_QuickLoraStack` +* **Category:** `Sage Utils/lora` + +A simplified version of the lora stack node, without the clip_weight. + +## Inputs + +### `enabled` — `BOOLEAN` +- **Name:** `enabled` +- **Description:** Enable or disable this Quick LoRA stack entry. + +### `lora_name` — `COMBO` +- **Name:** `lora_name` +- **Description:** Choose a LoRA model to add. + +### `model_weight` — `FLOAT` +- **Name:** `model_weight` +- **Description:** Weight for the LoRA model and clip branch. + +### `lora_stack` — `LORA_STACK` (optional) +- **Name:** `lora_stack` +- **Description:** Existing LoRA stack to append to. + + +## Outputs + +### `out_lora_stack` — `LORA_STACK` +- **Name:** `lora_stack` +- **Description:** Combined LoRA stack output. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_QuickNineLoraStack.md b/js/docs/Sage_QuickNineLoraStack.md new file mode 100644 index 0000000..65977c6 --- /dev/null +++ b/js/docs/Sage_QuickNineLoraStack.md @@ -0,0 +1,141 @@ +--- +type: NodeDoc +title: Quick Lora Stack (x9) +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Quick Lora Stack (x9) + +* **Node ID:** `Sage_QuickNineLoraStack` +* **Category:** `Sage Utils/lora` + +Choose nine loras with model weight only, and add them to a lora_stack. + +## Inputs + +### `enabled_1` — `BOOLEAN` +- **Name:** `enabled_1` +- **Description:** Enable or disable this LoRA entry in the stack. + +### `lora_1_name` — `COMBO` +- **Name:** `lora_1_name` +- **Description:** Select a LoRA model to include in this stack entry. + +### `model_1_weight` — `FLOAT` +- **Name:** `model_1_weight` +- **Description:** Weight for the LoRA model branch. + +### `enabled_2` — `BOOLEAN` +- **Name:** `enabled_2` +- **Description:** Enable or disable this LoRA entry in the stack. + +### `lora_2_name` — `COMBO` +- **Name:** `lora_2_name` +- **Description:** Select a LoRA model to include in this stack entry. + +### `model_2_weight` — `FLOAT` +- **Name:** `model_2_weight` +- **Description:** Weight for the LoRA model branch. + +### `enabled_3` — `BOOLEAN` +- **Name:** `enabled_3` +- **Description:** Enable or disable this LoRA entry in the stack. + +### `lora_3_name` — `COMBO` +- **Name:** `lora_3_name` +- **Description:** Select a LoRA model to include in this stack entry. + +### `model_3_weight` — `FLOAT` +- **Name:** `model_3_weight` +- **Description:** Weight for the LoRA model branch. + +### `enabled_4` — `BOOLEAN` +- **Name:** `enabled_4` +- **Description:** Enable or disable this LoRA entry in the stack. + +### `lora_4_name` — `COMBO` +- **Name:** `lora_4_name` +- **Description:** Select a LoRA model to include in this stack entry. + +### `model_4_weight` — `FLOAT` +- **Name:** `model_4_weight` +- **Description:** Weight for the LoRA model branch. + +### `enabled_5` — `BOOLEAN` +- **Name:** `enabled_5` +- **Description:** Enable or disable this LoRA entry in the stack. + +### `lora_5_name` — `COMBO` +- **Name:** `lora_5_name` +- **Description:** Select a LoRA model to include in this stack entry. + +### `model_5_weight` — `FLOAT` +- **Name:** `model_5_weight` +- **Description:** Weight for the LoRA model branch. + +### `enabled_6` — `BOOLEAN` +- **Name:** `enabled_6` +- **Description:** Enable or disable this LoRA entry in the stack. + +### `lora_6_name` — `COMBO` +- **Name:** `lora_6_name` +- **Description:** Select a LoRA model to include in this stack entry. + +### `model_6_weight` — `FLOAT` +- **Name:** `model_6_weight` +- **Description:** Weight for the LoRA model branch. + +### `enabled_7` — `BOOLEAN` +- **Name:** `enabled_7` +- **Description:** Enable or disable this LoRA entry in the stack. + +### `lora_7_name` — `COMBO` +- **Name:** `lora_7_name` +- **Description:** Select a LoRA model to include in this stack entry. + +### `model_7_weight` — `FLOAT` +- **Name:** `model_7_weight` +- **Description:** Weight for the LoRA model branch. + +### `enabled_8` — `BOOLEAN` +- **Name:** `enabled_8` +- **Description:** Enable or disable this LoRA entry in the stack. + +### `lora_8_name` — `COMBO` +- **Name:** `lora_8_name` +- **Description:** Select a LoRA model to include in this stack entry. + +### `model_8_weight` — `FLOAT` +- **Name:** `model_8_weight` +- **Description:** Weight for the LoRA model branch. + +### `enabled_9` — `BOOLEAN` +- **Name:** `enabled_9` +- **Description:** Enable or disable this LoRA entry in the stack. + +### `lora_9_name` — `COMBO` +- **Name:** `lora_9_name` +- **Description:** Select a LoRA model to include in this stack entry. + +### `model_9_weight` — `FLOAT` +- **Name:** `model_9_weight` +- **Description:** Weight for the LoRA model branch. + +### `lora_stack` — `LORA_STACK` (optional) +- **Name:** `lora_stack` +- **Description:** An existing LoRA stack to append this entry to. + + +## Outputs + +### `out_lora_stack` — `LORA_STACK` +- **Name:** `lora_stack` +- **Description:** Combined Quick LoRA stack containing the selected entries. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_QuickResPicker.md b/js/docs/Sage_QuickResPicker.md index 204f7e2..c287b22 100644 --- a/js/docs/Sage_QuickResPicker.md +++ b/js/docs/Sage_QuickResPicker.md @@ -1,46 +1,45 @@ -# Sage_QuickResPicker +--- +type: NodeDoc +title: Quick Resolution Picker +description: Auto-generated node documentation. +tags: [nodes, docs] +--- -## Quick Resolution Picker +# Quick Resolution Picker -A convenient node for quickly selecting common image resolutions from predefined aspect ratios with orientation and scaling options. +* **Node ID:** `Sage_QuickResPicker` +* **Category:** `Sage Utils/image/res` + +Quickly pick image resolution based on aspect ratio and orientation. ## Inputs -### Required +### `aspect_ratio` — `COMBO` +- **Name:** `Aspect Ratio` +- **Description:** The aspect ratio. + +### `orientation` — `COMBO` +- **Name:** `Orientation` +- **Description:** The orientation of the image. + +### `multiplier` — `FLOAT` +- **Name:** `Multiplier` +- **Description:** The multiplier for the base resolution. -- **aspect_ratio** (COMBO): Predefined aspect ratio selection - "1:1", "5:12", "9:16", "10:16", "5:7", "2:3", "3:4", "4:7", "7:9", "8:10", "13:19" -- **orientation** (COMBO): "Portrait" or "Landscape" orientation -- **multiplier** (FLOAT): Scale factor for the resolution (default: 1.0, range: 0.1-10.0, step: 0.1) ## Outputs -- **width** (INT): The calculated width dimension -- **height** (INT): The calculated height dimension +### `width` — `INT` +- **Name:** `width` +- **Description:** The selected width. -## Usage +### `height` — `INT` +- **Name:** `height` +- **Description:** The selected height. -Pick a resolution from a list of common aspect ratios. The multiplier can be used to scale the resolution up or down, rounded to the nearest unit of 64. - -## Available Aspect Ratios - -- **1:1** - Square (1024 x 1024) -- **5:12** - Portrait (512 x 1216) -- **9:16** - Portrait (720 x 1280) -- **10:16** - Portrait (640 x 1024) -- **5:7** - Portrait (1280 x 1792) -- **2:3** - Portrait (768 x 1152) -- **3:4** - Portrait (768 x 1024) -- **4:7** - Portrait (768 x 1344) -- **7:9** - Portrait (896 x 1152) -- **8:10** - Portrait (1024 x 1280) -- **13:19** - Portrait (832 x 1216) ## Notes -- All base resolutions are listed in portrait orientation -- Landscape orientation swaps width and height -- Multiplier allows scaling while maintaining aspect ratio -- All outputs are rounded to nearest multiple of 64 for optimal AI generation -- Defaults to 1:1 aspect ratio if invalid selection -- Useful for quickly setting up standard image dimensions -- Covers common aspect ratios used in AI image generation + + +Generated from the node schema. diff --git a/js/docs/Sage_QuickSixLoraStack.md b/js/docs/Sage_QuickSixLoraStack.md new file mode 100644 index 0000000..a38db56 --- /dev/null +++ b/js/docs/Sage_QuickSixLoraStack.md @@ -0,0 +1,105 @@ +--- +type: NodeDoc +title: Quick Lora Stack (x6) +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Quick Lora Stack (x6) + +* **Node ID:** `Sage_QuickSixLoraStack` +* **Category:** `Sage Utils/lora` + +Choose six loras with model weight only, and add them to a lora_stack. + +## Inputs + +### `enabled_1` — `BOOLEAN` +- **Name:** `enabled_1` +- **Description:** Enable or disable this LoRA entry in the stack. + +### `lora_1_name` — `COMBO` +- **Name:** `lora_1_name` +- **Description:** Select a LoRA model to include in this stack entry. + +### `model_1_weight` — `FLOAT` +- **Name:** `model_1_weight` +- **Description:** Weight for the LoRA model branch. + +### `enabled_2` — `BOOLEAN` +- **Name:** `enabled_2` +- **Description:** Enable or disable this LoRA entry in the stack. + +### `lora_2_name` — `COMBO` +- **Name:** `lora_2_name` +- **Description:** Select a LoRA model to include in this stack entry. + +### `model_2_weight` — `FLOAT` +- **Name:** `model_2_weight` +- **Description:** Weight for the LoRA model branch. + +### `enabled_3` — `BOOLEAN` +- **Name:** `enabled_3` +- **Description:** Enable or disable this LoRA entry in the stack. + +### `lora_3_name` — `COMBO` +- **Name:** `lora_3_name` +- **Description:** Select a LoRA model to include in this stack entry. + +### `model_3_weight` — `FLOAT` +- **Name:** `model_3_weight` +- **Description:** Weight for the LoRA model branch. + +### `enabled_4` — `BOOLEAN` +- **Name:** `enabled_4` +- **Description:** Enable or disable this LoRA entry in the stack. + +### `lora_4_name` — `COMBO` +- **Name:** `lora_4_name` +- **Description:** Select a LoRA model to include in this stack entry. + +### `model_4_weight` — `FLOAT` +- **Name:** `model_4_weight` +- **Description:** Weight for the LoRA model branch. + +### `enabled_5` — `BOOLEAN` +- **Name:** `enabled_5` +- **Description:** Enable or disable this LoRA entry in the stack. + +### `lora_5_name` — `COMBO` +- **Name:** `lora_5_name` +- **Description:** Select a LoRA model to include in this stack entry. + +### `model_5_weight` — `FLOAT` +- **Name:** `model_5_weight` +- **Description:** Weight for the LoRA model branch. + +### `enabled_6` — `BOOLEAN` +- **Name:** `enabled_6` +- **Description:** Enable or disable this LoRA entry in the stack. + +### `lora_6_name` — `COMBO` +- **Name:** `lora_6_name` +- **Description:** Select a LoRA model to include in this stack entry. + +### `model_6_weight` — `FLOAT` +- **Name:** `model_6_weight` +- **Description:** Weight for the LoRA model branch. + +### `lora_stack` — `LORA_STACK` (optional) +- **Name:** `lora_stack` +- **Description:** An existing LoRA stack to append this entry to. + + +## Outputs + +### `out_lora_stack` — `LORA_STACK` +- **Name:** `lora_stack` +- **Description:** Combined Quick LoRA stack containing the selected entries. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_ReferenceImage.md b/js/docs/Sage_ReferenceImage.md new file mode 100644 index 0000000..14d243d --- /dev/null +++ b/js/docs/Sage_ReferenceImage.md @@ -0,0 +1,45 @@ +--- +type: NodeDoc +title: Reference Image +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Reference Image + +* **Node ID:** `Sage_ReferenceImage` +* **Category:** `Sage Utils/clip/encode/image` + +This node sets the guiding latent for an edit model. If the model supports it you can chain multiple to set multiple reference images. + +## Inputs + +### `conditioning` — `CONDITIONING` +- **Name:** `conditioning` +- **Description:** The input conditioning. + +### `image` — `IMAGE` +- **Name:** `image` +- **Description:** The reference image. + +### `vae` — `VAE` +- **Name:** `vae` +- **Description:** The VAE model for encoding the image. + + +## Outputs + +### `out_conditioning` — `CONDITIONING` +- **Name:** `conditioning` +- **Description:** The output conditioning. + +### `out_latent` — `LATENT` +- **Name:** `latent` +- **Description:** The encoded latent. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_SamplerInfo.md b/js/docs/Sage_SamplerInfo.md index 605e261..47c5069 100644 --- a/js/docs/Sage_SamplerInfo.md +++ b/js/docs/Sage_SamplerInfo.md @@ -1,38 +1,53 @@ -# Sage_SamplerInfo +--- +type: NodeDoc +title: KSampler Info +description: Auto-generated node documentation. +tags: [nodes, docs] +--- -**Sampler Info** +# KSampler Info -Collects and packages sampler settings for use in metadata construction and KSampler nodes. +* **Node ID:** `Sage_SamplerInfo` +* **Category:** `Sage Utils/sampler` + +Grabs most of the sampler info. Should be routed both to the Construct Metadata node and the KSampler w/ Sampler Info node. ## Inputs -- **seed** (INT, required): Random seed for noise generation - - Default: 0, Range: 0 to 2^64-1 -- **steps** (INT, required): Number of denoising steps - - Default: 20, Range: 1 to 10,000 -- **cfg** (FLOAT, required): Classifier-Free Guidance scale - - Default: 5.5, Range: 0.0 to 100.0, Step: 0.1 -- **sampler_name** (dropdown, required): Sampling algorithm - - Default: "dpmpp_2m" - - Options: All available ComfyUI samplers -- **scheduler** (dropdown, required): Noise scheduling algorithm - - Default: "beta" - - Options: All available ComfyUI schedulers +### `seed` — `INT` +- **Name:** `seed` +- **Description:** Random seed for sampling. + +### `steps` — `INT` +- **Name:** `steps` +- **Description:** Number of sampling steps. + +### `cfg` — `FLOAT` +- **Name:** `cfg` +- **Description:** CFG scale for the sampler. + +### `sampler_name` — `COMBO` +- **Name:** `sampler_name` +- **Description:** Sampler algorithm to use. + +### `scheduler` — `COMBO` +- **Name:** `scheduler` +- **Description:** Scheduler algorithm to use. + +### `advanced_info` — `ADV_SAMPLER_INFO` (optional) +- **Name:** `advanced_info` +- **Description:** Optional advanced sampler settings. + ## Outputs -- **SAMPLER_INFO**: Dictionary containing all sampler parameters +### `sampler_info` — `SAMPLER_INFO` +- **Name:** `sampler_info` +- **Description:** The collected sampler configuration. -## Usage - -Connect to both the Construct Metadata node and KSampler nodes to standardize and share sampler configuration across your workflow. This node centralizes sampler settings, making it easy to maintain consistency and modify parameters in one place. ## Notes -- Designed to work with Sage_KSampler and other sampler nodes -- Output should be routed to both metadata construction and sampling nodes -- CFG scale balances creativity and prompt adherence -- Higher CFG values increase prompt adherence but may reduce quality if too high -- Sampler algorithm affects quality, speed, and style of generation -- Scheduler controls how noise is gradually removed during denoising -- Centralizes sampler configuration for workflow consistency + + +Generated from the node schema. diff --git a/js/docs/Sage_SamplerInfoNoCFG.md b/js/docs/Sage_SamplerInfoNoCFG.md new file mode 100644 index 0000000..fb254a7 --- /dev/null +++ b/js/docs/Sage_SamplerInfoNoCFG.md @@ -0,0 +1,49 @@ +--- +type: NodeDoc +title: KSampler Info (No CFG) +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# KSampler Info (No CFG) + +* **Node ID:** `Sage_SamplerInfoNoCFG` +* **Category:** `Sage Utils/sampler` + +Grabs most of the sampler info (with cfg at 1.0). Should be routed both to the Construct Metadata node and the KSampler w/ Sampler Info node. + +## Inputs + +### `seed` — `INT` +- **Name:** `seed` +- **Description:** Random seed for sampling. + +### `steps` — `INT` +- **Name:** `steps` +- **Description:** Number of sampling steps. + +### `sampler_name` — `COMBO` +- **Name:** `sampler_name` +- **Description:** Sampler algorithm to use. + +### `scheduler` — `COMBO` +- **Name:** `scheduler` +- **Description:** Scheduler algorithm to use. + +### `advanced_info` — `ADV_SAMPLER_INFO` (optional) +- **Name:** `advanced_info` +- **Description:** Optional advanced sampler settings. + + +## Outputs + +### `sampler_info` — `SAMPLER_INFO` +- **Name:** `sampler_info` +- **Description:** The collected sampler configuration. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_SamplerSelector.md b/js/docs/Sage_SamplerSelector.md new file mode 100644 index 0000000..d4d22fb --- /dev/null +++ b/js/docs/Sage_SamplerSelector.md @@ -0,0 +1,33 @@ +--- +type: NodeDoc +title: Sampler Selector +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Sampler Selector + +* **Node ID:** `Sage_SamplerSelector` +* **Category:** `Sage Utils/sampler` + +Selects a sampler for use in the pipeline. + +## Inputs + +### `sampler_name` — `COMBO` +- **Name:** `sampler_name` +- **Description:** The sampler algorithm to use for generation. + + +## Outputs + +### `sampler` — `STRING` +- **Name:** `sampler` +- **Description:** The selected sampler name. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_SaveImageWithMetadata.md b/js/docs/Sage_SaveImageWithMetadata.md index 9169d25..c5f4088 100644 --- a/js/docs/Sage_SaveImageWithMetadata.md +++ b/js/docs/Sage_SaveImageWithMetadata.md @@ -1,44 +1,57 @@ -# Sage_SaveImageWithMetadata +--- +type: NodeDoc +title: Save Image With Metadata +description: Auto-generated node documentation. +tags: [nodes, docs] +--- -**Save Image w/ Added Metadata** +# Save Image With Metadata -Saves images with comprehensive metadata options including custom parameters, extra metadata, and ComfyUI workflow information. +* **Node ID:** `Sage_SaveImageWithMetadata` +* **Category:** `Sage Utils/image/file` + +Saves images to disk with embedded metadata. ## Inputs -### Required +### `images` — `IMAGE` +- **Name:** `images` +- **Description:** The images to save. -- **images** (IMAGE): The images to save -- **filename_prefix** (STRING): The prefix for the file to save, supports formatting like %date:yyyy-MM-dd% or %Empty Latent Image.width% (default: "ComfyUI_Meta") -- **include_node_metadata** (BOOLEAN): Whether to include ComfyUI prompt/workflow metadata (default: True) -- **include_extra_pnginfo_metadata** (BOOLEAN): Whether to include extra PNG info metadata (default: True) +### `filename_prefix` — `STRING` +- **Name:** `filename_prefix` +- **Description:** The prefix for the saved image filenames. -### Optional +### `include_node_metadata` — `BOOLEAN` +- **Name:** `include_node_metadata` +- **Description:** Whether to include node metadata in the saved image. -- **param_metadata** (STRING): Metadata string for "parameters" field (A1111-style) -- **extra_metadata** (STRING): Additional metadata for "Extra" field +### `include_extra_pnginfo_metadata` — `BOOLEAN` +- **Name:** `include_extra_pnginfo_metadata` +- **Description:** Whether to include extra PNG info metadata. -### Hidden +### `save_text` — `BOOLEAN` +- **Name:** `save_text` +- **Description:** Whether to save accompanying text files with metadata. + +### `param_metadata` — `STRING` +- **Name:** `param_metadata` +- **Description:** The metadata to embed in the image. + +### `extra_metadata` — `STRING` +- **Name:** `extra_metadata` +- **Description:** Any extra metadata to include. -- **prompt**: ComfyUI workflow prompt (automatically provided) -- **extra_pnginfo**: Extra PNG info (automatically provided) ## Outputs -- **None** (Output Node): Saves images to ComfyUI output directory +## Outputs -## Usage +_No outputs defined._ -Use to save images with custom and standard metadata for better tracking and sharing. Connect param_metadata from Construct Metadata node for A1111-compatible metadata. ## Notes -- Saves images as PNG with customizable compression level -- param_metadata is stored under "parameters" key (A1111 standard) -- extra_metadata is stored under "Extra" key -- Filename prefix supports dynamic formatting with node values and dates -- Batch number support with %batch_num% placeholder -- Respects ComfyUI's --disable-metadata flag -- Compatible with A1111 and Civitai metadata standards -- Output node that appears in ComfyUI's image output interface -- Useful for workflows requiring comprehensive metadata tracking + + +Generated from the node schema. diff --git a/js/docs/Sage_SaveText.md b/js/docs/Sage_SaveText.md index 4289d14..648b0b2 100644 --- a/js/docs/Sage_SaveText.md +++ b/js/docs/Sage_SaveText.md @@ -1,33 +1,45 @@ -# Sage_SaveText +--- +type: NodeDoc +title: Save Text +description: Auto-generated node documentation. +tags: [nodes, docs] +--- -## Description +# Save Text -A utility node for saving text content to a file. This node allows you to write text strings to files on disk with customizable filename and extension. +* **Node ID:** `Sage_SaveText` +* **Category:** `Sage Utils/text/output` + +Saves the text to a file. ## Inputs -### Required +### `filename_prefix` — `STRING` +- **Name:** `filename_prefix` +- **Description:** The prefix for the file to save. This may include formatting information such as %date:yyyy-MM-dd% to include values from nodes. + +### `file_extension` — `STRING` +- **Name:** `file_extension` +- **Description:** The file extension to use for the saved file. + +### `text` — `STRING` +- **Name:** `text` +- **Description:** The text to save to a file. + +### `batch_size` — `INT` +- **Name:** `batch_size` +- **Description:** The number of files to save. -- **filename_prefix** (STRING): The prefix for the file to save (default: "ComfyUI_Text"). This may include formatting information such as %date:yyyy-MM-dd% to include values from nodes. -- **file_extension** (STRING): The file extension to use for the saved file (default: "txt") -- **text** (STRING): The text content to save to file ## Outputs -- **filepath** (STRING): The full path of the saved file +### `filepath` — `STRING` +- **Name:** `filepath` +- **Description:** Output value for filepath. -## Usage - -This node is helpful for: - -- Saving generated prompts or text to files -- Creating logs of your workflow outputs -- Storing intermediate text results for later use -- Debugging by writing node outputs to files ## Notes -- The filename prefix supports formatting patterns for dynamic naming -- File extension can be specified with or without the leading dot -- A counter will be added to the end of the filename, based on how many files with that name there are. -- If the file path is invalid, an error will be raised + + +Generated from the node schema. diff --git a/js/docs/Sage_SchedulerSelector.md b/js/docs/Sage_SchedulerSelector.md new file mode 100644 index 0000000..a52872f --- /dev/null +++ b/js/docs/Sage_SchedulerSelector.md @@ -0,0 +1,41 @@ +--- +type: NodeDoc +title: Scheduler Selector +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Scheduler Selector + +* **Node ID:** `Sage_SchedulerSelector` +* **Category:** `Sage Utils/sampler` + +Selects a scheduler for use in the pipeline, and passes the steps to be used in the KSampler. + +## Inputs + +### `steps` — `INT` +- **Name:** `steps` +- **Description:** The number of sampling steps. + +### `scheduler_name` — `COMBO` +- **Name:** `scheduler_name` +- **Description:** The scheduler algorithm to use. + + +## Outputs + +### `out_steps` — `INT` +- **Name:** `steps` +- **Description:** The validated number of sampling steps. + +### `scheduler` — `STRING` +- **Name:** `scheduler` +- **Description:** The selected scheduler name. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_SetText.md b/js/docs/Sage_SetText.md index 830faa4..acdf3af 100644 --- a/js/docs/Sage_SetText.md +++ b/js/docs/Sage_SetText.md @@ -1,24 +1,41 @@ -# Sage_SetText +--- +type: NodeDoc +title: Set Text +description: Auto-generated node documentation. +tags: [nodes, docs] +--- -**Set Text** +# Set Text -Sets and outputs a text string with optional prefix and suffix. Useful for providing static or user-defined text to workflows. +* **Node ID:** `Sage_SetText` +* **Category:** `Sage Utils/text/input` + +Sets some text. ## Inputs -### Required +### `str` — `STRING` +- **Name:** `str` +- **Description:** Text to set or modify. -- **str** (STRING): The main text string to output +### `prefix` — `STRING` (optional) +- **Name:** `prefix` +- **Description:** Text to prepend to the main string. -### Optional +### `suffix` — `STRING` (optional) +- **Name:** `suffix` +- **Description:** Text to append to the main string. -- **prefix** (STRING): Text to add before the main string -- **suffix** (STRING): Text to add after the main string ## Outputs -- **str** (STRING): The combined text string (prefix + str + suffix) +### `str_out` — `STRING` +- **Name:** `str` +- **Description:** Output value for str_out. -## Usage -Connect to nodes that require a text input, such as prompt or metadata nodes. The node combines prefix, main text, and suffix into a single output string. +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_SetTextWithNum.md b/js/docs/Sage_SetTextWithNum.md new file mode 100644 index 0000000..16b3ce1 --- /dev/null +++ b/js/docs/Sage_SetTextWithNum.md @@ -0,0 +1,52 @@ +--- +type: NodeDoc +title: Set Text With Number +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Set Text With Number + +* **Node ID:** `Sage_SetTextWithNum` +* **Category:** `Sage Utils/text/helper` + +Sets some text and adds a number at the end. + +## Inputs + +### `str` — `STRING` +- **Name:** `str` +- **Description:** Text to format with a number at the end. + +### `prefix` — `STRING` (optional) +- **Name:** `prefix` +- **Description:** Text to prepend before the main string. + +### `suffix` — `STRING` (optional) +- **Name:** `suffix` +- **Description:** Text to append after the main string. + +### `num_type` — `COMFY_DYNAMICCOMBO_V3` +- **Description:** Choose whether the appended number should be treated as float or int. + +### `num` — `FLOAT` +- **Name:** `num` +- **Description:** Float number to append to the text. + +### `num` — `INT` +- **Name:** `num` +- **Description:** Integer number to append to the text. + + +## Outputs + +### `str_out` — `STRING` +- **Name:** `str` +- **Description:** Output value for str_out. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_SetTextWithoutComments.md b/js/docs/Sage_SetTextWithoutComments.md new file mode 100644 index 0000000..bb973f7 --- /dev/null +++ b/js/docs/Sage_SetTextWithoutComments.md @@ -0,0 +1,41 @@ +--- +type: NodeDoc +title: Set Text Without Comments +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Set Text Without Comments + +* **Node ID:** `Sage_SetTextWithoutComments` +* **Category:** `Sage Utils/text/input` + +Sets some text after removing comments (Python #, C/C++ //, and /* */ style). + +## Inputs + +### `str` — `STRING` +- **Name:** `str` +- **Description:** Input value for str. + +### `prefix` — `STRING` (optional) +- **Name:** `prefix` +- **Description:** Input value for prefix. + +### `suffix` — `STRING` (optional) +- **Name:** `suffix` +- **Description:** Input value for suffix. + + +## Outputs + +### `str_out` — `STRING` +- **Name:** `str` +- **Description:** Output value for str_out. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_SingleCLIPTextEncode.md b/js/docs/Sage_SingleCLIPTextEncode.md new file mode 100644 index 0000000..92f57a4 --- /dev/null +++ b/js/docs/Sage_SingleCLIPTextEncode.md @@ -0,0 +1,41 @@ +--- +type: NodeDoc +title: Single CLIP Text Encode +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Single CLIP Text Encode + +* **Node ID:** `Sage_SingleCLIPTextEncode` +* **Category:** `Sage Utils/clip/encode/text` + +Turns text into conditioning, and passes through the prompt. Zeros any input not hooked up. + +## Inputs + +### `clip` — `CLIP` +- **Name:** `clip` +- **Description:** The CLIP model used for encoding the text. + +### `text` — `STRING` +- **Name:** `text` +- **Description:** The positive prompt's text. + + +## Outputs + +### `conditioning` — `CONDITIONING` +- **Name:** `conditioning` +- **Description:** A conditioning containing the embedded text used to guide the diffusion model. + +### `text_output` — `STRING` +- **Name:** `text` +- **Description:** The positive prompt's text. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_SingleCLIPTextImageEncode.md b/js/docs/Sage_SingleCLIPTextImageEncode.md new file mode 100644 index 0000000..993a185 --- /dev/null +++ b/js/docs/Sage_SingleCLIPTextImageEncode.md @@ -0,0 +1,53 @@ +--- +type: NodeDoc +title: Single CLIP Text Image Encode +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Single CLIP Text Image Encode + +* **Node ID:** `Sage_SingleCLIPTextImageEncode` +* **Category:** `Sage Utils/clip/encode/image` + +Turns a prompt into conditioning, and passes through the prompt. Zeros any input not hooked up. + +## Inputs + +### `clip` — `CLIP` +- **Name:** `clip` +- **Description:** The CLIP model used for encoding the text. + +### `clean` — `BOOLEAN` +- **Name:** `clean` +- **Description:** Clean up the text, getting rid of extra spaces, commas, etc. + +### `vae` — `VAE` (optional) +- **Name:** `vae` +- **Description:** The VAE model used for encoding the reference image. + +### `text` — `STRING` (optional) +- **Name:** `text` +- **Description:** The prompt's text. + +### `image` — `IMAGE` (optional) +- **Name:** `image` +- **Description:** The prompt's image. + + +## Outputs + +### `conditioning` — `CONDITIONING` +- **Name:** `conditioning` +- **Description:** A conditioning containing the embedded text used to guide the diffusion model. + +### `text` — `STRING` +- **Name:** `text` +- **Description:** The positive prompt's text. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_SixLoraStack.md b/js/docs/Sage_SixLoraStack.md new file mode 100644 index 0000000..21181af --- /dev/null +++ b/js/docs/Sage_SixLoraStack.md @@ -0,0 +1,129 @@ +--- +type: NodeDoc +title: Lora Stack (x6) +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Lora Stack (x6) + +* **Node ID:** `Sage_SixLoraStack` +* **Category:** `Sage Utils/lora` + +Choose six loras with weights, and add them to a lora_stack. + +## Inputs + +### `enabled_1` — `BOOLEAN` +- **Name:** `enabled_1` +- **Description:** Enable or disable this LoRA entry in the stack. + +### `lora_1_name` — `COMBO` +- **Name:** `lora_1_name` +- **Description:** Select a LoRA model to include in this stack entry. + +### `model_1_weight` — `FLOAT` +- **Name:** `model_1_weight` +- **Description:** Weight for the LoRA model branch. + +### `clip_1_weight` — `FLOAT` +- **Name:** `clip_1_weight` +- **Description:** Weight for the LoRA clip branch. + +### `enabled_2` — `BOOLEAN` +- **Name:** `enabled_2` +- **Description:** Enable or disable this LoRA entry in the stack. + +### `lora_2_name` — `COMBO` +- **Name:** `lora_2_name` +- **Description:** Select a LoRA model to include in this stack entry. + +### `model_2_weight` — `FLOAT` +- **Name:** `model_2_weight` +- **Description:** Weight for the LoRA model branch. + +### `clip_2_weight` — `FLOAT` +- **Name:** `clip_2_weight` +- **Description:** Weight for the LoRA clip branch. + +### `enabled_3` — `BOOLEAN` +- **Name:** `enabled_3` +- **Description:** Enable or disable this LoRA entry in the stack. + +### `lora_3_name` — `COMBO` +- **Name:** `lora_3_name` +- **Description:** Select a LoRA model to include in this stack entry. + +### `model_3_weight` — `FLOAT` +- **Name:** `model_3_weight` +- **Description:** Weight for the LoRA model branch. + +### `clip_3_weight` — `FLOAT` +- **Name:** `clip_3_weight` +- **Description:** Weight for the LoRA clip branch. + +### `enabled_4` — `BOOLEAN` +- **Name:** `enabled_4` +- **Description:** Enable or disable this LoRA entry in the stack. + +### `lora_4_name` — `COMBO` +- **Name:** `lora_4_name` +- **Description:** Select a LoRA model to include in this stack entry. + +### `model_4_weight` — `FLOAT` +- **Name:** `model_4_weight` +- **Description:** Weight for the LoRA model branch. + +### `clip_4_weight` — `FLOAT` +- **Name:** `clip_4_weight` +- **Description:** Weight for the LoRA clip branch. + +### `enabled_5` — `BOOLEAN` +- **Name:** `enabled_5` +- **Description:** Enable or disable this LoRA entry in the stack. + +### `lora_5_name` — `COMBO` +- **Name:** `lora_5_name` +- **Description:** Select a LoRA model to include in this stack entry. + +### `model_5_weight` — `FLOAT` +- **Name:** `model_5_weight` +- **Description:** Weight for the LoRA model branch. + +### `clip_5_weight` — `FLOAT` +- **Name:** `clip_5_weight` +- **Description:** Weight for the LoRA clip branch. + +### `enabled_6` — `BOOLEAN` +- **Name:** `enabled_6` +- **Description:** Enable or disable this LoRA entry in the stack. + +### `lora_6_name` — `COMBO` +- **Name:** `lora_6_name` +- **Description:** Select a LoRA model to include in this stack entry. + +### `model_6_weight` — `FLOAT` +- **Name:** `model_6_weight` +- **Description:** Weight for the LoRA model branch. + +### `clip_6_weight` — `FLOAT` +- **Name:** `clip_6_weight` +- **Description:** Weight for the LoRA clip branch. + +### `lora_stack` — `LORA_STACK` (optional) +- **Name:** `lora_stack` +- **Description:** An existing LoRA stack to append this entry to. + + +## Outputs + +### `out_lora_stack` — `LORA_STACK` +- **Name:** `lora_stack` +- **Description:** Combined LoRA stack containing the selected entries. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_StackLoraStack.md b/js/docs/Sage_StackLoraStack.md new file mode 100644 index 0000000..9ea76dd --- /dev/null +++ b/js/docs/Sage_StackLoraStack.md @@ -0,0 +1,332 @@ +--- +type: NodeDoc +title: Combine Lora Stacks +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Combine Lora Stacks + +* **Node ID:** `Sage_StackLoraStack` +* **Category:** `Sage Utils/lora` + +Combine multiple lora stacks into one. This is useful for combining loras from different sources. + +## Inputs + +### `lora_stack` — `COMFY_AUTOGROW_V3` +- **Description:** Input value for lora_stack. + +### `lora_stack_0` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_1` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_2` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_3` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_4` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_5` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_6` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_7` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_8` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_9` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_10` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_11` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_12` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_13` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_14` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_15` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_16` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_17` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_18` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_19` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_20` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_21` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_22` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_23` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_24` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_25` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_26` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_27` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_28` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_29` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_30` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_31` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_32` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_33` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_34` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_35` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_36` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_37` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_38` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_39` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_40` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_41` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_42` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_43` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_44` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_45` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_46` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_47` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_48` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_49` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_50` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_51` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_52` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_53` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_54` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_55` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_56` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_57` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_58` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_59` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_60` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_61` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_62` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_63` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_64` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_65` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_66` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_67` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_68` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_69` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_70` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_71` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_72` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_73` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_74` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_75` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_76` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_77` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_78` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_79` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_80` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_81` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_82` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_83` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_84` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_85` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_86` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_87` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_88` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_89` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_90` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_91` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_92` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_93` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_94` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_95` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_96` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_97` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_98` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + +### `lora_stack_99` — `LORA_STACK` +- **Description:** A single LoRA stack to include in the combined output. + + +## Outputs + +### `out_lora_stack` — `LORA_STACK` +- **Name:** `lora_stack` +- **Description:** Combined LoRA stack from all provided stack inputs. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_StylePromptFromConfig.md b/js/docs/Sage_StylePromptFromConfig.md new file mode 100644 index 0000000..ce5a245 --- /dev/null +++ b/js/docs/Sage_StylePromptFromConfig.md @@ -0,0 +1,56 @@ +--- +type: NodeDoc +title: Style Prompt From Config +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Style Prompt From Config + +* **Node ID:** `Sage_StylePromptFromConfig` +* **Category:** `Sage Utils/text/prompt/style` + +Builds positive and negative prompts from sage_styles.json. If a style template contains {prompt}, your input is inserted there; otherwise your input is appended with ', '. + +## Inputs + +### `model` — `COMFY_DYNAMICCOMBO_V3` +- **Description:** Input value for model. + +### `style` — `COMBO` +- **Name:** `style` +- **Description:** Input value for style. + +### `style` — `COMBO` +- **Name:** `style` +- **Description:** Input value for style. + +### `style` — `COMBO` +- **Name:** `style` +- **Description:** Input value for style. + +### `positive` — `STRING` +- **Name:** `positive` +- **Description:** User positive prompt text to insert into the style template (or append if no {prompt} token exists). + +### `negative` — `STRING` +- **Name:** `negative` +- **Description:** User negative prompt text to insert into the style template (or append if no {prompt} token exists). + + +## Outputs + +### `positive_prompt` — `STRING` +- **Name:** `positive_prompt` +- **Description:** The generated positive prompt string. + +### `negative_prompt` — `STRING` +- **Name:** `negative_prompt` +- **Description:** The generated negative prompt string. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_SystemPrompt.md b/js/docs/Sage_SystemPrompt.md new file mode 100644 index 0000000..1f94491 --- /dev/null +++ b/js/docs/Sage_SystemPrompt.md @@ -0,0 +1,33 @@ +--- +type: NodeDoc +title: System Prompt (Lumina 2) +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# System Prompt (Lumina 2) + +* **Node ID:** `Sage_SystemPrompt` +* **Category:** `Sage Utils/text/prompt/lumina2` + +Picks the system prompt based on the selected option. + +## Inputs + +### `system` — `COMBO` +- **Name:** `system` +- **Description:** Lumina2 provide two types of system prompts: Superior: You are an assistant designed to generate superior images with the superior degree of image-text alignment based on textual prompts or user prompts. Alignment: You are an assistant designed to generate high-quality images with the highest degree of image-text alignment based on textual prompts. + + +## Outputs + +### `system_prompt` — `STRING` +- **Name:** `system_prompt` +- **Description:** The selected Lumina 2 system prompt text. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_TextRandomLine.md b/js/docs/Sage_TextRandomLine.md new file mode 100644 index 0000000..4209f21 --- /dev/null +++ b/js/docs/Sage_TextRandomLine.md @@ -0,0 +1,37 @@ +--- +type: NodeDoc +title: Text Random Line +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Text Random Line + +* **Node ID:** `Sage_TextRandomLine` +* **Category:** `Sage Utils/text/line` + +Returns a random line from the given text. + +## Inputs + +### `text` — `STRING` +- **Name:** `text` +- **Description:** Text to take a random line from. + +### `seed` — `INT` +- **Name:** `seed` +- **Description:** Random seed used to choose the line. + + +## Outputs + +### `random_line` — `STRING` +- **Name:** `random_line` +- **Description:** Output value for random_line. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_TextSelectLine.md b/js/docs/Sage_TextSelectLine.md new file mode 100644 index 0000000..fd145fe --- /dev/null +++ b/js/docs/Sage_TextSelectLine.md @@ -0,0 +1,37 @@ +--- +type: NodeDoc +title: Text Select Line +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Text Select Line + +* **Node ID:** `Sage_TextSelectLine` +* **Category:** `Sage Utils/text/line` + +Selects a specific line from the given text based on the line number. Line numbers start from 0. + +## Inputs + +### `text` — `STRING` +- **Name:** `text` +- **Description:** Text to select a specific line from. + +### `line_number` — `INT` +- **Name:** `line_number` +- **Description:** Line number to return (0-based index). + + +## Outputs + +### `selected_line` — `STRING` +- **Name:** `selected_line` +- **Description:** Output value for selected_line. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_TextSubstitution.md b/js/docs/Sage_TextSubstitution.md new file mode 100644 index 0000000..8c3fe0f --- /dev/null +++ b/js/docs/Sage_TextSubstitution.md @@ -0,0 +1,348 @@ +--- +type: NodeDoc +title: Text Substitution +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Text Substitution + +* **Node ID:** `Sage_TextSubstitution` +* **Category:** `Sage Utils/text/input` + +Substitutes the placeholders in the text with the provided strings. The placeholders use the specified delimiter (default $) followed by str_1, str_2, etc. based on the number of connected inputs. The prefix and suffix are added to the final result. + +## Inputs + +### `text` — `STRING` +- **Name:** `text` +- **Description:** The template text containing placeholders. + +### `delimiter` — `STRING` +- **Name:** `delimiter` +- **Description:** Delimiter used to mark placeholder variables. + +### `prefix` — `STRING` (optional) +- **Name:** `prefix` +- **Description:** Text to prepend to the substituted result. + +### `suffix` — `STRING` (optional) +- **Name:** `suffix` +- **Description:** Text to append to the substituted result. + +### `strings` — `COMFY_AUTOGROW_V3` +- **Description:** Input value for strings. + +### `str_0` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_1` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_2` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_3` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_4` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_5` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_6` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_7` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_8` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_9` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_10` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_11` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_12` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_13` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_14` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_15` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_16` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_17` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_18` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_19` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_20` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_21` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_22` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_23` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_24` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_25` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_26` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_27` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_28` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_29` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_30` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_31` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_32` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_33` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_34` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_35` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_36` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_37` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_38` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_39` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_40` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_41` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_42` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_43` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_44` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_45` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_46` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_47` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_48` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_49` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_50` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_51` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_52` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_53` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_54` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_55` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_56` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_57` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_58` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_59` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_60` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_61` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_62` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_63` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_64` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_65` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_66` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_67` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_68` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_69` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_70` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_71` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_72` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_73` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_74` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_75` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_76` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_77` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_78` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_79` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_80` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_81` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_82` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_83` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_84` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_85` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_86` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_87` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_88` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_89` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_90` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_91` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_92` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_93` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_94` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_95` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_96` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_97` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_98` — `STRING` +- **Description:** Text input used for placeholder substitution. + +### `str_99` — `STRING` +- **Description:** Text input used for placeholder substitution. + + +## Outputs + +### `result` — `STRING` +- **Name:** `result` +- **Description:** Output value for result. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_TextSwitch.md b/js/docs/Sage_TextSwitch.md new file mode 100644 index 0000000..fb7eab5 --- /dev/null +++ b/js/docs/Sage_TextSwitch.md @@ -0,0 +1,37 @@ +--- +type: NodeDoc +title: Text Switch +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Text Switch + +* **Node ID:** `Sage_TextSwitch` +* **Category:** `Sage Utils/text/helper` + +Passes the text if active is true, otherwise passes an empty string. + +## Inputs + +### `str` — `STRING` +- **Name:** `str` +- **Description:** Text to conditionally pass through. + +### `active` — `BOOLEAN` +- **Name:** `active` +- **Description:** If true, passes the text through; otherwise returns an empty string. + + +## Outputs + +### `str_out` — `STRING` +- **Name:** `str` +- **Description:** Output value for str_out. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_TextWeight.md b/js/docs/Sage_TextWeight.md index 1b48273..db4842c 100644 --- a/js/docs/Sage_TextWeight.md +++ b/js/docs/Sage_TextWeight.md @@ -1,29 +1,41 @@ -# Sage_TextWeight +--- +type: NodeDoc +title: Text Weight +description: Auto-generated node documentation. +tags: [nodes, docs] +--- -**Text Weight** +# Text Weight -Applies a weight to a text string for prompt conditioning. +* **Node ID:** `Sage_TextWeight` +* **Category:** `Sage Utils/text/helper` + +Applies a weight to a text string. ## Inputs -- **text** (STRING, required): The text string to apply weight to -- **weight** (FLOAT, required): The weight value to apply - - Default: 1.0 - - Range: -10.0 to 10.0 - - Step: 0.05 +### `text` — `STRING` +- **Name:** `text` +- **Description:** The text to apply a weight to. + +### `weight` — `FLOAT` +- **Name:** `weight` +- **Description:** Weight value to add to the text. + +### `separator` — `STRING` +- **Name:** `separator` +- **Description:** Separator to use after the weighted text. + ## Outputs -- **weighted_text** (STRING): The text wrapped in weight syntax with trailing comma +### `weighted_text` — `STRING` +- **Name:** `weighted_text` +- **Description:** Output value for weighted_text. -## Usage - -Use to emphasize or de-emphasize parts of a prompt by applying numerical weights. The node formats the text in the standard prompt weighting syntax `(text:weight),` which is recognized by most AI image generation models. ## Notes -- Weights greater than 1.0 emphasize the text (make it stronger) -- Weights less than 1.0 de-emphasize the text (make it weaker) -- Weight is formatted to 2 decimal places -- Output includes trailing comma for easy prompt concatenation -- Standard prompt weighting syntax: `(text:weight),` + + +Generated from the node schema. diff --git a/js/docs/Sage_TilingInfo.md b/js/docs/Sage_TilingInfo.md index 346f422..2e7c6c8 100644 --- a/js/docs/Sage_TilingInfo.md +++ b/js/docs/Sage_TilingInfo.md @@ -1,36 +1,45 @@ -# Sage_TilingInfo +--- +type: NodeDoc +title: Tiling Info +description: Auto-generated node documentation. +tags: [nodes, docs] +--- -**Tiling Info** +# Tiling Info -Provides tiling parameters for memory-efficient processing of large images and videos. +* **Node ID:** `Sage_TilingInfo` +* **Category:** `Sage Utils/sampler` + +Adds tiling information to the KSampler. ## Inputs -- **tile_size** (INT, required): Size of each spatial tile in pixels - - Default: 512, Range: 64 to 4096, Step: 32 -- **overlap** (INT, required): Overlap between spatial tiles in pixels - - Default: 64, Range: 0 to 4096, Step: 32 -- **temporal_size** (INT, required): Number of frames to process at once (video VAEs only) - - Default: 64, Range: 8 to 4096, Step: 4 -- **temporal_overlap** (INT, required): Number of frames to overlap (video VAEs only) - - Default: 8, Range: 4 to 4096, Step: 4 +### `tile_size` — `INT` +- **Name:** `tile_size` +- **Description:** Size of each tile for tiled sampling. + +### `overlap` — `INT` +- **Name:** `overlap` +- **Description:** Overlap size between tiles. + +### `temporal_size` — `INT` +- **Name:** `temporal_size` +- **Description:** Only used for video VAEs: Amount of frames to decode at a time. + +### `temporal_overlap` — `INT` +- **Name:** `temporal_overlap` +- **Description:** Only used for video VAEs: Amount of frames to overlap. + ## Outputs -- **TILING_INFO**: Dictionary containing all tiling parameters +### `tiling_info` — `TILING_INFO` +- **Name:** `tiling_info` +- **Description:** Tiling parameters for the sampler. -## Usage - -Connect to tiled decoder nodes like Sage_KSamplerTiledDecoder to enable memory-efficient processing of large images or videos. Tiling breaks down large content into smaller chunks that can be processed with limited VRAM. ## Notes -- Designed for use with Sage_KSamplerTiledDecoder and similar tiled processing nodes -- Spatial tiling (tile_size/overlap) applies to all content types -- Temporal tiling (temporal_size/temporal_overlap) only used for video VAEs -- Larger tile sizes use more VRAM but may produce better quality -- Overlap helps reduce seam artifacts between tiles -- System automatically adjusts parameters if they're incompatible (e.g., overlap too large) -- Temporal parameters are scaled based on VAE compression ratios -- Essential for processing high-resolution images with limited VRAM -- Optional input - nodes work without tiling if not provided + + +Generated from the node schema. diff --git a/js/docs/Sage_TrainingCaptionsToConditioning.md b/js/docs/Sage_TrainingCaptionsToConditioning.md new file mode 100644 index 0000000..f2c40fc --- /dev/null +++ b/js/docs/Sage_TrainingCaptionsToConditioning.md @@ -0,0 +1,36 @@ +--- +type: NodeDoc +title: Training Captions To Conditioning +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Training Captions To Conditioning + +* **Node ID:** `Sage_TrainingCaptionsToConditioning` +* **Category:** `Sage Utils/train` + +Encodes captions with a CLIP model to produce conditioning vectors for training workflows. + +## Inputs + +### `clip` — `CLIP` +- **Name:** `clip` +- **Description:** CLIP model conditioning input used to encode training captions. + +### `captions` — `STRING` +- **Name:** `captions` +- **Description:** List of captions to encode into conditioning vectors. + + +## Outputs + +### `conditioning` — `CONDITIONING` +- **Name:** `conditioning` + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_TripleCLIPSelector.md b/js/docs/Sage_TripleCLIPSelector.md new file mode 100644 index 0000000..482eb25 --- /dev/null +++ b/js/docs/Sage_TripleCLIPSelector.md @@ -0,0 +1,41 @@ +--- +type: NodeDoc +title: Triple CLIP Selector +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Triple CLIP Selector + +* **Node ID:** `Sage_TripleCLIPSelector` +* **Category:** `Sage Utils/selector` + +Selects three CLIP models from a list. + +## Inputs + +### `clip_name_1` — `COMBO` +- **Name:** `clip_name_1` +- **Description:** Choose the first CLIP model for the triple selector. + +### `clip_name_2` — `COMBO` +- **Name:** `clip_name_2` +- **Description:** Choose the second CLIP model for the triple selector. + +### `clip_name_3` — `COMBO` +- **Name:** `clip_name_3` +- **Description:** Choose the third CLIP model for the triple selector. + + +## Outputs + +### `clip_info` — `MODEL_INFO` +- **Name:** `clip_info` +- **Description:** Combined CLIP model info for the selected models. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_TripleJoinText.md b/js/docs/Sage_TripleJoinText.md index e422ce6..d2e34b2 100644 --- a/js/docs/Sage_TripleJoinText.md +++ b/js/docs/Sage_TripleJoinText.md @@ -1,23 +1,49 @@ -# Sage_TripleJoinText +--- +type: NodeDoc +title: Triple Join Text (Legacy) +description: Auto-generated node documentation. +tags: [nodes, docs] +--- -**Join Text x3** +# Triple Join Text (Legacy) -Joins three text strings together with a customizable separator. Useful for building complex prompts or metadata with controlled formatting. +* **Node ID:** `Sage_TripleJoinText` +* **Category:** `Sage Utils/text/helper` + +Joins three strings with a separator. ## Inputs -### Required +### `separator` — `STRING` +- **Name:** `separator` +- **Description:** Separator string used between inputs. + +### `add_separator_to_end` — `BOOLEAN` +- **Name:** `add_separator_to_end` +- **Description:** Add separator to the end of the joined string. + +### `str1` — `STRING` +- **Name:** `str1` +- **Description:** First string to join. + +### `str2` — `STRING` +- **Name:** `str2` +- **Description:** Second string to join. + +### `str3` — `STRING` +- **Name:** `str3` +- **Description:** Third string to join. -- **separator** (STRING): The separator to use between strings (default: ', ') -- **add_separator_to_end** (BOOLEAN): Whether to add separator to the end of the joined string (default: False) -- **str1** (STRING): First string to join -- **str2** (STRING): Second string to join -- **str3** (STRING): Third string to join ## Outputs -- **str** (STRING): The joined string with separator +### `str` — `STRING` +- **Name:** `str` +- **Description:** Output value for str. -## Usage -Use to concatenate multiple text fields for prompts or metadata. The separator parameter allows you to control how the strings are joined (comma, space, newline, etc.), and the add_separator_to_end option lets you append the separator to the final result. +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_TripleLoraStack.md b/js/docs/Sage_TripleLoraStack.md index b50e1d2..de192c6 100644 --- a/js/docs/Sage_TripleLoraStack.md +++ b/js/docs/Sage_TripleLoraStack.md @@ -1,43 +1,81 @@ -# Sage_TripleLoraStack +--- +type: NodeDoc +title: Lora Stack (x3) +description: Auto-generated node documentation. +tags: [nodes, docs] +--- -**Triple Lora Stack** +# Lora Stack (x3) -Stack up to three LoRAs with individual toggles and weights in a single node. +* **Node ID:** `Sage_TripleLoraStack` +* **Category:** `Sage Utils/lora` + +Choose three loras with weights, and add them to a lora_stack. ## Inputs -### Required +### `enabled_1` — `BOOLEAN` +- **Name:** `enabled_1` +- **Description:** Enable or disable this LoRA entry in the stack. -- **enabled_1** (BOOLEAN): Whether to add the first LoRA to the stack (default: True) -- **lora_1_name** (STRING): The name of the first LoRA -- **model_1_weight** (FLOAT): Model weight for the first LoRA (default: 1.0, range: -100.0 to 100.0) -- **clip_1_weight** (FLOAT): CLIP weight for the first LoRA (default: 1.0, range: -100.0 to 100.0) -- **enabled_2** (BOOLEAN): Whether to add the second LoRA to the stack (default: True) -- **lora_2_name** (STRING): The name of the second LoRA -- **model_2_weight** (FLOAT): Model weight for the second LoRA (default: 1.0, range: -100.0 to 100.0) -- **clip_2_weight** (FLOAT): CLIP weight for the second LoRA (default: 1.0, range: -100.0 to 100.0) -- **enabled_3** (BOOLEAN): Whether to add the third LoRA to the stack (default: True) -- **lora_3_name** (STRING): The name of the third LoRA -- **model_3_weight** (FLOAT): Model weight for the third LoRA (default: 1.0, range: -100.0 to 100.0) -- **clip_3_weight** (FLOAT): CLIP weight for the third LoRA (default: 1.0, range: -100.0 to 100.0) +### `lora_1_name` — `COMBO` +- **Name:** `lora_1_name` +- **Description:** Select a LoRA model to include in this stack entry. -### Optional +### `model_1_weight` — `FLOAT` +- **Name:** `model_1_weight` +- **Description:** Weight for the LoRA model branch. + +### `clip_1_weight` — `FLOAT` +- **Name:** `clip_1_weight` +- **Description:** Weight for the LoRA clip branch. + +### `enabled_2` — `BOOLEAN` +- **Name:** `enabled_2` +- **Description:** Enable or disable this LoRA entry in the stack. + +### `lora_2_name` — `COMBO` +- **Name:** `lora_2_name` +- **Description:** Select a LoRA model to include in this stack entry. + +### `model_2_weight` — `FLOAT` +- **Name:** `model_2_weight` +- **Description:** Weight for the LoRA model branch. + +### `clip_2_weight` — `FLOAT` +- **Name:** `clip_2_weight` +- **Description:** Weight for the LoRA clip branch. + +### `enabled_3` — `BOOLEAN` +- **Name:** `enabled_3` +- **Description:** Enable or disable this LoRA entry in the stack. + +### `lora_3_name` — `COMBO` +- **Name:** `lora_3_name` +- **Description:** Select a LoRA model to include in this stack entry. + +### `model_3_weight` — `FLOAT` +- **Name:** `model_3_weight` +- **Description:** Weight for the LoRA model branch. + +### `clip_3_weight` — `FLOAT` +- **Name:** `clip_3_weight` +- **Description:** Weight for the LoRA clip branch. + +### `lora_stack` — `LORA_STACK` (optional) +- **Name:** `lora_stack` +- **Description:** An existing LoRA stack to append this entry to. -- **lora_stack** (LORA_STACK): Existing LoRA stack to add these LoRAs to ## Outputs -- **lora_stack** (LORA_STACK): The updated LoRA stack with up to three additional LoRAs +### `out_lora_stack` — `LORA_STACK` +- **Name:** `lora_stack` +- **Description:** Combined LoRA stack containing the selected entries. -## Usage - -Use for workflows that require up to three LoRAs with fine control in a single compact node. More efficient than chaining three individual LoRA stack nodes. ## Notes -- Compatible with other node packs that have lora_stacks -- Each of the three LoRAs can be individually enabled/disabled -- Processes LoRAs in order (1, 2, 3) when building the stack -- Only enabled LoRAs are added to the stack -- Negative weights can be used to subtract LoRA effects -- Useful for common LoRA combinations that are used together frequently + + +Generated from the node schema. diff --git a/js/docs/Sage_TripleQuickLoraStack.md b/js/docs/Sage_TripleQuickLoraStack.md new file mode 100644 index 0000000..0b7aea7 --- /dev/null +++ b/js/docs/Sage_TripleQuickLoraStack.md @@ -0,0 +1,69 @@ +--- +type: NodeDoc +title: Quick Lora Stack (x3) +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Quick Lora Stack (x3) + +* **Node ID:** `Sage_TripleQuickLoraStack` +* **Category:** `Sage Utils/lora` + +Choose three loras with model weight only, and add them to a lora_stack. + +## Inputs + +### `enabled_1` — `BOOLEAN` +- **Name:** `enabled_1` +- **Description:** Enable or disable this LoRA entry in the stack. + +### `lora_1_name` — `COMBO` +- **Name:** `lora_1_name` +- **Description:** Select a LoRA model to include in this stack entry. + +### `model_1_weight` — `FLOAT` +- **Name:** `model_1_weight` +- **Description:** Weight for the LoRA model branch. + +### `enabled_2` — `BOOLEAN` +- **Name:** `enabled_2` +- **Description:** Enable or disable this LoRA entry in the stack. + +### `lora_2_name` — `COMBO` +- **Name:** `lora_2_name` +- **Description:** Select a LoRA model to include in this stack entry. + +### `model_2_weight` — `FLOAT` +- **Name:** `model_2_weight` +- **Description:** Weight for the LoRA model branch. + +### `enabled_3` — `BOOLEAN` +- **Name:** `enabled_3` +- **Description:** Enable or disable this LoRA entry in the stack. + +### `lora_3_name` — `COMBO` +- **Name:** `lora_3_name` +- **Description:** Select a LoRA model to include in this stack entry. + +### `model_3_weight` — `FLOAT` +- **Name:** `model_3_weight` +- **Description:** Weight for the LoRA model branch. + +### `lora_stack` — `LORA_STACK` (optional) +- **Name:** `lora_stack` +- **Description:** An existing LoRA stack to append this entry to. + + +## Outputs + +### `out_lora_stack` — `LORA_STACK` +- **Name:** `lora_stack` +- **Description:** Combined Quick LoRA stack containing the selected entries. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_UNETLoRALoader.md b/js/docs/Sage_UNETLoRALoader.md new file mode 100644 index 0000000..b150969 --- /dev/null +++ b/js/docs/Sage_UNETLoRALoader.md @@ -0,0 +1,45 @@ +--- +type: NodeDoc +title: Load UNET + LoRA (Model Only) +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Load UNET + LoRA (Model Only) + +* **Node ID:** `Sage_UNETLoRALoader` +* **Category:** `Sage Utils/loader` + +Apply LoRA stack and model shifts to an already loaded UNET model. No clip modifications. + +## Inputs + +### `unet_info` — `MODEL_INFO` +- **Name:** `unet_info` + +### `lora_stack` — `LORA_STACK` (optional) +- **Name:** `lora_stack` + +### `model_shifts` — `MODEL_SHIFTS` (optional) +- **Name:** `model_shifts` + + +## Outputs + +### `out_model` — `MODEL` +- **Name:** `model` + +### `out_lora_stack` — `LORA_STACK` +- **Name:** `lora_stack` +- **Description:** Output value for out_lora_stack. + +### `keywords` — `STRING` +- **Name:** `keywords` +- **Description:** Output value for keywords. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_UNETLoaderFromInfo.md b/js/docs/Sage_UNETLoaderFromInfo.md new file mode 100644 index 0000000..c61b161 --- /dev/null +++ b/js/docs/Sage_UNETLoaderFromInfo.md @@ -0,0 +1,31 @@ +--- +type: NodeDoc +title: Load UNET +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Load UNET + +* **Node ID:** `Sage_UNETLoaderFromInfo` +* **Category:** `Sage Utils/loader` + +Load the UNET model component from unet_info. + +## Inputs + +### `unet_info` — `MODEL_INFO` +- **Name:** `unet_info` + + +## Outputs + +### `model` — `MODEL` +- **Name:** `model` + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_UNETSelector.md b/js/docs/Sage_UNETSelector.md new file mode 100644 index 0000000..340d290 --- /dev/null +++ b/js/docs/Sage_UNETSelector.md @@ -0,0 +1,37 @@ +--- +type: NodeDoc +title: UNET Selector +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# UNET Selector + +* **Node ID:** `Sage_UNETSelector` +* **Category:** `Sage Utils/selector` + +Selects a UNET model from a list. + +## Inputs + +### `unet_name` — `COMBO` +- **Name:** `unet_name` +- **Description:** Choose a UNET model to use. + +### `weight_dtype` — `COMBO` +- **Name:** `weight_dtype` +- **Description:** Select the weight dtype to use when loading the UNET. + + +## Outputs + +### `unet_info` — `MODEL_INFO` +- **Name:** `unet_info` +- **Description:** UNET model info for the selected model. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_UnetClipVaeToModelInfo.md b/js/docs/Sage_UnetClipVaeToModelInfo.md new file mode 100644 index 0000000..18483fe --- /dev/null +++ b/js/docs/Sage_UnetClipVaeToModelInfo.md @@ -0,0 +1,38 @@ +--- +type: NodeDoc +title: UNET CLIP VAE To Model Info +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# UNET CLIP VAE To Model Info + +* **Node ID:** `Sage_UnetClipVaeToModelInfo` +* **Category:** `Sage Utils/model` + +Returns a list with the unets, clips, and vae in it to be loaded. + +## Inputs + +### `unet_info` — `MODEL_INFO` +- **Name:** `unet_info` + +### `clip_info` — `MODEL_INFO` +- **Name:** `clip_info` + +### `vae_info` — `MODEL_INFO` +- **Name:** `vae_info` + + +## Outputs + +### `model_info` — `MODEL_INFO` +- **Name:** `model_info` +- **Description:** Combined model info output for the UNET, CLIP, and VAE inputs. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_VAELoaderFromInfo.md b/js/docs/Sage_VAELoaderFromInfo.md new file mode 100644 index 0000000..e51876f --- /dev/null +++ b/js/docs/Sage_VAELoaderFromInfo.md @@ -0,0 +1,31 @@ +--- +type: NodeDoc +title: Load VAE +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Load VAE + +* **Node ID:** `Sage_VAELoaderFromInfo` +* **Category:** `Sage Utils/loader` + +Load the VAE model component from vae_info. + +## Inputs + +### `vae_info` — `MODEL_INFO` +- **Name:** `vae_info` + + +## Outputs + +### `vae` — `VAE` +- **Name:** `vae` + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_VAESelector.md b/js/docs/Sage_VAESelector.md new file mode 100644 index 0000000..a29f41c --- /dev/null +++ b/js/docs/Sage_VAESelector.md @@ -0,0 +1,33 @@ +--- +type: NodeDoc +title: VAE Selector +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# VAE Selector + +* **Node ID:** `Sage_VAESelector` +* **Category:** `Sage Utils/selector` + +Selects a VAE model from a list. + +## Inputs + +### `vae_name` — `COMBO` +- **Name:** `vae_name` +- **Description:** Choose a VAE model to use. + + +## Outputs + +### `vae_info` — `MODEL_INFO` +- **Name:** `vae_info` +- **Description:** VAE model info for the selected model. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_ViewAnything.md b/js/docs/Sage_ViewAnything.md index 860e572..ad729cf 100644 --- a/js/docs/Sage_ViewAnything.md +++ b/js/docs/Sage_ViewAnything.md @@ -1,31 +1,33 @@ -# Sage_ViewAnything +--- +type: NodeDoc +title: View Anything +description: Auto-generated node documentation. +tags: [nodes, docs] +--- -**View Any Node as Text** +# View Anything -Displays the output of any node as text in the UI and returns it as a string. This is an output node useful for debugging, inspecting non-string outputs, and visualizing data flow. +* **Node ID:** `Sage_ViewAnything` +* **Category:** `Sage Utils/text/output` + +Shows some text. ## Inputs -### Required +### `any` — `*` +- **Name:** `any` +- **Description:** Any value to view as text. -- **any** (ANY): The value to display as text (accepts any data type, including lists) ## Outputs -- **STRING**: The converted text representation of the input +### `str` — `STRING` +- **Name:** `str` +- **Description:** Output value for str. -## Usage - -Connect to any node to visualize its output as a string. This node: - -- Accepts any data type as input -- Handles both single values and lists -- Displays the result in the ComfyUI interface -- Returns the text representation for use in other nodes -- Is particularly useful for debugging and data inspection ## Notes -- This is an output node that displays results in the UI -- When input is a list, each item is displayed on a new line -- The node converts any input type to its string representation + + +Generated from the node schema. diff --git a/js/docs/Sage_ViewNotes.md b/js/docs/Sage_ViewNotes.md new file mode 100644 index 0000000..b1fc6e1 --- /dev/null +++ b/js/docs/Sage_ViewNotes.md @@ -0,0 +1,33 @@ +--- +type: NodeDoc +title: View Notes +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# View Notes + +* **Node ID:** `Sage_ViewNotes` +* **Category:** `Sage Utils/text/output` + +Views the contents of a selected file from the notes directory. + +## Inputs + +### `filename` — `COMBO` +- **Name:** `filename` +- **Description:** Select a notes file to load from the notes directory. + + +## Outputs + +### `content` — `STRING` +- **Name:** `content` +- **Description:** Output value for content. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/Sage_ZeroConditioning.md b/js/docs/Sage_ZeroConditioning.md new file mode 100644 index 0000000..0ed976d --- /dev/null +++ b/js/docs/Sage_ZeroConditioning.md @@ -0,0 +1,33 @@ +--- +type: NodeDoc +title: Zero Conditioning +description: Auto-generated node documentation. +tags: [nodes, docs] +--- + +# Zero Conditioning + +* **Node ID:** `Sage_ZeroConditioning` +* **Category:** `Sage Utils/clip/conditioning` + +Returns zeroed out conditioning. + +## Inputs + +### `clip` — `CLIP` +- **Name:** `clip` +- **Description:** The CLIP model used for encoding. + + +## Outputs + +### `conditioning` — `CONDITIONING` +- **Name:** `conditioning` +- **Description:** A conditioning containing all zeros. + + +## Notes + + + +Generated from the node schema. diff --git a/js/docs/old/SageSetWildcardText.md b/js/docs/old/SageSetWildcardText.md new file mode 100644 index 0000000..05e120f --- /dev/null +++ b/js/docs/old/SageSetWildcardText.md @@ -0,0 +1,45 @@ +# SageSetWildcardText + +## Description + +A text processing node that supports wildcard functionality for dynamic text generation. This node allows you to use wildcard patterns in text that can be randomly selected or processed to create varied outputs. + +## Inputs + +### Required + +- **str** (STRING): The input text containing wildcard patterns +- **seed** (INT): Random seed for consistent wildcard selection (default: 0, range: 0 to 4294967295) +- **clean** (BOOLEAN): Whether to clean the output text (default: False) + +### Optional + +- **prefix** (STRING): Text to add before the main string +- **suffix** (STRING): Text to add after the main string + +## Outputs + +- **str** (STRING): The processed text with wildcards resolved + +## Usage + +This node is useful for: + +- Creating varied prompts with random elements +- Dynamic text generation with predefined choices +- Adding randomness to your workflow text outputs +- Supporting wildcard syntax like {option1|option2|option3} + +## Wildcard Syntax + +- Use curly braces to define wildcard groups: `{option1|option2|option3}` +- Separate options with pipe characters `|` +- Can be nested for complex combinations +- Supports file-based wildcards if wildcard files are available + +## Notes + +- The seed parameter ensures reproducible results when using the same seed value +- Without a seed, wildcards will be randomly selected each time +- This node extends the basic text functionality with wildcard processing capabilities +- Compatible with standard wildcard formats used in other AI art tools diff --git a/js/docs/old/Sage_AdvSamplerInfo.md b/js/docs/old/Sage_AdvSamplerInfo.md new file mode 100644 index 0000000..35cfdca --- /dev/null +++ b/js/docs/old/Sage_AdvSamplerInfo.md @@ -0,0 +1,34 @@ +# Sage_AdvSamplerInfo + +**Adv Sampler Info** + +Provides advanced sampler settings for granular control over the sampling process. + +## Inputs + +- **add_noise** (BOOLEAN, required): Whether to add noise during sampling + - Default: True +- **start_at_step** (INT, required): Step number to start sampling from + - Default: 0, Range: 0 to 10,000 +- **end_at_step** (INT, required): Step number to end sampling at + - Default: 10,000, Range: 0 to 10,000 +- **return_with_leftover_noise** (BOOLEAN, required): Whether to return result with remaining noise + - Default: False + +## Outputs + +- **ADV_SAMPLER_INFO**: Dictionary containing advanced sampler parameters + +## Usage + +Use when you need granular control over the sampling process beyond basic parameters. Connect to KSampler nodes to enable advanced sampling features like partial denoising, step ranges, and noise control. + +## Notes + +- Designed to work with Sage_KSampler and related sampler nodes +- `add_noise`: Set to False for img2img workflows where noise should not be added +- `start_at_step` and `end_at_step`: Enable partial sampling for multi-stage workflows +- `return_with_leftover_noise`: Useful for multi-pass sampling or when preserving noise structure +- Step range allows for sampling only specific portions of the denoising process +- Provides functionality similar to ComfyUI's advanced KSampler +- Optional input for sampler nodes - basic functionality works without it diff --git a/js/docs/old/Sage_AnythingToStr.md b/js/docs/old/Sage_AnythingToStr.md new file mode 100644 index 0000000..0d0dcf4 --- /dev/null +++ b/js/docs/old/Sage_AnythingToStr.md @@ -0,0 +1,33 @@ +# Sage_AnythingToStr + +**Anything to String** + +Converts any incoming value to a string and outputs it without rendering preview text in the UI. + +## Category + +- **Sage Utils/text/util** + +## Inputs + +### Required + +- **any** (ANY): Any input value, including strings, numbers, lists, or custom types + +## Outputs + +- **STRING**: String representation of the input value + +## Usage + +Use this node when you need string conversion for downstream nodes but do not want an output display node. This node: + +- Accepts any input type +- Converts non-list values with standard string conversion +- Converts lists by joining each item as a line +- Outputs only the string value (no preview panel) + +## Notes + +- Unlike Sage_ViewAnything, this node is not an output display node +- For list inputs, items are joined with newline separators diff --git a/js/docs/Sage_CacheMaintenance.md b/js/docs/old/Sage_CacheMaintenance.md similarity index 100% rename from js/docs/Sage_CacheMaintenance.md rename to js/docs/old/Sage_CacheMaintenance.md diff --git a/js/docs/old/Sage_CheckLorasForUpdates.md b/js/docs/old/Sage_CheckLorasForUpdates.md new file mode 100644 index 0000000..d8b85c0 --- /dev/null +++ b/js/docs/old/Sage_CheckLorasForUpdates.md @@ -0,0 +1,32 @@ +# Sage_CheckLorasForUpdates + +**Check Loras for Updates** + +Checks LoRAs in your stack for available updates from Civitai and provides download information. + +## Inputs + +### Required + +- **lora_stack** (LORA_STACK): The stack of LoRAs to check for updates +- **force** (BOOLEAN): Force a check for updates, even if the LoRA is up to date (default: False) + +## Outputs + +- **lora_stack** (LORA_STACK): The original LoRA stack (passed through) +- **path** (STRING): List of local paths for LoRAs that have updates available +- **latest_url** (STRING): List of Civitai URLs for the latest versions of updated LoRAs + +## Usage + +Use to keep your LoRA library up to date with the latest versions. The node doesn't automatically download updates but provides the information needed to manually update. + +## Notes + +- Checks each LoRA in the stack against Civitai for newer versions +- Only reports LoRAs that have updates available +- Force option will re-check even recently checked LoRAs +- Returns Civitai URLs in format: `https://civitai.com/models/{modelId}?modelVersionId={versionId}` +- Does not automatically download or replace LoRAs +- Useful for maintenance workflows and keeping models current +- Requires LoRAs to have Civitai metadata for update checking diff --git a/js/docs/Sage_CheckpointLoaderRecent.md b/js/docs/old/Sage_CheckpointLoaderRecent.md similarity index 100% rename from js/docs/Sage_CheckpointLoaderRecent.md rename to js/docs/old/Sage_CheckpointLoaderRecent.md diff --git a/js/docs/Sage_CheckpointLoaderSimple.md b/js/docs/old/Sage_CheckpointLoaderSimple.md similarity index 100% rename from js/docs/Sage_CheckpointLoaderSimple.md rename to js/docs/old/Sage_CheckpointLoaderSimple.md diff --git a/js/docs/old/Sage_CheckpointSelector.md b/js/docs/old/Sage_CheckpointSelector.md new file mode 100644 index 0000000..71f02a1 --- /dev/null +++ b/js/docs/old/Sage_CheckpointSelector.md @@ -0,0 +1,27 @@ +# Sage_CheckpointSelector + +**Checkpoint Selector** + +Selects a model checkpoint and returns its metadata information without loading the actual model. + +## Inputs + +### Required + +- **ckpt_name** (STRING): The name of the checkpoint (model) to select from available checkpoints + +## Outputs + +- **model_info** (MODEL_INFO): The model path and hash, all in one output + +## Usage + +Use to choose which model checkpoint to reference in your workflow without loading it. Useful for metadata workflows or conditional model loading. + +## Notes + +- Does not load the actual model, only returns metadata +- Automatically calculates and caches the model hash +- Pulls Civitai metadata information for the selected model +- Updates the timestamp for the selected model in the cache +- Useful for workflows that need model information before deciding whether to load diff --git a/js/docs/old/Sage_CleanText.md b/js/docs/old/Sage_CleanText.md new file mode 100644 index 0000000..2055879 --- /dev/null +++ b/js/docs/old/Sage_CleanText.md @@ -0,0 +1,19 @@ +# Sage_CleanText + +**Clean Text** + +Cleans or normalizes a text string by removing unwanted characters, excess whitespace, and formatting inconsistencies. Useful for preparing text for prompt or metadata processing. + +## Inputs + +### Required + +- **str** (STRING): The string to clean and normalize + +## Outputs + +- **cleaned_string** (STRING): The cleaned and normalized text + +## Usage + +Use before passing text to prompt or metadata nodes to ensure clean input. This node applies text cleaning functions that remove extra spaces, normalize line breaks, and clean up formatting issues that can interfere with text processing. diff --git a/js/docs/old/Sage_CollectKeywordsFromLoraStack.md b/js/docs/old/Sage_CollectKeywordsFromLoraStack.md new file mode 100644 index 0000000..934f364 --- /dev/null +++ b/js/docs/old/Sage_CollectKeywordsFromLoraStack.md @@ -0,0 +1,28 @@ +# Sage_CollectKeywordsFromLoraStack + +**Lora Stack → Keywords** + +Extracts Civitai keywords from a LoRA stack and combines them into a single string. + +## Inputs + +### Required + +- **lora_stack** (LORA_STACK): The stack of LoRAs to extract keywords from + +## Outputs + +- **keywords** (STRING): Combined keywords from all LoRAs in the stack + +## Usage + +Use to extract and use keywords for metadata or prompt construction. Place at the end of a LoRA stack, or you won't get keywords for the entire stack. + +## Notes + +- Goes through each model in the LoRA stack and grabs keywords from Civitai +- Combines all keywords into one string for easy use +- Returns empty string if no LoRA stack is provided +- Must be connected after all LoRAs have been added to the stack +- Useful for automatic prompt enhancement based on LoRA metadata +- Keywords are sourced from Civitai model information diff --git a/js/docs/Sage_ConditioningZeroOut.md b/js/docs/old/Sage_ConditioningZeroOut.md similarity index 100% rename from js/docs/Sage_ConditioningZeroOut.md rename to js/docs/old/Sage_ConditioningZeroOut.md diff --git a/js/docs/old/Sage_ConstructLLMPrompt.md b/js/docs/old/Sage_ConstructLLMPrompt.md new file mode 100644 index 0000000..07bcb4a --- /dev/null +++ b/js/docs/old/Sage_ConstructLLMPrompt.md @@ -0,0 +1,32 @@ +# Sage_ConstructLLMPrompt + +**Construct LLM Prompt** + +Builds a comprehensive prompt for use with LLM nodes based on predefined templates and customizable options. + +## Inputs + +### Required + +- **prompt** (STRING): Base prompt template from available categories (multiline) +- **extra_instructions** (STRING): Additional custom instructions to append (multiline, default: "") +- **Various style/quality/content options** (BOOLEAN): Dynamic options based on available prompt extras (style, quality, content_focus categories) + +## Outputs + +- **prompt** (STRING): The constructed prompt ready for LLM use + +## Usage + +Use to assemble comprehensive prompts for LLM nodes in your workflow. Select from predefined prompt templates and add custom instructions and style options. + +## Notes + +- **EXPERIMENTAL**: This node is experimental and may change in future versions +- Prompt templates are loaded from llm_prompts.json configuration +- Available prompts are organized by category and shown as "category/prompt_name" +- Style, quality, and content focus options are dynamically generated based on configuration +- Ensures proper sentence-ending punctuation and formatting +- Extra instructions are appended after the base prompt and options +- Boolean options add their associated prompt text when enabled +- Prompt cannot be empty after construction diff --git a/js/docs/old/Sage_ConstructLLMPromptExtra.md b/js/docs/old/Sage_ConstructLLMPromptExtra.md new file mode 100644 index 0000000..1977168 --- /dev/null +++ b/js/docs/old/Sage_ConstructLLMPromptExtra.md @@ -0,0 +1,31 @@ +# Sage_ConstructLLMPromptExtra + +**Construct LLM Prompt Extra** + +Builds extra instructions for LLM prompts using advanced options not covered in the main prompt constructor. + +## Inputs + +### Required + +- **extra_instructions** (STRING): Custom extra instructions to include (multiline, default: "") +- **Various advanced options** (BOOLEAN): Dynamic options for categories other than style, quality, and content_focus + +## Outputs + +- **extra** (STRING): The constructed extra instructions string + +## Usage + +Use to assemble advanced extra instructions for LLM nodes. This node provides access to additional prompt options not available in the main constructor. + +## Notes + +- **EXPERIMENTAL**: This node is experimental and may change in future versions +- Complements Sage_ConstructLLMPrompt by handling advanced options +- Options are loaded from llm_prompts.json configuration +- Only shows options NOT in style, quality, or content_focus categories +- Each enabled boolean option adds its associated prompt text +- Custom extra_instructions are prepended to the generated options +- Results can be combined with main prompt outputs +- Automatic formatting with proper line breaks and spacing diff --git a/js/docs/Sage_ConstructMetadata.md b/js/docs/old/Sage_ConstructMetadata.md similarity index 100% rename from js/docs/Sage_ConstructMetadata.md rename to js/docs/old/Sage_ConstructMetadata.md diff --git a/js/docs/Sage_ConstructMetadataLite.md b/js/docs/old/Sage_ConstructMetadataLite.md similarity index 100% rename from js/docs/Sage_ConstructMetadataLite.md rename to js/docs/old/Sage_ConstructMetadataLite.md diff --git a/js/docs/old/Sage_CubiqImageResize.md b/js/docs/old/Sage_CubiqImageResize.md new file mode 100644 index 0000000..2f7acb6 --- /dev/null +++ b/js/docs/old/Sage_CubiqImageResize.md @@ -0,0 +1,66 @@ +# Sage_CubiqImageResize + +## Advanced Image Resize + +An advanced image resizing node based on ComfyUI-Essentials functionality. Provides high-quality image resizing with multiple interpolation methods and precise dimension control. + +## Inputs + +### Required + +- **image** (IMAGE): The input image to resize +- **width** (INT): Target width in pixels (default: 1024, range: 0 to MAX_RESOLUTION) +- **height** (INT): Target height in pixels (default: 1024, range: 0 to MAX_RESOLUTION) +- **interpolation** (COMBO): Interpolation method - "nearest", "bilinear", "bicubic", "area", "nearest-exact", "lanczos", "bislerp" +- **method** (COMBO): Resize method - "stretch", "keep proportion", "fill / crop", "pad" +- **condition** (COMBO): When to resize - "always", "downscale if bigger", "upscale if smaller", "if bigger area", "if smaller area" +- **multiple_of** (INT): Ensure dimensions are multiples of this value (default: 0, range: 0-1024) + +## Outputs + +- **IMAGE** (IMAGE): The resized image +- **width** (INT): Actual output width +- **height** (INT): Actual output height + +## Resize Methods + +- **stretch**: Stretch image to exact dimensions (may distort aspect ratio) +- **keep proportion**: Maintain aspect ratio, fit within target dimensions +- **fill / crop**: Fill target dimensions, crop excess while maintaining aspect ratio +- **pad**: Fit within dimensions and pad with black borders if needed + +## Interpolation Options + +- **nearest**: Fastest, pixelated results for pixel art +- **bilinear**: Good balance of speed and quality +- **bicubic**: Higher quality, smoother results +- **area**: Best for downscaling operations +- **nearest-exact**: Precise nearest neighbor +- **lanczos**: Highest quality, best for upscaling +- **bislerp**: ComfyUI's optimized bicubic interpolation + +## Condition Options + +- **always**: Always resize regardless of current size +- **downscale if bigger**: Only resize if image is larger than target +- **upscale if smaller**: Only resize if image is smaller than target +- **if bigger area**: Resize if total pixel area is larger +- **if smaller area**: Resize if total pixel area is smaller + +## Usage + +This node is ideal for: + +- Resizing images for specific model requirements +- Preparing images for different processing stages +- Maintaining or adjusting aspect ratios +- Batch processing images to consistent dimensions + +## Notes + +- Based on the proven ComfyUI-Essentials resize implementation (MIT license) +- Original author: cubiq (Matteo Spinelli) +- The multiple_of parameter ensures compatibility with models requiring specific dimension alignment +- Conditional resizing prevents unnecessary processing +- Supports both upscaling and downscaling with appropriate quality settings +- Output dimensions are clamped to valid ranges and multiples as specified diff --git a/js/docs/old/Sage_DualCLIPTextEncode.md b/js/docs/old/Sage_DualCLIPTextEncode.md new file mode 100644 index 0000000..f3a95ad --- /dev/null +++ b/js/docs/old/Sage_DualCLIPTextEncode.md @@ -0,0 +1,38 @@ +# Sage_DualCLIPTextEncode + +**Dual Prompt Encode** + +Encodes positive and negative prompts using a CLIP model, returning both conditionings and the input text with optional text cleaning. + +## Inputs + +### Required + +- **clip** (CLIP): The CLIP model used for encoding the text +- **clean** (BOOLEAN): Clean up the text, getting rid of extra spaces, commas, etc. (default: False) + +### Optional + +- **pos** (STRING): The positive prompt's text (multiline, supports dynamic prompts) +- **neg** (STRING): The negative prompt's text (multiline, supports dynamic prompts) + +## Outputs + +- **positive** (CONDITIONING): Conditioning containing the embedded positive text used to guide the diffusion model +- **negative** (CONDITIONING): Conditioning containing the embedded negative text. If neg is not connected, it'll be automatically zeroed +- **pos_text** (STRING): The positive prompt text (cleaned if clean=True) +- **neg_text** (STRING): The negative prompt text (cleaned if clean=True) + +## Usage + +Use to generate conditioning for both positive and negative prompts in workflows. Saves space over two separate CLIP Text Encoders, and automatically zeros any input not connected. + +## Notes + +- More efficient than using two separate CLIP Text Encoder nodes +- Automatically handles unconnected inputs by zeroing the conditioning +- Text cleaning removes extra spaces, commas, and formatting issues +- Supports dynamic prompts for both positive and negative inputs +- Progress bar shows encoding progress for both prompts +- Part of "Sage Utils/clip" category for conditioning operations +- Returns both the conditioning tensors and the original text for further processing diff --git a/js/docs/old/Sage_DualCLIPTextEncodeLumina2.md b/js/docs/old/Sage_DualCLIPTextEncodeLumina2.md new file mode 100644 index 0000000..4a539ed --- /dev/null +++ b/js/docs/old/Sage_DualCLIPTextEncodeLumina2.md @@ -0,0 +1,51 @@ +# Sage_DualCLIPTextEncodeLumina2 + +**Dual Prompt Encode (Lumina 2)** + +Encodes positive and negative prompts using a CLIP model with Lumina 2-specific system prompts for enhanced image-text alignment. + +## Inputs + +### Required + +- **clip** (CLIP): The CLIP model used for encoding the text +- **system_prompt** (STRING): Lumina 2 system prompt type selection +- **clean** (BOOLEAN): Clean up the text, getting rid of extra spaces, commas, etc. (default: False) + +### Optional + +- **pos** (STRING): The positive prompt's text (multiline, supports dynamic prompts) +- **neg** (STRING): The negative prompt's text (multiline, supports dynamic prompts) + +## Outputs + +- **pos_cond** (CONDITIONING): Conditioning containing the embedded positive text with system prompt +- **neg_cond** (CONDITIONING): Conditioning containing the embedded negative text with system prompt. If neg is not connected, it'll be automatically zeroed +- **pos_text** (STRING): The positive prompt text with system prompt prefix (cleaned if clean=True) +- **neg_text** (STRING): The negative prompt text with system prompt prefix (cleaned if clean=True) + +## System Prompt Options + +### Superior + +"You are an assistant designed to generate superior images with the superior degree of image-text alignment based on textual prompts or user prompts." + +### Alignment + +"You are an assistant designed to generate high-quality images with the highest degree of image-text alignment based on textual prompts." + +## Usage + +Use for workflows that require Lumina 2 prompt encoding with specialized system prompts. The system prompts are automatically prepended to your prompts with `` delimiter. + +## Notes + +- Specifically designed for Lumina 2 model compatibility +- System prompts enhance image-text alignment quality +- Automatically formats prompts as: `{system_prompt} {user_prompt}` +- More efficient than using two separate CLIP Text Encoder nodes +- Automatically handles unconnected inputs by zeroing the conditioning +- Text cleaning removes extra spaces, commas, and formatting issues +- Supports dynamic prompts for both positive and negative inputs +- Progress bar shows encoding progress for both prompts +- Part of "Sage Utils/clip" category for conditioning operations diff --git a/js/docs/old/Sage_EmptyLatentImagePassthrough.md b/js/docs/old/Sage_EmptyLatentImagePassthrough.md new file mode 100644 index 0000000..4c95db4 --- /dev/null +++ b/js/docs/old/Sage_EmptyLatentImagePassthrough.md @@ -0,0 +1,33 @@ +# Sage_EmptyLatentImagePassthrough + +**Empty Latent Passthrough** + +Creates an empty latent image and passes width/height for easier wiring. Includes a switch for SD3 compatibility. + +## Inputs + +### Required + +- **width** (INT): The width of the latent images in pixels (default: 1024, range: 16 to MAX_RESOLUTION, step: 8) +- **height** (INT): The height of the latent images in pixels (default: 1024, range: 16 to MAX_RESOLUTION, step: 8) +- **batch_size** (INT): The number of latent images in the batch (default: 1, range: 1-4096) +- **sd3** (BOOLEAN): Enable for SD3 compatibility - changes latent channels from 4 to 16 (default: False) + +## Outputs + +- **latent** (LATENT): The empty latent image batch +- **width** (INT): Pass through the image width +- **height** (INT): Pass through the image height + +## Usage + +Use to generate latent images and pass dimensions to downstream nodes. The passthrough outputs make it easier to wire width/height to other nodes without additional connections. + +## Notes + +- Creates empty latent tensors on intermediate device for memory efficiency +- SD3 mode uses 16 channels instead of 4 for compatibility with SD3 models +- Latent dimensions are automatically scaled down by factor of 8 (standard for diffusion models) +- Width and height must be multiples of 8 for proper latent space alignment +- Batch size allows creating multiple latent images in a single tensor +- Useful for starting generation workflows with proper dimension tracking diff --git a/js/docs/Sage_GetFileHash.md b/js/docs/old/Sage_GetFileHash.md similarity index 100% rename from js/docs/Sage_GetFileHash.md rename to js/docs/old/Sage_GetFileHash.md diff --git a/js/docs/old/Sage_GuessResolutionByRatio.md b/js/docs/old/Sage_GuessResolutionByRatio.md new file mode 100644 index 0000000..bbff617 --- /dev/null +++ b/js/docs/old/Sage_GuessResolutionByRatio.md @@ -0,0 +1,32 @@ +# Sage_GuessResolutionByRatio + +## Guess Resolution by Ratio + +Analyzes input dimensions and suggests the closest standard resolution from common aspect ratios, rounded to multiples of 64. + +## Inputs + +### Required + +- **width** (INT): Input width dimension (range: 64-8192) +- **height** (INT): Input height dimension (range: 64-8192) + +## Outputs + +- **width** (INT): Suggested width dimension +- **height** (INT): Suggested height dimension + +## Usage + +Based on the input width and height, this node guesses a resolution that matches one of the common aspect ratios. The output is rounded to the nearest multiple of 64. + +## Notes + +- Supports 11 common aspect ratios including 1:1, 5:12, 9:16, 10:16, 5:7, 2:3, 3:4, 4:7, 7:9, 8:10, and 13:19 +- Automatically detects landscape vs portrait orientation +- Finds the closest aspect ratio by comparing input ratio to predefined ratios +- All outputs are rounded to nearest multiple of 64 for optimal AI generation +- Swaps dimensions appropriately to maintain landscape/portrait orientation +- Defaults to 1024x1024 if no close match is found +- Useful for standardizing arbitrary input dimensions to known good ratios +- Optimized for AI image generation workflows requiring specific aspect ratios diff --git a/js/docs/old/Sage_HiDreamE1_Instruction.md b/js/docs/old/Sage_HiDreamE1_Instruction.md new file mode 100644 index 0000000..9a17ca2 --- /dev/null +++ b/js/docs/old/Sage_HiDreamE1_Instruction.md @@ -0,0 +1,26 @@ +# Sage_HiDreamE1_Instruction + +**HiDreamE1 Instruction** + +Generates a formatted prompt for HiDream E1 models based on instruction and description inputs. + +## Inputs + +- **instruction** (STRING, required): The instruction text for the model +- **description** (STRING, required): The description text for the model + +## Outputs + +- **prompt** (STRING): Formatted prompt combining instruction and description + +## Usage + +Use to create properly formatted prompts for HiDream E1 models. The node takes separate instruction and description inputs and combines them into the specific format expected by HiDream E1. + +## Notes + +- Both instruction and description inputs are required and cannot be empty +- Text inputs are automatically cleaned (whitespace trimmed, etc.) +- If the instruction doesn't end with a period, one is automatically added +- Output format: "Instruction: {instruction}\nDescription: {description}" +- Designed specifically for HiDream E1 model prompt formatting requirements diff --git a/js/docs/old/Sage_JoinText.md b/js/docs/old/Sage_JoinText.md new file mode 100644 index 0000000..6bb226d --- /dev/null +++ b/js/docs/old/Sage_JoinText.md @@ -0,0 +1,22 @@ +# Sage_JoinText + +**Join Text** + +Joins two text strings together with a customizable separator. Useful for building prompts or metadata with controlled formatting. + +## Inputs + +### Required + +- **separator** (STRING): The separator to use between strings (default: ', ') +- **add_separator_to_end** (BOOLEAN): Whether to add separator to the end of the joined string (default: False) +- **str1** (STRING): First string to join +- **str2** (STRING): Second string to join + +## Outputs + +- **str** (STRING): The joined string with separator + +## Usage + +Use to concatenate text for prompts, metadata, or other string fields. The separator parameter allows you to control how the strings are joined (comma, space, newline, etc.), and the add_separator_to_end option lets you append the separator to the final result. diff --git a/js/docs/old/Sage_KSampler.md b/js/docs/old/Sage_KSampler.md new file mode 100644 index 0000000..6fa8703 --- /dev/null +++ b/js/docs/old/Sage_KSampler.md @@ -0,0 +1,39 @@ +# Sage_KSampler + +**KSampler w/ Sampler Info** + +A KSampler node designed to work with Sampler Info nodes for streamlined configuration and workflow integration. + +## Inputs + +### Required + +- **model** (MODEL): The model used for denoising the input latent +- **sampler_info** (SAMPLER_INFO): Sampler settings from Sage_SamplerInfo node +- **positive** (CONDITIONING): Conditioning describing attributes to include in the image +- **negative** (CONDITIONING): Conditioning describing attributes to exclude from the image +- **latent_image** (LATENT): The latent image to denoise +- **denoise** (FLOAT): Amount of denoising applied + - Default: 1.0, Range: 0.0 to 1.0, Step: 0.01 + +### Optional + +- **advanced_info** (ADV_SAMPLER_INFO): Advanced sampler options from Sage_AdvSamplerInfo node + +## Outputs + +- **LATENT**: The denoised latent image + +## Usage + +Use for workflows that require flexible sampler configuration and metadata integration. Connect a Sage_SamplerInfo node to provide centralized sampler settings, and optionally connect Sage_AdvSamplerInfo for advanced control options. + +## Notes + +- Designed to work with Sage_SamplerInfo for centralized configuration +- Supports advanced sampling options when Sage_AdvSamplerInfo is connected +- Lower denoise values maintain structure for image-to-image workflows +- Sampler info should be routed to both this node and metadata construction +- Uses ComfyUI's common_ksampler internally for compatibility +- Advanced info enables step ranges, noise control, and leftover noise options +- Streamlines workflow by separating sampler configuration from execution diff --git a/js/docs/old/Sage_KSamplerAudioDecoder.md b/js/docs/old/Sage_KSamplerAudioDecoder.md new file mode 100644 index 0000000..3684ab8 --- /dev/null +++ b/js/docs/old/Sage_KSamplerAudioDecoder.md @@ -0,0 +1,43 @@ +# Sage_KSamplerAudioDecoder + +**KSampler + Audio Decoder** + +A specialized KSampler node designed for audio generation workflows. It performs sampling on latent audio data and automatically decodes it to audio format, outputting both the denoised latent and decoded audio. + +## Inputs + +### Required +- **model** (MODEL): The model used for denoising the input latent +- **sampler_info** (SAMPLER_INFO): Most of the KSampler options. Should be piped both here and to the Construct Metadata node +- **positive** (CONDITIONING): The conditioning describing the attributes you want to include in the audio +- **negative** (CONDITIONING): The conditioning describing the attributes you want to exclude from the audio +- **latent_audio** (LATENT): The latent audio to denoise +- **vae** (VAE): The VAE used for decoding the latent audio +- **denoise** (FLOAT): The amount of denoising applied, lower values will maintain the structure of the initial audio allowing for audio to audio sampling (default: 1.0, range: 0.0-1.0) + +### Optional + +- **advanced_info** (ADV_SAMPLER_INFO): Optional. Adds in the options an advanced KSampler would have + +## Outputs + +- **LATENT**: The denoised latent +- **AUDIO**: The decoded audio (44.1kHz sample rate with normalized waveform) + +## Usage + +This node is specifically designed for audio generation workflows using latent diffusion models. It combines the sampling and decoding steps into a single node for convenience. + +Key features: + +- Automatic audio normalization (scales by 5x standard deviation, minimum 1.0) +- Fixed 44.1kHz sample rate output +- Supports advanced sampling options when connected to Sage_AdvSamplerInfo +- Works with the Sage_SamplerInfo node for consistent workflow integration + +## Notes + +- The audio output includes automatic normalization to prevent clipping +- This node is optimized for audio generation workflows +- Use with audio-specific VAE models for best results +- The latent_audio input should come from audio-compatible latent sources diff --git a/js/docs/old/Sage_KSamplerTiledDecoder.md b/js/docs/old/Sage_KSamplerTiledDecoder.md new file mode 100644 index 0000000..afd8d4e --- /dev/null +++ b/js/docs/old/Sage_KSamplerTiledDecoder.md @@ -0,0 +1,44 @@ +# Sage_KSamplerTiledDecoder + +**KSampler + Tiled Decoder** + +A KSampler node with integrated VAE decoder that supports optional tiled decoding for memory-efficient processing of large images. + +## Inputs + +### Required + +- **model** (MODEL): The model used for denoising the input latent +- **sampler_info** (SAMPLER_INFO): Sampler settings from Sage_SamplerInfo node +- **positive** (CONDITIONING): Conditioning describing attributes to include in the image +- **negative** (CONDITIONING): Conditioning describing attributes to exclude from the image +- **latent_image** (LATENT): The latent image to denoise +- **vae** (VAE): The VAE used for decoding the latent image +- **denoise** (FLOAT): Amount of denoising applied + - Default: 1.0, Range: 0.0 to 1.0, Step: 0.01 + +### Optional + +- **tiling_info** (TILING_INFO): Tiling parameters from Sage_TilingInfo node for memory-efficient decoding +- **advanced_info** (ADV_SAMPLER_INFO): Advanced sampler options from Sage_AdvSamplerInfo node + +## Outputs + +- **LATENT**: The denoised latent image +- **IMAGE**: The decoded image (tiled if tiling_info provided) + +## Usage + +Use for workflows that require both sampling and immediate image output with optional memory-efficient tiled decoding. Connect Sage_TilingInfo to enable tiled VAE decoding for large images, and optionally connect Sage_AdvSamplerInfo for advanced sampling control. + +## Notes + +- Combines sampling and VAE decoding in a single node +- Automatically uses tiled decoding when Sage_TilingInfo is connected +- Tiling enables processing of high-resolution images with limited VRAM +- Supports both spatial and temporal tiling for video content +- Advanced sampling options available through Sage_AdvSamplerInfo +- Automatically adjusts tiling parameters for compatibility +- Handles video batch reshaping for proper output format +- More efficient than separate sampler + decoder nodes +- Essential for high-resolution workflows with VRAM constraints diff --git a/js/docs/Sage_LMStudioLLMPromptText.md b/js/docs/old/Sage_LMStudioLLMPromptText.md similarity index 100% rename from js/docs/Sage_LMStudioLLMPromptText.md rename to js/docs/old/Sage_LMStudioLLMPromptText.md diff --git a/js/docs/Sage_LMStudioLLMPromptVision.md b/js/docs/old/Sage_LMStudioLLMPromptVision.md similarity index 100% rename from js/docs/Sage_LMStudioLLMPromptVision.md rename to js/docs/old/Sage_LMStudioLLMPromptVision.md diff --git a/js/docs/Sage_LMStudioLLMPromptVisionRefine.md b/js/docs/old/Sage_LMStudioLLMPromptVisionRefine.md similarity index 100% rename from js/docs/Sage_LMStudioLLMPromptVisionRefine.md rename to js/docs/old/Sage_LMStudioLLMPromptVisionRefine.md diff --git a/js/docs/Sage_LastLoraInfo.md b/js/docs/old/Sage_LastLoraInfo.md similarity index 100% rename from js/docs/Sage_LastLoraInfo.md rename to js/docs/old/Sage_LastLoraInfo.md diff --git a/js/docs/old/Sage_LoadImage.md b/js/docs/old/Sage_LoadImage.md new file mode 100644 index 0000000..a2a6761 --- /dev/null +++ b/js/docs/old/Sage_LoadImage.md @@ -0,0 +1,34 @@ +# Sage_LoadImage + +**Load Image w/ Size & Metadata** + +Loads an image and outputs its size and embedded metadata along with the image and mask. + +## Inputs + +### Required + +- **image** (STRING): The image file to load from the input directory (supports image upload) + +## Outputs + +- **image** (IMAGE): The loaded image +- **mask** (MASK): The alpha channel mask (if present) +- **width** (INT): The image width in pixels +- **height** (INT): The image height in pixels +- **metadata** (STRING): Embedded metadata from the image file + +## Usage + +Use to inspect images and extract their metadata for use in workflows. Provides both the image data and useful information about dimensions and embedded metadata. + +## Notes + +- Automatically scans all files in the ComfyUI input directory +- Supports image upload functionality +- Extracts alpha channel as mask if present +- Metadata includes EXIF data, PNG text chunks, and other embedded information +- File validation ensures only valid image files are processed +- Uses SHA256 hash to detect file changes for cache invalidation +- Supports all common image formats (PNG, JPEG, WebP, etc.) +- Useful for loading reference images and extracting generation parameters diff --git a/js/docs/old/Sage_LogicalSwitch.md b/js/docs/old/Sage_LogicalSwitch.md new file mode 100644 index 0000000..ba6e398 --- /dev/null +++ b/js/docs/old/Sage_LogicalSwitch.md @@ -0,0 +1,26 @@ +# Sage_LogicalSwitch + +**Switch** + +Selects between two inputs based on a boolean condition. Useful for conditional logic in workflows. + +## Inputs + +- **condition** (BOOLEAN, required): Boolean value to determine which input to select +- **true_value** (ANY, required): Value to return when condition is true +- **false_value** (ANY, required): Value to return when condition is false + +## Outputs + +- **result** (ANY): The selected value based on the condition + +## Usage + +Use to route data or control flow based on conditions. When the condition is true, the node outputs `true_value`; when false, it outputs `false_value`. This enables conditional branching in workflows. + +## Notes + +- Accepts any data type for both value inputs (ANY type) +- Simple if-else logic: condition ? true_value : false_value +- Useful for creating conditional workflows and dynamic data routing +- Both value inputs are required even if only one may be used diff --git a/js/docs/old/Sage_LoraStack.md b/js/docs/old/Sage_LoraStack.md new file mode 100644 index 0000000..8400035 --- /dev/null +++ b/js/docs/old/Sage_LoraStack.md @@ -0,0 +1,34 @@ +# Sage_LoraStack + +**Simple Lora Stack** + +Builds and manages a stack of LoRAs with toggles and weights. + +## Inputs + +### Required + +- **enabled** (BOOLEAN): Whether to add this LoRA to the stack (default: True) +- **lora_name** (STRING): The name of the LoRA from available LoRAs +- **model_weight** (FLOAT): How strongly to modify the diffusion model. This value can be negative (default: 1.0, range: -100.0 to 100.0) +- **clip_weight** (FLOAT): How strongly to modify the CLIP model. This value can be negative (default: 1.0, range: -100.0 to 100.0) + +### Optional + +- **lora_stack** (LORA_STACK): Existing LoRA stack to add this LoRA to + +## Outputs + +- **lora_stack** (LORA_STACK): The updated LoRA stack + +## Usage + +Chain multiple nodes for complex LoRA stacking. Connect to LoRA Stack Loader or metadata nodes. If enabled is False, the LoRA is not added to the stack. + +## Notes + +- Compatible with other node packs that have lora_stacks +- Negative weights can be used to subtract the LoRA effect +- Each LoRA can be individually enabled/disabled +- Can be chained together to build complex LoRA combinations +- Shows all available LoRAs in the dropdown diff --git a/js/docs/old/Sage_LoraStackLoader.md b/js/docs/old/Sage_LoraStackLoader.md new file mode 100644 index 0000000..c6ebcf6 --- /dev/null +++ b/js/docs/old/Sage_LoraStackLoader.md @@ -0,0 +1,38 @@ +# Sage_LoraStackLoader + +**Lora Stack Loader** + +Loads all LoRAs in a stack and applies them to the model and CLIP, with optional model shifts. + +## Inputs + +### Required + +- **model** (MODEL): The diffusion model the LoRA will be applied to +- **clip** (CLIP): The CLIP model the LoRA will be applied to + +### Optional + +- **lora_stack** (LORA_STACK): The stack of LoRAs to load and apply +- **model_shifts** (MODEL_SHIFTS): The model shifts & FreeU2 settings to apply to the model + +## Outputs + +- **model** (MODEL): The modified diffusion model with LoRAs applied +- **clip** (CLIP): The modified CLIP model with LoRAs applied +- **lora_stack** (LORA_STACK): The stack of LoRAs (passed through) +- **keywords** (STRING): Keywords from the LoRA stack + +## Usage + +Connect to a LoRA stack node to load all LoRAs at once. Supports model shifts for advanced model modifications. + +## Notes + +- Applies all LoRAs in the stack to both model and CLIP +- Shows progress bar during loading process +- Extracts and returns keywords from all LoRAs in the stack +- Supports model shifts including discrete flow sampling and FreeU v2 +- Model shifts can apply x1 or x1000 multipliers for different model types +- FreeU v2 can be enabled for improved quality with specific parameters +- Compatible with LoRA stacks from other node packs diff --git a/js/docs/Sage_LoraStackRecent.md b/js/docs/old/Sage_LoraStackRecent.md similarity index 100% rename from js/docs/Sage_LoraStackRecent.md rename to js/docs/old/Sage_LoraStackRecent.md diff --git a/js/docs/old/Sage_ModelInfo.md b/js/docs/old/Sage_ModelInfo.md new file mode 100644 index 0000000..7e87d77 --- /dev/null +++ b/js/docs/old/Sage_ModelInfo.md @@ -0,0 +1,31 @@ +# Sage_ModelInfo + +**Model Info** + +Retrieves Civitai model information and metadata based on model info input. + +## Inputs + +- **model_info** (MODEL_INFO, required): Model information containing hash and metadata + +## Outputs + +- **base_model** (STRING): The base model type (e.g., SDXL, SD1.5, etc.) +- **name** (STRING): Model name with version information +- **url** (STRING): Civitai URL for the specific model version +- **latest_url** (STRING): Civitai URL for the latest version of the model +- **image** (IMAGE): Preview image from Civitai + +## Usage + +Use to retrieve and display comprehensive model information from Civitai. The node queries Civitai's API using the model hash to fetch metadata, URLs, and preview images for documentation or workflow information display. + +## Notes + +- Requires internet connection to fetch data from Civitai +- Uses model hash to query Civitai API for model information +- Returns empty strings and blank image if model info is unavailable +- Handles exceptions gracefully by returning empty values +- The "latest_url" provides a link to the most recent version of the model +- Preview image is fetched from Civitai's image URLs +- Useful for model documentation and workflow metadata diff --git a/js/docs/old/Sage_ModelLoraStackLoader.md b/js/docs/old/Sage_ModelLoraStackLoader.md new file mode 100644 index 0000000..ed485b0 --- /dev/null +++ b/js/docs/old/Sage_ModelLoraStackLoader.md @@ -0,0 +1,40 @@ +# Sage_ModelLoraStackLoader + +**Model + Lora Stack Loader** + +Loads both a checkpoint and a LoRA stack in one node, with optional model shifts. + +## Inputs + +### Required + +- **model_info** (MODEL_INFO): The diffusion model info to load. Should be from the checkpoint info node, not a loader node, to avoid loading the model twice + +### Optional + +- **lora_stack** (LORA_STACK): The stack of LoRAs to load and apply +- **model_shifts** (MODEL_SHIFTS): The model shifts & FreeU2 settings to apply to the model + +## Outputs + +- **model** (MODEL): The modified diffusion model with LoRAs applied +- **clip** (CLIP): The modified CLIP model with LoRAs applied +- **vae** (VAE): The VAE model from the checkpoint +- **lora_stack** (LORA_STACK): The stack of LoRAs (passed through) +- **keywords** (STRING): Keywords from the LoRA stack + +## Usage + +Use to streamline workflows that require both a model and a LoRA stack. Loads the checkpoint and applies all LoRAs in a single efficient operation. + +## Notes + +- Inherits functionality from Sage_LoraStackLoader +- Loads model, CLIP, and VAE from checkpoint using model_info +- Applies all LoRAs in the stack to the loaded model and CLIP +- Shows progress bar during loading process +- Extracts and returns keywords from all LoRAs in the stack +- Supports model shifts and FreeU v2 settings +- More efficient than separate model loading and LoRA application +- Requires checkpoint model_info (not UNET-only models) +- Part of "Sage Utils/model" category for complete model loading diff --git a/js/docs/Sage_ModelReport.md b/js/docs/old/Sage_ModelReport.md similarity index 100% rename from js/docs/Sage_ModelReport.md rename to js/docs/old/Sage_ModelReport.md diff --git a/js/docs/old/Sage_ModelShifts.md b/js/docs/old/Sage_ModelShifts.md new file mode 100644 index 0000000..cc3a5e2 --- /dev/null +++ b/js/docs/old/Sage_ModelShifts.md @@ -0,0 +1,36 @@ +# Sage_ModelShifts + +**Model Shifts** + +Configures model shift parameters and FreeU v2 settings for advanced model modifications. + +## Inputs + +### Required + +- **shift_type** (STRING): The type of shift to apply to the model - "None", "x1", or "x1000" (x1 for most models, x1000 for Auraflow and Lumina2) +- **shift** (FLOAT): The shift value to apply (default: 3.0, range: 0.0-100.0) +- **freeu_v2** (BOOLEAN): Whether to enable FreeU v2 (default: False) +- **b1** (FLOAT): FreeU v2 backbone factor 1 (default: 1.3, range: 0.0-10.0) +- **b2** (FLOAT): FreeU v2 backbone factor 2 (default: 1.4, range: 0.0-10.0) +- **s1** (FLOAT): FreeU v2 skip factor 1 (default: 0.9, range: 0.0-10.0) +- **s2** (FLOAT): FreeU v2 skip factor 2 (default: 0.2, range: 0.0-10.0) + +## Outputs + +- **model_shifts** (MODEL_SHIFTS): Configuration object containing all shift and FreeU settings + +## Usage + +Use in workflows that require dynamic model parameter adjustment. Connect to LoRA Stack Loader or Model LoRA Stack Loader nodes. + +## Notes + +- Model shifts adjust sampling parameters for different model architectures +- x1 shift type uses 1000.0 multiplier (for most models) +- x1000 shift type uses 1.0 multiplier (for Auraflow and Lumina2) +- FreeU v2 can improve generation quality with proper parameter tuning +- Settings are passed to model loader nodes for application +- "None" shift type disables model shifting +- Used by the model loader node for advanced model modifications +- Part of the "Sage Utils/model" category despite being in lora.py diff --git a/js/docs/Sage_OllamaLLMPromptText.md b/js/docs/old/Sage_OllamaLLMPromptText.md similarity index 100% rename from js/docs/Sage_OllamaLLMPromptText.md rename to js/docs/old/Sage_OllamaLLMPromptText.md diff --git a/js/docs/Sage_OllamaLLMPromptVision.md b/js/docs/old/Sage_OllamaLLMPromptVision.md similarity index 100% rename from js/docs/Sage_OllamaLLMPromptVision.md rename to js/docs/old/Sage_OllamaLLMPromptVision.md diff --git a/js/docs/Sage_OllamaLLMPromptVisionRefine.md b/js/docs/old/Sage_OllamaLLMPromptVisionRefine.md similarity index 100% rename from js/docs/Sage_OllamaLLMPromptVisionRefine.md rename to js/docs/old/Sage_OllamaLLMPromptVisionRefine.md diff --git a/js/docs/old/Sage_PonyPrefix.md b/js/docs/old/Sage_PonyPrefix.md new file mode 100644 index 0000000..d196235 --- /dev/null +++ b/js/docs/old/Sage_PonyPrefix.md @@ -0,0 +1,19 @@ +# Sage_PonyPrefix + +**Add Pony v6 Prefixes** + +Creates Pony v6 prefixes for prompt engineering based on score, rating, and source parameters. + +## Inputs + +- **add_score** (boolean, required): Whether to include score prefixes (score_9, score_8_up, etc.) +- **rating** (string, required): Content rating - Options: "none", "safe", "questionable", "explicit" +- **source** (string, required): Content source - Options: "none", "pony", "furry", "anime", "cartoon", "3d", "western", "comic", "monster" + +## Outputs + +- **STRING**: Generated prefix string containing the selected score, rating, and source tags + +## Usage + +Use to automatically generate appropriate prefixes for Pony v6 models. The node combines score tags (if enabled), source tags, and rating tags into a properly formatted prefix string that can be prepended to your main prompt. diff --git a/js/docs/old/Sage_PonyStyle.md b/js/docs/old/Sage_PonyStyle.md new file mode 100644 index 0000000..39cef01 --- /dev/null +++ b/js/docs/old/Sage_PonyStyle.md @@ -0,0 +1,26 @@ +# Sage_PonyStyle + +**Add Pony Style** + +Adds three-letter artist style codes from Pony v6 to prompts. + +## Inputs + +- **style** (multi-select): Choose from hundreds of three-letter artist style codes + - Multi-select dropdown with chip display + - Options include: aav, aax, aba, aca, acb, acl, etc. (extensive list of artist style codes) + +## Outputs + +- **text** (STRING): Comma-separated list of selected style codes + +## Usage + +Use to add specific artist styles to your Pony v6 prompts. Select one or more three-letter codes that correspond to different artistic styles. The node will output them as a comma-separated string that can be added to your prompt. + +## Notes + +- Contains hundreds of three-letter artist style codes specific to Pony v6 +- Supports multi-selection for combining multiple artistic influences +- Output is formatted as comma-separated values for easy prompt integration +- Style codes are based on the Pony v6 model's training data and recognized artistic styles diff --git a/js/docs/old/Sage_QuickResPicker.md b/js/docs/old/Sage_QuickResPicker.md new file mode 100644 index 0000000..204f7e2 --- /dev/null +++ b/js/docs/old/Sage_QuickResPicker.md @@ -0,0 +1,46 @@ +# Sage_QuickResPicker + +## Quick Resolution Picker + +A convenient node for quickly selecting common image resolutions from predefined aspect ratios with orientation and scaling options. + +## Inputs + +### Required + +- **aspect_ratio** (COMBO): Predefined aspect ratio selection - "1:1", "5:12", "9:16", "10:16", "5:7", "2:3", "3:4", "4:7", "7:9", "8:10", "13:19" +- **orientation** (COMBO): "Portrait" or "Landscape" orientation +- **multiplier** (FLOAT): Scale factor for the resolution (default: 1.0, range: 0.1-10.0, step: 0.1) + +## Outputs + +- **width** (INT): The calculated width dimension +- **height** (INT): The calculated height dimension + +## Usage + +Pick a resolution from a list of common aspect ratios. The multiplier can be used to scale the resolution up or down, rounded to the nearest unit of 64. + +## Available Aspect Ratios + +- **1:1** - Square (1024 x 1024) +- **5:12** - Portrait (512 x 1216) +- **9:16** - Portrait (720 x 1280) +- **10:16** - Portrait (640 x 1024) +- **5:7** - Portrait (1280 x 1792) +- **2:3** - Portrait (768 x 1152) +- **3:4** - Portrait (768 x 1024) +- **4:7** - Portrait (768 x 1344) +- **7:9** - Portrait (896 x 1152) +- **8:10** - Portrait (1024 x 1280) +- **13:19** - Portrait (832 x 1216) + +## Notes + +- All base resolutions are listed in portrait orientation +- Landscape orientation swaps width and height +- Multiplier allows scaling while maintaining aspect ratio +- All outputs are rounded to nearest multiple of 64 for optimal AI generation +- Defaults to 1:1 aspect ratio if invalid selection +- Useful for quickly setting up standard image dimensions +- Covers common aspect ratios used in AI image generation diff --git a/js/docs/old/Sage_SamplerInfo.md b/js/docs/old/Sage_SamplerInfo.md new file mode 100644 index 0000000..605e261 --- /dev/null +++ b/js/docs/old/Sage_SamplerInfo.md @@ -0,0 +1,38 @@ +# Sage_SamplerInfo + +**Sampler Info** + +Collects and packages sampler settings for use in metadata construction and KSampler nodes. + +## Inputs + +- **seed** (INT, required): Random seed for noise generation + - Default: 0, Range: 0 to 2^64-1 +- **steps** (INT, required): Number of denoising steps + - Default: 20, Range: 1 to 10,000 +- **cfg** (FLOAT, required): Classifier-Free Guidance scale + - Default: 5.5, Range: 0.0 to 100.0, Step: 0.1 +- **sampler_name** (dropdown, required): Sampling algorithm + - Default: "dpmpp_2m" + - Options: All available ComfyUI samplers +- **scheduler** (dropdown, required): Noise scheduling algorithm + - Default: "beta" + - Options: All available ComfyUI schedulers + +## Outputs + +- **SAMPLER_INFO**: Dictionary containing all sampler parameters + +## Usage + +Connect to both the Construct Metadata node and KSampler nodes to standardize and share sampler configuration across your workflow. This node centralizes sampler settings, making it easy to maintain consistency and modify parameters in one place. + +## Notes + +- Designed to work with Sage_KSampler and other sampler nodes +- Output should be routed to both metadata construction and sampling nodes +- CFG scale balances creativity and prompt adherence +- Higher CFG values increase prompt adherence but may reduce quality if too high +- Sampler algorithm affects quality, speed, and style of generation +- Scheduler controls how noise is gradually removed during denoising +- Centralizes sampler configuration for workflow consistency diff --git a/js/docs/old/Sage_SaveImageWithMetadata.md b/js/docs/old/Sage_SaveImageWithMetadata.md new file mode 100644 index 0000000..9169d25 --- /dev/null +++ b/js/docs/old/Sage_SaveImageWithMetadata.md @@ -0,0 +1,44 @@ +# Sage_SaveImageWithMetadata + +**Save Image w/ Added Metadata** + +Saves images with comprehensive metadata options including custom parameters, extra metadata, and ComfyUI workflow information. + +## Inputs + +### Required + +- **images** (IMAGE): The images to save +- **filename_prefix** (STRING): The prefix for the file to save, supports formatting like %date:yyyy-MM-dd% or %Empty Latent Image.width% (default: "ComfyUI_Meta") +- **include_node_metadata** (BOOLEAN): Whether to include ComfyUI prompt/workflow metadata (default: True) +- **include_extra_pnginfo_metadata** (BOOLEAN): Whether to include extra PNG info metadata (default: True) + +### Optional + +- **param_metadata** (STRING): Metadata string for "parameters" field (A1111-style) +- **extra_metadata** (STRING): Additional metadata for "Extra" field + +### Hidden + +- **prompt**: ComfyUI workflow prompt (automatically provided) +- **extra_pnginfo**: Extra PNG info (automatically provided) + +## Outputs + +- **None** (Output Node): Saves images to ComfyUI output directory + +## Usage + +Use to save images with custom and standard metadata for better tracking and sharing. Connect param_metadata from Construct Metadata node for A1111-compatible metadata. + +## Notes + +- Saves images as PNG with customizable compression level +- param_metadata is stored under "parameters" key (A1111 standard) +- extra_metadata is stored under "Extra" key +- Filename prefix supports dynamic formatting with node values and dates +- Batch number support with %batch_num% placeholder +- Respects ComfyUI's --disable-metadata flag +- Compatible with A1111 and Civitai metadata standards +- Output node that appears in ComfyUI's image output interface +- Useful for workflows requiring comprehensive metadata tracking diff --git a/js/docs/old/Sage_SaveText.md b/js/docs/old/Sage_SaveText.md new file mode 100644 index 0000000..4289d14 --- /dev/null +++ b/js/docs/old/Sage_SaveText.md @@ -0,0 +1,33 @@ +# Sage_SaveText + +## Description + +A utility node for saving text content to a file. This node allows you to write text strings to files on disk with customizable filename and extension. + +## Inputs + +### Required + +- **filename_prefix** (STRING): The prefix for the file to save (default: "ComfyUI_Text"). This may include formatting information such as %date:yyyy-MM-dd% to include values from nodes. +- **file_extension** (STRING): The file extension to use for the saved file (default: "txt") +- **text** (STRING): The text content to save to file + +## Outputs + +- **filepath** (STRING): The full path of the saved file + +## Usage + +This node is helpful for: + +- Saving generated prompts or text to files +- Creating logs of your workflow outputs +- Storing intermediate text results for later use +- Debugging by writing node outputs to files + +## Notes + +- The filename prefix supports formatting patterns for dynamic naming +- File extension can be specified with or without the leading dot +- A counter will be added to the end of the filename, based on how many files with that name there are. +- If the file path is invalid, an error will be raised diff --git a/js/docs/old/Sage_SetText.md b/js/docs/old/Sage_SetText.md new file mode 100644 index 0000000..830faa4 --- /dev/null +++ b/js/docs/old/Sage_SetText.md @@ -0,0 +1,24 @@ +# Sage_SetText + +**Set Text** + +Sets and outputs a text string with optional prefix and suffix. Useful for providing static or user-defined text to workflows. + +## Inputs + +### Required + +- **str** (STRING): The main text string to output + +### Optional + +- **prefix** (STRING): Text to add before the main string +- **suffix** (STRING): Text to add after the main string + +## Outputs + +- **str** (STRING): The combined text string (prefix + str + suffix) + +## Usage + +Connect to nodes that require a text input, such as prompt or metadata nodes. The node combines prefix, main text, and suffix into a single output string. diff --git a/js/docs/old/Sage_TextWeight.md b/js/docs/old/Sage_TextWeight.md new file mode 100644 index 0000000..1b48273 --- /dev/null +++ b/js/docs/old/Sage_TextWeight.md @@ -0,0 +1,29 @@ +# Sage_TextWeight + +**Text Weight** + +Applies a weight to a text string for prompt conditioning. + +## Inputs + +- **text** (STRING, required): The text string to apply weight to +- **weight** (FLOAT, required): The weight value to apply + - Default: 1.0 + - Range: -10.0 to 10.0 + - Step: 0.05 + +## Outputs + +- **weighted_text** (STRING): The text wrapped in weight syntax with trailing comma + +## Usage + +Use to emphasize or de-emphasize parts of a prompt by applying numerical weights. The node formats the text in the standard prompt weighting syntax `(text:weight),` which is recognized by most AI image generation models. + +## Notes + +- Weights greater than 1.0 emphasize the text (make it stronger) +- Weights less than 1.0 de-emphasize the text (make it weaker) +- Weight is formatted to 2 decimal places +- Output includes trailing comma for easy prompt concatenation +- Standard prompt weighting syntax: `(text:weight),` diff --git a/js/docs/old/Sage_TilingInfo.md b/js/docs/old/Sage_TilingInfo.md new file mode 100644 index 0000000..346f422 --- /dev/null +++ b/js/docs/old/Sage_TilingInfo.md @@ -0,0 +1,36 @@ +# Sage_TilingInfo + +**Tiling Info** + +Provides tiling parameters for memory-efficient processing of large images and videos. + +## Inputs + +- **tile_size** (INT, required): Size of each spatial tile in pixels + - Default: 512, Range: 64 to 4096, Step: 32 +- **overlap** (INT, required): Overlap between spatial tiles in pixels + - Default: 64, Range: 0 to 4096, Step: 32 +- **temporal_size** (INT, required): Number of frames to process at once (video VAEs only) + - Default: 64, Range: 8 to 4096, Step: 4 +- **temporal_overlap** (INT, required): Number of frames to overlap (video VAEs only) + - Default: 8, Range: 4 to 4096, Step: 4 + +## Outputs + +- **TILING_INFO**: Dictionary containing all tiling parameters + +## Usage + +Connect to tiled decoder nodes like Sage_KSamplerTiledDecoder to enable memory-efficient processing of large images or videos. Tiling breaks down large content into smaller chunks that can be processed with limited VRAM. + +## Notes + +- Designed for use with Sage_KSamplerTiledDecoder and similar tiled processing nodes +- Spatial tiling (tile_size/overlap) applies to all content types +- Temporal tiling (temporal_size/temporal_overlap) only used for video VAEs +- Larger tile sizes use more VRAM but may produce better quality +- Overlap helps reduce seam artifacts between tiles +- System automatically adjusts parameters if they're incompatible (e.g., overlap too large) +- Temporal parameters are scaled based on VAE compression ratios +- Essential for processing high-resolution images with limited VRAM +- Optional input - nodes work without tiling if not provided diff --git a/js/docs/old/Sage_TripleJoinText.md b/js/docs/old/Sage_TripleJoinText.md new file mode 100644 index 0000000..e422ce6 --- /dev/null +++ b/js/docs/old/Sage_TripleJoinText.md @@ -0,0 +1,23 @@ +# Sage_TripleJoinText + +**Join Text x3** + +Joins three text strings together with a customizable separator. Useful for building complex prompts or metadata with controlled formatting. + +## Inputs + +### Required + +- **separator** (STRING): The separator to use between strings (default: ', ') +- **add_separator_to_end** (BOOLEAN): Whether to add separator to the end of the joined string (default: False) +- **str1** (STRING): First string to join +- **str2** (STRING): Second string to join +- **str3** (STRING): Third string to join + +## Outputs + +- **str** (STRING): The joined string with separator + +## Usage + +Use to concatenate multiple text fields for prompts or metadata. The separator parameter allows you to control how the strings are joined (comma, space, newline, etc.), and the add_separator_to_end option lets you append the separator to the final result. diff --git a/js/docs/old/Sage_TripleLoraStack.md b/js/docs/old/Sage_TripleLoraStack.md new file mode 100644 index 0000000..b50e1d2 --- /dev/null +++ b/js/docs/old/Sage_TripleLoraStack.md @@ -0,0 +1,43 @@ +# Sage_TripleLoraStack + +**Triple Lora Stack** + +Stack up to three LoRAs with individual toggles and weights in a single node. + +## Inputs + +### Required + +- **enabled_1** (BOOLEAN): Whether to add the first LoRA to the stack (default: True) +- **lora_1_name** (STRING): The name of the first LoRA +- **model_1_weight** (FLOAT): Model weight for the first LoRA (default: 1.0, range: -100.0 to 100.0) +- **clip_1_weight** (FLOAT): CLIP weight for the first LoRA (default: 1.0, range: -100.0 to 100.0) +- **enabled_2** (BOOLEAN): Whether to add the second LoRA to the stack (default: True) +- **lora_2_name** (STRING): The name of the second LoRA +- **model_2_weight** (FLOAT): Model weight for the second LoRA (default: 1.0, range: -100.0 to 100.0) +- **clip_2_weight** (FLOAT): CLIP weight for the second LoRA (default: 1.0, range: -100.0 to 100.0) +- **enabled_3** (BOOLEAN): Whether to add the third LoRA to the stack (default: True) +- **lora_3_name** (STRING): The name of the third LoRA +- **model_3_weight** (FLOAT): Model weight for the third LoRA (default: 1.0, range: -100.0 to 100.0) +- **clip_3_weight** (FLOAT): CLIP weight for the third LoRA (default: 1.0, range: -100.0 to 100.0) + +### Optional + +- **lora_stack** (LORA_STACK): Existing LoRA stack to add these LoRAs to + +## Outputs + +- **lora_stack** (LORA_STACK): The updated LoRA stack with up to three additional LoRAs + +## Usage + +Use for workflows that require up to three LoRAs with fine control in a single compact node. More efficient than chaining three individual LoRA stack nodes. + +## Notes + +- Compatible with other node packs that have lora_stacks +- Each of the three LoRAs can be individually enabled/disabled +- Processes LoRAs in order (1, 2, 3) when building the stack +- Only enabled LoRAs are added to the stack +- Negative weights can be used to subtract LoRA effects +- Useful for common LoRA combinations that are used together frequently diff --git a/js/docs/Sage_UNETLoader.md b/js/docs/old/Sage_UNETLoader.md similarity index 100% rename from js/docs/Sage_UNETLoader.md rename to js/docs/old/Sage_UNETLoader.md diff --git a/js/docs/old/Sage_ViewAnything.md b/js/docs/old/Sage_ViewAnything.md new file mode 100644 index 0000000..860e572 --- /dev/null +++ b/js/docs/old/Sage_ViewAnything.md @@ -0,0 +1,31 @@ +# Sage_ViewAnything + +**View Any Node as Text** + +Displays the output of any node as text in the UI and returns it as a string. This is an output node useful for debugging, inspecting non-string outputs, and visualizing data flow. + +## Inputs + +### Required + +- **any** (ANY): The value to display as text (accepts any data type, including lists) + +## Outputs + +- **STRING**: The converted text representation of the input + +## Usage + +Connect to any node to visualize its output as a string. This node: + +- Accepts any data type as input +- Handles both single values and lists +- Displays the result in the ComfyUI interface +- Returns the text representation for use in other nodes +- Is particularly useful for debugging and data inspection + +## Notes + +- This is an output node that displays results in the UI +- When input is a list, each item is displayed on a new line +- The node converts any input type to its string representation diff --git a/nodes/audio_v3.py b/nodes/audio_v3.py index 6de1c31..061d992 100644 --- a/nodes/audio_v3.py +++ b/nodes/audio_v3.py @@ -24,12 +24,12 @@ class Sage_EmptyAceStep15LatentAudio(io.ComfyNode): description="Creates an empty latent audio tensor for Ace Step 1.5 models.", category=f"{SAGE_UTILS_CAT}/audio", inputs=[ - io.Float.Input("seconds", display_name="seconds", default=120.0, min=1.0, max=1000.0, step=0.01), - io.Int.Input("batch_size", display_name="batch_size", default=1), + io.Float.Input("seconds", display_name="seconds", default=120.0, min=1.0, max=1000.0, step=0.01, tooltip="Length of the empty audio tensor in seconds."), + io.Int.Input("batch_size", display_name="batch_size", default=1, tooltip="Number of audio examples in the batch."), ], outputs=[ - io.Latent.Output("latent", display_name="latent"), - io.Float.Output("out_seconds", display_name="seconds") + io.Latent.Output("latent", display_name="latent", tooltip="The empty latent audio tensor for Ace Step 1.5."), + io.Float.Output("out_seconds", display_name="seconds", tooltip="The duration of the generated audio in seconds.") ] ) @@ -51,15 +51,15 @@ class Sage_AceAdvOptions(io.ComfyNode): description="Advanced options for Ace Step 1.5 audio encoding. These options can be used to fine-tune the behavior of the audio encoding process.", category=f"{SAGE_UTILS_CAT}/audio", inputs=[ - io.Combo.Input("language", options=["en", "ja", "zh", "es", "de", "fr", "pt", "ru", "it", "nl", "pl", "tr", "vi", "cs", "fa", "id", "ko", "uk", "hu", "ar", "sv", "ro", "el"]), - io.Float.Input("cfg_scale", default=2.0, min=0.0, max=100.0, step=0.1, advanced=True), - io.Float.Input("temperature", default=0.85, min=0.0, max=2.0, step=0.01, advanced=True), - io.Float.Input("top_p", default=0.9, min=0.0, max=2000.0, step=0.01, advanced=True), - io.Int.Input("top_k", default=0, min=0, max=100, advanced=True), - io.Float.Input("min_p", default=0.000, min=0.0, max=1.0, step=0.001, advanced=True), + io.Combo.Input("language", options=["en", "ja", "zh", "es", "de", "fr", "pt", "ru", "it", "nl", "pl", "tr", "vi", "cs", "fa", "id", "ko", "uk", "hu", "ar", "sv", "ro", "el"], tooltip="The language for Ace Step 1.5 audio encoding."), + io.Float.Input("cfg_scale", default=2.0, min=0.0, max=100.0, step=0.1, advanced=True, tooltip="How strongly the audio encoding should follow the conditioning."), + io.Float.Input("temperature", default=0.85, min=0.0, max=2.0, step=0.01, advanced=True, tooltip="Sampling temperature for the audio code generation."), + io.Float.Input("top_p", default=0.9, min=0.0, max=2000.0, step=0.01, advanced=True, tooltip="Nucleus sampling probability threshold for audio code generation."), + io.Int.Input("top_k", default=0, min=0, max=100, advanced=True, tooltip="Top-K sampling limit for audio code generation."), + io.Float.Input("min_p", default=0.000, min=0.0, max=1.0, step=0.001, advanced=True, tooltip="Minimum allowed probability for audio code sampling."), ], outputs=[ - AdvAudioInfo.Output("adv_audio_info", display_name="Advanced Audio Info", tooltip="The advanced audio options for Ace Step 1.5 encoding."), + AdvAudioInfo.Output("adv_audio_info", display_name="Advanced Audio Info", tooltip="The configured advanced audio encoding options."), ], ) @@ -93,18 +93,20 @@ class Sage_Ace15AudioEncode(io.ComfyNode): description="Encodes an audio clip into a conditioning using the Ace Step 1.5 model. This is used to create a conditioning from an audio reference.", category=f"{SAGE_UTILS_CAT}/audio", inputs=[ - io.Clip.Input("clip"), - io.String.Input("tags", force_input=True, multiline=True, dynamic_prompts=True), - io.String.Input("lyrics", force_input=True, multiline=True, dynamic_prompts=True), - io.Int.Input("seed", default=0, min=0, max=0xffffffffffffffff, control_after_generate=True), - io.Float.Input("duration", default=120.0, min=0.0, max=2000.0, step=0.1), - io.Int.Input("bpm", default=120, min=10, max=300), - io.Combo.Input("timesignature", options=['2', '3', '4', '6']), - io.Combo.Input("keyscale", options=[f"{root} {quality}" for quality in ["major", "minor"] for root in ["C", "C#", "Db", "D", "D#", "Eb", "E", "F", "F#", "Gb", "G", "G#", "Ab", "A", "A#", "Bb", "B"]]), - io.Boolean.Input("generate_audio_codes", default=True, tooltip="Enable the LLM that generates audio codes. This can be slow but will increase the quality of the generated audio. Turn this off if you are giving the model an audio reference.", advanced=True), - AdvAudioInfo.Input("adv_audio_info", display_name="Advanced Audio Info", tooltip="Advanced audio options for Ace Step 1.5 encoding.", advanced=True) + io.Clip.Input("clip", tooltip="The audio clip to encode into Ace Step 1.5 conditioning."), + io.String.Input("tags", force_input=True, multiline=True, dynamic_prompts=True, tooltip="Descriptive tags or prompts for the audio encoding."), + io.String.Input("lyrics", force_input=True, multiline=True, dynamic_prompts=True, tooltip="Lyrics or vocal metadata to include during audio encoding."), + io.Int.Input("seed", default=0, min=0, max=0xffffffffffffffff, control_after_generate=True, tooltip="Random seed used for encoding determinism."), + io.Float.Input("duration", default=120.0, min=0.0, max=2000.0, step=0.1, tooltip="Target duration of the encoded audio in seconds."), + io.Int.Input("bpm", default=120, min=10, max=300, tooltip="Beats-per-minute tempo used for audio conditioning."), + io.Combo.Input("timesignature", options=['2', '3', '4', '6'], tooltip="Time signature for the encoded audio."), + io.Combo.Input("keyscale", options=[f"{root} {quality}" for quality in ["major", "minor"] for root in ["C", "C#", "Db", "D", "D#", "Eb", "E", "F", "F#", "Gb", "G", "G#", "Ab", "A", "A#", "Bb", "B"]], tooltip="Musical key and scale for the encoded audio."), + io.Boolean.Input("generate_audio_codes", default=True, tooltip="Enable LLM-generated audio codes for higher-quality audio encoding.", advanced=True), + AdvAudioInfo.Input("adv_audio_info", display_name="Advanced Audio Info", tooltip="Advanced audio encoding settings for Ace Step 1.5.", advanced=True) + ], + outputs=[ + io.Conditioning.Output(tooltip="The generated Ace Step 1.5 conditioning for audio."), ], - outputs=[io.Conditioning.Output()], ) @classmethod diff --git a/nodes/conditioning_v3.py b/nodes/conditioning_v3.py index a321b34..91390e0 100644 --- a/nodes/conditioning_v3.py +++ b/nodes/conditioning_v3.py @@ -345,7 +345,7 @@ class Sage_CombineConditioning(io.ComfyNode): @classmethod def define_schema(cls): autogrow_template = io.Autogrow.TemplatePrefix( - input=io.Conditioning.Input("conditioning"), + input=io.Conditioning.Input("conditioning", tooltip="A conditioning input to combine."), prefix="conditioning_", min=2, max=100, @@ -356,7 +356,7 @@ class Sage_CombineConditioning(io.ComfyNode): description="Combines multiple conditionings into a single conditioning.", category=f"{SAGE_UTILS_CAT}/clip/conditioning", inputs=[ - io.DynamicCombo.Input("operation", display_name="operation", options=[ + io.DynamicCombo.Input("operation", display_name="operation", tooltip="Select how conditioning values should be scaled.", options=[ io.DynamicCombo.Option("none", []), io.DynamicCombo.Option("multiply", [ io.Float.Input(id="value", display_name="value", default=1.0, min=0.0, max=100.0, step=0.01, tooltip="Multiply by this value.") @@ -365,7 +365,7 @@ class Sage_CombineConditioning(io.ComfyNode): io.Float.Input(id="value", display_name="value", default=1.0, min=0.000001, max=100.0, step=0.01, tooltip="Divide by this value.") ]), ]), - io.Autogrow.Input("conditionings", template=autogrow_template), + io.Autogrow.Input("conditionings", template=autogrow_template, tooltip="Input value for conditionings."), ], outputs=[ io.Conditioning.Output(id="conditioning", display_name="conditioning"), @@ -404,7 +404,7 @@ class Sage_AverageConditioning(io.ComfyNode): @classmethod def define_schema(cls): autogrow_template = io.Autogrow.TemplatePrefix( - input=io.Conditioning.Input("conditioning"), + input=io.Conditioning.Input("conditioning", tooltip="A conditioning input to average."), prefix="conditioning_", min=2, max=100, @@ -416,7 +416,7 @@ class Sage_AverageConditioning(io.ComfyNode): category=f"{SAGE_UTILS_CAT}/clip/conditioning", enable_expand=True, inputs=[ - io.Autogrow.Input("conditionings", template=autogrow_template), + io.Autogrow.Input("conditionings", template=autogrow_template, tooltip="Input value for conditionings."), ], outputs=[ io.Conditioning.Output(id="conditioning", display_name="conditioning"), @@ -466,7 +466,7 @@ class Sage_CombineCLIPTextEncode(io.ComfyNode): @classmethod def define_schema(cls): autogrow_template = io.Autogrow.TemplatePrefix( - input=io.String.Input("text", force_input=True, multiline=True, dynamic_prompts=True), + input=io.String.Input("text", force_input=True, multiline=True, dynamic_prompts=True, tooltip="A dynamic text prompt input to encode."), prefix="text_", min=1, max=100, @@ -478,7 +478,7 @@ class Sage_CombineCLIPTextEncode(io.ComfyNode): category=f"{SAGE_UTILS_CAT}/clip/helpers", inputs=[ io.Clip.Input(id="clip", display_name="clip", tooltip="The CLIP model used for encoding the text."), - io.DynamicCombo.Input("operation", display_name="operation", options=[ + io.DynamicCombo.Input("operation", display_name="operation", tooltip="Choose whether to scale the combined text conditioning.", options=[ io.DynamicCombo.Option("none", []), io.DynamicCombo.Option("multiply", [ io.Float.Input(id="value", display_name="value", default=1.0, min=0.0, max=100.0, step=0.01, tooltip="Multiply by this value.") @@ -487,7 +487,7 @@ class Sage_CombineCLIPTextEncode(io.ComfyNode): io.Float.Input(id="value", display_name="value", default=1.0, min=0.000001, max=100.0, step=0.01, tooltip="Divide by this value.") ]), ]), - io.Autogrow.Input("texts", template=autogrow_template), + io.Autogrow.Input("texts", template=autogrow_template, tooltip="Input value for texts."), ], outputs=[ io.Conditioning.Output(id="conditioning", display_name="conditioning", tooltip="A conditioning containing all encoded text prompts combined."), @@ -539,7 +539,7 @@ class Sage_CombineCLIPMultilineTextEncode(io.ComfyNode): inputs=[ io.Clip.Input(id="clip", display_name="clip", tooltip="The CLIP model used for encoding the text."), io.Combo.Input(id="mode", display_name="mode", options=["combine", "average"], default="combine", tooltip="How to merge line conditionings."), - io.DynamicCombo.Input("operation", display_name="operation", options=[ + io.DynamicCombo.Input("operation", display_name="operation", tooltip="Choose whether to scale the per-line conditioning output.", options=[ io.DynamicCombo.Option("none", []), io.DynamicCombo.Option("multiply", [ io.Float.Input(id="value", display_name="value", default=1.0, min=0.0, max=100.0, step=0.01, tooltip="Multiply by this value.") @@ -624,7 +624,7 @@ class Sage_MultiplyConditioningStrength(io.ComfyNode): category=f"{SAGE_UTILS_CAT}/clip/conditioning", inputs=[ io.Conditioning.Input(id="conditioning", display_name="conditioning", tooltip="The conditioning to scale."), - io.DynamicCombo.Input("operation", display_name="operation", options=[ + io.DynamicCombo.Input("operation", display_name="operation", tooltip="Select how to adjust the conditioning strength.", options=[ io.DynamicCombo.Option("multiply", [ io.Float.Input(id="value", display_name="value", default=1.0, min=0.0, max=100.0, step=0.01, tooltip="Multiply by this value.") ]), diff --git a/nodes/image_v3.py b/nodes/image_v3.py index 9adfd94..da21a72 100644 --- a/nodes/image_v3.py +++ b/nodes/image_v3.py @@ -136,15 +136,15 @@ class Sage_EmptyLatentImagePassthrough(io.ComfyNode): description="Passes through an empty latent image.", category=f"{SAGE_UTILS_CAT}/image", inputs=[ - io.Int.Input("width", display_name="width", default=1024), - io.Int.Input("height", display_name="height", default=1024), - io.Int.Input("batch_size", display_name="batch_size", default=1), + io.Int.Input("width", display_name="width", default=1024, tooltip="The width of the empty latent image."), + io.Int.Input("height", display_name="height", default=1024, tooltip="The height of the empty latent image."), + io.Int.Input("batch_size", display_name="batch_size", default=1, tooltip="The number of latent images in the batch."), io.Combo.Input("type", display_name="type", default="4_channel", options=["4_channel", "16_channel", "radiance"], tooltip="The type of latent to create. 4_channel is for standard latent diffusion models, 16_channel is for SD3 models, and radiance is for Chroma Radiance models."), ], outputs=[ - io.Latent.Output("latent", display_name="latent"), - io.Int.Output("out_width", display_name="width"), - io.Int.Output("out_height", display_name="height"), + io.Latent.Output("latent", display_name="latent", tooltip="The generated empty latent image tensor."), + io.Int.Output("out_width", display_name="width", tooltip="The width of the output latent image."), + io.Int.Output("out_height", display_name="height", tooltip="The height of the output latent image."), ] ) @@ -311,13 +311,14 @@ class Sage_LoadImage(io.ComfyNode): is_output_node=True, inputs=[], outputs=[ - io.Image.Output("image", display_name="image"), - io.Image.Output("mask", display_name="mask"), - io.Int.Output("out_width", display_name="width"), - io.Int.Output("out_height", display_name="height"), - io.String.Output("metadata", display_name="metadata"), + io.Image.Output("image", display_name="image", tooltip="The loaded image."), + io.Image.Output("mask", display_name="mask", tooltip="The alpha or mask output for the loaded image, if available."), + io.Int.Output("out_width", display_name="width", tooltip="The width of the loaded image."), + io.Int.Output("out_height", display_name="height", tooltip="The height of the loaded image."), + io.String.Output("metadata", display_name="metadata", tooltip="Metadata extracted from the loaded image."), ] ) + schema.notes = "This note was added to test automatic documentation generation from schema metadata." schema.inputs.append( io.Combo.Input( "image_name", diff --git a/nodes/llm_v3.py b/nodes/llm_v3.py index e1feffd..ef68125 100644 --- a/nodes/llm_v3.py +++ b/nodes/llm_v3.py @@ -84,8 +84,8 @@ class Sage_ConstructLLMPrompt(io.ComfyNode): extra_inputs = [] schema_inputs: list[io.Input] = [ - io.Combo.Input("prompt", display_name="prompt", options=prompt_list), - io.String.Input("extra_instructions", display_name="extra_instructions", default="", multiline=True), + io.Combo.Input("prompt", display_name="prompt", options=prompt_list, tooltip="The base prompt template to construct."), + io.String.Input("extra_instructions", display_name="extra_instructions", default="", multiline=True, tooltip="Additional instructions to append to the generated prompt."), ] schema_inputs.extend(extra_inputs) return io.Schema( @@ -95,7 +95,7 @@ class Sage_ConstructLLMPrompt(io.ComfyNode): category=f"{SAGE_UTILS_CAT}/LLM", inputs=schema_inputs, outputs=[ - io.String.Output("out_prompt", display_name="prompt") + io.String.Output("out_prompt", display_name="prompt", tooltip="The constructed LLM prompt.") ] ) @@ -160,7 +160,7 @@ class Sage_ConstructLLMPromptExtra(io.ComfyNode): extra_inputs = [] schema_inputs: list[io.Input] = [ - io.String.Input("extra_instructions", display_name="extra_instructions", default="", multiline=True), + io.String.Input("extra_instructions", display_name="extra_instructions", default="", multiline=True, tooltip="Extra instruction text to include with the prompt."), ] schema_inputs.extend(extra_inputs) return io.Schema( @@ -170,7 +170,7 @@ class Sage_ConstructLLMPromptExtra(io.ComfyNode): category=f"{SAGE_UTILS_CAT}/LLM", inputs=schema_inputs, outputs=[ - io.String.Output("extra", display_name="extra") + io.String.Output("extra", display_name="extra", tooltip="The generated extra instructions for the LLM.") ] ) @@ -207,10 +207,10 @@ class Sage_LLMPromptText(io.ComfyNode): openai_models = ["(OpenAI not available)"] native_inputs = [ - io.Clip.Input("native_clip", display_name="model"), - io.Int.Input("native_max_length", display_name="max_length", default=256, min=1, max=16384), + io.Clip.Input("native_clip", display_name="model", tooltip="The native CLIP model used for local LLM generation."), + io.Int.Input("native_max_length", display_name="max_length", default=256, min=1, max=16384, tooltip="Maximum sequence length for native generation."), io.Boolean.Input("native_thinking", display_name="thinking", default=False, optional=True, tooltip="Enable model thinking mode if supported by the loaded CLIP model."), - io.DynamicCombo.Input("native_sampling", display_name="sampling", options=[ + io.DynamicCombo.Input("native_sampling", display_name="sampling", tooltip="Choose native sampling settings for the local model.", options=[ io.DynamicCombo.Option("Default", []), io.DynamicCombo.Option("Advanced", [ io.Boolean.Input("native_do_sample", display_name="do_sample", default=True, tooltip="Disable for deterministic greedy decoding."), @@ -228,7 +228,7 @@ class Sage_LLMPromptText(io.ComfyNode): io.DynamicCombo.Option( "LM Studio", [ - io.Combo.Input("lmstudio_rest_model", display_name="model", options=sorted(lmstudio_rest_models)), + io.Combo.Input("lmstudio_rest_model", display_name="model", options=sorted(lmstudio_rest_models), tooltip="Input value for lmstudio_rest_model."), io.Int.Input("lmstudio_rest_load_for_seconds", display_name="load_for_seconds", default=0, min=-1, max=60 * 60, step=1, advanced=True, tooltip="Compatibility field for LM Studio REST model load duration."), io.String.Input("lmstudio_rest_system_prompt", display_name="system_prompt", default="", multiline=True, optional=True, advanced=True, tooltip="Optional system instruction prepended as model context."), ], @@ -236,7 +236,7 @@ class Sage_LLMPromptText(io.ComfyNode): io.DynamicCombo.Option( "Ollama", [ - io.Combo.Input("ollama_rest_model", display_name="model", options=sorted(ollama_rest_models)), + io.Combo.Input("ollama_rest_model", display_name="model", options=sorted(ollama_rest_models), tooltip="Input value for ollama_rest_model."), io.String.Input("ollama_rest_keep_alive", display_name="keep_alive", default="5m", advanced=True, tooltip="How long to keep the model loaded after generation (Ollama duration string)."), OllamaOptions.Input("ollama_rest_options", display_name="options", optional=True, advanced=True, tooltip="Optional low-level Ollama generation parameters."), io.String.Input("ollama_rest_system_prompt", display_name="system_prompt", default="", multiline=True, optional=True, advanced=True, tooltip="Optional system instruction prepended as model context."), @@ -245,10 +245,10 @@ class Sage_LLMPromptText(io.ComfyNode): io.DynamicCombo.Option( "OpenAI", [ - io.Combo.Input("openai_model", display_name="model", options=sorted(openai_models)), + io.Combo.Input("openai_model", display_name="model", options=sorted(openai_models), tooltip="Input value for openai_model."), io.String.Input("openai_system_prompt", display_name="system_prompt", default="", multiline=True, optional=True, advanced=True, tooltip="Optional system instruction prepended as model context."), - io.Float.Input("openai_temperature", display_name="temperature", default=0.7, min=0.0, max=2.0, step=0.01, advanced=True), - io.Int.Input("openai_max_tokens", display_name="max_tokens", default=4096, min=1, max=16384, step=1, advanced=True), + io.Float.Input("openai_temperature", display_name="temperature", default=0.7, min=0.0, max=2.0, step=0.01, advanced=True, tooltip="Input value for openai_temperature."), + io.Int.Input("openai_max_tokens", display_name="max_tokens", default=4096, min=1, max=16384, step=1, advanced=True, tooltip="Input value for openai_max_tokens."), ], ), io.DynamicCombo.Option("Native", native_inputs), @@ -260,12 +260,12 @@ class Sage_LLMPromptText(io.ComfyNode): description="Unified provider-switching text generation node for REST/OpenAI and Native CLIP.", category=f"{SAGE_UTILS_CAT}/LLM", inputs=[ - io.String.Input("prompt", display_name="prompt", default=DEFAULT_TEXT_PROMPT, multiline=True), + io.String.Input("prompt", display_name="prompt", default=DEFAULT_TEXT_PROMPT, multiline=True, tooltip="The text prompt sent to the selected LLM provider."), io.DynamicCombo.Input("provider", display_name="provider", options=provider_options, tooltip="Pick the backend provider and its model/runtime settings."), io.Int.Input("seed", display_name="seed", default=0, min=0, max=2**32 - 1, step=1, tooltip="Base seed used by all providers (provider-specific behavior may vary)."), ], outputs=[ - io.String.Output("response", display_name="response") + io.String.Output("response", display_name="response", tooltip="The text response returned by the selected provider.") ] ) @@ -367,10 +367,10 @@ class Sage_LLMPromptVision(io.ComfyNode): openai_models = ["(No OpenAI vision models available)"] native_inputs = [ - io.Clip.Input("native_clip", display_name="model"), - io.Int.Input("native_max_length", display_name="max_length", default=256, min=1, max=16384), + io.Clip.Input("native_clip", display_name="model", tooltip="The native CLIP model used for local LLM generation."), + io.Int.Input("native_max_length", display_name="max_length", default=256, min=1, max=16384, tooltip="Maximum sequence length for native generation."), io.Boolean.Input("native_thinking", display_name="thinking", default=False, optional=True, tooltip="Enable model thinking mode if supported by the loaded CLIP model."), - io.DynamicCombo.Input("native_sampling", display_name="sampling", options=[ + io.DynamicCombo.Input("native_sampling", display_name="sampling", tooltip="Choose native sampling settings for the local model.", options=[ io.DynamicCombo.Option("Default", []), io.DynamicCombo.Option("Advanced", [ io.Boolean.Input("native_do_sample", display_name="do_sample", default=True, tooltip="Disable for deterministic greedy decoding."), @@ -388,7 +388,7 @@ class Sage_LLMPromptVision(io.ComfyNode): io.DynamicCombo.Option( "LM Studio", [ - io.Combo.Input("lmstudio_rest_model", display_name="model", options=sorted(lmstudio_rest_models)), + io.Combo.Input("lmstudio_rest_model", display_name="model", options=sorted(lmstudio_rest_models), tooltip="Input value for lmstudio_rest_model."), io.Int.Input("lmstudio_rest_load_for_seconds", display_name="load_for_seconds", default=0, min=-1, max=60 * 60, step=1, advanced=True, tooltip="Compatibility field for LM Studio REST model load duration."), io.String.Input("lmstudio_rest_system_prompt", display_name="system_prompt", default="", multiline=True, optional=True, advanced=True, tooltip="Optional system instruction prepended as model context."), ], @@ -396,7 +396,7 @@ class Sage_LLMPromptVision(io.ComfyNode): io.DynamicCombo.Option( "Ollama", [ - io.Combo.Input("ollama_rest_model", display_name="model", options=sorted(ollama_rest_models)), + io.Combo.Input("ollama_rest_model", display_name="model", options=sorted(ollama_rest_models), tooltip="Input value for ollama_rest_model."), io.String.Input("ollama_rest_keep_alive", display_name="keep_alive", default="5m", advanced=True, tooltip="How long to keep the model loaded after generation (Ollama duration string)."), OllamaOptions.Input("ollama_rest_options", display_name="options", optional=True, advanced=True, tooltip="Optional low-level Ollama generation parameters."), io.String.Input("ollama_rest_system_prompt", display_name="system_prompt", default="", multiline=True, optional=True, advanced=True, tooltip="Optional system instruction prepended as model context."), @@ -405,10 +405,10 @@ class Sage_LLMPromptVision(io.ComfyNode): io.DynamicCombo.Option( "OpenAI", [ - io.Combo.Input("openai_model", display_name="model", options=sorted(openai_models)), + io.Combo.Input("openai_model", display_name="model", options=sorted(openai_models), tooltip="Input value for openai_model."), io.String.Input("openai_system_prompt", display_name="system_prompt", default="", multiline=True, optional=True, advanced=True, tooltip="Optional system instruction prepended as model context."), - io.Float.Input("openai_temperature", display_name="temperature", default=0.7, min=0.0, max=2.0, step=0.01, advanced=True), - io.Int.Input("openai_max_tokens", display_name="max_tokens", default=1024, min=1, max=16384, step=1, advanced=True), + io.Float.Input("openai_temperature", display_name="temperature", default=0.7, min=0.0, max=2.0, step=0.01, advanced=True, tooltip="Input value for openai_temperature."), + io.Int.Input("openai_max_tokens", display_name="max_tokens", default=1024, min=1, max=16384, step=1, advanced=True, tooltip="Input value for openai_max_tokens."), ], ), io.DynamicCombo.Option("Native", native_inputs), @@ -420,13 +420,13 @@ class Sage_LLMPromptVision(io.ComfyNode): description="Unified provider-switching vision generation node for REST/OpenAI and Native CLIP.", category=f"{SAGE_UTILS_CAT}/LLM", inputs=[ - io.String.Input("prompt", display_name="prompt", default=DEFAULT_VISION_PROMPT, multiline=True), - io.Image.Input("image", display_name="image"), + io.String.Input("prompt", display_name="prompt", default=DEFAULT_VISION_PROMPT, multiline=True, tooltip="The text prompt for vision-capable LLM providers."), + io.Image.Input("image", display_name="image", tooltip="The reference image sent to the vision provider."), io.DynamicCombo.Input("provider", display_name="provider", options=provider_options, tooltip="Pick the backend provider and its model/runtime settings."), io.Int.Input("seed", display_name="seed", default=0, min=0, max=2**32 - 1, step=1, tooltip="Base seed used by all providers (provider-specific behavior may vary)."), ], outputs=[ - io.String.Output("response", display_name="response") + io.String.Output("response", display_name="response", tooltip="The text response returned by the selected vision provider.") ] ) @@ -550,11 +550,11 @@ class Sage_LLMPromptVisionRefine(io.ComfyNode): openai_refine_models = ["(OpenAI not available)"] native_inputs = [ - io.Clip.Input("native_clip", display_name="model"), + io.Clip.Input("native_clip", display_name="model", tooltip="Input value for native_clip."), io.Clip.Input("native_refine_clip", display_name="refine_model", optional=True, advanced=True, tooltip="Optional second CLIP model used only for the refine pass."), - io.Int.Input("native_max_length", display_name="max_length", default=256, min=1, max=16384), + io.Int.Input("native_max_length", display_name="max_length", default=256, min=1, max=16384, tooltip="Input value for native_max_length."), io.Boolean.Input("native_thinking", display_name="thinking", default=False, optional=True, tooltip="Enable model thinking mode if supported by the loaded CLIP model."), - io.DynamicCombo.Input("native_sampling", display_name="sampling", options=[ + io.DynamicCombo.Input("native_sampling", display_name="sampling", tooltip="Choose native sampling settings for the local model.", options=[ io.DynamicCombo.Option("Default", []), io.DynamicCombo.Option("Advanced", [ io.Boolean.Input("native_do_sample", display_name="do_sample", default=True, tooltip="Disable for deterministic greedy decoding."), @@ -572,29 +572,29 @@ class Sage_LLMPromptVisionRefine(io.ComfyNode): io.DynamicCombo.Option( "LM Studio", [ - io.Combo.Input("lmstudio_rest_model", display_name="model", options=sorted(lmstudio_rest_models)), - io.Combo.Input("lmstudio_rest_refine_model", display_name="refine_model", options=sorted(lmstudio_rest_refine_models)), - io.String.Input("lmstudio_rest_system_prompt", display_name="system_prompt", default="", multiline=True, optional=True, advanced=True), + io.Combo.Input("lmstudio_rest_model", display_name="model", options=sorted(lmstudio_rest_models), tooltip="Input value for lmstudio_rest_model."), + io.Combo.Input("lmstudio_rest_refine_model", display_name="refine_model", options=sorted(lmstudio_rest_refine_models), tooltip="Input value for lmstudio_rest_refine_model."), + io.String.Input("lmstudio_rest_system_prompt", display_name="system_prompt", default="", multiline=True, optional=True, advanced=True, tooltip="Input value for lmstudio_rest_system_prompt."), ], ), io.DynamicCombo.Option( "Ollama", [ - io.Combo.Input("ollama_rest_model", display_name="model", options=sorted(ollama_rest_models)), - io.Combo.Input("ollama_rest_refine_model", display_name="refine_model", options=sorted(ollama_rest_refine_models)), - io.String.Input("ollama_rest_keep_alive", display_name="keep_alive", default="5m", advanced=True), + io.Combo.Input("ollama_rest_model", display_name="model", options=sorted(ollama_rest_models), tooltip="Input value for ollama_rest_model."), + io.Combo.Input("ollama_rest_refine_model", display_name="refine_model", options=sorted(ollama_rest_refine_models), tooltip="Input value for ollama_rest_refine_model."), + io.String.Input("ollama_rest_keep_alive", display_name="keep_alive", default="5m", advanced=True, tooltip="Input value for ollama_rest_keep_alive."), OllamaOptions.Input("ollama_rest_options", display_name="options", optional=True, advanced=True), - io.String.Input("ollama_rest_system_prompt", display_name="system_prompt", default="", multiline=True, optional=True, advanced=True), + io.String.Input("ollama_rest_system_prompt", display_name="system_prompt", default="", multiline=True, optional=True, advanced=True, tooltip="Input value for ollama_rest_system_prompt."), ], ), io.DynamicCombo.Option( "OpenAI", [ - io.Combo.Input("openai_model", display_name="model", options=sorted(openai_models)), - io.Combo.Input("openai_refine_model", display_name="refine_model", options=sorted(openai_refine_models)), - io.String.Input("openai_system_prompt", display_name="system_prompt", default="", multiline=True, optional=True, advanced=True), - io.Float.Input("openai_temperature", display_name="temperature", default=0.7, min=0.0, max=2.0, step=0.01, advanced=True), - io.Int.Input("openai_max_tokens", display_name="max_tokens", default=4096, min=1, max=16384, step=1, advanced=True), + io.Combo.Input("openai_model", display_name="model", options=sorted(openai_models), tooltip="Input value for openai_model."), + io.Combo.Input("openai_refine_model", display_name="refine_model", options=sorted(openai_refine_models), tooltip="Input value for openai_refine_model."), + io.String.Input("openai_system_prompt", display_name="system_prompt", default="", multiline=True, optional=True, advanced=True, tooltip="Input value for openai_system_prompt."), + io.Float.Input("openai_temperature", display_name="temperature", default=0.7, min=0.0, max=2.0, step=0.01, advanced=True, tooltip="Input value for openai_temperature."), + io.Int.Input("openai_max_tokens", display_name="max_tokens", default=4096, min=1, max=16384, step=1, advanced=True, tooltip="Input value for openai_max_tokens."), ], ), io.DynamicCombo.Option("Native", native_inputs), @@ -606,16 +606,16 @@ class Sage_LLMPromptVisionRefine(io.ComfyNode): description="Unified provider-switching vision-refine node that outputs both initial and refined responses.", category=f"{SAGE_UTILS_CAT}/LLM", inputs=[ - io.String.Input("prompt", display_name="prompt", default=DEFAULT_VISION_PROMPT, multiline=True), - io.Image.Input("image", display_name="image"), + io.String.Input("prompt", display_name="prompt", default=DEFAULT_VISION_PROMPT, multiline=True, tooltip="The text prompt for the initial vision generation pass."), + io.Image.Input("image", display_name="image", tooltip="The reference image sent to the vision provider."), io.Int.Input("seed", display_name="seed", default=0, min=0, max=2**32 - 1, step=1, tooltip="Seed for the initial generation pass."), io.String.Input("refine_prompt", display_name="refine_prompt", default="Take the provided text description and rewrite it to be more vivid, detailed, and engaging, while preserving the original meaning.", multiline=True, tooltip="Instructions used for the second (refinement) pass."), io.Int.Input("refine_seed", display_name="refine_seed", default=0, min=0, max=2**32 - 1, step=1, tooltip="Seed for the refinement pass."), io.DynamicCombo.Input("provider", display_name="provider", options=provider_options, tooltip="Pick the backend provider and its model/runtime settings."), ], outputs=[ - io.String.Output("initial_response", display_name="initial_response"), - io.String.Output("refined_response", display_name="refined_response"), + io.String.Output("initial_response", display_name="initial_response", tooltip="The initial response generated by the vision provider."), + io.String.Output("refined_response", display_name="refined_response", tooltip="The refined response generated during the second pass."), ] ) @@ -901,4 +901,4 @@ LLM_NODES = [ Sage_LLMPromptText, Sage_LLMPromptVision, Sage_LLMPromptVisionRefine, -] \ No newline at end of file +] diff --git a/nodes/lmstudio_v3.py b/nodes/lmstudio_v3.py index 786b789..34f094d 100644 --- a/nodes/lmstudio_v3.py +++ b/nodes/lmstudio_v3.py @@ -48,13 +48,13 @@ class Sage_LMStudioLLMPromptText(io.ComfyNode): description="Provider-specific text generation node for LM Studio models.", category=f"{SAGE_UTILS_CAT}/LLM/LM Studio", inputs=[ - io.String.Input("prompt", display_name="prompt", default=DEFAULT_TEXT_PROMPT, multiline=True), - io.Combo.Input("model", display_name="model", options=sorted(models)), - io.Int.Input("seed", display_name="seed", default=0, min=0, max=2**32 - 1, step=1), - io.Int.Input("load_for_seconds", display_name="load_for_seconds", default=0, min=-1, max=60*60, step=1) + io.String.Input("prompt", display_name="prompt", default=DEFAULT_TEXT_PROMPT, multiline=True, tooltip="Input value for prompt."), + io.Combo.Input("model", display_name="model", options=sorted(models), tooltip="Input value for model."), + io.Int.Input("seed", display_name="seed", default=0, min=0, max=2**32 - 1, step=1, tooltip="Input value for seed."), + io.Int.Input("load_for_seconds", display_name="load_for_seconds", default=0, min=-1, max=60*60, step=1, tooltip="Input value for load_for_seconds.") ], outputs=[ - io.String.Output("response", display_name="response") + io.String.Output("response", display_name="response", tooltip="Output value for response.") ] ) @@ -108,14 +108,14 @@ class Sage_LMStudioLLMPromptVision(io.ComfyNode): description="Provider-specific vision generation node for LM Studio models.", category=f"{SAGE_UTILS_CAT}/LLM/LM Studio", inputs=[ - io.String.Input("prompt", display_name="prompt", default=DEFAULT_VISION_PROMPT, multiline=True), - io.Combo.Input("model", display_name="model", options=sorted(models)), - io.Image.Input("image", display_name="image"), - io.Int.Input("seed", display_name="seed", default=0, min=0, max=2**32 - 1, step=1), - io.Int.Input("load_for_seconds", display_name="load_for_seconds", default=0, min=-1, max=60*60, step=1) + io.String.Input("prompt", display_name="prompt", default=DEFAULT_VISION_PROMPT, multiline=True, tooltip="Input value for prompt."), + io.Combo.Input("model", display_name="model", options=sorted(models), tooltip="Input value for model."), + io.Image.Input("image", display_name="image", tooltip="Input value for image."), + io.Int.Input("seed", display_name="seed", default=0, min=0, max=2**32 - 1, step=1, tooltip="Input value for seed."), + io.Int.Input("load_for_seconds", display_name="load_for_seconds", default=0, min=-1, max=60*60, step=1, tooltip="Input value for load_for_seconds.") ], outputs=[ - io.String.Output("response", display_name="response") + io.String.Output("response", display_name="response", tooltip="Output value for response.") ] ) @@ -174,17 +174,17 @@ class Sage_LMStudioLLMPromptVisionRefine(io.ComfyNode): description="Provider-specific vision-refine node for LM Studio models.", category=f"{SAGE_UTILS_CAT}/LLM/LM Studio", inputs=[ - io.String.Input("prompt", default=DEFAULT_VISION_PROMPT, multiline=True), - io.Combo.Input("model", options=sorted(models)), - io.Image.Input("image"), - io.Int.Input("seed", default=0, min=0, max=2**32 - 1, step=1), - io.String.Input("refine_prompt", default="Take the provided text description and rewrite it to be more vivid, detailed, and engaging, while preserving the original meaning.", multiline=True), - io.Combo.Input("refine_model", options=sorted(refine_models)), - io.Int.Input("refine_seed", default=0, min=0, max=2**32 - 1, step=1) + io.String.Input("prompt", default=DEFAULT_VISION_PROMPT, multiline=True, tooltip="The text prompt for the initial vision generation pass."), + io.Combo.Input("model", options=sorted(models), tooltip="The LM Studio vision model used for initial generation."), + io.Image.Input("image", tooltip="The reference image sent to the LM Studio vision model."), + io.Int.Input("seed", default=0, min=0, max=2**32 - 1, step=1, tooltip="Seed for the initial generation pass."), + io.String.Input("refine_prompt", default="Take the provided text description and rewrite it to be more vivid, detailed, and engaging, while preserving the original meaning.", multiline=True, tooltip="Instructions used for the second, refinement pass."), + io.Combo.Input("refine_model", options=sorted(refine_models), tooltip="The LM Studio model used for the refinement pass."), + io.Int.Input("refine_seed", default=0, min=0, max=2**32 - 1, step=1, tooltip="Seed for the refinement pass."), ], outputs=[ - io.String.Output("initial_response"), - io.String.Output("refined_response") + io.String.Output("initial_response", tooltip="The initial vision response returned by the LM Studio model."), + io.String.Output("refined_response", tooltip="The refined vision response returned by the second pass."), ] ) diff --git a/nodes/loader_v3.py b/nodes/loader_v3.py index 7e17ebe..104f700 100644 --- a/nodes/loader_v3.py +++ b/nodes/loader_v3.py @@ -47,9 +47,9 @@ class Sage_LoadModelFromInfo(io.ComfyNode): ModelShiftInfo.Input("model_shifts", display_name="model_shifts", optional=True) ], outputs=[ - io.Model.Output("model", display_name="model"), - io.Clip.Output("clip", display_name="clip"), - io.Vae.Output("vae", display_name="vae") + io.Model.Output("model", display_name="model", tooltip="The loaded UNet model component."), + io.Clip.Output("clip", display_name="clip", tooltip="The loaded CLIP model component."), + io.Vae.Output("vae", display_name="vae", tooltip="The loaded VAE model component."), ] ) @@ -152,7 +152,7 @@ class Sage_ChromaCLIPLoaderFromInfo(io.ComfyNode): ClipInfo.Input("clip_info", display_name="clip_info") ], outputs=[ - io.Clip.Output("clip") + io.Clip.Output("clip", tooltip="The loaded CLIP model component with Chroma T5 tokenizer options applied.") ] ) @@ -217,15 +217,15 @@ class Sage_LoraStackLoader(io.ComfyNode): enable_expand=True, inputs=[ io.Model.Input("model", display_name="model"), - io.Clip.Input("clip", display_name="clip"), + io.Clip.Input("clip", display_name="clip", tooltip="Input value for clip."), LoraStack.Input("lora_stack", display_name="lora_stack", optional=True), ModelShiftInfo.Input("model_shifts", display_name="model_shifts", optional=True) ], outputs=[ io.Model.Output("out_model", display_name="model"), io.Clip.Output("out_clip", display_name="clip"), - LoraStack.Output("out_lora_stack", display_name="lora_stack"), - io.String.Output("keywords", display_name="keywords") + LoraStack.Output("out_lora_stack", display_name="lora_stack", tooltip="Output value for out_lora_stack."), + io.String.Output("keywords", display_name="keywords", tooltip="Output value for keywords.") ] ) @@ -272,8 +272,8 @@ class Sage_ModelLoraStackLoader(io.ComfyNode): io.Model.Output("model", display_name="model"), io.Clip.Output("clip", display_name="clip"), io.Vae.Output("vae", display_name="vae"), - LoraStack.Output("out_lora_stack", display_name="lora_stack"), - io.String.Output("keywords", display_name="keywords") + LoraStack.Output("out_lora_stack", display_name="lora_stack", tooltip="Output value for out_lora_stack."), + io.String.Output("keywords", display_name="keywords", tooltip="Output value for keywords.") ] ) @@ -318,8 +318,8 @@ class Sage_UNETLoRALoader(io.ComfyNode): ], outputs=[ io.Model.Output("out_model", display_name="model"), - LoraStack.Output("out_lora_stack", display_name="lora_stack"), - io.String.Output("keywords", display_name="keywords") + LoraStack.Output("out_lora_stack", display_name="lora_stack", tooltip="Output value for out_lora_stack."), + io.String.Output("keywords", display_name="keywords", tooltip="Output value for keywords.") ] ) @@ -365,4 +365,4 @@ MODEL_NODES = [ Sage_CLIPLoaderFromInfo, Sage_ChromaCLIPLoaderFromInfo, Sage_VAELoaderFromInfo -] \ No newline at end of file +] diff --git a/nodes/metadata_v3.py b/nodes/metadata_v3.py index 565e36c..43896be 100644 --- a/nodes/metadata_v3.py +++ b/nodes/metadata_v3.py @@ -49,19 +49,19 @@ class Sage_ConstructMetadataFlexible(io.ComfyNode): description="Flexible metadata constructor supporting multiple styles: A1111 Full (with LoRA hashes), A1111 Lite (simplified, only includes models on Civitai), Simple (No models or LoRAs) as well as any others defined in metadata_templates.", category=f"{SAGE_UTILS_CAT}/metadata", inputs=[ - ModelInfo.Input("model_info", display_name="model_info"), - io.String.Input("positive_string", display_name="positive_string", default=""), - io.String.Input("negative_string", display_name="negative_string", default=""), - SamplerInfo.Input("sampler_info", display_name="sampler_info"), - io.Int.Input("width", display_name="width", default=1024), - io.Int.Input("height", display_name="height", default=1024), + ModelInfo.Input("model_info", display_name="model_info", tooltip="Model info used to build metadata, such as checkpoint and model details."), + io.String.Input("positive_string", display_name="positive_string", default="", tooltip="The positive prompt text to include in metadata."), + io.String.Input("negative_string", display_name="negative_string", default="", tooltip="The negative prompt text to include in metadata."), + SamplerInfo.Input("sampler_info", display_name="sampler_info", tooltip="Sampler settings used to generate the image."), + io.Int.Input("width", display_name="width", default=1024, tooltip="Image width used in metadata."), + io.Int.Input("height", display_name="height", default=1024, tooltip="Image height used in metadata."), io.Combo.Input("metadata_style", display_name="metadata_style", options=list(metadata_templates.keys()), - default="A1111 Full"), - LoraStack.Input("lora_stack", display_name="lora_stack", optional=True) + default="A1111 Full", tooltip="The metadata style format to produce."), + LoraStack.Input("lora_stack", display_name="lora_stack", optional=True, tooltip="Optional LoRA stack information to include in metadata."), ], outputs=[ - io.String.Output("param_metadata", display_name="param_metadata") + io.String.Output("param_metadata", display_name="param_metadata", tooltip="The generated metadata string." ) ] ) return schema @@ -325,32 +325,32 @@ class Sage_ParseMetadataFlexible(io.ComfyNode): description="Parses A1111 Full format metadata string and extracts individual components. Returns parsed values for positive prompt, negative prompt, sampler info (sampler, scheduler, cfg, steps, seed), dimensions (width, height), and attempts to find models and LoRAs by hash in the local cache.", category=f"{SAGE_UTILS_CAT}/metadata", inputs=[ - io.String.Input("metadata_string", display_name="metadata_string", multiline=True), - io.Int.Input("default_seed", display_name="default_seed", default=0, optional=True), - io.Int.Input("default_steps", display_name="default_steps", default=20, min=1, max=10000, optional=True), - io.Float.Input("default_cfg", display_name="default_cfg", default=7.0, min=0.0, max=100.0, step=0.1, optional=True), + io.String.Input("metadata_string", display_name="metadata_string", multiline=True, tooltip="The metadata string to parse."), + io.Int.Input("default_seed", display_name="default_seed", default=0, optional=True, tooltip="Default seed used when the metadata does not specify one."), + io.Int.Input("default_steps", display_name="default_steps", default=20, min=1, max=10000, optional=True, tooltip="Default steps used when the metadata does not specify them."), + io.Float.Input("default_cfg", display_name="default_cfg", default=7.0, min=0.0, max=100.0, step=0.1, optional=True, tooltip="Default CFG scale used when the metadata does not specify it."), io.Combo.Input("default_sampler", display_name="default_sampler", options=comfy.samplers.SAMPLER_NAMES, - default="euler", optional=True), + default="euler", optional=True, tooltip="Default sampler to use when the metadata string does not specify one."), io.Combo.Input("default_scheduler", display_name="default_scheduler", options=comfy.samplers.SCHEDULER_NAMES, - default="normal", optional=True), - io.Int.Input("default_width", display_name="default_width", default=1024, min=0, optional=True), - io.Int.Input("default_height", display_name="default_height", default=1024, min=0, optional=True), - ModelInfo.Input("default_model_info", display_name="default_model_info", optional=True), + default="normal", optional=True, tooltip="Default scheduler to use when the metadata string does not specify one."), + io.Int.Input("default_width", display_name="default_width", default=1024, min=0, optional=True, tooltip="Default width used when the metadata does not specify dimensions."), + io.Int.Input("default_height", display_name="default_height", default=1024, min=0, optional=True, tooltip="Default height used when the metadata does not specify dimensions."), + ModelInfo.Input("default_model_info", display_name="default_model_info", optional=True, tooltip="Default model info used when the metadata string does not identify a model."), ], outputs=[ - io.String.Output("positive_string", display_name="positive_string"), - io.String.Output("negative_string", display_name="negative_string"), - io.Int.Output("seed", display_name="seed"), - io.Int.Output("steps", display_name="steps"), - io.Float.Output("cfg", display_name="cfg"), - io.Combo.Output("sampler_name", display_name="sampler_name"), - io.Combo.Output("scheduler", display_name="scheduler"), - io.Int.Output("width", display_name="width"), - io.Int.Output("height", display_name="height"), - ModelInfo.Output("model_info", display_name="model_info"), - LoraStack.Output("lora_stack", display_name="lora_stack"), + io.String.Output("positive_string", display_name="positive_string", tooltip="Extracted positive prompt string."), + io.String.Output("negative_string", display_name="negative_string", tooltip="Extracted negative prompt string."), + io.Int.Output("seed", display_name="seed", tooltip="Extracted seed value."), + io.Int.Output("steps", display_name="steps", tooltip="Extracted number of steps."), + io.Float.Output("cfg", display_name="cfg", tooltip="Extracted CFG scale."), + io.Combo.Output("sampler_name", display_name="sampler_name", tooltip="Extracted sampler name."), + io.Combo.Output("scheduler", display_name="scheduler", tooltip="Extracted scheduler name."), + io.Int.Output("width", display_name="width", tooltip="Extracted image width."), + io.Int.Output("height", display_name="height", tooltip="Extracted image height."), + ModelInfo.Output("model_info", display_name="model_info", tooltip="Extracted default model info from metadata, if available."), + LoraStack.Output("lora_stack", display_name="lora_stack", tooltip="Extracted LoRA stack information from the metadata.") ] ) return schema diff --git a/nodes/ollama_v3.py b/nodes/ollama_v3.py index 8c3bfd8..ea6d0d7 100644 --- a/nodes/ollama_v3.py +++ b/nodes/ollama_v3.py @@ -57,15 +57,15 @@ class Sage_OllamaAdvancedOptions(io.ComfyNode): description="Get advanced options for LLMs.", category=f"{SAGE_UTILS_CAT}/LLM/Ollama", inputs=[ - io.Int.Input("num_keep", display_name="num_keep", default=0, min=0, max=100, step=1), - io.Int.Input("num_predict", display_name="num_predict", default=-1, min=-1, max=16384, step=1), - io.Int.Input("top_k", display_name="top_k", default=40, min=1, max=1000, step=1), - io.Float.Input("top_p", display_name="top_p", default=0.9, min=0.0, max=1.0, step=0.01), - io.Int.Input("repeat_last_n", display_name="repeat_last_n", default=64, min=0, max=256, step=1), - io.Float.Input("temperature", display_name="temperature", default=0.8, min=0.0, max=1.0, step=0.01), - io.Float.Input("repeat_penalty", display_name="repeat_penalty", default=1.1, min=1.0, max=2.0, step=0.01), - io.Float.Input("presence_penalty", display_name="presence_penalty", default=0.0, min=-2.0, max=2.0, step=0.01), - io.Float.Input("frequency_penalty", display_name="frequency_penalty", default=0.0, min=-2.0, max=2.0, step=0.01) + io.Int.Input("num_keep", display_name="num_keep", default=0, min=0, max=100, step=1, tooltip="Input value for num_keep."), + io.Int.Input("num_predict", display_name="num_predict", default=-1, min=-1, max=16384, step=1, tooltip="Input value for num_predict."), + io.Int.Input("top_k", display_name="top_k", default=40, min=1, max=1000, step=1, tooltip="Input value for top_k."), + io.Float.Input("top_p", display_name="top_p", default=0.9, min=0.0, max=1.0, step=0.01, tooltip="Input value for top_p."), + io.Int.Input("repeat_last_n", display_name="repeat_last_n", default=64, min=0, max=256, step=1, tooltip="Input value for repeat_last_n."), + io.Float.Input("temperature", display_name="temperature", default=0.8, min=0.0, max=1.0, step=0.01, tooltip="Input value for temperature."), + io.Float.Input("repeat_penalty", display_name="repeat_penalty", default=1.1, min=1.0, max=2.0, step=0.01, tooltip="Input value for repeat_penalty."), + io.Float.Input("presence_penalty", display_name="presence_penalty", default=0.0, min=-2.0, max=2.0, step=0.01, tooltip="Input value for presence_penalty."), + io.Float.Input("frequency_penalty", display_name="frequency_penalty", default=0.0, min=-2.0, max=2.0, step=0.01, tooltip="Input value for frequency_penalty.") ], outputs=[ OllamaOptions.Output("options", display_name="options") @@ -91,15 +91,15 @@ class Sage_OllamaLLMPromptText(io.ComfyNode): description="Provider-specific text generation node for Ollama models.", category=f"{SAGE_UTILS_CAT}/LLM/Ollama", inputs=[ - io.String.Input("prompt", display_name="prompt", default=DEFAULT_TEXT_PROMPT, multiline=True), - io.Combo.Input("model", display_name="model", options=sorted(models)), - io.Int.Input("seed", display_name="seed", default=0, min=0, max=2**32 - 1, step=1), - io.Float.Input("keep_alive", display_name="keep_alive", default=0.0, min=-1.0, max=60.0 * 60.0, step=1), + io.String.Input("prompt", display_name="prompt", default=DEFAULT_TEXT_PROMPT, multiline=True, tooltip="Input value for prompt."), + io.Combo.Input("model", display_name="model", options=sorted(models), tooltip="Input value for model."), + io.Int.Input("seed", display_name="seed", default=0, min=0, max=2**32 - 1, step=1, tooltip="Input value for seed."), + io.Float.Input("keep_alive", display_name="keep_alive", default=0.0, min=-1.0, max=60.0 * 60.0, step=1, tooltip="Input value for keep_alive."), OllamaOptions.Input("options", display_name="options", optional=True), - io.String.Input("system_prompt", display_name="system_prompt", default="", multiline=True, optional=True) + io.String.Input("system_prompt", display_name="system_prompt", default="", multiline=True, optional=True, tooltip="Input value for system_prompt.") ], outputs=[ - io.String.Output("response", display_name="response") + io.String.Output("response", display_name="response", tooltip="Output value for response.") ] ) @@ -150,16 +150,16 @@ class Sage_OllamaLLMPromptVision(io.ComfyNode): description="Provider-specific vision generation node for Ollama models.", category=f"{SAGE_UTILS_CAT}/LLM/Ollama", inputs=[ - io.String.Input("prompt", display_name="prompt", default=DEFAULT_VISION_PROMPT, multiline=True), - io.Combo.Input("model", display_name="model", options=sorted(models)), - io.Image.Input("image", display_name="image"), - io.Int.Input("seed", display_name="seed", default=0, min=0, max=2**32 - 1, step=1), - io.Float.Input("keep_alive", display_name="keep_alive", default=0.0, min=-1.0, max=60.0 * 60.0, step=0.1), + io.String.Input("prompt", display_name="prompt", default=DEFAULT_VISION_PROMPT, multiline=True, tooltip="Input value for prompt."), + io.Combo.Input("model", display_name="model", options=sorted(models), tooltip="Input value for model."), + io.Image.Input("image", display_name="image", tooltip="Input value for image."), + io.Int.Input("seed", display_name="seed", default=0, min=0, max=2**32 - 1, step=1, tooltip="Input value for seed."), + io.Float.Input("keep_alive", display_name="keep_alive", default=0.0, min=-1.0, max=60.0 * 60.0, step=0.1, tooltip="Input value for keep_alive."), OllamaOptions.Input("options", display_name="options", optional=True), - io.String.Input("system_prompt", display_name="system_prompt", default="", multiline=True, optional=True) + io.String.Input("system_prompt", display_name="system_prompt", default="", multiline=True, optional=True, tooltip="Input value for system_prompt.") ], outputs=[ - io.String.Output("response", display_name="response") + io.String.Output("response", display_name="response", tooltip="Output value for response.") ] ) @@ -216,17 +216,17 @@ class Sage_OllamaLLMPromptVisionRefine(io.ComfyNode): description="Provider-specific vision-refine node for Ollama models.", category=f"{SAGE_UTILS_CAT}/LLM/Ollama", inputs=[ - io.String.Input("prompt", default=DEFAULT_VISION_PROMPT, multiline=True), - io.Combo.Input("model", options=sorted(models)), - io.Image.Input("image"), - io.Int.Input("seed", default=0, min=0, max=2**32 - 1, step=1), - io.String.Input("refine_prompt", default="Take the provided text description and rewrite it to be more vivid, detailed, and engaging, while preserving the original meaning.", multiline=True), - io.Combo.Input("refine_model", options=sorted(refine_models)), - io.Int.Input("refine_seed", default=0, min=0, max=2**32 - 1, step=1) + io.String.Input("prompt", default=DEFAULT_VISION_PROMPT, multiline=True, tooltip="The text prompt for the initial vision generation pass."), + io.Combo.Input("model", options=sorted(models), tooltip="The Ollama vision model used for initial generation."), + io.Image.Input("image", tooltip="The reference image sent to the Ollama vision model."), + io.Int.Input("seed", default=0, min=0, max=2**32 - 1, step=1, tooltip="Seed for the initial generation pass."), + io.String.Input("refine_prompt", default="Take the provided text description and rewrite it to be more vivid, detailed, and engaging, while preserving the original meaning.", multiline=True, tooltip="Instructions used for the second, refinement pass."), + io.Combo.Input("refine_model", options=sorted(refine_models), tooltip="The Ollama model used for the refinement pass."), + io.Int.Input("refine_seed", default=0, min=0, max=2**32 - 1, step=1, tooltip="Seed for the refinement pass."), ], outputs=[ - io.String.Output("initial_response"), - io.String.Output("refined_response") + io.String.Output("initial_response", tooltip="The initial vision response returned by Ollama."), + io.String.Output("refined_response", tooltip="The refined vision response returned by the second pass."), ] ) diff --git a/nodes/prompts_v3.py b/nodes/prompts_v3.py index 398b1ae..f06d0e7 100644 --- a/nodes/prompts_v3.py +++ b/nodes/prompts_v3.py @@ -81,14 +81,14 @@ class Sage_StylePromptFromConfig(io.ComfyNode): dynamic_options.append( io.DynamicCombo.Option(model_name, [ - io.Combo.Input("style", display_name="style", options=styles_for_model or ["None"], default=default_style) + io.Combo.Input("style", display_name="style", options=styles_for_model or ["None"], default=default_style, tooltip="Input value for style.") ]) ) if not dynamic_options: dynamic_options = [ io.DynamicCombo.Option("No models", [ - io.Combo.Input("style", display_name="style", options=["No styles"], default="No styles") + io.Combo.Input("style", display_name="style", options=["No styles"], default="No styles", tooltip="Input value for style.") ]) ] @@ -98,13 +98,13 @@ class Sage_StylePromptFromConfig(io.ComfyNode): description="Builds positive and negative prompts from sage_styles.json. If a style template contains {prompt}, your input is inserted there; otherwise your input is appended with ', '.", category=f"{SAGE_UTILS_CAT}/text/prompt/style", inputs=[ - io.DynamicCombo.Input("model", options=dynamic_options), + io.DynamicCombo.Input("model", options=dynamic_options, tooltip="Input value for model."), io.String.Input("positive", display_name="positive", force_input=True, multiline=True, tooltip="User positive prompt text to insert into the style template (or append if no {prompt} token exists)."), io.String.Input("negative", display_name="negative", force_input=True, multiline=True, tooltip="User negative prompt text to insert into the style template (or append if no {prompt} token exists).") ], outputs=[ - io.String.Output("positive_prompt", display_name="positive_prompt"), - io.String.Output("negative_prompt", display_name="negative_prompt") + io.String.Output("positive_prompt", display_name="positive_prompt", tooltip="The generated positive prompt string."), + io.String.Output("negative_prompt", display_name="negative_prompt", tooltip="The generated negative prompt string.") ] ) @@ -144,11 +144,11 @@ class Sage_HiDreamE1_Instruction(io.ComfyNode): description="Generates a prompt for HiDream E1 based on the given instruction and description.", category=f"{SAGE_UTILS_CAT}/text/prompt/hidream", inputs=[ - io.String.Input("instruction", display_name="instruction", multiline=True), - io.String.Input("description", display_name="description", multiline=True) + io.String.Input("instruction", display_name="instruction", multiline=True, tooltip="The instruction text for the HiDream E1 prompt."), + io.String.Input("description", display_name="description", multiline=True, tooltip="The description text to include in the HiDream E1 prompt.") ], outputs=[ - io.String.Output("prompt", display_name="prompt") + io.String.Output("prompt", display_name="prompt", tooltip="The generated HiDream E1 prompt.") ] ) @@ -182,11 +182,11 @@ class Sage_LuminaPromptText(io.ComfyNode): description="Combines a system prompt and a user prompt into a single prompt, with between them.", category=f"{SAGE_UTILS_CAT}/text/prompt/lumina2", inputs=[ - io.String.Input("system", display_name="system", force_input=True, multiline=True), - io.String.Input("prompt", display_name="prompt", force_input=True, multiline=True) + io.String.Input("system", display_name="system", force_input=True, multiline=True, tooltip="The system prompt portion for Lumina 2."), + io.String.Input("prompt", display_name="prompt", force_input=True, multiline=True, tooltip="The user prompt portion for Lumina 2.") ], outputs=[ - io.String.Output("combined_prompt", display_name="combined_prompt") + io.String.Output("combined_prompt", display_name="combined_prompt", tooltip="The combined system and user prompt for Lumina 2.") ] ) @@ -207,12 +207,12 @@ class Sage_ErniePromptEnhancerPrompt(io.ComfyNode): description="Builds a prompt for the Ernie Prompt Enhancer model based on a prompt, image width, and image height. Connect to an LLM mode using native with a clip for Ernie's prompt enhancer, or the TextGenerate node in core. Uses the example prompt.", category=f"{SAGE_UTILS_CAT}/text/prompt/ernie", inputs=[ - io.String.Input("prompt", display_name="prompt", force_input=True, multiline=True), - io.Int.Input("width", display_name="width", default=1024, min=1, max=8192), - io.Int.Input("height", display_name="height", default=1024, min=1, max=8192) + io.String.Input("prompt", display_name="prompt", force_input=True, multiline=True, tooltip="The base prompt to enhance for Ernie."), + io.Int.Input("width", display_name="width", default=1024, min=1, max=8192, tooltip="The target image width used by the Ernie prompt."), + io.Int.Input("height", display_name="height", default=1024, min=1, max=8192, tooltip="The target image height used by the Ernie prompt.") ], outputs=[ - io.String.Output("enhanced_prompt", display_name="enhanced_prompt") + io.String.Output("enhanced_prompt", display_name="enhanced_prompt", tooltip="The enhanced prompt generated for the Ernie model.") ] ) @@ -246,7 +246,7 @@ class Sage_LuminaSystemPrompt(io.ComfyNode): io.Combo.Input("system", display_name="system", options=list(LUMINA2_SYSTEM_PROMPTS_V2.keys()), default="superior", tooltip=LUMINA2_SYSTEM_PROMPT_TIP) ], outputs=[ - io.String.Output("system_prompt", display_name="system_prompt") + io.String.Output("system_prompt", display_name="system_prompt", tooltip="The selected Lumina 2 system prompt text.") ] ) @@ -268,10 +268,10 @@ class Sage_PonyStyle(io.ComfyNode): category=f"{SAGE_UTILS_CAT}/text/prompt/pony", inputs=[ - io.MultiCombo.Input("style", display_name="style", options=pony_strings, chip=True, placeholder="Pony Style") + io.MultiCombo.Input("style", display_name="style", options=pony_strings, chip=True, placeholder="Pony Style", tooltip="Choose Pony style codes to include in the prompt.") ], outputs=[ - io.String.Output("styled_text", display_name="styled_text") + io.String.Output("styled_text", display_name="styled_text", tooltip="The combined Pony style text generated from selected styles.") ] ) @@ -299,10 +299,10 @@ class Sage_PonySource(io.ComfyNode): description="Creates a source string for pony prompts based on the given source.", category=f"{SAGE_UTILS_CAT}/text/prompt/pony", inputs=[ - io.Combo.Input("source", display_name="source", options=PONY_SOURCE, default="none") + io.Combo.Input("source", display_name="source", options=PONY_SOURCE, default="none", tooltip="Choose the prompt source type for Pony prompts.") ], outputs=[ - io.String.Output("source_text", display_name="source_text") + io.String.Output("source_text", display_name="source_text", tooltip="The source text fragment generated for Pony prompts.") ] ) @@ -324,12 +324,12 @@ class Sage_PonyScore(io.ComfyNode): description="Creates a score string for pony prompts based on the given start and end scores.", category=f"{SAGE_UTILS_CAT}/text/prompt/pony", inputs=[ - io.Int.Input("score_start", display_name="score_start", default=9, min=0, max=9, step=1), - io.Int.Input("score_end", display_name="score_end", default=4, min=0, max=9, step=1), + io.Int.Input("score_start", display_name="score_start", default=9, min=0, max=9, step=1, tooltip="The starting score for the Pony score string."), + io.Int.Input("score_end", display_name="score_end", default=4, min=0, max=9, step=1, tooltip="The ending score for the Pony score string."), io.Boolean.Input("up_to", display_name="up_to", default=True, tooltip="If true, adds '_up' to the score string, except for score_9. (v6 uses up, v7 doesn't)") ], outputs=[ - io.String.Output("score_text", display_name="score_text") + io.String.Output("score_text", display_name="score_text", tooltip="The generated Pony score string.") ] ) @@ -360,10 +360,10 @@ class Sage_PonyRatingv6(io.ComfyNode): description="Creates a rating string for pony prompts based on the given rating. (v6 style)", category=f"{SAGE_UTILS_CAT}/text/prompt/pony", inputs=[ - io.Combo.Input("rating", display_name="rating", options=PONY_V6_RATING, default="none") + io.Combo.Input("rating", display_name="rating", options=PONY_V6_RATING, default="none", tooltip="The Pony v6 rating level to include.") ], outputs=[ - io.String.Output("rating_text", display_name="rating_text") + io.String.Output("rating_text", display_name="rating_text", tooltip="The generated Pony v6 rating text.") ] ) @@ -384,14 +384,14 @@ class Sage_PonyPrefix(io.ComfyNode): description="Generates a prefix for pony-related content.", category=f"{SAGE_UTILS_CAT}/text/prompt/pony", inputs=[ - io.Boolean.Input("add_score", display_name="add_score", default=False), - io.Int.Input("score_start", display_name="Score Start", default=9), - io.Int.Input("score_end", display_name="Score End", default=4), - io.Combo.Input("rating", display_name="rating", default="none", options=["none", "safe", "questionable", "explicit"]), - io.Combo.Input("source", display_name="source", default="none", options=["none", "pony", "furry", "anime", "cartoon", "3d", "western", "comic", "monster"]) + io.Boolean.Input("add_score", display_name="add_score", default=False, tooltip="Include a generated score string in the prefix."), + io.Int.Input("score_start", display_name="Score Start", default=9, tooltip="The starting score for the prefix score range."), + io.Int.Input("score_end", display_name="Score End", default=4, tooltip="The ending score for the prefix score range."), + io.Combo.Input("rating", display_name="rating", default="none", options=["none", "safe", "questionable", "explicit"], tooltip="The rating to include in the prefix."), + io.Combo.Input("source", display_name="source", default="none", options=["none", "pony", "furry", "anime", "cartoon", "3d", "western", "comic", "monster"], tooltip="The source type to include in the prefix.") ], outputs=[ - io.String.Output("str_out", display_name="string") + io.String.Output("str_out", display_name="string", tooltip="The generated Pony prefix string.") ] ) @@ -429,10 +429,10 @@ class Sage_PonyStyleCluster(io.ComfyNode): description="Creates a style cluster string for pony prompts based on the given style cluster number.", category=f"{SAGE_UTILS_CAT}/text/prompt/pony", inputs=[ - io.Int.Input("style_cluster", display_name="style_cluster", default=1, min=1, max=2048, step=1) + io.Int.Input("style_cluster", display_name="style_cluster", default=1, min=1, max=2048, step=1, tooltip="The Pony style cluster number to generate.") ], outputs=[ - io.String.Output("style_cluster_text", display_name="style_cluster_text") + io.String.Output("style_cluster_text", display_name="style_cluster_text", tooltip="The generated Pony style cluster text.") ] ) @@ -451,10 +451,10 @@ class Sage_PonyRatingv7(io.ComfyNode): description="Creates a rating string for pony prompts based on the given rating. (v7 style)", category=f"{SAGE_UTILS_CAT}/text/prompt/pony", inputs=[ - io.Combo.Input("rating", display_name="rating", options=PONY_V7_RATING, default="none") + io.Combo.Input("rating", display_name="rating", options=PONY_V7_RATING, default="none", tooltip="The Pony v7 rating level to include.") ], outputs=[ - io.String.Output("rating_text", display_name="rating_text") + io.String.Output("rating_text", display_name="rating_text", tooltip="The generated Pony v7 rating text.") ] ) diff --git a/nodes/sampler_v3.py b/nodes/sampler_v3.py index af3f56d..5341d39 100644 --- a/nodes/sampler_v3.py +++ b/nodes/sampler_v3.py @@ -30,10 +30,10 @@ class Sage_SamplerSelector(io.ComfyNode): description="Selects a sampler for use in the pipeline.", category=f"{SAGE_UTILS_CAT}/sampler", inputs=[ - io.Combo.Input("sampler_name", display_name="sampler_name", options=SAMPLER_OPTIONS, default="dpmpp_2m") + io.Combo.Input("sampler_name", display_name="sampler_name", options=SAMPLER_OPTIONS, default="dpmpp_2m", tooltip="The sampler algorithm to use for generation."), ], outputs=[ - io.String.Output("sampler", display_name="sampler") + io.String.Output("sampler", display_name="sampler", tooltip="The selected sampler name."), ] ) @@ -52,12 +52,12 @@ class Sage_SchedulerSelector(io.ComfyNode): description="Selects a scheduler for use in the pipeline, and passes the steps to be used in the KSampler.", category=f"{SAGE_UTILS_CAT}/sampler", inputs=[ - io.Int.Input("steps", display_name="steps", default=20, min=1, max=10000), - io.Combo.Input("scheduler_name", display_name="scheduler_name", options=SCHEDULER_OPTIONS, default="beta") + io.Int.Input("steps", display_name="steps", default=20, min=1, max=10000, tooltip="The number of sampling steps."), + io.Combo.Input("scheduler_name", display_name="scheduler_name", options=SCHEDULER_OPTIONS, default="beta", tooltip="The scheduler algorithm to use."), ], outputs=[ - io.Int.Output("out_steps", display_name="steps"), - io.String.Output("scheduler", display_name="scheduler") + io.Int.Output("out_steps", display_name="steps", tooltip="The validated number of sampling steps."), + io.String.Output("scheduler", display_name="scheduler", tooltip="The selected scheduler name."), ] ) @@ -77,15 +77,15 @@ class Sage_SamplerInfo(io.ComfyNode): description="Grabs most of the sampler info. Should be routed both to the Construct Metadata node and the KSampler w/ Sampler Info node.", category=f"{SAGE_UTILS_CAT}/sampler", inputs=[ - io.Int.Input("seed", display_name="seed", default=0, min=0, max=0xffffffffffffffff), - io.Int.Input("steps", display_name="steps", default=20, min=1, max=10000), - io.Float.Input("cfg", display_name="cfg", default=5.5, min=0.0, max=100.0, step=0.1, round=0.01), - io.Combo.Input("sampler_name", display_name="sampler_name", options=SAMPLER_OPTIONS, default="dpmpp_2m"), - io.Combo.Input("scheduler", display_name="scheduler", options=SCHEDULER_OPTIONS, default="beta"), - AdvSamplerInfo.Input("advanced_info", display_name="advanced_info", optional=True) + io.Int.Input("seed", display_name="seed", default=0, min=0, max=0xffffffffffffffff, tooltip="Random seed for sampling."), + io.Int.Input("steps", display_name="steps", default=20, min=1, max=10000, tooltip="Number of sampling steps."), + io.Float.Input("cfg", display_name="cfg", default=5.5, min=0.0, max=100.0, step=0.1, round=0.01, tooltip="CFG scale for the sampler."), + io.Combo.Input("sampler_name", display_name="sampler_name", options=SAMPLER_OPTIONS, default="dpmpp_2m", tooltip="Sampler algorithm to use."), + io.Combo.Input("scheduler", display_name="scheduler", options=SCHEDULER_OPTIONS, default="beta", tooltip="Scheduler algorithm to use."), + AdvSamplerInfo.Input("advanced_info", display_name="advanced_info", optional=True, tooltip="Optional advanced sampler settings."), ], outputs=[ - SamplerInfo.Output("sampler_info", display_name="sampler_info") + SamplerInfo.Output("sampler_info", display_name="sampler_info", tooltip="The collected sampler configuration."), ] ) @@ -120,14 +120,14 @@ class Sage_SamplerInfoNoCFG(io.ComfyNode): description="Grabs most of the sampler info (with cfg at 1.0). Should be routed both to the Construct Metadata node and the KSampler w/ Sampler Info node.", category=f"{SAGE_UTILS_CAT}/sampler", inputs=[ - io.Int.Input("seed", display_name="seed", default=0, min=0, max=0xffffffffffffffff), - io.Int.Input("steps", display_name="steps", default=20, min=1, max=10000), - io.Combo.Input("sampler_name", display_name="sampler_name", options=SAMPLER_OPTIONS, default="dpmpp_2m"), - io.Combo.Input("scheduler", display_name="scheduler", options=SCHEDULER_OPTIONS, default="beta"), - AdvSamplerInfo.Input("advanced_info", display_name="advanced_info", optional=True) + io.Int.Input("seed", display_name="seed", default=0, min=0, max=0xffffffffffffffff, tooltip="Random seed for sampling."), + io.Int.Input("steps", display_name="steps", default=20, min=1, max=10000, tooltip="Number of sampling steps."), + io.Combo.Input("sampler_name", display_name="sampler_name", options=SAMPLER_OPTIONS, default="dpmpp_2m", tooltip="Sampler algorithm to use."), + io.Combo.Input("scheduler", display_name="scheduler", options=SCHEDULER_OPTIONS, default="beta", tooltip="Scheduler algorithm to use."), + AdvSamplerInfo.Input("advanced_info", display_name="advanced_info", optional=True, tooltip="Optional advanced sampler settings."), ], outputs=[ - SamplerInfo.Output("sampler_info", display_name="sampler_info") + SamplerInfo.Output("sampler_info", display_name="sampler_info", tooltip="The collected sampler configuration."), ] ) @@ -161,13 +161,13 @@ class Sage_AdvSamplerInfo(io.ComfyNode): description="Adds more optional values to the KSampler.", category=f"{SAGE_UTILS_CAT}/sampler", inputs=[ - io.Boolean.Input("add_noise", display_name="add_noise", default=True), - io.Int.Input("start_at_step", display_name="start_at_step", default=0, min=0, max=10000), - io.Int.Input("end_at_step", display_name="end_at_step", default=10000, min=0, max=10000), - io.Boolean.Input("return_with_leftover_noise", display_name="return_with_leftover_noise", default=False) + io.Boolean.Input("add_noise", display_name="add_noise", default=True, tooltip="Whether to add noise during sampling."), + io.Int.Input("start_at_step", display_name="start_at_step", default=0, min=0, max=10000, tooltip="The first step at which to apply noise."), + io.Int.Input("end_at_step", display_name="end_at_step", default=10000, min=0, max=10000, tooltip="The last step at which to apply noise."), + io.Boolean.Input("return_with_leftover_noise", display_name="return_with_leftover_noise", default=False, tooltip="Return the extra noise if not fully denoised."), ], outputs=[ - AdvSamplerInfo.Output("adv_sampler_info", display_name="adv_sampler_info") + AdvSamplerInfo.Output("adv_sampler_info", display_name="adv_sampler_info", tooltip="The advanced sampler settings.") ] ) @@ -226,15 +226,15 @@ class Sage_KSampler(io.ComfyNode): description="Uses the provided model, positive and negative conditioning to denoise the latent image. Designed to work with the Sampler info node.", category=f"{SAGE_UTILS_CAT}/sampler", inputs=[ - io.Model.Input("model", display_name="model"), - SamplerInfo.Input("sampler_info", display_name="sampler_info"), - io.Conditioning.Input("positive", display_name="positive"), - io.Conditioning.Input("negative", display_name="negative"), - io.Latent.Input("latent_image", display_name="latent_image"), - io.Float.Input("denoise", display_name="denoise", default=1.0, min=0.0, max=1.0, step=0.01) + io.Model.Input("model", display_name="model", tooltip="The model used for denoising."), + SamplerInfo.Input("sampler_info", display_name="sampler_info", tooltip="Sampler configuration for the KSampler."), + io.Conditioning.Input("positive", display_name="positive", tooltip="Positive conditioning for generation."), + io.Conditioning.Input("negative", display_name="negative", tooltip="Negative conditioning for generation."), + io.Latent.Input("latent_image", display_name="latent_image", tooltip="The latent image to denoise."), + io.Float.Input("denoise", display_name="denoise", default=1.0, min=0.0, max=1.0, step=0.01, tooltip="The denoising strength."), ], outputs=[ - io.Latent.Output("latent", display_name="latent") + io.Latent.Output("latent", display_name="latent", tooltip="The denoised latent output.") ] ) @@ -260,18 +260,18 @@ class Sage_KSamplerTiledDecoder(io.ComfyNode): description="Uses the provided model, positive and negative conditioning to denoise the latent image, and generate an image with the provided vae. Designed to work with the Sampler info node. Will tile if tiling info is provided.", category=f"{SAGE_UTILS_CAT}/sampler", inputs=[ - io.Model.Input("model", display_name="model"), - SamplerInfo.Input("sampler_info", display_name="sampler_info"), - io.Conditioning.Input("positive", display_name="positive"), - io.Conditioning.Input("negative", display_name="negative"), - io.Latent.Input("latent_image", display_name="latent_image"), - io.Vae.Input("vae", display_name="vae"), - io.Float.Input("denoise", display_name="denoise", default=1.0, min=0.0, max=1.0, step=0.01), - TilingInfo.Input("tiling_info", display_name="tiling_info", optional=True) + io.Model.Input("model", display_name="model", tooltip="The model used for denoising."), + SamplerInfo.Input("sampler_info", display_name="sampler_info", tooltip="Sampler configuration for the KSampler."), + io.Conditioning.Input("positive", display_name="positive", tooltip="Positive conditioning for generation."), + io.Conditioning.Input("negative", display_name="negative", tooltip="Negative conditioning for generation."), + io.Latent.Input("latent_image", display_name="latent_image", tooltip="The latent image to denoise."), + io.Vae.Input("vae", display_name="vae", tooltip="The VAE used to decode the denoised latent."), + io.Float.Input("denoise", display_name="denoise", default=1.0, min=0.0, max=1.0, step=0.01, tooltip="The denoising strength."), + TilingInfo.Input("tiling_info", display_name="tiling_info", optional=True, tooltip="Optional tiling parameters for the decoder."), ], outputs=[ - io.Latent.Output("latent", display_name="latent"), - io.Image.Output("image", display_name="image") + io.Latent.Output("latent", display_name="latent", tooltip="The denoised latent output."), + io.Image.Output("image", display_name="image", tooltip="The decoded image generated by the VAE.") ] ) @@ -313,17 +313,17 @@ class Sage_KSamplerAudioDecoder(io.ComfyNode): description="Uses the provided model, positive and negative conditioning to denoise the latent audio, and generate audio with the provided vae. Designed to work with the Sampler info node.", category=f"{SAGE_UTILS_CAT}/sampler", inputs=[ - io.Model.Input("model", display_name="model"), - SamplerInfo.Input("sampler_info", display_name="sampler_info"), - io.Conditioning.Input("positive", display_name="positive"), - io.Conditioning.Input("negative", display_name="negative"), - io.Latent.Input("latent_audio", display_name="latent_audio"), - io.Vae.Input("vae", display_name="vae"), - io.Float.Input("denoise", display_name="denoise", default=1.0, min=0.0, max=1.0, step=0.01) + io.Model.Input("model", display_name="model", tooltip="The model used for denoising audio latent."), + SamplerInfo.Input("sampler_info", display_name="sampler_info", tooltip="Sampler configuration for the KSampler."), + io.Conditioning.Input("positive", display_name="positive", tooltip="Positive conditioning for audio generation."), + io.Conditioning.Input("negative", display_name="negative", tooltip="Negative conditioning for audio generation."), + io.Latent.Input("latent_audio", display_name="latent_audio", tooltip="The latent audio tensor to denoise."), + io.Vae.Input("vae", display_name="vae", tooltip="The audio VAE used to decode the denoised latent."), + io.Float.Input("denoise", display_name="denoise", default=1.0, min=0.0, max=1.0, step=0.01, tooltip="The denoising strength."), ], outputs=[ - io.Latent.Output("latent", display_name="latent"), - io.Audio.Output("audio", display_name="audio") + io.Latent.Output("latent", display_name="latent", tooltip="The denoised latent audio output."), + io.Audio.Output("audio", display_name="audio", tooltip="The decoded audio result.") ] ) diff --git a/nodes/selector_v3.py b/nodes/selector_v3.py index d7221aa..3b065a7 100644 --- a/nodes/selector_v3.py +++ b/nodes/selector_v3.py @@ -48,17 +48,34 @@ def _build_clip_options(num_clips: int, clip_list: list) -> list: inputs = [] for i in range(1, num_clips + 1): inputs.append( - io.Combo.Input(f"clip_name_{i}", display_name=f"clip_name_{i}", options=clip_list) + io.Combo.Input( + f"clip_name_{i}", + display_name=f"clip_name_{i}", + options=clip_list, + tooltip="Select a CLIP model to include in the combined clip set." + ) ) # Add clip_type selector based on number of clips if num_clips == 1: inputs.append( - io.Combo.Input("clip_type", display_name="clip_type", options=single_clip_loader_options, default="chroma") + io.Combo.Input( + "clip_type", + display_name="clip_type", + options=single_clip_loader_options, + default="chroma", + tooltip="Choose the loader type to use for a single CLIP model." + ) ) elif num_clips == 2: inputs.append( - io.Combo.Input("clip_type", display_name="clip_type", options=dual_clip_loader_options, default="sdxl") + io.Combo.Input( + "clip_type", + display_name="clip_type", + options=dual_clip_loader_options, + default="sdxl", + tooltip="Choose the loader type to use for a dual CLIP model pair." + ) ) return inputs @@ -73,12 +90,53 @@ def _build_lora_schema_inputs(num_entries: int, lora_list: list, is_quick: bool """Dynamically build lora stack input list based on number of entries.""" inputs = [] for i in range(1, num_entries + 1): - inputs.append(io.Boolean.Input(f"enabled_{i}", display_name=f"enabled_{i}", default=True)) - inputs.append(io.Combo.Input(f"lora_{i}_name", display_name=f"lora_{i}_name", options=lora_list)) - inputs.append(io.Float.Input(f"model_{i}_weight", display_name=f"model_{i}_weight", default=1.0, min=-100.0, max=100.0, step=0.01)) + inputs.append( + io.Boolean.Input( + f"enabled_{i}", + display_name=f"enabled_{i}", + default=True, + tooltip="Enable or disable this LoRA entry in the stack." + ) + ) + inputs.append( + io.Combo.Input( + f"lora_{i}_name", + display_name=f"lora_{i}_name", + options=lora_list, + tooltip="Select a LoRA model to include in this stack entry." + ) + ) + inputs.append( + io.Float.Input( + f"model_{i}_weight", + display_name=f"model_{i}_weight", + default=1.0, + min=-100.0, + max=100.0, + step=0.01, + tooltip="Weight for the LoRA model branch." + ) + ) if not is_quick: - inputs.append(io.Float.Input(f"clip_{i}_weight", display_name=f"clip_{i}_weight", default=1.0, min=-100.0, max=100.0, step=0.01)) - inputs.append(LoraStack.Input("lora_stack", display_name="lora_stack", optional=True)) + inputs.append( + io.Float.Input( + f"clip_{i}_weight", + display_name=f"clip_{i}_weight", + default=1.0, + min=-100.0, + max=100.0, + step=0.01, + tooltip="Weight for the LoRA clip branch." + ) + ) + inputs.append( + LoraStack.Input( + "lora_stack", + display_name="lora_stack", + optional=True, + tooltip="An existing LoRA stack to append this entry to." + ) + ) return inputs @@ -131,10 +189,19 @@ class Sage_CheckpointSelector(io.ComfyNode): description="Selects a checkpoint from a list.", category=f"{SAGE_UTILS_CAT}/selector", inputs=[ - io.Combo.Input("ckpt_name", display_name="ckpt_name", options=get_model_list("checkpoints")), + io.Combo.Input( + "ckpt_name", + display_name="ckpt_name", + options=get_model_list("checkpoints"), + tooltip="Choose a checkpoint model to load." + ), ], outputs=[ - ModelInfo.Output("model_info", display_name="model_info") + ModelInfo.Output( + "model_info", + display_name="model_info", + tooltip="Model info bundle for the selected checkpoint." + ) ] ) @@ -153,11 +220,26 @@ class Sage_UNETSelector(io.ComfyNode): description="Selects a UNET model from a list.", category=f"{SAGE_UTILS_CAT}/selector", inputs=[ - io.Combo.Input("unet_name", display_name="unet_name", options=get_model_list("unet")), - io.Combo.Input("weight_dtype", display_name="weight_dtype", options=weight_dtype_options, default="default"), + io.Combo.Input( + "unet_name", + display_name="unet_name", + options=get_model_list("unet"), + tooltip="Choose a UNET model to use." + ), + io.Combo.Input( + "weight_dtype", + display_name="weight_dtype", + options=weight_dtype_options, + default="default", + tooltip="Select the weight dtype to use when loading the UNET." + ), ], outputs=[ - UnetInfo.Output("unet_info", display_name="unet_info") + UnetInfo.Output( + "unet_info", + display_name="unet_info", + tooltip="UNET model info for the selected model." + ) ] ) @@ -177,10 +259,19 @@ class Sage_VAESelector(io.ComfyNode): description="Selects a VAE model from a list.", category=f"{SAGE_UTILS_CAT}/selector", inputs=[ - io.Combo.Input("vae_name", display_name="vae_name", options=get_model_list("vae")), + io.Combo.Input( + "vae_name", + display_name="vae_name", + options=get_model_list("vae"), + tooltip="Choose a VAE model to use." + ), ], outputs=[ - VaeInfo.Output("Selector: vae_info", display_name="vae_info") + VaeInfo.Output( + "vae_info", + display_name="vae_info", + tooltip="VAE model info for the selected model." + ) ] ) @@ -200,11 +291,26 @@ class Sage_CLIPSelector(io.ComfyNode): description="Selects a CLIP model from a list.", category=f"{SAGE_UTILS_CAT}/selector", inputs=[ - io.Combo.Input("clip_name", display_name="clip_name", options=get_model_list("clip")), - io.Combo.Input("clip_type", display_name="clip_type", options=single_clip_loader_options, default="chroma"), + io.Combo.Input( + "clip_name", + display_name="clip_name", + options=get_model_list("clip"), + tooltip="Choose a CLIP model to use." + ), + io.Combo.Input( + "clip_type", + display_name="clip_type", + options=single_clip_loader_options, + default="chroma", + tooltip="Choose the CLIP loader type for this single CLIP model." + ), ], outputs=[ - ClipInfo.Output("clip_info", display_name="clip_info") + ClipInfo.Output( + "clip_info", + display_name="clip_info", + tooltip="CLIP model info for the selected model." + ) ] ) @@ -225,12 +331,32 @@ class Sage_DualCLIPSelector(io.ComfyNode): description="Selects two CLIP models from a list.", category=f"{SAGE_UTILS_CAT}/selector", inputs=[ - io.Combo.Input("clip_name_1", display_name="clip_name_1", options=clip_list), - io.Combo.Input("clip_name_2", display_name="clip_name_2", options=clip_list), - io.Combo.Input("clip_type", display_name="clip_type", options=dual_clip_loader_options, default="sdxl"), + io.Combo.Input( + "clip_name_1", + display_name="clip_name_1", + options=clip_list, + tooltip="Choose the first CLIP model for the pair." + ), + io.Combo.Input( + "clip_name_2", + display_name="clip_name_2", + options=clip_list, + tooltip="Choose the second CLIP model for the pair." + ), + io.Combo.Input( + "clip_type", + display_name="clip_type", + options=dual_clip_loader_options, + default="sdxl", + tooltip="Choose the CLIP loader type for this dual CLIP pair." + ), ], outputs=[ - ClipInfo.Output("clip_info", display_name="clip_info") + ClipInfo.Output( + "clip_info", + display_name="clip_info", + tooltip="Combined CLIP model info for the selected pair." + ) ] ) @@ -251,12 +377,31 @@ class Sage_TripleCLIPSelector(io.ComfyNode): description="Selects three CLIP models from a list.", category=f"{SAGE_UTILS_CAT}/selector", inputs=[ - io.Combo.Input("clip_name_1", display_name="clip_name_1", options=clip_list), - io.Combo.Input("clip_name_2", display_name="clip_name_2", options=clip_list), - io.Combo.Input("clip_name_3", display_name="clip_name_3", options=clip_list), + io.Combo.Input( + "clip_name_1", + display_name="clip_name_1", + options=clip_list, + tooltip="Choose the first CLIP model for the triple selector." + ), + io.Combo.Input( + "clip_name_2", + display_name="clip_name_2", + options=clip_list, + tooltip="Choose the second CLIP model for the triple selector." + ), + io.Combo.Input( + "clip_name_3", + display_name="clip_name_3", + options=clip_list, + tooltip="Choose the third CLIP model for the triple selector." + ), ], outputs=[ - ClipInfo.Output("clip_info", display_name="clip_info") + ClipInfo.Output( + "clip_info", + display_name="clip_info", + tooltip="Combined CLIP model info for the selected models." + ) ] ) @@ -276,13 +421,37 @@ class Sage_QuadCLIPSelector(io.ComfyNode): description="Selects four CLIP models from a list.", category=f"{SAGE_UTILS_CAT}/selector", inputs=[ - io.Combo.Input("clip_name_1", display_name="clip_name_1", options=clip_list), - io.Combo.Input("clip_name_2", display_name="clip_name_2", options=clip_list), - io.Combo.Input("clip_name_3", display_name="clip_name_3", options=clip_list), - io.Combo.Input("clip_name_4", display_name="clip_name_4", options=clip_list), + io.Combo.Input( + "clip_name_1", + display_name="clip_name_1", + options=clip_list, + tooltip="Choose the first CLIP model for the quad selector." + ), + io.Combo.Input( + "clip_name_2", + display_name="clip_name_2", + options=clip_list, + tooltip="Choose the second CLIP model for the quad selector." + ), + io.Combo.Input( + "clip_name_3", + display_name="clip_name_3", + options=clip_list, + tooltip="Choose the third CLIP model for the quad selector." + ), + io.Combo.Input( + "clip_name_4", + display_name="clip_name_4", + options=clip_list, + tooltip="Choose the fourth CLIP model for the quad selector." + ), ], outputs=[ - ClipInfo.Output("clip_info", display_name="clip_info") + ClipInfo.Output( + "clip_info", + display_name="clip_info", + tooltip="Combined CLIP model info for the selected models." + ) ] ) @@ -309,10 +478,19 @@ class Sage_FlexibleCLIPSelector(io.ComfyNode): description="Selects a flexible number of CLIP models from a list.", category=f"{SAGE_UTILS_CAT}/selector", inputs=[ - io.DynamicCombo.Input("num_of_clips", display_name="num_of_clips", options=dynamic_options) + io.DynamicCombo.Input( + "num_of_clips", + display_name="num_of_clips", + options=dynamic_options, + tooltip="Choose how many CLIP models to select and configure." + ) ], outputs=[ - ClipInfo.Output("clip_info", display_name="clip_info") + ClipInfo.Output( + "clip_info", + display_name="clip_info", + tooltip="Combined CLIP model info for the selected flexible clip set." + ) ] ) @@ -345,13 +523,38 @@ class Sage_MultiSelectorFlexibleClip(io.ComfyNode): description="Selects checkpoint, UNET, VAE, and a flexible number of CLIP models from lists.", category=f"{SAGE_UTILS_CAT}/selector", inputs=[ - io.Combo.Input("unet_name", display_name="unet_name", options=unet_options), - io.Combo.Input("weight_dtype", display_name="weight_dtype", options=weight_dtype_options, default="default"), - io.DynamicCombo.Input("num_of_clips", display_name="num_of_clips", options=dynamic_options), - io.Combo.Input("vae_name", display_name="vae_name", options=vae_options), + io.Combo.Input( + "unet_name", + display_name="unet_name", + options=unet_options, + tooltip="Choose a UNET model to include in the combined model bundle." + ), + io.Combo.Input( + "weight_dtype", + display_name="weight_dtype", + options=weight_dtype_options, + default="default", + tooltip="Choose the dtype used to load the UNET model." + ), + io.DynamicCombo.Input( + "num_of_clips", + display_name="num_of_clips", + options=dynamic_options, + tooltip="Choose how many CLIP models to include in the combined model bundle." + ), + io.Combo.Input( + "vae_name", + display_name="vae_name", + options=vae_options, + tooltip="Choose a VAE model to include in the combined model bundle." + ), ], outputs=[ - ModelInfo.Output("model_info", display_name="model_info") + ModelInfo.Output( + "model_info", + display_name="model_info", + tooltip="Combined model info bundle including UNET, CLIP, and VAE." + ) ] ) @@ -381,14 +584,45 @@ class Sage_MultiSelectorSingleClip(io.ComfyNode): description="Selects checkpoint, UNET, VAE, and single CLIP models from lists.", category=f"{SAGE_UTILS_CAT}/selector", inputs=[ - io.Combo.Input("unet_name", display_name="unet_name", options=get_model_list("unet")), - io.Combo.Input("weight_dtype", display_name="weight_dtype", options=weight_dtype_options, default="default"), - io.Combo.Input("clip_name", display_name="clip_name", options=get_model_list("clip")), - io.Combo.Input("clip_type", display_name="clip_type", options=single_clip_loader_options, default="chroma"), - io.Combo.Input("vae_name", display_name="vae_name", options=get_model_list("vae")), + io.Combo.Input( + "unet_name", + display_name="unet_name", + options=get_model_list("unet"), + tooltip="Choose a UNET model to include in the loaded model bundle." + ), + io.Combo.Input( + "weight_dtype", + display_name="weight_dtype", + options=weight_dtype_options, + default="default", + tooltip="Choose the UNET weight dtype." + ), + io.Combo.Input( + "clip_name", + display_name="clip_name", + options=get_model_list("clip"), + tooltip="Choose a single CLIP model to include." + ), + io.Combo.Input( + "clip_type", + display_name="clip_type", + options=single_clip_loader_options, + default="chroma", + tooltip="Choose the loader type for the single CLIP model." + ), + io.Combo.Input( + "vae_name", + display_name="vae_name", + options=get_model_list("vae"), + tooltip="Choose a VAE model to include in the loaded model bundle." + ), ], outputs=[ - ModelInfo.Output("model_info", display_name="model_info") + ModelInfo.Output( + "model_info", + display_name="model_info", + tooltip="Combined model info bundle including UNET, CLIP, and VAE." + ) ] ) @@ -406,15 +640,51 @@ class Sage_MultiSelectorDoubleClip(io.ComfyNode): description="Selects checkpoint, UNET, VAE, and two CLIP models from lists.", category=f"{SAGE_UTILS_CAT}/selector", inputs=[ - io.Combo.Input("unet_name", display_name="unet_name", options=get_model_list("unet")), - io.Combo.Input("weight_dtype", display_name="weight_dtype", options=weight_dtype_options, default="default"), - io.Combo.Input("clip_name_1", display_name="clip_name_1", options=clip_list), - io.Combo.Input("clip_name_2", display_name="clip_name_2", options=clip_list), - io.Combo.Input("clip_type", display_name="clip_type", options=dual_clip_loader_options, default="sdxl"), - io.Combo.Input("vae_name", display_name="vae_name", options=get_model_list("vae")), + io.Combo.Input( + "unet_name", + display_name="unet_name", + options=get_model_list("unet"), + tooltip="Choose a UNET model to include in the loaded model bundle." + ), + io.Combo.Input( + "weight_dtype", + display_name="weight_dtype", + options=weight_dtype_options, + default="default", + tooltip="Choose the UNET weight dtype." + ), + io.Combo.Input( + "clip_name_1", + display_name="clip_name_1", + options=clip_list, + tooltip="Choose the first CLIP model for the loaded bundle." + ), + io.Combo.Input( + "clip_name_2", + display_name="clip_name_2", + options=clip_list, + tooltip="Choose the second CLIP model for the loaded bundle." + ), + io.Combo.Input( + "clip_type", + display_name="clip_type", + options=dual_clip_loader_options, + default="sdxl", + tooltip="Choose the loader type for the dual CLIP pair." + ), + io.Combo.Input( + "vae_name", + display_name="vae_name", + options=get_model_list("vae"), + tooltip="Choose a VAE model to include in the loaded model bundle." + ), ], outputs=[ - ModelInfo.Output("model_info", display_name="model_info") + ModelInfo.Output( + "model_info", + display_name="model_info", + tooltip="Combined model info bundle including UNET, CLIP, and VAE." + ) ] ) @@ -432,15 +702,50 @@ class Sage_MultiSelectorTripleClip(io.ComfyNode): description="Selects checkpoint, UNET, VAE, and three CLIP models from lists.", category=f"{SAGE_UTILS_CAT}/selector", inputs=[ - io.Combo.Input("unet_name", display_name="unet_name", options=get_model_list("unet")), - io.Combo.Input("weight_dtype", display_name="weight_dtype", options=weight_dtype_options, default="default"), - io.Combo.Input("clip_name_1", display_name="clip_name_1", options=get_model_list("clip")), - io.Combo.Input("clip_name_2", display_name="clip_name_2", options=clip_list), - io.Combo.Input("clip_name_3", display_name="clip_name_3", options=clip_list), - io.Combo.Input("vae_name", display_name="vae_name", options=get_model_list("vae")), + io.Combo.Input( + "unet_name", + display_name="unet_name", + options=get_model_list("unet"), + tooltip="Choose a UNET model to include in the loaded model bundle." + ), + io.Combo.Input( + "weight_dtype", + display_name="weight_dtype", + options=weight_dtype_options, + default="default", + tooltip="Choose the UNET weight dtype." + ), + io.Combo.Input( + "clip_name_1", + display_name="clip_name_1", + options=get_model_list("clip"), + tooltip="Choose the first CLIP model for the loaded bundle." + ), + io.Combo.Input( + "clip_name_2", + display_name="clip_name_2", + options=clip_list, + tooltip="Choose the second CLIP model for the loaded bundle." + ), + io.Combo.Input( + "clip_name_3", + display_name="clip_name_3", + options=clip_list, + tooltip="Choose the third CLIP model for the loaded bundle." + ), + io.Combo.Input( + "vae_name", + display_name="vae_name", + options=get_model_list("vae"), + tooltip="Choose a VAE model to include in the loaded model bundle." + ), ], outputs=[ - ModelInfo.Output("model_info", display_name="model_info") + ModelInfo.Output( + "model_info", + display_name="model_info", + tooltip="Combined model info bundle including UNET, CLIP, and VAE." + ) ] ) @@ -458,16 +763,56 @@ class Sage_MultiSelectorQuadClip(io.ComfyNode): description="Selects checkpoint, UNET, VAE, and four CLIP models from lists.", category=f"{SAGE_UTILS_CAT}/selector", inputs=[ - io.Combo.Input("unet_name", display_name="unet_name", options=get_model_list("unet")), - io.Combo.Input("weight_dtype", display_name="weight_dtype", options=weight_dtype_options, default="default"), - io.Combo.Input("clip_name_1", display_name="clip_name_1", options=clip_list), - io.Combo.Input("clip_name_2", display_name="clip_name_2", options=clip_list), - io.Combo.Input("clip_name_3", display_name="clip_name_3", options=clip_list), - io.Combo.Input("clip_name_4", display_name="clip_name_4", options=clip_list), - io.Combo.Input("vae_name", display_name="vae_name", options=get_model_list("vae")), + io.Combo.Input( + "unet_name", + display_name="unet_name", + options=get_model_list("unet"), + tooltip="Choose a UNET model to include in the loaded model bundle." + ), + io.Combo.Input( + "weight_dtype", + display_name="weight_dtype", + options=weight_dtype_options, + default="default", + tooltip="Choose the UNET weight dtype." + ), + io.Combo.Input( + "clip_name_1", + display_name="clip_name_1", + options=clip_list, + tooltip="Choose the first CLIP model for the loaded bundle." + ), + io.Combo.Input( + "clip_name_2", + display_name="clip_name_2", + options=clip_list, + tooltip="Choose the second CLIP model for the loaded bundle." + ), + io.Combo.Input( + "clip_name_3", + display_name="clip_name_3", + options=clip_list, + tooltip="Choose the third CLIP model for the loaded bundle." + ), + io.Combo.Input( + "clip_name_4", + display_name="clip_name_4", + options=clip_list, + tooltip="Choose the fourth CLIP model for the loaded bundle." + ), + io.Combo.Input( + "vae_name", + display_name="vae_name", + options=get_model_list("vae"), + tooltip="Choose a VAE model to include in the loaded model bundle." + ), ], outputs=[ - ModelInfo.Output("model_info", display_name="model_info") + ModelInfo.Output( + "model_info", + display_name="model_info", + tooltip="Combined model info bundle including UNET, CLIP, and VAE." + ) ] ) @@ -488,28 +833,28 @@ class Sage_ModelShifts(io.ComfyNode): io.DynamicCombo.Input("settings", options=[ io.DynamicCombo.Option("Shift Only", [ io.Combo.Input("shift_type", display_name="shift_type", options=["None", "x1", "x1000"], default="None", tooltip="The type of shift to apply to the model. x1 for Auraflow and Lumina2, x1000 for other models."), - io.Float.Input("shift", display_name="shift", default=3.0, min=0.0, max=100.0, step=0.01) + io.Float.Input("shift", display_name="shift", default=3.0, min=0.0, max=100.0, step=0.01, tooltip="How much shift to apply to the model when shift-only mode is selected.") ]), io.DynamicCombo.Option("FreeU v2 Only", [ - io.Boolean.Input("freeu_v2", display_name="freeu_v2", default=False), - io.Float.Input("b1", display_name="b1", default=1.3, min=0.0, max=10.0, step=0.01), - io.Float.Input("b2", display_name="b2", default=1.4, min=0.0, max=10.0, step=0.01), - io.Float.Input("s1", display_name="s1", default=0.9, min=0.0, max=10.0, step=0.01), - io.Float.Input("s2", display_name="s2", default=0.2, min=0.0, max=10.0, step=0.01) + io.Boolean.Input("freeu_v2", display_name="freeu_v2", default=False, tooltip="Enable FreeU v2 adjustments."), + io.Float.Input("b1", display_name="b1", default=1.3, min=0.0, max=10.0, step=0.01, tooltip="FreeU v2 b1 parameter."), + io.Float.Input("b2", display_name="b2", default=1.4, min=0.0, max=10.0, step=0.01, tooltip="FreeU v2 b2 parameter."), + io.Float.Input("s1", display_name="s1", default=0.9, min=0.0, max=10.0, step=0.01, tooltip="FreeU v2 s1 parameter."), + io.Float.Input("s2", display_name="s2", default=0.2, min=0.0, max=10.0, step=0.01, tooltip="FreeU v2 s2 parameter.") ]), io.DynamicCombo.Option("Shift and FreeU v2", [ io.Combo.Input("shift_type", display_name="shift_type", options=["None", "x1", "x1000"], default="None", tooltip="The type of shift to apply to the model. x1 for Auraflow and Lumina2, x1000 for other models."), - io.Float.Input("shift", display_name="shift", default=3.0, min=0.0, max=100.0, step=0.01), - io.Boolean.Input("freeu_v2", display_name="freeu_v2", default=False), - io.Float.Input("b1", display_name="b1", default=1.3, min=0.0, max=10.0, step=0.01), - io.Float.Input("b2", display_name="b2", default=1.4, min=0.0, max=10.0, step=0.01), - io.Float.Input("s1", display_name="s1", default=0.9, min=0.0, max=10.0, step=0.01), - io.Float.Input("s2", display_name="s2", default=0.2, min=0.0, max=10.0, step=0.01) + io.Float.Input("shift", display_name="shift", default=3.0, min=0.0, max=100.0, step=0.01, tooltip="How much shift to apply to the model."), + io.Boolean.Input("freeu_v2", display_name="freeu_v2", default=False, tooltip="Enable FreeU v2 adjustments."), + io.Float.Input("b1", display_name="b1", default=1.3, min=0.0, max=10.0, step=0.01, tooltip="FreeU v2 b1 parameter."), + io.Float.Input("b2", display_name="b2", default=1.4, min=0.0, max=10.0, step=0.01, tooltip="FreeU v2 b2 parameter."), + io.Float.Input("s1", display_name="s1", default=0.9, min=0.0, max=10.0, step=0.01, tooltip="FreeU v2 s1 parameter."), + io.Float.Input("s2", display_name="s2", default=0.2, min=0.0, max=10.0, step=0.01, tooltip="FreeU v2 s2 parameter.") ]) ]) ], outputs=[ - ModelShiftInfo.Output("model_shifts", display_name="model_shifts") + ModelShiftInfo.Output("model_shifts", display_name="model_shifts", tooltip="Settings to apply to the model loader, including shift and FreeU v2 values.") ] ) @@ -561,10 +906,10 @@ class Sage_ModelShiftOnly(io.ComfyNode): category=f"{SAGE_UTILS_CAT}/model", inputs=[ io.Combo.Input("shift_type", display_name="shift_type", options=["None", "x1", "x1000"], default="None", tooltip="The type of shift to apply to the model. x1 for Auraflow and Lumina2, x1000 for other models."), - io.Float.Input("shift", display_name="shift", default=3.0, min=0.0, max=100.0, step=0.01) + io.Float.Input("shift", display_name="shift", default=3.0, min=0.0, max=100.0, step=0.01, tooltip="How much shift to apply to the model." ) ], outputs=[ - ModelShiftInfo.Output("model_shifts", display_name="model_shifts") + ModelShiftInfo.Output("model_shifts", display_name="model_shifts", tooltip="Model shift settings output for the loader.") ] ) @@ -591,14 +936,14 @@ class Sage_FreeU2(io.ComfyNode): description="Get the free_u2 settings to apply to the model.", category=f"{SAGE_UTILS_CAT}/model", inputs=[ - io.Boolean.Input("freeu_v2", display_name="freeu_v2", default=False), - io.Float.Input("b1", display_name="b1", default=1.3, min=0.0, max=10.0, step=0.01), - io.Float.Input("b2", display_name="b2", default=1.4, min=0.0, max=10.0, step=0.01), - io.Float.Input("s1", display_name="s1", default=0.9, min=0.0, max=10.0, step=0.01), - io.Float.Input("s2", display_name="s2", default=0.2, min=0.0, max=10.0, step=0.01) + io.Boolean.Input("freeu_v2", display_name="freeu_v2", default=False, tooltip="Enable FreeU v2 adjustments."), + io.Float.Input("b1", display_name="b1", default=1.3, min=0.0, max=10.0, step=0.01, tooltip="FreeU v2 b1 parameter."), + io.Float.Input("b2", display_name="b2", default=1.4, min=0.0, max=10.0, step=0.01, tooltip="FreeU v2 b2 parameter."), + io.Float.Input("s1", display_name="s1", default=0.9, min=0.0, max=10.0, step=0.01, tooltip="FreeU v2 s1 parameter."), + io.Float.Input("s2", display_name="s2", default=0.2, min=0.0, max=10.0, step=0.01, tooltip="FreeU v2 s2 parameter.") ], outputs=[ - ModelShiftInfo.Output("model_shifts", display_name="model_shifts") + ModelShiftInfo.Output("model_shifts", display_name="model_shifts", tooltip="FreeU v2 model settings output for the loader.") ] ) @@ -631,13 +976,13 @@ class Sage_TilingInfo(io.ComfyNode): description="Adds tiling information to the KSampler.", category=f"{SAGE_UTILS_CAT}/sampler", inputs=[ - io.Int.Input("tile_size", display_name="tile_size", default=512, min=64, max=4096, step=32), - io.Int.Input("overlap", display_name="overlap", default=64, min=0, max=4096, step=32), + io.Int.Input("tile_size", display_name="tile_size", default=512, min=64, max=4096, step=32, tooltip="Size of each tile for tiled sampling."), + io.Int.Input("overlap", display_name="overlap", default=64, min=0, max=4096, step=32, tooltip="Overlap size between tiles."), io.Int.Input("temporal_size", display_name="temporal_size", default=64, min=8, max=4096, step=4, tooltip="Only used for video VAEs: Amount of frames to decode at a time."), io.Int.Input("temporal_overlap", display_name="temporal_overlap", default=8, min=4, max=4096, step=4, tooltip="Only used for video VAEs: Amount of frames to overlap.") ], outputs=[ - TilingInfo.Output("tiling_info", display_name="tiling_info") + TilingInfo.Output("tiling_info", display_name="tiling_info", tooltip="Tiling parameters for the sampler.") ] ) @@ -666,7 +1011,7 @@ class Sage_UnetClipVaeToModelInfo(io.ComfyNode): VaeInfo.Input("vae_info", display_name="vae_info") ], outputs=[ - ModelInfo.Output("model_info", display_name="model_info") + ModelInfo.Output("model_info", display_name="model_info", tooltip="Combined model info output for the UNET, CLIP, and VAE inputs.") ] ) @@ -687,14 +1032,14 @@ class Sage_LoraStack(io.ComfyNode): description="Choose a lora with weights, and add it to a lora_stack. Compatible with other node packs that have lora_stacks.", category=f"{SAGE_UTILS_CAT}/lora", inputs=[ - io.Boolean.Input("enabled", display_name="enabled", default=False), - io.Combo.Input("lora_name", display_name="lora_name", options=get_model_list("loras")), - io.Float.Input("model_weight", display_name="model_weight", default=1.0, min=-100.0, max=100.0, step=0.01), - io.Float.Input("clip_weight", display_name="clip_weight", default=1.0, min=-100.0, max=100.0, step=0.01), - LoraStack.Input("lora_stack", display_name="lora_stack", optional=True) + io.Boolean.Input("enabled", display_name="enabled", default=False, tooltip="Enable or disable this LoRA stack entry."), + io.Combo.Input("lora_name", display_name="lora_name", options=get_model_list("loras"), tooltip="Choose a LoRA model to add."), + io.Float.Input("model_weight", display_name="model_weight", default=1.0, min=-100.0, max=100.0, step=0.01, tooltip="Weight for the LoRA model branch."), + io.Float.Input("clip_weight", display_name="clip_weight", default=1.0, min=-100.0, max=100.0, step=0.01, tooltip="Weight for the LoRA clip branch."), + LoraStack.Input("lora_stack", display_name="lora_stack", optional=True, tooltip="Existing LoRA stack to append to.") ], outputs=[ - LoraStack.Output("out_lora_stack", display_name="lora_stack") + LoraStack.Output("out_lora_stack", display_name="lora_stack", tooltip="Combined LoRA stack output.") ] ) @@ -724,13 +1069,13 @@ class Sage_QuickLoraStack(io.ComfyNode): description="A simplified version of the lora stack node, without the clip_weight.", category=f"{SAGE_UTILS_CAT}/lora", inputs=[ - io.Boolean.Input("enabled", display_name="enabled", default=True), - io.Combo.Input("lora_name", display_name="lora_name", options=get_model_list("loras")), - io.Float.Input("model_weight", display_name="model_weight", default=1.0, min=-100.0, max=100.0, step=0.01), - LoraStack.Input("lora_stack", display_name="lora_stack", optional=True) + io.Boolean.Input("enabled", display_name="enabled", default=True, tooltip="Enable or disable this Quick LoRA stack entry."), + io.Combo.Input("lora_name", display_name="lora_name", options=get_model_list("loras"), tooltip="Choose a LoRA model to add."), + io.Float.Input("model_weight", display_name="model_weight", default=1.0, min=-100.0, max=100.0, step=0.01, tooltip="Weight for the LoRA model and clip branch."), + LoraStack.Input("lora_stack", display_name="lora_stack", optional=True, tooltip="Existing LoRA stack to append to.") ], outputs=[ - LoraStack.Output("out_lora_stack", display_name="lora_stack") + LoraStack.Output("out_lora_stack", display_name="lora_stack", tooltip="Combined LoRA stack output.") ] ) @@ -766,7 +1111,11 @@ class Sage_TripleLoraStack(io.ComfyNode): category=f"{SAGE_UTILS_CAT}/lora", inputs=_build_lora_schema_inputs(cls.NUM_OF_ENTRIES, lora_list, is_quick=False), outputs=[ - LoraStack.Output("out_lora_stack", display_name="lora_stack") + LoraStack.Output( + "out_lora_stack", + display_name="lora_stack", + tooltip="Combined LoRA stack containing the selected entries." + ) ] ) @@ -806,7 +1155,11 @@ class Sage_SixLoraStack(Sage_TripleLoraStack): category=f"{SAGE_UTILS_CAT}/lora", inputs=_build_lora_schema_inputs(cls.NUM_OF_ENTRIES, lora_list, is_quick=False), outputs=[ - LoraStack.Output("out_lora_stack", display_name="lora_stack") + LoraStack.Output( + "out_lora_stack", + display_name="lora_stack", + tooltip="Combined LoRA stack containing the selected entries." + ) ] ) @@ -830,7 +1183,11 @@ class Sage_NineLoraStack(Sage_TripleLoraStack): category=f"{SAGE_UTILS_CAT}/lora", inputs=_build_lora_schema_inputs(cls.NUM_OF_ENTRIES, lora_list, is_quick=False), outputs=[ - LoraStack.Output("out_lora_stack", display_name="lora_stack") + LoraStack.Output( + "out_lora_stack", + display_name="lora_stack", + tooltip="Combined LoRA stack containing the selected entries." + ) ] ) @@ -855,7 +1212,11 @@ class Sage_TripleQuickLoraStack(io.ComfyNode): category=f"{SAGE_UTILS_CAT}/lora", inputs=_build_lora_schema_inputs(cls.NUM_OF_ENTRIES, lora_list, is_quick=True), outputs=[ - LoraStack.Output("out_lora_stack", display_name="lora_stack") + LoraStack.Output( + "out_lora_stack", + display_name="lora_stack", + tooltip="Combined Quick LoRA stack containing the selected entries." + ) ] ) @@ -893,7 +1254,11 @@ class Sage_QuickSixLoraStack(Sage_TripleQuickLoraStack): category=f"{SAGE_UTILS_CAT}/lora", inputs=_build_lora_schema_inputs(cls.NUM_OF_ENTRIES, lora_list, is_quick=True), outputs=[ - LoraStack.Output("out_lora_stack", display_name="lora_stack") + LoraStack.Output( + "out_lora_stack", + display_name="lora_stack", + tooltip="Combined Quick LoRA stack containing the selected entries." + ) ] ) @@ -917,7 +1282,11 @@ class Sage_QuickNineLoraStack(Sage_TripleQuickLoraStack): category=f"{SAGE_UTILS_CAT}/lora", inputs=_build_lora_schema_inputs(cls.NUM_OF_ENTRIES, lora_list, is_quick=True), outputs=[ - LoraStack.Output("out_lora_stack", display_name="lora_stack") + LoraStack.Output( + "out_lora_stack", + display_name="lora_stack", + tooltip="Combined Quick LoRA stack containing the selected entries." + ) ] ) @@ -927,7 +1296,7 @@ class Sage_StackLoraStack(io.ComfyNode): @classmethod def define_schema(cls): autogrow_template = io.Autogrow.TemplatePrefix( - input=LoraStack.Input("lora_stack"), # template for each input + input=LoraStack.Input("lora_stack", tooltip="A single LoRA stack to include in the combined output."), # template for each input prefix="lora_stack_", # prefix for generated input names min=1, # minimum number of inputs shown max=100, # maximum number of inputs allowed @@ -938,9 +1307,11 @@ class Sage_StackLoraStack(io.ComfyNode): description="Combine multiple lora stacks into one. This is useful for combining loras from different sources.", category=f"{SAGE_UTILS_CAT}/lora", inputs=[ - io.Autogrow.Input("lora_stack", template=autogrow_template) + io.Autogrow.Input("lora_stack", template=autogrow_template, tooltip="Input value for lora_stack.") ], - outputs=[LoraStack.Output("out_lora_stack", display_name="lora_stack")] + outputs=[ + LoraStack.Output("out_lora_stack", display_name="lora_stack", tooltip="Combined LoRA stack from all provided stack inputs.") + ] ) @classmethod diff --git a/nodes/text_v3.py b/nodes/text_v3.py index 67652aa..94767a0 100644 --- a/nodes/text_v3.py +++ b/nodes/text_v3.py @@ -25,12 +25,12 @@ class Sage_SetText(io.ComfyNode): description="Sets some text.", category=f"{SAGE_UTILS_CAT}/text/input", inputs = [ - io.String.Input("str", display_name="str", force_input = False, dynamic_prompts = False, multiline = True), - io.String.Input("prefix", display_name="prefix", force_input = True, multiline = True, optional=True), - io.String.Input("suffix", display_name="suffix", force_input = True, multiline = True, optional=True) + io.String.Input("str", display_name="str", force_input = False, dynamic_prompts = False, multiline = True, tooltip="Text to set or modify."), + io.String.Input("prefix", display_name="prefix", force_input = True, multiline = True, optional=True, tooltip="Text to prepend to the main string."), + io.String.Input("suffix", display_name="suffix", force_input = True, multiline = True, optional=True, tooltip="Text to append to the main string.") ], outputs = [ - io.String.Output("str_out", display_name="str") + io.String.Output("str_out", display_name="str", tooltip="Output value for str_out.") ], ) @classmethod @@ -87,12 +87,12 @@ class Sage_SetTextWithoutComments(io.ComfyNode): description="Sets some text after removing comments (Python #, C/C++ //, and /* */ style).", category=f"{SAGE_UTILS_CAT}/text/input", inputs = [ - io.String.Input("str", display_name="str", force_input = False, dynamic_prompts = False, multiline = True), - io.String.Input("prefix", display_name="prefix", force_input = True, multiline = True, optional=True), - io.String.Input("suffix", display_name="suffix", force_input = True, multiline = True, optional=True) + io.String.Input("str", display_name="str", force_input = False, dynamic_prompts = False, multiline = True, tooltip="Input value for str."), + io.String.Input("prefix", display_name="prefix", force_input = True, multiline = True, optional=True, tooltip="Input value for prefix."), + io.String.Input("suffix", display_name="suffix", force_input = True, multiline = True, optional=True, tooltip="Input value for suffix.") ], outputs = [ - io.String.Output("str_out", display_name="str") + io.String.Output("str_out", display_name="str", tooltip="Output value for str_out.") ], ) @classmethod @@ -109,7 +109,7 @@ class Sage_TextSubstitution(io.ComfyNode): @classmethod def define_schema(cls): autogrow_template = io.Autogrow.TemplatePrefix( - input = io.String.Input("strings"), + input = io.String.Input("strings", tooltip="Text input used for placeholder substitution."), prefix = "str_", min = 1, max = 100 @@ -120,14 +120,14 @@ class Sage_TextSubstitution(io.ComfyNode): description="Substitutes the placeholders in the text with the provided strings. The placeholders use the specified delimiter (default $) followed by str_1, str_2, etc. based on the number of connected inputs. The prefix and suffix are added to the final result.", category=f"{SAGE_UTILS_CAT}/text/input", inputs=[ - io.String.Input("text", display_name="text", default="", multiline=True), - io.String.Input("delimiter", display_name="delimiter", default="$"), - io.String.Input("prefix", display_name="prefix", force_input=True, multiline=True, optional=True), - io.String.Input("suffix", display_name="suffix", force_input=True, multiline=True, optional=True), - io.Autogrow.Input("strings", template=autogrow_template) + io.String.Input("text", display_name="text", default="", multiline=True, tooltip="The template text containing placeholders."), + io.String.Input("delimiter", display_name="delimiter", default="$", tooltip="Delimiter used to mark placeholder variables."), + io.String.Input("prefix", display_name="prefix", force_input=True, multiline=True, optional=True, tooltip="Text to prepend to the substituted result."), + io.String.Input("suffix", display_name="suffix", force_input=True, multiline=True, optional=True, tooltip="Text to append to the substituted result."), + io.Autogrow.Input("strings", template=autogrow_template, tooltip="Input value for strings.") ], outputs=[ - io.String.Output("result", display_name="result") + io.String.Output("result", display_name="result", tooltip="Output value for result.") ] ) @@ -188,14 +188,14 @@ class Sage_SetTextWithDynamicPrompts(io.ComfyNode): description="Loads user defined wildcard from the wildcards directory, and applies them to any wildcards in the text using the dynamic prompts library.", category=f"{SAGE_UTILS_CAT}/text/input", inputs=[ - io.String.Input("str_input", display_name="str", force_input=False, dynamic_prompts=True, multiline=True), - io.Int.Input("seed", display_name="seed", default=0, min=0, max=2**32-1, step=1), - io.Boolean.Input("clean", display_name="clean", default=False), - io.String.Input("prefix", display_name="prefix", force_input=True, multiline=True, optional=True), - io.String.Input("suffix", display_name="suffix", force_input=True, multiline=True, optional=True) + io.String.Input("str_input", display_name="str", force_input=False, dynamic_prompts=True, multiline=True, tooltip="Text containing dynamic prompt wildcards."), + io.Int.Input("seed", display_name="seed", default=0, min=0, max=2**32-1, step=1, tooltip="Seed for wildcard generation."), + io.Boolean.Input("clean", display_name="clean", default=False, tooltip="Remove unwanted whitespace or formatting after prompt generation."), + io.String.Input("prefix", display_name="prefix", force_input=True, multiline=True, optional=True, tooltip="Text to prepend before dynamic prompt expansion."), + io.String.Input("suffix", display_name="suffix", force_input=True, multiline=True, optional=True, tooltip="Text to append after dynamic prompt expansion.") ], outputs=[ - io.String.Output("str_output", display_name="str") + io.String.Output("str_output", display_name="str", tooltip="Output value for str_output.") ] ) @@ -240,10 +240,10 @@ class Sage_ViewAnything(io.ComfyNode): category=f"{SAGE_UTILS_CAT}/text/output", is_output_node=True, inputs=[ - io.AnyType.Input("any", display_name="any") + io.AnyType.Input("any", display_name="any", tooltip="Any value to view as text.") ], outputs=[ - io.String.Output("str", display_name="str") + io.String.Output("str", display_name="str", tooltip="Output value for str.") ] ) @@ -272,11 +272,11 @@ class Sage_SaveText(io.ComfyNode): inputs=[ io.String.Input("filename_prefix", display_name="filename_prefix", default="ComfyUI_Text", tooltip="The prefix for the file to save. This may include formatting information such as %date:yyyy-MM-dd% to include values from nodes."), io.String.Input("file_extension", display_name="file_extension", default="txt", tooltip="The file extension to use for the saved file."), - io.String.Input("text", display_name="text", force_input=True, multiline=True), + io.String.Input("text", display_name="text", force_input=True, multiline=True, tooltip="The text to save to a file."), io.Int.Input("batch_size", display_name="batch_size", default=1, tooltip="The number of files to save.") ], outputs=[ - io.String.Output("filepath", display_name="filepath") + io.String.Output("filepath", display_name="filepath", tooltip="Output value for filepath.") ] ) @@ -327,10 +327,10 @@ class Sage_ViewNotes(io.ComfyNode): category=f"{SAGE_UTILS_CAT}/text/output", is_output_node=True, inputs=[ - io.Combo.Input("filename", display_name="filename", options=notes_files) + io.Combo.Input("filename", display_name="filename", options=notes_files, tooltip="Select a notes file to load from the notes directory.") ], outputs=[ - io.String.Output("content", display_name="content") + io.String.Output("content", display_name="content", tooltip="Output value for content.") ] ) @@ -364,15 +364,15 @@ class Sage_NumberToStr(io.ComfyNode): inputs=[ io.DynamicCombo.Input("num_type", options=[ io.DynamicCombo.Option("float", [ - io.Float.Input("num", display_name="num", default=0.0, step=0.01) + io.Float.Input("num", display_name="num", default=0.0, step=0.01, tooltip="Float number to convert to string.") ]), io.DynamicCombo.Option("int", [ - io.Int.Input("num", display_name="num", default=0) + io.Int.Input("num", display_name="num", default=0, tooltip="Integer number to convert to string.") ]) - ]) + ], tooltip="Choose the numeric type to convert to a string.") ], outputs=[ - io.String.Output("str", display_name="str") + io.String.Output("str", display_name="str", tooltip="Output value for str.") ] ) @@ -395,10 +395,10 @@ class Sage_AnythingToStr(io.ComfyNode): description="Converts any input to a string.", category=f"{SAGE_UTILS_CAT}/text/conversion", inputs=[ - io.AnyType.Input("any", display_name="any") + io.AnyType.Input("any", display_name="any", tooltip="Any input value to convert to a string.") ], outputs=[ - io.String.Output("str", display_name="str") + io.String.Output("str", display_name="str", tooltip="Output value for str.") ] ) @@ -422,21 +422,21 @@ class Sage_SetTextWithNum(io.ComfyNode): description="Sets some text and adds a number at the end.", category=f"{SAGE_UTILS_CAT}/text/helper", inputs = [ - io.String.Input("str", display_name="str", force_input = False, dynamic_prompts = False, multiline = True), - io.String.Input("prefix", display_name="prefix", force_input = True, multiline = True, optional=True), - io.String.Input("suffix", display_name="suffix", force_input = True, multiline = True, optional=True), + io.String.Input("str", display_name="str", force_input = False, dynamic_prompts = False, multiline = True, tooltip="Text to format with a number at the end."), + io.String.Input("prefix", display_name="prefix", force_input = True, multiline = True, optional=True, tooltip="Text to prepend before the main string."), + io.String.Input("suffix", display_name="suffix", force_input = True, multiline = True, optional=True, tooltip="Text to append after the main string."), io.DynamicCombo.Input("num_type", options=[ io.DynamicCombo.Option("float", [ - io.Float.Input("num", display_name="num", default=0.0, step=0.01) + io.Float.Input("num", display_name="num", default=0.0, step=0.01, tooltip="Float number to append to the text.") ]), io.DynamicCombo.Option("int", [ - io.Int.Input("num", display_name="num", default=0) + io.Int.Input("num", display_name="num", default=0, tooltip="Integer number to append to the text.") ]) - ]) + ], tooltip="Choose whether the appended number should be treated as float or int.") ], outputs = [ - io.String.Output("str_out", display_name="str") + io.String.Output("str_out", display_name="str", tooltip="Output value for str_out.") ], ) @classmethod @@ -463,12 +463,12 @@ class Sage_TextWeight(io.ComfyNode): description="Applies a weight to a text string.", category=f"{SAGE_UTILS_CAT}/text/helper", inputs=[ - io.String.Input("text", display_name="text", multiline=True), - io.Float.Input("weight", display_name="weight", default=1.0, min=-10.0, max=10.0, step=0.05), - io.String.Input("separator", display_name="separator", default=", ") + io.String.Input("text", display_name="text", multiline=True, tooltip="The text to apply a weight to."), + io.Float.Input("weight", display_name="weight", default=1.0, min=-10.0, max=10.0, step=0.05, tooltip="Weight value to add to the text."), + io.String.Input("separator", display_name="separator", default=", ", tooltip="Separator to use after the weighted text.") ], outputs=[ - io.String.Output("weighted_text", display_name="weighted_text") + io.String.Output("weighted_text", display_name="weighted_text", tooltip="Output value for weighted_text.") ] ) @@ -491,11 +491,11 @@ class Sage_TextSwitch(io.ComfyNode): description="Passes the text if active is true, otherwise passes an empty string.", category=f"{SAGE_UTILS_CAT}/text/helper", inputs=[ - io.String.Input("str", display_name="str", force_input=True, multiline=True), - io.Boolean.Input("active", display_name="active", default=True) + io.String.Input("str", display_name="str", force_input=True, multiline=True, tooltip="Text to conditionally pass through."), + io.Boolean.Input("active", display_name="active", default=True, tooltip="If true, passes the text through; otherwise returns an empty string.") ], outputs=[ - io.String.Output("str_out", display_name="str") + io.String.Output("str_out", display_name="str", tooltip="Output value for str_out.") ] ) @@ -514,10 +514,10 @@ class Sage_CleanText(io.ComfyNode): description="Cleans up the string given.", category=f"{SAGE_UTILS_CAT}/text/helper", inputs=[ - io.String.Input("str", display_name="str", force_input=True, multiline=True) + io.String.Input("str", display_name="str", force_input=True, multiline=True, tooltip="Text input to clean using the configured clean_text utility.") ], outputs=[ - io.String.Output("cleaned_string", display_name="cleaned string") + io.String.Output("cleaned_string", display_name="cleaned string", tooltip="Output value for cleaned_string.") ] ) @@ -530,7 +530,7 @@ class Sage_DynamicJoinText(io.ComfyNode): @classmethod def define_schema(cls): autogrow_template = io.Autogrow.TemplatePrefix( - input=io.String.Input("strings"), # template for each input + input=io.String.Input("strings", tooltip="Each string input to join."), # template for each input prefix="str_", # prefix for generated input names min=1, # minimum number of inputs shown max=100, # maximum number of inputs allowed @@ -541,12 +541,12 @@ class Sage_DynamicJoinText(io.ComfyNode): description="Joins multiple strings with a separator.", category=f"{SAGE_UTILS_CAT}/text/helper", inputs=[ - io.Autogrow.Input("strings", template=autogrow_template), - io.String.Input("separator", display_name="separator", default=", "), + io.Autogrow.Input("strings", template=autogrow_template, tooltip="Input value for strings."), + io.String.Input("separator", display_name="separator", default=", ", tooltip="String used to separate joined inputs."), io.Boolean.Input("add_separator_to_end", display_name="add_separator_to_end", default=False, tooltip="Add separator to the end of the joined string.") ], outputs=[ - io.String.Output("str", display_name="str") + io.String.Output("str", display_name="str", tooltip="Output value for str.") ] ) @@ -577,13 +577,13 @@ class Sage_JoinText(io.ComfyNode): category=f"{SAGE_UTILS_CAT}/text/helper", is_deprecated=True, inputs=[ - io.String.Input("separator", display_name="separator", default=", "), + io.String.Input("separator", display_name="separator", default=", ", tooltip="Separator string used between inputs."), io.Boolean.Input("add_separator_to_end", display_name="add_separator_to_end", default=False, tooltip="Add separator to the end of the joined string."), - io.String.Input("str1", display_name="str1", multiline=True), - io.String.Input("str2", display_name="str2", multiline=True) + io.String.Input("str1", display_name="str1", multiline=True, tooltip="First string to join."), + io.String.Input("str2", display_name="str2", multiline=True, tooltip="Second string to join.") ], outputs=[ - io.String.Output("str", display_name="str") + io.String.Output("str", display_name="str", tooltip="Output value for str.") ] ) @@ -610,14 +610,14 @@ class Sage_TripleJoinText(io.ComfyNode): category=f"{SAGE_UTILS_CAT}/text/helper", is_deprecated=True, inputs=[ - io.String.Input("separator", display_name="separator", default=", "), + io.String.Input("separator", display_name="separator", default=", ", tooltip="Separator string used between inputs."), io.Boolean.Input("add_separator_to_end", display_name="add_separator_to_end", default=False, tooltip="Add separator to the end of the joined string."), - io.String.Input("str1", display_name="str1", multiline=True), - io.String.Input("str2", display_name="str2", multiline=True), - io.String.Input("str3", display_name="str3", multiline=True) + io.String.Input("str1", display_name="str1", multiline=True, tooltip="First string to join."), + io.String.Input("str2", display_name="str2", multiline=True, tooltip="Second string to join."), + io.String.Input("str3", display_name="str3", multiline=True, tooltip="Third string to join.") ], outputs=[ - io.String.Output("str", display_name="str") + io.String.Output("str", display_name="str", tooltip="Output value for str.") ] ) @@ -644,11 +644,11 @@ class Sage_TextRandomLine(io.ComfyNode): description="Returns a random line from the given text.", category=f"{SAGE_UTILS_CAT}/text/line", inputs=[ - io.String.Input("text", display_name="text", multiline=True), - io.Int.Input("seed", display_name="seed", default=0) + io.String.Input("text", display_name="text", multiline=True, tooltip="Text to take a random line from."), + io.Int.Input("seed", display_name="seed", default=0, tooltip="Random seed used to choose the line.") ], outputs=[ - io.String.Output("random_line", display_name="random_line") + io.String.Output("random_line", display_name="random_line", tooltip="Output value for random_line.") ] ) @@ -676,11 +676,11 @@ class Sage_TextSelectLine(io.ComfyNode): description="Selects a specific line from the given text based on the line number. Line numbers start from 0.", category=f"{SAGE_UTILS_CAT}/text/line", inputs=[ - io.String.Input("text", display_name="text", multiline=True), - io.Int.Input("line_number", display_name="line_number", default=0, min=0) + io.String.Input("text", display_name="text", multiline=True, tooltip="Text to select a specific line from."), + io.Int.Input("line_number", display_name="line_number", default=0, min=0, tooltip="Line number to return (0-based index).") ], outputs=[ - io.String.Output("selected_line", display_name="selected_line") + io.String.Output("selected_line", display_name="selected_line", tooltip="Output value for selected_line.") ] ) diff --git a/nodes/training_v3.py b/nodes/training_v3.py index 442a3ab..5a734a4 100644 --- a/nodes/training_v3.py +++ b/nodes/training_v3.py @@ -41,15 +41,15 @@ class Sage_Load_Dataset_From_Folder(io.ComfyNode): description="Loads images and paired captions from a folder; applies optional prefix/suffix.", category=f"{SAGE_UTILS_CAT}/train", inputs=[ - io.String.Input("dataset_path", display_name="dataset_path"), - io.String.Input("prefix", display_name="prefix", default="", optional=True), - io.String.Input("suffix", display_name="suffix", default="", optional=True), - io.String.Input("separator", display_name="separator", default=" ", optional=True) + io.String.Input("dataset_path", display_name="dataset_path", tooltip="Path to the folder containing image files and optional caption text files."), + io.String.Input("prefix", display_name="prefix", default="", optional=True, tooltip="Optional text prefix to prepend to each caption."), + io.String.Input("suffix", display_name="suffix", default="", optional=True, tooltip="Optional text suffix to append to each caption."), + io.String.Input("separator", display_name="separator", default=" ", optional=True, tooltip="Separator used when concatenating prefix/suffix with caption text.") ], outputs=[ - io.Image.Output("images", display_name="images"), - io.String.Output("filenames", display_name="filenames"), - io.String.Output("captions", display_name="captions") + io.Image.Output("images", display_name="images", tooltip="Output value for images."), + io.String.Output("filenames", display_name="filenames", tooltip="Output value for filenames."), + io.String.Output("captions", display_name="captions", tooltip="Output value for captions.") ] ) @@ -144,8 +144,8 @@ class Sage_TrainingCaptionsToConditioning(io.ComfyNode): description="Encodes captions with a CLIP model to produce conditioning vectors for training workflows.", category=f"{SAGE_UTILS_CAT}/train", inputs=[ - io.Clip.Input("clip", display_name="clip"), - io.String.Input("captions", display_name="captions") + io.Clip.Input("clip", display_name="clip", tooltip="CLIP model conditioning input used to encode training captions."), + io.String.Input("captions", display_name="captions", tooltip="List of captions to encode into conditioning vectors.") ], outputs=[ io.Conditioning.Output("conditioning", display_name="conditioning") diff --git a/nodes/util_v3.py b/nodes/util_v3.py index 02674db..a387f3d 100644 --- a/nodes/util_v3.py +++ b/nodes/util_v3.py @@ -33,11 +33,11 @@ class Sage_FreeMemory(io.ComfyNode): description="Unload models, run garbage collection, and empty caches when enabled.", category=f"{SAGE_UTILS_CAT}/util", inputs=[ - io.Boolean.Input("free_memory", display_name="free_memory", default=False), - io.AnyType.Input("value", display_name="value") + io.Boolean.Input("free_memory", display_name="free_memory", default=False, tooltip="Unload models and clear caches when enabled."), + io.AnyType.Input("value", display_name="value", tooltip="Optional value to pass through unchanged.") ], outputs=[ - io.AnyType.Output("out_value", display_name="value") + io.AnyType.Output("out_value", display_name="value", tooltip="The passed-through value after optionally freeing memory.") ] ) @@ -62,12 +62,12 @@ class Sage_LogicalSwitch(io.ComfyNode): category=f"{SAGE_UTILS_CAT}/util", is_deprecated=True, inputs=[ - io.Boolean.Input("condition", display_name="condition", default=True), - io.AnyType.Input("true_value", display_name="true_value", lazy=True, optional=True), - io.AnyType.Input("false_value", display_name="false_value", lazy=True, optional=True) + io.Boolean.Input("condition", display_name="condition", default=True, tooltip="Choose which branch to return."), + io.AnyType.Input("true_value", display_name="true_value", lazy=True, optional=True, tooltip="Value returned when the condition is true."), + io.AnyType.Input("false_value", display_name="false_value", lazy=True, optional=True, tooltip="Value returned when the condition is false.") ], outputs=[ - io.AnyType.Output("result", display_name="result") + io.AnyType.Output("result", display_name="result", tooltip="The selected branch value returned by the logical switch.") ] ) @@ -120,11 +120,11 @@ class Sage_ModelInfo(io.ComfyNode): ModelInfo.Input("model_info", display_name="model_info") ], outputs=[ - io.String.Output("base_model", display_name="base_model"), - io.String.Output("name", display_name="name"), - io.String.Output("url", display_name="url"), - io.String.Output("latest_url", display_name="latest_url"), - io.Image.Output("image", display_name="image") + io.String.Output("base_model", display_name="base_model", tooltip="The base model name from the Civitai model metadata."), + io.String.Output("name", display_name="name", tooltip="The full model name including version info."), + io.String.Output("url", display_name="url", tooltip="The Civitai page URL for the model."), + io.String.Output("latest_url", display_name="latest_url", tooltip="The URL of the latest version of the model."), + io.Image.Output("image", display_name="image", tooltip="Preview image for the model from Civitai.") ] ) @@ -178,7 +178,7 @@ class Sage_ModelInfoDisplay(io.ComfyNode): ModelInfo.Input("model_info", display_name="model_info") ], outputs=[ - io.String.Output("markdown_display", display_name="markdown_display") + io.String.Output("markdown_display", display_name="markdown_display", tooltip="Formatted markdown text displaying model information.") ] ) @@ -302,7 +302,7 @@ class Sage_LoraStackInfoDisplay(io.ComfyNode): LoraStack.Input("lora_stack", display_name="lora_stack") ], outputs=[ - io.String.Output("markdown_display", display_name="markdown_display") + io.String.Output("markdown_display", display_name="markdown_display", tooltip="Formatted markdown text displaying LoRA stack information.") ] ) @@ -441,10 +441,10 @@ class Sage_MultiModelPicker(io.ComfyNode): category=f"{SAGE_UTILS_CAT}/util", inputs=[ io.Int.Input("index", display_name="index", default=0, min=0, max=100, step=1, tooltip="0-based index into provided model list"), - io.Autogrow.Input("model_template", template=autogrow_template) + io.Autogrow.Input("model_template", template=autogrow_template, tooltip="Input value for model_template.") ], outputs=[ - ModelInfo.Output("model_info", display_name="model_info") + ModelInfo.Output("model_info", display_name="model_info", tooltip="Selected model_info output from the provided model list.") ] ) @@ -474,7 +474,7 @@ class Sage_CollectKeywordsFromLoraStack(io.ComfyNode): LoraStack.Input("lora_stack", display_name="lora_stack") ], outputs=[ - io.String.Output("keywords", display_name="keywords") + io.String.Output("keywords", display_name="keywords", tooltip="Collected keyword string extracted from the LoRA stack.") ] ) @@ -500,9 +500,9 @@ class Sage_CheckLorasForUpdates(io.ComfyNode): io.Boolean.Input("force", display_name="force", default=False, tooltip="Force a check even if marked up to date.") ], outputs=[ - LoraStack.Output("out_lora_stack", display_name="lora_stack"), - io.String.Output("path", display_name="path"), - io.String.Output("latest_url", display_name="latest_url") + LoraStack.Output("out_lora_stack", display_name="lora_stack", tooltip="The original LoRA stack after update checking."), + io.String.Output("path", display_name="path", tooltip="Stringified paths for any LoRAs with updates."), + io.String.Output("latest_url", display_name="latest_url", tooltip="Latest Civitai URLs for LoRAs with updates.") ] ) @@ -545,10 +545,10 @@ class Sage_PercentageToFloat(io.ComfyNode): description="Convert a percentage value (0-100) to a float (0.0-1.0).", category=f"{SAGE_UTILS_CAT}/util", inputs=[ - io.Float.Input("percentage", display_name="percentage", default=0.0, min=0.0, max=100.0) + io.Float.Input("percentage", display_name="percentage", default=0.0, min=0.0, max=100.0, tooltip="Percentage value to convert into a normalized float.") ], outputs=[ - io.Float.Output("float_value", display_name="float_value") + io.Float.Output("float_value", display_name="float_value", tooltip="Converted normalized float value from the input percentage.") ] ) diff --git a/okf/developer/project_overview.md b/okf/developer/project_overview.md index 9b04600..d86e5fd 100644 --- a/okf/developer/project_overview.md +++ b/okf/developer/project_overview.md @@ -59,6 +59,7 @@ The `js/` folder is further organized into: - `docs/` contains design notes, architecture guides, and implementation plans. - `docs/ref_docs/` holds developer reference materials and walkthroughs. - `okf/` contains the structured, agent-friendly knowledge bundle used as the canonical reference for project organization, architecture, and documentation. +- `js/docs/` is the local node documentation source for custom nodes and should be considered when authoring or updating Sage Utils node docs. ## Assets & Static Data diff --git a/okf/docs/ref_docs_overview.md b/okf/docs/ref_docs_overview.md index 6b762e1..9918e9d 100644 --- a/okf/docs/ref_docs_overview.md +++ b/okf/docs/ref_docs_overview.md @@ -22,6 +22,8 @@ This concept describes how Sage Utils keeps a local mirror of selected ComfyUI d The local mirror is intended as a stable, offline-friendly reference for Sage Utils development. +> Note: Custom node docs are authored under `js/docs/` in the Sage Utils extension and are a primary source for node help content in the UI. See [Node Documentation and Local JS Docs](../nodes/node_documentation.md) for the supported pattern. + ## Sync workflow The current sync workflow is: diff --git a/okf/nodes/index.md b/okf/nodes/index.md index bbcb1f4..1f691c8 100644 --- a/okf/nodes/index.md +++ b/okf/nodes/index.md @@ -14,6 +14,7 @@ This subbundle collects knowledge about node families, node usage, and developme ## Concepts - [Node families](node_families.md) — categorization of Sage Utils node types and their roles. +- [Node documentation](node_documentation.md) — how custom node markdown docs are authored under `js/docs` and loaded into the ComfyUI UI. - [Metadata nodes](metadata_nodes.md) — nodes for building, saving, and inspecting image metadata. - [Sampler and UI nodes](sampler_ui_nodes.md) — nodes that expose sampler settings and streamline workflow UX. - [Model loader nodes](model_loader_nodes.md) — nodes for loading models, checkpoints, and LoRA stacks with provenance. diff --git a/okf/nodes/node_documentation.md b/okf/nodes/node_documentation.md new file mode 100644 index 0000000..96989ef --- /dev/null +++ b/okf/nodes/node_documentation.md @@ -0,0 +1,57 @@ +--- +type: Guide +title: Node Documentation and Local JS Docs +description: How ComfyUI custom node documentation is authored in the local `js/docs` folder and loaded into the UI. +tags: [okf, nodes, docs, custom nodes] +timestamp: 2026-07-01T00:00:00Z +--- + +# Node Documentation and Local JS Docs + +ComfyUI custom nodes can include rich Markdown documentation that is shown in the node documentation panel instead of the generic node description. + +## How documentation is authored + +Create a `docs` folder under your extension’s `WEB_DIRECTORY`: + +- `WEB_DIRECTORY/docs/NodeName.md` — default node documentation +- `WEB_DIRECTORY/docs/NodeName/en.md` — English localized documentation +- `WEB_DIRECTORY/docs/NodeName/zh.md` — Chinese localized documentation +- Add additional locale files as needed, such as `fr.md` or `de.md` + +The documentation loader automatically selects the active locale and falls back to `NodeName.md` when a localized version is not available. + +## What it replaces + +When rich node docs are present, the UI displays the Markdown content in the node documentation panel instead of the generic tooltip-based description. + +If a node already defines tooltips for its inputs, that information remains available in the node panel as supplemental quick-help. + +## Supported markdown features + +The supported documentation format includes: + +- Standard Markdown syntax: headings, lists, code blocks, tables, etc. +- Images using Markdown syntax: `![alt text](image.png)` +- HTML media elements for video playback, including: + - `