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

# Persistencia heredada de sandbox

export const SandboxConfigHint = () => {
  if (typeof document === "undefined") {
    return null;
  } else {
    return <Note>Before running the example code in this document, please ensure you have properly configured environment variables. For details, please refer to <a href="/docs/es/guides/sandbox-your-first-agent-sandbox#configure-environment-variables">Configure Environment Variables</a>.</Note>;
  }
};

<Warning>
  Esta página heredada se mantiene para los usuarios que todavía usan la línea de SDK 1.x o beta. Las nuevas integraciones con el SDK 2.x deben seguir la documentación actual de Sandbox.
</Warning>

La persistencia del sandbox te permite pausar tu sandbox y reanudarlo más tarde desde el mismo estado en el que estaba cuando lo pausaste.

Esto incluye no solo el estado del sistema de archivos del sandbox, sino también la memoria del sandbox. Esto significa todos los procesos en ejecución, variables cargadas, datos, etc.

<SandboxConfigHint />

<Warning>
  Ten en cuenta:

  * Se tarda aproximadamente 4 segundos por cada 1 GB de RAM en pausar el sandbox.
  * Se tarda aproximadamente 1 segundo en reanudar el sandbox.
  * Los datos de un sandbox pausado se conservan permanentemente hasta que llames explícitamente al método `kill`.
</Warning>

## Pausar sandbox

Cuando pausas un sandbox, se guardarán tanto el <Link href="/docs/es/guides/sandbox-filesystem">sistema de archivos</Link> del sandbox como el estado de la memoria. Esto incluye todos los archivos en el sistema de archivos del sandbox y todos los procesos en ejecución, variables cargadas, datos, etc.

<CodeGroup>
  ```js JavaScript & TypeScript icon="js" theme={"system"}
  import { Sandbox } from 'novita-sandbox/code-interpreter'

  const sandbox = await Sandbox.create()
  console.log('Sandbox created', sandbox.sandboxId)

  // Pause the sandbox.
  // You can save the sandbox ID in your database
  // to resume the sandbox later
  const result = await sandbox.betaPause()
  console.log('Sandbox paused', sandbox.sandboxId, result)

  await sandbox.kill()
  ```

  ```python Python icon="python" theme={"system"}
  from novita_sandbox.code_interpreter import Sandbox

  sandbox = Sandbox.create()
  print('Sandbox created', sandbox.sandbox_id)

  # You can save the sandbox ID in your database
  # to resume the sandbox later
  sandbox.beta_pause()
  print('Sandbox paused', sandbox.sandbox_id)

  sandbox.kill()
  ```
</CodeGroup>

<Warning>
  **Nota: breve período de transición después de pausar**

  Pausar es una operación asíncrona. Después de llamar a `beta_pause()`, el sandbox se pausa en segundo plano.

  Durante este período de transición, antes de que la pausa se complete:

  * **Operaciones de solo lectura** (p. ej., `get_info`, `list`): devuelven resultados normalmente; el estado se muestra como `paused`
  * **Operaciones de ejecución** (p. ej., `commands.run`, acceder a URLs públicas del sandbox): devolverán errores; este es el comportamiento esperado. Espera a que se complete la pausa antes de volver a intentarlo (el tiempo varía según el tamaño de la memoria; consulta la nota anterior)
  * **Operación de reanudación** (`connect`): espera automáticamente a que se complete la pausa antes de reanudar el sandbox; no se necesita sondeo ni reintento manual
</Warning>

## Reanudar sandbox

Cuando reanudas un sandbox, estará en el mismo estado en el que estaba cuando lo pausaste.
Esto significa que se restaurarán todos los archivos del sistema de archivos del sandbox y todos los procesos en ejecución, variables cargadas, datos, etc.

<Tip>
  Si llamas a `connect()` inmediatamente después de llamar a `beta_pause()`, `connect()` espera automáticamente a que se complete la pausa antes de reanudar el sandbox. No se requiere sondeo manual: todo el proceso es transparente para el llamador.
</Tip>

<Warning>
  Si intentas reanudar un sandbox que se ha destruido o no existe:

  * JavaScript SDK lanzará `NotFoundError`
  * Python SDK lanzará `NotFoundException`
</Warning>

<CodeGroup>
  ```js JavaScript & TypeScript icon="js" theme={"system"}
  import { Sandbox } from 'novita-sandbox/code-interpreter'

  const sandbox = await Sandbox.create()
  console.log('Sandbox created', sandbox.sandboxId)

  // Pause the sandbox.
  // You can save the sandbox ID in your database
  // to resume the sandbox later
  const result = await sandbox.betaPause()
  console.log('Sandbox paused', sandbox.sandboxId, result)

  // Resume the sandbox.
  // Even if called before pausing completes, connect() automatically waits for the pause to finish.
  const resumedSandbox = await sandbox.connect()
  console.log('Sandbox resumed', resumedSandbox.sandboxId)

  await sandbox.kill()
  ```

  ```python Python icon="python" theme={"system"}
  from novita_sandbox.code_interpreter import Sandbox

  sandbox = Sandbox.create()
  print('Sandbox created', sandbox.sandbox_id)

  # Pause the sandbox.
  # You can save the sandbox ID in your database
  # to resume the sandbox later
  sandbox.beta_pause()
  print('Sandbox paused', sandbox.sandbox_id)

  # Resume the sandbox.
  # Even if called before pausing completes, connect() automatically waits for the pause to finish.
  connectedSandbox = sandbox.connect()
  print('Sandbox resumed', connectedSandbox.sandbox_id)

  sandbox.kill()
  ```
</CodeGroup>

## Listar sandboxes pausados

Puedes listar todos los sandboxes pausados llamando al método `Sandbox.list` y proporcionando el parámetro de consulta `state`.
Puedes encontrar más información sobre cómo usar el método en [List Sandboxes](/docs/es/guides/sandbox-list).

<CodeGroup>
  ```js JavaScript & TypeScript icon="js" theme={"system"}
  import { Sandbox, SandboxInfo } from 'novita-sandbox/code-interpreter'

  const sandbox = await Sandbox.create()

  // List all paused sandboxes.
  const paginator = Sandbox.list({ query: { state: ['paused'] } })

  // Get all paused sandboxes.
  const sandboxes: SandboxInfo[] = []
  while (paginator.hasNext) {
    const items = await paginator.nextItems()
    sandboxes.push(...items)
  }

  console.log('all paused sandboxes', sandboxes)

  await sandbox.kill()
  ```

  ```python Python icon="python" theme={"system"}
  from novita_sandbox.code_interpreter import Sandbox, SandboxQuery, SandboxState, SandboxInfo

  sandbox = Sandbox.create()

  sandbox.beta_pause()
  print('Sandbox paused', sandbox.sandbox_id)

  # List all paused sandboxes.
  paginator = Sandbox.list(query=SandboxQuery(state=[SandboxState.PAUSED]))

  # Get all paused sandboxes.
  sandboxes: list[SandboxInfo] = []
  while paginator.has_next:
    items = paginator.next_items()
    sandboxes.extend(items)

  print('all paused sandboxes', sandboxes)

  sandbox.kill()
  ```
</CodeGroup>

## Eliminar sandboxes pausados

Puedes eliminar sandboxes pausados llamando al método `kill` en la instancia del sandbox.

<CodeGroup>
  ```js JavaScript & TypeScript icon="js" theme={"system"}
  import { Sandbox } from 'novita-sandbox/code-interpreter'

  const sandbox = await Sandbox.create()
  console.log('Sandbox created', sandbox.sandboxId)

  // Pause the sandbox.
  await sandbox.betaPause()

  // Kill the paused sandbox.
  await sandbox.kill()
  ```

  ```python Python icon="python" theme={"system"}
  from novita_sandbox.code_interpreter import Sandbox

  sandbox = Sandbox.create()

  # Pause the sandbox.
  sandbox.beta_pause()

  # Kill the paused sandbox.
  sandbox.kill()
  ```
</CodeGroup>

## Tiempo de espera del sandbox

Cuando reanudas un sandbox, el tiempo de espera del sandbox se restablece al tiempo de espera predeterminado de un sandbox: 5 minutos.

Puedes pasar un tiempo de espera personalizado al método `Sandbox.connect()` así:

<CodeGroup>
  ```js JavaScript & TypeScript icon="js" theme={"system"}
  import { Sandbox } from 'novita-sandbox/code-interpreter'

  const sandbox = await Sandbox.create()

  const connectedSandbox = await Sandbox.connect(sandbox.sandboxId, { timeoutMs: 60 * 1000 })
  console.log('Sandbox connected', connectedSandbox.sandboxId)

  await sandbox.kill()
  ```

  ```python Python icon="python" theme={"system"}
  from novita_sandbox.code_interpreter import Sandbox

  sandbox = Sandbox.create()

  connectedSandbox = Sandbox.connect(sandbox.sandbox_id, timeout=60) # 60 seconds
  print('Sandbox connected', connectedSandbox.sandbox_id)

  sandbox.kill()
  ```
</CodeGroup>

## Red

Si tienes un servicio (por ejemplo, un servidor) ejecutándose dentro de tu sandbox y pausas el sandbox, el servicio no será accesible desde el exterior y todos los clientes se desconectarán.
Si reanudas el sandbox, el servicio volverá a ser accesible, pero tendrás que conectar los clientes de nuevo.
