インラインのゴーストテキスト補完
ユーザーが入力を止めると、指定した関数に文の続きを問い合わせ、カーソルの後ろに灰色で表示します。Tab で採用し、それ以外のキーで閉じます。エディターには AI モデルが含まれず、独自にネットワーク通信もしません。テキストの取得元は、指定した関数で決めます。

有効にする
この機能は ghostcomplete.js プラグインで提供されます(plugins/all_plugins.js にも含まれます)。ツールバーボタンはありません。ghostText を設定し、ghostTextResolver が関数の場合にのみ動作します。
<link rel="stylesheet" href="/richtexteditor/rte_theme_default.css">
<script src="/richtexteditor/rte.js"></script>
<script src="/richtexteditor/plugins/ghostcomplete.js"></script>
<div id="editor"><p>Our support team answers</p></div>
<script>
var editor = new RichTextEditor("#editor", {
ghostText: true,
ghostTextResolver: function (ctx) {
return fetch("/api/complete", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ before: ctx.before })
})
.then(function (r) { return r.json(); })
.then(function (data) { return data.text; });
}
});
</script>
ここでの /api/complete は、自分で用意するエンドポイントです。カーソルより前のテキストを受け取り、使用するモデルに問い合わせ(API キーはサーバーに保持します)、{ "text": " every ticket within one business day." } を返します。戻り値はそのまま挿入するため、単語の後に続く場合は、返すテキストの先頭に空白を付けてください。
リゾルバーの引数と戻り値
ghostTextResolver(ctx) は、次の情報を受け取ります。
ctx.before:現在の段落(または見出し、リスト項目、セルなど)の先頭からカーソルまでのテキストです。末尾のmaxContext文字に切り詰めます。ctx.after:カーソルからそのブロックの末尾までのテキストです。ctx.full:文書全体のテキストです。
文字列、または文字列を解決値とする Promise を返します。空文字列、文字列以外、例外、拒否された Promise の場合は、何も表示しません。応答が届く前に再入力すると、遅れて届いた応答は破棄します。ctx.before に空白以外の文字が minChars 文字以上あり、選択範囲がない場合にのみ提案を要求します。
オプション
| オプション | 既定値 | 動作 |
|---|---|---|
ghostText | false | true、または以下の 3 つの設定を持つオブジェクトで有効にします。 |
ghostText.delayMs | 600 | 最後の入力からリゾルバーを呼び出すまでの待ち時間です。正の数を指定してください。0 は未設定と扱われ、600 になります。 |
ghostText.minChars | 3 | カーソルの前に必要な、空白以外の文字の最小数です。 |
ghostText.maxContext | 2000 | ctx.before で渡す最大文字数です。 |
ghostTextResolver | null | 上記で説明した独自の関数です。 |
キー操作と API
- Tab で提案を採用します。入力したテキストとして挿入するため、Ctrl+Z を 1 回押すと取り消せます。
- Escape、矢印キー、Home、End、PageUp、PageDown で提案を閉じます。文字を入力しても提案が閉じ、新たに待ち時間が始まります。
- 灰色のテキストをクリックまたはタップすると採用します。Tab キーのないスマートフォンでは、これが唯一の方法です。ほかの場所をクリックすると閉じます。
メソッド:editor.setGhostTextResolver(fn) は実行時にリゾルバーを置き換え、editor.requestGhostText() は待ち時間なしですぐに提案を要求します。editor.acceptGhostText() は採用、editor.dismissGhostText() は破棄、editor.hasGhostText() は提案の有無の確認を行います。スラッシュコマンドのプラグインを読み込むと、「/」メニューの「AI complete」から requestGhostText() を呼び出せます。リゾルバーが未設定の場合は、補完が設定されていないことを示す短い通知がエディターに表示されます。
注意点
- 表示中の提案は、カーソルの後ろに置かれる次の要素です。
<span class="rte-ghost" contenteditable="false" data-rte-ghost="1" aria-hidden="true"> every ticket within one business day.</span>getHTMLCode()、getHTMLContent()、getJSON()はこの要素を削除するため、保存される HTML にはユーザーが採用したテキストだけが含まれます。スクリーンリーダーはaria-hiddenにより読み飛ばします。 - 下部バーの単語数と文字数には、表示中の灰色のテキストも含まれます。
- 入力が止まるたびに、エンドポイントへの呼び出しが 1 回発生します。サーバーでレート制限とキャッシュを行い、呼び出しに費用がかかる場合は
delayMsを長くしてください。 requestGhostText()にもghostTextの設定が必要です。リゾルバーだけでは動作しません。
関連情報:AI Toolkit(コマンドによる AI 操作)、AI プロバイダーとストリーミング、文章作成支援のデモ。