SDK là một lớp mỏng trên REST API của sandbox. Nó giúp bạn khỏi ba việc: tự dựng yêu cầu, thử lại khi nền tảng bận và quên xóa sandbox khi mã ném ngoại lệ. Mọi thứ ở đây ứng với phiên bản 0.2.0 của cả hai gói.
Nếu bạn chưa từng tạo sandbox, hướng dẫn kết nối 5 phút sẽ cấp token cho bạn trước. Sandbox là gì và bên trong có gì được giải thích ở trang Sandbox.
Cài đặt và cấu hình
pip install eqvps # Python 3.8+
npm i @eqvps/sdk # Node.js 18+, Deno, Bun
export EQVPS_API_KEY=... # your EQVPS account token
Cùng một chương trình bằng hai ngôn ngữ: tạo sandbox, chạy mã, xóa nó.
from eqvps import Sandbox
with Sandbox.create(tariff="small") as sb:
r = sb.run("print(2 + 2)")
print(r.exit_code, r.stdout) # 0 4
import { Sandbox } from "@eqvps/sdk";
await Sandbox.with({ tariff: "small" }, async (sb) => {
const r = await sb.run("print(2 + 2)");
console.log(r.exit_code, r.stdout); // 0 4
});
Tạo và tìm sandbox
Sandbox.create(...) khởi động một sandbox, thường mất khoảng một giây. Python nhận đối số có tên, TypeScript nhận một đối tượng tùy chọn.
| Python | TypeScript | Mặc định | Ý nghĩa |
|---|---|---|---|
mode | mode | "ephemeral" | "ephemeral" (theo giây) hoặc "persistent" (theo giờ đã bắt đầu, giữ đĩa) |
tariff | tariff | "small" | micro, small, standard, plus, pro, max |
idle_timeout | idleTimeout | 300 | số giây không hoạt động trước khi sandbox tạm thời bị xóa, tối đa 3600 |
ttl | ttl | — | thời gian sống tối đa tính bằng giây: tới 86400 với tạm thời, 2592000 với lâu dài |
env | env | — | biến môi trường cho mọi lệnh, lưu dạng mã hóa |
api_key, base_url | apiKey, baseUrl | biến môi trường | thay cho EQVPS_API_KEY / EQVPS_API_URL |
timeout | timeoutMs | 70 giây | thời gian chờ HTTP cho mỗi yêu cầu |
max_retries | maxRetries | 3 | số lần thử lại khi gặp 429/503 |
Sandbox.connect(id) gắn vào một sandbox có sẵn, thường là sandbox lâu dài bạn tạo hôm qua. Sandbox.list() trả về mọi sandbox của tài khoản, đang chạy và đang tạm dừng.
Thuộc tính: id (sb_ + 24 ký tự hex), mode, tariff, state (running, starting, paused, pausing, resuming, deleting, deleted), env_keys / envKeys (chỉ tên, giá trị không bao giờ được trả về) và info (đối tượng thô). refresh() tải lại chúng.
kill() xóa sandbox và dừng tính phí. Gọi nó cho sandbox đã không còn tồn tại không bị coi là lỗi.
Chạy mã
run(code, language="python", timeout=30) gửi mã qua stdin tới Python 3.12, Node.js 22 hoặc bash ("python", "node", "bash"). exec(command, cwd=None, stdin=None, timeout=30) chạy lệnh shell: chuỗi đi qua bash -lc, danh sách được chạy như argv không qua shell.
Cả hai trả về ExecResult:
| Trường | Ý nghĩa |
|---|---|
exit_code | mã thoát của tiến trình |
stdout, stderr | đầu ra, tối đa 1 MiB mỗi luồng |
timed_out | lệnh chạm thời gian chờ |
truncated | đầu ra bị cắt |
duration_ms | thời gian chạy |
ok | exit_code == 0 và không hết giờ |
Một lời gọi đồng bộ chạy tối đa 55 giây. Cả hai phương thức cũng nhận env cho riêng lời gọi đó; nó ghi đè các giá trị đặt lúc tạo.
Việc dài: tác vụ nền
Truyền background=True (TypeScript: { background: true }) và bạn nhận ngay một Task. Nó không bị giới hạn 55 giây và có thể chạy tới khi sandbox hết thời gian sống. Tối đa 8 tác vụ mỗi sandbox.
task = sb.exec("cd /root/app && python3 -m pytest -q", background=True)
result = task.wait(on_output=lambda out, err: print(out, end=""))
print(result.state, result.exit_code) # done 0
const task = await sb.exec("cd /root/app && npm test", { background: true });
const result = await task.wait({ onOutput: (out) => process.stdout.write(out) });
| Phương thức | Chức năng |
|---|---|
task.logs() | stdout và stderr mới kể từ lần gọi trước |
task.status() | trạng thái mà không tiêu thụ đầu ra: running, done, failed, killed, timeout |
task.wait(timeout, poll_interval=2, on_output) | hỏi liên tục tới khi tác vụ xong, trả về TaskResult |
task.kill() | dừng tác vụ và các tiến trình của nó |
sb.task(id) / sb.tasks() | gắn lại vào một tác vụ / liệt kê tác vụ |
Nếu wait chạm thời gian chờ của chính nó, nó ném SandboxTimeoutError, nhưng tác vụ vẫn chạy tiếp. Một tác vụ đang chạy cũng ngăn sandbox tạm thời bị xóa vì không hoạt động.
Tệp và mức sử dụng
upload(path, content, mode=None) ghi tệp vào đường dẫn tuyệt đối và trả về kích thước. download(path) trả về byte, download_text(path) / downloadText(path) trả về chuỗi. Mỗi lần truyền giới hạn 5 MB.
usage() trả về số giây đã chạy, số giây CPU đã dùng, byte đi ra, giá theo giờ, billed_usd và estimated_total_usd. tariffs() là hàm thường, không cần khóa, trả về giá và giới hạn hiện hành. Quy tắc tính phí ở trang Giới hạn và tính phí sandbox.
Lỗi
Mỗi lỗi API là một lớp con của EqvpsError với status (HTTP), code (chuỗi ổn định) và body. retry_after / retryAfter có giá trị khi máy chủ gửi nó.
| Lớp | HTTP | code thường gặp | Cách xử lý |
|---|---|---|---|
AuthenticationError | 401 | unauthenticated | kiểm tra token |
InsufficientBalanceError | 402 | insufficient_balance | nạp thêm số dư |
NotFoundError | 404 | not_found | sai id hoặc tệp không tồn tại |
SandboxPausedError | 409 | sandbox_paused | tạm dừng vì hết số dư; tiếp tục sau khi nạp |
SandboxDeletedError | 410 | sandbox_deleted | đã bị xóa vĩnh viễn |
FileTooLargeError | 413 | file_too_large | giữ mỗi lần truyền dưới 5 MB |
ValidationError | 422 | invalid_request | sửa tham số |
RateLimitError | 429 | too_many_concurrent, too_many_tasks, rate_limited | chờ rồi thử lại |
BudgetExceededError | 429 | budget_exceeded | đã chạm hạn mức chi tiêu ngày hoặc tháng cho sandbox |
CapacityError | 503 | capacity | thử lại sau ít phút hoặc chọn gói nhỏ hơn |
SandboxTimeoutError | — | request_timeout, wait_timeout | yêu cầu HTTP (hoặc wait) hết giờ, không phải lệnh |
Hai giới hạn gây ra phần lớn lỗi 429: một tài khoản chạy 2 lệnh cùng lúc và giữ tối đa 20 sandbox. SDK thử lại khi máy chủ cho biết cần chờ bao lâu; sau ba lần, bạn nhận ngoại lệ.
Khi nào không cần SDK
Ngôn ngữ nào có HTTP client cũng có thể gọi API trực tiếp; các endpoint nằm trong tệp OpenAPI tại https://eqvps.com/openapi.json. Tác tử trong Claude, Cursor hay các MCP client khác hoàn toàn không cần viết mã: máy chủ MCP có cùng bộ công cụ sandbox. Còn nếu chỉ muốn xem nó chạy thế nào, trang sandbox có bảng giá và gói dùng thử $1 cho tài khoản mới.
Bình luận
Chưa có bình luận nào. Hãy là người đầu tiên.