Skip to main content
Modal classes allow you to maintain state and define multiple methods that share resources.

Referencing classes

FromName

References a class from a deployed App by its name.
cls, err := mc.Cls.FromName(ctx, "my-app", "MyClass", nil)
if err != nil {
    // Handle error
}
ctx
context.Context
required
Context for the operation
appName
string
required
The name of the App containing the class
name
string
required
The name of the class
params
*ClsFromNameParams
Optional parameters
Environment
string
Environment name. Defaults to client’s environment.
CreateIfMissing
bool
Not used for classes
Returns:
  • *Cls - The class definition
  • error - NotFoundError if the class doesn’t exist

Class methods

Instance

Creates an instance of the class with the provided parameters.
instance, err := cls.Instance(ctx, map[string]any{
    "param1": "value1",
    "param2": 42,
})
if err != nil {
    // Handle error
}
ctx
context.Context
required
Context for the operation
parameters
map[string]any
Parameters to pass to the class constructor. Use nil for classes without parameters.
Returns:
  • *ClsInstance - An instance of the class with bound parameters
  • error - Error if instantiation fails or parameter validation fails

WithOptions

Returns a new Cls with runtime options overridden.
cpu := 2.0
memory := 2048

modifiedCls := cls.WithOptions(&modal.ClsWithOptionsParams{
    CPU:       &cpu,
    MemoryMiB: &memory,
    GPU:       ptr("T4"),
})
params
*ClsWithOptionsParams
Runtime configuration options
CPU
*float64
CPU request in fractional cores
CPULimit
*float64
Hard CPU limit in fractional cores
MemoryMiB
*int
Memory request in MiB
MemoryLimitMiB
*int
Hard memory limit in MiB
GPU
*string
GPU configuration (e.g., “T4”, “A100:2”)
Env
map[string]string
Environment variables
Secrets
[]*Secret
Secrets to inject
Volumes
map[string]*Volume
Volume mount points
Retries
*Retries
Retry configuration
MaxContainers
*int
Maximum number of containers
BufferContainers
*int
Number of buffer containers
ScaledownWindow
*time.Duration
Time before scaling down idle containers
Timeout
*time.Duration
Execution timeout
Returns:
  • *Cls - A new Cls with options applied

WithConcurrency

Returns a new Cls with concurrency settings configured.
target := 5
modifiedCls := cls.WithConcurrency(&modal.ClsWithConcurrencyParams{
    MaxInputs:    10,
    TargetInputs: &target,
})
params
*ClsWithConcurrencyParams
Concurrency configuration
MaxInputs
int
required
Maximum number of concurrent inputs per container
TargetInputs
*int
Target number of concurrent inputs for autoscaling
Returns:
  • *Cls - A new Cls with concurrency configured

WithBatching

Returns a new Cls with dynamic batching configured.
modifiedCls := cls.WithBatching(&modal.ClsWithBatchingParams{
    MaxBatchSize: 100,
    Wait:         500 * time.Millisecond,
})
params
*ClsWithBatchingParams
Batching configuration
MaxBatchSize
int
required
Maximum batch size
Wait
time.Duration
required
Maximum time to wait for batch to fill
Returns:
  • *Cls - A new Cls with batching configured

ClsInstance methods

Method

Retrieves a method from the class instance.
method, err := instance.Method("process")
if err != nil {
    // Handle error
}

// Call the method
result, err := method.Remote(ctx, []any{"input"}, nil)
name
string
required
The name of the method
Returns:
  • *Function - The method as a Function
  • error - NotFoundError if the method doesn’t exist

Example usage

package main

import (
    "context"
    "fmt"

    "github.com/modal-labs/modal-client/go"
)

func main() {
    ctx := context.Background()
    mc, _ := modal.NewClient()
    defer mc.Close()

    // Reference a class
    cls, err := mc.Cls.FromName(ctx, "my-app", "Model", nil)
    if err != nil {
        panic(err)
    }

    // Create an instance with parameters
    instance, err := cls.Instance(ctx, map[string]any{
        "model_name": "gpt-4",
        "temperature": 0.7,
    })
    if err != nil {
        panic(err)
    }

    // Call a method
    generateMethod, err := instance.Method("generate")
    if err != nil {
        panic(err)
    }

    result, err := generateMethod.Remote(ctx, []any{"Hello, world!"}, nil)
    if err != nil {
        panic(err)
    }
    fmt.Printf("Generated: %v\n", result)

    // Use WithOptions to override resources
    cpu := 4.0
    memory := 8192
    highResourceCls := cls.WithOptions(&modal.ClsWithOptionsParams{
        CPU:       &cpu,
        MemoryMiB: &memory,
    })

    instance2, _ := highResourceCls.Instance(ctx, nil)
    method2, _ := instance2.Method("process")
    result2, _ := method2.Remote(ctx, []any{"data"}, nil)
    fmt.Printf("Result: %v\n", result2)
}

Build docs developers (and LLMs) love