H3 OpenRouter Model
A key, a model string, and the bill you probably haven't thought about
- llm_model
- credits_remaining
What it is
This is the provider node for the compact director: three fields, two outputs, no generation of its own. You point it at a model, and its llm_model output carries a connection object into the director's llm input. The director then sends your request - plus base64 JPEG versions of every reference image you connected - to OpenRouter and gets back a written H3 prompt.
It's the node to reach for first if you're trying the pack out, because it's the one provider that needs nothing installed. The alternatives in the same pack (Ollama, a compatible chat API, or a local Qwen3-VL text encoder) all ask more of you before the first run. The catch is that this one costs money per call and sends your source images off your machine, which is worth thinking about before you build a habit around it.
How it works
Three inputs, all required-looking and all simple:
api_key- a password-masked field. If you leave it empty, the node falls back to theOPENROUTER_API_KEYenvironment variable.model- a free-text string, not a dropdown, defaulting tox-ai/grok-4.20. Paste any OpenRouter model slug; the author doesn't ship a list because OpenRouter's catalogue rotates faster than node packs update.timeout_seconds- 30 to 1800, default 300. That's a per-request wall clock, so it matters when you ask for twelve scenes.
The heavy lifting happens in the director. When it needs text, it calls this connection, which POSTs to openrouter.ai/api/v1/chat/completions with your key and model. The pack retries twice (2s, then 6s) on 408/409/425/429 and the 5xx family, and honours a Retry-After header up to 30 seconds. A model that's queued for a while is normal, not broken.
Two details worth knowing. First, the director's request asks for strict structured output - a json_schema response format plus provider: {require_parameters: true} - so a model that can't do schema-constrained JSON will error out instead of quietly returning chatty prose that then leaks into your prompt conditioning. Second, that model has to be able to see, because reference images go along with the request; a text-only model will take your call and produce nonsense about images it never received.
Outputs are llm_model (the custom LLMMODEL type the director consumes) and credits_remaining (STRING). The credits string is a live call to OpenRouter's credits endpoint, refreshed on every execution - the node deliberately defeats caching so you're not staring at yesterday's balance. You'll see Remaining: $12.345, or Credits: not available if the key is wrong or the network hiccuped, or Credits: API key missing if there was simply no key to use.
Install and wiring
cd ComfyUI/custom_nodes
git clone https://github.com/elgalardi/ComfyUI-VisionPromptAssistant
# or: ComfyUI Manager → search "Vision Prompt Assistant" → install → restart
No pip dependencies - the pack's pyproject.toml declares none, which is why installing it is fast. It does need ComfyUI 0.30+ since it's built on the newer node API.
Wiring is one cable: llm_model → the director's llm input. Then set the model string and the key.
On key hygiene, the README is blunt and correct: "Provider credentials belong in the loader or environment, never in a shared workflow." Workflow .json files get posted to Discords and Civitai constantly, and the old layout stored the key in the director node itself - the pack now ships a small JS migration that strips api_key/model out of graphs saved by earlier versions, and removes a stale credits_remaining link. If you're migrating a 1.x workflow, re-check those fields rather than assuming the shim caught everything. If you're moving your whole workflow into a shared graph, use the env var.
Common issues
Set the API key in H3 OpenRouter Model or OPENROUTER_API_KEY. You connected a provider but gave it no key. The check happens when the connection is actually used, so a workflow can finish loading and die mid-run.
Select an OpenRouter model. The model field was emptied. No default is silently substituted.
Everything works but the prompt is bland. Check temperature on the director, not here - it defaults to 0.2 for a reason, and a provider can't raise it for you.
Cost creep. Every run is a metered call, and a twelve-scene Continuous Elaborate request is a genuinely large completion. Watch usage_stats on the director's outputs, and remember the community's standing complaint about API nodes in ComfyUI holds here: the pack is a prompt writer, so you're paying per rewrite, not per render. If that starts to sting, that's exactly why the local providers exist - see the pack's Ollama and Qwen3-VL loaders. The honest framing from the wider ComfyUI community is that this job (short, structured rewriting) wants small-and-obedient, not frontier-smart: you are paying per prompt, and an 8B local model is usually enough.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| api_key | STRING | — | |
| model | STRING | x-ai/grok-4.20 | — |
| timeout_seconds | INT | 30030–1800 | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| llm_model | LLMMODEL | — |
| credits_remaining | STRING | — |