MiniMax M3
MiniMax M3 without a GPU
- messages
- text
This is the node that makes people do a double take: a text generation model living in the Runware/Text/minimax folder of your node menu, right next to the image and video stuff. The ComfyUI-Runware pack is Runware's whole cloud catalog exposed as nodes, and MiniMax M3 is its chat/text entry point. You type into it, it returns a string, and you can feed that string anywhere a text box would go in a workflow - prompt templates, captions, batch variations, whatever you can dream up.
Why would you want an LLM inside your graph instead of a browser tab? Two reasons, really. First, no local GPU required and no 20GB model download - the whole ComfyUI-Runware pack runs on Runware's machines, so a weak laptop handles M3 the same way a 4090 does. Second, it makes text a first-class part of the pipeline. Build a workflow that drafts a prompt, pipes it into an image model, and you've automated the boring part of prompting.
What you actually set
The only required input is messages of type RUNWARE_MESSAGES - that's the conversation history, produced by a companion builder node in the pack. If you see a socket you're not sure how to fill, that's the one. Everything else is optional and sensibly defaulted:
settings.systemPrompt- the system-level instruction that steers the model across the whole generation. This is where you put "you are a prompt engineer" style framing.settings.temperature- randomness, 0 to 2, default 1. Lower for deterministic, higher for creative.settings.maxTokens- up to a generous 512,000 (default 128k). Long-form output lives here.settings.topP- nucleus sampling, default 0.95; most people leave it alone.numberResults- 1 to 4, one per seed, if you want variations.toolChoiceand thetoolChoice.name/toolChoice.typepair - for tool-calling. Turn the toggle on and pickauto,any,tool, ornone;toolplus a name forces the model to call a specific tool. If that means nothing to you, ignore it.
The single output is text (a STRING), ready to wire into whatever consumes text next.
How it works
Mechanically this node is identical to its siblings in the pack: it builds a request with the model AIR and taskType and ships it over REST through the Runware SDK, then reads the text back from the response. That's it - no local inference, no tokenizer on your machine. The one genuinely useful extra is that the node's title bar shows cost per run, which matters more here than anywhere, because LLM output is metered by token and it's very easy to generate 10,000 words of something you didn't want. One reddit poster called Runware out on exactly this: it's so fast you can get carried away and forget about the cost. includeUsage adds token counts to the response if you want to keep score.
Installing the pack
ComfyUI Manager is the easy route - search Runware and install. Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/Runware/ComfyUI-Runware
pip install -r ComfyUI-Runware/requirements.txt
Restart ComfyUI. There are no models to download; the dependencies (runware-sdk, pillow, soundfile) are light. You do need an API key: paste one into ComfyUI Settings → Runware API key, or set RUNWARE_API_KEY, or run runware auth login once.
Troubleshooting
The failure you'll actually hit is the missing-key error: "No Runware API key. Set RUNWARE_API_KEY or run runware auth login." Fix that first, before touching anything else. If the node returns empty output, check that a messages builder is actually wired in - with no conversation, there's nothing to answer. And if the price is a surprise, remember every run prints its cost on the node, and there's no free tier to lean on.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| messages | RUNWARE_MESSAGES | — | |
| numberResultsopt | INT | 11–4 | Number of results to generate. Each result uses a different seed, producing variations of the same parameters. |
| includeUsageopt | BOOLEAN | false | Include token usage statistics in the response. |
| settings.maxTokensopt | INT | 1280001–512000 | Maximum number of tokens to generate in the response. |
| settings.systemPromptopt | STRING | System-level instruction that guides the model's behavior and output style across the entire generation. | |
| settings.temperatureopt | FLOAT | 1.000–2 | Controls randomness in generation. Lower values produce more deterministic outputs, higher values increase variation and creativity. |
| toolChoiceopt | BOOLEAN | false | Enable to set toolChoice. Off uses the model's default. |
| toolChoice.nameopt | STRING | Name of the specific tool the model must call. Required when type is `tool`. | |
| toolChoice.typeopt | COMBO | (default) | Strategy the model uses to decide when and which tools to call. |
| settings.topPopt | FLOAT | 0.950–1 | Nucleus sampling parameter that controls diversity by limiting the probability mass. Lower values make outputs more focused, higher values increase diversity. |
| outputFormatopt | COMBO | TEXT | Output format for the generated text. |
| advanced_jsonopt | STRING | Optional JSON merged into the request. For: tools |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| text | STRING | — |