RM-LLM 0.7.1
RM-LLM 0.6.0 puts twelve LLM APIs in one node — and nothing runs on your GPU
- image
- video
- agent_request
- response
- reasoning
- response_json
Nothing in RM-LLM 0.6.0 runs on your graphics card. It's an HTTP client wearing a ComfyUI node, and that decides everything else about it. You pick a provider, set a key, connect your prompts, and the request goes out to OpenAI, Claude, Gemini, Grok, DeepSeek, Mistral, Groq, Together, Fireworks, or the long tail via OpenRouter, Featherless and LithosAI - twelve providers, one node.
One thing to get straight before anything else. If your plan is a local abliterated 8B rewriting rough ideas into structured prompts, offline and free per call, that's the other branch of this pattern. Here you trade local for frontier-chat quality and zero VRAM - and you pay with a per-call bill, a filter you can't patch out, and prompts that leave the machine.
How it actually works
One class, RMLLM050, registered under RM/API. On load it builds its own optional sockets from cached provider capability metadata - OpenRouter's published parameter schema plus reviewed contracts for the nine newer providers - so the Advanced section changes depending on the model you've selected. Switch from a Claude model to a DeepSeek one and the setting sockets move under you. That's "model-specific controls", with a hard edge: connect a setting the model doesn't advertise and you get an error naming it, not a silently ignored parameter.
Requests go out as streaming chat completions, except Anthropic and Gemini, which use their native Messages and GenerateContent APIs. Reference media is inlined as base64, capped at 48 MiB, and video only goes out for OpenRouter and Gemini when the model advertises video input.
The fields worth touching
You can ignore most of the panel. provider and model_name are the two that matter - click model_name and the node fetches and searches the provider's catalogue, or type an ID if you're on Fireworks and need an account-specific model. api_key_env wants the name of an environment variable, never the key. credential_source chooses between that and a masked session key, and timeout_seconds defaults to 300. endpoint is the fiddly one: Auto lets OpenRouter route among the hosts serving your model and fall back when one is down, while pinning a host disables fallbacks entirely.
Then the optional sockets: image and video, console_output to stream text and reasoning into the ComfyUI log, creativity for a 0–100 slider that fans out to temperature and top_p together, sampling sockets like temperature and top_p where the model supports them, and input_budget / thinking_budget / output_budget with green usage bars after a run. key_ticket is session-key plumbing - leave it empty; a ticket is single-use.
Outputs are three strings: response, reasoning when the model returns any, and response_json for the full payload including usage and tool calls. Wire response into anything expecting a STRING - a prompt box, a save-text node, a second RM-LLM node.
Install
ComfyUI Manager, search the pack title, or do it by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/RevenueMonkey/RM-Comfyui-LLM.git
Restart ComfyUI and refresh the browser; the node lives under RM/API. There are no pip dependencies to install and no weights to download - the project declares an empty dependency list and leans on what ComfyUI already ships. It does want a reasonably current ComfyUI, since it imports comfy_api.latest and the execution-context helpers. To update:
cd ComfyUI/custom_nodes/RM-Comfyui-LLM
git pull --ff-only
Keys: environment variable is the durable option - on Linux that's an owner-only file under ~/.config/rm-llm, and anything your launcher exports wins. Masked session keys live in server memory for that session. Either way keys are excluded from saved workflows, and masking is not encryption.
Where people get burned
Every queue is a real, billed request. Change-detection is deliberately disabled, so the node re-runs each time you hit queue even if nothing upstream changed. Correct for a text API, and a cost trap in a big graph.
A setting errors out or vanishes. You changed model and the new one doesn't advertise that parameter - or an endpoint pin removed it. The budget bars are estimates too.
Anthropic behaves differently. Its paired creativity slider is unavailable, so set temperature or top_p individually. Claude also needs an output token limit; the node supplies 4096 when you don't.
Your image was ignored. When a model doesn't advertise image input, the node warns and sends the request as text anyway, keeping the socket stable. New model names are assumed text-only until a capability record says otherwise.
Retries cover Featherless capacity and LithosAI rate limits; everyone else's 429 comes straight back at you. And 0.6.0 keeps the RM_LLM_050 ID so 0.5.0 workflows still load, but RM_LLM_040, RM_LLM_V3 and RM_LLM_V2 won't auto-convert.
One last thing, because this category earns it: a custom node is arbitrary Python with your user's OS access the moment ComfyUI loads it, and a node whose job is to hold your API key and call the network is exactly the shape of ComfyUI_LLMVISION, which shipped credential-stealing malware and ended in a federal guilty plea. This pack is new - first release late September 2026, no community track record - so read the code that touches your key.
Inputs (71)
| Name | Type | Default | Description |
|---|---|---|---|
| provider | STRING | OpenRouter | — |
| model_name | STRING | Click model_name in the RM-LLM panel to fetch and search the complete provider catalog. | |
| endpoint | STRING | Auto | — |
| api_key_env | STRING | OPENROUTER_API_KEY | Environment variable NAME only. The server reads its value; it is never sent to the browser. |
| credential_source | STRING | Environment variable | — |
| system_prompt | STRING | You are a helpful assistant. | — |
| user_prompt | STRING | Please respond to the following request. | — |
| parameters_json | STRING | {} | — |
| timeout_seconds | INT | 30010–3600 | — |
| imageopt | IMAGE | — | |
| videoopt | VIDEO | — | |
| key_ticketopt | STRING | — | |
| console_outputopt | BOOLEAN | false | Stream generated text and returned reasoning live to the ComfyUI console. |
| chat_template_kwargs.enable_thinkingopt | BOOLEAN | Enable the model's thinking mode. | |
| chat_template_kwargs.preserve_thinkingopt | BOOLEAN | Preserve reasoning in supplied conversation history. | |
| chat_template_kwargs.clear_thinkingopt | BOOLEAN | Clear reasoning from supplied conversation history. | |
| chat_template_kwargs.thinking_budgetopt | INT | Requested reasoning token budget. | |
| chat_template_kwargs.date_stringopt | STRING | Date supplied to the chat template. | |
| cache_controlopt | STRING | Enable automatic prompt caching. When set at the top level, the system automatically applies cache breakpoints to the last cacheable block in the request. When set on an individual content block, it marks an explicit cache breakpoint; block-level markers also work on OpenAI models that support explicit prompt caching — OpenRouter converts them to the provider's native format. | |
| debugopt | STRING | Debug options for inspecting request transformations (streaming only) | |
| frequency_penaltyopt | FLOAT | Model setting. Structured values are supplied as JSON text. | |
| image_configopt | STRING | Provider-specific image configuration options. Keys and values vary by model/provider. See https://openrouter.ai/docs/guides/overview/multimodal/image-generation for more details. | |
| logit_biasopt | STRING | Token ID to bias mapping. | |
| logprobsopt | BOOLEAN | Return token log probabilities when supported. | |
| max_completion_tokensopt | INT | Model setting. Structured values are supplied as JSON text. | |
| max_tokensopt | INT | Model setting. Structured values are supplied as JSON text. | |
| metadataopt | STRING | Key-value pairs for additional object information (max 16 pairs, 64 char keys, 512 char values) | |
| min_popt | FLOAT | Optional. Sets a minimum probability threshold relative to the most likely token for a token to be considered. Must be between 0 and 1. Set to 0 to disable. | |
| modalitiesopt | STRING | Output modalities for the response. Supported values are "text", "image", and "audio". | |
| parallel_tool_callsopt | BOOLEAN | Whether to enable parallel function calling during tool use. When true, the model may generate multiple tool calls in a single response. | |
| pluginsopt | STRING | Plugins you want to enable for this request, including their settings. | |
| predictionopt | STRING | Static predicted output content. Supported models can use this to reduce latency when much of the response is known in advance. | |
| presence_penaltyopt | FLOAT | Model setting. Structured values are supplied as JSON text. | |
| prompt_cache_keyopt | STRING | Model setting. Structured values are supplied as JSON text. | |
| prompt_cache_optionsopt | STRING | Request-level prompt-cache controls. `mode: "explicit"` disables OpenAI-managed breakpoints so only blocks marked with `prompt_cache_breakpoint` are cached. Only supported by OpenAI GPT-5.6 and newer. | |
| reasoningopt | STRING | RM-LLM reasoning settings: enabled, effort or max_tokens, when supported. | |
| reasoning_effortopt | STRING | Model setting. Structured values are supplied as JSON text. | |
| repetition_penaltyopt | FLOAT | Optional. Penalizes new tokens based on their appearance in the prompt and generated text. Values > 1 encourage new tokens; < 1 encourages repetition. | |
| response_formatopt | STRING | Model setting. Structured values are supplied as JSON text. | |
| seedopt | INT | Model setting. Structured values are supplied as JSON text. | |
| service_tieropt | STRING | The service tier to use for processing this request. `fast` is accepted as an alias for `priority`. | |
| session_idopt | STRING | A unique identifier for grouping related requests (e.g., a conversation or agent workflow). When provided, OpenRouter uses it as the sticky routing key, routing all requests in the session to the same provider to maximize prompt cache hits. Also used for observability grouping. If provided in both the request body and the x-session-id header, the body value takes precedence. Maximum of 256 characters. | |
| stopopt | STRING | Model setting. Structured values are supplied as JSON text. | |
| stop_server_tools_whenopt | STRING | Stop conditions for the server-tool agent loop. Any condition firing halts the loop (OR logic). When set, this overrides `max_tool_calls`. When a condition fires while the model is still emitting tool calls, the pending tool calls are executed and one final turn is made with tool calls disabled so the response ends with a natural-language answer instead of an unfinished tool call. | |
| temperatureopt | FLOAT | Model setting. Structured values are supplied as JSON text. | |
| tool_choiceopt | STRING | Model setting. Structured values are supplied as JSON text. | |
| toolsopt | STRING | Model setting. Structured values are supplied as JSON text. | |
| top_aopt | FLOAT | Consider only tokens with "sufficiently high" probabilities based on the probability of the most likely token. Not all providers support this parameter. | |
| top_kopt | INT | Model setting. Structured values are supplied as JSON text. | |
| top_logprobsopt | INT | Number of alternative token log probabilities. | |
| top_popt | FLOAT | Model setting. Structured values are supplied as JSON text. | |
| traceopt | STRING | Metadata for observability and tracing. Known keys (trace_id, trace_name, span_name, generation_name, parent_span_id) have special handling. Additional keys are passed through as custom metadata to configured broadcast destinations. | |
| useropt | STRING | Optional end-user identifier. | |
| include_reasoningopt | BOOLEAN | Include reasoning in the response when supported. | |
| stop_token_idsopt | STRING | Optional. Similar to stop, but uses token IDs to halt generation. The output might include these tokens unless they are special tokens. | |
| include_stop_str_in_outputopt | BOOLEAN | Optional. If set to true, includes stop strings in the output text. Defaults to false. | |
| min_tokensopt | INT | Optional. The minimum number of tokens to generate before EOS or stop_token_ids can be generated. | |
| chat_template_kwargsopt | STRING | Optional. Model-specific chat template parameters, such as toggling reasoning. See the chat_template_kwargs guide. | |
| nopt | INT | Number of choices. LithosAI Kimi K3 requires 1. | |
| output_configopt | STRING | Anthropic output_config, including effort where supported. | |
| thinkingopt | STRING | Provider-native thinking settings. Do not combine with the Thinking/Reasoning toggle. | |
| thinking_configopt | STRING | Gemini thinkingConfig, using its native field names. | |
| safety_settingsopt | STRING | Gemini safetySettings, using its native field names. | |
| creativityopt | FLOAT | 0–100 | 0–100: sets Temperature and top_p. Individually connected sampling inputs take precedence. |
| reasoning.enabledopt | BOOLEAN | Enable reasoning when supported by the selected model. | |
| agent_requestopt | RM_LLM_AGENT_REQUEST | A connected tool conversation uses the Responses transport. System/user prompts and model settings remain on this RM-LLM node. | |
| input_budgetopt | INT | 00–2147483647 | Tokens; 0 keeps existing/default behaviour. Positive budgets take precedence over corresponding token settings. Thinking and output may share one API limit. |
| thinking_budgetopt | INT | 00–2147483647 | Tokens; 0 keeps existing/default behaviour. Positive budgets take precedence over corresponding token settings. Thinking and output may share one API limit. |
| output_budgetopt | INT | 00–2147483647 | Tokens; 0 keeps existing/default behaviour. Positive budgets take precedence over corresponding token settings. Thinking and output may share one API limit. |
| routeropt | STRING | Direct or OpenRouter. Blank preserves routing in existing workflows. | |
| hosting_provideropt | STRING | Auto | OpenRouter hosting-provider slug or Auto; ignored for Direct. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| response | STRING | — |
| reasoning | STRING | — |
| response_json | STRING | — |