POST /v1/sandboxes:createFromFile démarre une sandbox à partir d’un fichier téléversé. Vous envoyez un type de fichier et le contenu binaire du fichier ; la passerelle des sandboxes convertit alors le document en spécification de sandbox et suit le même processus de création que POST /v1/sandboxes.
Docker Compose (SANDBOX_FILE_TYPE_COMPOSE) est le seul type de fichier accepté. Chaque service du fichier devient un conteneur au sein d’une même sandbox, et le service que vous désignez devient le conteneur principal de la sandbox. La passerelle ne stocke pas le contenu du fichier. GET /v1/sandboxes/{sandboxId} renvoie la spécification convertie.
Ce guide porte sur les fichiers Compose qui utilisent des images précompilées et récupérables. Avant d’importer un projet existant, consultez Prise en charge de Compose.
Avant de commencer
Choisissez un identifiant d’authentification dans Choisir et obtenir des identifiants. Exécutez les commandes de l’un des onglets dans Bash, puis exécutez les requêtes dans le même shell. Pour un placement sans serveur, utilisez l’identifiant d’authentification d’un compte ayant accès aux Sandbox sans serveur. Le placement CoreWeave Kubernetes Service (CKS) nécessite un jeton CoreWeave doté du rôle Sandbox User ainsi qu’un exécuteur configuré dans la même organisation.- Clé API Forge
- Jeton d’accès à l’API CoreWeave
Remplacez Pour utiliser une autre équipe Forge que votre équipe par défaut, remplacez
[WANDB-API-KEY] par votre clé API :[WANDB-ENTITY] par le nom de l’équipe et ajoutez -H "x-entity-id: [WANDB-ENTITY]" au tableau.https://api.cwsandbox.com, avec un placement sans serveur et l’en-tête d’authentification choisi. L’API d’administration des exécuteurs utilise https://api.coreweave.com et nécessite un jeton CoreWeave doté du rôle Sandbox Admin.
Champs de la requête
La requête accepte également
mode, maxLifetimeSeconds, tags, network, objectStorageAccess, annotations, runnerIds et requestId, avec la même signification que pour POST /v1/sandboxes. networkIds renvoie UNIMPLEMENTED.
Pour un placement sur CKS, choisissez l’onglet du jeton CoreWeave et activez un exécuteur. Dans l’objet jq de l’exemple de création, définissez mode sur "SANDBOX_MODE_CKS". Pour cibler un exécuteur précis, ajoutez également runnerIds: ["[RUNNER-ID]"], en remplaçant la valeur de substitution par son ID. Pour les prérequis liés au stockage d’objets, consultez Accorder aux Sandbox l’accès à AI Object Storage.
Cette liste de champs est exhaustive. Les volumes, le type d’instance, la classe de runtime, les identifiants d’authentification pour la récupération d’images et les services publiés ne sont pas disponibles sur ce point de terminaison. Utilisez POST /v1/sandboxes si vous en avez besoin.
Créer le bac à sable
Écrivez un fichier Compose :Write compose.yaml
contents encodé en base64 :
Create a sandbox from compose.yaml
STATE_CREATING. Interrogez-la régulièrement à l’aide de son sandboxId jusqu’à ce qu’elle atteigne l’état STATE_RUNNING ou un état terminal :
Poll the sandbox
main, marqué comme principal, et HELPER_HOST, toujours défini sur helper. Dans le sandbox, helper est résolu en 127.0.0.1.
Pour relancer une création sans risque, envoyez requestId. Un même requestId associé aux mêmes entrées déclarées renvoie le sandbox existant. Un même requestId associé à des octets différents, y compris lorsque la modification ne porte que sur des caractères d’espacement, renvoie ALREADY_EXISTS avec le motif CWSANDBOX_REQUEST_ID_CONFLICT.
Créer un sandbox depuis TypeScript
Le kit de développement logiciel (SDK) TypeScript 1.0.0 prend en charge Compose viarunFromFile() et withSandboxFromFile(). Effectuez d’abord la configuration du client TypeScript, puis enregistrez le fichier sandbox-client.mts dans le même répertoire que ce script.
Utilisez le fichier compose.yaml de la section Créer le sandbox. withSandboxFromFile() attend que le sandbox soit prêt, exécute la fonction de rappel, puis arrête le sandbox dès que la fonction de rappel a renvoyé une valeur ou levé une exception :
compose.mts
Compose sandbox ready et arrête le sandbox.
Un argument de type string est toujours un chemin de fichier. Pour fournir du YAML en ligne, transmettez des octets UTF-8 avec new TextEncoder().encode(yaml). Le SDK envoie les octets tels quels, sans les reformater. Veillez à ce que le fichier ne dépasse pas la limite de 256 Kio imposée par l’API.
Dans la version 1.0.0, primaryService est requis et doit désigner un service défini dans le fichier. defaultResources définit le CPU et la mémoire de chaque service, et non de l’ensemble du projet. Il ne prend pas en charge les ressources GPU. Utilisez imageOverrides pour fournir des images récupérables aux services qui nécessiteraient autrement une compilation. Les restrictions décrites dans la section Prise en charge de Compose s’appliquent également au SDK.
Pour gérer manuellement le cycle de vie, utilisez runFromFile(), qui renvoie un handle de sandbox. Arrêtez-le dans un bloc finally. Pour les signatures des deux méthodes, voir SandboxClient. Pour les options prises en charge, voir SandboxRunFromFileOptions.
Prise en charge de Compose
Tous les services partagent un même pod et un même namespace réseau. Les noms de service sont résolus en127.0.0.1, si bien que des valeurs telles que HELPER_HOST: helper et API_BASE: http://main:8080 fonctionnent sans qu’il soit nécessaire de réécrire le fichier. La sandbox ne dispose ni d’adresses IP par service, ni de réseaux bridge, ni de répliques.
Les comportements suivants diffèrent de ceux de Docker Compose :
- Le démarrage est séquentiel. Les services non principaux démarrent les uns après les autres, avant le service principal. Dimensionnez
maxLifetimeSecondsen conséquence. Si un service ne devient jamais prêt, la sandbox reste dans l’étatSTATE_CREATING. RUNNINGne suit que le service principal. Le plantage d’un service auxiliaire après son démarrage ne fait pas échouer la sandbox.healthcheckdevient une sonde de démarrage de type exec uniquement.testdoit être une chaîne,CMD,CMD-SHELLouNONE, et les durées doivent être exprimées en secondes entières. Lorsque la sonde a épuisé ses tentatives, le conteneur est arrêté au lieu d’être marqué comme défaillant.- Les ports restent internes au pod.
exposeetportsdéclarent des ports d’écoute, mais rien n’est publié à l’extérieur. - Utilisez des images précompilées. Fournissez pour chaque service une image pouvant être récupérée, via
image:dans le fichier ou une entrée dansimageOverrides. Un service qui requiert encorebuild:renvoieUNIMPLEMENTED. commandetentrypointsuivent les formes shell et exec de Docker. Omettez-les pour utiliser les valeurs par défaut de l’image. Les valeurs explicitesnullet[]sont rejetées.- Les GPU sont réservés au service principal, via
deploy.resources.reservations.devicesavec la capacitégpuet un nombre entier positif. - Les noms doivent être des libellés DNS-1123 (
my-app, et nonMy_App) et ne peuvent pas utiliser les préfixes réservéscw-object-store-agent,cw-object-store-agent-restoreoudns-egress.
Clés non prises en charge
Le document doit être autonome : la passerelle ne lit pas votre disque et ne développe pas les variables de votre environnement. Les clés non reconnues ne sont pas ignorées, mais rejetées avec le chemin du champ en cause.
La passerelle ignore les clés
version, name du projet, labels et les clés d’extension x-*. Ne comptez pas sur la transmission des labels à la sandbox.
Erreurs courantes
Les violations de champ sont renvoyées sous forme de détailsBadRequest qui indiquent le chemin et la limite concernés. Elles ne reprennent pas le contenu de votre document.
Voir aussi
- Premiers pas : créez votre première Sandbox à partir d’une spécification.
- API d’administration des exécuteurs : gérez les exécuteurs avec un jeton d’accès à l’API CoreWeave et le rôle Sandbox Admin.
- Variables d’environnement des Sandbox : ce que la plateforme injecte dans chaque conteneur.