Guides · Rate limits and errors
Limites de débit et erreurs : codes, en-têtes et reprises
Toute intégration en production finit par rencontrer des erreurs : une requête mal formée, une clé expirée, un pic de trafic au-delà de votre limite ou une brève interruption. Ce guide explique comment l'API inference.eu signale chaque cas, quelles erreurs méritent une reprise, comment lire les en-têtes de limite de débit et comment écrire une boucle de reprise qui tient la route.
- 01Format d'API: OpenAI et Anthropic
- 02Centres de données dans l'UE
- 03Couvert par un seul DPA
import os, random, time
import openai
from openai import OpenAI
# The SDK already retries some errors; max_retries=0 here so the loop below is explicit.
client = OpenAI(base_url="https://api.inference.eu/v1", api_key=os.environ["INFERENCE_EU_API_KEY"], max_retries=0)
def complete(messages, attempts=6):
for attempt in range(attempts):
try:
return client.chat.completions.create(model="gpt-oss-120b", messages=messages)
except (openai.RateLimitError, openai.InternalServerError, openai.APIConnectionError) as err:
if attempt == attempts - 1:
raise
retry_after = getattr(getattr(err, "response", None), "headers", {}).get("retry-after")
delay = float(retry_after) if retry_after else min(2 ** attempt, 30) + random.random()
time.sleep(delay)
except openai.BadRequestError as err:
# 400s will fail again unchanged: log and fix the request instead of retrying
print("Invalid request:", err.message)
raiseCodes de statut et objet d'erreur
Les erreurs utilisent les codes HTTP standard et, sur les points de terminaison au format OpenAI, un corps JSON avec un objet error contenant message, type, param et code. Le message s'adresse aux développeurs et désigne le champ ou la valeur en cause. Les points de terminaison au format Anthropic renvoient plutôt {"type": "error", "error": {"type", "message"}}.
Les codes que vous verrez : 400 pour une requête invalide, comme un champ erroné ou un prompt qui dépasse la fenêtre de contexte ; 401 pour une clé absente ou invalide ; 403 si la clé n'a pas accès à un modèle ou une fonction ; 404 pour un modèle ou objet inconnu ; 413 pour un corps trop volumineux ; 422 pour une requête valide mais impossible à traiter ; 429 pour les limites de débit ; 500, 502, 503 ou 529 pour un incident temporaire côté serveur.
Comment fonctionnent les limites de débit
Les limites s'appliquent par organisation ou par projet et par modèle, et portent en général sur les requêtes et les tokens par minute. Leurs valeurs dépendent de votre offre et nous les convenons avec vous plutôt que de publier des paliers fixes. Si vous prévoyez un lancement ou une grosse migration, prévenez-nous et nous les relèverons.
Les réponses comportent des en-têtes qui indiquent où vous en êtes : x-ratelimit-limit-requests, x-ratelimit-remaining-requests et x-ratelimit-reset-requests, ainsi que leurs équivalents -tokens. En cas de dépassement, l'API renvoie un 429 avec un en-tête Retry-After indiquant le nombre de secondes à attendre. Lisez ces en-têtes pour ralentir avant d'atteindre la limite, pas après.
Un schéma de reprise fiable
Réessayez les 429, les 5xx et les erreurs de connexion ; pas les 400, 401, 403 ou 404, car la même requête échouera de nouveau. Attendez avant chaque reprise : utilisez Retry-After s'il est présent, sinon un délai exponentiel avec une part aléatoire, comme dans l'exemple, pour éviter que de nombreux clients réessaient au même instant. Plafonnez le nombre de tentatives et l'attente totale.
Les SDK OpenAI et Anthropic réessaient déjà certaines erreurs par défaut : appuyez-vous dessus en réglant max_retries, ou désactivez-le et utilisez votre propre boucle, mais pas les deux. Pour de gros volumes, préférez une file d'attente à concurrence fixe, ou passez par un traitement par lots.
Cas particuliers à prévoir
Un 400 lié à la longueur de contexte est fréquent avec les longs documents. Comptez les tokens au préalable, réduisez l'historique ou découpez l'entrée. Une réponse réussie peut aussi être incomplète : vérifiez finish_reason ou status avant d'utiliser le résultat. En streaming, une erreur peut survenir en cours de flux sous forme d'événement ; considérez la sortie partielle comme inachevée.
Prévoyez des délais d'attente suffisants pour les modèles de raisonnement et les longues sorties, et rendez les opérations rejouables sans risque, par exemple en dédupliquant sur votre propre identifiant de requête. Journalisez l'identifiant de requête renvoyé dans les en-têtes avec chaque erreur : si vous nous contactez, nous retrouverons la requête exacte.
Rate limits and errors : questions fréquentes
Les questions que nous posent le plus les achats, les développeurs et les juristes. Il en manque une ? Posez-la-nous directement.
Pages liées
- Chat completionsEnvoyez vos messages à des modèles open-weight au format chat completions d'OpenAI. Traitement dans des centres de données de l'UE, sans entraînement.Endpoints
- BatchesExécutez des milliers de requêtes de chat ou d'embeddings en un seul traitement asynchrone avec une API batch compatible OpenAI, traitée dans l'UE.Endpoints
- StreamingRecevez les tokens des modèles ouverts au fil de la génération, en server-sent events aux formats OpenAI et Anthropic. Exemples, fragments et erreurs.Guides
- Migrate from OpenAIFaites passer votre application d'OpenAI à des modèles ouverts traités dans l'UE. Changez l'URL de base, la clé et le modèle, puis testez outils et JSON.Guides
Faites passer vos charges IA sur une infrastructure européenne
Dites-nous quels modèles vous utilisez et votre volume approximatif. Nous répondons sous un jour ouvré avec un tarif et la suite.
- Réponse sous un jour ouvré
- Tarif adapté à votre volume
- DPA prêt à signer