Send Image to Chat
Get a Picture You Just Generated Into the Conversation
- image
- image
The pack's chat node lets you paste a picture by hand - but a picture your workflow just generated deserves better than a manual screenshot. Send Image to Chat is the bridge: wire an IMAGE in, and the picture lands in the chat window without you copying it out of a preview. The image passes straight through (image out = image in), so the node sits inline as a tap on the wire - it changes nothing about your pipeline, it just reports to the chat.
What it takes
image- the picture. A batch sends every frame.send_as- me (user) drops it in the chat's tray, exactly as if you'd pasted it: the pixels go to the model with your next message. A persona instead hangs it on that persona's most recent bubble, as though they sent it - and the model is not shown those pixels, since llama.cpp only takes images on user turns anyway.when- on button press saves the picture and waits for the 📌 on the node, so you can look at the result and re-roll before committing. every run pushes the moment the node executes. On-button-press is the usual choice for exactly that reason.megapixels- downscale the copy that goes to the chat (0 = full size). Only affects the chat copy;imagepasses through untouched.caption(optional) - one or two sentences of plain prose, what the model reads about the picture once the pixels are gone. This is the field people get wrong: it's not the generation prompt. A paragraph of comma-separated tags sitting in the conversation teaches the persona to write in comma-separated tags. If a "camera" persona writes both, split them - one line for the sampler, one for here.shot(optional) - a keyframe label kept with the picture (shot 3 / end), so a chat can be read back as a storyboard. It never reaches the model.note_in_context(optional) - for persona pictures: on, the picture leaves a note in the context. Off (default), it's purely visual and adds nothing - usually right, because the persona already described the scene it's a picture of.
Why the mechanics matter
Two things make this different from just wiring an image into the chat's image input. First, it's not a graph link - the picture is saved to input/kinburg_chat/ and referenced by name, so Send never re-runs the branch that made it (an image wired in from a sampler would regenerate on every message unless its seed is fixed). Second, the filename is a hash of the pixels, so re-running a branch that produced the same picture pushes the same reference and the chat recognizes it instead of stacking duplicates. The 📌 button reads send_as, caption, shot and note_in_context when you press it - deciding who a picture comes from is something you do after looking at it, so you can change them post-generation without re-running anything. Only megapixels needs a re-run; it changes the saved file.
The honest use case: a storyboard pipeline where the sampler makes shots and the chat's persona critiques them - Send Image to Chat after each shot, caption it, and the persona gives feedback you can act on before the next render. Output: just image, unchanged.
Install
Part of the Kinburg-Nodes pack - ComfyUI Manager (search "Kinburg-Nodes") or git clone, restart. Requires the pack's LLM stack (llama-cpp-python via install.py) and an mmproj on the target persona's Settings node for the model to actually see pixels. No extra deps beyond that.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | The picture to put in the chat. A batch sends every frame. | |
| send_as | COMBO | the active persona | Who the picture comes from. A persona: it hangs on that persona's last message, as though they sent it — the model is not shown the pixels. 'me (user)': it joins the chat's tray and goes out with your next message, which the model DOES see. |
| when | COMBO | on button press | 'on button press' saves the picture and waits for 📌 on this node — the usual choice, so you can look at the result first. 'every run' pushes it the moment this node executes. With 📌 you can still change send_as, caption, shot and note_in_context after the picture is generated; they are read when you press it. Only megapixels needs a re-run, since it changes the saved file itself. |
| megapixels | FLOAT | 1.000–16 | Downscale to about this many megapixels before saving (never upscales). 0 = keep full size. Only affects the copy that goes to the chat; the image output passes through untouched. |
| captionopt | STRING | One or two sentences of plain prose — what the model reads about this picture once the pixels are gone. NOT the generation prompt: tag soup in the conversation teaches the persona to write tag soup. Leave empty for a picture that is purely something to look at. | |
| shotopt | STRING | Optional keyframe label, e.g. 'shot 3 / end'. Stored with the picture so a chat can be read back as a storyboard; it never reaches the model. | |
| note_in_contextopt | BOOLEAN | false | Persona pictures only. Off (default) the picture is purely visual and adds nothing to the context — right when the persona already described the scene it is a picture of. On, it leaves '[image: caption]' in that persona's message so the conversation records that a photo was sent. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |