opendatalab/MinerU · error · HTTPException
Invalid effort. Allowed values: {allowed_values}
Error message
Invalid effort. Allowed values: {allowed_values} What it means
HTTP 400 raised by validate_parse_effort(): hybrid backends accept an effort parameter restricted to HYBRID_EFFORT_CHOICES = ('medium','high'). Anything else — 'low', 'max', 'MEDIUM', 'auto' — is rejected before parsing starts.
Source
Thrown at mineru/cli/api_request.py:81
),
)
return parse_method
def validate_parse_backend(backend: str) -> str:
"""校验公开 API 允许的解析后端,避免旧入口名进入下游执行链路。"""
try:
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,
),View on GitHub (pinned to 4fe4bde114)
Solutions
- Use 'medium' or 'high' exactly (lowercase)
- Or omit the effort parameter entirely to get the default 'medium'
- Check HYBRID_EFFORT_CHOICES in backend_options.py if running an unreleased fork — choices may differ
- For lighter runs, prefer effort=medium over invented 'low' values
Example fix
# before
data = {'backend': 'hybrid-engine', 'parse_effort': 'low'}
# after
data = {'backend': 'hybrid-engine', 'parse_effort': 'medium'} Defensive patterns
Strategy: validation
Validate before calling
from mineru.cli.backend_options import HYBRID_EFFORT_CHOICES # ('medium','high')
effort = (effort or "medium").strip().lower()
assert effort in HYBRID_EFFORT_CHOICES, f"effort must be one of {HYBRID_EFFORT_CHOICES}" Type guard
def is_valid_effort(v: str | None) -> bool:
return v is None or (isinstance(v, str) and v.strip().lower() in {"medium", "high"}) Try / catch
try:
resp = requests.post(url, files=files, data={"backend": b, "parse_effort": effort}, timeout=60)
resp.raise_for_status()
except requests.HTTPError as e:
if e.response.status_code == 400 and "effort" in e.response.text:
data.pop("parse_effort") # omit and use server default
resp = requests.post(url, files=files, data=data, timeout=60)
else:
raise Prevention
- Omit effort unless you specifically need 'high' — 'medium' is the default
- Normalize casing before sending
- Re-check HYBRID_EFFORT_CHOICES after mineru upgrades
When it happens
Trigger: POSTing backend=hybrid-engine (or hybrid-http-client) with parse_effort='low' or 'fast'; omitting effort is fine (medium is the default) but an explicit invalid string fails.
Common situations: Users assuming an auto/low tier exists because other LLM tools expose it; case-sensitive values copied from docs with capitalized words; configs from versions that once accepted more tiers.
Related errors
- effort must be "medium" or "high"
- Invalid parse_method. Allowed values: {allowed_values}
- Invalid backend. Allowed values: {allowed_values}
- Language {lang} not supported. Allowed values: {allowed_valu
- Invalid effort. Allowed values: {allowed_values}
AI-assisted analysis of opendatalab/MinerU@4fe4bde114 (2026-08-14).
Data as JSON: /api/errors/c39c1e497e8c9a65.
Report an issue: GitHub.