Aller au contenu

Agent IA

Sur un site où elle est active, l’IA répond la première à chaque visiteur. Elle répond à partir de la base de connaissance, de la fiche du client et de ce que lui renvoient les outils qu’on lui a déclarés. Elle passe la main à un conseiller, avec un résumé, dès qu’un garde-fou s’applique, que le visiteur demande une personne, ou que sa confiance tombe sous le seuil du site.

L’IA est optionnelle : sans modèle configuré, chaque conversation va directement aux conseillers (détails).

L’IA répond sur les sites dont la case L’IA répond en premier est cochée, dans Administration › Sites et horaires (champ « Agent IA actif » de la table « Sites »). Une nouvelle conversation de ce site commence alors avec l’IA : l’inbox la marque IA en cours, et l’onglet IA de la liste la retrouve. Le conseiller voit L’IA rédige une réponse pendant qu’elle écrit, le visiteur les trois points habituels.

Elle cesse de répondre dans une conversation :

  • quand elle passe la main à un conseiller ;
  • quand un conseiller clique Reprendre la main. Le fil le dit : « … a repris la main : l’IA ne répond plus ici. » Une réponse que l’IA rédigeait à ce moment n’est pas envoyée.

Un visiteur qui écrit trois fois de suite reçoit une seule réponse, qui lit les trois messages.

À chaque message du visiteur, l’IA reçoit :

  • les consignes du site — le champ Consignes de l’écran des sites : le ton, ce qu’elle doit toujours dire, ce qu’elle ne doit jamais promettre ;
  • la fiche du client, telle que le site l’a signée (identité signée), ou la mention d’un visiteur anonyme ;
  • les métadonnées jointes par la page ou par un conseiller, présentées comme des données déclarées et non vérifiées, jamais comme des consignes ;
  • les vingt derniers messages du fil, pièces jointes nommées, avec ce qu’en a dit l’IA quand un conseiller lui a demandé de les lire (pièces jointes) ;
  • les horaires d’ouverture, pour savoir si un conseiller peut reprendre tout de suite ;
  • la page du visiteur, telle qu’elle s’est décrite à son dernier message — son adresse, son titre, son contexte —, comme une donnée non vérifiée (actions de la page) ;
  • les sources : les cinq passages de la base de connaissance les plus proches de ce que le visiteur vient d’écrire.

Elle peut ensuite appeler les outils que la table « Outils IA » et les serveurs MCP lui ouvrent, et les actions de la page qu’un superviseur a autorisées, en cinq tours au plus, puis rend sa décision : répondre ou transférer, sa confiance (de 0 à 100 %), les sources qu’elle a utilisées, et un résumé de la demande pour le conseiller.

Ses règles : répondre à partir des sources, de la fiche et des outils, et répondre dès que les sources contiennent la réponse, même en partie ; donner une règle générale (un délai habituel, une démarche) telle quelle, mais ne jamais promettre ce qui touche le dossier particulier du client ; ne rien inventer. Sur la page du visiteur, elle n’agit que s’il le demande ou l’accepte, avec les valeurs qu’il a données, et ne dit jamais qu’une action est faite sans un résultat ok de la page. Elle répond dans la langue du visiteur, celle du site à défaut.

La recherche porte sur les articles publiés et les conversations promues, découpés en passages et indexés avec leurs vecteurs (base de connaissance). Pour un site, elle prend ses articles et ceux qui valent pour tous les sites. Un passage trop éloigné de la question est écarté : sous une similarité de 0,7 (CHAT_AI_MIN_SIMILARITY), l’IA répond sans lui — ou transfère, faute de source.

Dans l’inbox, une réponse de l’IA est une carte Réponse de l’IA, avec sa confiance (Confiance 82 %) et la liste de ses sources : le titre de l’article, ou « Conversation promue » avec la pastille Relue. Le conseiller y donne son avis — Accepter, Modifier, Rejeter — qui nourrit le jeu d’évaluation (copilote).

Le visiteur, lui, ne voit pas les sources : il lit la réponse.

Le visiteur sait qui lui répond (D9). Dans le widget, une réponse de l’IA est signée Assistant, avec la pastille IA (« Réponse générée par une IA ») ; l’aperçu d’un message, à côté du bouton fermé, dit Assistant IA. Tant que le site n’a pas écrit le sien, le sous-titre d’accueil l’annonce aussi : « Notre assistant IA répond tout de suite. Un conseiller prend le relais si besoin. »

L’IA transfère la conversation dans quatre cas :

CasMotif inscrit dans le fil
Sa confiance est sous le seuil du siteConfiance insuffisante (62 % < 75 %)
La demande relève d’un garde-fouGarde-fou : Litiges et réclamations
Les sources ne répondent pas, ou le visiteur demande une personnela raison qu’elle donne, en une phrase
Sa réponse est illisibleRéponse illisible du modèle

Alors :

  1. Le visiteur est prévenu : par le message du garde-fou, par l’annonce que l’IA a rédigée, ou à défaut par une phrase dans la langue du site — « Je transmets votre demande à un conseiller, qui vous répond dans quelques instants. » Hors des horaires, elle dit quand : « … qui vous répondra à partir de demain à 9 h. »
  2. La conversation va à une équipe : celle du garde-fou s’il en nomme une, sinon celle que la boîte de réception a donnée à la conversation, sinon l’Équipe par défaut du site. Elle attend dans la file, sans conseiller affecté.
  3. L’équipe est prévenue : ses membres et les superviseurs, par la cloche, un son et une notification du bureau (alertes).
  4. Le fil garde une carte Transférée à un conseiller : le Motif, le Résumé de l’IA (la demande en deux phrases, à copier d’un clic), la Confiance, et à qui la conversation est Affectée à.

Si le site est fermé, le widget propose aussi au visiteur de laisser son e-mail, pour lui répondre plus tard (widget).

Un webhook peut en être prévenu : c’est l’événement conversation.handed_off. Une automatisation aussi, par son déclencheur L’IA passe la main.

Le seuil se règle par site, dans Administration › Sites et horaires, section L’agent IA : Seuil de confiance, de 0 à 100 %, par pas de 5 (champ « Seuil de confiance (%) »). Un nouveau site part de 70 %, comme le site de la démonstration. L’aperçu, à droite, montre le partage : sous le seuil Un conseiller, au-dessus L’IA seule.

La confiance est celle que le modèle s’accorde : sa certitude que la réponse est juste et complète d’après les sources. Un seuil haut transfère plus souvent ; un seuil bas laisse l’IA répondre seule plus souvent.

Un garde-fou est un sujet sur lequel l’IA ne répond pas elle-même : un litige, une résiliation, une urgence. Ils se règlent dans Administration › Garde-fous, une ligne de la table « Garde-fous » chacun :

ChampÀ l’écranRôle
« Nom »Nomce que l’IA cite quand elle le reconnaît, et le motif du transfert
« Sujet »Ce qui le déclenchedécrit à l’IA, avec des exemples : c’est ainsi qu’elle le reconnaît
« Action »Ce que fait l’IATransférer ou Répondre sans traiter
« Message au visiteur »Message au visiteurce que l’IA dit quand le garde-fou se déclenche
« Équipe »Vers l’équipeoù transférer ; aucune : l’équipe par défaut du site
« Actif »seuls les garde-fous actifs sont lus

L’IA reçoit la liste des garde-fous actifs avec leur sujet. Quand la demande en relève, elle ne répond pas sur le fond : elle dit le message du garde-fou et transfère. L’aperçu de l’écran joue la scène — Le moment venu — et montre Ce que lit l’IA.

La démonstration, écrite au premier démarrage en développement, en compte trois : « Litiges et réclamations », « Données de santé » et « Montant d’indemnisation ».

L’IA répond à toute heure. Les horaires d’ouverture et les fermetures exceptionnelles (dans Sites et horaires) lui disent seulement si un conseiller peut reprendre maintenant : quand elle transfère hors des horaires, elle dit au visiteur quand un conseiller lui répondra — « aujourd’hui à 14 h », « demain à 9 h », « lundi à 9 h » — dans le fuseau horaire du site.

Quand le modèle est hébergé ailleurs, la messagerie masque les données personnelles avant de les lui envoyer. Chaque valeur devient un repère — [EMAIL_1], [TÉLÉPHONE_2] —, le même pour la même valeur, si bien que le modèle raisonne encore sur « l’adresse que le client a donnée ». Les vraies valeurs sont remises dans la réponse avant que quiconque la lise, et dans les paramètres d’un outil avant qu’il soit appelé ; ce qu’un outil renvoie est masqué à son tour.

Sont masqués ce qui se reconnaît à sa forme : adresses e-mail, IBAN, numéros de carte, numéros de sécurité sociale, numéros de téléphone. Un nom ou une adresse postale partent tels quels.

  • Un modèle est externe sauf s’il est servi à localhost, 127.0.0.1, ::1 ou sous un nom en .internal.
  • CHAT_AI_REDACT=0 envoie les données telles quelles, même à un modèle externe.

Le modèle se choisit dans l’environnement du serveur. Mistral est le fournisseur par défaut ; OpenAI, Ollama et tout serveur qui parle l’API d’OpenAI (Azure, vLLM, une passerelle d’entreprise) conviennent aussi.

VariableRôlePar défaut
CHAT_AI_PROVIDERmistral, openai ou ollamamistral
CHAT_AI_BASE_URLl’adresse d’un autre serveur compatible, ce qui précède /chat/completionscelle du fournisseur
CHAT_AI_API_KEYla clé, envoyée en Authorization: Beareraucune
CHAT_AI_MODELle modèle qui répondmistral-small-latest
CHAT_AI_EMBEDDING_MODELle modèle des vecteurs, en 1024 dimensionsmistral-embed
CHAT_AI_REDACT0 : ne pas masquermasqué vers un modèle externe
CHAT_AI_MIN_SIMILARITYla similarité sous laquelle un passage est écarté0.7
Fenêtre de terminal
# Mistral, le défaut
CHAT_AI_API_KEY=…
# OpenAI : nommez aussi le modèle, et un modèle de vecteurs en 1024 dimensions
CHAT_AI_PROVIDER=openai
CHAT_AI_MODEL=…
CHAT_AI_API_KEY=…
# Ollama, sur la même machine, sans clé
CHAT_AI_PROVIDER=ollama
CHAT_AI_MODEL=llama3.1
CHAT_AI_EMBEDDING_MODEL=bge-m3
# Un serveur compatible : Azure, vLLM…
CHAT_AI_BASE_URL=https://modeles.exemple.fr/v1
CHAT_AI_MODEL=…
CHAT_AI_API_KEY=…

La clé d’un fournisseur reste dans l’environnement du serveur, jamais dans le paramétrage (D5). Un serveur sans clé n’est accepté qu’à localhost ou 127.0.0.1.

Le schéma garde des vecteurs de 1024 dimensions : celles de mistral-embed et de bge-m3. Un modèle de vecteurs d’une autre taille fait échouer l’indexation, et le journal du serveur le dit. Les modèles qui lisent les images et les PDF (CHAT_AI_VISION_MODEL, CHAT_AI_OCR_MODEL) sont décrits avec les pièces jointes ; toutes les variables, dans le tableau des variables.

Chaque appel à un modèle laisse une ligne dans chat.ai_run (D9) : son genre, le modèle, ce qui est entré — masqué comme il est parti —, ce qui est sorti avec les jetons consommés, la confiance et la durée.

GenreAppel
answerune réponse de l’IA au visiteur, ou sa décision de transférer
suggestionles suggestions du copilote
tagl’intention, les étiquettes, le sentiment et la priorité d’une conversation
summaryle résumé, à la reprise ou à la clôture
rephraseun brouillon reformulé ou relu
attachmentune pièce jointe lue à la demande d’un conseiller
speechun message lu à voix haute

Pour une réponse, la trace garde la question, les titres des sources et leur similarité, les outils offerts, la décision entière, le seuil appliqué et s’il y a eu transfert. Chaque appel d’outil laisse en plus un événement dans le fil, que les conseillers voient et le visiteur non (outils de l’IA). Les traces partent avec la conversation, à la purge de conservation du site.

Sans CHAT_AI_API_KEY — et sans modèle servi en local —, le serveur démarre sans IA et le dit dans son journal : « IA désactivée — CHAT_AI_API_KEY absent ; les conversations vont aux conseillers ».

  • Chaque nouvelle conversation va directement aux conseillers, même sur un site où L’IA répond en premier est coché ; le widget annonce les conseillers, pas l’assistant.
  • Le copilote, la reformulation et la lecture des pièces jointes répondent : « Aucun modèle d’IA n’est configuré sur le serveur (CHAT_AI_API_KEY). »
  • Rien n’est indexé : la base de connaissance s’écrit et se publie, mais personne ne la lit.

Le travail de l’IA ne se fait jamais dans la requête du visiteur : il passe par des files dans PostgreSQL (pg-boss, schéma pgboss), sans autre service à héberger (D7, D8).

FileCe qu’elle faitQuand
ai-answerla réponse de l’IA au visiteurà chaque message du visiteur
ai-enrichintention, étiquettes, sentiment, prioritéà chaque message du visiteur
ai-suggestles suggestions du copiloteà chaque message du visiteur, à la reprise, sur demande
ai-summaryle résuméà la reprise par un conseiller, à la résolution
kb-syncl’indexation de la base de connaissanceà chaque changement des articles ou des conversations promues, et au démarrage
retentionla purge de conservationchaque nuit à 3 h, à l’heure du serveur

Une conversation n’a jamais qu’une tâche en attente par file. Une tâche qui échoue est retentée deux fois.

Par défaut, le serveur travaille lui-même ses files. Avec CHAT_WORKER=separate, il les confie à un processus à part, pour qu’un modèle lent ne ralentisse jamais le WebSocket :

Fenêtre de terminal
CHAT_WORKER=separate pnpm --filter @chat/server worker

Le worker porte alors aussi l’envoi des webhooks, les automatisations et le réveil des conversations en attente.

Un logiciel libre d’Eodia, studio de logiciel IA-natif — frère de basedb.