カスタムエージェントの作成

カスタムエージェントとは、自分で書くヘルパーです。指示の内容、動くタイミング、変更してよいものを自分で決めます。やりたいことをこなすダウンロードできるエージェントがないときに作ってください。インストール済みのエージェントに近いものがあれば、Agents(エージェント)パネルでそのカードにマウスを合わせ、Copy agent(エージェントをコピー)をクリックすると、編集できるコピーが作られます。

始める前に: エージェント: チャットを支えるAIヘルパーを読んでください。エージェントは作っただけでは動きません。作ったあとでチャットに追加します。カスタムエージェントは、どのチャットモードでも動きます。

カスタムエージェントの作り方

  1. Agentsパネルを開きます。
  2. 上部にあるNew(新規)ボタン(プラスアイコン)をクリックします。全画面のエージェントエディターが開きます。
  3. タイトル欄に名前を入力します。たとえばWeather Reporterのようにします。
  4. Description(説明)とAuthor(作者)を記入します。
  5. Pipeline Phase(実行フェーズ)を選びます(Pipeline Phaseを参照)。
  6. Custom Agent Abilities(カスタムエージェントの権限)で、エージェントに必要な権限をオンにします。
  7. エージェントが出力する内容に合うResult Type(結果の種類)を選びます。迷ったらContext Injectionを選んでください。権限も、厳密な出力形式も必要ありません。
  8. Prompt Template(プロンプトテンプレート)に、エージェントへの指示を書きます。
  9. 上部バーのSave(保存)をクリックします。緑色のSavedバッジが表示されます。

作成したエージェントは、AgentsパネルのCustom Agents(カスタムエージェント)セクションに表示されます。使うときは、チャットを開いてChat Settings(チャット設定)に移動し、Enable Agents(エージェントを有効にする)をオンにしてから、Custom Agentsでエージェントを追加します。

Pipeline Phase

Pipeline Phaseは、エージェントが動くタイミングを決めます。

結果の種類によっては、フェーズが固定されます。Text Rewriteを選ぶと、フェーズはPost-Processingに切り替わります。Prompt PatchとCharacter Activityを選ぶと、フェーズはPre-Generationに切り替わります。

Post-Processingのエージェントには、Turn Data Access(ターンデータへのアクセス)セクションも表示されます。ここにはPre-generation injectionsとParallel agent resultsという2つのトグルがあります。オンにすると、同じターンで他のエージェントが生成した内容をエージェントが読めるようになります。

Custom Agent Abilities

権限は、明示的にオンにしたときだけ使える機能です。どの権限も、トグルをオンにするまではブロックされたままです。

Edit lorebooksをオンにすると、Lorebook Writer(ロアブックへの書き込み)セクションが表示されます。Allow lorebook entry writesをオンにして、Target lorebookでロアブックを1つ選びます。エージェントが書き込めるのは、そのロアブックだけです。

Result Type

Result Typeは、エージェントの回答をMarinaraがどう読み取るかを決めます。ほとんどの種類はJSONを前提にしています。JSONは、波括弧と引用符で書くテキスト形式です。種類は、必要な権限をオンにするまでグレーアウトしたままです。

権限が不要な種類:

Edit messagesが必要な種類:

Edit trackersが必要な種類:

それぞれ専用の権限が必要なその他の種類:

チャット内での画像エージェントのコントロール

Image generationの権限を持つエージェントには、Chat Settings → Agents → Custom Agents(チャット設定 → エージェント → カスタムエージェント)に2つのコントロールが追加されます。

Activation Keywords

デフォルトでは、エージェントは通常の周期(どのくらいの頻度で動くか)で動きます。Activation Keywords(起動キーワード)を設定すると、場面に関係がないときはエージェントを動かさないため、トークンを節約できます。

  1. Activation Keywordsに、tavernやsecret doorのようなキーワードやフレーズを、1行に1つずつ入力します。
  2. Scan Depth(検索する深さ)に、検索する直近のメッセージ数を設定します。デフォルトは5、最大は200です。

これで、それらのメッセージにキーワードが現れたときだけ、エージェントが動きます。欄を空にすると、このフィルターは無効になります。周期と、設定した起動質問は引き続き適用されます。

ツールの追加

エージェントはツールを呼び出せます。ツールとは、AIが実行して何かを取得したり変更したりし、その結果を読み取る関数のことです。function calling(関数呼び出し)とも呼ばれます。

  1. エージェントエディターでTools / Function Callingを開き、使いたいツールをそれぞれオンにします。一覧には、組み込みのツールと自作のツールが並びます。ツールの作り方はカスタムツールを参照してください。
  2. Chat SettingsでFunction Callingを開き、Enable Tool Use(ツールの使用を有効にする)をオンにします。これがオフのままだと、エージェントのツールは使えません。

インポートしたエージェントには、ツールの利用権限が付きません。インポートしたエージェントを確認してから、使わせるツールを自分で選んでください。

エージェントは1回の実行で、最大16ラウンドまでツールを呼び出せます(サーバーのMAX_TOOL_ROUNDSのほうが小さい場合は、それより少なくなります)。その後は、手元の情報で回答します。一度に1つのツールしか呼ばないモデルは呼び出しごとに1ラウンドを使うため、多くのエントリーを保存するエージェントは、1回の応答で複数の呼び出しを行うようにしてください。ロアブックのバックフィルの実行では、最大64ラウンドまで使えます。

Named prompt options

1つのエージェントに、複数のプロンプトの候補を持たせられます。チャットごとに、エージェントを編集しなくても候補を1つ選べます。

  1. Prompt Templateの下にあるNamed prompt options(名前付きプロンプト)を探します。
  2. Add option(候補の追加)をクリックします。
  3. 名前と短い説明を付け、その候補で使うプロンプト本文を最後まで書きます。

このエージェントをチャットに追加すると、Prompt Mode(プロンプトモード)ドロップダウンに候補が並びます。候補がなければ、デフォルトのプロンプトだけが表示されます。

その他の設定

Prompt Templateでは、{{user}}や{{char}}などのマクロが使えます。マクロを参照してください。

作例

このエージェントは、返信をすべてイギリス英語に書き換えます。

  1. 名前をBritish English Editorにします。
  2. Custom Agent AbilitiesでEdit messagesをオンにします。
  3. Result TypeでText Rewriteを選びます。フェーズはPost-Processingに切り替わります。
  4. Prompt Templateに次の内容を貼り付けます。
   You are a copy editor. Rewrite the latest reply into British English.
   Change spelling and vocabulary only. Do not change the meaning, tone, or events.
   Return JSON with an "editedText" field holding the full rewritten reply,
   and a "changes" array of short notes describing what you changed.
  1. Saveをクリックします。
  2. Roleplayのチャットを開き、Chat SettingsでEnable Agentsをオンにして、Custom Agentsからエージェントを追加します。

返信のたびに、エージェントは次のようなJSONを返します。

{"editedText":"The colour of the harbour caught her eye.","changes":[{"description":"color to colour, harbor to harbour"}]}

MarinaraはeditedTextを返信と差し替えます。changesのメモは、短い要約として表示されます。

エージェントのインポートとエクスポート

1つのエージェントをエクスポートするには、エディターの上部バーにあるExport agent(エージェントのエクスポート)ボタン(アップロードアイコン)をクリックします。ファイルにはエージェントのプロンプトと設定が入り、カスタムツールの定義は含まれません。複数をエクスポートするには、AgentsパネルのSelect agents(エージェントの選択)を使い、対象を選んでエクスポートします。

外部からのインポートは、デフォルトでロックされています。

  1. Settings → Advanced → Danger Zone(設定 → 詳細設定 → 危険な操作)を開き、Allow custom Agent imports(カスタムエージェントのインポートを許可)をオンにします。.envの変更は必要ありません。
  2. AgentsパネルでImport agents(エージェントのインポート)をクリックし、エージェントのファイルかフォルダーを選びます。
  3. Marinaraが表示する権限の一覧を確認します。承認するのは、そのエージェントに必要なものだけにしてください。チェックしていない機能は、ブロックされたままです。

このロックが影響するのは、ファイル、フォルダー、カスタムリポジトリーから取り込むエージェントだけです。自分で作ったエージェントと、Agent Organizerの公式エージェントは通常どおり動きます。インポートしたファイルには毎回新しいカスタムの識別子が割り当てられるため、公式エージェントを置き換えることはできません。

安全のため、Marinaraは同梱された関数を無視し、ツールの選択を消去し、一時的なCSSを無害化します。さらに、インポートしたエージェントがメッセージ、トラッカー、ロアブック、背景、スプライト、メディア、ハプティクス、About Meのデータ、プロンプト、画像を変更する前に、承認済みの機能かどうかを確認します。信頼できる関数は別途インポートして内容を確認し、自分でエージェントに紐付けてください。Danger Zoneのトグルをオフにすると、インポートしたエージェントは動かなくなります。

起動質問

起動質問は、直近の場面でこのエージェントが必要かどうかを尋ねます。キーワードでは拾えない言い換えも捉えられます。起動質問にはDecision model(判定モデル)が必要です。これは、はいかいいえで答える質問に回答する小型のモデルです。Connectionsパネルで1つ選んでください。Decisionモデルを参照してください。Decision modelがデフォルトのNone(なし)のままだと、質問の欄は無効のままで、質問があるエージェントも質問がない場合と同じように動きます。

  1. カスタムエージェントを開きます。
  2. 最大500文字のQuestion(質問)を入力します。マクロの{{user}}と{{char}}も使えます。
  3. Run when probability is at least(実行に必要な最小確率)に、このエージェントのしきい値を設定します。「はい」の確率がこの値以上のときにエージェントが動くため、値を高くするほど実行を省く回数が増えます。エディターには、使っているモデルに合わせた推奨値が表示されます。ローカルのチャットモデルとDecisionアカウントでは0.5、組み込みのOpen-Jevモデルでは0.1です。モデルを切り替えたら、自分のチャットで値を確認してください。しきい値を参照してください。
  4. 任意: Bypass the question after this many messages without a successful run(指定メッセージ数の間に実行が成功しなければ質問を省略)を設定します。その数のメッセージが進むと質問が省略されるため、「いいえ」と答え続けるモデルがエージェントをずっと止めてしまうことはありません。キーワードと周期は引き続き適用されます。

質問は、The latest message moves the scene to a new place.のように、最新のメッセージについて述べる文として書いてください。小型のモデルは、Did the scene change?よりもこちらのほうが安定して答えました。判定文の書き方を参照してください。

動作の仕組み:

起動質問が使えるのは、カスタムエージェントだけです。

エージェントのプロンプト内の判定文

起動質問は、エージェントが動くかどうかを決めます。Prompt Template内の判定文は、動いているエージェントに何を伝えるかを決めます。構文は条件付きプロンプトで説明しています。

{{#if decision:"In the latest message, the characters move to a different location"}}
Update the location field.
{{else}}
Leave the location as it is.
{{/if}}

判定文を使うと、動きの少ないターンには小さなプロンプトを送れます。トラッカーは、場所が変わったときだけ場所を更新できます。画像エージェントは、場面が変わったときだけ新しい絵を記述できます。音楽エージェントは、雰囲気が変わったときだけ曲を変えられます。複数の指示セットから1つを選ぶには、{{#if decision_choice:"The kind of scene in the latest message" == "combat"}}、続いて{{else if decision_choice:"The kind of scene in the latest message" == "dialogue"}}のように書いていきます。条件付きプロンプトを参照してください。

Marinara-Agentsからインストールしたエージェントも、同じ方法でプロンプトを処理します。

関連ガイド