Guides
Erreurs, limites et nouvelles tentatives
Lisez les réponses d'erreur et les en-têtes de limite de débit, réessayez en sécurité et diagnostiquez les échecs courants.
Chaque API Felo renvoie un corps d'erreur JSON avec un code d'erreur stable et un ID de requête. Lisez d'abord le statut HTTP, puis le code, puis le message.
Enveloppe d'erreur
Les réponses de production actuelles utilisent le statut HTTP comme status :
{
"status": 401,
"code": "UNAUTHORIZED",
"message": "Invalid API Key",
"request_id": "202610221444486982113280416060637185"
}| Champ | Signification |
|---|---|
status | Code de statut HTTP, répété dans le corps |
code | Code d'erreur lisible par une machine |
message | Explication lisible par un humain |
request_id | Identifiant opaque de cette requête ; incluez-le dans vos demandes de support |
Certains exemples d'endpoints plus anciens utilisent status: "error" et une chaîne de code différente. Basez votre logique sur le statut HTTP et le code, pas sur le libellé exact de message.
Codes courants
| HTTP | Code | Signification | Que faire |
|---|---|---|---|
| 400 | Code de validation propre à l'endpoint | Un paramètre est manquant ou invalide | Corrigez la requête ; ne réessayez pas à l'identique |
| 401 | UNAUTHORIZED | Clé API manquante, invalide, expirée ou révoquée | Envoyez Authorization: Bearer $FELO_API_KEY ; renouvelez la clé si elle est révoquée |
| 402 | INSUFFICIENT_CREDITS | Crédits de service insuffisants | Rechargez dans Console Billing, puis réessayez |
| 404 | Propre à l'endpoint | Modèle, tâche ou route inconnu | Vérifiez l'ID de modèle ou de tâche et le chemin de l'endpoint |
| 429 | RATE_LIMITED | Une limite de débit a été dépassée | Attendez Retry-After, puis réessayez |
| 5xx | CHAT_FAILED, *_FAILED, SERVICE_UNAVAILABLE | Échec du service ou de l'upstream | Réessayez avec un backoff ; contactez le support si le problème persiste |
Les références d'endpoint listent les codes propres à cet endpoint. Commencez par les erreurs du Chat API ou par la référence de l'endpoint que vous appelez.
Endpoints de génération par modèle
POST /api/v1/images/generations et POST /api/v1/videos/generations renvoient les erreurs au niveau de l'endpoint dans l'enveloppe OpenAI plutôt que dans l'enveloppe ci-dessus :
{
"error": {
"message": "Model kind does not match this generation endpoint",
"type": "invalid_request_error",
"param": null,
"code": "model_kind_mismatch"
}
}L'ID de requête se trouve dans l'en-tête de réponse X-Request-Id, et non dans le corps. Une requête rejetée ne crée pas de tâche. Une fois qu'une tâche existe, la plupart des échecs arrivent comme statut terminal de tâche dans une réponse 200 plutôt que comme erreur HTTP : vérifiez status pour failed ou interrupted, puis lisez error.message. Consultez Génération d'images et Tâches asynchrones.
ID de requête
Les corps d'erreur Felo incluent request_id. Journalisez-le avec l'endpoint, le statut HTTP, le code d'erreur, l'ID de modèle et l'ID de tâche. Ne journalisez jamais la clé API complète.
Le Model API accepte aussi un en-tête de requête X-Request-Id facultatif. Lorsque vous en envoyez un, il est renvoyé pour le diagnostic, ce qui vous permet de corréler vos propres logs avec une requête. Si vous n'en envoyez pas, utilisez le request_id renvoyé.
Limites de débit
/v2/chat est le seul endpoint Felo avec des limites de débit appliquées et documentées :
- Par clé API, fenêtre de 1 minute.
- Par utilisateur, fenêtre de 1 minute.
- Par utilisateur, fenêtre de 1 heure.
Les utilisateurs disposant d'un abonnement Felo payant effectif, y compris les abonnements entreprise, en sont exemptés et ne reçoivent aucun en-tête X-RateLimit-*. Si le statut d'abonnement ne peut pas être vérifié, les limites s'appliquent.
| En-tête | Signification |
|---|---|
X-RateLimit-Limit | Limite de la dimension la plus restrictive actuellement en vigueur |
X-RateLimit-Remaining | Quota restant minimal sur les trois dimensions |
X-RateLimit-Reset | Horodatage Unix en secondes de la réinitialisation de la fenêtre en cours |
Retry-After | Sur un 429, le délai recommandé en secondes |
Les autres endpoints /v2/** n'ont actuellement aucune limite de débit appliquée. Les requêtes au Model API peuvent toujours être limitées par le fournisseur upstream, ce qui peut se manifester par un 429.
Ne codez pas les limites numériques en dur. Lisez les en-têtes de chaque réponse.
Politique de nouvelle tentative
| Situation | Réessayer ? |
|---|---|
| 400, 401, 402, 404 | Non. Corrigez d'abord la requête, la clé ou le solde. |
| 429 | Oui, après Retry-After ou X-RateLimit-Reset. |
| 5xx, expirations de délai, réinitialisations de connexion | Oui, avec un backoff exponentiel et du jitter. |
| Connexion de streaming interrompue en cours de réponse | Réessayez uniquement si votre application peut tolérer une génération en double. |
Boucle recommandée :
- Ne réessayez que les requêtes idempotentes ou sûres à répéter.
- Utilisez un backoff exponentiel : commencez autour de 1 seconde, doublez à chaque fois, plafonnez à 30 secondes.
- Ajoutez un jitter aléatoire pour que les clients ne réessaient pas au même instant.
- Arrêtez-vous après un petit nombre de tentatives et remontez l'erreur.
- Sur un 429, respectez
Retry-Afterplutôt que votre propre calendrier.
Séquence de débogage
- Vérifiez que la clé est présente et non révoquée.
- Appelez
GET /api/v1/modelsavec la même clé pour confirmer l'authentification. - Envoyez la plus petite requête valide à l'endpoint cible.
- Ajoutez le streaming, les outils ou des entrées volumineuses un élément à la fois.
- Pour un travail asynchrone, vérifiez l'état de la tâche avant de soumettre à nouveau.