Nodes/ComfyUI-SayMaker/SayMaker Generate Image
ComfyUI Node

SayMaker Generate Image

A text-to-image node with nothing to download

By hanshs474·Created 14 days ago·Updated 14 days ago· 0
SayMaker Generate Image
    • image
    • url
    ◄promptmatte black ceramic mug on pale oak, soft window light►
    ◄aspect_ratio1:1►
    ◄modelsaymaker-image-v1►
    ◄api_key►
    ◄seed0►

    What you're actually plugging in

    The box has a text field and no model. SayMaker Generate Image doesn't sample anything on your machine - it posts your prompt to saymaker.ai, waits for whichever closed model you named to finish on their hardware, and drops the result back into your graph as a perfectly ordinary IMAGE.

    If you have no GPU, that's the whole pitch. If you have a 4090, it's still the only door for the models in the README's list - Nano Banana 2, GPT Image 2.5, Seedream 5, Qwen Image 3 - because those weights don't exist as files you can own. No amount of VRAM gets you there. This is the standard API-wrapper shape: from the canvas it looks like any other generator; underneath it's an HTTP client holding your key.

    One trust note, because this category earned it. The pack is tiny and new - a single commit dated 2026-10-05 under a personal GitHub handle. But pyproject.toml carries PublisherId = "saymaker", so it's the vendor's own client rather than a random wrapper, and saymaker_client.py is standard-library Python you can read in ten minutes. Do read it. A node whose job is to phone home with a credential is the one place a malicious phone-home wouldn't look weird.

    How it works

    Your prompt goes to https://saymaker.ai/api/ai/generate with a provider routing field the client keeps in a MODELS map - some model ids route to kie, some to poyo. Then the node polls /api/ai/query every five seconds until an image comes back, downloads it, and converts it to a float32 RGB tensor. The node blocks for that whole time; the client's ceiling is 4500 seconds, or 75 minutes. Free-account runs sit in a queue first.

    Costs are per call, in credits - a new account gets sign-up credits to burn on testing. That's the honest trade against a local checkpoint: free after electricity versus metered every run.

    The inputs worth touching

    Three required, two optional, and one that isn't what it says.

    prompt is your prompt. aspect_ratio is a real dropdown with five choices - 1:1, 16:9, 9:16, 4:3, 3:4 - and nothing else, so no 2:1 banners here. model is a free-text field defaulting to saymaker-image-v1, which the README calls the cheapest one. It's a string, not an enum, so a typo won't be caught locally.

    api_key is optional because the client also reads SAYMAKER_API_KEY from the environment. Empty field, set variable, done.

    seed is the interesting one. Look at the signature in nodes.py - it accepts seed and then never passes it to the client. It is not sent to the API. The tooltip is honest about this if you read it closely: "change to force a new run." ComfyUI caches aggressively, so queuing the same prompt twice returns the cached tensor and costs you nothing on their end. Bumping seed is how you bust that cache. It buys you a new image, not a reproducible one.

    Outputs

    image is the tensor - Save Image, a preview, an upscaler, or straight into SayMaker Edit Image or Image to Video in the same pack. url is the hosted file location as a string - good for a text/metadata node, and identical to what lands in your library at saymaker.ai/history.

    One thing there's no widget for: resolution. The client asks for 1K and n=1, so a 2K or 4K source-quality result isn't on the menu from this node. If you need it big, upscale downstream with something local.

    Install

    ComfyUI Manager, search ComfyUI-SayMaker, install, restart. Or:

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

    No pip step, no model downloads, no dependencies beyond the torch/Pillow ComfyUI already ships (dependencies = [] in pyproject.toml). Grab a key at saymaker.ai/settings/apikeys.

    Where people get burned

    Empty key field, no env var. You get an AuthError with the keys URL in the message. Set SAYMAKER_API_KEY before starting ComfyUI - a variable exported in a terminal that's already running the server does nothing until you restart it.

    Errors that look like success. The service answers refusals with HTTP 200 and code: -1; the client digs the real message out and raises a subclass - QuotaError for an empty balance, PlanError for a model your plan doesn't cover, RejectedError when the filter or the model refuses. Those class names in the console are the diagnosis: a RejectedError means reword, don't retry.

    BusyError: another run on this account is still rendering. Free accounts do one at a time. Queue a graph with eight Generate nodes and watch it fall over.

    A typo in model isn't caught. Unknown ids go out with default routing and fail server-side, several seconds later, with a message about a model you thought you'd fixed.

    75 minutes of a blocked node. Don't stack a batch behind a model having a bad afternoon. Test one prompt at the cheapest model first.

    CategorySayMaker

    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
    modelSTRINGsaymaker-image-v1e.g. nano-banana-2, gpt-image-2-5-flare, seedream-5-pro
    api_keyoptSTRINGKey from saymaker.ai/settings/apikeys (new accounts get sign-up credits). Leave empty to read SAYMAKER_API_KEY from the environment.
    seedoptINT00–4294967295Change to force a new run

    Outputs (2)

    NameTypeDescription
    imageIMAGE—
    urlSTRING—