Skip to content

Commit 37df38b

Browse files
Add Illustrious Rectified Flow
1 parent b791556 commit 37df38b

File tree

8 files changed

+22
-14
lines changed

8 files changed

+22
-14
lines changed

ai_diffusion/client.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ def find(self, id: ResourceId):
257257
if result := self.resources.get(id.string):
258258
return result
259259
# Fallback to epsilon model if v-prediction model not found
260-
if id.arch is Arch.illu_v:
260+
if id.arch in (Arch.illu_v, Arch.illu_rf):
261261
if result := self.resources.get(id._replace(arch=Arch.illu).string):
262262
return result
263263
# Search for architecture-agnostic model

ai_diffusion/control.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ def _update_is_supported(self):
146146
if client := root.connection.client_if_connected:
147147
models = client.models.for_arch(self._model.arch)
148148

149-
if self.mode.is_ip_adapter and models.arch in [Arch.illu, Arch.illu_v]:
149+
if self.mode.is_ip_adapter and models.arch in [Arch.illu, Arch.illu_v, Arch.illu_rf]:
150150
resid = resource_id(ResourceKind.clip_vision, Arch.illu, "ip_adapter")
151151
has_clip_vision = client.models.resources.get(resid, None) is not None
152152
if not has_clip_vision:
@@ -177,7 +177,7 @@ def _update_is_supported(self):
177177
model = models.find_control(self.mode)
178178
self.has_range = model == models.control.find(self.mode, True)
179179
if model is None:
180-
search_arch = Arch.illu if models.arch is Arch.illu_v else models.arch
180+
search_arch = Arch.illu if models.arch in (Arch.illu_v, Arch.illu_rf) else models.arch
181181
search_path = (
182182
resources.search_path(ResourceKind.controlnet, search_arch, self.mode)
183183
or resources.search_path(ResourceKind.model_patch, search_arch, self.mode)

ai_diffusion/resources.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ class Arch(Enum):
9090
flux2_9b = "Flux 2 Klein 9B"
9191
illu = "Illustrious"
9292
illu_v = "Illustrious v-prediction"
93+
illu_rf = "Illustrious Rectified Flow"
9394
chroma = "Chroma"
9495
qwen = "Qwen"
9596
qwen_e = "Qwen Edit"
@@ -103,6 +104,8 @@ class Arch(Enum):
103104
@staticmethod
104105
def from_string(string: str, model_type: str = "eps", filename: str | None = None):
105106
filename = filename.lower() if filename else ""
107+
if filename and filename.startswith("chenkin"):
108+
return Arch.illu_rf
106109
if string == "sd15":
107110
return Arch.sd15
108111
if string == "sdxl" and model_type == "v-prediction":
@@ -123,6 +126,8 @@ def from_string(string: str, model_type: str = "eps", filename: str | None = Non
123126
return Arch.illu
124127
if string == "illu_v":
125128
return Arch.illu_v
129+
if string == "illu_rf":
130+
return Arch.illu_rf
126131
if string == "chroma":
127132
return Arch.chroma
128133
if string == "qwen-image" and "edit" in filename:
@@ -175,19 +180,19 @@ def has_controlnet_inpaint(self):
175180

176181
@property
177182
def supports_regions(self):
178-
return self in [Arch.sd15, Arch.sdxl, Arch.illu, Arch.illu_v]
183+
return self in [Arch.sd15, Arch.sdxl, Arch.illu, Arch.illu_v, Arch.illu_rf]
179184

180185
@property
181186
def supports_lcm(self):
182187
return self in [Arch.sd15, Arch.sdxl]
183188

184189
@property
185190
def supports_clip_skip(self):
186-
return self in [Arch.sd15, Arch.sdxl, Arch.illu, Arch.illu_v]
191+
return self in [Arch.sd15, Arch.sdxl, Arch.illu, Arch.illu_v, Arch.illu_rf]
187192

188193
@property
189194
def supports_attention_guidance(self):
190-
return self in [Arch.sd15, Arch.sdxl, Arch.illu, Arch.illu_v]
195+
return self in [Arch.sd15, Arch.sdxl, Arch.illu, Arch.illu_v, Arch.illu_rf]
191196

192197
@property
193198
def supports_cfg(self):
@@ -204,7 +209,7 @@ def supports_edit(self): # includes text-to-image models that can also edit
204209
@property
205210
def is_sdxl_like(self):
206211
# illustrious technically uses sdxl architecture, but has a separate ecosystem
207-
return self in [Arch.sdxl, Arch.illu, Arch.illu_v]
212+
return self in [Arch.sdxl, Arch.illu, Arch.illu_v, Arch.illu_rf]
208213

209214
@property
210215
def is_flux_like(self):
@@ -223,7 +228,7 @@ def text_encoders(self):
223228
match self:
224229
case Arch.sd15:
225230
return ["clip_l"]
226-
case Arch.sdxl | Arch.illu | Arch.illu_v:
231+
case Arch.sdxl | Arch.illu | Arch.illu_v | Arch.illu_rf:
227232
return ["clip_l", "clip_g"]
228233
case Arch.sd3:
229234
return ["clip_l", "clip_g"]
@@ -257,6 +262,7 @@ def list():
257262
Arch.flux2_9b,
258263
Arch.illu,
259264
Arch.illu_v,
265+
Arch.illu_rf,
260266
Arch.chroma,
261267
Arch.qwen,
262268
Arch.qwen_e,
@@ -721,6 +727,7 @@ def is_required(kind: ResourceKind, arch: Arch, identifier: ControlMode | Upscal
721727
resource_id(ResourceKind.controlnet, Arch.sdxl, ControlMode.universal): ["union-sdxl", "xinsirunion"],
722728
resource_id(ResourceKind.controlnet, Arch.illu, ControlMode.universal): ["union-sdxl", "xinsirunion"],
723729
resource_id(ResourceKind.controlnet, Arch.illu_v, ControlMode.universal): ["union-sdxl", "xinsirunion"],
730+
resource_id(ResourceKind.controlnet, Arch.illu_rf, ControlMode.universal): ["union-sdxl", "xinsirunion"],
724731
resource_id(ResourceKind.controlnet, Arch.flux, ControlMode.universal): ["flux.1-dev-controlnet-union-pro-2.0", "flux.1-dev-controlnet-union-pro", "flux.1-dev-controlnet-union", "flux1devcontrolnetunion"],
725732
resource_id(ResourceKind.controlnet, Arch.qwen, ControlMode.universal): ["qwen-image-instantx-controlnet-union"],
726733
resource_id(ResourceKind.controlnet, Arch.sd15, ControlMode.scribble): ["control_v11p_sd15_scribble", "control_lora_rank128_v11p_sd15_scribble"],
@@ -798,6 +805,7 @@ def is_required(kind: ResourceKind, arch: Arch, identifier: ControlMode | Upscal
798805
resource_id(ResourceKind.vae, Arch.sdxl, "default"): ["sdxl_vae"],
799806
resource_id(ResourceKind.vae, Arch.illu, "default"): ["sdxl_vae"],
800807
resource_id(ResourceKind.vae, Arch.illu_v, "default"): ["sdxl_vae"],
808+
resource_id(ResourceKind.vae, Arch.illu_rf, "default"): ["sdxl_vae"],
801809
resource_id(ResourceKind.vae, Arch.sd3, "default"): ["sd3"],
802810
resource_id(ResourceKind.vae, Arch.flux, "default"): ["flux-", "flux_", "flux/", "flux1", "ae.s"],
803811
resource_id(ResourceKind.vae, Arch.flux_k, "default"): ["flux-", "flux_", "flux/", "flux1", "ae.s"],

ai_diffusion/ui/server.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -371,7 +371,7 @@ def __init__(self, server: Server, parent=None):
371371
),
372372
"illu": PackageGroupWidget(
373373
_("Illustrious/NoobAI XL models"),
374-
[m for m in optional_models if m.arch in [Arch.illu, Arch.illu_v]],
374+
[m for m in optional_models if m.arch in [Arch.illu, Arch.illu_v, Arch.illu_rf]],
375375
is_checkable=True,
376376
is_expanded=False,
377377
parent=self,

ai_diffusion/ui/settings.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -644,7 +644,7 @@ def model_name(id: ResourceId, with_file=False):
644644
text += "</ul>"
645645
text += _("Detected base models:") + "\n<ul>"
646646
for arch, missing in res.missing.items():
647-
if arch in [Arch.all, Arch.illu_v]:
647+
if arch in [Arch.all, Arch.illu_v, Arch.illu_rf]:
648648
continue
649649
text += f"<li><b>{arch.value}</b>: "
650650
if len(missing) == 0:

ai_diffusion/ui/style.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -925,7 +925,7 @@ def _show_builtin_info(self, style: Style):
925925
def _enable_checkpoint_advanced(self):
926926
arch = resolve_arch(self.current_style, root.connection.client_if_connected)
927927
if arch.is_sdxl_like:
928-
valid_archs = (Arch.auto, Arch.sdxl, Arch.illu, Arch.illu_v)
928+
valid_archs = (Arch.auto, Arch.sdxl, Arch.illu, Arch.illu_v, Arch.illu_rf)
929929
elif arch.is_flux_like:
930930
valid_archs = (Arch.auto, Arch.flux, Arch.flux_k)
931931
elif arch.is_qwen_like:

ai_diffusion/ui/theme.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ def checkpoint_icon(arch: Arch, format: FileFormat | None = None, client: Client
6969
return icon("sd-version-flux-2")
7070
elif arch is Arch.illu:
7171
return icon("sd-version-illu")
72-
elif arch is Arch.illu_v:
72+
elif arch in (Arch.illu_v, Arch.illu_rf):
7373
return icon("sd-version-illu-v")
7474
elif arch is Arch.chroma:
7575
return icon("sd-version-chroma")

ai_diffusion/workflow.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ def load_checkpoint_with_lora(w: ComfyWorkflow, checkpoint: CheckpointInput, mod
145145
match arch:
146146
case Arch.sd15:
147147
clip = w.load_clip(te["clip_l"], "stable_diffusion")
148-
case Arch.sdxl | Arch.illu | Arch.illu_v:
148+
case Arch.sdxl | Arch.illu | Arch.illu_v | Arch.illu_rf:
149149
clip = w.load_dual_clip(te["clip_g"], te["clip_l"], type="sdxl")
150150
case Arch.sd3:
151151
if te.find("t5"):
@@ -188,7 +188,7 @@ def load_checkpoint_with_lora(w: ComfyWorkflow, checkpoint: CheckpointInput, mod
188188
else:
189189
model, clip = w.load_lora(model, clip, lora.name, lora.strength, lora.strength)
190190

191-
if arch is Arch.sd3:
191+
if arch is Arch.sd3 or arch is Arch.illu_rf:
192192
model = w.model_sampling_sd3(model)
193193

194194
if checkpoint.v_prediction_zsnr:

0 commit comments

Comments
 (0)