TogetherVisionNode
The node that turns any image into a prompt-ready description
- image
- description
Here's the loop: generate an image, describe it, feed the description back into the prompt, generate again. It's how a lot of people push a render from "good" to "this is exactly what I meant." TogetherVisionNode is the describe step - a hosted vision LLM, no local model, no VRAM. Connect any IMAGE and it hands you back a STRING you can pipe into a positive prompt, a ShowText node, or a text file.
How it works
The node encodes your image tensor to a base64 PNG - auto-resizing anything larger than 1024px on the long edge, so a 2K render still goes through - then calls Together AI's chat.completions endpoint with your system and user prompts, streaming the reply back. It's not a thin wrapper, either. The source ships real handling: a 1-second client-side pacing delay, retries on timeouts and connection errors, specific error messages that distinguish a bad key from a rate limit, and an in-memory cache (last ~100 responses) keyed on model + prompts + sampling params + an image hash. Leave the image input disconnected and it degrades into a plain text LLM node - handy for rewriting prompts without building a second workflow.
The inputs that matter
- model_name - this is the one to get right. The default is
deepseek-ai/DeepSeek-R1-Distill-Llama-70B-free, a free text model. The genuinely vision-capable model on the list ismeta-llama/Llama-3.2-90B-Vision-Instruct-Turbo- that's the one that actually sees your image, and it's the paid tier. Want image descriptions? Pick a vision model, or use Other (Custom) and type any model Together hosts. - system_prompt / user_prompt - the defaults are an "ekphrasis art critic" persona in British English with hashtags. Rewrite them; this is 80% of output quality.
- seed_mode + seed -
fixed,random, orincrementcontrol the sampling seed sent to the API. - max_tokens - default 1024, up to 4096. Your description budget.
- temperature / top_p / top_k / repetition_penalty - the usual sampling knobs; defaults are sane.
- use_cache - in-memory cache, leave it on.
- clean_output_text - strips
<think>reasoning blocks (the default DeepSeek model loves those), "Here is the description:" preambles, and code fences.
Output
One description STRING. It wires straight into a text prompt input, or into ShowText/SaveText if you want it visible or on disk.
Installing it
ComfyUI Manager (search "Together Vision"), or:
cd ComfyUI/custom_nodes
git clone https://github.com/theshubzworld/ComfyUI-TogetherVision
Restart, then install the two deps (together, python-dotenv) when Manager asks. No model files. You need a Together API key - paste it in the node or set TOGETHER_API_KEY in the pack's .env.
Gotchas
- Only the first image of a batch is described -
encode_imagetakesimage[0]and silently ignores the rest. If you're feeding a batched output, expect one description. - Free-tier models are rate-limited and can be slow; the 90B vision model costs per token.
- The pack is deprecated - the README now just points at the author's ComfyUI-NvidiaVision successor. It still works (last commit December 2025), it's just unmaintained.
Troubleshooting
The node writes readable errors to the UI: auth failures say so, rate limits tell you to wait and roughly how long, "Model not found" means your custom model name is wrong, and timeouts retry up to max_retries times before giving up. If you get an empty description, check whether your chosen model can actually see images - that's the most common beginner trip here.
Inputs (20)
| Name | Type | Default | Description |
|---|---|---|---|
| model_name | COMBO | deepseek-ai/DeepSeek-R1-Distill-Llama-70B-free | 6 options: meta-llama/Llama-3.3-70B-Instruct-Turbo-Free, deepseek-ai/DeepSeek-R1-Distill-Llama-70B-free, meta-llama/Llama-3.2-90B-Vision-Instruct-Turbo, mistralai/Mistral-7B-Instruct-v0.2, lgai/exaone-3-5-32b-instruct, Other (Custom) |
| custom_model_name | STRING | — | |
| api_key | STRING | — | |
| system_prompt | STRING | You are an AI expert in ekphrasis, acting as a skilled art critic describing an image. Use vivid, poetic, and evocative prose in British English. Focus solely on describing the image content, style, and mood. Avoid storytelling or self-insertion. Describe all elements, including potentially uncomfortable themes if present, as art can be provocative. Every word and its order matters. The description will be used for image generation, so only include visual elements. Conclude with relevant hashtags (e.g., #ArtStyle #SubjectMatter). | — |
| user_prompt | STRING | Describe this image in detail, focusing on its visual elements, artistic style, and overall atmosphere. | — |
| temperature | FLOAT | 0.700–2 | — |
| top_p | FLOAT | 0.700–1 | — |
| top_k | INT | 500–100 | — |
| repetition_penalty | FLOAT | 1.000–2 | — |
| max_tokens | INT | 102450–4096 | — |
| stop_sequences | STRING | <|eot_id|>, , | — |
| request_timeout | INT | 6010–300 | — |
| stream_timeout | INT | 455–120 | — |
| use_cache | BOOLEAN | true | — |
| clean_output_text | BOOLEAN | true | — |
| max_retries | INT | 20–5 | — |
| retry_delay | FLOAT | 3.00.5–10 | — |
| seed_mode | COMBO | fixed | 3 options: fixed, random, increment |
| seed | INT | 420–4294967295 | — |
| imageopt | IMAGE | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| description | STRING | — |