vLLM-I2I丨API
Image editing against your local vLLM server — and when it quietly switches endpoints
- image
- mask
- image
- raw_response
- status
- debug_info
VLLMI2IAPI is the image-to-image member of the QING vLLM trio: you give it an input image and an edit instruction, it sends both to a vLLM-Omni server, and hands back the edited result as an IMAGE. It's the node that turns a text-edit prompt into a real visual change without leaving the graph.
Display name: "vLLM-I2I丨API".
The two endpoint paths, and the auto-switch that can surprise you
Like its T2I sibling, this node has a path dropdown - i2i_endpoint - but it also has a second, hidden trigger:
chat_completions(default) - sends the image as a multimodalimage_url(base64 data URL) in the user message, alongside your edit text, with the generation params inextra_body(here it'sguidance_scale, nottrue_cfg_scale- don't carry settings over from the T2I node). This matches vLLM-Omni's official I2I example.images_edits- POSTs to/v1/images/editsas a multipart form: the image file itself, your prompt,sizeas"WxH",n,response_format, andnegative_prompt. This is the classic OpenAI image-editing shape.- The auto-switch: if you connect the optional
maskinput, the node forces theimages_editspath regardless of the dropdown - and tells you so, by prepending an[info]note toraw_response. A mask is an editing feature that only the edits endpoint implements, so the node doesn't ask; it just routes.
That auto-switch is the thing to remember. If your server only implements the chat path and you wire in a mask expecting it to still work, the request suddenly goes to /v1/images/edits - which may 404. The node even logs "已连接 mask,自动使用 POST /v1/images/edits" so the debug trail shows you what happened.
What you'll actually set
image(required) - the input to edit.prompt- the edit instruction ("make it dusk", "remove the background object").negative_prompttoo - the tooltip notes it's commonly used in edits mode.model,base_url- server and model id, as with the other two nodes.width/height- strings, default "1024".num_inference_steps,guidance_scale,top_p,repetition_penalty,seed- sampling knobs.i2i_endpoint,n,response_format-nandresponse_formatonly apply on theimages_editspath (same rule as T2I).mask(optional) - forces the edits endpoint, as above.api_key,advanced_options(optional).- Outputs:
image(IMAGE),raw_response,status,debug_info.
The OOM safety net, same as T2I
Server-side CUDA OOM gets caught: placeholder image instead of a crashed run, plus hints in raw_response (drop resolution to 768×640, cut steps, or restart with PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True). On a path that sends full-resolution input images plus a generation, OOM is a realistic possibility, so this isn't cosmetic.
Installing it
Ships in ComfyUI-QING:
cd ComfyUI/custom_nodes
git clone https://github.com/GAO-SHIQING/ComfyUI-QING
cd ComfyUI-QING
python install_dependencies.py
Restart ComfyUI, or install "ComfyUI-QING" via ComfyUI Manager.
Troubleshooting
- Status
errorright after connecting a mask. Readraw_responsefor the[info]line and the server's reply - the mask forced/v1/images/edits, and your server likely doesn't serve it. Either drop the mask (and use the chat path) or confirm the server supports image edits. n/response_formatignored. You're on the chat path; those apply toimages_editsonly.- Edits barely change the image.
guidance_scale(default 4.0) controls how closely the edit follows the instruction versus the input. Raise it a step at a time. - Placeholder + error but no obvious cause.
debug_infocarries the full request payload and HTTP status;raw_responsecarries the server's own message. One of them names the real problem.
The pattern here is the same as the other API nodes - no model, just an HTTP client pointing at a server (external-api-nodes.md). If you run vLLM-Omni locally, this is the closest thing to an in-graph img2img edit node you'll get without pulling the weights into ComfyUI itself.
Inputs (20)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | 编辑指令 | |
| negative_prompt | STRING | 负面提示词(edits 模式常用) | |
| image | IMAGE | 输入图像 | |
| platform | COMBO | vLLM | 服务平台(用于动态拉取 /v1/models) |
| model | STRING | default | 模型 id |
| base_url | STRING | http://127.0.0.1:8091 | 服务根地址 |
| i2i_endpoint | COMBO | chat_completions | 含 mask 时自动改用 images_edits;与官方 I2I 示例一致请用 chat_completions |
| width | STRING | 1024 | 宽度(字符串整数) |
| height | STRING | 1024 | 高度(字符串整数) |
| num_inference_steps | INT | 501–250 | — |
| guidance_scale | FLOAT | 4.000–30 | chat 模式写入 extra_body.guidance_scale;更多参数请使用 advanced_options |
| top_p | FLOAT | 0.900–1 | — |
| repetition_penalty | FLOAT | 1.100.5–2 | — |
| seed | INT | 00–2147483647 | — |
| n | INT | 11–4 | 仅 images_edits 生效;n>1 时输出 IMAGE 批次 |
| response_format | COMBO | b64_json | 仅 images_edits 生效 |
| timeout_sec | INT | 1205–600 | — |
| maskopt | MASK | 可选遮罩;连接时强制走 /v1/images/edits | |
| api_keyopt | STRING | 留空时使用环境变量或 QING 配置 | |
| advanced_optionsopt | STRING | 高级选项节点输出的 JSON(可通过 custom_json 兜底扩展) |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| raw_response | STRING | — |
| status | STRING | — |
| debug_info | STRING | — |