−25%

Windows 年繳方案適用,至 10 月 31 日。 檢視方案

EQVPS
開始使用

在沙箱中完成第一個代理任務:LLM 寫程式碼,微虛擬機器來執行

搭建最小可用的 AI 程式碼執行迴圈:模型寫一個 Python 指令碼,Firecracker 沙箱執行它,出錯就把錯誤交還給模型,直到指令碼跑通。約 40 行程式碼,另附完全不寫程式碼、透過 MCP 完成同一任務的方法。

會寫程式碼的代理,只有在有東西能安全執行這些程式碼並彙報結果時才真正有用。本教學從頭到尾搭建這個迴圈:模型寫一個 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 次。

接下來

常見問題

為什麼不直接在自己的機器上執行模型產生的程式碼?

因為您不知道它會做什麼。產生的程式碼可能刪除檔案、讀取您的金鑰,或陷入死迴圈。在沙箱裡,它執行在帶獨立核心的單獨微虛擬機器中,用完後沙箱被刪除。

除了範例裡的模型,其他模型也能用嗎?

能。這個迴圈只需要一個接收訊息、返回文字的函式。把 ask() 換成任何聊天 API 都行,包括本機模型。

怎樣防止代理無休止地建立沙箱?

開始前設定每日和每月消費上限。達到上限後,新沙箱會被 429 budget_exceeded 拒絕。此外每個帳戶同時只能執行兩條指令,失控的迴圈也無法成倍擴張。

產生的程式碼能存取網際網路嗎?

能,沙箱可以存取外網,這樣程式碼才能安裝套件、下載資料。沙箱沒有對內埠。不要把金鑰寫進提示詞或程式碼;指令碼確實需要的,用環境變數傳入。

評論

目前還沒有評論。歡迎成為第一位。

發表評論

評論在顯示前會經過審核。