← 全部文档
最新工作流

AI Toolkit

Ask AI、AI Chat、内联预览和 AI Review 抽屉——全部基于同一个 aiToolkitResolver 钩子构建,因此您今天可以使用内置的演示解析器,明天再换成自己的后端,而无需改动界面。

概述

AI Toolkit 为编辑器添加了三个相互关联的界面:

  • Ask AI——从工具栏启动的对话框,提供七种一键模式(校对、改写、缩短、扩写、总结、翻译、说明理由),可在选区/文档范围之间切换,并在应用之前进行内联预览。
  • AI Chat——一个用于多轮请求的停靠式侧边面板。能感知作用范围,提供快捷提示,每条 AI 回复都带有复制/应用/插入/替换操作。
  • AI Review——一个持久化的队列,存放待处理、已接受和已拒绝的建议。可选择与服务器台账同步,实现跨会话审阅。

这三者共用同一个 aiToolkitResolver 钩子和同一套操作约定,因此在一个界面中预览的建议,可以在另一个界面中被接受、拒绝或进一步处理。

演示模式。未配置解析器时,插件附带一个确定性的 defaultResolveAction,因此无需 API 密钥、无需网络调用,就能在本地运行 Ask AI、Chat 和 Review,并得到可预测的输出。

安装

在核心编辑器包之后加载 AI Toolkit 的样式表和脚本。默认情况下,插件加载时会自动在内置的 default、basic、full 和 mobile 工具栏预设中注入一个 Ask AI 按钮。

<link rel="stylesheet" href="/richtexteditor/rte_theme_default.css" />
<link rel="stylesheet" href="/richtexteditor/plugins/aitoolkit.css" />

<script src="/richtexteditor/rte.js"></script>
<script src="/richtexteditor/plugins/all_plugins.js"></script>
<!-- aitoolkit.js is bundled inside all_plugins.js.
     Include it separately only if you are loading plugins piecemeal. -->

<div id="editor"></div>
<script>
  var editor = new RichTextEditor("#editor", {
    toolbar: "full",
    aiToolkitPersistenceKey: "my-editor-ai"
  });
</script>

配置。您下载的 rte.js 顶部有一个以纯文本形式编写、可以编辑的 RTE_DefaultConfig 块——打开它,就能与其他所有编辑器设置一起修改 AI 默认值(持久化键、标签、解析器端点等)。不需要另外加载配置文件。只要 AI 按钮可能被渲染(即使使用默认工具栏),就必须有 aitoolkit.css,否则 AI 下拉菜单的尺寸会不正确。如果想保持 AI 启用但不自动注入按钮,请设置 aiToolkitAutoToolbarButtons: false,然后只在需要的工具栏中添加 aiassist。

var editor = new RichTextEditor("#editor", {
  toolbar: "default",
  aiToolkitAutoToolbarButtons: false
});

三个界面

Ask AI

以工具栏为入口的对话框。包含原文和结果窗格、模式选择器、范围切换、前后对比预览、操作计划,以及应用/替换/插入/拒绝按钮。

AI Chat

停靠式面板。能感知范围的消息、快捷提示、消息历史,以及每条回复的应用/插入/替换操作。

AI Review

持久化抽屉。待处理/已接受/已拒绝队列、批量控制,以及可选的远程台账同步。

内置模式

每种模式都是 config.aiToolkitDialogModes 中的一个 { id, title, description } 条目。它们出现在 Ask AI 对话框的 Action 下拉菜单中,也可以通过 runQuickAction(id) 调用。

id标题默认行为
proofreadProofread规范空格、标点和大小写,同时保留原意。
rewriteRewrite删除赘语(very、really、in order to、due to the fact that),使措辞更紧凑。
shortenShorten保留前约 60% 的词,至少 8 个。
expandExpand在原文下方追加一句补充说明。
summarizeSummarize根据前约 45% 的词生成一份要点摘要。
translateTranslate生成一份标有语言的草稿;目标语言以 request.language 传入。
justifyJustify edit与改写相同,另加一个解释更改原因的 reason 字段。

这些是演示解析器中的确定性桩实现。一旦接入 aiToolkitResolver,每种模式如何处理就由您的函数决定。您还可以注册新的模式——请参阅自定义操作。

aiToolkitResolver 钩子

这是唯一的扩展点。解析器接收一个结构化的请求,返回一个结果(或者一个解析为结果的 Promise)。渲染、预览、审阅和应用都由编辑器处理。

var editor = new RichTextEditor("#editor", {
  toolbar: "full",
  aiToolkitResolver: async function (request) {
    var reply = await fetch("/api/ai", {
      method: "POST",
      body: JSON.stringify({
        mode: request.mode,
        text: request.source,
        language: request.language
      })
    }).then(function (r) { return r.json(); });

    return {
      result: reply.text,             // string: the AI output
      reason: reply.explanation,      // string: why this change
      operations: [{                  // structured plan (optional)
        type: "preview-suggestion",
        text: reply.text,
        reason: reply.explanation
      }]
    };
  }
});

请求结构

字段类型含义
actionIdstring用户调用的操作(与已注册的操作或模式 id 对应)。
modestring对话框模式——proofread、rewrite、translate 等。
sourcestring要处理的文本。有选区时为选区文本;否则为整个文档的文本。
promptstring用户的提示词文本(用于聊天模式)。
languagestring翻译模式的目标语言。其他模式为空。
scopestring"selection" 或 "document"。
selectionTextstring选区文本(可能为空)。
documentTextstring整个文档的文本。
snapshotobject选区快照(hasSelection、rangeHTML、text、wholeText 等)。
editorRichTextEditor编辑器实例。
contractobject受支持的操作类型的完整列表(用于验证)。

响应结构

返回一个包含以下任意字段的普通对象。所有字段都是可选的;不需要的可以省略。

字段类型含义
resultstringAI 的原始输出。显示在结果窗格中,并作为默认的建议正文。
reasonstringAI 推荐这项更改的理由。显示在 “Why this suggestion” 面板中。
messagestring聊天式的回复(仅用于 AI Chat 界面)。
operationsOperation[]结构化的计划——请参阅操作类型。
targetstring应用到哪里——"selection-preview"、"document"、"insert" 等。
autoRunboolean无需用户确认即自动应用(请谨慎使用)。

也可以返回一个字符串或一个 Promise。字符串会变成 { result: <that string> };Promise 会被等待。

操作类型

操作是解析器可以返回的结构化计划。编辑器会按顺序执行它们(或者由用户在计划面板中逐个执行)。

type字段作用
preview-suggestiontext、reason?显示内联的前后对比预览。由用户接受或拒绝。
replace-selectiontext用给定的文本替换当前选区。
replace-documenttext替换整个文档正文。
insert-belowtext在光标或选区之后插入一个新块。
add-commenttext、reason?在当前选区上添加一个不修改内容的 AI 批注标记。
open-chat-panelmessage?打开 AI Chat 面板;可选择预填一条消息。
open-review-panel-打开 AI Review 抽屉。

可以用 editor.aiToolkit.registerOperationHandler(type, handler) 注册自定义操作类型。

editor.aiToolkit.registerOperationHandler("insert-callout", function (op, ctx) {
  // ctx = { snapshot, resolved, request, action, editor }
  ctx.editor.insertHTML(
    '<aside class="callout">' + ctx.editor.htmlEncode(op.text) + '</aside>'
  );
  return true; // mark the operation as handled
});

编程 API

所有界面都可以通过 editor.aiToolkit 从代码中打开和控制。

// Open the Ask AI dialog
editor.aiToolkit.openDialog({ presetMode: "rewrite", autoRun: false });

// Quick actions (no dialog) - target: selection if present, else whole document
editor.aiToolkit.runQuickAction("proofread");
editor.aiToolkit.runQuickAction("translate", { language: "spanish" });

// Panels
editor.aiToolkit.openChatPanel({ focusComposer: true });
editor.aiToolkit.openReviewPanel({ focusPanel: true });
editor.aiToolkit.closeChatPanel();
editor.aiToolkit.closeReviewPanel();
editor.aiToolkit.toggleChatPanel();
editor.aiToolkit.toggleReviewPanel();

// Resolve without rendering - useful for tests + headless flows
editor.aiToolkit.resolveAction("rewrite", { source: "hello world" })
  .then(function (resolved) { console.log(resolved.result); });

// Swap the resolver at runtime
editor.aiToolkit.setResolver(myResolver);

// Review queue
var pending = editor.aiToolkit.getSuggestions();
editor.aiToolkit.clearSuggestions();
editor.aiToolkit.saveSuggestionLedger();
editor.aiToolkit.loadSuggestionLedger();

自定义操作和模式

注册面向特定领域的操作(例如 SEO 改写、法律条款检查、语气匹配)。它们会接入同一套对话框、聊天和审阅界面。

// Add a new dialog mode (appears in the Action dropdown)
editor.aiToolkit.registerDialogMode({
  id: "seo",
  title: "SEO rewrite",
  description: "Rewrite for stronger keyword coverage while preserving meaning."
});

// Register the action with a target (where output goes by default)
editor.aiToolkit.registerAction({
  id: "seo",
  title: "SEO rewrite",
  target: "selection-preview",
  resolverMode: "seo"          // passed as request.mode to your resolver
});

// Your resolver handles it just like built-in modes
config.aiToolkitResolver = function (request) {
  if (request.mode === "seo") { /* call your SEO service */ }
  /* ... */
};

持久化与远程台账

AI Review 抽屉中的建议会以您控制的键持久化到 localStorage。设置 aiToolkitPersistenceKey,可以按编辑器实例(例如按文档)划分作用范围。

new RichTextEditor("#editor", {
  aiToolkitPersistenceKey: "doc-42-review",     // localStorage scope
  aiToolkitSuggestionLedgerUrl: "/api/ai/ledger", // optional GET/POST for cross-session sync
  aiToolkitReviewLogUrl: "/api/ai/review-log",    // optional activity feed endpoint
  aiToolkitReviewSyncInterval: 15000               // ms between sync polls (default 15s)
});

设置了台账 URL 后,插件会在打开时发送 GET,在接受/拒绝时发送 POST,使审阅队列能够跨会话保留,并在审阅人之间共享。

BYOK(自带密钥)

重要:编辑器不接受也不存储 API 密钥。密钥应保存在服务器端的密钥管理系统中。

推荐的 BYOK 模式:

  1. 您的管理界面让租户选择服务商并粘贴密钥。表单 POST 到您的后端。
  2. 您的后端把密钥写入密钥管理系统,按租户划分作用范围。
  3. 编辑器的 aiToolkitResolver 带着会话 Cookie POST 到 /api/ai。浏览器中没有密钥。
  4. 您的后端查找该租户的密钥,调用服务商,并返回精简后的响应。

可用的管理表单、带路由的解析器和 Express 风格的服务器草图,请参阅 BYOK 演示。

配置参考

选项类型默认值用途
aiToolkitEnabledbooleantrue设置为 false 可完全禁用该插件(不注入按钮,不提供 API)。
aiToolkitAutoToolbarButtonsbooleantrue控制是否自动在内置工具栏和文本选区浮动工具栏中注入 AI 按钮。设置为 false 后,AI 仍可从代码中使用,而 aiassist 的位置由您自己管理。
aiToolkitResolverfunctionnull您的钩子——请参阅解析器。未设置时退回到内置的演示解析器。
aiToolkitActionsAction[]内置操作已注册操作的完整列表。使用 registerAction 进行扩展。
aiToolkitDialogModesMode[]7 种内置模式Ask AI 下拉菜单中显示的模式。
aiToolkitOperationHandlersobject{}自定义操作类型的处理程序,以 type 为键。
aiToolkitPersistenceKeystring""审阅队列在 localStorage 中的作用范围。为空 = 不持久化。
aiToolkitSuggestionLedgerUrlstring""用于共享台账同步的服务器端点。
aiToolkitReviewLogUrlstring""用于审阅活动记录的服务器端点。
aiToolkitReviewSyncIntervalnumber15000两次轮询台账之间的毫秒数。
aiToolkitLabelstring"Current editor"Ask AI 对话框中元信息标签上显示的文字。
text_aiassiststring"Ask AI"工具提示和对话框标题(可按界面语言本地化)。

试用

上面的每个界面都可以在公开演示中无需 API 密钥运行: