ComfyUI-EACloudNodes
A collection of ComfyUI custom nodes for interacting with various cloud services. These nodes are designed to work with any ComfyUI instance, including cloud-hosted environments (such as MimicPC) where users may have limited system access.
Nodes (3)
ComfyUI-EACloudNodes
A collection of ComfyUI custom nodes for interacting with various cloud services, such as LLM providers Groq and OpenRouter. These nodes are designed to work with any ComfyUI instance, including cloud-hosted environments where users may have limited system access.
Note: All nodes use the ComfyUI v3 node spec (comfy_api.latest) and are also
registered through the legacy NODE_CLASS_MAPPINGS path.
Installation
Use ComfyUI-Manager, or install manually:
- Clone this repository into your ComfyUI custom_nodes folder:
cd ComfyUI/custom_nodes
git clone https://github.com/EnragedAntelope/ComfyUI-EACloudNodes
- Restart ComfyUI
That's the whole install — the pack declares no Python dependencies of its own.
Everything the nodes use (including Pillow and requests) ships with ComfyUI
itself.
Current Nodes
Common Features Across LLM Nodes
The following parameters are available in both OpenRouter and Groq nodes:
Common Parameters:
api_key: ⚠️ Your API key (Note: key will be visible in workflows)model: Model selection (dropdown or identifier)system_prompt: Optional system context settinguser_prompt: Main prompt/question for the modeltemperature: Controls response randomness (0.0-2.0)top_p: Nucleus sampling threshold (0.0-1.0)frequency_penalty: Token frequency penalty (-2.0 to 2.0)presence_penalty: Token presence penalty (-2.0 to 2.0)response_format: Choose between text or JSON object outputseed_mode: Control reproducibility (Fixed, Random, Increment, Decrement)max_retries: Maximum retry attempts (0-5) for recoverable errorsimage_input: Optional image for vision-capable modelsimage_format: Encoding forimage_input— PNG (lossless) or JPEG (much smaller payload for photos)additional_params: Optional JSON object for extra model parameters
Common Outputs:
response: The model's generated text or JSON responsestatus: Detailed information about the request, including model used and token countshelp: Static help text with usage information and repository URL
Groq Chat (v3)
Interact with Groq's API for ultra-fast inference with various LLM models. Now fully compatible with ComfyUI v3 spec!
Features:
- ComfyUI v3 compatible - Enhanced reliability and validation
- Live model list - the dropdown can be rebuilt from the Groq API (5-min cache)
- High-speed inference with Groq's optimized hardware
- Support for vision-capable models
- Real-time token usage tracking
- Automatic retry mechanism with exponential backoff
- Enhanced input validation
- Detailed tooltips for all parameters
- Debug mode for troubleshooting
Available Models:
The node ships with a static list of known chat models. To pick up newly released
models, run the node once with a valid API key and then press ComfyUI's Refresh
button — the dropdown is rebuilt from GET /openai/v1/models (cached for 5 minutes,
falling back to the static list whenever the API is unreachable).
Rows shown as --- Category --- are group labels, not selectable models.
Featured:
openai/gpt-oss-120b- Default - 131K context, 500 T/secgroq/compound- Agentic system with web search and code execution
Production: Chat (stable, recommended for production use):
openai/gpt-oss-20b- Faster and cheaper, 131K context, 1000 T/sec
Production: Systems:
groq/compound-mini- Lightweight agentic system
Preview: Chat (experimental, may be discontinued at short notice):
minimaxai/minimax-m2.7- 196K context, 131K max completionopenai/gpt-oss-safeguard-20b- Safety-focused reasoning modelqwen/qwen3.6-27b- Vision, 131K context, accepts files up to 20 MB
Not offered in the dropdown:
- Groq's speech models (Whisper, Orpheus) are served by
/audio/transcriptionsand/audio/speech, so they cannot answer a chat-completions request at all. Selecting one is rejected with a clear message.- The
llama-prompt-guard-2-*classifiers work over chat completions but have a 512-token window and return a safety score rather than prose, so they are left out of the curated list. Reach them withManual Inputif you want them.
Parameters:
api_key: ⚠️ Your Groq API key (Get from console.groq.com/keys)model: Select from available models or choose "Manual Input" for custom modelsmanual_model: Enter custom model identifier (only used when "Manual Input" is selected)system_prompt: Optional system context (disable for vision models)user_prompt: Main prompt/question for the modelsend_system: Toggle system prompt sending (must be 'no' for vision models)temperature: Controls response randomness (0.0-2.0)- Lower (0.0-0.3): More focused and deterministic
- Higher (0.7-2.0): More creative and varied
top_p: Nucleus sampling threshold (0.0-1.0)- Lower (0.0-0.3): More focused vocabulary
- Higher (0.7-1.0): More diverse word selection
max_completion_tokens: Maximum tokens to generate (1-131,072, varies by model)frequency_penalty: Reduce token frequency repetition (-2.0 to 2.0)presence_penalty: Encourage topic diversity (-2.0 to 2.0)response_format: Choose between "text" or "json_object" outputseed_mode: Control reproducibilityfixed: Use seed_value for consistent outputsrandom: New random seed each timeincrement: Increase seed by 1 each rundecrement: Decrease seed by 1 each run
seed_value: Seed for 'fixed' mode (0-9007199254740991)max_retries: Auto-retry attempts for recoverable errors (0-5)debug_mode: Enable detailed error messages and request debuggingimage_input: Optional image for vision-capable models (max 2048x2048)image_format: PNG (lossless) or JPEG (smaller request for photographic content)additional_params: Extra model parameters in JSON format
Outputs:
response: The model's generated text or JSON responsestatus: Detailed request information including model, seed, and token countshelp: Comprehensive help text with usage information
Vision Model Usage:
- Select a vision-capable model —
qwen/qwen3.6-27bat time of writing, or any other viaManual Input - Connect an image to the
image_inputparameter - Set
send_systemto "no" (vision models often reject system prompts) - Describe what you want to know about the image in
user_prompt
An attached image is always sent. The node does not refuse a request based on its own idea of which models accept images — that check would go stale every time Groq reshuffles its line-up and would block models that actually work. Groq is the authority; if it refuses the image, the error comes back with a hint naming the models that did look capable.
Images are capped at 2048 pixels per dimension, and only the first image of a batch is sent.
Production vs Preview Models:
- Production Models: Stable, reliable, meet high standards for speed/quality. Recommended for production use.
- Preview Models: Experimental, intended for evaluation only. May be deprecated with short notice.
OpenRouter Chat (v3)
Interact with OpenRouter's API to access various AI models for text and vision tasks. Now fully compatible with ComfyUI v3 spec!
Features:
- ComfyUI v3 compatible - Enhanced reliability and validation
- Access to multiple AI providers through a single API
- Free-model dropdown built live from OpenRouter's public catalogue
- Vision support, with capability read from the catalogue rather than hardcoded
- JSON output support
- Automatic retry mechanism with exponential backoff
- Enhanced input validation
- Detailed tooltips for all parameters
- Debug mode for troubleshooting
Model List:
The dropdown is built at load time from OpenRouter's public catalogue
(GET /api/v1/models) and lists every model priced at $0 for both prompt and
completion, plus a Manual Input entry. It is not a hand-maintained list, so it
tracks OpenRouter's free tier as it changes; press ComfyUI's Refresh to rebuild
it (cached for 5 minutes).
To use a paid model, select Manual Input and enter its provider/model-name
id in manual_model.
Use the OpenRouter Models node below to browse what is currently on offer, including pricing and context lengths.
Parameters:
api_key: ⚠️ Your OpenRouter API key (Get from https://openrouter.ai/keys)model: Select from free models or choose "Manual Input" for custom modelsmanual_model: Enter custom model identifier (only used when "Manual Input" is selected)base_url: OpenRouter API endpoint URL (default: https://openrouter.ai/api/v1/chat/completions). Must behttps://unless it points at localhost; a non-OpenRouter endpoint prints a visible warning on every run, because your API key is sent whereverbase_urlpoints.system_prompt: Optional system context settinguser_prompt: Main prompt/question for the model (required)send_system: Toggle system prompt on/offtemperature: Controls response randomness (0.0-2.0)- Lower (0.0-0.3): More focused and deterministic
- Higher (0.7-2.0): More creative and varied
top_p: Nucleus sampling threshold (0.0-1.0)top_k: Vocabulary limit (1-1000)max_tokens: Maximum tokens to generate (1-32,768)frequency_penalty: Reduce token frequency repetition (-2.0 to 2.0)presence_penalty: Encourage topic diversity (-2.0 to 2.0)repetition_penalty: OpenRouter-specific repetition penalty (1.0-2.0, 1.0=off)response_format: Choose between "text" or "json_object" outputseed_mode: Control reproducibility (Fixed, Random, Increment, Decrement)seed_value: Seed for 'fixed' mode (0-9007199254740991)max_retries: Auto-retry attempts for recoverable errors (0-5)debug_mode: Enable detailed error messages and request debuggingimage_input: Optional image for vision models (max 2048x2048)image_format: PNG (lossless) or JPEG (smaller request for photographic content)additional_params: Extra model parameters in JSON format
Outputs:
response: The model's generated text or JSON responsestatus: Detailed request information including model, seed, and token countshelp: Comprehensive help text with usage information
Vision Model Usage:
- Select a vision-capable model — from the free dropdown, or via
Manual Inputfor a paid one such asopenai/gpt-4o - Connect an image to the
image_inputparameter - Describe what you want to know about the image in
user_prompt
Image capability is read from OpenRouter's own catalogue (architecture.input_modalities),
so it stays correct as models come and go. A model the catalogue lists as text-only is
rejected before the request is sent; an id the catalogue does not know is passed through
so OpenRouter can answer for itself. Images are capped at 2048 pixels per dimension, and
only the first image of a batch is sent.
OpenRouter Models Node
Query and filter available models from OpenRouter's API.
Features:
- Retrieve complete list of available models
- Filter models using custom search terms (e.g., 'free', 'gpt', 'claude')
- Sort models by name, pricing, or context length
- Detailed model information including pricing and context length
- Easy-to-read formatted output
Parameters:
api_key: Optional — OpenRouter's model catalogue is public, so this can be left empty (Note: if you do supply a key it will be visible in saved workflows)filter_text: Text to filter models.freeis matched against actual pricing rather than the model name; all other terms are matched against id, name, and description, and multiple terms are AND-ed togethersort_by: Sort models by name, pricing, or context lengthsort_order: Choose ascending or descending sort order
Usage Guide
Basic Text Generation
- Add an LLM node (OpenRouter or Groq) to your workflow
- Set your API key
- Choose a model
- (Optional) Set system prompt for context/behavior
- Enter your prompt in the
user_promptfield - Connect the node's output to view results
Vision Analysis
- Add an LLM node to your workflow
- Choose a vision-capable model
- Connect an image output to the
image_input - For Groq vision models, set 'send_system' to 'no'
- Add your prompt about the image in
user_prompt - Connect outputs to view response and status
Advanced Usage
- Use
system_promptto set context or behavior - Adjust temperature and other parameters to control response style
- Select
json_objectformat for structured outputs - Monitor token usage via the status output
- Chain multiple nodes for complex workflows
- Use seed_mode for reproducible outputs (Fixed) or controlled variation (Increment/Decrement)
- Use
additional_paramsto set model-specific parameters in JSON format:{ "min_p": 0.1, "stop": ["\n\n"] }
Parameter Optimization Tips
- Temperature:
- Lower (0.1-0.3): More focused, deterministic responses
- Higher (0.7-1.0): More creative outputs
- Top-p:
- Lower (0.1-0.3): More predictable word choices
- Higher (0.7-1.0): More diverse vocabulary
- Penalties:
- Use
presence_penaltyto reduce topic repetition - Use
frequency_penaltyto reduce word repetition
- Use
- Seed Mode:
fixed: Use for reproducible outputs (same seed + params = same output)random: Use for varied responses each timeincrement/decrement: Use for controlled variation across runs
- Token Management:
- Monitor token usage in status output to optimize costs
- Adjust
max_completion_tokensto control response length
Error Handling
Both nodes provide detailed error messages for common issues:
- Missing or invalid API keys
- Model compatibility issues
- Image size and format requirements
- JSON format validation
- Token limits and usage
- API rate limits and automatic retries
- Parameter validation errors
Enable debug_mode in the Groq node for detailed troubleshooting information.
Version History
v2.2.2 (Current)
- Fixed: missing API key errors never reached the UI
validate_inputs()on the Groq and OpenRouter chat nodes has been removed. ComfyUI's v3 validation fan-out repeated its returned error string across every widget input (a wall of duplicate console errors) and blockedexecute()outright, so the message never reached the node's ownstatus/help output — a user with no API key set saw console noise instead of "API key is required" in the UI- The same checks (API key required, manual model required, endpoint
policy,
additional_paramsJSON shape) now run insideexecute()and surface through the node's status output where the UI actually shows them
v2.2.1
- Zero-dependency packaging: removed
pillowandrequestsfromrequirements.txtandpyproject.toml. ComfyUI itself requires both, so every ComfyUI environment already provides them — declaring them only added a redundant pip install step. Existing installs need no action; the pack has nothing of its own to install - CI: traced the Node.js 20 deprecation warning in the publish workflow to
the pinned
Comfy-Org/publish-node-action, which still callsactions/setup-python@v5internally at its pinned commit. Upstream has published nothing newer, and this repo's own steps are current (actions/[email protected]). Cosmetic until upstream moves
v2.2.0
- Fixed: the pack failed to register in ComfyUI
- The new shared module was imported absolutely (
import chat_common). ComfyUI executes a custom node's__init__.pyunder a synthetic module name and never adds the folder tosys.path, so this raisedModuleNotFoundErrorand no node in the pack loaded. Sibling imports are now relative - The test suite now loads the repository the way ComfyUI does, and re-runs that load in a clean interpreter, so this class of failure cannot pass again
- The new shared module was imported absolutely (
- Security
- OpenRouter:
base_urlmust now behttps://unless it points at localhost. A shared workflow could previously point the endpoint at an attacker host and receive the user's API key silently; a non-OpenRouter endpoint also prints a visible warning on every run The endpoint rule is enforced inexecute()as well as at validation time, because abase_urlconverted to an input socket has no value ComfyUI can validate before the graph runs - Debug mode no longer dumps multi-megabyte base64 image data into the status output; data URIs are summarized instead
- The custom-endpoint warning no longer says the key "was sent" on paths that sent nothing (an early validation failure), so the one message a user must be able to trust stays accurate
- OpenRouter:
- Packaging
- Removed
torch/torchvisionfromrequirements.txtandpyproject.toml— ComfyUI's environment owns torch (often a CUDA-specific build), and pip could clobber it with a CPU-only wheel. The torchvision dependency is gone entirely; tensor conversion now uses torch + PIL directly - Fixed the test suite failing on Windows (
UnicodeDecodeErroron cp1252 locales)
- Removed
- Robustness / UX
- Retries honour the server's
Retry-Afterheader, use jittered exponential backoff, and check ComfyUI's interrupt signal so a queued Cancel is respected instead of blocking through up to minutes of sleeps - New
image_formatinput on both chat nodes: PNG (lossless, default) or JPEG (much smaller payload for photographic content) - Seed-counter eviction removes oldest entries first instead of clearing all tracked counters; model-list caches are now thread-safe
- OpenRouter's default-model choice now walks a preference list like Groq's instead of hardcoding one id with an alphabetical fallback
- Retry status messages report attempt counts correctly
- Retries honour the server's
- Housekeeping
- Shared chat-node plumbing (image encoding, seeds, retry loop, redaction)
moved into
chat_common.py, removing ~300 duplicated lines - Removed dead per-module Extension classes and
comfy_entrypoint()s; the combined extension in__init__.pyis the only v3 entry path - Publish workflow permissions reduced to
contents: read; both actions pinned to immutable commit SHAs (@v1is a mutable branch), checkout no longer persists credentials for the third-party publish step
- Shared chat-node plumbing (image encoding, seeds, retry loop, redaction)
moved into
v2.1.0
- Model list refreshed against Groq's current catalogue
llama-3.3-70b-versatile(the node's default) andllama-3.1-8b-instanthave been retired by Groq. The default is nowopenai/gpt-oss-120b; before this change the node failed out of the box.meta-llama/llama-4-scout-17b-16e-instructandqwen/qwen3-32bare gone- Added
minimaxai/minimax-m2.7andqwen/qwen3.6-27b(the current vision model) - The
llama-prompt-guard-2-*classifiers left the curated dropdown (512-token safety classifiers, not chat models); still reachable viaManual Input
- Built to absorb model churn (see Keeping up with model churn above)
- An attached image is always sent; the node no longer refuses one on the strength of its own capability list, which also fixes a path where a stale list would have silently dropped the image instead of sending it
- Modality metadata outranks name heuristics everywhere, in both directions
- The default model is resolved against the list that actually loaded, so a retired default can no longer break the node on a fresh drop-in
- OpenRouter: embedding, reranking and speech models are filtered out of the free dropdown — they are priced at $0 and so passed a pricing-only test straight into a chat model list
- Correctness
- Groq: send
max_completion_tokensinstead of the deprecatedmax_tokens - Groq: dropped Whisper/Orpheus from the chat dropdown — they are served by the audio endpoints and could never answer a chat-completions request
- Groq: selecting a
--- Category ---row is now rejected with a clear message instead of being sent to the API as a model id - Groq: the model list is now actually fetched from the API — the fetch helper was previously only ever called without a key, so the dropdown never updated
- OpenRouter: image capability is read from the full catalogue, so paid vision
models entered via
Manual Inputare no longer blocked - Both chat nodes: added
fingerprint_inputs(), without which therandom,increment, anddecrementseed modes were inert on re-queue - Both chat nodes: an image batch larger than 1 no longer errors out
- OpenRouter Models: null
context_lengthand non-numeric pricing no longer crash sorting and filtering - OpenRouter Models: the API key is optional, matching the public endpoint
- Groq: send
- Robustness
- Failed model-list fetches back off for 60s instead of retrying on every run
additional_paramsmust be a JSON object, reported clearly rather than as an "Unexpected Error" from insidedict.update()- A malformed 200 response is reported as such instead of being retried as a network error
- Seed counters are bounded
- Housekeeping
- Removed the
ImportErrorfallback that re-imported the same failing modules, and theWEB_DIRECTORYpointing at a directory that does not exist - De-duplicated the Groq help text and the README
- Added a pytest suite covering all three nodes
- Removed the
v2.0.0
- MAJOR UPDATE: All nodes converted to ComfyUI v3 spec
- Groq Node v3:
- Updated models list to latest production and preview models
- Added new production models: groq/compound, groq/compound-mini
- Added new preview models: qwen/qwen3-32b
- Set llama-3.3-70b-versatile as default model
- Enhanced input validation with validate_inputs method
- Improved tooltips with detailed explanations for all parameters
- Better error messages and debug mode support
- Fixed output labels to use proper display_name syntax
- OpenRouter Node v3:
- Converted to v3 spec with enhanced validation
- Updated free models list to current 50+ offerings (January 2025)
- Organized models by provider: Meta, Google, Mistral, Qwen, Microsoft, DeepSeek, Nvidia, Others
- Set meta-llama/llama-3.3-70b-instruct:free as default model
- Added comprehensive tooltips for all parameters
- Enhanced error handling and debug mode
- Better vision model detection and validation
- Updated vision models list with all current vision-capable models
- Fixed output labels to use proper display_name syntax
- OpenRouter Models Node v3:
- Converted to v3 spec
- Enhanced validation and error handling
- Improved tooltip documentation
- Fixed output labels to use proper display_name syntax
- Architecture:
- All nodes use stateless design with class methods
- Class-level seed tracking for reproducibility
- Maintained full backward compatibility with v1 API
- Combined v3 entry point for all nodes
- Corrected combo input syntax (removed invalid enum classes)
- Proper output definition using display_name parameter
- Documentation:
- Comprehensive README updates for all v3 nodes
- Updated OpenRouter model list with all 50+ current free models
- Production vs preview model guidance
- Enhanced parameter optimization tips
- Detailed vision model usage instructions with current models
v1.3.0
- Groq node v3 conversion (initial v3 work)
Previous Versions
- See git history for earlier changes
Technical Details
ComfyUI v3 Compatibility
All nodes have been fully migrated to ComfyUI v3 spec:
- Uses
comfy_api.latestfor enhanced reliability - Implements
define_schema()with comprehensive input/output definitions - Stateless design with class methods (
execute(),validate_inputs()) - Provides both
NODE_CLASS_MAPPINGSand acomfy_entrypoint()extension, so the pack registers on whichever path a given ComfyUI build checks fingerprint_inputs()(v3'sIS_CHANGED) so the non-fixed seed modes actually re-run instead of serving a cached response
These nodes require comfy_api.latest, which ships with current ComfyUI builds.
API Compatibility
- Groq: OpenAI-compatible API endpoint
- OpenRouter: Multi-provider aggregation API
- Both support standard OpenAI message format
- Vision models use base64-encoded images in message content
Keeping up with model churn
Groq and OpenRouter change their line-ups constantly, so the nodes are built to absorb that without edits here. The rule throughout: provider metadata decides, hardcoded names are only a fallback, and nothing is refused on a guess.
| Concern | How it self-heals |
| --- | --- |
| New model released | Appears in the dropdown on the next Refresh. Anything the pack does not recognise is listed under --- Other --- rather than hidden. |
| Default model retired | The default is resolved against the list that actually loaded, walking a preference order and then falling back to the first real entry. A retired default can no longer break the node on a fresh drop-in. |
| New vision model | Groq: works immediately — an attached image is always sent and Groq decides, so the node never refuses one from its own capability list. OpenRouter: refused only when its public catalogue positively lists the model as text-only; an unknown id is passed straight through. |
| A model's name trips a heuristic | Affirmative modality metadata always wins. A chat model called …-tts-… or …-embed-… stays listed if the API says it emits text. |
| Provider adds modality fields | Read automatically. Several plausible field names are checked, and an entry that reports nothing is treated as "unknown", never as "unsupported". |
| Provider is unreachable | Groq falls back to a static list and backs off for 60s. OpenRouter offers Manual Input, which reaches any model id. |
The one genuinely time-sensitive thing in the repo is Groq's STATIC_FALLBACK_MODELS,
used only when no API key has been supplied yet. A stale entry there costs a clear
error from Groq, not a broken node.
tests/test_package.py simulates a wholesale catalogue reshuffle — invented vendors,
unfamiliar ids, retired defaults — to check these paths keep working.
Development
Run the test suite (no API keys and no network access required — every HTTP call is stubbed):
pip install pytest pillow requests torch numpy # pillow/requests/torch come from ComfyUI in production
python -m pytest tests
The suite loads the repository the way ComfyUI does — from __init__.py, with the
pack folder absent from sys.path — so a sibling module imported absolutely fails
here rather than at node registration.
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
Support
For issues, questions, or feature requests:
- Open an issue on GitHub
- Check existing issues for solutions
- Enable debug mode for detailed error information