内联灰色文本补全
当用户停止输入时,编辑器会向您提供的函数请求句子的续写,并以灰色显示在光标之后。按 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,或者包含下面三项设置的对象,即可开启该功能。 |
ghostText.delayMs | 600 | 最后一次输入之后、调用解析器之前的停顿时间。请使用正数:0 会被视为未设置,结果为 600。 |
ghostText.minChars | 3 | 光标之前最少的非空格字符数。 |
ghostText.maxContext | 2000 | ctx.before 中最多传入的字符数。 |
ghostTextResolver | null | 您的函数,如上所述。 |
按键与 API
- Tab 接受建议。它会作为输入的文本插入,因此按一次 Ctrl+Z 即可再次删除。
- Escape、方向键、Home、End、PageUp 和 PageDown 会取消建议。输入任何字符都会取消建议并开始新一轮等待。
- 点击或轻触灰色文本会接受它(在没有 Tab 键的手机上,这是唯一的方式)。点击其他任何地方会取消它。
方法:editor.setGhostTextResolver(fn) 在运行时替换解析器;editor.requestGhostText() 立即请求建议,无需等待;editor.acceptGhostText()、editor.dismissGhostText() 和 editor.hasGhostText() 的作用如其名称所示。加载了斜杠命令插件时,"/" 菜单中有一个调用 requestGhostText() 的 "AI complete" 条目。如果没有设置解析器,这个调用会在编辑器中显示一条简短的提示,说明尚未配置补全。
注意事项
- 建议显示期间,它是光标之后的这样一个元素:
<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)。 - 灰色文本显示期间,底栏中的字数和字符数统计会把它包括在内。
- 每次输入停顿都会对您的端点发起一次调用。请在服务器上进行速率限制和缓存;如果调用会产生费用,请提高
delayMs。 requestGhostText()同样需要设置ghostText;只有解析器时它什么也不做。
相关内容:AI Toolkit(由命令驱动的 AI 操作)、AI 服务商与流式输出、写作辅助演示。