nemo_gym.sandbox.providers.daytona.provider

View as Markdown

Daytona provider implementation.

Module Contents

Classes

NameDescription
DaytonaBatchConfigClient-side batch fanout settings.
DaytonaConfigBaseShared dataclass construction for Daytona provider config blocks.
DaytonaConnectionConfigDaytona API client connection settings.
DaytonaCreateConfigDaytona sandbox creation settings.
DaytonaCreateErrorRaised when Daytona cannot create a sandbox.
DaytonaCreateTimeoutErrorRaised when Daytona sandbox creation exceeds the client timeout.
DaytonaCreateVerificationErrorRaised when a newly-created Daytona sandbox cannot execute a probe command.
DaytonaOperationConfigRetry and timeout settings for Daytona operations after create.
DaytonaProbeConfigPost-create probe settings.
DaytonaProviderProvider backed by the Daytona Python SDK.
DaytonaProviderOptionsRecognized per-sandbox create options read from SandboxSpec.provider_options.

Functions

Data

DAYTONA_COMMAND_ERROR_PREFIX

DAYTONA_EXTENSION_PREFIX

LOGGER

PROVIDER_OPTION_EXTENSIONS

PROVIDER_OPTION_SNAPSHOT_ID

PROVIDER_OPTION_VOLUMES

RETRYABLE_ERROR_MARKERS

RETRYABLE_HTTP_STATUS_CODES

SANDBOX_ID_LABEL

STATUS_CODE_RE

API

class nemo_gym.sandbox.providers.daytona.provider.DaytonaBatchConfig(
concurrency: int = 4
)
Dataclass

Bases: DaytonaConfigBase

Client-side batch fanout settings.

concurrency
int = 4
nemo_gym.sandbox.providers.daytona.provider.DaytonaBatchConfig.__post_init__() -> None
class nemo_gym.sandbox.providers.daytona.provider.DaytonaConfigBase()

Shared dataclass construction for Daytona provider config blocks.

nemo_gym.sandbox.providers.daytona.provider.DaytonaConfigBase.from_mapping(
value: typing.Any
) -> typing.Any
classmethod
class nemo_gym.sandbox.providers.daytona.provider.DaytonaConnectionConfig(
api_key: str | None = None,
jwt_token: str | None = None,
organization_id: str | None = None,
api_url: str | None = None,
server_url: str | None = None,
target: str | None = None,
connection_pool_maxsize: int | None = None,
otel_enabled: bool | None = None
)
Dataclass

Bases: DaytonaConfigBase

Daytona API client connection settings.

api_key
str | None = None
api_url
str | None = None
connection_pool_maxsize
int | None = None
jwt_token
str | None = None
organization_id
str | None = None
otel_enabled
bool | None = None
server_url
str | None = None
target
str | None = None
nemo_gym.sandbox.providers.daytona.provider.DaytonaConnectionConfig.__post_init__() -> None
class nemo_gym.sandbox.providers.daytona.provider.DaytonaCreateConfig(
timeout_s: float = 60.0,
retries: int = 2,
retry_delay_s: float = 1.0,
retry_max_delay_s: float = 30.0,
language: str | None = None,
os_user: str | None = None,
public: bool | None = None,
auto_stop_interval: int | None = None,
auto_archive_interval: int | None = None,
auto_delete_interval: int | None = None,
ephemeral: bool | None = None,
network_block_all: bool | None = None,
network_allow_list: str | None = None
)
Dataclass

Bases: DaytonaConfigBase

Daytona sandbox creation settings.

auto_archive_interval
int | None = None
auto_delete_interval
int | None = None
auto_stop_interval
int | None = None
ephemeral
bool | None = None
language
str | None = None
network_allow_list
str | None = None
network_block_all
bool | None = None
os_user
str | None = None
public
bool | None = None
retries
int = 2
retry_delay_s
float = 1.0
retry_max_delay_s
float = 30.0
timeout_s
float = 60.0
nemo_gym.sandbox.providers.daytona.provider.DaytonaCreateConfig.__post_init__() -> None
class nemo_gym.sandbox.providers.daytona.provider.DaytonaCreateError()

Bases: SandboxCreateError

Raised when Daytona cannot create a sandbox.

class nemo_gym.sandbox.providers.daytona.provider.DaytonaCreateTimeoutError()

Bases: DaytonaCreateError

Raised when Daytona sandbox creation exceeds the client timeout.

class nemo_gym.sandbox.providers.daytona.provider.DaytonaCreateVerificationError()

Bases: SandboxCreateVerificationError

Raised when a newly-created Daytona sandbox cannot execute a probe command.

class nemo_gym.sandbox.providers.daytona.provider.DaytonaOperationConfig(
retries: int = 3,
retry_delay_s: float = 1.0,
retry_max_delay_s: float = 15.0,
command_retries: int = 0,
command_timeout_margin_s: float = 60.0,
file_timeout_s: int | None = 30 * 60,
close_timeout_s: float | None = 60.0
)
Dataclass

Bases: DaytonaConfigBase

Retry and timeout settings for Daytona operations after create.

close_timeout_s
float | None = 60.0
command_retries
int = 0
command_timeout_margin_s
float = 60.0
file_timeout_s
int | None = 30 * 60
retries
int = 3
retry_delay_s
float = 1.0
retry_max_delay_s
float = 15.0
nemo_gym.sandbox.providers.daytona.provider.DaytonaOperationConfig.__post_init__() -> None
class nemo_gym.sandbox.providers.daytona.provider.DaytonaProbeConfig(
command: str | None = 'printf nemo-rl-sandbox-ready',
expected_stdout: str | None = 'nemo-rl-sandbox-ready',
timeout_s: int = 30,
deadline_s: float | None = None
)
Dataclass

Bases: DaytonaConfigBase

Post-create probe settings.

command
str | None = 'printf nemo-rl-sandbox-ready'
deadline_s
float | None = None
expected_stdout
str | None = 'nemo-rl-sandbox-ready'
timeout_s
int = 30
nemo_gym.sandbox.providers.daytona.provider.DaytonaProbeConfig.__post_init__() -> None
class nemo_gym.sandbox.providers.daytona.provider.DaytonaProvider(
connection: nemo_gym.sandbox.providers.daytona.provider.DaytonaConnectionConfig | collections.abc.Mapping[str, typing.Any] | None = None,
create: nemo_gym.sandbox.providers.daytona.provider.DaytonaCreateConfig | collections.abc.Mapping[str, typing.Any] | None = None,
probe: nemo_gym.sandbox.providers.daytona.provider.DaytonaProbeConfig | collections.abc.Mapping[str, typing.Any] | None = None,
operations: nemo_gym.sandbox.providers.daytona.provider.DaytonaOperationConfig | collections.abc.Mapping[str, typing.Any] | None = None,
batch: nemo_gym.sandbox.providers.daytona.provider.DaytonaBatchConfig | collections.abc.Mapping[str, typing.Any] | None = None
)

Provider backed by the Daytona Python SDK.

_batch
= DaytonaBatchConfig.from_mapping(batch)
_connection
= DaytonaConnectionConfig.from_mapping(connection)
_connection_supplied_keys
_create
= DaytonaCreateConfig.from_mapping(create)
_daytona
Any | None = None
_operations
= DaytonaOperationConfig.from_mapping(operations)
_probe
= DaytonaProbeConfig.from_mapping(probe)
name
= 'daytona'
nemo_gym.sandbox.providers.daytona.provider.DaytonaProvider._await_operation(
operation_factory: typing.Callable[[], typing.Awaitable[typing.Any]],
operation: str,
sandbox_id: str,
timeout_s: float | None,
retries: int | None = None
) -> typing.Any
async
nemo_gym.sandbox.providers.daytona.provider.DaytonaProvider._base_create_kwargs(
spec: nemo_gym.sandbox.providers.base.SandboxSpec
) -> dict[str, typing.Any]
nemo_gym.sandbox.providers.daytona.provider.DaytonaProvider._client() -> typing.Any
nemo_gym.sandbox.providers.daytona.provider.DaytonaProvider._command_retry_count() -> int
nemo_gym.sandbox.providers.daytona.provider.DaytonaProvider._create_once(
spec: nemo_gym.sandbox.providers.base.SandboxSpec
) -> nemo_gym.sandbox.providers.base.SandboxHandle
async
nemo_gym.sandbox.providers.daytona.provider.DaytonaProvider._create_with_retries(
spec: nemo_gym.sandbox.providers.base.SandboxSpec
) -> nemo_gym.sandbox.providers.base.SandboxHandle
async
nemo_gym.sandbox.providers.daytona.provider.DaytonaProvider._effective_command(
command: str,
user: str | int | None
) -> str
staticmethod
nemo_gym.sandbox.providers.daytona.provider.DaytonaProvider._exec(
handle: nemo_gym.sandbox.providers.base.SandboxHandle,
command: str,
cwd: str | None = None,
env: dict[str, str] | None = None,
timeout_s: int | None = None,
user: str | int | None = None,
retries: int | None = None
) -> nemo_gym.sandbox.providers.base.SandboxExecResult
async
nemo_gym.sandbox.providers.daytona.provider.DaytonaProvider._to_create_params(
spec: nemo_gym.sandbox.providers.base.SandboxSpec
) -> typing.Any | None
nemo_gym.sandbox.providers.daytona.provider.DaytonaProvider._verify_created_handle(
handle: nemo_gym.sandbox.providers.base.SandboxHandle
) -> None
async
nemo_gym.sandbox.providers.daytona.provider.DaytonaProvider._with_generated_sandbox_id(
spec: nemo_gym.sandbox.providers.base.SandboxSpec
) -> nemo_gym.sandbox.providers.base.SandboxSpec
nemo_gym.sandbox.providers.daytona.provider.DaytonaProvider.aclose() -> None
async
nemo_gym.sandbox.providers.daytona.provider.DaytonaProvider.close(
handle: nemo_gym.sandbox.providers.base.SandboxHandle,
delete: bool = True
) -> None
async
nemo_gym.sandbox.providers.daytona.provider.DaytonaProvider.connect(
sandbox_id: str
) -> nemo_gym.sandbox.providers.base.SandboxHandle
async
nemo_gym.sandbox.providers.daytona.provider.DaytonaProvider.create(
spec: nemo_gym.sandbox.providers.base.SandboxSpec
) -> nemo_gym.sandbox.providers.base.SandboxHandle
async
nemo_gym.sandbox.providers.daytona.provider.DaytonaProvider.create_batch(
spec: nemo_gym.sandbox.providers.base.SandboxSpec,
count: int,
allow_partial: bool = False
) -> list[nemo_gym.sandbox.providers.base.SandboxHandle]
async
nemo_gym.sandbox.providers.daytona.provider.DaytonaProvider.download_file(
handle: nemo_gym.sandbox.providers.base.SandboxHandle,
source_path: str,
target_path: pathlib.Path
) -> None
async
nemo_gym.sandbox.providers.daytona.provider.DaytonaProvider.exec(
handle: nemo_gym.sandbox.providers.base.SandboxHandle,
command: str,
cwd: str | None = None,
env: dict[str, str] | None = None,
timeout_s: int | None = None,
user: str | int | None = None
) -> nemo_gym.sandbox.providers.base.SandboxExecResult
async
nemo_gym.sandbox.providers.daytona.provider.DaytonaProvider.read_file(
handle: nemo_gym.sandbox.providers.base.SandboxHandle,
source_path: str
) -> bytes
async
nemo_gym.sandbox.providers.daytona.provider.DaytonaProvider.status(
handle: nemo_gym.sandbox.providers.base.SandboxHandle
) -> nemo_gym.sandbox.providers.base.SandboxStatus
async
nemo_gym.sandbox.providers.daytona.provider.DaytonaProvider.upload_file(
handle: nemo_gym.sandbox.providers.base.SandboxHandle,
source_path: pathlib.Path,
target_path: str
) -> None
async
nemo_gym.sandbox.providers.daytona.provider.DaytonaProvider.write_file(
handle: nemo_gym.sandbox.providers.base.SandboxHandle,
target_path: str,
data: str | bytes
) -> None
async
class nemo_gym.sandbox.providers.daytona.provider.DaytonaProviderOptions(
extensions: collections.abc.Mapping[str, str] = dict(),
snapshot_id: str | None = None,
volumes: tuple[collections.abc.Mapping[str, typing.Any], ...] = ()
)
Dataclass

Recognized per-sandbox create options read from SandboxSpec.provider_options.

extensions
Mapping[str, str] = field(default_factory=dict)
snapshot_id
str | None = None
volumes
tuple[Mapping[str, Any], ...] = ()
classmethod
nemo_gym.sandbox.providers.daytona.provider._coerce_bool(
name: str,
value: typing.Any
) -> bool
nemo_gym.sandbox.providers.daytona.provider._coerce_int(
name: str,
value: typing.Any
) -> int
nemo_gym.sandbox.providers.daytona.provider._configured_or_extension(
spec: nemo_gym.sandbox.providers.base.SandboxSpec,
key: str,
configured: typing.Any
) -> typing.Any
nemo_gym.sandbox.providers.daytona.provider._daytona_error_types() -> dict[str, type[BaseException]]
nemo_gym.sandbox.providers.daytona.provider._daytona_exec_error_message(
exception: BaseException
) -> str
nemo_gym.sandbox.providers.daytona.provider._daytona_exec_error_result(
exception: BaseException
) -> nemo_gym.sandbox.providers.base.SandboxExecResult
nemo_gym.sandbox.providers.daytona.provider._exception_status_code(
exception: BaseException
) -> int | None
nemo_gym.sandbox.providers.daytona.provider._extension_value(
spec: nemo_gym.sandbox.providers.base.SandboxSpec,
key: str
) -> str | None
nemo_gym.sandbox.providers.daytona.provider._has_retryable_error_marker(
exception: BaseException
) -> bool
nemo_gym.sandbox.providers.daytona.provider._is_daytona_command_exec_error(
exception: BaseException
) -> bool
nemo_gym.sandbox.providers.daytona.provider._is_empty_daytona_command_exec_error(
exception: BaseException
) -> bool
nemo_gym.sandbox.providers.daytona.provider._is_missing_sandbox_delete_error(
exception: BaseException
) -> bool
nemo_gym.sandbox.providers.daytona.provider._is_retryable_create_error(
exception: BaseException
) -> bool
nemo_gym.sandbox.providers.daytona.provider._is_retryable_operation_error(
exception: BaseException
) -> bool
nemo_gym.sandbox.providers.daytona.provider._log_create_retry(
retry_state: typing.Any
) -> None
nemo_gym.sandbox.providers.daytona.provider._log_operation_retry(
retry_state: typing.Any
) -> None
nemo_gym.sandbox.providers.daytona.provider._mib_to_gib(
name: str,
value: typing.Any
) -> int
nemo_gym.sandbox.providers.daytona.provider._normalize_spec(
spec: nemo_gym.sandbox.providers.base.SandboxSpec
) -> nemo_gym.sandbox.providers.base.SandboxSpec
nemo_gym.sandbox.providers.daytona.provider._provider_options(
spec: nemo_gym.sandbox.providers.base.SandboxSpec
) -> nemo_gym.sandbox.providers.daytona.provider.DaytonaProviderOptions
nemo_gym.sandbox.providers.daytona.provider._quantity_to_int(
name: str,
value: typing.Any
) -> int
nemo_gym.sandbox.providers.daytona.provider._require_daytona_sdk() -> tuple[typing.Any, typing.Any, typing.Any, typing.Any, typing.Any, typing.Any]
nemo_gym.sandbox.providers.daytona.provider._require_tenacity() -> tuple[typing.Any, typing.Any, typing.Any, typing.Any]
nemo_gym.sandbox.providers.daytona.provider._resources_requested(
resources: nemo_gym.sandbox.providers.base.SandboxResources | collections.abc.Mapping[str, typing.Any]
) -> bool
nemo_gym.sandbox.providers.daytona.provider._spec_extensions(
spec: nemo_gym.sandbox.providers.base.SandboxSpec
) -> dict[str, str]
nemo_gym.sandbox.providers.daytona.provider._spec_snapshot_id(
spec: nemo_gym.sandbox.providers.base.SandboxSpec
) -> str | None
nemo_gym.sandbox.providers.daytona.provider._spec_volumes(
spec: nemo_gym.sandbox.providers.base.SandboxSpec
) -> list[dict[str, typing.Any]] | None
nemo_gym.sandbox.providers.daytona.provider._string_map(
values: dict[str, typing.Any]
) -> dict[str, str]
nemo_gym.sandbox.providers.daytona.provider._supplied_config_keys(
value: typing.Any,
config_cls: type[typing.Any]
) -> set[str]
nemo_gym.sandbox.providers.daytona.provider._to_resources(
resources: nemo_gym.sandbox.providers.base.SandboxResources | collections.abc.Mapping[str, typing.Any]
) -> typing.Any | None
nemo_gym.sandbox.providers.daytona.provider._to_sandbox_status(
value: typing.Any
) -> nemo_gym.sandbox.providers.base.SandboxStatus
nemo_gym.sandbox.providers.daytona.provider._to_volume_mounts(
volumes: list[dict[str, typing.Any]]
) -> list[typing.Any]
nemo_gym.sandbox.providers.daytona.provider.DAYTONA_COMMAND_ERROR_PREFIX = 'Failed to execute command:'
nemo_gym.sandbox.providers.daytona.provider.DAYTONA_EXTENSION_PREFIX = 'daytona.'
nemo_gym.sandbox.providers.daytona.provider.LOGGER = logging.getLogger(__name__)
nemo_gym.sandbox.providers.daytona.provider.PROVIDER_OPTION_EXTENSIONS = 'extensions'
nemo_gym.sandbox.providers.daytona.provider.PROVIDER_OPTION_SNAPSHOT_ID = 'snapshot_id'
nemo_gym.sandbox.providers.daytona.provider.PROVIDER_OPTION_VOLUMES = 'volumes'
nemo_gym.sandbox.providers.daytona.provider.RETRYABLE_ERROR_MARKERS = ('connection refused', 'connection reset', 'gateway timeout', 'http 408', 'http ...
nemo_gym.sandbox.providers.daytona.provider.RETRYABLE_HTTP_STATUS_CODES = {408, 409, 425, 429, 500, 502, 503, 504}
nemo_gym.sandbox.providers.daytona.provider.SANDBOX_ID_LABEL = 'sandbox_id'
nemo_gym.sandbox.providers.daytona.provider.STATUS_CODE_RE = re.compile('(?:status code|http)\\D+(\\d{3})', re.IGNORECASE)