Contrôler la sortie du modèle
Sur cette page
Claude génère du texte librement par défaut. Dans une application, vous voulez pourtant souvent qu’une réponse commence directement par le contenu utile, respecte un format exploitable par votre code, ou s’arrête à un endroit précis. Les outils pour y parvenir ont changé en 2026 : la technique la plus enseignée jusqu’ici, le pré-remplissage de la réponse, n’est plus acceptée par les modèles actuels. Cette leçon présente ce qui fonctionne aujourd’hui, puis l’ancienne technique, que vous croiserez encore dans du code existant.
Ce qui a changé : la fin du pré-remplissage
Le pré-remplissage consistait à envoyer, en dernier message, le début de la réponse de l’assistant — par exemple { pour obtenir du JSON — afin que Claude le complète. Depuis la génération Claude 4.6, Anthropic ne l’accepte plus : une requête dont le dernier message est un message assistant partiel renvoie une erreur 400. Cela concerne tous les modèles actuels, de Claude Haiku 5.5 à Claude Fable 5.1. Les modèles antérieurs encore disponibles, comme Claude Haiku 4.5, le tolèrent toujours, et placer des messages assistant ailleurs dans l’historique reste parfaitement normal.
La raison avancée par Anthropic est simple : les modèles suivent désormais assez bien les consignes pour que la plupart des usages du pré-remplissage soient inutiles. Chacun de ces usages a donc un remplaçant documenté, que voici dans l’ordre où vous en aurez besoin.
Supprimer les préambules : la consigne directe
Le premier réflexe consiste à demander explicitement ce que vous voulez, de préférence dans le prompt système. Une consigne comme « Réponds directement, sans phrase d’introduction du type “Voici…” ou “D’après…” » suffit dans la grande majorité des cas. Si un préambule passe malgré tout de temps en temps, retirez-le côté code plutôt que de compliquer le prompt.
import anthropic
client = anthropic.Anthropic()
SYSTEME = (
"Réponds directement, sans phrase d'introduction ni de conclusion. "
"Ne commence jamais par « Voici » ou « Bien sûr »."
)
response = client.messages.create(
model="claude-sonnet-5-5",
max_tokens=4096,
system=SYSTEME,
messages=[{"role": "user", "content": "Résume en deux phrases le rôle d'une API."}],
)
print(next(b.text for b in response.content if b.type == "text"))
Une variante utile consiste à demander la réponse entre balises XML, par exemple <resume>…</resume> : votre code récupère alors ce qui se trouve entre les balises et ignore le reste.
Imposer un format : les sorties structurées
Quand votre code doit exploiter la réponse, ne comptez plus sur un caractère de départ pour obtenir du JSON. Les sorties structurées imposent un schéma JSON à la réponse : vous décrivez la forme attendue dans output_config.format, et Claude produit un objet conforme. C’est désormais l’outil prévu pour ce besoin.
response = client.messages.create(
model="claude-sonnet-5-5",
max_tokens=4096,
messages=[{
"role": "user",
"content": "Extrais le nom, l'e-mail et l'offre qui intéresse ce prospect : "
"« Julie Martin ([email protected]) souhaite une démo de l'offre Entreprise. »",
}],
output_config={
"format": {
"type": "json_schema",
"schema": {
"type": "object",
"properties": {
"nom": {"type": "string"},
"email": {"type": "string"},
"offre": {"type": "string"},
},
"required": ["nom", "email", "offre"],
"additionalProperties": False,
},
}
},
)
print(next(b.text for b in response.content if b.type == "text")) # un JSON conforme au schéma
Le SDK Python propose aussi client.messages.parse(), qui prend un modèle Pydantic en paramètre output_format, valide la réponse et vous la rend sous forme d’objet. La leçon suivante, consacrée aux données structurées, déroule ces deux approches. Pour une classification, Anthropic recommande la même logique : un schéma dont le champ de sortie n’accepte que vos étiquettes, ou un outil dont un paramètre est une énumération.
Couper la réponse : les séquences d’arrêt
Les séquences d’arrêt n’ont pas changé. Vous fournissez une ou plusieurs chaînes dans stop_sequences ; dès que Claude en génère une, la production s’arrête, et la séquence elle-même n’apparaît pas dans le texte retourné. Le champ stop_reason de la réponse vaut alors stop_sequence, ce qui vous permet de distinguer un arrêt voulu d’une réponse tronquée par max_tokens.
response = client.messages.create(
model="claude-sonnet-5-5",
max_tokens=4096,
stop_sequences=["6"],
messages=[{"role": "user", "content": "Compte de 1 à 10, un nombre par ligne."}],
)
print(next(b.text for b in response.content if b.type == "text")) # "1\n2\n3\n4\n5\n"
print(response.stop_reason) # "stop_sequence"
Une séquence d’arrêt est un couperet : elle tranche même au milieu d’une phrase. Elle sert surtout à borner une sortie quand vous connaissez le marqueur de fin, par exemple une balise fermante que vous avez demandée dans la consigne.
Reprendre une réponse interrompue
Le pré-remplissage servait aussi à faire continuer une réponse coupée. La méthode documentée consiste maintenant à placer la reprise dans le message utilisateur, en citant la fin du texte déjà obtenu : « Ta réponse précédente s’est interrompue sur “…”. Reprends exactement à cet endroit. » Si l’interruption vient d’une erreur et que l’utilisateur n’en souffre pas, relancer simplement la requête est souvent le plus simple.
Si vous maintenez du code ancien
Vous reconnaîtrez le motif suivant dans des projets écrits avant 2026 : la liste des messages se termine par un message assistant partiel. Sur un modèle actuel, il provoque l’erreur 400 évoquée plus haut.
# Ancien motif : refusé par les modèles Claude 4.6 et suivants
messages = [
{"role": "user", "content": "Génère une liste HTML de trois couleurs."},
{"role": "assistant", "content": "<ul>"}, # pré-remplissage
]
Pour migrer, remplacez le pré-remplissage par une consigne (« Réponds uniquement par une liste HTML <ul> ») et, si le format doit être garanti, par une sortie structurée. Conservez éventuellement la séquence d’arrêt </ul> si elle vous évite un post-traitement.
À vous de jouer
Supprimer un préambule. Demandez « Résume en deux phrases le rôle d’une API » sans consigne, puis avec la consigne système de cette leçon. Comptez les mots d’introduction dans chaque cas.
Voir l’erreur du préremplissage. Envoyez l’ancien motif <ul> à Sonnet 5.5 et lisez l’erreur 400 ; remplacez-le par une consigne et la séquence d’arrêt </ul>, et vérifiez stop_reason.
Sources officielles : Structured data (Claude Academy, qui enseigne encore le préremplissage avec Haiku 4.5) · Errors : prefill not supported et Structured outputs (documentation Claude)
Points clés à retenir
- Le pré-remplissage de la réponse renvoie une erreur 400 depuis la génération Claude 4.6 ; il ne survit que sur des modèles plus anciens
- Les préambules se suppriment par une consigne directe, idéalement dans le prompt système
- Le format se garantit avec les sorties structurées (
output_config.format), la classification avec un schéma ou une énumération - Les séquences d’arrêt fonctionnent comme avant et se repèrent grâce à
stop_reason