---
title: Lium
sidebar_label: Lium
sidebar_position: 1
---

> ## Documentation Index
> Fetch the complete documentation index at: https://docs.lium.io/llms.txt
> Use this file to discover all available pages before exploring further.

<!-- Generated by scripts/generate_sdk_reference.py. Do not edit directly. -->

# Lium

```python
from lium.sdk import Lium
```

Defined in `lium.sdk.client`.

Clean Unix-style SDK for Lium.

```python
Lium(config: Optional[lium.sdk.config.Config] = None, source: str = 'sdk')
```

## Attributes

| Name | Type | Description |
| --- | --- | --- |
| `config` |  |  |
| `headers` |  |  |

## Methods

| Method | Description |
| --- | --- |
| [`list_ssh_keys`](#list_ssh_keys) | Return SSH keys registered for the current user. |
| [`register_ssh_key`](#register_ssh_key) | Register a new SSH public key under the current user. |
| [`default_ssh_key_name`](#default_ssh_key_name) | cli-&lt;user&gt;@&lt;host&gt; sanitised to A-Za-z0-9.@-. |
| [`up`](#up) | Start a new pod on a specific node. |
| [`pod`](#pod) | Retrieve detailed information about a specific pod. |
| [`logs`](#logs) | Stream logs from a pod. |
| [`edit`](#edit) | Edit a pod's template configuration. |
| [`ls`](#ls) | List available nodes. |
| [`ps`](#ps) | List active pods. |
| [`down`](#down) | Stop a pod. |
| [`rm`](#rm) | Remove pod (alias for down()). |
| [`reboot`](#reboot) | Reboot a pod. |
| [`get_default_images`](#get_default_images) | Get default images for GPU type and driver version. |
| [`default_docker_template`](#default_docker_template) | Resolve the best default template for a node ID. |
| [`templates`](#templates) | List available templates. |
| [`get_executor`](#get_executor) | Resolve a node by ID. |
| [`gpu_types`](#gpu_types) | Get list of available GPU types. |
| [`get_template`](#get_template) | Fetch a template by ID/HUID/name. |
| [`get_template_by_image_name`](#get_template_by_image_name) | Fetch a template by its Docker image + tag. |
| [`ssh_connection`](#ssh_connection) | SSH connection context manager. |
| [`exec`](#exec) | Execute a shell command on a pod over SSH. |
| [`stream_exec`](#stream_exec) | Execute a shell command and stream incremental output. |
| [`exec_all`](#exec_all) | Execute a shell command on multiple pods in parallel. |
| [`wait_ready`](#wait_ready) | Poll until a pod reports RUNNING + SSH metadata. |
| [`scp`](#scp) | Upload a local file to a pod via SFTP. |
| [`download`](#download) | Download a file from a pod via SFTP. |
| [`upload`](#upload) | Upload a file to a pod via SFTP. |
| [`ssh`](#ssh) | Get SSH command string for connecting to a pod. |
| [`rsync`](#rsync) | Sync directories with rsync. |
| [`switch_template`](#switch_template) | Switch the template of a running pod. |
| [`create_template`](#create_template) | Create a new template. |
| [`wait_template_ready`](#wait_template_ready) | Wait for template verification to complete. |
| [`get_my_user_id`](#get_my_user_id) | Get the current user's ID. |
| [`update_template`](#update_template) | Update an existing template owned by the caller. |
| [`wallets`](#wallets) | Get the caller's configured funding wallets. |
| [`add_wallet`](#add_wallet) | Link a Bittensor wallet with the user account. |
| [`convert_alpha`](#convert_alpha) | Quote usd (USD) -&gt; alpha via GET /balance/convert/alpha. |
| [`company_wallet`](#company_wallet) | Resolve the Lium destination coldkey via GET /wallet/company/?appid=. |
| [`backup_create`](#backup_create) | Create or replace a backup configuration for a pod. |
| [`backup_now`](#backup_now) | Trigger an immediate backup for a pod. |
| [`backup_config`](#backup_config) | Return the backup configuration for a pod if one exists. |
| [`backup_list`](#backup_list) | List all backup configurations across all pods. |
| [`backup_logs`](#backup_logs) | Get recent backup logs for a pod. |
| [`backup_delete`](#backup_delete) | Delete a backup configuration by ID. |
| [`restore`](#restore) | Restore a backup to a pod. |
| [`restore_logs`](#restore_logs) | Get recent restore logs for a pod. |
| [`get_deployment_estimate`](#get_deployment_estimate) | Estimate deployment time for a template on a node. |
| [`balance`](#balance) | Get current account balance. |
| [`topup_currencies`](#topup_currencies) | List stablecoin currencies/networks supported for self-serve top-ups. |
| [`topup_create_invoice`](#topup_create_invoice) | Create a stablecoin top-up invoice for the current account. |
| [`volumes`](#volumes) | List all volumes for the current user. |
| [`volume`](#volume) | Get a specific volume by ID. |
| [`volume_create`](#volume_create) | Create a new volume. |
| [`volume_update`](#volume_update) | Update a volume's metadata. |
| [`volume_delete`](#volume_delete) | Delete a volume. |
| [`schedule_termination`](#schedule_termination) | Schedule a pod for automatic termination at a future date and time. |
| [`cancel_scheduled_termination`](#cancel_scheduled_termination) | Cancel a scheduled termination for a pod. |
| [`install_jupyter`](#install_jupyter) | Install Jupyter Notebook on a pod. |

### list_ssh_keys

```python
def list_ssh_keys() -> List[lium.sdk.models.SSHKey]:
```

Return SSH keys registered for the current user.

### register_ssh_key

```python
def register_ssh_key(*, name: str, public_key: str) -> lium.sdk.models.SSHKey:
```

Register a new SSH public key under the current user.

### default_ssh_key_name

```python
def default_ssh_key_name() -> str:
```

``cli-<user>@<host>`` sanitised to ``[A-Za-z0-9._@-]``.

### up

```python
def up(
    *,
    executor_id: str,
    name: str = 'Your Pod',
    template_id: Optional[str] = None,
    volume_id: Optional[str] = None,
    ports: Optional[int] = None,
    ssh_keys: Optional[List[str]] = None,
    ssh_name: Optional[str] = None
) -> Dict[str, Any]:
```

Start a new pod on a specific node.

**Arguments:**
 - **executor_id:**  Target node ID string.
 - **name:**  Human-friendly pod name (defaults to ``"Your Pod"``).
 - **template_id:**  Template ID. Defaults to the node's default template.
 - **volume_id:**  Optional volume ID to attach on spawn.
 - **ports:**  Number of exposed ports to request.
 - **ssh_keys:**  SSH public keys to authorize. Defaults to the keys discovered by the Config.
 - **ssh_name:**  Optional name to use when registering a new SSH key with the
   backend. Defaults to ``cli-<user>@<hostname>``. Only applied to keys
   that are not already registered server-side.

**Returns:**
Pod metadata as returned by the rent API (id, name, status, ssh command, etc.).

### pod

```python
def pod(pod_id: str) -> Dict[str, Any]:
```

Retrieve detailed information about a specific pod.

**Arguments:**
 - **pod_id:**  The unique identifier of the pod to retrieve.

**Returns:**
Raw pod data dictionary including template, node, status, and connection info.

### logs

```python
def logs(
    pod_id: str,
    *,
    tail: int = 100,
    follow: bool = False
) -> Generator[bytes, NoneType, NoneType]:
```

Stream logs from a pod.

**Arguments:**
 - **pod_id:**  The unique identifier of the pod.
 - **tail:**  Number of lines to retrieve from the end of the logs (default: 100).
 - **follow:**  If True, stream logs continuously (default: False).

**Yields:**
Log lines as bytes.

### edit

```python
def edit(pod_id: str, **kwargs) -> Dict[str, Any]:
```

Edit a pod's template configuration.

Updates the template associated with a pod by merging the provided
keyword arguments with the existing template settings.

**Arguments:**
 - **pod_id:**  The unique identifier of the pod whose template to edit.
 - `**kwargs`:  Template fields to update. Common fields include:
   - docker_image (str): Docker image repository.
   - docker_image_tag (str): Docker image tag.
   - startup_commands (str): Commands to run on container start.
   - internal_ports (List[int]): Ports to expose.
   - environment (Dict[str, str]): Environment variables.
   - volumes (List[str]): Volume mount paths.

**Returns:**
Updated template data dictionary from the API.

**Example:**
```python
lium.edit(pod_id, startup_commands="python main.py", environment={"DEBUG": "1"})
```

### ls

```python
def ls(
    *,
    gpu_type: Optional[str] = None,
    gpu_count: Optional[int] = None,
    lat: Optional[float] = None,
    lon: Optional[float] = None,
    max_distance_miles: Optional[int] = None,
    min_cuda_version: Optional[float] = None
) -> List[lium.sdk.models.ExecutorInfo]:
```

List available nodes.

**Arguments:**
 - **gpu_type:**  Optional GPU filter such as ``"A100"`` or ``"H200"``.
 - **gpu_count:**  Exact GPU count to match (defaults to 8, pass ``None`` to disable).
 - **lat:**  Optional latitude for geospatial filtering. Must be used together with ``lon`` and ``max_distance_miles``.
 - **lon:**  Optional longitude for geospatial filtering. Must be used together with ``lat`` and ``max_distance_miles``.
 - **max_distance_miles:**  Optional radius (in miles) for geospatial filtering. Must be used together with ``lat`` and ``lon``.
 - **min_cuda_version:**  Optional minimum CUDA version to require (e.g. ``12.4``). Nodes whose
   ``max_cuda_version`` is ``None`` or below this threshold are excluded. NVIDIA drivers are
   backward compatible, so a node with a higher driver CUDA version satisfies the requirement.

**Returns:**
A list of [`ExecutorInfo`](/developers/sdk/reference/models/executor-info) objects that satisfy the filters.

### ps

```python
def ps() -> List[lium.sdk.models.PodInfo]:
```

List active pods.

**Returns:**
List of [`PodInfo`](/developers/sdk/reference/models/pod-info) objects representing the caller's running pods.

### down

```python
def down(pod: lium.sdk.models.PodInfo) -> Dict[str, Any]:
```

Stop a pod.

**Arguments:**
 - **pod:**  Pod to terminate.

**Returns:**
API response payload from the delete call.

### rm

```python
def rm(pod: lium.sdk.models.PodInfo) -> Dict[str, Any]:
```

Remove pod (alias for `down()`).

**Arguments:**
 - **pod:**  Pod to terminate.

**Returns:**
API response payload from the delete call.

### reboot

```python
def reboot(
    pod: lium.sdk.models.PodInfo,
    volume_id: Optional[str] = None
) -> Dict[str, Any]:
```

Reboot a pod.

**Arguments:**
 - **pod:**  Pod to reboot.
 - **volume_id:**  Optional volume ID to attach for the reboot request.

**Returns:**
Pod data from the API response after issuing the reboot.

### get_default_images

```python
def get_default_images(gpu_model: Optional[str], driver_version: Optional[str]) -> list[dict]:
```

Get default images for GPU type and driver version.

### default_docker_template

```python
def default_docker_template(executor_id: str) -> lium.sdk.models.Template:
```

Resolve the best default template for a node ID.

**Arguments:**
 - **executor_id:**  Node identifier returned by `ls()`.

**Returns:**
[`Template`](/developers/sdk/reference/models/template) best suited for the node.

**Raises:**
 - **ValueError:**  If no matching node or template exists.

### templates

```python
def templates(
    filter: Optional[str] = None,
    only_my: bool = False
) -> List[lium.sdk.models.Template]:
```

List available templates.

**Arguments:**
 - **filter:**  Optional substring to filter by image or name.
 - **only_my:**  When ``True`` return only templates owned by the caller.

**Returns:**
List of [`Template`](/developers/sdk/reference/models/template).

### get_executor

```python
def get_executor(executor: str) -> Optional[lium.sdk.models.ExecutorInfo]:
```

Resolve a node by ID.

**Arguments:**
 - **executor:**  Node ID string.

**Returns:**
Matching [`ExecutorInfo`](/developers/sdk/reference/models/executor-info) or ``None`` if not found.

### gpu_types

```python
def gpu_types() -> set[str]:
```

Get list of available GPU types.

**Returns:**
Set of GPU type strings advertised by the API.

### get_template

```python
def get_template(template_id: str) -> Optional[lium.sdk.models.Template]:
```

Fetch a template by ID/HUID/name.

**Arguments:**
 - **template_id:**  Template ID, HUID, or name to match.

**Returns:**
Matching [`Template`](/developers/sdk/reference/models/template) or ``None`` if not found.

### get_template_by_image_name

```python
def get_template_by_image_name(
    image_name: Optional[str] = None,
    image_tag: Optional[str] = None
) -> Optional[lium.sdk.models.Template]:
```

Fetch a template by its Docker image + tag.

**Arguments:**
 - **image_name:**  Repository/image name.
 - **image_tag:**  Tag to match.

**Returns:**
Matching [`Template`](/developers/sdk/reference/models/template) or ``None`` if not found.

### ssh_connection

```python
def ssh_connection(pod: lium.sdk.models.PodInfo, timeout: int = 30):
```

SSH connection context manager.

**Arguments:**
 - **pod:**  Pod whose SSH metadata is used.
 - **timeout:**  Connection timeout in seconds.

**Yields:**
An active ``paramiko.SSHClient``.

### exec

```python
def exec(
    pod: lium.sdk.models.PodInfo,
    *,
    command: str,
    env: Optional[Dict[str, str]] = None
) -> Dict[str, Any]:
```

Execute a shell command on a pod over SSH.

**Arguments:**
 - **pod:**  Pod to target.
 - **command:**  Shell command to run remotely.
 - **env:**  Optional environment variables exported before the command runs.

**Returns:**
Dict containing stdout, stderr, exit_code, and success flag.

### stream_exec

```python
def stream_exec(
    pod: lium.sdk.models.PodInfo,
    *,
    command: str,
    env: Optional[Dict[str, str]] = None
) -> Generator[Dict[str, str], NoneType, NoneType]:
```

Execute a shell command and stream incremental output.

**Arguments:**
 - **pod:**  Pod to target.
 - **command:**  Shell command to run remotely.
 - **env:**  Optional environment variables exported before the command runs.

**Yields:**
Streaming output chunks as ``\{"type": "stdout"|"stderr", "data": str\}``.

### exec_all

```python
def exec_all(
    pods: List[lium.sdk.models.PodInfo],
    *,
    command: str,
    env: Optional[Dict[str, str]] = None,
    max_workers: int = 10
) -> List[Dict]:
```

Execute a shell command on multiple pods in parallel.

**Arguments:**
 - **pods:**  List of pods to target.
 - **command:**  Shell command to run on each pod.
 - **env:**  Optional environment variables exported before each command.
 - **max_workers:**  Maximum number of SSH workers to spawn.

**Returns:**
List of result dictionaries mirroring `exec()`.

### wait_ready

```python
def wait_ready(
    pod: Union[str, lium.sdk.models.PodInfo, Dict],
    *,
    timeout: int = 300,
    poll_interval: int = 10
) -> Optional[lium.sdk.models.PodInfo]:
```

Poll until a pod reports RUNNING + SSH metadata.

**Arguments:**
 - **pod:**  Pod identifier, PodInfo, or dict with an ``id`` field.
 - **timeout:**  Maximum number of seconds to wait.
 - **poll_interval:**  Interval between successive ``ps`` calls.

**Returns:**
PodInfo when the pod is ready, otherwise ``None`` if timeout expires.

### scp

```python
def scp(pod: lium.sdk.models.PodInfo, *, local: str, remote: str) -> None:
```

Upload a local file to a pod via SFTP.

### download

```python
def download(pod: lium.sdk.models.PodInfo, *, remote: str, local: str) -> None:
```

Download a file from a pod via SFTP.

**Arguments:**
 - **pod:**  The pod to download from.
 - **remote:**  Remote file path on the pod.
 - **local:**  Local destination path.

**Raises:**
 - **ValueError:**  If SSH is not configured for the pod.

### upload

```python
def upload(pod: lium.sdk.models.PodInfo, *, local: str, remote: str) -> None:
```

Upload a file to a pod via SFTP.

This is an alias for `scp()` for parity with the CLI.

**Arguments:**
 - **pod:**  The pod to upload to.
 - **local:**  Local file path to upload.
 - **remote:**  Remote destination path on the pod.

**Raises:**
 - **ValueError:**  If SSH is not configured for the pod.

### ssh

```python
def ssh(pod: lium.sdk.models.PodInfo) -> str:
```

Get SSH command string for connecting to a pod.

**Arguments:**
 - **pod:**  The pod to generate SSH command for.

**Returns:**
SSH command string with the configured SSH key path.

**Raises:**
 - **ValueError:**  If SSH is not configured for the pod or no SSH key path is set.

### rsync

```python
def rsync(pod: lium.sdk.models.PodInfo, *, local: str, remote: str) -> None:
```

Sync directories with rsync.

**Arguments:**
 - **pod:**  Pod to sync.
 - **local:**  Local path or directory (rsync source).
 - **remote:**  Remote path on the pod.

**Raises:**
 - **RuntimeError:**  If the rsync command fails.

### switch_template

```python
def switch_template(
    pod: lium.sdk.models.PodInfo,
    *,
    template_id: str
) -> lium.sdk.models.PodInfo:
```

Switch the template of a running pod.

**Arguments:**
 - **pod:**  Pod to update.
 - **template_id:**  ID of the template to switch to.

**Returns:**
PodInfo object with updated pod information.

### create_template

```python
def create_template(
    name: str,
    docker_image: str,
    docker_image_digest: str = '',
    docker_image_tag: str = 'latest',
    ports: Optional[List[int]] = None,
    start_command: Optional[str] = None,
    **kwargs
) -> lium.sdk.models.Template:
```

Create a new template.

**Arguments:**
 - **name:**  Friendly template name.
 - **docker_image:**  Image repository (e.g., ``"daturaai/pytorch"``).
 - **docker_image_digest:**  Digest string for pinning (defaults to empty string).
 - **docker_image_tag:**  Image tag (defaults to ``"latest"``).
 - **ports:**  Internal ports to expose (defaults to ``[22, 8000]``).
 - **start_command:**  Optional command executed on container start.
 - `**kwargs`:  Additional template fields:
   - category (str): Template category (defaults to ``"UBUNTU"``).
   - is_private (bool): Whether template is private (defaults to ``True``).
   - volumes (List[str]): Volume mount paths (defaults to ``["/workspace"]``).
   - description (str): Template description.
   - environment (Dict[str, str]): Environment variables.
   - entrypoint (str): Container entrypoint.

**Returns:**
Newly created [`Template`](/developers/sdk/reference/models/template).

### wait_template_ready

```python
def wait_template_ready(
    template_id: str,
    timeout: int = 300
) -> Optional[lium.sdk.models.Template]:
```

Wait for template verification to complete.

**Arguments:**
 - **template_id:**  Template identifier.
 - **timeout:**  Maximum seconds to wait.

**Returns:**
Template when verification succeeds, otherwise ``None`` if the timeout expires.

**Raises:**
 - **LiumError:**  If template verification fails.

### get_my_user_id

```python
def get_my_user_id() -> str:
```

Get the current user's ID.

**Returns:**
The ID returned by ``/users/me``.

### update_template

```python
def update_template(
    template_id: str,
    name: str,
    docker_image: str,
    docker_image_digest: str,
    docker_image_tag: str = 'latest',
    ports: Optional[List[int]] = None,
    start_command: Optional[str] = None,
    **kwargs
) -> lium.sdk.models.Template:
```

Update an existing template owned by the caller.

**Arguments:**
 - **template_id:**  Template identifier.
 - **name:**  Friendly name.
 - **docker_image:**  Image repository.
 - **docker_image_digest:**  Optional digest.
 - **docker_image_tag:**  Image tag.
 - **ports:**  Internal ports to expose.
 - **start_command:**  Startup command.
 - `**kwargs`:  Additional override fields.

**Returns:**
Updated [`Template`](/developers/sdk/reference/models/template).

**Raises:**
 - **ValueError:**  If the template is missing or not owned by the caller.

### wallets

```python
def wallets() -> List[Dict[str, Any]]:
```

Get the caller's configured funding wallets.

**Returns:**
Raw wallet records returned by the pay API.

### add_wallet

```python
def add_wallet(bt_wallet: Any) -> tuple[str, str]:
```

Link a Bittensor wallet with the user account.

**Arguments:**
 - **bt_wallet:**  Wallet object exposing ``coldkey``/``coldkeypub`` for signing.

**Returns:**
``(app_id, customer_id)`` parsed from the ``/tao/create-transfer``
redirect — surfaced so the alpha funding flow can reuse the same single
round-trip for company-wallet lookup instead of issuing a second POST.

**Raises:**
 - **LiumError:**  If verification or wallet polling fails.

### convert_alpha

```python
def convert_alpha(usd: Any) -> lium.sdk.client.AlphaQuote:
```

Quote ``usd`` (USD) -> alpha via ``GET /balance/convert/alpha``.

The response carries both the alpha amount to transfer (``converted``) and
the subnet ``netuid`` the transfer must happen on. Hard-fails (no fallback)
on a pay-API error: ``_request`` maps 503 -> `[`LiumServerError`](/developers/sdk/reference/exceptions/lium-server-error)` (a
`[`LiumError`](/developers/sdk/reference/exceptions/lium-error)`), so a down subtensor / unavailable alpha price aborts the
fund before any on-chain call.

### company_wallet

```python
def company_wallet(app_id: str) -> str:
```

Resolve the Lium destination coldkey via ``GET /wallet/company/?app_id=``.

Returns the company ``wallet_hash`` (the SS58 the pay-tao-api-v2 listener
credits). Hard-fails (no fallback): a 404 (app has no wallet) maps to
`[`LiumNotFoundError`](/developers/sdk/reference/exceptions/lium-not-found-error)` (a `[`LiumError`](/developers/sdk/reference/exceptions/lium-error)`), aborting before any on-chain call.

### backup_create

```python
def backup_create(
    pod: lium.sdk.models.PodInfo,
    *,
    path: str = '/home',
    frequency_hours: int = 6,
    retention_days: int = 7
) -> lium.sdk.models.BackupConfig:
```

Create or replace a backup configuration for a pod.

**Arguments:**
 - **pod:**  Pod to configure.
 - **path:**  Filesystem path to back up.
 - **frequency_hours:**  Backup interval in hours.
 - **retention_days:**  Retention period in days.

**Returns:**
Created [`BackupConfig`](/developers/sdk/reference/models/backup-config).

### backup_now

```python
def backup_now(
    pod: lium.sdk.models.PodInfo,
    *,
    name: str,
    description: str = ''
) -> Dict[str, Any]:
```

Trigger an immediate backup for a pod.

**Arguments:**
 - **pod:**  Pod to back up.
 - **name:**  Backup name.
 - **description:**  Optional description.

**Returns:**
API response payload from the run-now endpoint.

### backup_config

```python
def backup_config(pod: lium.sdk.models.PodInfo) -> Optional[lium.sdk.models.BackupConfig]:
```

Return the backup configuration for a pod if one exists.

**Arguments:**
 - **pod:**  Pod to inspect.

**Returns:**
[`BackupConfig`](/developers/sdk/reference/models/backup-config) if present, otherwise ``None``.

### backup_list

```python
def backup_list() -> List[lium.sdk.models.BackupConfig]:
```

List all backup configurations across all pods.

**Returns:**
List of [`BackupConfig`](/developers/sdk/reference/models/backup-config).

### backup_logs

```python
def backup_logs(pod: lium.sdk.models.PodInfo) -> List[lium.sdk.models.BackupLog]:
```

Get recent backup logs for a pod.

**Arguments:**
 - **pod:**  Pod to inspect.

**Returns:**
List of [`BackupLog`](/developers/sdk/reference/models/backup-log) entries (possibly empty).

### backup_delete

```python
def backup_delete(config_id: str) -> Dict[str, Any]:
```

Delete a backup configuration by ID.

**Arguments:**
 - **config_id:**  Backup configuration identifier.

**Returns:**
API response payload.

### restore

```python
def restore(
    pod: lium.sdk.models.PodInfo,
    *,
    backup_id: str,
    restore_path: str = '/root'
) -> Dict[str, Any]:
```

Restore a backup to a pod.

**Arguments:**
 - **pod:**  Pod to restore to.
 - **backup_id:**  ID of the backup to restore.
 - **restore_path:**  Path where to restore the backup (default: /root).

**Returns:**
Response from the restore API.

### restore_logs

```python
def restore_logs(pod: lium.sdk.models.PodInfo) -> List[lium.sdk.models.RestoreLog]:
```

Get recent restore logs for a pod.

**Arguments:**
 - **pod:**  Pod to inspect.

**Returns:**
List of [`RestoreLog`](/developers/sdk/reference/models/restore-log) entries (possibly empty).

### get_deployment_estimate

```python
def get_deployment_estimate(executor_id: str, template_id: str) -> dict:
```

Estimate deployment time for a template on a node.

**Arguments:**
 - **executor_id:**  Node UUID.
 - **template_id:**  Template UUID.

**Returns:**
Dict with ``estimated_seconds``, ``is_slow_machine``, ``warning_message``, ``is_cached_template``,
and ``docker_image_size`` (image size in bytes, or ``None`` if unknown).

### balance

```python
def balance() -> float:
```

Get current account balance.

**Returns:**
Floating-point balance value reported by ``/users/me``.

### topup_currencies

```python
def topup_currencies(refresh: bool = False) -> List[Dict[str, Any]]:
```

List stablecoin currencies/networks supported for self-serve top-ups.

**Arguments:**
 - **refresh:**  Bypass the server-side cache and re-fetch from the provider.

**Returns:**
List of ``\{"code", "network", "decimals", "display_decimals"\}`` dicts.

### topup_create_invoice

```python
def topup_create_invoice(
    amount: float,
    crypto_currency: str,
    crypto_network: str
) -> Dict[str, Any]:
```

Create a stablecoin top-up invoice for the current account.

The returned ``deposit_address`` is where the exact ``crypto_amount`` of
``crypto_currency`` (on ``crypto_network``) must be sent. Once the provider
confirms the transfer, the account balance is credited automatically.

**Arguments:**
 - **amount:**  Top-up amount in USD.
 - **crypto_currency:**  Stablecoin code (e.g. ``"USDT"``), see `topup_currencies()`.
 - **crypto_network:**  Network the stablecoin is sent on (e.g. ``"tron"``).

**Returns:**
Invoice dict including ``invoice_id``, ``deposit_address``, ``crypto_amount``,
``crypto_currency``, ``crypto_network``, ``exchange_rate`` and ``expires_at``.

### volumes

```python
def volumes() -> List[lium.sdk.models.VolumeInfo]:
```

List all volumes for the current user.

**Returns:**
List of [`VolumeInfo`](/developers/sdk/reference/models/volume-info).

### volume

```python
def volume(volume_id: str) -> lium.sdk.models.VolumeInfo:
```

Get a specific volume by ID.

**Arguments:**
 - **volume_id:**  Volume identifier.

**Returns:**
[`VolumeInfo`](/developers/sdk/reference/models/volume-info) for the requested volume.

### volume_create

```python
def volume_create(name: str, *, description: str = '') -> lium.sdk.models.VolumeInfo:
```

Create a new volume.

**Arguments:**
 - **name:**  Volume name.
 - **description:**  Optional description.

**Returns:**
Created [`VolumeInfo`](/developers/sdk/reference/models/volume-info).

### volume_update

```python
def volume_update(
    volume_id: str,
    *,
    name: Optional[str] = None,
    description: Optional[str] = None
) -> lium.sdk.models.VolumeInfo:
```

Update a volume's metadata.

**Arguments:**
 - **volume_id:**  Volume identifier.
 - **name:**  Optional new name.
 - **description:**  Optional description.

**Returns:**
Updated [`VolumeInfo`](/developers/sdk/reference/models/volume-info).

**Raises:**
 - **ValueError:**  If neither ``name`` nor ``description`` is provided.

### volume_delete

```python
def volume_delete(volume_id: str) -> Dict[str, Any]:
```

Delete a volume.

**Arguments:**
 - **volume_id:**  Volume identifier.

**Returns:**
API response payload from the delete request.

### schedule_termination

```python
def schedule_termination(pod: lium.sdk.models.PodInfo, *, termination_time: str) -> Dict[str, Any]:
```

Schedule a pod for automatic termination at a future date and time.

**Arguments:**
 - **pod:**  Pod to schedule
 - **termination_time:**  ISO 8601 formatted datetime string (e.g., "2025-10-17T15:30:00Z")

**Returns:**
Response from the schedule termination API

### cancel_scheduled_termination

```python
def cancel_scheduled_termination(pod: lium.sdk.models.PodInfo) -> Dict[str, Any]:
```

Cancel a scheduled termination for a pod.

**Arguments:**
 - **pod:**  Pod to cancel the schedule for

**Returns:**
Response from the cancel scheduled termination API

### install_jupyter

```python
def install_jupyter(
    pod: lium.sdk.models.PodInfo,
    *,
    jupyter_internal_port: int
) -> Dict[str, Any]:
```

Install Jupyter Notebook on a pod.

**Arguments:**
 - **pod:**  Pod to install Jupyter on
 - **jupyter_internal_port:**  Internal port for Jupyter Notebook

**Returns:**
Response from the install Jupyter API
