Hub Python Library documentation

Sandbox

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Sandbox

L'API Sandbox est expérimentale. Son API et son comportement peuvent changer sans préavis. Les sandboxes partagées sont destinées aux charges de travail au sein de la même frontière de confiance ; utilisez des sandboxes dédiées pour les charges de travail qui ne se font pas confiance mutuellement.

Consultez le guide des Sandboxes pour apprendre à les utiliser.

Sandbox

classe huggingface_hub.Sandbox

< >

( id: strserver: _SandboxServerlocal_id: str | Noneowns_sandbox: boolowns_server: boolsandbox_token: str | None = None )

Une machine cloud isolée exécutée sur Hugging Face Jobs.

L'API Sandbox est expérimentale. Son API et son comportement peuvent changer sans préavis.

Créez-en une dédiée avec Sandbox.create() (un job par sandbox) ou obtenez-en beaucoup, peu coûteuses et partagées, à partir d’un SandboxPool.

Reconnectez-vous à un bac à sable en cours d’exécution depuis n’importe où avec Sandbox.connect(). Utilisez-le comme gestionnaire de contexte pour le terminer à la sortie :

>>> from huggingface_hub import Sandbox
>>> with Sandbox.create(image="python:3.12") as sbx:
...     print(sbx.run("python --version").stdout)

fermer

< >

( )

Libérez le client HTTP local sans mettre fin au bac à sable. Idempotent.

Aucune opération pour les sandbox de pool (le client appartient à l'hôte du pool).

connect

< >

( sandbox_id: strnamespace: str | None = Nonetoken: str | None = None )

Reconnectez-vous à un bac à sable en cours d’exécution depuis n’importe où, en utilisant uniquement son identifiant.

créer

< >

( image: str = 'python:3.12'flavor: str = 'cpu-basic'idle_timeout: int | float | str | None = 600env: dict[str, typing.Any] | None = Nonesecrets: dict[str, typing.Any] | None = Nonevolumes: typing.Optional[typing.List[huggingface_hub._space_api.Volume]] = Nonenamespace: str | None = Noneforward_hf_token: bool = Falselabels: dict[str, str] | None = Nonestart_timeout: float = 120.0token: str | None = None )

Paramètres

  • image (str, facultatif, par défaut "python --3.12") : Toute image Docker avec /bin/sh (Docker Hub ou hf.co/spaces/...).
  • flavor (str, facultatif, par défaut "cpu-basic") — Variante de matériel, par exemple "cpu-basic", "a10g-small". Voir hf jobs hardware.
  • idle_timeout (int ou float ou str, facultatif, valeur par défaut 600) — Arrêt automatique après cette durée d'inactivité (aucun appel API, aucun processus en cours). La valeur par défaut est de 10 minutes ; passez None pour désactiver cette fonction. Notez qu'une commande en foreground n'est actuellement pas comptée comme une activité, de sorte qu'un unique appel run() qui prend plus de temps que cette durée, sans autre trafic API, peut entraîner l'arrêt de son bac à sable — augmentez le délai d'attente (ou passez None) pour les commandes uniques de longue durée.
  • env (dict[str, Any], facultatif) — Variables d’environnement disponibles dans le bac à sable.
  • secrets (dict[str, Any], facultatif) — Variables d'environnement secrètes (chiffrées côté serveur).
  • volumes (List[Volume], facultatif) — Dépôts/bacs HF à monter, voir Volume.
  • namespace (str, facultatif) — Espace de nommage de l'utilisateur ou de l'organisation sous lequel exécuter (par défaut, l'utilisateur actuel).
  • forward_hf_token (bool, facultatif, par défaut False) — Si True, votre jeton HF est injecté en tant que HF_TOKEN (opt-in).
  • labels (dict[str, str], facultatif) — Étiquettes à associer au Job HF sous-jacent.
  • start_timeout (float, facultatif, par défaut 120.0) — Nombre maximal de secondes à attendre que le bac à sable soit prêt.
  • token (str, facultatif) — Remplacement du jeton HF.

Créez un bac à sable dédié (un Job HF) et bloquez jusqu'à ce qu'il soit prêt (~7 s sur cpu-basic).

Chaque bac à sable est une VM isolée complète, ce qui en fait le bon choix pour les charges de travail GPU ou le code non fiable. Pour déployer de nombreux bacs à sable CPU peu coûteux, utilisez plutôt SandboxPool.

Le job s'exécute avec une durée de vie maximale fixe de 24 h ; idle_timeout est le véritable gardien — un bac à sable inactif se ferme bien avant cela.

L’image n’a besoin que de /bin/sh. Le serveur sandbox est téléchargé au démarrage avec wget/curl si disponible, sinon lu depuis un bucket de serveur toujours monté (ce qui ajoute ~2-3 s au démarrage à froid, donc inclure wget/curl le maintient rapide).

processus

< >

( )

Listez les processus en arrière-plan de cette sandbox.

Retourne les processus démarrés avec Sandbox.run()(..., background=True) ; arrêtez-en un avec SandboxProcess.kill(). Les processus récemment terminés restent listés (avec running=False et leur exit_code) ; le serveur conserve un nombre limité de ces processus, de sorte qu’une sandbox ayant exécuté des milliers de commandes courtes ne les listera pas tous.

proxy_url_for

< >

( port: int | strpath: str = '/'scheme: str = 'https://' ) → str

Paramètres

  • port (int ou str) — Le port (pool : le <port> du socket unix) sur lequel le serveur interne écoute.
  • path (str, facultatif, par défaut "/") — Chemin sur le serveur interne à cibler, par exemple "/ws".
  • scheme (str, facultatif, par défaut "https --//") : Schéma d’URL à utiliser pour construire le lien. Par défaut, "https://" ; passez "wss://" pour un client WebSocket (le proxy est indépendant du protocole, seul le schéma côté client change).

Retourne

str

une URL de la forme https://<job_id>--49983.hf.jobs/v1/.../proxy/8000/ws (ou wss://... avec scheme="wss://").

URL publique qui effectue un proxy vers un serveur exécuté à l'intérieur de cette sandbox.

Les requêtes envoyées à l’URL renvoyée sont transmises par le serveur sandbox du job vers un serveur que vous avez démarré dans le sandbox sur le port, y compris les mises à niveau WebSocket (ws(s)://) et les réponses en streaming. Associez-le à proxy_headers pour l’authentification.

Comment le bac à sable doit écouter sur le port :

  • Pool / bac à sable partagé : il ne peut pas lier un port TCP (Landlock), il faut donc lier un socket unix à $SBX_PROXY_DIR/<port>.sock (la variable d’environnement SBX_PROXY_DIR est définie dans chaque bac à sable). Par exemple : uvicorn app:app --uds $SBX_PROXY_DIR/8000.sock.
  • Sandbox dédié : liez un port TCP normal sur 127.0.0.1:<port>. (Vous pouvez également exposer le port directement via le proxy du job sans passer par ici.)

Exemple :

>>> url = sandbox.proxy_url_for(8000, "/ws", scheme="wss://")
>>> import websockets
>>> async with websockets.connect(url, additional_headers=sandbox.proxy_headers) as ws:
...     await ws.send("hello")

run

< >

( cmd: typing.Union[str, typing.List[str]]shell: bool | None = Noneenv: dict[str, typing.Any] | None = Nonecwd: str | None = Nonetimeout: float | None = Nonestdin: str | None = Noneon_stdout: typing.Optional[typing.Callable[[str], NoneType]] = Noneon_stderr: typing.Optional[typing.Callable[[str], NoneType]] = Nonecheck: bool = Truecapture_output: bool = Truebackground: bool = False )

Paramètres

  • cmd (str ou List[str]) — Une chaîne de commande shell (exécutée avec /bin/sh -c) ou une liste argv (exécutée directement).
  • shell (bool, facultatif) — Force le mode d’exécution au lieu de le déduire du type de cmd. True exécute via /bin/sh -c et exige que cmd soit une chaîne de caractères ; False exécute cmd directement et exige qu’il s’agisse d’une liste argv. None (par défaut) déduit le mode à partir du type. Définissez-le explicitement pour éviter les pièges liés au type (par ex. ["echo hi"] exécuté comme un seul programme nommé "echo hi").
  • env (dict[str, Any], facultatif) — Variables d'environnement supplémentaires pour cette commande.
  • cwd (str, facultatif) — Répertoire de travail.
  • timeout (float, facultatif) — Interrompt la commande (groupe de processus entier) après ce nombre de secondes.
  • stdin (str, facultatif) — Données à écrire dans la stdin de la commande.
  • on_stdout (Callable[[str], None], facultatif) — Callback appelé avec les fragments de stdout à mesure qu'ils arrivent.
  • on_stderr (Callable[[str], None], facultatif) — Callback appelé avec les fragments de stderr à mesure qu'ils arrivent.
  • check (bool, facultatif, par défaut True) — Si True, lève SandboxCommandError en cas de code de sortie non nul.
  • capture_output (bool, facultatif, par défaut True) — Si True, accumule stdout/stderr dans le résultat renvoyé. Passez False si vous ne souhaitez que on_stdout/on_stderr : la sortie est alors transmise aux callbacks et ignorée, de sorte qu'une commande produisant des gigaoctets n'a pas à tenir en mémoire. result.stdout/result.stderr sont vides dans ce cas.
  • background (bool, facultatif, par défaut False) — Si True, démarre la commande en tâche détachée et renvoie immédiatement un SandboxProcess au lieu d’attendre son exécution et de renvoyer un SandboxCommandResult.

Exécuter une commande dans le bac à sable et attendre sa fin, en diffusant la sortie en direct.

Avec background=True, la commande est lancée en tâche détachée et run renvoie immédiatement un SandboxProcess, sans attendre sa fin — pratique pour les serveurs et autres processus de longue durée. Vous pouvez les lister plus tard avec Sandbox.processes() et en arrêter un avec SandboxProcess.kill(). Les options de streaming/attente uniquement (timeout, stdin, on_stdout, on_stderr, check) ne s’appliquent pas dans ce mode.

Retourne : un SandboxCommandResult (avec exit_code, stdout, stderr, duration_ms), ou un SandboxProcess lorsque background=True.

SandboxPool

classe huggingface_hub.SandboxPool

< >

( image: str = 'python:3.12'flavor: str = 'cpu-basic'sandboxes_per_host: int = 50warm_up: int = 1max_hosts: int | None = Nonename: str | None = Noneidle_timeout: int | float | str | None = 600namespace: str | None = Nonestart_timeout: float = 120.0adopt_hosts: str = 'own'token: str | None = None_connect_mode: bool = False )

Une flotte de tâches « host » partagées, chacune regroupant de nombreux sandboxes isolés par landlock.

L'API Sandbox est expérimentale. Son API et son comportement peuvent changer sans préavis.

Les sandbox mutualisées sont destinées aux charges de travail au sein d’une même frontière de confiance. Une sandbox mutualisée est un uid associé à un ensemble de règles Landlock au sein d’une VM partagée — et non d’une VM dédiée — et toutes les sandbox d’un hôte partagent le jeton d’authentification de cet hôte ainsi que son plan de contrôle privilégié. Utilisez un pool pour déployer à moindre coût votre propre code. Pour des charges de travail mutuellement méfiantes, utilisez Sandbox.create(), qui attribue à chacune sa propre VM. Les lacunes spécifiques sont répertoriées sous « Limitations connues » dans le guide conceptuel des sandbox.

Un hôte correspond à un Job HF facturé (une VM) ; il exécute le serveur de sandbox et multiplexe jusqu'à sandboxes_per_host sandboxes légères, isolées les unes des autres par uid + le Landlock LSM. Cela rend les déploiements à grande échelle peu coûteux (le coût de la VM est partagé entre toutes ses sandboxes) et rapides (la création d'une sandbox représente environ un aller-retour proxy une fois l'hôte chaud). Idéal pour de nombreuses sandboxes CPU parallèles, telles que les rollouts RL ; pour le GPU ou une isolation au niveau VM forte entre des charges de travail mutuellement méfiantes, utilisez plutôt Sandbox.create().

Le constructeur pré-alloue warm_up hôtes (1 par défaut) et bloque jusqu'à ce qu'ils soient prêts ; les hôtes supplémentaires sont ensuite alloués à la demande au fur et à mesure que des sandboxes sont demandés, et tous

sont démontés lors de l’appel de close() (ou en cas d’inactivité, via idle_timeout). L’utilisateur ne gère jamais les tâches :

>>> from huggingface_hub import SandboxPool
>>> with SandboxPool(image="python:3.12", flavor="cpu-basic", warm_up=2) as pool:
...     boxes = [pool.create() for _ in range(100)]   # packed across the warm hosts
...     print(boxes[0].run("echo hi").stdout)
hi

create() crée une sandbox à la fois : il réutilise un hôte qui dispose encore de capacité libre avant d’en démarrer un nouveau, de sorte que la capacité augmente à la demande au fur et à mesure que le travail arrive. Pour éviter un démarrage à froid lors des premiers appels, pré-provisionnez des hôtes avec warm_up (ou warm). Les hôtes chauds sont découverts via les étiquettes de tâche, de sorte que la réutilisation fonctionne également entre processus (un nouveau pool avec la même image/flavor/name se connecte à

héberge une exécution antérieure laissée en place) :

>>> pool = SandboxPool(image="python:3.12")
>>> sbx = pool.create()    # finds a warm host (here or in another process), else boots one

fermer

< >

( )

Libère le pool. Idempotent.

Pour un pool que nous avons créé, cela met fin à tous les jobs d’hôtes (et donc à tous leurs sandboxes). Pour un handle obtenu via connect(), cela ne libère que les clients HTTP locaux : les hôtes partagés peuvent servir d’autres clients, donc — comme Sandbox.connect() — quitter un bloc with ne doit pas les détruire. Mettez fin explicitement aux hôtes d’un pool connecté avec hf sandbox pool delete <id>.

Seuls les hôtes qui ont démarré sont annulés. Un hôte découvert via des étiquettes peut servir les boîtes à sable d’un autre processus, il est donc libéré plutôt que terminé.

Lève SandboxError si un travail hôte n’a pas pu être annulé, en indiquant les travaux toujours en cours d’exécution — ils continuent d’être facturés et leurs entrées de cache sont conservées afin de rester découvrables. Lorsque close() est atteint via __exit__ alors qu’une exception est déjà en cours, l’échec est journalisé à la place, afin de ne pas masquer l’erreur d’origine.

connect

< >

( pool_id: strnamespace: str | None = Noneadopt_hosts: str = 'own'token: str | None = None )

Paramètres

  • pool_id (str) — L'identifiant renvoyé lors de la première création du pool.
  • namespace (str, facultatif) — Espace de noms dans lequel rechercher les hôtes du pool (par défaut, le vôtre).
  • adopt_hosts (str, facultatif, par défaut "own") — Hôtes auxquels il est possible de se connecter. Voir SandboxPool. La reconnexion à un pool dont les hôtes ont été démarrés par un autre membre de l’espace de noms nécessite "namespace".
  • token (str, facultatif) — Remplacement du jeton HF.

Se reconnecter à un pool en cours d’exécution par son identifiant, depuis n’importe quelle machine — aucun état local requis.

Recherche un hôte en cours d’exécution étiqueté avec pool_id et reconstruit la configuration du pool (image/flavor/density/host-idle) à partir de la spécification et des variables d’environnement du job de cet hôte, en renvoyant un SandboxPool prêt à create() d’autres sandboxes — en les regroupant sur les hôtes en cours d’exécution, ou en démarrant un duplicata (même configuration) lorsque ceux-ci sont pleins.

Lève SandboxError si aucun hôte en cours d’exécution n’est trouvé (un pool cesse d’exister dès que tous ses hôtes ont disparu — par expiration d’inactivité ou par arrêt).

créer

< >

( env: dict[str, typing.Any] | None = Noneidle_timeout: int | float | str | None = 600forward_hf_token: bool = False )

Paramètres

  • env (dict[str, Any], facultatif) — Variables d’environnement pour ce bac à sable (chaque bac à sable en possède ses propres).
  • idle_timeout (int ou float ou str, facultatif, valeur par défaut 600) — Délai d'inactivité par bac à sable — un bac à sable est évacué de son hôte après cette durée d'inactivité (aucun appel API, aucun processus en cours). Distinct du délai d'inactivité de l'hôte. Passez None pour le désactiver.
  • forward_hf_token (bool, facultatif, valeur par défaut False) — Si True, injecte votre jeton HF en tant que HF_TOKEN dans le bac à sable (optionnel). Contrairement aux secrets d’un bac à sable dédié, l’environnement d’un bac à sable mutualisé est transmis au serveur hôte lors de sa création (jamais stocké dans le travail hôte), il ne figure donc dans les métadonnées d’aucun travail.

Créez un seul bac à sable, en provisionnant un hôte si nécessaire.

Réutilise un hôte disposant d’une capacité libre (celui de ce pool, ou un hôte chaud trouvé via les étiquettes de tâche / le cache local) avant d’en démarrer un nouveau, de sorte qu’un create() sur un hôte chaud coûte environ un aller-retour. Appelez-le de manière répétée pour répartir la charge ; utilisez warm_up (ou warm) pour pré-provisionner les hôtes et éviter un démarrage à froid lors des premiers appels. Si un hôte se remplit sous nos pieds (un autre processus l’a saturé) ou si un hôte en cache a disparu, le sandbox est repositionné sur un autre hôte (ou un hôte neuf).

warm

< >

( num_hosts: int = 1 )

Vérifiez que num_hosts hôte(s) vide(s) sont en cours d’exécution et laissez-les tels quels. Renvoie les identifiants des tâches des hôtes du pool.

Utilisé pour « créer » un pool à l’avance : les hôtes portent l’étiquette et la configuration du pool (dans leurs variables d’environnement), de sorte qu’un appel ultérieur à SandboxPool.connect(pool_id) (même depuis une autre machine) les trouve et crée des sandboxes sans démarrage à froid. Les hôtes continuent d’être facturés jusqu’à leur arrêt ou leur inactivité.

Adopte les hôtes déjà en cours d’exécution pour ce pool (trouvés via les étiquettes de tâche) avant le démarrage, de sorte qu’un warm() après connect() — ou un warm() répété — complète jusqu’à num_hosts au lieu de dupliquer les hôtes actifs et de dépasser max_hosts.

Structures de données

SandboxCommandResult

classe huggingface_hub.SandboxCommandResult

< >

( exit_code: int | Nonestdout: strstderr: strsignal: int | None = Nonetimed_out: bool = Falseduration_ms: int = 0 )

Résultat d'une commande exécutée dans un bac à sable avec Sandbox.run().

SandboxProcess

classe huggingface_hub.SandboxProcess

< >

( id: str | Nonepid: intcmd: typing.Union[str, typing.List[str]]_sandbox: Sandboxtag: str | None = Nonestarted_at_ms: int | None = Nonerunning: bool = Trueexit_code: int | None = None )

Un processus en arrière-plan démarré dans un bac à sable avec Sandbox.run()(..., background=True).

Listez les processus d’un bac à sable avec Sandbox.processes() et arrêtez-en un avec SandboxProcess.kill(). Les processus récemment terminés restent dans la liste (le serveur conserve un nombre limité de processus), de sorte que running et exit_code indiquent si un processus est toujours actif ou s’il a déjà quitté (au moment où il a été listé).

kill

< >

( )

Arrêter le processus en arrière-plan. Idempotent.

Indique si cet appel est celui qui l'a arrêtée : False signifie qu'elle s'était déjà terminée ou avait été interrompue, ce qui n'est pas une erreur.

Notez qu'un descendant qui se détache via setsid() quitte le groupe de processus signalé et survit à cet appel. Supprimez le bac à sable pour vous assurer que tout ce qu'il a démarré a bien été supprimé.

FileEntry

classe huggingface_hub._sandbox.FileEntry

< >

( name: strpath: strtype: typing.Literal['file', 'dir', 'symlink']size: intmtime_ms: int | None = Nonemode: str = '' )

Un fichier ou un répertoire à l'intérieur d'un bac à sable.

Erreurs

SandboxError

classe huggingface_hub.errors.SandboxError

< >

( message: strstatus_code: int | None = None )

Paramètres

  • status_code — Le code de statut HTTP renvoyé par le serveur dans le bac à sable, si l’erreur provient d’une réponse d’API (par exemple 404 pour un fichier manquant). None sinon.

Exception de base pour les opérations de bac à sable (voir huggingface_hub.Sandbox).

SandboxCommandError

classe huggingface_hub.errors.SandboxCommandError

< >

( cmdresult )

Paramètres

  • cmd — La commande qui a échoué.
  • result — Le SandboxCommandResult complet (exit_code, stdout, stderr, …).

Lévé lorsqu'une commande exécutée dans un bac à sable se termine avec un code non nul.

Update on GitHub