8 Commits
Author SHA1 Message Date
Ivor StrelarandClaude Opus 5.5 bf95ebef42 feat: add SF WaveSpeed Outpaint Resizer
Turns one image into up to 8 resolutions without redrawing the artwork. Each
size, set in an on-node list editor, is auto (crop when that cuts away at
most auto_crop_limit, default 15%, else outpaint), crop or outpaint; sizes of
the image's own shape are just resized. Outpainting uses FLUX Fill (with an
optional Bria GenFill pass over the bottom corners, where FLUX tends to sign),
Bria GenFill or Bria Expand on WaveSpeed to paint only the new strips, pastes
the original back with a feathered seam, and scales each size from that; sizes
sharing a shape share one generation.

An optional edge mask (e.g. a torn-paper right edge) is scaled to the full
length of the chosen side of every output and cut out as transparency, after
the masked area of the input is filled in so no old edge pixels leak into the
outpainting. The whole prompt is visible and editable, with nothing appended.

The size list is stored as JSON in the hidden resolutions widget and drawn by
a DOM editor that is not serialized, so saved widget values keep their order;
older plain-text lists are converted on load.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-10 10:08:32 +01:00
Ivor StrelarandClaude Opus 5.5 17964f3017 fix: retry dropped connections when polling, uploading and downloading on WaveSpeed
A GPT Image run failed with "Connection reset by peer" while polling an
already-submitted task, losing an image that WaveSpeed went on to bill. One
transient network error was enough to abort the node.

Polling, image uploads and result downloads are safe to repeat, so they now
retry connection errors and timeouts up to five times (2, 4, 8, 15, 30 s
apart) before failing with a message that the task may still finish on
WaveSpeed. Submitting a task is deliberately not retried: an unclear failure
there could otherwise create a second billed task.

Applies to every node on the shared v3 helpers (GPT Image, Nano Banana,
Seedream, Seedance, Tripo, Rodin, Meshy). Verified with a stubbed API that
drops connections.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 10:39:21 +01:00
Ivor StrelarandClaude Opus 5.5 1bcb63c420 feat: add Seedream 5.0, Rodin 2.5, Meshy 7.1 and Seedance 2.5 WaveSpeed nodes
- SF WaveSpeed Seedream 5.0: Pro or Flash, generate or edit (up to 10
  references), 1K-2K, n parallel requests. Flash is a flat $0.027.
- SF WaveSpeed Rodin 2.5 Image to 3D: 1-5 views, quad or triangle face
  budgets, PBR/shaded materials, delighting, T/A-pose, HighPack. Defaults to
  18K quads in FBX, since WaveSpeed's default is 500K triangles and GLB
  triangulates quads.
- SF WaveSpeed Meshy 7.1 Image to 3D: standard, low-poly or smart topology,
  polycount target, PBR, texture image/prompt, and optional humanoid
  auto-rig (with walk and run cycles) and animation preset.
- SF WaveSpeed Seedance 2.5: text-to-video, or image-to-video from a start
  and optional end frame; 480p-4k, 4-30 s, native audio; outputs a VIDEO.

All are async V3 nodes, so they run in parallel. generate_3d_model is split
into submit_and_wait and save_3d_model so Rodin and Meshy can reuse them;
pick_model_url can prefer a format, and fetch_video returns a ComfyUI VIDEO.

Verified against a stubbed WaveSpeed API (endpoints, payloads, outputs and
error paths) and by loading them in a separate ComfyUI instance. Not yet
verified with real paid requests.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 13:54:53 +01:00
Ivor StrelarandClaude Opus 5.5 d392931a43 feat: add SF WaveSpeed Tripo H3.1 Image to 3D node
Tripo's high-detail H3.1 model through WaveSpeed, for comparing against P2 on
the same image. About a fifth of P2's price there, with quad or triangle
topology, a 1,000-2,000,000 face target, standard or detailed geometry and
textures, texture alignment, orientation and seeds. A face_limit below
H3.1's 1,000 floor is rejected before submission, pointing at P2.

The upload/submit/wait/download/File3D sequence the two 3D nodes share now
lives in wavespeed_api/v3.generate_3d_model, along with pick_model_url and
output_dir, so P2 and H3.1 differ only in their inputs and payloads. Both are
async and run in parallel with each other and the image nodes.

Verified with a stubbed API: P2 and H3.1 on the same image take 8.6s in
sequence and 4.2s side by side, P2's request body is unchanged by the
refactor, and both return FBX with quad on and GLB with it off.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 12:01:46 +02:00
Ivor StrelarandClaude Opus 5.5 f28000603c feat: run WaveSpeed nodes in parallel and add SF WaveSpeed Nano Banana Pro
GPT Image 2.5 and Tripo P2 waited on WaveSpeed with blocking requests and
time.sleep, so ComfyUI ran them strictly one after another. Partner nodes
overlap because their execute is a coroutine, which ComfyUI's executor
starts as a task and schedules other ready nodes around. Both nodes are now
async (V3 execute, and an async FUNCTION method for the V1 Tripo node).

Async alone is not enough: WaveSpeedClient uses blocking requests, which
would still stall the event loop. wavespeed_api/v3.py now runs every call
and download through asyncio.to_thread, polls with asyncio.sleep, uploads
references and downloads outputs concurrently, and submits a node's n
requests together. Image flattening, downscaling and alpha-aware batching
moved there from the GPT Image node so the new node can share them.

New SF WaveSpeed Nano Banana Pro mirrors the "Nano Banana Pro (Google Gemini
Image)" partner node: the same two models (mapped to google/nano-banana-pro
and google/nano-banana-2), aspect ratios, 1K/2K/4K, and up to 14 batched
reference images switching it to /edit. WaveSpeed has no text output,
response_modalities, system prompt or file inputs, so those are left out.

Verified with a stubbed API whose calls block like real requests: the three
nodes take 10.8s run in sequence and 4.2s run together, and an event-loop
heartbeat keeps ticking throughout.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 11:39:16 +02:00
Ivor StrelarandClaude Opus 5.5 9212fa484e feat: add SF WaveSpeed GPT Image 2.5 node
Mirrors ComfyUI's "OpenAI GPT Image 2.5" partner node but bills a WaveSpeed
key via SF WaveSpeed Client. Built on the same V3 components the partner node
uses: a DynamicCombo model picker whose options carry their own controls, and
Autogrow reference-image slots, so connecting images switches to WaveSpeed's
/edit endpoint and leaving them empty uses /text-to-image.

Follows WaveSpeed's actual schemas rather than OpenAI's: gpt-image-1 is
dropped (not offered), 2 and 2.5 take aspect_ratio plus a 1k/2k/4k resolution
instead of pixel sizes, background exists only on 1.5, and 1.5 caps
references at 10. There is no mask input, as no WaveSpeed edit endpoint
accepts one. WaveSpeed has no `n`, so n requests are submitted together and
returned as one batch.

Copies the partner node's behaviour where it applies: references are
downscaled to 2048x2048 pixels before upload, batches are flattened, and
outputs keep alpha when a transparent background was produced.

Also moves v3 result polling and the 401 key-source message into a shared
wavespeed_api/v3.py, and switches the Tripo P2 node to it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 11:10:38 +02:00
Ivor Strelar a85723bd91 security: fix SSRF, bare excepts, and response text leakage 2026-06-30 10:46:08 +02:00
Ivor Strelar 927af32965 Initial commit: SF ComfyUI Nodes v1.0.0 2026-06-30 10:21:45 +02:00