HN 日本語サマリー

← 一覧へ戻る
その他

コンピュータ使用エージェントのためにWindowsサンドボックスでMinecraftを実行する

Run Minecraft in a Windows sandbox for computer use agents (cua.ai)

12 pointsby someguy1010102 コメント

要約

この記事は、Windowsサンドボックス内でMinecraft Java Editionをセットアップし、エージェントで操作する方法を解説しています。Minecraftはインターネットアクセス、Javaランタイム、OpenGL、GUI操作など、サンドボックスの機能を広くテストするのに適しています。ガイドでは、 cua-driver MCPサーバーをサンドボックス内で実行し、エージェントがそれを介してMinecraftを制御する手順を示しています。

全文翻訳

WindowsサンドボックスでMinecraftを実行する Windowsサンドボックスを起動し、Minecraft Java Editionをインストールし、サンドボックス内で実行されているcua-driver MCPサーバーを介してエージェントで操作します。ページをコピー MinecraftはWindowsサンドボックスができることのほぼすべてを試します。インターネットアクセス、Javaランタイム、動作するOpenGL、そしてクリックだけで操作できるGUIが必要です。このガイドでは、Windowsサンドボックスを起動し、Minecraft Java Editionをインストールし、サンドボックス内のcua-driverのMCPサーバーと通信するエージェントに引き渡します。これは、ローカルサンドボックスおよびFleetに対するのと同じループです。 開始する前に cua-sandbox 0.3.3以降が必要です。Fleet上のWindowsには0.3.0、Image.expose()がローカルQEMUランタイムに搭載されたのが0.3.1、このガイドが読み取るsb.exposed_portsの転送ポートが0.3.2に搭載され、0.3.3ではImage.from_registry(..., os_type=...)と、Fleetが独自の許可リスト外のレジストリからイメージを起動できるプルシークレットの修正の両方が提供されました。これは、以下のcontainerDiskセクションで必要とされます。ローカルパス用のハードウェア仮想化を備えたホスト。/dev/kvmを備えたLinux x86_64マシン、またはIntel Mac。このガイドは-cpu hostを渡しますが、これはKVMまたはHVFでのみ受け入れられます。Apple Silicon上のx86_64ゲストはTCGエミュレーションで実行されるため、-cpu hostは完全に拒否されます。Fleetパスはそこで実行され、ゲームも含まれます。Fleetセクションで説明されている追加の1つの環境変数を使用します。Minecraft Java Editionを所有するMicrosoftアカウント。サインインにはMicrosoftデバイス認証が使用されるため、中間の一つのステップは手動です。サンドボックス内にコードが表示され、自分のブラウザで承認します。エージェントループ用のビジョン対応LLMエンドポイント。Windowsサンドボックスを起動する Image.windows()は、ピン留めされたWindows Server 2022 containerDiskに解決されます。デフォルトに加えて3つのものが追加されます。 .expose(3000)はcua-driverのMCPサーバーを公開します。これはすでにゲスト内で実行されているため、エージェントはそれにアクセスできます。2番目のネットワークインターフェイス。ベアメタルランタイムはNICをrestrict=onでアタッチし、ゲストを分離します。sb.shell.run()は転送ポート経由で引き続き機能しますが、Windows内の何もインターネットに到達できません。そしてMinecraftはそれを必要とします。 -cpu host。デフォルトのqemu64モデルはソフトウェアOpenGLドライバーには薄すぎます。Minecraftはウィンドウを作成し、リソースをロード中に終了します。Java例外もクラッシュログもありません。コマンドラインの最後の-cpuが優先されるため、追加するだけで十分です。 import asyncio from cua import Image, QEMURuntime, Sandbox EXTRA_ARGS = [ # 2番目の、制限のないユーザーモードNIC — デフォルトはrestrict=onです '-netdev', 'user,id=net1,net=10.0.3.0/24,host=10.0.3.2,dns=10.0.3.3', '-device', 'virtio-net-pci,netdev=net1,mac=52:55:00:d1:55:02', # ソフトウェアOpenGLドライバーが実際に使用できるCPU '-cpu', 'host', ] async def main(): sb = await Sandbox.create( Image.windows().expose(3000), name='mc-win', local=True, runtime=QEMURuntime( mode='bare-metal', cpu_count=12, memory_mb=16384, extra_args=EXTRA_ARGS, ), ) mcp_port = sb.exposed_ports[3000] print(f'cua-driver MCP on http://127.0.0.1:{mcp_port}/mcp') await sb.disconnect() # サンドボックスは実行を続けます asyncio.run(main()) ウォームブートは約30秒かかります。exposed_portsは、公開された各ゲストポートをホストポートのマッピングにマッピングし、そのポートでのGET /healthzは、cua-driverが起動したらokと応答します。ポートはトンネルからではなく、sb.exposed_portsから読み取ります。sb.tunnel.forward(3000) — 転送ポートを取得する通常の手段であり、以下のFleetセクションで使用されるもの — はNotImplementedErrorを発生させます: HTTPTransportはローカルトランスポートでのポートフォワーディングをサポートしていません。exposed_portsはローカルの同等物です。ランタイムは起動時に空きホストポートを選択するため、マッピングは実行時にのみ知ることができ、サンドボックス状態とともに保存されるため、後でSandbox.connect()がそれを読み戻すことができます。Fleetでは、Fleetがサービスを公開するため、プロパティは空です。そこでtunnel.forward()を使用します。2番目のNICに独自のサブネットを割り当てます。ユーザーモードネットワークは両方ともデフォルトで10.0.2.0/24であり、両方ともゲストに10.0.2.15を提供するため、Windowsは一方のインターフェイスをゲートウェイがなくDNSが機能しない169.254.x.xリンクローカルアドレスにドロップします。何かをインストールする前に、ゲストが本当にインターネットに接続できることを確認してください。 async with Sandbox.connect('mc-win', local=True) as sb: check = await sb.shell.run( 'powershell -Command "(Invoke-WebRequest -UseBasicParsing ' 'https://piston-meta.mojang.com/mc/game/version_manifest.json).StatusCode"' ) print(check.stdout) # 200 ランチャーとソフトウェアOpenGLドライバーをインストールする サンドボックスのGPUはMicrosoft Basic Display Adapterで、OpenGL 1.1を提供します。Minecraft 1.17以降はOpenGL 3.2を必要とするため、ゲームにはMesa3Dのopengl32.dll (llvmpipe)が必要です。これはソフトウェアでOpenGLを実装しています。以下の両方のダウンロードは意図的にMinGWビルドです。Prism LauncherとMesaの両方のMSVCビルドは、Windows Server 2022に搭載されていないVisual C++再頒布可能パッケージに依存しています。そのため、Prismはサイレントに終了し、MesaのDLLはロードに失敗するため、Windowsは静かにシステムのopengl32.dllにフォールバックします。 $ErrorActionPreference = 'Stop' $ProgressPreference = 'SilentlyContinue' New-Item -ItemType Directory -Force -Path C:\mc | Out-Null # Prism Launcher — Microsoftデバイス認証でサインインします。ブラウザは不要です Invoke-WebRequest -UseBasicParsing -OutFile C:\mc\prism.zip ` 'https://github.com/PrismLauncher/PrismLauncher/releases/download/11.0.3/PrismLauncher-Windows-MinGW-w64-Portable-11.0.3.zip' Expand-Archive C:\mc\prism.zip -DestinationPath C:\mc\prismw -Force # 7-Zip、Mesaは.7zとして出荷されるため Invoke-WebRequest -UseBasicParsing -OutFile C:\mc\7z.msi 'https://www.7-zip.org/a/7z2408-x64.msi' Start-Process msiexec.exe -ArgumentList '/i','C:\mc\7z.msi','/qn' -Wait # Mesa3DソフトウェアOpenGL Invoke-WebRequest -UseBasicParsing -OutFile C:\mc\mesa.7z ` 'https://github.com/pal1000/mesa-dist-win/releases/download/26.1.6/mesa3d-26.1.6-release-mingw.7z' & 'C:\Program Files\7-Zip\7z.exe' x C:\mc\mesa.7z -oC:\mc\mesamw -y | Out-Null Start-Process -FilePath C:\mc\prismw\prismlauncher.exe -WorkingDirectory C:\mc\prismw これをsetup.ps1として保存し、サンドボックスにプッシュして実行します。約100MBをダウンロードするため、十分なタイムアウトを許可してください。 from pathlib import Path async with Sandbox.connect('mc-win', local=True) as sb: await sb.shell.run('if not exist C:\mc mkdir C:\mc') await sb.files.write_text('C:\mc\setup.ps1', Path('setup.ps1').read_text()) result = await sb.shell.run( 'powershell -NoProfile -ExecutionPolicy Bypass -File C:\mc\setup.ps1', timeout=1800, ) print(result.stdout) サインインしてインスタンスを作成する Prismは初回実行時にクイックセットアップウィザードを開きます。サンドボックスのスクリーンショットを撮り、それをクリックして進み、アカウントページで停止します。 async with Sandbox.connect('mc-win', local=True) as sb: Path('sandbox.png').write_bytes(await sb.screenshot()) # それを見る await sb.mouse.click(888, 678) # 次へ ウィザードをアカウント → Microsoftの追加まで進めます。PrismはQRコードと8文字のデバイスコードを表示します。スクリーンショットからコードを読み取り、自分のブラウザでhttps://www.microsoft.com/linkを開き、それを入力してサインインを承認します。アカウントがステータスReadyで表示されます。インスタンスの追加をクリックし、1.20.1のようなバージョンを検索してOKをクリックします。PrismはクライアントJARとアセットをダウンロードします。デバイスコードは約15分で期限切れになりますが、Prismは自動的に新しいコードを発行してポーリングを続けるため、ダイアログを開いたままにできます。現在のコードを読み取るために新しいスクリーンショットを撮り、古いものを再利用しないでください。ソフトウェアドライバーをランチャーのJavaに向ける 起動をクリックします。Prismは独自のJavaランタイムをダウンロードし、ゲームはGLFWエラー65542: WGL: ドライバーがOpenGLをサポートしていないようです — 予想通り、Mesaがまだ配置されていないためです。PrismはJavaPathを構成で設定しても、ダウンロードしたランタイムを使用し続ける可能性があるため、Mesa DLLをインストールルートの各javaw.exeの隣にコピーします。Windowsはシステムディレクトリよりも実行中実行可能ファイルのディレクトリからopengl32.dllをロードするため、これが機能します。 $dirs = Get-ChildItem C:\mc -Recurse -Filter javaw.exe -ErrorAction SilentlyContinu