Skip to navigation

创建 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