Nodes/Eric Visual Research/Eric Reference Describer (VL→Text)
ComfyUI Node

Eric Reference Describer (VL→Text)

Stop letting edit models eat your reference images

By EricRollei·Created 4 months ago·Updated 4 months ago· 1
Eric Reference Describer (VL→Text)
  • ref_image_1
  • ref_image_2
  • ref_image_3
  • ref_image_4
  • combined_prompt
  • descriptions_log
grounded_prompt
vl_api_urlhttp://localhost:30000
model_name
description_focusauto
synthesis_modesynthesize
max_image_dim512

The problem this solves is specific and real. Edit-mode generation models - Qwen-Image-Edit, Flux 2 Klein, most img2img - treat an input image as pixels to edit, not as information to learn from. Feed them a web thumbnail as a reference and they copy the thumbnail's JPEG mush, noise and artifacts straight into the output. That's the "pixel contamination" the node's own docs warn about, and it's exactly why reference-guided generation with edit models so often looks like a heavily recompressed screenshot.

Eric Reference Describer's fix is sneaky and effective: read each reference with a vision-language model, convert what it shows into clean text, and hand that to a plain text-to-image model. No pixels, no contamination, full generation quality.

How it works

It's the second node in the Eric Visual Research pack (by EricRollei), built to sit directly downstream of Eric Gen-Searcher: wire its grounded_prompt and ref_image_1..4 in, get a combined_prompt out. Mechanically it's simple:

  1. Each reference image is downscaled to max_image_dim (512 px default - the tooltip's right that VL models don't need more to understand content) and encoded as a base64 JPEG.
  2. Each is sent to an OpenAI-compatible vision endpoint with a "describe what you see, specifically" prompt.
  3. The descriptions get merged into the base prompt, either synthesized into one coherent paragraph (synthesize, one extra API call) or just appended below (append, faster, less coherent).

The clever part is the endpoint. The default vl_api_url is the same SGLang Gen-Searcher-8B server the searcher node needs, but the tooltip is explicit: it works with vLLM, LM Studio, or any OpenAI-compatible endpoint with vision support. You don't need the research agent running to use this half of the pack - if you already have any VL model behind a compatible URL, point this at it and go.

The inputs that matter

  • grounded_prompt (required) - typically the searcher's output, though any prompt string works.
  • ref_image_1 (required) - the primary reference. ref_image_2..4 are optional.
  • vl_api_url - where the VL model lives. Default http://localhost:30000.
  • description_focus - what the VL model reports: auto (recommended, model decides), full_scene, subject_appearance, clothing_and_style, setting_and_environment. Handy if you only care about, say, the outfit.
  • synthesis_mode - synthesize vs append as above.
  • max_image_dim - resolution sent to the VL model. 512 is the sweet spot; higher just slows things down.

Outputs: combined_prompt (STRING → any text prompt input, on Flux, SDXL, Qwen-Image, whatever) and descriptions_log (STRING) showing what the VL model actually said about each image.

One wiring note: feed the describer the searcher's individual ref_image_1..4 outputs, not the reference_images batch - the batch is letterboxed to a common size, and you don't want the VL model describing black padding bars.

Installing

Same pack, so the install is shared with the searcher. Via ComfyUI Manager (search "Visual Research"), or:

cd ComfyUI/custom_nodes
git clone https://github.com/EricRollei/Visual_Research

Mind the README typo: it tells you to clone Eric_Visual_Research, which doesn't exist - the repo is Visual_Research. Restart ComfyUI; nodes land under Eric/VisualResearch.

The pack's requirements.txt is just Pillow and torch. The real dependency is a VL server - either the Gen-Searcher-8B SGLang setup (a ~17 GB model, ~20 GB+ VRAM, WSL2 on Windows), or any other OpenAI-compatible vision endpoint you point vl_api_url at. Note that this node needs no API key - no Serper, no Jina. It's a pure local API call.

Common issues

  • Silent fallback. If the VL endpoint returns nothing, the node passes grounded_prompt through untouched and logs "(no descriptions obtained)" in the log output. Your generation won't fail - it'll just quietly lose the reference detail. Check descriptions_log.
  • model_name blank is fine. It auto-detects via /v1/models on the endpoint; only set it if auto-detect picks the wrong model.
  • Don't chase resolution. Bumping max_image_dim past 512 to "help" the VL model just adds latency; the descriptions don't meaningfully improve.

This is the half of the pack I'd keep even without the research node. The pixel-contamination framing matches how 2026 edit models actually behave - reference work moved to instruction-editing, and IP-Adapter never followed the ecosystem forward - so converting references to text is a genuinely good way to get reference-grounded detail without sacrificing pure t2i freedom.

CategoryEric/VisualResearch

Inputs (10)

NameTypeDefaultDescription
grounded_promptSTRINGBase prompt - typically from EricGenSearcherNode.
ref_image_1IMAGEPrimary reference image.
vl_api_urlSTRINGhttp://localhost:30000OpenAI-compatible API URL of a VL model server. Default: http://localhost:30000 (SGLang with Gen-Searcher-8B) Also works with: LM Studio, vLLM, or any OpenAI-compatible endpoint that supports vision/image inputs.
ref_image_2optIMAGEOptional 2nd reference.
ref_image_3optIMAGEOptional 3rd reference.
ref_image_4optIMAGEOptional 4th reference.
model_nameoptSTRINGModel name override. Leave blank to auto-detect.
description_focusoptCOMBOautoWhat aspect of each reference image to focus on: auto - model decides what's most important (recommended) full_scene - subject + clothing + setting + lighting subject_appearance - face, hair, build only clothing_and_style - garments and accessories only setting_and_environment - location and lighting only
synthesis_modeoptCOMBOsynthesizesynthesize (recommended): The VL model weaves descriptions into the grounded prompt as a single coherent paragraph. One extra API call. append: Descriptions are appended below the grounded prompt. Faster, no extra API call, but less coherent.
max_image_dimoptINT512256–1024Max image dimension when sending to the VL model. 512px is sufficient - VL models don't need full resolution to understand content. Higher = slower, diminishing returns.

Outputs (2)

NameTypeDescription
combined_promptSTRING
descriptions_logSTRING