−25%

Windows 年払い、10月31日まで。 プランを見る

EQVPS
始める

サンドボックスで最初のエージェントタスク:LLM がコードを書き、microVM が実行する

AI によるコード実行の、最小限で役に立つループを作ります。モデルが Python スクリプトを書き、Firecracker サンドボックスが実行し、エラーはスクリプトが動くまでモデルに戻されます。約 40 行。コードを一切書かずに MCP で同じことをする方法も紹介します。

コードを書くエージェントが役に立つのは、そのコードを安全に実行して結果を返す仕組みがあってこそです。このガイドでは、そのループを最初から最後まで作ります。モデルが Python スクリプトを書き、サンドボックスが実行し、失敗したらエラーをモデルに返します。そのあと、同じタスクをコードを 1 行も書かずに MCP で行います。

必要なのは Python 3.8+、EQVPS のアカウントトークン(アカウントの接続を参照)、そしてモデルの API キーです。

1. まず支出上限を設定する

エージェントは自分でサンドボックスを作るので、始める前に上限を決めておきます。実験なら 1 日 2 ドル、1 か月 20 ドルで十分です。

curl -X PUT https://api.eqvps.com/api/v1/eqvps/sandboxes/budget \
  -H "Authorization: Bearer $EQVPS_API_KEY" -H "Content-Type: application/json" \
  -d '{"daily_usd": 2, "monthly_usd": 20}'

上限に達すると、新しいサンドボックスには 429 budget_exceeded が返り、実行中の一時サンドボックスは削除されます。詳しくはサンドボックスの制限と課金を参照してください。

2. 2 つのライブラリをインストールする

pip install eqvps anthropic
export EQVPS_API_KEY="your-eqvps-token"
export ANTHROPIC_API_KEY="your-model-key"

例では 1 社のモデルを使っていますが、それに依存している部分はありません。モデルとやり取りするのは ask() 関数だけです。

3. 書く・実行する・直すループ

次の内容を agent.py として保存します。

import re
import anthropic
from eqvps import Sandbox

TASK = "Count the prime numbers below 1,000,000 and print only the number."
client = anthropic.Anthropic()

def ask(messages):
    msg = client.messages.create(model="claude-sonnet-5", max_tokens=2000, messages=messages)
    return msg.content[0].text

def extract_code(text):
    m = re.search(r"`{3}(?:python)?\n(.*?)`{3}", text, re.S)
    return m.group(1) if m else text

messages = [{"role": "user", "content": "Write a Python 3 script for this task. "
             "Reply with a single code block and nothing else.\n\nTask: " + TASK}]

with Sandbox.create(tariff="small", idle_timeout=120) as sb:
    for attempt in range(1, 4):
        reply = ask(messages)
        r = sb.run(extract_code(reply), timeout=55)
        print(f"attempt {attempt}: exit code {r.exit_code}")
        if r.ok:
            print(r.stdout.strip())
            break
        messages += [
            {"role": "assistant", "content": reply},
            {"role": "user", "content": f"The script failed with exit code {r.exit_code}.\n"
             f"stderr:\n{r.stderr[-3000:]}\nFix it. Reply with a single code block."},
        ]

実行します。

python3 agent.py

典型的な実行では、attempt 1: exit code 0 に続いて 78498 が表示されます。最初のスクリプトが失敗した場合は、エラーを直した 2 回目の試行が表示されます。

各部分の役割:

  • Sandbox.create(..., idle_timeout=120) は約 1 秒で microVM を起動します。スクリプトが途中で止まっても、サンドボックスは 2 分間操作がなければ自動で削除されます。
  • sb.run(code, timeout=55) はコードを実行し、終了コード、stdout、stderr を返します。コードのクラッシュは例外ではなく通常の結果なので、ループはそれをモデルに見せられます。
  • r.stderr[-3000:] はエラーの末尾だけを送ります。大きなスクリプトの完全なトレースバックは、モデルのコンテキストを大きく無駄にします。
  • 試行は 3 回までというのは意図的な制限です。3 回で直せないモデルに必要なのは、たいてい 4 回目ではなく、より良いタスクの説明です。

4. タスクに 55 秒以上かかる場合

同期呼び出しは最長 55 秒です。もっと長い処理はバックグラウンドで始めて待ちます。

task = sb.run(code, background=True)
result = task.wait(timeout=1800)

wait がタイムアウトしてもタスクは動き続け、sb.task(task_id) で再び扱えます。

5. 同じタスクを MCP で、コードなしで

Claude Desktop や Cursor などの MCP クライアントで EQVPS の MCP サーバーを使っているなら、エージェントにはすでにサンドボックス用のツールがあります。create_sandbox、run_code、exec_command、upload_file、download_file、kill_sandbox です。プロンプト 1 つで足ります。

小さな一時サンドボックスを作ってください。1,000,000 未満の素数を数える Python スクリプトを書いてそこで実行し、失敗したら直し、結果を教えてからサンドボックスを削除してください。

エージェントは上のスクリプトと同じ呼び出しを行います。どのツールを確認なしで許可してよいかは、MCP のガードレールで説明しています。

かかった費用

サンドボックスが存在したのは 1 分よりずっと短く、最低料金の 60 秒分で課金されました。small で 0.00055 ドルです。モデルの呼び出しのほうがサンドボックスより高くつきます。新しいアカウントの 1 ドルのお試しクレジットで、このような実行を約 1,800 回できます。

次に読むもの

よくある質問

モデルのコードを自分のマシンでそのまま動かしてはいけないのですか?

何をするかわからないからです。生成されたコードはファイルを消したり、鍵を読んだり、無限ループに入ったりするかもしれません。サンドボックスなら独自のカーネルを持つ別の microVM で動き、終わればサンドボックスは削除されます。

例のモデル以外でも使えますか?

使えます。ループに必要なのは、メッセージを受け取ってテキストを返す関数だけです。ask() 関数を、ローカルモデルを含む任意のチャット API に置き換えてください。

エージェントがサンドボックスを際限なく作るのを防ぐには?

始める前に、1 日と 1 か月の支出上限を設定します。上限に達すると、新しいサンドボックスは 429 budget_exceeded で拒否されます。さらに 1 アカウントで同時に実行できるコマンドは 2 つまでなので、暴走したループが増殖することもありません。

生成されたコードはインターネットにアクセスできますか?

できます。パッケージのインストールやデータの取得ができるよう、サンドボックスは外向きのインターネットに接続できます。着信用のポートはありません。プロンプトやコードに秘密情報を入れず、スクリプトに本当に必要なものだけを環境変数で渡してください。

コメント

まだコメントはありません。最初になりましょう。

コメントを残す

コメントは表示される前にモデレートされます。