Flamin Galah Image Prompt Builder (Ollama)
Point it at a still, get a shot paragraph back — no cloud, no key
- image_1
- image_2
- h3_prompt
What it's for
You have a still. You want either a prompt built from it, or the shot description that starts a video from it. This node does both, on your own machine, with two Ollama models on two jobs: a vision model that looks at the image and writes down what is actually there, then a writer that turns that into text worth feeding downstream.
The split is the point. One tightly-scoped step drifts less than one open-ended rewrite, which is the pattern the community settled on for image-to-prompt work (llm-in-comfyui.md § 2). Here both halves stay local, which is what you want when the still is explicit and a hosted API would refuse it. output_mode picks which product you get, and the two are genuinely different outputs, not a style toggle.
How it works
Three calls at most, in order:
- The vision model describes the image - style, lighting, composition, subject, pose, clothing, environment, textures. It's told not to invent action and not to add sound.
- The prompt model rewrites that into your chosen format, folding
extra_descriptionin as what happens next. - In Image to Video mode only, a third call writes
overall_soundscape.
Before the vision call the image is resized to a 1024px long edge and re-encoded as JPEG at quality 90 - the single most important line in the file, because oversized frames are what make local vision calls crawl or fail outright. Batch item 0 only: feed it six stills and you get one description.
The two shapes:
Image to Video - the three H3 fields, with non_diegetic_music fixed at N/A:
integrated_multimodal_description: [Shot 1] ...
overall_soundscape: ...
non_diegetic_music: N/A
Image to Image - the paragraph and nothing else. No field labels, no sound. Grab that one for img2img, or for any other node downstream that just wants a prompt.
Both leave by the single h3_prompt output.
The inputs that matter
image- required. No image, no run.output_mode-Image to Video(default) orImage to Image, rendered as two pills by the pack's frontend.vision_model/prompt_model- pick these deliberately. Vision wants a real VLM (llava,qwen2.5-vl,llama3.2-vision); the writer slot is where an uncensored model earns its keep. A 3B text model on the vision pass is the most common way to get a useless description.extra_description- optional, and it's the continuation: camera move, what happens after frame 0. Leave it blank and you get a faithful description of the still and not much else.
Then the fiddly four. temperature defaults to 0.2, lower than the generator's 0.7 on purpose - you want faithful, not creative, and turning it up is how the writer starts embellishing what the vision model saw. lora_tag (singular here, plural on the generator) is appended as a LoRA tag: … line. ollama_url defaults to localhost. And the two dropdowns come from GET /api/tags with a 2-second timeout - your installed models, or a placeholder.
Install
Manager → search "Flamin Galah", or:
cd ComfyUI/custom_nodes
git clone https://github.com/flamin-galah/ComfyUI-Flamin-Galah.git
Full restart, not a refresh. pyproject.toml declares no dependencies, so there's no pip install - it uses the torch/numpy/Pillow your ComfyUI shipped with. The real setup is Ollama:
ollama pull llava # vision
ollama run jimscard/adult-film-screenwriter-nsfw # writer, uncensored
Start Ollama before ComfyUI so the dropdowns populate. If they read "(Ollama not running – start it and refresh)", restart ComfyUI after starting the daemon rather than fiddling with the node.
Traps
No first-frame lock line. The README says it and the source confirms it: Image to Video here is the three fields without the For the target video, at 0.00 seconds … reference line H3 uses when a still is genuinely the opening frame. That line is added by the Grok node and by the generator's image path only. If your workflow expects it, feed the same still into the NSFW Prompt Generator's image input instead.
Multi-subject attribution is where every VLM fails. Two people in frame and the description will mix up who's wearing what and who's doing what - it's JoyCaption's own documented weakness and nobody has solved it. Aim for "faithful enough to anchor frame 0," not a caption you'd ship.
An empty description means one specific thing. The node raises telling you to use a vision model, which translates to: a text-only model is selected in the vision slot.
Old output socket. Stale nodes on old workflows won't match the current schema; delete and re-add rather than debugging it.
And the standing one: installing a node pack runs its code with your permissions, and that category has been weaponized once (llmvision-incident.json). This is three short, readable, MIT-licensed files - give them two minutes.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| output_mode | COMBO | Image to Video | 2 options: Image to Video, Image to Image |
| extra_description | STRING | — | |
| image_1opt | IMAGE | — | |
| image_2opt | IMAGE | — | |
| ollama_urlopt | STRING | http://localhost:11434 | — |
| vision_modelopt | COMBO | (Ollama not running – start it and refresh) | 11 options: (Ollama not running – start it and refresh), llava, llava:13b, qwen2.5-vl, llama3.2-vision, llama3.2, +5 |
| prompt_modelopt | COMBO | (Ollama not running – start it and refresh) | 11 options: (Ollama not running – start it and refresh), llava, llava:13b, qwen2.5-vl, llama3.2-vision, llama3.2, +5 |
| temperatureopt | FLOAT | 0.200–1.5 | — |
| lora_tagopt | STRING | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| h3_prompt | STRING | — |