Luna, le plus léger des trois modèles GPT-5.6, est passé de 7 $ à 1,40 $ le million de tokens le 30 juillet 2026 — une baisse de 80 % annoncée trois semaines après le lancement de la famille. Pour nous, ce n'était pas une actualité à lire : c'était une pipeline de classification qu'on avait garée sur Terra, faute de rentabilité, qui redevenait viable. On l'a migrée dans la foulée. Sur 100 000 classifications par mois, la facture est tombée de 176 $ à 18 $ — presque 10×, parce qu'on change de modèle et qu'on encaisse la baisse en même temps. Voici le code, les chiffres réels, et les deux pièges qui bouffent l'économie si tu ne les vois pas venir.
Pourquoi une baisse de 80 % débloque une migration
Un modèle moins cher ne déclenche pas une migration à lui seul. Migrer une pipeline en prod, c'est revalider la qualité sur un jeu de test, réécrire les prompts et surveiller les régressions — du travail réel qui a un coût. Quand Luna est sorti à 7 $ le million en juillet, l'écart avec Terra ne payait pas ce travail. On est donc restés sur Terra. À 1,40 $, l'équation bascule : la sortie tombe de 6 $ à 1,20 $, l'entrée de 1 $ à 0,20 $, et l'économie annuelle dépasse largement le coût de la revalidation. C'est ce que la grille tarifaire ne dit pas. Une baisse n'a de sens que rapportée au travail qu'elle finance.
| Modèle GPT-5.6 | Input ($/M) | Output ($/M) | Avant | Variation |
|---|---|---|---|---|
| Luna | 0,20 | 1,20 | 7 $ (combiné) | −80 % |
| Terra | 2,00 | 12,00 | 2,50 / 15 | −20 % |
| Sol | 5,00 | 30,00 | inchangé | 0 % |
Le classifieur tient en un appel
Notre tâche est banale : on range des tickets de support entrants dans une quinzaine de catégories, avec un score de confiance. Un prompt système liste les catégories, l'utilisateur envoie le texte du ticket, le modèle renvoie du JSON. Rien d'exotique. Et c'est justement le genre de charge où Luna excelle, parce qu'elle ne demande aucun raisonnement profond.
import json
from openai import OpenAI
client = OpenAI()
def classify(ticket: str):
resp = client.responses.create(
model="gpt-5.6-luna",
reasoning={"effort": "minimal"}, # ← garde cet œil ouvert
input=[
{"role": "system", "content": CATEGORIES_PROMPT},
{"role": "user", "content": ticket},
],
text={"format": {"type": "json_object"}},
)
return json.loads(resp.output_text), resp.usage
On renvoie aussi resp.usage : c'est lui qui contient la vraie facture, pas la grille affichée.
Piège n°1 : le raisonnement se facture en sortie
La première version tournait avec effort: "medium", parce qu'on s'était dit qu'un peu de raisonnement ne ferait pas de mal à la précision. Erreur de facturation classique. Sur un modèle de raisonnement, les tokens de réflexion sont comptés en sortie, au prix fort. Pour une classification qui rend 30 tokens de JSON, Luna en générait 450 de raisonnement invisible — quinze fois le volume utile, facturé à 1,20 $ le million. Résultat sur nos 100 000 requêtes : 72 $ au lieu de 18 $.
Et la précision, dans tout ça ? +0,3 point sur notre jeu de test, dans le bruit. On est repassés en minimal, la facture a fondu, la qualité n'a pas bougé. Pour du tri, le raisonnement est de l'argent jeté par la fenêtre.
Piège n°2 : mesure la vraie facture, pas la théorique
Le prix affiché, c'est le plafond. Deux leviers le font descendre, et aucun ne se voit dans le communiqué d'OpenAI :
- API Batch — dépôt asynchrone, résultat sous 24 h, −50 % sur tout ce qui n'a pas besoin de réponse immédiate.
- Cache de prompt — notre prompt système fait 320 tokens répétés à l'identique ; mis en cache, ce préfixe est facturé une fraction du tarif au lieu d'être repayé 100 000 fois.
PRIX = { # $ par million de tokens
"gpt-5.6-luna": {"in": 0.20, "out": 1.20},
"gpt-5.6-terra": {"in": 2.00, "out": 12.00},
}
def cout(model, usage):
p = PRIX[model]
return (usage.input_tokens * p["in"]
+ usage.output_tokens * p["out"]) / 1_000_000
total = sum(cout("gpt-5.6-luna", u) for _, u in resultats)
print(f"Facture réelle : {total:.2f} $")
Cumulés — à la louche, parce que les deux ne se combinent pas parfaitement — nos 18 $ passent sous les 8 $ pour le même volume. Mesure toujours sur usage, jamais sur la grille : c'est la seule facture qui compte.
Quand on est resté sur Terra
Luna n'a pas remplacé Terra partout, et c'est volontaire. Sur une seconde pipeline — de l'extraction d'entités dans des contrats, avec des cas limites tordus et des conséquences métier si on se trompe — Luna perdait 4 points de rappel face à Terra. Quatre points sur de l'extraction juridique, ce n'est pas du bruit : ce sont des erreurs qui remontent chez le client. L'économie de 90 % ne valait pas ce risque.
On a donc gardé Terra là, Luna sur le tri, et Sol nulle part — parce que rien dans ces deux tâches ne justifie un modèle frontier à 30 $ la sortie. Le bon réflexe n'est jamais « tout migrer vers le moins cher ». C'est mesurer la qualité tâche par tâche, puis choisir par tâche.
Ce qu'on en retient
La vraie leçon n'est pas le prix du jour. C'est que Luna a perdu 80 % de sa valeur faciale en trois semaines. Et ça peut recommencer, dans un sens ou dans l'autre. Si tu câbles ta pipeline en dur autour d'un modèle et d'un prix, le prochain mouvement du marché te prend de court. On isole donc toujours l'appel LLM derrière une fonction (classify(), extract()) et une table de prix : changer de modèle devient une ligne, pas un chantier. C'est ce qui nous a permis de migrer celle-ci en une après-midi.
La guerre des prix ne fait que commencer, alimentée par la pression des modèles chinois open-weight — on l'a détaillée dans Kimi K3 vs Claude pour coder. Pour le décryptage complet de la baisse GPT-5.6 et son impact sur un budget d'automatisation, c'est par ici. Et si tu veux apprendre à construire ce genre de pipeline proprement, on en a fait une formation Claude Code.
Top comments (0)