← Toute la documentation
Dernier workflow

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

Ask AI

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.

AI Chat

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.

AI Review

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).

idTitreComportement par défaut
proofreadProofreadNormalise les espaces, la ponctuation et les majuscules tout en préservant le sens.
rewriteRewriteSupprime les formules de remplissage (very, really, in order to, due to the fact that) et resserre la formulation.
shortenShortenConserve les ~60% premiers mots, avec un minimum de 8.
expandExpandAjoute une phrase complémentaire sous le texte source.
summarizeSummarizeConstruit un résumé à puces à partir des ~45% premiers mots.
translateTranslateProduit un brouillon étiqueté avec la langue ; la langue cible est transmise dans request.language.
justifyJustify editComme 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

ChampTypeSignification
actionIdstringL’action invoquée par l’utilisateur (correspond à l’id d’une action ou d’un mode enregistré).
modestringLe mode de la boîte de dialogue — proofread, rewrite, translate, etc.
sourcestringLe texte à traiter. Le texte de la sélection s’il y en a une ; sinon, le texte de tout le document.
promptstringLe texte du prompt de l’utilisateur (pour le mode chat).
languagestringLa langue cible pour le mode traduction. Vide pour les autres.
scopestring"selection" ou "document".
selectionTextstringLe texte de la sélection (peut être vide).
documentTextstringLe texte de tout le document.
snapshotobjectUn instantané de la sélection (hasSelection, rangeHTML, text, wholeText, ...).
editorRichTextEditorL’instance de l’éditeur.
contractobjectLa 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.

ChampTypeSignification
resultstringLa sortie brute de l’IA. Affichée dans le volet résultat et utilisée comme corps de suggestion par défaut.
reasonstringLa raison pour laquelle l’IA recommande cette modification. Apparaît dans le panneau « Why this suggestion ».
messagestringUne réponse de type chat (interface AI Chat uniquement).
operationsOperation[]Un plan structuré — voir Types d’opérations.
targetstringOù appliquer — "selection-preview", "document", "insert", etc.
autoRunbooleanAppliquer 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).

typeChampsCe qu’elle fait
preview-suggestiontext, reason?Affiche un aperçu avant/après dans le texte. L’utilisateur accepte ou rejette.
replace-selectiontextRemplace la sélection courante par le texte indiqué.
replace-documenttextRemplace tout le corps du document.
insert-belowtextInsère un nouveau bloc après le curseur ou la sélection.
add-commenttext, reason?Place un marqueur de commentaire IA non destructif sur la sélection courante.
open-chat-panelmessage?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é :

  1. Votre interface d’administration permet à un locataire de choisir un fournisseur et de coller une clé. Le formulaire envoie un POST à votre backend.
  2. Votre backend écrit la clé dans votre gestionnaire de secrets, avec une portée limitée au locataire.
  3. Le aiToolkitResolver de l’éditeur envoie un POST à /api/ai avec le cookie de session. Aucune clé dans le navigateur.
  4. 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

OptionTypeValeur par défautRôle
aiToolkitEnabledbooleantrueDéfinissez-la sur false pour désactiver complètement le plugin (pas d’injection de bouton, pas d’API).
aiToolkitAutoToolbarButtonsbooleantrueContrô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.
aiToolkitResolverfunctionnullVotre hook — voir Résolveur. À défaut, le résolveur de démo intégré est utilisé.
aiToolkitActionsAction[]intégréesLa liste complète des actions enregistrées. Utilisez registerAction pour l’étendre.
aiToolkitDialogModesMode[]7 intégrésLes modes affichés dans la liste déroulante d’Ask AI.
aiToolkitOperationHandlersobject{}Gestionnaires de types d’opérations personnalisés, indexés par type.
aiToolkitPersistenceKeystring""Portée localStorage de la file de relecture. Vide = pas de persistance.
aiToolkitSuggestionLedgerUrlstring""Point de terminaison serveur pour la synchronisation du registre partagé.
aiToolkitReviewLogUrlstring""Point de terminaison serveur pour le flux d’activité de relecture.
aiToolkitReviewSyncIntervalnumber15000Millisecondes entre deux interrogations du registre.
aiToolkitLabelstring"Current editor"Libellé affiché sur les pastilles d’information dans la boîte de dialogue Ask AI.
text_aiassiststring"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 :