{"record":{"id":"3b703ae4aea800f6","repo":"zylon-ai/private-gpt","slug":"reader-normalized-name-is-not-supported-avail","errorCode":null,"errorMessage":"Reader '{normalized_name}' is not supported. Available: {available}","messagePattern":"Reader '(.+?)' is not supported\\. Available: (.+?)","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"private_gpt/components/readers/factories/factory.py","lineNumber":58,"sourceCode":"            \"vision\": VisionReaderFactory(settings, injector),\n        }\n        self._factories: dict[str, ReaderFactory] = {\n            **built_ins,\n            **{name: p(settings, injector) for name, p in _PROVIDERS.items()},\n        }\n\n    def register_factory(self, name: str, factory: ReaderFactory) -> None:\n        self._factories[_normalize_reader_name(name)] = factory\n\n    def unregister_factory(self, name: str) -> None:\n        self._factories.pop(_normalize_reader_name(name), None)\n\n    def get_factory(self, name: str) -> ReaderFactory:\n        normalized_name = _normalize_reader_name(name)\n        factory = self._factories.get(normalized_name)\n        if factory is None:\n            available = \", \".join(sorted(self._factories)) or \"none\"\n            raise ValueError(\n                f\"Reader '{normalized_name}' is not supported. Available: {available}\"\n            )\n        return factory\n","sourceCodeStart":40,"sourceCodeEnd":62,"githubUrl":"https://github.com/zylon-ai/private-gpt/blob/4a030776a31a901ad80b1bf4d7faa2c1a367efbb/private_gpt/components/readers/factories/factory.py#L40-L62","documentation":"Raised by ReaderFactoryRegistry.get_factory when the requested reader name (after normalization: stripped and lowercased) is not in the registry. The registry's built-ins are docling, pptx2md, markitdown, text, and vision; more can be added with register_factory()/register_reader(). The message helpfully lists the actual available names, so the fastest diagnosis is comparing your value against that list.","triggerScenarios":"Calling get_factory(name) with a name not in {docling, pptx2md, markitdown, text, vision} plus any registered custom readers — e.g., 'Docling' with different casing is fine (normalized) but 'docling-local', 'pdf', or 'azure' are not registered. Also fires for blank-adjacent names (blank raises a separate error).","commonSituations":"Setting the ingestion reader-selection to a removed or renamed reader after upgrading private-gpt; user expects a generic name like 'pdf' or 'office'; custom reader registered but the registering module was never imported; typo in settings.","solutions":["Use one of the names printed in the error's 'Available:' list (typically docling, markitdown, pptx2md, text, vision).","For documents in general, 'docling' is the default full-featured reader; 'text' handles delimited/email/html/plain text; 'markitdown' and 'pptx2md' are format-specific helpers.","If a custom reader should exist, verify the module calling register_reader()/register_factory() is imported before lookup."],"exampleFix":"# settings.yaml — before\n# readers selection: pdf\n\n# after\n# (use a registered reader name)\n# e.g. docling","handlingStrategy":"type-guard","validationCode":"BUILTIN_READERS = {\"docling\", \"pptx2md\", \"markitdown\", \"text\", \"vision\"}\n\ndef validate_reader_name(name: str) -> None:\n    n = name.strip().lower()\n    if n not in BUILTIN_READERS:\n        raise SystemExit(f\"reader '{name}' unknown; built-ins: {sorted(BUILTIN_READERS)}\")","typeGuard":"BUILTIN_READERS = {\"docling\", \"pptx2md\", \"markitdown\", \"text\", \"vision\"}\n\ndef is_known_reader(name: str) -> bool:\n    return name.strip().lower() in BUILTIN_READERS","tryCatchPattern":"try:\n    factory = registry.get_factory(name)\nexcept ValueError as e:\n    if \"is not supported\" in str(e):\n        available = str(e).split(\"Available:\", 1)[-1]\n        raise ConfigurationError(f\"pick one of:{available}\") from e\n    raise","preventionTips":["Case and surrounding whitespace are normalized, but the name itself must match a registered reader exactly.","The error message lists valid names — parse it for user-facing config errors instead of guessing."],"tags":["readers","factory","registry","configuration"],"backgroundTag":null,"analyzedSha":"4a030776a31a901ad80b1bf4d7faa2c1a367efbb","analyzedAt":"2026-08-15T03:51:26.951Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}