Passer au contenu
megapromotingDiscutons

aichat.md — orchestration des interactions

Ce qui arrive à un message, de la seconde où il nous parvient jusqu’au moment où quelqu’un le marque comme résolu.

Un assistant qui répond bien est facile à montrer dans une démo. Ce qui est difficile à montrer, et ce qui compte vraiment, c’est le parcours : comment le message arrive, ce qui est fait pour éviter d’y répondre deux fois, combien de temps on attend avant de répondre, d’où l’information est prise, quel outil est appelé, où l’agent s’arrête et qui est appelé à la place. Ci-dessous se trouve le parcours réel, avec les numéros du code. Y compris la partie commentaires, qui se comporte complètement différemment d’un message privé — et doit se comporter différemment.

Traseul

Neuf étapes, dans l’ordre où elles se produisent

  1. 01

    1. L’entrée, sur le canal sur lequel la personne a écrit

    Six voies d’entrée, avec des mécanismes différents. Messenger, Instagram Direct et WhatsApp Cloud API arrivent via webhook, par le même point d’entrée, ensuite réparti selon le type d’objet. Le widget du site entre directement par une route dédiée. Telegram ne passe pas par webhook, mais par interrogation continue. Et 999.md n’a ni webhook, ni interrogation continue — il a une horloge qui regarde les fils toutes les vingt secondes.

    Chaque réception est écrite dans un journal d’événements, avec l’état de la signature cryptographique et le contenu brut, avant que quoi que ce soit ne soit traité. La raison est simple : lorsqu’un message « n’est pas arrivé », la première question est de savoir s’il est arrivé chez nous ou non, et la réponse doit être une ligne dans un tableau, pas une supposition. Le routage canal → agent se fait par une table de correspondance entre l’identifiant de la page et le service, donc le même compte peut porter plusieurs agents sur différents canaux.

  2. 02

    2. La déduplication, avant toute autre chose

    L’identifiant du message est placé dans une clé Redis avec écriture conditionnelle — si la clé existe déjà, le message est dupliqué et s’arrête ici. La durée de vie de la clé est de 24 heures. Si Redis ne répond pas, on passe à une mémoire locale avec un seuil de nettoyage à 5.000 entrées, donc la déduplication ne disparaît pas, elle devient seulement plus courte en mémoire.

    La fenêtre a été de 120 secondes jusqu’au 10 juillet 2026, quand elle a été portée à 24 heures après un incident de réponses dupliquées. Le commentaire qui explique le changement est écrit à côté de la valeur, dans le code. Ici aussi, les stickers et le bouton « like » sont jetés, car ils deviendraient autrement des questions auxquelles l’agent essaierait de répondre.

  3. 03

    3. Le tampon — trois messages écrits à la suite deviennent une seule question

    Les gens n’écrivent pas un paragraphe. Ils écrivent « bonjour », puis « j’ai une question », puis la question. Un assistant qui répond à chaque ligne l’une après l’autre est agaçant et paraît bête. C’est pourquoi les messages sont rassemblés dans un tampon sur la paire expéditeur–page, et le chronomètre se réinitialise à chaque nouveau message. Quand la personne se tait, on répond une fois, à tout.

    Sur Messenger et Instagram, l’attente par défaut est de 15 secondes ; sur WhatsApp, de 5. On accepte au maximum cinq messages dans le tampon — le sixième remplace le dernier — et le texte concaténé est tronqué à 2.000 caractères. La valeur d’attente est par agent, pas globale : elle est lue depuis la configuration de l’agent et peut être abaissée à zéro pour un scénario où la vitesse compte plus que la cohérence. Juste avant l’envoi, on revérifie dans la base si, entre-temps, le fil a été mis en pause — car en 15 secondes, il se peut qu’une personne soit entrée.

  4. 04

    4. La lecture depuis vos sources

    La question est transformée en vecteur et recherchée dans les fragments que vous avez chargés. La recherche est hybride : elle combine la correspondance par mots avec la proximité vectorielle, dans une proportion de trois à sept. Jusqu’à 300 fragments candidats sont chargés depuis la base de connaissances de l’agent, le score combiné est calculé pour chacun, et les meilleurs sont conservés — cinq sur les canaux de messagerie, dix sur le widget.

    Le nombre de fragments est configurable par agent, entre 1 et 20. Les fragments sont tronqués à l’indexation à 1.200 caractères. La sélection finale se fait par rang, non par un seuil absolu de similarité : on les ordonne selon le score combiné et on prend les premiers. La configuration comporte aussi un champ de seuil, mais dans le chemin de recherche le filtre effectif conserve tout fragment avec un score supérieur à zéro et coupe selon la position — nous le précisons parce que c’est la différence entre ce qui est écrit dans le panneau et ce que fait le code. Chaque requête peut être journalisée avec les fragments renvoyés et leurs scores, afin de pouvoir répondre à « pourquoi a-t-il dit cela ».

  5. 05

    5. Les outils — quand l’agent doit faire quelque chose, pas seulement le dire

    Si la réponse exige une action, le modèle appelle un outil. Un outil est de trois types : un webhook vers votre système, un fragment de code exécuté isolément, ou un outil intégré à la plateforme. La boucle modèle–outil–modèle a au maximum cinq tours, dans les deux moteurs. Après cinq, elle s’arrête et répond avec ce qu’elle a.

    Le délai maximal par défaut d’un outil est de 15 secondes. Les outils intégrés existant aujourd’hui : recherche dans une page web, heure actuelle, calculatrice, écriture dans une feuille de calcul Google, notification de lead dans Telegram, envoi de SMS, six outils de programmation pour un système externe de réservation, et trois pour le catalogue d’une boutique — recherche, correspondance et fiche produit. Le catalogue lit en direct, avec une mémoire tampon de dix minutes, jusqu’à 30 pages et un temps maximal de 20 secondes. Il existe un ensemble d’outils marqués comme internes, dont le résultat n’apparaît jamais dans le texte vu par le client.

  6. 06

    6. La réponse, avec l’historique sous les yeux

    Le modèle reçoit la question, les fragments trouvés, les résultats des outils et l’historique de la conversation — les 25 derniers messages sur le chemin principal, 50 sur le nouveau moteur. L’appel a un temps maximal de 120 secondes, avec deux nouvelles tentatives ; l’appel après les outils, 90 secondes. La réponse repart sur le canal d’où est venue la question, dans la langue dans laquelle elle a été posée.

    Le nouveau moteur d’agents se lance par commutateur, par agent, par compte ou globalement — tout ne change pas d’un coup. On peut ainsi comparer le comportement ancien et le nouveau sur le même trafic, ce qui est la seule manière honnête de dire que quelque chose est meilleur.

  7. 07

    7. La remise à un humain

    Le fil a un état : bot ou humain. Le passage peut se faire de quatre façons. Par mots-clés — une liste de dix-sept expressions en roumain, anglais et russe, les mots seuls comparés à la frontière de mot, les expressions par correspondance dans le texte. Par frustration — une deuxième liste, elle aussi de dix-sept. Par répétition — la même question posée trois fois dans les dix derniers messages, comptée uniquement pour les messages de plus de dix caractères. Ou par la décision du modèle, qui peut demander la remise avec un marqueur spécial.

    Le mode est par agent et est désactivé par défaut — on choisit entre « désactivé », « par mots-clés » et « intelligent ». Quand il se déclenche : le fil passe en « attendre un humain », le moment est enregistré, le client reçoit un message de confirmation dans sa langue, et l’agent se tait. Il ne répond pas en parallèle, ne complète pas, ne s’excuse pas. Il se tait, et c’est tout. Il existe aussi le protocole officiel de remise de Meta, qui transfère le contrôle du fil vers la boîte de la page ; le canal de secours continue d’enregistrer les messages même quand le contrôle est entre les mains d’un humain, afin que l’historique n’ait pas de trou.

  8. 08

    8. Lorsque l’opérateur répond depuis la page, l’agent s’arrête tout seul

    Si une personne écrit au client directement depuis l’interface Meta, la plateforme voit l’écho de ce message et met automatiquement le fil en pause, sans que personne n’appuie sur quoi que ce soit. La durée par défaut est de 30 minutes, configurable entre cinq minutes et sept jours. C’est le cas le plus facile à manquer lors de la conception d’un assistant : personne n’appuie sur un bouton de prise en charge, l’humain répond simplement, et si la plateforme ne le remarque pas, le client reçoit deux voix en même temps.

    La reprise a trois voies. Réactivation automatique après 30 minutes sans réponse humaine — une boucle vérifie chaque minute et réactive par lots d’au plus 50 fils, en nettoyant aussi la mémoire de la conversation pour que l’agent ne poursuive pas une discussion qu’il n’a pas eue. L’expiration de la pause, vérifiée séparément. Et le bouton du panneau : prise en charge, résolution, retour au bot, arrêt complet du bot.

  9. 09

    9. La clôture — et ce qui ne se clôt pas tout seul

    Le fil est marqué résolu manuellement, depuis le panneau, avec des notes de résolution et avec un message système écrit dans l’historique. Il n’existe pas de clôture automatique pour inactivité : un fil laissé ouvert reste ouvert. Nous avons choisi de le dire ainsi plutôt que de laisser l’impression que tout se nettoie tout seul.

    Ce qui se clôt tout seul, en revanche, ce sont deux choses : la réactivation de l’agent après 30 minutes, décrite plus haut, et les escalades envoyées dans Telegram, qui après 30 minutes sans réponse sont marquées comme expirées et renvoient le fil à l’agent, avec le motif écrit. Au-dessus de tout cela fonctionne un indicateur de temps de réponse : au-delà d’une heure, il devient un avertissement, au-delà de quatre heures, il devient un dépassement. Il colore, il ne clôt pas.

Asistentul magazinuluiSe potrivește cu aparatul meu?Spune-mi modelul aparatului.Verific variantele din catalog.Catalog conectat · informație verificatăEchipa poate prelua conversația.
Schemă explicativă · mesaj, context, acțiune, predare

Comentarii

Les commentaires : pourquoi ce ne sont pas des messages et pourquoi ils ne sont pas traités comme des messages

Un message privé n’a qu’un seul lecteur. Un commentaire a tous les lecteurs de la page, y compris la concurrence, y compris quelqu’un qui cherche une raison de scandale. Une bonne réponse en privé peut être un désastre en public — par exemple un prix, une disponibilité, ou la confirmation que quelqu’un est bien votre client. C’est pourquoi les commentaires ont un parcours séparé, des règles séparées et une valeur par défaut qui penche vers la discrétion.

Comment un commentaire entre dans le système

La page s’abonne à des champs différents sur les deux réseaux : sur Facebook au flux de la page, sur Instagram explicitement aux commentaires et aux commentaires des diffusions en direct. Ils arrivent au même point d’entrée que les messages, mais sur une branche séparée, reconnue à la présence d’une liste de changements au lieu d’une liste de messages. Le format diffère entre les réseaux et est détecté séparément pour chacun. On lit aussi le commentaire parent, afin de savoir s’il s’agit d’une réponse à un autre commentaire, ainsi que la publication ou le contenu sur lequel il est apparu.

Seuls les nouveaux commentaires déclenchent quelque chose

Meta envoie le même événement pour plusieurs actions. Seul l’ajout d’un commentaire déclenche l’agent. La modification, la suppression, le masquage et le démasquage sont journalisés et s’arrêtent là. La modification du nombre de mentions J’aime est ignorée sans trace, sinon le journal ne serait que du bruit pur.

Quatre filtres avant que l’agent ne voie le texte

Les commentaires de la page elle-même sont rejetés — sinon l’agent se répondrait à lui-même, à l’infini. Les commentaires déjà traités sont rejetés selon l’identifiant unique du commentaire, qui a une contrainte d’unicité dans la base. Les commentaires vides, ceux de deux caractères au plus et ceux composés uniquement d’emojis sont rejetés. Et les textes contenant de longs numéros de téléphone ou des adresses web passent par un filtre antispam à quatre motifs et s’arrêtent, marqués comme tels.

Public ou privé : la valeur par défaut est privé

Chaque agent a quatre commutateurs séparés, deux pour Facebook et deux pour Instagram : réponse publique activée ou désactivée, réponse privée activée ou désactivée. Au-dessus d’eux se trouve un mode général à trois positions — désactivé, automatique, ou avec approbation. Lorsque la configuration est absente ou illisible, la valeur de repli dans le code n’est pas « répondre publiquement », mais « ne pas répondre publiquement, répondre en privé ». C’est un choix délibéré : une erreur de configuration n’a pas le droit de projeter du texte sur le mur public de quelqu’un.

Agent désactivé signifie commentaires désactivés

Si l’assistant est archivé, inactif, désactivé ou mis en pause, ou si le bot est arrêté depuis le compte client, le mode commentaires devient automatiquement « arrêté », quel que soit ce qui est écrit dans les interrupteurs de commentaires. Un seul endroit à arrêter, pas quatre à retenir.

Ce qui n’est pas répondu publiquement, et à quel point la règle est stricte

L’instruction donnée au modèle pour une réponse publique est explicite : au maximum deux phrases, ton bref et amical, invitation à envoyer un message privé pour les détails, et interdiction de donner des informations détaillées ou des prix en public. Au-dessus, une limite stricte : la réponse publique est tronquée à 300 caractères. Au-dessus des deux, le texte libre que vous écrivez vous-mêmes comme instructions propres, séparément pour le public et pour le privé. Nous disons honnêtement à quel point la règle est stricte : c’est une instruction de prompt plus une limite de longueur, pas un filtre déterministe qui pourrait garantir qu’un prix n’apparaisse jamais. Quand la garantie doit être stricte, on désactive la réponse publique et on ne laisse que la privée, ou on passe au mode avec approbation.

Une seule fois toutes les 30 secondes, sur la même publication

La réponse publique a un compteur par publication : au plus une toutes les 30 secondes. La raison est ce qui se passe quand une publication prend — trente commentaires en deux minutes, et la page se remplit de réponses identiques d’un robot, sous chacun. Le compteur se nettoie tout seul, en conservant les mille dernières publications suivies.

Instagram ne permet pas le message privé sur un sous-commentaire

C’est une règle de la plateforme, pas la nôtre, et elle est vérifiée à trois endroits différents dans le code, sur les trois voies possibles pour arriver à un message privé. Quand le commentaire a un parent et que le réseau est Instagram, l’envoi en privé est sauté et la raison exacte est écrite dans le journal. On n’essaie pas et on n’échoue pas en silence — on saute, explicitement.

Du commentaire à la conversation

Le passage se fait par le mécanisme officiel : le message privé est envoyé en utilisant l’identifiant du commentaire comme destinataire, et non l’identifiant de la personne. À partir de ce moment, il existe un fil de messages normal, avec toutes les règles ci-dessus — tampon, sources, outils, transfert à un humain. Le fil est marqué comme provenant des commentaires, et le commentaire reçu est enregistré dans l’historique de la conversation avec un type propre, afin de voir d’où tout a commencé.

Mode avec approbation : l’agent écrit, l’humain publie

Quand le mode est « avec approbation », la réponse générée ne part pas. Elle est enregistrée comme brouillon, en attente, et apparaît dans une file dans le panneau, avec un compteur. De là, elle est approuvée ou rejetée, morceau par morceau. La publication approuvée passe par un pont interne protégé par une comparaison de signature à temps constant — une réponse approuvée ne peut pas être injectée de l’extérieur.

Ce qu’un humain peut faire, manuellement

Masquer un commentaire, avec le mécanisme approprié à chaque réseau, et marquer l’état dans la base. Supprimer, avec un marquage de suppression. Masquage en masse, au maximum 25 commentaires par lot. Fermer les commentaires sur un contenu Instagram. Et masquer les commentaires d’une diffusion en direct, par une voie séparée. Ce sont des actions manuelles, pas automatiques. Il n’existe pas de liste de mots interdits qui masque les commentaires toute seule, et nous ne prétendons pas qu’elle existe.

Predarea

Quand l’agent n’a plus rien à dire

L’escalade n’est pas un échec de l’agent. C’est sa fonction la plus importante, car la seule chose pire qu’un assistant qui ne sait pas est un assistant qui ne sait pas et continue de parler. Ce qui suit est la façon dont le transfert se présente, qui est notifié, ce qu’il advient de la réponse humaine et comment l’agent revient.

La carte qui part dans le groupe Telegram

Un outil intégré envoie le cas dans un groupe, avec un en-tête qui indique d’emblée de quel type de cas il s’agit : urgence, demande d’opérateur, signalement d’abus, escalade de client mécontent, nouveau lead, ou nouvelle conversation. Le type est détecté à partir du texte, avec des modèles séparés pour chacun. Le message du client est attaché verbatim sur la carte — la personne qui prend le relais voit exactement ce que le client a écrit, pas un résumé.

La prise en charge est une course, et elle est traitée comme une course

La carte a deux états : ouverte et bloquée. La prise en charge se fait avec une écriture conditionnelle qui ne change l’état que s’il était encore ouvert, et le code vérifie effectivement combien de lignes ont été modifiées. Deux opérateurs qui appuient à la même seconde ne la prennent pas tous les deux. Le second apprend qu’elle a déjà été prise en charge ; il n’en arrive pas à écrire en parallèle.

La réponse de l’opérateur est réécrite dans la langue du client

L’opérateur écrit en groupe, dans sa langue et dans son style, parfois de façon télégraphique. Avant la livraison, le texte est réécrit dans la langue que parle le client et dans le ton de l’agent, sans ajouter de faits nouveaux. Ce que dit l’opérateur reste ce qui est transmis ; seule la forme change. L’acheminement de la réponse vers la bonne conversation se fait selon le message auquel on a répondu, et, s’il manque, selon le seul dossier bloqué par cet opérateur — et il est explicitement refusé s’il en a deux, au lieu de deviner.

Qui est notifié, et ce qui n’est plus notifié

Le tableau de bord reçoit une notification en temps réel via une connexion permanente. Les pauses déclenchées par des règles envoient une notification par e-mail ou sur Telegram, au choix — ce sont les deux seuls canaux acceptés dans le code. Nous disons aussi ce qui ne fonctionne plus : la notification par e-mail pour un fil pris en charge par un humain a été désactivée intentionnellement en juillet 2026, et la route interne est restée comme réponse vide. Si vous comptez sur cet e-mail, il n’arrive pas. Nous préférons que vous le sachiez ici.

Les règles de pause, au-delà des mots-clés

Il est possible d’écrire des règles qui mettent le fil en pause à l’apparition d’un numéro de téléphone, d’une adresse e-mail, d’un ensemble de mots allant jusqu’à cent, ou à une demande explicite d’un humain. Par-dessus, deux types évalués par le modèle : intention et sentiment. La durée de la pause est comprise entre une minute et sept jours ; la valeur zéro signifie une pause jusqu’à ce que quelqu’un la lève manuellement.

Chaque changement de main est consigné

Il existe un journal des prises en charge avec six actions distinctes : prise en charge par un humain, prise en charge par un bot, réactivation automatique, prise en charge par un opérateur, libération par un opérateur et reprise par l’agent. Ce n’est pas une colonne d’état qui est écrasée — c’est un historique. Quand quelqu’un demande « qui parlait avec le client à ce moment-là », la réponse est une ligne, pas une reconstitution.

Ce qui n’existe pas, pour ne pas vous appuyer sur ce qui n’est pas là

Il n’existe pas de répartition automatique vers des courriers ou des équipes de terrain ; nous avons cherché dans tout le code et ce n’est pas là. Il n’existe pas de fermeture automatique des conversations pour inactivité. Il n’existe pas de liste globale de mots interdits pour les commentaires. Ce qui existe, ce sont les quatre déclencheurs de transfert, l’escalade dans Telegram avec prise en charge atomique, les règles de pause, et la réactivation automatique à 30 minutes.

Fiecare afirmație de pe această pagină a fost citită din codul platformei — 66 citări cu fișier și linie, păstrate în depozitul nostru. Le parcurgem împreună, la cerere.