{"record":{"id":"410cb5ad3840de6c","repo":"run-llama/llama_index","slug":"reader-class-name-class-name-not-found","errorCode":null,"errorMessage":"Reader class name {class_name} not found.","messagePattern":"Reader class name (.+?) not found\\.","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"llama-index-core/llama_index/core/readers/loading.py","lineNumber":21,"sourceCode":"from llama_index.core.readers.base import BasePydanticReader\nfrom llama_index.core.readers.string_iterable import StringIterableReader\n\nALL_READERS: Dict[str, Type[BasePydanticReader]] = {\n    StringIterableReader.class_name(): StringIterableReader,\n}\n\n\ndef load_reader(data: Dict[str, Any]) -> BasePydanticReader:\n    if isinstance(data, BasePydanticReader):\n        return data\n\n    class_name = data.get(\"class_name\")\n\n    if class_name is None:\n        raise ValueError(\"Must specify `class_name` in reader data.\")\n\n    if class_name not in ALL_READERS:\n        raise ValueError(f\"Reader class name {class_name} not found.\")\n\n    # remove static attribute\n    data.pop(\"is_remote\", None)\n\n    return ALL_READERS[class_name].from_dict(data)\n","sourceCodeStart":3,"sourceCodeEnd":27,"githubUrl":"https://github.com/run-llama/llama_index/blob/afd0fef371831f9bda13e5af7167cf4e981278ab/llama-index-core/llama_index/core/readers/loading.py#L3-L27","documentation":"load_reader looks up data['class_name'] in the module-level ALL_READERS registry, which contains only readers registered in llama_index.core.readers.loading (e.g. StringIterableReader). The ValueError fires when class_name is present but no registered class matches. Note that by design ALL_READERS is tiny in llama-index-core; most concrete reader classes live in integration packages and are not in this registry.","triggerScenarios":"Calling load_reader with class_name like 'PDFReader' or 'SimpleDirectoryReader', which are not registered in core's ALL_READERS; referencing a reader class from an integration package (llama-index-readers-*) that was never registered; class-name drift after upgrading llama-index where a class was renamed or moved.","commonSituations":"Restoring persisted pipelines that used community readers; version migrations where reader packages split out of core into llama-index-readers-* distributions; typos in the class name string.","solutions":["Check what is actually available: print(llama_index.core.readers.loading.ALL_READERS.keys()) and use one of those names.","If you need a specific integration reader, deserialize it via that package's own class (e.g. PDFReader.from_dict) instead of core's load_reader.","Verify the exact class_name string by calling YourReader.class_name() in the same environment/version.","Ensure the reader package is installed and up to date so its class name matches what was serialized."],"exampleFix":"# before\nreader = load_reader({\"class_name\": \"PDFReader\", ...})  # not in core registry\n\n# after\nfrom llama_index.readers.file import PDFReader\nreader = PDFReader.from_dict({\"class_name\": \"PDFReader\", ...})","handlingStrategy":"validation","validationCode":"from llama_index.core.readers.loading import ALL_READERS\nclass_name = data.get(\"class_name\")\nassert class_name in ALL_READERS, f\"unknown reader: {class_name}; known: {list(ALL_READERS)}\"","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Print ALL_READERS.keys() to see what core can deserialize.","Deserialize integration readers via their own classes, not core's load_reader.","Pin llama-index versions so serialized class names keep resolving."],"tags":["serialization","registry","readers","versioning"],"backgroundTag":null,"analyzedSha":"afd0fef371831f9bda13e5af7167cf4e981278ab","analyzedAt":"2026-08-15T05:42:58.429Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}