AI Toolkit
Ask AI, AI Chat, l’aperçu dans le texte et un panneau AI Review — le tout reposant sur un seul hook aiToolkitResolver, si bien que vous pouvez utiliser dès aujourd’hui le résolveur de démo intégré et brancher demain votre propre backend sans changer l’interface.
Vue d’ensemble
L’AI Toolkit ajoute trois interfaces liées à l’éditeur :
- Ask AI — une boîte de dialogue lancée depuis la barre d’outils, avec sept modes en un clic (relecture, réécriture, raccourcissement, développement, résumé, traduction, justification), un sélecteur de portée sélection/document et un aperçu dans le texte avant application.
- AI Chat — un panneau latéral ancré pour les échanges en plusieurs tours. Tient compte de la portée, avec des prompts rapides et des actions copier/appliquer/insérer/remplacer sur chaque réponse de l’IA.
- AI Review — une file persistante de suggestions en attente, acceptées et rejetées. Synchronisation facultative avec un registre côté serveur pour une relecture d’une session à l’autre.
Les trois partagent le même hook aiToolkitResolver et le même contrat d’opérations : une suggestion prévisualisée dans une interface peut donc être acceptée, rejetée ou transmise dans une autre.
Mode démo. Sans résolveur configuré, le plugin fournit un defaultResolveAction déterministe, pour que vous puissiez utiliser Ask AI, Chat et Review en local, sans clé d’API, sans appel réseau et avec une sortie prévisible.
Installation
Chargez la feuille de style et le script de l’AI Toolkit après le bundle principal de l’éditeur. Par défaut, le plugin injecte automatiquement un bouton Ask AI dans les préréglages de barre d’outils standard default, basic, full et mobile à son chargement.
<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>Configuration. Le fichier rte.js que vous avez téléchargé comporte en tête un bloc RTE_DefaultConfig modifiable, en texte lisible — ouvrez-le et modifiez les valeurs par défaut de l’IA (clé de persistance, libellé, point de terminaison du résolveur, etc.) à côté de tous les autres réglages de l’éditeur. Aucun fichier de configuration séparé n’est à charger. aitoolkit.css doit être présent dès que le bouton IA peut s’afficher (même avec la barre d’outils par défaut), sinon le menu déroulant de l’IA aura une taille incorrecte. Pour garder l’IA activée sans injection automatique du bouton, définissez aiToolkitAutoToolbarButtons: false, puis ajoutez aiassist uniquement aux barres d’outils où vous le voulez.
var editor = new RichTextEditor("#editor", {
toolbar: "default",
aiToolkitAutoToolbarButtons: false
});Trois interfaces
Une boîte de dialogue lancée depuis la barre d’outils. Volets source et résultat, sélecteur de mode, bascule de portée, aperçu avant/après, plan d’opérations, boutons appliquer / remplacer / insérer / rejeter.
Un panneau ancré. Messagerie tenant compte de la portée, prompts rapides, historique des messages, et actions appliquer / insérer / remplacer pour chaque réponse.
Un panneau persistant. File des suggestions en attente / acceptées / rejetées, contrôles par lot et synchronisation facultative avec un registre distant.
Modes intégrés
Chaque mode est une entrée { id, title, description } dans config.aiToolkitDialogModes. Les modes apparaissent dans la liste déroulante Action de la boîte de dialogue Ask AI et peuvent être appelés via runQuickAction(id).
| id | Titre | Comportement par défaut |
|---|---|---|
proofread | Proofread | Normalise les espaces, la ponctuation et les majuscules tout en préservant le sens. |
rewrite | Rewrite | Supprime les formules de remplissage (very, really, in order to, due to the fact that) et resserre la formulation. |
shorten | Shorten | Conserve les ~60% premiers mots, avec un minimum de 8. |
expand | Expand | Ajoute une phrase complémentaire sous le texte source. |
summarize | Summarize | Construit un résumé à puces à partir des ~45% premiers mots. |
translate | Translate | Produit un brouillon étiqueté avec la langue ; la langue cible est transmise dans request.language. |
justify | Justify edit | Comme rewrite, avec en plus un champ reason qui explique la modification. |
Ce sont des bouchons déterministes destinés au résolveur de démo. Dès que vous branchez aiToolkitResolver, c’est votre fonction qui décide du traitement de chaque mode. Vous pouvez aussi enregistrer de nouveaux modes — voir Actions personnalisées.
Le hook aiToolkitResolver
C’est le point d’extension. Le résolveur reçoit une requête structurée et renvoie un résultat (ou une Promise qui se résout en résultat). L’éditeur se charge de l’affichage, de l’aperçu, de la relecture et de l’application.
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
}]
};
}
});Forme de la requête
| Champ | Type | Signification |
|---|---|---|
actionId | string | L’action invoquée par l’utilisateur (correspond à l’id d’une action ou d’un mode enregistré). |
mode | string | Le mode de la boîte de dialogue — proofread, rewrite, translate, etc. |
source | string | Le texte à traiter. Le texte de la sélection s’il y en a une ; sinon, le texte de tout le document. |
prompt | string | Le texte du prompt de l’utilisateur (pour le mode chat). |
language | string | La langue cible pour le mode traduction. Vide pour les autres. |
scope | string | "selection" ou "document". |
selectionText | string | Le texte de la sélection (peut être vide). |
documentText | string | Le texte de tout le document. |
snapshot | object | Un instantané de la sélection (hasSelection, rangeHTML, text, wholeText, ...). |
editor | RichTextEditor | L’instance de l’éditeur. |
contract | object | La liste complète des types d’opérations pris en charge (pour la validation). |
Forme de la réponse
Renvoyez un objet simple avec n’importe lesquels des champs suivants. Tous sont facultatifs ; omettez ceux dont vous n’avez pas besoin.
| Champ | Type | Signification |
|---|---|---|
result | string | La sortie brute de l’IA. Affichée dans le volet résultat et utilisée comme corps de suggestion par défaut. |
reason | string | La raison pour laquelle l’IA recommande cette modification. Apparaît dans le panneau « Why this suggestion ». |
message | string | Une réponse de type chat (interface AI Chat uniquement). |
operations | Operation[] | Un plan structuré — voir Types d’opérations. |
target | string | Où appliquer — "selection-preview", "document", "insert", etc. |
autoRun | boolean | Appliquer automatiquement sans confirmation de l’utilisateur (avec parcimonie). |
Vous pouvez aussi renvoyer une chaîne ou une Promise. Une chaîne devient { result: <that string> } ; une Promise est attendue.
Types d’opérations
Les opérations constituent le plan structuré que peut renvoyer votre résolveur. L’éditeur les exécute dans l’ordre (ou une par une, à l’initiative de l’utilisateur, depuis le panneau du plan).
| type | Champs | Ce qu’elle fait |
|---|---|---|
preview-suggestion | text, reason? | Affiche un aperçu avant/après dans le texte. L’utilisateur accepte ou rejette. |
replace-selection | text | Remplace la sélection courante par le texte indiqué. |
replace-document | text | Remplace tout le corps du document. |
insert-below | text | Insère un nouveau bloc après le curseur ou la sélection. |
add-comment | text, reason? | Place un marqueur de commentaire IA non destructif sur la sélection courante. |
open-chat-panel | message? | Ouvre le panneau AI Chat, éventuellement avec un message initial. |
open-review-panel | - | Ouvre le panneau AI Review. |
Des types d’opérations personnalisés peuvent être enregistrés avec 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 de programmation
Toutes les interfaces peuvent être ouvertes et pilotées depuis le code via 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();Actions et modes personnalisés
Enregistrez des actions propres à votre domaine (par exemple une réécriture SEO, une vérification de clauses juridiques, un ajustement du ton). Elles s’intègrent à la même boîte de dialogue, au même chat et à la même interface de relecture.
// 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 */ }
/* ... */
};Persistance et registre distant
Les suggestions du panneau AI Review sont conservées dans localStorage sous une clé que vous contrôlez. Définissez aiToolkitPersistenceKey pour limiter la portée à une instance de l’éditeur (par exemple à un document).
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)
});Lorsque l’URL du registre est définie, le plugin effectue un GET à l’ouverture et un POST à chaque acceptation ou rejet : la file de relecture survit ainsi d’une session à l’autre et peut être partagée entre relecteurs.
BYOK (apportez votre propre clé)
Important : l’éditeur n’accepte ni ne stocke de clés d’API. Les clés ont leur place dans le gestionnaire de secrets de votre serveur.
Le modèle BYOK recommandé :
- Votre interface d’administration permet à un locataire de choisir un fournisseur et de coller une clé. Le formulaire envoie un POST à votre backend.
- Votre backend écrit la clé dans votre gestionnaire de secrets, avec une portée limitée au locataire.
- Le
aiToolkitResolverde l’éditeur envoie un POST à/api/aiavec le cookie de session. Aucune clé dans le navigateur. - Votre backend récupère la clé du locataire, appelle le fournisseur et renvoie une réponse épurée.
Consultez la démo BYOK pour un formulaire d’administration fonctionnel, un résolveur routé et une esquisse de serveur de style Express.
Référence de configuration
| Option | Type | Valeur par défaut | Rôle |
|---|---|---|---|
aiToolkitEnabled | boolean | true | Définissez-la sur false pour désactiver complètement le plugin (pas d’injection de bouton, pas d’API). |
aiToolkitAutoToolbarButtons | boolean | true | Contrôle l’injection automatique du bouton IA dans les barres d’outils standard et dans la barre d’outils flottante de sélection de texte. Définissez-la sur false pour garder l’IA disponible depuis le code tout en gérant vous-même l’emplacement d'aiassist. |
aiToolkitResolver | function | null | Votre hook — voir Résolveur. À défaut, le résolveur de démo intégré est utilisé. |
aiToolkitActions | Action[] | intégrées | La liste complète des actions enregistrées. Utilisez registerAction pour l’étendre. |
aiToolkitDialogModes | Mode[] | 7 intégrés | Les modes affichés dans la liste déroulante d’Ask AI. |
aiToolkitOperationHandlers | object | {} | Gestionnaires de types d’opérations personnalisés, indexés par type. |
aiToolkitPersistenceKey | string | "" | Portée localStorage de la file de relecture. Vide = pas de persistance. |
aiToolkitSuggestionLedgerUrl | string | "" | Point de terminaison serveur pour la synchronisation du registre partagé. |
aiToolkitReviewLogUrl | string | "" | Point de terminaison serveur pour le flux d’activité de relecture. |
aiToolkitReviewSyncInterval | number | 15000 | Millisecondes entre deux interrogations du registre. |
aiToolkitLabel | string | "Current editor" | Libellé affiché sur les pastilles d’information dans la boîte de dialogue Ask AI. |
text_aiassist | string | "Ask AI" | Infobulle et titre de la boîte de dialogue (à localiser selon la langue de l’interface). |
L’essayer
Chaque interface ci-dessus fonctionne sans clé d’API dans les démos publiques :
- Démo de l’AI Toolkit — Ask AI, actions rapides, Chat, panneau Review
- Démo BYOK — formulaire de réglages d’administration + résolveur routé + esquisse côté serveur
- Présentation de l’AI Toolkit — page de présentation avec une maquette d’éditeur en direct