Nodes/ComfyUI-Kavel/Kavel Generate Image
ComfyUI Node

Kavel Generate Image

A frontier cloud model in your graph, no GPU and no key to start

By hanshs474·Created about a month ago·Updated about a month ago· 1
Kavel Generate Image
    • image
    • url
    ◄promptmatte black ceramic mug on pale oak, soft window light►
    ◄aspect_ratio1:1►
    ◄api_key►
    ◄model►
    ◄seed0►

    Kavel Generate Image is an API node: it looks like a local generator on the canvas, except nothing runs on your machine. Type a prompt, hit Queue, and a closed model you were never allowed to download - Nano Banana, GPT Image, Seedream - hands back a picture that drops into your graph as a plain IMAGE. No checkpoint, no VRAM, no driver to fight.

    That's why the external API node pattern exists, and this node hits two of its three motives at once: the model has no open weights, so calling it is the only door, and you may not own a card that can run anything. If either is your situation, this isn't a compromise, it's the shortcut.

    What's actually happening under the canvas

    Kavel isn't a model. It's a service at kavel.ai, and this pack is a thin Python client for it - about a hundred lines of urllib, with dependencies = [] in pyproject.toml and no requirements.txt at all. The node POSTs your prompt to kavel.ai/api/ai/generate, gets a task id, polls every 5 seconds for up to 360 seconds, downloads the finished image and converts the bytes into the usual float32 [1, H, W, C] tensor.

    One thing worth knowing: the request carries "provider": "kie". So the chain is Kavel's front end → kie.ai's model proxy → Google, OpenAI or ByteDance - a known reseller layer, where your prompt, your billing and your content filter are all somebody else's policy. It works; just don't mistake the branding for the vendor.

    Two tiers, decided by one field. Empty api_key means an anonymous id header and kavel-image-v1 - an unnamed internal model, watermarked output, a few images a day, and (per the README) a 25–80 second queue. Paste a key and it switches to Bearer auth, your credits, and whatever you put in model: nano-banana-2, gpt-image-2, seedream-5-pro are the author's examples.

    The fields you'll actually touch

    prompt is a multiline box, shipped pre-filled with a mug-on-oak example that hints at the intended use. aspect_ratio is your only structural control - 1:1, 16:9, 9:16, 4:3, 3:4. No width, height, steps or CFG, because you aren't sampling, you're ordering.

    api_key and model work as described, with one trap the code confirms: model is only read when a key is present (model.strip() if (key and model.strip()) else free_model). Type gpt-image-2, leave the key empty, and you silently get the free model anyway.

    Outputs are image (IMAGE) and url (STRING). Wire the image into Save Image, an upscaler, or straight into Kavel Edit Image. The url is the permanent CDN link - genuinely handy for logging or a webhook. is_output_node is false, so connect it to something or Queue does nothing.

    The seed does nothing, on purpose

    seed never reaches Kavel. The parameter exists in the method signature and is never passed to the request. It's there for one reason: ComfyUI caches aggressively and will skip a node whose inputs haven't changed, so on the free tier you can re-run an identical graph all afternoon and keep getting the cached image handed back. Change the seed to force a fresh call.

    Same caching behavior the node plumbing doc covers, so the usual fixes apply: set the seed widget's control_after_generate to randomize, or set ComfyUI's widget control mode to Before once. Randomize is the right pick - every paid call costs money, and the cache is the only thing between you and accidental spend.

    Install

    ComfyUI Manager, search Kavel, install, restart. Or:

    cd ComfyUI/custom_nodes
    git clone https://github.com/hanshs474/ComfyUI-Kavel
    

    No pip step, no model download, nothing in models/. If you'd rather not paste a key into the node field, set KAVEL_API_KEY in the environment before launching ComfyUI - it's read at call time, but the process env is fixed at startup.

    Where it breaks, and whose fault it is

    "Kavel free allowance used up for today." That message comes from the client, and the code comment explains the annoyance: the quota wall arrives as HTTP 200 with code: 0, a success-looking response that only a wall flag distinguishes. Retrying won't help.

    "Kavel refused this prompt." When a task comes back failed rather than slow, the node raises that instead of resubmitting, which is right - the filter is model-side and opaque. Nano Banana is one of the more aggressively moderated lines out there, so don't expect the free tier to be permissive. Reword, don't retry.

    "Kavel did not finish within 360s." Hard client ceiling, and the free queue means slow is normal.

    Two last things. Your prompt leaves the machine; that's the mechanism, not a bug. And this is a brand-new, vendor-published pack - one commit, a single GitHub account, UTM-tagged links all over the README, and no Reddit footprint I could find. The code is short enough to read in five minutes and does exactly what it claims. Worth doing before you paste a paid key into a node field.

    CategoryKavel

    Inputs (5)

    NameTypeDefaultDescription
    promptSTRINGmatte black ceramic mug on pale oak, soft window light—
    aspect_ratioCOMBO1:15 options: 1:1, 16:9, 9:16, 4:3, 3:4
    api_keyoptSTRINGOptional. Leave empty to use the free tier (no account, watermarked, a few images a day). Paste a key from kavel.ai/settings/apikeys to run on your account with any image model your plan includes. KAVEL_API_KEY in the environment works too.
    modeloptSTRINGOnly used with an API key, e.g. nano-banana-2, gpt-image-2, seedream-5-pro
    seedoptINT00–4294967295Change to force a new run

    Outputs (2)

    NameTypeDescription
    imageIMAGE—
    urlSTRING—