{"record":{"id":"c31a1062285c45d7","repo":"zylon-ai/private-gpt","slug":"language-lang-not-supported-by-rapidocr","errorCode":null,"errorMessage":"Language {lang} not supported by RapidOCR","messagePattern":"Language (.+?) not supported by RapidOCR","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"private_gpt/components/readers/docling/utils.py","lineNumber":133,"sourceCode":"        raise ValueError(f\"Language {lang} not supported by Tesseract\") from e\n\n\ndef convert_to_rapidocr_lang(lang: str) -> str:\n    \"\"\"Convert language code to RapidOCR format.\n\n    Args:\n        lang: Language code in format like 'en-US', 'es-ES'\n\n    Returns:\n        Language name in RapidOCR format (e.g., 'english', 'chinese')\n\n    Raises:\n        ValueError: If language is not supported\n    \"\"\"\n    try:\n        return LANG_TO_RAPIDOCR[lang]\n    except KeyError as e:\n        raise ValueError(f\"Language {lang} not supported by RapidOCR\") from e\n\n\ndef convert_to_ocrmac_lang(lang: str) -> str:\n    \"\"\"Convert language code to OCRMac format.\n\n    Args:\n        lang: Language code in format like 'en-US', 'es-ES'\n\n    Returns:\n        Language code in OCRMac format (usually same as input)\n\n    Raises:\n        ValueError: If language is not supported\n    \"\"\"\n    try:\n        # Do nothing\n        return lang\n    except KeyError as e:","sourceCodeStart":115,"sourceCodeEnd":151,"githubUrl":"https://github.com/zylon-ai/private-gpt/blob/4a030776a31a901ad80b1bf4d7faa2c1a367efbb/private_gpt/components/readers/docling/utils.py#L115-L151","documentation":"Raised by convert_to_rapidocr_lang in docling/utils.py when the language code is not a key of LANG_TO_RAPIDOCR. RapidOCR uses full language names ('english', 'chinese') rather than codes, so docling.langs entries are translated through LANG_TO_RAPIDOCR; unknown keys fail fast with the chained KeyError preserved.","triggerScenarios":"settings.docling.langs containing a code absent from LANG_TO_RAPIDOCR while ocr_model is 'rapidocr' — most often a language RapidOCR does not support (its set is small: mainly chinese/english and a few others) or a code in the wrong format.","commonSituations":"Choosing rapidocr for CPU efficiency and then requesting European languages it does not cover; carrying over a langs list written for easyocr/tesseract; assuming RapidOCR's language breadth matches Tesseract's.","solutions":["Check LANG_TO_RAPIDOCR in utils.py and restrict docling.langs to its keys when using rapidocr.","If you need broader language coverage, switch ocr_model back to easyocr or tesseract.","Split corpora: route documents by language to different ocr_model settings if you ingest multilingual archives."],"exampleFix":"# settings.yaml — before\n# docling:\n#   ocr_model: rapidocr\n#   langs: [en-US, de-DE]\n\n# after (only mapped languages)\n# docling:\n#   ocr_model: rapidocr\n#   langs: [en-US]\n# or switch engine for wider coverage\n#   ocr_model: tesseract\n#   langs: [en-US, de-DE]","handlingStrategy":"validation","validationCode":"from private_gpt.components.readers.docling.utils import LANG_TO_RAPIDOCR\n\ndef validate_rapidocr_langs(langs: list[str]) -> None:\n    bad = [l for l in langs if l not in LANG_TO_RAPIDOCR]\n    if bad:\n        raise SystemExit(f\"langs {bad} unsupported by rapidocr (small language set); consider tesseract/easyocr\")\n\nvalidate_rapidocr_langs(settings().docling.langs or [])","typeGuard":"from private_gpt.components.readers.docling.utils import LANG_TO_RAPIDOCR\n\ndef is_rapidocr_lang(lang: str) -> bool:\n    return lang in LANG_TO_RAPIDOCR","tryCatchPattern":"try:\n    r = [convert_to_rapidocr_lang(l) for l in langs]\nexcept ValueError as e:\n    if \"not supported by RapidOCR\" in str(e):\n        # fall back to a wider-coverage engine for this corpus\n        use_engine(\"tesseract\")\n    else:\n        raise","preventionTips":["RapidOCR supports far fewer languages than Tesseract — restrict langs or choose another engine accordingly.","Run a startup validation of langs against the active engine's map."],"tags":["docling","ocr","rapidocr","language-codes","configuration"],"backgroundTag":null,"analyzedSha":"4a030776a31a901ad80b1bf4d7faa2c1a367efbb","analyzedAt":"2026-08-15T03:51:26.951Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}