Макросы промптов
Макрос – это короткий тег вида {{tag}}, который Marinara при сборке промпта заменяет на текущее значение, например ваше имя или сегодняшнюю дату. В этом руководстве перечислены все встроенные макросы, места, где их можно писать, и типичные ошибки.
Где работают макросы
Собирая текст для отправки ИИ, Marinara подставляет вместо каждого тега {{tag}} его текущее значение. Отдельного переключателя для макросов нет. Любое поле, которое их поддерживает, всегда их раскрывает. Регистр в названиях встроенных макросов не важен: работают и {{user}}, и {{USER}}. Значение макроса может содержать другой макрос, и Marinara раскроет его тоже.
Писать макросы можно в этих местах:
- Поля персонажа в панели Character Editor (редактор персонажа): Description, Personality, Backstory, Appearance, Scenario, Example Dialogue, System Prompt, Post-History Instructions и поле Depth Prompt.
- Поля персоны в панели Persona Editor (редактор персоны) – те же поля карточки.
- Поля Description и Content в записи лорбука.
- Разделы промпта в панели Preset Editor (редактор пресетов).
- Поля Find, Replace и Trim в скрипте регулярного выражения.
- Шаблоны промптов агентов.
- Поле ввода сообщения. Напишите в сообщении
{{roll:1d20}}– макрос раскроется перед отправкой.
Макросы обрабатываются внутри приложения Marinara, и им не нужны ни настройка, ни ключ API. Две возможности зависят от других частей приложения:
- Переменные пресета (универсальный тег
{{NAME}}) работают только с тем пресетом промпта, где они заданы. См. Переменные пресета. - Макрос агента
{{agent::TYPE}}показывает текст только после того, как соответствующий агент отработал и выдал результат.
Макросы личности, персонажа и персоны
Эти макросы подставляют имена и поля карточки того, кто пишет, и персонажа, который отвечает. Пользователь – это вы (или ваша активная персона). Персонаж – это бот, который отвечает.
| Макрос | Во что раскрывается |
{{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 записи или ее название. Регистр в названиях не важен.
- Внутри записи лорбука название ищется в том же лорбуке, где находится эта запись.
- В любом другом месте название ищется в лорбуках, которые использует этот чат: добавленных к чату, привязанных к его персонажам и персоне, а также глобальных.
- По 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 event | 1 | 80% |
| Rare event | 0.25 | 20% |
Правила весов:
- Отсутствующий вес считается равным 1.
- Вес может быть дробным – например, 0.5 или 0.01.
- Вес 0 оставляет вариант в списке, но выбрать его невозможно.
- Если у всех вариантов вес 0, макрос раскрывается в пустоту.
- Весом считается только
@numberв самом конце. Символ@в другом месте – скажем, в адресе электронной почты – остается как есть.
Динамические переменные
Переменные позволяют одной части промпта сохранить значение, а более поздней – его прочитать.
| Макрос | Что делает |
{{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."
Правила для переменных чата:
- Имена могут содержать буквы, цифры и знаки подчеркивания, а начинаться должны с буквы или подчеркивания. Имена длиной ровно 21 символ зарезервированы для ссылок на персонажей. Имя с точкой или дефисом по-прежнему можно задать и прочитать через
{{setvar}}и{{getvar}}, но простая запись{{name}}для него не сработает. - Имя встроенного макроса использовать нельзя.
{{char}}всегда означает персонажа. - В вашем сообщении остается введенный тег. Значение подставляется при сборке промпта, поэтому его позднейшее изменение меняет и предыдущие ходы, где оно использовалось.
- Раздел также показывает переменные, заданные через
{{setvar}}, поскольку они используют общее хранилище внутри чата.
О самой панели см. Обзор панели Chat Settings.
Макросы форматирования
Эти макросы меняют текст вокруг себя.
| Макрос | Что делает |
{{newline}} / {{\n}} | Вставляет перенос строки. |
{{trim}} | Убирает себя и обрезает пробелы вокруг этого места. |
{{trimStart}} | Обрезает пробелы в начале окружающего текста. |
{{trimEnd}} | Обрезает пробелы в конце окружающего текста. |
{{uppercase}}...{{/uppercase}} | Переводит текст внутри в ВЕРХНИЙ РЕГИСТР. |
{{lowercase}}...{{/lowercase}} | Переводит текст внутри в нижний регистр. |
{{noop}} | Удаляется из результата. Удобен как безвредная заглушка во время правки. |
{{// comment}} | Заметка автора, которая удаляется из результата. |
{{banned "text"}} | Удаляется из результата. Ничего не фильтрует и не блокирует. |
Как оставить двойные скобки в тексте
Экранирующего символа для макросов нет. Чтобы двойные скобки остались в тексте, возьмите название, которое Marinara не знает. Любой неизвестный тег {{name}} остается точно таким, как его написали, – при условии, что ни переменной пресета, ни переменной чата с таким же именем нет. Если нужна личная заметка, которая никогда не попадет к ИИ, используйте {{// like this}}.
Окно Macro reference и команда /macros
В углу каждого поля с поддержкой макросов есть две небольшие кнопки:
- Кнопка Expand editor (развернуть редактор) открывает для этого поля окно побольше.
- Кнопка Macro reference (справочник макросов) открывает окно Macro reference со списком всех встроенных макросов по категориям и с точным синтаксисом каждого. Список формируется из того же источника, что использует движок, поэтому он всегда точный.
Эти поля также дописывают названия макросов за вас. Наберите {{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"}} для выбора одного варианта. Если модели решений нет или она не ответила, такие условия означают нет. См. Вопрос к модели решений. Параметры, которые можно добавить после утверждения:
sticky:3 cooldown:5сохраняет ответ да на три сообщения, а затем делает паузу на пять. См. Sticky и cooldown.until:"..."илиwhile:"..."сохраняет ответ да, пока это позволяет второе утверждение. См. Until и while.every:3спрашивает утверждение только раз в три сообщения. См. Проверка через несколько сообщений.priority:highилиpriority:lowвыбирает, какие утверждения поместятся в план промпта. См. Приоритет и Ограничения и стоимость.
Частые ошибки
- Не пишите переменные внутри блока
{{random::...}}. Макрос{{setvar}}внутри варианта срабатывает для всех вариантов до того, как сделан выбор, а не только для выбранного. - Не используйте локальную переменную как глобальное состояние. Она сохраняется только в том чате, где ее задали.
- Раздел промпта или запись лорбука, выполняющая
{{setvar}}, перезаписывает переменную чата с тем же именем, поскольку обе используют одно хранилище чата. Задайте разные имена, если хотите сохранить обе. {{prompt}}– не макрос. Если всё сообщение состоит из{{prompt}}, Marinara не отправит его, а откроет просмотр Peek Prompt. См. Peek Prompt.- Инструменты Custom Tools не используют текст
{{macro}}. Не вставляйте{{roll:1d20}}в поле инструмента в расчете на раскрытие. - Шаблон промпта Impersonate принимает лишь несколько подстановок, а не весь список макросов. Названия там тоже другие, поэтому макрос, который работает в карточке, здесь может не сработать.
- Большой или глубоко вложенный результат макроса обрезается без предупреждения. Ошибки не будет, поэтому не давайте раскрытиям макросов разрастаться.
Смежные руководства
- Условные промпты
- Переменные пресета
- Редактор пресетов и управление промптами
- Peek Prompt
- Создание и редактирование персонажей
- Профили в режиме Conversation