EmAySee_MetadataFormatter
Turn your LoRA's training JSON into something a human can read
- formatted_metadata_string
EmAySee Metadata Formatter takes a raw LoRA training-metadata JSON string and returns a formatted, human-readable dump of it. Every kohya-style trainer writes a pile of ss_* parameters into the model's metadata - learning rate, network dim, bucket config, tag frequencies - and if you've ever opened that blob you know it's wall-to-wall unreadable key names. This node strips the ss_ prefixes, sorts everything, and pretty-prints the nested structures so you can actually tell what someone's LoRA was trained on.
It's clearly built to sit right after the author's own EmAySee_LoRAMetadataExtractor (same pack) - extract the JSON, format it here, then read it or save it to a text file. That's the honest use case: checking your own training runs, or inspecting a downloaded LoRA before you stack five of them on a workflow. If you're the kind of person who wants to know whether a LoRA was trained at 1024 with a low network dim before you trust it, this is your node.
How it works
It parses the input as JSON, sorts the keys alphabetically, and rebuilds everything as a line-by-line string with a --- LoRA Training Parameters --- header and footer. The important behavior is in the special cases: nested fields get real treatment rather than a raw JSON dump.
ss_tag_frequencyis exploded into a readable list of tag → count pairs.ss_bucket_infois broken into per-bucket resolution and count lines.ss_datasetsis expanded into per-dataset, per-key detail.- Tiny floats get scientific notation so a learning rate like
0.0001doesn't render as 12 decimal places of noise.
It also skips the internal _metadata_source flag that some extractors add, because nobody needs that in their readout.
The inputs that matter
One input, one output, no knobs.
metadata_json_string- a multiline STRING holding the JSON. Default"{}". Feed it from an extractor node or paste a raw JSON blob in.- The output is
formatted_metadata_string- a single STRING. Route it to a text display/save node, or just read it.
One behavior worth knowing: if the input isn't valid JSON, the node doesn't crash - it returns a string that starts with Error: Invalid JSON input... and includes the parser's message. That's friendlier than a red node, but it also means if you forget to check, your formatted output can silently be an error message. Keep an eye on it.
Installing it
Part of the EmAySee pack:
# ComfyUI Manager: search "ComfyUI_EmAySee_CustomNodes" and install
# or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/EmAySee/ComfyUI_EmAySee_CustomNodes
Restart ComfyUI afterward. It only needs Python's json module - no requirements.txt, nothing to pip install.
Common issues
The main thing to watch is the data shape. The special-cased fields (ss_tag_frequency, ss_bucket_info, ss_datasets) expect them as parsed dicts/lists, not as double-encoded JSON strings - if your extractor hands over the nested value still as a string, you'll get the "Raw data, could not parse" fallback line instead of the pretty breakdown. That's not a bug, it's a contract: the node assumes your extractor already parsed nested JSON. Also note the pack's README is AI-generated and doesn't document this node beyond a line - the category string "Mac Custom Nodes/LoRA Tools" is a leftover from the author's own setup, so don't be surprised to find it under a non-EmAySee menu heading.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| metadata_json_string | STRING | {} | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| formatted_metadata_string | STRING | — |