Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012uM7Ru1JYn48n6c5Rzwd99
185 lines
6.3 KiB
Markdown
185 lines
6.3 KiB
Markdown
# ComfyUI-RMAutomation
|
|
|
|
A collection of workflow automation nodes for ComfyUI, designed to streamline AI image and video generation workflows.
|
|
|
|
## Installation
|
|
|
|
### Via ComfyUI Manager (Recommended)
|
|
1. Open ComfyUI Manager
|
|
2. Search for "RMAutomation"
|
|
3. Click Install
|
|
|
|
### Manual Installation
|
|
```bash
|
|
cd ComfyUI/custom_nodes
|
|
git clone https://github.com/yourusername/ComfyUI-RMAutomation
|
|
```
|
|
|
|
## Nodes
|
|
|
|
### LoRA Nodes
|
|
|
|
#### RM Power LoRA Loader
|
|
A flexible node for loading multiple LoRAs with support for:
|
|
- Dynamic number of LoRA inputs (add as many as you need)
|
|
- Fixed or random strength per LoRA
|
|
- Two ways to feed LoRAs in automatically, both optional:
|
|
- **Styles Pipe** + `lora_source` (Image / Motion High / Motion Low) - reads the
|
|
selected LoRA string straight out of an `RM_STYLES_PIPE`
|
|
- **Style Import** - a raw LoRA string, for graphs with no pipe
|
|
- If both are connected the pipe wins, as the more specific intent
|
|
- Civitai AIR mode - download LoRAs by model ID
|
|
|
|
> Previously two nodes, `RM Power LoRA Loader` and `RM Power LoRA Loader (Pipe)`,
|
|
> merged 2026-08-24. The single node is a superset of both. The old
|
|
> `RMPowerLoraLoaderPipe` key is still registered as an alias so existing workflows
|
|
> load unchanged - it resolves to the same class and shows the same name.
|
|
|
|
#### RM LoRA Collector
|
|
Combines multiple LoRA stacks into one. Accepts both LORA_STACK inputs and lora strings.
|
|
|
|
#### RM LoRA Apply
|
|
Applies all LoRAs from a collected stack to the model and CLIP.
|
|
|
|
### Styles Nodes
|
|
|
|
#### RM Styles Full
|
|
Load prompts from a JSON styles file with multiple selection modes:
|
|
- **Manual**: Use specific prompt number
|
|
- **Random**: Random selection within range
|
|
- **Increment**: Auto-increment after each generation
|
|
- **Decrement**: Auto-decrement after each generation
|
|
|
|
Features an **Edit Styles** button that opens a modal editor for managing your styles.
|
|
|
|
#### RM Styles Full (Display)
|
|
Same as RM Styles Full but displays the current prompt on the node.
|
|
|
|
#### RM Styles Pipe / RM Styles Pipe Out
|
|
Pack and unpack style data for easier workflow connections.
|
|
|
|
### Video Nodes
|
|
|
|
#### RM Video Combine
|
|
Combines images into video with:
|
|
- Multiple format support (H.264, H.265, VP9, GIF, WebP)
|
|
- Configurable output directory
|
|
- Metadata embedding
|
|
- Audio support
|
|
- Ping-pong looping
|
|
|
|
### Utility Nodes
|
|
|
|
#### RM Image Fallback
|
|
Returns the first non-empty image from multiple inputs. Useful for conditional workflows.
|
|
|
|
#### RM Mask Gate
|
|
Validates masks and passes through only valid ones. Outputs None for invalid masks, preventing crashes in downstream nodes.
|
|
|
|
#### RM Mask Gate (Guide)
|
|
Same as Mask Gate but for guide inputs. Disables guides when masks are invalid.
|
|
|
|
#### RM Set Latent Noise Mask
|
|
Improved latent noise mask setter with proper error handling for edge cases.
|
|
|
|
#### RM Positive/Negative Text Embed
|
|
CLIP text encoding nodes that combine optional string inputs with text fields.
|
|
|
|
## Styles JSON Format
|
|
|
|
The styles file (`data/styles.json`) uses this format:
|
|
|
|
```json
|
|
{
|
|
"styles": [
|
|
{
|
|
"number": 1,
|
|
"name": "Style Name",
|
|
"positive": "positive prompt text",
|
|
"negative": "negative prompt text",
|
|
"motion": "motion prompt for video",
|
|
"imageLoras": [
|
|
{"path": "lora_name.safetensors", "weight": 1.0}
|
|
],
|
|
"motionLoras": [],
|
|
"motionLorasHigh": [],
|
|
"motionLorasLow": []
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
### Using a custom styles file
|
|
|
|
The RM Styles nodes read `data/styles.json` by default. Point the `custom_json_path`
|
|
widget at another file to override that. The path accepts:
|
|
|
|
| Form | Example |
|
|
|---|---|
|
|
| Absolute | `C:\Users\you\Styles\styles.json` |
|
|
| Quoted (Explorer "Copy as path") | `"C:\Users\you\Styles\styles.json"` |
|
|
| Home-relative | `~/Styles/styles.json` |
|
|
| Environment variable | `%USERPROFILE%\Styles\styles.json` |
|
|
| Relative | `styles/mine.json` — resolved against the **ComfyUI root** |
|
|
|
|
Leave it blank to use the bundled default. The Edit Styles button reads and writes
|
|
whichever file the widget points at.
|
|
|
|
## Converting a styles CSV
|
|
|
|
`tools/csv_to_styles.py` converts a styles CSV (the A1111 `styles.csv` shape, or the
|
|
`Number,Name,Positive,Negative,Lora` shape) into the JSON format above.
|
|
|
|
**Double-click `tools/Convert Styles CSV.cmd`** and it walks you through it: an Open
|
|
dialog for the CSV, a Save As dialog for the JSON, then the summary stays on screen
|
|
until you press Enter. You can also drag a CSV onto the launcher to preselect it.
|
|
|
|
Use the `.cmd`, not the `.py` — editors like Cursor and VS Code claim the `.py`
|
|
extension via the per-user `UserChoice` registry key, so double-clicking the script
|
|
opens the editor instead of running it. (Note that `assoc .py` / `ftype` will still
|
|
report `py.exe`; they read machine-level associations, which `UserChoice` overrides.)
|
|
|
|
The dialogs need a Python install with tkinter. The `python_embeded` shipped with
|
|
ComfyUI portable has none, so use the command line below if that's your only Python.
|
|
|
|
```bash
|
|
# Same dialogs, from a terminal
|
|
python tools/csv_to_styles.py
|
|
|
|
# Or give the paths directly (no dialogs, no pause - good for scripting)
|
|
python tools/csv_to_styles.py "ComfyUI/styles/StylesSFW.csv" "my_styles.json"
|
|
```
|
|
|
|
It repairs the things that otherwise make the node fail or silently drop styles:
|
|
non-UTF-8 encodings, BOMs, nameless trailing columns, malformed lora tags
|
|
(`<lora:X:1)`, space-separated tags, `.8`-style weights), non-breaking spaces,
|
|
control characters and embedded newlines, doubled commas, and blank, duplicate,
|
|
zero or negative style numbers. It prints a summary of every repair, then re-reads
|
|
the file the way the node does and reports how many styles will actually load.
|
|
|
|
Useful flags: `--dry-run` (report without writing), `--start-number N` (first number
|
|
used when renumbering), `--encoding` (force a source encoding).
|
|
|
|
## Custom Video Formats
|
|
|
|
Add custom video formats by placing JSON files in the `video_formats` directory. Example format:
|
|
|
|
```json
|
|
{
|
|
"extension": "mp4",
|
|
"main_pass": ["-c:v", "libx264", "-preset", "medium", "-crf", "19", "-pix_fmt", "yuv420p"],
|
|
"audio_pass": ["-c:a", "aac", "-b:a", "192k"],
|
|
"save_metadata": "True",
|
|
"dim_alignment": 2
|
|
}
|
|
```
|
|
|
|
## License
|
|
|
|
MIT License - Do whatever you want with this code.
|
|
|
|
## Credits
|
|
|
|
- Video combine functionality based on [ComfyUI-VideoHelperSuite](https://github.com/Kosinkadink/ComfyUI-VideoHelperSuite)
|
|
- Power LoRA loader concept inspired by [rgthree-comfy](https://github.com/rgthree/rgthree-comfy)
|