Utilisation d'un ordinateur

L'outil Utilisation de l'ordinateur vous permet de créer des agents de contrôle pour navigateur, mobile et ordinateur de bureau qui interagissent avec les tâches et les automatisent. À l'aide de captures d'écran, le modèle peut "voir" un écran d'ordinateur et "agir" en générant des actions d'interface utilisateur spécifiques, comme des clics de souris et des saisies au clavier. Comme pour l'appel de fonction, vous devrez implémenter l'environnement d'exécution côté client pour recevoir et exécuter les actions d'utilisation de l'ordinateur.

Gemini 3.5 Flash est le modèle recommandé pour l'utilisation de l'ordinateur. Il offre plusieurs nouvelles fonctionnalités :

  • Compatibilité multi-environnements : créez des agents pour les environnements navigateur, mobile et ordinateur.
  • Actions simplifiées avec des intents : les actions incluent un champ intent qui explique le raisonnement du modèle pour chaque étape.
  • Règles de sécurité configurables : affinez le comportement de sécurité avec des catégories et des remplacements de règles intégrés.
  • Détection de l'injection de prompt : activez l'analyse des captures d'écran pour détecter les instructions adversariales cachées.

Avec l'utilisation de l'ordinateur, vous pouvez créer des agents qui :

  • Automatisez la saisie de données répétitives ou le remplissage de formulaires sur les sites Web.
  • Effectuer des tests automatisés des applications Web et des parcours utilisateur
  • Effectuer des recherches sur différents sites Web (par exemple, recueillir des informations sur les produits, les prix et les avis sur les sites d'e-commerce pour prendre une décision d'achat)

Voici un exemple minimal d'initialisation du client et d'envoi d'un prompt au modèle avec l'outil computer_use activé pour un environnement de navigateur :

Python

from google import genai

client = genai.Client()

interaction = client.interactions.create(
    model="gemini-3.5-flash",
    input="Search for 'Gemini API' on Google.",
    tools=[{"type": "computer_use", "environment": "browser"}]
)

print(interaction)

JavaScript

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

const ai = new GoogleGenAI();

const interaction = await ai.interactions.create({
  model: 'gemini-3.5-flash',
  input: "Search for 'Gemini API' on Google.",
  tools: [{ type: "computer_use", environment: "browser" }]
});

console.log(interaction);


Fonctionnement de l'utilisation d'un ordinateur

Pour créer un agent avec le modèle Computer Use, vous devez configurer une boucle continue entre votre application et l'API. Voici ce que votre code fera à chaque étape :

  1. Envoyer une requête au modèle
    • Votre application envoie une requête API contenant l'outil Utilisation de l'ordinateur, vos paramètres de configuration (comme l'environnement cible), la requête de l'utilisateur et une capture d'écran de l'écran actuel.
  2. Recevoir la réponse du modèle
    • Le modèle analyse l'écran et la requête, puis renvoie une réponse qui inclut une function_call suggérée représentant une action d'interface utilisateur (comme un clic, un défilement ou une frappe).
    • Pour Gemini 3.5 Flash, la réponse inclut également un raisonnement intent expliquant pourquoi le modèle a choisi cette action.
    • Pour les anciens modèles (comme gemini-2.5-computer-use-preview-10-2025), la réponse peut inclure un safety_decision provenant d'un système de sécurité interne qui classe l'action comme régulière/autorisée, require_confirmation (nécessitant l'approbation de l'utilisateur) ou bloquée.
  3. Exécutez l'action reçue.
    • Si l'action est autorisée (ou si l'utilisateur la confirme), votre code côté client analyse le function_call, met à l'échelle les coordonnées normalisées pour qu'elles correspondent à votre fenêtre d'affichage et exécute l'action dans votre environnement cible à l'aide d'outils d'automatisation (tels que Playwright). Si l'action est bloquée, votre client doit arrêter l'exécution ou gérer l'interruption.
  4. Capturer l'état du nouvel environnement
    • Une fois l'action exécutée, votre application capture une nouvelle capture d'écran et la renvoie au modèle dans un function_result pour demander la prochaine étape.

Ce processus se répète ensuite à partir de l'étape 2, en sollicitant continuellement la prochaine action du modèle jusqu'à ce que la tâche soit terminée ou interrompue.

Présentation de l'utilisation d'un ordinateur

Implémenter l'utilisation de l'ordinateur

Avant de créer des éléments avec l'outil Utilisation de l'ordinateur, vous devez configurer les éléments suivants :

  • Environnement d'exécution sécurisé : exécutez votre agent dans une VM ou un conteneur en bac à sable pour l'isoler de votre système hôte et limiter son impact potentiel. L'implémentation de référence inclut un bac à sable basé sur Docker, prêt à l'emploi, que vous pouvez utiliser comme point de départ.
  • Gestionnaire d'actions côté client : implémentez la logique côté client pour exécuter des coordonnées, saisir du texte et prendre des captures d'écran.

Les exemples ci-dessous utilisent un navigateur Web comme environnement d'exécution et Playwright comme gestionnaire côté client.

0. Configurer Playwright

Commencez par installer les packages requis :

pip install google-genai playwright
playwright install chromium

Ensuite, initialisez une instance de navigateur Playwright à utiliser pour l'exécution :

from playwright.sync_api import sync_playwright

# 1. Configure screen dimensions for the target environment
SCREEN_WIDTH = 1440
SCREEN_HEIGHT = 900

# 2. Start the Playwright browser
# In production, utilize a sandboxed environment.
playwright = sync_playwright().start()
# Set headless=False to see the actions performed on your screen
browser = playwright.chromium.launch(headless=False)

# 3. Create a context and page with the specified dimensions
context = browser.new_context(
    viewport={"width": SCREEN_WIDTH, "height": SCREEN_HEIGHT}
)
page = context.new_page()

# 4. Navigate to an initial page to start the task
page.goto("https://www.google.com")

# The 'page', 'SCREEN_WIDTH', and 'SCREEN_HEIGHT' variables
# will be used in the steps below.

1. Envoyer une requête au modèle

Initialisez la bibliothèque cliente et configurez l'outil d'utilisation de l'ordinateur. Notez qu'il n'est pas nécessaire de spécifier la taille d'affichage lorsque vous envoyez une requête. Le modèle prédit les coordonnées en pixels mises à l'échelle en fonction de la hauteur et de la largeur de l'écran.

Python

Utilisez le SDK Python google-genai (version 2.7.0 ou ultérieure) pour configurer une requête ciblant l'environnement du navigateur :

from google import genai

client = genai.Client()

interaction = client.interactions.create(
    model='gemini-3.5-flash',
    input="Find a flight from SF to Hawaii on Jun 30th, coming back on Jul 6th",
    tools=[
        {
            "type": "computer_use",
            "environment": "browser",
            "enable_prompt_injection_detection": True
        }
    ]
)

print(interaction)

JavaScript

Utilisez le SDK Node.js @google/genai pour configurer une requête ciblant l'environnement du navigateur :

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

const ai = new GoogleGenAI();

const interaction = await ai.interactions.create({
  model: 'gemini-3.5-flash',
  input: "Find a flight from SF to Hawaii on Jun 30th, coming back on Jul 6th",
  tools: [
    {
      type: "computer_use",
      environment: "browser",
      enable_prompt_injection_detection: true
    }
  ]
});

console.log(interaction);

REST

Utilisez curl pour envoyer une requête :

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.5-flash",
    "input": "Find me a flight from SF to Hawaii on Jun 30th, coming back on Jul 6th. Start by navigating directly to flights.google.com",
    "tools": [
      {
        "type": "computer_use",
        "environment": "browser",
        "enable_prompt_injection_detection": true
      }
    ]
  }'

Gemini 2.5 (ancienne version)

Python

from google import genai

client = genai.Client()

# Specify predefined functions to exclude (optional)
excluded_functions = ["drag_and_drop"]

interaction = client.interactions.create(
    model='gemini-2.5-computer-use-preview-10-2025',
    input="Search for highly rated smart fridges on Google Shopping.",
    tools=[
        {
            "type": "computer_use",
            "environment": "browser",
            "excluded_predefined_functions": excluded_functions
        }
    ]
)

print(interaction)

JavaScript

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

const ai = new GoogleGenAI();

// Specify predefined functions to exclude (optional)
const excludedFunctions = ["drag_and_drop"];

const interaction = await ai.interactions.create({
  model: 'gemini-2.5-computer-use-preview-10-2025',
  input: "Search for highly rated smart fridges on Google Shopping.",
  tools: [
    {
      type: "computer_use",
      environment: "browser",
      excluded_predefined_functions: excludedFunctions
    }
  ]
});

console.log(interaction);

2. Recevoir la réponse du modèle

Le modèle de réponse suggère un appel de fonction. Pour Gemini 3.5 Flash, la réponse contient un intent de raisonnement personnalisé ainsi que des coordonnées. Voici des exemples de ces deux types de réponses :

Gemini 3.5 Flash

{
  "steps": [
    {
      "type": "function_call",
      "name": "click",
      "arguments": {
        "x": 450,
        "y": 120,
        "intent": "Click the search box to type the destination."
      }
    }
  ]
}

Gemini 2.5 (ancienne version)

{
  "steps": [
    {
      "type": "model_output",
      "content": [
        {
          "type": "text",
          "text": "I will type the search query into the search bar."
        }
      ]
    },
    {
      "type": "function_call",
      "name": "type_text_at",
      "arguments": {
        "x": 371,
        "y": 470,
        "text": "highly rated smart fridges",
        "press_enter": true
      }
    }
  ]
}

3. Exécuter les actions reçues

Votre application doit analyser les coordonnées de la réponse, exécuter l'action et les mettre à l'échelle à partir des coordonnées normalisées 1000x1000.

Le code ci-dessous gère à la fois les anciennes commandes d'outil (click_at, type_text_at) et les commandes simplifiées de Gemini 3.5 Flash (click, type).

Python

from typing import Any, List, Tuple
import time

def denormalize_x(x: int, screen_width: int) -> int:
    """Convert normalized x coordinate (0-1000) to actual pixel coordinate."""
    return int(x / 1000 * screen_width)

def denormalize_y(y: int, screen_height: int) -> int:
    """Convert normalized y coordinate (0-1000) to actual pixel coordinate."""
    return int(y / 1000 * screen_height)

def execute_function_calls(interaction, page, screen_width, screen_height):
    results = []
    function_calls = [
        step for step in interaction.steps if step.type == "function_call"
    ]

    for function_call in function_calls:
        action_result = {}
        fname = function_call.name
        args = function_call.arguments
        print(f"  -> Executing: {fname} (Intent: {args.get('intent', 'N/A')})")

        try:
            if fname in ("open_web_browser", "open_app"):
                pass # Handled / already open
            elif fname in ("click", "click_at", "double_click", "triple_click", "middle_click", "right_click", "move", "long_press"):
                actual_x = denormalize_x(args["x"], screen_width)
                actual_y = denormalize_y(args["y"], screen_height)

                if fname in ("click", "click_at"):
                    page.mouse.click(actual_x, actual_y)
                elif fname == "double_click":
                    page.mouse.dblclick(actual_x, actual_y)
                elif fname == "right_click":
                    page.mouse.click(actual_x, actual_y, button="right")
                elif fname == "middle_click":
                    page.mouse.click(actual_x, actual_y, button="middle")
                elif fname == "move":
                    page.mouse.move(actual_x, actual_y)
            elif fname in ("type", "type_text_at"):
                actual_x = denormalize_x(args["x"], screen_width) if "x" in args else None
                actual_y = denormalize_y(args["y"], screen_height) if "y" in args else None
                text = args["text"]
                press_enter = args.get("press_enter", False)

                if actual_x is not None and actual_y is not None:
                    page.mouse.click(actual_x, actual_y)
                # Clear field first
                page.keyboard.press("Meta+A")
                page.keyboard.press("Backspace")
                page.keyboard.type(text)
                if press_enter:
                    page.keyboard.press("Enter")
            elif fname == "navigate":
                page.goto(args["url"])
            elif fname == "go_back":
                page.go_back()
            elif fname == "go_forward":
                page.go_forward()
            elif fname == "wait":
                time.sleep(args.get("seconds", 1))
            else:
                print(f"Warning: Custom or unhandled function {fname}")

            page.wait_for_load_state(timeout=5000)
            time.sleep(1)

        except Exception as e:
            print(f"Error executing {fname}: {e}")
            action_result = {"error": str(e)}

        results.append((fname, function_call.id, action_result))

    return results

JavaScript

function denormalizeX(x, screenWidth) {
    // Convert normalized x coordinate (0-1000) to actual pixel coordinate.
    return Math.floor((x / 1000) * screenWidth);
}

function denormalizeY(y, screenHeight) {
    // Convert normalized y coordinate (0-1000) to actual pixel coordinate.
    return Math.floor((y / 1000) * screenHeight);
}

async function executeFunctionCalls(interaction, page, screenWidth, screenHeight) {
    const results = [];
    const functionCalls = interaction.steps.filter(step => step.type === "function_call");

    for (const functionCall of functionCalls) {
        const actionResult = {};
        const fname = functionCall.name;
        const args = functionCall.arguments;
        console.log(`  -> Executing: ${fname} (Intent: ${args.intent || 'N/A'})`);

        try {
            if (fname === "open_web_browser" || fname === "open_app") {
                // Handled / already open
            } else if (["click", "click_at", "double_click", "triple_click", "middle_click", "right_click", "move", "long_press"].includes(fname)) {
                const actualX = denormalizeX(args.x, screenWidth);
                const actualY = denormalizeY(args.y, screenHeight);

                if (fname === "click" || fname === "click_at") {
                    await page.mouse.click(actualX, actualY);
                } else if (fname === "double_click") {
                    await page.mouse.dblclick(actualX, actualY);
                } else if (fname === "right_click") {
                    await page.mouse.click(actualX, actualY, { button: "right" });
                } else if (fname === "middle_click") {
                    await page.mouse.click(actualX, actualY, { button: "middle" });
                } else if (fname === "move") {
                    await page.mouse.move(actualX, actualY);
                }
            } else if (fname === "type" || fname === "type_text_at") {
                const actualX = args.x !== undefined ? denormalizeX(args.x, screenWidth) : null;
                const actualY = args.y !== undefined ? denormalizeY(args.y, screenHeight) : null;
                const text = args.text;
                const pressEnter = args.press_enter || false;

                if (actualX !== null && actualY !== null) {
                    await page.mouse.click(actualX, actualY);
                }
                // Clear field first
                await page.keyboard.press("Meta+A");
                await page.keyboard.press("Backspace");
                await page.keyboard.type(text);
                if (pressEnter) {
                    await page.keyboard.press("Enter");
                }
            } else if (fname === "navigate") {
                await page.goto(args.url);
            } else if (fname === "go_back") {
                await page.goBack();
            } else if (fname === "go_forward") {
                await page.goForward();
            } else if (fname === "wait") {
                await new Promise(resolve => setTimeout(resolve, (args.seconds || 1) * 1000));
            } else {
                console.log(`Warning: Custom or unhandled function ${fname}`);
            }

            await page.waitForLoadState('load', { timeout: 5000 }).catch(() => {});
            await new Promise(resolve => setTimeout(resolve, 1000));
        } catch (e) {
            console.log(`Error executing ${fname}: ${e}`);
            actionResult.error = e.message;
        }

        results.push([fname, functionCall.id, actionResult]);
    }

    return results;
}

4. Comprendre l'état du nouvel environnement

Après avoir exécuté les actions, renvoyez le résultat de l'exécution de la fonction au modèle afin qu'il puisse utiliser ces informations pour générer l'action suivante. Si plusieurs actions (appels parallèles) ont été exécutées, vous devez envoyer un function_result pour chacune d'elles lors du tour de l'utilisateur suivant.

Python

import json
import base64

def get_function_responses(page, results):
    screenshot_bytes = page.screenshot(type="png")
    current_url = page.url
    function_responses = []
    for name, call_id, result in results:
        function_responses.append({
            "type": "function_result",
            "name": name,
            "call_id": call_id,
            "result": [
                {
                    "type": "text",
                    "text": json.dumps({"url": current_url, **result})
                },
                {
                    "type": "image",
                    "data": base64.b64encode(screenshot_bytes).decode("utf-8"),
                    "mime_type": "image/png"
                }
            ]
        })
    return function_responses

JavaScript

async function getFunctionResponses(page, results) {
    const screenshotBuffer = await page.screenshot({ type: 'png' });
    const screenshotBase64 = screenshotBuffer.toString('base64');
    const currentUrl = page.url();
    const functionResponses = [];

    for (const [name, callId, result] of results) {
        functionResponses.push({
            type: "function_result",
            name: name,
            call_id: callId,
            result: [
                {
                    type: "text",
                    text: JSON.stringify({ url: currentUrl, ...result })
                },
                {
                    type: "image",
                    data: screenshotBase64,
                    mime_type: "image/png"
                }
            ]
        });
    }
    return functionResponses;
}

Une fois que vous avez défini comment capturer et mettre en forme l'état de l'environnement, vous pouvez combiner toutes ces étapes dans une boucle d'exécution continue.

Créer une boucle d'agent

Pour activer les interactions en plusieurs étapes, combinez les quatre étapes de la section Implémenter l'utilisation de l'ordinateur en une seule boucle. Cette boucle continue de demander des actions et de renvoyer les résultats au modèle jusqu'à ce que la tâche soit terminée.

N'oubliez pas de gérer correctement l'historique des conversations en ajoutant les réponses du modèle et les réponses de vos fonctions à l'historique à chaque étape.

Python

import time
from typing import Any, List, Tuple
from playwright.sync_api import sync_playwright

from google import genai

client = genai.Client()

# Constants for screen dimensions
SCREEN_WIDTH = 1440
SCREEN_HEIGHT = 900

# Setup Playwright
print("Initializing browser...")
playwright = sync_playwright().start()
browser = playwright.chromium.launch(headless=False)
context = browser.new_context(viewport={"width": SCREEN_WIDTH, "height": SCREEN_HEIGHT})
page = context.new_page()

# Define helper functions. Copy/paste from steps 3 and 4
# def denormalize_x(...)
# def denormalize_y(...)
# def execute_function_calls(...)
# def get_function_responses(...)

try:
    # Go to initial page
    page.goto("https://ai.google.dev/gemini-api/docs")

    # Take initial screenshot
    initial_screenshot = page.screenshot(type="png")
    USER_PROMPT = "Go to ai.google.dev/gemini-api/docs and search for pricing."
    print(f"Goal: {USER_PROMPT}")

    # First interaction
    interaction = client.interactions.create(
        model='gemini-3.5-flash',
        input=[
            {"type": "text", "text": USER_PROMPT},
            {"type": "image", "data": base64.b64encode(initial_screenshot).decode("utf-8"), "mime_type": "image/png"}
        ],
        tools=[{
            "type": "computer_use",
            "environment": "browser",
            "enable_prompt_injection_detection": True
        }]
    )

    # Agent Loop
    turn_limit = 5
    for i in range(turn_limit):
        print(f"\n--- Turn {i+1} ---")

        has_function_calls = any(
            step.type == "function_call"
            for step in interaction.steps
        )
        if not has_function_calls:
            text_response = " ".join([
                content_block.text for step in interaction.steps if step.type == "model_output"
                for content_block in step.content if content_block.type == "text"
            ])
            print("Agent finished:", text_response)
            break

        print("Executing actions...")
        results = execute_function_calls(interaction, page, SCREEN_WIDTH, SCREEN_HEIGHT)

        print("Capturing state...")
        function_responses = get_function_responses(page, results)

        # Continue conversation with function responses
        interaction = client.interactions.create(
            model='gemini-3.5-flash',
            previous_interaction_id=interaction.id,
            input=function_responses,
            tools=[{
                "type": "computer_use",
                "environment": "browser",
                "enable_prompt_injection_detection": True
            }]
        )

finally:
    # Cleanup
    print("\nClosing browser...")
    browser.close()
    playwright.stop()

JavaScript

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

const ai = new GoogleGenAI();

// Constants for screen dimensions
const SCREEN_WIDTH = 1440;
const SCREEN_HEIGHT = 900;

console.log("Initializing browser...");
const browser = await chromium.launch({ headless: false });
const context = await browser.newContext({
    viewport: { width: SCREEN_WIDTH, height: SCREEN_HEIGHT }
});
const page = await context.newPage();

// Define helper functions. Copy/paste from steps 3 and 4:
// function denormalizeX(...)
// function denormalizeY(...)
// async function executeFunctionCalls(...)
// async function getFunctionResponses(...)

try {
    // Go to initial page
    await page.goto("https://ai.google.dev/gemini-api/docs");

    // Take initial screenshot
    const initialScreenshotBuffer = await page.screenshot({ type: 'png' });
    const initialScreenshotBase64 = initialScreenshotBuffer.toString('base64');
    const USER_PROMPT = "Go to ai.google.dev/gemini-api/docs and search for pricing.";
    console.log(`Goal: ${USER_PROMPT}`);

    // First interaction
    let interaction = await ai.interactions.create({
        model: 'gemini-3.5-flash',
        input: [
            { type: 'text', text: USER_PROMPT },
            { type: 'image', data: initialScreenshotBase64, mime_type: 'image/png' }
        ],
        tools: [{
            type: 'computer_use',
            environment: 'browser',
            enable_prompt_injection_detection: true
        }]
    });

    // Agent Loop
    const turnLimit = 5;
    for (let i = 0; i < turnLimit; i++) {
        console.log(`\n--- Turn ${i + 1} ---`);

        const hasFunctionCalls = interaction.steps.some(step => step.type === "function_call");
        if (!hasFunctionCalls) {
            const textResponses = [];
            for (const step of interaction.steps) {
                if (step.type === "model_output") {
                    for (const contentBlock of step.content || []) {
                        if (contentBlock.type === "text") {
                            textResponses.push(contentBlock.text);
                        }
                    }
                }
            }
            console.log("Agent finished:", textResponses.join(" "));
            break;
        }

        console.log("Executing actions...");
        const results = await executeFunctionCalls(interaction, page, SCREEN_WIDTH, SCREEN_HEIGHT);

        console.log("Capturing state...");
        const functionResponses = await getFunctionResponses(page, results);

        // Continue conversation with function responses
        interaction = await ai.interactions.create({
            model: 'gemini-3.5-flash',
            previous_interaction_id: interaction.id,
            input: functionResponses,
            tools: [{
                type: 'computer_use',
                environment: 'browser',
                enable_prompt_injection_detection: true
            }]
        });
    }
} finally {
    // Cleanup
    console.log("\nClosing browser...");
    await browser.close();
}

Environnements compatibles (Gemini 3.5 Flash)

Gemini 3.5 Flash est compatible avec trois environnements spécifiés dans les configurations computer_use :

Environnement de navigateur (ENVIRONMENT_BROWSER)

Actions disponibles dans l'outil de navigateur :

Nom de la commande Description Arguments (dans l'appel de fonction)
click Clic gauche aux coordonnées. y : int (0-999)
x : int (0-999)
intent : str
double_click Double-cliquez sur la coordonnée. y : int (0-999)
x : int (0-999)
intent : str
triple_click Effectue un triple clic aux coordonnées. y : int (0-999)
x : int (0-999)
intent : str
middle_click Effectuez un clic du milieu sur les coordonnées. y : int (0-999)
x : int (0-999)
intent : str
right_click Clics droits aux coordonnées. y : int (0-999)
x : int (0-999)
intent : str
mouse_down Appuie de manière prolongée sur le bouton de la souris aux coordonnées indiquées. y : int (0-999)
x : int (0-999)
intent : str
mouse_up Relâche le bouton de la souris aux coordonnées. y : int (0-999)
x : int (0-999)
intent : str
move Déplace le curseur à la position spécifiée. y : int (0-999)
x : int (0-999)
intent : str
type Saisit du texte. text : str
press_enter : bool (facultatif, valeur par défaut : false)
intent : str
drag_and_drop Fait glisser un élément de la coordonnée de début à la coordonnée de fin. start_y : int (0-999)
start_x : int (0-999)
end_y : int (0-999)
end_x : int (0-999)
intent : str
wait Met en pause l'exécution pendant un nombre de secondes spécifié. seconds : int (facultatif, 1 par défaut)
intent : str
press_key Appuie sur la touche spécifiée et la relâche. key : str
intent : str
key_down Appuie sur la touche spécifiée et la maintient enfoncée. key : str
intent : str
key_up Libère la clé spécifiée. key : str
intent : str
Touche d'accès Appuie sur la combinaison de touches spécifiée. keys : List[str]
intent : str
take_screenshot Renvoie une capture d'écran de l'écran actuel. intent : str
scroll Fait défiler l'écran vers le haut, le bas, la gauche ou la droite d'une distance en pixels à une coordonnée. y : int (0-999)
x : int (0-999)
direction : str ("up", "down", "left", "right")
magnitude_in_pixels : int (0-999, facultatif, valeur par défaut : 300)
intent : str
go_back Revenez à la page Web précédente de l'historique du navigateur. intent : str
navigate Accède directement à une URL spécifiée. url : str
intent : str
go_forward Accède à la page Web suivante dans l'historique du navigateur. intent : str

Environnement mobile (ENVIRONMENT_MOBILE)

Actions de l'environnement optimisé pour Android :

Nom de la commande Description Arguments (dans l'appel de fonction)
open_app Ouvre une application par son nom. app_name : str
intent : str
click Clic gauche aux coordonnées. y : int (0-999)
x : int (0-999)
intent : str
list_apps Liste les applications disponibles sur l'appareil, en renvoyant leurs noms et noms de packages. intent : str
wait Met en pause l'exécution pendant un nombre de secondes spécifié. seconds : int (facultatif, 1 par défaut)
intent : str
go_back Retourne à l'écran ou à la page Web précédents. intent : str
type Saisit du texte. text : str
press_enter : bool (facultatif, valeur par défaut : false)
intent : str
drag_and_drop Fait glisser un élément de la coordonnée de début à la coordonnée de fin. start_y : int (0-999)
start_x : int (0-999)
end_y : int (0-999)
end_x : int (0-999)
intent : str
long_press Effectue un appui prolongé à une coordonnée sur l'écran. y : int (0-999)
x : int (0-999)
seconds : int (facultatif, valeur par défaut : 2)
intent : str
press_key Appuie sur la touche spécifiée et la relâche. key : str
intent : str
take_screenshot Renvoie une capture d'écran de l'écran actuel. intent : str

Environnement de bureau (ENVIRONMENT_DESKTOP)

Commandes de curseur au niveau de l'OS pour les environnements de bureau :

Nom de la commande Description Arguments (dans l'appel de fonction)
click Clic gauche aux coordonnées. y : int (0-999)
x : int (0-999)
intent : str
double_click Double-cliquez sur la coordonnée. y : int (0-999)
x : int (0-999)
intent : str
triple_click Effectue un triple clic aux coordonnées. y : int (0-999)
x : int (0-999)
intent : str
middle_click Effectuez un clic du milieu sur les coordonnées. y : int (0-999)
x : int (0-999)
intent : str
right_click Clics droits aux coordonnées. y : int (0-999)
x : int (0-999)
intent : str
mouse_down Appuie de manière prolongée sur le bouton de la souris aux coordonnées indiquées. y : int (0-999)
x : int (0-999)
intent : str
mouse_up Relâche le bouton de la souris aux coordonnées. y : int (0-999)
x : int (0-999)
intent : str
move Déplace le curseur à la position spécifiée. y : int (0-999)
x : int (0-999)
intent : str
type Saisit du texte. text : str
press_enter : bool (facultatif, valeur par défaut : false)
intent : str
drag_and_drop Fait glisser un élément de la coordonnée de début à la coordonnée de fin. start_y : int (0-999)
start_x : int (0-999)
end_y : int (0-999)
end_x : int (0-999)
intent : str
wait Met en pause l'exécution pendant un nombre de secondes spécifié. seconds : int (facultatif, 1 par défaut)
intent : str
press_key Appuie sur la touche spécifiée et la relâche. key : str
intent : str
key_down Appuie sur la touche spécifiée et la maintient enfoncée. key : str
intent : str
key_up Libère la clé spécifiée. key : str
intent : str
Touche d'accès Appuie sur la combinaison de touches spécifiée. keys : List[str]
intent : str
take_screenshot Renvoie une capture d'écran de l'écran actuel. intent : str
scroll Fait défiler l'écran vers le haut, le bas, la gauche ou la droite d'une distance en pixels à une coordonnée. y : int (0-999)
x : int (0-999)
direction : str ("up", "down", "left", "right")
magnitude_in_pixels : int (0-999, facultatif, valeur par défaut : 300)
intent : str

Anciennes actions d'interface utilisateur compatibles (Gemini 2.5)

Pour les anciens modèles (gemini-2.5-computer-use-preview-10-2025), les actions suivantes sont acceptées :

Nom de la commande Description Arguments (dans l'appel de fonction) Exemple d'appel de fonction
open_web_browser Ouvre le navigateur Web. Aucun {"name": "open_web_browser", "arguments": {}}
wait_5_seconds Met l'exécution en pause pendant cinq secondes. Aucun {"name": "wait_5_seconds", "arguments": {}}
go_back Accède à la page précédente de l'historique. Aucun {"name": "go_back", "arguments": {}}
go_forward Accède à la page suivante de l'historique. Aucun {"name": "go_forward", "arguments": {}}
search Accède au moteur de recherche par défaut. Aucun {"name": "search", "arguments": {}}
navigate Le navigateur accède directement à l'URL spécifiée. url : str {"name": "navigate", "arguments": {"url": "https://www.wikipedia.org"}}
click_at Clics à une coordonnée spécifique. y : int (0-999), x : int (0-999) {"name": "click_at", "arguments": {"y": 300, "x": 500}}
hover_at Pointez sur une coordonnée spécifique. y : int (0-999), x : int (0-999) {"name": "hover_at", "arguments": {"y": 150, "x": 250}}
type_text_at Saisit du texte à une coordonnée. y : int (0-999), x : int (0-999), text : str, press_enter : bool (facultatif, True par défaut), clear_before_typing : bool (facultatif, True par défaut) {"name": "type_text_at", "arguments": {"y": 250, "x": 400, "text": "search", "press_enter": false}}
key_combination Appuyez sur des touches ou des combinaisons de touches. keys : str {"name": "key_combination", "arguments": {"keys": "Control+A"}}
scroll_document Fait défiler l'intégralité de la page Web. direction : str {"name": "scroll_document", "arguments": {"direction": "down"}}
scroll_at Fait défiler la page aux coordonnées (x,y). y : int, x : int, direction : str, magnitude : int (facultatif, valeur par défaut : 800) {"name": "scroll_at", "arguments": {"y": 500, "x": 500, "direction": "down"}}
drag_and_drop Fait glisser l'écran entre deux coordonnées. y : int, x : int, destination_y : int, destination_x : int {"name": "drag_and_drop", "arguments": {"y": 100, "destination_y": 500, "destination_x": 500, "x": 100}}

Fonctions définies par l'utilisateur personnalisées

Vous pouvez étendre les fonctionnalités du modèle en incluant des fonctions personnalisées définies par l'utilisateur. Par exemple, dans les scénarios human-in-the-loop (HITL), vous pouvez exclure les actions prédéfinies par défaut et enregistrer des actions personnalisées.

Outils personnalisés Gemini 3.5 Flash

Python

Excluez les actions de navigateur prédéfinies standards (telles que click) et enregistrez un outil yield_to_user personnalisé :

from google import genai

client = genai.Client()

yield_to_user_tool = {
    "type": "function",
    "name": "yield_to_user",
    "description": "Yields control back to the user for assistance or verification when an automated action is unsafe or ambiguous.",
    "parameters": {
        "type": "object",
        "properties": {
            "reason": {
                "type": "string",
                "description": "The reason why the agent is yielding control to the human."
            }
        },
        "required": ["reason"]
    }
}

interaction = client.interactions.create(
    model="gemini-3.5-flash",
    input="Click the submit button. If you need a second factor authentication code, ask me.",
    tools=[
        {
            "type": "computer_use",
            "environment": "mobile",
            "excluded_predefined_functions": ["click"]
        },
        yield_to_user_tool
    ]
)

JavaScript

Excluez les actions de navigateur prédéfinies standards (telles que click) et enregistrez un outil yield_to_user personnalisé :

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

const ai = new GoogleGenAI();

const yieldToUserTool = {
    type: "function",
    name: "yield_to_user",
    description: "Yields control back to the user for assistance or verification when an automated action is unsafe or ambiguous.",
    parameters: {
        type: "object",
        properties: {
            reason: {
                type: "string",
                description: "The reason why the agent is yielding control to the human."
            }
        },
        required: ["reason"]
    }
};

const interaction = await ai.interactions.create({
    model: "gemini-3.5-flash",
    input: "Click the submit button. If you need a second factor authentication code, ask me.",
    tools: [
        {
            type: "computer_use",
            environment: "mobile",
            excluded_predefined_functions: ["click"]
        },
        yieldToUserTool
    ]
});

Outils personnalisés Gemini 2.5 (ancienne version)

Python

from google import genai

client = genai.Client()

# Define custom tools here
custom_functions = [...]  # Describe parameters as function declarations

excluded_functions = [
    "open_web_browser",
    "wait_5_seconds",
    "go_back",
    "go_forward",
    "search",
    "navigate",
    "hover_at",
    "scroll_document",
    "key_combination",
    "drag_and_drop",
]

interaction = client.interactions.create(
    model='gemini-2.5-computer-use-preview-10-2025',
    input="Open Chrome, then long-press at 200,400.",
    tools=[
        {
            "type": "computer_use",
            "environment": "browser",
            "excluded_predefined_functions": excluded_functions
        },
        *custom_functions
    ]
)

print(interaction)

JavaScript

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

const ai = new GoogleGenAI();

// Define custom tools here
const customFunctions = [...]; // Describe parameters as function declarations

const excludedFunctions = [
    "open_web_browser",
    "wait_5_seconds",
    "go_back",
    "go_forward",
    "search",
    "navigate",
    "hover_at",
    "scroll_document",
    "key_combination",
    "drag_and_drop",
];

const interaction = await ai.interactions.create({
    model: 'gemini-2.5-computer-use-preview-10-2025',
    input: "Open Chrome, then long-press at 200,400.",
    tools: [
        {
            type: "computer_use",
            environment: "browser",
            excluded_predefined_functions: excludedFunctions
        },
        ...customFunctions
    ]
});

console.log(interaction);

Gérer les niveaux de réflexion (Gemini 3.5 Flash)

Pour les agents d'utilisation de l'ordinateur, vous pouvez configurer différents niveaux de réflexion pour équilibrer la qualité de l'action et la vitesse d'exécution. Les niveaux de réflexion inférieurs permettent généralement d'atteindre un bon équilibre pour les tâches d'automatisation standards.

Protection et sécurité

Configurer des règles de sécurité (Gemini 3.5 Flash)

Le modèle Gemini 3.5 Flash inclut des catégories de services de sécurité intégrées qui déterminent automatiquement si une confirmation de l'utilisateur est requise.

Catégorie de règles de sécurité Description
FINANCIAL_TRANSACTIONS Bloque ou déclenche une confirmation pour les actions impliquant des paiements, des paiements en magasin ou des produits réglementés.
SENSITIVE_DATA_MODIFICATION Protège les dossiers de santé, financiers ou gouvernementaux contre toute modification non autorisée.
COMMUNICATION_TOOL Empêche l'agent d'envoyer des e-mails, des messages de chat ou des brouillons de manière autonome.
ACCOUNT_CREATION Empêche l'agent d'enregistrer de nouveaux comptes de manière autonome sur les sites Web.
DATA_MODIFICATION Réglemente les modifications globales du système de fichiers, le partage de données et la suppression du stockage.
USER_CONSENT_MANAGEMENT Nécessite une prise de contrôle par l'utilisateur pour les bannières de consentement aux cookies et les invites de confidentialité.
LEGAL_TERMS_AND_AGREEMENTS Empêche le modèle d'accepter de manière autonome les conditions d'utilisation ou les contrats juridiquement contraignants.

Remplacements de sécurité

Vous pouvez remplacer certaines règles en transmettant des remplacements :

Python

from google import genai

client = genai.Client()

interaction = client.interactions.create(
    model="gemini-3.5-flash",
    input="Clean up the local folder by archiving old logs.",
    tools=[
        {
            "type": "computer_use",
            "environment": "desktop",
            "safety_policy_overrides": [
                {"category": "DATA_MODIFICATION"}
            ]
        }
    ]
)

JavaScript

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

const ai = new GoogleGenAI();

const interaction = await ai.interactions.create({
    model: "gemini-3.5-flash",
    input: "Clean up the local folder by archiving old logs.",
    tools: [
        {
            type: "computer_use",
            environment: "desktop",
            safety_policy_overrides: [
                { category: "DATA_MODIFICATION" }
            ]
        }
    ]
});

Détection de l'injection de prompt (Gemini 3.5 Flash)

Mécanisme de sécurité optionnel qui analyse les pixels des captures d'écran pour détecter les instructions de prompt hostile cachées (par exemple, "Ignore les commandes précédentes") et bloque l'exécution lorsqu'elles sont détectées.

Confirmer une décision de sécurité (ancienne version de Gemini 2.5)

Pour les anciens modèles, la réponse peut inclure un paramètre safety_decision :

{
  "steps": [
    {
      "type": "function_call",
      "name": "click_at",
      "arguments": {
        "x": 60,
        "y": 100,
        "safety_decision": {
          "explanation": "Must check check-box",
          "decision": "require_confirmation"
        }
      }
    }
  ]
}

Si safety_decision est défini sur require_confirmation, invitez l'utilisateur final. Si l'utilisateur confirme, définissez safety_acknowledgement dans function_result.

Python

def get_safety_confirmation(safety_decision):
    # Prompt user
    return "CONTINUE" # Or TERMINATE

# Inside execute_function_calls:
if 'safety_decision' in function_call.arguments:
    decision = get_safety_confirmation(function_call.arguments['safety_decision'])
    if decision == "TERMINATE":
        break
    extra_fr_fields["safety_acknowledgement"] = True

Bonnes pratiques concernant la sécurité

L'utilisation de l'ordinateur présente des risques uniques en termes de sécurité et d'opérations, car un modèle agissant au nom d'un utilisateur peut rencontrer du contenu non fiable à l'écran ou commettre des erreurs lors de l'exécution d'actions. Appliquez les bonnes pratiques suivantes pour protéger les données et les systèmes des utilisateurs :

  1. Human-in-the-loop (avec intervention humaine, HITL) :

    • Exigez la confirmation de l'utilisateur : lorsque la réponse de sécurité indique require_confirmation (ou que l'ancienne décision de sécurité l'exige), demandez l'approbation de l'utilisateur.
    • Fournissez des instructions de sécurité personnalisées : implémentez une instruction système personnalisée pour définir et appliquer vos propres limites de sécurité. Exemple :

      Python

      from google import genai
      
      client = genai.Client()
      
      system_instruction = """
      ## **RULE 1: Seek User Confirmation (USER_CONFIRMATION)**
      
      This is your first and most important check. If the next required action falls
      into any of the following categories, you MUST stop immediately, and seek the
      user's explicit permission.
      
      **Procedure for Seeking Confirmation:**
      * **For Consequential Actions:** Perform all preparatory steps (e.g., navigating,
        filling out forms, typing a message). You will ask for confirmation **AFTER**
        all necessary information is entered on the screen, but **BEFORE** you perform
        the final, irreversible action (e.g., before clicking "Send", "Submit",
        "Confirm Purchase", "Share").
      * **For Prohibited Actions:** If the action is strictly forbidden (e.g., accepting
        legal terms, solving a CAPTCHA), you must first inform the user about the
        required action and ask for their confirmation to proceed.
      
      **USER_CONFIRMATION Categories:**
      
      *   **Consent and Agreements:** You are FORBIDDEN from accepting, selecting, or
          agreeing to any of the following on the user's behalf. You must ask the
          user to confirm before performing these actions.
          *   Terms of Service
          *   Privacy Policies
          *   Cookie consent banners
          *   End User License Agreements (EULAs)
          *   Any other legally significant contracts or agreements.
      *   **Robot Detection:** You MUST NEVER attempt to solve or bypass the
          following. You must ask the user to confirm before performing these actions.
          *   CAPTCHAs (of any kind)
          *   Any other anti-robot or human-verification mechanisms, even if you are
              capable.
      *   **Financial Transactions:**
          *   Completing any purchase.
          *   Managing or moving money (e.g., transfers, payments).
          *   Purchasing regulated goods or participating in gambling.
      *   **Sending Communications:**
          *   Sending emails.
          *   Sending messages on any platform (e.g., social media, chat apps).
          *   Posting content on social media or forums.
      *   **Accessing or Modifying Sensitive Information:**
          *   Health, financial, or government records (e.g., medical history, tax
              forms, passport status).
          *   Revealing or modifying sensitive personal identifiers (e.g., SSN, bank
              account number, credit card number).
      *   **User Data Management:**
          *   Accessing, downloading, or saving files from the web.
          *   Sharing or sending files/data to any third party.
          *   Transferring user data between systems.
      *   **Browser Data Usage:**
          *   Accessing or managing Chrome browsing history, bookmarks, autofill data,
              or saved passwords.
      *   **Security and Identity:**
          *   Logging into any user account.
          *   Any action that involves misrepresentation or impersonation (e.g.,
              creating a fan account, posting as someone else).
      *   **Insurmountable Obstacles:** If you are technically unable to interact with
          a user interface element or are stuck in a loop you cannot resolve, ask the
          user to take over.
      ---
      
      ## **RULE 2: Default Behavior (ACTUATE)**
      
      If an action does **NOT** fall under the conditions for `USER_CONFIRMATION`,
      your default behavior is to **Actuate**.
      
      **Actuation Means:**  You MUST proactively perform all necessary steps to move
      the user's request forward. Continue to actuate until you either complete the
      non-consequential task or encounter a condition defined in Rule 1.
      
      *   **Example 1:** If asked to send money, you will navigate to the payment
          portal, enter the recipient's details, and enter the amount. You will then
          **STOP** as per Rule 1 and ask for confirmation before clicking the final
          "Send" button.
      *   **Example 2:** If asked to post a message, you will navigate to the site,
          open the post composition window, and write the full message. You will then
          **STOP** as per Rule 1 and ask for confirmation before clicking the final
          "Post" button.
      
          After the user has confirmed, remember to get the user's latest screen
          before continuing to perform actions.
      
      # Final Response Guidelines:
      Write final response to the user in the following cases:
      - User confirmation
      - When the task is complete or you have enough information to respond to the user
      """
      
      interaction = client.interactions.create(
          model="gemini-3.5-flash",
          system_instruction=system_instruction,
          input="Prepare a draft but do not send.",
          tools=[{
              "type": "computer_use",
              "environment": "browser"
          }]
      )
      

      JavaScript

      import { GoogleGenAI } from '@google/genai';
      
      const ai = new GoogleGenAI();
      
      const systemInstruction = `
      ## **RULE 1: Seek User Confirmation (USER_CONFIRMATION)**
      
      This is your first and most important check. If the next required action falls
      into any of the following categories, you MUST stop immediately, and seek the
      user's explicit permission.
      
      **Procedure for Seeking Confirmation:**
      * **For Consequential Actions:** Perform all preparatory steps (e.g., navigating,
        filling out forms, typing a message). You will ask for confirmation **AFTER**
        all necessary information is entered on the screen, but **BEFORE** you perform
        the final, irreversible action (e.g., before clicking "Send", "Submit",
        "Confirm Purchase", "Share").
      * **For Prohibited Actions:** If the action is strictly forbidden (e.g., accepting
        legal terms, solving a CAPTCHA), you must first inform the user about the
        required action and ask for their confirmation to proceed.
      
      **USER_CONFIRMATION Categories:**
      
      *   **Consent and Agreements:** You are FORBIDDEN from accepting, selecting, or
          agreeing to any of the following on the user's behalf. You must ask the
          user to confirm before performing these actions.
          *   Terms of Service
          *   Privacy Policies
          *   Cookie consent banners
          *   End User License Agreements (EULAs)
          *   Any other legally significant contracts or agreements.
      *   **Robot Detection:** You MUST NEVER attempt to solve or bypass the
          following. You must ask the user to confirm before performing these actions.
          *   CAPTCHAs (of any kind)
          *   Any other anti-robot or human-verification mechanisms, even if you are
              capable.
      *   **Financial Transactions:**
          *   Completing any purchase.
          *   Managing or moving money (e.g., transfers, payments).
          *   Purchasing regulated goods or participating in gambling.
      *   **Sending Communications:**
          *   Sending emails.
          *   Sending messages on any platform (e.g., social media, chat apps).
          *   Posting content on social media or forums.
      *   **Accessing or Modifying Sensitive Information:**
          *   Health, financial, or government records (e.g., medical history, tax
              forms, passport status).
          *   Revealing or modifying sensitive personal identifiers (e.g., SSN, bank
              account number, credit card number).
      *   **User Data Management:**
          *   Accessing, downloading, or saving files from the web.
          *   Sharing or sending files/data to any third party.
          *   Transferring user data between systems.
      *   **Browser Data Usage:**
          *   Accessing or managing Chrome browsing history, bookmarks, autofill data,
              or saved passwords.
      *   **Security and Identity:**
          *   Logging into any user account.
          *   Any action that involves misrepresentation or impersonation (e.g.,
              creating a fan account, posting as someone else).
      *   **Insurmountable Obstacles:** If you are technically unable to interact with
          a user interface element or are stuck in a loop you cannot resolve, ask the
          user to take over.
      ---
      
      ## **RULE 2: Default Behavior (ACTUATE)**
      
      If an action does **NOT** fall under the conditions for `USER_CONFIRMATION`,
      your default behavior is to **Actuate**.
      
      **Actuation Means:**  You MUST proactively perform all necessary steps to move
      the user's request forward. Continue to actuate until you either complete the
      non-consequential task or encounter a condition defined in Rule 1.
      
      *   **Example 1:** If asked to send money, you will navigate to the payment
          portal, enter the recipient's details, and enter the amount. You will then
          **STOP** as per Rule 1 and ask for confirmation before clicking the final
          "Send" button.
      *   **Example 2:** If asked to post a message, you will navigate to the site,
          open the post composition window, and write the full message. You will then
          **STOP** as per Rule 1 and ask for confirmation before clicking the final
          "Post" button.
      
          After the user has confirmed, remember to get the user's latest screen
          before continuing to perform actions.
      
      # Final Response Guidelines:
      Write final response to the user in the following cases:
      - User confirmation
      - When the task is complete or you have enough information to respond to the user
      `;
      
      const interaction = await ai.interactions.create({
          model: "gemini-3.5-flash",
          system_instruction: systemInstruction,
          input: "Prepare a draft but do not send.",
          tools: [{
              type: "computer_use",
              environment: "browser"
          }]
      });
      
  2. Environnement d'exécution sécurisé : exécutez votre agent dans un environnement sécurisé de type bac à sable pour limiter son impact potentiel. Il peut s'agir d'une machine virtuelle (VM) sandboxée, d'un conteneur (par exemple, Docker) ou d'un profil de navigateur dédié avec des autorisations limitées. Consultez l'implémentation de référence GitHub pour obtenir des conseils sur la configuration du bac à sable à l'aide de Docker.

  3. Assainissement des entrées : assainissez tout le texte généré par les utilisateurs dans les prompts pour réduire le risque d'instructions non souhaitées ou d'injection de prompts. Il s'agit d'une couche de sécurité utile, mais elle ne remplace pas un environnement d'exécution sécurisé.

  4. Garde-fous pour le contenu : utilisez des garde-fous et des API de sécurité du contenu pour évaluer la pertinence des entrées utilisateur, des entrées et sorties d'outils, et des réponses de l'agent, ainsi que pour détecter les injections de prompt et les tentatives de jailbreak.

  5. Listes d'autorisation et de blocage : implémentez des mécanismes de filtrage pour contrôler les sites que le modèle peut consulter et les actions qu'il peut effectuer. Une liste de blocage des sites Web interdits constitue un bon point de départ, tandis qu'une liste d'autorisation plus restrictive est encore plus sécurisée.

  6. Observabilité et journalisation : conservez des journaux détaillés pour le débogage, l'audit et la réponse aux incidents. Votre client doit consigner les requêtes, les captures d'écran, les actions suggérées par le modèle (function_call), les réponses de sécurité et toutes les actions finalement exécutées par le client.

  7. Gestion de l'environnement : assurez-vous que l'environnement de l'interface utilisateur graphique est cohérent. Les pop-ups, les notifications ou les modifications de mise en page inattendus peuvent dérouter le modèle. Si possible, commencez chaque nouvelle tâche à partir d'un état propre et connu.

Versions de modèle

Vous pouvez utiliser l'utilisation de l'ordinateur avec les modèles suivants :

  • Gemini 3.5 Flash (gemini-3.5-flash) : modèle recommandé pour l'utilisation sur ordinateur, avec des actions simplifiées avec des intentions, la compatibilité avec les environnements de navigateur, mobile et de bureau, des règles de sécurité configurables et la détection de l'injection d'invite.
  • Preview Gemini 3 Flash (gemini-3-flash-preview) : modèle en preview compatible avec l'utilisation d'un ordinateur.
  • Gemini 2.5 (preview ancienne) (gemini-2.5-computer-use-preview-10-2025) : modèle de preview ancienne optimisé pour une utilisation sur ordinateur dans un navigateur.

Étape suivante