On utilise Claude API Python avec le SDK Anthropic, une clé API en variable d’environnement, puis client.messages.create(). Le vrai sujet, c’est de comprendre la réponse, les tokens, le rôle du prompt système et les bases propres avant de brancher ça dans une vraie app.
De quoi avez-vous besoin ?
Pour intégrer Claude dans une app Python proprement, il ne faut pas grand-chose. Mais il faut le bon socle dès le départ, sinon on perd vite du temps sur des détails bêtes, surtout la gestion de la clé API.
J’utilise en général cette base :
- Python 3.9 ou plus, parce que le SDK officiel Anthropic tourne dessus proprement.
- Un compte Claude Console, pour créer votre accès API côté Anthropic.
- Une clé API Anthropic, c’est le jeton qui autorise votre code à appeler Claude.
- Le SDK Python officiel, pour éviter de bricoler les appels HTTP à la main.
L’installation se fait simplement avec :
pip install anthropic
Le point important, vraiment, c’est la clé API. Je ne la colle jamais directement dans le code. Pas dans un script. Pas dans un notebook. Pas “juste pour tester”. Le jour où le projet finit sur GitHub, dans un dépôt partagé, ou chez un client, ça devient une mauvaise habitude qui coûte cher.
La logique propre, c’est de mettre la clé dans une variable d’environnement nommée ANTHROPIC_API_KEY. Le SDK Anthropic sait la récupérer automatiquement, donc votre code reste simple et portable.
from anthropic import Anthropic
# Le SDK lit automatiquement la variable d'environnement ANTHROPIC_API_KEY
client = Anthropic()
message = client.messages.create(
model="claude-3-5-sonnet-latest",
max_tokens=300,
messages=[
{"role": "user", "content": "Explique-moi Claude API en une phrase."}
]
)
print(message.content[0].text)
En local, si vous ne voulez pas configurer la variable à la main dans votre terminal, vous pouvez utiliser python-dotenv avec un fichier .env. Ça charge les variables au démarrage du script. Ça reste pratique, tant que le fichier .env n’est pas versionné dans Git.
J’ai déjà vu des équipes perdre une demi-journée parce qu’une clé était collée dans trois scripts différents, avec deux anciennes versions et une bonne. La variable d’environnement règle ce problème dès le départ.
| Prérequis | Rôle |
| Python 3.9+ | Exécuter votre application avec une version compatible. |
| Compte Claude Console | Créer et gérer votre accès à l’API Anthropic. |
| Clé API Anthropic | Authentifier vos appels vers Claude. |
| SDK anthropic | Appeler Claude depuis Python sans gérer les requêtes HTTP à la main. |
Comment faire le premier appel ?
Le premier appel à Claude en Python passe par client.messages.create(). C’est l’entrée standard de la Messages API. On lui donne un modèle Claude, une limite max_tokens, puis une liste messages. Cette liste commence en général par un message avec le rôle user, c’est-à-dire votre demande.
Les trois paramètres à comprendre tout de suite sont simples, mais importants.
- Le paramètre model doit contenir l’identifiant exact du modèle disponible chez Anthropic. Pas un nom approximatif. Par exemple, un identifiant du type claude-3-5-sonnet-20241022, selon les modèles actifs dans votre compte.
- Le paramètre max_tokens est un plafond dur sur la sortie générée. Si vous mettez 100, Claude ne pourra pas répondre avec 500 tokens. Ce n’est pas une préférence, c’est une limite.
- Le paramètre messages est une liste d’objets. Chaque objet a un role, comme user, et un content, qui contient le texte envoyé au modèle.
import anthropic
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=100,
messages=[
{
"role": "user",
"content": "In one sentence, what is a context window?"
}
]
)
print(response.content[0].text)
Dans cet exemple, je pars du principe que votre clé API Anthropic est déjà disponible dans une variable d’environnement, généralement ANTHROPIC_API_KEY. C’est la façon la plus propre pour éviter de coller une clé en dur dans un fichier Python. J’ai vu trop de clients mettre leurs clés dans GitHub par accident, et franchement, ça arrive vite.
Le détail qui surprend souvent, c’est response.content. Ce n’est pas directement une chaîne de texte, c’est une liste. Pourquoi ? Parce qu’une réponse Claude peut contenir plusieurs blocs de contenu, pas seulement du texte. Par exemple du texte, puis un appel d’outil, puis autre chose selon votre usage.
Dans ce cas simple, Claude renvoie juste un bloc texte. Donc response.content[0].text est la façon idiomatique de récupérer la réponse finale. On prend le premier bloc, puis son champ texte.
L’appel marche. C’est déjà suffisant pour tester Claude depuis un fichier local. Mais pour piloter proprement une vraie app, il ne faut pas lire uniquement le texte final. Il faut aussi regarder les métadonnées, les tokens utilisés, les raisons d’arrêt, et ce que l’API vous renvoie vraiment.
Que contient vraiment la réponse ?
Quand j’appelle Claude avec l’API Python, je ne récupère pas juste un texte. Je récupère un objet Message structuré. Et franchement, en production, c’est ce qui évite pas mal de surprises.
La réponse contient le texte, oui, mais aussi des infos utiles pour savoir quel modèle a répondu, pourquoi il s’est arrêté, et combien de tokens ont été consommés. Un token, c’est un morceau de texte utilisé par le modèle pour compter ce qu’il lit et ce qu’il génère. C’est directement lié au coût et à la limite de contexte.
import anthropic
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=300,
messages=[
{
"role": "user",
"content": "Résume-moi les risques d'un projet IA mal cadré."
}
]
)
# Affiche la réponse complète
print(response)
Dans le quotidien, je regarde rarement tout. Je vais droit sur les champs qui me disent si la réponse est exploitable et combien elle m’a coûté.
print("Stop reason:", response.stop_reason)
print("Input tokens:", response.usage.input_tokens)
print("Output tokens:", response.usage.output_tokens)
print("Texte:", response.content[0].text)
Le champ content contient une liste de blocs. Souvent, vous aurez un TextBlock, donc le texte se trouve dans response.content[0].text. C’est un détail qui piège pas mal de monde au début, parce qu’on s’attend à recevoir une simple chaîne.
| Champ | Rôle | Ce que je regarde en priorité |
| id | Identifiant unique du message. | Utile pour tracer une réponse dans des logs. |
| type | Type d’objet retourné, souvent message. | Je vérifie peu, sauf debug ou parsing strict. |
| role | Rôle de l’émetteur, généralement assistant. | Utile si je reconstruis une conversation. |
| content | Liste de blocs, souvent des TextBlock. | C’est là que je récupère le texte final. |
| model | Modèle Claude utilisé pour générer la réponse. | Important pour comparer coût, qualité et latence. |
| stop_reason | Raison de l’arrêt de la génération. | Je surveille surtout end_turn et max_tokens. |
| stop_sequence | Séquence personnalisée qui a arrêté la réponse, si définie. | Je vérifie si j’utilise des séparateurs ou formats stricts. |
| usage | Consommation en tokens avec input_tokens et output_tokens. | C’est mon indicateur coût, taille de prompt et saturation contexte. |
Le point critique, c’est stop_reason. Si je vois end_turn, tout va bien, Claude a fini normalement. Si je vois max_tokens, je me méfie. Ça peut vouloir dire que la réponse a été coupée parce que la limite était trop basse.
L’autre champ que je garde toujours sous les yeux, c’est usage. Sur un workflow réel, ça me permet de suivre les coûts, de voir si mes prompts grossissent trop, et d’éviter de remplir la fenêtre de contexte, c’est-à-dire la quantité maximale de texte que le modèle peut prendre en compte d’un coup.
À quoi sert le prompt système ?
Le prompt système, c’est le cadre de départ. C’est lui qui dit à Claude comment il doit se comporter, quel rôle il doit prendre, quelles limites respecter, et sous quelle forme il doit répondre.
Avec l’API Anthropic, ce prompt ne va pas dans la liste messages. Il se passe dans un paramètre séparé, au même niveau que model ou max_tokens : le paramètre system.
La différence est simple. Une instruction utilisateur dans messages, c’est la demande du moment. Une instruction système dans system, c’est le cadre qui reste actif pendant l’échange. Elle a une autorité plus persistante. C’est très pratique quand je veux créer un assistant qui garde toujours le même rôle : relecteur, agent interne, support client, outil métier, générateur SQL, contrôleur qualité, peu importe.
Par exemple, si je veux que Claude relise du code Python et réponde uniquement avec le code corrigé, je peux faire ça :
from anthropic import Anthropic
client = Anthropic()
response = client.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=500,
system=(
"Tu es un relecteur de code Python. "
"Corrige le code fourni par l'utilisateur. "
"Réponds uniquement avec le code corrigé, sans explication, "
"sauf si l'utilisateur demande explicitement une explication."
),
messages=[
{
"role": "user",
"content": """
def average(numbers):
total = 0
for n in numbers:
total = total + n
return total / len(numbers)
print(average([]))
"""
}
]
)
print(response.content[0].text)
Ici, le message utilisateur contient le code imparfait. Le prompt système, lui, impose le comportement global : Claude ne doit pas faire une revue détaillée, ne doit pas expliquer son raisonnement, ne doit pas ajouter une intro sympa. Il corrige et il renvoie le code.
Dans la vraie vie, je me méfie des prompts système trop longs ou trop vagues. J’ai vu des prompts de 80 lignes qui disaient tout et son contraire. Résultat : des réponses instables, parfois trop bavardes, parfois inutilisables dans un workflow automatisé.
Je préfère souvent partir avec des consignes courtes, testables, puis itérer. Une règle claire, un exemple, une contrainte de sortie. C’est ce cadrage qui fait la différence en production. Surtout quand la réponse de Claude part directement dans une base, un email, un fichier JSON ou une automatisation Make, n8n ou Zapier.
Comment préparer une intégration propre ?
Une intégration propre avec Claude API Python, ça ne s’arrête pas au premier appel qui répond “hello”. Ça, c’est la démo. Le vrai sujet arrive juste après : comment votre application se comporte quand la réponse est longue, quand l’API ralentit, quand le modèle coupe sa réponse, ou quand un prompt change sans prévenir.
Je vois souvent ça chez des clients : le script marche en local, puis dès qu’on le met dans un outil interne, tout devient fragile. Pas à cause de Claude. À cause de l’intégration autour.
Le streaming est un bon exemple. Au lieu d’attendre que Claude ait terminé toute sa réponse, vous recevez le texte au fil de l’eau. C’est le principe documenté par Anthropic : la réponse arrive progressivement, morceau par morceau. Pour une interface chat, c’est beaucoup plus agréable. Pour un outil interne qui génère des synthèses longues, ça évite aussi cette impression de “ça mouline, est-ce que c’est cassé ?”.
En production, je garde quelques réflexes simples. Rien de magique, juste de l’hygiène.
- Je mets la clé API dans une variable d’environnement, jamais en dur dans le code.
- Je surveille usage, parce que les tokens consommés ont un impact direct sur le coût.
- Je regarde stop_reason, parce qu’une réponse peut être arrêtée par limite de tokens, pas seulement parce qu’elle est terminée.
- Je limite max_tokens, pour éviter les réponses trop longues ou les coûts surprises.
- Je prévois les erreurs réseau et API, avec des retries raisonnables.
- Je versionne mes prompts, comme du vrai code.
- Je n’envoie pas de données sensibles sans cadre clair, surtout si ça touche à des clients, RH, finance ou santé.
| Point à surveiller | Pourquoi c’est important | Réflexe simple |
| Configuration | Une clé API exposée finit toujours par poser problème. | Utiliser des variables d’environnement. |
| Tokens | Les coûts et les coupures viennent souvent de là. | Suivre usage et fixer max_tokens. |
| Fin de réponse | Une réponse arrêtée n’est pas forcément complète. | Contrôler stop_reason. |
| Prompts | Un petit changement peut modifier tout le comportement. | Les séparer du code et les versionner. |
| Données sensibles | La sécurité ne se règle pas avec une option magique. | Définir un cadre clair avant l’envoi. |
Le SDK Python rend le démarrage simple, et c’est très bien comme ça. Mais la vraie valeur vient surtout de la façon dont on structure l’usage autour : prompts propres, logs utiles, limites maîtrisées, erreurs anticipées.
Et maintenant, vous le branchez où ?
Claude API Python est assez simple à prendre en main si on part proprement. J’installe le SDK Anthropic, je garde la clé dans ANTHROPIC_API_KEY, je fais mon premier appel avec client.messages.create(), puis je lis vraiment l’objet de réponse au lieu de récupérer seulement le texte. C’est là qu’on voit les tokens, la raison d’arrêt, le modèle utilisé, et les signaux utiles pour une intégration sérieuse. Le prompt système donne le cadre, le streaming améliore l’expérience quand les réponses sont longues. Le bénéfice pour vous, c’est une intégration Claude plus fiable, plus lisible, et plus facile à maintenir.
FAQ
- Comment installer Claude API en Python ?
J’installe le SDK officiel avec pip install anthropic, puis je configure ma clé API Anthropic dans une variable d’environnement ANTHROPIC_API_KEY. Ensuite, je crée un client Python et j’utilise client.messages.create() pour envoyer une requête au modèle. - Pourquoi ne faut-il pas mettre la clé API dans le code ?
Parce qu’une clé hardcodée finit souvent dans un dépôt Git, un zip envoyé à un collègue ou un script oublié. La bonne base, c’est une variable d’environnement ou un fichier .env local non versionné. C’est plus propre, plus sûr, et plus simple à gérer quand le projet grandit. - À quoi sert max_tokens dans un appel Claude API ?
max_tokens fixe la limite maximale de tokens que Claude peut générer en sortie. Ce n’est pas une suggestion. Si la limite est trop basse, la réponse peut être coupée et stop_reason peut indiquer max_tokens. Je le surveille toujours quand je teste un prompt. - Comment récupérer le texte d’une réponse Claude en Python ?
Dans un cas simple, je récupère le texte avec response.content[0].text. La réponse complète est un objet structuré, et content est une liste de blocs. C’est pour ça qu’il ne faut pas s’étonner de ne pas recevoir une simple chaîne de caractères. - Quelle est la différence entre system et messages ?
system sert à définir le comportement global de Claude, par exemple son rôle, son style ou ses contraintes. messages contient les échanges avec l’utilisateur. Dans l’API Anthropic, le prompt système est un paramètre séparé, ce qui aide à cadrer proprement le modèle.
A propos de l’auteur
Je suis Franck Scandolera, expert et formateur en Tracking avancé server-side, Analytics Engineering, automatisation No/Low Code avec n8n, intégration de l’IA en entreprise et SEO/GEO. J’accompagne des équipes qui veulent brancher l’IA dans leurs vrais process, pas juste faire une démo sympa en réunion. Avec webAnalyste et Formations Analytics, j’ai travaillé pour des clients comme Logis Hôtel, Yelloh Village, BazarChic, la Fédération Française de Football ou Texdecor. Si vous voulez intégrer Claude, automatiser vos workflows ou cadrer vos usages IA côté business, contactez-moi.
⭐ Analytics engineer, Data Analyst et Automatisation IA indépendant ⭐
- Ref clients : Logis Hôtel, Yelloh Village, BazarChic, Fédération Football Français, Texdecor…
Mon terrain de jeu :
- Data Analyst & Analytics engineering : tracking avancé (GTM server, e-commerce, CAPI, RGPD), entrepôt de données (BigQuery, Snowflake, PostgreSQL, ClickHouse), modèles (Airflow, dbt, Dataform), dashboards décisionnels (Looker, Power BI, Metabase, SQL, Python).
- Automatisation IA des taches Data, Marketing, RH, compta etc : conception de workflows intelligents robustes (n8n, App Script, scraping) connectés aux API de vos outils et LLM (OpenAI, Mistral, Claude…).
- Engineering IA pour créer des applications et agent IA sur mesure : intégration de LLM (OpenAI, Mistral…), RAG, assistants métier, génération de documents complexes, APIs, backends Node.js/Python.






