−25%

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

EQVPS
Bắt đầu

Tài liệu tham khảo API sandbox: SDK Python và TypeScript

Mọi phương thức của SDK sandbox EQVPS trên một trang: tham số, giá trị mặc định, giá trị trả về và đủ 11 lớp lỗi, cùng một ví dụ bằng Python và TypeScript.

Kiểm tra lần cuối: 2026-10-10 · SDK 0.2.0 (PyPI eqvps, npm @eqvps/sdk)

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.

PythonTypeScriptMặc địnhÝ nghĩa
modemode"ephemeral""ephemeral" (theo giây) hoặc "persistent" (theo giờ đã bắt đầu, giữ đĩa)
tarifftariff"small"micro, small, standard, plus, pro, max
idle_timeoutidleTimeout300số giây không hoạt động trước khi sandbox tạm thời bị xóa, tối đa 3600
ttlttl—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
envenv—biến môi trường cho mọi lệnh, lưu dạng mã hóa
api_key, base_urlapiKey, baseUrlbiến môi trườngthay cho EQVPS_API_KEY / EQVPS_API_URL
timeouttimeoutMs70 giâythời gian chờ HTTP cho mỗi yêu cầu
max_retriesmaxRetries3số 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_codemã thoát của tiến trình
stdout, stderrđầu ra, tối đa 1 MiB mỗi luồng
timed_outlệnh chạm thời gian chờ
truncatedđầu ra bị cắt
duration_msthời gian chạy
okexit_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ứcChứ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ớpHTTPcode thường gặpCách xử lý
AuthenticationError401unauthenticatedkiểm tra token
InsufficientBalanceError402insufficient_balancenạp thêm số dư
NotFoundError404not_foundsai id hoặc tệp không tồn tại
SandboxPausedError409sandbox_pausedtạm dừng vì hết số dư; tiếp tục sau khi nạp
SandboxDeletedError410sandbox_deletedđã bị xóa vĩnh viễn
FileTooLargeError413file_too_largegiữ mỗi lần truyền dưới 5 MB
ValidationError422invalid_requestsửa tham số
RateLimitError429too_many_concurrent, too_many_tasks, rate_limitedchờ rồi thử lại
BudgetExceededError429budget_exceededđã chạm hạn mức chi tiêu ngày hoặc tháng cho sandbox
CapacityError503capacitythử lại sau ít phút hoặc chọn gói nhỏ hơn
SandboxTimeoutError—request_timeout, wait_timeoutyê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.

Câu hỏi thường gặp

SDK hỗ trợ những phiên bản Python và Node.js nào?

Gói Python cần Python 3.8 trở lên và không có phụ thuộc. Gói TypeScript cũng không có phụ thuộc, chạy trên Node.js 18+, Deno, Bun và các trình duyệt có fetch.

SDK lấy khóa API của tôi ở đâu?

Từ đối số api_key / apiKey hoặc từ biến môi trường EQVPS_API_KEY. Khóa là token tài khoản EQVPS thông thường. EQVPS_API_URL thay địa chỉ API; chỉ cần khi kiểm thử.

SDK có tự thử lại các yêu cầu thất bại không?

Có, với 429 và 503 tối đa 3 lần khi máy chủ gửi Retry-After, mỗi lần chờ tối đa 30 giây. Các trạng thái này nghĩa là yêu cầu bị từ chối trước khi bất cứ thứ gì chạy, nên thử lại run và exec là an toàn. Lỗi mạng chỉ được thử lại với GET; run, exec và upload không bao giờ bị gửi hai lần.

Mã thoát khác 0 có phải là ngoại lệ không?

Không. run và exec trả về kết quả gồm exit_code, stdout và stderr. Hãy kiểm tra result.ok hoặc result.exit_code. Ngoại lệ chỉ xảy ra với lỗi API, ví dụ số dư trống hoặc token không hợp lệ.

Làm sao chắc chắn sandbox bị xóa nếu mã của tôi bị lỗi giữa chừng?

Dùng dạng có phạm vi: with Sandbox.create() as sb trong Python, Sandbox.with(options, fn) hoặc await using trong TypeScript. Sandbox bị xóa khi khối lệnh kết thúc, kể cả sau ngoại lệ.

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ị.