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

# サンドボックスで Muse Code を実行する

> サンドボックス内のリポジトリで Muse Code CLI を実行し、結果を取得してからコンピュートを停止します。

Run Muse Code inside a CoreWeave sandbox to edit files and execute commands in a remote workspace. This guide uses the Sandbox software development kit (SDK) to install the command-line interface (CLI) and clone a repository. You then run a task without an interactive terminal and retrieve the result before you stop the sandbox. The agent process and workspace run on CoreWeave, and model requests go to Meta.

## Prerequisites

Before you begin, you need the following:

* [W\&B APIキー](https://forge.coreweave.com/settings#apikeys)。これらのサンプルでは W\&B 認証を使用します。
* Muse Code へのアクセス権がある [Meta APIキー](https://dev.meta.ai/docs/muse-code/auth)。
* サンドボックスからクローンできる公開リポジトリの URL。プライベートリポジトリを使用する場合は、サンドボックス内に Git の認証情報が必要です。
* Python 3.11 以降と `uv`、または Node.js 22 以降と `npm`。

シークレットマネージャーから認証情報を読み込み、ローカルのターミナル環境に設定します。`[WANDB-API-KEY]` を W\&B APIキーに、`[META-API-KEY]` を Meta APIキーに置き換えてください。

```bash theme={"system"}
export WANDB_API_KEY="[WANDB-API-KEY]"
export META_API_KEY="[META-API-KEY]"
```

このスクリプトは Meta キーを標準入力経由で渡すため、キーがコマンド引数やサンドボックスの設定に現れることはありません。チームで共有する認証情報をサンドボックスの作成時に環境変数として注入する方法については、[W\&B シークレット](/ja/products/sandboxes/serverless/secrets)を参照してください。

## Install the Sandbox client

Choose a language and prepare a local project:

<Tabs>
  <Tab title="Python">
    ```bash theme={"system"}
    mkdir muse-sandbox
    cd muse-sandbox
    uv init --bare --python 3.11
    uv venv --python 3.11
    source .venv/bin/activate
    uv pip install 'cwsandbox[wandb]>=1.14.2'
    ```
  </Tab>

  <Tab title="TypeScript">
    ```bash theme={"system"}
    mkdir muse-sandbox
    cd muse-sandbox
    npm init -y
    npm install @coreweave/cwsandbox@0.5.0-beta.0 tsx
    ```
  </Tab>
</Tabs>

## Run a task in the sandbox

Save the script for your language using the filename shown. Each script creates a serverless sandbox with a 30-minute maximum lifetime and performs these steps:

1. Installs Muse Code with Meta's installer.
2. Clones your repository into the `/workspace/project` directory.
3. Runs `muse exec` to build and test a sparkline CLI that renders numbers as a small chart.
4. Runs the generated CLI independently, checks its output, and saves the `sparkline.mjs` file locally.
5. Stops the sandbox in a `finally` block, including when setup or execution fails.

These examples were tested with Muse Code 1.3.0. The installer can install a newer version, so each script runs `muse --version` after installation.

The example uses `--yolo` to disable Muse Code's approval prompts and operating system (OS) sandbox and trust the workspace for this run. CoreWeave supplies the outer sandbox. Muse can access files, credentials, and network destinations available inside that sandbox. Use a repository you trust and provide only the credentials the task needs. For more information, see [Muse Code permissions](https://dev.meta.ai/docs/muse-code/permissions).

<Tabs>
  <Tab title="Python">
    ```python title="run_muse.py" theme={"system"}
    import os
    import sys
    from pathlib import Path

    from cwsandbox import AuthStrategy, Sandbox

    if len(sys.argv) != 2:
        raise SystemExit("Usage: python run_muse.py [REPOSITORY-URL]")
    meta_api_key = os.environ["META_API_KEY"]

    sandbox = Sandbox.run(
        auth=AuthStrategy.WANDB,
        container_image="node:22-bookworm",
        resources={"cpu": "2", "memory": "4Gi"},
        max_lifetime_seconds=1800,
        tags=["muse-code"],
    )
    try:
        sandbox.wait()
        commands = [
            ["bash", "-o", "pipefail", "-ec", "curl -fsSL https://dev.meta.ai/install.sh | bash"],
            ["bash", "-ec", '"$HOME/.local/bin/muse" --version'],
            ["git", "clone", "--", sys.argv[1], "/workspace/project"],
        ]
        for command in commands:
            result = sandbox.exec(command, timeout_seconds=600, check=True).result()
            print(result.stdout, end="")

        agent = sandbox.exec(
            [
                "bash", "-ec",
                'IFS= read -r META_API_KEY; export META_API_KEY; '
                'exec "$HOME/.local/bin/muse" exec --yolo "$1"',
                "bash",
                "Create sparkline.mjs, a dependency-free Node.js CLI that converts its "
                "numeric arguments to a sparkline using ▁▂▃▄▅▆▇█. Scale from the minimum "
                "to the maximum and round to the nearest bar index. "
                "Running node sparkline.mjs 2 4 8 4 2 must print ▁▃█▃▁ followed by "
                "a newline. Run that command to test it.",
            ],
            cwd="/workspace/project",
            stdin=True,
            timeout_seconds=600,
        )
        # 出力のない状態が続くリクエストが中断されないよう、Muse が終了するまで stdin を開いたままにします。
        agent.stdin.writeline(meta_api_key).result()
        result = agent.result()
        print(result.stdout, end="")
        print(result.stderr, end="", file=sys.stderr)
        if result.returncode != 0:
            raise SystemExit(result.returncode)

        chart = sandbox.exec(
            ["node", "sparkline.mjs", "2", "4", "8", "4", "2"],
            cwd="/workspace/project", check=True,
        ).result()
        if chart.stdout != "▁▃█▃▁\n":
            raise RuntimeError(f"Unexpected sparkline: {chart.stdout!r}")
        print(chart.stdout, end="")
        source = sandbox.exec(
            ["cat", "/workspace/project/sparkline.mjs"], check=True
        ).result()
        Path("sparkline.mjs").write_text(source.stdout, encoding="utf-8")
    finally:
        sandbox.stop().result()
    ```
  </Tab>

  <Tab title="TypeScript">
    ```typescript title="run_muse.mts" theme={"system"}
    import { writeFile } from "node:fs/promises";
    import { createSandboxClientFromEnv } from "@coreweave/cwsandbox/wandb";

    const repository = process.argv[2];
    if (!repository) throw new Error("Pass a repository URL.");
    const metaApiKey = process.env.META_API_KEY;
    if (!metaApiKey) throw new Error("Set META_API_KEY.");

    const client = createSandboxClientFromEnv();
    const sandbox = await client.create({
      containerImage: "node:22-bookworm",
      resources: { cpu: "2", memory: "4Gi" },
      maxLifetimeSeconds: 1800,
      waitUntilRunning: false,
      tags: ["muse-code"],
    });
    try {
      await sandbox.wait();
      const commands = [
        ["bash", "-o", "pipefail", "-ec", "curl -fsSL https://dev.meta.ai/install.sh | bash"],
        ["bash", "-ec", '"$HOME/.local/bin/muse" --version'],
        ["git", "clone", "--", repository, "/workspace/project"],
      ];
      for (const command of commands) {
        const result = await sandbox.commands.run(command, { timeoutMs: 600_000, check: true });
        process.stdout.write(result.stdout);
      }

      const agent = await sandbox.commands.start(
        [
          "bash", "-ec",
          'IFS= read -r META_API_KEY; export META_API_KEY; ' +
            'exec "$HOME/.local/bin/muse" exec --yolo "$1"',
          "bash",
          "Create sparkline.mjs, a dependency-free Node.js CLI that converts its " +
            "numeric arguments to a sparkline using ▁▂▃▄▅▆▇█. Scale from the minimum " +
            "to the maximum and round to the nearest bar index. " +
            "Running node sparkline.mjs 2 4 8 4 2 must print ▁▃█▃▁ followed by " +
            "a newline. Run that command to test it.",
        ],
        {
          cwd: "/workspace/project",
          stdin: true,
          timeoutMs: 600_000,
        },
      );
      // 出力のない間にリクエストが中断されないよう、Muse が終了するまで stdin を開いたままにします。
      await agent.stdin.write(metaApiKey + "\n");
      const result = await agent.wait();
      process.stdout.write(result.stdout);
      process.stderr.write(result.stderr);
      if (!result.ok) throw new Error(`Muse Code exited with code ${result.exitCode}.`);

      const chart = await sandbox.commands.run(
        ["node", "sparkline.mjs", "2", "4", "8", "4", "2"],
        { cwd: "/workspace/project", check: true },
      );
      if (chart.stdout !== "▁▃█▃▁\n") {
        throw new Error(`Unexpected sparkline: ${JSON.stringify(chart.stdout)}`);
      }
      process.stdout.write(chart.stdout);
      const source = await sandbox.commands.run(
        ["cat", "/workspace/project/sparkline.mjs"], { check: true },
      );
      await writeFile("sparkline.mjs", source.stdout, "utf8");
    } finally {
      await sandbox.stop();
    }
    ```
  </Tab>
</Tabs>

In your local project directory, replace `[REPOSITORY-URL]` with your public repository URL, then run the script:

<Tabs>
  <Tab title="Python">
    ```bash theme={"system"}
    python run_muse.py [REPOSITORY-URL]
    ```
  </Tab>

  <Tab title="TypeScript">
    ```bash theme={"system"}
    npx tsx run_muse.mts [REPOSITORY-URL]
    ```
  </Tab>
</Tabs>

After the installation and agent output, the script checks and prints the sparkline:

```text theme={"system"}
▁▃█▃▁
```

The script saves the generated `sparkline.mjs` file in your local project directory, then stops the sandbox. If the file already exists locally, the script overwrites it. The output check runs independently of Muse's own test and verifies this example's input. For a larger task, replace it with tests for your requirements.

これらのサンプルでは永続ストレージを設定していません。`finally` ブロックが実行される前に、必要なファイルをサンドボックスからコピーしてください。詳しくは[ファイル操作](/ja/products/sandboxes/serverless/client/guides/file-operations)および[ファイルシステムスナップショット](/products/sandboxes/serverless/file-system-snapshots)を参照してください。

## Troubleshoot

Use these checks to resolve common issues:

* サンドボックスの作成に失敗する場合は、W\&B キーと認証設定を確認してください。
* Muse Code で認証エラーが発生する場合は、`META_API_KEY` と Meta のアカウントの設定を確認してください。サンドボックスの認証情報は、モデルリクエストの認証には使用されません。
* インストール、クローン、またはモデルリクエストが失敗する場合は、Meta および Git ホストへのアウトバウンドアクセスを確認してください。
* 規模の大きいタスクがタイムアウトする場合は、実行前にコマンドのタイムアウトとサンドボックスのライフタイムを調整してください。30 分のライフタイムには、起動とインストールにかかる時間も含まれます。詳しくは[コマンドのタイムアウト](/ja/products/sandboxes/serverless/client/guides/execution#set-a-timeout)および[サンドボックスのライフサイクル](/ja/products/sandboxes/serverless/client/guides/sandbox-lifecycle)を参照してください。

## Next steps

For more information, see these guides:

* [Interactive shells and TTY](../client/guides/interactive-shells) covers terminal access for interactive agents.
* [Run agents on CoreWeave sandboxes](.) compares agent integrations and workspace options.
* [Meta's sandboxed execution cookbook](https://dev.meta.ai/docs/cookbook/sandboxed-execution) demonstrates a reproduce, fix, and verify workflow with a custom tool loop in Docker.
* [Muse Code documentation](https://dev.meta.ai/docs/muse-code) covers agent configuration and other CLI workflows.
