Merge branch 'phase/63-krea-only'

# Conflicts:
#	docs/phases/11-events/README.md
This commit is contained in:
Leonid Pershin
2026-08-21 01:04:49 +03:00
7 changed files with 147 additions and 101 deletions
@@ -105,8 +105,14 @@ public class PortraitApiTests(AppHostFixture fixture)
Assert.NotNull(settings);
Assert.NotEmpty(settings!.Presets);
Assert.NotEmpty(settings.Models);
Assert.Contains(settings.Models, model => model.Id == "museByStableYogi_v30TurboGguf.gguf");
Assert.Contains(settings.Models, model => model.Id == "realismByStableYogi_v25INT8Turbo.safetensors");
var ids = settings.Models.Select(model => model.Id).ToList();
Assert.Equal(
["museByStableYogi_v30TurboGguf.gguf", "realismByStableYogi_v25INT8Turbo.safetensors"],
ids);
Assert.DoesNotContain("babesByStableYogi_v4XLLightning.safetensors", ids);
Assert.DoesNotContain("DreamShaper_XL_-_Lightning_DPM++_SDE.safetensors", ids);
Assert.DoesNotContain("epicrealismXL_VXIAbeast4SLightning.safetensors", ids);
Assert.DoesNotContain("lustifyNSFWCheckpoint_v40DMD2.safetensors", ids);
Assert.False(string.IsNullOrWhiteSpace(settings.ActivePresetId));
}
@@ -127,13 +133,21 @@ public class PortraitApiTests(AppHostFixture fixture)
Assert.True(presets.TryGetProperty("models", out var models));
Assert.True(models.GetArrayLength() > 0);
var ids = models.EnumerateArray().Select(model => model.GetProperty("id").GetString()).ToList();
Assert.Contains("museByStableYogi_v30TurboGguf.gguf", ids);
Assert.Contains("realismByStableYogi_v25INT8Turbo.safetensors", ids);
Assert.Equal(
["museByStableYogi_v30TurboGguf.gguf", "realismByStableYogi_v25INT8Turbo.safetensors"],
ids);
Assert.DoesNotContain("babesByStableYogi_v4XLLightning.safetensors", ids);
Assert.DoesNotContain("DreamShaper_XL_-_Lightning_DPM++_SDE.safetensors", ids);
var defaultPreset = presets.GetProperty("presets").EnumerateArray()
.First(preset => preset.GetProperty("id").GetString() == "default");
Assert.Equal(
"realismByStableYogi_v25INT8Turbo.safetensors",
defaultPreset.GetProperty("model").GetString());
var childPreset = presets.GetProperty("presets").EnumerateArray()
.First(preset => preset.GetProperty("id").GetString() == "child");
Assert.Equal(
"realismByStableYogi_v25INT8Turbo.safetensors",
childPreset.GetProperty("model").GetString());
}
[Fact]
@@ -12,9 +12,11 @@ public class SwarmUiSettingsStoreTests
var profile = config.Resolve(8, PortraitKind.Avatar);
Assert.Equal("child", profile.PresetId);
Assert.Equal(SwarmUiModelDefinition.DreamShaperId, profile.Model);
Assert.Equal(4, profile.Steps);
Assert.Equal(2, profile.CfgScale);
Assert.Equal(SwarmUiModelDefinition.RealismV25Id, profile.Model);
Assert.Equal(8, profile.Steps);
Assert.Equal(1, profile.CfgScale);
Assert.Equal("euler", profile.Sampler);
Assert.Equal("simple", profile.Scheduler);
}
[Fact]
@@ -157,8 +159,8 @@ public class SwarmUiSettingsStoreTests
true,
[
SwarmUiModelDefinition.BabesId,
SwarmUiModelDefinition.MuseId,
"not-in-config.safetensors",
SwarmUiModelDefinition.EpicRealismId,
],
[],
[],
@@ -167,10 +169,9 @@ public class SwarmUiSettingsStoreTests
var allowed = config.AllowedModelIds(discovery);
Assert.Equal(
[SwarmUiModelDefinition.BabesId, SwarmUiModelDefinition.EpicRealismId],
allowed);
Assert.Equal([SwarmUiModelDefinition.MuseId], allowed);
Assert.DoesNotContain("not-in-config.safetensors", allowed);
Assert.DoesNotContain(SwarmUiModelDefinition.BabesId, allowed);
Assert.DoesNotContain(SwarmUiModelDefinition.DreamShaperId, allowed);
}
@@ -204,12 +205,13 @@ public class SwarmUiSettingsStoreTests
var config = SwarmUiConfigFile.CreateDefault();
var ids = config.Models.Select(model => model.Id).ToList();
Assert.Contains(SwarmUiModelDefinition.BabesId, ids);
Assert.Contains(SwarmUiModelDefinition.DreamShaperId, ids);
Assert.Contains(SwarmUiModelDefinition.EpicRealismId, ids);
Assert.Contains(SwarmUiModelDefinition.LustifyId, ids);
Assert.Contains(SwarmUiModelDefinition.MuseId, ids);
Assert.Contains(SwarmUiModelDefinition.RealismV25Id, ids);
Assert.Equal(
[SwarmUiModelDefinition.MuseId, SwarmUiModelDefinition.RealismV25Id],
ids);
Assert.DoesNotContain(SwarmUiModelDefinition.BabesId, ids);
Assert.DoesNotContain(SwarmUiModelDefinition.DreamShaperId, ids);
Assert.DoesNotContain(SwarmUiModelDefinition.EpicRealismId, ids);
Assert.DoesNotContain(SwarmUiModelDefinition.LustifyId, ids);
Assert.DoesNotContain("realismByStableYogi_v20TurboGGUF.gguf", ids);
var realism = Assert.Single(config.Models, model => model.Id == SwarmUiModelDefinition.RealismV25Id);
@@ -230,7 +232,24 @@ public class SwarmUiSettingsStoreTests
Assert.Contains("photograph", adult.Style, StringComparison.OrdinalIgnoreCase);
var child = Assert.Single(config.Presets, preset => preset.Id == "child");
Assert.Equal(SwarmUiModelDefinition.DreamShaperId, child.Model);
Assert.Equal(SwarmUiModelDefinition.RealismV25Id, child.Model);
}
[Fact]
public void CreateChild_StyleAndNegativeAreProseWithoutSdWeights()
{
var child = SwarmUiPresetDefinition.CreateChild();
Assert.NotNull(child.Avatar);
Assert.NotNull(child.FullBody);
Assert.DoesNotContain("(low quality", child.Style, StringComparison.Ordinal);
Assert.DoesNotContain(":1.4)", child.Style, StringComparison.Ordinal);
Assert.DoesNotContain("(low quality", child.Negative, StringComparison.Ordinal);
Assert.DoesNotContain(":1.4)", child.Negative, StringComparison.Ordinal);
Assert.DoesNotContain("(low quality", child.Avatar.ShotType, StringComparison.Ordinal);
Assert.DoesNotContain(":1.4)", child.Avatar.ShotType, StringComparison.Ordinal);
Assert.DoesNotContain("(low quality", child.FullBody.ShotType, StringComparison.Ordinal);
Assert.DoesNotContain(":1.4)", child.FullBody.ShotType, StringComparison.Ordinal);
}
[Fact]
@@ -267,6 +286,72 @@ public class SwarmUiSettingsStoreTests
Assert.Equal(expected.Presets[0].Negative, loaded.Presets[0].Negative);
Assert.Equal(expected.Presets[0].Avatar?.ShotType, loaded.Presets[0].Avatar?.ShotType);
Assert.Equal(expected.Presets[1].Model, loaded.Presets[1].Model);
Assert.Equal(expected.Presets[1].Style, loaded.Presets[1].Style);
Assert.Equal(expected.Presets[1].Negative, loaded.Presets[1].Negative);
}
[Fact]
public void NormalizeAfterLoad_DoesNotRewriteExistingSdxlCatalog()
{
var living = new SwarmUiConfigFile
{
ActivePresetId = "default",
Models =
[
new SwarmUiModelDefinition
{
Id = SwarmUiModelDefinition.BabesId,
Label = "babes",
Steps = 7,
CfgScale = 1.5,
Sampler = "euler",
Scheduler = "normal",
},
new SwarmUiModelDefinition
{
Id = SwarmUiModelDefinition.DreamShaperId,
Label = "DreamShaper",
Steps = 4,
CfgScale = 2,
Sampler = "dpmpp_sde",
Scheduler = "karras",
},
],
Presets =
[
new SwarmUiPresetDefinition
{
Id = "default",
Label = "Default",
Model = SwarmUiModelDefinition.BabesId,
Avatar = new SwarmUiKindPreset { Width = 1024, Height = 1024 },
Custom = new SwarmUiKindPreset { Width = 896, Height = 1152 },
FullBody = new SwarmUiKindPreset { Width = 896, Height = 1152 },
},
new SwarmUiPresetDefinition
{
Id = "child",
Label = "Children",
Model = SwarmUiModelDefinition.DreamShaperId,
Avatar = new SwarmUiKindPreset { Width = 1024, Height = 1024 },
Custom = new SwarmUiKindPreset { Width = 896, Height = 1152 },
FullBody = new SwarmUiKindPreset { Width = 896, Height = 1152 },
},
],
AgeRules = [new SwarmUiAgeRule { MinAge = 6, MaxAge = 11, PresetId = "child" }],
};
living.NormalizeAfterLoad();
Assert.Equal(
[SwarmUiModelDefinition.BabesId, SwarmUiModelDefinition.DreamShaperId],
living.Models.Select(model => model.Id));
Assert.DoesNotContain(living.Models, model => model.Id == SwarmUiModelDefinition.MuseId);
Assert.DoesNotContain(living.Models, model => model.Id == SwarmUiModelDefinition.RealismV25Id);
Assert.Equal(SwarmUiModelDefinition.BabesId, living.Presets[0].Model);
Assert.Equal(SwarmUiModelDefinition.DreamShaperId, living.Presets[1].Model);
Assert.Equal("child", living.Resolve(8, PortraitKind.Avatar).PresetId);
Assert.Equal(SwarmUiModelDefinition.DreamShaperId, living.Resolve(8, PortraitKind.Avatar).Model);
}
[Fact]