# Gestion des erreurs

## Format de réponse d'erreur unifié

Toutes les erreurs API renvoient un format JSON unifié :

```json
{
  "code": 2010,
  "message": "Insufficient credits",
  "suggestion": "Please top up your account at https://platform.tripo3d.ai",
  "request_id": "req_abc123"
}
```

| Champ | Tapez | Descriptif |
| :-: | :-: | :-: |
| code | entier | Code d'erreur |
| message | chaîne | Description de l'erreur |
| suggestion | chaîne | Solution suggérée |
| request_id | chaîne | Identifiant de demande unique pour le dépannage |

## Codes d'état HTTP

| Code d'état | Signification | Descriptif |
| :-: | :-: | :-: |
| 200 | Succès | La demande a été traitée avec succès |
| 400 | Paramètres invalides | Les paramètres requis sont manquants ou mal formés |
| 401 | Non authentifié | Le API Key est manquant ou invalide |
| 403 | Autorisations insuffisantes | Vous n'avez pas la permission d'accéder à la ressource ou vos crédits sont insuffisants |
| 404 | Ressource introuvable | La tâche ou la ressource demandée n'existe pas |
| 429 | Trop de demandes | Limite de débit dépassée. Réduisez la fréquence de vos demandes |
| 500 | Erreur de service | Erreur de serveur interne. Réessayez plus tard |

## Référence du code d'erreur

| Code d'erreur | Signification | Manipulation recommandée |
| :-: | :-: | :-: |
| 1000 | API Key invalide | Vérifiez si le API Key est correct ou a été supprimé |
| 1001 | Non autorisé | Vérifiez si l'en-tête de la demande inclut `Authorization` |
| 2000 | Limite de débit dépassée | Réduisez la fréquence des requêtes et implémentez des tentatives avec une interruption exponentielle |
| 2002 | Paramètre de requête non pris en charge | Vérifiez si les noms et les valeurs des champs du corps de la requête correspondent à la documentation |
| 2003 | Fichier d'entrée vide | Confirmez que le fichier téléchargé n'est pas vide et utilise un format valide |
| 2004 | Type de fichier non pris en charge | Vérifiez si le format de fichier est dans la liste prise en charge |
| 2008 | Violation des règles relatives au contenu | Modifiez le contenu d'entrée pour éviter les mots ou les images interdits |
| 2010 | Crédits insuffisants | Recharger des crédits dans la console |
| 2015 | Version obsolète | Mise à niveau vers la dernière version de API |
| 2018 | Modèle trop complexe | Réduire la complexité ou le nombre de polycomptes du modèle d'entrée |

## Exemples de gestion des erreurs

### Python

```python
import time
import requests

def call_api_with_retry(url, headers, payload=None, max_retries=3):
    for attempt in range(max_retries):
        if payload:
            response = requests.post(url, headers=headers, json=payload)
        else:
            response = requests.get(url, headers=headers)

        if response.status_code == 200:
            return response.json()

        if response.status_code == 429:
            wait = 2 ** attempt
            print(f"Rate limit triggered. Retrying in {wait} seconds...")
            time.sleep(wait)
            continue

        error = response.json()
        raise Exception(
            f"API error [{error['code']}]: {error['message']} "
            f"(suggestion: {error.get('suggestion', 'none')})"
        )

    raise Exception("Maximum retry attempts exhausted")
```

### JavaScript

```javascript
async function callApiWithRetry(url, options, maxRetries = 3) {
  for (let attempt = 0; attempt < maxRetries; attempt++) {
    const response = await fetch(url, options);

    if (response.ok) {
      return await response.json();
    }

    if (response.status === 429) {
      const wait = 2 ** attempt * 1000;
      console.log(`Rate limit triggered. Retrying in ${wait / 1000} seconds...`);
      await new Promise(resolve => setTimeout(resolve, wait));
      continue;
    }

    const error = await response.json();
    throw new Error(
      `API error [${error.code}]: ${error.message} (suggestion: ${error.suggestion || "none"})`
    );
  }

  throw new Error("Maximum retry attempts exhausted");
}
```

## Recommandations relatives à la stratégie de nouvelle tentative

Pour les erreurs réessayables, telles que 429 limites de débit et 500 erreurs de service, utilisez une stratégie d'attente exponentielle :

1. Première tentative : attendez 1 seconde
2. Deuxième tentative : attendez 2 secondes
3. Troisième tentative : attendez 4 secondes
4. Maintenez le nombre maximum de tentatives à 5 ou moins

Pour les erreurs non réessayables, telles que 400, 401 et 403, générez directement une exception et corrigez le problème sous-jacent.
