Макросы промптов

Макрос – это короткий тег вида {{tag}}, который Marinara при сборке промпта заменяет на текущее значение, например ваше имя или сегодняшнюю дату. В этом руководстве перечислены все встроенные макросы, места, где их можно писать, и типичные ошибки.

Где работают макросы

Собирая текст для отправки ИИ, Marinara подставляет вместо каждого тега {{tag}} его текущее значение. Отдельного переключателя для макросов нет. Любое поле, которое их поддерживает, всегда их раскрывает. Регистр в названиях встроенных макросов не важен: работают и {{user}}, и {{USER}}. Значение макроса может содержать другой макрос, и Marinara раскроет его тоже.

Писать макросы можно в этих местах:

Макросы обрабатываются внутри приложения Marinara, и им не нужны ни настройка, ни ключ API. Две возможности зависят от других частей приложения:

Макросы личности, персонажа и персоны

Эти макросы подставляют имена и поля карточки того, кто пишет, и персонажа, который отвечает. Пользователь – это вы (или ваша активная персона). Персонаж – это бот, который отвечает.

МакросВо что раскрывается
{{user}} / {{userName}}Ваше текущее отображаемое имя (или имя персоны). Если персона не выбрана, подставляется User.
{{userNamePhonetic}}Поле Phonetic name у вашей персоны, а если оно пустое – {{user}}.
{{char}} / {{charName}}Имя текущего персонажа. По умолчанию Character.
{{21-character-card-ID}}Имя другого персонажа. Замените текст шаблона точным 21-символьным ID карточки, чтобы добавить ее в контекст.
{{persona-21-character-card-ID}}Имя другой персоны. Замените текст шаблона после persona- точным 21-символьным ID карточки, чтобы добавить ее в контекст.
{{charNamePhonetic}}Поле Phonetic name у персонажа, а если оно пустое – {{char}}.
{{characters}}Все персонажи чата, включая неактивных, через запятую. Этот макрос добавляет только имена; он не добавляет в промпт карточки неактивных персонажей.
{{group}}Все остальные активные персонажи группового чата, кроме того, кто отвечает сейчас. Персона в этот список персонажей не входит.
{{persona}}Поля Description, Personality, Backstory, Appearance и Scenario вашей персоны, каждое с новой строки.
{{personaDescription}}Поле Description вашей персоны.
{{personaPersonality}}Поле Personality вашей персоны.
{{personaBackstory}}Поле Backstory вашей персоны.
{{personaAppearance}}Поле Appearance вашей персоны.
{{personaScenario}}Поле Scenario вашей персоны.

Макросы полей персонажа читают карточку текущего персонажа:

МакросПоле карточки персонажа
{{description}}Description
{{personality}}Personality
{{backstory}}Backstory
{{appearance}}Appearance
{{scenario}}Scenario
{{example}}Example Dialogue
{{charSysInfo}}System Prompt
{{charPostHistory}}Post-History Instructions

В чате с одним персонажем они берут данные этого персонажа. В групповом чате – по умолчанию данные первого персонажа. Чтобы повторить текст для каждого персонажа, поместите его в групповой блок в квадратных скобках. О групповых блоках см. Условные промпты.

{{group}} следует за персонажем, который отвечает сейчас, в том числе при отдельных генерациях внутри группы. Например, если в группе Roleplay есть Powers That Be, Maukie и Pantalone, а отвечает Pantalone, то {{group}} раскроется в Powers That Be, Maukie. Карточка персонажа остается в этом списке даже тогда, когда ее имя совпадает с {{user}}.

У поля Phonetic name две задачи. Оно задает, как имя произносит синтез речи. Оно же наполняет {{charNamePhonetic}} и {{userNamePhonetic}}. Поле есть и в Character Editor, и в Persona Editor.

Чтобы сослаться на персонажа, которого нет в текущем чате, скопируйте ID его карточки и поместите прямо в двойные фигурные скобки, например {{V1StGXR8_Z5jdHi6B-myT}}. Не добавляйте буквальные символы < и >. Marinara заменяет макрос именем персонажа. В чатах Roleplay с пресетом промпта она также добавляет в системный промпт поля Description, Personality, Appearance, Backstory, Scenario и Example Dialogue этой карточки; в остальных чатах макрос просто заменяется именем. Это работает в сообщениях чата и полях промпта, а в чатах Roleplay с пресетом – еще и в активированных записях лорбука. Начальные приветствия этой карточки не добавляются. Включенные лорбуки, привязанные к этой карточке, по-прежнему подчиняются обычным правилам ключевых слов, режима Constant, фильтров, вероятности и лимита токенов. Если персонаж уже есть в чате, макрос все равно превращается в его имя, а его карточка не добавляется второй раз.

Чтобы сослаться на персону, отличную от активной, добавьте persona- перед ее скопированным ID, например {{persona-P1StGXR8_Z5jdHi6B-myT}}. Marinara заменяет макрос именем персоны и добавляет поля Description, Personality, Appearance, Backstory и Scenario этой карточки в тот же контекст ID Macro Cards. Включенные лорбуки, привязанные к этой персоне, сохраняют обычные правила активации.

Макросы режима Conversation

Эти четыре макроса работают только в режиме Conversation. Во всех остальных режимах они всегда раскрываются в пустоту – даже если один и тот же текст карточки или пресета используется в нескольких режимах.

МакросВо что раскрывается
{{convo_display}}Поле Convo Display Name персонажа, а если оно пустое – имя из карточки.
{{char_about}}Текущее поле About Me персонажа: значение, заданное для конкретного чата, иначе значение из карточки.
{{persona_about}}Текущее поле About Me вашей персоны.
{{convo_behavior}}Текст Convo Behavior персонажа, но только если в настройке вставки выбрано размещение по этому макросу.

Эти поля редактируются на вкладке Convo в панелях Character Editor и Persona Editor. Полная настройка описана в руководстве Профили в режиме Conversation.

Макросы размещения в режиме Conversation

Режим Conversation сам вставляет в промпт несколько блоков. Эти макросы позволяют пресету перенести блок туда, где стоит макрос. Тогда Marinara выводит блок на месте макроса и пропускает его автоматическую вставку, поэтому содержимое никогда не дублируется. У каждого макроса есть один или несколько синонимов, и все они работают одинаково.

Макрос (и синонимы)Что размещает
{{context}}, {{status}}Блок контекста / статуса чата.
{{commands}}, {{commandList}}Напоминание о доступных командах.
{{reactRules}}, {{emojiReact}}Правила реакций своими эмодзи.
{{replyRules}}Правила ответов своими эмодзи и стикерами.
{{memories}}, {{memoryRecall}}Блок Memory Recall.
{{lorebook}}, {{lore}}Вставки из лорбуков.

Всё это действует только в режиме Conversation. Если в чате один персонаж, то ручная расстановка описаний участников через {{char_about}} / {{persona_about}} (см. выше) работает так же: Marinara пропускает свой автоматический блок "about me" об участниках, и описания не вставляются дважды. В групповых чатах автоматический блок участников остается, потому что каждый из этих двух макросов охватывает только одного участника и не должен скрывать описания остальных.

Макросы контекста

Эти макросы описывают текущий чат и текущий запрос.

МакросВо что раскрывается
{{input}}Последнее сообщение пользователя, доступное промпту.
{{model}}Название текущей модели, если модель выбрана.
{{reasoning}}Уровень рассуждений, с которым генерируется этот ответ: low, medium, high, xhigh или max, либо off, если модель не просят думать.
{{chatId}}Идентификатор текущего чата.
{{lastGenerationType}}Метка причины, по которой генерируется этот ответ.
{{idle_duration}}Сколько времени прошло с последней активности в чате, в виде текста 8 minutes или 1 hour 5 minutes.
{{gameStoryboardKeyframeCount}}Текущий ориентир Keyframes per Turn (ключевых кадров за ход) в режиме Game Mode, от 1 до 6. По умолчанию 3.
{{agent::TYPE}}Сохраненный результат агента указанного типа.

{{reasoning}} называет уровень, который получает модель, после того как наложены друг на друга настройки вашего пресета, аккаунта и чата. Maximum показывается как самый высокий уровень, который принимает модель, поэтому значение может быть max, xhigh или high. Поскольку off читается как "ложь", {{#if reasoning}} оставляет блок только пока модель думает. Если в вашем пресете или чате уже есть собственная переменная с именем reasoning, имя остается за ней.

{{lastGenerationType}} раскрывается в простую метку. В приложении встречаются, например, значения normal, continue, regenerate, impersonate, guided, autonomous, turn_game, preview, game_setup, lorebook_scan и retry_agents. Список может пополняться, поэтому считайте его примерами, а не закрытым перечнем.

{{gameStoryboardKeyframeCount}} передается в промпты GM в режиме Game Mode, включая встроенный Storyboard Game Prompt. Это ориентир для повествования, а не требование выдать ровно столько абзацев. Планировщик раскадровки при этом вернет меньше кадров, если в ходе слишком мало отдельных визуальных моментов.

Макрос {{agent::TYPE}} вставляет сохраненный результат агента – фонового помощника, который заполняет, например, трекер сцены. Проще всего добавить его в панели Preset Editor: нажмите кнопку Add Section (добавить раздел), раскройте группу Agent Sections и выберите агента. Marinara создаст раздел, в котором уже стоит нужный тег {{agent::TYPE}}. Этот макрос раскрывается последним, поэтому текст агента не может вставить в промпт новые макросы.

Макросы outlet в лорбуках

{{outlet::name}} вставляет содержимое тех записей лорбука, у которых в поле Position выбрано Outlet, а поле Outlet name в точности совпадает с name. Регистр в названии outlet важен: например, {{outlet::character_rules}} не подходит к точке вставки outlet с названием Character_Rules.

Записи outlet активируются по обычным правилам лорбука. Активна ли запись для текущей генерации, решают ключевые слова, режим Constant, вероятность, фильтры, тайминг, ограничения на число записей и лимит токенов. Активные записи с одинаковым названием outlet идут в порядке поля Order, каждая с новой строки. Вставляются они только в месте макроса и не добавляются дополнительно на обычной позиции лорбука.

Макросы outlet можно использовать в разделах промпта в режимах Conversation, Roleplay и Game Mode. Макрос работает даже тогда, когда стоит перед маркером лорбука в пресете, а если пресет использует только записи outlet, маркер лорбука ему вообще не нужен. Неизвестная или неактивная точка вставки outlet раскрывается в пустоту. Запись outlet не раскрывает другой макрос outlet, поэтому вложенной рекурсии здесь не бывает.

Макрос размера лорбука

{{lorebooksize::ID}} возвращает общее число записей лорбука с заданным ID. Замените ID идентификатором лорбука, который можно скопировать в панели Lorebooks (лорбуки). Например, для лорбука V1StGXR8_Z5jdHi6B-myT со 151 записью {{lorebooksize::V1StGXR8_Z5jdHi6B-myT}} возвращает 151.

Неизвестный ID лорбука дает 0. Учитываются все записи, независимо от того, включены они, выключены или лежат в папках.

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

Макрос include для записей лорбука

{{include::ENTRY}} подставляет текст записи лорбука туда, где стоит макрос. Храните общий фрагмент текста, например домашние правила, в одной записи и используйте его повторно в других записях, разделах промпта или карточках – тогда править придется только одну копию. Замените ENTRY на ID записи или ее название. Регистр в названиях не важен.

{{include::BOOK::ENTRY}} берет запись из лорбука, который вы указали по его ID или названию. Этот лорбук не обязательно добавлять к чату и даже включать.

{{include::Rules of the arena}}
{{include::Shared lore::Rules of the arena}}

Подставляемой записи не обязательно активироваться, и она может быть выключена, поэтому можно держать записи, которые нужны только для подстановки. Макросы в подставленном тексте работают как обычно, и в нем тоже можно подставлять другие записи. Если макрос include ведет обратно к записи, внутри которой он уже находится (например, когда запись подставляет саму себя), такой макрос раскрывается в пустоту, а не повторяется бесконечно. Если запись или лорбук не найдены, макрос тоже раскрывается в пустоту.

Названия и ID пишите обычным текстом. Макросы внутри них, например {{include::{{char}}}}, не раскрываются.

Макросы времени

Макросы реального времени берут один и тот же момент за одно раскрытие, поэтому никогда не расходятся между собой. Часовой пояс берется из браузера.

МакросВо что раскрывается
{{date}}Текущая дата в формате YYYY-MM-DD.
{{time}}Текущее время как HH:MM по 24-часовой шкале.
{{datetime}} / {{isotime}}Полная отметка времени со смещением часового пояса. Оба названия означают одно и то же.
{{weekday}}Название дня недели, например Monday.
{{timezone}}Название часового пояса, например Europe/Warsaw.
{{date.world_state}}Текущая дата внутри мира, отслеживаемая агентом World State, в исходном формате.
{{time.world_state}}Текущее время внутри мира, отслеживаемое агентом World State, в исходном формате.
{{weekday.world_state}}Пользовательское поле мира с именем Weekday или Day of Week, день недели в отслеживаемой дате либо день недели для корректной отслеживаемой даты в формате YYYY-MM-DD.

Макросы .world_state работают в промптах и шаблонах агентов. Они берут дату и время мира, показанные для текущего хода истории. Переключение свайпов меняет ход, из которого берутся значения; при повторной генерации используется состояние истории, с которого начинается заменяющий ответ. Отсутствующее значение становится пустым текстом; текущая дата или время реального мира никогда не подставляются вместо него. Вымышленные календари сохраняют собственный текст даты и времени. Для вымышленного дня недели добавьте в World State пользовательское поле с именем Weekday или Day of Week.

Например, {{#if weekday.world_state == "Monday"}}Use the weekday routine.{{/if}} берет отслеживаемый день недели вместо реального.

Макросы случайности и кубиков

Эти макросы добавляют в промпт элемент случайности. Для чисел и выбора вариантов используйте макрос {{random}}, для кубиков – макрос {{roll}}.

МакросЧто делает
{{random}}Случайное целое число от 0 до 100.
{{random:X:Y}}Случайное целое число от X до Y включительно.
{{random::A::B::C}}Случайно выбирает один вариант, а затем раскрывает макросы только внутри выбранного.
{{random::A@2::B@0.5}}Случайный выбор с весами. Правила весов – ниже.
{{roll:XdY}}Сумма броска кубиков. Например, {{roll:2d6}} бросает два шестигранных кубика и складывает результат. {{roll:d20}} бросает один кубик, а {{roll:1d8+3}} прибавляет к броску 3.

Простой пример случайного выбора, который можно скопировать:

{{random::The door creaks open.::A bell rings.::Someone laughs nearby.}}

Выбор с весами

Чтобы задать вероятность варианта, добавьте в его конец @number. Это относительный вес: чем он больше, тем чаще выпадает вариант.

{{random::Common event@1::Rare event@0.25}}

В этом примере суммарный вес равен 1.25, поэтому вероятности такие:

ВариантВесВероятность
Common event180%
Rare event0.2520%

Правила весов:

Динамические переменные

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

МакросЧто делает
{{setvar::name::value}}Сохраняет значение и не оставляет в тексте ничего.
{{getvar::name}}Читает сохраненное значение (пустота, если оно не задавалось).
{{addvar::name::value}}Складывает значения, если оба числовые; иначе дописывает новый текст.
{{addnumvar::name::value}}Расширение Marinara: всегда прибавляет число к сохраненному числовому значению. Отсутствующие или недопустимые числа считаются за 0; сложение с переполнением игнорируется.
{{incvar::name}}Прибавляет 1 к числовой переменной и вставляет новое значение.
{{decvar::name}}Вычитает 1 из числовой переменной и вставляет новое значение.

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

Любой тег {{NAME}}, которого нет среди встроенных макросов, ищется по имени: сначала среди переменных пресета, затем среди переменных чата. Если такого имени нет ни там, ни там, тег остается в тексте точно в том виде, в каком его написали. При совпадении имен переменная пресета имеет приоритет. О переменных пресета см. Переменные пресета.

Переменные чата

Для создания переменной не обязательно использовать {{setvar}}. Раздел Chat Variables (переменные чата) панели Chat Settings (настройки чата) позволяет ввести имя и значение напрямую, а затем использовать имя везде, где работают макросы, в том числе в собственных сообщениях. Добавьте char1 со значением Mary, напишите {{char1}} walks in., и ИИ прочитает "Mary walks in."

Правила для переменных чата:

О самой панели см. Обзор панели Chat Settings.

Макросы форматирования

Эти макросы меняют текст вокруг себя.

МакросЧто делает
{{newline}} / {{\n}}Вставляет перенос строки.
{{trim}}Убирает себя и обрезает пробелы вокруг этого места.
{{trimStart}}Обрезает пробелы в начале окружающего текста.
{{trimEnd}}Обрезает пробелы в конце окружающего текста.
{{uppercase}}...{{/uppercase}}Переводит текст внутри в ВЕРХНИЙ РЕГИСТР.
{{lowercase}}...{{/lowercase}}Переводит текст внутри в нижний регистр.
{{noop}}Удаляется из результата. Удобен как безвредная заглушка во время правки.
{{// comment}}Заметка автора, которая удаляется из результата.
{{banned "text"}}Удаляется из результата. Ничего не фильтрует и не блокирует.

Как оставить двойные скобки в тексте

Экранирующего символа для макросов нет. Чтобы двойные скобки остались в тексте, возьмите название, которое Marinara не знает. Любой неизвестный тег {{name}} остается точно таким, как его написали, – при условии, что ни переменной пресета, ни переменной чата с таким же именем нет. Если нужна личная заметка, которая никогда не попадет к ИИ, используйте {{// like this}}.

Окно Macro reference и команда /macros

В углу каждого поля с поддержкой макросов есть две небольшие кнопки:

Эти поля также дописывают названия макросов за вас. Наберите {{ch в конце строки, и остальная часть, ar}}, появится бледным текстом. Нажмите Tab или коснитесь бледного текста, чтобы принять подсказку. Продолжайте печатать, чтобы ее проигнорировать. Для макроса, который принимает значение, например {{getvar::, подсказка останавливается там, где вы вводите значение.

Другой вариант: написать в поле ввода /macros (короткая форма /macro тоже работает). Команда выводит полный список макросов прямо в чат – удобная шпаргалка.

Условия с макросами

Условные блоки ({{#if ...}}) умеют объединять сравнения через || (ИЛИ), && (И) и круглые скобки. В списках равенства можно использовать краткую форму {{#if character == "Maukie" || "Pantalone"}}. О приоритете операторов, примерах для групповых чатов и полном списке операторов см. Условные промпты.

Условие может также спросить модель решений о сцене, например {{#if decision:"The latest message moves the scene to a new place"}} для ответа да или нет и {{#if decision_choice:"The kind of scene in the latest message" == "combat"}} для выбора одного варианта. Если модели решений нет или она не ответила, такие условия означают нет. См. Вопрос к модели решений. Параметры, которые можно добавить после утверждения:

Частые ошибки

Смежные руководства