Macros de prompt
A macro é uma etiqueta curta, escrita como {{tag}}, que Marinara troca por um valor atual, como o seu nome ou a data de hoje, quando monta um prompt. Este guia lista todas as macros embutidas, onde você pode digitá-las e quais erros evitar.
Onde as macros funcionam
Ao montar o texto que envia para a IA, Marinara troca cada {{tag}} pelo valor do momento. Não existe um botão para ligar as macros. Todo campo compatível com elas sempre as resolve. Nos nomes das macros embutidas, maiúsculas e minúsculas não fazem diferença, então {{user}} e {{USER}} funcionam igual. O valor de uma macro pode conter outra macro, e Marinara resolve essa segunda também.
Você pode digitar macros nestes lugares:
- Campos de personagem no Character Editor (editor de personagem): Description, Personality, Backstory, Appearance, Scenario, Example Dialogue, System Prompt, Post-History Instructions e o campo Depth Prompt.
- Campos de persona no Persona Editor (editor de persona), que são os mesmos campos do card.
- Campos Description e Content das entradas de lorebook.
- Seções do preset de prompt no Preset Editor (editor de presets).
- Campos Find, Replace e Trim dos scripts de regex.
- Modelos de prompt dos agentes.
- A caixa de mensagem do chat. Digite
{{roll:1d20}}em uma mensagem e a macro é resolvida antes do envio.
As macros rodam dentro do Marinara e não precisam de configuração nem de chave de API. Dois recursos dependem de outras partes do aplicativo:
- As variáveis de preset (o coringa
{{NAME}}) precisam de um preset de prompt que as defina. Veja Variáveis de preset. - A macro de agente
{{agent::TYPE}}só mostra texto depois que o agente correspondente roda e produz uma saída.
Macros de identidade, personagem e persona
Estas macros trazem os nomes e os campos do card de quem fala e do personagem que responde. O usuário é você (ou a persona ativa). O personagem é o bot que está respondendo.
| Macro | Resultado |
{{user}} / {{userName}} | O seu nome de exibição atual (ou o nome da persona). Sem persona definida, o padrão é User. |
{{userNamePhonetic}} | O nome Phonetic da persona, ou {{user}} quando esse campo está vazio. |
{{char}} / {{charName}} | O nome do personagem atual. O padrão é Character. |
{{21-character-card-ID}} | Nome de outro personagem. Troque o texto do marcador pelo ID exato de 21 caracteres do card para incluí-lo no contexto. |
{{persona-21-character-card-ID}} | Nome de outra persona. Troque o texto do marcador depois de persona- pelo ID exato de 21 caracteres do card para incluí-lo no contexto. |
{{charNamePhonetic}} | O nome Phonetic do personagem, ou {{char}} quando esse campo está vazio. |
{{characters}} | Todos os personagens do chat, incluindo os inativos, separados por vírgulas. Esta macro acrescenta apenas os nomes; ela não adiciona os cards dos personagens inativos ao prompt. |
{{group}} | Todos os outros personagens ativos do chat em grupo, sem contar quem está respondendo. A persona não faz parte dessa lista de personagens. |
{{persona}} | Os campos Description, Personality, Backstory, Appearance e Scenario da persona, unidos por quebras de linha. |
{{personaDescription}} | O campo Description da persona. |
{{personaPersonality}} | O campo Personality da persona. |
{{personaBackstory}} | O campo Backstory da persona. |
{{personaAppearance}} | O campo Appearance da persona. |
{{personaScenario}} | O campo Scenario da persona. |
As macros de campo do personagem leem o card do personagem atual:
| Macro | Campo do card de personagem |
{{description}} | Description |
{{personality}} | Personality |
{{backstory}} | Backstory |
{{appearance}} | Appearance |
{{scenario}} | Scenario |
{{example}} | Example Dialogue |
{{charSysInfo}} | System Prompt |
{{charPostHistory}} | Post-History Instructions |
Em um chat com um só personagem, essas macros apontam para ele. No chat em grupo, elas apontam para o primeiro personagem por padrão. Para repetir um texto para cada personagem, coloque-o dentro de um bloco de grupo entre colchetes. Os blocos de grupo estão explicados em Prompts condicionais.
A macro {{group}} acompanha o personagem que está respondendo no momento, inclusive durante gerações individuais dentro do grupo. Por exemplo: se Pantalone responde em um grupo de Roleplay formado por Powers That Be, Maukie e Pantalone, {{group}} resulta em Powers That Be, Maukie. Um card de personagem continua nessa lista mesmo que o nome dele coincida com {{user}}.
O campo Phonetic tem duas funções. Ele define como o nome é pronunciado na conversão de texto em voz. E também alimenta as macros {{charNamePhonetic}} e {{userNamePhonetic}}. O campo aparece tanto no Character Editor quanto no Persona Editor.
Para citar um personagem que não faz parte do chat atual, copie o ID do card e coloque-o diretamente entre chaves duplas, como {{V1StGXR8_Z5jdHi6B-myT}}. Não inclua os caracteres literais < ou >. Marinara troca a macro pelo nome do personagem. Nos chats de Roleplay que usam um preset de prompt, também adiciona Description, Personality, Appearance, Backstory, Scenario e Example Dialogue do card citado ao prompt de sistema; nos outros chats, a macro só vira o nome. Isso funciona em mensagens do chat e campos de prompt e, nos chats de Roleplay com preset, também em entradas de lorebook ativadas. As saudações iniciais do card citado ficam de fora. Os lorebooks ativados que estão vinculados a esse card continuam sujeitos às regras normais de palavras-chave, constant, filtros, probabilidade e orçamento de tokens. Se o personagem já estiver no chat, a macro ainda assim é trocada pelo nome dele, e o card não é adicionado uma segunda vez.
Para citar uma persona diferente da ativa, acrescente persona- antes do ID copiado, como em {{persona-P1StGXR8_Z5jdHi6B-myT}}. Marinara troca a macro pelo nome da persona e adiciona os campos Description, Personality, Appearance, Backstory e Scenario desse card ao mesmo contexto de ID Macro Cards. Os lorebooks ativados que estão vinculados a essa persona mantêm as regras normais de ativação.
Macros do Conversation Mode
Estas quatro macros só funcionam no Conversation Mode. Em qualquer outro modo, elas sempre resultam em nada, mesmo quando o mesmo texto de card ou de preset é usado em vários modos.
| Macro | Resultado |
{{convo_display}} | O campo Convo Display Name do personagem, ou o nome do card quando ele está vazio. |
{{char_about}} | O texto About Me atual do personagem (a substituição feita naquele chat, se houver; caso contrário, o padrão do card). |
{{persona_about}} | O texto About Me atual da persona. |
{{convo_behavior}} | O texto Convo Behavior do personagem, mas só quando a opção de inserção está configurada para colocá-lo nesta macro. |
Esses campos ficam na aba Convo do Character Editor e do Persona Editor. A configuração completa está em Perfis do Conversation Mode.
Macros de posicionamento no Conversation Mode
O Conversation Mode insere vários blocos no prompt automaticamente. Com estas macros, um preset move um bloco para o ponto onde você colocar a macro. Ao usar uma delas, Marinara renderiza o bloco ali e pula a inserção automática, então o conteúdo nunca aparece duplicado. Cada macro tem um ou mais apelidos, e todos se comportam do mesmo jeito.
| Macro (e apelidos) | Insere |
{{context}}, {{status}} | O bloco de contexto / status da conversa. |
{{commands}}, {{commandList}} | O lembrete com os comandos disponíveis. |
{{reactRules}}, {{emojiReact}} | As regras de reação com emoji personalizado. |
{{replyRules}} | As regras de resposta com emoji personalizado e figurinha. |
{{memories}}, {{memoryRecall}} | O bloco de memória recuperada. |
{{lorebook}}, {{lore}} | As inserções de lorebook. |
Isso vale apenas no Conversation Mode. Em uma conversa com um só personagem, posicionar as biografias dos participantes por conta própria, com {{char_about}} / {{persona_about}} (veja acima), funciona da mesma forma: Marinara pula o bloco automático de "about me" dos participantes, e as biografias não entram duas vezes. As conversas em grupo mantêm o bloco automático, porque cada uma dessas macros no singular cobre só um participante e não pode esconder a biografia dos demais.
Macros de contexto
Estas macros descrevem o chat atual e a requisição atual.
| Macro | Resultado |
{{input}} | A mensagem mais recente do usuário disponível para o prompt. |
{{model}} | O nome do modelo atual, quando há um selecionado. |
{{reasoning}} | O nível de raciocínio com que esta resposta é gerada: low, medium, high, xhigh ou max, ou off quando o modelo não é solicitado a pensar. |
{{chatId}} | O ID do chat atual. |
{{lastGenerationType}} | Uma etiqueta que indica por que esta resposta está sendo gerada. |
{{idle_duration}} | Quanto tempo passou desde a última atividade no chat, em texto como 8 minutes ou 1 hour 5 minutes. |
{{gameStoryboardKeyframeCount}} | O alvo atual de Keyframes per Turn do Game Mode, de 1 a 6. O padrão é 3. |
{{agent::TYPE}} | A saída salva de um agente do tipo indicado. |
{{reasoning}} informa o nível que o modelo recebe, depois de combinados o seu preset, a conta e as configurações do chat. Maximum aparece como o nível mais alto que o modelo aceita, então pode ser max, xhigh ou high. Como off é lido como falso, {{#if reasoning}} mantém um bloco só enquanto o modelo pensa. Se o seu preset ou chat já tiver uma variável própria chamada reasoning, essa variável mantém o nome.
O valor de {{lastGenerationType}} é uma etiqueta simples. Entre os valores que aparecem no aplicativo estão normal, continue, regenerate, impersonate, guided, autonomous, turn_game, preview, game_setup, lorebook_scan e retry_agents. Essa lista pode crescer, então trate os valores como exemplos, não como um conjunto fechado.
A macro {{gameStoryboardKeyframeCount}} é fornecida aos prompts de GM do Game Mode, incluindo o Storyboard Game Prompt embutido. É um alvo narrativo, não uma exigência de ter exatamente aquela quantidade de parágrafos. O planejador do storyboard continua devolvendo menos tomadas quando o turno não tem momentos visuais distintos suficientes.
A macro {{agent::TYPE}} insere a saída salva de um agente (um ajudante que roda em segundo plano e preenche coisas como o tracker de cena). O jeito mais fácil de adicioná-la é pelo Preset Editor: clique em Add Section, abra o grupo Agent Sections e escolha um agente. Marinara cria uma seção que já contém a etiqueta {{agent::TYPE}} certa. Esta macro é resolvida por último, então o texto do agente não consegue inserir mais macros no prompt.
Macros de Outlet de lorebook
A macro {{outlet::name}} insere o conteúdo das entradas de lorebook cujo campo Position está em Outlet e cujo campo Outlet name é exatamente igual a name. Nos nomes de outlet, maiúsculas e minúsculas fazem diferença. Por exemplo, {{outlet::character_rules}} não corresponde a um outlet chamado Character_Rules.
As entradas de outlet continuam usando a ativação normal do lorebook. Palavras-chave, modo Constant, probabilidade, filtros, momento de acionar, limites de entrada e orçamentos de tokens decidem se uma entrada está ativa na geração atual. As entradas ativas com o mesmo nome de outlet são unidas na ordem do campo Order, separadas por quebras de linha. Elas entram só na macro, e não também em uma posição normal de lorebook.
Use as macros de outlet em seções de prompt nos modos Conversation, Roleplay ou Game. A macro funciona mesmo quando aparece antes do marcador de lorebook do preset, e o preset não precisa de um marcador de lorebook quando usa apenas entradas de outlet. Um outlet desconhecido ou inativo resulta em nada. Uma entrada de outlet não expande outra macro de outlet, então não há recursão entre outlets.
Macro de tamanho do lorebook
{{lorebooksize::ID}} resulta no total de entradas do lorebook com esse ID. Troque ID pelo ID do lorebook, que você pode copiar do painel Lorebooks. Por exemplo, se um lorebook tiver o ID V1StGXR8_Z5jdHi6B-myT e contiver 151 entradas, {{lorebooksize::V1StGXR8_Z5jdHi6B-myT}} resulta em 151.
IDs de lorebook desconhecidos resultam em 0. A contagem inclui todas as entradas, estejam elas ativadas, desativadas ou em pastas.
Use esta macro em seções de prompt, campos de cards de personagem, conteúdo de entradas de lorebook ou qualquer outro lugar onde macros são resolvidas.
Macro de inclusão de lorebook
{{include::ENTRY}} insere o texto de uma entrada de lorebook no ponto em que você escreve a macro. Mantenha um texto compartilhado, como as regras da casa, em uma única entrada e reaproveite-o em outras entradas, seções de prompt ou cards, para que exista uma só cópia para editar. Troque ENTRY pelo ID ou pelo nome da entrada. Nos nomes, maiúsculas e minúsculas não fazem diferença.
- Dentro de uma entrada de lorebook, o nome é procurado no próprio lorebook dessa entrada.
- Em qualquer outro lugar, o nome é procurado nos lorebooks usados por este chat: os adicionados ao chat, os vinculados aos personagens e à persona dele e os globais.
- Um ID encontra a entrada em qualquer lorebook.
{{include::BOOK::ENTRY}} pega a entrada do lorebook que você indicar, pelo ID ou pelo nome. Esse lorebook não precisa estar adicionado ao chat nem mesmo ativado.
{{include::Rules of the arena}}
{{include::Shared lore::Rules of the arena}}A entrada incluída não precisa ser acionada e pode estar desativada, então você pode manter entradas que existem só para serem incluídas. As macros do texto incluído funcionam normalmente, e ele também pode incluir outras entradas. Se uma inclusão leva de volta a uma entrada dentro da qual ela já está, como uma entrada que inclui a si mesma, essa inclusão resulta em nada, em vez de se repetir para sempre. Uma entrada ou um lorebook não encontrado também resulta em nada.
Escreva nomes e IDs como texto simples. As macros dentro deles, como em {{include::{{char}}}}, não são preenchidas.
Macros de tempo
As macros de tempo do mundo real leem um mesmo instante compartilhado a cada resolução, então elas sempre concordam entre si. O fuso horário vem do navegador.
| Macro | Resultado |
{{date}} | A data atual, no formato YYYY-MM-DD. |
{{time}} | A hora atual, no formato HH:MM, em relógio de 24 horas. |
{{datetime}} / {{isotime}} | Um carimbo de data e hora completo, com o deslocamento do fuso horário. Os dois nomes significam a mesma coisa. |
{{weekday}} | O nome do dia da semana, como Monday. |
{{timezone}} | O nome do fuso horário, como Europe/Warsaw. |
{{date.world_state}} | A data atual do mundo registrada pelo World State, no formato original. |
{{time.world_state}} | A hora atual do mundo registrada pelo World State, no formato original. |
{{weekday.world_state}} | Um campo personalizado do mundo chamado Weekday ou Day of Week, um dia da semana escrito na data registrada ou o dia da semana de uma data registrada válida no formato YYYY-MM-DD. |
As macros .world_state funcionam em prompts e modelos de agentes. Elas leem a data e a hora do mundo exibidas para o turno atual da história. Mudar de swipe altera o turno cujos valores elas usam; regenerar usa o estado da história de onde a resposta substituta parte. Um valor ausente fica vazio; ele nunca usa a data ou a hora atuais do mundo real como alternativa. Os calendários fictícios mantêm o próprio texto de data e hora. Para um dia da semana fictício, adicione no World State um campo personalizado chamado Weekday ou Day of Week.
Por exemplo, {{#if weekday.world_state == "Monday"}}Use the weekday routine.{{/if}} lê o dia da semana registrado em vez do real.
Macros de sorteio e dados
Estas macros trazem acaso para os prompts. Use a macro de sorteio ({{random}}) para números e escolhas, e a macro de rolagem ({{roll}}) para dados.
| Macro | Comportamento |
{{random}} | Um número inteiro sorteado de 0 a 100. |
{{random:X:Y}} | Um número inteiro sorteado entre X e Y, incluindo os dois. |
{{random::A::B::C}} | Sorteia uma das opções e resolve as macros apenas dentro da opção escolhida. |
{{random::A@2::B@0.5}} | Um sorteio com peso. Veja as regras de peso abaixo. |
{{roll:XdY}} | O total de uma rolagem de dados. Por exemplo, {{roll:2d6}} rola dois dados de seis faces e soma os resultados. {{roll:d20}} rola um dado, e {{roll:1d8+3}} soma 3 à rolagem. |
Um sorteio simples que você pode copiar:
{{random::The door creaks open.::A bell rings.::Someone laughs nearby.}}Escolhas com peso
Coloque um @number no fim de uma opção para definir a chance dela. O número é um peso relativo. Quanto maior, mais provável.
{{random::Common event@1::Rare event@0.25}}Nesse exemplo o peso total é 1,25, então as chances ficam assim:
| Opção | Peso | Chance |
| Common event | 1 | 80% |
| Rare event | 0.25 | 20% |
Regras de peso:
- Uma opção sem peso conta como 1.
- Pesos decimais são aceitos, como 0.5 ou 0.01.
- O peso 0 mantém a opção na lista, mas ela nunca é sorteada.
- Se todas as opções tiverem peso 0, a macro resulta em nada.
- Só um
@numberno fim conta como peso. Um@em outro lugar, como em um endereço de e-mail, fica intacto.
Variáveis dinâmicas
Com as variáveis, uma parte do prompt guarda um valor e outra parte, mais adiante, lê esse valor.
| Macro | Comportamento |
{{setvar::name::value}} | Guarda um valor e não deixa nada no texto. |
{{getvar::name}} | Lê um valor guardado (nada, se ele nunca foi definido). |
{{addvar::name::value}} | Soma os números quando os dois valores são numéricos; caso contrário, acrescenta o novo texto. |
{{addnumvar::name::value}} | Extensão do Marinara: sempre soma um número a um valor numérico guardado. Números ausentes ou inválidos contam como 0; uma soma que estoura o limite é ignorada. |
{{incvar::name}} | Soma 1 a uma variável numérica e insere o novo valor. |
{{decvar::name}} | Subtrai 1 de uma variável numérica e insere o novo valor. |
As variáveis são resolvidas da esquerda para a direita em uma mesma montagem do prompt. Um valor definido cedo, por exemplo em uma entrada de lorebook que vem antes, pode ser lido depois no mesmo prompt. Marinara também salva as variáveis no chat atual, como as variáveis locais do SillyTavern: elas permanecem nos turnos seguintes e depois de reiniciar o aplicativo, enquanto outro chat tem os próprios valores, separados.
Qualquer {{NAME}} que não seja uma macro embutida é procurado pelo nome: primeiro entre as variáveis do preset, depois entre as do chat. Se nenhuma tiver esse nome, a etiqueta fica no texto exatamente como você digitou. A variável do preset tem prioridade quando as duas usam o mesmo nome. Veja Variáveis de preset para saber sobre o lado do preset.
Variáveis do chat
Você não precisa usar {{setvar}} para criar uma variável. A seção Chat Variables (variáveis do chat) do painel Chat Settings (configurações do chat) permite digitar diretamente um nome e um valor e usar esse nome onde as macros funcionam, inclusive nas suas próprias mensagens. Adicione char1 com o valor Mary, digite {{char1}} walks in. e a IA lê "Mary walks in."
Regras das variáveis do chat:
- Os nomes aceitam letras, números e sublinhados, e precisam começar com uma letra ou sublinhado. Nomes com exatamente 21 caracteres são reservados para referências a personagens. Um nome com ponto ou hífen ainda pode ser definido e lido com
{{setvar}}e{{getvar}}, mas não é resolvido na forma direta{{name}}. - Não é possível usar o nome de uma macro embutida.
{{char}}sempre significa o personagem. - Sua mensagem continua mostrando a etiqueta que você digitou. O valor é inserido ao montar o prompt, então alterá-lo depois também muda os turnos anteriores que o usaram.
- A seção também lista variáveis definidas por
{{setvar}}, pois elas compartilham um único armazenamento por chat.
Para conhecer o painel, veja Visão geral do painel Chat Settings.
Macros de formatação
Estas macros dão forma ao texto ao redor delas.
| Macro | Comportamento |
{{newline}} / {{\n}} | Insere uma quebra de linha. |
{{trim}} | Some do texto e corta os espaços em volta daquele ponto. |
{{trimStart}} | Corta os espaços no início do texto ao redor. |
{{trimEnd}} | Corta os espaços no fim do texto ao redor. |
{{uppercase}}...{{/uppercase}} | Deixa o texto envolvido em MAIÚSCULAS. |
{{lowercase}}...{{/lowercase}} | Deixa o texto envolvido em minúsculas. |
{{noop}} | Some da saída. Serve como marcador inofensivo enquanto você edita. |
{{// comment}} | Uma nota do autor que some da saída. |
{{banned "text"}} | Some da saída. Não filtra nem bloqueia nada. |
Como mostrar chaves duplas literais
Não existe caractere de escape para macros. Se você quiser que as chaves duplas fiquem no texto, use um nome que Marinara não conheça. Qualquer {{name}} desconhecido fica exatamente como foi digitado, desde que nenhuma variável de preset nem do chat tenha esse mesmo nome. Se precisar de uma anotação particular, que nunca chegue à IA, use {{// like this}}.
A referência de macros e o comando /macros
Todo campo compatível com macros tem dois botõezinhos no canto:
- O botão Expand editor (expandir o editor) abre uma janela de edição maior para aquele campo.
- O botão Macro reference (referência de macros) abre uma janela chamada Macro reference, que lista todas as macros embutidas por categoria, cada uma com a sintaxe exata. Essa lista é gerada a partir da mesma fonte que o motor usa, então está sempre correta.
Esses campos também completam os nomes das macros para você. Digite {{ch no fim de uma linha, e o resto, ar}}, aparece em texto apagado. Pressione Tab, ou toque no texto apagado, para aceitar. Continue digitando para ignorar. Em uma macro que recebe um valor, como {{getvar::, a sugestão para onde você digita o valor.
Você também pode digitar /macros na caixa do chat (a forma curta /macro também funciona). O comando imprime a lista completa de macros no próprio chat, como lembrete rápido.
Condições com macros
Os blocos condicionais ({{#if ...}}) podem combinar comparações com || (OU), && (E) e parênteses. As listas de igualdade podem usar a forma compacta {{#if character == "Maukie" || "Pantalone"}}. Veja em Prompts condicionais a precedência, exemplos de chat em grupo e a lista completa de operadores.
Uma condição também pode consultar o seu modelo de decisão sobre a cena, por exemplo {{#if decision:"The latest message moves the scene to a new place"}} para sim ou não, e {{#if decision_choice:"The kind of scene in the latest message" == "combat"}} para escolher uma opção. Sem modelo de decisão, ou sem resposta, essas condições valem não. Veja Consultar o modelo de decisão. Opções que você pode acrescentar depois de uma declaração:
sticky:3 cooldown:5mantém um sim por três turnos e depois deixa a declaração em descanso por cinco. Veja Sticky e cooldown.until:"..."ouwhile:"..."mantém um sim enquanto uma segunda declaração permitir. Veja Until e while.every:3só pergunta uma declaração a cada três turnos. Veja Verificar a cada poucos turnos.priority:highoupriority:lowescolhe quais declarações cabem em um plano de prompt. Veja Prioridade e Limites e custo.
Erros comuns
- Não escreva variáveis dentro de um bloco
{{random::...}}. Um{{setvar}}dentro de uma opção do sorteio roda para todas as opções antes da escolha, e não só para a opção sorteada. - Não use uma variável local como se fosse global. Ela só persiste dentro do chat em que foi definida.
- Uma seção do prompt ou entrada de lorebook que execute
{{setvar}}sobrescreve uma variável do chat com o mesmo nome, porque as duas usam um único armazenamento por chat. Use nomes diferentes se quiser manter as duas. {{prompt}}não é uma macro. Se a mensagem inteira for{{prompt}}, Marinara abre o visualizador Peek Prompt em vez de enviá-la. Veja Peek Prompt.- As Custom Tools não usam texto de
{{macro}}. Não cole{{roll:1d20}}em um campo de ferramenta esperando que a macro seja resolvida. - O modelo de prompt de Impersonate aceita só alguns marcadores, não a lista completa de macros. Os nomes também são diferentes, então uma macro que funciona em um card pode não funcionar ali.
- Saídas de macro grandes ou com muitos níveis de aninhamento são cortadas em silêncio. Não aparece nenhum erro, então mantenha as expansões em um tamanho razoável.
Guias relacionados
- Prompts condicionais
- Variáveis de preset
- Editor de presets e gerenciador de prompts
- Peek Prompt
- Criando e editando personagens
- Perfis do Conversation Mode