TensorScale SenseNova U1.5 (Soze)
TensorScale SenseNova U1.5 in ComfyUI
- image
- image_path
- request_id
- config
- status
There's no GPU on Earth that will ever run this node's model locally, and that's the point. TensorScale SenseNova U1.5 is a hosted text-to-image model, and this node is a thin HTTP client that sends your prompt to TensorScale's API, waits for the finished PNG, and drops it into your graph as if a local sampler had made it. Type a prompt, hit run, get a 2048x2048 image back. No checkpoint to download, no VRAM, no model files at all.
It's one node in Soze's "Quality of Life" pack (SozeInc/ComfyUI_Soze), which also wraps MiniMax H3, LTX video, FAL, and ElevenLabs. The TensorScale group is all cloud inference: each node POSTs once and streams the result back. If the community is split on API nodes - "right tool for a model you can't run, wrong default for one you can" - this one is squarely in the first camp. SenseNova isn't something you're going to abliterate and run at home. You either call it or you don't use it.
How it works
Under the hood (in py/tensorscale.py) the node builds a small JSON payload - prompt, seed, size, cfg_scale, timestep_shift - and POSTs it to https://api.tensorscale.io/v2/sensenova-u1.5/t2i with your key as a Bearer token. The call is synchronous, not polling: the socket stays open for the entire generation, and TensorScale streams the finished PNG back to ComfyUI's temp folder, where it's decoded into a normal IMAGE tensor. The request runs on a worker thread so a long generation doesn't freeze ComfyUI's event loop.
A couple of honest gotchas buried in the source. The current "service profile" is pinned to the golden 2048x2048 / 50-step request: size must be 2048x2048, cfg_scale must be 4.0, and timestep_shift must be 3.0. The widgets are exposed anyway in case TensorScale widens the profile, but the tooltips literally say "must be" - leave them alone. And unlike an image-only sampler, this thing has a 30-minute default read timeout (timeout, default 1800s, max 7200s). If the model's queue is long, that's your buffer.
The inputs that matter
Only two are required, and one of them is obvious:
- prompt - your text, multiline. Blank prompt gets you a graceful skip, not a crash.
- seed - integer, default 42. Set it for reproducible results.
The optional ones are mostly set-and-forget: the pinned size/cfg_scale/timestep_shift above, plus api_key_env (which env var holds the key; more below) and timeout.
The five outputs are image (wire this straight into a Preview Image / Save Image / upscaler), image_path (where the PNG landed), request_id (your audit trail for billing disputes), config (a summary string of what you sent), and status (the run log). On failure it doesn't blow up the graph - it returns a 64x64 blank image and puts the error in status. If you ever see a tiny blank square, that's the node telling you the API call failed.
Installing and the API key
Clone it into custom_nodes (or install via ComfyUI Manager by searching "ComfyUI_Soze") and restart:
cd ComfyUI/custom_nodes
git clone https://github.com/SozeInc/ComfyUI_Soze.git
pip install -r ComfyUI_Soze/requirements.txt
No models to fetch. The heavy requirements (torch, moviepy, fal-client, azure-storage-blob) serve the pack's other nodes; this one just needs requests plus ComfyUI itself.
The real setup step is the key. TensorScale keys are model-scoped, so the node reads TENSORSCALE_API_KEY_SENSENOVA_U1_5 by default, falling back to a shared TENSORSCALE_API_KEY. Set it in your environment, or drop a .env file in the repo root (gitignored - never commit it):
echo "TENSORSCALE_API_KEY_SENSENOVA_U1_5=tsk_..." >> ComfyUI_Soze/.env
Common issues
- "No TensorScale API key found" - the exact RuntimeError the source raises when no matching env var exists. The key must also be authorized for this model, so a key for another model won't do.
- Blank 64x64 output - API error; read the
statusoutput string for the real message. - Read timeout - the endpoint is synchronous and generation can be slow; that's what the 1800s default is for. Bump
timeoutif your runs time out. - Your prompt leaves the machine - it goes to TensorScale's servers with their moderation and logging. Same as any API node: fine for a model you can't run, not a privacy feature.
It's pay-per-call, so keep an eye on the meter. But for the one time you need a 2K image from a model that only exists in the cloud, nothing local touches it.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | — | |
| seed | INT | 420–4294967295 | — |
| sizeopt | STRING | 2048x2048 | Must be 2048x2048 in the current service profile. |
| cfg_scaleopt | FLOAT | 4.00–20 | Must be 4.0 in the current service profile. |
| timestep_shiftopt | FLOAT | 3.00–20 | Must be 3.0 in the current service profile. |
| api_key_envopt | STRING | TENSORSCALE_API_KEY_SENSENOVA_U1_5 | Environment variable holding the model-scoped key. Falls back to TENSORSCALE_API_KEY when unset. |
| timeoutopt | INT | 180060–7200 | Read timeout in seconds. These endpoints are synchronous — the socket stays open for the whole generation. |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| image_path | STRING | — |
| request_id | STRING | — |
| config | STRING | — |
| status | STRING | — |