响应与错误
状态: Draft 读者: API 使用者、服务端开发者、SDK 开发者 范围: 成功响应、错误 envelope、请求追踪和幂等 来源: 由根目录旧 Unified API 底稿迁移整理而来
成功响应
成功响应直接返回接口定义的对象,不增加统一外层 envelope。资源对象、分页列表及二进制附件是不同的返回类型,不能统一按 Task 对象解析。
| 接口 | 成功 HTTP | Content-Type | 正文 |
|---|---|---|---|
POST /v1/tasks |
202 | application/json |
CreateTaskResponse:task_id、status、files 创建回执。 |
GET /v1/tasks/{task_id} |
200 | application/json |
TaskDetailResponse,包括失败或取消后的完整详情。 |
POST /v1/tasks/{task_id}/cancel |
200 | application/json |
CancelTaskResponse:task_id、status、finished_at 和全部文件终态,保留成功产物链接。 |
本地 PUT /v1/tasks/{task_id}/uploads/{file_id} |
200 | application/json |
UploadFileResponse:task_id、file_id 和该文件 status。对象存储上传接受其成功 2xx 响应。 |
GET /v1/files/{file_id} |
200 | application/json |
完整 FileObject。 |
GET /v1/files/{file_id}/content |
200(完整下载) | 随产物格式 | ZIP、DOCX 或 HTML 文件字节。 |
独立 POST /v1/file_parse |
200 / 202 | 附件 MIME / application/json |
等待成功返回附件;等待到期或零等待返回包装层 StatusResponse。 |
独立 GET /v1/file_parse/{request_id} |
200 | application/json |
包装层 StatusResponse,独立于 Tasks 的响应模型。 |
独立 GET /v1/file_parse/{request_id}/result |
200 | 随产物格式 | ZIP、DOCX 或 HTML 文件字节。 |
Tasks 各响应模型、字段省略规则及完整 JSON 见 Tasks;Files 和下载响应见 Files。
Health、Models、Tiers 见 能力发现接口,用量见 Usage,独立 Chat/Responses 协议见 文档对话。
独立包装服务的附件、202、状态查询和错误结构见 file_parse 响应说明。
JSON 正文使用 UTF-8。Tasks 成功响应省略无值可选字段,保留 0、false、[] 和 {};其他接口及非成功错误 envelope 沿用各自的 null 规则。任务取消使用 POST /v1/tasks/{task_id}/cancel;目前不提供任务记录或产物的公开删除接口。
当前 Python API Server 和 Router 不统一生成或返回 X-Request-Id;网关或公网部署提供请求追踪时,客户端可记录该响应头,不能把它作为上述共同响应的必带头。
独立 file_parse 的成功附件和 202 响应明确携带 X-Request-ID;其状态查询和错误响应不统一附加该头,以专页列出的条件为准。
列表响应使用 OpenAI 风格分页 envelope:
{
"object": "list",
"data": [],
"first_id": null,
"last_id": null,
"has_more": false
}
资源创建、状态变更和查询 endpoint 可以返回不同 HTTP 状态码表达异步状态:
| HTTP | 含义 |
|---|---|
| 200 | HTTP 操作成功,响应体是当前资源、列表或附件;不表示异步 Task 或所有文件均解析成功。 |
| 202 | Tasks 创建请求已接受,或 file_parse 等待结束/零等待后返回状态 JSON;具体任务状态以正文为准。 |
| 302 | 文件内容下载重定向到 CDN 或对象存储。 |
错误响应
本地 API Server、Router 和 SaaS 的公共错误响应采用下面的统一结构。
独立 file_parse 使用 error.code/message/upstream_status,已有恢复记录时还返回状态字段;其错误格式以 file_parse 错误响应 为准。
{
"error": {
"code": "task_already_terminal",
"message": "Task is canceled"
}
}
| 字段 | 类型 | 必带 | 说明 |
|---|---|---|---|
code |
string | 是 | 稳定的非空错误码,供程序判断错误原因;不能省略或为 null。 |
message |
string | 是 | 人类可读描述,应包含必要上下文和修复建议。 |
param |
string 或 null | 否 | 出错参数路径,例如 files.0.page_range;有明确对应参数时返回,无值时省略。接收端允许缺省或 null。 |
上例对应 409 Conflict;HTTP 错误的正文类型为 application/json。错误对象只包含必填 code/message 和可选 param,不再输出或接受 type。客户端依据 HTTP 状态与 code 处理请求失败,不解析 message 判断错误类别。
请求级错误位于顶层 error;异步解析失败则通常通过查询接口的 200 响应及 files[].error 表达,详见 Tasks 错误响应。
请求追踪
请求追踪属于部署扩展。提供此能力的网关或服务可以在成功和失败响应中返回:
X-Request-Id: req_01HXYZ123ABCDEF
该部署可以接收客户端传入的 request id,并返回生成或确认后的 X-Request-Id。当前 Python Tasks 响应没有 request_id 字段,也不承诺自动回传该头;不要据此推断 Task 创建幂等性。
幂等
公网部署可以为 POST endpoint 提供 Idempotency-Key。以下为该能力的契约;当前自部署 tasks 不实现创建请求幂等存储,客户端不自动重试创建,取得 task_id 后应继续原任务。
Idempotency-Key: 7f5b7f7c-5c5a-4b2f-bb89-0c901c9a2d6a
同一租户在有效期内使用相同 key 和相同请求语义时,服务端返回首次请求的结果,不重复创建 upload、job 或其他资源。建议有效期为 24 小时。
如果同一 key 被用于不同请求体,服务端应返回 400 invalid_request,避免客户端误以为复用了同一操作。
常用错误码
| HTTP | code |
|---|---|
| 400 | invalid_request |
| 400 | invalid_sha256sum |
| 400 | file_hash_mismatch |
| 400 | bytes_mismatch |
| 400 | unsupported_parameter |
| 400 | unsupported_output_format |
| 400 | unsupported_source |
| 401 | invalid_api_key |
| 403 | quota_exceeded |
| 403 | feature_requires_api_key |
| 403 | list_requires_api_key |
| 404 | task_not_found、file_not_found、upload_not_found、model_not_found |
| 409 | task_already_terminal、file_already_terminal |
| 410 | upload_expired |
| 413 | file_too_large |
| 429 | rate_limit_exceeded |
| 500 | internal_error |
| 503 | service_unavailable |
| 503 | quality_tier_unavailable |
内部 CLI/Doclib 的错误分类见 错误码体系,其中的 type 分类不属于公共解析 API 协议。
本地 Server 差异
Local Parse Server 使用同一套错误结构。差异主要体现在错误来源:
- 未启用 API Key 时,不会产生
invalid_api_key。 - PDF/image 省略
tier或传null时按 Standard → Basic → Flash → Advanced 选择;仅开放 Advanced 时才自动选择它。显式不支持的档位返回错误。OFD/EPUB/Office/HTML/MHTML/CSV 按 ADR-0024 与 ADR-0028 归一为flash,其它 text 不作为解析输入。 - 解析能力缺失时,应返回具体的模型预加载或档位错误码,而不是泛化为
internal_error。
协议升级
本次是一次性协议升级:API、worker、Router、file_parse 和 SaaS 需协调切换,不支持新旧错误协议混用。切换前先收尾已受理任务。公共错误删除 type、要求非空 code,并统一省略空 param;内部 CLI/Doclib 分类与 file_parse 的历史恢复记录不随本次升级改写。