agentbox
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseAgentBox
AgentBox
Provision a dedicated AI agent by paying $5 USDC (Solana) via x402. Each agent runs an OpenClaw AI gateway with HTTPS, web terminal, and Solana wallet. Instances last 7 days (extendable).
Base URL:
https://api.agentbox.fyi通过x402支付5 USDC(Solana链)部署专属AI Agent。每个Agent运行搭载HTTPS、网页终端和Solana钱包的OpenClaw AI网关。实例有效期7天(可续期。
Base URL:
https://api.agentbox.fyiPrerequisites
前置要求
bash
npm install @x402/fetch @x402/svm @solana/kitRequires a Solana wallet file ( JSON format: 64-byte array) with USDC funds.
solana-keygenbash
npm install @x402/fetch @x402/svm @solana/kit需要Solana钱包文件( JSON格式:64字节数组),且钱包内有USDC余额。
solana-keygen1. Provision
1. 部署
Create and run with :
provision.mjsnode provision.mjs /path/to/wallet.json [name]javascript
import { readFileSync } from "node:fs";
import { createKeyPairSignerFromBytes } from "@solana/kit";
import { x402Client, wrapFetchWithPayment } from "@x402/fetch";
import { registerExactSvmScheme } from "@x402/svm/exact/client";
const keypairBytes = new Uint8Array(
JSON.parse(readFileSync(process.argv[2], "utf8")),
);
const signer = await createKeyPairSignerFromBytes(keypairBytes);
const client = new x402Client();
registerExactSvmScheme(client, { signer });
const x402Fetch = wrapFetchWithPayment(fetch, client);
const res = await x402Fetch("https://api.agentbox.fyi/provision", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(process.argv[3] ? { name: process.argv[3] } : {}),
});
console.log(JSON.stringify(await res.json(), null, 2));Pays $5 USDC automatically via x402. Name is optional (auto-generated if omitted), must be DNS-safe: lowercase alphanumeric + hyphens, 3-63 chars.
Response (201):
json
{
"id": 12345678,
"name": "boreal-enigma",
"status": "provisioning",
"gatewayToken": "pending",
"accessToken": "eyJhbGci...",
"expiresAt": "2026-03-11T10:00:00.000Z"
}Save , , and .
idnameaccessToken创建文件,执行命令运行:
provision.mjsnode provision.mjs /path/to/wallet.json [name]javascript
import { readFileSync } from "node:fs";
import { createKeyPairSignerFromBytes } from "@solana/kit";
import { x402Client, wrapFetchWithPayment } from "@x402/fetch";
import { registerExactSvmScheme } from "@x402/svm/exact/client";
const keypairBytes = new Uint8Array(
JSON.parse(readFileSync(process.argv[2], "utf8")),
);
const signer = await createKeyPairSignerFromBytes(keypairBytes);
const client = new x402Client();
registerExactSvmScheme(client, { signer });
const x402Fetch = wrapFetchWithPayment(fetch, client);
const res = await x402Fetch("https://api.agentbox.fyi/provision", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(process.argv[3] ? { name: process.argv[3] : {}),
});
console.log(JSON.stringify(await res.json(), null, 2));系统会通过x402自动支付5 USDC。实例名称为可选参数(不填则自动生成,名称必须符合DNS规范:小写字母、数字和连字符,长度3-63个字符。
响应(201):
json
{
"id": 12345678,
"name": "boreal-enigma",
"status": "provisioning",
"gatewayToken": "pending",
"accessToken": "eyJhbGci...",
"expiresAt": "2026-03-11T10:00:00.000Z"
}请保存、和。
idnameaccessToken2. Poll until running
2. 轮询状态直到实例运行
javascript
const { id, name, accessToken } = await res.json();
let instance;
for (let elapsed = 0; elapsed < 600; elapsed += 15) {
await new Promise((r) => setTimeout(r, 15000));
const poll = await fetch(`https://api.agentbox.fyi/provision/${id}`, {
headers: { Authorization: `Bearer ${accessToken}` },
});
instance = await poll.json();
console.log(`[${elapsed}s] status=${instance.status} step=${instance.provisioningStep || "-"}`);
if (instance.status === "running") break;
if (instance.status === "error" || instance.status === "deleted") {
throw new Error(`Provisioning failed: ${instance.status}`);
}
}Poll every 15 seconds. Boot takes 2-4 minutes, timeout after 10 minutes.
Status progression: -> -> . The state is brief (SATI NFT minting). The response also includes a field with granular sub-states (, , , , ).
provisioningmintingrunningmintingprovisioningStepvm_createdconfiguringwallet_createdopenclaw_readyservices_startingWhen is , the response includes the real :
status"running"gatewayTokenjson
{
"status": "running",
"gatewayToken": "a58310a5f1f07...",
"chatUrl": "https://boreal-enigma.agentbox.fyi/chat#token=...",
"terminalUrl": "https://boreal-enigma.agentbox.fyi/terminal/..."
}Save for API interaction.
gatewayTokenjavascript
const { id, name, accessToken } = await res.json();
let instance;
for (let elapsed = 0; elapsed < 600; elapsed += 15) {
await new Promise((r) => setTimeout(r, 15000));
const poll = await fetch(`https://api.agentbox.fyi/provision/${id}`, {
headers: { Authorization: `Bearer ${accessToken}` },
});
instance = await poll.json();
console.log(`[${elapsed}s] status=${instance.status} step=${instance.provisioningStep || "-"}`);
if (instance.status === "running") break;
if (instance.status === "error" || instance.status === "deleted") {
throw new Error(`Provisioning failed: ${instance.status}`);
}
}每15秒轮询一次。启动需要2-4分钟,10分钟后超时。
状态流转: -> -> 。状态持续时间很短(SATI NFT minting过程)。响应还包含字段,提供更细粒度的子状态(、、、、)。
provisioningmintingrunningmintingprovisioningStepvm_createdconfiguringwallet_createdopenclaw_readyservices_starting当为时,响应会包含真实的:
status"running"gatewayTokenjson
{
"status": "running",
"gatewayToken": "a58310a5f1f07...",
"chatUrl": "https://boreal-enigma.agentbox.fyi/chat#token=...",
"terminalUrl": "https://boreal-enigma.agentbox.fyi/terminal/..."
}请保存用于后续API交互。
gatewayToken3. Chat completions
3. 聊天补全
Send messages using the OpenAI-compatible API on the VM:
bash
curl -s https://NAME.agentbox.fyi/v1/chat/completions \
-H "Authorization: Bearer GATEWAY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"messages": [{"role": "user", "content": "Hello, what can you do?"}]}'Replace with the instance name and with from the poll response. Returns standard OpenAI chat completions JSON (non-streaming).
NAMEGATEWAY_TOKENgatewayTokenEach request is stateless. For multi-turn conversations, include the full message history:
bash
curl -s https://NAME.agentbox.fyi/v1/chat/completions \
-H "Authorization: Bearer GATEWAY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"messages": [
{"role": "user", "content": "What is 2+2?"},
{"role": "assistant", "content": "4"},
{"role": "user", "content": "Multiply that by 10"}
]}'The response also includes additional fields beyond those shown in examples (, , , , , , ). These can be safely ignored or stored as needed.
ownerWalletipvmWalletnftMintterminalTokenprovisioningStepcreatedAtterminalUrl通过实例上兼容OpenAI的API发送消息:
bash
curl -s https://NAME.agentbox.fyi/v1/chat/completions \
-H "Authorization: Bearer GATEWAY_TOKEN" \
-H "Content-Type": "running"将替换为你的实例名称,替换为轮询响应中获取的。返回标准的OpenAI聊天补全JSON(非流式)。
NAMEGATEWAY_TOKENgatewayToken每个请求都是无状态的。多轮对话需要包含完整的消息历史:
bash
curl -s https://NAME.agentbox.fyi/v1/chat/completions \
-H "Authorization: Bearer GATEWAY_TOKEN" \
-H "Content-Type": "application/json" \
-d '{"messages": [
{"role": "user", "content": "What is 2+2?"},
{"role": "assistant", "content": "4"},
{"role": "user", "content": "Multiply that by 10"}
]}'响应除了示例中展示的字段外,还包含额外字段(、、、、、、)。你可以忽略这些字段,也可以按需存储。
ownerWalletipvmWalletnftMintterminalTokenprovisioningStepcreatedAt轮询响应中的可以打开网页终端,获得VM的shell访问权限。
terminalUrlExtend
续期
Add 7 more days ($5 USDC). Reuse the x402 client from step 1:
javascript
const res = await x402Fetch("https://api.agentbox.fyi/provision/INSTANCE_ID/extend", {
method: "POST",
headers: { Authorization: "Bearer ACCESS_TOKEN" },
});Returns updated instance with new and . Maximum lifetime: 90 days.
expiresAtaccessToken新增7天使用时长(费用5 USDC)。复用步骤1中的x402客户端即可:
javascript
const res = await x402Fetch("https://api.agentbox.fyi/provision/INSTANCE_ID/extend", {
method: "POST",
headers: { Authorization: "Bearer ACCESS_TOKEN" },
});返回更新后的实例信息,包含新的和。实例最长有效期:90天。
expiresAtaccessTokenList instances
实例列表
List all instances owned by your wallet via Ed25519 signature:
javascript
import { readFileSync } from "node:fs";
import { createKeyPairFromBytes, signBytes, getAddressFromPublicKey } from "@solana/kit";
const keypairBytes = new Uint8Array(JSON.parse(readFileSync("/path/to/wallet.json", "utf8")));
const keyPair = await createKeyPairFromBytes(keypairBytes);
const address = await getAddressFromPublicKey(keyPair.publicKey);
const timestamp = Date.now();
const message = `List AgentBox instances\nTimestamp: ${timestamp}`;
const signature = await signBytes(keyPair.privateKey, new TextEncoder().encode(message));
const sig64 = Buffer.from(signature).toString("base64");
const res = await fetch(
`https://api.agentbox.fyi/provision?wallet=${address}&signature=${encodeURIComponent(sig64)}×tamp=${timestamp}`
);Returns including and for running instances (authenticated by wallet signature - only the wallet owner can list their own instances). Timestamp must be within 5 minutes of server time.
{ instances: [...] }gatewayTokenterminalToken通过Ed25519签名查询你的钱包拥有的所有实例:
javascript
import { readFileSync } from "node:fs";
import { createKeyPairFromBytes, signBytes, getAddressFromPublicKey } from "@solana/kit";
const keypairBytes = new Uint8Array(JSON.parse(readFileSync("/path/to/wallet.json", "utf8")));
const keyPair = await createKeyPairFromBytes(keypairBytes);
const address = await getAddressFromPublicKey(keyPair.publicKey);
const timestamp = Date.now();
const message = `List AgentBox instances\nTimestamp: ${timestamp}`;
const signature = await signBytes(keyPair.privateKey, new TextEncoder().encode(message));
const sig64 = Buffer.from(signature).toString("base64");
const res = await fetch(
`https://api.agentbox.fyi/provision?wallet=${address}&signature=${encodeURIComponent(sig64)}×tamp=${timestamp}`
);返回,包含运行中实例的和(通过钱包签名认证,只有钱包所有者可以查询自己的实例)。时间戳必须与服务器时间差在5分钟以内。
{ instances: [...] }gatewayTokenterminalTokenErrors
错误码
| HTTP | Meaning |
|---|---|
| 402 | Payment required (handled automatically by x402) |
| 409 | Instance name already taken |
| 502 | Provisioning failed (you are NOT charged) |
| 401 | Missing or invalid access token |
| 404 | Instance not found |
| HTTP | 含义 |
|---|---|
| 402 | 需要支付(由x402自动处理) |
| 409 | 实例名称已被占用 |
| 502 | 部署失败(不会扣费) |
| 401 | 访问令牌缺失或无效 |
| 404 | 实例不存在 |
Payment details
支付详情
- Network: Solana mainnet ()
solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp - Amount: $5 USDC per 7-day period
- Asset: USDC ()
EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
If provisioning fails (502), the payment is NOT settled.
- 网络: Solana主网 ()
solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp - 金额: 每7天5 USDC
- 资产: USDC ()
EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
如果部署失败(502错误),支付不会结算。