Nodes/ComfyUI_EmAySee_CustomNodes/EmAySee_MetadataFormatter
ComfyUI Node

EmAySee_MetadataFormatter

Turn your LoRA's training JSON into something a human can read

By EmAySee·Created about a year ago·Updated 4 months ago· 2
EmAySee_MetadataFormatter
    • formatted_metadata_string
    metadata_json_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_frequency is exploded into a readable list of tag → count pairs.
    • ss_bucket_info is broken into per-bucket resolution and count lines.
    • ss_datasets is expanded into per-dataset, per-key detail.
    • Tiny floats get scientific notation so a learning rate like 0.0001 doesn'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.

    CategoryMac Custom Nodes/LoRA Tools

    Inputs (1)

    NameTypeDefaultDescription
    metadata_json_stringSTRING{}

    Outputs (1)

    NameTypeDescription
    formatted_metadata_stringSTRING