Split SwarmUI portraits into a model catalog and layered prompts.

Picker is Swarm intersect config, preset style/shot inherit model defaults, and living saves lift the old preset shape.
This commit is contained in:
Leonid Pershin
2026-08-20 14:08:11 +03:00
parent cc9ea18480
commit 81fd3f6181
20 changed files with 1142 additions and 179 deletions
@@ -11,32 +11,23 @@ internal static class PortraitPromptBuilder
PortraitKind kind,
string? promptExtra = null)
{
var kindPreset = profile.KindPreset;
var parts = new List<string>();
if (!string.IsNullOrWhiteSpace(profile.Positive))
{
parts.Add(profile.Positive.Trim());
}
Add(parts, profile.ModelPositive);
Add(parts, profile.Style);
Add(parts, profile.ShotType);
if (kind == PortraitKind.Custom)
{
if (!string.IsNullOrWhiteSpace(promptExtra))
{
parts.Add(promptExtra.Trim());
}
}
else if (!string.IsNullOrWhiteSpace(kindPreset.Positive))
{
parts.Add(kindPreset.Positive.Trim());
Add(parts, promptExtra);
}
parts.Add(DescribeSubject(card));
Add(parts, profile.Pose);
Add(parts, DescribeSubject(card));
parts.Add($"age {card.Age}");
foreach (var row in card.Body)
{
parts.Add($"{row.Label.ToLowerInvariant()} {row.Value.ToLowerInvariant()}");
Add(parts, $"{row.Label.ToLowerInvariant()} {row.Value.ToLowerInvariant()}");
}
foreach (var item in PortraitVisibleWorn.Filter(card.Worn))
@@ -44,15 +35,15 @@ internal static class PortraitPromptBuilder
var color = item.ColorLabel ?? item.Color;
if (!string.IsNullOrWhiteSpace(color))
{
parts.Add($"wearing {item.Label.ToLowerInvariant()} in {color.ToLowerInvariant()}");
Add(parts, $"wearing {item.Label.ToLowerInvariant()} in {color.ToLowerInvariant()}");
}
else
{
parts.Add($"wearing {item.Label.ToLowerInvariant()}");
Add(parts, $"wearing {item.Label.ToLowerInvariant()}");
}
}
var positive = string.Join(", ", parts.Where(part => part.Length > 0));
var positive = string.Join(", ", parts);
var negative = SwarmUiLoraFormatter.AppendLoraTags(
profile.Negative.Trim(),
profile.NegativeLoras);
@@ -60,6 +51,16 @@ internal static class PortraitPromptBuilder
return (positive, negative);
}
private static void Add(List<string> parts, string? value)
{
if (string.IsNullOrWhiteSpace(value))
{
return;
}
parts.Add(value.Trim());
}
private static string DescribeSubject(PersonCardResponse card)
{
if (card.Age <= 11)