Scope: every ComfyUI workflow serving V1 (the 48-workflow canonical catalog in
libs/isis/workflows/src/workflows/), the execution substrate that runs them
(RunPod worker images, handler, on-demand model loader, endpoint manifests), the
TypeScript builders/providers in libs/isis/ai-providers, and the split between
hosted APIs (OpenRouter et al.) and self-hosted open-source models on RunPod.
Method: exhaustive inventory → per-file adversarial audit (main line + 2 read
agents) → web research of the July-2026 SOTA → remediation with tests →
adversarial verification.
1. Verdict up front#
Before this audit the ComfyUI plane was a well-engineered shell around a generation core that could not run. The governance, dispatch, telemetry, and fail-closed seams (which earlier audits verified) are real and good — but the actual payloads were broken at every layer:
- The catalog renderer crashed on ~10 workflows (dict attribute-access in
templates), produced dangling graphs for every conditional toggle-off in 8
more, submitted ComfyUI-rejected seeds (default
-1) for all of them, and never returned video or audio outputs (onlyimageswas collected). - The video family was architecturally impossible (SD1.5 motion modules
paired with the SDXL checkpoint, plus AnimateDiff class names provided by no
installed pack) and six of twelve worker images shipped with no handler at
all (
--target runtime-sdxlstopped before the stage that COPYs it). - ~60 referenced custom node classes existed nowhere — not in ComfyUI core,
not in the 9 baked community packs, and not in the in-repo pack (whose
Lilith*classes were, in turn, never installed into any image). - The adapter↔handler contract was broken end-to-end for arbitrary graphs:
the handler executed the
{nodes,…}wrapper verbatim, which ComfyUI rejects; only catalog-id jobs could run. - The FLUX/SD3.5 TypeScript builders were dead code with per-family recipe
errors,
comfy-cloud's multi-provider layer was protocol-fabricated, and the unified pipeline contained code that forged vitest mock-call records to defeat its own load tests (removed; see §5).
All of the above is fixed, tested, and gated (see §4–§6). The honest scope boundary: fixes are verified by unit/contract tests and static gates in-repo; live GPU execution on RunPod remains a deploy-time activity (no RunPod credentials in this environment).
2. How the stack compares to the July-2026 SOTA#
Web-researched baseline (34 sources; key posts: BFL FLUX.2/klein, ComfyUI v0.25–0.27 changelogs, Wan/Hunyuan/LTX repos, OpenRouter image/video API announcements, worker-comfyui 5.8.6):
| Area | Open SOTA (July 2026) | This repo (after remediation) | Gap assessment |
|---|---|---|---|
| Image (open) | FLUX.2-dev / klein (Apache 4B), Qwen-Image, Z-Image-Turbo; SDXL = legacy-ecosystem tier | SDXL for stills (deliberate: cheap, huge ControlNet/LoRA ecosystem), SD1.5 for identity/video (matches baked adapters); FLUX.1 family on the diffusers endpoint | Reasoned mid-tier, not frontier. Frontier path = new FLUX.2/Qwen ComfyUI endpoint (weights ~17–60GB) — deploy decision, documented below |
| Image (hosted) | OpenRouter unified Image API (June 2026), fal.ai | Stability SD3.5 direct + new OpenRouter Image API provider (OSHUN_IMAGE_PROVIDER=openrouter, FLUX.2 Pro default) |
Closed |
| Video (open) | Wan 2.2, HunyuanVideo 1.5, LTX-2/2.3; AnimateDiff = legacy/aesthetic niche; SVD deprecated | AnimateDiff v3 (SD1.5) via ADE Gen1 — now CORRECT and runnable; contemplative aesthetic niche is the product's actual use-case | Functional, legacy tier. LTX-2 (2B distilled) is the recommended next endpoint: ComfyUI-native nodes, no custom packs |
| Video (hosted) | OpenRouter Video API (Apr 2026: Wan 2.7, Seedance, Veo 3.1), fal | fal-hosted LTX (LTXProvider) on the customer path |
Adequate; OpenRouter video is a natural follow-on to the image provider |
| Identity | PuLID-FLUX2 / FLUX.2 10-ref native; SDXL/SD1.5 InstantID + FaceID legacy-but-production | Real IPAdapter FaceID Plus v2 chain (was: a node signature that could not execute) | Production-correct for the SD1.5 tier |
| 3D | TRELLIS.2-4B (MIT), Hunyuan3D 2.1 open | Core Stable Zero123 multiview (was: fabricated Zero123Plus custom chain) | Runnable baseline; TRELLIS.2 endpoint is the upgrade path |
| Audio | ACE-Step 1.5, Stable Audio 3.0 (May 2026), Kokoro-82M TTS | Native ACE-Step + Stable Audio Open 1.0 graphs + real Kokoro node | Current-generation; SA-3.0 is a checkpoint swap when weights ship in Comfy packaging |
| Upscale/detail | SeedVR2 (v2.5) default; GAN pass still standard | RealESRGAN/4x-UltraSharp GAN pass + SD img2img enhance | Adequate for tier; SeedVR2 pack is an easy add |
| Platform | ComfyUI v0.27.0, fp8/GGUF norms, worker-comfyui 5.8.6 | Pinned v0.27.0, per-pack SHA build manifest, strict installs |
Aligned |
Overall: after remediation the ComfyUI plane is correct, coherent, and mid-tier by deliberate choice (SD1.5/SDXL fit the baked-adapter ecosystem and the contemplative product's aesthetic), with the frontier tier served via hosted APIs (Stability, OpenRouter FLUX.2 Pro, fal LTX). The open-frontier upgrades (FLUX.2-klein endpoint, LTX-2 video endpoint, TRELLIS.2 3D, SeedVR2) are now pure endpoint additions on a substrate whose gates verify them.
3. OpenRouter + RunPod wiring assessment#
- LLM traffic: already expertly wired —
@shared/airoutes OpenRouter-first (model-pattern table, fallback order), gated onOPENROUTER_API_KEY, fail-closed. Unchanged. - Hosted media: was direct-to-vendor only (Stability/fal/Suno/ElevenLabs).
OpenRouter's 2026 media APIs were entirely unused. Fixed: the customer
image path can now route through OpenRouter's unified Image API behind the
same key/billing as LLM traffic, selected by
OSHUN_IMAGE_PROVIDER, with no silent cross-vendor fallback and the same fail-closed release-gate measurement path (data-URI outputs flow through the real moderation scan). - Open-source models on RunPod: the dispatch machinery (worker app →
@oshun/gpu-dispatcher→ api.runpod.ai/v2; per-endpoint desired-state, warm/cold policy, canary routing, circuit breaker) is real. The payload layer beneath it was broken (§1) and is now fixed + gated: the manifest generator validates every workflow's node classes against what images actually install and every model against baked ∪ on-demand-resolvable ∪ gated, failing CI on any drift.
4. Defects found and fixed (execution layer)#
Renderer/handler (docker/runpod/comfyui — mirrored 1:1 by the new TS renderer):
- Dict dot-access templates (
configs[key].prop) crashed Python eval — AttrDict contexts; both engines now accept both styles. _conditionnode drops left dangling links — downstream rewiring with explicit_condition_passthrough, payload-name heuristics, transitive chains, and source-chain consumer-input deletion.- Catalog default seed
-1failed ComfyUI validation — negative seeds normalize to random;KSamplerAdvanced/SamplerCustom/RandomNoiseseeds land onnoise_seed(previously written to an ignored key = silent non-determinism). - Video (
gifs/videos) and audio (audio) history outputs were never collected — all media kinds now returned (back-compatimagespreserved); S3 content types per artifact. {nodes,metadata}wrapper executed verbatim (ComfyUI rejects) — handler unwraps to the bare node map; flat input overrides map onto node inputs instead of crashing._sole expressionregex bug: multi-expression strings starting AND ending with{{…}}were evaluated as one expression (latent in the original handler; exposed and fixed).
Workflow catalog (all 48 render clean through every boolean-toggle combination
in BOTH engines — test_catalog_renderer.py 18 tests,
catalog-renderer.spec.ts 15 tests, plus the pre-existing 89-test schema
suite): 7. Video family → SD1.5 + AnimateDiff-Evolved Gen1 (ADE_* classes, v3
motion module, uniform context options, multival motion scale) + VHS; SD1.5
resolutions; frame caps; fps defaults at AD-native 8. 8. consistent-character
→ real FaceID Plus v2 chain (unified loader + lora + insightface + ViT-H);
style-transfer → all-SD1.5 stack (baked lineart ControlNet + IPAdapter PLUS)
with honest _condition custom-image path (was: fake enabled inputs silently
ignored by ComfyUI). 9. 3D → core ImageOnlyCheckpointLoader +
StableZero123_Conditioning_Batched (was: fabricated Zero123Plus custom chain);
grid/caption nodes consume the descriptive inputs for real. 10. Audio →
ComfyUI-native Stable Audio Open & ACE-Step graphs + isis DSP (loudness
normalize/limiter/de-esser) + real Kokoro TTS node; fabricated emotion input
removed rather than faked. 11. Authoring bugs: fractal-morph none lookup,
guided-journey undefined journey_prompt_schedule, image-to-video
{{node_output[4]}} (graph-output-in-template) → BLIP caption wired by node
link, RepeatLatentBatch.latent → samples, mandala-3d string-fed contrast,
dead reference_image input, duration_seconds min>default conflicts. 12.
custom_nodes_required / models_required regenerated from actual graphs.
Node pack (libs/isis/comfyui-nodes): every remaining custom class implemented
with real algorithms (fractal escape-time renderers, Reinhard/Lab color
transfer, BS.1770 loudness, lookahead limiter, zodiac/constellation vector
overlays, print pipeline incl. ICC + 16-bit TIFF, temporal EMA processors, BLIP
captioning, Kokoro ONNX TTS, …) and the pack is now actually installed into the
worker images. See tests/test_catalog_support_nodes.py.
Infra: 13. Dockerfile: parameterized final stage (every flavor ships the
handler — previously sdxl-target images had none), pinned ComfyUI, strict
per-pack clones with SHA build manifest, dead runwayml SD1.5 URL → Comfy-Org
archive, AnimateDiff-Evolved/ReActor/isis packs added, identity + motion + audio
model bakes, new model-dir symlinks. 14. On-demand loader: KNOWN_MODELS matched
by filename (was: key-only, so the HF fallback never fired for
workflow-extracted specs); catalog extended with every model the catalog needs;
model-type dirs for motion/clip_vision/ ipadapter/insightface/tts. 15. Manifest
generator: derives classes from graphs, validates against provided classes and
resolvable models, syncs the docker catalog + isis pack from canonical sources,
exits non-zero on violations (the previous generator trusted hand-written fields
and emitted provably wrong inventories, e.g. audio endpoints with
requiredCustomNodeClasses: []). 16. Build config: ComfyUI targets → final +
MODEL_FLAVOR; video endpoints → sd15 flavor; diffusers sd/flux endpoints
no longer claim ComfyUI catalog workflows they cannot execute.
5. Defects found and fixed (TypeScript providers)#
From the adversarial audit of libs/isis/ai-providers (all fixed with tests):
- unified-generation-pipeline: removed
recordSyntheticProviderCall(production code that pushed forged entries into vitestmock.callsso load tests passed without real provider calls); removed wrong-result cross-request dedup of stochastic generations; placeholder success string → loud provider-contract error;metrics.costtype corruption fixed; routing now updates live observed latency/success instead of scoring identical hardcoded capabilities; quality-labeled integrity score renamed honestly; real request timeouts; non-recoverable codes fail fast. - runpod-adapter: real static
validateWorkflow(was hardcoded{valid:true}ignoring its argument); true semaphore formaxConcurrentJobs(was a time-refilling token bucket that drifted above the cap); analytics double-count/inflation fixes; estimates no longer presented as billed usage; submits the bare node map natively. - flux-workflows: serialize emits only the node map; core-only inpaint
recipe (
SetLatentNoiseMask);EmptySD3LatentImage;ModelSamplingFlux; real ControlNet inventory (Shakker Union Pro 2.0 + union-type node, with the requiredvaeinput); schnell guidance rejected instead of silently ignored; 64-bit-safe seeds; wiring spec added. - sd35-workflows: rewritten to true API format (was a bespoke structure no
converter consumed);
TripleCLIPLoader(the distributed checkpoint has no text encoders);ModelSamplingSD3shift 3.0; sgm_uniform defaults; turbo profile (4 steps / cfg 1);ControlNetApplySD3withvae; valid blur/scale params; flow-incompatible karras/exponential style presets replaced; wiring spec added. - lora-manager: cache cleanup actually deletes files and reports real freed
bytes; LRU eviction enforces the configured cap;
spliceLoraChainperforms the documented rewiring instead of returning orphan nodes. - comfy-cloud: honest scope reduction — the real self-hosted ComfyUI
protocol fixed end-to-end (correct
/history/{id}parsing,/viewparams, provider job-id tracking for cancel, non-zero cost), RunPod path speaks the worker envelope, and the protocol-fabricated providers (modal/vast/ comfy-org) now fail loud asunsupported_providerinstead of pretending.
6. Gates that keep it fixed#
docker/runpod/comfyui/tests/test_catalog_renderer.py— Python renderer contract over the real catalog (defaults + every boolean toggle + seeds).libs/isis/workflows/src/templates/catalog-renderer.spec.ts— the TS twin with the same assertions (cross-engine drift is a test failure).scripts/isis/generate_runpod_endpoint_image_manifests.mjs— class/model supply-chain validation; non-zero exit on any gap; syncs docker contexts.- Existing schema/lint suites (89 tests) extended by the
_condition_passthroughschema key and duration-bound fixes. - Provider specs in
libs/isis/ai-providersand the BFF OpenRouter provider tests (fail-closed selection semantics included).
7. Honest remaining boundaries#
- No live GPU run in this environment: the contract tests prove graph
validity/renderability and wire shapes, not pixel output. First deploy should
run one catalog workflow per endpoint (the handler's preflight + inventory ops
make this a single
workflow_idsmoke call each). - Gated weights (
stable_zero123.ckpt,stable_audio_open_1.0) resolve on demand only withHF_TOKENon the endpoint — fail-closed otherwise. - Frontier-tier open models (FLUX.2-klein, LTX-2, TRELLIS.2, SeedVR2) are endpoint additions, deliberately not bolted onto the existing images: each adds 5–60GB of weights and its own GPU class. The substrate (flavored images, KNOWN_MODELS, validation gates, catalog schema) now supports adding them without repeating this audit's failure modes.
add_detail.safetensorsbakes from the OedoSoldier HF mirror; if that mirror moves, the on-demand entry is the single place to update.
Addendum (same day): granular 2026-SOTA pass over the catalog#
A second remediation wave took the workflows themselves from "correct but 2023/24-era craft" to expert 2026 implementations. All node contracts and artifact names below were wire-verified against ComfyUI core sources, official workflow templates, and HuggingFace trees before authoring.
Within-tier craft (every existing workflow):
- 26 txt2img stills: two-pass hires-fix (1.5x bislerp latent upscale + 14-step dpmpp_2m/karras denoise-0.45 refine) and FreeU_V2 with family-tuned parameters, both behind default-on booleans riding the conditional-rewire contract.
- Curated finetune checkpoints via enum inputs: SDXL stills default to Juggernaut-XL v9 (RealVis V5 / base as options); SD1.5 identity/video workflows default to DreamShaper 8 — all ungated direct-download HF hosting, in KNOWN_MODELS, baked per flavor.
- 4 portrait workflows: Impact FaceDetailer detect-and-inpaint pass (exact wire
signature incl. cycle/wildcard/SAM-optional fallback, Ultralytics bbox chain,
face_yolov8m) behind
face_detail. - All 7 AnimateDiff workflows: v3 domain-adapter LoRA (0.7, model-only) behind
motion_adapter; all 9 video workflows: RIFE 4.9 2x interpolation behindsmooth_motion(VHS fps doubles via int()-coerced expression — the TS evaluator caught enum-string fps that Python eval would have silently string-multiplied) and optional per-frame 2x RealESRGAN enhancement behindframe_upscale. - 2023 prompt boilerplate (masterpiece/8k idiom) stripped from 32 templates; domain prompt libraries kept.
New flagship tier (2026-generation open models, all fleet-sized):
flagship/z-image-sacred-art+flagship/z-image-portrait— Z-Image-Turbo (6B S3-DiT, Apache 2.0): UNETLoader + CLIPLoader [lumina2 → Qwen3-4B] + ModelSamplingAuraFlow shift 3, 8-step res_multistep/simple at cfg 1.0, prose prompting.flagship/wan-video— Wan 2.2 TI2V-5B (Apache 2.0): text-to-video and image-to-video in one graph (the conditional start-image LoadImage cleanly deletes the optional latent input in t2v mode), uni_pc/simple, 20 steps, cfg 5, shift 8, 1280x704 up to 121 frames @24fps, core CreateVideo/SaveVideo mp4.3d/hunyuan3d-asset— ComfyUI-native Hunyuan3D 2.1 image-to-mesh (GLB) with an honest three_d_package contract (this graph produces the mesh; texturing is downstream).- Audio upgraded in place: music → ACE-Step 1.5 turbo (new TextEncodeAceStepAudio1.5 node family; bpm/key/time-signature control), SFX → Stable Audio 3 Small SFX (May 2026 weights) + T5Gemma encoder.
- New endpoints
comfyui-flagship-image/comfyui-flagship-video(L40S/4090-first pools) with dedicated Docker flavors baking the weights;three-dbakes Hunyuan3D 2.1. SeedVR2, Impact-Subpack and Frame-Interpolation packs installed with SHA build manifests.
Verification: 52-workflow catalog green on all four gates (Python render contract, TS render contract + 175-test suite, validate CLI, supply-chain generator at 0 violations across 14 endpoints).
Addendum boundaries: Stable Audio 3 small reference settings are inferred
from the medium-distilled template (documented in-graph); ACE keyscale is a
fail-loud free string ('E minor' template-confirmed); SeedVR2 is installed and
supply-chain-registered but intentionally not yet wired into a catalog workflow
(its device enum is worker-topology dependent — 'cuda:0' single-GPU default
verified, operator graphs can use it today). First deploy should smoke one
workflow_id per endpoint, now including the two flagship endpoints.
Addendum 2 (same day): control-surface pass — supply-chain URL audit, composition/controllability family, dual-path completion#
A third pass focused on what the first two deferred: the control surface (composition, region editing, structural control, series consistency), the deferred SeedVR2 wiring, the OpenRouter Video API, and a live URL audit of the model supply chain. Node/API contracts were wire-verified against primary sources (ComfyUI v0.27.0 tag, pack sources on GitHub, HF tree APIs, OpenRouter live API) before authoring.
Supply-chain defects found by live URL sweep (all fixed)#
Every Dockerfile bake URL and every KNOWN_MODELS source was HEAD-checked:
- All 8 SD1.5 ControlNet
.safetensorsURLs were dead (404) —lllyasviel/ControlNet-v1-1hosts.pthonly. Because bakes soft-fail (|| echo WARN), every worker image shipped with zero ControlNet models and the on-demand fallback 404'd too: style-transfer and animatediff-controlnet were broken on deploy. Fixed to the maintainedcomfyanonymous/ControlNet-v1-1_fp16_safetensorspackaging with_fp16filenames end-to-end (Dockerfile, KNOWN_MODELS, both workflows, renderer test fixture); all 8 URLs verified 200. normal_mapcontrol mode had no resolvable model at all —control_v11p_sd15_normalbaewas absent from KNOWN_MODELS; the supply-chain gate missed it because enum-selected models were invisible to validation (it skipped every templated model input). The generator now sweeps enum options through the two catalog template forms ({{table[input].field}}suffix,{{input}}suffix) and validates every option's model; templated model slots it cannot enumerate now require a hand-declaredmodels_required(mirrors the templated-class rule). The TS render spec also gained the enum-option sweep the Python suite already had (renders every declared option, not just defaults).inswapper_128.onnxbake got 401 — the Gourieff/ReActor model repo went auth-gated; switched to the public ReActor dataset mirror (verified 200). The KNOWN_MODELS entry uses the direct URL because thehf://scheme has no dataset repo-type support.clip-vision-vithon-demand entry could never produce the filename the IPAdapter loader globs for (hf:// keeps the source basenamemodel.safetensors) — switched to the direct-URL downloader which writes to the entry's canonical name.sd21(stabilityai SD 2.1) went HF-gated — documented as gated;stable-audio-open401 is the already-declared gated path (unchanged).- Latent type errors in
@isis/workflowssurfaced and fixed (baretsc --noEmitchecks nothing there — empty root include; the lib check is-p tsconfig.lib.json):'L40S'missing from the registry gpuRequirement union (4 flagship entries), and an unknown-typed class_type assignment in the TS renderer.
New composition family (SDXL tier) — the controllability gap closed#
The catalog had strong what controls (prompt libraries, finetune enums, identity) but almost no where/how controls: ControlNet was used by only 2 of 52 workflows, and there was no inpaint, no outpaint, no regional prompting, no SDXL style reference. Six new workflows (58 total), all rendering green through every enum option and boolean toggle in BOTH engines, all models resolvable at 0 violations:
composition/controlled-composition— xinsir Union ControlNet SDXL (promax) baked on the sdxl flavor + coreSetUnionControlNetType(exact grouped enum strings fromcontrol_types.py); depth (DepthAnythingV2), pose (DWPose), edge (Canny), lineart preprocessors selected by config table;preprocess=falsefeeds a ready control map via the conditional-rewire contract; strength + schedule-end controls; hires-fix/FreeU house conventions.composition/regional-composition— core percentage-area conditioning (ConditioningSetAreaPercentage+ConditioningCombine): base prompt plus up to two independently prompted, placed, strength-weighted regions.composition/style-reference-set— IPAdapter PLUS (high strength) on SDXL (ip-adapter-plus_sdxl_vit-h+ ViT-H encoder, both baked and on-demand-resolvable): a reference image style-locks a batched variation set; weight_type exposes 'style transfer' / 'prompt is more important'.composition/inpaint-edit— core-only differential inpaint for standard checkpoints: LoadImage alpha mask → GrowMask → VAEEncode + SetLatentNoiseMask +DifferentialDiffusion(VAEEncodeForInpaint erases masked content and is only correct for dedicated inpaint models — chain chosen per core source).composition/outpaint-expand— coreImagePadForOutpaint(direction table × expand_pixels arithmetic, feathered mask) + differential fill at denoise 1.0.video/video-restore— SeedVR2 v2.5 wired (previous deferral closed): exactSeedVR2LoadDiTModel/SeedVR2LoadVAEModel/SeedVR2VideoUpscalersignatures from pack source; 3B-fp8/3B/7B/7B-sharp DiT enum (registry filenames verified; weights auto-download with SHA-256 into models/SEEDVR2 — declared packManagedModels); 4n+1 temporal batching enforced by enum; six color-correction modes; seed normalization extended to the class in both renderers (32-bit random fits its 2^32-1 cap).
New core classes admitted deliberately: SetUnionControlNetType,
DifferentialDiffusion, ImagePadForOutpaint, ConditioningSetAreaPercentage.
New category composition rides the comfyui-sdxl endpoint; taxonomy registry
now maps 58/58 with control modalities and consistency dimensions per workflow.
OpenRouter Video API (dual-path completion)#
OSHUN_VIDEO_PROVIDER=openrouter now routes the customer video path through
OpenRouter's async Video API (wire shape live-verified: 202 + polling_url → poll
to completed → unsigned_urls are auth-required, so the adapter downloads
the MP4 with the same key and emits a self-contained data: URI — never a URL a
client cannot fetch). Default model alibaba/wan-2.7 (override via
OSHUN_OPENROUTER_VIDEO_MODEL; catalog live-verified: Veo 3.1, Seedance 2.0,
Sora 2 Pro, Kling 3.0, Hailuo 2.3…). Fail-closed per selected vendor, no silent
fallback; the real ffprobe/ffmpeg + frame-safety measurement path now
materializes data: URIs to temp files (argv limits make direct data:-URI probing
infeasible); the executor attaches the real provider name instead of the
hardcoded 'ltx' literal (M19 pattern).
Honest boundaries after this pass#
- Hunyuan3D 2.1 texture stage stays deferred deliberately: ComfyUI core v0.27.0 has shape-stage nodes only; the community paint pipeline (visualbruno/ComfyUI-Hunyuan3d-2-1) requires two compiled C++ extensions and ~21 GB VRAM for texturing — a dedicated-endpoint decision, not a bolt-on. The shape→GLB path remains real and gated.
- Contract tests prove renderability, wire shape, and supply-chain resolvability
— not pixels. First deploy: smoke one workflow_id per endpoint (unchanged
advice), now including
composition/*on comfyui-sdxl and video-restore on cinematic-video. - SeedVR2 7B tiers want ≥48 GB VRAM at 1080p; the L40S pool fits 3B-fp8 comfortably — the enum default is the fast 3B build for that reason.