Avec LangChain, la première étape n'est souvent pas d'écrire une chaîne, mais d'apparier correctement les clés. Un même code fonctionne en local puis renvoie 401 après déploiement ; une clé collée dans un notebook n'est jamais nettoyée. Le problème vient rarement du framework : il tient à la source de la clé, à l'ordre de chargement et aux frontières de permission.
Cet article suit l'ordre source, configuration, isolation, rotation et dépannage pour clarifier la gestion des clés API dans un projet LangChain. Les modèles, quotas et prix exacts figurent sur la page Tarifs des modèles et dans la documentation du fournisseur utilisé.
Remarque : LangChain est une marque de LangChain, Inc. Cet article est une présentation technique et n'implique aucune affiliation ni partenariat avec LangChain, Inc. ; le comportement des paquets d'intégration peut changer selon les versions, référez-vous à la documentation correspondante.
1. Distinguer : LangChain ne délivre pas de clés de modèle
LangChain est un framework open source de développement d'applications : il relie modèles, outils, recherche et orchestration. Il ne fournit généralement pas de quota d'appels de modèles ; il n'existe donc pas de « clé de modèle LangChain ». Les identifiants saisis dans LangChain appartiennent en réalité au fournisseur de modèles, à la plateforme cloud ou à la passerelle AI.
Un projet comporte au moins trois types d'identifiants, aux usages totalement différents :
| Identifiant | Usage | Où l'obtenir |
|---|---|---|
| Clé API de modèle | Appeler les modèles de chat, de raisonnement, d'Embedding, etc. | Console du fournisseur ou de la passerelle AI |
LANGCHAIN_API_KEY |
Traçage et évaluation LangSmith | LangSmith, uniquement si l'observabilité est activée |
| Identifiant cloud | Accéder aux modèles hébergés ou aux ressources cloud | Console d'accès du fournisseur cloud |
Mélanger ces trois types en une seule clé élargit excessivement les permissions et complique la rotation. Séparez-les par usage avant de configurer.
2. Variables d'environnement : conventions par défaut et passage explicite
ChatOpenAI de langchain-openai lit par défaut OPENAI_API_KEY ; une interface compatible OpenAI se précise via le paramètre base_url. Configuration minimale :
import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
# Lecture depuis un .env proche du projet ; en production, preferez les variables systeme ou un coffre de secrets
load_dotenv()
llm = ChatOpenAI(
model=os.environ["ZSQH_MODEL"], # ID de modele, voir la page de prix
api_key=os.environ["ZSQH_API_KEY"], # ou la variable par defaut OPENAI_API_KEY
base_url="https://ai.zhongshangqihang.com/v1",
temperature=0,
)
print(llm.invoke("Explique en une phrase ce qu'est une passerelle API").content)
Quelques détails souvent négligés :
- Les variables sont lues à la création du client, pas à l'import du module. Dans un notebook, après avoir modifié
os.environ, il faut recréer l'instanceChatOpenAI. - Passer explicitement une chaîne vide écrase la variable d'environnement. En cas de 401, cherchez d'abord un residu du type
api_key=""dans le code. - Les paquets d'intégration lisent des noms de variables différents ; Anthropic et Google ont leurs conventions, à vérifier dans leur documentation.
init_chat_modelcrée des modèles de fournisseurs variés, mais les paramètres supplémentaires et variables par défaut restent définis par l'intégration sous-jacente : testez après chaque mise à jour.
3. .env et SecretStr : deux protections en développement local
Le fichier .env est pratique en local, à condition de respecter deux règles.
Premièrement, .env n'entre jamais dans le dépôt. Ajoutez-le à .gitignore dès l'initialisation et versionnez un .env.example sans valeurs réelles pour indiquer les variables nécessaires. S'il a déjà été commité, supprimer le fichier n'efface pas l'historique : révoquez immédiatement la clé avant de nettoyer le dépôt.
Deuxièmement, comprenez SecretStr de LangChain. Les champs de clé de ChatOpenAI sont généralement stockés en SecretStr, et l'affichage de l'objet ou l'écriture de journaux montre un masque, pas le texte en clair. Cela bloque une partie des fuites accidentelles, mais pas un appel volontaire à get_secret_value(), une concaténation manuelle d'en-tête ou l'impression de la requête complète dans une exception. Ne concluez pas que « le framework masque tout » permet de journaliser n'importe quoi.
En conteneur, ne placez pas la clé dans l'image : les arguments de construction et les couches peuvent être conservés. Injectez-la à l'exécution via des variables d'environnement ou un service de gestion de secrets.
4. Plusieurs fournisseurs, plusieurs modèles : une clé ou plusieurs ?
La réponse dépend de l'unicité du point d'entrée. Avec une passerelle AI, une seule clé permet souvent d'appeler plusieurs modèles, distingués par le paramètre model ; en connexion directe à plusieurs fournisseurs, il faut généralement une clé par fournisseur.
Donnez aux variables des noms lisibles et fixez-les dans l'équipe :
- Passerelle :
ZSQH_API_KEY,ZSQH_BASE_URL. - Fournisseurs : respectez les noms prévus par les paquets, comme
ANTHROPIC_API_KEYouGOOGLE_API_KEY. - Suffixe d'environnement :
_DEV,_STAGING,_PROD, pour éviter qu'une clé de test n'arrive en production.
Le multi-modèles inclut aussi le fallback et le routage. LangChain permet de basculer vers un modèle de secours avec .with_fallbacks(), mais chaque modèle de secours doit avoir sa propre authentification. Ne supposez pas qu'« une clé appelle tous les modèles » : la passerelle peut appliquer une liste blanche, et une clé fournisseur peut n'être ouverte qu'à certains modèles. Les identifiants disponibles figurent sur la page Tarifs des modèles.
5. Moindre privilège : séparer les clés par environnement et usage
L'objectif n'est pas « le moins de clés possible », mais « les frontières les plus claires possible ». En pratique :
- Une clé distincte pour le développement, la préproduction et la production ; la clé de production ne réside pas sur la machine d'un développeur.
- Une clé par application et par membre, sans partage entre personnes.
- Un budget plus bas et un périmètre de modèles réduit pour les clés de test.
- Activez toutes les options disponibles : liste blanche IP, alertes de quota, liste blanche de modèles.
- Ne conservez que les derniers caractères de la clé dans les journaux, tickets et captures.
Si la passerelle fournit des statistiques par clé, celle-ci sert à la fois à la comptabilité et au diagnostic ; une « clé universelle » partagée rend toute anomalie de facture impossible à imputer.
6. Rotation et révocation : créer, basculer, puis révoquer
Faites tourner les clés au moins tous les 90 jours, et immédiatement en cas de départ, de perte d'appareil, d'erreur de configuration ou de fuite suspectée. L'ordre ne s'inverse pas :
- Créez une nouvelle clé dans la console, avec une date ou une version dans le nom, par exemple
prod-app-202610. - Écrivez la nouvelle clé dans le service de secrets ou les variables de la plateforme de déploiement.
- Redémarrez ou redéployez l'application et vérifiez que le nouveau processus a chargé la valeur.
- Envoyez une vraie requête pour confirmer la réponse du modèle et l'imputation de l'usage sur la nouvelle clé.
- Observez un moment pour vérifier qu'aucune ancienne instance n'appelle encore.
- Après confirmation, révoquez l'ancienne clé et mettez à jour le registre interne.
Quand la clé est lue depuis l'environnement, la rotation ne demande généralement pas de changer le code, mais impose un redémarrage ou un déploiement progressif. Les connexions longues ou processus permanents peuvent conserver l'ancienne clé : vérifiez que toutes les instances ont été remplacées avant révocation.
7. CI et travail en équipe : empêcher les clés d'entrer dans les journaux
L'environnement CI combine exécution automatique et conservation des journaux : c'est un point de fuite fréquent. Quelques règles :
- Placez les clés dans les secrets chiffrés de la plateforme CI, jamais en clair dans le fichier de pipeline.
- Désactivez les options de débogage qui réaffichent les commandes, pour éviter que
set -ximprime les en-têtes. - Créez une clé dédiée à la CI, avec un quota bas et un périmètre de modèles limité.
- Utilisez un outil de détection de secrets avant commit et bloquez tout suspect.
- En revue de code, traitez
.env, fichiers de configuration et instantanés de test comme des fichiers sensibles.
La documentation de passation doit préciser le responsable de chaque clé, son usage, sa date de création, la prochaine rotation et la procédure de révocation en cas de départ ou de perte d'appareil.
8. Dépannage : vérifier la variable avant le protocole
En cas d'erreur d'authentification, suivez cet ordre plutôt que de recréer les clés :
- Confirmer que la variable atteint le processus : affichez seulement sa présence, jamais sa valeur. Redémarrez le noyau du notebook et vérifiez l'injection dans le bon service du conteneur.
- Chercher un écrasement explicite : le code ou la configuration passe-t-il un
api_keyvide ou unbase_urlerroné ? - Vérifier le chemin du protocole : une interface compatible OpenAI se termine généralement par
/v1; un segment manquant ou en trop provoque souvent une 404. - Vérifier l'ID de modèle : le nom affiché n'est pas l'identifiant API ; comparez caractère par caractère avec la page de prix.
- Répartir selon le code : 401 pour la clé, 403 pour les permissions et le périmètre de modèles, 429 pour la concurrence et le quota, 5xx pour une relance avec conservation de l'heure de requête.
- Contrôler réseau et proxy : variables de proxy et certificats d'entreprise peuvent faire échouer la requête avec un message qui ressemble à un problème d'authentification.
Ne changez qu'une variable à la fois. Tester d'abord une autre clé, puis un autre modèle, permet de distinguer rapidement « cette clé ne fonctionne pas » de « ce modèle est indisponible ».
FAQ
LangChain a-t-il besoin d'une clé API ?
Le framework lui-même non. Il faut des identifiants uniquement pour appeler un modèle distant, un service d'Embedding ou le service d'observabilité LangSmith.
Une variable d'environnement est définie, pourquoi la réponse est-elle encore 401 ?
Quatre causes fréquentes : la variable n'est valable que dans le terminal courant, le noyau du notebook n'a pas redémarré, le code passe explicitement une clé vide, ou la clé contient des espaces ou retours à la ligne. Vérifiez d'abord la présence dans le processus, puis un éventuel écrasement par le code.
Une seule clé peut-elle appeler plusieurs modèles ?
Cela dépend du service auquel appartient la clé. Une passerelle unifiée permet souvent à une clé d'appeler plusieurs modèles de son catalogue ; en direct, chaque fournisseur a sa clé. Même avec le multi-modèles, une liste blanche peut s'appliquer : référez-vous aux permissions de la console.
Les clés apparaissent-elles dans les traces LangSmith ?
Les traces conservent surtout entrées, sorties et chaîne d'appels ; la présence des en-têtes dépend de l'intégration et du masquage. Ne considérez pas la plateforme de traçage comme un coffre à clés : callbacks personnalisés, journaux d'exception et proxys de débogage fuient plus facilement les en-têtes ; vérifiez le masquage avant activation.
Faut-il modifier le code après une rotation de clé ?
Si le code lit la clé depuis l'environnement ou un service de secrets, aucun changement n'est nécessaire : mettez à jour la valeur et redémarrez ou redéployez. Si la clé est codée en dur dans le code, un notebook ou une image, passez d'abord à une injection externe, puis effectuez la rotation.
Pour aller plus loin
La gestion des clés LangChain se résume en quatre phrases : la clé appartient au fournisseur de modèles, pas au framework ; .env en local, service de secrets en production ; séparez les clés par environnement et usage ; lors d'une rotation, créez d'abord la nouvelle, révoquez ensuite l'ancienne. Pour un point d'entrée multi-modèles unifié et une gestion de l'usage et des quotas par clé, vous pouvez créer un compte sur la passerelle AI de ZSQH ; les modèles et les prix sont sur la page Tarifs des modèles.
Lectures associées :
