Skip to content

setChatInput:チャット入力欄への書き込み

setChatInput はチャット入力欄にテキストを書き込みます。最も典型的な使い方は選択肢型のインタラクションです:コードブロック に選択肢ボタンを並べ、ユーザーがタップするとセリフが入力欄に入り、ユーザーが確認してから送信します。

シグネチャ

ts
type ChatInputMode = 'roleplay' | 'guide'

declare function setChatInput(
  text: string,
  option?: { mode?: ChatInputMode },
): Promise<'roleplay' | 'guide'>

パラメータと挙動

text は入力欄に書き込む完全なテキストです。この操作は対象入力欄の現在の下書きを上書きします——追記ではなく、メッセージの自動送信もしません。送信の判断は常にユーザーの手にあります。

option に指定できるのは任意の mode フィールドだけで、余分なフィールドがあると拒否されます:

mode対象挙動
省略 / roleplayロールプレイ入力欄デフォルト。「ロールプレイ」に切り替えてテキストを書き込む
guide指示入力欄ディープロールプレイが ON のときのみ利用可。「指示」に切り替えてテキストを書き込む
  • 成功すると Promise は実際に使われたモード(roleplay または guide)を返します
  • 一方の入力欄への書き込みが、もう一方の下書きを消すことはありません

注意:指示入力欄はユーザーがディープロールプレイを ON にしているときだけ存在します。OFF の状態で guide を指定すると Guide input requires deep roleplay mode で拒否されます——ユーザーが必ずディープロールプレイを使っているとは限らないため、guide を使うときは必ず失敗時の処理を入れてください(ユーザーへの案内、またはロールプレイ入力欄へのフォールバック。下の例を参照)。

基本例:選択肢ボタン

markdown
```html
<!doctype html>
<html>
  <head>
    <style>
      .choices { display: flex; gap: 8px; }
    </style>
  </head>
  <body>
    <div class="choices">
      <button data-text="ドアを開けて、まず部屋の様子をうかがう。">慎重に入る</button>
      <button data-text="彼女の名前を呼ぶ。">呼びかける</button>
    </div>

    <p id="status" aria-live="polite"></p>

    <script>
      const status = document.querySelector('#status');

      document.querySelectorAll('[data-text]').forEach((button) => {
        button.addEventListener('click', async () => {
          try {
            await setChatInput(button.dataset.text);
            status.textContent = '入力欄に書き込みました';
          } catch (error) {
            status.textContent = error.message;
          }
        });
      });
    </script>
  </body>
</html>
```

指示入力欄を使う

markdown
```html
<!doctype html>
<html>
  <body>
    <button id="guide">指示に書き込む</button>

    <script>
      document.querySelector('#guide').onclick = async () => {
        const text = '場面を夜に移し、緊張感を高めてください。';
        try {
          await setChatInput(text, { mode: 'guide' });
        } catch (error) {
          // ディープロールプレイが OFF だと guide は使えないため、ロールプレイ入力欄にフォールバック
          await setChatInput(text);
        }
      };
    </script>
  </body>
</html>
```

Tavern Helper 互換:triggerSlash と /setinput

既存の Tavern Helper コンテンツをコード変更なしで動かせるよう、コードブロックには互換関数 triggerSlash も注入されています。現在は最もよく使われる /setinput に対応しています:

ts
declare function triggerSlash(command: string): Promise<string>
js
await triggerSlash('/setinput ドアを開けて部屋に入る。');

等価な書き方:

js
await setChatInput('ドアを開けて部屋に入る。');
  • コマンド名は大文字小文字を区別しません
  • 成功時は空文字列を返し、Tavern Helper の呼び出し形式に合わせています
  • /setinput 以外のコマンドはすべて Only the /setinput slash command is supported で拒否されます

新しいコンテンツでは、意味が明確で書き込み先も指定できる setChatInput を優先してください。

機能チェックとエラー処理

呼び出す前に関数の存在を確認し、Promise の reject(検証エラー・操作失敗・10 秒タイムアウト)を処理してください:

js
if (typeof window.setChatInput !== 'function') {
  // この環境では未対応——ボタンを隠すかプレーンテキストにフォールバック
} else {
  try {
    await window.setChatInput('入力する内容');
  } catch (error) {
    console.error(error.message);
  }
}

ヒント

  • 基本例のようにユーザーへ状態表示(書き込み完了 / 失敗理由)を出すと体験がより良くなります
  • すでに /setinput を使っているコンテンツは書き換え不要——triggerSlash がそのまま動きます