import logging from pathlib import Path from typing import Optional from docling.datamodel.settings import settings from docling.models.code_formula_model import CodeFormulaModel from docling.models.document_picture_classifier import DocumentPictureClassifier from docling.models.easyocr_model import EasyOcrModel from docling.models.layout_model import LayoutModel from docling.models.table_structure_model import TableStructureModel _log = logging.getLogger(__name__) def download_models( output_dir: Optional[Path] = None, *, force: bool = False, progress: bool = False, with_layout: bool = True, with_tableformer: bool = True, with_code_formula: bool = True, with_picture_classifier: bool = True, with_easyocr: bool = True, ): if output_dir is None: output_dir = settings.cache_dir / "models" # Make sure the folder exists output_dir.mkdir(exist_ok=True, parents=True) if with_layout: _log.info(f"Downloading layout model...") LayoutModel.download_models( local_dir=output_dir / LayoutModel._model_repo_folder, force=force, progress=progress, ) if with_tableformer: _log.info(f"Downloading tableformer model...") TableStructureModel.download_models( local_dir=output_dir / TableStructureModel._model_repo_folder, force=force, progress=progress, ) if with_picture_classifier: _log.info(f"Downloading picture classifier model...") DocumentPictureClassifier.download_models( local_dir=output_dir / DocumentPictureClassifier._model_repo_folder, force=force, progress=progress, ) if with_code_formula: _log.info(f"Downloading code formula model...") CodeFormulaModel.download_models( local_dir=output_dir / CodeFormulaModel._model_repo_folder, force=force, progress=progress, ) if with_easyocr: _log.info(f"Downloading easyocr models...") EasyOcrModel.download_models( local_dir=output_dir / EasyOcrModel._model_repo_folder, force=force, progress=progress, ) return output_dir