> ## 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>;
  }
};

これらの機能は、[サンドボックスの永続化](/docs/ja/guides/sandbox-persistence)を基盤としています。自動一時停止は、最大有効期間が切れたときにサンドボックスの状態を保持します。自動再開は、新しいアクティビティが到着したときに一時停止中のサンドボックスを起動します。

<SandboxConfigHint />

## 設定

サンドボックスを作成するときに、`lifecycle` 設定を渡します。これにより、タイムアウトの動作と、一時停止中のサンドボックスを自動的に起動できるかどうかを制御します。

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

  const sandbox = await Sandbox.create({
    timeoutMs: 10 * 60 * 1000,
    lifecycle: {
      onTimeout: 'pause',
      autoResume: true, // resume when activity arrives
    },
  })
  ```

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

  sandbox = Sandbox.create(
      timeout=10 * 60,
      lifecycle={
          "on_timeout": "pause",
          "auto_resume": True,  # resume when activity arrives
      },
  )
  ```
</CodeGroup>

### ライフサイクルオプション

`lifecycle` 設定では、次のフィールドがサポートされています。

| 設定                                         | オプション     | 意味                                                                               |
| ------------------------------------------ | --------- | -------------------------------------------------------------------------------- |
| `onTimeout` (JS) / `on_timeout` (Python)   | `"kill"`  | デフォルトの動作です。サンドボックスはタイムアウト後に削除されます。                                               |
| `onTimeout` (JS) / `on_timeout` (Python)   | `"pause"` | サンドボックスは削除される代わりに、タイムアウト後に一時停止されます。                                              |
| `autoResume` (JS) / `auto_resume` (Python) | `false`   | デフォルトの動作です。一時停止中のサンドボックスは、手動で再開されるまで一時停止したままになります。                               |
| `autoResume` (JS) / `auto_resume` (Python) | `true`    | サポートされているアクティビティが到着すると、一時停止中のサンドボックスが再起動します。これには、タイムアウト動作が `"pause"` である必要があります。 |

自動再開が無効または省略されている場合でも、一時停止中のサンドボックスは `Sandbox.connect()` を使用して手動で再開できます。

## 自動一時停止

デフォルトでは、サンドボックスはタイムアウトが切れると強制終了されます。代わりに状態を保持するには、JavaScript では `onTimeout`、Python では `on_timeout` を設定して、タイムアウト時に一時停止するようにします。

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

  const sandbox = await Sandbox.create({
    timeoutMs: 300_000,
    lifecycle: {
      onTimeout: 'pause',
      autoResume: false,
    },
  })

  await sandbox.kill()
  ```

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

  sandbox = Sandbox.create(
      timeout=300,
      lifecycle={
          "on_timeout": "pause",
          "auto_resume": False,
      },
  )

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

## 自動再開

自動再開では、サポートされているアクティビティが到着したときに、一時停止中のサンドボックスを起動できます。これは、サンドボックスがタイムアウト時に一時停止するよう設定されている場合にのみ機能します。

### 自動再開後のタイムアウト

自動再開後、サンドボックスには少なくとも 5 分のタイムアウトが設定されます。元のタイムアウトが 5 分より長かった場合は、より長い元の値が再利用されます。

タイムアウトタイマーは、サンドボックスが元々作成されたときではなく、サンドボックスが再開されたときに開始します。

2 分のタイムアウトの例:

1. サンドボックスが 2 分間実行され、その後一時停止します。
2. 新しいアクティビティがサンドボックスに到達し、再開されます。
3. 再開されたサンドボックスには、最小値である 5 分のタイムアウトが設定されます。
4. タイマーがリセットされなければ、サンドボックスは 5 分後に再び一時停止します。

1 時間のタイムアウトの例:

* 元のタイムアウトが 5 分の最小値より長いため、サンドボックスは 1 時間のタイムアウトで再開されます。

ライフサイクル設定はサンドボックスに保持され続けるため、この動作は今後の一時停止と再開のサイクルでも継続します。

<Note>
  再開後にタイムアウトを更新するには、JavaScript では `setTimeout()`、Python では `set_timeout()` を使用します。
</Note>

### アクティビティとして扱われるもの

自動再開は、SDK アクションと HTTP トラフィックによってトリガーできます。

サポートされる例は次のとおりです。

* `sandbox.commands.run(...)`
* `sandbox.files.read(...)`
* `sandbox.files.write(...)`
* トンネルされたアプリケーション URL にアクセスする
* サンドボックス内で実行されているサービスにリクエストを送信する

サンドボックスが一時停止中で自動再開が有効になっている場合、次にサポートされるアクションによって自動的に再開されます。先に `Sandbox.connect()` を呼び出す必要はありません。

### SDK の例: 一時停止してからファイルを読み取る

この例では、サンドボックスを作成し、ファイルを書き込み、サンドボックスを一時停止してから、そのファイルを読み取ります。読み取り操作によってサンドボックスが再開されます。

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

  const sandbox = await Sandbox.create({
    timeoutMs: 10 * 60 * 1000,
    lifecycle: {
      onTimeout: 'pause',
      autoResume: true,
    },
  })

  await sandbox.files.write('/home/user/hello.txt', 'hello from a paused sandbox')
  await sandbox.pause()

  const content = await sandbox.files.read('/home/user/hello.txt')
  console.log(content)
  console.log(`State after read: ${(await sandbox.getInfo()).state}`)
  ```

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

  sandbox = Sandbox.create(
      timeout=10 * 60,
      lifecycle={
          "on_timeout": "pause",
          "auto_resume": True,
      },
  )

  sandbox.files.write("/home/user/hello.txt", "hello from a paused sandbox")
  sandbox.pause()

  content = sandbox.files.read("/home/user/hello.txt")
  print(content)
  print(f"State after read: {sandbox.get_info().state}")
  ```
</CodeGroup>

### 例: 自動再開を使う Web サーバー

自動再開は、プレビュー環境や Web サーバーに適しています。サンドボックスが一時停止した後、公開されたサービスへの受信 HTTP リクエストによって起動できます。

以下の例では、シンプルな Python HTTP サーバーを起動し、公開プレビュー URL を出力します。ポートの公開ホスト名を取得するには、JavaScript では `getHost()`、Python では `get_host()` を使用できます。

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

  const sandbox = await Sandbox.create({
    timeoutMs: 5 * 60 * 1000,
    lifecycle: {
      onTimeout: 'pause',
      autoResume: true,
    },
  })

  await sandbox.commands.run('python3 -m http.server 3000', { background: true })

  const host = sandbox.getHost(3000)
  // Once the sandbox times out and pauses, any request to the preview URL will automatically resume it.
  console.log(`Preview URL: https://${host}`)
  ```

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

  sandbox = Sandbox.create(
      timeout=5 * 60,
      lifecycle={
          "on_timeout": "pause",
          "auto_resume": True,
      },
  )

  sandbox.commands.run("python3 -m http.server 3000", background=True)

  host = sandbox.get_host(3000)
  # Once the sandbox times out and pauses, any request to the preview URL will automatically resume it.
  print(f"Preview URL: https://{host}")
  ```
</CodeGroup>

## クリーンアップ

自動再開は、再開と一時停止のサイクルを繰り返しても有効なままです。各再開時に、少なくとも 5 分、またはより長い元のタイムアウトを使用して、新しいタイムアウト期間が開始されます。

サンドボックスが再開された後、クライアントは使用していたサービスに再接続する必要があります。既存の HTTP、WebSocket、データベース、ターミナル接続は、サンドボックスが一時停止している間は開いたままになりません。

サンドボックスを完全に削除するには、`.kill()` を呼び出します。その後、再開することはできません。
