{"record":{"id":"814723d56d36022d","repo":"zylon-ai/private-gpt","slug":"failed-to-load-file-file-info-file-name-with-r","errorCode":null,"errorMessage":"Failed to load file '{file_info.file_name}' with readers: {available}","messagePattern":"Failed to load file '(.+?)' with readers: (.+?)","errorType":"exception","errorClass":"RuntimeError","httpStatus":null,"severity":"error","filePath":"private_gpt/components/readers/reader_component.py","lineNumber":103,"sourceCode":"\n            nodes: list[BaseNode] = []\n            async for node in loader.lazy_load_data(\n                file_info,\n                extra_info=extra_info,\n                **load_kwargs,\n            ):\n                nodes.append(node)\n            if nodes:\n                return nodes\n            logger.info(\n                \"Reader '%s' returned no nodes for file: %s\",\n                reader_name,\n                file_info.file_name,\n            )\n\n        if last_exception is not None:\n            available = \", \".join(reader_names)\n            raise RuntimeError(\n                f\"Failed to load file '{file_info.file_name}' with readers: {available}\"\n            ) from last_exception\n\n        return []\n\n    def register_reader_factory(self, name: str, factory: ReaderFactory) -> None:\n        self.factory_registry.register_factory(name, factory)\n\n    def unregister_reader_factory(self, name: str) -> None:\n        self.factory_registry.unregister_factory(name)\n\n    def register_extension_reader(self, extension: str, reader_name: str) -> None:\n        self.factory_registry.get_factory(reader_name)\n        self.registry.register_extension_reader(extension, reader_name)\n\n    def register_extension_readers(\n        self,\n        extension: str,","sourceCodeStart":85,"sourceCodeEnd":121,"githubUrl":"https://github.com/zylon-ai/private-gpt/blob/4a030776a31a901ad80b1bf4d7faa2c1a367efbb/private_gpt/components/readers/reader_component.py#L85-L121","documentation":"ReaderComponent's file-loading loop tries every reader name registered for the file, collects nodes, and remembers exceptions; when every reader either raised or returned zero nodes and at least one exception occurred, it raises RuntimeError chaining the last exception (`from last_exception`). The message lists which readers were attempted, so you know the candidate set was tried and exhausted. The root cause is always in the chained exception — inspect `__cause__` for the real failure.","triggerScenarios":"Calling the file-loading API (the method around line 103 in reader_component.py) for a file where every registered reader throws — e.g. a corrupt PDF, an unreadable/password-protected file, or a dependency failure inside each reader (see errors 200/201).","commonSituations":"Corrupt or truncated downloads; password-protected or DRM-protected PDFs/Office files; files with misleading extensions; optional reader dependencies missing so all candidate readers fail on import; permission errors on the storage path.","solutions":["Inspect the chained exception (`exc.__cause__`) — the RuntimeError is only an aggregate; fix the underlying reader error it reports.","Open the file manually with the corresponding reader dependency (e.g. a PDF library) to verify it is not corrupt or encrypted.","Confirm the optional extras for every reader listed in `available` are installed.","If the file may be malformed, add a pre-ingestion validation/quarantine step so unusable files never enter the pipeline."],"exampleFix":"# before\ntry:\n    nodes = component.load_file(file_info, reader_names)\nexcept RuntimeError as e:\n    logger.error(str(e))  # loses root cause\n\n# after\ntry:\n    nodes = component.load_file(file_info, reader_names)\nexcept RuntimeError as e:\n    logger.error(\"Ingestion failed: %s\", e)\n    logger.error(\"Root cause: %r\", e.__cause__)","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try:\n    nodes = component.load_file(file_info, reader_names)\nexcept RuntimeError as e:\n    cause = e.__cause__\n    logger.error(\"All readers failed for %s: %s\", file_info.file_name, e)\n    if isinstance(cause, ImportError):\n        ...  # dependency problem: fix environment\n    else:\n        ...  # file problem: quarantine the file\n    raise","preventionTips":["Always log e.__cause__ — the aggregate message hides the real error.","Quarantine files that fail ingestion instead of retrying them in a loop.","Pre-validate files (openable, non-encrypted) before submitting to the reader pipeline."],"tags":["ingestion","aggregated-error","file-parsing","corrupt-file"],"backgroundTag":null,"analyzedSha":"4a030776a31a901ad80b1bf4d7faa2c1a367efbb","analyzedAt":"2026-08-15T03:51:26.951Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}