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

# 샌드박스에서 Devin Outposts 실행하기

> Devin은 Devin Cloud에서 계획을 세우고, 명령어는 사용자가 직접 제어하는 CoreWeave 샌드박스에서 실행하세요.

[Devin Outposts](https://docs.devin.ai/cloud/outposts/overview)를 사용하면 Devin의 계획 수립과 모델 추론은 Devin Cloud에서 그대로 수행되고, 명령어 실행, 파일 편집, 저장소 액세스는 사용자가 운영하는 머신에서 이루어집니다. 이 가이드에서는 해당 머신으로 CoreWeave 샌드박스를 사용합니다. 샌드박스는 이미지, CPU, 메모리, GPU, lifetime을 직접 선택할 수 있는 격리된 환경입니다.

outpost는 Devin Cloud에 있는 이름이 지정된 큐입니다. 워커는 `devin worker` 프로세스로, 아웃바운드 HTTPS로 Devin Cloud에 연결한 뒤 큐에서 세션을 가져와 로컬에서 실행합니다. 인바운드 포트, 공용 IP 주소, 가상 사설망(VPN)은 필요하지 않습니다. 이 가이드에서는 샌드박스 하나가 워커 하나를 실행하며, 이 워커는 샌드박스가 살아 있는 동안 세션을 차례로 서빙합니다.

각 워커는 한 번에 하나의 활성 세션만 서빙하며, 나머지 세션은 사용 가능한 워커가 생길 때까지 대기합니다. 이 가이드에서는 정해진 수의 워커만 시작하므로, 세션이 큐에 쌓여도 샌드박스가 추가로 생성되지 않습니다. 워커가 더 필요하면 직접 시작하거나 오케스트레이터를 사용해 자동으로 프로비저닝하세요.

<h2 id="prerequisites">
  사전 요구 사항
</h2>

시작하기 전에 다음 사항을 확인하세요:

* Outposts가 활성화된 Devin 조직. Devin Cloud의 **설정 > 환경**에 **Outposts**가 보이지 않으면 Devin Admin에게 문의하세요.
* `SANDBOX_USER` 액션이 부여된 [CoreWeave API 액세스 토큰](/ko/products/sandboxes/placement#choose-and-get-credentials).
* SDK를 직접 사용하는 경우 Python 3.11 이상과 [`uv`](https://docs.astral.sh/uv/), 또는 Node.js 22 이상.

이 가이드를 실행할 터미널에서 CoreWeave API 액세스 토큰을 export하세요:

```bash theme={"system"}
export CWSANDBOX_API_KEY="[API-ACCESS-TOKEN]"
```

<h2 id="create-an-outpost-in-devin-cloud">
  Devin Cloud에서 outpost 생성
</h2>

outpost를 생성하고 토큰을 조회하려면 다음 단계를 따르세요:

1. [Devin Cloud](https://app.devin.ai)에서 **Settings > Environment > Outposts**로 이동하세요.
2. **Create Outpost**를 클릭하고, 이름을 입력한 후 **Linux**를 선택하세요.
3. outpost 토큰을 복사하세요. Devin Cloud는 이 토큰을 한 번만 표시합니다.

outpost가 준비되면 `cws-agent` 또는 Sandboxes SDK 중 하나를 선택해 워커를 시작한 다음, 확인 세션을 실행하세요.

<h2 id="quick-start-with-cws-agent">
  cws-agent 빠른 시작
</h2>

[`cws-agent` 설치 안내](https://github.com/coreweave/cws-agent#install)를 따르세요. 이 도구는 [파일 시스템 스냅샷](/ko/products/sandboxes/file-system-snapshots#start-a-sandbox-with-a-snapshot-mount)으로 워크스페이스를 저장하고 복원할 수 있도록 스냅샷 볼륨을 설정합니다.

`[OUTPOST-TOKEN]`은 복사한 토큰으로, `[OUTPOST-NAME]`은 outpost 이름으로, `[SANDBOX-NAME]`은 이 샌드박스에 사용할 `cws-agent` 세션 이름으로 바꾸세요. 세션 이름은 영문 소문자, 숫자, 하이픈으로 구성된 1\~40자여야 하며, 영문자나 숫자로 시작해야 합니다.

```bash theme={"system"}
export DEVIN_OUTPOSTS_TOKEN="[OUTPOST-TOKEN]"
cws-agent launch [SANDBOX-NAME] --outpost [OUTPOST-NAME]
```

이 도구는 토큰을 샌드박스에 전달하고 워커 하나를 시작합니다.

워커의 터미널을 보려면 다음 명령을 실행하세요.

```bash theme={"system"}
cws-agent connect [SANDBOX-NAME] --cmd 'tmux attach -t outpost-0'
```

**Ctrl-b**를 누른 다음 **d**를 눌러 세션에서 분리한 후 [Devin 세션 실행 및 확인](#run-and-verify-a-devin-session)으로 넘어가세요. 이 워커는 Devin Cloud에 연결되며, `--agent devin`으로 실행하는 대화형 Devin 명령줄 인터페이스(CLI)와는 별개입니다.

<h2 id="set-up-with-the-sandbox-sdk">
  Sandboxes SDK로 설정
</h2>

`cws-agent` 없이 워커를 직접 실행하는 대안입니다. persistent storage를 설정하지 않습니다.

[Configure 사용자 인증 정보 and install the client](#configure-credentials-and-install-the-client)에서 생성한 가상 환경에서 Python 스니펫을 실행하세요. TypeScript 스니펫을 클라이언트를 설치한 프로젝트에 `.mts` 파일로 저장한 후 `npx tsx [FILENAME].mts`로 실행하세요.

<h3 id="configure-credentials-and-install-the-client">
  사용자 인증 정보 설정 및 클라이언트 설치
</h3>

스크립트를 실행할 터미널에서 outpost를 생성할 때 복사한 토큰을 export하세요:

```bash theme={"system"}
export DEVIN_OUTPOSTS_TOKEN="[OUTPOST-TOKEN]"
```

클라이언트를 선택하고 로컬에 설치하세요:

<Tabs>
  <Tab title="Python">
    Python 3.11 이상과 `uv`를 사용하세요:

    ```bash theme={"system"}
    uv venv --python 3.11
    source .venv/bin/activate
    uv pip install 'cwsandbox>=1.14.2'
    ```
  </Tab>

  <Tab title="TypeScript">
    Node.js 22 이상을 사용하세요. 프로젝트에 클라이언트와 TypeScript 러너를 설치하세요:

    ```bash theme={"system"}
    npm install @coreweave/cwsandbox@0.5.0-beta.0 tsx
    ```
  </Tab>
</Tabs>

<h3 id="start-the-worker">
  워커 시작
</h3>

<Tip>
  워커 시작 시간을 줄이려면 Devin CLI, Git, 언어 런타임 및 프로젝트 의존성이 미리 설치된 자체 이미지를 사용하세요. Python에서는 `container_image`를, TypeScript에서는 `containerImage`를 해당 이미지로 설정하세요. 이미지에 Git과 인증 기관(CA) 인증서가 이미 포함되어 있다면 예시에서 `apt-get` 명령어를 제거하세요.
</Tip>

다음 스크립트는 Cognition의 공식 워커 이미지로 샌드박스를 생성하고 `devin worker`를 샌드박스의 메인 명령으로 실행합니다. 클라이언트는 로컬 환경에서 `DEVIN_OUTPOSTS_TOKEN`을 읽은 다음, 샌드박스 요청에 그 값을 전달하여 워커의 환경 변수를 설정합니다. 워커의 출력은 샌드박스 로그로 기록됩니다. 워커가 오류로 종료되면 플랫폼은 재시작 한도에 도달할 때까지 컨테이너를 다시 시작합니다.

<Tabs>
  <Tab title="Python">
    ```python title="start_outpost_worker.py" theme={"system"}
    import os
    import sys

    from cwsandbox import ResourceOptions, Sandbox

    outpost = sys.argv[1]

    # 워커 이미지에는 Devin CLI가 포함되어 있지만, Devin이 저장소를
    # 클론하는 데 필요한 git은 포함되어 있지 않습니다. git을 설치한 다음 프로세스를 워커에 넘깁니다.
    command = """
    apt-get update -qq
    DEBIAN_FRONTEND=noninteractive apt-get install -y -qq git ca-certificates >/dev/null
    mkdir -p /workspace
    cd /workspace
    exec devin worker start --outpost="$DEVIN_OUTPOST"
    """

    sandbox = Sandbox.run(
        "bash", "-ec", command,
        container_image="public.ecr.aws/e0h8a4b6/devin-cli:stable",
        environment_variables={
            "DEVIN_OUTPOSTS_TOKEN": os.environ["DEVIN_OUTPOSTS_TOKEN"],
            "DEVIN_OUTPOST": outpost,
        },
        max_lifetime_seconds=8 * 3600,
        resources=ResourceOptions(
            requests={"cpu": "2", "memory": "4Gi"},
            limits={"cpu": "2", "memory": "4Gi"},
        ),
        tags=["devin-outpost-worker"],
    )
    try:
        sandbox.wait()
    except BaseException:
        sandbox.stop().result()
        raise

    print(f"Worker sandbox ID: {sandbox.sandbox_id}")
    ```
  </Tab>

  <Tab title="TypeScript">
    ```typescript title="start_outpost_worker.mts" theme={"system"}
    import { createSandboxClientFromEnv } from "@coreweave/cwsandbox/node";

    const token = process.env.DEVIN_OUTPOSTS_TOKEN;
    if (!token) throw new Error("Set DEVIN_OUTPOSTS_TOKEN.");
    const outpost = process.argv[2];
    if (!outpost) throw new Error("Pass an outpost name.");

    const command = `
    apt-get update -qq
    DEBIAN_FRONTEND=noninteractive apt-get install -y -qq git ca-certificates >/dev/null
    mkdir -p /workspace
    cd /workspace
    exec devin worker start --outpost="$DEVIN_OUTPOST"
    `;

    const client = createSandboxClientFromEnv();
    const sandbox = await client.run(["bash", "-ec", command], {
      containerImage: "public.ecr.aws/e0h8a4b6/devin-cli:stable",
      environmentVariables: {
        DEVIN_OUTPOSTS_TOKEN: token,
        DEVIN_OUTPOST: outpost,
      },
      resources: { cpu: "2", memory: "4Gi" },
      maxLifetimeSeconds: 8 * 3600,
      waitUntilRunning: false,
      tags: ["devin-outpost-worker"],
    });
    try {
      await sandbox.wait();
    } catch (error) {
      await sandbox.stop();
      throw error;
    }
    console.log(`Worker sandbox ID: ${sandbox.sandboxId}`);
    ```
  </Tab>
</Tabs>

[Devin Cloud에서 outpost 생성](#create-an-outpost-in-devin-cloud)에서 만든 outpost 이름을 지정하여 실행하세요.

<Tabs>
  <Tab title="Python">
    ```bash theme={"system"}
    python start_outpost_worker.py [OUTPOST-NAME]
    ```
  </Tab>

  <Tab title="TypeScript">
    ```bash theme={"system"}
    npx tsx start_outpost_worker.mts [OUTPOST-NAME]
    ```
  </Tab>
</Tabs>

Python에서 `sandbox.wait()`는 샌드박스가 실행 중이거나 이미 완료되면 반환됩니다. 이 시점에도 설치와 워커 인증이 아직 진행 중일 수 있으므로, 작업을 제출하기 전에 워커 상태를 확인하세요. 워커는 `/workspace`에서 시작됩니다. `your-org/app`에 대한 세션은 해당 저장소를 `/workspace/repos/app` 아래에 체크아웃합니다.

이 스크립트는 `with` 블록을 사용하지 않으므로, 스크립트가 종료된 후에도 샌드박스는 계속 실행됩니다.

<Warning>
  `max_lifetime_seconds`는 나중에 연장할 수 없는 고정 한도입니다. 이 시간이 지나면 플랫폼이 샌드박스를 종료하며, 해당 worker를 사용하는 모든 세션의 실행이 중단됩니다. 이 스크립트는 스냅샷이나 persistent volume을 설정하지 않습니다. 컨테이너가 다시 시작되면 `/workspace` 아래의 파일을 포함한 쓰기 가능한 파일 시스템이 재설정됩니다. 결과는 Devin이 push하는 저장소처럼 샌드박스 외부에 보관하세요.
</Warning>

<h3 id="optional-use-a-secret-store">
  선택: 시크릿 스토어 사용
</h3>

outpost 토큰 값 대신 [Forge 시크릿 레퍼런스](/ko/products/sandboxes/secrets)를 전달할 수 있습니다. 이 옵션을 사용하려면 Forge 인증과 서버리스 배치가 필요합니다. outpost 토큰을 Forge 팀의 Secret Manager에 저장한 다음, 해당 팀의 사용자 인증 정보를 export하세요.

```bash theme={"system"}
export FORGE_API_KEY="[FORGE-API-KEY]"
export FORGE_TEAM="[FORGE-TEAM]"
```

이 사용자 인증 정보로 SDK를 명시적으로 설정하세요. `FORGE_API_KEY`와 `FORGE_TEAM`은 예시로 든 환경 변수이므로 SDK가 자동으로 감지하지 않습니다.

<Tabs>
  <Tab title="Python">
    샌드박스를 생성하기 전에 `AuthHeaders`를 임포트하고 `auth`를 정의하세요.

    ```python theme={"system"}
    import os

    from cwsandbox import AuthHeaders

    auth = AuthHeaders(
        headers={
            "x-wandb-api-key": os.environ["FORGE_API_KEY"],
            "x-entity-id": os.environ["FORGE_TEAM"],
        },
        strategy="wandb_api_key",
    )
    ```

    `Sandbox.run()`에 `auth=auth`를 전달하세요. 이후의 Python 예시에서도 이 설정을 포함하고, 모든 `Sandbox.from_id()` 호출에도 `auth=auth`를 전달하세요.
  </Tab>

  <Tab title="TypeScript">
    클라이언트 임포트 및 초기화 코드를 다음 코드로 바꾸세요. 이후의 TypeScript 예시에서도 이 클라이언트 설정을 사용하세요.

    ```typescript theme={"system"}
    import { createSandboxClient } from "@coreweave/cwsandbox/wandb";

    const client = createSandboxClient({
      apiKey: process.env.FORGE_API_KEY,
      entity: process.env.FORGE_TEAM,
    });
    ```
  </Tab>
</Tabs>

`[SECRET-NAME]`을 팀 시크릿의 이름으로 바꾸세요.

<Tabs>
  <Tab title="Python">
    `cwsandbox`에서 `Secret`을 임포트하고, `environment_variables`에서 `DEVIN_OUTPOSTS_TOKEN`을 제거한 다음, `Sandbox.run()`에 `secrets=[Secret(store="wandb", name="[SECRET-NAME]", env_var="DEVIN_OUTPOSTS_TOKEN")]`를 추가하세요.
  </Tab>

  <Tab title="TypeScript">
    `const token` 선언과 `if (!token)` 검사를 제거하세요. `environmentVariables`에서 `DEVIN_OUTPOSTS_TOKEN`을 제거하고, `client.run()`에 전달하는 옵션에 `secrets: [{ store: "wandb", name: "[SECRET-NAME]", envVar: "DEVIN_OUTPOSTS_TOKEN" }]`를 추가하세요.
  </Tab>
</Tabs>

이제 outpost 토큰을 로컬에서 export할 필요가 없습니다. 플랫폼이 레퍼런스를 확인하여 워커의 환경 변수를 설정합니다.

<h2 id="run-and-verify-a-devin-session">
  Devin 세션 실행 및 확인
</h2>

테스트에는 이 워커만 연결되어 있고 대기 중이거나 실행 중인 다른 세션이 없는 outpost를 사용하세요. 이 테스트에 사용할 고유한 값(시크릿이 아닌 값)을 정하고, 다음 작업의 `[PROOF-VALUE]`를 해당 값으로 바꾸세요. Devin Cloud에서 새 세션을 시작하고 **Configuration > Virtual environment**에서 outpost를 선택하세요. `Write the exact text`로 시작하는 다음 작업을 제출하세요. 또는 Slack에서 다음 메시지 전체를 보내세요:

```text theme={"system"}
@Devin !outpost [OUTPOST-NAME] Write the exact text [PROOF-VALUE] to /workspace/outpost-proof.txt and read the file back. Report its contents.
```

Devin이 완료를 보고하면 사용 중인 설정에 맞는 명령어로 직접 터미널에서 파일을 읽으세요. `[SANDBOX-NAME]`은 `cws-agent` 워크스페이스 이름으로, `[SANDBOX-ID]`는 SDK 스크립트가 출력한 ID로 바꾸세요:

<Tabs>
  <Tab title="cws-agent">
    ```bash theme={"system"}
    cws-agent exec [SANDBOX-NAME] 'cat /workspace/outpost-proof.txt'
    ```
  </Tab>

  <Tab title="Sandboxes SDK">
    <Tabs>
      <Tab title="Python">
        ```python theme={"system"}
        from cwsandbox import Sandbox

        sandbox = Sandbox.from_id("[SANDBOX-ID]").result()
        result = sandbox.exec(["cat", "/workspace/outpost-proof.txt"], check=True).result()
        print(result.stdout, end="")
        ```
      </Tab>

      <Tab title="TypeScript">
        ```typescript theme={"system"}
        import { createSandboxClientFromEnv } from "@coreweave/cwsandbox/node";

        const client = createSandboxClientFromEnv();
        const sandbox = await client.fromId("[SANDBOX-ID]");
        const result = await sandbox.commands.run(["cat", "/workspace/outpost-proof.txt"], { check: true });
        process.stdout.write(result.stdout);
        ```
      </Tab>
    </Tabs>
  </Tab>
</Tabs>

출력이 지정한 고유 값과 일치하는지 확인하세요. 해당 샌드박스의 ID로 파일을 읽으면 세션이 쓴 파일이 직접 생성한 샌드박스의 것임을 확인할 수 있습니다. 절대 경로를 사용하므로 세션의 작업 디렉터리에 의존하지 않습니다.

세션이 계속 큐에 머물러 있으면 다음 섹션의 안내에 따라 워커 로그를 확인하세요. 이전 세션을 처리 중인 워커는 해당 세션이 종료되거나 일시 중단되기 전까지 다른 세션을 가져올 수 없습니다. 이전 세션이 더 이상 필요 없다면 Devin Cloud에서 종료하거나, 다른 워커를 시작하세요.

<h2 id="check-the-worker-and-stop-it">
  워커 확인 및 중지
</h2>

`cws-agent`의 경우, 빠른 시작에 나온 대로 워커 터미널에 연결하세요. SDK를 사용하는 경우에는 상태와 최근 로그를 확인하세요. `[SANDBOX-ID]`를 출력된 ID로 바꾸세요.

<Tabs>
  <Tab title="Python">
    ```python theme={"system"}
    from cwsandbox import Sandbox

    sandbox = Sandbox.from_id("[SANDBOX-ID]").result()
    print("Sandbox status:", sandbox.get_status())
    for container in sandbox.container_statuses:
        print(container.name, container.state, container.exit_code, container.restart_count)
    for line in sandbox.stream_logs(tail_lines=100):
        print(line, end="")
    ```
  </Tab>

  <Tab title="TypeScript">
    ```typescript theme={"system"}
    import { createSandboxClientFromEnv } from "@coreweave/cwsandbox/node";

    const client = createSandboxClientFromEnv();
    const sandbox = await client.fromId("[SANDBOX-ID]");
    console.log("Sandbox status:", sandbox.status, "Exit code:", sandbox.exitCode);
    for (const line of await sandbox.logs.read({ tailLines: 100 })) {
      process.stdout.write(line);
    }
    ```
  </Tab>
</Tabs>

최신 로그를 가져오려면 이 확인 작업을 다시 실행하세요. Python 클라이언트는 컨테이너별 상태, 종료 코드, 재시작 횟수도 함께 보고합니다. TypeScript 클라이언트는 이러한 세부 정보를 제공하지 않습니다.

Outposts API가 워커의 토큰을 거부했다는 로그가 표시되면, outpost를 생성할 때 복사한 토큰을 사용했는지 확인하세요. 또한 해당 토큰이 outpost를 소유한 계정의 토큰인지 확인하세요. 서비스 사용자의 v3 API 토큰을 대신 사용하는 경우, 해당 역할에 **Outposts write**(`account.outposts.write`) 권한이 있어야 합니다. 사용자 인증 정보를 수정한 후 샌드박스를 다시 생성하세요.

워커가 종료와 재시작을 반복하는 중에도 샌드박스는 `running` 상태로 표시될 수 있습니다. 로그를 확인하고, Python 클라이언트를 사용하는 경우 앞의 예제에 나온 컨테이너별 세부 정보도 확인하세요.

인증에 계속 실패하는 워커는 대체 워커를 생성하기 전에 중지하세요. 뚜렷한 원인 없이 시작에 실패하면 샌드박스 ID와 로그를 보관해 두었다가 [CoreWeave Support](/support/contact)에 전달하세요.

워커가 더 이상 필요하지 않으면 샌드박스를 중지하세요. 서버리스 설정 방법은 [시작하기](/ko/products/sandboxes/get-started)를 참조하세요.

활성 Devin 세션이 종료되고 결과가 저장될 때까지 기다린 후, 설정에 맞는 명령을 사용해 compute를 중지하세요.

<Tabs>
  <Tab title="cws-agent">
    ```bash theme={"system"}
    cws-agent down [SANDBOX-NAME]
    ```

    `down`은 중지하기 전에 워크스페이스의 스냅샷을 생성합니다. 캡처에 실패하면 보고된 오류와 `cws-agent status [SANDBOX-NAME]`을 확인하고, 문제를 해결한 후 다시 시도하세요. 저장되지 않은 변경 사항을 버려도 되는 경우 `cws-agent down [SANDBOX-NAME] --no-snapshot`을 사용하세요.
  </Tab>

  <Tab title="Sandboxes SDK">
    <Tabs>
      <Tab title="Python">
        ```python theme={"system"}
        from cwsandbox import Sandbox

        sandbox = Sandbox.from_id("[SANDBOX-ID]").result()
        sandbox.stop().result()
        ```
      </Tab>

      <Tab title="TypeScript">
        ```typescript theme={"system"}
        import { createSandboxClientFromEnv } from "@coreweave/cwsandbox/node";

        const client = createSandboxClientFromEnv();
        const sandbox = await client.fromId("[SANDBOX-ID]");
        await sandbox.stop();
        ```
      </Tab>
    </Tabs>

    이 예제에는 영구 mount가 없습니다. 중지하기 전에 파일을 외부로 복사하거나 변경 사항을 저장소에 push하세요.
  </Tab>
</Tabs>

Devin 세션을 종료해도 이 워커의 샌드박스는 중지되지 않습니다. `cws-agent` 워크스페이스를 복원하려면 [Devin Outposts guide](https://github.com/coreweave/cws-agent/blob/main/docs/self-hosted.md#devin-outposts)를 참조하세요.

<h2 id="optional-customize-the-environment">
  선택: 환경 사용자 지정하기
</h2>

다음과 같은 방법으로 워커 환경을 사용자 지정할 수 있습니다.

* **자체 이미지 사용.** 공식 이미지에는 `devin` CLI 외에 포함된 것이 거의 없습니다. 이 이미지를 기반으로 필요한 도구 체인을 추가한 이미지를 구축한 다음, Python에서는 `container_image`로, TypeScript에서는 `containerImage`로 전달하세요. Devin을 실행하려면 `git`이 필요합니다. 화면 녹화에는 `ffmpeg`가 필요하며, 브라우저 및 컴퓨터 사용 도구에는 호환되는 브라우저 바이너리가 필요합니다.

  공식 Ubuntu 이미지를 기반으로 하는 amd64 이미지라면 Google Chrome을 설치하세요. Ubuntu의 `chromium` 패키지는 snap 스텁이므로 컨테이너에서 작동하지 않습니다. 자세한 내용은 [Devin의 컨테이너 설정](https://docs.devin.ai/cloud/outposts/quickstart)을 참조하세요. 컴퓨터 사용 기능을 쓰려면 Xvfb 같은 그래픽 디스플레이가 실행 중이어야 하며, 워커에 `DISPLAY`도 설정되어 있어야 합니다.

  워커는 표준 설치 위치에서 바이너리를 검색합니다. 바이너리를 찾지 못하면 `DEVIN_CHROME_PATH`를 해당 바이너리의 절대 경로로 설정하세요. 자세한 내용은 [Devin Outposts 레퍼런스](https://docs.devin.ai/cloud/outposts/reference)를 참조하세요.
* **GPU 설정.** 사용 가능한 옵션은 [샌드박스 GPU 설정](/ko/products/sandboxes/client/guides/sandbox-configuration#gpu)을 참조하세요. 이 가이드의 워커 예시는 CPU 리소스만 사용합니다.
* **워커 추가 실행.** 워커 하나는 한 번에 하나의 세션만 처리합니다. 같은 outpost 이름으로 스크립트를 다시 실행하면 해당 큐에 워커를 하나 더 시작할 수 있습니다.
* **세션마다 샌드박스 생성.** 이 예시의 워커는 여러 세션에서 같은 샌드박스를 재사용합니다. 세션마다 새 샌드박스를 사용하려면 Devin의 [오케스트레이션 가이드](https://docs.devin.ai/cloud/outposts/orchestration)를 참조하세요.
