crewAIInc/crewAI · error · ValueError

No loader defined for {self}

Error message

No loader defined for {self}

What it means

DataType.get_loader() mirrors get_chunker(): it maps DataType members to loader (module, class) pairs and raises ValueError('No loader defined for ...') when the member has no loaders[] entry. The shown mapping covers PDF/TEXT/XML/WEBSITE/MDX/JSON/DOCX/CSV/YOUTUBE/GITHUB/DOCS_SITE/MYSQL/POSTGRES; any other enum member fails here.

Source

Thrown at lib/crewai-tools/src/crewai_tools/rag/data_types.py:88

            DataType.WEBSITE: ("webpage_loader", "WebPageLoader"),
            DataType.MDX: ("mdx_loader", "MDXLoader"),
            DataType.JSON: ("json_loader", "JSONLoader"),
            DataType.DOCX: ("docx_loader", "DOCXLoader"),
            DataType.CSV: ("csv_loader", "CSVLoader"),
            DataType.DIRECTORY: ("directory_loader", "DirectoryLoader"),
            DataType.YOUTUBE_VIDEO: ("youtube_video_loader", "YoutubeVideoLoader"),
            DataType.YOUTUBE_CHANNEL: (
                "youtube_channel_loader",
                "YoutubeChannelLoader",
            ),
            DataType.GITHUB: ("github_loader", "GithubLoader"),
            DataType.DOCS_SITE: ("docs_site_loader", "DocsSiteLoader"),
            DataType.MYSQL: ("mysql_loader", "MySQLLoader"),
            DataType.POSTGRES: ("postgres_loader", "PostgresLoader"),
        }

        if self not in loaders:
            raise ValueError(f"No loader defined for {self}")
        module_name, class_name = loaders[self]
        module_path = f"crewai_tools.rag.loaders.{module_name}"
        try:
            module = import_module(module_path)
            return cast(BaseLoader, getattr(module, class_name)())
        except Exception as e:
            raise ValueError(f"Error loading loader for {self}: {e}") from e


class DataTypes:
    @staticmethod
    def from_content(content: str | Path | None = None) -> DataType:
        if content is None:
            return DataType.TEXT

        if isinstance(content, Path):
            content = str(content)

View on GitHub (pinned to 754d7323be)

Solutions

  1. Use one of the documented DataTypes that has a loader
  2. If extending the enum, register both a loader and a chunker
  3. Upgrade crewai-tools — a newer version may have added the loader
  4. Check what DataTypes.from_content() actually returned before calling get_loader()

Example fix

# before
loader = dtype.get_loader()  # raises for unregistered dtype
# after
if dtype in (DataType.PDF_FILE, DataType.TEXT_FILE, DataType.TEXT, DataType.XML, DataType.WEBSITE, DataType.MDX, DataType.JSON, DataType.DOCX, DataType.CSV, DataType.YOUTUBE_VIDEO, DataType.YOUTUBE_CHANNEL, DataType.GITHUB, DataType.DOCS_SITE, DataType.MYSQL, DataType.POSTGRES, DataType.DIRECTORY):
    loader = dtype.get_loader()
else:
    raise ValueError(f'unsupported data type: {dtype}')
Defensive patterns

Strategy: validation

Validate before calling

SUPPORTED_LOADERS = {DataType.PDF_FILE, DataType.TEXT_FILE, DataType.TEXT, DataType.XML, DataType.WEBSITE, DataType.MDX, DataType.JSON, DataType.DOCX, DataType.CSV, DataType.DIRECTORY, DataType.YOUTUBE_VIDEO, DataType.YOUTUBE_CHANNEL, DataType.GITHUB, DataType.DOCS_SITE, DataType.MYSQL, DataType.POSTGRES}
if dtype not in SUPPORTED_LOADERS:
    raise ValueError(f'no loader for {dtype}; pick a supported type')

Type guard

def has_loader(dt: DataType) -> bool:
    try:
        dt.get_loader(); return True
    except ValueError:
        return False

Try / catch

try:
    loader = dtype.get_loader()
except ValueError as e:
    if 'No loader defined' in str(e):
        loader = DataType.TEXT.get_loader()
    else:
        raise

Prevention

When it happens

Trigger: Calling get_loader() on a DataType without a registered loader — typically a newly added or custom enum member, or a member supported for chunking but not loading (asymmetry between the two registries).

Common situations: Fork/extension adding enum members; version skew where a DataType was introduced for one code path only; misrouted DataTypes.from_content classification returning an unexpected member.

Related errors


AI-assisted analysis of crewAIInc/crewAI@754d7323be (2026-08-15). Data as JSON: /api/errors/d691456e4ef8a1a4. Report an issue: GitHub.