Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 75 additions & 0 deletions xinference/model/image/model_spec.json
Original file line number Diff line number Diff line change
Expand Up @@ -1543,6 +1543,81 @@
"featured": true,
"updated_at": 1769418379
},
{
"version": 2,
"model_name": "FireRed-Image-Edit-1.1",
"model_family": "stable_diffusion",
"model_ability": [
"image2image"
],
"model_src": {
"huggingface": {
"model_id": "FireRedTeam/FireRed-Image-Edit-1.1",
"model_revision": "main",
"gguf_model_id": "vantagewithai/FireRed-Image-Edit-1.1-GGUF",
"gguf_quantizations": [
"Q3_K_M",
"Q3_K_S",
"Q4_0",
"Q4_1",
"Q4_K_M",
"Q4_K_S",
"Q5_0",
"Q5_1",
"Q5_K_M",
"Q5_K_S",
"Q6_K",
"Q8_0"
],
"gguf_model_file_name_template": "FireRed-Image-Edit-1.1-{quantization}.gguf"
},
"modelscope": {
"model_id": "FireRedTeam/FireRed-Image-Edit-1.1",
"model_revision": "master",
"gguf_model_id": "vantagewithai/FireRed-Image-Edit-1.1-GGUF",
"gguf_quantizations": [
"Q3_K_M",
"Q3_K_S",
"Q4_0",
"Q4_1",
"Q4_K_M",
"Q4_K_S",
"Q5_0",
"Q5_1",
"Q5_K_M",
"Q5_K_S",
"Q6_K",
"Q8_0"
],
"gguf_model_file_name_template": "FireRed-Image-Edit-1.1-{quantization}.gguf"
}
},
"default_model_config": {
"quantize": true,
"quantize_text_encoder": "text_encoder",
"torch_dtype": "bfloat16"
},
"default_generate_config": {
"negative_prompt": " ",
"num_inference_steps": 40,
"true_cfg_scale": 4
},
"virtualenv": {
"packages": [
"diffusers>=0.36.0 ; #engine# == \"diffusers\"",
"transformers>=4.51.3,<5 ; #engine# == \"diffusers\"",
"accelerate>=0.31.0 ; #engine# == \"diffusers\"",
"bitsandbytes>=0.48.0 ; #engine# == \"diffusers\" and sys_platform == \"linux\"",
"gguf>=0.10.0 ; #engine# == \"diffusers\"",
"peft>=0.17.0 ; #engine# == \"diffusers\"",
"#system_torch#",
"#system_numpy#"
],
"no_build_isolation": true
},
"featured": true,
"updated_at": 1786461664
},
{
"version": 2,
"model_name": "Qwen-Image-2512",
Expand Down
28 changes: 26 additions & 2 deletions xinference/model/image/stable_diffusion/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -329,9 +329,9 @@ def load(self):
self._model = FluxKontextPipeline.from_pretrained(
self._model_path, **self._kwargs
)
elif "qwen" in model_name_lower:
elif "qwen" in model_name_lower or "firered" in model_name_lower:
# TODO: remove this branch when auto pipeline supports
# Qwen-Image
# Qwen-Image and models based on its editing pipeline
from diffusers import DiffusionPipeline

self._model = DiffusionPipeline.from_pretrained(
Expand Down Expand Up @@ -940,6 +940,12 @@ def image_to_image(
response_format: str = "url",
**kwargs,
):
generate_kwargs = (
self._model_spec.default_generate_config or {} # type: ignore
).copy()
generate_kwargs.update({k: v for k, v in kwargs.items() if v is not None})
kwargs = generate_kwargs

if self._kwargs.get("controlnet") or self._model_spec.model_ability == [ # type: ignore
"image2image"
]:
Expand All @@ -950,6 +956,24 @@ def image_to_image(
raise RuntimeError(f"{self._model_uid} does not support image2image")
model = self._get_model(ability)

# QwenImageEditPlusPipeline consumes all reference images through its
# ``image`` argument. The OpenAI-compatible endpoint exposes the first
# upload as ``image`` and the remaining uploads as ``reference_images``;
# combine them here instead of letting the latter be filtered out as an
# unsupported pipeline keyword.
if (
kwargs.get("reference_images")
and type(model).__name__ == "QwenImageEditPlusPipeline"
):
reference_images = kwargs.pop("reference_images")
primary_images = image if isinstance(image, list) else [image]
reference_images = (
reference_images
if isinstance(reference_images, list)
else [reference_images]
)
image = primary_images + reference_images

if padding_image_to_multiple := kwargs.pop("padding_image_to_multiple", None):
# Model like SD3 image to image requires image's height and width is times of 16
# padding the image if specified
Expand Down
Loading