Song model · MiniMax Music 3 / YuE2
One Dropdown, Two Completely Different Music Engines
- profile_json
- model_id
- model_name
- system_prompt_file
- prompt_token_budget
- max_duration
- duration_ceiling
- info
MiniMaxMusicModelProfile generates nothing. It has one widget, it touches no audio, and if you're judging nodes by what they do it looks like dead weight in the graph. It is actually the node that decides whether everything downstream works or throws a confusing error at you ten minutes into a queue.
The reason is that the MiniMax Music Production Toolkit drives two song generators - MiniMax Music 3 and YuE2 - plus a third mode, YuE2 Cover, and those are not interchangeable at any level. Different prompt contract, different token budget, different duration window, different sampler defaults, different model files, different native nodes underneath. Swap the engine and you're swapping the whole pipeline, not a checkpoint.
This node is the single source of truth for which one you're running.
What it actually publishes
Pick a value on the model dropdown - MiniMax Music 3, YuE2, or YuE2 Cover - and the node returns that model's profile in eight sockets:
profile_json- the full record, and the wire that matters mostmodel_idandmodel_name- the stable id (minimax_music3,yue2,yue2_cover) and the display namesystem_prompt_file- which of the bundled LLM system prompts belongs to this engineprompt_token_budget- the size the prompt parser trims tomax_durationandduration_ceiling- the recommended length and the hard stop for that modelinfo- a one-line human summary that also lands in the ComfyUI log
profile_json fans out to the settings node, the cover nodes, the model-check node and the generation node. If you've read our node-plumbing essay, this is the classic value-node pattern: one authoritative value broken out of a widget so five consumers can't drift apart.
Why the two engines can't share settings
The differences are baked into the profile, and they're real. MiniMax Music 3 takes a long-form production caption and a sectioned Lyrics field, with a hard encoder limit around 5,000 tokens on caption-plus-lyrics; its shipped window is a 300-second default inside a 360-second ceiling. YuE2 takes a Style description synchronized section-by-section with Lyrics, plans an ABC score natively before synthesis, and its ceiling is much higher - 900 seconds - with a 360-second example default. Its context is shared and generous, so the practical limit is your patience, not the tokenizer.
Same with sampling. MiniMax ships euler/simple at cfg 1.7; YuE2 ships dpm_2/sgm_uniform at cfg 1.0. The settings node carries both sets and picks one, but it picks based on this wire. Pull this node out and the toolkit falls back to its default profile silently, which is exactly how you end up wondering why your YuE2 step count did nothing.
Install, same as the rest of the pack
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 # the same Python that runs ComfyUI
Restart ComfyUI and hard-refresh the browser. There's no model file for this node - the weights belong to MusicGeneration and the model-check node. On a machine with an existing toolkit install, ComfyUI Manager's search for the pack title works too, though the pack moves fast (3.0.0 landed 2026-09-16) and the frontend files matter - update them, not just the Python.
Where people get burned
The first is a saved workflow where someone changed the dropdown but not the settings group: MusicGeneration checks that the settings' song_model matches the profile, and if they disagree you get "Song model and generation settings disagree; connect the same profile to both." That's not a bug, it's this node being ignored.
The second is YuE2 Cover. Selecting it switches on a path that wants native AudioEncoderLoader and SheetSage2AudioToABC nodes in your ComfyUI build plus a ~1.39 GB SheetSage2 encoder. If your build doesn't have them, the failure is downstream - see the cover nodes rather than blaming the dropdown.
One nicety worth knowing: the dropdown is data-driven from model_profiles.json, and the node forces validation to pass. An unknown or stale value in an old workflow falls back to the default profile with a log line instead of turning the node red. Don't read that as "any string works" - it means the author chose a soft landing over a validation wall.
If you're building a workflow by hand, wire this before anything else and treat its info line as your sanity check. Two seconds of reading saves you a five-minute generation you'll throw away.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| model | COMBO | MiniMax Music 3 | ComfyUI model object to sample. This wrapper does not modify the model; it forwards it to the core KSampler while also returning sampler/scheduler names. |
Outputs (8)
| Name | Type | Description |
|---|---|---|
| profile_json | STRING | — |
| model_id | STRING | — |
| model_name | STRING | — |
| system_prompt_file | STRING | — |
| prompt_token_budget | INT | — |
| max_duration | FLOAT | — |
| duration_ceiling | FLOAT | — |
| info | STRING | — |