Compte
Erreurs
Tous les codes d'erreur renvoyés par la passerelle api14, au format d'erreur d'OpenAI, avec leur signification et la marche à suivre pour chacun.
Les erreurs suivent le format d'erreur d'OpenAI : les SDK officiels les convertissent donc en leurs exceptions habituelles (APIError, RateLimitError, AuthenticationError, etc.). Basez votre logique sur code ; message est une explication lisible en anglais.
{
"error": {
"message": "This request may cost up to $0.0123 but your balance is $0.0040. Add funds at /pricing.",
"type": "insufficient_quota",
"code": "insufficient_balance"
}
}
Les requêtes en échec ne sont pas facturées. Toute réponse avec un statut 4xx ou 5xx ne coûte rien.
Codes d'erreur de la passerelle
| Statut | code | type | Signification |
|---|---|---|---|
| 400 | model_required | invalid_request_error | Le champ model est absent. |
| 400 | invalid_json | invalid_request_error | Le corps n'est pas un objet JSON. |
| 400 | invalid_body | invalid_request_error | Le corps multipart n'a pas pu être lu. |
| 400 | max_tokens_too_large | invalid_request_error | Une requête d'essai du playground a demandé trop de tokens de sortie. |
| 401 | invalid_api_key | authentication_error | La clé est absente, mal formée ou révoquée. |
| 402 | insufficient_balance | insufficient_quota | Votre solde en USD est de $0 ou inférieur au coût maximal estimé de la requête (entrée, plafond de sortie, images ou durée de la vidéo). La requête n’est pas envoyée. |
| 403 | model_not_allowed | permission_error | La liste de modèles autorisés de la clé n'inclut pas ce modèle. |
| 403 | plan_required | permission_error | Votre forfait n'inclut pas cette catégorie de modèles. |
| 404 | model_not_found | not_found_error | L'id du modèle est inconnu, désactivé ou supprimé. |
| 404 | not_found | not_found_error | Endpoint inconnu, ou tâche vidéo ou génération qui ne vous appartient pas. |
| 413 | payload_too_large | invalid_request_error | Le corps de la requête dépasse la taille maximale (25 MB par défaut). |
| 429 | rate_limited | rate_limit_error | Nombre de requêtes par minute dépassé. Accompagné de Retry-After: 60. |
| 429 | daily_limit_reached | rate_limit_error | La clé a atteint sa limite de dépenses quotidiennes en USD. |
| 409 | idempotency_conflict | api_error | Une requête avec cette Idempotency-Key a déjà été envoyée. Utilisez une nouvelle clé pour une autre requête. Limites de débit. |
| 403 | site_not_allowed | permission_error | Widgets uniquement: le site de la page ne fait pas partie de vos sites de widget autorisés. Widgets. |
| 429 | widget_daily_limit | rate_limit_error | Widgets uniquement: le widget, ou l’ensemble des widgets, a atteint la limite de dépense quotidienne en USD. |
| 429 | visitor_daily_limit | rate_limit_error | Widgets uniquement: ce visiteur a atteint la limite quotidienne de requêtes définie dans les contrôles des widgets. |
| 502 | upstream_unavailable | api_error | Le fournisseur en amont est injoignable. |
| 4xx/502 | content_unavailable | variable | Le contenu d'une vidéo n'a pas encore pu être récupéré (le statut reflète celui du fournisseur en amont, 502 à défaut). |
| 503 | maintenance | service_unavailable | Mode maintenance : les endpoints de génération sont suspendus, les endpoints GET fonctionnent toujours. |
| 503 | not_configured | service_unavailable | La passerelle n'est pas encore configurée. |
Erreurs du fournisseur en amont
Les erreurs renvoyées par le fournisseur en amont (par exemple un paramètre invalide pour un modèle donné, un dépassement de la longueur de contexte, un refus lié à la politique de contenu ou un 429 du fournisseur lui-même) sont transmises avec leur code de statut d'origine et le même format { error: { ... } }.
Que faire
| Statut | Réessayer ? | Action |
|---|---|---|
| 400 | Non | Corrigez le corps de la requête. |
| 401 | Non | Vérifiez la clé et l'en-tête Authorization: Bearer. Voir Authentification. |
| 402 | Non | Ajoutez des fonds ou activez la recharge automatique. |
| 403 | Non | Utilisez un modèle autorisé, modifiez la liste de modèles autorisés de la clé ou passez à un forfait supérieur. |
| 404 | Non | Vérifiez l'id du modèle sur la page des modèles. |
| 413 | Non | Envoyez un corps plus léger, ou transmettez les fichiers par URL plutôt qu'en base64. |
| 429 | Plus tard | rate_limited : attendez la durée indiquée par Retry-After. daily_limit_reached : attendez le jour UTC suivant ou augmentez la limite de la clé. Voir Limites de débit. |
| 502 | Oui | Réessayez avec un backoff, ou ajoutez des modèles de repli. |
| 503 | Oui | Réessayez plus tard. |
Gérer les erreurs dans le code
import OpenAI from 'openai'
const client = new OpenAI({ baseURL: 'https://api14.com/api/v1', apiKey: process.env.API14_API_KEY })
try {
await client.chat.completions.create({ model: 'openai/gpt-5-mini', messages: [{ role: 'user', content: 'Hi' }] })
} catch (err) {
if (err instanceof OpenAI.APIError) {
console.error(err.status, err.code, err.message)
if (err.code === 'insufficient_balance') {
// prompt the user to add funds
}
} else {
throw err
}
}
from openai import OpenAI, APIStatusError
client = OpenAI(base_url="https://api14.com/api/v1", api_key="sk-api14-...")
try:
client.chat.completions.create(model="openai/gpt-5-mini", messages=[{"role": "user", "content": "Hi"}])
except APIStatusError as e:
print(e.status_code, e.code, e.message)
Les erreurs qui surviennent après le début d'un flux arrivent à l'intérieur du flux. Voir Streaming.