diff --git a/service/task_executor/parse_doc.py b/service/task_executor/parse_doc.py
index 2114e10..851912f 100644
--- a/service/task_executor/parse_doc.py
+++ b/service/task_executor/parse_doc.py
@@ -37,7 +37,7 @@ import chardet
 from typing import Optional
 
 os.environ.setdefault("HTTPX_FORCE_HTTP1", "1")
-ocr_balancer = mistral_ocr_balancer.get_shared_balancer()
+ocr_balancer = None
 deepseek_ocr_balancer = None
 paddleocrvl_balancer = None
 
@@ -59,6 +59,25 @@ def _ocr_fallback_provider() -> str:
     return os.getenv("TASK_OCR_FALLBACK_PROVIDER", "").strip().lower()
 
 
+def _is_mistral_ocr_provider(provider: str) -> bool:
+    return provider in {
+        "mistral",
+        "mistral_ocr",
+        "mistralocr",
+        "mistral-ai",
+        "mistral_ai",
+        "mistral_ocr_lite",
+        "mistral_ocr_latest",
+    }
+
+
+def _get_mistral_ocr_balancer():
+    global ocr_balancer
+    if ocr_balancer is None:
+        ocr_balancer = mistral_ocr_balancer.get_shared_balancer()
+    return ocr_balancer
+
+
 def _env_bool(name: str, default: bool = False) -> bool:
     value = os.getenv(name)
     if value is None:
@@ -1450,13 +1469,13 @@ def process_pdf_chunk(pdf_path, index, save_images=False, output_dir=None, user_
         retry_count = 0
         ocr_response = None
 
-        lease_timeout = ocr_balancer.default_timeout
+        lease_timeout = _get_mistral_ocr_balancer().default_timeout
         if lease_timeout is None:
             lease_timeout = 30.0
 
         while retry_count < max_retries:
             try:
-                with ocr_balancer.lease(timeout=lease_timeout) as client:
+                with _get_mistral_ocr_balancer().lease(timeout=lease_timeout) as client:
                     ocr_response = client.ocr.process(
                         model="mistral-ocr-latest",
                         document={
@@ -1748,7 +1767,7 @@ def perform_pdf_ocr(pdf_path, save_images=False, output_dir=None, user_id=None):
 
         chunk_worker_limit = _env_int(
             "MISTRAL_OCR_CHUNK_MAX_WORKERS",
-            max(4, ocr_balancer.total_slots),
+            max(4, _get_mistral_ocr_balancer().total_slots),
         )
         max_workers = max(1, min(len(cuted_pdfs), chunk_worker_limit))
         chunk_results = [None] * len(cuted_pdfs)
