Cowboy Widget Roundup
Extract widget values from across the graph, in one string
- node_1
- text
Every so often you want to report what the graph is doing - the seed, the CFG, the steps, the sampler, all the values sitting in widgets across five different nodes - in one place. Copying them by hand is exactly how reports go stale. Cowboy Widget Roundup pulls the values out programmatically: you connect up to six nodes to its node_N inputs, type the names of the widgets you care about into the fields, and it outputs one multi-line string with each node's title and its widget values. The node description is precise about the contract: "Works through real links only - no id lookup."
Here's the shape of it. node_count (1–6) and widgets_per_node (1–4) grow and shrink the inputs and fields, so the node face is exactly as big as your report needs. For each node you get node_N_widget_M fields where you type the widget's name - "seed", "cfg", "steps", "denoise", whatever the widget is called on that node. Leave a field empty and it's skipped. Then three formatting toggles decide the output:
include_titles- each node's title above its values (on by default).include_widget_names- prefix each value withwidget_name:(on by default).float_decimals- decimal places for float values (default 2). Your 0.875 denoise reads as0.88, which is usually what you want in a report.
The output is one text string you can feed to a text display, a logger, or a filename generator. For "what settings produced this render," it's the honest answer.
The catch: real links only
This is the part to read carefully. The node reads widget values through the actual connections in the graph - it looks at the nodes you've wired into node_1…node_6 and reads their widgets by the names you typed. That means:
- The source nodes must have real wires to this node. If you disconnect, the values vanish.
- The widget names must match exactly what the node calls them. "CFG" vs "cfg" will fail silently or pull nothing - check the widget's label on the source node.
- Widgets that have been converted to inputs stop being widgets. If you converted a sampler's
seedwidget to an input socket, it's no longer a widget on the node, and Roundup can't read it from the node alone - that value now lives in whatever feeds the socket. This is the classic "works through real links only" trap and it's worth knowing before you build a report around converted widgets.
When you'd use it
Configuration snapshots for reproducibility (this render ran seed 42, cfg 7.5, steps 30, sampler euler, denoise 0.6), batch-loops where you want each run's parameters logged, or a "show me what this workflow is doing" text output you can glance at mid-iteration. It's pure plumbing - no models, no downloads - and it ships in TrentNodes: ComfyUI Manager (search "Trent Nodes"), or clone + pip install -r requirements.txt.
For a pack full of video and keying hardware, this is the unglamorous node that makes the "what actually ran" question answerable in one string. Once you wire it into a text logger, you'll never hand-copy a seed again.
Inputs (30)
| Name | Type | Default | Description |
|---|---|---|---|
| node_count | INT | 11–6 | How many node inputs to show. |
| widgets_per_node | INT | 11–4 | How many widget-name fields per node. |
| node_1_widget_1opt | STRING | Name of a widget on the node_1 input. Leave empty to skip. | |
| node_1_widget_2opt | STRING | Name of a widget on the node_1 input. Leave empty to skip. | |
| node_1_widget_3opt | STRING | Name of a widget on the node_1 input. Leave empty to skip. | |
| node_1_widget_4opt | STRING | Name of a widget on the node_1 input. Leave empty to skip. | |
| node_2_widget_1opt | STRING | Name of a widget on the node_2 input. Leave empty to skip. | |
| node_2_widget_2opt | STRING | Name of a widget on the node_2 input. Leave empty to skip. | |
| node_2_widget_3opt | STRING | Name of a widget on the node_2 input. Leave empty to skip. | |
| node_2_widget_4opt | STRING | Name of a widget on the node_2 input. Leave empty to skip. | |
| node_3_widget_1opt | STRING | Name of a widget on the node_3 input. Leave empty to skip. | |
| node_3_widget_2opt | STRING | Name of a widget on the node_3 input. Leave empty to skip. | |
| node_3_widget_3opt | STRING | Name of a widget on the node_3 input. Leave empty to skip. | |
| node_3_widget_4opt | STRING | Name of a widget on the node_3 input. Leave empty to skip. | |
| node_4_widget_1opt | STRING | Name of a widget on the node_4 input. Leave empty to skip. | |
| node_4_widget_2opt | STRING | Name of a widget on the node_4 input. Leave empty to skip. | |
| node_4_widget_3opt | STRING | Name of a widget on the node_4 input. Leave empty to skip. | |
| node_4_widget_4opt | STRING | Name of a widget on the node_4 input. Leave empty to skip. | |
| node_5_widget_1opt | STRING | Name of a widget on the node_5 input. Leave empty to skip. | |
| node_5_widget_2opt | STRING | Name of a widget on the node_5 input. Leave empty to skip. | |
| node_5_widget_3opt | STRING | Name of a widget on the node_5 input. Leave empty to skip. | |
| node_5_widget_4opt | STRING | Name of a widget on the node_5 input. Leave empty to skip. | |
| node_6_widget_1opt | STRING | Name of a widget on the node_6 input. Leave empty to skip. | |
| node_6_widget_2opt | STRING | Name of a widget on the node_6 input. Leave empty to skip. | |
| node_6_widget_3opt | STRING | Name of a widget on the node_6 input. Leave empty to skip. | |
| node_6_widget_4opt | STRING | Name of a widget on the node_6 input. Leave empty to skip. | |
| include_titlesopt | BOOLEAN | true | Put each node's title above its values. |
| include_widget_namesopt | BOOLEAN | true | Prefix each value with 'widget_name: '. |
| float_decimalsopt | INT | 20–10 | Decimal places for float values. |
| node_1opt | * | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| text | STRING | One multiline string: each node's title and widget values. |