La facture de l'API OpenAI est difficile à lire non pas parce que le prix unitaire serait caché, mais parce qu'une requête déclenche souvent plusieurs dimensions de facturation en même temps : entrée ordinaire, lecture du cache, sortie, jetons de raisonnement, images, multiplicateur de contexte long et remise pour traitement par lots. Regarder uniquement le « prix par million de jetons » conduit facilement à sous-estimer le coût réel.

Cet article suit l'ordre suivant : unité de facturation, trois comptes principaux, règles complémentaires, formule d'estimation, puis ordre de réduction des coûts. Tous les prix unitaires, remises et seuils sont ceux de la page Tarifs des modèles et de la documentation officielle OpenAI ; nous ne figeons aucun chiffre ici.

Remarque : OpenAI, GPT et ChatGPT sont des marques de leurs détenteurs respectifs ; cet article est purement technique. Les prix varient selon le modèle et la période de facturation ; consultez la page Tarifs des modèles avant d'établir un budget.

1. Unifier l'unité : le jeton n'est pas un caractère

Le jeton est la plus petite unité de traitement du texte par le modèle. Un caractère chinois, un mot anglais ou une ponctuation peut correspondre à un ou plusieurs jetons ; les images, définitions d'outils et schémas structurés sont également convertis en jetons. Pour budgéter, n'utilisez pas « nombre de caractères × prix unitaire » : partez du champ usage renvoyé par l'interface.

L'entrée d'une requête comprend généralement :

  1. le prompt système et les instructions du développeur ;
  2. les messages de l'historique de conversation ;
  3. les définitions d'outils (fonctions) et les schémas de paramètres ;
  4. les documents récupérés, corps de pages web et extraits de code ;
  5. les jetons issus de la conversion des entrées non textuelles, images ou audio.

La sortie comprend le texte généré. Pour les modèles de raisonnement, les jetons de raisonnement internes sont aussi facturés comme de la sortie, même si le raisonnement complet n'est pas visible dans l'interface.

Élément facturé Inclus dans la facture Explication
Jetons d'entrée ordinaires Oui Prompt système, historique et définitions d'outils comptent
Entrée lue dans le cache Oui, au prix du cache Seul un préfixe stable a de bonnes chances d'être touché
Jetons de sortie Oui Le prix unitaire est généralement supérieur à celui de l'entrée
Jetons de raisonnement Oui, au prix de la sortie Courants avec les modèles de raisonnement ; le texte complet peut ne pas être affiché
Entrée image Oui Conversion en jetons selon la taille et le niveau de détail
Requête échouée Variable La plupart des erreurs 400 ne sont pas facturées ; une partie déjà générée peut l'être

2. Entrée, sortie et cache : les trois comptes principaux

Le compte d'entrée répond à la question « que transporte chaque requête ». Souvent, le coût ne vient pas de la question elle-même, mais du fait de renvoyer à chaque fois le document entier, toutes les définitions d'outils et tout l'historique. Même un prix d'entrée faible devient le poste principal lorsqu'il est multiplié par le volume d'appels.

Le compte de sortie mesure ce que le modèle écrit. Le prix de sortie est généralement supérieur à celui de l'entrée ; les rapports longs, le code long et les explications verbeuses amplifient la facture. Fixer un plafond raisonnable avec max_tokens et demander une sortie structurée est plus efficace qu'une compression après coup.

Le compte de cache mesure ce qui est réutilisé. Le cache de prompt d'OpenAI fonctionne par correspondance de préfixe : seul un début de requête parfaitement identique permet aux éléments suivants d'être touchés. Placez le prompt système, les définitions d'outils et les consignes de base de connaissances au début, et la question variable de l'utilisateur à la fin, pour stabiliser le taux de succès. Le cache a une longueur minimale de préfixe et une durée de vie ; il n'est ni permanent ni systématique, même activé.

Une erreur fréquente consiste à croire que « la deuxième requête est gratuite ». En réalité, la partie touchée dans le cache est facturée à un prix de lecture réduit, tandis que la partie non touchée reste au prix d'entrée ordinaire. Distinguez donc cached_tokens et jetons d'entrée ordinaires sur la facture.

3. Règles complémentaires : contexte long, lots et modèles de raisonnement

Au-delà des trois comptes principaux, plusieurs règles modifient le montant final.

Règle Condition de déclenchement Effet sur la facture
Multiplicateur de contexte long Une entrée dépasse le seuil défini pour le modèle Toute la requête est facturée au multiplicateur supérieur, pas seulement la partie excédentaire
Traitement par lots Utilisation de l'interface Batch avec retour asynchrone Remise dédiée en général, adaptée aux tâches hors ligne
Intensité de raisonnement Augmentation de reasoning_effort Plus de jetons de raisonnement, donc un coût de sortie plus élevé
Niveau de détail des images Entrée d'image en haute définition Conversion en un nombre de jetons plus élevé
Nouvelles tentatives Renvoi après 429 ou 5xx Chaque tentative est une nouvelle requête, potentiellement facturée en double

Avec les informations GPT-5.5 du site, une entrée dépassant 272K jetons déclenche un multiplicateur sur l'entrée et la sortie de toute la requête. Ces seuils doivent figurer dans le modèle budgétaire, avant l'arrivée de la facture.

4. Estimer le coût d'une requête

En notant les prix unitaires comme variables, la formule est la suivante :

Coût d'une requête =
    jetons d'entrée non mis en cache × prix d'entrée
  + jetons lus dans le cache × prix de lecture du cache
  + jetons de sortie (y compris raisonnement) × prix de sortie
  + jetons additionnels (images, outils, etc.) × prix correspondant

Montant final = coût de la requête × multiplicateur de contexte long × remise lots

Pour un budget mensuel, utilisez les journaux réels de la dernière semaine afin de calculer la part de chaque type de jeton, puis multipliez par le prix unitaire. N'inversez pas le calcul à partir d'un « coût moyen par appel » : la distribution entre requêtes courtes et longues est très asymétrique et la moyenne masque les anomalies.

5. Champs à journaliser

La réponse d'une interface compatible OpenAI contient généralement un objet usage. Journalisez les champs suivants pour gagner du temps lors du rapprochement :

import json
from openai import OpenAI

client = OpenAI(
    api_key="sk-votre-clé",
    base_url="https://api.zhongshangqihang.com/v1",
)

resp = client.chat.completions.create(
    model="gpt-5.5",
    messages=[{"role": "user", "content": "Résumez les risques de ce contrat en trois phrases."}],
    max_tokens=800,
)

u = resp.usage
prompt_details = getattr(u, "prompt_tokens_details", None)
completion_details = getattr(u, "completion_tokens_details", None)

record = {
    "request_id": resp.id,
    "model": resp.model,
    "prompt_tokens": u.prompt_tokens,
    "cached_tokens": getattr(prompt_details, "cached_tokens", 0) or 0,
    "completion_tokens": u.completion_tokens,
    "reasoning_tokens": getattr(completion_details, "reasoning_tokens", 0) or 0,
    "total_tokens": u.total_tokens,
}
print(json.dumps(record, ensure_ascii=False))

Si la passerelle ou une version du SDK ne renvoie pas un champ de détail, utilisez getattr comme repli : le code de journalisation ne doit jamais interrompre le flux principal.

6. Ordre de réduction des coûts : commencer par le gratuit

Par ordre de rapport entre effort et résultat :

  1. Mesurer : calculer par ligne d'activité la part des jetons d'entrée, de sortie, de cache et de nouvelle tentative, puis identifier le poste dominant.
  2. Comprimer l'entrée : remplacer l'envoi du document entier par de la recherche, du résumé ou un traitement par segments, afin d'éviter le multiplicateur de contexte long.
  3. Stabiliser le préfixe : placer prompt système, définitions d'outils et base de connaissances fixe au début pour limiter les invalidations de cache.
  4. Limiter la sortie : définir max_tokens et demander du JSON ou des champs fixes pour réduire les réponses longues inutiles.
  5. Router : envoyer classification, extraction et réécriture simples vers un modèle léger, et réserver le modèle haut de gamme au raisonnement complexe.
  6. Utiliser les lots : confier les tâches hors ligne à Batch et accepter un délai plus long en échange d'une remise.
  7. Fixer un budget : plafonds et alertes par projet et par clé pour arrêter rapidement les appels anormaux.
  8. Surveiller les tentatives : appliquer un délai exponentiel aux 429 et 5xx, avec un nombre maximal de tentatives, pour éviter la double facturation.

7. Questions fréquentes

Pourquoi la sortie coûte-t-elle plus cher que l'entrée ?

Chaque jeton généré demande un calcul progressif du modèle, dont le coût de calcul dépasse la lecture d'un contexte existant ; le prix de sortie est donc généralement plus élevé. Les réponses longues, le code long et le raisonnement amplifient ce poste.

Le cache s'active-t-il automatiquement ?

La plupart des interfaces compatibles OpenAI tentent automatiquement une mise en cache de préfixe, mais le succès dépend de l'identité exacte du préfixe, de la longueur minimale et de la durée de vie restante. Un préfixe stable est la condition d'un bon taux de succès.

Le raisonnement d'un modèle est-il facturé ?

Oui. Les jetons de raisonnement sont généralement facturés au prix de sortie, même si le client ne voit pas le contenu complet. Augmenter l'intensité de raisonnement accroît à la fois la latence et le coût.

Pourquoi deux requêtes identiques sont-elles facturées différemment ?

La longueur d'entrée, la longueur de sortie, le cache, la version du modèle et les tentatives peuvent différer. Utilisez l'identifiant de requête et les journaux usage pour aligner les lignes et localiser l'écart.

Le prix de la passerelle est-il identique au prix officiel OpenAI ?

Pas nécessairement. La passerelle peut inclure le taux de change, les frais de paiement et le coût du service, ou proposer des remises promotionnelles. Faites foi la page Tarifs des modèles ; n'utilisez pas une ancienne capture d'écran pour budgéter.

Et ensuite

Commencez par créer un compte ZSQH AI Gateway, validez une requête minimale avec une clé de test, branchez la journalisation usage, puis répartissez le budget par ligne d'activité. Les modèles, contextes et prix sont indiqués sur la page Tarifs des modèles.

À lire également :