Démarrage rapide du bac à sable Shell

Un bac à sable shell est un conteneur Linux géré et isolé, associé à une instance Agent Platform. Le bac à sable exécute une commande shell envoyée par votre agent et renvoie stdout, stderr et un code de sortie. Rien ne s'exécute sur votre propre infrastructure, et le conteneur est détruit lorsque le bac à sable est supprimé.

Utilisez un bac à sable shell lorsqu'un agent doit exécuter des commandes shell non fiables ou générées, installer des packages, manipuler des fichiers ou utiliser des outils de ligne de commande sans exposer votre environnement.

Limites

  • send_command() et execute_code() ne fonctionnent pas avec les bacs à sable shell. Ces méthodes ciblent les bacs à sable d'exécution de code Code Execution sandboxes et envoient des charges utiles Python, que le conteneur shell n'accepte pas. Utilisez /exec avec les bacs à sable shell.

Avant de commencer

Configurez votre projet et votre environnement.

Configurer votre projet

  1. Connectez-vous à votre Google Cloud compte. Si vous débutez sur Google Cloud, créez un compte pour évaluer les performances de nos produits en conditions réelles. Les nouveaux clients bénéficient également de 300 $ de crédits sans frais pour exécuter, tester et déployer des charges de travail.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the Gemini Enterprise Agent Platform API.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the API

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  6. Verify that billing is enabled for your Google Cloud project.

  7. Enable the Gemini Enterprise Agent Platform API.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the API

Obtenir les rôles requis

Pour utiliser le bac à sable, vous avez besoin du rôle suivant :

  • Utilisateur Agent Platform (roles/aiplatform.user) sur le projet.

Installer les bibliothèques

Installez le SDK avec le module Agent Platform :

pip install "google-cloud-aiplatform[agent_engines]"

Authentifier

Pour vous authentifier à l'aide des identifiants par défaut de l'application :

gcloud auth application-default login

Créer une instance Agent Platform

Pour utiliser un bac à sable shell, créez d'abord une instance Agent Platform. Vous n'avez pas besoin de déployer un agent pour utiliser un bac à sable shell. Sans déploiement, la création d'une instance Agent Platform ne devrait prendre que quelques secondes.

import vertexai

client = vertexai.Client(project='PROJECT_ID', location='LOCATION')

agent_engine = client.agent_engines.create()
agent_engine_name = agent_engine.api_resource.name

Remplacez les éléments suivants :

  • PROJECT_ID: ID de votre Google Cloud projet.

  • LOCATION : Google Cloud région de votre instance Agent Platform. Consultez les régions compatibles.

Créer un bac à sable shell

Vous devez fournir au moins l'un des éléments suivants lors de la création d'un bac à sable :

  • spec avec un environnement défini (shell_environment)
  • config.sandbox_environment_template (un modèle par défaut est créé si aucun n'est spécifié. Pour en savoir plus, consultez Réutiliser des modèles dans plusieurs bacs à sable)
  • config.sandbox_environment_snapshot

L'exemple suivant transmet shell_environment dans la spécification du bac à sable :

engine = (
    "projects/PROJECT_ID/locations/LOCATION"
    "/reasoningEngines/INSTANCE_ID"
)

operation = client.agent_engines.sandboxes.create(
    name=engine,
    spec={"shell_environment": {}},
    config={
        "display_name": "my-shell-sandbox",
        "wait_for_completion": True,
        "ttl": "3600s",
    },
)
sandbox = operation.response
print(sandbox.name, sandbox.state)

Lorsque le bac à sable est prêt, il affiche une réponse semblable à la suivante :

projects/.../sandboxEnvironments/1035360621853409280 SandboxState.STATE_RUNNING

Un bac à sable atteint généralement l'état STATE_RUNNING en 20 secondes environ.

Exécuter une commande

Pour exécuter une commande shell dans le bac à sable, utilisez la fonction d'assistance execute_bash(), qui envoie la commande au conteneur :

result = client.sandboxes.execute_bash(
    name=sandbox.name,
    command="echo hello && whoami && pwd",
)
print(result)

La commande renvoie stdout, stderr, returncode et duration_ms :

{'stdout': 'hello\nappuser\n/workspace\n', 'stderr': '', 'returncode': 0, 'duration_ms': 8}

execute_bash() s'authentifie avec vos propres identifiants. Vous n'avez donc pas besoin de compte de service ni de JWT signé.

Facultatif : Vous pouvez définir explicitement cwd pour choisir le répertoire de travail et timeout pour limiter la durée d'exécution de la commande. Sinon, le bac à sable utilise ses propres valeurs par défaut (/workspace et la limite de temps du bac à sable) :

result = client.sandboxes.execute_bash(
    name=sandbox.name,
    command="pytest -q",
    cwd="/workspace/app",
    timeout=120,
)

Pour savoir si une commande échoue, inspectez returncode et stderr :

result = client.sandboxes.execute_bash(
    name=sandbox.name,
    command="ls /nope",
)
print(result)
{'stdout': '', 'stderr': "ls: cannot access '/nope': No such file or directory\n", 'returncode': 2, 'duration_ms': 5}

Lorsque vous utilisez l'environnement de conteneur, tenez compte des points suivants :

  • Les commandes s'exécutent en tant qu'utilisateur non privilégié appuser. Il n'y a pas de sudo.
  • Chaque commande s'exécute dans un nouveau shell. Par conséquent, cd et les variables shell ne sont pas transférés entre les appels. Enchaînez-les dans une seule commande ou écrivez l'état dans un fichier sous /workspace.
  • L'accès Internet sortant est désactivé, sauf si le modèle l'active.

Libérer de l'espace

Pour supprimer le bac à sable et ne plus être facturé, exécutez la commande suivante :

client.agent_engines.sandboxes.delete(name=sandbox.name)
print("Sandbox deleted.")

Étape suivante