Save Production JSON
One JSON file per song that could rebuild the whole thing
- saved_path
- configuration_json
Generating a song you like is one thing. Being able to recreate it six weeks later - same prompt, same seeds, same settings - is the thing that actually separates a demo from a production habit. MiniMaxSaveProductionJSON is the pack's answer: it writes one canonical, atomic JSON per song that records the entire generation, enough that the pack's metadata loader can rebuild the track (with modified settings) from that file alone.
It's the last node in the chain for a reason, and it's an output node - everything funnels into it. After the original FLAC, the release FLAC, the release MP3 and the album cover have all been saved, this node gathers the evidence and writes the record. Note the deliberate ordering: it refuses to run until those upstream saves have happened, because a configuration file that claims artifacts exist when they don't is worse than no record at all.
What goes in the JSON
The whole story, in one place:
- the LLM stage - system prompt, user prompt, raw output, status, even the thinking;
- the structured-prompt summary and the parsed Caption / Lyrics / Title / Image_Prompt with provenance;
- seeds and generation settings - MiniMax text seed/CFG/top-k, sampler seed/steps/CFG/denoise, duration;
- every audio-enhancement report: declip, PRE/POST low-pass, FlashSR settings, hybrid crossover, HF repair, release prep;
- standard audio tags, and the actual saved file paths for the original, both release formats, and the cover.
That's the reproducibility story: together with the outputs section it's a complete generation record, not a sidecar of loose metadata.
The inputs you'll actually touch
The required list looks intimidating but most of it is pre-wired in the example workflow:
original_audio_save_json,release_flac_save_json,release_mp3_save_json- connect these to thesave_info_jsonoutputs of the three audio savers. These connections are what make the node wait for the files to exist.artwork_path- the saved JPG path, same idea for the cover.configuration_prefix- the destination base, fed from the MiniMax Output Paths node; its directory is controlled by that node'sconfiguration_subdir(defaultjson).audio_tags_jsonandtitle- used for the consistentAlbum - Titlefilename and copied into the record.collision_mode-auto_increment(recommended for batches),overwrite, orerror_if_exists.filename_mode-album - titleis recommended so the JSON matches your release audio naming; it doesn't touch embedded title metadata.create_directories- just leave it on.
Everything else - the llm_*, caption/lyrics/image_prompt, the seed fields, and the long list of *_json enhancement reports - is optional and fed by the corresponding nodes in the chain. Wire what you have; the payload only includes what you connect.
Outputs
saved_path- where the JSON landed.configuration_json- the rendered JSON itself, if you want to pipe it somewhere.
Where people get confused
First: no JSON beside your FLAC files is not a bug. Since v1.0.4 the pack deliberately writes one centralized file per song into the json/ subdirectory instead of duplicate sidecars - look in MiniMax Output Paths → configuration_subdir. Second, if the JSON never appears, the odds are an upstream save failed; check the ComfyUI log for the first failed saver, because this node won't paper over it. And the file is written atomically (temp file, then rename), so an interrupted write leaves you with the old state rather than a half-written record.
Installing
cd ComfyUI/custom_nodes
git clone https://github.com/jplenio/ComfyUI-MiniMax-Music-Production-Toolkit.git
cd ComfyUI-MiniMax-Music-Production-Toolkit
python -m pip install -r requirements.txt
Restart ComfyUI and hard-refresh the browser. If you're ever tempted to skip this node for a quick test, that's fine - it's pure bookkeeping, and everything before it still works. But for anything you might want to revisit, the five minutes of wiring is worth it. Future-you, six weeks out, will thank present-you for the record.
Inputs (56)
| Name | Type | Default | Description |
|---|---|---|---|
| configuration_prefix | STRING | Destination prefix from MiniMax Output Paths. Its directory is controlled by configuration_subdir (default log/); the node creates the final .json filename from Album/Title by default. | |
| audio_tags_json | STRING | Standard tags containing Title/Artist/Album/etc. They are copied into the canonical JSON and are also used for consistent Album - Title JSON naming. | |
| title | STRING | Generated song title. Used as a filename fallback and retained in the canonical configuration JSON; it does not alter audio metadata here. | |
| original_audio_save_json | STRING | Save-info JSON emitted by the original-audio saver. Connecting it makes this node wait until the original audio file has been written and records path, format, sample rate, peak and applied save gain. | |
| release_flac_save_json | STRING | Save-info JSON emitted by the release FLAC saver. Connecting it makes this node wait until the FLAC exists and records its output details. | |
| release_mp3_save_json | STRING | Save-info JSON emitted by the release MP3 saver. Connecting it makes this node wait until the MP3 exists and records its output details. | |
| artwork_path | STRING | Saved JPG path. This dependency makes the configuration JSON run after artwork saving and records the cover path in the outputs section. | |
| collision_mode | COMBO | auto_increment | How to handle an existing JSON with the same Album - Title filename. auto_increment is recommended for batches; overwrite replaces it; error_if_exists stops the run. |
| filename_mode | COMBO | album - title | Filesystem naming for the JSON only. 'album - title' is recommended so the configuration file matches the release audio naming. Embedded audio TITLE metadata is unaffected. |
| create_directories | BOOLEAN | true | Create the configured JSON directory automatically when it does not yet exist. Recommended: ON. |
| metadata_jsonopt | STRING | LEGACY base payload from the pre-2.0.0 song-metadata node. The direct inputs below overlay it; leave unconnected in the current example workflow. | |
| llm_system_promptopt | STRING | The system prompt that was sent to the LLM; recorded in the canonical JSON so the exact prompt is reproducible. | |
| llm_user_promptopt | STRING | The assembled user prompt that was sent to the LLM (structured brief + description). | |
| llm_outputopt | STRING | Raw assistant text the LLM returned, before parsing, recorded in the JSON. | |
| llm_statusopt | STRING | Status line from the LLM chat node (model, session, character count) for diagnostics. | |
| llm_thinkingopt | STRING | Reasoning the model produced next to its answer. Stored in the JSON only; it never reaches the music model. | |
| structured_summary_jsonopt | STRING | Summary of the structured prompt resolution (origin, resolved fields, overrides). | |
| captionopt | STRING | Generated Caption that was sent to the music model, recorded in the production JSON. | |
| lyricsopt | STRING | Generated Lyrics / structural section map sent to MiniMax Music 3. | |
| image_promptopt | STRING | Artwork prompt used by the FLUX.2 cover branch, recorded in the production JSON. | |
| source_nameopt | STRING | Stable source name derived from the prompt selection or title. | |
| source_pathopt | STRING | Where the prompt came from (prompt file path, <manual> or the LLM marker). | |
| prompt_originopt | STRING | Origin marker: folder / manual / external_comfyui_llm / manual_override. | |
| prompt_provenance_jsonopt | STRING | Parser provenance record (source mode, user prompt, budget/trim info, manual-field usage). | |
| generation_seedopt | INT | Seed of this song's generation, recorded in the production JSON. | |
| run_indexopt | INT | 1-based variant index of this song within the batch, recorded in the JSON. | |
| variant_countopt | INT | Total number of variants generated for this prompt, recorded in the JSON. | |
| max_durationopt | FLOAT | MiniMax Music 3 maximum duration in seconds (300 = 5 minutes). | |
| text_seedopt | INT | Seed the text encoder ran with, recorded in the production JSON. | |
| text_cfg_scaleopt | FLOAT | CFG scale of the text encoder, recorded in the production JSON. | |
| text_top_kopt | INT | Top-k of the text encoder, recorded in the production JSON. | |
| ksampler_seedopt | INT | Seed the music sampler ran with, recorded so the take can be reproduced. | |
| ksampler_stepsopt | INT | Sampler step count this song ran with, recorded in the production JSON. | |
| ksampler_cfgopt | FLOAT | Sampler CFG this song ran with, recorded in the production JSON. | |
| denoiseopt | FLOAT | Sampler denoise strength, recorded in the production JSON. | |
| flashsr_settings_jsonopt | STRING | FlashSR settings report (inference rate, chunk/overlap sizes, low-pass flag, output rate, device). | |
| pre_presetopt | STRING | Name of the PRE low-pass preset that was used, recorded in the JSON. | |
| pre_settings_jsonopt | STRING | Effective PRE low-pass settings report, recorded in the production JSON. | |
| post_presetopt | STRING | Name of the POST low-pass preset that was used, recorded in the JSON. | |
| post_settings_jsonopt | STRING | Effective POST low-pass settings report, recorded in the production JSON. | |
| hybrid_crossover_jsonopt | STRING | FlashSR Hybrid Crossover report (sample rates, crossover, HF mix, mode). | |
| hf_repair_jsonopt | STRING | High-frequency cymbal/shimmer repair report, recorded in the production JSON. | |
| declip_jsonopt | STRING | De-clipping / overload repair report, recorded under the restoration section. | |
| release_prep_jsonopt | STRING | Release Prep report (sample rate, measured/effective loudness, true peak, gain). | |
| workflow_nameopt | STRING | Music Production Toolkit 3.1.3 | Name of the workflow that produced this run, recorded in the canonical JSON. |
| minimax_prompt_mdopt | STRING | Markdown prompt report, written next to the JSON so the exact prompt survives with the song. | |
| eq_report_jsonopt | STRING | Per-band EQ report from automatic and manual EQ, recorded in the EQ section of the production JSON. | |
| auto_eq_analysis_jsonopt | STRING | Auto-EQ analysis: detected tonal difference against the target and the proposed gain per band. | |
| mastering_jsonopt | STRING | Mastering report: measured LUFS and true peak plus the applied gain reduction. | |
| resource_profile_jsonopt | STRING | Detected hardware profile and the model recommendation derived from it, recorded for reproducibility. | |
| llm_runtime_jsonopt | STRING | LLM runtime details (backend, model file, context size, GPU placement) as reported by the chat node. | |
| model_identity_jsonopt | STRING | Identifiers of the loaded song and artwork models, so the JSON records which weights produced the audio. | |
| template_versionopt | STRING | Version or fingerprint of the prompt template that produced the text, so a later prompt change can be told apart. | |
| artifact_reduction_jsonopt | STRING | Artifact-reduction report: what was detected and how much was removed. | |
| cover_score_jsonopt | STRING | Cover-only: the score adaptation record (lyrics mode, lead instrument, whether and how the vocal line was rewritten, and the vocal note counts and phrase grids). Omitted for normal songs. | |
| cover_lyrics_jsonopt | STRING | Cover-only: the Whisper transcription and timestamp record for new/original-lyrics covers (checkpoint, device, precision, detected language and confidence, segment count, transcript). Omitted when the mode does not use Whisper. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| saved_path | STRING | — |
| configuration_json | STRING | — |