unslothai/unsloth · error · ValueError
{workflow} is not supported for the '{state.family.name}' mo
Error message
{workflow} is not supported for the '{state.family.name}' model family. What it means
Raised by `_workflow_pipe` when an image-conditioned workflow (img2img, inpaint, etc.) is requested but the loaded model family does not declare a pipeline class for it (`class_name` is falsy). Each model family object carries a mapping of workflow names to diffusers pipeline class names; a family without the mapping cannot run that workflow. The error is intentionally a ValueError so API layers surface it as a client error.
Source
Thrown at studio/backend/core/inference/diffusion.py:4796
return plan_diffusion_memory(
target = target,
device_memory = device_memory,
model_dense_mib = model_dense_mib,
companion_dense_mib = companion_mib,
text_encoder_dense_mib = text_encoder_mib,
runtime_headroom_mib = runtime_headroom,
requested_mode = memory_mode,
explicit_offload = cpu_offload,
)
def _workflow_pipe(self, state: _LoadState, class_name: Optional[str], workflow: str) -> Any:
"""The diffusers pipeline for an image-conditioned ``workflow``, built once and
cached. ``Pipeline.from_pipe`` re-wires the loaded text-to-image pipe's resident
modules (transformer/VAE/text-encoder, incl. any compiled/quantised state) into
the workflow pipeline class, so there is no extra VRAM and no reload. Raises a
clear ValueError when the family does not support the workflow."""
if not class_name:
raise ValueError(
f"{workflow} is not supported for the '{state.family.name}' model family."
)
cached = self._aux_pipes.get(class_name)
if cached is not None:
return cached
import diffusers
# torch_dtype=None is load-bearing: from_pipe otherwise recasts EVERY component to fp32, which hard-crashes the
# dense-quant path (torchao subclasses cannot swap_tensors). None reuses resident modules at their loaded dtype.
pipe = getattr(diffusers, class_name).from_pipe(state.pipe, torch_dtype = None)
# Publish to the shared aux cache only if THIS load is still current: from_pipe runs without _lock, so an unload can null _state and caching would hand out stale modules.
with self._lock:
if self._state is state:
self._aux_pipes[class_name] = pipe
return pipe
def _controlnet_pipe(self, state: _LoadState, resolved_cn: Any, cancel: threading.Event) -> Any:
"""Build (once, cached) the family's diffusers ControlNet pipeline around the requestedView on GitHub (pinned to 203007d190)
Solutions
- Switch the workflow to one the family supports (typically txt2img) or reload a family that supports the requested workflow.
- If you maintain the family registry, add the missing workflow->pipeline-class entry (e.g. controlnet_pipeline_class / img2img class) for that family.
- In the UI, gate workflow options on the loaded family's declared capabilities instead of showing all.
Example fix
# before diffusion.generate(prompt="...", workflow="inpaint", mask_image=mask) # family has no inpaint class # after diffusion.generate(prompt="...", workflow="txt2img") # or load a family that supports inpaint
Defensive patterns
Strategy: type-guard
Validate before calling
fam = diffusion.loaded_family()
if workflow not in fam.workflows: # capability registry from the load response
workflow = "txt2img" Type guard
def supports_workflow(family, workflow: str) -> bool:
"""Family declares a diffusers pipeline class for this workflow."""
return bool(family.workflow_classes.get(workflow)) Try / catch
try:
diffusion.generate(prompt=p, workflow=wf)
except ValueError as e:
if "is not supported for the" in str(e):
diffusion.generate(prompt=p, workflow="txt2img")
else:
raise Prevention
- Drive UI workflow options from the loaded family's declared workflow list.
- Treat 'not supported for family' ValueErrors as client errors (400), not server faults.
- Test each family you ship against every workflow your UI exposes.
When it happens
Trigger: Calling generate() with a workflow like 'img2img' or 'inpaint' for a family whose workflow-class registry has no entry, e.g. an edit-only or t2i-only family. `_workflow_pipe(state, class_name, workflow)` is invoked after the class lookup fails.
Common situations: Frontends exposing all workflow buttons regardless of loaded model (offering inpaint on a model that only supports txt2img); loading a base checkpoint when the user selected an img2img workflow; new/lesser-known families added without complete workflow class mappings.
Related errors
- ControlNet is not supported for the '{fam.name}' model famil
- Reference images are not supported for the '{state.family.na
- ControlNet currently combines with plain text-to-image only,
- A prompts list is supported for plain text-to-image only; th
- ControlNet '{spec_id}' is for {', '.join(entry.families)}, n
AI-assisted analysis of unslothai/unsloth@203007d190 (2026-08-15).
Data as JSON: /api/errors/0ebb17751882e8b8.
Report an issue: GitHub.