Bernini Full Image to Image
Prompt-editing images with Bernini's full model, not just the renderer
- image
- image
RHBerniniFullImageToImage is the "Bernini Full" pack's image-editing node: you feed it one image, give it an instruction, and get a new image back. It uses the full Bernini-Diffusers pipeline - semantic planner plus the 14B renderer - so you're not just running another image-edit diffusion model; you're running the same stack the video nodes use, warmed up for a cheaper, one-shot task.
The case for reaching for this instead of a dedicated image-editing model is honestly narrow, and it's worth saying that. For a single image edit, something like Qwen-Image-Edit is faster, lighter, and purpose-built. Where this earns its keep is workflow consistency: it's the only member of this pack that outputs an IMAGE, so it's your natural first test that the model loads, that the LoRAs resolve, and that your VRAM survives before you commit to a video job that costs ten times as long. The pack's own README makes this the recommended environment check, and it's good advice - the video nodes share the same cached pipeline, so a clean t2i/i2i run means your whole install is right.
How it works
The mechanism is the standard Bernini one. Your source image is VAE-encoded, the MLLM planner reads your instruction and plans the edit semantically, T5 + the vision encoder build conditioning, and the 14B transformer denoises over the latents. One detail this node gets for free: VAE tiling and slicing are on internally, so a 2048px edit doesn't have to be a VRAM catastrophe the way raw Bernini can be. The image-to-image tuning is baked in (higher image guidance, a tighter omega_scale than pure text-to-image), so it leans on preserving your source rather than reinventing it.
The inputs that matter
The full list is: image, prompt, negative_prompt, width, height, steps, seed, quality_preset, acceleration, memory_mode. You'll actually touch a handful:
- image - an IMAGE socket, straight from
LoadImageor any image output. One image per run; this node doesn't take references the way the R2V node does. - prompt - write it as an edit instruction, not a caption: "turn the source image into a polished flat illustration" is the default and it's the right shape. Bernini's whole thing is instruction-following without a mask.
- steps - 4 is the fast setting with LightX2V LoRAs present; 25–50 with acceleration off. If your output looks undercooked, this is the first knob.
- width / height - 64–2048, step 16. These set the output size; the source image gets resized into it.
- negative_prompt - the default ("low quality, blurry, distorted, text, watermark") is fine to keep.
Output is a single IMAGE socket → SaveImage. That's the whole graph: LoadImage → node → SaveImage.
Installing (same for the whole pack)
cd ComfyUI/custom_nodes
git clone https://github.com/RH-RunningHub/ComfyUI-RH-Bernini-Full.git
cd ComfyUI-RH-Bernini-Full
pip install -r requirements.txt
pip install --no-deps git+https://github.com/ByteDance-Seed/[email protected]
Then the model, which must land at ComfyUI/models/diffusers/Bernini-Diffusers-qint8:
cd ComfyUI/models
modelscope download --model Gluttony10/Bernini-Diffusers-qint8 --local_dir diffusers/Bernini-Diffusers-qint8
ComfyUI Manager can install the pack for you (search "ComfyUI-RH-Bernini-Full"), but the model download is always manual. Don't skip the --no-deps on VeOmni - its deps can overwrite your torch and break ComfyUI.
Troubleshooting worth knowing
- First run is slow and that's normal. The qint8 model cold-loads the planner, T5, vision encoder, and transformer.
keep_loaded_batch(the default memory mode) caches the pipeline so your second i2i or t2i run reuses it - that's the mode you want for iterating.low_vram_unloadfrees memory after each run instead, for tight-VRAM machines. - Model-not-found errors are almost always a path problem. The node looks for the exact
Bernini-Diffusers-qint8directory, validatesmodel_type: "bernini", requires all five subfolders, and rejects anything containingBernini-R. If you downloaded Bernini-R instead of Bernini-Diffusers, it will refuse to load - by design. This pack only runs the full model. - Mushy 4-step output = the LightX2V LoRA pair isn't in
ComfyUI/models/loras, and acceleration silently fell back to none. GrabWan2.2-T2V-A14B-4steps-lora-rank64-Seko-V2.0(high + low noise.safetensors) or set acceleration to none and raise steps.
One light caveat to set expectations: this is a video-first model wearing an image hat. It edits well, but it loads a video-scale stack to do it. If you only ever edit stills, a leaner model is the right tool. If you're heading into Bernini video anyway, run this first and confirm everything.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | Source image from a ComfyUI image output. | |
| prompt | STRING | Turn the source image into a polished flat illustration. | Text prompt or edit instruction. |
| negative_prompt | STRING | low quality, blurry, distorted, text, watermark | Negative prompt. |
| width | INT | 51264–2048 | Output width in pixels. Larger values increase VRAM use and runtime. |
| height | INT | 51264–2048 | Output height in pixels. Larger values increase VRAM use and runtime. |
| steps | INT | 41–100 | Diffusion steps. |
| seed | INT | 23450–4294967295 | Random seed. Values are clamped to NumPy's valid 0 to 2**32-1 range before inference. |
| quality_preset | COMBO | standard | standard balances speed and quality; quality spends more planning time for better output. |
| acceleration | COMBO | wan2.2_lightx2v_4step | Auto-load the Wan2.2 T2V LightX2V 4-step LoRA pair from ComfyUI/models/loras when available. |
| memory_mode | COMBO | keep_loaded_batch | keep_loaded_batch keeps the Bernini pipeline cached for faster consecutive jobs; low_vram_unload frees memory after each run. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |