Sorties structurées : le pattern d'or
Exiger du JSON strict et le parser : la technique qui transforme Claude en brique logicielle fiable.
🧠 Concept — Du texte libre au JSON strict
Un humain lit du texte libre. Un programme a besoin de champs prévisibles. Le pattern d'or de l'API :
- Dans le prompt, tu exiges un format JSON strict : « Réponds UNIQUEMENT en JSON : {"categorie": ..., "urgence": 1-5, "resume": ...} — aucun texte avant ou après. »
- Tu parses la réponse avec
json.loads(). - Ton code exploite les champs : router le ticket, remplir la base, alerter Slack.
C'est CE pattern qui débloque les cas d'usage Electra en production :
- Classification automatique des tickets Intercom : catégorie, urgence, résumé → routage vers la bonne équipe ;
- Extraction de champs depuis les courriers mairie scannés : commune, objet, date limite de réponse, référence parcelle → directement dans le suivi foncier ;
- Génération de descriptions de stations pour le site : nombre de bornes, puissance, services à proximité → JSON prêt pour le CMS.
classifieur_tickets.py — un classifieur Intercom complet
import anthropic
import json
client = anthropic.Anthropic() # clé lue depuis l'environnement
SYSTEM = """Tu es le classifieur de tickets support d'Electra
(recharge rapide de véhicules électriques).
Réponds UNIQUEMENT avec un objet JSON valide, sans texte
avant ou après, au format exact :
{"categorie": "panne_borne" | "facturation" | "roaming" | "application" | "autre",
"urgence": 1-5,
"resume": "une phrase",
"station": "nom de la station si mentionnée, sinon null"}"""
def classifier_ticket(texte: str) -> dict:
response = client.messages.create(
model="claude-haiku-4-5", # volume élevé -> modèle rapide/éco
max_tokens=300,
system=SYSTEM,
messages=[{"role": "user", "content": texte}],
)
brut = response.content[0].text
try:
return json.loads(brut)
except json.JSONDecodeError:
# Filet de sécurité : on n'insère JAMAIS du JSON invalide en base
return {"categorie": "autre", "urgence": 3,
"resume": "PARSE_ERROR", "station": None}
ticket = ("Bonjour, je suis à la station de Nice Lingostière, "
"la borne 5 s'arrête au bout de 2 minutes et j'ai été "
"débité de 12 EUR. Je dois repartir dans 20 minutes !")
resultat = classifier_ticket(ticket)
print(resultat["categorie"], "- urgence", resultat["urgence"])
print(resultat["resume"])⚠️ Piège classique — Ne fais jamais confiance au JSON les yeux fermés
Même avec la consigne « UNIQUEMENT du JSON », un modèle peut occasionnellement dévier : texte parasite, champ manquant, urgence à 7 sur une échelle de 5. Trois réflexes de prod :
- try/except autour du parsing (comme dans le script) : un ticket mal classé vaut mieux qu'un pipeline planté à 3 h du matin ;
- valider les valeurs : la catégorie est-elle dans la liste autorisée ? L'urgence entre 1 et 5 ?
- pour du critique, regarde le tool use côté docs.claude.com : définir la sortie comme un schéma d'outil contraint encore mieux le format que la consigne en prompt.
🎯 Le pattern est-il en place ?
0/2 répondue · 0 juste1.Pourquoi exiger « UNIQUEMENT du JSON, sans texte avant ou après » ?
2.Le classifieur reçoit un jour une réponse non parsable. Grâce au try/except, il…
🛠️ À toi de jouer — 🛠️ Adapte le classifieur à TON métier
Le classifieur de tickets n'est qu'un gabarit. Prends le prompt ci-dessous et transforme-le en outil pour TES documents : courriers mairie si tu es au foncier, comptes-rendus de visite si tu es au déploiement, demandes de raccordement si tu es à l'énergie…
Voici un classifieur de tickets Electra en Python [colle classifieur_tickets.py]. Adapte-le à mon métier : je traite des [décris tes documents : courriers de mairies, comptes-rendus de visite technique, demandes de raccordement Enedis...]. 1) Propose-moi un schéma JSON avec 4 à 6 champs vraiment utiles pour ce type de document (justifie chaque champ). 2) Réécris le SYSTEM prompt en conséquence. 3) Génère 3 documents fictifs réalistes et exécute le classifieur dessus. 4) Montre-moi les JSON produits et signale toute valeur douteuse.
Checklist de validation