Ideogram - Character
Put the person from your portrait somewhere else
- reference_image_urls
- image
- url
- all_urls_json
- task_id
- raw_json
- credits_consumed
- credits_left
Ideogram built its reputation on text in images - logos, posters, packaging, anything where the lettering has to be right. Through v3 it was the closed benchmark for that, and nothing open came close. This node is its character feature: give it reference images and a prompt, and it generates the scene with your subject in it.
The reason to reach for a hosted character node at all is the shape the problem took by 2026. Locally, the default advice stopped being "encode the character and inject it" and became "generate once, then edit the image" - instruction editing with a reference in context. This node is that same move, one API call, with no LoRA and no adapter stack.
Inputs
prompt (required, up to 5000 characters) is a full scene description, not a short instruction - the node's own default is a paragraph about a woman on a garden bench with golden afternoon light. Write it like a shot, because that's what it's generating.
reference_image_urls (required) is an IMAGE socket. Unlike the HappyHorse reference nodes, this one takes a ComfyUI image directly - no URL pasting. Batch multiple images to give it more than one reference.
rendering_speed is BALANCED (default), TURBO, or QUALITY. Turbo is for iteration; Quality is for the final. style is AUTO, REALISTIC, or FICTION - note how blunt that is. It's a coarse switch, not a style library.
expand_prompt (default true) turns on MagicPrompt, Ideogram's prompt rewriter. It's genuinely useful for thin prompts and genuinely annoying when you've written something precise, in the same way a model's "prompt optimizer" always is.
num_images is 1, 2, 3 or 4. Important: the node's image output returns only the first result. Ask for four and the other three are still in all_urls_json, but you'll need something else to fetch them - the pack's Download Image node is the obvious tool. Don't set this to 4 expecting a batch socket.
image_size picks the frame: square_hd (default), square, portrait_4_3, portrait_16_9, landscape_4_3, landscape_16_9. negative_prompt is available and, per the tooltip, only matters where your positive prompt doesn't already claim the same thing. seed is there for reproducibility attempts. timeout_seconds (1200 default) and callback_url are the plumbing.
Outputs
image is a native ComfyUI IMAGE - straight into a save node or a local upscaler. Then url, all_urls_json (all four images if you asked for four), task_id, raw_json, and credits_consumed / credits_left as floats. Images are archived to ComfyUI/output/KIE-Results/images/.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/felipederosilva/ComfyUI-KIE-Nodes-Next
cd ComfyUI-KIE-Nodes-Next
pip install -r requirements.txt
Restart ComfyUI. requests, Pillow, numpy, PyYAML, no model downloads - if you want Ideogram running on your own GPU, that's a different thing entirely: the 4.0 weights are on HuggingFace now under a non-commercial licence, and that's a local checkpoint, not this node.
Key setup once in Settings → KIE.ai Nodes Next → Connection; validated before saving, masked afterwards, never in the workflow JSON. Headless installs use KIE_API_KEY, which takes priority.
What to watch
A reference image is not an identity lock. The pack author says this outright, and it matches what everyone running reference-based consistency reports: resemblance, not guarantee. Expect drift as you move further from the reference pose or lighting.
Four images still bill as four. num_images is a cost multiplier, and the node's credits_consumed float will show it.
Fine text is still Ideogram's party trick. If your scene needs legible lettering, put the exact string in the prompt in quotes; that's the capability you're paying for over a generic image node.
Timeout means paid. If the node errors out waiting, the job continues remotely. Use the task_id from the message with the Task Status node.
Rerun-with-no-changes returns the cached image and charges nothing. That's ComfyUI caching, not a hiccup.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | Place the woman from the uploaded portrait, wearing a casual white blouse, in a peaceful garden setting. The scene should feature vibrant green plants and colorful flowers, with soft sunlight filtering through the leaves. She should be sitting on a wooden bench, holding a book and smiling gently. The background should be filled with lush greenery, with a serene, tranquil atmosphere. Golden afternoon light should highlight the woman’s face and create soft shadows on the ground, adding a peaceful, reflective mood to the scene | The prompt to fill the masked part of the image. (Max length: 5000 characters) |
| reference_image_urls | IMAGE | — | |
| rendering_speedopt | COMBO | BALANCED | The rendering speed to use. Default value: "BALANCED" |
| styleopt | COMBO | AUTO | The style type to generate with. Cannot be used with style_codes. Default value: "AUTO" |
| expand_promptopt | BOOLEAN | true | Determine if MagicPrompt should be used in generating the request or not. Default value: true (Boolean value (true/false)) |
| num_imagesopt | COMBO | 1 | Select description |
| image_sizeopt | COMBO | square_hd | The resolution of the generated image Default value: square_hd |
| negative_promptopt | STRING | Description of what to exclude from an image. Descriptions in the prompt take precedence to descriptions in the negative prompt. Default value: "" (Max length: 5000 characters) | |
| seedopt | INT | 0-2147483648–2147483647 | Seed for the random number generator |
| timeout_secondsopt | INT | 120030–7200 | — |
| callback_urlopt | STRING | Optional KIE callback URL. Leave empty for normal ComfyUI use. |
Outputs (7)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| url | STRING | — |
| all_urls_json | STRING | — |
| task_id | STRING | — |
| raw_json | STRING | — |
| credits_consumed | FLOAT | — |
| credits_left | FLOAT | — |