−25%

cho Windows trả theo năm, đến 31/10. Xem các gói

EQVPS
Bắt đầu

Tác vụ agent đầu tiên trong sandbox: LLM viết code, microVM chạy nó

Xây vòng lặp thực thi code bằng AI nhỏ nhất mà vẫn hữu ích: mô hình viết script Python, sandbox Firecracker chạy nó, lỗi quay lại mô hình cho tới khi script chạy được. Khoảng 40 dòng, kèm cùng tác vụ qua MCP mà không cần viết code.

Một agent viết code chỉ hữu ích khi có thứ chạy code đó một cách an toàn và báo lại kết quả. Hướng dẫn này xây vòng lặp đó từ đầu đến cuối: mô hình viết một script Python, sandbox chạy nó, và nếu thất bại thì lỗi được trả về cho mô hình. Sau đó là cùng tác vụ mà không viết dòng code nào, qua MCP.

Bạn cần Python 3.8+, token tài khoản EQVPS (xem kết nối tài khoản) và API key cho một mô hình.

1. Đặt hạn mức chi tiêu trước

Agent tự tạo sandbox, nên hãy cho nó một mức trần trước khi bắt đầu. Hai đô mỗi ngày và hai mươi đô mỗi tháng là dư dả cho thử nghiệm:

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}'

Khi chạm hạn mức, sandbox mới nhận 429 budget_exceeded và các sandbox tạm thời đang chạy bị xóa. Chi tiết có trong giới hạn và tính phí sandbox.

2. Cài hai thư viện

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

Ví dụ dùng một nhà cung cấp mô hình, nhưng không có gì phụ thuộc vào nó. Chỉ hàm ask() giao tiếp với mô hình.

3. Vòng lặp viết, chạy, sửa

Lưu đoạn này thành 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."},
        ]

Chạy nó:

python3 agent.py

Một lần chạy điển hình in ra attempt 1: exit code 0 rồi 78498. Nếu script đầu tiên lỗi, bạn sẽ thấy lần thử thứ hai với lỗi đã được sửa.

Mỗi phần làm gì:

  • Sandbox.create(..., idle_timeout=120) khởi động một microVM trong khoảng một giây. Nếu script của bạn chết giữa chừng, sandbox vẫn tự xóa sau 2 phút không hoạt động.
  • sb.run(code, timeout=55) chạy code và trả về mã thoát, stdout và stderr. Code bị lỗi là kết quả bình thường chứ không phải exception, nên vòng lặp có thể đưa nó cho mô hình xem.
  • r.stderr[-3000:] chỉ gửi phần cuối của lỗi. Một traceback đầy đủ từ script lớn có thể lãng phí nhiều ngữ cảnh của mô hình.
  • Ba lần thử là giới hạn có chủ ý. Một mô hình chưa sửa được script sau ba lần thường cần mô tả tác vụ tốt hơn, chứ không phải lần thử thứ tư.

4. Khi tác vụ cần hơn 55 giây

Một lệnh gọi đồng bộ kéo dài tối đa 55 giây. Với việc dài hơn, hãy chạy nền rồi chờ:

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

Tác vụ vẫn tiếp tục chạy kể cả khi wait của bạn quá thời gian chờ, và bạn có thể quay lại với nó bằng sb.task(task_id).

5. Cùng tác vụ qua MCP, không cần code

Nếu bạn dùng một client MCP như Claude Desktop hoặc Cursor với máy chủ MCP của EQVPS, agent đã có sẵn công cụ sandbox: create_sandbox, run_code, exec_command, upload_file, download_file và kill_sandbox. Chỉ cần một prompt:

Tạo một sandbox tạm thời nhỏ. Viết một script Python đếm các số nguyên tố nhỏ hơn 1.000.000, chạy nó ở đó, sửa nếu bị lỗi, cho tôi biết kết quả và xóa sandbox.

Agent thực hiện cùng các lệnh gọi như script ở trên. Công cụ nào an toàn để cho phép mà không cần xác nhận được giải thích trong rào chắn MCP.

Tốn bao nhiêu

Sandbox sống chưa tới một phút và bị tính mức tối thiểu 60 giây: $0.00055 trên small. Lệnh gọi mô hình tốn hơn sandbox. Tín dụng dùng thử $1 của tài khoản mới đủ cho khoảng 1.800 lần chạy như thế này.

Đi tiếp đâu

FAQ

Sao không chạy luôn code của mô hình trên máy của tôi?

Vì bạn không biết nó sẽ làm gì. Code được sinh ra có thể xóa file, đọc khóa của bạn hoặc lặp vô tận. Trong sandbox, nó chạy trong một microVM riêng với kernel riêng, và sandbox bị xóa sau đó.

Cách này có dùng được với mô hình khác ngoài ví dụ không?

Có. Vòng lặp chỉ cần một hàm nhận tin nhắn và trả về văn bản. Hãy thay hàm ask() bằng bất kỳ API chat nào, kể cả mô hình chạy cục bộ.

Điều gì ngăn agent tạo sandbox vô hạn?

Đặt hạn mức chi tiêu theo ngày và theo tháng trước khi bắt đầu. Khi chạm hạn mức, sandbox mới bị từ chối với 429 budget_exceeded. Ngoài ra, mỗi tài khoản chỉ chạy hai lệnh cùng lúc, nên một vòng lặp mất kiểm soát không thể nhân bản.

Code được sinh ra có truy cập internet được không?

Có, sandbox có kết nối internet ra ngoài để code cài gói và tải dữ liệu. Không có cổng vào. Đừng đặt bí mật vào prompt hay code; hãy truyền những bí mật mà script thật sự cần dưới dạng biến môi trường.

Bình luận

Chưa có bình luận nào. Hãy là người đầu tiên.

Để lại bình luận

Bình luận được kiểm duyệt trước khi hiển thị.