zylon-ai/private-gpt · error · RuntimeError

Failed to extract file info

Error message

Failed to extract file info

What it means

RuntimeError from IngestionHelper.validate_file_info when the file_info argument is falsy — None, an empty object, or anything that fails the truthiness check. It is the first statement of a static method, so it fires before any size/extension validation and signals that upstream extraction (metadata probing of the uploaded file) never produced a FileInfo.

Solutions

  1. Fix the upstream step that produces FileInfo so it never returns None (raise on extraction failure instead)
  2. Check the upload actually contains a readable, non-empty file before validation
  3. Pass a fully populated FileInfo: file_size > 0 and a non-empty extension, or validation will continue flagging errors
  4. Add a guard where FileInfo is built: if extraction fails, surface that error rather than forwarding None

Example fix

# before
file_info = extract_file_info(maybe_missing_upload)  # returns None
errors, warnings = IngestionHelper.validate_file_info(file_info)  # RuntimeError

# after
file_info = extract_file_info(upload)
if file_info is None:
    raise ValueError('could not read upload metadata')
errors, warnings = IngestionHelper.validate_file_info(file_info)
Defensive patterns

Strategy: validation

Validate before calling

if file_info is None or not file_info:
    raise ValueError('file info missing: file metadata extraction failed or upload empty')

Type guard

def has_file_info(fi) -> TypeGuard[FileInfo]:
    return bool(fi)

Try / catch

try:
    errors, warnings = IngestionHelper.validate_file_info(file_info)
except RuntimeError as e:
    if 'Failed to extract file info' in str(e):
        return error_response(400, 'could not read file metadata; re-upload the file')
    raise

Prevention

When it happens

Trigger: Calling IngestionHelper.validate_file_info(file_info) with file_info=None or an empty FileInfo, e.g. when the file-metadata extraction step upstream returned nothing for a missing, unreadable, or zero-byte upload.

Common situations: Upload endpoints where the file metadata probe silently swallows exceptions and returns None; temp file deleted before validation; multipart form missing the file field; code paths that construct FileInfo only on success and pass an uninitialized variable otherwise.

Related errors


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

Appendix: source

Thrown at private_gpt/components/ingest/ingest_helper.py:21

from llama_index.core.schema import BaseNode

from private_gpt.components.ingest.metadata_helper import MetadataHelper
from private_gpt.components.ingest.progress.errors import IngestionValidationErrors
from private_gpt.components.ingest.utils import FileInfo, should_ignore_mime_mismatch
from private_gpt.settings.settings import settings
from private_gpt.utils.mime import is_magic_available

logger = logging.getLogger(__name__)


class IngestionHelper:
    @staticmethod
    def validate_file_info(
        file_info: FileInfo,
    ) -> tuple[list[str], list[str]]:
        if not file_info:
            raise RuntimeError("Failed to extract file info")

        errors = []
        warnings = []

        # Check if the file info has size
        if file_info.file_size is None or file_info.file_size <= 0:
            errors.append(IngestionValidationErrors.INVALID_FILE_SIZE)

        # Check if the file info has extension
        if not file_info.extension:
            errors.append(IngestionValidationErrors.UNKNOWN_FILE_EXTENSION)

        if is_magic_available() and not file_info.actual_mime_type:
            errors.append(IngestionValidationErrors.UNKNOWN_FILE_EXTENSION)

        if (
            file_info.guest_mime_type
            and file_info.actual_mime_type

View on GitHub (pinned to 4a030776a3)