Cette page t'a-t-elle aidé ?
Cette page t'a-t-elle aidé ?
Référence
Gilbert s'intègre dans votre app comme un widget standard. Deux formes : script tag (iframe injectée automatiquement) ou iframe directe (vous gérez le placement).
Dernière mise à jour : 21 septembre 2026
Le snippet embed.js injecte une iframe Gilbert responsive juste après la balise script, là où vous la placez dans la page. C'est la forme la plus simple pour démarrer. (La bulle flottante en bas à droite est à venir.)
<script
src="https://gilbert.solveholding.com/embed.js"
data-product="solve-web"
data-theme="light"
defer
></script>Le script lit ses configs via les attributs data-*. Tous sont optionnels : sans rien, Gilbert tourne en mode démo publique.
Pour un agent public, le claim agent du jeton signé désigne l'agent et son espace. Passez ce jeton dans data-token ci-dessous.
Un agent embed ne se désigne QUE par le jeton signé. Il n'existe pas de paramètre d'agent dans l'URL : l'agent est résolu par un claim agent à l'intérieur du JWT, vérifié avec le secret de signature propre à cet agent. Sans data-token, le script affiche l'expérience générique du produit, quelle que soit votre intention. L'échec est silencieux : la page s'ouvre et l'assistant répond, ce n'est simplement pas le vôtre.
<script
src="https://gilbert.solveholding.com/embed.js"
data-token="JWT_SIGNE_COTE_SERVEUR"
data-theme="auto"
defer
></script>Le jeton se frappe côté serveur de votre page, avec le secret de signature rendu à la création de l'agent. Il est borné dans le temps (une heure par défaut), donc rendez-le à chaque requête plutôt que de le figer dans une page mise en cache. Quand data-token est présent, data-product n'est pas transmis : le jeton est la source de vérité et le contexte produit se dérive de l'espace porteur de l'agent.
Si vous voulez Gilbert en pleine page ou dans un panel custom, posez l'iframe vous-même :
<iframe
src="https://gilbert.solveholding.com/embed?token=JWT&theme=light"
sandbox="allow-scripts allow-same-origin allow-forms allow-popups"
width="100%"
height="640"
style="border: 0; border-radius: 16px;"
title="Assistant Gilbert"
></iframe>Une iframe générique avec ?product=…, un jeton produit sans agent ou le playground conserve son fonctionnement habituel. Pour afficher votre agent public, fournissez un jeton signé qui le désigne. Un jeton refusé bloque le chat ; régénérez-le côté serveur avant de recharger l'iframe.
L'agent utilise une session visiteur signée de 24 heures, gérée par Gilbert. Vérifiez que le navigateur autorise les cookies dans l'iframe. La conversation peut reprendre au rechargement pour le même agent ; un changement d'agent ouvre une conversation distincte. Après avoir changé de contexte dans un autre onglet, rechargez le widget pour reprendre sa session. Les conversations personnelles du visiteur ne sont pas chargées dans ce widget.
Si votre application définit un Content-Security-Policy, autorisez les origines Gilbert :
Content-Security-Policy:
script-src 'self' https://gilbert.solveholding.com;
frame-src https://gilbert.solveholding.com;
connect-src https://gilbert.solveholding.com;script-src est nécessaire seulement si vous utilisez le snippet script tag. frame-src est requis dans tous les cas. connect-src n'est utile que si votre propre code parent fait des fetch vers Gilbert (les requêtes de l'iframe elle-même ne passent pas par votre CSP).
| Param | Type | Description |
|---|---|---|
| token | JWT | Signé HS256. Si présent, prioritaire sur tous les autres params d'identité. Voir JWT SSO. |
| product | string | product_context. Ignoré si token est fourni (claim product_context du JWT prioritaire). |
| theme | enum | light · dark. Défaut : light. |
| dossier | uuid | ID de dossier à pré-sélectionner. Utile si l'user a plusieurs contextes parallèles. |
| intent | enum | embed-setup · explore · client-build. dev-docs rejeté en iframe. |
L'iframe notifie la page hôte de son cycle de vie via postMessage. Trois événements existent aujourd'hui, tous préfixés gilbert: (séparateur deux-points) :
| type | Payload | Émis quand |
|---|---|---|
| gilbert:ready | Aucun | L'iframe a hydraté. |
| gilbert:error | code (ex : bad_signature, expired) | L'exchange du token SSO a échoué. |
| gilbert:close | Aucun | L'UI Gilbert demande la fermeture du panneau hôte. |
window.addEventListener('message', (e) => {
if (e.origin !== 'https://gilbert.solveholding.com') return
switch (e.data.type) {
case 'gilbert:ready':
console.log('Gilbert prêt')
break
case 'gilbert:error':
console.warn('Exchange SSO échoué', e.data.code)
break
case 'gilbert:close':
// fermer votre drawer / panel
break
}
})