AI Toolkit
Ask AI, AI Chat, Vorschau im Text und eine Seitenleiste AI Review – aufgebaut auf einem einzigen Hook aiToolkitResolver, sodass Sie heute den eingebauten Demo-Resolver verwenden und morgen Ihr eigenes Backend einsetzen können, ohne die Oberfläche zu ändern.
Überblick
Das AI Toolkit fügt dem Editor drei zusammengehörige Oberflächen hinzu:
- Ask AI – ein aus der Symbolleiste geöffneter Dialog mit sieben Modi per Klick (Korrekturlesen, Umformulieren, Kürzen, Erweitern, Zusammenfassen, Übersetzen, Begründen), einem Umschalter für den Bereich Auswahl/Dokument und einer Vorschau im Text vor dem Anwenden.
- AI Chat – ein angedockter Seitenbereich für Anfragen über mehrere Runden. Berücksichtigt den Bereich, mit Schnell-Prompts und Aktionen zum Kopieren, Anwenden, Einfügen und Ersetzen bei jeder KI-Antwort.
- AI Review – eine dauerhafte Warteschlange offener, angenommener und abgelehnter Vorschläge. Optionale Synchronisierung mit einem Ledger auf dem Server für Reviews über Sitzungen hinweg.
Alle drei teilen denselben Hook aiToolkitResolver und denselben Vertrag für Operationen, sodass ein in einer Oberfläche als Vorschau gezeigter Vorschlag in einer anderen angenommen, abgelehnt oder weitergereicht werden kann.
Demomodus. Ist kein Resolver konfiguriert, bringt das Plugin eine deterministische defaultResolveAction mit, sodass Sie Ask AI, Chat und Review lokal ohne API-Schlüssel, ohne Netzwerkaufruf und mit vorhersagbarer Ausgabe ausführen können.
Installation
Laden Sie Stylesheet und Skript des AI Toolkit nach dem Kern-Bundle des Editors. Standardmäßig fügt das Plugin beim Laden automatisch eine Schaltfläche Ask AI in die mitgelieferten Symbolleisten-Vorgaben default, basic, full und mobile ein.
<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>Konfiguration. Ihre heruntergeladene rte.js enthält oben einen bearbeitbaren Block RTE_DefaultConfig im Klartext – öffnen Sie ihn und ändern Sie die KI-Standardwerte (Persistenzschlüssel, Beschriftung, Resolver-Endpoint usw.) neben allen anderen Editor-Einstellungen. Es muss keine separate Konfigurationsdatei geladen werden. aitoolkit.css muss immer vorhanden sein, wenn die KI-Schaltfläche erscheinen kann (auch mit der Standard-Symbolleiste), sonst hat das Dropdown-Menü der KI eine falsche Größe. Um die KI aktiviert zu lassen, aber das automatische Einfügen der Schaltfläche zu unterbinden, setzen Sie aiToolkitAutoToolbarButtons: false und fügen aiassist dann nur den Symbolleisten hinzu, in denen Sie es haben wollen.
var editor = new RichTextEditor("#editor", {
toolbar: "default",
aiToolkitAutoToolbarButtons: false
});Drei Oberflächen
Dialog aus der Symbolleiste. Bereiche für Quelle und Ergebnis, Modusauswahl, Umschalter für den Bereich, Vorher/Nachher-Vorschau, Operationsplan, Schaltflächen zum Anwenden, Ersetzen, Einfügen und Ablehnen.
Angedocktes Panel. Nachrichten mit Bezug zum Bereich, Schnell-Prompts, Nachrichtenverlauf und Aktionen zum Anwenden, Einfügen und Ersetzen pro Antwort.
Dauerhafte Seitenleiste. Warteschlange für offene, angenommene und abgelehnte Vorschläge, Steuerelemente für Stapelaktionen und optionale Synchronisierung mit einem entfernten Ledger.
Eingebaute Modi
Jeder Modus ist ein Eintrag { id, title, description } in config.aiToolkitDialogModes. Die Modi erscheinen im Dropdown Action des Dialogs Ask AI und lassen sich über runQuickAction(id) aufrufen.
| id | Titel | Standardverhalten |
|---|---|---|
proofread | Proofread | Vereinheitlicht Abstände, Satzzeichen und Großschreibung, ohne die Bedeutung zu ändern. |
rewrite | Rewrite | Entfernt Füllwörter (very, really, in order to, due to the fact that) und strafft die Formulierung. |
shorten | Shorten | Behält die ersten ~60% der Wörter, mindestens 8. |
expand | Expand | Hängt unter der Quelle einen ergänzenden Satz an. |
summarize | Summarize | Erstellt aus den ersten ~45% der Wörter eine Zusammenfassung in Stichpunkten. |
translate | Translate | Erzeugt einen mit der Sprache gekennzeichneten Entwurf; die Zielsprache wird als request.language übergeben. |
justify | Justify edit | Wie rewrite, plus ein Feld reason, das die Änderung erklärt. |
Das sind deterministische Platzhalter für den Demo-Resolver. Sobald Sie aiToolkitResolver anbinden, entscheidet Ihre Funktion, wie jeder Modus behandelt wird. Sie können auch neue Modi registrieren – siehe Eigene Aktionen.
Der Hook aiToolkitResolver
Das ist der Erweiterungspunkt. Der Resolver erhält einen strukturierten Request und gibt ein Ergebnis zurück (oder ein Promise, das zu einem Ergebnis aufgelöst wird). Der Editor übernimmt Darstellung, Vorschau, Review und Anwenden.
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
}]
};
}
});Aufbau des Requests
| Feld | Typ | Bedeutung |
|---|---|---|
actionId | string | Die vom Benutzer aufgerufene Aktion (entspricht einer registrierten Aktion oder einer Modus-ID). |
mode | string | Dialogmodus – proofread, rewrite, translate usw. |
source | string | Der zu bearbeitende Text. Der ausgewählte Text, falls vorhanden; sonst der Text des ganzen Dokuments. |
prompt | string | Prompt-Text des Benutzers (für den Chatmodus). |
language | string | Zielsprache für den Übersetzungsmodus. Bei anderen leer. |
scope | string | "selection" oder "document". |
selectionText | string | Ausgewählter Text (kann leer sein). |
documentText | string | Text des ganzen Dokuments. |
snapshot | object | Snapshot der Auswahl (hasSelection, rangeHTML, text, wholeText, ...). |
editor | RichTextEditor | Die Editor-Instanz. |
contract | object | Vollständige Liste der unterstützten Operationstypen (für die Validierung). |
Aufbau der Antwort
Geben Sie ein einfaches Objekt mit beliebigen der folgenden Felder zurück. Alle sind optional; lassen Sie weg, was Sie nicht brauchen.
| Feld | Typ | Bedeutung |
|---|---|---|
result | string | Rohe KI-Ausgabe. Wird im Ergebnisbereich angezeigt und als Standardtext des Vorschlags verwendet. |
reason | string | Warum die KI diese Änderung empfiehlt. Erscheint im Bereich „Why this suggestion“. |
message | string | Antwort im Chat-Stil (nur in AI Chat). |
operations | Operation[] | Strukturierter Plan – siehe Operationstypen. |
target | string | Wo angewendet wird – "selection-preview", "document", "insert" usw. |
autoRun | boolean | Ohne Bestätigung durch den Benutzer automatisch anwenden (sparsam verwenden). |
Sie können auch einen String oder ein Promise zurückgeben. Ein String wird zu { result: <that string> }; auf ein Promise wird gewartet.
Operationstypen
Operationen sind der strukturierte Plan, den Ihr Resolver zurückgeben kann. Der Editor führt sie der Reihe nach aus (oder vom Benutzer gesteuert, einzeln, aus dem Planbereich).
| type | Felder | Was sie tut |
|---|---|---|
preview-suggestion | text, reason? | Zeigt eine Vorher/Nachher-Vorschau im Text. Der Benutzer nimmt an oder lehnt ab. |
replace-selection | text | Ersetzt die aktuelle Auswahl durch den angegebenen Text. |
replace-document | text | Ersetzt den gesamten Inhalt des Dokuments. |
insert-below | text | Fügt nach dem Cursor oder der Auswahl einen neuen Block ein. |
add-comment | text, reason? | Setzt eine nicht destruktive KI-Kommentarmarkierung auf die aktuelle Auswahl. |
open-chat-panel | message? | Öffnet das Panel AI Chat; optional mit einer vorgegebenen Nachricht. |
open-review-panel | - | Öffnet die Seitenleiste AI Review. |
Eigene Operationstypen lassen sich mit editor.aiToolkit.registerOperationHandler(type, handler) registrieren.
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 für den Code
Alle Oberflächen lassen sich über editor.aiToolkit aus dem Code öffnen und steuern.
// 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();Eigene Aktionen & Modi
Registrieren Sie fachspezifische Aktionen (z. B. Umformulieren für SEO, Prüfung juristischer Klauseln, Anpassung an einen Tonfall). Sie fügen sich in dieselbe Oberfläche aus Dialog, Chat und Review ein.
// 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 */ }
/* ... */
};Persistenz & entferntes Ledger
Vorschläge in der Seitenleiste AI Review werden unter einem Schlüssel, den Sie festlegen, in localStorage gespeichert. Setzen Sie aiToolkitPersistenceKey, um sie auf eine Editor-Instanz zu beschränken (z. B. pro Dokument).
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)
});Ist die Ledger-URL gesetzt, sendet das Plugin beim Öffnen ein GET und beim Annehmen oder Ablehnen ein POST, sodass die Review-Warteschlange Sitzungen überdauert und zwischen Prüfern geteilt werden kann.
BYOK (Bring Your Own Key)
Wichtig: Der Editor nimmt keine API-Schlüssel an und speichert keine. Schlüssel gehören in Ihren serverseitigen Secrets Manager.
Das empfohlene Muster für BYOK:
- In Ihrer Admin-Oberfläche wählt ein Mandant einen Anbieter und fügt einen Schlüssel ein. Das Formular sendet per POST an Ihr Backend.
- Ihr Backend schreibt den Schlüssel, dem Mandanten zugeordnet, in Ihren Secrets Manager.
- Der
aiToolkitResolverdes Editors sendet per POST mit dem Session-Cookie an/api/ai. Kein Schlüssel im Browser. - Ihr Backend sucht den Schlüssel des Mandanten heraus, ruft den Anbieter auf und gibt eine gekürzte Antwort zurück.
Ein funktionierendes Admin-Formular, einen weiterleitenden Resolver und eine Serverskizze im Stil von Express zeigt die BYOK-Demo.
Konfigurationsreferenz
| Option | Typ | Standardwert | Zweck |
|---|---|---|---|
aiToolkitEnabled | boolean | true | Auf false setzen, um das Plugin vollständig zu deaktivieren (keine Schaltfläche, keine API). |
aiToolkitAutoToolbarButtons | boolean | true | Steuert das automatische Einfügen der KI-Schaltfläche in die mitgelieferten Symbolleisten und die schwebende Symbolleiste bei Textauswahl. Auf false setzen, um die KI aus dem Code verfügbar zu halten und die Platzierung von aiassist selbst zu steuern. |
aiToolkitResolver | function | null | Ihr Hook – siehe Resolver. Weicht auf den eingebauten Demo-Resolver aus. |
aiToolkitActions | Action[] | eingebaute | Vollständige Liste der registrierten Aktionen. Mit registerAction erweitern. |
aiToolkitDialogModes | Mode[] | 7 eingebaute | Modi, die im Dropdown von Ask AI erscheinen. |
aiToolkitOperationHandlers | object | {} | Handler für eigene Operationstypen, nach type geordnet. |
aiToolkitPersistenceKey | string | "" | Bereich in localStorage für die Review-Warteschlange. Leer = keine Persistenz. |
aiToolkitSuggestionLedgerUrl | string | "" | Server-Endpoint für die Synchronisierung eines gemeinsamen Ledgers. |
aiToolkitReviewLogUrl | string | "" | Server-Endpoint für den Aktivitäts-Feed der Reviews. |
aiToolkitReviewSyncInterval | number | 15000 | Millisekunden zwischen den Abfragen des Ledgers. |
aiToolkitLabel | string | "Current editor" | Beschriftung auf den Meta-Pills im Dialog Ask AI. |
text_aiassist | string | "Ask AI" | Tooltip und Dialogtitel (pro Oberflächensprache lokalisieren). |
Ausprobieren
Jede der Oberflächen oben läuft in den öffentlichen Demos ohne API-Schlüssel:
- Demo zum AI Toolkit – Ask AI, Schnellaktionen, Chat, Review-Seitenleiste
- BYOK-Demo – Formular für Admin-Einstellungen + weiterleitender Resolver + Serverskizze
- Überblick über das AI Toolkit – Produktseite mit einem Live-Mockup des Editors