會寫程式碼的代理,只有在有東西能安全執行這些程式碼並彙報結果時才真正有用。本教學從頭到尾搭建這個迴圈:模型寫一個 Python 指令碼,沙箱執行它,失敗了就把錯誤交還給模型。然後用 MCP 完成同一任務,一行程式碼都不用寫。
您需要 Python 3.8+、一個 EQVPS 帳戶權杖(見連線帳戶),以及某個模型的 API 金鑰。
1. 先設定消費上限
代理會自己建立沙箱,所以開始前先給它定個上限。做實驗的話,每天 2 美元、每月 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. 安裝兩個庫
pip install eqvps anthropic
export EQVPS_API_KEY="your-eqvps-token"
export ANTHROPIC_API_KEY="your-model-key"
範例使用了一家模型服務供應商,但沒有任何部分依賴它。只有 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。如果第一個指令碼失敗,您會看到第二次嘗試修復了錯誤。
各部分的作用:
Sandbox.create(..., idle_timeout=120)約 1 秒啟動一台微虛擬機器。即使您的指令碼中途退出,沙箱也會在空閒 2 分鐘後自行刪除。sb.run(code, timeout=55)執行程式碼,返回結束代碼、stdout 和 stderr。程式碼崩潰是正常結果而不是異常,所以迴圈可以把它展示給模型。r.stderr[-3000:]只發送錯誤的末尾部分。大型指令碼的完整 traceback 會浪費模型大量上下文。- 最多 3 次是有意設定的限制。三次都修不好指令碼的模型,通常需要更好的任務描述,而不是第四次嘗試。
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。一條提示詞就夠了:
建立一個小型臨時沙箱。寫一個 Python 指令碼統計 1,000,000 以內的質數個數,在沙箱裡執行,失敗就修復,把結果告訴我,然後刪除沙箱。
代理會執行和上面指令碼相同的呼叫。哪些工具可以免確認放行,見 MCP 防護措施。
花了多少錢
沙箱存在的時間遠不到一分鐘,按最低 60 秒計費:small 上 0.00055 美元。呼叫模型的花費比沙箱還高。新帳戶 1 美元的試用額度大約夠這樣執行 1,800 次。
接下來
- 一步步學習 SDK:5 分鐘上手沙箱 Python SDK 或 TypeScript 版。
- 所有方法和錯誤:SDK 參考。
- 方案和試用額度:沙箱頁面。
評論
目前還沒有評論。歡迎成為第一位。