А АTuesday, 17 June 2025

Dynamic Prompts и шаблоны Jinja2.

Всем привет.

Вы заметили что в расширении «Dynamic Prompts» есть интересное подменю «Jinja2 templates»?

Jinja2 - это движок шаблонов, который позволяет использовать синтаксис в стиле Python в шаблонах. Эта возможность особенно полезна для подсказок Stable Diffusion, поскольку она позволяет создавать один запрос, который генерирует несколько запросов, генерировать рандомизированные элементы внутри запросов, итерировать по элементам, использовать подстановочные знаки и многое другое. Jinja2 может эмулировать результаты, для получения которых обычно требуются сложные скрипты Python.

Чтобы включить шаблоны Jinja2:

1. Установите Dynamic Prompts через браузер расширений.

2. Перезапустите Web UI.

3. Прокрутите вниз до скриптов и разверните аккордеон dynamic prompt.

4. Разверните аккордеон Jinja2 и включите его.


Jinja2 предлагает различные структуры управления, включая циклы и условные операторы, а также фильтры, тесты и макросы, которые позволяют создавать мощные и гибкие шаблоны. Хотя эти функции на первый взгляд могут показаться сложными, их возможности впечатляют.

Операторы Jinja2 начинаются с {% и заканчиваются %} , выражения заключены в {{ }} , а комментарии содержатся в {# #} .

В Stable Diffusion (Automatic1111 или Forge) подсказки определяются с помощью тегов {% prompt %} и {% endprompt %}. Операторы и выражения внутри этих тегов не обязательно должны быть на отдельных строках, но разделены для лучшей читаемости. Эти программные подсказки могут быть длиннее традиционных подсказок, поскольку сгенерированные результаты, как правило, короче.


Примеры:

1) используя choice для выбора случайного элемента 

establishing shot of a sprawling metropolis, {{ choice('rainy', 'overcast', 'sunny', 'cloudy') }}

atmosphere, wide angle

создаст один запрос со случайным погодным условием.


2) используя for цикл для итерации по списку

{% for fg in ['red', 'black', 'blue', 'purple'] %} {% prompt %} intricate symmetrical patterns,

{{ fg }}, (({{ choice('white' ,'grey') }} background)) {% endprompt %} {% endfor %}

создаст четыре запроса, которые генерируют абстрактные узоры, используя случайные цветовые схемы.


Хотя приведенные выше примеры можно воспроизвести с помощью динамических подсказок, следующие будут более сложны:


3) используя randint для генерации случайного числа в диапазоне

{% prompt %} {{ randint(2, 5) }} dogs playing, in-frame, centered {% endprompt %}

создаст один запрос со случайным количеством играющих собак.


4) используя range для итерации по числам

{% for i in range(2,6) %} {% prompt %} ((( {{ i }} small dogs))) playing {% endprompt %} {%

endfor %}

создаст 4 запроса с 2-5 играющими собаками.


5) используйте for цикл для итерации по списку и условного изменения частей запроса

{% for critter in ["hamsters", "guinea pig", "kitten", "puppy"] %} {% if critter == "hamsters"

%} {% prompt %} {{ critter }} in a cage {% endprompt %} {% else %} {% prompt %} {{ critter }}

on a couch {% endprompt %} {% endif %} {% endfor %}

создаст 4 запроса с переменной critter соответствующей правильной среде.


6) используя range и для создания перехода с тремя изменяющимися элементами

{% for i in range(30) %} {% prompt %} a [angry:happy:{{ i/30 }}] large [wolf:dog:{{ i/30 }}],

centered, in the [winter:summer:{{ i/30 }}] {% endprompt %} {% endfor %}

создаст запрос, который создает 30 изображений, где животные постепенно меняются от злых волков к

счастливым собакам, в то время как сезон превращается из зимы в лето. Почти готовый видеоряд.


7) Из Jinja2 можно обращаться напрямую к wildcards. Вот как переключаться между разными цветами в каждой генерации:

{% set colour = wildcard("__jumbo/aesthetics/colours__")|random %}

{% prompt %}

букет {{ colour }} роз

{% endprompt %}

Если сгенерировать 1 изображение, оно будет одного цвета. Если сгенерировать 3 изображения, каждое изображение будет своего цвета.


8) Если хочешь добавлять теги к своему промту только для определенных соотношений сторон, то добавь следующее:

{% prompt %}

{% if image.height / image.width >= 1.33 %} portrait, {% endif %}

ТВОЙ ПРОМТ ЗДЕСЬ

{% endprompt %}

Это оказалось очень удобным, потому что я люблю пробовать разные разрешения и часто забываю убирать теги типа тег "portrait" после перехода от вертикальных к горизонтальным разрешениям или добавлять их обратно при переходе обратно. 


9) Кроме того, ты можешь использовать ту же условную логику в сочетании с переменными окружения, чтобы автоматизировать свой промт еще больше. Например, добавление определенных тегов в зависимости от имени чекпоинта:

{% prompt %}

{% if model.model_name in ["realistic_cp_1", "realistic_cp_2"] %}

extremely realistic,

{% endif %}

{% if model.model_name in ["anime_cp_1", "anime_cp_2", "anime_cp_3"] %}

2d, anime,

{% endif %}

ТВОЙ ПРОМТ ЗДЕСЬ

{% endprompt %}

Это можно применить и к негативным промтам:

{% prompt %}

{% if "solo" in prompt.prompt %}

2girls, multiple girls, 2boys, multiple boys, multiple persons

{% endif %}

ТВОЙ НЕГАТИВНЫЙ ПРОМТ ЗДЕСЬ

{% endprompt %}


Наконец, важно отметить, что в настоящее время Dynamic Prompts не сохраняет исходный шаблон Jinja2, поэтому рекомендуется сохранять его вручную.

В качестве бонуса - автор одного из коментариев к посту отправился в путешествие по ночным рынкам мира с таким пропмтом:

{% for Kid in ['girl','boy'] %} {% for City in ['Taoyuan','Taichung','Keelung','Lahore','Beijing','Bangkok','Chiang

Mai','Phuket','Hat Yai','Kuala Lumpur','Taipei','Singapore','Hanoi','Nha Trang','Ha Long','Hoi An','Phu

Quoc','Seoul','New Delhi','Hong Kong','Luang Prabang','Marrakech','Zanzibar','Goa','Jakarta','Manila','Port

Moresby','Dili','Phnom Penh','HaiPhong','Macao','Busan','Rajasthan','Mandalay','Dacca','Kolkata', 'Kathmandu','New Delhi','Agra','Jaipur','Beijing','Tianjin','Guangzhou','Chengdu','Dongguan','Mumbai','Karachi', 'Mogadishu','Nairobi','Cape Town','Freetown','Dakar','Rabat','Alger', 'Tripoli','Cairo','Haifa','Damasc', 'Izmir','Amman', 'Medellin','Bogotá','Caracas','Lima','Montevideo','São Paulo','Rio de Janeiro','Georgetown', 'Palermo','Napoli'] %}  {% prompt %}High detail RAW color digital photograph outside portrait of one lone (happy:1.2) young {{Kid}} from {{City}} in a crowded market at (night:1.6), desaturated colors, nice bokeh, (((natural skin texture))), clothed, warm lights{% endprompt %} {% endfor %} {% endfor %}

 Надеюсь, такое разнообразие будет вам полезно. 


No comments:

Post a Comment

А что вы думаете по этому поводу?

Версия на печать

Популярное