コードを書くエージェントが役に立つのは、そのコードを安全に実行して結果を返す仕組みがあってこそです。このガイドでは、そのループを最初から最後まで作ります。モデルが 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 回できます。
次に読むもの
- SDK を順を追って:5 分で始めるサンドボックス用 Python SDK または TypeScript 版
- すべてのメソッドとエラー:SDK リファレンス
- プランとお試しクレジット:サンドボックスのページ
コメント
まだコメントはありません。最初になりましょう。