Accès réseau

Une sandbox n'ouvre aucune connexion sortante sans votre autorisation : network utilise par défaut agents.Network.none(). Toutes les sandbox exécutables, sauf DangerousLocalSandbox, acceptent les deux mêmes options pour contrôler ce qui en sort. NoSandbox n'accepte aucune des deux : elle n'ouvre aucune connexion.

  • network définit les connexions sortantes que la sandbox peut ouvrir.
  • header_bindings répertorie les identifiants que la sandbox ajoute à ces connexions, comme un token pour vos dépôts GitHub privés. Voir Liaison d'en-tête.
Autoriser les connexions

Autoriser les connexions

Construire network avec l'une des trois méthodes :

agents.Network.none()                                                   # no outbound connection
agents.Network.all()                                                    # every outbound connection
agents.Network.allow(hosts=("api.github.com", "pypi.org"))              # only HTTPS to these hosts

Chaque entrée de hosts est un nom d'hôte ou une adresse IP, avec un :port facultatif. Écrivez "pypi.org", pas "https://pypi.org" : un schéma, un chemin ou un caractère générique * provoque une erreur. La sandbox accède à ces hôtes uniquement via HTTPS. Elle refuse toute requête en http:// vers ces hôtes.

agents.Agent(
    model="mistral-large-4",
    environment=agents.BashkitSandbox(network=agents.Network.allow(hosts=("api.github.com",))),
)

Seul bash ouvre des connexions, avec des commandes comme curl. Lorsque access vaut "files" ou "none", le modèle n'a pas accès à bash : network limite alors uniquement les hooks et les scripts de configuration de votre sandbox.

Chaque type de sandbox ne peut appliquer que certaines politiques. À sa construction, une sandbox refuse toute politique qu'elle ne peut pas appliquer. Elle ne s'exécute donc jamais avec des limites moins strictes que celles que vous avez définies :

sandboxnetworkIdentifiants
NoSandboxnone()aucun
BashkitSandboxnone(), all(), allow()aucun
MistralSandboxnone(), all()GitHubBinding, MistralApiBinding, WorkspaceHeaderBindings
LocalDockerSandboxnone(), all()aucun
DangerousLocalSandboxtoujours all()aucun
experimental.CustomSandboxce que déclare la sous-classece que déclare la sous-classe
Réseau Bashkit

Réseau Bashkit

Les adresses privées et de bouclage restent bloquées, même lorsqu'un hôte dans Network.allow() correspond à l'une d'elles. Pour accéder à un service sur votre machine ou votre réseau local, par exemple pour tester une API locale, désactivez cette restriction :

agents.BashkitSandbox(
    network=agents.Network.allow(hosts=("localhost:8000",)),
    block_private_ips=False,
)
Politique réseau de la sandbox Mistral

Politique réseau de la sandbox Mistral

MistralSandbox filtre le trafic par adresse IP et accepte donc Network.none() (par défaut) ou Network.all(). Network.allow(hosts=...) provoque une erreur.

Pour autoriser uniquement certaines adresses IP, passez egress=agents.EgressPolicy.custom(allow_cidrs=...). Cette option autorise les adresses répertoriées en complément de Network.none() : vous ne pouvez donc pas la combiner avec Network.all(). Une plage /0 comme 0.0.0.0/0 provoque une erreur : utilisez plutôt Network.all().

agents.MistralSandbox()                               # no outbound access (default)

agents.MistralSandbox(network=agents.Network.all())   # unrestricted

agents.MistralSandbox(
    egress=agents.EgressPolicy.custom(
        allow_cidrs=(
            "203.0.113.10",       # single IPv4 address
            "10.0.0.0/8",         # IPv4 CIDR range
            "2001:db8::/32",      # IPv6 CIDR range
        ),
    ),
)

Chaque entrée de allow_cidrs est une adresse IPv4 ou IPv6, ou une plage CIDR. custom nécessite au moins une entrée. Les noms d'hôtes et les URL ne sont pas acceptés ; résolvez-les d'abord en adresses IP.

Liaison d'en-tête

Liaison d'en-tête

Une liaison d'en-tête ajoute un identifiant aux requêtes qui quittent la sandbox. La sandbox ne voit jamais sa valeur.

agents.Agent(
    model="mistral-large-4",
    environment=agents.MistralSandbox(
        network=agents.Network.all(),
        header_bindings=(agents.GitHubBinding(repos=("your-org/your-repo",)),),
    ),
)

Le token provient du connecteur GitHub de la personne qui démarre la session. La liaison ne nécessite donc aucun secret. Une liaison doit pouvoir accéder à ses hôtes, sinon la construction de la sandbox provoque une erreur : avec MistralSandbox, passez network=agents.Network.all(). Les références des liaisons d'en-tête répertorient les autres types, et le tableau de la section Autoriser les connexions indique les types pris en charge par chaque sandbox.

Problèmes courants

Problèmes courants

Message affichéCauseSolution
MistralSandbox does not support Network.allow(); pass network=Network.none() or network=Network.all()MistralSandbox filtre par adresse IP, pas par hôte.Utilisez Network.all(), ou autorisez des adresses avec egress=agents.EgressPolicy.custom(allow_cidrs=...).
MistralSandbox: agents.GitHubBinding needs network access to github.com, api.github.com, which Network.none() blocks; pass network=Network.all()Une liaison d'en-tête ne peut pas accéder à ses hôtes.Passez network=agents.Network.all().

Secrets : fournissez à vos outils un identifiant qui ne figure pas dans votre code.