プロンプトマクロ

マクロとは、Marinaraがプロンプトを組み立てるときに、名前や今日の日付などのその場の値に置き換える短い{{tag}}のことです。このガイドでは、組み込みマクロの一覧、マクロを入力できる場所、避けたい失敗を紹介します。

マクロを使える場所

MarinaraはAIに送るテキストを組み立てるときに、{{tag}}を1つずつ現在の値に置き換えます。マクロをオンにするスイッチはありません。マクロに対応した欄では、常に展開されます。組み込みマクロの名前は大文字と小文字を区別しないので、{{user}}でも{{USER}}でも動きます。マクロの値の中に別のマクロを含めることもでき、Marinaraはそれも展開します。

マクロは次の場所で入力できます。

マクロはMarinaraの内部で動くので、準備もAPIキーも要りません。ただし、次の2つの機能はアプリの他の部分に依存します。

本人、キャラクター、ペルソナのマクロ

これらのマクロは、話しかける側と返事をするキャラクターの名前やカードの内容を差し込みます。userは自分自身(またはアクティブなペルソナ)、characterは返事をするボットです。

マクロ展開結果
{{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

キャラクターが1人のチャットでは、そのキャラクターの内容が入ります。グループチャットでは、デフォルトで最初のキャラクターの内容が入ります。キャラクターごとに同じテキストを繰り返したいときは、角括弧のグループブロックの中に入れてください。グループブロックについては条件付きプロンプトを参照してください。

{{group}}は、今返事をしているキャラクターに追従します。グループの中で1人ずつ生成する場合も同じです。たとえばPowers That Be、Maukie、PantaloneがいるRoleplayのグループで、Pantaloneが返事をしているときは、{{group}}はPowers That Be, Maukieになります。キャラクターカードの名前がたまたま{{user}}と一致していても、その一覧からは外れません。

Phonetic name欄には2つの役割があります。1つは音声合成での名前の読み方を決めることです。もう1つは{{charNamePhonetic}}と{{userNamePhonetic}}に値を渡すことです。この欄はCharacter EditorとPersona Editorの両方にあります。

現在のチャットにいないキャラクターを参照するには、カードのIDをコピーし、{{V1StGXR8_Z5jdHi6B-myT}}のように二重の波括弧内へ直接入れます。<や>の文字を含めないでください。Marinaraはマクロをキャラクター名に置き換えます。プロンプトプリセットを使うRoleplayチャットでは、さらに参照カードのDescription、Personality、Appearance、Backstory、Scenario、Example Dialogueをシステムプロンプトへ追加します。それ以外のチャットでは、マクロは名前に置き換わるだけです。チャットメッセージとプロンプト欄で使えるほか、プリセットを使うRoleplayチャットでは起動したロアブックエントリーでも使えます。参照カードの最初の挨拶メッセージは除外します。そのカードに紐づく有効なロアブックには、通常のキーワード、constant、フィルター、確率、トークン予算の規則が適用されます。キャラクターがすでにチャットにいる場合も、マクロはそのキャラクターの名前に置き換わりますが、カードが二重に追加されることはありません。

アクティブなペルソナ以外のペルソナを参照するには、コピーしたIDの先頭にpersona-を付けます。例: {{persona-P1StGXR8_Z5jdHi6B-myT}}。Marinaraはマクロをペルソナ名に置き換え、そのカードのDescription、Personality、Appearance、Backstory、Scenarioを同じID Macro Cardsのコンテキストに追加します。そのペルソナに紐づく有効なロアブックには、通常の起動ルールが適用されます。

Conversation Modeのマクロ

次の4つのマクロはConversation Modeでのみ動きます。他のモードでは常に空になります。同じカードやプリセットのテキストを複数のモードで使い回している場合も同じです。

マクロ展開結果
{{convo_display}}キャラクターのConvo Display Name(Conversationでの表示名)。空のときはカードの名前になります。
{{char_about}}キャラクターの現在のAbout Me(チャットごとの上書きがあればそれ、なければカードのデフォルト)。
{{persona_about}}ペルソナの現在のAbout Me。
{{convo_behavior}}キャラクターのConvo Behaviorのテキスト。ただし挿入位置の設定がこのマクロの場所になっているときだけです。

これらの欄は、Character EditorとPersona EditorのConvoタブで編集します。設定の全体像はConversationモードのプロフィール(表示名、About Me、振る舞い)を参照してください。

Conversationの配置マクロ

Conversation Modeは、いくつかのブロックを自動でプロンプトに挿入します。ここで挙げるマクロを使うと、プリセット側からブロックの位置を移動できます。マクロを置いた場所にそのブロックが出力され、自動挿入のほうは省略されるので、内容が二重になることはありません。各マクロには1つ以上の別名があり、どの別名でも動作は同じです。

マクロ(と別名)配置されるもの
{{context}}, {{status}}Conversationのコンテキスト/状態のブロック。
{{commands}}, {{commandList}}使えるコマンドの案内。
{{reactRules}}, {{emojiReact}}カスタム絵文字のリアクションのルール。
{{replyRules}}カスタム絵文字とスタンプの返信のルール。
{{memories}}, {{memoryRecall}}記憶機能の呼び出しブロック。
{{lorebook}}, {{lore}}ロアブックの挿入内容。

これらはConversation Modeでのみ有効です。キャラクターが1人のConversationでは、参加者の紹介文を{{char_about}}と{{persona_about}}(前述)で自分の好きな位置に置いても同じことが起きます。Marinaraは参加者の「about me」ブロックの自動挿入を省略するので、紹介文が2回入ることはありません。グループのConversationでは自動挿入をそのまま残します。単数形のどちらのマクロも参加者1人分しか出せず、他の全員の紹介文を隠してしまってはいけないからです。

コンテキストのマクロ

次のマクロは、現在のチャットと今回のリクエストの情報を返します。

マクロ展開結果
{{input}}プロンプトから参照できる、直近のユーザーのメッセージ。
{{model}}選択中のモデル名(選ばれている場合)。
{{reasoning}}この返信の生成に使われる推論レベル。low、medium、high、xhigh、maxのいずれか、またはモデルに考えさせない場合はoffです。
{{chatId}}現在のチャットのID。
{{lastGenerationType}}この返信を生成している理由を表すラベル。
{{idle_duration}}最後にチャットが動いてからの経過時間。8 minutesや1 hour 5 minutesのようなテキストです。
{{gameStoryboardKeyframeCount}}Game Modeの現在のKeyframes per Turn(1ターンあたりのキーフレーム数)の目標値。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}}は、組み込みのStoryboard Game Promptを含むGame ModeのGMプロンプトに渡されます。これは物語上の目安であり、その数だけ段落を書けという指示ではありません。ターンの中に視覚的な見せ場が足りないときは、絵コンテのプランナーはこれより少ないカットしか返しません。

{{agent::TYPE}}マクロは、エージェント(シーンのトラッカーなどを裏で埋めてくれる補助役)の保存済み出力を差し込みます。いちばん簡単な追加方法はPreset Editorを使うことです。Add Section(セクションの追加)をクリックし、Agent Sectionsのグループを開いてエージェントを選びます。すると、正しい{{agent::TYPE}}タグがすでに入ったセクションがMarinaraによって作られます。このマクロは最後に展開されるので、エージェントのテキストからプロンプトにさらにマクロを挿入することはできません。

ロアブックのOutletマクロ

{{outlet::name}}は、PositionがOutletで、かつOutlet nameがnameと完全に一致するロアブックのエントリーの内容を差し込みます。Outlet名は大文字と小文字を区別します。たとえば{{outlet::character_rules}}は、Character_Rulesという名前のOutletには一致しません。

Outletのエントリーも、通常どおりロアブックの発動判定を通ります。今回の生成でエントリーが有効になるかどうかは、キーワード、Constantモード、確率、フィルター、タイミング、エントリー数の上限、トークンの予算で決まります。同じOutlet名を持つ有効なエントリーは、Orderの順に改行で区切ってつなげられます。これらはマクロの位置にだけ挿入され、通常のロアブックの位置には追加されません。

Outletマクロは、Conversation、Roleplay、Game Modeのプロンプトのセクションで使えます。プリセットのロアブックのマーカーより前に置いても動きますし、Outletのエントリーしか使わないプリセットならマーカー自体が不要です。存在しないOutletや有効でないOutletは空になります。Outletのエントリーの中から別のOutletマクロを展開することはできないので、入れ子の再帰は起きません。

ロアブックのサイズマクロ

{{lorebooksize::ID}}は指定IDのロアブック内のエントリー総数に展開されます。IDはそのロアブックのIDに置き換えてください。IDはLorebooks(ロアブック)パネルからコピーできます。たとえばIDがV1StGXR8_Z5jdHi6B-myTで151件を含む場合、{{lorebooksize::V1StGXR8_Z5jdHi6B-myT}}は151になります。

不明なIDは0になります。有効、無効、フォルダー内を問わず、すべてのエントリーを数えます。

プロンプトセクション、キャラクターカードの欄、ロアブックエントリー本文など、マクロを展開するどこでも使えます。

ロアブックのインクルードマクロ

{{include::ENTRY}}は、書いた位置にロアブックのエントリーの内容を差し込みます。ハウスルールのような共通の文章を1つのエントリーに書いておき、ほかのエントリー、プロンプトのセクション、カードで使い回せば、編集するのは1か所だけで済みます。ENTRYは、エントリーのIDか名前に置き換えてください。名前は大文字と小文字を区別しません。

{{include::BOOK::ENTRY}}は、IDか名前で指定したロアブックからエントリーを取り出します。そのロアブックは、チャットに追加されている必要はなく、オンになっている必要さえありません。

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

インクルードされるエントリーは発動する必要がなく、オフになっていてもかまいません。そのため、インクルード専用のエントリーを用意しておけます。インクルードされたテキストの中のマクロも通常どおり動き、そこからさらに別のエントリーをインクルードすることもできます。自分自身をインクルードするエントリーのように、インクルードをたどって、すでに展開中のエントリーに戻ってきた場合、そのインクルードは無限に繰り返されずに空になります。見つからないエントリーやロアブックも空になります。

名前とIDはプレーンテキストで書いてください。{{include::{{char}}}}のように中にマクロを書いても展開されません。

時刻のマクロ

現実世界の時刻のマクロは、1回の展開で共通の同じ時点を読み取るため、値が互いにずれることはありません。タイムゾーンはブラウザーから取得します。

マクロ展開結果
{{date}}今日の日付。YYYY-MM-DDの形式です。
{{time}}現在の時刻。24時間制のHH:MMの形式です。
{{datetime}} / {{isotime}}タイムゾーンのオフセットを含む完全なタイムスタンプ。2つの名前は同じ意味です。
{{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}}選択肢を1つランダムに選び、選ばれたものの中だけマクロを展開します。
{{random::A@2::B@0.5}}重み付きのランダム選択。重みの規則は下記のとおりです。
{{roll:XdY}}ダイスロールの合計。たとえば{{roll:2d6}}は6面ダイスを2個振って合計します。{{roll:d20}}はダイスを1個振り、{{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を引き、新しい値を挿入します。

変数は1回のプロンプト構築の中で左から右へ順に展開されます。先に来るロアブックのエントリーなど、早い段階で設定した値は、同じプロンプトのあとのほうで読み出せます。Marinaraは変数を現在のチャットにも保存します。これはSillyTavernのローカル変数と同じ動作で、後のターンやアプリの再起動後も保持されますが、別のチャットにはそのチャット独自の値があります。

組み込みマクロではない{{NAME}}は名前で検索されます。まずプリセット変数、次にチャット自身の変数を調べます。どちらにもその名前がなければ、タグは入力したままの形でテキストに残ります。両方に同じ名前がある場合は、プリセット変数が優先されます。プリセット側の説明はプリセット変数を参照してください。

チャット変数

変数を作るために{{setvar}}を使う必要はありません。Chat Settings(チャット設定)パネルのChat Variables(チャット変数)セクションで名前と値を直接入力すると、自分のメッセージなど、マクロが使える場所でその名前を利用できます。char1にMaryを設定し、{{char1}} walks in.と書くと、AIは「Mary walks in.」と読みます。

チャット変数のルールは次のとおりです。

パネル自体の説明はChat Settingsの概要を参照してください。

書式のマクロ

次のマクロは、周囲のテキストの見た目を整えます。

マクロ動作
{{newline}} / {{\n}}改行を挿入します。
{{trim}}自身を消し、その位置の前後の空白を削ります。
{{trimStart}}周囲のテキストの先頭の空白を削ります。
{{trimEnd}}周囲のテキストの末尾の空白を削ります。
{{uppercase}}...{{/uppercase}}囲んだテキストを大文字にします。
{{lowercase}}...{{/lowercase}}囲んだテキストを小文字にします。
{{noop}}出力から取り除かれます。編集中の無害なプレースホルダーとして使えます。
{{// comment}}出力から取り除かれる、書き手向けのメモ。
{{banned "text"}}出力から取り除かれます。何かをフィルターしたり止めたりはしません。

二重の波括弧をそのまま表示する

マクロにエスケープ文字はありません。二重の波括弧をテキストに残したいときは、Marinaraが知らない名前を使ってください。同じ名前のプリセット変数もチャット変数もないかぎり、未知の{{name}}は入力したままの形で残ります。AIには絶対に届かないメモを書きたいときは、代わりに{{// like this}}を使ってください。

Macro referenceと/macros

マクロが使える欄には、隅に小さなボタンが2つあります。

これらの欄では、マクロ名の入力も補完されます。行末に{{chと入力すると、残りのar}}が薄い文字で表示されます。Tabキーを押すか、薄い文字をタップすると確定します。無視するには、そのまま入力を続けてください。{{getvar::のように値を取るマクロでは、値を入力する位置で補完が止まります。

チャットの入力欄に/macrosと打つこともできます(短い形の/macroでも動きます)。マクロの全一覧がそのままチャットに表示されるので、確認用に便利です。

マクロを使った条件

条件ブロック({{#if ...}})では、||(OR)、&&(AND)、丸括弧を使って複数の比較を組み合わせられます。等値の並びは{{#if character == "Maukie" || "Pantalone"}}のように短く書けます。優先順位、グループチャットでの例、演算子の全一覧は条件付きプロンプトを参照してください。

条件では、場面についてDecisionモデルに尋ねることもできます。たとえば、はい・いいえで答えさせるには{{#if decision:"The latest message moves the scene to a new place"}}、選択肢から1つ選ばせるには{{#if decision_choice:"The kind of scene in the latest message" == "combat"}}を使います。Decisionモデルがない場合や回答がない場合は、いいえとして扱われます。Decisionモデルへの問い合わせを参照してください。文の後ろには、次のオプションを付けられます。

よくある失敗

関連ガイド