> ## 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.

# レガシーサンドボックスの永続化

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/ja/guides/sandbox-your-first-agent-sandbox#configure-environment-variables">Configure Environment Variables</a>.</Note>;
  }
};

<Warning>
  このレガシーページは、まだ 1.x またはベータ版の SDK 系列を使用しているユーザー向けに保持されています。新しい SDK 2.x のインテグレーションでは、現在のサンドボックスドキュメントに従ってください。
</Warning>

サンドボックスの永続化により、サンドボックスを一時停止し、一時停止した時点と同じ状態から後で再開できます。

これにはサンドボックスのファイルシステムの状態だけでなく、サンドボックスのメモリも含まれます。つまり、実行中のすべてのプロセス、読み込まれた変数、データなどが含まれます。

<SandboxConfigHint />

<Warning>
  注意:

  * サンドボックスを一時停止するには、RAM 1 GB あたり約 4 秒かかります。
  * サンドボックスを再開するには約 1 秒かかります。
  * 一時停止されたサンドボックスのデータは、明示的に `kill` メソッドを呼び出すまで永続的に保持されます。
</Warning>

## サンドボックスの一時停止

サンドボックスを一時停止すると、サンドボックスの <Link href="/docs/ja/guides/sandbox-filesystem">ファイルシステム</Link> とメモリ状態の両方が保存されます。これには、サンドボックスのファイルシステム内のすべてのファイルと、実行中のすべてのプロセス、読み込まれた変数、データなどが含まれます。

<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>
  **注意: 一時停止後の短い遷移期間**

  一時停止は非同期操作です。`beta_pause()` を呼び出した後、サンドボックスはバックグラウンドで一時停止します。

  この遷移期間中、一時停止が完了する前は次のようになります。

  * **読み取り専用操作**（例: `get_info`、`list`）: 通常どおり返ります。ステータスは `paused` と表示されます
  * **実行操作**（例: `commands.run`、サンドボックスの公開 URL へのアクセス）: エラーを返します。これは想定された動作です。再試行する前に一時停止の完了を待ってください（所要時間はメモリサイズによって異なります。上記の注意を参照）
  * **再開操作**（`connect`）: サンドボックスを再開する前に、一時停止の完了を自動的に待機します。手動でのポーリングや再試行は不要です
</Warning>

## サンドボックスの再開

サンドボックスを再開すると、一時停止した時点と同じ状態になります。
つまり、サンドボックスのファイルシステム内のすべてのファイルが復元され、実行中のすべてのプロセス、読み込まれた変数、データなども復元されます。

<Tip>
  `beta_pause()` を呼び出した直後に `connect()` を呼び出すと、`connect()` はサンドボックスを再開する前に一時停止の完了を自動的に待機します。手動でのポーリングは不要です。このプロセス全体は呼び出し元に対して透過的です。
</Tip>

<Warning>
  破棄された、または存在しないサンドボックスを再開しようとした場合:

  * JavaScript SDK は `NotFoundError` をスローします
  * Python SDK は `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>

## 一時停止中のサンドボックスの一覧表示

`Sandbox.list` メソッドを呼び出し、`state` クエリパラメーターを指定することで、一時停止中のすべてのサンドボックスを一覧表示できます。
このメソッドの使用方法の詳細については、[List Sandboxes](/docs/ja/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>

## 一時停止中のサンドボックスの削除

サンドボックスインスタンスで `kill` メソッドを呼び出すことで、一時停止中のサンドボックスを削除できます。

<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>

## サンドボックスのタイムアウト

サンドボックスを再開すると、サンドボックスのタイムアウトはサンドボックスのデフォルトのタイムアウト（5 分）にリセットされます。

次のように、`Sandbox.connect()` メソッドにカスタムタイムアウトを渡すことができます。

<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>

## ネットワーク

サンドボックス内でサービス（たとえばサーバー）を実行している状態でサンドボックスを一時停止すると、そのサービスは外部からアクセスできなくなり、すべてのクライアントが切断されます。
サンドボックスを再開すると、サービスには再びアクセスできるようになりますが、クライアントを再接続する必要があります。
