OCR:recognize_text 不校验服务响应的 success 字段,服务端内部失败会被当成「合法无文字」 #36

Open
opened 2026-10-22 10:41:32 +08:00 by iomgaa · 0 comments
Owner

背景

#34 的设计调研(research-wiki/designs/2026-10-21-issue34-ocr-document-design.md §1 E13)读 MonkeyOCR 服务源码发现:/ocr/text 内部抛异常时返回的是 HTTP 200,而不是错误状态码:

api/main.py:622-629:捕获所有异常后返回 TaskResponse(success=False, content="", message="OCR task failed: ...")。

现状与后果

transports/monkey_ocr.py:240-247 的 recognize_text 只校验 content 是 str,不看 success,空串又是合法的「无文字」。所以服务端任何内部失败(OOM、模型异常等)都会被库当成「这张图没有文字」,熔断还记成功,下游完全无感。

对照:同文件 parse_layout(:262-270)对 success is not True 会抛 RequestRejectedError 并附 status_code=200,两个端点不对称。

证据与未证实部分

  • 源码路径:已读(本机 ~/Code/MonkeyOCR,提交 a4d853f,版本 1.1.0,与线上样本的 _version_name 一致)。
  • 线上未复现:2026-10-21 用乱码字节打 /ocr/text,得到的是 success:true + 幻觉文本 "The image contains a single character: 1"(同一输入打 /parse 才是 500),没有触发到 success:false 分支。所以「内部异常→200+success:false」是源码推断,需要先找到能稳定触发该分支的输入再确认。
  • 另一个相关事实:对无法解码的输入,/ocr/text 会返回 success:true 的幻觉文本,这是服务行为,库侧只能靠输入预检缓解。

本 issue 要决定的

  1. 先确认 success:false 分支在线上是否可触发。
  2. 是否让 recognize_text 在 success is not True 时抛 RequestRejectedError(附 status_code=200,与 parse_layout 对称)。这会改变医院线既有行为,需走 brainstorming。
  3. 是否给 recognize_text 加输入预检(无法识别的字节本地拒绝)。
## 背景 #34 的设计调研(research-wiki/designs/2026-10-21-issue34-ocr-document-design.md §1 E13)读 MonkeyOCR 服务源码发现:`/ocr/text` 内部抛异常时返回的是 **HTTP 200**,而不是错误状态码: `api/main.py:622-629`:捕获所有异常后返回 `TaskResponse(success=False, content="", message="OCR task failed: ...")`。 ## 现状与后果 `transports/monkey_ocr.py:240-247` 的 `recognize_text` 只校验 `content` 是 `str`,**不看 `success`**,空串又是合法的「无文字」。所以服务端任何内部失败(OOM、模型异常等)都会被库当成「这张图没有文字」,熔断还记成功,下游完全无感。 对照:同文件 `parse_layout`(`:262-270`)对 `success is not True` 会抛 `RequestRejectedError` 并附 `status_code=200`,两个端点不对称。 ## 证据与未证实部分 - 源码路径:已读(本机 `~/Code/MonkeyOCR`,提交 `a4d853f`,版本 1.1.0,与线上样本的 `_version_name` 一致)。 - **线上未复现**:2026-10-21 用乱码字节打 `/ocr/text`,得到的是 `success:true` + 幻觉文本 `"The image contains a single character: 1"`(同一输入打 `/parse` 才是 500),没有触发到 `success:false` 分支。所以「内部异常→200+success:false」是源码推断,需要先找到能稳定触发该分支的输入再确认。 - 另一个相关事实:对无法解码的输入,`/ocr/text` 会返回 `success:true` 的幻觉文本,这是服务行为,库侧只能靠输入预检缓解。 ## 本 issue 要决定的 1. 先确认 `success:false` 分支在线上是否可触发。 2. 是否让 `recognize_text` 在 `success is not True` 时抛 `RequestRejectedError`(附 `status_code=200`,与 `parse_layout` 对称)。这会改变医院线既有行为,需走 brainstorming。 3. 是否给 `recognize_text` 加输入预检(无法识别的字节本地拒绝)。
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: iomgaa/PolyGateway#36