# Coût vs qualité : le modèle le moins cher qui tient ta barre

> Une méthode en 5 étapes pour choisir un modèle d'IA : 15 cas notés, une barre de réussite, le coût des 1 000 tâches en FCFA. Script Node.js, 4 modèles mesurés.

- Published: 2026-10-21
- Author: Gael — fondateur de Tchavi
- Canonical: https://tchavi.com/fr/blog/cout-qualite-choisir-le-bon-modele

---


Pour choisir un modèle, ne regarde pas les classements : écris 15 cas tirés de ta vraie tâche, fixe ta barre de réussite avant de lancer quoi que ce soit, passe 3 ou 4 modèles du moins cher au plus cher, et garde le moins cher qui passe la barre. J'ai appliqué cette méthode à l'extraction d'une commande depuis un message WhatsApp en français. En octobre 2026, à travers Tchavi, **les quatre modèles testés passent ma barre, et le moins cher à la tâche coûte 130 crédits (43 F) les 1 000 tâches, contre 2 766 crédits (922 F) pour le plus cher**.

Le modèle qui a le prix au token le plus bas n'est pas celui qui coûte le moins par tâche. Les chiffres sont plus bas.

## En bref

- **Avec Tchavi, une passerelle d'API IA compatible OpenAI que tu paies en mobile money, tu peux faire passer tes 15 cas à plusieurs modèles avec le même script**, en changeant une chaîne, et lire le coût de chaque appel dans l'en-tête `x-credits-used`.
- **Ma barre, fixée avant les essais** : au moins 14 cas sur 15 réussis, et 15 JSON valides sur 15.
- **Résultat sur 15 messages de commande** : GPT-6 Luna 15 sur 15 aux deux essais, GPT-5.4 Mini 15 puis 14, Qwen 3.7 Flash 14 et 14, Claude Sonnet 5.5 15 (un essai). Tous passent la barre.
- **Coût pour 1 000 tâches** : Luna 130 crédits (43 F), Qwen 3.7 Flash 256 crédits (85 F), GPT-5.4 Mini 795 crédits (265 F), Sonnet 5.5 2 766 crédits (922 F).
- **Mon jeu de 15 cas est trop facile** pour départager les trois premiers sur la qualité. Je te dis plus bas comment le durcir.

## La méthode en 5 étapes

1. **Prends une seule tâche réelle.** Pas « mon chatbot » en général : une tâche avec une sortie vérifiable. L'extraction d'une commande en JSON, le classement d'un ticket en catégories.
2. **Écris 15 cas notés.** Chaque cas est un vrai message (ou proche) et la réponse attendue, écrite à la main. Mets-y les pièges de ta boutique : une correction du client, une quantité en lettres, une ville absente, un message qui n'est pas une commande.
3. **Fixe la barre avant de lancer.** Si tu la fixes après avoir vu les scores, tu la règles sur le modèle que tu préfères déjà. La mienne : 14 sur 15, JSON toujours valide.
4. **Passe 4 modèles, du moins cher au plus cher**, avec le même prompt et le même script. Note les réussites et les crédits.
5. **Calcule le coût pour 1 000 tâches, et prends le moins cher qui passe la barre.**

## Mes 15 cas

La tâche : une boutique d'accessoires à Cotonou reçoit des commandes sur WhatsApp. Le modèle doit renvoyer un JSON : les articles et quantités, la ville (Cotonou, Abomey-Calavi, Porto-Novo, autre, ou rien), le moyen de paiement (MTN MoMo, Moov Money, espèces, ou rien) et un booléen « urgent ».

Quelques-uns de mes 15 messages, tels que je les ai écrits :

- « Bonjour je veux 2 chargeurs 65W et 1 coque pour Tecno Spark 10, livrez à Calavi svp, je paie MTN »
- « Je prends 1 powerbank 20000mAh. Non attends, 2 powerbank. Cotonou, MoMo MTN » (une correction : la bonne quantité est 2)
- « une douzaine de coques iPhone 13 pour ma boutique à Calavi, paiement Moov » (quantité en lettres : 12)
- « bonjour, 5 films de protection pour Samsung A14, Porto-Novo, pas pressé, je paierai par Moov » (« pas pressé » : pas urgent)
- « Annulez le casque, je veux plutôt 2 paires d'écouteurs. Cotonou. »
- « 3 écouteurs sans fil + 1 chargeur voiture, livraison Parakou, espèces » (Parakou n'est pas dans la liste : « autre »)
- « Combien coûte le chargeur 65W ? » (ce n'est pas une commande : liste d'articles vide)

Un cas réussit seulement si **tout** est juste : les articles, la ville, le paiement et l'urgence.

## Le script de notation

Le coût d'un appel vient de l'en-tête `x-credits-used`. Le script appelle le modèle sur chaque cas, note, et additionne.

```js
import OpenAI from 'openai';

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

const MOTS = ['chargeur', 'coque', 'ecouteur', 'casque', 'cable', 'powerbank', 'ecran', 'film'];
const sansAccent = (s) => String(s).toLowerCase().normalize('NFD').replace(/[̀-ͯ]/g, '');

// attendu : { articles: { chargeur: 2 }, ville: 'Cotonou', paiement: null, urgent: false }
function note(reponse, attendu) {
  const erreurs = [];
  if (!reponse || typeof reponse !== 'object') return ['json_invalide'];

  const obtenu = {};
  for (const a of reponse.articles ?? []) {
    const mot = MOTS.find((m) => sansAccent(a.produit).includes(m));
    if (!mot) {
      erreurs.push('produit_inconnu');
      continue;
    }
    obtenu[mot] = (obtenu[mot] ?? 0) + Number(a.quantite);
  }
  const trie = (o) => JSON.stringify(Object.entries(o).sort());
  if (trie(obtenu) !== trie(attendu.articles)) erreurs.push('articles');
  if ((reponse.ville ?? null) !== attendu.ville) erreurs.push('ville');
  if ((reponse.paiement ?? null) !== attendu.paiement) erreurs.push('paiement');
  if (Boolean(reponse.urgent) !== attendu.urgent) erreurs.push('urgent');
  return erreurs;
}

export async function evalue(model, cas, systemPrompt) {
  let reussis = 0;
  let credits = 0;
  for (const c of cas) {
    const { data, response } = await client.chat.completions
      .create({
        model,
        messages: [
          { role: 'system', content: systemPrompt },
          { role: 'user', content: c.text },
        ],
        response_format: { type: 'json_object' },
      })
      .withResponse();
    credits += Number(response.headers.get('x-credits-used') ?? 0);

    let json = null;
    try {
      json = JSON.parse(data.choices[0].message.content ?? '');
    } catch {}
    const erreurs = note(json, c.exp);
    if (erreurs.length === 0) reussis++;
    else console.log(model, 'cas', c.id, erreurs.join(','));
  }
  const pour1000 = (credits / cas.length) * 1000;
  return { model, reussis, total: cas.length, credits, pour1000, francs: pour1000 / 3 };
}
```

Deux choix de notation à retenir. Les articles sont comparés par mot-clé et par quantité totale, pour ne pas pénaliser « chargeur 65W » contre « chargeur rapide ». Et la comparaison est stricte sur le reste : une ville fausse fait échouer le cas.

Pour le coût en francs, je divise par 3 : 3 crédits valent 1 F.

## Les résultats

Quatre modèles, du plus petit prix au token au plus grand. Aux tarifs publics, pour un prompt court, en crédits pour 1 000 tokens, entrée puis sortie : [Qwen 3.7 Flash](https://tchavi.com/fr/m/alibaba/qwen3.7-flash) 0,066 et 0,29 ; [GPT-6 Luna](https://tchavi.com/fr/m/openai/gpt-6-luna) 0,22 et 1,1 ; [GPT-5.4 Mini](https://tchavi.com/fr/m/openai/gpt-5.4-mini) 1,65 et 10 ; [Claude Sonnet 5.5](https://tchavi.com/fr/m/anthropic/claude-sonnet-5-5) 4,4 et 22.

J'ai passé les 15 cas deux fois aux trois premiers modèles, une fois à Sonnet 5.5 :

| Modèle            | Essai 1   | Essai 2    | Crédits pour 15 cas | Pour 1 000 tâches     |
| ----------------- | --------- | ---------- | ------------------- | --------------------- |
| Qwen 3.7 Flash    | 14 sur 15 | 14 sur 15  | 3,87 et 3,80        | 256 crédits (85 F)    |
| GPT-6 Luna        | 15 sur 15 | 15 sur 15  | 1,96 et 1,95        | 130 crédits (43 F)    |
| GPT-5.4 Mini      | 15 sur 15 | 14 sur 15  | 11,85 et 12,00      | 795 crédits (265 F)   |
| Claude Sonnet 5.5 | 15 sur 15 | non rejoué | 41,49               | 2 766 crédits (922 F) |

Les « pour 1 000 tâches » sont la moyenne des essais, ramenée à 1 000 : crédits divisés par 15, multipliés par 1 000.

Les trois échecs :

- **Qwen 3.7 Flash, cas 8, aux deux essais** : pour « livraison Parakou », il a écrit `"ville": "Parakou"` au lieu de `"autre"`. C'est une erreur répétée, donc un défaut de consigne ou de modèle, pas un hasard.
- **GPT-5.4 Mini, cas 14, au deuxième essai seulement** : « Combien coûte le chargeur 65W ? » a été lu comme une commande d'un chargeur. Le premier essai était juste : l'erreur n'est pas stable, c'est pour ça qu'un seul passage ne suffit pas.
- Luna et Sonnet 5.5 n'ont raté aucun cas.

## Ce que la barre décide

Avec ma barre à 14 sur 15, les quatre modèles passent, et le moins cher à la tâche est **GPT-6 Luna : 43 F les 1 000 extractions**. Sonnet 5.5 réussit aussi tout, pour 922 F, soit 21 fois plus. Dans ce test, payer Sonnet ne m'aurait rien apporté.

Si ma barre avait été « 15 sur 15 aux deux essais », seul Luna passait parmi les trois repassés. Une barre n'est pas un détail : elle fait la décision. Elle dépend de ce que coûte une erreur chez toi : une commande mal extraite qu'un humain relit coûte quelques minutes ; une commande envoyée sans relecture au mauvais endroit coûte un client.

## Le prix au token ment

Qwen 3.7 Flash a le prix au token le plus bas des quatre : 0,066 en entrée, 0,29 en sortie, soit trois fois moins que Luna en entrée et près de quatre fois moins en sortie. Pourtant, il coûte **deux fois plus par tâche**.

La raison est dans l'usage. Sur mes 15 cas, au deuxième passage, Luna a produit 1 153 tokens de sortie, dont 386 de raisonnement. Qwen 3.7 Flash en a produit 12 360, **dont 11 738 tokens de raisonnement**, soit environ 780 tokens de réflexion par message pour une extraction dont la réponse tient en quelques dizaines de tokens. Les tokens de raisonnement sont facturés comme de la sortie. Un modèle bon marché qui réfléchit beaucoup coûte plus qu'un modèle un peu plus cher qui répond tout de suite.

C'est la raison de mesurer sur ta tâche avec le coût réel de l'en-tête, et pas sur la grille des prix. La [comparaison des tarifs en FCFA](https://tchavi.com/fr/blog/prix-api-ia-fcfa-2026) te donne un point de départ pour choisir les quatre modèles à tester.

## Les limites de ce test

- **15 cas, c'est peu.** Les trois premiers modèles font au plus un ou deux échecs : cela ne départage pas leur qualité. Pour durcir : ajoute des messages en fon ou avec des abréviations, des produits ambigus, deux commandes dans un message, et monte à 50 cas.
- **Je n'ai testé que quatre modèles.** Un autre modèle, plus petit ou plus récent, pourrait passer ta barre à un meilleur prix : à toi de le tester avec le même script.
- **Les cas sont de moi.** Utilise de vrais messages de ta boutique, anonymisés.
- **Le prompt compte.** Un prompt plus précis (par exemple « une ville hors de la liste vaut "autre" », écrit plus fort) aurait peut-être corrigé Qwen. C'est une autre expérience : mesure-la aussi, car le prompt est gratuit à améliorer, le modèle ne l'est pas.
- **Les tarifs changent.** Refais le calcul quand tu changes de modèle ou que les prix bougent.

Pour un montage où un petit modèle répond et un plus fort rattrape les cas difficiles, regarde [le bot de support avec escalade](https://tchavi.com/fr/blog/bot-support-modele-economique-escalade).

## FAQ

### Pourquoi 15 cas et pas 100 ?

Parce qu'écrire 15 cas avec leur réponse attendue prend une heure, et que cela suffit à écarter les modèles clairement insuffisants. Ça ne suffit pas à départager deux bons modèles : pour cela, monte à 50 ou 100 cas, tirés de ton trafic.

### Pourquoi passer chaque modèle deux fois ?

Parce que les modèles varient d'un passage à l'autre : GPT-5.4 Mini a réussi 15 cas puis 14. Si un modèle passe de justesse ta barre, un seul essai ne te dit pas s'il y reste.

### Comment fixer la barre ?

Par le coût d'une erreur chez toi. Si un humain relit chaque sortie, 90 % peut suffire. Si le résultat part sans relecture, vise 100 % sur tes cas, et garde un second modèle pour les doutes.

### Faut-il toujours prendre le plus petit modèle qui passe ?

Pas forcément : prends le moins cher **à la tâche** qui passe, pas celui qui a le prix au token le plus bas, comme le montre Qwen 3.7 Flash. Et refais le test quand tes messages changent.

### Comment lis-je le coût dans mon code ?

Chaque réponse porte l'en-tête `x-credits-used`. Avec le SDK OpenAI, `.withResponse()` te donne la réponse HTTP, donc l'en-tête, comme dans le script ci-dessus. La page [crédits et facturation](https://tchavi.com/fr/docs/credits) explique le calcul.

[crée ton compte et recharge 1 000 F](https://tchavi.com/fr/register?next=%2Fdashboard%2Fbilling%3Famount%3D1000%26currency%3DXOF%26from%3Dblog-cost-quality)

> _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](https://tchavi.com/fr/docs/payments)). Plus de guides sur [le blog](https://tchavi.com/fr/blog). Pour suivre les prochains : [LinkedIn](https://www.linkedin.com/company/tchavi) et [X](https://x.com/tchaviai)._

