Skip to main content
Ces exemples utilisent un jeton d’accès à l’API CoreWeave défini dans CWSANDBOX_API_KEY. Pour l’authentification par clé API Forge, voir Premiers pas. Pour les exigences relatives à CKS, voir Modes de placement. Ce guide vous aide à choisir entre les modèles synchrones et asynchrones dans le SDK Python de sandbox CoreWeave (cwsandbox) et présente les variantes synchrone et asynchrone de chaque opération courante. En interne, le SDK repose sur une implémentation asynchrone unique. Le choix entre synchrone et asynchrone tient uniquement à la manière dont vous consommez les résultats : utilisez .result() en mode synchrone et await en mode asynchrone.

Guide de décision rapide

Règle générale : privilégiez l’approche synchrone (.result()) pour plus de simplicité. Ne passez à await que si vous travaillez déjà dans une base de code asynchrone.

Concept fondamental : OperationRef

La plupart des méthodes du SDK renvoient OperationRef[T], un encapsuleur qui prend en charge à la fois l’appel à .result() et await. Les deux approches lèvent les mêmes exceptions.
Sandbox.exec() renvoie Process, qui étend OperationRef[ProcessResult] en y ajoutant la diffusion en continu et stdin.
N’utilisez jamais .result() dans un contexte asynchrone. Appeler .result() bloque le thread. Dans un contexte asynchrone, cela bloque la boucle d’événements et peut provoquer un interblocage de votre application. Utilisez plutôt await.

Comportement de démarrage automatique

session.sandbox() renvoie une sandbox non démarrée. La sandbox démarre automatiquement lors de la première opération qui la nécessite : Déclenchent le démarrage automatique : exec(), read_file(), write_file(), wait(), wait_until_complete() Ne déclenchent pas le démarrage automatique : get_status() (lève SandboxNotRunningError), stop() (no-op si la sandbox n’a jamais démarré)

Opérations

Créer des Sandbox

Sandbox.run() appelle start().result() en interne, ce qui bloque la boucle d’événements. Dans du code asynchrone, instanciez l’objet avec Sandbox(...) et utilisez async with ou await sandbox pour atteindre le statut RUNNING sans bloquer l’exécution.

start()

exec()

read_file()

write_file()

stop()

wait()

wait() bloque l’exécution jusqu’à ce que la sandbox atteigne le statut RUNNING. Cette méthode est sync-only, car le blocage est précisément le but recherché. Dans du code asynchrone, await sandbox produit le même effet.

wait_until_complete()

get_status()

get_status() est sync-only. Cette méthode récupère le statut actuel auprès de l’API.

Sandbox.list()

Sandbox.from_id()

Sandbox.delete()

session.list()

session.from_id()

Diffuser la sortie stdout en continu

Transmettre stdin en flux

Activez stdin avec stdin=True. Utilisez write() pour les octets bruts, writeline() pour les lignes de texte et close() pour signaler la fin de fichier (EOF).

cwsandbox.results()

cwsandbox.results() est un utilitaire de traitement par lot sync-only. Il appelle .result() sur un ou plusieurs objets OperationRef.

cwsandbox.wait()

cwsandbox.wait() est sync-only. Cette fonction attend une séquence d’objets Sandbox, OperationRef ou Process et renvoie (done, pending). Une Sandbox est résolue dès qu’elle atteint le statut RUNNING, et non à son achèvement.

@session.function()

Exécution parallèle

L’API synchrone prend en charge l’exécution parallèle, car les opérations sont non-blocking dès la conception. Les méthodes telles que exec(), read_file() et write_file() rendent la main immédiatement. Le blocage n’intervient que lorsque vous appelez .result(). Sandbox.run() reste bloquante jusqu’à ce que le backend accepte la requête de démarrage (elle appelle start().result() en interne). Pour un démarrage parallèle, utilisez session.sandbox() (démarrage automatique à la première opération) ou collectez les réf. renvoyées par start() :

Notebooks Jupyter

L’API synchrone fonctionne dans Jupyter sans nest_asyncio, car le SDK exécute sa propre boucle d’événements en arrière-plan dans un thread démon :
Pour le code asynchrone dans Jupyter, vous pouvez utiliser await directement, car Jupyter dispose d’une boucle d’événements intégrée :

Gestion des erreurs

Les modes synchrone et asynchrone lèvent les mêmes exceptions. .result() relance toute exception issue de l’opération sous-jacente, tout comme await. Consultez Que signifient les messages d’erreur courants du SDK Sandbox ? pour connaître la hiérarchie complète des exceptions et les stratégies de récupération.
Dernière modification le 15 octobre 2026