SFEIR

OpenRouter en production : cache, coûts, latence et données sous contrôle

OpenRouter en production : cache, coûts, latence et données sous contrôle

Le 28 septembre 2026, OpenRouter a publié le résultat de son audit interne : plus de 1 000 clés d'API actives pour 85 employés, dont 168 inutilisées depuis des mois9. Les réglages par défaut qui ont débordé l'éditeur sont ceux que vos équipes héritent au premier appel. Cet article donne l'ordre dans lequel configurer OpenRouter en production : données, cache, plafonds de coût, fallbacks, latence, clés. Il s'adresse aux CTO et architectes qui ont déjà choisi la marketplace, aux RSSI et DPO qui la valident, aux équipes FinOps qui en reçoivent la facture. Pour choisir entre marketplace, proxy possédé et optimiseur d'agents, lisez notre grille des trois métiers des LLM routers ; pour le produit et son rachat par Stripe, non clôturé au 8 octobre 202617, notre analyse de la marketplace OpenRouter.

Par quoi commencer : la politique de données, avant le prix

Une requête OpenRouter sans paramètre provider peut être servie par n'importe quel hébergeur du modèle demandé, y compris un hébergeur qui conserve les prompts ou les utilise pour entraîner. Deux clés ferment cette porte : data_collection: "deny" écarte les fournisseurs qui stockent ou entraînent sur vos requêtes, et zdr: true exige des endpoints à rétention zéro. Les deux se posent par requête ou au niveau du compte, et les réglages se combinent en union16.

{
  "model": "anthropic/claude-sonnet-5.5",
  "provider": {
    "data_collection": "deny",
    "zdr": true
  },
  "messages": [ ... ]
}

La résidence est un sujet distinct. Au 12 octobre 2026, le routage régional (UE et US) figure dans le plan Business, facturé 8 % sur les crédits contre 5,5 % pour le plan Standard6. Un DPO qui exige que les tokens restent en Europe budgète donc ces 2,5 points d'écart, et lit dans le contrat ce que « in-region » couvre.

Si vous apportez vos propres clés fournisseur (BYOK : clés Anthropic, OpenAI ou Google Cloud du client), la documentation est nette : « Your data policies apply to BYOK endpoints », et une clé BYOK « does not exempt a provider from your data_collection restrictions »7. Deux réglages du même document sont à lire avec le RSSI : quand toutes vos clés BYOK échouent, OpenRouter rebascule par défaut sur ses propres endpoints, sauf si vous désactivez le « Shared capacity fallback » ; et la dépense BYOK reste hors des budgets de garde-fous tant que include_byok_in_budgets garde sa valeur par défaut7.

Comment faire tenir le cache de préfixe, là où se joue la facture

Le cache de prompt appartient au fournisseur d'inférence. OpenRouter vous renvoie vers l'endpoint qui détient encore votre préfixe en mémoire, par routage collant : après une requête servie avec lecture en cache, les suivantes du même fil retournent au même endpoint, tant que la lecture en cache y coûte moins cher qu'un prompt normal, et la session expire après 10 minutes d'inactivité. Par défaut, le fil est identifié par un hachage du premier message système ; un session_id (dans le corps ou l'en-tête x-session-id, 256 caractères au plus) active l'épinglage dès la première requête réussie2. La documentation parle d'un « 10-minute best-effort pin » : un effort, pas une garantie1.

{
  "model": "anthropic/claude-sonnet-5.5",
  "session_id": "ticket-48213-agent-run-7",
  "messages": [ ... ]
}

Côté prompt, la règle vient des fournisseurs. Anthropic : « Cache hits require 100% identical prompt segments ». OpenAI : le préfixe rendu doit correspondre en entier, instructions stables en tête, horodatages et données utilisateur en fin4. Chez Anthropic, modifier une définition d'outil invalide tout le cache, et un préfixe sous le minimum (512 tokens sur Fable 5.1, Opus 5.5, Sonnet 5.5 et Haiku 5.5 ; 1 024 chez OpenAI à partir de GPT-5.6) reste hors cache sans qu'aucune erreur ne vous prévienne4. Un timestamp dans le prompt système, une liste d'outils dont l'ordre varie, un identifiant interpolé en première ligne : chacun coûte le cache entier.

Trois gestes côté OpenRouter cassent l'épinglage : changer de slug en cours de conversation (de claude-3.7-sonnet à claude-3.7-sonnet:nitro, dans l'exemple de la documentation), poser un provider.order explicite, qui désactive le réordonnancement collant et l'équilibrage, et laisser l'Auto Exacto changer de fournisseur sur les requêtes avec outils1. OpenRouter le reconnaît dans son billet sur les routeurs : « Switching between models means requests get more expensive while the input cache is rebuilt »13. Pour les agents qui déclarent des dizaines d'outils, openrouter:tool_search avec defer_loading: true sort les définitions du préfixe et les charge à la demande ; la documentation cite un agent à plus de 80 outils, sans en faire un seuil1.

Ce que ça rapporte, en chiffres de l'éditeur : jusqu'à 80 à 90 % de réduction du temps et du coût de prefill, un plafond ; sans cache chaud, un contexte de 20 000 à 90 000 tokens par tour ajoute 5 à 10 secondes de prefill1. La newsletter OpenRouter du 8 octobre 2026 mesure, sur son trafic agentique, que le fournisseur médian mettait en cache 44 % des tokens de prompt en janvier 2026 et 85 % en septembre ; 2 fournisseurs sur 35 dépassaient 90 % en janvier, 11 sur 54 en septembre, DeepSeek en tête autour de 96 %3. Votre taux de cache dépend donc autant de l'endpoint qui vous sert que de votre prompt, et les deux se lisent dans la réponse : cache_discount (négatif lors d'une écriture chez Anthropic), prompt_tokens_details.cached_tokens et cache_write_tokens2. Journalisez-les par requête dès le premier jour.

Comment réduire le coût OpenRouter sans dégrader la qualité

Sans sort ni order, OpenRouter écarte les fournisseurs ayant subi des pannes significatives dans les 30 dernières secondes, puis répartit la charge en pondérant par l'inverse du carré du prix5. Le défaut penche déjà vers le moins cher, en gardant de l'équilibrage. Le suffixe :floor le supprime : il équivaut à provider.sort: "price" et « locks onto the cheapest endpoint »5, souvent une version quantifiée (FP8, FP4, INT8) d'un modèle open-weights ; si la précision compte, filtrez avec provider.quantizations. Réservez :floor aux traitements hors ligne et préférez en production un plafond : provider.max_price fait échouer la requête plutôt que de dépasser le budget, et se combine avec un tri par débit5.

{
  "model": "deepseek/deepseek-v4-flash",
  "provider": {
    "sort": "throughput",
    "max_price": { "prompt": 1, "completion": 2 },
    "quantizations": ["fp16", "bf16"]
  }
}

Pour tout ce qui attend sa réponse en heures, la Batch API lancée le 22 septembre 2026 est le poste d'économie le plus net : les fournisseurs « generally charge 50% (and sometimes less) of their normal per-token price », avec une fenêtre de 24 heures. Sur plus de 230 000 batches de la bêta de deux semaines, 90 % ont terminé en moins d'une heure, médiane 7 minutes, p99 10,3 heures. Chaque batch s'exécute sur un seul fournisseur ; audio, vidéo et recherche web en sont exclus8. Classification de tickets, enrichissement de catalogue, evals nocturnes : rien de cela n'a à tourner en synchrone au plein tarif.

Reste la commission, absente du prix affiché par modèle : 5,5 % à l'achat de crédits (minimum 0,80 $), 8 % en plan Business, 5 % en cryptomonnaie. Le BYOK inclut 25 000 $ d'inférence par mois sans frais, puis 5 % du prix catalogue6. Une clé directe bat le pay-as-you-go si votre tarif négocié passe sous ce prix catalogue, pas avant. Posez ces pourcentages dans la feuille de calcul avant de comparer avec un proxy LiteLLM auto-hébergé.

Le plus gros levier reste le choix du modèle : dans son billet du 2 octobre 2026 sur les routeurs, OpenRouter calcule un prix moyen par token de GPT-6 Astra « over 48x higher » que celui de DeepSeek v4 Flash13. La méthode pour fixer une barre de qualité par tâche et retenir le modèle le moins cher qui la passe est dans notre article sur le choix et l'escalade de modèles. Lisez le coût dans le champ usage.cost de chaque réponse plutôt que de l'estimer12, et jugez-le au résultat, comme le propose notre analyse du coût par outcome.

Pourquoi le fallback ne vous protège pas d'une mauvaise réponse

Le tableau models déclare une chaîne de secours. Elle se déclenche quand un modèle renvoie une erreur (contexte dépassé, modération, limite de débit, indisponibilité), jamais quand il renvoie une réponse valide mais médiocre : les fallbacks « trigger when a model returns an error, not when it returns a valid answer with a low confidence score », et la décision d'escalader appartient à votre code10. Le tutoriel sur les bots de support ajoute un piège : un HTTP 200 peut contenir une erreur dans le corps de la réponse11. Testez le JSON, pas le code de statut. Si votre application dépend d'un format de sortie, provider.require_parameters: true restreint le routage aux endpoints qui supportent tous les paramètres envoyés ; sans lui, un hébergeur qui ignore response_format reste éligible10.

{
  "models": ["google/gemini-3.7-flash", "anthropic/claude-sonnet-5.5"],
  "provider": { "require_parameters": true },
  "response_format": {
    "type": "json_schema",
    "json_schema": { "name": "answer", "strict": true, "schema": { ... } }
  }
}

Pour la reproductibilité, un retour terrain publié sur GitHub par un utilisateur chercheur résume ce que la documentation dit à mots couverts : par défaut, deux requêtes identiques peuvent atteindre deux backends différents, et provider.order seul n'épingle rien. Épingler demande provider.only avec allow_fallbacks: false15. Vous perdez l'équilibrage, vous gagnez une mesure comparable d'un run à l'autre : le réglage d'un banc d'eval, pas d'un service. Le tutoriel OpenRouter sur les tests de régression ajoute d'éviter les alias -latest, qui changent de modèle sans qu'aucun commit ne l'ait décidé14.

Comment borner la latence sans la payer deux fois

provider.preferred_max_latency (par exemple {"p90": 2.5}) réordonne les fournisseurs selon leur latence observée sur les cinq dernières minutes ; la préférence est souple, la requête part même si tous sont lents. preferred_min_throughput joue le même rôle sur le débit. Pour prendre le plus rapide parmi plusieurs modèles, combinez un tableau models avec sort: {"by": "throughput", "partition": "none"}, qui trie tous les endpoints ensemble1.

Deux facteurs de latence n'apparaissent dans aucun réglage. Les caches de bord sont froids pendant les une à deux premières minutes dans une nouvelle région. Et quand le solde de crédits tombe à quelques dollars, ou qu'une clé approche sa limite, OpenRouter ajoute des contrôles à chaque requête1. Un compte de production laissé à 6 $ ralentit avant de tomber. Dernier point, valable pour l'Auto Router comme pour tout routeur tiers : « The more processing you run on the routing decisions, the more latency is introduced »13.

Clés, budgets, traces : ce qu'un auditeur vous demandera

Revenons aux 1 000 clés pour 85 employés. Le Security Center, disponible sur tous les plans depuis le 28 septembre 2026, signale les clés sans plafond de dépense, sans expiration ou inactives depuis plus de 90 jours, leur attribue un score de risque et autorise des actions groupées (désactiver, archiver, plafonner) jusqu'à 500 clés à la fois ; la liste blanche d'adresses IP reste réservée aux administrateurs Enterprise9. L'outil complète la règle sans la remplacer : une clé par projet et par environnement, un plafond de crédits sur chacune, aucune clé côté client, et include_byok_in_budgets activé si vous apportez des clés fournisseur7.

Pour la traçabilité, chaque réponse porte de quoi reconstituer la décision : le modèle qui a répondu, usage.cost en dollars, les trois champs de cache cités plus haut. Avec l'Auto Router, l'en-tête X-OpenRouter-Metadata: enabled renvoie le type de tâche détecté parmi la trentaine que le routeur distingue18. Stockez ces champs avec l'identifiant métier de la requête : le jour où un client demande pourquoi une réponse a coûté dix fois plus cher que la veille, c'est la seule preuve que vous aurez.

Les réglages en une page

RéglageCe qu'il faitPiège
data_collection: "deny", zdr: trueÉcarte les fournisseurs qui stockent ou entraînent ; impose la rétention zéroS'applique aussi au BYOK ; la résidence UE est un plan à part (Business, 8 %)
session_idÉpingle le fil au même endpoint pendant 10 minutesBest-effort ; un changement de slug ou un provider.order le casse
Préfixe statique à l'octetRend le cache fournisseur possibleHorodatage, ordre des outils, identifiant en tête : cache perdu
max_price + sort: "throughput"Plafond dur, la requête échoue au lieu de dépasserTraiter l'échec côté application
:floorVerrouille l'endpoint le moins cherPlus d'équilibrage ; souvent quantifié ; hors ligne uniquement
Batch APIEnviron moitié prix, réponse sous 24 hUn fournisseur par batch ; pas d'audio, vidéo, recherche web
models: [...]Chaîne de secoursSur erreur, jamais sur réponse médiocre ; un 200 peut porter une erreur
require_parameters: trueRoute vers les endpoints qui honorent vos paramètresMoins d'endpoints éligibles
only + allow_fallbacks: falseÉpinglage reproductibleRéglage d'eval, pas de production
include_byok_in_budgetsCompte la dépense BYOK dans les garde-fousDésactivé par défaut

Ce qui casse en production

Le provider.order posé « pour être sûr ». Une équipe fixe l'ordre des fournisseurs pour maîtriser le routage, et coupe du même coup l'épinglage et l'équilibrage. Chaque tour de l'agent reconstruit le préfixe chez un hébergeur différent. La facture monte sans qu'aucun prix n'ait changé.

Le fallback qui ne vient pas. Un modèle économique répond en JSON valide avec un champ vide ou une classification fausse. HTTP 200, pas de bascule. L'escalade attendue devait être écrite dans le code : test de la réponse, score de confiance ou contrôle par un second modèle.

Le :floor hérité du prototype. Le suffixe passe du bac à sable à la production. L'endpoint le moins cher est un FP4 chez un hébergeur sans redondance ; la qualité baisse sur les cas longs, et sa panne devient la vôtre puisque l'équilibrage est coupé.

Le solde à 6 $ un vendredi soir. Sous la dizaine de dollars, OpenRouter ajoute des contrôles à chaque requête. La latence monte, l'astreinte cherche un bug applicatif qui n'existe pas. Un seuil d'alerte sur le solde évite la nuit blanche.

Ce que ça change pour vous

CTO et architectes. Les cinq premiers réglages (données, session_id, préfixe stable, max_price, require_parameters) tiennent dans un wrapper de cinquante lignes autour du client OpenAI. Écrivez-le une fois, versionnez-le, interdisez les appels directs. Escalade, evals de régression et choix de modèle relèvent de votre code.

RSSI et DPO. Le périmètre à contractualiser : data_collection et zdr forcés au niveau du compte, routage régional UE en plan Business avec la définition contractuelle de « in-region », BYOK soumis aux mêmes politiques, « Shared capacity fallback » désactivé si vos clés directes existent pour une raison de conformité. Ajoutez l'inventaire des clés au plan d'audit trimestriel.

FinOps et achats. Trois chiffres à poser dans le modèle de coût avant toute comparaison avec un proxy possédé : la commission (5,5 % ou 8 %), le seuil BYOK (25 000 $ par mois puis 5 %) et le taux de cache obtenu, lu dans les réponses. Le prix du token est la moins importante des trois variables.

FAQ

OpenRouter est-il compatible RGPD ? Les contrôles existent : data_collection: "deny", zdr: true, journalisation des prompts par OpenRouter désactivée par défaut, routage régional UE en plan Business. Attention : côté fournisseurs, data_collection vaut "allow" tant que vous ne le changez pas. Leur valeur juridique dépend du contrat ; faites-y figurer la définition du cache implicite et du routage « in-region ».

Le cache OpenRouter est-il un cache OpenRouter ? Non. Le cache est celui du fournisseur d'inférence. OpenRouter vous ramène vers l'endpoint qui le détient, pendant 10 minutes au mieux, si vous ne changez ni de slug ni d'ordre de fournisseurs.

Comment réduire le coût OpenRouter en premier ? Dans l'ordre : un préfixe stable et un session_id pour obtenir le cache, la Batch API pour l'asynchrone, un modèle moins cher qui passe votre barre de qualité, un max_price pour borner le reste. Le suffixe :floor vient en dernier, hors ligne.

Pourquoi mon fallback ne s'est-il pas déclenché ? Parce que le premier modèle a répondu sans erreur. La chaîne models réagit aux erreurs (contexte, modération, débit, indisponibilité), jamais à une réponse fausse. Et un HTTP 200 peut porter une erreur dans son corps : vérifiez le JSON.


Sources

  1. Documentation OpenRouter, « Latency and Performance » (non datée, consultée le 12 octobre 2026) — « 10-minute best-effort pin » via session_id, réduction du prefill annoncée jusqu'à 80 à 90 %, 20 000 à 90 000 tokens par tour et 5 à 10 secondes de prefill sans cache, invalidation par changement de slug, provider.order désactivant sticky et équilibrage, Auto Exacto, openrouter:tool_search avec defer_loading, preferred_max_latency sur 5 minutes, preferred_min_throughput, partition: "none", caches de bord froids, contrôles supplémentaires à solde bas. Documentation éditeur. openrouter.ai
  2. Documentation OpenRouter, « Prompt Caching » (consultée le 12 octobre 2026) — conditions du routage collant, expiration après 10 minutes d'inactivité, identification par hachage du premier message système, session_id / en-tête x-session-id (256 caractères), prompt_cache_key, champs cache_discount, prompt_tokens_details.cached_tokens, cache_write_tokens. Documentation éditeur. openrouter.ai
  3. Peter Walker, « Cache is Crucial », newsletter OpenRouter Inferred n° 03, 8 octobre 2026 — médiane par fournisseur de 44 % de tokens de prompt agentiques en cache en janvier 2026, 85 % en septembre ; 2 fournisseurs sur 35 au-dessus de 90 % en janvier, 11 sur 54 en septembre ; DeepSeek autour de 96 %. Mesure de l'éditeur sur son propre trafic, non auditée. openrouter.ai
  4. Anthropic, « Prompt caching » (platform.claude.com) — « Cache hits require 100% identical prompt segments », minimum de 512 tokens (Fable 5.1, Opus 5.5, Sonnet 5.5, Haiku 5.5) ou 1 024 (Sonnet 5, Opus 4.8), invalidation par modification des définitions d'outils ; OpenAI, « Prompt caching » (developers.openai.com) — « Cache reuse requires the entire rendered prefix to match », instructions stables en tête, minimum de 1 024 tokens à partir de GPT-5.6. Documentations éditeur, consultées le 12 octobre 2026. platform.claude.com · developers.openai.com
  5. OpenRouter, « How to get the lowest-cost LLM inference on OpenRouter », 12 juin 2026, mis à jour le 24 septembre 2026 — comportement par défaut (exclusion des fournisseurs en panne sur 30 secondes, pondération par l'inverse du carré du prix), :floor équivalent à provider.sort: "price", « disables load balancing and locks onto the cheapest endpoint », max_price, quantizations, partition: "none". Guide éditeur. openrouter.ai
  6. OpenRouter, FAQ et page tarifaire, consultées le 12 octobre 2026 — « OpenRouter charges a 5.5% ($0.80 minimum) fee when you purchase credits », cryptomonnaie 5 %, BYOK « Pay-as-you-go includes $25,000 per month with no BYOK fee » puis 5 %, plan Business pay-as-you-go à 8 % avec routage régional UE et US, plan Enterprise « Fee discounts available ». Tarifs éditeur à la date de consultation. openrouter.ai/docs/faq · openrouter.ai/pricing
  7. Documentation OpenRouter, « Bring Your Own Key (BYOK) », consultée le 12 octobre 2026 — « Your data policies apply to BYOK endpoints », « A BYOK key does not exempt a provider from your data_collection restrictions », include_byok_in_budgets désactivé par défaut, repli sur les endpoints OpenRouter sauf désactivation du « Shared capacity fallback ». Documentation éditeur. openrouter.ai
  8. Brian Thomas, « Batch API », blog OpenRouter, 22 septembre 2026 — remise « generally 50% (and sometimes less) » selon le fournisseur, fenêtre de 24 heures, plus de 230 000 batches sur la bêta de deux semaines, 90 % terminés en moins d'une heure, médiane 7 minutes, p90 1,0 h, p99 10,3 h, un fournisseur par batch, exclusions audio/vidéo/recherche web, fichiers conservés 30 jours, plus de 70 modèles. Chiffres de bêta autodéclarés. openrouter.ai
  9. Sasha Blumenfeld, « Security Center », blog OpenRouter, 28 septembre 2026 — « We found over 1,000 active keys for 85 employees », « 168 hadn't been used in months », détection des clés sans plafond, sans expiration ou inactives depuis plus de 90 jours, score de risque, actions groupées jusqu'à 500 clés, disponibilité sur tous les plans, liste blanche d'IP réservée aux administrateurs Enterprise. Audit interne autodéclaré par l'éditeur. openrouter.ai
  10. OpenRouter, « Confidence Thresholds for Model Escalation Routing », 1er octobre 2026 — les fallbacks « trigger when a model returns an error, not when it returns a valid answer with a low confidence score », « your code makes the escalation decision », response_format en json_schema strict avec provider.require_parameters: true. Billet éditeur. openrouter.ai
  11. OpenRouter, « Model Routing for Support Bots: Cheap-First FAQ Handling », tutoriel, 2 octobre 2026 — fallbacks models sur erreur uniquement, un HTTP 200 pouvant contenir une erreur, trois schémas d'escalade côté application. Tutoriel éditeur. openrouter.ai
  12. OpenRouter, « Cost vs. Quality Tradeoff Framework for Agent Models », 1er octobre 2026 — barre de qualité par tâche, test de trois paliers de modèles sur 20 à 50 exemples, coût lu dans usage.cost. Billet éditeur, exemples « illustrative ». openrouter.ai
  13. Brian Thomas, « Model Router Benchmarks », blog OpenRouter, 2 octobre 2026 — « Switching between models means requests get more expensive while the input cache is rebuilt », « The more processing you run on the routing decisions, the more latency is introduced », prix moyen par token de GPT-6 Astra « over 48x higher » que DeepSeek v4 Flash. Billet éditeur. openrouter.ai
  14. OpenRouter, « AI Agent Regression Testing After a Prompt or Model Change », tutoriel, 30 septembre 2026 — verrouiller le jeu de cas, ne faire varier que le modèle, éviter les alias -latest. Tutoriel éditeur. openrouter.ai
  15. AMindToThink, dépôt GitHub openrouter_reliable_research_search — épinglage par provider.only et allow_fallbacks: false pour la reproductibilité, provider.order seul n'épinglant pas, deux requêtes identiques pouvant atteindre deux backends différents. Retour terrain d'un utilisateur, non revérifié par SFEIR en conditions de production. github.com
  16. Documentation OpenRouter, « Zero Data Retention » — activation par compte, par groupe de modèles ou par requête, combinaison en union, data_collection: deny, journalisation des prompts désactivée par défaut. Documentation éditeur. github.com ; documentation « Provider Routing » (paramètres zdr, data_collection par défaut à "allow", only, allow_fallbacks), consultée le 12 octobre 2026. openrouter.ai
  17. Ernie Tedeschi et Marisa Rama, « An empirical agenda for AI », Stripe Economics, 8 octobre 2026 — « Stripe's acquisition of OpenRouter has not yet closed ». Publication Stripe. stripeeconomics.com
  18. Documentation OpenRouter, « Auto Router », consultée le 12 octobre 2026 — en-tête X-OpenRouter-Metadata: enabled, « ~30 fine-grained task types », cost_tier. Documentation éditeur. openrouter.ai

Auditer votre routage LLM et votre facture de tokens

Barre de qualité par tâche, evals de régression, politiques de données, plafonds par clé, réversibilité vers un proxy possédé : SFEIR passe votre dispositif OpenRouter (ou votre gateway) au crible en quelques jours et vous rend un plan de réglages chiffré.

Échanger avec SFEIR
SFEIR AI Auteur

Articles similaires