Claude Haiku 4.5
Claude Haiku 4.5 in a node — the fast, cheap LLM for graph plumbing
- messages
- images
- text
Claude Haiku has always been Anthropic's answer to "I need an LLM for the boring, high-volume work." Haiku 4.5 keeps that job, and this node is how that job happens inside ComfyUI: you wire in a messages conversation, get a STRING back, and the cost stays low enough that you can afford to call it on every image in a batch. If the 397B Qwen node next to it is a sledgehammer, Haiku is the screwdriver - and for most prompt-expansion, captioning, and tagging work in a graph, that's the right tool.
It's served through Runware's cloud, same as every node in this pack: no local model, no VRAM, billed per call. Where Haiku earns its keep is latency and price - you use it where you'd use a utility, not a thought partner.
What you set
messages is required (RUNWARE_MESSAGES socket). The controls that matter:
settings.systemPrompt- the instruction that sets the job ("You are a prompt expander. Output only JSON.").settings.thinkingLevel-off/low/medium/high. Haiku gets a real thinking range in 4.5, but the whole point of this tier is that you usually wantofforlow. Turn thinking on and you've just made Haiku slow - use Sonnet/Opus for that.settings.maxTokens- up to 64000, default 4096. Set it tight for extraction tasks so a runaway generation doesn't run the bill up.images-IMAGEsocket; Haiku is multimodal, handy for quick "describe this frame" passes.toolChoice- gated toggle plustoolChoice.type/namefor forcing a specific tool call, andadvanced_jsoncarriestools,inputs.documents, andsettings.stopSequences.settings.cache.scope(systemorsystem+history) andsettings.cache.ttl(5m/1h) - Anthropic's prompt caching, exposed directly. If your workflow repeats the same system prompt across a batch, caching is how you stop paying for it every call.
Output is text (STRING) → anywhere text flows in your graph. includeUsage adds token stats so you can actually see what a batch cost.
Installing
Part of the Runware/ComfyUI-Runware pack.
ComfyUI Manager: search Runware, install, restart.
Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/Runware/ComfyUI-Runware
pip install -r ComfyUI-Runware/requirements.txt
Deps are runware-sdk, pillow, soundfile. Runware API key from runware.ai/api-keys (Settings panel or RUNWARE_API_KEY).
Where people get burned
The failure mode is using Haiku like it's Opus. It's not - it's the tier you pick for volume, and if your graph logic depends on subtle reasoning, Haiku will quietly degrade results and you'll blame the workflow. The other trap is leaving thinkingLevel at a high setting: on a fast model, thinking isn't a quality upgrade so much as a tax. off it for anything mechanical.
Inputs (14)
| Name | Type | Default | Description |
|---|---|---|---|
| messages | RUNWARE_MESSAGES | — | |
| imagesopt | IMAGE | — | |
| 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 | 40961–64000 | Maximum number of tokens to generate in the response. |
| settings.cache.scopeopt | COMBO | system+history | Controls which parts of the request are cached. |
| settings.systemPromptopt | STRING | System-level instruction that guides the model's behavior and output style across the entire generation. | |
| settings.thinkingLevelopt | COMBO | (default) | Controls the depth of internal reasoning the model performs before generating a response. |
| 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. |
| outputFormatopt | COMBO | TEXT | Output format for the generated text. |
| settings.cache.ttlopt | COMBO | 5m | Time-to-live for the cache. |
| advanced_jsonopt | STRING | Optional JSON merged into the request. For: inputs.documents, settings.stopSequences, tools |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| text | STRING | — |