opendatalab/MinerU · error · ValueError

Local path for repo_mode

Error message

Local path for repo_mode '{repo_mode}' is not configured.

What it means

Raised by auto_download_and_get_model_root_path() when the resolved model source is 'local' but the config's local-models directory mapping has no entry for the requested repo_mode. With model-source local, MineRU never downloads; it reads pre-downloaded model trees from a config section (via get_local_models_dir()) keyed by 'pipeline' and 'vlm'. A missing key means the deployment told MineRU to use local models without saying where they are.

Solutions

  1. Add the missing mapping to the config so both modes you use point at real directories: {"models-dir": {"pipeline": "/data/models/pipeline", "vlm": "/data/models/vlm"}} (adjust keys to your MineRU version's models-dir schema).
  2. Verify the directories actually contain the model files for that mode (layout mirrors the Hugging Face snapshot structure).
  3. Alternatively download once with a remote source (modelsource/huggingface) so MineRU populates its config, then switch to local.
  4. Confirm MINERU_MODEL_SOURCE=local is intentional — if network access exists, unsetting it removes the local-config requirement.

Example fix

// before
export MINERU_MODEL_SOURCE=local
// mineru.json has no "models-dir" (or only pipeline) entry

// after
// mineru.json
"models-dir": {
  "pipeline": "/data/models/pipeline",
  "vlm": "/data/models/vlm"
}
Defensive patterns

Strategy: validation

Validate before calling

import json, os
cfg = json.load(open(os.path.expanduser('~/mineru.json')))
models_dir = cfg.get('models-dir', {})
needed = {'pipeline'}  # add 'vlm' if you use the vlm backend
missing = needed - set(models_dir)
assert not missing, f'models-dir missing entries for: {missing} while using local model source'

Type guard

def local_paths_configured(cfg: dict, modes: set[str]) -> bool:
    md = cfg.get('models-dir') or {}
    return all(isinstance(md.get(m), str) and os.path.isdir(md[m]) for m in modes)

Try / catch

try:
    root = auto_download_and_get_model_root_path(rel, repo_mode='vlm')
except ValueError as e:
    if 'not configured' in str(e):
        raise SystemExit('model-source=local but models-dir[vlm] missing in mineru.json') from e
    raise

Prevention

When it happens

Trigger: Setting MINERU_MODEL_SOURCE=local (or model-source: local in config) without configuring local_models_dir / the models-dir mapping for the mode being used — e.g. only 'pipeline' is configured but a VLM parse path requests repo_mode='vlm'.

Common situations: Air-gapped or offline deployments that preload models onto disk but copy an incomplete config; enabling local source to avoid network calls while forgetting the vlm entry; the models were downloaded under a different user/home so the config was never written.

Related errors


AI-assisted analysis of opendatalab/MinerU@4fe4bde114 (2026-08-14). Data as JSON: /api/errors/6a554b45ac739326. Report an issue: GitHub.

Appendix: source

Thrown at mineru/utils/models_download_utils.py:294

    return cache_dir


def auto_download_and_get_model_root_path(relative_path: str, repo_mode='pipeline') -> str:
    """
    支持文件或目录的可靠下载。
    - 如果输入文件: 返回本地文件绝对路径
    - 如果输入目录: 返回本地缓存下与 relative_path 同结构的相对路径字符串
    :param repo_mode: 指定仓库模式,'pipeline' 或 'vlm'
    :param relative_path: 文件或目录相对路径
    :return: 本地文件绝对路径或相对路径
    """
    model_source = resolve_model_source()

    if model_source == 'local':
        local_models_config = get_local_models_dir()
        root_path = local_models_config.get(repo_mode, None)
        if not root_path:
            raise ValueError(f"Local path for repo_mode '{repo_mode}' is not configured.")
        return root_path

    # 建立仓库模式到路径的映射
    repo_mapping = {
        'pipeline': {
            'huggingface': ModelPath.pipeline_root_hf,
            'modelscope': ModelPath.pipeline_root_modelscope
        },
        'vlm': {
            'huggingface': ModelPath.vlm_root_hf,
            'modelscope': ModelPath.vlm_root_modelscope
        }
    }

    if repo_mode not in repo_mapping:
        raise ValueError(f"Unsupported repo_mode: {repo_mode}, must be 'pipeline' or 'vlm'")

    # model_source 已解析为实际远端来源后,再选择对应仓库。

View on GitHub (pinned to 4fe4bde114)