多张图片的背景移除
const url = 'https://api.stack.foldbun.com/v1/batch/remove-background';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"model":"birefnet","items":[{"image":{"id":"img_3b1f0c5e9a7d42c8b6e1f0a9d8c7b6a5f4e3d2c1b0a998877665544332211000"},"options":{"output":"cutout"}}]}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://api.stack.foldbun.com/v1/batch/remove-background \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "model": "birefnet", "items": [ { "image": { "id": "img_3b1f0c5e9a7d42c8b6e1f0a9d8c7b6a5f4e3d2c1b0a998877665544332211000" }, "options": { "output": "cutout" } } ] }'模型 birefnet(默认)。条目为去掉 model 的 POST /v1/remove-background 请求体。语义、模式、限制和事件格式见 BatchRequest、BatchItem 和 BatchSummary Schema 以及概述。推荐使用 Server-Sent Events;不推荐 JSON 模式。
1 至 128 个可打印 ASCII 字符。在同一账户内,密钥保留 24 小时:使用相同请求体重复请求,会返回原始响应(响应头 Idempotent-Replayed: true),且不会再次扣费或运行。相同密钥搭配不同请求体返回 409 idempotency_conflict。见概览。
模型、条目和可选的时限。
对同一端点的一批单次调用。model 只需设置一次(端点有默认模型时可省略);条目中不得包含 model。执行前会校验每个条目:结构错误返回 400 invalid_request,消息中指明 items[i],且不计费。条目中的图片只能是 {"id": "img_..."} 句柄。条目严格依次执行,数组顺序即执行顺序。每个请求最多 1,000 个条目和 4 MiB。带有 Idempotency-Key 时,条目 i 使用派生密钥 "b <key> <i>":重复提交同一批量时,已完成的条目被重放(replayed: true,不收费),其余条目照常执行,内容发生变化的条目返回 idempotency_conflict。
限制:事件流模式最长运行 600 秒,JSON 模式最长 90 秒(条目较多时不推荐 JSON 模式)。timeoutSec 只能缩短这些限制;更大的值会被直接截断,不报错。时限到达后,不再开始新条目,正在运行的条目被取消(不计费),所有未完成的条目标记为 expired;已完成条目的结果保留。客户端断开连接时,批量以同样方式停止。每个账户同时打开的批量请求数最多为 1 至 4 个,取决于层级(429 too_many_batches)。
object
所有条目使用的模型 ID。端点有默认模型时可省略。
该端点的单次调用请求体,不含 model,按执行顺序排列。
不含 model 的单次调用端点请求体;图片只能是 {"id": "img_..."}。
object
整个批量的时限,单位为秒,从请求到达时起算。只能缩短所在模式的上限(事件流 600 秒,JSON 90 秒)。
示例
{ "model": "birefnet", "items": [ { "image": { "id": "img_3b1f0c5e9a7d42c8b6e1f0a9d8c7b6a5f4e3d2c1b0a998877665544332211000" }, "options": { "output": "cutout" } } ]}批量已执行(单个条目仍可能失败:请求本身只会在执行开始前失败,返回常规错误信封)。带有 Accept: text/event-stream 时,响应体是逐条刷新的事件流:先是 progress,每完成一个条目发送一个 item,最后是 summary。否则为一份 JSON 文档;使用 Accept: application/cbor 时为一份 CBOR 文档。
事件形式为 event: <name> / data: <one-line JSON>,以空行分隔。名称:progress(BatchProgress)、item(BatchItem)、summary(BatchSummary,最后一个)。
示例
event: progressdata: {"done":0,"remaining":2}
event: itemdata: {"index":0,"status":"ok","result":{"id":"call_0193...","model":"dinov3","cost":0.05,"balance":9.95}}
event: progressdata: {"done":1,"remaining":1,"etaWaitMs":850}
event: itemdata: {"index":1,"status":"error","error":{"code":"insufficient_balance","message":"insufficient balance: this call can cost up to 0.05 credits"}}
event: summarydata: {"counts":{"ok":1,"error":1,"expired":0},"cost":0.05,"balance":0.01,"elapsedMs":2310}JSON 模式的响应(不推荐;见 BatchRequest)。
object
每个条目一项,按 index 排序。
单个条目的结果;item 事件的 data,也是 BatchResponse.items 的元素。
object
条目在请求中的位置。
ok:调用成功并已计费。error:调用失败,未计费。expired:条目完成前已超过批量时限;未计费。
状态为 ok 时:与单次调用的成功响应完全相同,包括 id、cost、balance、billing 和 timing。
object
状态为 error 时:单次调用的错误(余额不足只会使该条目失败;后续条目仍会逐条尝试)。
object
稳定的错误码,列于响应部分。
面向人的说明。
条目由相同 Idempotency-Key 下较早的批量回放而来时为 true;未运行,也未扣费。
最后的 summary 事件,也是 JSON 响应的 summary。
object
各状态的条目数量。
object
状态为 ok 的条目。
状态为 error 的条目。
状态为 expired 的条目。
本请求扣除的额度(回放的条目不会再次扣费)。
批量结束时的账户余额。
从请求到达到批量结束的时间,单位为毫秒。
示例
{ "items": [ { "status": "ok" } ]}JSON 模式的响应(不推荐;见 BatchRequest)。
object
每个条目一项,按 index 排序。
单个条目的结果;item 事件的 data,也是 BatchResponse.items 的元素。
object
条目在请求中的位置。
ok:调用成功并已计费。error:调用失败,未计费。expired:条目完成前已超过批量时限;未计费。
状态为 ok 时:与单次调用的成功响应完全相同,包括 id、cost、balance、billing 和 timing。
object
状态为 error 时:单次调用的错误(余额不足只会使该条目失败;后续条目仍会逐条尝试)。
object
稳定的错误码,列于响应部分。
面向人的说明。
条目由相同 Idempotency-Key 下较早的批量回放而来时为 true;未运行,也未扣费。
最后的 summary 事件,也是 JSON 响应的 summary。
object
各状态的条目数量。
object
状态为 ok 的条目。
状态为 error 的条目。
状态为 expired 的条目。
本请求扣除的额度(回放的条目不会再次扣费)。
批量结束时的账户余额。
从请求到达到批量结束的时间,单位为毫秒。
服务器生成的请求 ID(16 个十六进制字符);出现在每个响应中。联系支持时应提供该值。
default
Section titled “default”错误信封。HTTP 状态码与 code 对应;只有 retryable: true 的错误才值得原样重复。失败的调用不收费。
| 状态码 | 错误码 |
|---|---|
| 400 | invalid_request, invalid_image(图片通过了上传检查,但无法解码), unsupported |
| 401 | unauthorized |
| 402 | insufficient_balance |
| 403 | model_locked |
| 404 | not_found, image_not_found |
| 409 | idempotency_conflict, request_in_progress |
| 413 | payload_too_large |
| 429 | rate_limited, daily_limit_reached, too_many_batches(均带有 Retry-After) |
| 500 | internal_error |
| 502 | upstream_error, bad_model_output |
| 503 | model_unavailable, model_busy, unavailable(均带有 Retry-After) |
| 504 | upstream_timeout |
model_unavailable 也用于唯一提供该模型的 GPU 节点短时失联:失联后约一分钟内,交互式调用立即返回该错误并带较短的 Retry-After(5 秒),同步和批量调用则继续排队到各自的截止时间,不会直接失败。
各错误码的含义和重试建议:错误。
所有错误响应的响应体。
object
错误。
object
稳定的、机器可读的错误码。应依据该字段而不是 message 判断。与 HTTP 状态码的对应关系见响应部分。
面向人的说明。措辞可能变化。
为 true 时,原样重复同一请求有可能成功。
建议重试前等待的毫秒数;无建议时为 0。
示例
{ "error": { "code": "model_busy", "message": "model sam3 is busy; retry shortly", "retryable": true, "retryAfterMs": 5000 }}重试前须等待的整秒数;出现在 429 和 503 响应中。
服务器生成的请求 ID(16 个十六进制字符);出现在每个响应中。联系支持时应提供该值。