创建 Sandbox 实例
创建一个连接真实供应商、会产生费用的 Sandbox。获取报价不会创建资源;只有调用本接口后, 服务才会预留费用并开始供应实例。
选择创建方式
selection 中必须且只能提供以下一种方式:
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,还不能执行命令或读写文件。
- 立即保存响应中的
id,它也是后续查询、操作和清理实例的唯一标识。 - 轮询
GET /v1/sandboxes/{id},例如每 2 秒一次,并设置客户端总超时(建议不超过 5 分钟)。 RUNNING表示实例已就绪;只有此时才能调用 exec、files 或 ports 接口。FAILED或TERMINATED是终态,不能继续等待RUNNING;应查看操作与事件审计定位原因。- 客户端等待超时不代表实例没有创建。先按
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 Console 创建的 API Key。只会发送给 *.xapi.to。
Request
quoteId、offeringId 或 requirements 三选一,不能同时提供。
本次业务创建的稳定唯一键。请求结果不确定时复用原值和原参数;创建另一个实例时换新值。
实例访问与生命周期策略。使用前先确认目标 offering 声明支持相应策略。
用于关联客户端、任务或模型日志的非敏感元数据。不要写入 API key、令牌或其他密钥。
Response
创建请求已接受并返回实例记录;实例通常仍处于 PROVISIONING,尚不可执行任务。
实例 UUID;所有查询、执行、文件、端口、审计和清理接口都使用此值。
实际选中的 offering UUID;即使按 requirements 创建也会返回具体值。
Gateway 最近确认的供应商实际状态;判断是否可执行、是否已清理应以此字段为准。
服务端已结算账期的累计实际费用(USD 十进制字符串);不要用本地墙钟时间自行替代。
Gateway 创建实例记录并开始供应的时间。
实例记录最近一次状态、费用或审计摘要更新的时间。
创建实例时使用的业务幂等键,可用于历史检索和重复创建核对。
最近一次生命周期操作希望达到的目标状态;没有进行中的状态目标时可能为 null。
由 desiredState 与 observedState 推导的用户可读阶段,可区分 SUSPENDING/RESUMING/TERMINATING 过渡过程。
最近一次有供应商或可靠事件证据确认的状态;observedState=UNKNOWN 时可用于故障排查,不能替代最新状态。
每次有效状态变化递增的版本号,用于检测状态是否更新和防止乱序覆盖。
创建时生效的实例生命周期策略。
创建时冻结的实际资源快照,用于执行能力和费用核对。
当前滚动费用预留覆盖到的时间;不是实例保证存活时间,也不是自动终止时间。
实例首次确认进入 TERMINATED 的时间;尚未终止时为 null。
选中 offering 的完整快照;部分列表响应可能省略。
最近的操作审计摘要;完整记录使用 audit?kind=operations 分页读取。
最近的状态事件;完整记录使用 audit?kind=events。
最近的用量段;终态验收时所有段应有 endsAt 且不处于 OPEN。
已返回的账期与结算明细;totalCost 应与 SETTLED 账期金额汇总一致。
四类完整审计记录总数。
兼容旧客户端的字段;新客户端使用 policy.resumeOnAccess。