zylon-ai/private-gpt · error · ImportError

Text reader dependencies are not installed.

Error message

Text reader dependencies are not installed.

What it means

Raised by the text reader factory when the lazily-imported private_gpt.components.readers.text.text_reader.TextReader module cannot be imported, i.e. the optional dependencies that back the plain-text ingestion path are missing from the environment. The factory catches the ImportError and re-raises it wrapped with a formatted 'missing dependency' message so the caller knows which optional extra to install rather than seeing a raw ModuleNotFoundError. It is an installation/packaging problem, not a runtime data problem.

Source

Thrown at private_gpt/components/readers/factories/text.py:55

            HtmlReader,
        )
    except ImportError as e:
        raise ImportError(
            format_missing_dependency_message(
                "HTML reader",
                extras="ingest-markup",
            )
        ) from e
    return HtmlReader()


def _text_reader() -> IngestionReader:
    try:
        from private_gpt.components.readers.text.text_reader import (
            TextReader,
        )
    except ImportError as e:
        raise ImportError(
            format_missing_dependency_message(
                "Text reader",
            )
        ) from e
    return TextReader()


_EXTENSION_READERS = {
    ".csv": _delimiter_reader,
    ".tsv": _delimiter_reader,
    ".psv": _delimiter_reader,
    ".eml": _email_reader,
    ".html": _html_reader,
    ".htm": _html_reader,
    ".xhtml": _html_reader,
    ".xht": _html_reader,
    ".shtml": _html_reader,
    ".shtm": _html_reader,

View on GitHub (pinned to 4a030776a3)

Solutions

  1. Install the text-ingestion extra for private-gpt (e.g. `pip install -e '.[ingest-text]'` or the extra name shown in format_missing_dependency_message output).
  2. Verify the import now resolves: `python -c "from private_gpt.components.readers.text.text_reader import TextReader"`.
  3. If you do not need text ingestion, avoid routing .txt/.md files to the text reader (check _EXTENSION_READERS mappings) or register a fallback reader for those extensions.
  4. If the extra is installed but the error persists, check for a conflicting package version causing the inner ImportError (inspect the chained `__cause__`).

Example fix

# before
reader = component.get_reader_by_extension(".txt")  # ImportError: Text reader dependencies are not installed.

# after
# shell: pip install -e '.[ingest-text]'
reader = component.get_reader_by_extension(".txt")  # ok
Defensive patterns

Strategy: validation

Validate before calling

def text_reader_available() -> bool:
    try:
        from private_gpt.components.readers.text.text_reader import TextReader  # noqa: F401
        return True
    except ImportError:
        return False

if not text_reader_available():
    raise SystemExit("Install the text ingestion extra before ingesting .txt files")

Try / catch

try:
    reader = component.get_reader_by_extension(".txt")
except ImportError as e:
    logger.error("Missing optional dependency: %s", e)
    raise

Prevention

When it happens

Trigger: Calling get_reader_by_extension('.txt') (or any extension mapped to _text_reader in _EXTENSION_READERS) in an environment where the text-reader extra was never installed, so `from private_gpt.components.readers.text.text_reader import TextReader` raises ImportError.

Common situations: Installing private-gpt with a minimal extras set (e.g. only ingest-markup) and then ingesting a .txt/.md file; a fresh venv built from a slim requirements list; CI images that prune optional ingestion dependencies; version upgrades where the text reader moved behind an extra.

Related errors


AI-assisted analysis of zylon-ai/private-gpt@4a030776a3 (2026-08-15). Data as JSON: /api/errors/1d5cc1e38ca4c8c3. Report an issue: GitHub.