Guides

Bot de support IA : modèle économique d'abord, puis escalade

TchaviPar Gael — fondateur de Tchavi

· 12 min de lecture

Retour au blog

Sommaire

Oui, un petit modèle peut répondre à la plupart des messages d'un support client, et un modèle plus fort ne sert que pour le reste. En octobre 2026, j'ai mesuré ça sur 20 messages de clients d'une boutique de Cotonou : GPT-6 Luna a traité seul les 12 questions de routine, et il a passé la main sur 7 des 8 questions difficiles. Le tout a coûté 85 crédits, soit 28 F, contre 156 crédits (52 F) en envoyant tout à Claude Sonnet 5.5.

Ce guide te donne la règle, le code Node.js et les chiffres. Il te dit aussi ce qui a failli mal tourner : un message difficile a reçu une réponse sûre d'elle, et le petit modèle avait tort de l'être.

En bref

  • Avec Tchavi, une passerelle d'API IA compatible OpenAI que tu paies en mobile money, tu changes de modèle en changeant une chaîne : le même code appelle GPT-6 Luna pour les questions de routine et Claude Sonnet 5.5 pour les cas difficiles.
  • Sur 20 messages mesurés : 85 crédits (28 F) pour le montage « petit modèle d'abord », contre 156 crédits (52 F) tout sur Sonnet 5.5, soit 45 % de moins.
  • Le coût par message résolu passe de 7,8 crédits (2,6 F) à 4,5 crédits (1,5 F), en comptant comme non résolu le message que le petit modèle a raté.
  • Ce qui décide d'escalader, c'est un booléen escalate, pas le score de confiance. Sur mes 20 messages, aucune escalade n'est venue du seuil de confiance seul.

Le principe

Un support client reçoit deux sortes de messages. Les premiers ont une réponse écrite quelque part : horaires, frais de livraison, paiement MoMo, politique d'échange. Les seconds demandent une décision, une information qu'on n'a pas, ou du calme face à un client en colère.

Envoyer les deux au même modèle, c'est payer le prix d'un modèle fort pour dire « nous ouvrons à 8 h ». Le montage est simple :

  1. Le petit modèle reçoit le message et la fiche de la boutique.
  2. Il répond en JSON : answer, confidence (de 0 à 1) et escalate (vrai ou faux).
  3. Ton code décide. Si escalate est vrai, si la confiance est sous le seuil ou si le JSON est illisible, le même message part vers le modèle fort. Sinon, la réponse du petit modèle part au client.

La règle vit dans ton application, pas dans le prompt. Le modèle propose, ton code dispose.

Le terrain de test

J'ai inventé une boutique, « Chez Akpè » : accessoires et téléphones à Cotonou. Sa fiche tient en quelques lignes : adresse, horaires (lundi au samedi, 8 h à 19 h), livraison à 1 000 F à Cotonou, 1 500 F à Abomey-Calavi, 2 500 F à Porto-Novo, gratuite à Cotonou dès 25 000 F, paiement MTN MoMo, Moov Money ou espèces à la livraison, échange sous 7 jours. Les remboursements, les garanties, les prix de gros et les suivis de colis sont traités par un conseiller humain.

J'ai écrit 20 messages comme ils arrivent sur WhatsApp, fautes comprises :

  • 12 messages de routine, par exemple « vous etes ouverts dimanche ? », « c combien la livraison à Calavi ? » ou « Salut j'ai pris pour 30 000 F, je suis à Cotonou, je paie la livraison ? » (réponse : non, elle est gratuite).
  • 8 messages difficiles : « On m'a débité 2 fois 18 500 F par MoMo, remboursez-moi sinon je fais un scandale », un colis en retard avec un livreur injoignable, un prix de gros pour Parakou, une garantie avec menace de plainte, un paiement validé à 15 h 10 alors que la limite est 15 h, un chargeur dont la compatibilité n'est dans aucune fiche, une livraison à Lomé.

Les modèles : GPT-6 Luna et Claude Haiku 5.5 en petit modèle (chacun testé séparément), Claude Sonnet 5.5 en modèle fort. Tout est passé par Tchavi, sur une instance de test aux tarifs publics. Une seule exécution par modèle, sans réglage de température.

Le code

Node.js 20, le SDK OpenAI, et l'URL de base de Tchavi. Le coût de chaque appel se lit dans l'en-tête x-credits-used.

import OpenAI from 'openai';

const client = new OpenAI({
  apiKey: process.env.TCHAVI_API_KEY,
  baseURL: 'https://tchavi.com/api/v1',
});

const CHEAP = 'gpt-6-luna';
const STRONG = 'claude-sonnet-5-5';
const THRESHOLD = 0.75;

const FAQ = `Tu es l'assistant WhatsApp de la boutique Chez Akpè, à Cotonou. Tu vouvoies.
Horaires : lundi au samedi, 8 h à 19 h. Livraison : Cotonou 1 000 F, Abomey-Calavi 1 500 F.
Paiement : MTN MoMo, Moov Money. N'invente jamais un fait absent de cette liste.`;

const CHEAP_RULES = `
Réponds UNIQUEMENT par un objet JSON : {"answer": string, "confidence": nombre de 0 à 1, "escalate": booléen}.
"escalate" vaut true si la liste ne permet pas de répondre, si une décision humaine est nécessaire, ou si tu hésites.`;

async function ask(model, system, text, json = false) {
  const { data, response } = await client.chat.completions
    .create({
      model,
      messages: [
        { role: 'system', content: system },
        { role: 'user', content: text },
      ],
      ...(json && { response_format: { type: 'json_object' } }),
    })
    .withResponse();
  return {
    content: data.choices[0].message.content ?? '',
    credits: Number(response.headers.get('x-credits-used') ?? 0),
  };
}

export async function reply(text) {
  const first = await ask(CHEAP, FAQ + CHEAP_RULES, text, true);
  let verdict;
  try {
    verdict = JSON.parse(first.content);
  } catch {
    verdict = null; // JSON illisible : on escalade
  }
  const sure = verdict && verdict.escalate === false && verdict.confidence >= THRESHOLD;
  if (sure) return { text: verdict.answer, model: CHEAP, credits: first.credits };

  const second = await ask(STRONG, FAQ, text);
  return { text: second.content, model: STRONG, credits: first.credits + second.credits };
}

Trois détails comptent. Le modèle fort reçoit la même fiche, sans la consigne JSON : il répond directement au client. La réponse du petit modèle est jetée en cas d'escalade, et ses crédits restent à ta charge, d'où first.credits + second.credits. Et un JSON illisible escalade au lieu de planter : le client ne doit jamais voir une erreur de ton parseur.

Pour changer de petit modèle, tu modifies CHEAP. Les pages de GPT-6 Luna, Claude Haiku 5.5 et Claude Sonnet 5.5 donnent leurs tarifs. Aux tarifs publics, pour un prompt de moins de 100 000 tokens (au-delà, les tarifs montent par paliers), Luna et Haiku 5.5 coûtent 0,22 crédit par millier de tokens en entrée et 1,1 en sortie ; Sonnet 5.5 coûte 4,4 et 22.

Ce que j'ai mesuré

Un message « résolu » veut dire : réponse juste selon la fiche. Pour les 12 messages de routine, j'ai vérifié par expression régulière que la réponse contenait le bon fait (8 h, 1 500, MoMo, lendemain...). Pour les 8 messages difficiles, j'ai lu les réponses : une escalade vers le modèle fort compte comme résolue, une réponse sûre d'elle sur un cas que la fiche ne tranche pas compte comme non résolue.

Luna d'abordHaiku 5.5 d'abordSonnet 5.5 sur tout
Messages escaladés7 sur 208 sur 20sans objet
Escalades justifiées (message difficile)7 sur 78 sur 8sans objet
Messages difficiles non escaladés10sans objet
Routine bien traitée sans escalade12 sur 1212 sur 1212 sur 12
Coût total85,3 crédits (28 F)102,5 crédits (34 F)155,7 crédits (52 F)
Coût par message résolu4,5 crédits (1,5 F)5,1 crédits (1,7 F)7,8 crédits (2,6 F)

Les deux petits modèles ont répondu seuls à toute la routine, sans une escalade de trop. Le coût moyen d'un message de routine est de 0,16 crédit avec Luna, contre 5,05 crédits avec Sonnet 5.5, soit une trentaine de fois moins. Haiku 5.5 revient à 0,30 crédit, parce qu'il répond plus longuement.

Le montage ne divise pas la facture par trente pour autant, parce que les messages difficiles coûtent cher : 11,9 crédits en moyenne chez Sonnet 5.5 (réponses longues, qui demandent le numéro de commande, les captures MoMo, etc.), plus le prix de la tentative du petit modèle. Avec 8 messages difficiles sur 20, soit 40 % de mon échantillon, l'économie est de 45 % avec Luna et de 34 % avec Haiku 5.5.

La confiance ne décide pas grand-chose

Je m'attendais à ce que le seuil de confiance fasse le travail. Ce n'est pas ce qui s'est passé.

Sur mes 20 messages, toutes les escalades sont venues du booléen escalate, aucune du seuil à 0,75. Luna annonce une confiance de 0,96 à 1 sur les 20 messages, y compris sur ceux qu'il escalade. Haiku 5.5 distingue mieux : 0,9 à 1 sur la routine, 0,6 sur le cas du paiement à 15 h 10, 0,2 sur la compatibilité du chargeur. Mais ces deux-là étaient déjà signalés par le booléen.

Ce que ça m'apprend : demande au modèle une décision (« dois-tu passer la main ? ») plutôt qu'un chiffre. Garde la confiance comme second filet, et regarde sa distribution sur tes propres messages avant de fixer un seuil.

Le message qui est passé

Un message difficile n'a pas été escaladé par Luna : « Je commande à 14h50 mais mon paiement MoMo valide à 15h10, c'est livré aujourd'hui ou demain ? ». Luna a répondu « Demain : votre commande sera validée après 15 h », avec une confiance de 0,96 et escalate: false.

La fiche dit que la limite est la validation de la commande avant 15 h. Elle ne dit pas si la validation, c'est le message ou le paiement. Luna a tranché sans le savoir. Sonnet 5.5 a posé la réserve (« si c'est ce moment qui compte comme validation, la livraison aurait lieu demain ») et proposé un conseiller. Haiku 5.5 a escaladé ce message avec une confiance de 0,6.

Sur 20 messages, un seuil à 0,97 aurait rattrapé cette erreur de Luna sans escalade inutile. Je ne le garderais pas pour autant : il est ajusté sur un seul cas. La vraie réponse est ailleurs : écris la règle dans la fiche (« la limite de 15 h s'applique à l'heure du paiement validé »). Un message ambigu pour le bot est souvent une règle qui manque à ta boutique.

Combien ça coûte sur ton trafic

Mon échantillon contient 40 % de messages difficiles, c'est beaucoup. Dans une vraie boutique, la routine domine. J'ai recalculé le coût moyen par message à partir de mes moyennes mesurées avec Luna (ce n'est pas une mesure, c'est un calcul) :

Part de messages difficilesLuna d'abordSonnet 5.5 sur toutÉconomie
10 %1,4 crédit (0,45 F)5,7 crédits (1,9 F)environ 76 %
20 %2,6 crédits (0,85 F)6,4 crédits (2,1 F)environ 60 %

Pour 100 messages par jour avec 10 % de difficiles, cela fait environ 136 crédits (45 F) par jour contre 573 crédits (191 F). Ces chiffres ne comptent que l'API IA. Si ton bot tourne sur WhatsApp, le guide du chatbot WhatsApp en Node.js détaille le reste : webhook, mémoire de conversation et facturation Meta.

Les pièges

  • Un modèle ne promet jamais un remboursement. Mets la règle dans la fiche (« les remboursements sont décidés par un conseiller ») et un escalate: true systématique pour ces sujets. Les deux petits modèles l'ont respectée sur mes 8 cas.
  • Le modèle fort peut aussi dire « je ne sais pas ». Sur la compatibilité du chargeur, Sonnet 5.5 a refusé de deviner et proposé un conseiller. Escalader vers un modèle plus fort ne remplace pas la fiche produit manquante : il faut un humain, ou les données.
  • Journalise chaque escalade. Garde le message, la décision du petit modèle et le motif. Une semaine de journaux te dit quelles questions manquent dans la fiche.
  • Mesure sur tes messages. Mes 20 messages sont inventés. Prends 20 vraies conversations de ta boutique, passe-les dans le script, et regarde les chiffres avant de fixer ton seuil.

FAQ

Faut-il toujours un petit modèle puis un gros ?

Non. Si presque tous tes messages sont difficiles (litiges, négociation), le petit modèle ne fait que rallonger la chaîne : tu paies sa tentative pour rien. Le montage paie quand la routine domine, et la part de messages difficiles de ta boutique se mesure en une semaine de journaux.

Quel petit modèle choisir : GPT-6 Luna ou Claude Haiku 5.5 ?

Au tarif public, ils coûtent pareil par token. Sur mes 20 messages, Luna a été moins cher (réponses plus courtes) et Haiku 5.5 a mieux repéré le cas ambigu. Un échantillon de 20 ne départage pas deux modèles : essaie les deux sur tes messages.

Pourquoi demander du JSON plutôt que du texte ?

Parce que ton code doit décider sans lire une phrase. Avec response_format: { type: 'json_object' }, les deux petits modèles ont renvoyé un JSON exploitable sur les 20 messages. Garde quand même le try/catch : un JSON illisible doit escalader.

Combien coûte un message en FCFA ?

Sur mes mesures, entre 0,05 F (une routine traitée par Luna : 0,16 crédit) et 4 F (un message difficile qui passe par Sonnet 5.5 : environ 12 crédits). 3 crédits valent 1 F. La page crédits et facturation explique le calcul, et l'en-tête x-credits-used te donne le coût exact de chaque appel.

Et si le client écrit en fon, en wolof ou par vocal ?

Ce guide ne l'a pas mesuré : mes 20 messages sont en français. Teste le montage sur des messages dans ta langue avant de t'y fier : un petit modèle peut hésiter là où un grand ne le fait pas. Pour un vocal, il faut d'abord le transcrire, puis le texte passe dans la même chaîne.

crée ton compte et recharge 1 000 F

Cet article fait partie de la série « Construire un SaaS IA depuis l'Afrique francophone ». Tchavi est une passerelle d'API IA compatible OpenAI : une seule clé donne accès à plus de 100 modèles de texte, d'image, d'audio et de vidéo, et tu la paies en mobile money, sans carte bancaire (pays et opérateurs). Plus de guides sur le blog. Pour suivre les prochains : LinkedIn et X.

Partager

Ton premier appel d'API, payé en mobile money

Sans carte bancaire. Recharge à partir de 1 000 F ; ta première recharge ajoute 150 crédits de bonus, et tes crédits n'expirent pas.