Vous pouvez configurer Gemini pour obtenir des résultats structurés plutôt que du texte non structuré. Cela vous permet d'extraire et de standardiser précisément les informations pour les traiter ultérieurement. Par exemple, vous pouvez utiliser une sortie structurée pour extraire des informations de CV, les standardiser et créer une base de données structurée.
Gemini peut générer des JSON ou des valeurs enum en tant que sortie structurée.
Générer du code JSON
Pour contraindre le modèle à générer du code JSON, configurez un responseSchema
. Le modèle répondra ensuite à toute requête avec une sortie au format JSON.
Python
from google import genai from pydantic import BaseModel class Recipe(BaseModel): recipe_name: str ingredients: list[str] client = genai.Client() response = client.models.generate_content( model="gemini-2.5-flash", contents="List a few popular cookie recipes, and include the amounts of ingredients.", config={ "response_mime_type": "application/json", "response_schema": list[Recipe], }, ) # Use the response as a JSON string. print(response.text) # Use instantiated objects. my_recipes: list[Recipe] = response.parsed
JavaScript
import { GoogleGenAI, Type } from "@google/genai"; const ai = new GoogleGenAI({}); async function main() { const response = await ai.models.generateContent({ model: "gemini-2.5-flash", contents: "List a few popular cookie recipes, and include the amounts of ingredients.", config: { responseMimeType: "application/json", responseSchema: { type: Type.ARRAY, items: { type: Type.OBJECT, properties: { recipeName: { type: Type.STRING, }, ingredients: { type: Type.ARRAY, items: { type: Type.STRING, }, }, }, propertyOrdering: ["recipeName", "ingredients"], }, }, }, }); console.log(response.text); } main();
Go
package main import ( "context" "fmt" "log" "google.golang.org/genai" ) func main() { ctx := context.Background() client, err := genai.NewClient(ctx, nil) if err != nil { log.Fatal(err) } config := &genai.GenerateContentConfig{ ResponseMIMEType: "application/json", ResponseSchema: &genai.Schema{ Type: genai.TypeArray, Items: &genai.Schema{ Type: genai.TypeObject, Properties: map[string]*genai.Schema{ "recipeName": {Type: genai.TypeString}, "ingredients": { Type: genai.TypeArray, Items: &genai.Schema{Type: genai.TypeString}, }, }, PropertyOrdering: []string{"recipeName", "ingredients"}, }, }, } result, err := client.Models.GenerateContent( ctx, "gemini-2.5-flash", genai.Text("List a few popular cookie recipes, and include the amounts of ingredients."), config, ) if err != nil { log.Fatal(err) } fmt.Println(result.Text()) }
REST
curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent" \ -H "x-goog-api-key: $GEMINI_API_KEY" \ -H 'Content-Type: application/json' \ -d '{ "contents": [{ "parts":[ { "text": "List a few popular cookie recipes, and include the amounts of ingredients." } ] }], "generationConfig": { "responseMimeType": "application/json", "responseSchema": { "type": "ARRAY", "items": { "type": "OBJECT", "properties": { "recipeName": { "type": "STRING" }, "ingredients": { "type": "ARRAY", "items": { "type": "STRING" } } }, "propertyOrdering": ["recipeName", "ingredients"] } } } }' 2> /dev/null | head
Le résultat peut ressembler à ceci :
[ { "recipeName": "Chocolate Chip Cookies", "ingredients": [ "1 cup (2 sticks) unsalted butter, softened", "3/4 cup granulated sugar", "3/4 cup packed brown sugar", "1 teaspoon vanilla extract", "2 large eggs", "2 1/4 cups all-purpose flour", "1 teaspoon baking soda", "1 teaspoon salt", "2 cups chocolate chips" ] }, ... ]
Générer des valeurs enum
Dans certains cas, vous pouvez souhaiter que le modèle choisisse une seule option dans une liste d'options. Pour implémenter ce comportement, vous pouvez transmettre un enum dans votre schéma. Vous pouvez utiliser une option d'énumération partout où vous pouvez utiliser un string
dans responseSchema
, car une énumération est un tableau de chaînes. Comme un schéma JSON, une énumération vous permet de limiter la sortie du modèle pour répondre aux exigences de votre application.
Par exemple, supposons que vous développiez une application pour classer les instruments de musique dans l'une des cinq catégories suivantes : "Percussion"
, "String"
, "Woodwind"
, "Brass"
ou "Keyboard"
. Vous pouvez créer une énumération pour vous aider dans cette tâche.
Dans l'exemple suivant, vous transmettez une énumération en tant que responseSchema
, ce qui contraint le modèle à choisir l'option la plus appropriée.
Python
from google import genai import enum class Instrument(enum.Enum): PERCUSSION = "Percussion" STRING = "String" WOODWIND = "Woodwind" BRASS = "Brass" KEYBOARD = "Keyboard" client = genai.Client() response = client.models.generate_content( model='gemini-2.5-flash', contents='What type of instrument is an oboe?', config={ 'response_mime_type': 'text/x.enum', 'response_schema': Instrument, }, ) print(response.text) # Woodwind
JavaScript
import { GoogleGenAI, Type } from "@google/genai"; const ai = new GoogleGenAI({}); const response = await ai.models.generateContent({ model: "gemini-2.5-flash", contents: "What type of instrument is an oboe?", config: { responseMimeType: "text/x.enum", responseSchema: { type: Type.STRING, enum: ["Percussion", "String", "Woodwind", "Brass", "Keyboard"], }, }, }); console.log(response.text);
REST
curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent" \ -H "x-goog-api-key: $GEMINI_API_KEY" \ -H 'Content-Type: application/json' \ -d '{ "contents": [{ "parts":[ { "text": "What type of instrument is an oboe?" } ] }], "generationConfig": { "responseMimeType": "text/x.enum", "responseSchema": { "type": "STRING", "enum": ["Percussion", "String", "Woodwind", "Brass", "Keyboard"] } } }'
La bibliothèque Python traduira les déclarations de type pour l'API. Toutefois, l'API accepte un sous-ensemble du schéma OpenAPI 3.0 (Schéma).
Il existe deux autres façons de spécifier une énumération. Vous pouvez utiliser un Literal
: ```
Python
Literal["Percussion", "String", "Woodwind", "Brass", "Keyboard"]
Vous pouvez également transmettre le schéma au format JSON :
Python
from google import genai client = genai.Client() response = client.models.generate_content( model='gemini-2.5-flash', contents='What type of instrument is an oboe?', config={ 'response_mime_type': 'text/x.enum', 'response_schema': { "type": "STRING", "enum": ["Percussion", "String", "Woodwind", "Brass", "Keyboard"], }, }, ) print(response.text) # Woodwind
Au-delà des problèmes à choix multiples de base, vous pouvez utiliser une énumération n'importe où dans un schéma JSON. Par exemple, vous pouvez demander au modèle une liste de titres de recettes et utiliser un énumérateur Grade
pour attribuer à chaque titre une note de popularité :
Python
from google import genai import enum from pydantic import BaseModel class Grade(enum.Enum): A_PLUS = "a+" A = "a" B = "b" C = "c" D = "d" F = "f" class Recipe(BaseModel): recipe_name: str rating: Grade client = genai.Client() response = client.models.generate_content( model='gemini-2.5-flash', contents='List 10 home-baked cookie recipes and give them grades based on tastiness.', config={ 'response_mime_type': 'application/json', 'response_schema': list[Recipe], }, ) print(response.text)
La réponse peut ressembler à ce qui suit :
[ { "recipe_name": "Chocolate Chip Cookies", "rating": "a+" }, { "recipe_name": "Peanut Butter Cookies", "rating": "a" }, { "recipe_name": "Oatmeal Raisin Cookies", "rating": "b" }, ... ]
À propos des schémas JSON
La configuration du modèle pour la sortie JSON à l'aide du paramètre responseSchema
repose sur l'objet Schema
pour définir sa structure. Cet objet représente un sous-ensemble spécifique de l'objet Schéma OpenAPI 3.0 et ajoute également un champ propertyOrdering
.
Voici une représentation pseudo-JSON de tous les champs Schema
:
{ "type": enum (Type), "format": string, "description": string, "nullable": boolean, "enum": [ string ], "maxItems": integer, "minItems": integer, "properties": { string: { object (Schema) }, ... }, "required": [ string ], "propertyOrdering": [ string ], "items": { object (Schema) } }
Le Type
du schéma doit être l'un des types de données OpenAPI ou une union de ces types (à l'aide de anyOf
). Seul un sous-ensemble de champs est valide pour chaque Type
. La liste suivante mappe chaque Type
à un sous-ensemble des champs valides pour ce type :
string
->enum
,format
,nullable
integer
->format
,minimum
,maximum
,enum
,nullable
number
->format
,minimum
,maximum
,enum
,nullable
boolean
->nullable
array
->minItems
,maxItems
,items
,nullable
object
->properties
,required
,propertyOrdering
,nullable
Voici quelques exemples de schémas montrant des combinaisons valides de types et de champs :
{ "type": "string", "enum": ["a", "b", "c"] } { "type": "string", "format": "date-time" } { "type": "integer", "format": "int64" } { "type": "number", "format": "double" } { "type": "boolean" } { "type": "array", "minItems": 3, "maxItems": 3, "items": { "type": ... } } { "type": "object", "properties": { "a": { "type": ... }, "b": { "type": ... }, "c": { "type": ... } }, "nullable": true, "required": ["c"], "propertyOrdering": ["c", "b", "a"] }
Pour obtenir une documentation complète sur les champs de schéma tels qu'ils sont utilisés dans l'API Gemini, consultez la référence du schéma.
Ordre des propriétés
Lorsque vous utilisez des schémas JSON dans l'API Gemini, l'ordre des propriétés est important. Par défaut, l'API classe les propriétés par ordre alphabétique et ne conserve pas l'ordre dans lequel elles sont définies (bien que les SDK Google Gen AI puissent conserver cet ordre). Si vous fournissez des exemples au modèle avec un schéma configuré, et que l'ordre des propriétés des exemples n'est pas cohérent avec l'ordre des propriétés du schéma, la sortie peut être décousue ou inattendue.
Pour garantir un ordre cohérent et prévisible des propriétés, vous pouvez utiliser le champ facultatif propertyOrdering[]
.
"propertyOrdering": ["recipeName", "ingredients"]
propertyOrdering[]
(qui n'est pas un champ standard dans la spécification OpenAPI) est un tableau de chaînes utilisé pour déterminer l'ordre des propriétés dans la réponse. En spécifiant l'ordre des propriétés, puis en fournissant des exemples avec des propriétés dans le même ordre, vous pouvez potentiellement améliorer la qualité des résultats. propertyOrdering
n'est compatible que lorsque vous créez manuellement types.Schema
.
Schémas en Python
Lorsque vous utilisez la bibliothèque Python, la valeur de response_schema
doit être l'une des suivantes :
- Type, tel que vous l'utiliseriez dans une annotation de type (voir le module
typing
de Python) - Instance de
genai.types.Schema
- L'équivalent
dict
degenai.types.Schema
Le moyen le plus simple de définir un schéma consiste à utiliser un type Pydantic (comme indiqué dans l'exemple précédent) :
Python
config={'response_mime_type': 'application/json', 'response_schema': list[Recipe]}
Lorsque vous utilisez un type Pydantic, la bibliothèque Python crée un schéma JSON pour vous et l'envoie à l'API. Pour obtenir d'autres exemples, consultez la documentation de la bibliothèque Python.
La bibliothèque Python est compatible avec les schémas définis avec les types suivants (où AllowedType
correspond à n'importe quel type autorisé) :
int
float
bool
str
list[AllowedType]
AllowedType|AllowedType|...
- Pour les types structurés :
dict[str, AllowedType]
. Cette annotation déclare que toutes les valeurs de dictionnaire sont du même type, mais ne spécifie pas les clés à inclure.- Modèles Pydantic définis par l'utilisateur. Cette approche vous permet de spécifier les noms de clés et de définir différents types pour les valeurs associées à chacune des clés, y compris les structures imbriquées.
Prise en charge du schéma JSON
JSON Schema est une spécification plus récente qu'OpenAPI 3.0, sur laquelle repose l'objet Schema. La compatibilité avec le schéma JSON est disponible en aperçu à l'aide du champ responseJsonSchema
, qui accepte tout schéma JSON avec les limites suivantes :
- Il ne fonctionne qu'avec Gemini 2.5.
- Bien que toutes les propriétés du schéma JSON puissent être transmises, elles ne sont pas toutes prises en charge. Pour en savoir plus sur le champ, consultez la documentation.
- Les références récursives ne peuvent être utilisées que comme valeur d'une propriété d'objet non requise.
- Les références récursives sont développées dans une mesure finie, en fonction de la taille du schéma.
- Les schémas qui contiennent
$ref
ne peuvent pas contenir d'autres propriétés que celles commençant par$
.
Voici un exemple de génération d'un schéma JSON avec Pydantic et de son envoi au modèle :
curl "https://generativelanguage.googleapis.com/v1alpha/models/\ gemini-2.5-flash:generateContent" \ -H "x-goog-api-key: $GEMINI_API_KEY"\ -H 'Content-Type: application/json' \ -d @- <<EOF { "contents": [{ "parts":[{ "text": "Please give a random example following this schema" }] }], "generationConfig": { "response_mime_type": "application/json", "response_json_schema": $(python3 - << PYEOF from enum import Enum from typing import List, Optional, Union, Set from pydantic import BaseModel, Field, ConfigDict import json class UserRole(str, Enum): ADMIN = "admin" VIEWER = "viewer" class Address(BaseModel): street: str city: str class UserProfile(BaseModel): username: str = Field(description="User's unique name") age: Optional[int] = Field(ge=0, le=120) roles: Set[UserRole] = Field(min_items=1) contact: Union[Address, str] model_config = ConfigDict(title="User Schema") # Generate and print the JSON Schema print(json.dumps(UserProfile.model_json_schema(), indent=2)) PYEOF ) } } EOF
L'envoi direct de schémas JSON n'est pas encore pris en charge lorsque vous utilisez le SDK.
Bonnes pratiques
Lorsque vous utilisez un schéma de réponse, gardez à l'esprit les points et les bonnes pratiques suivants :
- La taille du schéma de réponse est comptabilisée dans la limite des jetons d'entrée.
- Par défaut, les champs sont facultatifs, ce qui signifie que le modèle peut les remplir ou les ignorer. Vous pouvez définir les champs selon vos besoins pour forcer le modèle à fournir une valeur. Si le contexte de la requête d'entrée associée est insuffisant, le modèle génère des réponses principalement basées sur les données sur lesquelles il a été entraîné.
Un schéma complexe peut entraîner une erreur
InvalidArgument: 400
. Cette complexité peut être due à des noms de propriété longs, des limites de longueur de tableau longues, des énumérations comportant de nombreuses valeurs, des objets avec de nombreuses propriétés facultatives ou d'une combinaison de ces facteurs.Si vous recevez cette erreur avec un schéma valide, apportez une ou plusieurs des modifications suivantes pour la résoudre :
- Raccourcissez les noms de propriété ou d'énumérations.
- Aplatissez les tableaux imbriqués.
- Réduisez le nombre de propriétés à l'aide de contraintes, par exemple des limites minimale et maximale.
- Réduisez le nombre de propriétés à l'aide de contraintes complexes, telles que des propriétés avec des formats complexes comme
date-time
. - Réduisez le nombre de propriétés facultatives.
- Réduisez le nombre de valeurs valides pour les énumérations.
Si les résultats ne sont pas ceux escomptés, ajoutez plus de contexte à vos requêtes d'entrée ou modifiez votre schéma de réponse. Par exemple, examinez la réponse du modèle sans sortie structurée pour voir comment le modèle répond. Vous pouvez ensuite modifier le schéma de réponse pour qu'il corresponde mieux à la sortie du modèle. Pour obtenir d'autres conseils de dépannage concernant les sorties structurées, consultez le guide de dépannage.
Étape suivante
Maintenant que vous avez appris à générer des sorties structurées, vous pouvez essayer d'utiliser les outils de l'API Gemini :