diff --git a/cli/src/main.rs b/cli/src/main.rs index ca067e2..550fe9c 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -9,11 +9,11 @@ use diffusion_rs::{ UCacheParamsBuilder, gen_img, }, preset::{ - AnimaWeight, ChromaRadianceWeight, ChromaWeight, DiffInstructStarWeight, Flux1MiniWeight, - Flux1Weight, Flux2Klein4BWeight, Flux2Klein9BWeight, Flux2KleinBase4BWeight, - Flux2KleinBase9BWeight, Flux2Weight, NitroSDRealismWeight, NitroSDVibrantWeight, - OvisImageWeight, Preset, PresetBuilder, PresetDiscriminants, QwenImageWeight, SSD1BWeight, - TwinFlowZImageTurboExpWeight, WeightType, ZImageTurboWeight, + Anima2Weight, AnimaWeight, ChromaRadianceWeight, ChromaWeight, DiffInstructStarWeight, + Flux1MiniWeight, Flux1Weight, Flux2Klein4BWeight, Flux2Klein9BWeight, + Flux2KleinBase4BWeight, Flux2KleinBase9BWeight, Flux2Weight, NitroSDRealismWeight, + NitroSDVibrantWeight, OvisImageWeight, Preset, PresetBuilder, PresetDiscriminants, + QwenImageWeight, SSD1BWeight, TwinFlowZImageTurboExpWeight, WeightType, ZImageTurboWeight, }, util::set_hf_token, }; @@ -338,6 +338,12 @@ fn get_preset(args: &Args) -> Preset { .try_into() .unwrap(), ), + PresetDiscriminants::Anima2 => Preset::Anima2( + args.weights + .unwrap_or_else(|| Anima2Weight::default().into()) + .try_into() + .unwrap(), + ), }; preset } diff --git a/src/preset.rs b/src/preset.rs index 6daabb2..92c2c17 100644 --- a/src/preset.rs +++ b/src/preset.rs @@ -6,8 +6,8 @@ use subenum::subenum; use crate::{ api::{Config, ConfigBuilder, ConfigBuilderError, ModelConfig, ModelConfigBuilder}, preset_builder::{ - anima, chroma, chroma_radiance, diff_instruct_star, dream_shaper_xl_2_1_turbo, flux_1_dev, - flux_1_mini, flux_1_schnell, flux_2_dev, flux_2_klein_4b, flux_2_klein_9b, + anima, anima2, chroma, chroma_radiance, diff_instruct_star, dream_shaper_xl_2_1_turbo, + flux_1_dev, flux_1_mini, flux_1_schnell, flux_2_dev, flux_2_klein_4b, flux_2_klein_9b, flux_2_klein_base_4b, flux_2_klein_base_9b, juggernaut_xl_11, nitro_sd_realism, nitro_sd_vibrant, ovis_image, qwen_image, sd_turbo, sdxl_base_1_0, sdxl_turbo_1_0, sdxs512_dream_shaper, segmind_vega, ssd_1b, stable_diffusion_1_4, stable_diffusion_1_5, @@ -37,7 +37,8 @@ use crate::{ Flux2KleinBase4BWeight(derive(Default)), Flux2Klein9BWeight(derive(Default)), Flux2KleinBase9BWeight(derive(Default)), - AnimaWeight(derive(Default)) + AnimaWeight(derive(Default)), + Anima2Weight(derive(Default)) )] #[derive(Debug, Clone, Copy, EnumString, VariantNames)] #[strum(ascii_case_insensitive)] @@ -101,7 +102,8 @@ pub enum WeightType { Flux2Klein4BWeight(default), Flux2KleinBase4BWeight(default), Flux2Klein9BWeight, - AnimaWeight(default) + AnimaWeight(default), + Anima2Weight(default) )] Q8_0, Q8_1, @@ -134,10 +136,17 @@ pub enum WeightType { ZImageTurboWeight(default), Flux2Weight, QwenImageWeight, - AnimaWeight + AnimaWeight, + Anima2Weight )] Q4_K, - #[subenum(Flux1MiniWeight, Flux2Weight, QwenImageWeight, AnimaWeight)] + #[subenum( + Flux1MiniWeight, + Flux2Weight, + QwenImageWeight, + AnimaWeight, + Anima2Weight + )] Q5_K, #[subenum( Flux1MiniWeight, @@ -148,7 +157,8 @@ pub enum WeightType { ZImageTurboWeight, QwenImageWeight, TwinFlowZImageTurboExpWeight, - AnimaWeight + AnimaWeight, + Anima2Weight )] Q6_K, Q8_K, @@ -179,7 +189,8 @@ pub enum WeightType { Flux2KleinBase4BWeight, Flux2Klein9BWeight, Flux2KleinBase9BWeight, - AnimaWeight + AnimaWeight, + Anima2Weight )] BF16, TQ1_0, @@ -277,6 +288,8 @@ pub enum Preset { SegmindVega, /// cfg__scale 4.0. 30 steps 1024x1024. Vae tiling enabled Anima(AnimaWeight), + /// cfg__scale 4.0. 30 steps 1024x1024. Vae tiling enabled + Anima2(Anima2Weight), } impl Preset { @@ -315,6 +328,7 @@ impl Preset { Preset::Flux2KleinBase9B(sd_type_t) => flux_2_klein_base_9b(sd_type_t), Preset::SegmindVega => segmind_vega(), Preset::Anima(sd_type_t) => anima(sd_type_t), + Preset::Anima2(sd_type_t) => anima2(sd_type_t), } } } @@ -623,4 +637,10 @@ mod tests { fn test_anima() { run(Preset::Anima(super::AnimaWeight::Q8_0)); } + + #[ignore] + #[test] + fn test_anima2() { + run(Preset::Anima2(super::Anima2Weight::Q8_0)); + } } diff --git a/src/preset_builder.rs b/src/preset_builder.rs index 230dcf5..30875cf 100644 --- a/src/preset_builder.rs +++ b/src/preset_builder.rs @@ -7,10 +7,10 @@ use crate::{ t5xxl_q4_k_flux_1, t5xxl_q8_0_flux_1, }, preset::{ - AnimaWeight, ChromaRadianceWeight, ChromaWeight, ConfigsBuilder, DiffInstructStarWeight, - Flux1MiniWeight, Flux1Weight, Flux2Klein4BWeight, Flux2Klein9BWeight, - Flux2KleinBase4BWeight, Flux2KleinBase9BWeight, Flux2Weight, NitroSDRealismWeight, - NitroSDVibrantWeight, OvisImageWeight, QwenImageWeight, SSD1BWeight, + Anima2Weight, AnimaWeight, ChromaRadianceWeight, ChromaWeight, ConfigsBuilder, + DiffInstructStarWeight, Flux1MiniWeight, Flux1Weight, Flux2Klein4BWeight, + Flux2Klein9BWeight, Flux2KleinBase4BWeight, Flux2KleinBase9BWeight, Flux2Weight, + NitroSDRealismWeight, NitroSDVibrantWeight, OvisImageWeight, QwenImageWeight, SSD1BWeight, TwinFlowZImageTurboExpWeight, ZImageTurboWeight, }, }; @@ -1262,3 +1262,68 @@ fn anima_weight(sd_type: AnimaWeight) -> Result<(PathBuf, PathBuf), ApiError> { let llm_path = download_file_hf_hub(llm.0, llm.1)?; Ok((model_path, llm_path)) } + +pub fn anima2(sd_type: Anima2Weight) -> Result { + let (model, llm) = anima2_weight(sd_type)?; + let vae = download_file_hf_hub( + "circlestone-labs/Anima", + "split_files/vae/qwen_image_vae.safetensors", + )?; + let mut config = ConfigBuilder::default(); + let mut model_config = ModelConfigBuilder::default(); + + model_config + .diffusion_model(model) + .llm(llm) + .vae(vae) + .vae_tiling(true); + config.cfg_scale(4.).steps(30).height(1024).width(1024); + + Ok((config, model_config)) +} + +fn anima2_weight(sd_type: Anima2Weight) -> Result<(PathBuf, PathBuf), ApiError> { + let (model, llm) = match sd_type { + Anima2Weight::Q4_K => ( + ("Bedovyy/Anima-GGUF", "anima-preview2-Q4_K_M.gguf"), + ( + "mradermacher/Qwen3-0.6B-Base-GGUF", + "Qwen3-0.6B-Base.Q4_K_M.gguf", + ), + ), + Anima2Weight::Q5_K => ( + ("Bedovyy/Anima-GGUF", "anima-preview2-Q5_K_M.gguf"), + ( + "mradermacher/Qwen3-0.6B-Base-GGUF", + "Qwen3-0.6B-Base.Q5_K_M.gguf", + ), + ), + Anima2Weight::Q6_K => ( + ("Bedovyy/Anima-GGUF", "anima-preview2-Q6_K.gguf"), + ( + "mradermacher/Qwen3-0.6B-Base-GGUF", + "Qwen3-0.6B-Base.Q6_K.gguf", + ), + ), + Anima2Weight::BF16 => ( + ( + "circlestone-labs/Anima", + "split_files/diffusion_models/anima-preview2.safetensors", + ), + ( + "circlestone-labs/Anima", + "split_files/text_encoders/qwen_3_06b_base.safetensors", + ), + ), + Anima2Weight::Q8_0 => ( + ("Bedovyy/Anima-GGUF", "anima-preview2-Q8_0.gguf"), + ( + "mradermacher/Qwen3-0.6B-Base-GGUF", + "Qwen3-0.6B-Base.Q8_0.gguf", + ), + ), + }; + let model_path = download_file_hf_hub(model.0, model.1)?; + let llm_path = download_file_hf_hub(llm.0, llm.1)?; + Ok((model_path, llm_path)) +}