Implement custom portrait generation: update API, UI, and localization to support user-defined prompts for portraits, replacing half-body option with custom variant.
ci / server (push) Failing after 3m38s
ci / client (push) Failing after 14s

This commit is contained in:
Leonid Pershin
2026-08-20 05:16:40 +03:00
parent df0aaad403
commit ac0470bbc4
19 changed files with 301 additions and 76 deletions
@@ -107,7 +107,12 @@ public class PortraitApiTests(AppHostFixture fixture)
private sealed record PersonListItem(string Id);
private sealed record PersonCardResponse(string Id, bool HasAvatar, bool HasHalfBody, bool HasFullBody);
private sealed record PersonCardResponse(
string Id,
bool HasAvatar,
bool HasCustom,
bool HasFullBody,
string? CustomPortraitPrompt);
private sealed record SavesDirectoryResponse(string Path);
}
@@ -43,19 +43,26 @@ public class PortraitPromptBuilderTests
}
[Fact]
public void Build_HalfBody_AddsHalfBodyPreset()
public void Build_Custom_UsesPromptExtraInsteadOfPreset()
{
var settings = new SwarmUiSettings
{
Positive = "School photo.",
HalfBody = new SwarmUiSettings.SwarmUiPreset { Positive = "Waist-up portrait." },
Avatar = new SwarmUiSettings.SwarmUiPreset { Positive = "Head and shoulders." },
FullBody = new SwarmUiSettings.SwarmUiPreset { Positive = "Standing full body." },
};
var (halfPositive, _) = PortraitPromptBuilder.Build(SampleCard(), settings, PortraitKind.Half);
const string extra = "standing in a school hallway, soft window light";
var (customPositive, _) = PortraitPromptBuilder.Build(
SampleCard(),
settings,
PortraitKind.Custom,
extra);
Assert.Contains("Waist-up portrait.", halfPositive, StringComparison.Ordinal);
Assert.DoesNotContain("Standing full body.", halfPositive, StringComparison.Ordinal);
Assert.Contains("School photo.", customPositive, StringComparison.Ordinal);
Assert.Contains(extra, customPositive, StringComparison.Ordinal);
Assert.DoesNotContain("Head and shoulders.", customPositive, StringComparison.Ordinal);
Assert.DoesNotContain("Standing full body.", customPositive, StringComparison.Ordinal);
}
private static PersonCardResponse SampleCard() =>