Aller au contenu principal

response_format manuel

Plus de contrôle avec response_format

La méthode manuelle via response_format vous donne un contrôle total sur le parsing. Contrairement à parse() qui retourne un objet typé, cette approche retourne une chaîne JSON que vous parsez vous-même. C’est la méthode à privilégier quand vous avez besoin de flexibilité ou quand vous travaillez dans un environnement sans Pydantic.

Le flux de travail

Avec response_format, le processus est en deux temps :

  1. L’API retourne le JSON sous forme de string dans response.choices[0].message.content
  2. Vous parsez cette string avec la méthode de votre choix

Exemple complet

from openai import OpenAI
from pydantic import BaseModel

client = OpenAI(
    api_key="votre-cle-xai",
    base_url="https://api.x.ai/v1"
)

class MovieReview(BaseModel):
    title: str
    rating: float
    summary: str
    recommend: bool

response = client.chat.create(
    model="grok-4.20-reasoning",
    messages=[{
        "role": "user",
        "content": "Fais une critique du film Inception"
    }],
    response_format=MovieReview
)

# Le contenu est une string JSON
json_string = response.choices[0].message.content
print(type(json_string))  # <class 'str'>
print(json_string)
# {"title": "Inception", "rating": 9.2, "summary": "...", "recommend": true}

# Parsing manuel avec Pydantic
parsed = MovieReview.model_validate_json(json_string)
print(parsed.title)  # "Inception"

Différences avec parse()

Aspectparse()response_format
Retour(Response, ParsedModel)Response seule
ParsingAutomatiqueManuel
Accès aux donnéesparsed.champjson.loads() ou model_validate_json()
FlexibilitéStandardMaximale
Gestion d’erreurIntégréeÀ votre charge

Parsing sans Pydantic

Vous n’êtes pas obligé d’utiliser Pydantic pour parser le résultat. Le module json standard fonctionne aussi :

import json

response = client.chat.create(
    model="grok-4.20-reasoning",
    messages=[{
        "role": "user",
        "content": "Analyse ce texte et extrais les entités"
    }],
    response_format={
        "type": "json_schema",
        "json_schema": {
            "name": "entities",
            "schema": {
                "type": "object",
                "properties": {
                    "personnes": {
                        "type": "array",
                        "items": { "type": "string" }
                    },
                    "lieux": {
                        "type": "array",
                        "items": { "type": "string" }
                    }
                }
            }
        }
    }
)

data = json.loads(response.choices[0].message.content)
print(data["personnes"])  # ["Marie Curie", "Pierre Curie"]
print(data["lieux"])      # ["Paris", "Varsovie"]

Quand choisir response_format

Préférez response_format quand :

  • Vous avez besoin de traitement intermédiaire du JSON avant le parsing
  • Vous voulez utiliser un schéma JSON brut plutôt qu’un modèle Pydantic
  • Vous travaillez dans un contexte où le parsing automatique ne convient pas
  • Vous voulez logger le JSON brut avant de le transformer
  • Vous utilisez un autre framework de validation que Pydantic

Gestion d’erreur

Avec la méthode manuelle, vous devez gérer les erreurs de parsing vous-même :

import json

try:
    data = json.loads(response.choices[0].message.content)
except json.JSONDecodeError as e:
    print(f"Erreur de parsing : {e}")

En pratique, cette erreur ne devrait jamais se produire puisque l’API garantit un JSON valide. Mais une gestion défensive reste une bonne pratique en production.

Points clés à retenir

  • response_format retourne une string JSON dans response.choices[0].message.content
  • Le parsing est à votre charge : json.loads(), model_validate_json(), ou autre
  • Vous pouvez utiliser un schéma JSON brut au lieu d’un modèle Pydantic
  • Plus de flexibilité que parse(), mais plus de code à écrire
  • Le JSON retourné est garanti valide — les erreurs de parsing ne devraient pas survenir