Cette page t'a-t-elle aidé ?

Cette page t'a-t-elle aidé ?
Agents
Une instance Gilbert customisée par cas d'usage, scopée à votre workspace.
Dernière mise à jour : 23 mai 2026
Cette page vise l'IT d'une entreprise B2B qui a déjà configuré son workspace Gilbert, branché ses intégrations OAuth (Gmail, Calendar, etc.) et calé sa routine quotidienne. Vous voulez maintenant déployer Gilbert comme face publique de votre entreprise : un agent qui qualifie les prospects entrants sur votre site, un autre qui sert vos collaborateurs en interne.
Exemple concret — une agence immobilière qui pilote son workspace Gilbert :
Deux agents, même workspace, deux system prompts différents, deux secrets HMAC distincts. Le public ne voit jamais les mails du conseiller ; le conseiller ne voit pas les dossiers prospects de tout le monde.
Workspace = boundary de données. Un workspace est UN tenant : ses dossiers, ses intégrations OAuth, ses repos, ses routines. Les données ne traversent jamais cette frontière.
Agent = boundary de comportement.Un agent est UNE persona / un cas d'usage à l'intérieur de ce tenant. Il partage les données et intégrations du workspace, mais il a son propre system prompt, son propre secret, son propre statut (active / paused / archived).
Tout se passe sur /console/agents. Vous y voyez la liste des agents existants dans vos workspaces.
Site public Acme Immo. Le slug est généré automatiquement depuis le nom (kebab-case, alphanumérique, 3-64 chars), modifiable côté API. C'est cette valeur qui ira dans le claim agent du JWT.GILBERT_AGENT_HMAC du backend client. Il ne sera plus jamais ré-affiché.Quelques canevas qu'on voit revenir, à adapter à votre métier. Ce sont des starting points, pas des dogmes.
| Pattern | Mission | Tools typiques |
|---|---|---|
| Qualification de prospect | Identifier le visiteur, écouter son besoin, résumer en 3 lignes, créer un dossier rattaché au workspace. | update_dossier, request_email, propose_solution |
| Support client niveau 1 | Répondre aux FAQ depuis votre base de connaissance, escalader si non résolu en 3 tours. | fetch_url, update_dossier |
| Assistant interne | Lire mails / agenda du collaborateur connecté (via JWT authentifié), résumer la journée, draft de réponses. | gmail_search, gmail_read_message, calendar_list_today |
| Concierge documentaire | Naviguer dans les repos GitHub liés au workspace, retrouver un fichier, répondre à des questions sur le code. | repo_list_files, repo_read_file, repo_search |
La liste exacte des tools disponibles dépend des intégrations OAuth que vous avez activées sur le workspace (Google, GitHub, LinkedIn) et du template_kind du workspace. Voir Console B2B pour la matrice complète.
Une allowlistde tools par agent permet de limiter ce qu'un agent peut faire, indépendamment des intégrations du workspace. Le pattern de sécurité est simple : un agent site publicne doit jamais pouvoir lire la Gmail privée du dirigeant, même si l'intégration Google est connectée pour d'autres usages.
update_dossier, propose_solution, request_email, request_auth — utilisables par un agent public, ne touchent pas aux données sensibles.read_file, write_file, delete_file, create_from_template — scope client (jamais exposés à un visiteur en mode guest).github_list_repos, github_propose_sync — pour les agents tournés vers le code.gmail_search, gmail_read_message, calendar_list_today, create_scheduled_draft, list_routines — pour les assistants internes uniquement, jamais sur un agent public.fetch_url (SSRF-safe).Brancher l'agent dans votre site, c'est trois choses :
agent: "<slug>" dans le payload.?token=, résout l'agent par son slug, vérifie la signature avec son secret (pas le master), puis booste la session avec le system prompt et les tools de cet agent.import jwt from 'jsonwebtoken'
// Stocké côté backend client — JAMAIS dans le bundle navigateur.
// Récupéré depuis /console/agents au moment de la création de l'agent
// (ou après rotation). Variable d'env recommandée : GILBERT_AGENT_HMAC.
const AGENT_SECRET = process.env.GILBERT_AGENT_HMAC
const AGENT_SLUG = 'site-public-acme-immo'
export function signGilbertAgentToken(visitor) {
const now = Math.floor(Date.now() / 1000)
return jwt.sign(
{
iss: 'solve-web', // émetteur enregistré côté Gilbert
aud: 'gilbert',
product_context: 'solve-web', // legacy — dérivé du workspace si agent
agent: AGENT_SLUG, // ← le claim qui route vers cet agent
sub: visitor?.id ?? null,
email: visitor?.email ?? null,
guest: !visitor,
iat: now,
exp: now + 600, // TTL court — 10 minutes
},
AGENT_SECRET,
{ algorithm: 'HS256' },
)
}Le claim agentest ce qui différencie un JWT « legacy product-only » d'un JWT « agent custom ». Quand il est présent, Gilbert ignore le master secret et utilise uniquement workspace_agents.hmac_secret pour vérifier la sig. Voir JWT SSO pour le format complet du payload.
Sur la page détail d'un agent (/console/agents/:slug) vous trouvez la section Secret HMAC avec un bouton Régénérer le secret.
Quatre statuts possibles — draft, active, paused, archived :
Le slug est unique en base : un slug archivé reste pris tant que la row n'est pas supprimée. Pour réutiliser un slug, il faut supprimer l'agent (cf. section suivante).
Sur /console/agents/:slug, tout en bas, une zone dangereuse coral. Le bouton Supprimer l'agent est en confirm-twice :
workspace_agents est supprimée définitivement. Tous les JWTs en circulation avec ce slug tomberont sur wrong_issuer (Agent inconnu) au prochain exchange.Trois cas d'usage qu'on voit régulièrement :
Dans tous les cas, les données (dossiers, historiques, intégrations) sont partagées par le workspace. Seul le comportementdiffère d'un agent à l'autre.
Côté site client, deux choses : le snippet embed.jsqui injecte l'iframe, et le JWT signé qui porte le claim agent. Le JWT est passé en query string ?token=sur l'URL de l'iframe (rendue côté backend).
<!-- Sur la page "Contactez-nous" du site Acme Immo -->
<script
src="https://gilbert.solveholding.com/embed.js"
data-product="solve-web"
data-theme="light"
defer
></script>
<!-- Puis : votre backend rend un JWT signé avec le claim 'agent: site-public-acme-immo'
et l'injecte côté client. L'iframe est chargée avec ?token=<JWT>. -->/api/gilbert/embed/agents (CRUD agents), notamment PATCHpour modifier l'allowlist côté backend en attendant le picker UI.