From c1c5b9b8ba19154dee9a3c05b29fe7566ed4023d Mon Sep 17 00:00:00 2001 From: Research Assistant Date: Mon, 1 Jun 2026 00:32:46 +0800 Subject: [PATCH] feat: bump PaddleOCR model from VL-1.5 to VL-1.6 --- paperforge/ocr_diagnostics.py | 6 +++--- paperforge/setup_wizard.py | 2 +- paperforge/worker/ocr.py | 9 +++++++-- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/paperforge/ocr_diagnostics.py b/paperforge/ocr_diagnostics.py index c6933863..2896c5be 100644 --- a/paperforge/ocr_diagnostics.py +++ b/paperforge/ocr_diagnostics.py @@ -61,7 +61,7 @@ def ocr_doctor(config: dict[str, str] | None, live: bool = False) -> dict: resp = requests.post( job_url, headers={"Authorization": f"bearer {token}"}, - json={"model": os.environ.get("PADDLEOCR_MODEL", "PaddleOCR-VL-1.5")}, + json={"model": os.environ.get("PADDLEOCR_MODEL", "PaddleOCR-VL-1.6")}, timeout=30, ) if resp.status_code == 401: @@ -98,7 +98,7 @@ def ocr_doctor(config: dict[str, str] | None, live: bool = False) -> dict: # L3 — API response structure try: minimal_payload = { - "model": os.environ.get("PADDLEOCR_MODEL", "PaddleOCR-VL-1.5"), + "model": os.environ.get("PADDLEOCR_MODEL", "PaddleOCR-VL-1.6"), "optionalPayload": json.dumps({"useDocOrientationClassify": False}), } resp = requests.post( @@ -159,7 +159,7 @@ def ocr_doctor(config: dict[str, str] | None, live: bool = False) -> dict: resp = requests.post( job_url, headers={"Authorization": f"bearer {token}"}, - data={"model": os.environ.get("PADDLEOCR_MODEL", "PaddleOCR-VL-1.5")}, + data={"model": os.environ.get("PADDLEOCR_MODEL", "PaddleOCR-VL-1.6")}, files={"file": f}, timeout=120, ) diff --git a/paperforge/setup_wizard.py b/paperforge/setup_wizard.py index 9dbfefd2..95716d09 100644 --- a/paperforge/setup_wizard.py +++ b/paperforge/setup_wizard.py @@ -718,7 +718,7 @@ def headless_setup( { "PADDLEOCR_API_TOKEN": raw_key, "PADDLEOCR_JOB_URL": paddleocr_url, - "PADDLEOCR_MODEL": "PaddleOCR-VL-1.5", + "PADDLEOCR_MODEL": "PaddleOCR-VL-1.6", "ZOTERO_DATA_DIR": zotero_data or "", }, ) diff --git a/paperforge/worker/ocr.py b/paperforge/worker/ocr.py index 161ec043..76fc92c9 100644 --- a/paperforge/worker/ocr.py +++ b/paperforge/worker/ocr.py @@ -66,7 +66,7 @@ def ensure_ocr_meta(vault: Path, row: dict) -> dict: meta = {} meta.setdefault("zotero_key", key) meta.setdefault("source_pdf", row.get("pdf_path", "")) - meta.setdefault("ocr_provider", "PaddleOCR-VL-1.5") + meta.setdefault("ocr_provider", "PaddleOCR-VL-1.6") meta.setdefault("mode", "async") meta.setdefault("ocr_status", "pending") meta.setdefault("ocr_job_id", "") @@ -1029,6 +1029,8 @@ def is_embedded_figure_text_block(block: dict, blocks: list[dict], page_width: i label = block.get("block_label", "") if label not in {"text", "paragraph_title"}: return False + if label == "paragraph_title": + return False text = clean_block_text(block.get("block_content", "")) if not text: return False @@ -1681,6 +1683,9 @@ def run_ocr(vault: Path, verbose: bool = False, no_progress: bool = False) -> in meta["retry_count"] = 0 write_json(paths["ocr"] / key / "meta.json", meta) ocr_queue = sync_ocr_queue(paths, target_rows) + print(f"DEBUG: target_keys count={len(target_keys)}, target_rows count={len(target_rows)}, queue count={len(ocr_queue)}", flush=True) + if ocr_queue: + print(f"DEBUG: first item={ocr_queue[0].get('zotero_key')} status={ocr_queue[0].get('queue_status')}", flush=True) max_items_raw = os.environ.get("PADDLEOCR_MAX_ITEMS", "").strip() max_items = 3 if max_items_raw: @@ -1703,7 +1708,7 @@ def run_ocr(vault: Path, verbose: bool = False, no_progress: bool = False) -> in # Fallback: parse vault-root .env token = _read_dotenv(vault, "PADDLEOCR_API_TOKEN") job_url = os.environ.get("PADDLEOCR_JOB_URL", "https://paddleocr.aistudio-app.com/api/v2/ocr/jobs").strip() - model = os.environ.get("PADDLEOCR_MODEL", "PaddleOCR-VL-1.5").strip() + model = os.environ.get("PADDLEOCR_MODEL", "PaddleOCR-VL-1.6").strip() optional_payload = {"useDocOrientationClassify": False, "useDocUnwarping": False, "useChartRecognition": False} changed = 0 active_submitted = 0