from __future__ import annotations import ast import asyncio import importlib.metadata import json import queue import re import shutil import subprocess import sys import tempfile import threading import time import traceback import uuid import zipfile from pathlib import Path from typing import Any, Iterable, Iterator, Literal # A one-Python-file Space cannot use requirements.txt. Install only missing or # mismatched model dependencies before importing Torch/Transformers/Gradio. _RUNTIME_REQUIREMENTS = { "gradio": "gradio==6.17.3", "torch": "torch==2.10.0", "torchvision": "torchvision==0.25.0", "transformers": "transformers==4.57.1", "accelerate": "accelerate>=1.10,<2", "safetensors": "safetensors>=0.5", "Pillow": "Pillow==12.1.1", "PyMuPDF": "PyMuPDF==1.27.2.2", "einops": "einops==0.8.2", "addict": "addict==2.4.0", "easydict": "easydict==1.13", "matplotlib": "matplotlib==3.10.8", "psutil": "psutil==7.2.2", } _missing: list[str] = [] for _distribution, _requirement in _RUNTIME_REQUIREMENTS.items(): try: _version = importlib.metadata.version(_distribution) except importlib.metadata.PackageNotFoundError: _missing.append(_requirement) continue if "==" in _requirement and _version != _requirement.split("==", 1)[1]: _missing.append(_requirement) if _missing: print("Installing Space runtime dependencies:", " ".join(_missing), flush=True) subprocess.run( [ sys.executable, "-m", "pip", "install", "--quiet", "--upgrade", "--no-cache-dir", *_missing, ], check=True, ) import fitz import spaces import torch from fastapi import File, Form, HTTPException, UploadFile from fastapi.responses import FileResponse, HTMLResponse from gradio import Server from PIL import Image, ImageDraw, ImageFont from pydantic import BaseModel, Field from transformers import AutoModel, AutoTokenizer, TextStreamer MODEL_ID = "baidu/Unlimited-OCR" DEFAULT_PROMPT = "document parsing." DEFAULT_MULTI_PROMPT = "Multi page parsing." DEFAULT_MAX_TOKENS = 32000 DEFAULT_PDF_DPI = 200 DEFAULT_TIMEOUT = 1200 DEFAULT_BATCH_SIZE = 2 MAX_MULTI_IMAGES = 40 MAX_CONTEXT_LENGTH = 32768 NGRAM_SIZE = 35 NGRAM_WINDOW = 128 NGRAM_WINDOW_MULTI = 1024 IMAGE_MODE_GUNDAM = "gundam" IMAGE_MODE_BASE = "base" SUPPORTED_IMAGE_EXTENSIONS = {".png", ".jpg", ".jpeg", ".webp", ".bmp"} SUPPORTED_EXTENSIONS = SUPPORTED_IMAGE_EXTENSIONS | {".pdf"} THUMBNAIL_MAX_WIDTH = 1024 SCRIPT_DIR = Path(__file__).resolve().parent INDEX_PATH = SCRIPT_DIR / "index.html" SESSION_ROOT = Path(tempfile.gettempdir()) / "unlimited_ocr_space_sessions" SESSION_ROOT.mkdir(parents=True, exist_ok=True) _DET_RE = re.compile(r"<\|det\|>.*?<\|/det\|>", re.DOTALL) _REF_RE = re.compile(r"<\|/?ref\|>") _GROUNDING_RE = re.compile( r"<\|ref\|>(?P