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
+43
View File
@@ -0,0 +1,43 @@
Часть [Вне очереди](README.md). Соседей по папке не читать, если задача не про них.
# Модели Swarm и слои промпта
### Зачем
Пикер моделей не должен предлагать то, чего нет в нашем конфиге. Дефолты генерации живут
на модели; пресет задаёт стиль и тип кадра и может переопределить дефолты. Промпт собирается
слоями, а не одним «базовым» текстом пресета.
### Было / Стало / Почему
**Было.** Пресет сам держал модель, steps/cfg/sampler и `positive`. Список Swarm только
наполнял комбобоксы. «Свой промпт» у custom **заменял** текст кадра. `portraitSettings` в
сейве — копия этого файла.
**Стало.** В конфиге каталог `models` (whitelist) и пресеты. Пикер = Swarm ∩ каталог; при
офлайне Swarm — все id из каталога. У модели: закрытый набор настроек генерации (steps, cfg,
clip skip, sampler, scheduler, seed, LoRA) и обычно пустые base positive/negative. У пресета:
модель, **стиль** (бывший `positive`), доп. negative, размеры и **тип кадра** на avatar/custom/full.
Оверрайды генерации у пресета — nullable, в UI под спойлером. Промпт:
1. base positive модели
2. стиль пресета
3. тип кадра
4. «Свой промпт» (`promptExtra`, только custom; после кадра, не вместо)
5. поза (слот пустой, без поля в UI)
6. внешность: кто это, возраст, тело
7. одежда
8. хвост пустой
Negative: модель + необязательное дополнение пресета. Ширина/высота остаются на виде кадра.
**Почему.** Модель задаёт «как считать картинку»; пресет — «какой это школьный снимок».
Гость по-прежнему рисует с копии школы, не с глобального файла.
### Что не входит
Зеркало всех `ListT2IParams`. Кнопка настроек в меню. Редактор каталога «добавить модель из
Swarm». Поза в UI. Бамп версии сокета. Перегенерация уже лежащих PNG.
Живые школы: `NormalizeAfterLoad` поднимает старый пресет (`positive``style`, kind
`positive``shotType`, уникальные `model``models[]`). Старые картинки не трогаем.