创建 Sandbox 实例

创建一个连接真实供应商、会产生费用的 Sandbox。获取报价不会创建资源;只有调用本接口后, 服务才会预留费用并开始供应实例。 ## 选择创建方式 `selection` 中必须且只能提供以下一种方式: | 方式 | 适用场景 | 需要注意 | | --- | --- | --- | | `quoteId` | **推荐。** 先按能力、资源和预算调用 `POST /v1/quotes`,确认匹配结果后立即创建 | 报价有效期较短且只用于一个业务创建;过期或对应 offering 已变化时需要重新报价 | | `offeringId` | 已通过 `GET /v1/offerings` 确认并希望固定使用某个具体规格 | 不会按 requirements 重新选择,也没有 `maxEstimatedHourlyUsd` 创建时价格上限 | | `requirements` | 希望服务在创建时动态选择兼容 offering,或允许供应商/规格变化 | 可同时提供 `maxEstimatedHourlyUsd` 作为硬性价格上限;没有兼容规格时返回 `404` | `maxEstimatedHourlyUsd` 只适用于 `requirements` 方式。需要 Shell、文件、端口或 GPU 时, 应显式声明相应 capability/资源,不要假设所有 offering 都支持。 ## 幂等重试 每次业务创建生成一个稳定且唯一的 `idempotencyKey`(最长 160 个字符),并在请求超时、 连接中断或未收到响应时复用同一个值。这样可以取回同一次创建,而不是误建第二个计费实例。 - 同一个业务创建重试:复用原 key,并保持 `selection`、`policy` 等创建参数不变。 - 新建另一个实例:使用新的 key。 - 使用 `quoteId` 时,同一 key 的重试可复用该报价;不同 key 复用同一报价会返回 `409`。 - 同一 key 搭配不兼容的选择或策略:返回 `409 Conflict`。 ## `202 Accepted` 之后 `202` 仅表示服务已受理创建请求。响应会立即返回实例 `id`,此时 `observedState` 通常是 `PROVISIONING`,**还不能执行命令或读写文件**。 1. 立即保存响应中的 `id`,它也是后续查询、操作和清理实例的唯一标识。 2. 轮询 `GET /v1/sandboxes/{id}`,例如每 2 秒一次,并设置客户端总超时(建议不超过 5 分钟)。 3. `RUNNING` 表示实例已就绪;只有此时才能调用 exec、files 或 ports 接口。 4. `FAILED` 或 `TERMINATED` 是终态,不能继续等待 `RUNNING`;应查看操作与事件审计定位原因。 5. 客户端等待超时不代表实例没有创建。先按 `id` 查询并清理,不要换新 key 盲目重试。 ## 计费与清理 创建前服务会检查账户余额并预留初始运行费用及关机费用,余额不足返回 `402`。 供应中或运行中的实例都可能产生费用;响应中的初始 `totalCost` 为 `0` 不代表后续免费。 将 `POST /v1/sandboxes/{id}/terminate` 放在 `finally` 中,并继续轮询实例,直到 `observedState` 为 `TERMINATED` 或 `FAILED`。最后读取 `totalCost`、operations、events、 usage segments 和 billing periods,确认没有开放账期或遗留活动实例。 ## 常见失败 - `400`:选择方式不合法、requirements 无效、quote 无效/过期,或 offering 不支持 `resumeOnAccess`。 - `402`:余额不足,无法完成初始费用预留。 - `404`:offering 不可用,或 requirements 没有匹配的 offering。 - `409`:报价对应的 offering 已变化、报价被另一业务创建使用、达到活动实例上限、幂等参数冲突,或供应商暂时不能创建。 - `429`:请求过快;遵循响应中的重试提示,并继续复用原 `idempotencyKey`。

Authentication

XAPI-Keystring

在 xAPI Console 创建的 API Key。只会发送给 *.xapi.to。

Request

This endpoint expects an object.
selectionobjectRequired

quoteId、offeringId 或 requirements 三选一,不能同时提供。

idempotencyKeystringRequired<=160 characters

本次业务创建的稳定唯一键。请求结果不确定时复用原值和原参数;创建另一个实例时换新值。

policyobjectOptional

实例访问与生命周期策略。使用前先确认目标 offering 声明支持相应策略。

metadatamap from strings to anyOptional

用于关联客户端、任务或模型日志的非敏感元数据。不要写入 API key、令牌或其他密钥。

Response

创建请求已接受并返回实例记录;实例通常仍处于 PROVISIONING,尚不可执行任务。

idstringformat: "uuid"

实例 UUID;所有查询、执行、文件、端口、审计和清理接口都使用此值。

offeringIdstringformat: "uuid"

实际选中的 offering UUID;即使按 requirements 创建也会返回具体值。

observedStateenum

Gateway 最近确认的供应商实际状态;判断是否可执行、是否已清理应以此字段为准。

totalCoststring

服务端已结算账期的累计实际费用(USD 十进制字符串);不要用本地墙钟时间自行替代。

createdAtdatetime

Gateway 创建实例记录并开始供应的时间。

updatedAtdatetime

实例记录最近一次状态、费用或审计摘要更新的时间。

idempotencyKeystringOptional

创建实例时使用的业务幂等键,可用于历史检索和重复创建核对。

desiredStateenum or nullOptional

最近一次生命周期操作希望达到的目标状态;没有进行中的状态目标时可能为 null。

lifecyclePhaseenumOptional

由 desiredState 与 observedState 推导的用户可读阶段,可区分 SUSPENDING/RESUMING/TERMINATING 过渡过程。

lastConfirmedStateenumOptional

最近一次有供应商或可靠事件证据确认的状态;observedState=UNKNOWN 时可用于故障排查,不能替代最新状态。

stateVersionintegerOptional

每次有效状态变化递增的版本号,用于检测状态是否更新和防止乱序覆盖。

policyobjectOptional

创建时生效的实例生命周期策略。

resourcesobjectOptional

创建时冻结的实际资源快照,用于执行能力和费用核对。

reservedUntildatetime or nullOptional

当前滚动费用预留覆盖到的时间;不是实例保证存活时间,也不是自动终止时间。

terminatedAtdatetime or nullOptional

实例首次确认进入 TERMINATED 的时间;尚未终止时为 null。

offeringobjectOptional

选中 offering 的完整快照;部分列表响应可能省略。

operationslist of objectsOptional

最近的操作审计摘要;完整记录使用 audit?kind=operations 分页读取。

eventslist of objectsOptional

最近的状态事件;完整记录使用 audit?kind=events。

usageSegmentslist of objectsOptional

最近的用量段;终态验收时所有段应有 endsAt 且不处于 OPEN。

billingPeriodslist of objectsOptional

已返回的账期与结算明细;totalCost 应与 SETTLED 账期金额汇总一致。

auditCountsobjectOptional

四类完整审计记录总数。

autoResumebooleanOptionalDeprecated

兼容旧客户端的字段;新客户端使用 policy.resumeOnAccess。

Errors

400
Bad Request Error
401
Unauthorized Error
402
Payment Required Error
404
Not Found Error
409
Conflict Error
429
Too Many Requests Error