La plupart des équipes paient trop cher pour leurs appels d'API AI. Non pas parce qu'elles ont choisi le mauvais modèle, mais parce qu'elles ignorent trois optimisations nécessitant des modifications de code minimales : le prompt caching, le routage intelligent des modèles et le batch processing.
Voici une analyse de chaque technique avec des chiffres réels.
Si vous hésitez encore à savoir si votre mix de fournisseurs actuel est le problème, lisez d'abord la comparaison des prix. Si votre principal problème concerne les tempêtes de tentatives (retry storms) ou le bridage des fournisseurs plutôt que la dépense brute, consultez également le guide sur le rate limiting.
1. Prompt Caching : Le plus gros gain
Si votre application envoie le même system prompt à chaque requête, vous payez le prix fort pour des tokens que le fournisseur a déjà traités.
Comment ça marche
OpenAI met en cache les prompts automatiquement pour les entrées de plus de 1 024 tokens. Les tokens mis en cache coûtent 50 % du prix d'entrée standard. Vous n'avez rien à changer dans votre code.
Anthropic utilise un cache explicite via des points d'arrêt cache_control. Le coût d'écriture est 25 % plus élevé que l'entrée standard, mais les lectures coûtent 90 % de moins. Le TTL du cache est de 5 minutes, prolongé à chaque succès.
Avec les nouveaux tarifs d'OpenAI, la remise réelle peut être plus importante que ce que les équipes imaginent. L'entrée mise en cache de GPT-4.1 est facturée au quart du prix de l'entrée standard, ce qui signifie que des préfixes cohérents génèrent des économies bien plus importantes que ce que suggérait l'ancienne vision du "bonus agréable".
Le calcul
Prenons un bot de support client typique :
- System prompt : 2 000 tokens
- Message utilisateur : 200 tokens en moyenne
- 5 000 requêtes/jour avec Claude Sonnet 4.6
Sans mise en cache :
Coût d'entrée quotidien = 5 000 × 2 200 tokens × $3.00/1M = $33.00
Avec le prompt caching d'Anthropic (en supposant un taux de réussite du cache de 95 %) :
Écritures cache : 250 × 2 200 × $3.75/1M = $2.06
Lectures cache : 4 750 × 2 200 × $0.30/1M = $3.14
Tokens utilisateur : 5 000 × 200 × $3.00/1M = $3.00
Total quotidien = $8.20 (75 % d'économie sur les coûts d'entrée)
Implémentation
from anthropic import Anthropic
client = Anthropic(
api_key="sk-lemon-xxx",
base_url="https://api.lemondata.cc"
)
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
system=[
{
"type": "text",
"text": "You are a customer support agent for Acme Corp...",
"cache_control": {"type": "ephemeral"} # Active la mise en cache
}
],
messages=[{"role": "user", "content": user_message}]
)
# Vérifiez les performances du cache dans les en-têtes de réponse
# cache_creation_input_tokens vs cache_read_input_tokens
Pour les modèles OpenAI, la mise en cache est automatique. Assurez-vous simplement que vos prompts dépassent 1 024 tokens et gardez le préfixe statique cohérent d'une requête à l'autre.
Là où les équipes se trompent :
- placer des horodatages ou des IDs de requête au début de chaque prompt
- réorganiser les instructions système à chaque appel
- intégrer un contexte utilisateur variable avant le préfixe stable
Si le préfixe change à chaque fois, le cache n'aide jamais. Considérez la structure du prompt comme une primitive de coût, et non comme un simple détail de prompt engineering.
2. Routage intelligent des modèles : Utilisez le bon modèle pour chaque tâche
Toutes les requêtes n'ont pas besoin de votre modèle le plus cher. Une tâche de classification que GPT-4.1 traite pour $2.00/1M de tokens d'entrée fonctionne tout aussi bien avec GPT-4.1-mini à $0.40/1M, soit une réduction de coût par 5.
La stratégie de routage
| Type de tâche | Modèle recommandé | Coût d'entrée/1M |
|---|---|---|
| Raisonnement complexe | Claude Opus 4.6 / GPT-4.1 | $5.00 / $2.00 |
| Chat général | Claude Sonnet 4.6 / GPT-4.1 | $3.00 / $2.00 |
| Classification, extraction | GPT-4.1-mini / Claude Haiku 4.5 | $0.40 / $1.00 |
| Embeddings | text-embedding-3-small | $0.02 |
| Formatage simple | DeepSeek V3 | $0.28 |
Implémentation
from openai import OpenAI
client = OpenAI(
api_key="sk-lemon-xxx",
base_url="https://api.lemondata.cc/v1"
)
def route_request(task_type: str, messages: list) -> str:
"""Choisit le modèle le moins cher qui gère bien cette tâche."""
model_map = {
"classification": "gpt-4.1-mini",
"extraction": "gpt-4.1-mini",
"summarization": "gpt-4.1-mini",
"complex_reasoning": "gpt-4.1",
"creative_writing": "claude-sonnet-4-6",
"code_generation": "claude-sonnet-4-6",
}
model = model_map.get(task_type, "gpt-4.1-mini")
response = client.chat.completions.create(
model=model,
messages=messages
)
return response.choices[0].message.content
Économies réelles
Un assistant de code qui route 60 % des requêtes (linting, formatage, complétions simples) vers GPT-4.1-mini et 40 % (architecture, débogage) vers Claude Sonnet 4.6 :
Avant (tout sur Claude Sonnet 4.6) :
1 000 req/jour × 3K entrée × $3.00/1M = $9.00/jour
Après (répartition 60/40) :
600 req × 3K × $0.40/1M = $0.72/jour (mini)
400 req × 3K × $3.00/1M = $3.60/jour (sonnet)
Total = $4.32/jour (52 % d'économie)
3. Batch Processing : Des prix plus bas pour les travaux non urgents
OpenAI propose une Batch API avec une réduction de 50 % sur les tokens d'entrée et de sortie. Le compromis : les résultats sont livrés dans un délai de 24 heures au lieu du temps réel.
Anthropic propose également des remises de 50 % sur le batching pour les modèles pris en charge. Si votre charge de travail est nocturne, asynchrone ou orientée vers la révision, il y a rarement une bonne raison de payer les prix du temps réel.
Bons candidats pour le batching :
- Génération de contenu nocturne
- Classification de documents en masse
- Étiquetage de jeux de données
- Génération de rapports planifiés
# Créer un fichier batch (format JSONL)
import json
requests = []
for i, doc in enumerate(documents):
requests.append({
"custom_id": f"doc-{i}",
"method": "POST",
"url": "/v1/chat/completions",
"body": {
"model": "gpt-4.1-mini",
"messages": [
{"role": "system", "content": "Classify this document..."},
{"role": "user", "content": doc}
]
}
})
# Écrire le fichier JSONL
with open("batch_input.jsonl", "w") as f:
for req in requests:
f.write(json.dumps(req) + "\n")
# Soumettre le batch
batch_file = client.files.create(file=open("batch_input.jsonl", "rb"), purpose="batch")
batch = client.batches.create(input_file_id=batch_file.id, endpoint="/v1/chat/completions", completion_window="24h")
Bons candidats pour le batching au sein d'un produit réel :
- tâches de rafraîchissement de contenu nocturnes
- résumé de tickets de support
- remplissage d'embeddings (backfills)
- révisions de bases de code ou de documents volumineux
- notifications utilisateur à faible priorité
Mauvais candidats :
- réponses de chat
- assistance au codage interactive
- workflows où l'action suivante de l'utilisateur dépend immédiatement de la réponse
4. Bonus : Réduire le nombre de tokens
Avant d'optimiser au niveau de l'API, vérifiez si vous n'envoyez pas plus de tokens que nécessaire.
Gaspillages courants :
- System prompts verbeux qui répètent des instructions que le modèle suit déjà
- Inclusion de tout l'historique de conversation quand seuls les 3 à 5 derniers échanges comptent
- Envoi de HTML/markdown brut quand du texte brut suffirait
- Non-utilisation de
max_tokenspour limiter la longueur de la sortie
Une réduction de 30 % de la longueur du prompt se traduit directement par une baisse de 30 % des coûts d'entrée.
Le moyen le plus simple de trouver du gaspillage est de journaliser la longueur des prompts par route ou par fonctionnalité. La plupart des équipes n'ont pas un problème de prix de modèle. Elles ont un problème de "le même prompt gonflé est envoyé 100 000 fois par jour".
5. Ajoutez de la visibilité sur les coûts avant d'optimiser aveuglément
L'optimisation des coûts échoue lorsque les équipes optimisent à l'intuition.
Avant de modifier les règles de routage, journalisez :
- le nom de la route ou de la fonctionnalité
- le modèle
- les tokens d'entrée
- les tokens de sortie
- succès ou échec du cache
- le nombre de tentatives (retries)
- la latence visible par l'utilisateur
Cela vous permet de répondre aux questions essentielles :
- Quelle route est coûteuse parce qu'elle est réellement utile ?
- Quelle route est coûteuse parce que le prompt est inutilement long ?
- Quelle route devrait passer en batch ?
- Quelle route devrait passer à un niveau de modèle moins cher ?
Si vous ne pouvez pas répondre à ces quatre questions, votre "optimisation des coûts" ne fera que déplacer les dépenses.
6. Un véritable ordre d'optimisation
L'ordre le plus efficace est généralement le suivant :
- Supprimer le gaspillage évident de tokens.
- Activer ou corriger la mise en cache.
- Séparer les tâches peu coûteuses des tâches onéreuses.
- Passer en batch tout ce qui n'est pas urgent.
- Seulement ensuite, renégocier le mix de fournisseurs.
Cet ordre est important car les plus grandes économies surviennent souvent avant de changer de fournisseur. Si vous changez de vendeur sans corriger la structure de vos prompts, vous continuerez à payer pour la même inefficacité.
7. Un déploiement concret avant-après
Prenons un workflow de support qui fait actuellement ceci à chaque requête :
- envoie un system prompt de 2 000 tokens
- appelle un modèle premium pour toutes les requêtes
- réessaie la même structure de requête lors d'échecs temporaires
- exécute les résumés nocturnes de manière synchrone au lieu d'utiliser le batching
La première version semble souvent "simple" car elle n'a qu'un seul chemin de code. Financièrement, elle fait quatre choses coûteuses à la fois.
Un déploiement plus efficace ressemble à ceci :
- Déplacer le texte de politique stable au début du prompt pour que le caching puisse réellement fonctionner.
- Router la classification, l'extraction et les résumés courts vers un niveau de modèle moins cher.
- Réserver le modèle premium pour les escalades, les raisonnements complexes ou la synthèse de la réponse finale.
- Pousser les résumés nocturnes et les backfills vers le batching.
- Réviser les logs chaque semaine pour identifier les routes dont la structure du prompt a dérivé, tuant l'efficacité du cache.
Ce type de déploiement ne nécessite pas de réécriture complète. Il nécessite une semaine d'instrumentation et une volonté de traiter les prompts et le routage comme des surfaces de production.
8. Ce qu'il ne faut pas faire
Le moyen le plus rapide de gâcher un effort d'optimisation des coûts est d'optimiser la mauvaise chose.
Évitez ces pièges :
- changer de fournisseur avant d'avoir mesuré le gaspillage de tokens
- router des tâches simples vers des modèles bon marché sans valider la qualité de sortie
- activer le caching sur des prompts dont les préfixes changent à chaque requête
- passer en batch des travaux destinés aux utilisateurs qui nécessitent réellement des réponses en temps réel
- ne regarder que le prix du token en ignorant les coûts de retry, de latence et de fallback
Le travail sur les coûts est réussi lorsque le produit se comporte toujours bien après l'application des économies. Si l'UX se dégrade, le gain sur le tableur est illusoire.
En résumé
| Technique | Effort | Économies typiques |
|---|---|---|
| Prompt caching | Faible (ajouter cache_control) | 40-75 % sur l'entrée |
| Routage de modèles | Moyen (classifier les tâches) | 30-50 % au total |
| Batch processing | Moyen (workflow asynchrone) | 50 % sur les jobs batch |
| Réduction de tokens | Faible (élaguer les prompts) | 10-30 % sur l'entrée |
Ces techniques se cumulent. Une équipe qui implémente les quatre peut raisonnablement réduire sa facture mensuelle d'API de 3 000 $ à moins de 1 000 $ sans aucune dégradation de la qualité de sortie.
L'idée clé : l'optimisation des coûts des API AI ne consiste pas à trouver des fournisseurs moins chers. Il s'agit d'utiliser le bon modèle, au bon niveau de prix, avec la bonne stratégie de cache, pour chaque tâche spécifique.
Si vous utilisez déjà plusieurs fournisseurs, l'aspect opérationnel compte aussi. Le guide de migration et la comparaison OpenRouter aident à décider quand il est temps de centraliser le routage plutôt que de continuer à patcher des intégrations séparées.
Commencez à optimiser dès aujourd'hui : LemonData vous donne accès à plus de 300 modèles via une seule clé API, avec le support du prompt caching pour les familles de modèles OpenAI et Anthropic, et un endroit unique pour comparer votre utilisation.
