opendatalab/MinerU · error · HTTPException

Language not supported. Allowed values

Error message

Language {lang} not supported. Allowed values: {allowed_values}

What it means

HTTP 400 raised by validate_parse_lang_list(): each OCR language code in lang_list is validated by validate_public_ocr_lang_list and unsupported codes are rejected with the allowed list in the message. This stops old/invalid language entries (e.g. deprecated codes) from entering the OCR chain.

Solutions

  1. Use the codes listed in the error message (commonly 'ch' and 'en' style short codes)
  2. Do not use tesseract-style codes like chi_sim or deu
  3. Match casing exactly (lowercase)
  4. Omit lang_list to use the server default rather than guessing codes

Example fix

# before
data = {'parse_method': 'ocr', 'lang_list': ['chi_sim', 'eng']}

# after
data = {'parse_method': 'ocr', 'lang_list': ['ch', 'en']}
Defensive patterns

Strategy: validation

Validate before calling

# Probe once and cache the server's supported languages
cfg = requests.get(f"{base_url}/parse-config", timeout=10).json()  # or read from /docs
allowed_langs = set(cfg.get("lang_list", ["ch", "en"]))
lang_list = [l.strip().lower() for l in lang_list if l.strip().lower() in allowed_langs]

Type guard

def is_valid_lang_list(v: list[str]) -> bool:
    return isinstance(v, list) and all(isinstance(x, str) and x.strip().lower() in {"ch", "en"} for x in v)

Try / catch

try:
    resp = requests.post(url, files=files, data={"lang_list": json.dumps(langs)}, timeout=60)
    resp.raise_for_status()
except requests.HTTPError as e:
    if e.response.status_code == 400 and "not supported" in e.response.text:
        langs = ["ch", "en"]  # safe default; retry once
    else:
        raise

Prevention

When it happens

Trigger: POSTing lang_list=['ch'], ['chi_sim'], ['EN'], or an unknown code together with parse_method that triggers OCR; empty or malformed arrays also fail downstream validation.

Common situations: Codes copied from tesseract names ('chi_sim','eng') instead of mineru's codes ('ch','en'); uppercase variants; users migrating from other OCR tools whose lang tags differ.

Related errors


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

Appendix: source

Thrown at mineru/cli/api_request.py:89

        return validate_public_backend(backend)
    except ValueError as exc:
        raise HTTPException(status_code=400, detail=str(exc)) from exc


def validate_parse_effort(effort: str) -> str:
    """校验公开 API 允许的 hybrid effort,避免非法值进入解析链路。"""
    try:
        return validate_public_effort(effort)
    except ValueError as exc:
        raise HTTPException(status_code=400, detail=str(exc)) from exc


def validate_parse_lang_list(lang_list: list[str]) -> list[str]:
    """校验公开 API 允许的 OCR 语言列表,避免旧语言入口进入解析链路。"""
    try:
        return validate_public_ocr_lang_list(lang_list)
    except ValueError as exc:
        raise HTTPException(status_code=400, detail=str(exc)) from exc


async def parse_request_form(
    request: Request,
    files: Annotated[
        list[UploadFile],
        File(
            description="Upload PDF, image, DOCX, PPTX, or XLSX files for parsing",
            json_schema_extra=SWAGGER_UI_FILE_ARRAY_SCHEMA_EXTRA,
        ),
    ],
    lang_list: Annotated[
        list[str],
        Form(
            description=format_public_ocr_lang_description(),
            json_schema_extra=PUBLIC_OCR_LANGUAGE_SCHEMA_EXTRA,
        ),
    ] = ["ch"],

View on GitHub (pinned to 4fe4bde114)