Utilisation d'un ordinateur

L'outil d'utilisation de l'ordinateur de Gemini vous permet de créer des agents de contrôle pour navigateur, mobile et ordinateur qui interagissent avec les interfaces utilisateur graphiques (IUG) et automatisent les tâches. Lorsque l'utilisation de l'ordinateur est activée, le modèle utilise des captures d'écran pour observer l'écran et agir en générant des actions d'interface utilisateur spécifiques, telles que des clics de souris, des défilements et des entrées au clavier.

Gemini est compatible avec plusieurs fonctionnalités avancées d'utilisation de l'ordinateur :

  • Compatibilité multi-environnement : créez des agents pour les environnements de navigateur, mobiles et de bureau.
  • Actions simplifiées avec des intents : les actions incluent un champ intent expliquant le raisonnement du modèle derrière chaque étape.
  • Règles de sécurité configurables : affinez le comportement de sécurité grâce à des catégories de règles et des forçages intégrés.
  • Détection d'injection de prompt : analyse des captures d'écran (sur activation) pour détecter les instructions contradictoires cachées.

Vous pouvez utiliser l'utilisation de l'ordinateur pour créer des agents capables de :

  • Automatisez la saisie répétitive de données ou le remplissage de formulaires sur les sites Web et dans les applications de bureau.
  • Effectuez des tests automatisés des parcours utilisateur sur le Web, sur mobile et sur ordinateur.
  • Parcourir des sites Web et des applications pour recueillir des informations (par exemple, comparer des informations produit, des prix et des avis)
  • Aider les utilisateurs en effectuant des séquences d'actions en plusieurs étapes dans différentes applications.

Ce guide couvre les points suivants :

Comme pour l'appel de fonction, vous devez écrire le code de l'application côté client pour recevoir l'appel de fonction d'utilisation de l'ordinateur et exécuter les actions correspondantes.

Ce guide part du principe que vous utilisez le SDK Google Gen AI pour Python et que vous connaissez l'API Playwright.

Vous trouverez l'implémentation de référence pour l'utilisation de l'ordinateur sur GitHub.

Modèles compatibles

L'utilisation de l'ordinateur est compatible avec les modèles suivants :

Cliquez pour développer la liste des modèles compatibles

Fonctionnement de l'utilisation de l'ordinateur

Au lieu de générer des réponses textuelles, l'utilisation de l'ordinateur détermine quand effectuer des actions d'UI spécifiques, comme des clics de souris, et renvoie les paramètres nécessaires pour exécuter ces actions. Vous devez écrire le code de l'application côté client pour recevoir l'function_call d'utilisation de l'ordinateur et exécuter les actions correspondantes.

Les interactions d'utilisation de l'ordinateur suivent un processus de boucle agentique :

  1. Envoyer une requête au modèle

    • Ajoutez l'utilisation de l'ordinateur (et éventuellement d'autres outils) à votre requête API.
    • Envoyez une requête au modèle avec la demande de l'utilisateur et une capture d'écran représentant l'état actuel de l'IUG.
  2. Recevoir la réponse du modèle

    • Le modèle analyse la requête de l'utilisateur et la capture d'écran, puis génère une réponse qui inclut un function_call suggéré représentant une action d'interface utilisateur (par exemple, "cliquer sur les coordonnées (x,y)" ou "saisir 'texte'"). Consultez Actions compatibles pour obtenir la liste de toutes les actions que vous pouvez utiliser avec le modèle.
    • La réponse de l'API peut également inclure un safety_decision provenant d'un système de sécurité interne qui a vérifié l'action proposée par le modèle. Ce safety_decision classe l'action comme suit :
      • Normal ou autorisé : l'action est considérée comme sûre. Cela peut également être représenté par l'absence de safety_decision.
      • Confirmation requise : le modèle est sur le point d'effectuer une action qui peut être risquée (par exemple, cliquer sur une bannière "Accepter les cookies").
  3. Exécuter l'action reçue

    • Votre code côté client reçoit le function_call et tous les safety_decision associés.
    • Si safety_decision indique "regular" ou "allowed" (ou si aucun safety_decision n'est présent), votre code côté client peut exécuter le function_call spécifié dans votre environnement cible (tel qu'un navigateur Web).
    • Si safety_decision indique qu'une confirmation est requise, votre application doit demander à l'utilisateur final de confirmer avant d'exécuter function_call. Si l'utilisateur confirme, exécutez l'action. Si l'utilisateur refuse, n'exécutez pas l'action.
  4. Capturer l'état du nouvel environnement

    • Si l'action a été exécutée, votre client capture une nouvelle capture d'écran de l'IUG et l'URL actuelle à renvoyer au modèle dans le cadre d'un function_response.
    • Si une action a été bloquée par le système de sécurité ou si l'utilisateur a refusé de la confirmer, votre application peut envoyer un autre type de feedback au modèle ou mettre fin à l'interaction.

Une nouvelle requête est envoyée au modèle avec l'état mis à jour. Le processus se répète à partir de l'étape 2, le modèle utilisant la nouvelle capture d'écran (si elle est fournie) et l'objectif en cours pour suggérer l'action suivante. La boucle se poursuit jusqu'à ce que la tâche soit terminée, qu'une erreur se produise ou que le processus soit interrompu (par exemple, si une réponse est bloquée par des filtres de sécurité ou une décision de l'utilisateur).

Le schéma suivant illustre le fonctionnement de l'utilisation de l'ordinateur :

Organigramme montrant une boucle d'interaction cyclique d'utilisation de l'ordinateur. Il commence par une "Tâche initiale" qui mène à "Capture d'écran + Contexte précédent". Étape 1 : "Envoyer une requête au modèle" envoie ces données au "Modèle". Étape 2 : "Recevoir la réponse du modèle" transmet une action à l'"Environnement informatique (application cliente)". Étape 3 : "Exécuter l'action reçue" met à jour l'"Environnement informatique (application cliente)".
Étape 4 : "Capturer l'état du nouvel environnement" renvoie la capture d'écran et le contexte mis à jour au début de la boucle.

Activer l'utilisation d'un ordinateur

Pour activer l'utilisation de l'ordinateur, assurez-vous que votre application utilise l'un des modèles compatibles, puis ajoutez l'utilisation de l'ordinateur à votre liste d'outils activés :

Python

from google import genai
from google.genai import types
from google.genai.types import Content, Part

client = genai.Client(
    enterprise=True,
    project="PROJECT_ID",
    location="global",
)

# Add computer use to the list of tools
generate_content_config = types.GenerateContentConfig(
    tools=[
        types.Tool(
            computer_use=types.ComputerUse(
                environment=types.Environment.ENVIRONMENT_BROWSER,
            )
        ),
    ]
)

contents = [
    Content(
        role="user",
        parts=[
            Part(text="Go to google.com and search for 'weather in New York'"),
        ],
    )
]

response = client.models.generate_content(
    model="gemini-3.8-flash",
    contents=contents,
    config=generate_content_config,
)
print(response)
      

Node.js

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

const ai = new GoogleGenAI({
  enterprise: true,
  project: 'PROJECT_ID',
  location: 'global',
});

const response = await ai.models.generateContent({
  model: 'gemini-3.8-flash',
  contents: "Go to google.com and search for 'weather in New York'",
  config: {
    tools: [
      {
        computerUse: {
          environment: Environment.ENVIRONMENT_BROWSER,
        },
      },
    ],
  },
});

console.log(response);
      

API REST

curl -X POST "https://aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/global/publishers/google/models/gemini-3.8-flash:generateContent" \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \
  -d '{
    "contents": [
      {
        "role": "user",
        "parts": [
          {
            "text": "Go to google.com and search for '\''weather in New York'\''"
          }
        ]
      }
    ],
    "tools": [
      {
        "computer_use": {
          "environment": "ENVIRONMENT_BROWSER"
        }
      }
    ]
  }'
      

Configurer votre environnement d'exécution

Avant de créer avec l'outil d'utilisation de l'ordinateur, configurez les éléments suivants :

  • Un environnement d'exécution sécurisé : exécutez votre agent dans une machine virtuelle (VM) ou un conteneur (comme Docker) en bac à sable pour l'isoler de votre système hôte.
  • Un gestionnaire d'actions côté client : implémentez une logique client pour exécuter les clics de souris, les frappes au clavier et la capture d'écran.

Commencez par installer le SDK et les dépendances du navigateur, puis configurez votre environnement :

pip install --upgrade google-genai playwright termcolor
playwright install chromium

export GOOGLE_CLOUD_PROJECT="PROJECT_ID"
export GOOGLE_CLOUD_LOCATION="global"
export GOOGLE_GENAI_USE_ENTERPRISE=True

Ensuite, initialisez une instance de navigateur Playwright avec des dimensions de fenêtre d'affichage explicites afin que les coordonnées normalisées (0-1000) soient mises à l'échelle avec précision :

from playwright.sync_api import sync_playwright

SCREEN_WIDTH = 1440
SCREEN_HEIGHT = 900

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()
page.goto("https://www.google.com")

Envoyer une requête

Après avoir configuré l'outil d'utilisation de l'ordinateur, envoyez au modèle une requête incluant l'objectif de l'utilisateur et une capture d'écran initiale de l'IUG.

Vous pouvez également ajouter les éléments suivants :

  • Actions exclues : si vous ne souhaitez pas que le modèle effectue certaines actions de la liste des actions d'interface utilisateur compatibles, spécifiez-les dans excluded_predefined_functions.
  • Fonctions définies par l'utilisateur : vous pouvez inclure des fonctions personnalisées définies par l'utilisateur en plus de l'utilisation de l'ordinateur.

L'exemple de code suivant active l'utilisation de l'ordinateur et envoie la requête au modèle :

Python

from google import genai
from google.genai import types
from google.genai.types import Content, Part

client = genai.Client()

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

# Configuration for computer use with browser environment
generate_content_config = genai.types.GenerateContentConfig(
    tools=[
        # 1. Computer Use tool with browser environment
        types.Tool(
            computer_use=types.ComputerUse(
                environment=types.Environment.ENVIRONMENT_BROWSER,
                # Optional: Exclude specific predefined functions
                excluded_predefined_functions=excluded_functions
                )
              ),
        # 2. Optional: Custom user-defined functions (need to defined above)
        # types.Tool(
           # function_declarations=custom_functions
           #   )
    ],
)

# Create the content with user message
contents: list[Content] = [
    Content(
        role="user",
        parts=[
            Part(text="Search for highly rated smart fridges with touchscreen, 2 doors, around 25 cu ft, priced below 4000 dollars on Google Shopping. Create a bulleted list of the 3 cheapest options in the format of name, description, price in an easy-to-read layout."),
            # Optional: include a screenshot of the initial state
            # Part.from_bytes(
                 # data=screenshot_image_bytes,
                 # mime_type='image/png',
            # ),
        ],
    )
]

# Generate content with the configured settings
response = client.models.generate_content(
    model='gemini-3.8-flash',
    contents=contents,
    config=generate_content_config,
)

# Print the response output
print(response.text)
      

Vous pouvez également inclure des fonctions personnalisées définies par l'utilisateur pour étendre les fonctionnalités du modèle. Consultez Gemini 3.5 Flash ou version ultérieure et cas d'utilisation sur mobile ou ordinateur pour savoir comment configurer l'utilisation de l'ordinateur pour les cas d'utilisation sur mobile en ajoutant des actions telles que open_app, long_press_at et go_home tout en excluant les actions spécifiques au navigateur.

Recevoir les réponses

Le modèle répond avec un ou plusieurs FunctionCalls s'il détermine que des actions d'UI ou des fonctions définies par l'utilisateur sont nécessaires pour effectuer la tâche. Le code de votre application doit analyser ces actions, les exécuter et collecter les résultats. L'utilisation de l'ordinateur est compatible avec l'appel de fonction en parallèle, ce qui signifie que le modèle peut renvoyer plusieurs actions indépendantes en un seul tour.

Pour Gemini 3.5 Flash et les modèles ultérieurs, chaque action inclut un argument intent expliquant le raisonnement du modèle derrière cette étape :

{
  "content": {
    "parts": [
      {
        "function_call": {
          "name": "type",
          "args": {
            "x": 450,
            "y": 320,
            "text": "smart fridge touchscreen 2 doors 25 cu ft under $4000",
            "press_enter": true,
            "intent": "Type the search query into the Google search box and submit."
          }
        }
      }
    ]
  }
}

Selon l'action, la réponse de l'API peut également renvoyer un safety_decision dans les arguments de l'appel de fonction :

{
  "content": {
    "parts": [
      {
        "function_call": {
          "name": "click",
          "args": {
            "x": 60,
            "y": 100,
            "intent": "Click the 'I'm not a robot' verification checkbox.",
            "safety_decision": {
              "explanation": "I have encountered a CAPTCHA challenge that requires interaction. I need you to complete the challenge by clicking the 'I'm not a robot' checkbox and any subsequent verification steps.",
              "decision": "require_confirmation"
            }
          }
        }
      }
    ]
  }
}

Exécuter les actions reçues

Après avoir reçu une réponse, analysez le function_call, mettez à l'échelle les coordonnées de la grille normalisée 0-1 000 aux dimensions réelles des pixels de la fenêtre d'affichage, puis exécutez l'action :

import time
from typing import Any, Dict, List, Tuple
import termcolor


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 get_safety_confirmation(safety_decision: Dict[str, Any]) -> str:
    """Prompt user for confirmation when safety check is triggered."""
    termcolor.cprint("Safety service requires explicit confirmation!", color="red")
    print(safety_decision.get("explanation", ""))

    decision = ""
    while decision.lower() not in ("y", "n", "ye", "yes", "no"):
        decision = input("Do you wish to proceed? [Y]es/[N]o\n")

    if decision.lower() in ("n", "no"):
        return "TERMINATE"
    return "CONTINUE"


def execute_function_calls(
    response, page, screen_width: int, screen_height: int
) -> List[Tuple[str, Dict[str, Any]]]:
    """Extract and execute modern and legacy function calls from Gemini response."""
    candidate = response.candidates[0]
    function_calls = []
    thoughts = []

    for part in candidate.content.parts:
        if hasattr(part, "function_call") and part.function_call:
            function_calls.append(part.function_call)
        elif hasattr(part, "text") and part.text:
            thoughts.append(part.text)

    if thoughts:
        print(f"Model Reasoning: {' '.join(thoughts)}")

    results: List[Tuple[str, Dict[str, Any]]] = []
    for function_call in function_calls:
        fname = function_call.name
        args = function_call.args or {}
        action_result: Dict[str, Any] = {}

        print(f" -> Executing: {fname} (Intent: {args.get('intent', 'N/A')})")

        # Check for safety decision before executing
        if "safety_decision" in args:
            decision = get_safety_confirmation(args["safety_decision"])
            if decision == "TERMINATE":
                print("Terminating agent loop")
                break
            action_result["safety_acknowledgement"] = "true"

        try:
            if fname in ("open_web_browser", "open_app", "take_screenshot"):
                pass

            elif fname in (
                "click",
                "click_at",
                "double_click",
                "triple_click",
                "middle_click",
                "right_click",
                "mouse_down",
                "mouse_up",
                "move",
                "hover_at",
            ):
                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 == "triple_click":
                    page.mouse.click(actual_x, actual_y, click_count=3)
                elif fname == "middle_click":
                    page.mouse.click(actual_x, actual_y, button="middle")
                elif fname == "right_click":
                    page.mouse.click(actual_x, actual_y, button="right")
                elif fname == "mouse_down":
                    page.mouse.move(actual_x, actual_y)
                    page.mouse.down()
                elif fname == "mouse_up":
                    page.mouse.move(actual_x, actual_y)
                    page.mouse.up()
                elif fname in ("move", "hover_at"):
                    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)
                clear_before_typing = args.get("clear_before_typing", True)

                if actual_x is not None and actual_y is not None:
                    page.mouse.click(actual_x, actual_y)
                    time.sleep(0.1)

                if clear_before_typing:
                    page.keyboard.press("ControlOrMeta+A")
                    page.keyboard.press("Backspace")

                page.keyboard.type(text)
                if press_enter:
                    page.keyboard.press("Enter")

            elif fname in ("scroll", "scroll_at", "scroll_document"):
                if "x" in args and "y" in args:
                    page.mouse.move(denormalize_x(args["x"], screen_width), denormalize_y(args["y"], screen_height))
                direction = args.get("direction", "down")
                magnitude = args.get("magnitude_in_pixels", args.get("magnitude", 300))
                dx, dy = 0, 0
                if direction == "down":
                    dy = magnitude
                elif direction == "up":
                    dy = -magnitude
                elif direction == "right":
                    dx = magnitude
                elif direction == "left":
                    dx = -magnitude
                page.mouse.wheel(dx, dy)

            elif fname == "drag_and_drop":
                start_x = denormalize_x(args.get("start_x", args.get("x", 0)), screen_width)
                start_y = denormalize_y(args.get("start_y", args.get("y", 0)), screen_height)
                end_x = denormalize_x(args.get("end_x", args.get("destination_x", 0)), screen_width)
                end_y = denormalize_y(args.get("end_y", args.get("destination_y", 0)), screen_height)
                page.mouse.move(start_x, start_y)
                page.mouse.down()
                page.mouse.move(end_x, end_y)
                page.mouse.up()

            elif fname == "press_key":
                page.keyboard.press(args["key"])
            elif fname == "key_down":
                page.keyboard.down(args["key"])
            elif fname == "key_up":
                page.keyboard.up(args["key"])
            elif fname == "hotkey":
                page.keyboard.press("+".join(args.get("keys", [])))
            elif fname == "key_combination":
                page.keyboard.press(args["keys"])
            elif fname == "navigate":
                page.goto(args["url"])
            elif fname == "search":
                page.goto("https://www.google.com")
            elif fname == "go_back":
                page.go_back()
            elif fname == "go_forward":
                page.go_forward()
            elif fname in ("wait", "wait_5_seconds"):
                time.sleep(5 if fname == "wait_5_seconds" else args.get("seconds", 1))
            else:
                action_result["warning"] = f"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, action_result))

    return results

Si la valeur safety_decision renvoyée est require_confirmation, vous devez demander à l'utilisateur de confirmer avant d'exécuter l'action. Conformément aux conditions d'utilisation, vous n'êtes pas autorisé à contourner les demandes de confirmation humaine.

Capturer le nouvel état

Après avoir exécuté les actions, empaquetez chaque résultat d'action et capture d'écran mise à jour dans un FunctionResponse à renvoyer au modèle :

from google.genai import types
from google.genai.types import Content, FunctionResponse, Part


def get_function_responses(
    page, results: List[Tuple[str, Dict[str, Any]]]
) -> Content:
    """Capture screenshot and URL and package them as FunctionResponses."""
    screenshot = page.screenshot(type="png")
    current_url = page.url
    function_response_parts = []

    for name, action_result in results:
        function_response_parts.append(
            Part(
                function_response=FunctionResponse(
                    name=name,
                    response={
                        "url": current_url,
                        **action_result,
                    },
                    parts=[
                        types.FunctionResponsePart(
                            inline_data=types.FunctionResponseBlob(
                                mime_type="image/png",
                                data=screenshot,
                            )
                        )
                    ],
                )
            )
        )

    return Content(
        role="user",
        parts=function_response_parts,
    )

Créer une boucle d'agent

Combinez ces étapes dans une boucle de bout en bout qui effectue une itération continue entre le modèle et l'environnement d'exécution :

Python

from google import genai
from google.genai import types
from google.genai.types import Content, Part
from playwright.sync_api import sync_playwright

def has_function_calls(response) -> bool:
    """Check if model response contains any function calls."""
    candidate = response.candidates[0]
    return any(
        hasattr(part, "function_call") and part.function_call
        for part in candidate.content.parts
    )

def main():
    client = genai.Client(
        enterprise=True,
        project="PROJECT_ID",
        location="global",
    )

    generate_content_config = types.GenerateContentConfig(
        tools=[
            types.Tool(
                computer_use=types.ComputerUse(
                    environment=types.Environment.ENVIRONMENT_BROWSER,
                    enable_prompt_injection_detection=True,
                )
            )
        ],
    )

    screen_width, screen_height = 1440, 900

    with sync_playwright() as p:
        browser = p.chromium.launch(headless=False)
        context = browser.new_context(
            viewport={"width": screen_width, "height": screen_height}
        )
        page = context.new_page()
        page.goto("https://www.google.com")

        initial_screenshot = page.screenshot(type="png")
        contents: list[Content] = [
            Content(
                role="user",
                parts=[
                    Part(text="Search for flights from San Francisco to Honolulu departing June 30 and returning July 6."),
                    Part.from_bytes(data=initial_screenshot, mime_type="image/png"),
                ],
            )
        ]

        # Agent loop: iterate until model provides a final text response
        for iteration in range(10):
            print(f"\n--- Iteration {iteration + 1} ---")

            response = client.models.generate_content(
                model="gemini-3.8-flash",
                contents=contents,
                config=generate_content_config,
            )

            contents.append(response.candidates[0].content)

            if not has_function_calls(response):
                print(f"FINAL RESPONSE:\n{response.text}")
                break

            results = execute_function_calls(response, page, screen_width, screen_height)
            if not results:
                break

            user_feedback_content = get_function_responses(page, results)
            contents.append(user_feedback_content)

        browser.close()

if __name__ == "__main__":
    main()
      

Gemini 3.5 Flash ou version ultérieure, et cas d'utilisation sur mobile ou ordinateur

L'utilisation de l'ordinateur permet de définir des environnements mobiles (ENVIRONMENT_MOBILE), de bureau (ENVIRONMENT_DESKTOP) ou de navigateur (ENVIRONMENT_BROWSER). La valeur par défaut est ENVIRONMENT_BROWSER.

Les exemples suivants montrent comment configurer l'environnement d'exécution pour l'utilisation de l'ordinateur avec Gemini 3.5 Flash ou version ultérieure :

API REST

Avant d'utiliser les données de requête, effectuez les remplacements suivants :

  • PROJECT_ID : ID du projet.

Méthode HTTP et URL :

POST https://aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/global/publishers/google/models/gemini-3.5-flash:generateContent

Corps JSON de la requête :

{
  "contents": [
    {
      "role": "user",
      "parts": {
        "text": "find me a flight from SF to Hawaii on Jun 30th, coming back on Jul 6th. start by navigating directly to flights.google.com"
      }
    }
  ],
  "generation_config": {
    "candidateCount": 1
  },
  "tools": [
    {
      "computer_use": {
        "environment": "ENVIRONMENT_BROWSER"
      }
    }
  ]
}

Pour envoyer votre requête, développez l'une des options suivantes :

Vous devriez recevoir un code d'état indiquant le succès de l'opération (2xx), ainsi qu'une réponse vide.

Python

L'exemple suivant nécessite python-genai version 2.7.0 ou ultérieure.

from google import genai
from google.genai.types import (
    Part,
    GenerateContentConfig,
    Content,
    Tool,
    ComputerUse,
    Environment,
    ThinkingConfig,
)
client = genai.Client()

response = client.models.generate_content(
    model="gemini-3.6-flash",
    contents=[
        Content(
            role="user",
            parts=[
                Part(text="find me a flight from SF to Hawaii on Jun 30th, coming back on Jul 6th"),
            ],
        )
    ],
    config=GenerateContentConfig(
        temperature=1,
        top_p=0.95,
        top_k=40,
        max_output_tokens=8192,
        tools=[
            Tool(
                computer_use=ComputerUse(
                    environment=Environment.ENVIRONMENT_MOBILE
                ),
            ),
        ],
        thinking_config=ThinkingConfig(
            include_thoughts=True
        ),
    )
)

Fonctions définies par l'utilisateur personnalisées

Vous pouvez étendre les fonctionnalités du modèle en combinant computer_use avec des fonctions définies par l'utilisateur (function_declarations). Par exemple, dans les scénarios human-in-the-loop (avec intervention humaine), vous pouvez exclure des actions prédéfinies spécifiques à l'aide de excluded_predefined_functions et enregistrer une fonction yield_to_user personnalisée afin que l'agent puisse redonner le contrôle à un humain lorsqu'il rencontre des invites d'A2F ou des écrans ambigus :

Python

from google import genai
from google.genai import types
from google.genai.types import Content, Part

client = genai.Client()

def yield_to_user(reason: str) -> dict[str, str]:
    """Yields control back to the user for assistance or verification when an automated action is unsafe or ambiguous.

    Args:
        reason: The reason why the agent is yielding control to the human.
    """
    return {"status": "yielded", "reason": reason}

generate_content_config = types.GenerateContentConfig(
    tools=[
        types.Tool(
            computer_use=types.ComputerUse(
                environment=types.Environment.ENVIRONMENT_BROWSER,
                excluded_predefined_functions=["drag_and_drop"],
            )
        ),
        types.Tool(
            function_declarations=[
                types.FunctionDeclaration.from_callable(
                    client=client, callable=yield_to_user
                )
            ]
        ),
    ]
)

response = client.models.generate_content(
    model="gemini-3.8-flash",
    contents=[
        Content(
            role="user",
            parts=[
                Part(
                    text="Click the submit button. If you need a second-factor authentication code, ask me."
                ),
            ],
        )
    ],
    config=generate_content_config,
)
print(response)
      

Action compatible

L'outil d'utilisation de l'ordinateur permet au modèle de demander les actions suivantes à l'aide d'un FunctionCall. Votre code côté client doit implémenter la logique d'exécution de ces actions. Consultez l'implémentation de référence pour obtenir des exemples. Le tableau suivant présente les actions compatibles avec l'environnement du navigateur. Les modèles Gemini 3 Flash et Gemini 3.5 Flash ou ultérieurs ont des ensembles de noms FunctionCall différents.

Gemini 3.5 Flash ou version ultérieure

Gemini 3.5 Flash : vous avez accès à différents ensembles d'appels de fonction en fonction de l'environnement que vous sélectionnez :

Environnement du navigateur

Nom de la commande Description Arguments (dans l'appel de fonction)
click Effectue un clic gauche aux coordonnées spécifiées. y : int (0-999)
x : int (0-999)
intent : str
double_click Double-clique sur les coordonnées spécifiées. y : int (0-999)
x : int (0-999)
intent : str
triple_click Effectue un triple clic aux coordonnées spécifiées. y : int (0-999)
x : int (0-999)
intent : str
middle_click Effectue un clic du milieu aux coordonnées spécifiées. y : int (0-999)
x : int (0-999)
intent : str
right_click Effectue un clic droit aux coordonnées spécifié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 au niveau des coordonnées. y : int (0-999)
x : int (0-999)
intent : str
mouse_up Relâche le bouton de la souris aux coordonnées indiqué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 (en cliquant éventuellement d'abord sur x, y). y : int (0-999, facultatif)
x : int (0-999, facultatif)
text : str
press_enter : bool (facultatif, valeur par défaut : false)
intent : str
drag_and_drop Fait glisser un élément de (start_x, start_y) à (end_x, end_y). start_y : int (0-999)
start_x : int (0-999)
end_y : int (0-999)
end_x : int (0-999)
intent : str
wait Attend le nombre de secondes spécifié. seconds : int (facultatif, valeur par défaut : 1)
intent : str
press_key Appuie sur la touche spécifiée, puis la relâche. key : str
intent : str
key_down Appuie de manière prolongée sur la touche spécifiée. key : str
intent : str
key_up Relâche la touche spécifiée. key : str
intent : str
hotkey Appuie sur la combinaison de touches spécifiée. keys : List[str]
intent : str
take_screenshot Renvoie une capture de l'écran actuel. intent : str
scroll Fait défiler l'écran vers le haut, le bas, la gauche ou la droite à une coordonnée selon une distance en pixels. 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
open_web_browser Ouvre le navigateur Web. intent : str
navigate Accède directement à l'URL spécifiée dans le navigateur. url : str
intent : str
go_back Retourne à la page Web précédente dans l'historique de navigation. intent : str
go_forward Accède à la page Web suivante dans l'historique de navigation du navigateur. intent : str

Environnement mobile

Nom de la commande Description Arguments (dans l'appel de fonction)
open_app Ouvre une application par son nom. intent: str
click Effectue un clic gauche aux coordonnées indiquées. y : int (0-999)
x : int (0-999)
intent : str
list_apps Répertorie les applications disponibles sur l'appareil, en renvoyant leurs noms et leurs noms de package. intent : str
wait Attend le nombre de secondes spécifié. intent : str
seconds : int(facultatif, valeur par défaut : 1)
go_back Permet de revenir à la page Web précédente dans l'historique du navigateur. intent : str
type Saisit du texte. text : str
intent : str
press_enter : bool(facultatif, "false" par défaut)
drag_and_drop Fait glisser l'élément de start_y et start_x vers end_y et end_x 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 de manière prolongée sur des coordonnées y (0-999) et x (0-999) spécifiques de l'écran. y : int (0-999)
x : int (0-999)
intent : str
seconds : int (facultatif, valeur par défaut : 2)
press_key Appuie sur la touche spécifiée, puis la relâche. key : str
intent : str
take_screenshot Renvoie une capture de l'écran actuel. intent : str

Environnement de bureau

Nom de la commande Description Arguments (dans l'appel de fonction)
click Effectue un clic gauche aux coordonnées indiquées. y : int (0-999)
x : int (0-999)
intent : str
double_click Double-clique sur les coordonnées. y : int (0-999)
x : int (0-999)
intent : str
triple_click Triple-clique sur les coordonnées. y : int (0-999)
x : int (0-999)
intent : str
middle_click Effectue un clic avec le bouton du milieu aux coordonnées indiquées. y : int (0-999)
x : int (0-999)
intent : str
right_click Effectue un clic droit sur les 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 au niveau des coordonnées. y : int (0-999)
x : int (0-999)
intent : str
mouse_up Relâche le bouton de la souris aux coordonnées indiquées. y : int (0-999)
x : int (0-999)
intent : str
move Placez le curseur à la position spécifiée. y : int (0-999)
x : int (0-999)
intent : str
type Saisit du texte. text : str
intent : str
press_enter : bool(facultatif, "false" par défaut)
drag_and_drop Fait glisser l'élément de start_y et start_x vers end_y et end_x. start_y : int (0-999)
start_x : int (0-999)
end_y : int (0-999)
end_x : int (0-999)
intent : str
wait Attendez le nombre de secondes spécifié. intent : str
seconds : int(facultatif, valeur par défaut : 1)
press_key Appuie sur la touche spécifiée, puis la relâche. key : str
intent : str
key_down Appuie de manière prolongée sur la touche spécifiée. key : str
intent : str
key_up Relâche la touche spécifiée. key : str
intent : str
hotkey Appuie sur la combinaison de touches spécifiée. keys : List[str]
intent : str
take_screenshot Renvoie une capture de l'écran actuel. intent : str
scroll Fait défiler l'écran vers le haut, le bas, la gauche ou la droite à une coordonnée selon une distance en pixels. y : int (0-999)
x : int (0-999)
direction : str ("up", "down", "left", "right")
intent : str
magnitude_in_pixels : int (0-999, facultatif, valeur par défaut : 300)

Gemini 3 Flash

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", "args": {}}
wait_5_seconds Met en pause l'exécution pendant cinq secondes pour permettre le chargement du contenu dynamique ou la fin des animations. Aucun {"name": "wait_5_seconds", "args": {}}
go_back Accède à la page précédente de l'historique du navigateur. Aucun {"name": "go_back", "args": {}}
go_forward Accède à la page suivante de l'historique du navigateur. Aucun {"name": "go_forward", "args": {}}
search Accéder à la page d'accueil du moteur de recherche par défaut (par exemple, Google) Utile pour lancer une nouvelle tâche de recherche. Aucun {"name": "search", "args": {}}
navigate Accède directement à l'URL spécifiée dans le navigateur. url : str {"name": "navigate", "args": {"url": "https://www.wikipedia.org"}}
click_at Clique sur une coordonnée spécifique de la page Web. Les valeurs x et y sont basées sur une grille de 1 000 x 1 000 et sont adaptées aux dimensions de l'écran. y : int (0-999), x : int (0-999) {"name": "click_at", "args": {"y": 300, "x": 500}}
hover_at 521963309 Passe la souris sur une coordonnée spécifique de la page Web. Utile pour afficher des sous-menus. x et y sont basés sur une grille de 1 000 x 1 000. y : int (0-999) x : int (0-999) {"name": "hover_at", "args": {"y": 150, "x": 250}}
type_text_at Saisit du texte à une coordonnée spécifique. Par défaut, le champ est d'abord effacé, puis la touche ENTRÉE est enfoncée après la saisie, mais ces options peuvent être désactivées. x et y sont basés sur une grille de 1 000 x 1 000. 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", "args": {"y": 250, "x": 400, "text": "search query", "press_enter": false}}
key_combination Appuie sur des touches ou des combinaisons de touches du clavier, comme "Ctrl+C" ou "Entrée". Utile pour déclencher des actions (comme l'envoi d'un formulaire avec "Entrée") ou des opérations de presse-papiers. keys : str (par exemple, "enter", "control+c"). (consultez la documentation de référence de l'API pour obtenir la liste complète des clés autorisées) {"name": "key_combination", "args": {"keys": "Control+A"}}
scroll_document Fait défiler l'intégralité de la page Web vers le haut, le bas, la gauche ou la droite. direction : str ("up", "down", "left" ou "right") {"name": "scroll_document", "args": {"direction": "down"}}
scroll_at Fait défiler un élément ou une zone spécifique aux coordonnées (x, y) dans la direction spécifiée selon une certaine amplitude. Les coordonnées et l'amplitude (800 par défaut) sont basées sur une grille de 1 000 x 1 000. y : int (0-999), x : int (0-999), direction : str ("up", "down", "left", "right"), magnitude : int (0-999, facultatif, valeur par défaut : 800) {"name": "scroll_at", "args": {"y": 500, "x": 500, "direction": "down", "magnitude": 400}}
drag_and_drop Fait glisser un élément d'une coordonnée de départ (x, y) et le dépose à une coordonnée de destination (destination_x, destination_y). Toutes les coordonnées sont basées sur une grille de 1 000 x 1 000. y : int (0-999), x : int (0-999), destination_y : int (0-999), destination_x : int (0-999) {"name": "drag_and_drop", "args": {"y": 100, "x": 100, "destination_y": 500, "destination_x": 500}}

Sécurité

Cette section décrit les mesures de protection mises en place par l'outil d'utilisation de l'ordinateur pour améliorer le contrôle de l'utilisateur et renforcer la sécurité. Il décrit également les bonnes pratiques pour atténuer les nouveaux risques potentiels que l'outil pourrait présenter.

Prendre connaissance de la décision de sécurité

Selon l'action, la réponse du modèle peut inclure un safety_decision provenant d'un système de sécurité interne. Cette décision vérifie la sécurité de l'action proposée par l'outil.

{
  "content": {
    "parts": [
      {
        "text": "I have evaluated step 2. It seems Google detected unusual traffic and is asking me to verify I'm not a robot. I need to click the 'I'm not a robot' checkbox located near the top left (y=98, x=95)."
      },
      {
        "function_call": {
          "name": "click_at",
          "args": {
            "x": 60,
            "y": 100,
            "safety_decision": {
              "explanation": "I have encountered a CAPTCHA challenge that requires interaction. I need you to complete the challenge by clicking the 'I'm not a robot' checkbox and any subsequent verification steps.",
              "decision": "require_confirmation"
            }
          }
        }
      }
    ]
  }
}

Si la valeur de safety_decision est require_confirmation, vous devez demander à l'utilisateur final de confirmer avant de procéder à l'exécution de l'action.

L'exemple de code suivant demande à l'utilisateur final de confirmer avant d'exécuter l'action. Si l'utilisateur ne confirme pas l'action, la boucle se termine. Si l'utilisateur confirme l'action, celle-ci est exécutée et le champ safety_acknowledgement est marqué comme True.

import termcolor

def get_safety_confirmation(safety_decision):
    """Prompt user for confirmation when safety check is triggered."""
    termcolor.cprint("Safety service requires explicit confirmation!", color="red")
    print(safety_decision["explanation"])

    decision = ""
    while decision.lower() not in ("y", "n", "ye", "yes", "no"):
        decision = input("Do you wish to proceed? [Y]es/[N]o\n")

    if decision.lower() in ("n", "no"):
        return "TERMINATE"
    return "CONTINUE"

def execute_function_calls(response, page, screen_width: int, screen_height: int):

    # ... Extract function calls from response ...

    for function_call in function_calls:
        extra_fr_fields = {}

        # Check for safety decision
        if 'safety_decision' in function_call.args:
            decision = get_safety_confirmation(function_call.args['safety_decision'])
            if decision == "TERMINATE":
                print("Terminating agent loop")
                break
            extra_fr_fields["safety_acknowledgement"] = "true" # Safety acknowledgement

        # ... Execute function call and append to results ...

Si l'utilisateur confirme, vous devez inclure la confirmation de sécurité dans votre FunctionResponse.

function_response_parts.append(
    FunctionResponse(
        name=name,
        response={"url": current_url,
                  **extra_fr_fields},  # Include safety acknowledgement
        parts=[
            types.FunctionResponsePart(
                inline_data=types.FunctionResponseBlob(
                    mime_type="image/png", data=screenshot
                )
             )
           ]
         )
       )

Détection de l'injection de requêtes

L'utilisation de l'ordinateur dans Gemini 3.5 Flash ou version ultérieure est compatible avec un mécanisme de sécurité avancé permettant de détecter les attaques par injection de prompt. Lorsqu'elle est activée, cette fonctionnalité vérifie si une capture d'écran incluse est susceptible d'introduire une attaque par injection de prompt. Vous pouvez définir cette fonctionnalité dans la configuration de l'utilisation de l'ordinateur. La valeur par défaut est false.

Les exemples suivants montrent comment activer la configuration de l'utilisation de l'ordinateur pour activer la détection d'injection de prompt :

API REST

Avant d'utiliser les données de requête, effectuez les remplacements suivants :

  • PROJECT_ID : ID du projet.

Méthode HTTP et URL :

POST https://aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/global/publishers/google/models/gemini-3.5-flash:generateContent

Corps JSON de la requête :

{
  "contents": [
    {
      "role": "user",
      "parts": {
        "text": "find me a flight from SF to Hawaii on Jun 30th, coming back on Jul 6th. start by navigating directly to flights.google.com"
      }
    }
  ],
  "generation_config": {
    "candidateCount": 1
  },
  "tools": [
    {
      "computer_use": {
        "environment": "ENVIRONMENT_BROWSER",
        "enable_prompt_injection_detection": true
      }
    }
  ]
}

Pour envoyer votre requête, développez l'une des options suivantes :

Vous devriez recevoir un code d'état indiquant le succès de l'opération (2xx), ainsi qu'une réponse vide.

Python

L'exemple suivant nécessite python-genai version 2.7.0 ou ultérieure.

from google import genai
from google.genai.types import (
    Part,
    GenerateContentConfig,
    Content,
    Tool,
    ComputerUse,
    Environment,
    ThinkingConfig,
)
client = genai.Client()

response = client.models.generate_content(
    model="gemini-3.6-flash",
    contents=[
        Content(
            role="user",
            parts=[
                Part(text="find me a flight from SF to Hawaii on Jun 30th, coming back on Jul 6th"),
            ],
        )
    ],
    config=GenerateContentConfig(
        temperature=1,
        top_p=0.95,
        top_k=40,
        max_output_tokens=8192,
        tools=[
            Tool(
                computer_use=ComputerUse(
                    environment=Environment.ENVIRONMENT_MOBILE,
                    enable_prompt_injection_detection=True
                ),
            ),
        ],
        thinking_config=ThinkingConfig(
            include_thoughts=True
        ),
    )
)

Bonnes pratiques concernant la sécurité

L'utilisation d'ordinateurs présente des risques dont les développeurs doivent être conscients :

  • Contenu non fiable et escroqueries : lorsque le modèle tente d'atteindre l'objectif de l'utilisateur, il peut s'appuyer sur des sources d'informations et des instructions non fiables à l'écran.
  • Actions involontaires occasionnelles : le modèle peut mal interpréter l'objectif d'un utilisateur ou le contenu d'une page Web, ce qui l'amène à effectuer des actions incorrectes, comme cliquer sur le mauvais bouton ou remplir le mauvais formulaire.
  • Non-respect des règles : les fonctionnalités de l'API peuvent être utilisées pour des activités qui ne respectent pas les conditions d'utilisation et les règles de Google, comme le contournement des CAPTCHA ou la compromission de l'intégrité du système.

Pour limiter ces risques, vous devez mettre en œuvre les mesures de sécurité et les bonnes pratiques suivantes :

  1. Human-in-the-loop (avec intervention humaine, HITL) :
    • Implémenter la confirmation de l'utilisateur : lorsque la réponse de sécurité indique require_confirmation, vous devez implémenter la confirmation de l'utilisateur avant l'exécution.
    • Fournir des instructions de sécurité personnalisées : en plus des vérifications de confirmation de l'utilisateur intégrées, les développeurs peuvent éventuellement ajouter une instruction système personnalisée qui applique leurs propres règles de sécurité, soit pour bloquer certaines actions du modèle, soit pour exiger la confirmation de l'utilisateur avant que le modèle n'effectue certaines actions irréversibles à fort enjeu.

    Cliquez pour afficher un exemple d'instruction système de sécurité personnalisée

    ## **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.
    
    **USER_CONFIRMATION Categories:**
    *   **Consent and Agreements:** Terms of Service, Privacy Policies, Cookie banners.
    *   **Robot Detection:** CAPTCHAs of any kind.
    *   **Financial Transactions:** Completing purchases or moving funds.
    *   **Sending Communications:** Emails, forum posts, or chat messages.
    *   **Accessing/Modifying Sensitive Information:** Healthcare, financial, or ID records.
    *   **User Data Management:** Downloading files, transferring user data.
    *   **Browser Data Usage:** Chrome history, bookmarks, autofill passwords.
    *   **Security and Identity:** Logging into accounts or impersonation.
    
    ## **RULE 2: Default Behavior (ACTUATE)**
    If an action does NOT fall under USER_CONFIRMATION, proactively perform all
    necessary steps to move the user's request forward.
        
  2. Environnement d'exécution sécurisé : exécutez votre agent dans un environnement sécurisé et isolé pour limiter son impact potentiel (par exemple, une machine virtuelle (VM) isolée, un conteneur (comme Docker) ou un profil de navigateur dédié avec des autorisations limitées).
  3. Nettoyage des entrées : nettoyez tout le texte généré par l'utilisateur dans les prompts pour limiter le risque d'instructions involontaires ou d'injection de prompt. Il s'agit d'une couche de sécurité utile, mais qui ne remplace pas un environnement d'exécution sécurisé.
  4. Garde-fous de contenu : utilisez des garde-fous et des API de sécurité du contenu (comme Model Armor) pour évaluer les entrées utilisateur, les entrées et sorties d'outils, ainsi que les réponses de l'agent afin de détecter les contenus inappropriés, les injections de prompt et les jailbreaks.
  5. Listes d'autorisation et listes de blocage : implémentez des mécanismes de filtrage pour contrôler où le modèle peut naviguer et ce qu'il peut faire. Une liste de blocage des sites Web interdits est 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'IUG est cohérent. Les pop-ups, les notifications système ou les changements de mise en page inattendus peuvent perturber le modèle. Dans la mesure du possible, commencez chaque nouvelle tâche à partir d'un état propre et connu.

Confirmations human-in-the-loop (avec intervention humaine)

Les confirmations human-in-the-loop (avec intervention humaine) consistent à demander la confirmation de l'utilisateur avant d'exécuter une action suggérée par le modèle. Ce processus est nécessaire lorsque le modèle ne peut pas effectuer une action pour des raisons de sécurité.

L'outil d'utilisation de l'ordinateur de Gemini fournit les mécanismes suivants pour contrôler les confirmations HITL :

Ignorer les confirmations HITL

Vous pouvez ignorer les confirmations HITL par défaut suivantes :

  • FINANCIAL_TRANSACTIONS : finalisation de la dernière étape d'une transaction financière (par exemple, paiements, virements de fonds, ordre de paiement, démarrage ou modification d'un abonnement, ou finalisation d'une réservation).
  • SENSITIVE_DATA_MODIFICATION : modification d'informations sensibles, telles que des dossiers médicaux, financiers ou administratifs.
  • COMMUNICATION_TOOL : accès à des outils de communication ou utilisation de ces outils pour envoyer, partager, publier ou transmettre des communications.
  • ACCOUNT_CREATION : interaction avec les flux d'enregistrement ou d'inscription qui créent ou provisionnent de nouveaux comptes utilisateur ou de service.
  • DATA_MODIFICATION : modification, gestion, partage, stockage, envoi ou suppression de données ou de fichiers du navigateur.
  • USER_CONSENT_MANAGEMENT : interaction avec les boîtes de dialogue de recueil du consentement ou les bannières de consentement utilisateur en prenant une décision.
  • LEGAL_TERMS_AND_AGREEMENTS : interaction avec des boîtes de dialogue d'accord juridiquement contraignant, telles que l'acceptation des conditions d'utilisation, les boîtes de dialogue de règles de confidentialité ou les mentions légales.

Vous pouvez ignorer une ou toutes ces confirmations HITL en les listant dans le champ disabled_safety_policies de la configuration de l'utilisation de l'ordinateur :

Python

API GenerateContent

generate_content_config = genai.types.GenerateContentConfig(
    tools=[
        types.Tool(
            computer_use=types.ComputerUse(                
                environment=types.Environment.ENVIRONMENT_MOBILE,
                disabled_safety_policies=[
                    types.SafetyPolicy.FINANCIAL_TRANSACTIONS,
                    types.SafetyPolicy.COMMUNICATION_TOOL,
                ]
            )
        ),
    ],
)

contents = [
    types.Content(
        role="user",
        parts=[
            types.Part(text="Open the Maps app and find the nearest coffee shop."),
        ],
    )
]

response = client.models.generate_content(
    model='gemini-3.5-flash',
    contents=contents,
    config=generate_content_config,
)

API Interactions

from google import genai
client = genai.Client()

interaction = client.interactions.create(
    model='gemini-3.5-flash',
    input='Open the Maps app and find the nearest coffee shop.',
    tools=[
        {
            'type': 'computer_use',
            'environment': 'mobile',
            'disabled_safety_policies': [
                'financial_transactions',
                'communication_tool',
            ],
        }
    ]
)

REST

API GenerateContent

{
  "contents": [
    {
      "role": "user",
      "parts": [
        {
          "text": "Open the Maps app and find the nearest coffee shop."
        }
      ]
    }
  ],
  "tools": [
    {
      "computer_use": {
        "environment": "ENVIRONMENT_MOBILE",
        "disabled_safety_policies" : [
          "FINANCIAL_TRANSACTIONS",
          "COMMUNICATION_TOOL"
         ]
      }
    }
  ]
}

API Interactions

{
  "model": "gemini-3.5-flash",
  "input": "Open the Maps app and find the nearest coffee shop.",
  "tools": [
    {
      "type": "computer_use",
      "environment": "mobile",
      "disabled_safety_policies": [
        "financial_transactions",
        "communication_tool"
      ]
    }
  ]
}

Créer des règles d'administration

Si vous êtes administrateur d'une organisation, vous pouvez créer une règle au niveau de l'organisation à l'aide du service de règles d'administration qui empêche les développeurs de désactiver certaines ou toutes les confirmations HITL. Cette règle remplace tous les paramètres au niveau du développeur.

Vous pouvez créer une règle à l'aide de la consoleGoogle Cloud ou de Google Cloud CLI. L'ID de la contrainte est vertexai.configurableComputerUseToolSafetyPolicies. La propagation des modifications apportées aux règles d'administration peut prendre jusqu'à une heure.

Pour en savoir plus sur la création et la gestion des règles d'administration, consultez Créer des règles d'administration.

Tarifs

L'utilisation de l'ordinateur est facturée aux mêmes tarifs que Gemini et utilise les mêmes SKU. Pour répartir les coûts d'utilisation des ordinateurs, utilisez des libellés de métadonnées personnalisés. Pour en savoir plus sur l'utilisation d'étiquettes de métadonnées personnalisées pour la surveillance des coûts, consultez Étiquettes de métadonnées personnalisées.