# Фаза 60. Модели портретов ## Зависимости Нет. Портреты и `swarmui.json` уже живут вне среза. ## Зачем Пикер показывает только модели из нашего каталога, которые есть в Swarm. Дефолты генерации на модели; пресет даёт стиль и тип кадра и может переопределить дефолты под спойлером. Промпт собирается слоями. ## Задачи - [x] `swarmui.json`: каталог `models` на все четыре модели из текущего Swarm; пресеты ссылаются на модель, `style` вместо бывшего base `positive`, `shotType` на виде кадра - [x] Пикер = Swarm ∩ каталог; Swarm офлайн — id из каталога. Чего нет в конфиге, с пикера нет - [x] Сборка промпта: модель → стиль → кадр → свой промпт → пустая поза → внешность (кто, возраст, тело) → одежда. Custom **не** заменяет тип кадра. Negative: модель + доп. пресета - [x] UI диалога пресетов (создание школы): стиль и кадр сверху; дефолты модели видны; оверрайды пресета под `
`. Строки через `t(...)` - [x] Живой сейв поднимается в `NormalizeAfterLoad`. HTTP `GET`/`PUT /api/settings/swarmui` и `portraitSettings` — новая форма. Сокет не бампить. [`protocol.md`](../../protocol.md) тем же коммитом ## Тесты, без которых фаза не закрыта - [x] Лифт старого пресета: `positive` → `style`, kind `positive` → `shotType`, модель в `models` - [x] Resolve без оверрайда берёт steps/cfg с модели; с оверрайдом — с пресета - [x] Пикер: пересечение Swarm ∩ каталог; офлайн — каталог; лишняя модель Swarm отброшена - [x] Промпт: порядок слоёв; custom держит тип кадра и `promptExtra`; пустая поза не попадает в текст - [x] `GET /api/settings/swarmui` отдаёт `models`; create копирует их в сейв - [x] Диалог: поле стиля, спойлер оверрайдов, в селекте модели нет id вне каталога при живом Swarm ## Критерий готовности - В диалоге создания школы в пикере только модели из `swarmui.json`, которые ответил Swarm - Смена модели подставляет её дефолты; пресет может перебить их под спойлером - «Показать промпт» на карточке: стиль, затем кадр, затем тело и одежда; свой промпт после кадра - Старая школа открывается и генерирует без ручного правок сейва ## Стоп Не бампить сокет. Не зеркалить все параметры Swarm. Не возвращать кнопку настроек в меню. Не перегенерировать PNG. Не писать позу в UI.