Passer au contenu
megapromotingDiscutons

Expertise · Assistants IA

Des assistants qui répondent sur les canaux sur lesquels écrivent vos clients, à partir de vos informations, et qui transmettent la discussion à une personne lorsqu’ils dépassent leur rôle.

Nous implémentons des assistants textuels sur notre plateforme, aichat.md, qui fonctionne en production. Le travail comprend des canaux connectés avec du code propre, une base de connaissances indexée, des outils qui s’exécutent dans vos systèmes et un passage de relais à l’humain enregistré dans la base de données.

Déjà construitLe service s’appuie sur une plateforme propre en production, et non sur une promesse. `https://aichat.md` répond publiquement (307 vers `/ro`, vérifié le 06.09.2026), et les comportements décrits ci-dessous sont lus dans le schéma de la base de données et dans les routes de la plateforme, avec fichier et ligne : les seuils de recherche, les types d’outils et leur délai maximal, les états du fil de discussion, le journal de prise en charge. La deuxième implémentation propre citée est la fonction de catalogue de boutique (`storeCatalog.service.js` plus trois outils intégrés), écrite comme fonction de plateforme à la place des outils par client. Ce que la preuve ne soutient pas, nous le disons aussi explicitement : les messages du modèle WhatsApp n’existent pas dans le code, donc nous ne promettons pas de messages proactifs en dehors de la fenêtre de 24 heures.

Un assistant utile n’est pas celui qui écrit joliment, mais celui qui est connecté à la vraie information de l’entreprise et qui sait où s’arrêter. Notre travail commence par le canal sur lequel écrivent vos clients et se termine à la personne qui reprend la discussion lorsque l’assistant n’a plus rien à dire. Entre les deux, nous mettons les connaissances, les outils et les limites.

La plateforme sur laquelle nous construisons est aichat.md, faite par nous et en production. Cela change la nature du service : nous n’intégrons pas une boîte noire d’un autre, mais configurons un système dans lequel nous pouvons lire chaque seuil et modifier chaque comportement. Quand nous disons que la réponse utilise par défaut cinq fragments des documents de vos clients, avec un seuil de similarité de 0,70 et une pondération de 30 % sur la correspondance des mots, ce sont des valeurs du schéma de la base de données, et non une description de brochure.

Les canaux avec code propre, vérifiés le 06.09.2026, sont six : Facebook Messenger, Instagram Direct, Telegram, 999.md, le widget du site et WhatsApp Business via Cloud API sur Graph v22.0. Chacun a son propre module, pas une case cochée — et les différences entre eux comptent en pratique : Messenger peut afficher un carrousel de produits, Instagram non, car Meta ne fournit pas de modèles génériques sur Instagram.

La partie que les clients sous-estiment est la transmission à un humain. Dans aichat, elle n’est pas une promesse, mais un état dans la base de données : le fil est `bot` ou `human`, le journal de prise en charge distingue la prise en charge par un humain, le retour au bot et la réactivation automatique, et le fil a séparément un état de respect du temps de réponse — `ok`, `warning`, `breached`. On peut montrer, à la fin du mois, combien de discussions ont été prises en charge et en combien de temps.

Ce que cela comprend

Le travail, par composantes

Nous connectons le canal et vérifions ce qui se passe lorsqu’il se tait

Six canaux ont leur propre code dans la plateforme : Messenger, Instagram Direct, Telegram, 999.md, le widget web et WhatsApp Business Cloud API sur Graph v22.0. La connexion Meta se fait via Embedded Signup. Pour chaque canal, nous vérifions aussi le mauvais cas, pas seulement le premier message réussi : un jeton de page expiré arrête le canal en silence, pas avec une erreur visible, c’est pourquoi la plateforme dispose d’une surveillance des jetons et d’une notification à l’expiration.

Nous indexons les connaissances et fixons les seuils selon lesquels elle cherche

Les documents et les pages sont découpés en fragments avec hash de contenu et embeddings `text-embedding-3-small`. Les valeurs par défaut que nous lançons puis ajustons : cinq fragments par question, seuil de similarité 0,70, recherche hybride, pondération 0,30 sur la correspondance des mots, attribution de la source activée. Chaque requête peut être journalisée avec les fragments renvoyés, les scores et les temps — donc le « pourquoi a-t-il répondu ainsi » a une réponse avec des données, pas avec des suppositions.

Nous relions les outils aux systèmes qui exécutent

Un outil peut être un webhook vers votre système, avec la méthode et les en-têtes de votre choix, un morceau de code JavaScript exécuté par la plateforme, ou un outil intégré à la plateforme. Chacun a un temps maximal d’exécution, par défaut 15 secondes. La conséquence pratique, dite avant le contrat, pas après : une intégration qui répond en 40 secondes doit être faite en asynchrone, pas imposée dans la conversation.

Catalogue vivant, connecté à l’adresse du magasin

Pour les magasins, il existe trois outils intégrés — `store_catalog_search`, `store_catalog_match`, `store_catalog_product` — au-dessus d’un service commun de catalogue. Pour WooCommerce, Store API est publique, donc le magasin se connecte avec l’adresse du site, sans clés d’accès. Avant, le catalogue était écrit comme outil séparé pour chaque client ; il est devenu une fonction de la plateforme justement parce que la variante avec des outils écrits au nom du client ne pouvait pas être maintenue.

Passage à l’humain, avec traçabilité

Le fil a un état explicite `bot` ou `human`. Le journal de prise en charge connaît trois actions : prise en charge par un humain, retour au bot et réactivation automatique. À part cela, le fil a un état de respect du délai de réponse : `ok`, `warning`, `breached`. Le module de prise en charge de la plateforme a une file et des rôles. Nous établissons dès la première discussion qui prend en charge et en combien de temps, car cet état se mesure dès le premier fil, il ne s’ajoute pas plus tard.

Voix dans la conversation écrite

La note vocale reçue sur WhatsApp ou Telegram est transcrite avec `whisper-1` et entre dans la conversation comme texte. La réponse peut repartir en voix, via `tts-1` ou via ElevenLabs, avec des réglages de stabilité et de similitude par voix. Pour ceux qui dictent au lieu d’écrire — un artisan sur le terrain, un chauffeur — c’est la différence entre un canal utilisable et un canal décoratif.

Traduction dans la conversation, dans un seul sens aujourd’hui

La réponse de l’opérateur peut être réécrite dans la langue du client, avec le ton de l’agent et sans ajouter de faits. Le sens inverse — le message du client traduit pour l’opérateur — n’existe pas dans le code à la date de vérification, donc l’opérateur lit l’original. Nous le précisons parce que c’est la différence entre une équipe qui peut servir un client russe ou anglais et une équipe qui croit pouvoir le faire.

Le comportement face aux messages en double et aux rafales

Le webhook Meta renvoie bien le même message : la déduplication se fait sur l’identifiant du message, avec 120 secondes de mémoire. Et quand quelqu’un écrit trois lignes l’une après l’autre, elles sont regroupées dans un tampon de 15 secondes et reçoivent une seule réponse, à tout ce que la personne a écrit, pas trois réponses partielles.

Le modèle n’est pas lié à un fournisseur

Les appels passent par une passerelle propre à `api.megapromoting.com/v1`, qui parle le format OpenAI pour tous les fournisseurs en arrière-plan. Le modèle se choisit par assistant et peut être changé sans réécrire l’intégration. Pour les embeddings, nous utilisons `text-embedding-3-small`.

À quoi cela ressemble

Le parcours, étape par étape.

01

Nous choisissons le canal et la personne qui prend en charge

Un canal, un public, un résultat visé. Dans la même discussion, on établit qui prend en charge les fils marqués `human` et en combien de temps. Nous livrons : la liste des scénarios couverts par l’assistant et la liste explicite de ceux qu’il ne couvre pas.

02

Nous connectons les sources et vérifions ce qui en sort

Les documents et les pages entrent comme sources de connaissances. Pour les catalogues, nous vérifions les produits extraits un par un là où le prix compte. Nous livrons : les sources indexées, les seuils de recherche réglés pour votre cas et un ensemble de questions de contrôle avec les réponses obtenues.

03

Nous connectons les outils et testons le cas lent

Webhook vers le CRM ou l’ERP, code pour des transformations propres, outil intégré pour ce qui existe déjà. Nous testons le cas lent et le cas d’erreur, pas seulement le cas heureux, parce que la limite de 15 secondes est celle qui décide. Nous livrons : les outils configurés et le comportement documenté en cas de dépassement de la limite.

04

Nous ouvrons le canal avec la surveillance activée

Le canal entre en service avec la surveillance du token active et avec la prise en charge humaine exercée au moins une fois sur un cas réel. Nous livrons : l’accès au tableau de bord, la procédure de prise en charge et les points où le système s’arrête de lui-même.

05

Nous lisons les journaux et nous ajustons

Après les premières conversations réelles, on consulte le journal des requêtes : ce qu’il a trouvé, avec quel score, en combien de temps. À partir de là, on règle le seuil, le nombre de fragments ou le texte de la source. Nous livrons : la liste des modifications apportées et le motif de chacune.

Le chemin d'un message1canal conectat2dedublare peidentifiant ettampon de 15 secunde3recherche dans les sourcestale (5 fragmente,prag 0,70)4outil avec une limite de15 secunderéponse avec source, outrecere pe stareahuman cu jurnal depreluare
Le chemin d'un message

Les données

Ce que nous touchons, où elles sont et combien de temps elles restent

Les questions que pose toute personne ayant un délégué à la protection des données — posées ici avant qu'il ne les pose.

Où se trouvent les conversations
MySQL, sur son propre serveur dans Microsoft Azure. Le schéma compte plus de 80 tables modélisées dans Prisma, avec des tables séparées pour les fils Meta, les fils Telegram, les fils 999.md, les commentaires, les étiquettes, les notes internes et le journal d’audit.
Les jetons de canal sont conservés chiffrés
Le jeton WhatsApp est stocké chiffré avec Fernet, avec retour en texte clair uniquement pour les anciens enregistrements. Les messages ont leur propre module de chiffrement dans le service de canaux. Il existe une surveillance des jetons et une notification à l’expiration.
Ce que le widget voit et d'où
Le widget dispose d’une liste d’origines autorisées par assistant. Le comportement par défaut doit être connu : si la liste est vide, la vérification passe — c’est un choix de compatibilité avec les anciennes installations, écrit tel quel dans le code. Cela signifie que la restriction par domaine se configure explicitement pour chaque implémentation qui l’exige ; nous la configurons, nous ne la supposons pas.
Quelles données personnelles entrent sans que vous les demandiez
Le champ libre d’une conversation peut contenir n’importe quoi — un numéro de téléphone, une adresse, un problème médical. On ne peut pas l’empêcher techniquement, mais on peut le traiter : on définit ce qui est conservé, pendant combien de temps, qui y a accès et ce que l’équipe doit être formée à ne pas demander sur le canal. Le registre des traitements de l’implémentation est rédigé en même temps que l’implémentation, et non après.
Le délai de conservation
Il est défini par implémentation et est inscrit dans la politique publiée du client. La règle que nous appliquons chez nous et que nous exigeons aussi dans les projets : si une modification de code change ce qui est collecté, à qui cela parvient ou pendant combien de temps c’est conservé, la politique publiée est modifiée dans le même commit.

Un cas

Une demande de prix qui part d’Instagram et aboutit à une personne

La situation

Un magasin avec un catalogue en ligne recevait des questions de prix dans les DM d’Instagram et sur Messenger. Les mêmes cinq questions, toute la journée, alors que la bonne réponse existait déjà sur le site.

Ce que nous avons construit

Nous avons connecté les deux canaux, indexé les sources et relié le catalogue via les outils intégrés du magasin, qui, pour WooCommerce, lisent l’Store API publique — donc sans clés d’accès dans la plateforme. Nous avons défini le tampon de concaténation, afin que trois messages écrits à la suite deviennent une seule question, et nous avons écrit explicitement ce que l’assistant n’a pas le droit de faire. Sur Messenger, nous avons lancé le carrousel de produits, avec les trois conditions dont il dépend ; sur Instagram, nous sommes restés au texte plus image, car Meta n’y propose pas de modèles génériques.

Ce qui en est sorti

Les questions de prix et de disponibilité reçoivent une réponse avec le produit affiché et le lien. Ce qui sort du catalogue passe à l’état `human` et parvient à la personne désignée, avec tout le contexte de la discussion. Le journal des requêtes montre ce que l’assistant a trouvé, avec quel score et en combien de temps, donc le réglage se fait sur des données.

Ce que le cas ne dit pas

Le résultat dépend de la qualité du catalogue. Un prix erroné sur le site devient un prix erroné dans la conversation — l’assistant lit la source, il ne la corrige pas. Et nous n’avons pas mesuré la réduction du volume de travail de l’équipe, donc nous ne l’affirmons pas comme résultat.

Questions

Ce que les gens nous demandent avant d'appeler

Peut-il écrire lui-même en premier sur WhatsApp à un client qui n’a pas écrit depuis une semaine ?

Non. Et la raison tient à la fois à Meta et à un manque réel chez nous. En dehors de la fenêtre de 24 heures depuis le dernier message du client, Meta rejette le texte libre avec l’erreur 131047, et la plateforme marque le message comme échoué et affiche l’erreur au lieu de prétendre qu’il est parti. L’envoi hors fenêtre nécessite des messages de modèle approuvés par Meta, et ceux-ci n’existent pas dans notre code — une recherche du type `template` dans tout le code renvoie zéro résultat. Donc : réponse dans la fenêtre de 24 heures, oui ; campagne proactive sur WhatsApp, non, jusqu’à l’implémentation des modèles.

Sur quels canaux fonctionne-t-il réellement, aujourd’hui ?

Six, avec code propre vérifié le 06.09.2026 : Facebook Messenger, Instagram Direct, Telegram, 999.md, widget web et WhatsApp Business Cloud API. Un audit interne plus ancien a trouvé du code aussi pour les SMS et l’e-mail ; nous ne les avons pas revérifiés à cette date, donc nous ne les indiquons pas comme disponibles sans vérification sur l’implémentation concrète. Un canal apparu entre-temps n’est pas supposé connecté.

L’intégration avec 999.md est-elle officielle ?

Ce n’est pas une intégration de partenaire avec API publique. Cela fonctionne avec la session de votre compte : la plateforme vous demande la valeur du cookie de session de votre navigateur et l’utilise pour lire et répondre aux messages. La conséquence pratique, dite d’avance : si 999.md change le mécanisme de session, l’intégration s’arrête et doit être reconnectée. Qui n’accepte pas ce risque ne devrait pas démarrer sur ce canal.

Comment sait-il la réponse et que fait-il quand il ne la sait pas ?

Recherchez dans vos sources avec une recherche hybride — par défaut cinq fragments, seuil 0,70, 30 % de pondération sur les mots, le reste sémantique — et vous pouvez joindre la source à la réponse. Quand elle ne trouve rien, la voie prévue est le transfert à un humain : le fil passe à l’état `human`, et le journal enregistre qui a pris le relais et quand. Il existe aussi un retour automatique au bot, lui aussi comme action enregistrée.

Peut-il afficher des produits avec photo et prix ?

Sur Messenger, oui — carrousel de cartes. Sur Instagram, non : Meta ne propose pas de modèles génériques sur Instagram, donc là il reste du texte plus une photo. Le carrousel exige trois choses en même temps : qu’il soit activé dans la configuration de l’assistant, que l’outil renvoie au moins deux produits, et que l’instruction de l’assistant demande une liste avec prix et lien — parce que le détecteur regarde le texte de l’agent, pas seulement les données. Si l’une des trois manque, le carrousel n’est pas construit. Nous configurons les trois, mais il est utile de savoir pourquoi.

Qui répond au client qui écrit en russe à l’équipe qui parle roumain ?

La réponse de l’opérateur peut être réécrite automatiquement dans la langue du client, en conservant le ton de l’agent et sans ajouter de faits — cela fonctionne. Le sens inverse, le message du client traduit pour l’opérateur, n’existe pas dans le code à la date de vérification. En pratique : le client reçoit une réponse dans sa langue, mais l’opérateur lit le message original. Si vous avez aussi besoin de l’autre sens, c’est un travail à faire, pas un réglage à cocher.

Que se passe-t-il si un client envoie le même message deux fois ?

Il ne reçoit pas deux réponses. Les doublons sont filtrés sur l’identifiant du message, avec 120 secondes de mémoire — le webhook Meta renvoie bien le message. Et les messages écrits l’un après l’autre sont regroupés dans un tampon de 15 secondes et reçoivent une seule réponse, pour l’ensemble.

Avec quel modèle IA répond-il et que se passe-t-il si j’en veux un autre ?

Les appels passent par une passerelle propre à `api.megapromoting.com/v1`, qui parle le format OpenAI pour tous les fournisseurs en arrière-plan ; le modèle est choisi par assistant. Changer de modèle ne demande pas de réécrire l’intégration. Pour les embeddings, nous utilisons `text-embedding-3-small`; changer de modèle d’embedding, en revanche, demande une réindexation des sources — ce n’est pas la même chose.

Que ne fait pas ce service ?

Il ne fait pas la voix au téléphone — c’est une autre plateforme de la nôtre, Kallina, et c’est un autre travail. Il n’envoie pas de messages proactifs sur WhatsApp, pour la raison ci-dessus. Il ne génère pas de PDF et n’attache pas les photographies reçues à une commande — à la date de vérification, la photographie reçue est seulement marquée. Et nous ne garantissons pas de pourcentages de réduction du volume de travail : nous n’avons pas la mesure, donc nous ne l’affirmons pas.

Sur quoi reposent les affirmations ci-dessus (21 sources)
  1. aichat.md répond publiquement — 307 vers https://aichat.md/rohttps://aichat.md · 2026-09-06

20 d'entre elles sont du code et des fichiers de nos dépôts. Nous n'en publions ni le nom ni la ligne : réunies sur une seule page, elles décriraient trop précisément comment sont construits des systèmes qui ne sont pas seulement les nôtres. Nous les parcourons avec vous, dans le dépôt, sur demande — la vérification reste possible, elle se fait simplement lors d'un échange.

Qu'est-ce que vous voudriez voir mieux fonctionner ?

Racontez-nous votre processus. Ensemble, nous décidons ce qui vaut la peine d'être construit, ce que nous pouvons connecter et comment nous vérifions le résultat.

Discutons