Si vous avez essayé de diriger Claude Code vers DeepSeek V4, OpenRouter ou tout autre fournisseur de modèle tiers, vous avez probablement rencontré ceci : Invalid custom3p enterprise config. L'erreur est énigmatique, la documentation ne l'explique pas clairement, et elle vous empêche de faire quelque chose que Claude Code prend officiellement en charge.
Ce guide explique précisément ce que signifie « custom3p », les six raisons les plus courantes de l'échec de la configuration, et les solutions étape par étape pour chacune d'elles. Si vous essayez d'exécuter la boucle d'agent de Claude Code via DeepSeek ou une passerelle LLM comme LiteLLM, vous trouverez ici des exemples de configuration fonctionnels.
TL;DR
Invalid custom3p enterprise config signifie que Claude Code ne peut pas valider la configuration de votre fournisseur tiers. « custom3p » est l'étiquette interne de Claude Code pour tout point de terminaison d'API non-Anthropic configuré via ANTHROPIC_BASE_URL. Les causes les plus courantes sont : un /v1 final dans l'URL de base, une variable d'identification incorrecte, un fichier settings.json mal formé et un onboarding incomplet lors d'une nouvelle installation. Corrigez d'abord le format de l'URL, cela résout environ 60 % des cas.
Ce que signifie réellement « custom3p »
Claude Code achemine les requêtes via l'un des quatre modes suivants :
| Mode | Comment il est déclenché |
|---|---|
| API Anthropic (par défaut) | Aucune surcharge définie |
| Amazon Bedrock | CLAUDE_CODE_USE_BEDROCK=1 |
| Google Vertex AI | CLAUDE_CODE_USE_VERTEX=1 |
| Microsoft Foundry | CLAUDE_CODE_USE_FOUNDRY=1 |
| Tiers personnalisé | ANTHROPIC_BASE_URL pointe vers autre chose |
La dernière ligne est « custom3p », tiers personnalisé. Lorsque ANTHROPIC_BASE_URL est défini sur un hôte non-Anthropic (LiteLLM, OpenRouter, un serveur vLLM local, une passerelle d'entreprise), Claude Code étiquette en interne ce chemin « custom3p » et exécute une vérification de validation avant le premier appel API.
Si cette vérification échoue, vous obtenez : Invalid custom3p enterprise config.
L'erreur est antérieure aux restrictions d'Anthropic de 2026 sur les harnais tiers. Il s'agit d'une erreur de validation de configuration, pas d'un blocage de politique, ce qui signifie que vous pouvez la corriger.
Pourquoi les développeurs rencontrent cette erreur maintenant
En avril 2026, Anthropic a bloqué l'accès aux abonnements Claude Pro et Max pour les outils tiers d'agents qui usurpaient l'identifiant client de Claude Code. Des outils comme OpenClaw, qui acheminaient les sessions de Claude Code via leurs propres backends, ont cessé de fonctionner du jour au lendemain.
C'est un problème distinct de celui que couvre cet article.
Ce qui s'est passé ensuite est la raison pour laquelle vous lisez ceci : les développeurs ont commencé à utiliser le support *officiel* des fournisseurs tiers de Claude Code pour acheminer les requêtes via des backends moins chers. Un fil Reddit a documenté le passage de la boucle d'agent de Claude Code à DeepSeek V4 Pro via OpenRouter, à 0,87 $ par million de tokens de sortie contre 15 $ pour Anthropic, soit une réduction de coût d'environ 17x. Des projets comme DeepClaude ont regroupé cela dans une configuration en une seule commande.
Le hic : le support officiel des fournisseurs tiers d'Anthropic nécessite une configuration d'entreprise correcte. Faites une erreur sur un champ et vous obtenez Invalid custom3p enterprise config. La plupart des guides en ligne ignorent la configuration d'entreprise ou montrent un format d'URL incorrect.
Cause première 1 : Présence de /v1 en fin d'URL dans ANTHROPIC_BASE_URL
C'est l'erreur la plus courante. Claude Code ajoute automatiquement /v1/messages à toute URL que vous définissez. Si votre URL de base inclut déjà /v1, le chemin final devient /v1/v1/messages ce qui renvoie une erreur 404.
Incorrect :
export ANTHROPIC_BASE_URL="https://api.openrouter.ai/api/v1"
Incorrect :
export ANTHROPIC_BASE_URL="https://litellm.yourcompany.com/v1"
Correct :
export ANTHROPIC_BASE_URL="https://api.openrouter.ai/api"
Correct :
export ANTHROPIC_BASE_URL="https://litellm.yourcompany.com"
Pour vérifier l'URL finale que Claude Code appelle, exécutez ce curl :
curl -s -o /dev/null -w "%{http_code}" \
-H "Authorization: Bearer $ANTHROPIC_AUTH_TOKEN" \
"${ANTHROPIC_BASE_URL}/v1/messages" \
-d '{"model":"claude-sonnet-4-6","max_tokens":1,"messages":[{"role":"user","content":"hi"}]}'
Un 200 ou 400 (mauvaise requête, mais le point de terminaison existe) signifie que l'URL est correcte. Un 404 signifie que vous avez toujours le problème du /v1.
Cause première 2 : Variable d'identification incorrecte
Claude Code utilise deux variables d'environnement différentes pour l'authentification selon le contexte, et les mélanger entraîne l'échec silencieux de la validation de la configuration d'entreprise.
| Variable | Envoyée comme | Quand utiliser |
|---|---|---|
ANTHROPIC_API_KEY |
En-tête x-api-key |
Passerelles au format Anthropic qui attendent une authentification par clé API |
ANTHROPIC_AUTH_TOKEN |
En-tête Authorization: Bearer |
Passerelles de style OAuth, LiteLLM, la plupart des configurations OpenRouter |
OpenRouter, par exemple, s'attend à un jeton bearer :
export ANTHROPIC_AUTH_TOKEN="sk-or-your-openrouter-key"
export ANTHROPIC_BASE_URL="https://openrouter.ai/api"
L'utilisation de ANTHROPIC_API_KEY avec OpenRouter envoie un en-tête x-api-key qu'OpenRouter ignore — la requête échoue l'authentification, et Claude Code le signale comme une configuration d'entreprise invalide.
Pour LiteLLM :
export ANTHROPIC_AUTH_TOKEN="sk-litellm-your-virtual-key"
export ANTHROPIC_BASE_URL="https://your-litellm-server:4000"
Pour une passerelle DeepSeek ou un serveur vLLM local fonctionnant avec une clé API :
export ANTHROPIC_API_KEY="your-key-here"
export ANTHROPIC_BASE_URL="https://your-vllm-server"
Vérifiez la documentation d'authentification de votre passerelle pour confirmer quel en-tête elle attend.
Cause première 3 : Fichier settings.json mal formé
Si vous définissez l'URL de base et les identifiants dans ~/.claude/settings.json plutôt que dans des variables d'environnement, les erreurs de formatage JSON entraînent l'échec de la configuration d'entreprise avant même qu'une requête ne soit effectuée.
Les erreurs les plus courantes :
Virgule de fin (JSON invalide) :
{
"env": {
"ANTHROPIC_BASE_URL": "https://openrouter.ai/api",
"ANTHROPIC_AUTH_TOKEN": "sk-or-your-key", ← virgule de fin
}
}
Guillemets courbes/intelligents (copier-coller depuis la documentation ou Word) :
{
"env": {
"ANTHROPIC_BASE_URL": "https://openrouter.ai/api" ← mauvais guillemets
}
}
Format correct :
{
"env": {
"ANTHROPIC_BASE_URL": "https://openrouter.ai/api",
"ANTHROPIC_AUTH_TOKEN": "sk-or-your-openrouter-key"
}
}
Validez votre fichier de paramètres avant de lancer Claude Code :
python3 -c "import json; json.load(open('~/.claude/settings.json'.replace('~', __import__('os').path.expanduser('~'))))" && echo "Valid JSON"
Ou utilisez jq :
jq . ~/.claude/settings.json
Une erreur d'analyse ici signifie que la validation de la configuration d'entreprise ne se termine jamais — Claude Code ne peut pas lire la configuration, il signale donc le tout comme invalide.
Cause première 4 : L'installation fraîche n'a pas terminé l'onboarding
Claude Code vérifie ~/.claude.json pour hasCompletedOnboarding: true avant de lire la configuration d'entreprise depuis settings.json. Lors d'une nouvelle installation, ce drapeau n'est pas défini, donc Claude Code ignore votre configuration tierce personnalisée et essaie de s'authentifier via son flux standard — ce qui échoue si vous n'avez pas d'abonnement Anthropic configuré.
Vérifiez votre état actuel :
cat ~/.claude.json | python3 -m json.tool 2>/dev/null | grep hasCompletedOnboarding
Si cette clé est manquante ou fausse, Claude Code est en mode d'onboarding et votre configuration d'entreprise settings.json ne sera pas lue.
Correction : Ajoutez le drapeau d'onboarding à ~/.claude.json :
{
"hasCompletedOnboarding": true,
"primaryApiKey": "sk-placeholder"
}
La valeur primaryApiKey est un espace réservé — elle est écrasée par votre configuration d'entreprise. Définissez-la sur n'importe quoi commençant par sk- pour passer la vérification de format. Après avoir enregistré, redémarrez Claude Code.
Cause première 5 : La passerelle ne transmet pas les en-têtes requis
La validation de la configuration d'entreprise de Claude Code inclut un échange de fonctionnalités — elle envoie un en-tête anthropic-beta à la passerelle pour négocier les capacités disponibles. Si votre passerelle supprime cet en-tête, Claude Code reçoit une réponse qui ne correspond pas à ce qu'il attend, et signale Invalid custom3p enterprise config.
En-têtes requis que votre passerelle doit transmettre :
anthropic-beta
anthropic-version
X-Claude-Code-Session-Id
Pour LiteLLM, cela fonctionne par défaut depuis la v1.82.9+. Pour les proxys personnalisés ou les configurations nginx, ajoutez explicitement la transmission des en-têtes :
location /v1/ {
proxy_pass http://backend;
proxy_set_header anthropic-beta $http_anthropic_beta;
proxy_set_header anthropic-version $http_anthropic_version;
proxy_set_header X-Claude-Code-Session-Id $http_x_claude_code_session_id;
}
Si vous ne pouvez pas modifier la passerelle pour transmettre l'en-tête bêta, définissez ceci avant de lancer :
export CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1
Cela indique à Claude Code d'ignorer les fonctionnalités qui nécessitent l'en-tête bêta afin que les requêtes réussissent via les passerelles qui ne peuvent pas le transmettre. Vous perdez l'accès à certaines fonctionnalités expérimentales, mais la boucle d'agent principale fonctionne.
Cause première 6 : Conflit de politique d'entreprise
Si vous utilisez un plan Claude Team ou Enterprise et que votre administrateur a déployé des paramètres gérés, ces paramètres ont la priorité sur tout le reste — y compris votre ~/.claude/settings.json et les variables d'environnement. Une politique gérée qui restreint availableModels ou bloque les URL de base personnalisées entraîne Invalid custom3p enterprise config même lorsque votre configuration locale est correcte.
Vérifiez si les paramètres gérés sont actifs :
ls ~/.claude/managed-settings.json 2>/dev/null && echo "Managed settings found"
Ou depuis l'intérieur de Claude Code :
/status
Si « Managed settings » (Paramètres gérés) s'affiche comme actif, vous devez en parler à votre administrateur. Ils peuvent soit :
- Ajouter le domaine de votre passerelle aux URL de base autorisées
- Créer une liste
availableModelsqui inclut les identifiants de modèle de la passerelle - Vous exempter de la restriction d'URL de base personnalisée
Pour les déploiements d'entreprise que vous contrôlez, les paramètres gérés se trouvent dans /Library/Application Support/ClaudeCode/managed-settings.json (macOS) ou le chemin équivalent sous Windows/Linux.
Configurations complètes et fonctionnelles
Claude Code + OpenRouter (DeepSeek V4 Pro)
OpenRouter expose une API compatible Anthropic. Cette configuration exécute la boucle d'agent complète de Claude Code via DeepSeek V4 Pro :
Dans ~/.claude/settings.json :
{
"env": {
"ANTHROPIC_BASE_URL": "https://openrouter.ai/api",
"ANTHROPIC_AUTH_TOKEN": "sk-or-your-openrouter-key",
"ANTHROPIC_DEFAULT_SONNET_MODEL": "deepseek/deepseek-v4-pro",
"ANTHROPIC_DEFAULT_OPUS_MODEL": "deepseek/deepseek-v4-pro",
"ANTHROPIC_DEFAULT_HAIKU_MODEL": "deepseek/deepseek-v4-pro"
}
}
La surcharge du nom du modèle est requise car Claude Code utilise par défaut claude-sonnet-4-6 même lorsque vous avez changé l'URL de base. Sans épingler le modèle, la requête atteint OpenRouter en demandant claude-sonnet-4-6, ce qui peut réussir (OpenRouter prend également en charge Claude) ou peut acheminer incorrectement selon votre plan.
Remarque : OpenRouter n'implémente pas entièrement la spécification de streaming d'Anthropic pour les appels d'outils — les arguments d'appel de fonction peuvent arriver vides dans certains cas limites. La boucle d'agent principale fonctionne, mais les chaînes multi-outils complexes peuvent se casser. Suivez le statut de compatibilité d'OpenRouter pour les mises à jour.
Claude Code + LiteLLM (tout fournisseur)
LiteLLM est la passerelle la plus compatible pour Claude Code — elle gère correctement la transmission des en-têtes et prend en charge le routage des modèles via OpenAI, Anthropic, Vertex, Bedrock et Hugging Face.
config.yaml LiteLLM :
model_list:
- model_name: claude-sonnet-4-6
litellm_params:
model: deepseek/deepseek-v4
api_key: "sk-your-deepseek-key"
- model_name: claude-opus-4-7
litellm_params:
model: deepseek/deepseek-v4-pro
api_key: "sk-your-deepseek-key"
Claude Code ~/.claude/settings.json :
{
"env": {
"ANTHROPIC_BASE_URL": "http://localhost:4000",
"ANTHROPIC_AUTH_TOKEN": "sk-litellm-your-key"
}
}
Avec cette configuration, Claude Code envoie claude-sonnet-4-6 dans le champ du modèle. LiteLLM intercepte cela et le redirige vers DeepSeek V4, vous n'avez donc pas besoin de surcharger les noms de modèles dans la configuration de Claude Code.
Claude Code + vLLM local
Pour l'inférence de modèle locale avec vLLM, démarrez le serveur en mode compatible Anthropic :
python -m vllm.entrypoints.openai.api_server \
--model deepseek-ai/DeepSeek-V3 \
--dtype auto \
--api-key local-key \
--port 8000
Ensuite, configurez Claude Code :
export ANTHROPIC_BASE_URL="http://localhost:8000"
export ANTHROPIC_API_KEY="local-key"
export ANTHROPIC_DEFAULT_SONNET_MODEL="deepseek-ai/DeepSeek-V3"
Débogage de l'erreur
Si aucune des solutions ci-dessus ne fonctionne, exécutez Claude Code avec la journalisation de débogage :
claude --debug 2>&1 | head -100
La sortie de débogage affiche l'URL exacte appelée, les en-têtes envoyés et la réponse reçue. Recherchez :
Sending request to:— confirme l'URL de baseResponse status:— le statut HTTP de votre passerelleenterprise config error:— le message de validation interne
Pour le débogage côté passerelle, testez la requête exacte que Claude Code envoie :
curl -v -X POST "${ANTHROPIC_BASE_URL}/v1/messages" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${ANTHROPIC_AUTH_TOKEN}" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: max-tokens-3-5-sonnet-2024-07-15" \
-d '{
"model": "claude-sonnet-4-6",
"max_tokens": 10,
"messages": [{"role": "user", "content": "hi"}]
}'
Une passerelle valide renvoie un 200 avec la structure du message. Si vous obtenez 401, 403 ou 422, il s'agit d'un problème d'authentification ou de format côté passerelle — et non d'un problème de configuration de Claude Code.
Test des API avec Apidog
Lorsque vous déboguez des intégrations de fournisseurs tiers, Apidog facilite l'inspection des requêtes et réponses exactes passant par votre passerelle LLM. Vous pouvez créer une collection pour le point de terminaison /v1/messages de votre passerelle, enregistrer des modèles de requêtes fonctionnels et comparer les réponses entre les fournisseurs sans relancer Claude Code à chaque fois.
Téléchargez Apidog et créez une nouvelle collection pointant vers l'URL de votre passerelle. Ajoutez les en-têtes anthropic-version, anthropic-beta et Authorization comme variables au niveau de la collection — de cette façon, vous pouvez tester différentes configurations de passerelle en modifiant une seule variable au lieu d'éditer chaque requête.

Ceci est particulièrement utile lors du débogage des problèmes de transmission d'en-têtes qui déclenchent Invalid custom3p enterprise config. Vous pouvez confirmer quels en-têtes votre passerelle transmet avant de perdre du temps à chercher des bogues dans la configuration de Claude Code.
Configurations Claude Code connexes à connaître
Désactiver la dépendance de l'en-tête bêta
Certaines passerelles d'entreprise ne peuvent pas transmettre d'en-têtes personnalisés. Si c'est votre cas :
export CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1
Cela supprime l'échange de fonctionnalités bêta de la validation de la configuration d'entreprise. La boucle d'agent fonctionne toujours ; vous perdez l'accès aux fonctionnalités liées à l'en-tête bêta (certaines variantes de pensée étendue, certains formats d'appel d'outils).
Sélecteur de modèle avec découverte de passerelle
À partir de Claude Code v2.1.129, vous pouvez peupler automatiquement le sélecteur /model à partir de la liste de modèles de votre passerelle :
export CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY=1
Claude Code interroge le point de terminaison /v1/models de votre passerelle au démarrage et ajoute les modèles découverts au sélecteur. Seuls les modèles dont les identifiants commencent par claude ou anthropic sont ajoutés — pour d'autres modèles comme DeepSeek, épinglez-les manuellement avec ANTHROPIC_DEFAULT_SONNET_MODEL.
Entrée personnalisée du sélecteur de modèle
Ajoutez un seul modèle personnalisé au sélecteur sans affecter les autres paramètres :
export ANTHROPIC_CUSTOM_MODEL_OPTION="deepseek/deepseek-v4-pro"
export ANTHROPIC_CUSTOM_MODEL_OPTION_NAME="DeepSeek V4 Pro"
export ANTHROPIC_CUSTOM_MODEL_OPTION_DESCRIPTION="17x moins cher que Claude Opus"
Cela apparaît en bas du sélecteur /model, ce qui facilite le basculement entre votre modèle de passerelle et le modèle Claude par défaut en cours de session.
Guides connexes
Si vous explorez les capacités d'agent de Claude Code avec des backends de modèle personnalisés, ces articles couvrent des sujets connexes :
- Comment rédiger des fichiers AGENTS.md pour les équipes de développement API — configurer le comportement de Claude Code pour votre pile spécifique
- Ruflo : Orchestration Multi-Agent pour Claude Code — ajouter des essaims, une mémoire persistante et plus de 100 outils MCP à Claude Code
- Obtenez une API Claude illimitée gratuite via Puter.js — alternative basée sur le navigateur si vous développez des applications clientes
- Meilleurs LLM locaux 2026 — si vous préférez exécuter l'inférence localement via vLLM
FAQ
L'utilisation d'un fournisseur tiers avec Claude Code est-elle contraire aux conditions d'Anthropic ?
Non. Anthropic documente et prend officiellement en charge le modèle ANTHROPIC_BASE_URL pour l'acheminement via Bedrock, Vertex AI, Foundry et les passerelles personnalisées. Ce qu'Anthropic a bloqué en avril 2026, c'était les outils tiers *usurpant* l'identifiant client de Claude Code pour accéder à la propre API d'Anthropic aux tarifs d'abonnement. Utiliser votre propre passerelle ou un fournisseur comme OpenRouter avec votre propre clé API est une chose complètement différente.
La boucle d'agent de Claude Code fonctionne-t-elle avec DeepSeek V4 Pro ?
La boucle principale fonctionne — édition de fichiers, commandes shell, tâches multi-étapes. Deux choses ne fonctionnent pas via les fournisseurs tiers : les outils serveur MCP et l'entrée image/vision. Si votre flux de travail nécessite ces éléments, vous devez rester sur l'API Anthropic ou Bedrock/Vertex.
Pourquoi l'erreur indique-t-elle « enterprise config » alors que je n'ai pas de plan d'entreprise ?
Claude Code utilise l'étiquette « enterprise config » (configuration d'entreprise) pour toute configuration de fournisseur tiers, quel que soit votre niveau d'abonnement. C'est une étiquette de niveau code, pas une restriction de plan. Les développeurs individuels sur le niveau gratuit ou Pro peuvent configurer et utiliser des fournisseurs tiers personnalisés.
Puis-je basculer entre Anthropic et un fournisseur tiers en cours de session ?
Pas au sein d'une seule session. L'URL de base est lue au démarrage. Pour changer de fournisseur, quittez Claude Code, modifiez vos variables d'environnement ou vos paramètres, et démarrez une nouvelle session. L'outil DeepClaude enveloppe cela dans un drapeau CLI (--backend ds, --backend anthropic) qui gère le changement d'environnement pour vous.
Ma passerelle est derrière un pare-feu d'entreprise. Claude Code prend-il en charge la configuration de proxy ?
Oui. Définissez HTTPS_PROXY avant de lancer :
export HTTPS_PROXY="http://your-proxy:8080"
export ANTHROPIC_BASE_URL="https://your-internal-gateway"
Pour l'interception TLS par un proxy d'entreprise, ajoutez votre certificat CA :
export NODE_EXTRA_CA_CERTS="/path/to/corporate-ca-bundle.pem"
L'erreur apparaît même si mon test curl fonctionne. Quelle est la différence ?
Claude Code effectue une requête de validation préalable supplémentaire que curl ne reproduit pas. Exécutez Claude Code avec --debug pour voir la requête préalable exacte et la comparer à votre test curl. Différences courantes : l'en-tête anthropic-beta, l'en-tête X-Claude-Code-Session-Id et le format exact du corps JSON pour la requête de validation.
Conclusion
Invalid custom3p enterprise config est une erreur de validation de configuration, pas un blocage de politique. Corrigez d'abord le format de ANTHROPIC_BASE_URL (supprimez le /v1), puis vérifiez votre variable d'identification (ANTHROPIC_AUTH_TOKEN vs ANTHROPIC_API_KEY), validez votre settings.json pour les erreurs JSON, et assurez-vous que l'onboarding est terminé sur les nouvelles installations.
Une fois la configuration validée, la boucle d'agent complète de Claude Code s'exécute via votre backend choisi. DeepSeek V4 Pro via OpenRouter ou LiteLLM couvre la majorité des cas d'utilisation de Claude Code à une fraction des coûts de l'API Anthropic — les principales limitations sont les outils MCP et l'entrée visuelle, qui nécessitent l'API Anthropic.
