测试分支: feature/api-sdk (PR #18049)
测试环境: macOS Darwin 24.3.0, Python 3.9.6, requests 2.32.5
API Endpoint: https://paddleocr.aistudio-app.com/api/v2/ocr/jobs
| # | 测试项 | 结果 | 耗时 | 说明 |
|---|---|---|---|---|
| 1 | OCR URL (PP-OCRv5) | ✅ PASS | 3.6s | URL 输入,默认参数 |
| 2 | OCR URL + 自定义 Options | ✅ PASS | 3.6s | 设置 use_doc_orientation_classify=True |
| 3 | Doc Parsing URL (PP-StructureV3) | ✅ PASS | 3.7s | 文档版面解析 |
| 4 | Submit + Poll 分步调用 | ✅ PASS | 3.7s | 非阻塞 API:submit → get_result → wait_for_result |
| 5 | OCR 本地文件上传 | ✅ PASS | 4.3s | file_path 模式 |
| 6 | 错误处理 (无效 token) | ✅ PASS | 0.2s | 正确抛出 AuthError |
| 7 | 输入校验 | ✅ PASS | 0.0s | 缺少输入 / 互斥参数均正确拦截 |
| 8 | Context Manager (with) | ✅ PASS | 3.6s | with 语句正常工作 |
| 9 | PaddleOCR-VL 模型 | ✅ PASS | 3.6s | VL 模型正常返回 markdown |
| 10 | PaddleOCR-VL-1.5 模型 | ✅ PASS | 3.6s | VL-1.5 模型正常返回 markdown |
| 11 | Doc Parsing 文件上传 (PP-StructureV3) | ✅ PASS | 4.3s | 本地文件上传 + 文档解析 |
总计: 11 passed, 0 failed
文件: paddleocr/_api_client/_http.py (同步) + async_client.py (异步)
现象: 任务提交和轮询均成功,但在最后一步下载 JSONL 结果文件时,SDK 使用带有 Authorization: bearer <paddle_token> 的 session 去请求百度 BOS 对象存储的预签名 URL。BOS 不认识这个 header,返回 400 Bad Request。
根因: HTTPClient.fetch_jsonl() 使用 self._session.get(url) 发起请求,而 session 在初始化时设置了 Authorization header。BOS 的预签名 URL 已经包含了自己的鉴权参数(authorization=bce-auth-v1/...),额外的 Authorization header 导致冲突。
修复: fetch_jsonl 应使用不带 auth header 的独立请求:
# 修复前
resp = self._session.get(url, timeout=self._timeout)
# 修复后
resp = requests.get(url, timeout=self._timeout)影响范围: 所有实际 API 调用(OCR、Doc Parsing、所有模型)在修复前均无法获取结果。这是一个 必须在合入前修复的阻塞性 bug。
| 严重度 | 语言 | 问题 |
|---|---|---|
| 中 | Python | AsyncAPIClient._poll_until_done 使用硬编码 DEFAULT_MAX_WAIT_TIME,忽略用户设置的 timeout |
| 中 | Go | submitURL/submitFile/getJobStatus 未使用 http.NewRequestWithContext,context 取消无法中断 HTTP 请求 |
| 中 | TypeScript | poller.ts 的 sleep 方法 abort listener 未设置 { once: true },长轮询会泄漏 listener |
| 中 | TypeScript | http.ts 的 fetchJsonl 未检查 resp.ok(同样的 BOS auth 问题可能也存在于 TS SDK) |
| 低 | 全部 | 轮询循环先 sleep 再 check,对已完成任务多等 3 秒 |
| 低 | Python | CLI argparse 的 store_true 传 False 而非 None,导致多余字段发送给 API |
修复 fetch_jsonl 的 auth header 问题后,Python SDK 的核心功能全部正常工作。 4 个模型(PP-OCRv5、PP-StructureV3、PaddleOCR-VL、PaddleOCR-VL-1.5)均可正常调用,URL 输入和文件上传两种模式均可用,错误处理和输入校验逻辑正确。
建议:
⚠️ 合入前必须修复fetch_jsonl的 BOS auth header bug(Python 同步 + 异步,以及 Go/TypeScript SDK 中的同类问题)- 其他问题可以合入后迭代修复