Skip to content

Commit b42274a

Browse files
authored
Feat[model support]: Qwen Image — full pipeline with edit, generate LoRA, GGUF, quantization, and UI (#9000)
1 parent a350712 commit b42274a

90 files changed

Lines changed: 5497 additions & 119 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

invokeai/app/api/dependencies.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
CogView4ConditioningInfo,
5252
ConditioningFieldData,
5353
FLUXConditioningInfo,
54+
QwenImageConditioningInfo,
5455
SD3ConditioningInfo,
5556
SDXLConditioningInfo,
5657
ZImageConditioningInfo,
@@ -141,6 +142,7 @@ def initialize(
141142
SD3ConditioningInfo,
142143
CogView4ConditioningInfo,
143144
ZImageConditioningInfo,
145+
QwenImageConditioningInfo,
144146
AnimaConditioningInfo,
145147
],
146148
ephemeral=True,

invokeai/app/invocations/fields.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,8 @@ class FieldDescriptions:
171171
sd3_model = "SD3 model (MMDiTX) to load"
172172
cogview4_model = "CogView4 model (Transformer) to load"
173173
z_image_model = "Z-Image model (Transformer) to load"
174+
qwen_image_model = "Qwen Image Edit model (Transformer) to load"
175+
qwen_vl_encoder = "Qwen2.5-VL tokenizer, processor and text/vision encoder"
174176
sdxl_main_model = "SDXL Main model (UNet, VAE, CLIP1, CLIP2) to load"
175177
sdxl_refiner_model = "SDXL Refiner Main Modde (UNet, VAE, CLIP2) to load"
176178
onnx_main_model = "ONNX Main model (UNet, VAE, CLIP) to load"
@@ -340,6 +342,12 @@ class ZImageConditioningField(BaseModel):
340342
)
341343

342344

345+
class QwenImageConditioningField(BaseModel):
346+
"""A Qwen Image Edit conditioning tensor primitive value"""
347+
348+
conditioning_name: str = Field(description="The name of conditioning tensor")
349+
350+
343351
class AnimaConditioningField(BaseModel):
344352
"""An Anima conditioning tensor primitive value.
345353

invokeai/app/invocations/metadata.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,10 @@ def invoke(self, context: InvocationContext) -> MetadataOutput:
166166
"z_image_img2img",
167167
"z_image_inpaint",
168168
"z_image_outpaint",
169+
"qwen_image_txt2img",
170+
"qwen_image_img2img",
171+
"qwen_image_inpaint",
172+
"qwen_image_outpaint",
169173
"anima_txt2img",
170174
"anima_img2img",
171175
"anima_inpaint",

invokeai/app/invocations/model.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,13 @@ class GlmEncoderField(BaseModel):
7272
text_encoder: ModelIdentifierField = Field(description="Info to load text_encoder submodel")
7373

7474

75+
class QwenVLEncoderField(BaseModel):
76+
"""Field for Qwen2.5-VL encoder used by Qwen Image Edit models."""
77+
78+
tokenizer: ModelIdentifierField = Field(description="Info to load tokenizer submodel")
79+
text_encoder: ModelIdentifierField = Field(description="Info to load text_encoder submodel")
80+
81+
7582
class Qwen3EncoderField(BaseModel):
7683
"""Field for Qwen3 text encoder used by Z-Image models."""
7784

invokeai/app/invocations/primitives.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
InputField,
2626
LatentsField,
2727
OutputField,
28+
QwenImageConditioningField,
2829
SD3ConditioningField,
2930
TensorField,
3031
UIComponent,
@@ -474,6 +475,17 @@ def build(cls, conditioning_name: str) -> "ZImageConditioningOutput":
474475
return cls(conditioning=ZImageConditioningField(conditioning_name=conditioning_name))
475476

476477

478+
@invocation_output("qwen_image_conditioning_output")
479+
class QwenImageConditioningOutput(BaseInvocationOutput):
480+
"""Base class for nodes that output a Qwen Image Edit conditioning tensor."""
481+
482+
conditioning: QwenImageConditioningField = OutputField(description=FieldDescriptions.cond)
483+
484+
@classmethod
485+
def build(cls, conditioning_name: str) -> "QwenImageConditioningOutput":
486+
return cls(conditioning=QwenImageConditioningField(conditioning_name=conditioning_name))
487+
488+
477489
@invocation_output("anima_conditioning_output")
478490
class AnimaConditioningOutput(BaseInvocationOutput):
479491
"""Base class for nodes that output an Anima text conditioning tensor."""

0 commit comments

Comments
 (0)