Add scene fragments to portrait prompts after clothing.

Thing, room, yard and climate precipitation can contribute a short prompt when they are in frame, with a budget so chairs stay silent.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Leonid Pershin
2026-08-20 23:35:17 +03:00
co-authored by Cursor
parent f046f145ec
commit 3c682a2b74
26 changed files with 1020 additions and 26 deletions
@@ -13,7 +13,8 @@ internal static class PortraitPromptBuilder
PersonCardResponse card,
SwarmUiResolvedProfile profile,
PortraitKind kind,
string? promptExtra = null)
string? promptExtra = null,
PortraitScene? scene = null)
{
var parts = new List<string>();
Add(parts, profile.ModelPositive);
@@ -29,16 +30,36 @@ internal static class PortraitPromptBuilder
Add(parts, DescribeAppearance(card));
Add(parts, DescribeClothing(card));
scene ??= PortraitScene.Empty;
foreach (var fragment in scene.PositiveFragments)
{
Add(parts, fragment);
}
var positive = SwarmUiLoraFormatter.AppendEmbedTags(
string.Join(", ", parts),
profile.PositiveEmbeddings);
SwarmUiLoraFormatter.Concat(profile.PositiveEmbeddings, scene.PositiveEmbeddings));
var negativeParts = new List<string>();
Add(negativeParts, profile.Negative);
foreach (var fragment in scene.NegativeFragments)
{
Add(negativeParts, fragment);
}
var negative = SwarmUiLoraFormatter.AppendEmbedTags(
profile.Negative.Trim(),
profile.NegativeEmbeddings);
string.Join(", ", negativeParts),
SwarmUiLoraFormatter.Concat(profile.NegativeEmbeddings, scene.NegativeEmbeddings));
return (positive, negative);
}
public static SwarmUiResolvedProfile ApplyScene(SwarmUiResolvedProfile profile, PortraitScene scene) =>
profile with
{
PositiveLoras = SwarmUiLoraFormatter.Concat(profile.PositiveLoras, scene.PositiveLoras),
NegativeLoras = SwarmUiLoraFormatter.Concat(profile.NegativeLoras, scene.NegativeLoras),
};
private static void Add(List<string> parts, string? value)
{
if (string.IsNullOrWhiteSpace(value))