Table des erreurs : Claude Code et Codex sur une API tierce
Un même message d'erreur a souvent des causes radicalement différentes en direct et via une passerelle. Cette table s'organise en cinq couches — réseau, authentification, protocole, modèle, contexte — avec, pour chacune, une commande de sonde à copier et un critère de décision.
Comment utiliser cette table
Ne cherchez pas immédiatement la réponse dans le texte de l'erreur : déterminez d'abord quelle couche a échoué. Presque toutes les erreurs d'un client IA proviennent de ces cinq couches :
- Couche réseau : la requête n'a jamais atteint le serveur
- Couche authentification : elle est arrivée, mais la clé n'est pas reconnue
- Couche protocole : la clé est reconnue, mais le chemin ou le format ne va pas
- Couche modèle : le protocole passe, mais le modèle n'existe pas
- Couche contexte : le modèle tourne, mais l'entrée est trop longue
L'intérêt du découpage : la correction est totalement différente d'une couche à l'autre, et le texte de l'erreur ne dit presque jamais dans laquelle vous vous trouvez.
Diagnostic par statut HTTP
Ces commandes vérifient la liste des modèles et trois protocoles, avec le statut HTTP de chaque requête :
Définissez votre clé API KimiSeek dans le terminal où vous exécuterez curl, en remplaçant la valeur d’exemple. Une clé enregistrée dans votre client ne remplit pas automatiquement cette variable du shell :
# Replace the placeholder with your own key from the dashboard.
export KIMISEEK_API_KEY="ks-your-key"# Inspect each HTTP status and error body; a model list does not prove sufficient balance.
# 1. Is the key valid at all? (lists models)
curl -sS --max-time 30 -w '\nHTTP %{http_code} /v1/models\n' https://api.kimiseek.app/v1/models \
-H "Authorization: Bearer ${KIMISEEK_API_KEY:?Set KIMISEEK_API_KEY before running this command}"
# 2. OpenAI Chat Completions
curl -sS --max-time 30 -w '\nHTTP %{http_code} /v1/chat/completions\n' https://api.kimiseek.app/v1/chat/completions \
-H "Authorization: Bearer ${KIMISEEK_API_KEY:?Set KIMISEEK_API_KEY before running this command}" \
-H "Content-Type: application/json" \
-d '{"model":"deepseek-v4-pro-0813","messages":[{"role":"user","content":"ping"}],"max_tokens":8}'
# 3. Anthropic Messages (the protocol Claude Code speaks)
curl -sS --max-time 30 -w '\nHTTP %{http_code} /v1/messages\n' https://api.kimiseek.app/v1/messages \
-H "x-api-key: ${KIMISEEK_API_KEY:?Set KIMISEEK_API_KEY before running this command}" \
-H "anthropic-version: 2023-06-01" \
-H "Content-Type: application/json" \
-d '{"model":"deepseek-v4-pro-0813","max_tokens":8,"messages":[{"role":"user","content":"ping"}]}'
# 4. OpenAI Responses (the protocol Codex speaks)
curl -sS --max-time 30 -w '\nHTTP %{http_code} /v1/responses\n' https://api.kimiseek.app/v1/responses \
-H "Authorization: Bearer ${KIMISEEK_API_KEY:?Set KIMISEEK_API_KEY before running this command}" \
-H "Content-Type: application/json" \
-d '{"model":"deepseek-v4-pro-0813","input":"ping","max_output_tokens":16}'Lisez le statut HTTP affiché après chaque réponse ainsi que error.code, error.type et message dans le corps. L’étape qui échoue ne suffit pas à déterminer la prise en charge du protocole. Une liste de modèles en 200 valide la clé, pas le solde : un compte sans solde peut obtenir 200 à l’étape 1 et 402 à l’étape 2.
| Statut ou erreur | Interprétation | Action suivante |
|---|---|---|
| 200 avec la structure attendue | Cette requête a réussi, mais toutes les fonctions des outils ne sont pas vérifiées | Tester la configuration du client et les appels d’outils réels |
| 401 / 403 | Identifiants, limites de clé ou droits d’accès au modèle | Vérifier activation, expiration, limites et autorisation en amont |
402 / insufficient_balance | Solde du compte insuffisant | Recharger puis réessayer, sans changer le protocole |
400 / 404 avec model_not_found, not_found_error ou un message de modèle introuvable | ID incorrect ou désactivé, ou accès au modèle manquant en amont | Utiliser l’ID complet de la liste et vérifier le canal et les droits |
| 400 avec un message de paramètre invalide | Champs de requête ou limites du modèle incompatibles | Vérifier messages, outils et limites de tokens selon le corps de l’erreur |
| 404 indiquant explicitement une route ou un endpoint absent | Chemin incorrect ou API non fournie par la passerelle | Vérifier Base URL et /v1, puis le protocole ; 404 seul ne distingue pas un modèle absent d’une route absente |
| 429 | Limitation de débit, quota ou surcharge en amont | Lire l’erreur, attendre avant de réessayer ou réduire l’usage |
| 5xx | Panne temporaire de la passerelle ou du fournisseur | Conserver l’erreur et l’ID de requête, puis réessayer plus tard |
| HTTP 000 / erreur de connexion ou délai curl | Aucune réponse HTTP ; chaque sonde attend au maximum 30 secondes | Vérifier DNS, proxy et réseau ; un délai dépassé ne prouve pas l’absence du protocole |
Côté Claude Code
Aucun identifiant
Invalid API key · Please run /loginCe message indique que Claude Code n'a récupéré aucun identifiant. Vérifiez que ANTHROPIC_AUTH_TOKEN est bien actif dans le shell qui a lancé Claude Code — l'erreur classique étant d'exporter dans un terminal et de démarrer le client dans un autre.
401, échec d'authentification
API Error: 401 {"type":"error","error":{"type":"authentication_error","message":"invalid api key"}}Causes par ordre de probabilité :
- un espace ou un saut de ligne a été copié avec la clé
- la clé a été révoquée ou son quota est épuisé
ANTHROPIC_API_KEYest défini mais vide, et le client retombe sur un état connecté
403 forbidden
API Error: 403 {"type":"error","error":{"type":"forbidden","message":"invalid x-api-key"}}En direct, ce message signifie généralement que la clé est invalide ; via une passerelle, la cause la plus fréquente est une écriture incorrecte de l'en-tête : certaines passerelles n'acceptent que Authorization: Bearer, d'autres seulement x-api-key. KimiSeek accepte les deux, mais si vous avez en plus un proxy au milieu, l'en-tête peut être réécrit.
model not found
API Error: 400 {"type":"error","error":{"type":"invalid_request_error","message":"model: deepseek-v4-flash-0731 not found"}}Deux possibilités : un nom de modèle mal orthographié, ou un modèle retiré du catalogue. Un id retiré continue de renvoyer not found au lieu d'indiquer qu'il est retiré, et c'est le piège qui fait perdre le plus de temps — vous passez un long moment à auditer la configuration alors que la vraie réponse est que le modèle a changé de génération.
Remplacez-le par un id réel depuis la page des modèles.
Le flux se coupe en cours de route
API Error: stream disconnected before completion: stream closed before completionLa connexion en flux a été interrompue en cours de route. Vérifiez dans cet ordre :
- si un proxy HTTP local (
HTTPS_PROXY) intercepte la requête - si le réseau d'entreprise applique un timeout sur les réponses longues
- si une limite de durée par requête a été déclenchée côté serveur
Le délai d’expiration des requêtes vers le fournisseur est de 600 secondes pour /v1/messages (Claude Code) et de 175 secondes pour /v1/responses (Codex). Le client ou un proxy intermédiaire peut couper la connexion plus tôt ; vérifiez l’endpoint utilisé et le détail de l’erreur.
Dépassement de contexte
API Error: 400 {"type":"error","error":{"type":"invalid_request_error","message":"prompt is too long: 210000 tokens > 200000 maximum"}}Notez que le 200000 affiché ici est la limite du client ou du modèle, et pas nécessairement le chiffre que vous attendiez. Sur DeepSeek V4 Pro, la limite réelle est de 1M : si vous voyez 200000, c'est que la requête n'a pas atteint le modèle visé, ou que le client a tronqué selon les spécifications de Claude.
Côté Codex
401 Missing bearer
■ unexpected status 401 Unauthorized: Missing bearerenv_key dans config.toml n'est qu'un nom de variable : la valeur réelle doit être présente dans l'environnement. Ce message dit exactement « le nom de variable est écrit, mais la variable d'environnement est vide ».
404 Not Found
■ unexpected status 404 Not FoundHuit fois sur dix, il manque /v1 dans base_url. Codex assemble base_url + "/responses" : sans le /v1, la requête tombe sur un chemin du site.
Après avoir vérifié base_url, examinez aussi si le corps signale un modèle introuvable. Si /v1/responses est réellement absent, utilisez une passerelle ou une couche de conversion compatible ; Codex actuel refuse wire_api = "chat". Voir le guide Codex.
Interruption de flux
■ stream disconnected before completionMême problème de flux que côté Claude Code, mais Codex y est plus sensible — sa boucle d'exécution dépend d'un flux d'événements complet. Sur un réseau instable, changez de réseau plutôt que de compter sur des tentatives répétées.
Deux pannes réseau typiques
fetch failed
ECONNREFUSED 127.0.0.1:7890fetch failed est l'erreur réseau générique de Node : prise littéralement, elle n'apporte aucune information. Pour connaître la cause réelle, il faut regarder la ligne ECONNREFUSED — si elle pointe vers un port local du type 127.0.0.1:7890, c'est qu'un proxy local a pris la requête en charge, et que ce proxy ne tourne pas ou que ses règles sont fausses.
C'est la panne la plus souvent prise à tort pour « la passerelle est tombée ». La méthode de diagnostic : si curl passe mais pas le client, c'est presque toujours que les variables d'environnement du shell du client diffèrent de celles du shell où tourne curl.
Un même message, des causes différentes en direct et via une passerelle
C'est le modèle mental le plus utile à se construire quand on passe par une passerelle :
| Message | En direct sur l'officiel | Via une passerelle |
|---|---|---|
invalid x-api-key | la clé elle-même est invalide | le nom d'en-tête n'est pas reconnu par la passerelle, ou un proxy intermédiaire l'a réécrit |
model not found | nom de modèle mal écrit | l'id est absent de la table de correspondance de la passerelle, ou le modèle est retiré |
stream disconnected | hoquet du service officiel | proxy local, réseau d'entreprise ou timeout de la passerelle, l'un des trois |
prompt is too long | au-delà de 200K | la passerelle a routé la requête vers un amont au contexte plus petit |
| 401 | clé erronée | la clé est bonne, mais la variable d'environnement n'a pas atteint le processus client |
Ce qu'il faut joindre quand vous demandez de l'aide
Si vous interrogez quelqu'un (ou ouvrez un ticket), ces quatre éléments sont indispensables, sinon personne ne pourra localiser le problème :
- le texte complet de l'erreur (une ligne entière, pas une capture d'écran tronquée)
- le résultat de la sonde
curlpar couches — laquelle des quatre étapes a échoué - la version du client (
claude --version/codex --version) - l'id du modèle et la Base URL utilisés (clé masquée)
Date de vérification
- Date de vérification : 2026-10-26
- Les exemples servent à localiser la panne ; les messages peuvent varier selon la version du client. Indiquez votre version installée lors du signalement. La configuration Codex a été vérifiée avec 0.154.0.
Questions fréquentes
Pourquoi curl fonctionne-t-il alors que le client ne passe pas ?
La cause la plus fréquente est que la variable d'environnement n'est pas dans le même shell. Le client lit l'environnement de son propre processus : exporter dans un autre terminal ne sert à rien. Vérifiez d'abord que echo $ANTHROPIC_AUTH_TOKEN renvoie bien une valeur dans le shell qui lance le client.
Comment distinguer réellement 403 et 401 ?
401, c'est « je ne sais pas qui vous êtes » ; 403, c'est « je sais qui vous êtes, mais je ne vous autorise pas à faire ça ». Via une passerelle, le 403 relève plutôt de l'écriture des en-têtes ou d'une politique de routage, tandis que le 401 vient plutôt de la clé elle-même ou de la variable d'environnement.
Le dépassement de contexte affiche 200000 alors que le modèle annonce 1M. Pourquoi ?
Cela indique que la requête n'a pas atteint le modèle que vous croyez viser. Soit l'id du modèle est erroné et la requête est retombée sur le modèle par défaut, soit le client a tronqué selon les spécifications de Claude. Confirmez l'id avec /v1/models, puis regardez le context window dans les réglages du client.
Réessayer suffit-il à résoudre une interruption de flux ?
En général, non. Une interruption de flux est un problème de couche connexion : réessayer ne fait que répéter le même échec. Vérifiez d'abord le proxy et le réseau, puis envisagez de découper les tâches longues en morceaux plus petits.