Guide du développeur Gemini 3

Gemini 3 est notre famille de modèles la plus intelligente à ce jour, basée sur un raisonnement de pointe. Elle est conçue pour donner vie à toutes les idées en maîtrisant les workflows agentifs, le codage autonome et les tâches multimodales complexes. Ce guide couvre les principales fonctionnalités de la famille de modèles Gemini 3 et explique comment en tirer le meilleur parti.

Découvrez notre collection d'applications Gemini 3 pour voir comment le modèle gère le raisonnement avancé, le codage autonome et les tâches multimodales complexes.

Commencez avec quelques lignes de code :

Python

from google import genai

client = genai.Client()

interaction = client.interactions.create(
    model="gemini-3.1-pro-preview",
    input="Find the race condition in this multi-threaded C++ snippet: [code here]",
)

print(interaction.steps[-1].content[0].text)

JavaScript

import { GoogleGenAI } from "@google/genai";

const client = new GoogleGenAI({});

async function run() {
  const interaction = await client.interactions.create({
    model: "gemini-3.1-pro-preview",
    input: "Find the race condition in this multi-threaded C++ snippet: [code here]",
  });

  console.log(interaction.steps.at(-1).content[0].text);
}

run();

REST

curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
  -H "x-goog-api-key: $GEMINI_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "gemini-3.1-pro-preview",
    "input": "Find the race condition in this multi-threaded C++ snippet: [code here]"
  }'

Découvrez la série Gemini 3

Gemini 3.1 Pro est idéal pour les tâches complexes qui nécessitent une vaste connaissance du monde et un raisonnement avancé sur plusieurs modalités.

Gemini 3 Flash est notre dernier modèle de la série 3, avec une intelligence de niveau Pro à la vitesse et au prix de Flash.

Nano Banana Pro (également appelé Gemini 3 Pro Image) est notre modèle de génération d'images de la plus haute qualité, et Nano Banana 2 (également appelé Gemini 3.1 Flash Image) est l'équivalent à volume élevé, à haute efficacité et à prix plus abordable.

Gemini 3.1 Flash-Lite est notre modèle de référence conçu pour l'efficacité des coûts et les tâches à volume élevé.

Tous les modèles Gemini 3 sont actuellement en preview.

ID du modèle Fenêtre de contexte (entrée / sortie) Date limite des connaissances Tarifs (entrée / sortie)*
gemini-3.1-flash-lite-preview 1M / 64k Janvier 2025 0,25 $ (texte, image, vidéo), 0,50 $ (audio) / 1,50 $
gemini-3.1-flash-image-preview 128k / 32k Janvier 2025 0,25 $ (entrée de texte) / 0,067 $ (sortie d'image)**
gemini-3.1-pro-preview 1M / 64k Janvier 2025 2 $ / 12 $ (< 200 k jetons)
4 $ / 18 $ (> 200 k jetons)
gemini-3-flash-preview 1M / 64k Janvier 2025 0,50 $ / 3 $
gemini-3-pro-image-preview 65k / 32k Janvier 2025 2 $ (entrée de texte) / 0,134 $ (sortie d'image)**

* Sauf indication contraire, les tarifs sont indiqués pour 1 million de jetons. ** Les tarifs des images varient en fonction de la résolution. Pour en savoir plus, consultez la page des tarifs.

Pour connaître les limites, les tarifs et obtenir des informations supplémentaires, consultez la page des modèles.

Nouvelles fonctionnalités de l'API dans Gemini 3

Gemini 3 introduit de nouveaux paramètres conçus pour offrir aux développeurs plus de contrôle sur la latence, les coûts et la fidélité multimodale.

Niveau de réflexion

Les modèles de la série Gemini 3 utilisent par défaut la réflexion dynamique pour raisonner à travers les requêtes. Vous pouvez utiliser le paramètre thinking_level, qui contrôle la profondeur maximale du processus de raisonnement interne du modèle avant qu'il ne produise une réponse. Gemini 3 traite ces niveaux comme des allocations relatives pour la réflexion plutôt que comme des garanties strictes de jetons.

Si thinking_level n'est pas spécifié, Gemini 3 utilise high par défaut. Pour des réponses plus rapides et à faible latence lorsque le raisonnement complexe n'est pas nécessaire, vous pouvez limiter le niveau de réflexion du modèle à low.

Niveau de réflexion Gemini 3.1 Pro Gemini 3.1 Flash-Lite Gemini 3 Flash Description
minimal Non compatible Compatible (par défaut) Compatible Correspond au paramètre "no thinking" (pas de réflexion) pour la plupart des requêtes. Le modèle peut réfléchir très peu pour les tâches de codage complexes. Réduit la latence pour les applications de chat ou à haut débit. Notez que minimal ne garantit pas que la réflexion est désactivée.
low Compatible Compatible Compatible Réduit la latence et les coûts. Idéal pour les instructions simples, le chat ou les applications à haut débit.
medium Compatible Compatible Compatible Réflexion équilibrée pour la plupart des tâches.
high Compatible (par défaut, dynamique) Compatible (dynamique) Compatible (par défaut, dynamique) Maximise la profondeur du raisonnement. Le modèle peut mettre beaucoup plus de temps à atteindre un premier jeton de sortie (sans raisonnement), mais la sortie sera plus soigneusement raisonnée.

Python

from google import genai

client = genai.Client()

interaction = client.interactions.create(
    model="gemini-3.1-pro-preview",
    input="How does AI work?",
    generation_config={"thinking_level": "low"},
)

print(interaction.steps[-1].content[0].text)

JavaScript

import { GoogleGenAI } from "@google/genai";

const client = new GoogleGenAI({});

const interaction = await client.interactions.create({
    model: "gemini-3.1-pro-preview",
    input: "How does AI work?",
    generationConfig: {
      thinking_level: "low",
    },
  });

console.log(interaction.steps.at(-1).content[0].text);

REST

curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
  -H "x-goog-api-key: $GEMINI_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "gemini-3.1-pro-preview",
    "input": "How does AI work?",
    "config": {
      "thinking_level": "low"
    }
  }'

Température

Pour tous les modèles Gemini 3, nous vous recommandons vivement de conserver la valeur par défaut du paramètre de température, à savoir 1.0.

Alors que les modèles précédents bénéficiaient souvent d'un réglage de la température pour contrôler la créativité par rapport au déterminisme, les capacités de raisonnement de Gemini 3 sont optimisées pour le paramètre par défaut. La modification de la température (en la définissant sur une valeur inférieure à 1.0) peut entraîner un comportement inattendu, tel qu'une boucle ou une dégradation des performances, en particulier dans les tâches mathématiques ou de raisonnement complexes.

Signatures de pensée

Les modèles Gemini 3 utilisent des signatures de pensée pour maintenir le contexte de raisonnement entre les appels d'API. Ces signatures sont des représentations chiffrées du processus de réflexion interne du modèle.

  • Mode avec état (recommandé) : lorsque vous utilisez l'API Interactions en mode avec état (en fournissant previous_interaction_id), le serveur gère automatiquement l'historique des conversations et les signatures de pensée.
  • Mode sans état : si vous gérez manuellement l'historique des conversations, vous devez inclure des blocs de pensée avec leurs signatures dans les requêtes suivantes pour valider l'authenticité.

Pour en savoir plus, consultez la page Signatures de pensée.

Génération et modification d'images

Pour gemini-3-pro-image-preview et gemini-3.1-flash-image-preview, les signatures de pensée sont essentielles pour la modification conversationnelle. Lorsque vous demandez au modèle de modifier une image, il s'appuie sur la signature du tour précédent pour comprendre la composition et la logique de l'image d'origine.

  • Modification : les signatures sont garanties dans la première partie après les pensées de la réponse (text ou inlineData) et dans chaque partie inlineData suivante. Vous devez renvoyer toutes ces signatures pour éviter les erreurs.

Exemples de code

Appel de fonction en plusieurs étapes (séquentiel)

L'utilisateur pose une question nécessitant deux étapes distinctes (vérifier le vol -> réserver un taxi) en un seul tour.

Étape 1 : Le modèle appelle l'outil de vol.
Le modèle renvoie une signature <Sig_A>

// Model Response (Turn 1, Step 1)
  {
    "id": "interaction-123",
    "steps": [
      {
        "type": "function_call",
        "name": "check_flight",
        "arguments": {"flight": "AA100"},
        "signature": "<Sig_A>" // SAVE THIS
      }
    ]
  }

Étape 2 : L'utilisateur envoie le résultat du vol
Nous devons renvoyer <Sig_A> pour conserver le fil de pensée du modèle.

// User Request (Turn 1, Step 2)
  {
    "model": "gemini-3-flash-preview",
    "previous_interaction_id": "interaction-123",
    "input": [
      {
        "type": "function_result",
        "call_id": "fc_check_flight",
        "name": "check_flight",
        "result": [{ "type": "text", "text": "{\"status\": \"delayed\", \"departure_time\": \"12 PM\"}" }]
      }
    ]
  }

Étape 3 : Le modèle appelle l'outil de taxi
Le modèle se souvient du retard du vol à l'aide de <Sig_A> et décide maintenant de réserver un taxi. Il génère une nouvelle signature <Sig_B>.

// Model Response (Turn 1, Step 3)
  {
    "id": "interaction-123",
    "steps": [
      {
        "type": "function_call",
        "name": "book_taxi",
        "arguments": {"time": "10 AM"},
        "signature": "<Sig_B>" // SAVE THIS
      }
    ]
  }

Étape 4 : L'utilisateur envoie le résultat du taxi
Pour terminer le tour, vous devez renvoyer la chaîne complète : <Sig_A> ET <Sig_B>.

// User Request (Turn 1, Step 4)
  {
    "model": "gemini-3-flash-preview",
    "previous_interaction_id": "interaction-123",
    "input": [
      {
        "type": "function_result",
        "call_id": "fc_book_taxi",
        "name": "book_taxi",
        "result": [{ "type": "text", "text": "{\"booking_status\": \"success\"}" }]
      }
    ]
  }

Appel de fonction parallèle

L'utilisateur demande : "Quel temps fait-il à Paris et à Londres ?" Le modèle renvoie deux appels de fonction dans une seule réponse.

// Model Response
  {
    "id": "interaction-456",
    "steps": [
      {
        "type": "function_call",
        "name": "check_weather",
        "arguments": { "city": "Paris" },
        "signature": "<Signature_A>" // INCLUDED on First FC
      },
      {
        "type": "function_call",
        "name": "check_weather",
        "arguments": { "city": "London" }
      }
    ]
  }

// User Request (Sending Parallel Results)
  {
    "model": "gemini-3-flash-preview",
    "previous_interaction_id": "interaction-456",
    "input": [
      {
        "type": "function_result",
        "call_id": "fc_paris",
        "name": "check_weather",
        "result": [{ "type": "text", "text": "15C" }]
      },
      {
        "type": "function_result",
        "call_id": "fc_london",
        "name": "check_weather",
        "result": [{ "type": "text", "text": "12C" }]
      }
    ]
  }

Migration à partir d'autres modèles

Si vous transférez une trace de conversation à partir d'un autre modèle (par exemple, Gemini 2.5) ou si vous injectez un appel de fonction personnalisé qui n'a pas été généré par Gemini 3, vous n'aurez pas de signature valide.

Pour contourner la validation stricte dans ces scénarios spécifiques, remplissez le champ avec cette chaîne factice spécifique : "signature": "context_engineering_is_the_way to_go"

Sorties structurées avec des outils

Les modèles Gemini 3 vous permettent de combiner des sorties structurées avec des outils intégrés, y compris l'ancrage avec la recherche Google, le contexte d'URL, l'exécution de code et l'appel de fonction.

Python

from google import genai
from pydantic import BaseModel, Field
from typing import List

class MatchResult(BaseModel):
    winner: str = Field(description="The name of the winner.")
    final_match_score: str = Field(description="The final match score.")
    scorers: List[str] = Field(description="The name of the scorer.")

client = genai.Client()

interaction = client.interactions.create(
    model="gemini-3.1-pro-preview",
    input="Search for all details for the latest Euro.",
    tools=[
        {"type": "google_search"},
        {"type": "url_context"}
    ],
    response_format={
        "type": "text",
        "mime_type": "application/json",
        "schema": MatchResult.model_json_schema()
    },
)

result = MatchResult.model_validate_json(interaction.steps[-1].content[0].text)
print(result)

JavaScript

import { GoogleGenAI } from "@google/genai";
import * as z from "zod";

const matchJsonSchema = {
  type: "object",
  properties: {
    winner: { type: "string", description: "The name of the winner." },
    final_match_score: { type: "string", description: "The final score." },
    scorers: {
      type: "array",
      items: { type: "string" },
      description: "The name of the scorer."
    }
  },
  required: ["winner", "final_match_score", "scorers"]
};

const matchSchema = z.fromJSONSchema(matchJsonSchema);

const client = new GoogleGenAI({});

async function run() {
  const interaction = await client.interactions.create({
    model: "gemini-3.1-pro-preview",
    input: "Search for all details for the latest Euro.",
    tools: [
      { type: "google_search" },
      { type: "url_context" }
    ],
    response_format: {
        type: "text",
        mime_type: "application/json",
        schema: matchJsonSchema
    },
  });

  const match = matchSchema.parse(JSON.parse(interaction.steps.at(-1).content[0].text));
  console.log(match);
}

run();

REST

curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
  -H "x-goog-api-key: $GEMINI_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "gemini-3.1-pro-preview",
    "input": "Search for all details for the latest Euro.",
    "tools": [
      {"type": "google_search"},
      {"type": "url_context"}
    ],
    "response_format": {
        "type": "text",
        "mime_type": "application/json",
        "schema": {
            "type": "object",
            "properties": {
                "winner": {"type": "string", "description": "The name of the winner."},
                "final_match_score": {"type": "string", "description": "The final score."},
                "scorers": {
                    "type": "array",
                    "items": {"type": "string"},
                    "description": "The name of the scorer."
                }
            },
            "required": ["winner", "final_match_score", "scorers"]
        }
    }
  }'

Génération d'images

Gemini 3.1 Flash Image et Gemini 3 Pro Image vous permettent de générer et de modifier des images à partir de requêtes textuelles. Il utilise le raisonnement pour "réfléchir" à une requête et peut récupérer des données en temps réel (telles que des prévisions météorologiques ou des graphiques boursiers) avant d'utiliser l'ancrage de la recherche Google pour générer des images de haute fidélité.

Nouvelles fonctionnalités améliorées :

  • Rendu 4K et texte : générez des textes et des diagrammes nets et lisibles avec des résolutions allant jusqu'à 2K et 4K.
  • Génération ancrée : utilisez l'outil google_search pour vérifier les faits et générer des images basées sur des informations réelles. Ancrage avec la recherche d'images Google disponible pour Gemini 3.1 Flash Image.
  • Retouche conversationnelle : modification d'images en plusieurs étapes en demandant simplement des modifications (par exemple, "Mets un coucher de soleil en arrière-plan"). Ce workflow s'appuie sur les signatures de pensée pour préserver le contexte visuel entre les tours.

Pour obtenir des informations complètes sur les formats d'image, les workflows de modification et les options de configuration , consultez le guide de génération d'images.

Python

from google import genai
import base64

client = genai.Client()

interaction = client.interactions.create(
    model="gemini-3-pro-image-preview",
    input="Generate an infographic of the current weather in Tokyo.",
    tools=[{"type": "google_search"}],
    response_format={
        "type": "image",
        "aspect_ratio": "16:9",
        "image_size": "4K"
    }
)

from PIL import Image
import io

image_blocks = [content_block for content_block in interaction.steps[-1].content if content_block.type == "image"]
if image_blocks:
    image_data = base64.b64decode(image_blocks[0].data)
    image = Image.open(io.BytesIO(image_data))
    image.save('weather_tokyo.png')
    image.show()

JavaScript

import { GoogleGenAI } from "@google/genai";
import * as fs from "node:fs";

const client = new GoogleGenAI({});

async function run() {
  const interaction = await client.interactions.create({
    model: "gemini-3-pro-image-preview",
    input: "Generate a visualization of the current weather in Tokyo.",
    tools: [{ googleSearch: {} }],
    responseFormat: {
      type: "image",
      aspectRatio: "16:9",
      imageSize: "4K"
    }
  });

  for (const contentBlock of interaction.steps.at(-1).content) {
    if (contentBlock.type === "image") {
      const buffer = Buffer.from(contentBlock.data, "base64");
      fs.writeFileSync("weather_tokyo.png", buffer);
    }
  }
}

run();

REST

curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
  -H "x-goog-api-key: $GEMINI_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "gemini-3-pro-image-preview",
    "input": "Generate a visualization of the current weather in Tokyo.",
    "tools": [{"type": "google_search"}],
    "response_format": {
        "type": "image",
        "aspect_ratio": "16:9",
        "image_size": "4K"
    }
  }'

Exemple de réponse

Météo à Tokyo

Exécution de code avec des images

Gemini 3 Flash peut traiter la vision comme une investigation active, et pas seulement comme un coup d'œil statique. En combinant le raisonnement avec l'exécution de code, le modèle formule un plan, puis écrit et exécute du code Python pour effectuer un zoom avant, recadrer, annoter ou manipuler des images étape par étape afin d'ancrer visuellement ses réponses.

Cas d'utilisation :

  • Zoom et inspection : le modèle détecte implicitement lorsque les détails sont trop petits (par exemple, la lecture d'une jauge ou d'un numéro de série éloigné) et écrit du code pour recadrer et réexaminer la zone à une résolution plus élevée.
  • Mathématiques et traçage visuels : le modèle peut exécuter des calculs en plusieurs étapes à l'aide de code (par exemple, additionner des éléments de ligne sur un reçu ou générer un graphique Matplotlib à partir de données extraites).
  • Annotation d'images : le modèle peut dessiner des flèches, des cadres de délimitation ou d'autres annotations directement sur les images pour répondre à des questions spatiales telles que "Où cet élément doit-il aller ?".

Pour activer la réflexion visuelle, configurez l'exécution de code en tant qu'outil. Le modèle utilisera automatiquement le code pour manipuler les images si nécessaire.

Python

from google import genai
from google.genai import types
import requests
from PIL import Image
import io
import base64

image_path = "https://goo.gle/instrument-img"
image_bytes = requests.get(image_path).content
image = types.Part.from_bytes(data=image_bytes, mime_type="image/jpeg")

client = genai.Client()

interaction = client.interactions.create(
    model="gemini-3-flash-preview",
    input=[
        image,
        "Zoom into the expression pedals and tell me how many pedals are there?"
    ],
    tools=[{"code_execution": {}}],
)

from IPython.display import display
from PIL import Image
import io

for step in interaction.steps:
    if step.type == "model_output":
        for content_block in step.content:
            if content_block.type == "text":
                print(content_block.text)
            elif content_block.type == "image":
                 display(Image.open(io.BytesIO(base64.b64decode(content_block.data))))
    elif step.type == "code_execution_call":
        print(step.code)
    elif step.type == "code_execution_result":
        print(step.output)

JavaScript

import { GoogleGenAI } from "@google/genai";

const client = new GoogleGenAI({});

async function main() {
  const imageUrl = "https://goo.gle/instrument-img";
  const response = await fetch(imageUrl);
  const imageArrayBuffer = await response.arrayBuffer();
  const base64ImageData = Buffer.from(imageArrayBuffer).toString("base64");

  const interaction = await client.interactions.create({
    model: "gemini-3-flash-preview",
    input: [
      {
        inlineData: {
          mime_type: "image/jpeg",
          data: base64ImageData,
        },
      },
      {
        text: "Zoom into the expression pedals and tell me how many pedals are there?",
      },
    ],
    tools: [{ codeExecution: {} }],
  });

  for (const step of interaction.steps) {
    if (step.type === "model_output") {
      for (const contentBlock of step.content) {
        if (contentBlock.type === "text") {
          console.log("Text:", contentBlock.text);
        }
      }
    } else if (step.type === "code_execution_call") {
      console.log("Code:", step.code);
    } else if (step.type === "code_execution_result") {
      console.log("Output:", step.output);
    }
  }
}

main();

REST

IMG_URL="https://goo.gle/instrument-img"
MODEL="gemini-3-flash-preview"

MIME_TYPE=$(curl -sIL "$IMG_URL" | grep -i '^content-type:' | awk -F ': ' '{print $2}' | sed 's/\r$//' | head -n 1)
if [[ -z "$MIME_TYPE" || ! "$MIME_TYPE" == image/* ]]; then
  MIME_TYPE="image/jpeg"
fi

if [[ "$(uname)" == "Darwin" ]]; then
  IMAGE_B64=$(curl -sL "$IMG_URL" | base64 -b 0)
elif [[ "$(base64 --version 2>&1)" = *"FreeBSD"* ]]; then
  IMAGE_B64=$(curl -sL "$IMG_URL" | base64)
else
  IMAGE_B64=$(curl -sL "$IMG_URL" | base64 -w0)
fi

curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
    -H "x-goog-api-key: $GEMINI_API_KEY" \
    -H 'Content-Type: application/json' \
    -d '{
      "model": "'$MODEL'",
      "input": [{
        "parts":[
            {
              "inline_data": {
                "mime_type":"'"$MIME_TYPE"'",
                "data": "'"$IMAGE_B64"'"
              }
            },
            {"text": "Zoom into the expression pedals and tell me how many pedals are there?"}
        ]
      }],
      "tools": [{"code_execution": {}}]
    }'

Pour en savoir plus sur l'exécution de code avec des images, consultez Exécution de code.

Réponses de fonction multimodales

L'appel de fonction multimodal permet aux utilisateurs d'obtenir des réponses de fonction contenant des objets multimodaux, ce qui améliore l'utilisation des capacités d'appel de fonction du modèle. L'appel de fonction standard n'accepte que les réponses de fonction basées sur du texte :

Python

from google import genai
import requests
import base64

client = genai.Client()

# 1. Define the tool
get_image_tool = {
    "type": "function",
    "name": "get_image",
    "description": "Retrieves the image file reference for a specific order item.",
    "parameters": {
        "type": "object",
        "properties": {
            "item_name": {
                "type": "string",
                "description": "The name or description of the item ordered (e.g., 'instrument')."
            }
        },
        "required": ["item_name"],
    },
}

# 2. Send the request with tools
interaction_1 = client.interactions.create(
    model="gemini-3-flash-preview",
    input="Show me the instrument I ordered last month.",
    tools=[get_image_tool],
)

# 3. Find the function call step
fc_step = next(s for s in interaction_1.steps if s.type == "function_call")
print(f"Tool Call: {fc_step.name}({fc_step.arguments})")

# Execute tool (fetch image)
image_path = "https://goo.gle/instrument-img"
image_bytes = requests.get(image_path).content
image_b64 = base64.b64encode(image_bytes).decode("utf-8")

# 4. Send multimodal function result back
interaction_2 = client.interactions.create(
    model="gemini-3-flash-preview",
    previous_interaction_id=interaction_1.id,
    input=[{
        "type": "function_result",
        "name": fc_step.name,
        "call_id": fc_step.id,
        "result": [
            {"type": "text", "text": "instrument.jpg"},
            {
                "type": "image",
                "mime_type": "image/jpeg",
                "data": image_b64,
            }
        ]
    }],
    tools=[get_image_tool]
)

print(f"\nFinal model response: {interaction_2.steps[-1].content[0].text}")

JavaScript

import { GoogleGenAI } from '@google/genai';

const client = new GoogleGenAI({});

// 1. Define the tool
const getImageTool = {
    type: 'function',
    name: 'get_image',
    description: 'Retrieves the image file reference for a specific order item.',
    parameters: {
        type: 'object',
        properties: {
            item_name: {
                type: 'string',
                description: "The name or description of the item ordered (e.g., 'instrument').",
            },
        },
        required: ['item_name'],
    },
};

// 2. Send the request with tools
const interaction1 = await client.interactions.create({
    model: 'gemini-3-flash-preview',
    input: 'Use the get_image tool to show me the instrument I ordered last month.',
    tools: [getImageTool],
});

// 3. Find the function call step
const fcStep = interaction1.steps.find(s => s.type === 'function_call');
console.log(`Tool Call: ${fcStep.name}(${JSON.stringify(fcStep.arguments)})`);

// Execute tool (fetch image)
const imageUrl = 'https://goo.gle/instrument-img';
const response = await fetch(imageUrl);
const imageArrayBuffer = await response.arrayBuffer();
const base64ImageData = Buffer.from(imageArrayBuffer).toString('base64');

// 4. Send multimodal function result back
const interaction2 = await client.interactions.create({
    model: 'gemini-3-flash-preview',
    previous_interaction_id: interaction1.id,
    input: [{
        type: 'function_result',
        name: fcStep.name,
        call_id: fcStep.id,
        result: [
            { type: 'text', text: 'instrument.jpg' },
            {
                type: 'image',
                mime_type: 'image/jpeg',
                data: base64ImageData,
            }
        ]
    }],
    tools: [getImageTool]
});

console.log(`\nFinal model response: ${interaction2.steps.at(-1).content[0].text}`);

REST

IMG_URL="https://goo.gle/instrument-img"

MIME_TYPE=$(curl -sIL "$IMG_URL" | grep -i '^content-type:' | awk -F ': ' '{print $2}' | sed 's/\r$//' | head -n 1)
if [[ -z "$MIME_TYPE" || ! "$MIME_TYPE" == image/* ]]; then
  MIME_TYPE="image/jpeg"
fi

# Check for macOS
if [[ "$(uname)" == "Darwin" ]]; then
  IMAGE_B64=$(curl -sL "$IMG_URL" | base64 -b 0)
elif [[ "$(base64 --version 2>&1)" = *"FreeBSD"* ]]; then
  IMAGE_B64=$(curl -sL "$IMG_URL" | base64)
else
  IMAGE_B64=$(curl -sL "$IMG_URL" | base64 -w0)
fi

# 1. First interaction (triggers function call)
# curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
#   -H "x-goog-api-key: $GEMINI_API_KEY" \
#   -H 'Content-Type: application/json' \
#   -d '{ "model": "gemini-3-flash-preview", "input": "Show me the instrument I ordered last month.", "tools": [...] }'

# 2. Send multimodal function result back (Replace INTERACTION_ID and CALL_ID)
curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
  -H "x-goog-api-key: $GEMINI_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "gemini-3-flash-preview",
    "previous_interaction_id": "INTERACTION_ID",
    "input": [{
      "type": "function_result",
      "name": "get_image",
      "call_id": "CALL_ID",
      "result": [
        { "type": "text", "text": "instrument.jpg" },
        {
          "type": "image",
          "mime_type": "'"$MIME_TYPE"'",
          "data": "'"$IMAGE_B64"'"
        }
      ]
    }]
  }'

Combiner des outils intégrés et l'appel de fonction

Gemini 3 permet d'utiliser des outils intégrés (tels que la recherche Google, le contexte d'URL et plus) et des outils d'appel de fonction personnalisés dans le même appel d'API, ce qui permet des workflows plus complexes.

Python

from google import genai
from google.genai import types

client = genai.Client()

getWeather = {
    "type": "function",
    "name": "getWeather",
    "description": "Gets the weather for a requested city.",
    "parameters": {
        "type": "object",
        "properties": {
            "city": {
                "type": "string",
                "description": "The city and state, e.g. Utqiaġvik, Alaska",
            },
        },
        "required": ["city"],
    },
}

interaction = client.interactions.create(
    model="gemini-3-flash-preview",
    input="What is the northernmost city in the United States? What's the weather like there today?",
    tools=[
        {"type": "google_search"},
        getWeather
    ],
)

# Find the function call step
fc_step = next((s for s in interaction.steps if s.type == "function_call"), None)

if fc_step:
    # Simulate a function result
    result = {"response": "Very cold. 22 degrees Fahrenheit."}

    final_interaction = client.interactions.create(
        model="gemini-3-flash-preview",
        input=[
            {"type": "function_result", "name": fc_step.name, "call_id": fc_step.id, "result": result}
        ],
        tools=[
            {"type": "google_search"},
            getWeather
        ],
        previous_interaction_id=interaction.id,
    )

    print(final_interaction.steps[-1].content[0].text)

JavaScript

import { GoogleGenAI, Type } from '@google/genai';

const client = new GoogleGenAI({});

const getWeatherDeclaration = {
  type: 'function',
  name: 'getWeather',
  description: 'Gets the weather for a requested city.',
  parameters: {
    type: Type.OBJECT,
    properties: {
      city: {
        type: Type.STRING,
        description: 'The city and state, e.g. Utqiaġvik, Alaska',
      },
    },
    required: ['city'],
  },
};

const interaction = await client.interactions.create({
  model: 'gemini-3-flash-preview',
  input: "What is the northernmost city in the United States? What's the weather like there today?",
  tools: [
    { type: "google_search" },
    getWeatherDeclaration
  ],
});

// Find the function call step
const fcStep = interaction.steps.find(s => s.type === 'function_call');

if (fcStep) {
  const result = { response: "Very cold. 22 degrees Fahrenheit." };

  const finalInteraction = await client.interactions.create({
    model: 'gemini-3-flash-preview',
    input: [
      { type: 'function_result', name: fcStep.name, call_id: fcStep.id, result: result }
    ],
    tools: [
      { type: "google_search" },
      getWeatherDeclaration
    ],
    previous_interaction_id: interaction.id,
  });

  console.log(finalInteraction.steps.at(-1).content[0].text);
}

Migration à partir de Gemini 2.5

Gemini 3 est notre famille de modèles la plus performante à ce jour et offre une amélioration progressive par rapport à Gemini 2.5. Lors de la migration, tenez compte des points suivants :

  • Raisonnement : si vous utilisiez auparavant une ingénierie de prompts complexe (comme la chaîne de pensée) pour forcer Gemini 2.5 à raisonner, essayez Gemini 3 avec thinking_level: "high" et des prompts simplifiés.
  • Paramètres de température : si votre code existant définit explicitement la température (en particulier sur des valeurs faibles pour les sorties déterministes), nous vous recommandons de supprimer ce paramètre et d'utiliser la valeur par défaut de Gemini 3 (1.0) pour éviter d'éventuels problèmes de boucle ou une dégradation des performances sur les tâches complexes.
  • Compréhension des PDF et des documents : si vous vous appuyiez sur un comportement spécifique pour l'analyse de documents denses, testez le nouveau paramètre media_resolution_high pour garantir une précision continue.
  • Consommation de jetons : la migration vers les paramètres par défaut de Gemini 3 peut augmenter l'utilisation de jetons pour les PDF, mais la diminuer pour les vidéos. Si les requêtes dépassent désormais la fenêtre de contexte en raison de résolutions par défaut plus élevées, nous vous recommandons de réduire explicitement la résolution des contenus multimédias.
  • Segmentation d'images : les fonctionnalités de segmentation d'images (renvoi de masques au niveau des pixels pour les objets) ne sont pas compatibles avec Gemini 3 Pro ni Gemini 3 Flash. Pour les charges de travail nécessitant une segmentation d'images intégrée, nous vous recommandons de continuer à utiliser Gemini 2.5 Flash avec la réflexion désactivée ou Gemini Robotics-ER 1.6.
  • Utilisation de l'ordinateur : Gemini 3 Pro et Gemini 3 Flash sont compatibles avec l'utilisation de l'ordinateur. Contrairement à la série 2.5, vous n'avez pas besoin d'utiliser un modèle distinct pour accéder à l'outil d'utilisation de l'ordinateur.
  • Compatibilité avec les outils : la combinaison d'outils intégrés et d'appels de fonction est désormais compatible avec les modèles Gemini 3. L'ancrage de Maps est également désormais compatible avec les modèles Gemini 3 .

Compatibilité avec OpenAI

Pour les utilisateurs qui utilisent la couche de compatibilité OpenAI, les paramètres standards (reasoning_effort d'OpenAI) sont automatiquement mappés sur les équivalents Gemini (thinking_level).

Bonnes pratiques concernant les prompts

Gemini 3 est un modèle de raisonnement, ce qui modifie la façon dont vous devez le solliciter.

  • Instructions précises : soyez concis dans vos requêtes d'entrée. Gemini 3 répond mieux aux instructions directes et claires. Il peut suranalyser les techniques de prompt engineering verbeuses ou trop complexes utilisées pour les anciens modèles.
  • Niveau de détail de la sortie : par défaut, Gemini 3 est moins verbeux et préfère fournir des réponses directes et efficaces. Si votre cas d'utilisation nécessite une personnalité plus conversationnelle ou "bavarde", vous devez explicitement orienter le modèle dans la requête (par exemple, "Explique cela comme un assistant amical et bavard").
  • Gestion du contexte : lorsque vous travaillez avec de grands ensembles de données (par exemple, des livres entiers, des bases de code ou de longues vidéos), placez vos instructions ou questions spécifiques à la fin de la requête, après le contexte des données. Ancrez le raisonnement du modèle aux données fournies en commençant votre question par une expression telle que "Sur la base des informations précédentes...".

Pour en savoir plus sur les stratégies de conception de prompts, consultez le guide de prompt engineering.

Questions fréquentes

  1. Quelle est la date limite des connaissances pour Gemini 3 ? Les modèles Gemini 3 ont une date limite des connaissances de janvier 2025. Pour obtenir des informations plus récentes, utilisez l' outil d'ancrage de la recherche.

  2. Quelles sont les limites de la fenêtre de contexte ? Les modèles Gemini 3 sont compatibles avec une fenêtre de contexte d'entrée de 1 million de jetons et jusqu'à 64 000 jetons de sortie.

  3. Existe-t-il un niveau sans frais pour Gemini 3 ? Gemini 3 Flash gemini-3-flash-preview dispose d'un niveau sans frais dans l'API Gemini. Vous pouvez essayer Gemini 3.1 Pro et 3 Flash sans frais dans Google AI Studio, mais aucun niveau sans frais n'est disponible pour gemini-3.1-pro-preview dans l'API Gemini.

  4. Mon ancien code thinking_budget fonctionnera-t-il toujours ? Oui, thinking_budget est toujours compatible pour la rétrocompatibilité, mais nous vous recommandons de migrer vers thinking_level pour des performances plus prévisibles. N'utilisez pas les deux dans la même requête.

  5. Gemini 3 est-il compatible avec l'API Batch ? Oui, Gemini 3 est compatible avec l' API Batch.

  6. La mise en cache du contexte est-elle compatible ? Oui, la mise en cache du contexte est compatible avec Gemini 3.

  7. Quels outils sont compatibles avec Gemini 3 ? Gemini 3 est compatible avec la recherche Google, l'ancrage avec Google Maps, la recherche de fichiers, l'exécution de code et le contexte d'URL. Il est également compatible avec l'appel de fonction standard pour vos propres outils personnalisés, et en combinaison avec des outils intégrés.

  8. Qu'est-ce que gemini-3.1-pro-preview-customtools ? Si vous utilisez gemini-3.1-pro-preview et que le modèle ignore vos outils personnalisés au profit des commandes bash, essayez plutôt le modèle gemini-3.1-pro-preview-customtools. Plus d'informations ici.

Étapes suivantes