Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.coreweave.com/llms.txt

Use this file to discover all available pages before exploring further.

This guide covers the @session.function() decorator for running Python functions in sandboxes.

Overview

The function decorator API lets you execute Python functions in isolated sandbox containers:
import cwsandbox
from cwsandbox import SandboxDefaults

with cwsandbox.Session(SandboxDefaults(container_image="python:3.11")) as session:
    @session.function()
    def compute(x: int, y: int) -> int:
        return x + y

    # Execute in sandbox
    result = compute.remote(2, 3).result()
    print(result)  # 5

Basic usage

Defining functions

Decorate functions with @session.function():
@session.function()
def process_data(data: dict) -> dict:
    # Code runs inside the sandbox
    import pandas as pd
    df = pd.DataFrame(data)
    return {"mean": df["value"].mean()}

Calling functions

Call .remote() on the decorated function to execute in the sandbox:
# Returns OperationRef immediately
ref = compute.remote(2, 3)

# Block for result
result = ref.result()

# One-liner
result = compute.remote(2, 3).result()

Execution methods

map() - parallel execution

Execute across multiple inputs:
@session.function()
def square(x: int) -> int:
    return x * x

# Execute for each input
refs = square.map((x,) for x in range(10))

# Collect all results
from cwsandbox import results
all_results = results(refs)  # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
With tuples for multiple arguments:
@session.function()
def add(x: int, y: int) -> int:
    return x + y

# Each tuple is unpacked as arguments
refs = add.map([(1, 2), (3, 4), (5, 6)])
all_results = results(refs)  # [3, 7, 11]

local() - local execution

Run locally without a sandbox (useful for testing):
# No sandbox created - runs in current process
result = compute.local(2, 3)
print(result)  # 5

Serialization modes

JSON (default)

Safe and human-readable, but limited to JSON-serializable types:
from cwsandbox import Serialization

@session.function(serialization=Serialization.JSON)
def process(data: dict) -> dict:
    return {"result": data["value"] * 2}

Pickle

Supports complex Python objects:
import numpy as np

@session.function(serialization=Serialization.PICKLE)
def compute_numpy(arr: np.ndarray) -> np.ndarray:
    return arr * 2

arr = np.array([1, 2, 3])
result = compute_numpy.remote(arr).result()  # array([2, 4, 6])
Use pickle when you need:
  • NumPy arrays
  • Pandas DataFrames
  • Custom class instances
  • Complex nested objects

Closures and globals

Closure variables

Functions can capture variables from their enclosing scope:
multiplier = 10

@session.function()
def multiply(x: int) -> int:
    return x * multiplier  # Captures 'multiplier'

result = multiply.remote(5).result()  # 50

Global variables

Referenced globals are serialized with the function:
CONFIG = {"threshold": 0.5}

@session.function()
def check_value(x: float) -> bool:
    return x > CONFIG["threshold"]

result = check_value.remote(0.7).result()  # True

Container image

Override the container image for specific functions:
@session.function(container_image="pytorch/pytorch:latest")
def train_model(data: dict) -> dict:
    import torch
    # GPU training code
    return {"loss": 0.01}

Error handling

Function exceptions propagate to the caller:
@session.function()
def failing_function() -> None:
    raise ValueError("Something went wrong")

try:
    failing_function.remote().result()
except Exception as e:
    print(f"Function failed: {e}")

When to use functions vs. sandboxes

Use caseRecommended API
Simple Python computationFunction decorator
Map/reduce over dataFunction decorator
Interactive workflow, multiple commandsSandbox
Streaming outputSandbox
File manipulationSandbox
Long-running processesSandbox

Limitations

The function API is intentionally simple. For complex workflows:
  • Retries/backoff: Implement in calling code
  • Task dependencies/DAGs: Use Airflow, Prefect, etc.
  • Complex scheduling: Use the sandbox API directly

Complete example

import cwsandbox
from cwsandbox import SandboxDefaults, Serialization, results
import numpy as np

defaults = SandboxDefaults(
    container_image="python:3.11",
    tags=("remote-functions-demo",),
)

with cwsandbox.Session(defaults=defaults) as session:
    # JSON serialization for simple types
    @session.function()
    def square(x: int) -> int:
        return x * x

    # Pickle for complex types
    @session.function(serialization=Serialization.PICKLE)
    def process_array(arr: np.ndarray) -> float:
        return float(arr.mean())

    # Single execution
    result = square.remote(7).result()
    print(f"7 squared: {result}")

    # Parallel execution
    refs = square.map((x,) for x in range(5))
    all_results = results(refs)
    print(f"Squares: {all_results}")

    # NumPy example
    arr = np.array([1, 2, 3, 4, 5])
    mean = process_array.remote(arr).result()
    print(f"Array mean: {mean}")
Last modified on April 21, 2026