> ## 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 を実行し、結果を取得してからコンピュートを停止します。

CoreWeave のサンドボックス内で Muse Code を実行すると、リモートのワークスペースでファイルの編集やコマンドの実行を行えます。このガイドでは、Sandboxes ソフトウェア開発キット (SDK) を使用してコマンドラインインターフェース (CLI) をインストールし、リポジトリをクローンします。続いて、対話型ターミナルを使用せずにタスクを実行し、結果を取得してからサンドボックスを停止します。エージェントのプロセスとワークスペースは CoreWeave 上で実行され、モデルへのリクエストは Meta に送信されます。

<h2 id="prerequisites">
  前提条件
</h2>

開始する前に、以下を準備してください。

* `SANDBOX_USER` action が付与された [CoreWeave API アクセストークン](/ja/products/sandboxes/placement#choose-and-get-credentials)。
* Muse Code へのアクセス権を持つ [Meta APIキー](https://dev.meta.ai/docs/muse-code/auth)。
* サンドボックスがクローンできる公開リポジトリの URL。非公開リポジトリを使用する場合は、サンドボックス内に Git の認証情報が必要です。
* Python 3.11 以降と `uv`、または Node.js 22 以降と `npm`。

シークレットマネージャーから認証情報を取得し、ローカルのターミナル環境に読み込みます。`[API-ACCESS-TOKEN]` は CoreWeave API アクセストークンに、`[META-API-KEY]` は Meta APIキーに置き換えてください。

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

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

<h2 id="install-the-sandbox-client">
  サンドボックスクライアントをインストールする
</h2>

使用する言語を選択し、ローカルプロジェクトを準備します。

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

<h2 id="run-a-task-in-the-sandbox">
  サンドボックスでタスクを実行する
</h2>

使用する言語のスクリプトを、表示されているファイル名で保存します。各スクリプトは、最大ライフタイムが 30 分のサーバーレスサンドボックスを作成し、次のステップを実行します。

1. Meta のインストーラーを使用して Muse Code をインストールします。
2. リポジトリを `/workspace/project` ディレクトリにクローンします。
3. `muse exec` を実行して、数値を小さなチャートとしてレンダリングする スパークライン CLI をビルドし、テストします。
4. 生成された CLI を単独で実行して出力を確認し、`sparkline.mjs` ファイルをローカルに保存します。
5. セットアップや実行が失敗した場合も含め、`finally` ブロックでサンドボックスを停止します。

これらの例は Muse Code 1.3.0 で動作確認済みです。インストーラーによってより新しいバージョンがインストールされる場合があるため、各スクリプトはインストール後に `muse --version` を実行します。

この例では `--yolo` を使用して、Muse Code の承認プロンプトとオペレーティングシステム (OS) のサンドボックスを無効にし、今回の実行ではワークスペースを信頼するようにしています。外側のサンドボックスは CoreWeave が提供します。Muse は、そのサンドボックス内で利用可能なファイル、認証情報、ネットワーク送信先にアクセスできます。信頼できるリポジトリを使用し、タスクに必要な認証情報のみを提供してください。詳細については、次を参照してください: [Muse Code の権限](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 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(
        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/node";

    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>

ローカルのプロジェクトディレクトリで `[REPOSITORY-URL]` を公開リポジトリの URL に置き換え、スクリプトを実行します。

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

インストールが完了してエージェントの出力が表示されると、スクリプトはスパークラインを検証して表示します。

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

スクリプトは、生成された `sparkline.mjs` ファイルをローカルのプロジェクトディレクトリに保存してから、サンドボックスを停止します。同名のファイルがローカルにすでにある場合は上書きされます。出力チェックは Muse 自体のテストとは別に実行され、この例の入力を検証します。より大規模なタスクでは、要件に合ったテストに置き換えてください。

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

<h2 id="troubleshoot">
  トラブルシューティング
</h2>

よくある問題は、次の点を確認して解決してください。

* サンドボックスの作成に失敗する場合は、CoreWeave API アクセストークンと認証設定を確認してください。
* Muse Code で認証エラーが発生する場合は、`META_API_KEY` と Meta アカウントの設定を確認してください。サンドボックスの認証情報は、モデルへのリクエストの認証には使用されません。
* インストール、クローン、またはモデルへのリクエストが失敗する場合は、Meta と Git ホストへの外向き通信が可能かどうかを確認してください。これらの例ではサーバーレスの配置を使用しています。独自の CoreWeave Kubernetes Service (CKS) クラスターを使用するには、[CKS の配置とポリシーを設定する](/ja/products/sandboxes/agents#configure-cks-placement-and-policy)に記載のクライアント設定を適用してください。また、ランナーのポリシーでこれらの送信先への外向き通信が許可されていることを確認してください。
* 規模の大きいタスクがタイムアウトする場合は、実行前にコマンドのタイムアウトとサンドボックスのライフタイムを調整してください。30 分のライフタイムには、起動とインストールにかかる時間も含まれます。詳しくは、[コマンドのタイムアウト](/ja/products/sandboxes/client/guides/execution#set-a-timeout)および[サンドボックスのライフサイクル](/ja/products/sandboxes/client/guides/sandbox-lifecycle)を参照してください。

<h2 id="next-steps">
  次のステップ
</h2>

詳細については、次のガイドを参照してください。

* [インタラクティブシェルと TTY](/ja/products/sandboxes/client/guides/interactive-shells) では、対話型エージェント向けのターミナルアクセスについて説明しています。
* [CoreWeave サンドボックスでエージェントを実行する](/ja/products/sandboxes/agents) では、エージェントのインテグレーションとワークスペースのオプションを比較しています。
* [Meta のサンドボックス実行クックブック](https://dev.meta.ai/docs/cookbook/sandboxed-execution) では、Docker 上のカスタムツールループを使って、問題の再現、修正、検証を行うワークフローを紹介しています。
* [Muse Code のドキュメント](https://dev.meta.ai/docs/muse-code) では、エージェント設定やその他の CLI ワークフローについて説明しています。
