跳转到内容
Foldbun Stack文档
EN获取 API 密钥即将推出

多个文档页面的版面分析

POST
/v1/batch/documents/parse
curl --request POST \
--url https://api.stack.foldbun.com/v1/batch/documents/parse \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "model": "paddleocr-vl", "items": [ { "image": { "id": "img_3b1f0c5e9a7d42c8b6e1f0a9d8c7b6a5f4e3d2c1b0a998877665544332211000" } } ] }'

模型 paddleocr-vl(默认)。条目为去掉 model 的 POST /v1/documents/parse 请求体。语义、模式、限制和事件格式见 BatchRequest、BatchItem 和 BatchSummary Schema 以及概述。推荐使用 Server-Sent Events;不推荐 JSON 模式。

Idempotency-Key
string
至少 1 个字符 至多 128 个字符 /^[\x21-\x7e]+$/

1 至 128 个可打印 ASCII 字符。在同一账户内,密钥保留 24 小时:使用相同请求体重复请求,会返回原始响应(响应头 Idempotent-Replayed: true),且不会再次扣费或运行。相同密钥搭配不同请求体返回 409 idempotency_conflict。见概览。

模型、条目和可选的时限。

媒体类型application/json

对同一端点的一批单次调用。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
model

所有条目使用的模型 ID。端点有默认模型时可省略。

string
items
必填

该端点的单次调用请求体,不含 model,按执行顺序排列。

Array<object>
至少 1 项 至多 1000 项

不含 model 的单次调用端点请求体;图片只能是 {"id": "img_..."}。

object
timeoutSec

整个批量的时限,单位为秒,从请求到达时起算。只能缩短所在模式的上限(事件流 600 秒,JSON 90 秒)。

number
> 0

示例

{
"model": "paddleocr-vl",
"items": [
{
"image": {
"id": "img_3b1f0c5e9a7d42c8b6e1f0a9d8c7b6a5f4e3d2c1b0a998877665544332211000"
}
}
]
}

批量已执行(单个条目仍可能失败:请求本身只会在执行开始前失败,返回常规错误信封)。带有 Accept: text/event-stream 时,响应体是逐条刷新的事件流:先是 progress,每完成一个条目发送一个 item,最后是 summary。否则为一份 JSON 文档;使用 Accept: application/cbor 时为一份 CBOR 文档。

事件形式为 event: <name> / data: <one-line JSON>,以空行分隔。名称:progress(BatchProgress)、item(BatchItem)、summary(BatchSummary,最后一个)。

string

示例

event: progress
data: {"done":0,"remaining":2}
event: item
data: {"index":0,"status":"ok","result":{"id":"call_0193...","model":"dinov3","cost":0.05,"balance":9.95}}
event: progress
data: {"done":1,"remaining":1,"etaWaitMs":850}
event: item
data: {"index":1,"status":"error","error":{"code":"insufficient_balance","message":"insufficient balance: this call can cost up to 0.05 credits"}}
event: summary
data: {"counts":{"ok":1,"error":1,"expired":0},"cost":0.05,"balance":0.01,"elapsedMs":2310}
X-Request-Id
string
/^[0-9a-f]{16}$/

服务器生成的请求 ID(16 个十六进制字符);出现在每个响应中。联系支持时应提供该值。

错误信封。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 秒),同步和批量调用则继续排队到各自的截止时间,不会直接失败。

各错误码的含义和重试建议:错误。

媒体类型application/json

所有错误响应的响应体。

object
error
必填

错误。

object
code
必填

稳定的、机器可读的错误码。应依据该字段而不是 message 判断。与 HTTP 状态码的对应关系见响应部分。

string
message
必填

面向人的说明。措辞可能变化。

string
retryable
必填

为 true 时,原样重复同一请求有可能成功。

boolean
retryAfterMs
必填

建议重试前等待的毫秒数;无建议时为 0。

integer

示例

{
"error": {
"code": "model_busy",
"message": "model sam3 is busy; retry shortly",
"retryable": true,
"retryAfterMs": 5000
}
}
Retry-After
integer
>= 1

重试前须等待的整秒数;出现在 429 和 503 响应中。

X-Request-Id
string
/^[0-9a-f]{16}$/

服务器生成的请求 ID(16 个十六进制字符);出现在每个响应中。联系支持时应提供该值。