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
- Use one of the documented DataTypes that has a loader
- If extending the enum, register both a loader and a chunker
- Upgrade crewai-tools — a newer version may have added the loader
- 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
- Check the registry-supported DataTypes before dispatching ingestion
- Log the classified DataType early to catch misrouting
- Upgrade crewai-tools when adopting newer DataTypes so registries are complete
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
- No chunker defined for {self}
- Invalid data_type: '{raw_data_type}'. Valid values are: 'fil
- Error loading loader for {self}: {e}
- URL directory loading is not supported. Please provide a loc
- Directory does not exist: {source_ref}
AI-assisted analysis of crewAIInc/crewAI@754d7323be (2026-08-15).
Data as JSON: /api/errors/d691456e4ef8a1a4.
Report an issue: GitHub.