| """MiniCPM-V 4.6 OCR client — runs on Modal GPU.""" |
|
|
| import io |
| from typing import Union |
|
|
| from PIL import Image |
|
|
| from models.modal_client import get_ocr |
|
|
|
|
| class MiniCPMVOCR: |
| def __init__(self): |
| self._remote = get_ocr() |
|
|
| @staticmethod |
| def _to_bytes(image: Union[Image.Image, bytes]) -> bytes: |
| if isinstance(image, bytes): |
| return image |
| buf = io.BytesIO() |
| image.save(buf, format="PNG") |
| return buf.getvalue() |
|
|
| def extract_text(self, image: Union[Image.Image, bytes]) -> str: |
| return self._remote.extract_text.remote(self._to_bytes(image)) |
|
|
| def extract_tables(self, image: Union[Image.Image, bytes]) -> str: |
| return self._remote.extract_tables.remote(self._to_bytes(image)) |
|
|
| def describe_chart(self, image: Union[Image.Image, bytes]) -> str: |
| return self._remote.describe_chart.remote(self._to_bytes(image)) |
|
|
| def extract_structured(self, image: Union[Image.Image, bytes]) -> str: |
| return self._remote.extract_structured.remote(self._to_bytes(image)) |
|
|